(1) 解释代码含义,深刻认识指针
(*( void(*)() )0)()
即解释为:
把0强制转换成void(*)()函数指针类型,该指针指向的函数是无参的,返回类型是void型,然后0就变成一个函数的地址,然后解引用操作,最后调用以0为地址的该函数
分析思路:
void(*)() 代表函数指针类型,
( void(*)() ) 把一个类型放到括号里面是强制类型转换 例如(char)0就是强制类型转换,把整形0转成char型
( void(*)() )0 就是把0强制转换成void(*)()函数指针类型,该指针指向的函数是无参的,返回类型是void型,
这样 0就变成一个函数的地址
然后 * ( void(*)() )0 这里就是解引用操作,就是找这个函数
( * ( void(*)() )0 )() 最后 调用以0为地址的该函数,这个函数是无参的,返回类型是void型
(2)解释代码意思:
void (* signal(int , void(*)(int)) )(int)
即解释为:
signal 是一个函数声明
signal的参数有2个,第一个是int,第二个是函数指针类型即void(*(int)),该函数指针指向的函数的参数是int,返回类型是void
signal函数的返回类型也是一个函数指针,该函数指针指向的函数的参数是int,返回类型是void
分析思路
得知道:void(*)(int) 是函数指针类型,函数的参数是int型,返回类型是void
拆开看这里 signal(int , void(*)(int))
类比 void Add(int,int) 函数名是Add,返回类型是void,函数参数类型是int
所以 signal(int , void(*)(int)) 函数名是signal,函数参数类型是int和void(*)(int)
然后代码最后剩下的是void(* )(int) 所以返回类型又是void(*)(int)
本身根据类比思考来说如果返回类型是void(*)(int)应该写成 void(*)(int) signal(int , void(*)(int))
对应
void Add (int, int)
但是由于规定如果是函数指针类型要拆开写,上面写法不正确,应该就写成
void(* signal(int , void(*)(int)) )(int);
那么有没有简单方式来写呢?
就有想到函数声明的重命名
首先来讲讲函数声明重命名这里:
例如:typedef unsigined int uint; 意思是 定义将无符号int型,重新命名为uint,以后就是用uint来代表无符号int型
但是对于函数指针类型重新命名时需要把重新命名的名字写到*里面
思考是这样放 typedef void(*)(int) pfun_t; (错)可是这样写规定不对, pfun_t应该放到*里面
应该是 typedef void(* pfun_t )(int) ;(对)所以可以用ptun_t代表函数指针类型