指向数组语法的指针
我有关于指向数组的指针语法的问题。 我们知道数组本身就是指针(我们的教授说的是什么)所以为什么当我们用另一个指针指向它们时(它们是指向指针的指针)我们使用这种语法:
int array[10]; int *pointer = array;
而不是这种语法:
int array[10]; int **pointer = &array;
虽然我知道这是正确的使用malloc但为什么不以正常的方式,它是一个编译器或语法的东西或我错在其他地方?
我们知道数组本身就是指针
不,数组不是指针。 数组是数组。 除非它是sizeof
或一元&
运算符的操作数,否则“N元素数组T
”的表达式将被转换(“衰减”)为“指向T
指针”类型的表达式和expression将是数组的第一个元素的地址。 但是,除了数组元素本身之外,没有为指针留出存储空间。
所以,鉴于声明
int array[10];
表达式array
的类型是“10元素数组的int
”; 除非array
是sizeof
或unary &
的操作数,否则它将衰减为int *
类型。 所以
int *ptr = array;
作品。
&array
的类型不是 int **
; 类型是int (*)[10]
,或“指向IO元素数组的指针”。 你将这样的指针声明并初始化为
int (*ptr)[10] = &array;
告诉你的教授他们错了。 数组不是指针。 数组可以衰减到指针,但它们不是指针。
int* pointer = array;
声明一个指向array
第一个元素的指针。
int** pointer = &array;
是不正确的。 正如jschultz410在评论中所提到的, &array
的类型不是 int**
,它是int (*)[10]
又是指向10个int的数组的指针,它不能衰减到int**
。
首先是指针的这个定义
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
之后, ++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”的表达式转换为类型为”指针的表达式键入”指向数组对象的初始元素,而不是左值。 如果数组对象具有寄存器存储类,则行为未定义。
如果你写的例子
int array[10]; int *pointer = array;
那么sizeof( array )
不等于sizeof( pointer )
尽管你可以使用通用语法来访问数组的元素:
array[ i ]
和pointer[ i ]
并得到相同的结果..