【发布时间】:2017-11-21 03:23:17
【问题描述】:
代码:
int arr[5] = {1,2,3,4,5};
int (*p)[5] = &arr;
printf("p:%p\n",p);
printf("*p:%p\n",*p);
结果:p = *p = arr = 0x7ffee517c830都是数组的地址
使用p访问arr[i]的正确方式是*(*p+i)
指针p的类型是int(*)[5],所以p指向一个类型为int [5]的数组。但是我们不能说p指向arr的一个不可见的shell,p毕竟是一个变量。它存储了arr的地址,也就是arr[0]的地址,arr的第一个元素。
我以为*p 会得到我1,这是arr 的第一个元素。
解引用操作是指将p中的值作为地址,从该地址获取值。对?
所以p存储了arr的地址,这里就是0x7ffee517c830,1就存储在这个地址中。 **p 不是非法的吗?第一次取消引用给我们1,第二次取消引用将使用1 作为地址,这是非法的。
我错过了什么?
【问题讨论】:
-
简单地说:
int* p = arr; -
@selbie 好吧,它们做不同的事情。
int (*p)[5]有一些用例
标签: c arrays pointers dereference