A 从声明中找出",",如果存在",",则说明涉及到函数,因为只有函数的声明中存在","(当然了,除了像char a,b,c;这样的声明情况);
B 假如有","的话,","两边的是函数参数。
D 优先级从高到低
D1 声明中被括号括起来的那部分
D2 后缀操作符 ()说明是个函数,[]说明是个数组
D3 前缀,星号"*"表示指针
E 如果const和(或)volatile关键字的后面紧跟类型说明符(如int,long等),那么它作用于类型说明符, 在其他情况下,const和(或)volatile关键字作用于它左边的指针星号
F 最终这个到底是定义了数组、指针变量、还是函数原型声明
举例:void(* signal(int signr,void(* handler)(int)))(int);//linux0.11源码include/signal.h文件第55行
举例:
指针默认没有维数
数组名是嵌套与维相结合的指针
如对于一维数组就没有嵌套的意思,而对于二维数组就可以这样理解。
如int a[10][10];*(a+i)表示第i行,*(*(a+i)+j)就表示第i行第j个元素
注意区别a与char *p,char **p,char (*p)[10]的区别就在嵌套与维数,
char *p没有嵌套没有维数,char **p有嵌套没有维数,char (*p)[10]有嵌套有维数
而对于一维数组来说没有嵌套与维数可言,所以在一维数组名几乎等价于指针
所以当面对datatype **p一般不要与数组的维数联系起来,多半应该与结构体联系起来(linux0.11源码中的sleep_on函数、wait_on_buffer函数),注意与上面int (*(*p))(int a,int b)的比较(虽然本质上没有什么不同)