为什么指向数组的指针(由 &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]
numbers
是int [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 [....]
所以当我的同学写那篇文章时,我几乎对他们大发雷霆
&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]
numbers
是int [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 [....]