int a:
a是一个int型变量
int func():
func是一个返回int类型的无参函数
int *a:
a是一个指向int类型变量的指针
int *func():
相当于int *(func()),func是一个函数,返回值为指向整型的指针
*不是用来定义func,说明返回值是指针
int (*func)():
func是一个指针,指向一个返回值类型为int的无参函数
*用来定义指针,与返回值无关
小结:
先判断是函数还是指针
函数:其后()里的是参数,函数名前所有符号都说明了返回值
指针:如果后面有(),说明是函数指针,不包括*的前面所有的符号说明了指向的函数的返回类型
关于类型转换:
例1: 某个类型a想转换成int a
(int)a,即(int)表示向int的强制转换
例2: 某个类型a想转换成 int *a
(int *)a,即(int *)表示向指向int的指针的强制转换
例3: 某个类型a想转换成int (*a)(int)
(int (*)(int))a,即(int (*)(int))表示向 指向 以int为参数返回int型的函数 的指针 的强制转换
例4: (void (*)())
添加变量名a,去掉最外面的括号得到:void (*a)()
表示指向返回为void的无参函数的指针,
所以原式表示向 指向返回void的无参函数的指针 的强制转换
例5: 将常数0强制转换为 指向 返回值为void的无参函数 的指针
(void (*)())0 0被强制转换成一个函数指针
如果 #define fp (void (*)())0
则fp将成为一个指针,这个指针指向一个返回值为void的无参函数
调用这个函数:(*fp)()
即:(*(void (*)())0)()
解读:将0强制转换成函数指针后再解引用调用这个函数
例6: 如果一个函数的返回值是一个函数指针
这个函数名:signal,函数参数:(int,void (*func)(int))
返回值:void (*a)(int)
那么这个函数的定义:
void (*signal(int,void(*func)(int))(int)