C++学习 五、数组与字符串 (1)数组
前言
- 前言
- 数组
- 数组声明
- 数组访问
- 索引越界问题
- 数组初始化
- 禁止数组赋值
- C++11禁止缩窄转换(列表初始化)
本篇继续C++学习,指针前置章节,数组和字符串。
数组 数组声明// 数组类型 数组名 [元素数]
int arrayA[6]; // 元素数必须是常量
上面的数组声明会开辟一块储存6个int类型变量的内存空间。
数组访问// 元素索引从0开始
arrayA[0] = 0;
arrayA[5] = 5;
索引从0开始,到数组长度-1为止。
索引越界问题注意:编译器并不检查数组索引是否有效,比如代码arrayA[8] = 8;
索引越界,虽然可以过编译,但运行就报segment fault!
在声明数组的同时给元素赋值,就是数组初始化,数组的列表初始化:
int arrayB[5] = {0, 1, 2, 3, 4};
C++11中可以省略等号:
int arrayC[5] {0, 1, 2, 3, 4};
默认初始化,编译器自动把数组元素设为0:
int arrayD[5] {};
// arrayD[4] = 0;
部分初始化,编译器把其它数组元素设为0:
int arrayE[5] {0, 1, 2};
// arrayE[4] = 0;
通过初始化确定数组长度:
int arrayF[] {0, 1, 2, 3};
// arrayF len is 4
禁止数组赋值
注意:只有在声明数组的同时才能初始化数组。
int arrayG[5];
// arrayG[5] = {0, 1, 2, 3, 4}; // error!
不能把一个数组直接赋值给另一个数组。
int arrayH[5];
// arrayH = arrayB; // error!
C++11禁止缩窄转换(列表初始化)
首先举一个缩窄转换的例子:
short aaa = 11111111;
左边是short变量,右值是int常量,编译器报overflow in implicit constant conversion
,也就是说右值超过了short变量的范围,导致转换结果不确定。这就是缩窄转换。
C++11在列表初始化时禁止缩窄转换,常见的缩窄转换有:浮点型转整形,double转float,超过数值范围的长整型转短整型(例如uint8_t aa = 1111;
),超过范围的整型转char等。
不过,在低于C++11的版本中,列表初始化可以缩窄转换。