有任何不懂的问题可以评论区留言,能力范围内都会一一回答
什么是函数指针变量呢?
根据前面学习整型指针,数组指针的时候,我们的类比关系,我们不难得出结论:
函数指针变量应该是用来存放函数地址的,未来通过地址能够调用函数的。
那么函数是否有地址呢?
我们做个测试:
确实打印出来了地址,所以函数是有地址的,函数名就是函数的地址,当然也可以通过&函数名的方式获得函数的地址。如果我们要将函数的地址存放起来,就得创建函数指针变量咯,函数指针变量的写法其实和数组指针非常类似。如下:
1.函数指针变量的创建
以int(*pr2)(int a) = print;为例
int是pr2指向函数的返回类型
pr2是函数指针变量名
*说明这是一个指针
(int a)说明pr2指向函数的参数类型和参数个数
别忘了上图中的小字
2.函数指针变量的使用。
int ret = (*pr1)(3);
int ret1 = (**pr1)(3);
int ret3 = (pr1)(3);
int ret2 = pr1(3);
以上函数指针变量的用法,
*号可以不写,写多少个都不影响
但是一旦使用*就必须把()带上
比如
int ret4=*pr1(3);
那么pr1会先和后面的结合,调用函数,再对函数的返回值进行*
最后留两个思考题
(*(void(*)())0)()
void(*signal(int,void(*)(int)))(int);
如果都是函数指针,分别代表什么意思
这两本串代码均出自c陷阱与缺陷这两本书。
函数指针数组
我们学了指针数组,可以把多个指针放到一个数组里,那么思考一下,如果我们把多个函数指针放到一个数组里面就构成了函数指针数组,是数组,但是里面装的是函数指针
#define _CRT_SECURE_NO_WARNING
#include <stdio.h>
int print(int a) {
printf("%d\n", a);
return a;
}
int print1(int a) {
printf("%d\n", a+1);
return a;
}
int print2(int a) {
printf("%d\n", a + 2);
return a;
}
typedef int (*ab[3])(int);
int main(void) {
ab daying = { print,print1,print2 };
printf("%d\n", daying[2](2));
return 0;
}
这串代码如果看不懂可以先看看两个好用的宏 assert和typedef-CSDN博客
会好理解很多,
上图这个函数指针数组,是数组,有三个元素,装的是int(*)(int)类型的函数的地址,因此它的类型是int(*[3])(int),()里的*[3]说明这个类型本质上是一个指针数组,这个指针类型数组的元素的类型是int(int)的地址。