我正在学习C阵列并且感到困惑。
数组名称如何在一个内存位置保存两个值?
我的示例代码:
int main (){
int a[2] = {1, 2};
printf("&a = %p , &a[0] = %p\n", &a, &a[0]);
printf("a = %p , a[0] = %d\n", a, a[0]);
}
输出:
&a = 0x7ffcd51df7e0 , &a[0] = 0x7ffcd51df7e0
a = 0x7ffcd51df7e0 , a[0] = 1
它显示相同地址(0x7ffcd51df7e0)(第一个输出语句)保存两个 不同的值(0x7ffcd51df7e0,1)(第二个输出语句)。
C编译器做了什么来实现它或者我误解了什么? 谢谢!
答案 0 :(得分:1)
是的,你错了。
当作为参数传递给函数时,数组名a
衰减到指向第一个元素的指针。它不代表第一个元素的值。您可以通过查看其类型以及用于打印其值的相应格式说明符来获取提示。
所以,
printf("a = %p , a[0] = %d\n", a, a[0]);
与
相同printf("a = %p , a[0] = %d\n", &a[0], a[0]);
如果你想获得地址的价值,你必须尊重。
答案 1 :(得分:1)
除非它是sizeof
或一元&
运算符的操作数,否则表达式为" N
- T
&#34的元素数组;将被转换("衰变")到类型为#34的表达式;指向T
"并且表达式的值将是数组中第一个元素的地址。
C中的数组不存储任何元数据,因此数组的第一个元素的地址和数组本身的地址是相同的,如下所示:
+---+
a: | | a[0]
+---+
| | a[1]
+---+
这就是&a
和&a[0]
产生相同值的原因;它们都指向相同的内存位置。但是,这两个表达式的类型是不同的。 &a
的类型为#34;指向int
"或int (*)[2]
的2元素数组。 &a[0]
的类型为"指针int
"或int *
(考虑a
和a[0]
的类型,此模式将有道理)。
当事情变得怪异的时候,a
单独出现在表达式中。如果它不是sizeof
或一元&
运算符的操作数,则将其视为指向数组第一个元素的指针,并将被转换(&# 34;衰减")指针类型。这就是你获得输出的原因; a
,&a
和&a[0]
都计算到数组第一个元素的地址。