数组初始化
参考链接:C/C++数组初始化的一些误区
1. 很容易出现的误区:
int a[5] = { 0 }; // 全部初始化为0
int a[5] = { 1 }; // 我想全部初始化为1
上面初始化 1 的作法将会产生错误,而且你很可能想当然这么以为,从而导致耗费时间。如果真正理解数据初始化的原则,就不会犯错了。数组初始化列表中的元素个数小于指定的数组长度时,不足的元素补以默认值。
对于基本类型int来说,当然就是补int()即0了。再看一下非基本类型的数组:
string a[5] = { "foo" };
等价于
string a[5] = { "foo", "", "", "", "" };
即后面4个元素调用了string的默认构造函数进行的初始化,而第一个则调用的string::string(const char*)进行的初始化。
2. memset 的误区
注意:memset的使用有个大问题,就是它只对char类型的数组管用,因为memset的内部实现是以字节为单位进行赋值的,如果对int 类型(4个字节),数组内存连续,结果会如下
// 成功 char a[10]; memset(a, 1, 10); // 将每个元素设置为1 // 异常值 int a[10]; int a[10]; memset(a, 1, 10*sizeof(int)); for(int i = 0; i < 10; i++) cout << a[i] << endl; // 都被赋值为16843009,十六进制表示为0x01010101
指针和数组
参考链接:
6.14 — Pointers to pointers and dynamic multidimensional arrays
1. 一维数组
- 静态 int array[100]; 定义了数组array,并未对数组进行初始化
- 静态 int array[100] = {1,2}; 定义并初始化了数组array
- 动态 int* array = new int[100]; delete []array; 分配了长度为100的数组array
- 动态 int* array = new int[100]{1,2}; delete []array; 为长度为100的数组array初始化前两个元素
2. 二维数组
- 静态 int array[10][10]; 定义了数组,并未初始化
- 静态 int array[10][10] = { {1,1} , {2,2} }; 数组初始化了array[0][0,1]及array[1][0,1]
- 动态 int (*array)[n] = new int[m][n]; delete []array; // in c++11: auto array = new int[m][n]
- 动态 int** array = new int*[m]; for(i) array[i] = new int[n]; for(i) delete []array[i]; delete []array; 多次析构
- 动态 int* array = new int[m*n]; delete []array; 数组按行存储
- 注意这种方式不可用: int **array = new int[m][n];