C++ 数组初始化与指针


数组初始化

参考链接: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

指针和数组

参考链接:

C++中数组定义及初始化

6.14 — Pointers to pointers and dynamic multidimensional arrays

1. 一维数组

  1. 静态 int array[100];   定义了数组array,并未对数组进行初始化
  2. 静态 int array[100] = {1,2};  定义并初始化了数组array
  3. 动态 int* array = new int[100];  delete []array;  分配了长度为100的数组array 
  4. 动态 int* array = new int[100]{1,2};  delete []array; 为长度为100的数组array初始化前两个元素

2. 二维数组

  1. 静态 int array[10][10];  定义了数组,并未初始化
  2. 静态 int array[10][10] = { {1,1} , {2,2} };  数组初始化了array[0][0,1]及array[1][0,1]
  3. 动态 int (*array)[n] = new int[m][n]; delete []array;  // in c++11: auto array = new int[m][n]
  4. 动态 int** array = new int*[m]; for(i) array[i] = new int[n];  for(i) delete []array[i]; delete []array;    多次析构
  5. 动态 int* array = new int[m*n];  delete []array;      数组按行存储
  6. 注意这种方式不可用: int **array = new int[m][n];

免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2020 CODEPRJ.COM