c中数组指针的解释?

时间:2012-10-10 16:54:20

标签: c pointers multidimensional-array

  

可能重复:
  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值如何相同?

3 个答案:

答案 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。所有这些表达式将解析为相同的地址,即使它们没有相同的类型(*cc[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
它不是一个指针,它是一个数组。

See Q&A #3 & #4

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