详解strlen和sizeof在数组中的使用(四)

举报
执久呀 发表于 2022/02/18 12:29:19 2022/02/18
【摘要】 ​ 目录一、前言二、sizeof在指针中的试题:解析:vs编辑器验证:32位平台: 64位平台:一、前言前面一节我们已经讲过了有关于strlen在字符数组中的使用,以及strlen使用时候的注意事项譬如只能在字符数组中使用,遇到'\0'才会停止,传过来的是地址,传值会出错等等之类的,不太清除的小伙伴可以往回翻翻看看。那么废话不多说,咱们今天要讲的是sizeof在指针的使用。二、sizeof在...

 目录

一、前言

二、sizeof在指针中的试题:

解析:

vs编辑器验证:

32位平台:

 64位平台:




一、前言


前面一节我们已经讲过了有关于strlen在字符数组中的使用,以及strlen使用时候的注意事项

譬如只能在字符数组中使用,遇到'\0'才会停止,传过来的是地址,传值会出错等等之类的,不太

清除的小伙伴可以往回翻翻看看。那么废话不多说,咱们今天要讲的是sizeof在指针的使用。




二、sizeof在指针中的试题:


#include<stdio.h>

int main()
{
	char *p = "abcdef";

	printf("%d\n", sizeof(p));

	printf("%d\n", sizeof(p+1));

	printf("%d\n", sizeof(*p));

	printf("%d\n", sizeof(*p+1));

	printf("%d\n", sizeof(p[0]));

	printf("%d\n", sizeof(&p));

	printf("%d\n", sizeof(&p+1));

	printf("%d\n", sizeof(&p[1]+1));

	return 0;


题目简单分析:char *p = "abcdef",定义了一个指针去接受一个字符串常量,其中p只是接受了

字符串常量的首元素地址。而不是存放整个字符串的地址(因为是char型,人家根本存不下这么大

长一坨,只能存一个),事实上只要记住首元素地址就完全够了,因为可以通过首元素地址找到

整个字符串(因为字符串的地址也是连续存放的)。




解析:


第一题:sizeof(p),p是存放字符串的首地址,既然是地址,那就是4或8字节。(注意:这个

可不是数组名呀,这个是指针,一定要注意区分)

第二题:sizeof(p+1),p是字符串常量的首元素地址,p+1就是第二个元素地址,还是地址那

就是4或8字。(相信小伙伴们已经非常熟悉了吧,反正我已经讲烂了)

第三题:sizeof(*p),p表示首元素地址,*p表示拿到首元素的值了,且该元素的值是char类

型的,所以大小是1字节

第三题;sizeof(*p+1),这题其实之前已经讲过了,再讲一遍吧,*p表示的是首元素的值,

其实就是a的值,所以为a+1,a是字符型,1是int类型,两者相加,会发生自动类型转化,

char会自动转化为int(可以巧记为低字节转高字为自动,反之则是强迫),所以结果是a的ascll

码值加一,得到98为整形,所以就相当于计算了整形的大小为4字节

第四题:sizeof(p[0]),p[0]等价于*(p+0),所以表示的是首元素地址加0,还是首元素地址

在*(首元素地址),得到的是首元素的值,为char类型所以大小是1字节

第五题:sizeof(&p),&p是首元素地址,所以大小是4或8字节

第六题:sizeof(&p+1),还是地址是第二个元素的地址,只要是地址结果就是4或8字节。

第七题:sizeof(&p[1]+1),&p[1]+1表示的是跳过第二元素的地址,即三个元素的地址,只要是地址,所以是4或8字节



vs编辑器验证:


32位平台:



 64位平台:

 好啦,小伙伴们,咱们下次一定。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。