c语言 - 为什么指向数组的指针(由 &array 完成)等于数组本身?



所以当我的同学写下这句话时,我几乎对他们大发雷霆

&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]
  • numbersint [4]型,在某些情况下,它衰减到int *

注意:

引用C11,章节§6.3.2.1

除非它是sizeof运算符、_Alignof运算符或 一元&运算符,或者是用于初始化数组的字符串文本,该表达式具有 类型"类型数组"转换为类型为"指向类型的指针"的表达式,该表达式指向 到数组对象的初始元素 [....]

相关内容

  • 没有找到相关文章

最新更新