0

我对数组指针的语法有疑问。好吧,我们知道数组本身就是指针(我们的大学教授说的)所以为什么当我们用另一个指针(这将是指向指针的指针)指向它们时,我们使用以下语法:

int array[10]; 
int *pointer = array;

而不是这种语法:

int array[10];
int **pointer = &array;

虽然我知道使用 malloc 是正确的,但为什么不以正常方式,它是编译器或语法的事情还是我在其他地方错了?

4

3 回答 3

5

告诉你的教授他们错了。数组不是指针。数组可以衰减为指针,但它们不是指针。

int* pointer = array;声明一个指向 . 中第一个元素的指针array

int** pointer = &array;是不正确的。正如jschultz410在评论中提到的,类型&arrayis not int**,它是int (*)[10]一个指向 10 个整数数组的指针,它不能衰减到int**.

于 2015-03-01T04:53:08.220 回答
3

我们知道数组本身就是指针

不,数组不是指针。数组就是数组。除非它是 thesizeof或一元运算&符的操作数, “N-element array of”类型的表达式T将被转换(“decay”)为“pointer to T”类型的表达式,表达式的值将是数组的第一个元素的地址。但是,除了数组元素本身之外,没有为指针预留存储空间。

所以,鉴于声明

int array[10];

表达式的类型array是“10 元素数组int”;除非arraysizeofor unary的操作数&,否则它将衰减为 type int *。所以

int *ptr = array;

作品。

类型&array不是;类型是,或“指向 10 元素数组的指针”。您将声明并初始化这样的指针 int **int (*)[10]int

int (*ptr)[10] = &array;
于 2015-03-01T05:19:08.860 回答
3

首先定义一个指针

int array[10]; 
int **pointer = &array;

是无效的。在声明的右侧有一个具有类型的表达式,int ( * )[10]而在左侧有一个类型的标识符int **。指针int ( * )[10]int **. 因此编译器应发出诊断消息。

正确的定义看起来

int array[10]; 
int ( *pointer )[10] = &array;

现在我们可以考虑这两个定义之间有什么区别

int array[10]; 
int *pointer = array;

int array[10]; 
int ( *pointer )[10] = &array;

在第一种情况下,指针指向的对象的大小pointer等于sizeof( int )。因此,如果使用指针算法,那么在计算表达式之后,++pointer指针中的值将增加sizeof( int )字节。例如,如果sizeof( int )等于,4则指针中的值将增加4.

在第二种情况下,指针指向的对象的大小pointer等于10 * sizeof( int ),如果sizeof( int )等于 4,则对象的大小等于40。因此,如果指针增加++pointer,它的值将增加40.

同样在第一种情况下取​​消引用指针会给你一个类型的对象,int而在第二种情况下取​​消引用指针会给你一个int[10]数组类型的对象。

数组不是指针。简单地说,它们通常被转换为指向表达式中第一个元素的指针。来自 C 标准

3 除非它是 sizeof 运算符或一元 & 运算符的操作数,或者是用于初始化数组的字符串字面量,否则类型为 ''array of type'' 的表达式将转换为类型为 ''pointer 的表达式键入指向数组对象的初始元素且不是左值的''。如果数组对象具有寄存器存储类,则行为未定义。

如果你写例如

int array[10]; 
int *pointer = array;

thensizeof( array )不等于,sizeof( pointer )尽管您可以使用通用语法来访问数组的元素:

array[ i ]并且pointer[ i ]会得到相同的结果..

于 2015-03-01T05:19:10.517 回答