先把结论记在这:
指针数组
int* a[5];此类型为int* 类型的5个,是数组
数组指针
int (*a)[5]; 是一个指向int[5]的指针
下面做个试验操作一下记住结论:
int arr[15] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
int main(int argc, char* argv[])
{
int(*p)[2];
p = (int(*)[2])arr;
printf("%d\n", *(*p));
printf("%x-------------%x\n", p, *p);
printf("%d\n", *(*(p + 0) + 0));
printf("%d\n", *(*(p + 1)+1));
return 0;
}
打印结果:
第一条打印结果就不解释了。
第二条打印结果可能开始会毁三观
1、从汇编中看不出什么特别的,只能自己编个理由记住它,p的类型为 int()[2],从最上面结论看,是一个指向int[2]类型的指针,而int[2]本身存储的首先是首地址,所以p是次数组的首地址,而p是转化为int[2]后的数组int[2]的首地址。
第四条打印便可以看出其中的p与*p并非没有区别
根据上一篇介绍的指针运算可以知道,p加1时实际是加了八个字节,*p加1时,实际是加了四个字节,因为p指向int[2],*p指向int。所以我们一共往后数十二个字节,便可得出4.