0
点赞
收藏
分享

微信扫一扫

C++: 数组初始化

飞进科技 2022-12-02 阅读 125


文章目录

  • ​​栈​​
  • ​​动态数组​​
  • ​​赋值​​
  • ​​memset​​
  • ​​fill​​

数组是底层数据类型,存放在栈中,其内存的分配和释放完全由系统自动完成.
通过如下代码初始化一个​​​全局变量​​数组,初始化的规则就是不足数组大小的按默认值补位

int a[5]; //int默认0
int b[5] = {1,2}; // {1,2,0,0,0} 不足5位的0补位
string c[5] = {"a", "b"}; // {"a","b","","",""}

如果不明确指出初始化列表,那么基本类型是不会被初始化的(全局变量、静态变量外); 类类型如​​string​​​则会为每个元素调用默认构造函数进行初始化。
所以建议使用如下方式初始化,局部变量也会初始化

int a[5]{}; //c++11新写法

动态数组

动态数组是通过​​new​​创建在堆上的数组

int *a = new int[5]; //没有初始化
int *b = new int[5] {1,2}; // {1,2,0,0,0} 不足5位的0补位
string *c = new string[5]{"a", "b"}; // {"a","b","","",""}

动态数组如果不明确指出初始化列表,那么基本类型是不会被初始化的(全局变量也没有初始化,静态变量外),所有的内存都是“脏的”。
​​​new​​还有一种写法,会初始化

int* a = new int[5]();//初始化{0,0,0,0,0}

加了括号的意思是使用默认值初始化整个数组

赋值

memset

​memset​​​可以为上述数组重置,由于​​memset​​按字节对内存块进行初始化,所以不能用它将int数组初始化为0和-1之外的其他值(除非该值高字节和低字节相同)。

memset(void *s, int ch,size_t n);
int a[5];
memset(a, 511, sizeof(int)*5);// 511的二进制码后八位都为1,与-1相同
//{-1,-1,-1,-1,-1}

​memset​​​赋值采用输入的第四个字节,因为511二进制码 (00000000 00000000 00000001 11111111),最后一个字节与1的二进制码 (11111111 11111111 11111111 11111111),四个字节都相同,所以可以赋值。
前面提过,如果我们想初始化的值高位字节和低位字节相同(0和-1的每个字节都相同),也可以用​​​memset​​赋值。

fill

fill() 和 fill_n() 算法提供了一种为元素序列填入给定值的简单方式,可以用于多种序列,这里列出初始化数组的样例,感兴趣再做探索

int a[5];//这里a按全局变量定义,则都初始化为0
fill(a,a+2,1); // {1,1,0,0,0}

参考
​memset​C/C++数组初始化的一些误区
C++ fill和fill_n函数用法详解


举报

相关推荐

0 条评论