可能重复:
C: How come an array’s address is equal to its value?
C pointer : array variable
考虑多维数组:
int c[1][1];
为什么以下所有表达式都指向同一地址??
printf("%x", (int *) c); // 0x00000500
printf("%x", *c); // 0x00000500
printf("%x", c); // 0x00000500
指针的实际值和它的derefernced值如何相同?
答案 0 :(得分:1)
你只需要思考:这个数组的第一个位置在哪里?
假设它在你的记忆空间0x00000050
上。数组中的第一项是什么?它是c[0][0]
,其地址是0x00000050
。果然,第一个位置的地址与数组相同。即使您只进行c[0]
,只要将其转换为正确的类型,它仍然指向相同的地址。
但是你不应该把指针与数组混淆。
答案 1 :(得分:1)
在大多数情况下 1 ,类型为“{元素数组T
”的表达式将被转换(“衰减”)为“指向{{1}的指针”类型的表达式}“,表达式的值将是数组中第一个元素的地址。
表达式T
的类型为c
;根据上面的规则,表达式将衰减为int [1][1]
类型或“指向int (*)[1]
的1元素数组的指针”,其值将与int
相同。如果我们取消引用这个指针(如表达式&c[0]
中),我们得到一个类型为“{element}} {1}的数组”的表达式,按照上面的规则再次衰减为类型的表达式*c
,其值与int
相同。
数组的第一个元素的地址与数组本身的地址相同,因此int *
== &c[0][0]
== &c
== &c[0]
== &c[0][0]
== c
。所有这些表达式将解析为相同的地址,即使它们没有相同的类型(*c
,c[0]
,int (*)[1][1]
,int (*)[1]
,{{1}分别和int *
。
<小时/> 1 - 此规则的例外情况是数组表达式是
int (*)[1]
,int *
或一元int *
运算符的操作数,或者是用于初始化的字符串文字声明中的另一个数组
答案 2 :(得分:0)
How would a pointer's actual value and it's derefernced value can be the same
它不是一个指针,它是一个数组。
c
是数组的地址。 c
也是第一个元素的地址。