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

时间:2017-01-10 18:32:26

标签: c arrays pointers dereference addressof

所以当他们写下那个

时,我几乎全身心投入到我的同学身上
  

&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 == %d\n", *first_elm_ptr, *numbers);

显然你无法获得指向该数组的变量保持地址的指针。表达式&numbers基本上没有意义。也许它甚至被编译器删除了。

怎么可能?我现在很困惑!标准如何解释这种行为?我制作了一个ideone测试代码来验证这一点:http://ideone.com/pYffYx

1 个答案:

答案 0 :(得分:1)

数组的地址和数组的第一个元素的地址基本相同 value (相同的地址位置)。它们的区别在于类型

  

表达式&numbers基本上没有意义

不,不是。

在你的情况下,

  • &numbers的类型为int (*) [4]
  • numbers属于int [4]类型,在某些情况下 Note ,它会衰减为int *

注意:

引用C11,章节§6.3.2.1

  

除非它是sizeof运算符,_Alignof运算符或者&运算符的操作数。   一元Range("B8:G8").Copy Sheets("History 5440").Range("B1048576").End(xlUp).Offset(1, 0) 运算符,或者是用于初始化数组的字符串文字,一个包含的表达式   type ''类型''的数组被转换为类型''指向类型''指针的表达式   到数组对象的初始元素[....]