【问题标题】:address of array ptr equal to to it's value? [duplicate]数组 ptr 的地址等于它的值? [复制]
【发布时间】:2011-03-08 20:30:59
【问题描述】:

可能重复:
C: How come an array’s address is equal to its value?

南非
在 C 中,我尝试打印数组指针的地址。

int a[3] = {0,1,2};
printf("\n%p",a);
printf("\n%p",(&a));

为什么 2 语句打印相同的值?
提前感谢

【问题讨论】:

    标签: c arrays pointers printf


    【解决方案1】:

    在 C 数组中“衰减”到指向它们在某些上下文中的第一个元素的指针。将数组传递给函数就是其中一种情况。

    【讨论】:

      【解决方案2】:

      函数的任何数组参数都将衰减为指向数组第一个元素的指针。

      The C Book 对此有很好的解释:

      另一种情况是数组名是 & 地址的操作数 操作员。在这里,它被转换为 整个数组的地址。什么是 区别?即使你认为 地址在某种程度上是“ 相同”,关键的区别在于 他们有不同的类型。为 T 类型的 n 个元素的数组,然后 第一个元素的地址有 键入“指向 T 的指针”;的地址 整个数组的类型为'pointer to T' 类型的 n 个元素的数组; 显然非常不同

      【讨论】:

        【解决方案3】:

        因为局部数组被视为一种特殊情况(它们衰减为指针)。

        在你的情况下 &a 被翻译成 a。

        如果您尝试使用 int 指针,例如,

        int c = 3;    
        int* p = &c;
        

        你应该得到不同的值。

        【讨论】:

          【解决方案4】:

          在某些情况下,数组“衰减”为指向其元素的指针。将它作为参数传递给函数就是其中之一。因此在

          void func(int * pi, size_t nints);
          int a[3] = {0, 1, 2};
          func(a, 3);
          

          指向a 的指针被传递给func。这也是您的代码中发生的情况。当您将其分配给指针时也会发生这种情况:

          int * pi = a;
          assert(*pi == 0); assert(*(pi + 1) == 1); assert(*(pi + 2) == 2);
          

          如果您将pi 替换为a,此处的断言也可以使用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-05-23
            • 1970-01-01
            • 2021-11-11
            • 2017-04-07
            • 1970-01-01
            • 1970-01-01
            • 2017-10-10
            相关资源
            最近更新 更多