函数指针变量

有任何不懂的问题可以评论区留言,能力范围内都会一一回答

什么是函数指针变量呢?


根据前面学习整型指针,数组指针的时候,我们的类比关系,我们不难得出结论:


函数指针变量应该是用来存放函数地址的,未来通过地址能够调用函数的。
那么函数是否有地址呢?

我们做个测试:

确实打印出来了地址,所以函数是有地址的,函数名就是函数的地址,当然也可以通过&函数名的方式获得函数的地址。如果我们要将函数的地址存放起来,就得创建函数指针变量咯,函数指针变量的写法其实和数组指针非常类似。如下:

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)的地址。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值