当p指向数组时,为什么p和* p给出相同的地址?

我在写这个节目 –

#include void main() { int arr[20]; arr[0]=22; arr[1]=23; int (*p)[20]=&arr; printf("address in p :%u:\n",p); printf("address in *p:%u:\n",*p); } 

对于p和* p,此代码的输出相同! 据我所知* p持有arr的基地址,这只不过是arr [0]! 所以* p应该给出输出22! 但是它显示了与p一样的内存地址。 请告诉我为什么会这样? 它背后的原因是什么?
键盘站点链接: http : //codepad.org/LK7qXaqt

p是指向20整数数组的指针。 数组的第一个字节的地址被称为数组的地址。 取消引用它将提供整个arrays本身。 因此*p表示数组arr ,因此您可以将*p视为数组名称。
当数组名称在传递给函数时被转换为指向其第一个元素的指针, *p被衰减为指向arr第一个元素的指针。 因此

 printf("address in *p: %p:\n", (void*)*p); 

将打印数组arr第一个元素的地址

 printf("address in p: %p:\n", (void*)p); 

将打印整个数组的地址(即数组的第一个字节 )。 由于第一个字节第一个元素的值相同,这就是为什么两个都打印相同的地址。

有关详细说明: Stack Overflow http://cdn.sstatic.net/stackoverflow/img/favicon.ico c中的数组名称究竟是什么?

因为p和* p只指向相同的内存位置,所以类型不同

  +-+-+-+-+-+-+-+-+-+-+-+-+ | | | | | | | | | | | | | +-+-+-+-+-+-+-+-+-+-+-+-+ arr [ ] p [ ] (*p)[ ] 

如果你打印p+1*p + 1你应该看到差异

int (*p)[20] p声明为指向类型为int的数组20的数组,因此同时*p是指向数组第一个元素的指针。

第一个元素和整个数组的地址是相同的。

是的,可以将地址运算符应用于数组,尽管它似乎是多余的。 结果p是指向数组的指针。 这种事情在正常情况下很少遇到。 正如@Mohit所指出的那样,它所指向的对象是整个数组,这意味着sizeof(* p)应该是数组的大小(而不是它的第一个元素)。

* p逻辑上就是数组; 像往常一样,当作为参数传递时,它会衰减到指向其第一个元素(这是一个int)的指针,例如printf。 因为它是第一个元素,它在内存中的位置是整个数组的(开头)的位置。