数组ptr的地址等于它的值?

时间:2010-06-27 15:30:13

标签: c arrays pointers printf

  

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

SA
在C中我试图打印数组指针的地址。

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

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

4 个答案:

答案 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

,此处的断言也会有效