C语言声明的优先级规则--十分钟挑战复杂困难的C声明

时间:2022-01-23 22:23:27

非常重要,请多读几遍这段话

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编程专家