函数指针
数组指针-指向数组的指针
函数指针-指向函数的指针-存放函数地址的一个指针
函数
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