【发布时间】:2011-03-08 20:30:59
【问题描述】:
南非
在 C 中,我尝试打印数组指针的地址。
int a[3] = {0,1,2};
printf("\n%p",a);
printf("\n%p",(&a));
为什么 2 语句打印相同的值?
提前感谢
【问题讨论】:
南非
在 C 中,我尝试打印数组指针的地址。
int a[3] = {0,1,2};
printf("\n%p",a);
printf("\n%p",(&a));
为什么 2 语句打印相同的值?
提前感谢
【问题讨论】:
在 C 数组中“衰减”到指向它们在某些上下文中的第一个元素的指针。将数组传递给函数就是其中一种情况。
【讨论】:
函数的任何数组参数都将衰减为指向数组第一个元素的指针。
The C Book 对此有很好的解释:
另一种情况是数组名是 & 地址的操作数 操作员。在这里,它被转换为 整个数组的地址。什么是 区别?即使你认为 地址在某种程度上是“ 相同”,关键的区别在于 他们有不同的类型。为 T 类型的 n 个元素的数组,然后 第一个元素的地址有 键入“指向 T 的指针”;的地址 整个数组的类型为'pointer to T' 类型的 n 个元素的数组; 显然非常不同
【讨论】:
因为局部数组被视为一种特殊情况(它们衰减为指针)。
在你的情况下 &a 被翻译成 a。
如果您尝试使用 int 指针,例如,
int c = 3;
int* p = &c;
你应该得到不同的值。
【讨论】:
在某些情况下,数组“衰减”为指向其元素的指针。将它作为参数传递给函数就是其中之一。因此在
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,此处的断言也可以使用。
【讨论】: