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

Sat*_*aki 0 c arrays pointers

我在写这个节目 -

#include<stdio.h>

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);
}
Run Code Online (Sandbox Code Playgroud)

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

Moh*_*ain 5

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

    +-+-+-+-+-+-+-+-+-+-+-+-+
    | | | | | | | | | | | | |
    +-+-+-+-+-+-+-+-+-+-+-+-+
arr [                        ]
  p [                        ]
(*p)[ ]
Run Code Online (Sandbox Code Playgroud)

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

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

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


hac*_*cks 5

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

printf("address in *p: %p:\n", (void*)*p);  
Run Code Online (Sandbox Code Playgroud)

将打印的地址第一元件阵列的arr同时

printf("address in p: %p:\n", (void*)p);  
Run Code Online (Sandbox Code Playgroud)

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

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