memset の 那些事儿 (C++)

如果你在编程时开了一个数组

int a[100010]

这是后你想把他全部赋值为一个很大的值

for (int i = 0; i < 100010; i ++)  a[i] = 0x3f3f3f3f
//0x3f3f3f3f 是一个比较接近int_max的一个数,即1061109567

但是,因为 我比较懒  代码的简洁性 我们的主角就闪亮登场了!

memset!!!

(正片开始)

咳咳~~  先等会儿

好像有些小伙伴不知道 0x 是什么?!

0x 就是代表十六进制的意思

0x ...  就代表这个数是十六进制


memset简单介绍

首先,memset 可以初始化数组

具体写法是这样:

memset(数组名, 初始化的值, sizeof 数组名);

头文件(不加 有可能 不会报错,但考试的时候 会寄):

#include <cstring>

整形(int)类数组  memset

首先可以

全部初始化成0

memset(a, 0, sizeof a)

然后是

全部初始化成一个很大的数 (0x3f3f3f3f)

memset(a, 0x3f, sizeof a);

这时候就有眼尖的小伙伴会问啦:

“作者作者,不是说好的 0x3f3f3f3f 吗?”

哎,这就是 memset 的一个易错点!!

memset ,它是按字节来初始化的!!!

众所周知,int  一共有 个字节      (不知道 int 多少字节的小伙伴可以戳这个👉 知识空投箱

所以啊,我们这里只写一个 0x3f,它这样用 0x3f 来初始化 个字节 合在一起就是 0x3f3f3f3f

(一个框一个字节) 

所以下次写 memset 的时候啊,千万别再写 0x3f3f3f3f 


全部初始化成一个很小的数 (-2139062144)

memset(a, 128, sizeof a);

不要问为什么是 128 (我不知道)有dalao知道的话可以在评论区里解答


全部初始化成一个-1

memset(a, -1, sizeof a);

这时候,就有细心的小伙伴会问啦:

“作者作者,不是说只会初始化一个字节嘛?为什么这里初始化 -1 就写 -1 呢?”

这只是一个巧合(真不骗你)

那为啥呢,

因为,众所周知,-1 在计算机中的二进制(补码)是  32个1

那么,因为 memset 只能初始化一个字节。所以是这里的 -1 就是 8个1,

然后就发生了一个很有意思的事情:

 (一个框一个字节) 


有读者就会问啦,

为什么不能全初始化为 1 呢?

还要解释么,memset ,它是按字节来初始化的!!!

如果这样写

memset (a, 1, sizeof a);

那每一个数组里的一个元素就是:

00000001 00000001 00000001 00000001

初始化完就不是 1 了。


浮点型(double)类数组  memset

全部初始化成0

跟整数初始化是一样滴

memset(a, 0, sizeof a);

全部初始化成一个很大的数 (1.38e+306)

memset(a, 127, sizeof a);

全部初始化成一个很小的数 (2.93e+306) 

memset(a, 128, sizeof a);

总结

这里有一张图,包括了我讲的所有操作:


制作不易,留个赞再走吧

声明:这里如果memset   double类型的数组,有精度问题,可能会出现答案错误

真正的考试中一般都得手动初始化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值