指针函数 和 函数指针
指针函数
可以根据字面意思理解为:返回值为指针的函数。
他的本质是一个函数,跟其他函数的区别就在于,指针函数的返回值类型是指针。
举个例子:
int fuc(void) { return 5; }
这个函数fuc返回值是int类型,并且返回值为5.
那么指针函数什么样呢?
int *fuc(void) { return 5; }
这个函数也是fuc,跟上面函数不同的是,他返回值是int * 类型,也就是返回一个指针,这个指针指向int整形数字5的地址。
使用指针函数时要注意,传出的指针不要指向局部变量的地址
比如:
int *fuc(void) { int a = 5; return a; }
这个例子就是错误的,(当然,如果不是指针函数,那么这种用法没有问题)
本例中返回值为int形a的地址,但是a是局部变量,再fuc结束之时局部变量被回收,所以我们不可能得到5这个数字。
函数指针
根据字面意思来理解,函数指针就是:指向函数的 指针。
他的本质是一个指针,我们平时使用指针
比如:
int a = 5; int *p; p = a ;
指针p指向了一个整型数字a的地址,这个地址里存着的就是数字5.
那么函数指针,指向了一个函数
int (*p)(int);
这个函数指针的名字是p,指向一个参数为int 返回值为int的函数,或者这样表达,指针p指向的函数类型为 int ()(int)
根据我的理解,函数指针和其他的指针在基本的使用上是一样的,就是说,这个指针名字,可以替代函数名字出现
int fuc(void) { int a = 5; return a; } int main(int argc, char const *argv[]) { int (*p)(void); p = fuc; printf("%d\n", fuc()); printf("%d\n", p()); printf("%d\n", (*p)()); return 0; }
函数指针p指向了fuc这个函数,所以 fuc() 和 p() 就是等价的,而 p() 跟 (*p)()是一样的,所以编译后输出结果是:
5 5 5
这里注意,如果我用
printf("%d\n", *p());
这就是错误的用法。
既然它的本质是指针,那么我们就也可以把这个指针当作参数 传入另一个函数
int plus(int x,int y) { return x + y ; } int jian(int x,int y) { return x - y; } int jisuan(int (*p)(int,int),int x,int y) { return (*p)(x,y); } int main(int argc, char const *argv[]) { printf("%d\n", jisuan(jian,1,2)); printf("%d\n", jisuan(plus,1,2)); return 0; }
本例中我们将 int (*p)(int,int) 作为参数传入了其他的函数中,达到了用一个函数去灵活调用其他同类型函数的目的。