1.1 指向函数的指针用途:
1. 声明指向一个特定函数的指针,通过这个指针来调用它,(一个函数名字本身就是一个指向这个函数的指针)。
2. 作为另一个函数的返回值,通过返回指向不同函数的函数指针来调用不同的函数。
1.2 首先需要了解基本的概念
1. ()出现在变量的右边,是一个函数调用运算符,{}里面的是函数体,通过向函数体传入参数来达到预期目的。
同时,函数名字左边的类型名定义了函数的返回值的类型。
2. *预算符是一个间接引用运算符(任何情况下),例如:int* a的标准写法是int *a,int *a并不是说a是一个int*类型的变量,int* 并不是类型名。正确的理解应该是对a进
行间接引 用(a里面保存的是一个地址,由这个地址可以找到内存的一块区域),得到的结果是int类型的变量,即:a指向的那块内存保存的是一个int类型的变量。
1.3 指向函数的指针
int * abs(int) 表示对函数abs的返回值做*运算以后得到了一个int值,即:函数abs的返回值是一个指向int类型值得指针。int (*abs)(int)表示abs里面保存的是一个地址,对应内存的那块区域保存的是一个函数,这个函数的返回值是int类型。所以abs是一个指向返回值是int类型变量 的函数的指针。int *(*abs)(int)根据前面的分析,这个就更好理解了。* abs()
下面看一个复杂的例子:int (*abs(int))(int *,int*)可以先把(*abs(int))看成一个整体(用sbc代替),这个整体右边是一个函数调用运算符,那么它就个函数或者是个指向函数的指针,这个函数的返回值是int类型。再看里面,abs是一个函数名,返回值是一个指针(为什么说它返回值是个指针,左边都没有类型说明符!),这个指针指向哪里呢?刚刚已经说了 int abc (int* ,int*)是个函数,abc是个函数名或者指向函数的指针,所以(*abs(int))是个函数或者指向函数的指针,所以abs是返回值是指向一个“返回值是int有两个int*参数的函数”的指针的函数。简而言之:abs的返回值是一个指向函数的指针。
总结:int (*abs(int))(int *,int*) 遇到这种情况,我们直接把(*abs(int))看成是函数或者指向函数的指针就行 ,也就是说,括号里面经过一堆运算以后是一个指向函数的指针或者函数。对abs(int)的返回值取*是一个函数名,所以abs的返回值是一个指向函数的指针。
一般来说,用typedef关键字会使该声明更简单易懂。在前面我们已经见过:
int (*Ptr)(int *, int); 当使用typedef声明后,则Ptr就成为了一个函数指针“类型”,即:
typedef int (*Ptr)(int *, int); Ptr abs(int);
(上面说了那么多废话,其实是编者的大脑在做斗争,我也是刚刚学到这里,有什么不足或者错误,希望大家可以帮忙进行改正。)2. 指向函数的指针程序例子