以下声明的区别是什么:
int* arr1[8];
int (*arr2)[8];
int *(arr3[8]);
理解更复杂的声明的一般规则是什么?
以下声明的区别是什么:
int* arr1[8];
int (*arr2)[8];
int *(arr3[8]);
理解更复杂的声明的一般规则是什么?
当前回答
我想第二个宣言让很多人感到困惑。这里有一个简单的理解方法。
假设有一个整数数组,即int B[8]。
让我们还有一个指向B的变量a。现在,a处的值是B,即(* a) == B。因此a指向一个整数数组。在你的问题中,arr类似于A。
类似地,在int* (*C)[8]中,C是一个指向整数指针数组的指针。
其他回答
按照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 )
我认为我们可以使用简单的规则。
example int * (*ptr)()[];
start from ptr
PTR是指向的指针 向右走。它是")"现在向左,它是"(" 出来向右走”()“所以 指向一个不接受参数" go left "并返回一个" go right "指向的指针的函数 由整数“向左”组成的数组。
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
在指向整数的指针中,如果指针是递增的,那么它将移动到下一个整数。
在指针数组中,如果指针增加,则跳转到下一个数组
我不知道它是否有一个正式的名字,但我称之为左右事物(TM)。
从变量开始,然后向右、向左、向右……等等。
int* arr1[8];
Arr1是一个包含8个指向整数的指针的数组。
int (*arr2)[8];
Arr2是一个指向8个整数数组的指针(括号块左右)。
int *(arr3[8]);
Arr3是一个包含8个指向整数的指针的数组。
这将帮助您处理复杂的声明。