通过指针引用多维数组
第一次记录下这个让我困惑好久的问题。
假设定义了一个二维数组如下:
#include"stdio.h"
int main()
{
int shuzu[][4] = { { 1,2,3,4 } ,{5,6,7,8} };
printf("%p\n", shuzu);
printf("%d\n", *shuzu[0]);
printf("%p\n",*shuzu);
printf("%p", *(shuzu+0));
return -1;
}
当时让我困惑的就是第二行开始。明明shuzu就代表了该数组第一个元素的地址,那再它前面加个*不就是取出改地址的值吗?可第三行和第四行都没有取值还是输出的是地址。
我的理解是二维数组里面其实有点像层级包括的样子:
可以吧[]看做 * 等于是去掉一层外壳,而&就是再套上一层外壳)。
虽然吧用数组名都是指向了第一个元素的地址,但是shuzu其实可以看做shuzu这一层,*shuzu就是把shuzu这一层去掉了,但是里面装的还是地址,想要再取出地址里的数还要**shuzu才行。(其实我觉得谭浩强的P247介绍的更好点,shuzu是一个阵列名,二维数组有行和列,你一个下标只是知道行,想知道具体士兵还要知道列,只不过0行0列的士兵像个牌面,你想起shuzu这个阵列就能想到这个士兵。)
我这个比喻后来想想在一维数组那里就不管用了不太好。
接下来就是数组指针了,这个东西其实跟二维数组一样
#include"stdio.h"
int main()
{
int shuzu[][4] = { { 1,2,3,4 } ,{5,6,7,8} };
int(*p)[2][4] = shuzu;
printf("%p\n", shuzu);
printf("%d\n", *shuzu[0]);
printf("%p\n",*shuzu);
printf("%p\n", *(shuzu+0));
printf("%p\n", *p);
printf("%p\n", p);
printf("%p\n", **p);
printf("%p\n", *p[0]);
printf("%p\n", p[0][0]);
printf("%d\n",* p[0][0]);
printf("%d\n", ***p);
return -1;
}
这里吧二维数组给了数组指针,就是又套了一层壳。
#include"stdio.h"
int main()
{
int shuzu[] = { 1,2,3,4 } ;
int(*p)[4] = shuzu;
printf("%p\n", shuzu);
printf("%d\n", *shuzu);
printf("%p\n", p);
printf("%p\n", *p);
printf("%d\n", **p);
printf("%d\n", *p[0]);
printf("%d\n", p[0][0]);
return -1;
}
0076FAE8
1
0076FAE8
0076FAE8
1
1
1
输出就是这个样子,一个数组指针指向了这个一维数组,等于加了一层壳。
(本人菜鸟,这里只是记录下我的理解,如有大神看到不对的地方请帮忙指出,谢谢)
后面就是指针数组
指针数组其实还是数组:只是这个数组里的元素存的是地址。
int shuzu[] = { 1,2,3,4 } ;
int* p[4] = { shuzu[0] ,9,5,5};
printf("%p\n",p);
printf("%p\n", shuzu);
printf("%p\n", p[1]);
printf("%p\n", p +2);
printf("%d\n", sizeof(p) );
007DFBA4
007DFBBC
00000009
007DFBAC
16
这是输出,当时有一点搞混 了,一直在纠结第一行的地址跟第二行的地址为啥不一样。。。。
其实是我没搞明白指针数组本身也要占用一定的地址空间,p就是输出了这个指针数组首元素的地址,但它这个地址跟shuzu的地址不是同一个地址,(*)p才是跟shuzu同一个地址,因为指针数组存的是地址。