恭喜你发现了宝藏干货:详解sizeof(二维数组完结篇)

前面阿博带领友友们掌握了一维数组中sizeof和strlen的区别,今天咱们来学习二维数组,冲鸭!🦆🦆

一.辨识二维数组和一维数组的区别

二.了解sizeof内部运算技巧

好了,开始切入正题,上代码!👻👻`

int main()
{
	int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(a[0][0]));
	printf("%d\n", sizeof(a[0]));
	printf("%d\n", sizeof(a[0]+1));
	printf("%d\n", sizeof(*(a[0]+1)));
	printf("%d\n", sizeof(a+1));
	printf("%d\n", sizeof(*(a+1)));
	printf("%d\n", sizeof(&a[0]+1));
	printf("%d\n", sizeof(*(& a[0] + 1)));
	printf("%d\n", sizeof(*a));
	printf("%d\n", sizeof(a[3]));
	return  0;
}

二维数组其实没有想象中的那么复杂,二维数组的数组名,也表示首元素的地址,二维数组的首元素是第一行,所以首元素的地址就是第一行的地址,是一个一维数组的地址,我们可以把二维数组看成连续的一维数组.

在这里插入图片描述

a[0]就是第一行的数组名,a[1]就是第二行的数组名,a[2]就是第三行的数组名,友友们只要想清楚这个,题目就好理解了.

1.sieof和a连用,这里计算整个数组的大小,而这个数组有12个整形,每个整形是4个字节,所以为48.
2.a[0][0]这里就是第一行第一个元素,所以大小为4个字节.
3.a[0]就是第一行的数组名,它和sizeof连用,所以计算的就是第一行数组元素的大小,所以为16个字节.
4.注意这里a[0]没有单独放在sizeof内部,所以它代表的是首元素的地址,就是第一行第一个元素的地址,这里容易把a[0]当成第一行的地址,大家一定要注意哦,a[0]是第一行数组名,所以它是第一行首元素的地址.所以a[0]+1就是第一行第二个元素的地址.
5.这里就相当于对第一行第二个元素解引用,拿出第一行第二个元素,所以大小为4个字节.
6.这里a作为二维数组名没有单独放在sizeof内部,所以它代表的就是首元素的地址,就是第一行的地址,再加1,就是第二行的地址,在x64环境下大小就是8个字节,在x86环境下就是4个字节.
7.这里解引用,就相当于拿出了第二行整个数组的元素,有4个整形,所以大小为16个字节. 这里也可以把*(a+1)看成a[1]
8.a[0]和&连用,代表取出的是第一行的地址,再加1,就是第二行的地址,所以大小为4/8个字节.这里我们可以调试看一下.在这里插入图片描述
9.这里解引用,拿出的就是第二行的元素,所以大小为16个字节.
10.这里a没有单独放在sizeof内部,所以代表的就是首元素的地址,就是第一行的地址,所以解引用拿出第一行的元素,大小为16个字节.这里我们也可以换一种理解方式,星号a–>*(a+0)–>a[0].
11.前方高能!!!👽👽👽,这里我们不难发现根本就没有a[3],所以我们会想它是不是数组越界了呢,但是其实根本没有,让我们追溯过去吧.

int main()
{
	int a = 5;
	short s = 11;
	printf("%d\n", sizeof(s = a + 2));
	printf("%d\n", s);
	return  0;
}

这里我们不难算出s=7,sizeof(s)=2,short为短整型,所以大小为2个字节.在这里插入图片描述
这里我们会很迷惑为什么s的值不发生变化.其实是这样的🚀🚀🚀

在这里插入图片描述
由此也可以得出刚才那个a[3]的值为16,因为它也是4个整形,这里就不用担心数组越界了,因为它放在sizeof内部.

到此今天的内容就结束了,希望友友们能真正认识并且区分一维数组和二维数组,好了,下期内容阿博会继续给大家带来干货,如果对大家有帮助的话,可以给阿博点个关注哦💓💓💓
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿博历练记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值