函数指针(对于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]);
同理,对于函数指针数组的指针的方法也是类似的 他是定义了一个指针,指向存放函数指针的数组。 注意数组名本身就代表了地址,如果加上*p表示其指向的内容后,不能在使用p[]的形式来调用,否则会出现错误 换言之,*p和p[]这两种调用数组里面的元素的方法应该是二选一的不能同时存在 指针存放的是地址,指针数组存放的是指针,数组指针存放的是数组的地址,函数指针数组指针存放的是指向存放函数指针数组的指针 函数指针数组指针存放的是函数指针数组指针的地址,所以调用的时候需要先到达存放函数指针数组首地址的地点,再通过里面的地址来到函数指针数组的第一个元素位置

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));

注意:函数指针数组指针定义出来以后本身是一个指针,他并没有分配出来给函数指针数组的空间,因此不能将函数直接赋值给他,而应该自己再定义一个函数指针数组,再将函数指针数组所在的地址发送给他才可以
如果不理解的话,可以先通过数组指针和指针数组来辅助理解。

posted @   banyanrong  阅读(39)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示