恭喜你发现了宝藏干货:详解sizeof和strlen的区别(一维数组篇)

是不是总会有些时候被sizeof和strlen搞得头痛🤧🤧,今天阿博就带领csdn的友友们重新认识它们,化敌为友。

一.整形数组sizeof和strlen的区别

二.字符数组sizeof和strlen的区别

三.指针变量sizeof和strlen的区别

这里先给大家传输一些内功🦹‍♂️🦹‍♂️
1.数组----能够存放一组相同类型的元素,数组的大小取决于数组的元素个数和元素类型
2.指针----地址/指针变量,大小是4/8个字节,我用的是x64环境,所以就是8个字节
3.数组是数组,指针是指针,二者并不等价

好了,开始进入正题,直接上代码


	int a[] = { 1,2,3,4 };         
	printf("%d\n", sizeof(a));           
	printf("%d\n", sizeof(a + 0));
	printf("%d\n", sizeof(*a));
	printf("%d\n", sizeof(a + 1));
	printf("%d\n", sizeof(a[1]));
	printf("%d\n", sizeof(&a));
	printf("%d\n", sizeof(*&a));
	printf("%d\n", sizeof(&a + 1));
	printf("%d\n", sizeof(&a[0]));
	printf("%d\n", sizeof(&a[0] + 1));
	return  0;

1.对于第一个而言,a是数组名,我们首先想到的就是数组首元素的地址!!!大家仔细看,这里a单独存放在sizeof内部,代表的是整个数组元素的大小,这里是4个整形,每个整形是4个字节,所以结果就是16.
2.当我们看到里面是a+0的时候,我们很容易把它当成a看,但是它们两个完全不一样,这里的a并不是单独放在sizeof内部,所以不能把它当成整个数组元素的大小去看,这里a就是数组首元素的地址,在加0,就是第一个元素的地址,而指针大小就是4/8个字节,这里我的是8,大家的可能是4,这是编译环境的原因哦😊😊😊
3.第三个我们不难发现a也没有单独放在sizeof内部,它前面有一个*号,这里就是对a解引用,拿出第一个元素,而它们都是整形,所以大小就是4个字节.
4.这里里面是a+1,a也没有单独放在sizeof内部,所以它就是数组首元素的地址,然后再加1,就是第二个元素的地址,所以就是8个字节.
5.这里是a[1],这里阿博给大家普及一些知识了,a[1]就等价于对(a+1)解引用,拿到的是第二个元素,而它又是一个整形,所以大小就是4个字节.
6.这里是&a,拿出的是整个数组的地址,所以大小为8个字节.
7.🧠🧠🧠大家该发动小脑瓜了,这里星号和&连用,相当于不做任何改变,所以还是整个数组元素的大小,为16.
8.这里a和&连用,取出的是整个数组的地址,然后加1,跳过整个数组!!!但它还是地址,所以大小为8个字节.图解如下.
9.这里&a[0],因为a[0]是第一个元素,所以这里就是取出第一个元素的地址,大小为8个字节.
10.这里就相当于取出第一个元素的地址加1,就是取出第二个元素的地址,大小为8个字节.

在这里插入图片描述

这里就是图八跳过的模拟.好了我们的答案是16,8, 4,8,4, 8,16, 8 ,8, 8.让我们看下代码的结果。
在这里插入图片描述
好了,兄弟们,此关通关,开始进入下一关🦞🦞🦞.

直接上代码

char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(arr + 0));
	printf("%d\n", sizeof(*arr));
	printf("%d\n", sizeof(arr[1]));
	printf("%d\n", sizeof(&arr));
	printf("%d\n", sizeof(&arr + 1));
	printf("%d\n", sizeof(&arr[0] + 1));
	return  0;

这里继续传输内功:
1.sizeof计算的是占用内存空间的大小,单位是字节,不关注内存中到底存放的是什么.
2.sizeof不是函数,它是操作符.
3.strlen是函数
4.strlen是针对字符串的,求的是字符串的长度,本质上统计的是\0之前出现的字符个数.

开始解答

1.第一个arr是数组名,单独放在sizeof内部,代表的是整个数组元素的大小,它不关心有没有\0的存在,所以有六个字符,每个字符占一个字节,大小为6个字节.
2.这一个arr没有单独放在sizeof内部,所以它代表的是首元素的地址,再加0,就是第一个元素的地址,(字符指针和整形指针一样,大小都是4/8个字节).
3.这里是*arr,这里arr代表数组首元素的地址,解引用就是第一个字符,所以大小为1个字节.
4.这里arr[1]就是拿出第二个元素,所以大小还是1个字节.
5.这里arr和&连用,取出的是整个数组的地址,大小还是8个字节.
6.这里&arr+1,跳过整个数组,它还是个地址,所以大小还是8个字节.
7.这里先取出第一个元素的地址,再加1,就是第二个元素的地址,大小还是8个字节.

在这里插入图片描述

图解如上,所以我们的答案是6, 8,1,8, 8,8
在这里插入图片描述

进入下一关,兄弟们!😘😘😘
直接上代码

char  arr[] = "abcdef";
	printf("%d\n", strlen(arr));
	printf("%d\n", strlen(arr + 0));
	printf("%d\n", strlen(*arr));
	printf("%d\n", strlen(arr[1]));
	printf("%d\n", strlen(&arr));
	printf("%d\n", strlen(&arr + 1));
	printf("%d\n", strlen(&arr[0] + 1));
	return  0;

开始解答

1.arr没有放在sizeof和&内部,所以这里arr就是数组首元素的地址,把数组首元素地址传给strlen,然后strlen默认从第一个开始数,这里abcdef是一个字符串,默认\0结尾,而\0之前有6个字符,所以这里等于6.
2.这里arr+0,就相当于把第一个字符的地址传给strlen,所以strlen会从第一个字符往后数,结果也是6.
3.这里把arr解引用,得到的是第一个字符a,而它的ascll值为97,就相当于把97传给strlen,会形成非法访问在这里插入图片描述4.arr[1]就是拿出第二个字符b,它的ascll值为98,所以也是非法访问.
5.🧠🧠🧠这里该注意啦,兄弟们,strlen(const char*),而我们这里传的是整个数组的地址,应该用char ()arr[7],所以虽然说结果相同,但是它们会有类型上的差异,只不过在编译的时候,编译器把它强制转换为(const char)
6.这里&arr取出整个数组的地址,再加1,跳过整个数组,后面放的什么,什么时候遇见\0,我们不得而知,所以说这里为一个随机值.在这里插入图片描述
7.这里我们取出第一个元素的地址再加1,相当于第二个元素的地址,所以从第二个字符往后数起,结果就是5.在这里插入图片描述

继续闯关,兄弟们,指针变量来了哦🤩🤩🤩
直接上代码

char* p = "abcdef";
	printf("%d\n", sizeof(p));
	printf("%d\n", sizeof(p + 1));
	printf("%d\n", sizeof(*p));
	printf("%d\n", sizeof(p[0]));
	printf("%d\n", sizeof(&p));
	printf("%d\n", sizeof(&p + 1));
	printf("%d\n", sizeof(&p[0] + 1));
	return  0;

开始解答

1.sizeof(p),这里p是一个指针,所以它的大小就是8个字节了.
2.这里p+1,因为p是指向a的,然后加1,跳过一个字符,指向b,所以这里就是b的地址,大小为8个字节.在这里插入图片描述
3.这里对p解引用,相当于访问一个字符,所以大小为1
4.p[0]就等价于*(p+0),相当于访问a,所以大小为1,这里可以看成一个数组.
5.&p就相当于取出p变量的地址,它的类型是个二级指针,所以它的大小为8个字节.
6.&p+1跳过指针p,但它也是个地址,所以它的大小为8个字节.在这里插入图片描述
7.&p[0]+1,就相当于b字符的地址,所以它的大小为8个字节.

开始测试

在这里插入图片描述
好了,兄弟们,最后一关来了,直接上代码.

char* p = "abcdef";
	printf("%d\n", strlen(p));
	printf("%d\n", strlen(p+1));
	/*printf("%d\n", strlen(*p));
	printf("%d\n", strlen(p[0]));*/
	printf("%d\n", strlen(&p));
	printf("%d\n", strlen(&p+1));
	printf("%d\n", strlen(&p[0]+1));
	return  0;

1.这里我们把p传给strlen,strlen开始从第一个字符往后数,所以为6.
2.p+1,这里实质上就是字符b的地址,从b来说往后数,所以大小为5.
3.4同上都是非法访问
5.这里我们取出p指针的地址,但它里面存放的什么,有没有\0,我们不知道,所以为随机值注意,这里跟abcdef没有任何关系在这里插入图片描述
6.所以&p+1,它也是随机值,而且与上一个随机值没有任何关系!!!
7.&p[0]+1,就等价于传b的地址给strlen,所以strlen从b开始数,大小为5.在这里插入图片描述

恭喜我们通关了,🎆🎆🎆.

总结:1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小.
2.&加数组名,这里的数组名表示整个数组,取出的是整个数组的地址.
3.除此之外,所有的数组名都表示数组首元素的地址.

**好了,本期就到此结束了,如果友友们有收获的话,可以给阿博点个关注哦,后续继续给大家分享一些干货💕💕💕**

在这里插入图片描述

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿博历练记

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

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

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

打赏作者

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

抵扣说明:

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

余额充值