函数指针和指针函数

函数指针

1. 什么是函数指针?

函数指针指向的是特殊的数据类型。函数的类型是由其返回的数据类型和其參数列表共同决定的。而函数的名称则不是其类型的一部分。本质是一个指针变量

2.初始化和赋值

我们知道,不带下标操作符的数组名会被解释成指向首元素的指针。

当一个函数名没有被调用操作符修饰时。会被解释成指向该类型函数的指针。假如我们如今实现了一个函数lexicoCompare:

int lexicoCompare( const string &s1, const string &s2 ){}

则表达式:lexicoCompare;被编译器解释成类型:int (*)( const string &, const string & );  的指针,

此时lexicoCompare和&lexioCompare类型是一模一样的。


指向函数的指针可例如以下被初始化:

int (*pfi)( const string &, const string & ) = lexicoCompare;
int (*pfi2)( const string &, const string & ) = &lexicoCompare;

指向函数的指针能够例如以下被赋值:

pfi = lexicoCompare;
pfi2 = pfi;
注意:仅仅有当赋值操作符左边指针的參数表和返回类型与右边函数或指针的參数表和返回类型全然匹配时, 初始化和赋值才是正确的。

假设不匹配。则将产生编译错误消息。在指向函数类型的指针之间不存在隐式类型转换。


3.  应用举例

#include <iostream>
#include <string>
using namespace std;

// 定义函数指针pf
int (*pf)(const int&, const int&);

// 定义函数指针类型cmpFun
typedef int (*cmpFun)(const int&, const int&);

// 详细函数
int intCompare(const int& aInt, const int& bInt)
{
	if(aInt == bInt) return 0;
	if(aInt > bInt)
	{
		return 1;
	}
	else
	{
		return -1;
	}
}

int main(void)
{
	int aInt = 1;
	int bInt = 2;
	
	pf = intCompare;
   // pf = &intCompare;              // 和上面一句是全然一样的
	
	// 使用pf
	if(pf(aInt, bInt) == 0)
	{
		cout << "two integers are equal" << "." << endl;
	}
	else if(pf(aInt, bInt) > 0)
	{
		cout << aInt << " is greater than " << bInt << "." << endl;
	}
	else
	{
		cout << aInt << " is less than " << bInt << "." << endl;
	}
	
	cout << "------------------------" << endl;

	// 用函数指针类型cmpFun声明并初始化一个函数指针pf2
	cmpFun pf2 = intCompare;
	// 使用pf2
	if(pf2(aInt, bInt) == 0)
	{
		cout << "two integers are equal" << "." << endl;
	}
	else if(pf(aInt, bInt) > 0)
	{
		cout << aInt << " is greater than " << bInt << "." << endl;
	}
	else
	{
		cout << aInt << " is less than " << bInt << "." << endl;
	}
	
	return 0;
}

4.  函数指针用作參数:

#include<stdio.h>

void MyFun1(int x); 
void MyFun2(int x); 
void MyFun3(int x); 
typedef void (*FunType)(int ); /* ②. 定义一个函数指针类型FunType,与①函数类型一致 */ 
void CallMyFun(FunType fp,int x); 

int main(int argc, char* argv[]) 
{ 
	
    CallMyFun(MyFun1,10); /* ⑤. 通过 CallMyFun 函数分别调用三个不同的函数 */ 
    CallMyFun(MyFun2,20); 
    CallMyFun(MyFun3,30); 
    return 0;
} 

void CallMyFun(FunType fp,int x) /* ③. 參数fp的类型是 FunType。

*/ { fp(x);/* ④ . 通过fp的指针运行传递进来的函数。注意fp所指的函数是有一个參数的。

*/ } void MyFun1(int x) /* ①. 这是个有一个參数的函数,下面两个函数也同样。 */ { printf("函数MyFun1 中输出:%d ",x); } void MyFun2(int x) { printf("函数MyFun2 中输出:%d ",x); } void MyFun3(int x) { printf("函数MyFun3 中输出:%d ",x); }




指针函数


1. 指针函数是通常是指返回指针的函数,即本质是一个函数。函数返回类型是某一类型的指针

2.使用:

#include <stdio.h>

int* fun( int* a)
{
	return a;
}

int main(int argc, char **argv)
{
	int a = 3;
	printf("%d
", *fun(&a));//结果 3
	return 0;
}



两者最明显的差别就是*在不在圆括号中面

int *pf( ... );  //指针函数
int (*pf)( ...); //函数指针


补充:
c++提供的函数运算符从某种意义上来讲就是代替c语言中中的函数指针。

參考我之前的一片文章:

http://blog.csdn.net/meetings/article/details/46604769







原文地址:https://www.cnblogs.com/lytwajue/p/7144484.html