所以当我的同学写下这句话时,我几乎对他们大发雷霆
&array
为您提供第一个元素的地址
但事实证明他们是对的。这对我来说听起来不一致。我们谈论的是这样定义的数组:
int numbers[] = {1,2,3,4};
变量numbers
是(我认为)然后类型为 int* const
.我认为指向它的指针将是int** const
.但显然这个表达式的评估结果是正确的:
if(&numbers == numbers) {
printf("Pointer to array is still the same array!n");
}
当然,这也是事实:
int* first_elm_ptr = &numbers;
if(*first_elm_ptr == *numbers)
printf("%d == %dn", *first_elm_ptr, *numbers);
因此,显然您无法获得指向该数组的变量保存地址的指针。表达&numbers
本质上是没有意义的。也许它甚至被编译器删除了。
这怎么可能?我现在很困惑!标准如何解释这种行为?我制作了一个 ideone 测试代码来验证这一点:http://ideone.com/pYffYx
的地址和数组的第一个元素的地址本质上是相同的值(相同的地址位置)。它们的类型不同。
表达
&numbers
本质上是没有意义的
不,不是。
在您的情况下,
-
&numbers
属于int (*) [4]
型 -
numbers
是int [4]
型,在某些情况下,它衰减到int *
。
注意:
引用C11
,章节§6.3.2.1
除非它是
sizeof
运算符、_Alignof
运算符或 一元&
运算符,或者是用于初始化数组的字符串文本,该表达式具有 类型"类型数组"转换为类型为"指向类型的指针"的表达式,该表达式指向 到数组对象的初始元素 [....]