数组指针解引用有什么用?

#include <stdio.h>
int main()
{
    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    int(*p)[10] = &arr;
    int i = 0;
    printf("%p\n", p);
    printf("%p\n", *p);
    printf("%d\n", *(*p));
    return 0;
}

调试的时候发现p和*p的值是一样的,都等于&arr,这两个有什么区别吗?
以及为什么*p的值不是arr首元素,而*(*p)才是arr首元素?
请教下各位大佬

p是存放了arr[0]~arr[9]的地址吗?
而*p是指出arr[0]的地址,*(*p)是指出arr[0]?

阅读 2.4k
2 个回答
调试的时候发现p*p的值是一样的,都等于&arr,这两个有什么区别吗?

p 是指向数组的指针。*p 是数组。数组类型对象再使用的时候大部分时候会被自动转化为指向数组第一个元素的指针。数组和数组的第一元素再内存中是在同一个地址开始的。所以地址是一样的。

(你可以试一下 p+1(*p)+1 ,看看有什么不同)

以及为什么*p的值不是arr首元素,而*(*p)才是arr首元素?

上面说了,p 指向的数组,*p 是数组。它会自动转换为指向数组首元素的指针,于是 *(*p) 就是首元素。

p 是存放了arr[0]~arr[9]的地址吗?

p 只存放了 arr 的地址

Stack Overflow上有人问了和你一样的问题:https://stackoverflow.com/que...

简单来说就是

  • p的类型是int (*)[10],它的值就是arr的地址
  • *p是对p的解引用,会得到一个int[10]类型的对象,将它传递给printf等函数的话会被转型为arr的地址(印象中这是c语言规范里规定的,没具体去查)。

因此p*p的值是一样的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进