指向数组/指针消除歧义数组的C指针

以下声明有什么区别:

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

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


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

第三个与第一个相同。

一般规则是运营商优先。 随着函数指针进入图片,它可能变得更加复杂。


按照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 )

我不知道它是否有正式名称,但我称它为右撇子Thingy(TM)。

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

int* arr1[8];

arr1是一个由8个指向整数的指针组成的数组。

int (*arr2)[8];

arr2是一个指针(括号左右),以8个整数组成的数组。

int *(arr3[8]);

arr3是一个由8个指向整数的指针组成的数组。

这应该可以帮助您处理复杂的声明。

链接地址: http://www.djcxy.com/p/31653.html

上一篇: C pointer to array/array of pointers disambiguation

下一篇: What's the difference between a pointer, and a pointer variable?