如果你在编程时开了一个数组
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 一共有 4 个字节 (不知道 int 多少字节的小伙伴可以戳这个👉 知识空投箱)
所以啊,我们这里只写一个 0x3f,它这样用 0x3f 来初始化 4 个字节 合在一起就是 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类型的数组,有精度问题,可能会出现答案错误
真正的考试中一般都得手动初始化