【问题标题】:Explanation of Array Pointers in c? [duplicate]c语言中数组指针的解释? [复制]
【发布时间】:2012-10-10 16:54:19
【问题描述】:

可能重复:
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

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

【问题讨论】:

  • 您实际上并没有使用 *c 取消引用指针,要取消引用它,您需要使用 *c[0]。您可以通过初始化为零并尝试两个“取消引用”来测试它。
  • @YoussefG。数组衰减为指向数组第一个元素的指针,因此表达式中的c 最终指向第一个元素,而*c 取消引用该值
  • @Jason 我了解数组是什么,但在二维数组中 *c 不会给你第一个值,因为它只会取消引用 1 个地址:指向一个字符的指针,他是获取第二个指针的地址,恰好与第一个指针的地址相同。尝试一个快速程序,您会看到 *c 将评估为一个地址,但 **c 将评估为零(如果您初始化为零)。
  • @YoussefG.对不起,我想我们说的是完全相同的事情......因为这是一个二维数组,*c 取消引用另一个数组。所以c 的第一个元素是一个数组,通过延迟c 你将返回该数组,但它也必须衰减到指向其第一个元素的指针,即实际的int 元素。我在一般意义上使用“值”,无论该类型是什么,无论是数组等,而不是int的值中的“值”。

标签: c pointers multidimensional-array


【解决方案1】:

在大多数情况下1,“N-element array of T”类型的表达式将被转换(“decay”)为“pointer to T”类型的表达式,并且表达式的值将是数组中第一个元素的地址。

表达式c 的类型为int [1][1];根据上面的规则,表达式将衰减为类型int (*)[1],或“指向int 的1 元素数组的指针”,其值将与&c[0] 相同。如果我们取消引用这个指针(如在表达式*c 中),我们会得到一个类型为“int 的1 元素数组”的表达式,再次按照上面的规则,它会衰减为int * 类型的表达式,其值将与&c[0][0] 相同。

数组第一个元素的地址和数组本身的地址是一样的,所以&c == &c[0] == &c[0][0] == c == *c == @ 987654337@。所有这些表达式都将解析为相同的地址,即使它们没有相同的类型(分别为int (*)[1][1]int (*)[1]int *int (*)[1]int *int *)。


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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      See Q&A #3 & #4

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

      【讨论】:

      • 这个答案并没有真正遵循这个问题。错误在于他只取消引用一个地址。它与获取指针的地址无关。 c 是指向 1 个整数数组的指针的地址。
      • @YoussefG。 - 我正在解决的 OP 问题的一部分是我强调的。显然 OP 很困惑,为什么延迟数组与延迟指针的行为不同(关于数组与指针的混淆)
      • 非常宽松,我认为你最好展示一下'int **c;'之间的区别和'int c [1] [1];'理解这一点。
      猜你喜欢
      • 2013-07-03
      • 2020-01-19
      • 2021-09-22
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多