数组(array)是一种数据格式,能够存储多个同类型的值。每个值都存储在一个独立的数组元素中,计算机在内存中依次存储数组的各个元素。
数组声明的三个特点:
存储在每个元素中的值的类型
数组名
数组中的元素数
C++中可以通过修改简单变量的声明,添加中括号(其中包含元素数目)来完成数组声明。
例如:
short days[24]; // 一天有24个小时 1.2 数组的声明声明数组的的一般语法格式为:
// 数组类型 数组名字[数组的大小] int score[4]; // 四个人的分数,整型数组数组的大小是指定元素的数目,必须是整型常数或const值,也可以是常量表达式(8*sizeof(int))
1.3 复合类型的数组可以使用其他的类型来创建(C语言使用术语:派生类型)
数组的用途,可以单独访问数组元素,方法是:使用下标或索引对元素进行编号。从0开始编号。
编译器不会检查下标是否有效,所以要注意下标合法性,避免程序异常问题。
C++使用索引的方括号表示法来指定数组元素。
1.只有在定义数组时才能初始化,此后不能使用,也不能将一个数值赋给另一个数组。
2.初始化数组时,提供的值少于数组的元素数目。
3.如果只对数组的一部分进行初始化,则编译器把其他元素设置为0。
4.如果初始化为{1}而不是{0},则第一个元素被设置为1,其他元素都被设置为0.
5.如果初始化数组方括号内([])为空,C++编译器将计算元素个数。 例如:short things[] = {1,3,5,7};
1.5 C++11数组初始化方法C++11将使用大括号的初始化(列表初始化)作为一种通用的初始化方式,可用于所有类型。
在C++中列表初始化就增加了一些功能:
初始化数组时,可省略等号(=)
double earnings[4] {1.2e4,1.6e4,1.1e4,1.7e4};可不在大括号内包含任何东西,这会将所元素都设置为零。
unsigned int const[10] = {}; float balances[100] {};列表初始化禁止缩窄转换。
long num[] = {25,92,3.0}; // 浮点数转换为整型是缩窄操作例子:
#include<iostream> using namespace std; int main() { // 创建一个名字为yams的数组,包含了3个元素,编号是0~2. int yams[3]; yams[0] = 7; yams[1] = 8; yams[2] = 6; // 使用逗号分隔的值列表(初始化列表),然后用花括号括起来即可。 // 列表中的空格是可选的,如果没有初始化函数中定义的数组,其元素值也是不确定。 int yamcosts[3] = {1,2,3}; cout<<"yams 数组是:"<<yams[0]+yams[1]+yams[2]<<endl; cout<<"yams[1] = "<<yams[1]<<endl; int total = yams[0] * yamcosts[0] + yams[1] * yamcosts[1]; total = total + yams[2] * yamcosts[2]; cout<<"total yam = "<<total<<endl; // sizeof运算符返回类型或数据对象的长度(单位为字节)。 // 如果将sizeof运算符用于数组名,得到的是整个数组的字节数。 // 如果sizeof用于数组元素,得到的是元素的长度(单位为字节)。 cout<<"\n yams数组的大小 = "<<sizeof(yams)<<" Bytes.\n"; cout<<"一个元素的大小 = "<<sizeof(yams[0])<<" Bytes.\n"; return 0; } 2. 字符串字符串是存储在内存的连续字节中的一系列字符。
2.1 C++处理字符串的两种方式:C语言,常常被称为C-风格字符串(C-style String)
以空字符(\0,ASCII码对应为0)来标记字符串的结尾。
基于String类库的方法
存储在连续字节中的一系列字符意味着可以将字符串存储在char数组中。其中每个字符都位于自己的数组元素中。
使用引号括起来的字符串,这种字符串叫 字符串常量(String constant) 或 字符串字面值(string literal) 。
字符串常量(使用双引号)不能与字符常量(使用单引号)互换。
例如:
char name[] = "Soler";字符串结尾的空字符,不用直接显式包括,机器在键盘输入,将字符串读入到char类型中,会在结尾自动加上空字符。
⚠️注意:确定了存储字符串所需的最短数组时,不要忘记把结尾的空字符包括在内。
2.2 字符串常量的拼接方法:直接两个引号括起来的字符串合并为一个。任何两个由空白(空格、制表符和换行符)分隔的字符串常量都将自动拼接成一个。
cout<<"My name is " "Soler HO.\n" 2.3 在数组中使用字符串将字符串存储到数组的常用方法:
将数组初始化为字符串常量
将键盘或文件输入读入到数组中。
#include <iostream> #include <cstring> /*提供strlen()函数*/ using namespace std; const int Size = 15; int main() { char name1[Size]; char name2[Size] = "C++owboy"; // 字符串的拼接 cout<<"Howdy!I'm "<< name2; cout<<"!,What's your name?\n"; cin>>name1; cout<<"Well, "<<name1<<",your name has : "<<strlen(name1)<<" letters and is stored!\n" ; cout<<"In an array of "<<sizeof(name1)<<" Bytes\n"; cout<<"Your iniatial is "<<name1[0]<<".\n"; // name1数组中的第一个元素 name2[3] = '\0'; cout<<"Here are the first 3 characters of my name:"<<name2<<endl; return 0; }strlen() 函数 和 sizeof()运算符的区别
strlen()函数
返回的是存储在数组中的字符串的长度,而~~不是数组本身的长度~~。
strlen()只计算可见的字符,而不把空字符计算在内。
sizeof() 运算符
指出变量或数据类型的字节大小。
可用于获取类、结构、共用体和其他用户自定义数据类型的大小。
2.4 读取一行字符串的输入解决没有逐行读取输入的缺陷。
istream中提供了面向行的类成员函数:getline() 和 get() 函数
2.4.1 面向行的输入:getline()使用通过回车键输入的换行符来确定输入结尾。使用 cin.getline() 。
函数有两个参数:
第一个参数:存储输入行的数组名称。
第二个参数:要读取的字符数(注意包含结尾的空字符(\0))。
格式:
cin.getline(name,ArSize); 2.4.2 面向行的输入:get()与getline() 函数类似,接受的参数相同,解释参数的方式也相同,并读到行尾。
区别:get() 读取并丢弃换行符,将其留在输入队列中。
格式:
cin.get(name,ArSize);get() 将两个类成员函数拼接(合并):
cin.get(name,ArSize).get();⚠️注意:get() 函数读取空行后设置会失效,输入会被阻断。可用如下恢复:
cin.clear();混合输入数字和面向行的字符串会导致的问题:无法输入地址。
解决方法:直接使用get()进行读取之前丢弃换行符。
3. string类string类位于名称空间std中,所以需要提供using指令或者是直接使用std::string进行引用。
要使用string类,必须在程序中包含头文件string中。
string类定义隐藏了字符串的数组性质。
3.1 string对象的方式使用string对象的方式和使用字符数组相同。
C-风格字符串来初始化string对象中。
使用cin来将键盘输入存储到string对象中。
使用cout来显示string对象。
可以使用数组表示方法来访问存储在string1对象中的字符。