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

时间:2014-07-10 11:14:01

标签: 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);
}

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

3 个答案:

答案 0 :(得分:5)

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

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

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

int (*p)[20]声明p as pointer to array of size 20 of type int所以同时*p是指向数组第一个元素的指针。

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

答案 1 :(得分:5)

p是指向20整数数组的指针。数组的第一个字节的地址被称为数组的地址。取消引用它将给整个数组本身。因此*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 What exactly is the array name in c?

答案 2 :(得分:0)

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

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