通过指针引用多维数组

通过指针引用多维数组

第一次记录下这个让我困惑好久的问题。
假设定义了一个二维数组如下:

#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同一个地址,因为指针数组存的是地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值