数组是底层数据类型,存放在栈中,其内存的分配和释放完全由系统自动完成.
通过如下代码初始化一个全局变量
数组,初始化的规则就是不足数组大小的按默认值补位
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
按字节对内存块进行初始化,所以不能用它将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_n() 算法提供了一种为元素序列填入给定值的简单方式,可以用于多种序列,这里列出初始化数组的样例,感兴趣再做探索
int a[5];//这里a按全局变量定义,则都初始化为0
fill(a,a+2,1); // {1,1,0,0,0}
参考
memset
C/C++数组初始化的一些误区
C++ fill和fill_n函数用法详解
上一篇
下一篇