以下声明的区别是什么:

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

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


当前回答

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

其他回答

int* arr[8]; // An array of int pointers.
int (*arr)[8]; // A pointer to an array of integers

第三个和第一个一样。

一般规则是运算符优先级。当函数指针出现时,它甚至会变得更加复杂。

我认为我们可以使用简单的规则。

example int * (*ptr)()[];
start from ptr 

PTR是指向的指针 向右走。它是")"现在向左,它是"(" 出来向右走”()“所以 指向一个不接受参数" go left "并返回一个" go right "指向的指针的函数 由整数“向左”组成的数组。

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

我不知道它是否有一个正式的名字,但我称之为左右事物(TM)。

从变量开始,然后向右、向左、向右……等等。

int* arr1[8];

Arr1是一个包含8个指向整数的指针的数组。

int (*arr2)[8];

Arr2是一个指向8个整数数组的指针(括号块左右)。

int *(arr3[8]);

Arr3是一个包含8个指向整数的指针的数组。

这将帮助您处理复杂的声明。

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