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

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}都可以做到,其中的原理上面说的很清楚啦!!!

批量初始化数组和memset函数的更多相关文章

  1. c++ 批量初始化数组 fill和fill_n函数的应用

    转自c++ 如何批量初始化数组 fill和fill_n函数的应用 std::fill(a+,a+,0x3f3f3f3f);///从下标2到下标10 前闭后开 共8个 std::fill_n(a+,,0 ...

  2. 【转】c++ 如何批量初始化数组 fill和fill_n函数的应用

    http://blog.csdn.net/sunquana/article/details/9153213 一. fill和fill_n函数的应用: fill函数的作用是:将一个区间的元素都赋予val ...

  3. C++定义和初始化数组以及memset的使用(转)

    一.一维数组 静态 int array[100]; 定义了数组array,并未对数组进行初始化 静态 int array[100] = {1,2}: 定义并初始化了数组array 动态 int* ar ...

  4. memset函数及其用法,C语言memset函数详解

    在前面不止一次说过,定义变量时一定要进行初始化,尤其是数组和结构体这种占用内存大的数据结构.在使用数组的时候经常因为没有初始化而产生“烫烫烫烫烫烫”这样的野值,俗称“乱码”. 每种类型的变量都有各自的 ...

  5. 关于数组的初始化memset函数

    关于数组的初始化memset函数 其实memset复制时按bit8个8个的赋值,有兴趣的可以自己百度.

  6. [转载]C++二维动态数组memset()函数初始化

    来源:https://blog.csdn.net/longhopefor/article/details/20994919 先说说memset函数: void *memset(void *s,int ...

  7. C语言中的memset函数和数组指针

    代码: #include <iostream> #include <cstring> using namespace std; int main(){ ] = {}; mems ...

  8. memset初始化数组的问题

    今天才搞清楚,memset用于初始化数组,仅能初始化为0值,而不能初始化一个特定的值,这怎么能模糊了呢??? 因此,如果对申请的一段存放数组的内存进行初始化,每个数组元素均初始化为特定的值,必须使用循 ...

  9. memset初始化数组的坑

    memset函数常被我们用来初始化数组,然而有个坑可能会被我们踩到. 静态数组初始化 一般情形是这样的: #include <cstring> int main() { // 静态数组ar ...

随机推荐

  1. 冒泡排序的C、C++实现

    一.冒泡排序 冒泡排序就是重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如数字从大到小.首字母从A到Z)错误就把他们交换过来.走访元素的工作是重复地进行直到没有相邻元素需要交换, ...

  2. Ubuntu17安装Jenkins

    Java安装 Jenkins基于Java, 所以需要先安装java. Linux下安装java只要配置java环境变量即可. 首先,解压java到相应目录,我一般习惯把安装的软件放到目录/usr/lo ...

  3. MT【91】空间余弦定理

    评:空间余弦定理:空间四边形$ABCD$中$cos<AC,BD>=\frac{|(|AB|^2+|CD|^2)-(|BC|^2+|AD|^2)}{2|AC||BD|}$,证明用向量.

  4. Spring点滴十:Spring自动装配(Autowire)

    在基于XML配置元数据,在bean的配置信息中我们可以使用<constructor-arg/>和<property/>属性来实现Spring的依赖注入.Spring 容器也可以 ...

  5. 洛谷 P3975 [TJOI2015]弦论 解题报告

    P3975 [TJOI2015]弦论 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为\(n\)的字符串,求 ...

  6. 51nod1134——(最长上升子序列)

    给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10.   Input 第1行:1个 ...

  7. JavaScript学习复习

    JavaScript 输出 使用 window.alert() 弹出警告框. 使用 document.write() 方法将内容写到 HTML 文档中. 使用 innerHTML 写入到 HTML 元 ...

  8. CodeForces 450B Jzzhu and Sequences (矩阵优化)

    CodeForces 450B Jzzhu and Sequences (矩阵优化) Description Jzzhu has invented a kind of sequences, they ...

  9. Jenkins + Pipeline 构建流水线发布

      Jenkins + Pipeline 构建流水线发布 利用Jenkins的Pipeline配置发布流水线 参考: https://jenkins.io/doc/pipeline/tour/depl ...

  10. Scala进阶之路-高级数据类型之数组的使用

    Scala进阶之路-高级数据类型之数组的使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组的初始化方式 1>.长度不可变数组Array 注意:顾名思义,长度不可变数 ...