第4章 复合类型
4.1 数组
声明数组时应注意以下三点:
- 存储在每个元素中值的类型;
- 数组名;
- 数组中的元素数;
例如:short months[12];
表示创建了一个名为months的数组,包含12个short类型的元素。
通用格式:typeName arrayName[arraySize];
数组从0开始编号,months[0]是 short months的第一个元素。
数组的初始话规则:
- 只有在定义数组时可以初始化,不过可以使用下标修改数组某一元素的值。
- 若只对数组的一部分初始化,其他值默认为0;
- 如果初始化时方括号内为空,则C++编译器会计算元素个数。
4.2 字符串
C-风格字符串必须以空字符结尾。类如:char dog[5] = { 'b', 'e', 'a', 'u','\0' } ;
且必须加上单引号。
另一种创建字符串的方法:
char bird[10] = "Mr.Cheeps"; //空字符自动加在数组的后面,bird是一个数组,里面包含了字符串。
char fish[] = "Bubbles"; //编译器自动确定字符串的长度,并且最后一位是空字符
C++对字符串的长度没有限制。
在确定字符产所需的最短数组时,记得算上空字符。
字符串常量“s"不能与字符常量’s’互换,例如:char shirt_size = 's';
是将s的ascii编码83赋给shirt_size;而char shirt_size = "s";
是将{'s','\0'};
赋给字符串shirt_size。
4.2.2 在数组中使用字符串
将字符串存储到数组中的2种方法:①将数组初始化为字符串常量;②有键盘或文件输入。
例如:
char name1[15];
cin >> name1; //由键盘读入
char name2[15] = "C++0wboy"; //将数组初始化为字符串常量
strlen()函数只计算可见字符,不包括空字符;
4.2.4 每次读取一行字符串输入
istream 种的面向行的类成员函数:getline(),get().
- 面向行的输入 :getline()
通过回车或换行符确定结束,也可以使用cin.getline(name,Arsize);
其中name是存储输入行的数组名称,Arsize是读取的字符数,且最后一位为空字符。 - 面向行的输入:get()
不带任何参数的cin.get()可以调用读取下一个字符。
4.2.5 混合输入字符串和数字
有问题加cin.get()
4.3 string类简介
在main 函数前加#include <string>
string 类可以根据程序自动调整大小,如string str1;
是长度为0的string类;cin >> str1
时,str1的长度跟随键盘输入。
4.3.1 赋值、拼接和附加
- 赋值:
string str1 = 'jaguar';
- 拼接:
str3 = str1 + str2;
- 附加:
str1 += str2
将str2附加在str1后,成为新的str1 - 需要输入整行字符串时,可以使用
getline(cin,string)
4.3.2 string类的其他操作
cstring提供的string计算函数:strcpy()将字符串复制到字符数组中,strcat()将字符串附加到字符数组末尾;
strcpy(charr1,charr2); //将charr2复制到charr2中
strcat(charr1,charr2); //将charr2附加到charr1后
4.4 结构简介
结构可以存储多种类型的数据。例如:
struct inflatable
{
char name[];
float volume;
double price;
};
相当于创建了一个新类inflatable,其中包含3个成员。
在函数外面声明的结构可以被所有函数使用,在函数内部声明的结构只能被该函数调用。
给结构内部的量赋值:
struct_name name =
{
"****" , //为字符串时
89, //为数字时
}
可以同时创建结构和定义变量,例如:
struct perks
{
int key_number;
char cat[12];
} mr_smith,ms_jones;
4.4.4 结构数组
可以创建元素为结构的数组,数组的每一个元素都是一个结构,类如,inflatable为已经被定义好的结构,则
inflatable gifts[100];
gifts为元素为inflatable结构的数组。
4.5 共用体
共用体可以存储不同的数据,但只能存储int,long 或double中的一个。(没看懂)
4.6 枚举(enum)
例如:
enum spectrum {red,orange,yellow,green,blue,violet,indigo,ultraviolet};
即spectrum为一个枚举类型;
spectrum band; //创建一个spectrum的变量
对于枚举,只定义了赋值操作,没有定义算数运算操作,即+,-,*,/对枚举操作无效。
枚举量是整形,可以提升为int类型,但int类型不能自动转换为枚举类型。
枚举范围的查找:
找到大于枚举量的最大值的最小2的幂,再减去1。如枚举量最大为101,则这个枚举的范围上限为128-1=127;下限与上限类似,如枚举量最小为-6,则下限为-8+1=-7。
4.7 指针和自由存储空间
指针是一个变量,其存储的是值的地址,而不是值本身。
在变量前加(&)操作符即可找到地址。如home是变量,&home是地址。
指针名表示的是地址,*操作符为间接值或解除引用操作符,在指针前加 *可以找到该地址存储的值。
4.7.1 声明和初始化指针
格式:
int* pt; //声明指针
int* pt1;* pt2; //同时声明2个指针
pt是指向int类型的指针,*pt是int类型的数值。
4.7.4 使用new来分配内存
类如:
int* pn = new int;
new int 告诉程序,找到适合存储int的内存,new操作符根据字节来确定需要多少字节的内存,然后找到这样的内存,并返回其地址。
4.7.5 通过delete释放内存
需要内存时,通过new来请求,用过之后,可以使用delete放回内存池。例如:
int *pt= new int; //定位内存
...
delete pt; //释放内存
new与delete要配对使用。
4.7.6 使用new来创建动态数组
静态联编(static binding):在编译时给数组分配内存的方式。
动态联编(dynamic binding):在运行时根据需要分配内存的方式。
- new 创建动态数组:
int * psome = new int[10];
new返回第一个元素的地址,该地址赋予psome,程序结束时,应使用delete释放内存。
delete [] psome;
如果使用new时使用了[],则在delete时也要用[]。
- 动态数组的使用
将指针看成数组使用即可,例如psome[0]是动态数组第一个值,psome[2]是动态数组第二个值。
释放内存时,要将指针指到原来的地址才能使用delete [ ] 释放。
指针、数组和指针算数
指针增加1后,其增加的量等于它指向的类型的字节数。