以下声明的区别是什么:

int* arr1[8];
int (*arr2)[8];
int *(arr3[8]);

理解更复杂的声明的一般规则是什么?


当前回答

以下是我的解释:

int *something[n];

优先级注意:数组下标操作符([])优先级高于 解引用运算符(*)。

因此,这里我们将在*之前应用[],使语句等价于:

int *(something[i]);

注意声明的意义:int num表示num是int, int *ptr或int (*ptr)表示,(值在ptr)是 一个int型,使PTR成为一个指向int型的指针。

这可以理解为,(值(值在第i个索引的东西))是一个整数。因此,(value在something的第i个索引处)是一个(整型指针),这使得something成为一个整型指针数组。

在第二个例子中,

int (*something)[n];

要理解这句话,你必须熟悉这个事实:

数组指针表示的注意事项:somethingElse[i]等价于*(somethingElse + i)

因此,用(*something)替换somethingElse,我们得到*(*something + i),根据声明,这是一个整数。所以,(*something)给了我们一个数组,这使得something等价于(指针指向数组)。

其他回答

在指向整数的指针中,如果指针是递增的,那么它将移动到下一个整数。

在指针数组中,如果指针增加,则跳转到下一个数组

根据经验,右一元操作符(如[]、()等)优先于左一元操作符。因此,int *(*ptr)()[];将是指向一个函数的指针,该函数返回一个指向int的指针数组(在括号之外尽快获得正确的操作符)

int *a[4]; // Array of 4 pointers to int

int (*a)[4]; //a is a pointer to an integer array of size 4

int (*a[8])[5]; //a is an array of pointers to integer array of size 5 

这里有一个有趣的网站,解释了如何在C语言中读取复杂类型: http://www.unixwiz.net/techtips/reading-cdecl.html

按照K&R的建议,使用cdecl程序。

$ cdecl
Type `help' or `?' for help
cdecl> explain int* arr1[8];
declare arr1 as array 8 of pointer to int
cdecl> explain int (*arr2)[8]
declare arr2 as pointer to array 8 of int
cdecl> explain int *(arr3[8])
declare arr3 as array 8 of pointer to int
cdecl>

反之亦然。

cdecl> declare x as pointer to function(void) returning pointer to float
float *(*x)(void )