首页 > 代码库 > C/C++ 数组的初始化

C/C++ 数组的初始化

C/C++数组的初始化因为方法太多,而且规则也比较混乱,所以在使用的时候经常出现数组初始化就不对的问题,这里把关于数组的初始化存在需要谨慎的问题进行一个简单的总结,有遗漏的望同学们一起指出补充。

一维数组

静态分配

1. 

int a[3] = {0, 1, 2}; // 正确
int a[3]={0,1,2,3}; //错误,初始化值个数大于数组大小
int a[3]={0,,2}; //错误,初始化值被跳过
int a[3]={0,1,}; //错误,初始化值被跳过(即使是最后一个元素,添加逗号也被认为是跳过)
int a[3]={0}; //正确,省略初始化最后一个元素,最后省略的元素初始化为0
int a[n]={0}; // 注意n必须为const类型,否则错误

2. 

char a[10] = "abceddddd";   //用一个字符串常量去初始化字符数组.注意: a[10]='\0'

3. 

char a[10] = "abcd";    //当字符常量长度不够时 数组的其他元素初始化为  '\0'

4. 

int v1[] ={1,2,3,4};
char v2[]={'a','b','c',0}; //当数组定义时没有指定大小,当初始化采用列表初始化了,那么数组的大小由初始化时列表元素个数决定。所以v1和v2分别为 int[4] 和char[4]类型。

动态分配

1. 

int* a = new int[10];   //new 分配了一个大小为10的未初始化的int数组,并返回指向该数组第一个元素的指针,此指针初始化了指针a
a = {4, -3, 5, -2, -1, 2, 6, -2, 3}; // 错误,注意这种用大括号的数组赋值只能用在声明时,此处已经不是声明,所以出错。

那么此时对a的赋值只能通过

1) int b[10]={...}; a = b;
2) a[i]=2;
3) memset(a, 1, sizeof(a));

2.

int *a = new int[10] ();  // 每个元素初始化为0,括号内不能写其他值,只能初始化为0

3. 

int* a = new int[n];// 注意n必须为const

4. 类中的初始化

class Something {
private:

int myArray[10];

public:

Something()
: myArray { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 } //使用大括号初始化必须在初始化列表中进行初始化,在构造函数内部初始化需使用memset之类的方法。
{
}

int ShowThingy(int what) {
    return myArray[what];
}
}

二维数组

静态分配

静态分配和一维的区别不大
1.
int value[9][9]; // value[i][j]的值不定,没有初始化
2. 
int value[9][9] = {{1,1},{2}}; //value[0][0,1]和value[1][0]的值初始化,其他初始化为0

动态分配

1.
int (*value)[n] = new int[m][n];
delete []value; // n必须为常量,调用直观。未初始化
2.
int** value = http://www.mamicode.com/new int* [m];>

C/C++ 数组的初始化