函数指针
-
类似于数组名,在C语言中函数名的实际就是函数所在空间的首地址,故也可声明相应类型的函数指针用于指向相应的实际函数,更深层次甚至可以声明函数指针数组和返回函数指针的函数。
-
定义格式:声明函数指针时需要指出返回类型和所有形参类型,即对于指向int add(int a,int b);的函数指针可以声明为
int (*p)(int ,int ) = add;
这里的p即为指向add的函数指针,注意*p左右的括号不可省略,否则优先级原则p前面的*会和int结合从而变成
int* p(int, int)
;即被理解为对函数p的声明,返回值为整型指针。
指针函数
- 返回指针的函数,有必要区分于函数指针的概念
返回函数指针的函数
-
C++不允许定义返回函数的函数,但可以定义返回函数指针的函数来实现同python类似的事情,即函数的返回值是一个指向另一个函数的指针,故对其返回值又可传入实参进行并列调用(如:
fun1(a,b)(a,b);
这里假设fun1的返回值是指向fan2的指针故后面两个参数即是传给fun2的实参) -
定义格式:和普通函数的区别主要在于定义时函数的返回值类型,函数返回值的类型应该是指向某类函数的函数指针类型,但由于该类型实际书写方式复杂,故可考虑为该指针类型创建别名,然后同普通数据类型一样直接写在函数名之前表达返回该类型就行了
//e.g: using funp = int(*)(int, int); // <==>typedef int(*funp)(int, int); int add(int a, int b) { return a + b; } funp fun(int& a, int& b) { int temp = a; a = b; b = temp; return add; } int main() { int a = 5, b = 10; fun(a, b)(a, b); return 0; }
这里的funp就是对int( )(int,int)类型的函数指针创建的别名,在定义返回该函数指针类型的函数时直接定义funp fun(…){…}就行。