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

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值