- 存储类型统一的多组数据值
- 声明数组的通用格式
typeName arrayName[arraySize];
- 数组是复合类型,是因为数组是由其他类型来创建的,数组并不是一个数据类型,如果一点要说,它算是一个数据结构
- 调用元素方式
a[i]; // 使用[]号来调用数组元素 int b[3] = {1, 2, 3}; // 使用大括号的方式进行初始化
- 如果变量在初始化时没有声明,则该变量中存储的值是以前留驻在该内存中的值
- C++数组初始化规则:
- 只有在定义的时候才能对数组进行初始化,之后就不能了
- 初始化时提供给数组的值可以少于数组元素数目
- 如果只初始化一部分数组元素,则剩下未初始化的数组元素会默认初始化为0
- 不能将一个数组赋值给另一个数组
- 可以使用下标单独对数组元素进行赋值
- 声明数组时[]内可以不填,编译器会自动计算花括号内的元素个数
- sizeof 数组名是合法代码,返回数组的大小,以字节为单位(没有将数组名用sizeof括号括起来)
- C++中大括号的初始化方式是一种通用的初始化方式,适用于所有类型的初始化
- C++列表初始化新增功能:
- 初始化数组时,可以省略等号例如: double earns[3] {1, 2, 3};
- 大括号内可以不包含任何元素,这样会默认初始化为零
- 列表初始化禁止窄缩转换(高级数据类型降级为低级数据类型)
- 以空字符( )结尾
- 数组字符串的初始化方法:
char dog[8] = {'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b'}; // 不是字符数组 char dog[8] = {'b', 'b', 'b', 'b', 'b', 'b', 'b', ' '}; //是字符数组,结尾处是表示停止录入的空字符 char bird[11] = "Mr.cheeps"; //是字符串,这种写法被称为字符串常量,不需要显示写出空字符 char sheep[] = "Mr.sheep"; //字符串的另一种声明和初始化 - 通过键盘输入时,C++会自动在结尾加上空字符
- 在给出字符数组的存储长度时,长度=字符数量+空字符(长度为1)
- 字符串使用双引号,单个字符使用单引号
- 单个字符的字符串"S"实际上表示的是字符串所在的内存地址
- C++允许两个并列的字符串自动拼接
cout << "i must eat a " "burger"; // 合法代码
- cstring库
- cin使用空白(空格、制表符、换行符)来确定字符串的结束位置,所以没办法输入带空格的字符
- 该函数读取一整行,通过回车键入换行符来确定输入结尾,会将换行符一并读取到字符串中
- 调用方法:
cin.getline(); // 读取一行 cin.getline(name, 20); //第一个是数组名称,第二个是读取字符+空字符的和,表示将读取的字符串存入字符数组中
- 该函数读取一整行,和getline()一样的用法,但不会将换行符纳入字符串中,而是留在输入流中,举例如下:
cin.get(); //读取一个字符 cin.get(name, "hello"); // 读入字符串hello,将字符串末尾的换行符保留在输入流中 cin.get(name, "world"); // 本来应该读取world,但由于上一行代码中的换行符仍在输入流,因此该行代码会发生错误 // 正确做法 cin.get(name, "hello"); cin.get(); // 抵消换行符 cin.get(name, "world");
- 由于cin.get()和cin.getline()调用后会返回一个cin对象,因此可以进行拼接操作
cin.get(name, "hello").get() cin.getline(name, "hello").getline(name, "world");
总之,getline使用起来简单,但个体检查错误更简单
4.2.4.3 空行和其他问题- 当get读取空行后,将设置失效位,意味着接下来的输入将被阻断,可以使用cin.clear()来恢复输入
- 如果输入行包含的字符数比制定的多,则get和getline将余下的字符留在输入队列中;且getline会设置失效位,关闭后面的输入
- 混合输入数字和字符时,cin也会只读取数字(int,float等)部分,将换行符留在输入流中,导致下一行读入失败,正确解决应该是:
int year; char adress[80]; cin >> year; cin.get(); // 将year保留的换行符消除 (cin.get()).get(); // 也可以在cin后拼接 cin.getline(adress, "in my world");
- C++98新增了string类来处理字符串,而不是像之前那样只能用字符数组来存储字符串
- 要使用string类需要在头文件中包含该库:#include
,且string类位于std空间中 - 可以使用数组表示法来访问存储在string对象中的字符
- string类字符串相比数组字符串更方便,也更安全



