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];

转载于:https://www.cnblogs.com/zwk-coder/articles/10987389.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值