复杂C/C++ 变量声明读取

识别复杂C/C++变量的基本步骤

Posted by 飞白 on May 5, 2017

C style 的变量声明有时候会很难读取,比如下面几种:

int (*p)[ 5 ];   
char *x[ 3 ][ 4 ];
int *(*a[ 10 ])();
int (*t[])();

有一种比较简单的识别方式:

从变量名(或标识符)开始。在不跳过右括号的前提下,看看右边是什么。

在不跳过左括号的前提下,看看左边有什么。

如果是在括号内,跳出括号。

再看看右边和左边

注意: 始终记得函数与数组是从左到右读,且是优先于指针的,指针是从右向左读。

回到之前的例子:

int (*p)[ 5 ] 先找到标识符p,右边是括号,看左边。左边是指针符,所以p是一个指针。 跳出括号看右边,我们看到数组index 5,所以p是一个指向一个size为5的数组的指针(a pointer to an array of 5 ints)

char *x[ 3 ][ 4 ] 先找到标识符x,向右看,我们看到了[ 3 ][ 4 ],表示3个size为4的数组,注意数组的优先值大于指针,所以我们现实别出二维数组。接着看左边,是一个指针符,因此变量x是一个3x4的指向字符的指针数组(x is an array composed of 3 arrays of 4 pointers to char)

int *(*a[ 10 ])() 先找到标识符x,向右看,得到数组index,向左看,是指针,所以是指针数组。跳出括号,左边是一个function,右边是指针,表示指向函数的指针。 因此,a一个size为10的指针数组,指向返回int的函数(x is an array composed of 3 arrays of 4 pointers to char)

int (*t[])() 先找到标识符t,向右看,表示不定长数组(指针),左边是指针,还是指针数组。跳出括号,右边是function,左边是返回值int。所以t一个指针数组,指向返回int的函数(an array of pointers to functions returning an int)