所以当他们写下那个
时,我几乎全身心投入到我的同学身上
&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
答案 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 ''类型''的数组被转换为类型''指向类型''指针的表达式 到数组对象的初始元素[....]