一、memset函数的功能

对数组中的每一个元素进行赋值(例如:可以给数组中的每一个元素赋值成0或-1等等)从而免去循环赋值的麻烦

二、memset函数的格式


下面依次对上面的图片进行解释:

数组名:指的是要初始化的数组名称,实际上是一个变量地址。因为数组名称实际上就是代表数组中第一个变量的地址。

值:代表对数组进行初始化的值(一般是0和-1,其它值可能会出现与预想有偏差的情况。稍后在下文解释是为什么)

sizeof(数组名):代表提供的初始化数组的字节大小,因为memset函数是按照字节进行赋值的。所以,要想初始化数组(给数组中的所有元素赋值),我们需要计算好要初始化数组的字节大小。

三、memset函数的注意事项

首先,memset是按照字节进行赋值的。这就说明了,如果要初始化一个int数组,那么组成int型的4个字节就会被赋成相同的值。而由于0的二进制补码为全0,-1的二进制补码为全1,不容易弄错。如果要对数组赋其它数字的话(例如1),可能会跟你预想的有所偏差。此时,可以使用fill函数进行初始化。(注意:在初始化数组方面,memset函数要比fill函数的初始化速度快!)

四、memset函数赋其它值的情况

假设,有一个int类型的长度为5的数组,使用memset函数,将数组中的每个元素的值赋予1,此时数组中的每个元素真的都是1吗?请看代码:

#include <iostream>
#include <cstring>
using namespace std;
int main(){
    int a[5] = {1,2,3,4,5};
    memset(a,0,sizeof(a));
    for(int i = 0;i<5;i++){
        printf("%d ",a[i]);
    }
    printf("\n");
    memset(a,1,sizeof(a));
    for(int i =0;i<5;i++){
        printf("%d ",a[i]);
    }
    printf("\n");
    return 0;
}

代码的执行结果为:
![](https://img2020.cnblogs.com/blog/2206600/202106/2206600-20210618172259907-1287187801.png)

为什么会出现以上结果?为什么数组中每个元素的值不是1?还是因为memset函数是按照字节进行赋值的,在c++中int类型是4个字节,那就代表了memset函数将每个字节都赋值成了1。并且在计算机中一个字节是8位二进制数,那就代表了这个二进制数为:00000001 = 十进制的1。所以一个int数组中的每个元素都为4个字节,所以就等于了4个00000001。因此,将4个00000001转换成10进制数后,肯定是不等于1的。最终就等于16843009,int数组中5个元素的值都为16843009。验算如下:

所以,这也就是为什么memset函数只用于初始化0和-1的原因。(如果不懂的话,只记住:memset函数只用于初始化0和-1,若要初始化其它的值,用fill函数)

版权声明:本文为gao79135原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/gao79135/p/14900448.html