bilibiliclass31_C语言_指针的进阶_函数指针

函数指针

数组指针-指向数组的指针
函数指针-指向函数的指针-存放函数地址的一个指针

函数
int Add(int x,int y)
{
    return x+y;
}

打印函数地址
printf("%p\n",&Add);
printf("%p\n",Add);
结果一样:&函数名 和 函数名都是函数的地址

存储函数的地址
int (*pa) (int int)=Add;

调用函数指针
(pa)(2,3)
(*pa)(2,3)
(**pa)(2,3)
(***pa)(2,3)
*pa(2,3)//err:pa和(2,3)结合==5,对5解引用报错
*是摆设,只是方便理解
结果都是5

 

阅读两段《C陷阱和缺陷》的有趣的代码:
//代码1
 

(*(void (*)())0)();

解释:
去掉变量名字以后就是类型
void (*)()-函数指针
(void (*)())-强制类型转化,转化成函数指针
(void (*)())0-0是某函数的地址
*(void (*)())0-*进行解引用-找到0为地址函数
(*(void (*)())0)()-调用地址为0的函数

//代码2
 

void (*signal(int , void(*)(int)))(int);

解释:
signal---------是一个函数声名
signal()-------signal函数
signal(int , void(*)(int))----------siganl函数参数有整形和函数指针
void (*                            )(int)---------里面函数返回值的类型也是一个函数指针

简化:
typedef void(*pfun_t)(int);//typedef 起名字:给void (*        )(int)起名字为pfun_t
pfun_t signal(int, pfun_t);//signal(int, pfun_t)函数的类型是pfun_t

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值