C++ primer Plus学习笔记(第四章)——复合类型

it2023-10-02  94

第4章 复合类型

4.1 数组4.2 字符串4.2.2 在数组中使用字符串4.2.4 每次读取一行字符串输入4.2.5 混合输入字符串和数字 4.3 string类简介4.3.1 赋值、拼接和附加4.3.2 string类的其他操作 4.4 结构简介4.4.4 结构数组 4.5 共用体4.6 枚举(enum)4.7 指针和自由存储空间4.7.1 声明和初始化指针4.7.4 使用new来分配内存4.7.5 通过delete释放内存4.7.6 使用new来创建动态数组 指针、数组和指针算数

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后,其增加的量等于它指向的类型的字节数。

最新回复(0)