以下声明的区别是什么:
int* arr1[8];
int (*arr2)[8];
int *(arr3[8]);
理解更复杂的声明的一般规则是什么?
以下声明的区别是什么:
int* arr1[8];
int (*arr2)[8];
int *(arr3[8]);
理解更复杂的声明的一般规则是什么?
当前回答
我不知道它是否有一个正式的名字,但我称之为左右事物(TM)。
从变量开始,然后向右、向左、向右……等等。
int* arr1[8];
Arr1是一个包含8个指向整数的指针的数组。
int (*arr2)[8];
Arr2是一个指向8个整数数组的指针(括号块左右)。
int *(arr3[8]);
Arr3是一个包含8个指向整数的指针的数组。
这将帮助您处理复杂的声明。
其他回答
typedef int (*PointerToIntArray)[];
typedef int *ArrayOfIntPointers[];
以下是我的解释:
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 B[8]。
让我们还有一个指向B的变量a。现在,a处的值是B,即(* a) == B。因此a指向一个整数数组。在你的问题中,arr类似于A。
类似地,在int* (*C)[8]中,C是一个指向整数指针数组的指针。
int *arr1[5]
在这个声明中,arr1是一个包含5个指向整数的指针的数组。 原因:方括号的优先级高于*(取消引用操作符)。 在这种类型中,行数是固定的(这里是5),但列数是可变的。
int (*arr2)[5]
在这个声明中,arr2是一个指向5个元素的整数数组的指针。 原因:这里,()括号的优先级高于[]。 在这种类型中,行数是可变的,但列数是固定的(这里是5)。
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