1

可能重复:
C:为什么数组的地址等于它的值?
C指针:数组变量

考虑一个多维数组:

int c[1][1];

为什么以下所有表达式都指向同一个地址?

printf("%x", (int *) c);      // 0x00000500
printf("%x", *c);             // 0x00000500
printf("%x", c);              // 0x00000500

指针的实际值和取消引用的值如何相同?

4

3 回答 3

1

你只需要想一想:这个数组的第一个位置在哪里?

假设它0x00000050在你的内存空间中。数组中的第一项是什么?它是c[0][0],它的地址是0x00000050。果然,第一个位置的地址和数组是一样的。即使您c[0]只这样做,它仍然指向相同的地址,只要您将其转换为正确的类型。

但是你不应该混淆指向数组的指针。

于 2012-10-10T17:02:39.797 回答
1

在大多数情况下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 *)。


1 - 此规则的例外情况是数组表达式是、 或一元运算符的操作数sizeof,或者是用于在声明中初始化另一个数组的字符串文字_Alignof&

于 2012-10-10T18:42:39.907 回答
0

How would a pointer's actual value and it's derefernced value can be the same
它不是一个指针,它是一个数组。

见问答 #3 和 #4

c是数组的地址。c也是第一个元素的地址。

于 2012-10-10T17:01:54.850 回答