逆向基础 C++ Primer Plus 第四章 复合类型(1)
知识点梳理
上一篇文章主要学习了C++的基本数据类型:整型和浮点型,今天就在此基础上学习复合类型:数组、字符串和结构。数组可以在一个数据对象中存储多个同种类型的值,通过使用索引或下标来访问每一个数组元素。结构可以将多个不同类型的值存储在同一个数据对象中,可以使用成员关系运算符(.)来访问其中的成员。
重点知识回顾
数组类型
数组之所以被称为复合类型,是因为它是使用其他类型来创建的,有些类似C语言中的派生类型,数组的声明中必须包含:类型、数组名和元素个数,数组的初始化只有在定义数组时才能使用,此后就不可以初始化了,当然也不能将一个数组赋值给另一个数组,可以使用下标分别给数组中的元素赋值,初始化时提供的值可以少于数组的元素个数,但一定不能多于数组的元素个数,其他没有赋值的部分编译器会自动设置为0,因此将数组中所有的元素初始化为0非常简单,只要显示地将第一个元素初始化为0即可。
long totals[100] = {0};
字符串类型
字符串是存储在内存的连续字节中的一系列字符,C++处理字符串的方式由两种:C风格字符串的方法和基于string类库的方法。C风格字符串可以理解为char类型的数组,但其于一般char类型数组的不同之处在于数组中最后一个元素为空,即以空字符('\0')结尾,其ASCII码为0,用来标记字符串的结尾。C++中字符常量使用单引号标记,字符串常量使用双引号标记,字符常量(如'S')是字符串编码的简写表示,'S'对应的ASCII为83,而字符串常量(如"S")表示的是两个字符(字符S和\0)组成的字符串,且"S"实际上表示的是字符串所在的内存地址。
字符串的输入函数:getline()和get(),getline()函数读取整行,其使用通过回车键输入的换行符来确定输入结尾,但不保存换行符,当在存储字符串时,getline()用空字符来替换换行符,而get()并不再读取并丢弃换行符,而是将其留在输入队列中。如下代码中如果输入年份的整型信息之后,将回车键生成的换行符留在了输入队列中,后面的cin.getline()看到换行符后,将认为是一个空行,并将一个空字符串赋值给address数组,解决的方法就是在cin >> year()后面加一行cin.get()在读取地址之前先读取并丢弃换行符。
#include <iostream>
int main()
{
using namespace std;
cout << "What year was your house built?\n";
int year;
cin >> year;
cout << "What is its street address?\n";
char address[80];
cin.getline(address,80);
cout << "Year built: " << year << endl;
cout << "Address: " << address << endl;
cout << "Done!\n";
return 0;
}
ISO/ANSI C++98标准通过添加string类扩展了C++库,即可以用string类型的变量来存储字符串,与使用char数组表示字符串相比,使用string对象更加方便、安全,可以便捷的进行初始化、赋值、拼接、复制等操作。
结构类型
C++中的结构是一个灵活的数据格式,同一个结构可以存储多种类型的数据,但所有元素的类型必须相同,创建结构包含两步:定义结构描述(即声明能够存储在结构中的各种数据类型)和描述创建结构变量(结构数据对象),如下为定义结构inflatable的描述:
struct inflatable
{
char name[20];
float volume;
double price;
};
其中inflatable是结构的名称,其包含char数组、float类型的变量volume和double类型变量price,定义结构后,就可以创建这种类型的变量了:
inflatable hat;
在调用结构中的具体某个变量时,利用类似hat.name[1]的格式即可,结构可以作为参数传递给函数,也可以让函数返回一个结构,同时结构支持赋值运算,即将一个结构赋值给另一个同类型的结构,即使结构中的成员包含数组,也支持赋值运算。
转载声明:如果希望转载请于公众号(安全fun)后台联系,或者邮件至anquanfun@163.com,转载时请保留原作者及出处信息,转载文章禁止声明原创,更多合作也可邮件至anquanfun@163.com。
免责声明:本公众号所涉及内容仅供安全研究与教学使用,如出现其他风险,后果自负。