C语言声明的优先级规则--十分钟挑战复杂困难的C声明
非常重要,请多读几遍这段话
A 声明从它的名字开始读取,然后按照优先级顺序依次读取。
B 优先级从高到低依次是:
B.1 声明中被括号括起来的部分;
B.2 后缀操作符:括号()表示这是一个 函数,而方括号[]表示这是一个数组;
B.3 前缀操作符:*号表示“指向...的指针”
C 如果const和(或)volatile关键字的后面紧跟类型说明符(如int,long等),那它作用于类型说明符。在其他情况下,const和(volatile)关键
字作用于左边紧邻的指针星号.
例题1:char * ( * arr[10] ) (int **p);
步骤:
1.arr是个数组,且拥有10个元素
2.arr这个数组存储的是指针
3.arr这个数组存的指针指向函数
4.这个函数的参数是int **p (指向指针的指针)
5.这个函数的返回值是char *型的指针
小结:从变量名开始出发, 左右括号优先级最高, 其次是右边的符号【 比如[], () 】,然后是*符号。
小练习1:分清指针数组和数组指针
int *arr[10]; //1
int (*arr)[10]; //2
这两个分别代表什么意思?
分析:“右缀”优先级高于“左缀”,所以[]的优先级高于*。 记住这句话,一半的复杂表达式就都掌握了。
对于1而言,他首先是个数组。然后,int * 代表数组里面装的东西是int指针
对于2而言,首先他是指针, int [10] 代表这个指针指向的是int类型的有10个项的数组。
或许有人会很反感这种炫技型的表达式,觉得日常用不上。
实际上,扎实的C基础可以让你在阅读源码时游刃有余。
在ANSI C标准中,signal()的声明如下:
void ( *signal( int sig, void( *func )( int ) ) )( int );
分析步骤:
1.signal是个函数,参数是 int sig, void( *func )( int )
1.1 void(*func)(int) 的意思是func是个指针,
1.2 func这个指针指向一个函数
1.3 指向的这个函数返回值void, 参数是int
剩下 void ( * 已分析 )( int );
2.这个signal函数的返回值是一个函数指针
3.这个函数指针指向了一个返回值是void, 参数是int的函数
/* 下面可以不用读,或者了解一下就好:
signal()会依参数signum 指定的信号编号来设置该信号的处理函数。当指定的信号到达时就会跳转到参数handler指定的函数执行。当一个信号的信号处理函数执行时,如果进程又接收到了该信号,该信号会自动被储存而不会中断信号处理函数的执行,直到信号处理函数执行完毕再重新调用相应的处理函数。但是如果在信号处理函数执行时进程收到了其它类型的信号,该函数的执行就会被中断。
返回值:返回先前的信号处理函数指针,如果有错误则返回SIG_ERR(-1)。
*/
参考书目:C编程专家