C 语言复杂声明的理解

来源:互联网 发布:传奇账号数据库 编辑:程序博客网 时间:2024/05/15 08:15

C语言常常因为声明的语法问题而受到人们的批评,特别是涉及到函数指针的语法。C语言的语法力图使声明和使用相一致。对于简单的情况,C语言的做法是很有效的,但是,如果情况比较复杂,则容易让人混淆,原因在于,C语言的声明不能从左至右阅读,而且使用了太多的圆括号.

但是找到正确的规则去理解, 无论多复杂都可以搞清楚.原则如下:

1. 从里到外

2.按照优先级顺序,优先级顺序相同时候,从右边到左边


看几个例子,来自c语言爸爸的书.

int *f(); /* f: function returning pointer to int */

这个很简单, 从f开始, f是定义的变量, ()优先级高, 于是看f(), f是一个函数定义. 以后看到* 与int结合, int* 返回值. 所以, 这是一个返回值为int指针的函数.

int (*pf)(); /* pf: pointer to function returning int */

pf是一个变量,  与*结合, *pf是一个指针, 在于()结合, pf是一个函数指针, 再看int为返回值.那么, 这就是一个返回值为int的无参数, 函数指针.

int (*daytab)[13]daytab: pointer to array[13] of int

daytab 是一个变量,  * daytab是一个指针, (*daytab)[13] 是一个指向数组的指针, int (*daytab)[13] 是一个指向int型的数组指针.



下面2个异常的复杂, 记住上面的规则, 照样解析明白:

char (*(*x())[])()x: function returning pointer to array[] ofpointer to function returning char

x 是一个变量

x() 是一个函数

*x() 是一个返回指针

(*x())[] 根据结合律, 返回的指针指向数组

*(*x())[] 数组里面放的都是指针

(*(*x())[])() 数组里面的指针指向函数

char (*(*x())[])() 指向的函数返回值为char

所以, x是一个函数, 返回值为一个指针,指向一个数组,数组里面都是指向函数的指针,指向的函数返回值为char  , 无参数

 

在来看最后一个, 都是c爸爸书上给的例子, 其实有了规则也不复杂,编译器都能解析.

char (*(*x[3])())[5]x: array[3] of pointer to function returningpointer to array[5] of char

x 是一个变量

x[3] 是一个数组, 再次强调结合律

*x[3] 数组里面都是指针

(*x[3])() 数组里面指针指向函数, 还是强调结合律

*(*x[3])() 函数的返回值是指针

*(*x[3])()[5] 返回值指针,指向的是一个数组

char *(*x[3])()[5] 这个数组是char类型的

所以, x是一个数组, 数组里面是指向函数的指针, 指向的函数返回值是一个指针,指向char类型的数组.


1 0