• 批量初始化数组和memset函数


    对于数组的初始化有一下三种方式:

    int  a[]={1,2,3,4,5} //通过判断初始化值得个数来却仍数组长度

    int b[5]={1,2,3} //数组长度为5,可是初始值却只有三个,因此,不足的初始值需要使用么人值初始化,即b[0]=1,b[2]=3,b[3]=b[4]=0;

    int c[5]={0};//这个效果是数组所有元素值都初始化为0了,可是并不是这样写就是全部初始化为相同的给定值,之所以会全部为0是因为,数组长度为5,却只提供一个初始值,因此后面四个元素要用默认值来初始化,对于整形来说,默认值是0,这才造成全部初始化为0的局面

    关键点来了,要想批量初始化数组为整形1,可不可以呢?

    int  int_array[5]={1} ;//答案是否定的,这种形式只是把int_array[0]=1,而剩下元素值全部默认初始化为0了

     这时候我们会想到memset函数长迎来初始化字符数组为0的场景,那么memset能不能把整形数组初始化为1呢?

    别急着回答,先来回顾一个memset的知识

    memset:char型初始化函数

    头文件:<string.h> 或 <memory.h>

    函数原型:void *memset(void *s , int ch , size_t  n )

    memset(结构体/数组名 , 用于替换的ASCII码对应字符 , 前n个字符 );

    memset(结构体/数组名 , "用于替换的字符“ , 前n个字符 );

    函数解释:将s中的前n个字节用ch替换并且返回s

    看完这些是不是还不确定答案呢?

    那么告诉你这总方法不可行,你会不会大吃一惊!!

    细细道来:注意这句话  将s中的前n个字节用ch替换并且返回s 它的意思是对于每个字节,都用给定的第二个参数值初始化,而初始化多少个字节取决于第三个参数

    对于char型数组来说,每个char数组元素都占用一个字节,那么第二个参数只要是很乏的byte值,都会实现批量初始化效果

    但是对于整形数组来说,int占4个字节(sizeof函数求得,每个编译器估计有些不一样),那么当我们执行下列语句

    int int_array[5];

    memset(int_array,1,sizeof(int)*5)

    输出来的结果会让你大吃一惊

    根据解释,int是四个字节,而memset是对每个字节都赋值为第二个参数值,其结果就是int_array[0]的内部二进制码表示0x01   0x01  0x01  0x01  转换成10进制肯定不是1了?

    那么是不是memset只能对char型数组进行批量清0呢?

    其实不是,对于其他类型的数组,只要是初始化为0或者-1 ,结果都是正确的这是因为  0x00 0x00 0x00 0x00 10进制结果仍然是0

    0xff  0xff  0xff  0xff  10进制结果仍然是-1

    结论:对于非字符型数组进行批量赋值是不可能的,只能用循环实现一个个元素赋值

    但是当涉及到把素组元素全部初始化为0时,无论是用memset还是{0}都可以做到,其中的原理上面说的很清楚啦!!!

  • 相关阅读:
    【软件工程】Alpha冲刺 (6/6)
    【软件工程】Alpha冲刺 (5/6)
    为什么三层感知器能够解决任意区域组合的分类问题(不同隐层数的感知器的分类能力)
    PCA学习笔记(含推导过程)
    软件工程实践总结
    Beta冲刺(2/5)(麻瓜制造者)
    Beta冲刺(1/5)(麻瓜制造者)
    个人作业——华为软件开发云案例分析
    Alpha- 事后诸葛亮(麻瓜制造者)
    Alpha课堂展示(麻瓜制造者)
  • 原文地址:https://www.cnblogs.com/gaochaochao/p/9124042.html
Copyright © 2020-2023  润新知