SA
在C中我试图打印数组指针的地址。
int a[3] = {0,1,2};
printf("\n%p",a);
printf("\n%p",(&a));
2语句打印相同的值为什么?
提前感谢
答案 0 :(得分:7)
函数的任何数组参数都会衰减为指向数组第一个元素的指针。
The C Book对此有一个很好的解释:
另一种情况是数组名称是 &的操作数地址的 运营商。在这里,它被转换成 整个数组的地址。什么是 区别?即使你这么想 地址将以某种方式' 同样的,关键的区别在于 他们有不同的类型。为 然后,类型为T的n个元素的数组 第一个元素的地址有 输入'指向T'的指针;的地址 整个数组都有类型'指针指向 类型为T'的n个元素的数组; 显然非常不同
答案 1 :(得分:0)
在C数组中“衰减”指向某些上下文中第一个元素的指针。将数组传递给函数就是其中之一。
答案 2 :(得分:0)
因为局部数组被视为特殊情况(它们会衰减为指针)。
在您的情况下,& a被翻译为。
如果尝试使用int指针,例如
int c = 3;
int* p = &c;
你应该得到不同的价值观。
答案 3 :(得分:0)
在某些情况下,数组“衰减”为指向其元素的指针。将它作为参数传递给函数就是其中之一。因此在
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
。