函数指针(对于4.2.6的补充)
函数指针的类型一般这样定义
返回值类型 (*函数指针)(参数类型)
这边的参数类型有时候我们经常使用const void*因为这个void类型的指针的兼容性非常好,void类型的指针可以强制转化成其他类型的指针,非常方便
因为函数再编译的过程中函数名其实最后就是通过将其转化为函数的地址来实现的因此通过(*函数指针)(参量)的效果等价于函数指针(参量)
eg:
int (*f)(int a, int b) = sum;
关于函数指针数组
eg:
int (*f[2])(int a, int b) = {sum, sum};
函数指针数组的调用如下
点击查看代码
int (*f[2])(int a, int b);
f[1] = sum;
printf("%d\n", f[1](1, 2));
其实质只是将函数指针转化成函数指针数组,也就是说可以同时调用多个函数了
注意:
int* p[5]定义的是指针数组
int (*p)[5]定义的是数组指针,数组指针是一个指向数组的指针,注意该指针指向的只能是一维数组,如果是多维数组就应该有多个数组指针,因此他又被称作行指针
eg:
点击查看代码
int a[10] = {1, 2, 3};
int (*b)[10];
b = &a;
调用的方法如下
点击查看代码
int (*a)[10];
int b[10] = {1, 2, 3};
a = &b;
printf("%d\n", (*a)[1]);
eg:
点击查看代码
int ((* (*f)[2])(int a, int b));
int (*x[2])(int a, int b);
f = &x;
*(*f) = sum;
(*f)[0] = sum;
printf("%d\n", (*x)(1, 2));
注意:函数指针数组指针定义出来以后本身是一个指针,他并没有分配出来给函数指针数组的空间,因此不能将函数直接赋值给他,而应该自己再定义一个函数指针数组,再将函数指针数组所在的地址发送给他才可以
如果不理解的话,可以先通过数组指针和指针数组来辅助理解。
浙公网安备 33010602011771号