数组深度解析(通过sizeof和strlen来剖析)

数组深度解析(通过sizeof和strlen来剖析)

sizeof的解析

重点是看sizeof内部的类型是什么,
1.如果是数组名,则是计算整个数组的大小
2.如果是地址,则是计算地址大小,随系统而定,32位的则为4字节,64位的则为8字节
3.如果是其他的,则只是单纯计算类型的大小,char为1字节,int为4字节
4.最后需要注意的是sizeof内部并不参与运算,只是由内部类型来计算出字节大小

例:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

strlen的解析

1.strlen与sizeof不一样的是,sizeof是操作符,而strlen是库函数,需要引用string.h的头文件。
2.由于strlen函数是碰到\0才停止的,所以当数组中无\0时,strlen会一直执行下去,直到遇到\0,所以才导致无\0的字符数组在使用strlen的时候会出现随机值
3.因为strlen(const char* arr),所以当strlen内部放入其他类型的变量时,会被转化成const char* arr,如果是char,int 等整形变量时,则会挂掉

例:
在这里插入图片描述
在这里插入图片描述

进阶:二维数组的计算

在这里插入图片描述

经典笔试题

一:

(int)a+1要从内存存储中来理解,(int)a+1是将a的地址加1==移动一个字节,如下:
在这里插入图片描述

所以打印出来的是:4 20000000 注意:小端存储存进去的数据,去出来仍是要用相同的规则去出来的。

二:

在这里插入图片描述

注意这里是逗号表达式,所以实际的数组如下:

在这里插入图片描述
所以打印出来的是 1

三:

在这里插入图片描述

首先要理解p[4][2],这等价与 * ( (p+4)+2),观察类型得出p+4移动了4 * 4=16个元素, (
(p+4)+2)等于又加了2个,所以是移动了18
个元素。

a[4][2]==* ( (a+4)+2),同理可得移动了45+2=22,

所以结果为22-18=-4,但第一个要由%p(十六进制)来输出,则如图:
[外链图片转存中…(img-blog.csdnimg.cn/e685431ce63f4e59957711cee6fe0067.png)

输出结果为ff ff ff fc -4

四:

我们可以将复杂的问题简单化,假如是int类型的变量,+1则跳过一个int,所以char**的变量+1,则跳过一个char,所以pa++后指向的字符串为at.
在这里插入图片描述

所以打印出来的结果是 at

五:

在这里插入图片描述
太复杂了,这里就直接给答案了

答案为:
在这里插入图片描述

总结

在计算的过程中,我们一定要牢记()内部到底是什么类型的,通过什么方式和规则能计算出来,只要我们灵活掌握了这些方式和规则,我们就可以对任何的计算得心应手了。

此篇结束,感谢支持!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值