C++数组初始化与遍历
现象
加括号
auto func = [](int n){ int *B=new int[n](); // 这里加了括号 for(int i=0;i<n;i++){ std::cout<<B[i]<<" "; } std::cout<<std::endl; delete[] B; }; func(5);
Linux下/Mac下输出结果一致:
0 0 0 0 0
不加括号
auto func = [](int n) { int *B = new int[n]; // 这里没加括号 for (int i = 0; i < n; i++) { std::cout << B[i] << " "; } std::cout << std::endl; delete[] B; }; func(5);
在Linux下输出结果:
0 0 0 0 0
在Mac下输出结果:
-1220541584 32750 2 1 -1220541600
想指定初始化的值
auto func = [](int n){ int *B=new int[n](1); // error: 不能为数组指定新的初始值设定项 for(int i=0;i<n;i++){ std::cout<<B[i]<<" "; } delete[] B; };
想通过迭代的方式访问new数组
auto func = [](int n) { int *B = new int[n](); for (int i:B) { // error: 此基于范围的“for”语句需要适合的 "begin" 函数,但未找到 std::cout << i<< " "; } delete[] B; };
通过迭代的方式访问普通数组
auto func = []() { int B[5] = { 1, 2, 3}; for (int &i : B) { std::cout << i << " "; i = 9; } std::cout << std::endl; for (int i : B) { std::cout << i << " "; } std::cout << std::endl; }; func();
输出结果:
1 2 3 0 0 9 9 9 9 9
不指定初始化列表
auto func = []() { int B[5]; // 这里没指定初始化列表 for (int &i : B) { std::cout << i << " "; i = 9; } std::cout << std::endl; for (int i : B) { std::cout << i << " "; } std::cout << std::endl; }; func();
输出结果:
1 14 0 0 0 9 9 9 9 9
指定初始化列表长度小于数组长度
auto func = []() { int B[10] = { 1}; /*这样也可以编译通过,效果一样 int B[10] = { 1, }; */ for (int &i : B) { std::cout << i << " "; i = 9; } std::cout << std::endl; for (int i : B) { std::cout << i << " "; } std::cout << std::endl; }; func();
输出结果:
1 0 0 0 0 0 0 0 0 0 9 9 9 9 9 9 9 9 9 9
指定初始化列表长度大于数组长度
int B[2] = { 1, 2, 3, 4}; // error: 初始值设定项值太多
结论
在new数组的时候
加()一定初始化为0,而且里面不能指定初始化的值,只能用无参构造函数。 不加()不一定初始化为0,结果因编译器而异。 不能通过:迭代的方式访问new数组,但是可以迭代访问普通数组。
创建普通数组的时候
不指定初始化列表,则默认初始化不确定。 指定初始化列表中数目少于数组长度,只给前面的赋值,后面的填充为0,初始化列表数目不得大于数组长度。
上一篇:
MySQL 更新执行流程
下一篇:
浙政钉2.0免登