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

Why does pointer to array (done by &array) equal the array itself?

所以当我的同学写那篇文章时,我几乎对他们大发雷霆

&array gives you address of the first element

但事实证明他们是对的。这对我来说听起来很矛盾。我们正在谈论这样定义的数组:

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

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

Expression &numbers is essentially meaningless

不,不是。

在你的情况下,

  • &numbers 的类型是 int (*) [4]
  • numbersint [4]类型,在某些情况下注意,会衰减到int *.

注:

引用 C11,章节 §6.3.2.1

Except when it is the operand of the sizeof operator, the _Alignof operator, or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array object [....]