详解strlen和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位平台:

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

  • 46
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 35
    评论
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

执久呀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值