可能重复:
C:为什么数组的地址等于它的值?
C指针:数组变量
考虑一个多维数组:
int c[1][1];
为什么以下所有表达式都指向同一个地址?
printf("%x", (int *) c); // 0x00000500
printf("%x", *c); // 0x00000500
printf("%x", c); // 0x00000500
指针的实际值和取消引用的值如何相同?
可能重复:
C:为什么数组的地址等于它的值?
C指针:数组变量
考虑一个多维数组:
int c[1][1];
为什么以下所有表达式都指向同一个地址?
printf("%x", (int *) c); // 0x00000500
printf("%x", *c); // 0x00000500
printf("%x", c); // 0x00000500
指针的实际值和取消引用的值如何相同?
你只需要想一想:这个数组的第一个位置在哪里?
假设它0x00000050
在你的内存空间中。数组中的第一项是什么?它是c[0][0]
,它的地址是0x00000050
。果然,第一个位置的地址和数组是一样的。即使您c[0]
只这样做,它仍然指向相同的地址,只要您将其转换为正确的类型。
但是你不应该混淆指向数组的指针。
在大多数情况下1,“N-element array of T
”类型的表达式将被转换(“decay”)为“pointer to T
”类型的表达式,表达式的值将是数组中第一个元素的地址.
表达式c
的类型为int [1][1]
; 根据上面的规则,表达式将衰减为 typeint (*)[1]
或“指向 1 元素数组的指针int
”,其值将与 相同&c[0]
。如果我们取消引用这个指针(如在表达式中*c
),我们会得到一个类型为“1-element array of int
”的表达式,再次按照上面的规则,它会衰减为一个类型的表达式int *
,并且它的值将与 相同&c[0][0]
。
数组第一个元素的地址和数组本身的地址是一样的,所以&c
== &c[0]
== &c[0][0]
== c
== *c
== c[0]
。所有这些表达式都将解析到相同的地址,即使它们没有相同的类型(分别为int (*)[1][1]
、int (*)[1]
、int *
、int (*)[1]
、int *
和int *
)。
sizeof
,或者是用于在声明中初始化另一个数组的字符串文字_Alignof
&
How would a pointer's actual value and it's derefernced value can be the same
它不是一个指针,它是一个数组。
c
是数组的地址。c
也是第一个元素的地址。