右左法则
首先从最里面的圆括号看起,然后往右看,再往左看,每当遇到圆括号时,就应该调转阅读方向,一旦解析完圆括号里面的所有东西,就跳出圆括号,重复这个过程直到整个声明解析完毕。
举例:int * (* (*fun) (int *)) [10]
首先,fun是一个指针,因为他先跟*(绿色色)结合。fun指向的是一个函数,该函数特点是有一个整形指针做参数,并且返回值仍然是一个指针(品红色)。其返回值指针指向的内容是个数组。所指向的数组有10个元素,每个元素都是int *类型。
练习:
用变量a给出下面的定义
a)一个整型数
int a;
b)一个指向整型数的指针
int*a
c)一个指向指针的指针,它指向的指针是指向一个整型数
int**a
d)一个有10个整型数的数组
int a[l0]
e)一个有10个指针的数组,该指针是指向一个整型数的。
int *a[l0]
f)一个指向有10个整型数数组的指针
int(*a)[l0]
g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数
int(*a)(int)
h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
int(*a[l0])(int)
最后一个例子
(*(void(*)())0)()
假如有代码void(*pfun)() 我们很容易知道这是个函数指针。那么该函数指针的类型是void(*)()
接下来把0强制胡转换成void(*)()这种类型,就是(void(*pfun)())0去掉pfun,变成(void(*)())0。本来就是一个普通数字0,现在被强制转换成函数指针,摇身一变成某个函数的地址。
假如有代码void(*pfun)() ,pfun是个函数指针。取得该指针所指向的函数就能调用函数,即(*pfun)()
同理(void(*)())0这个函数指针,*取该指针指向的函数*((void(*)())0),但是要调用指向的函数,还要再阔上()。即(*(void(*)())0)()