我对数组指针的语法有疑问。好吧,我们知道数组本身就是指针(我们的大学教授说的)所以为什么当我们用另一个指针(这将是指向指针的指针)指向它们时,我们使用以下语法:
int array[10];
int *pointer = array;
而不是这种语法:
int array[10];
int **pointer = &array;
虽然我知道使用 malloc 是正确的,但为什么不以正常方式,它是编译器或语法的事情还是我在其他地方错了?
我对数组指针的语法有疑问。好吧,我们知道数组本身就是指针(我们的大学教授说的)所以为什么当我们用另一个指针(这将是指向指针的指针)指向它们时,我们使用以下语法:
int array[10];
int *pointer = array;
而不是这种语法:
int array[10];
int **pointer = &array;
虽然我知道使用 malloc 是正确的,但为什么不以正常方式,它是编译器或语法的事情还是我在其他地方错了?
告诉你的教授他们错了。数组不是指针。数组可以衰减为指针,但它们不是指针。
int* pointer = array;
声明一个指向 . 中第一个元素的指针array
。
int** pointer = &array;
是不正确的。正如jschultz410在评论中提到的,类型&array
is not int**
,它是int (*)[10]
一个指向 10 个整数数组的指针,它不能衰减到int**
.
我们知道数组本身就是指针
不,数组不是指针。数组就是数组。除非它是 thesizeof
或一元运算&
符的操作数, “N-element array of”类型的表达式T
将被转换(“decay”)为“pointer to T
”类型的表达式,表达式的值将是数组的第一个元素的地址。但是,除了数组元素本身之外,没有为指针预留存储空间。
所以,鉴于声明
int array[10];
表达式的类型array
是“10 元素数组int
”;除非array
是sizeof
or unary的操作数&
,否则它将衰减为 type int *
。所以
int *ptr = array;
作品。
的类型&array
不是;类型是,或“指向 10 元素数组的指针”。您将声明并初始化这样的指针 int **
int (*)[10]
int
int (*ptr)[10] = &array;
首先定义一个指针
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 ]
会得到相同的结果..