C++: 数组初始化

技术博客 (141) 2023-09-16 10:32:10

文章目录

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

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

int a[5]; //int默认0
int b[5] = { 
   12}; // {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函数用法详解

THE END

发表回复