逆向基础 C++ Primer Plus 第四章 复合类型(2)

逆向基础 C++ Primer Plus 第四章 复合类型(2)

知识点梳理

上一节主要学习了C++复合类型中的数组、字符串和结构,本节将针对C++中的共用体、枚举(设置枚举量的值、取值范围)、指针(声明和初始化、具体使用)、使用new和delete管理动态内存、创建动态数组和结构、三种存储类型(自动存储、静态存储和动态存储)以及vector和array类展开学习。

重点知识回顾

共用体

共用体(union)是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型,共用体一个简单的声明例子如下:

union one
{
    int int_val;
    long long_val;
    double double_val;
};
枚举

C++的enum工具提供了可以替代const的创建符号常量的方式,其使用方法与结构类似,如下其中spectrum被称为枚举,其中red、organge、yellow等作为符号常量,它们对应整数值0~7,这些常量就是枚举量,对于枚举只定义了赋值运算符,没有定义算术运算,枚举的取值范围的定义如下:取值范围的上限是找到大于枚举量最大值的最小的2的幂,并将它减去1,取值范围的下限是如果枚举量的最小值不小于0,则下限为0,否则与寻找上限的方式相同,但加上负号。

enum spectrum
{
    red,orange,yellow,green,blue,violet,indigo,ultraviolet
};
指针

指针是一个变量,但其存储的是值的地址,而不是值本身,要声明指向特定类型的指针,其格式为:TypeName * pointerName,指针的赋值可以选用&加上变量名的方式,也可使用new运算符返回未命名的内存地址,对指针解除引用意味着获得指针指向的值,使用(*)加指针名即可实现,例如

int * pt = new int; *pt = 5;

其中pt是指向int的指针,而*pt是指向的值,C++允许将指针和整数相加,加1的结果等于原来的地址值加上指向的对象占用的总字节数。

new和delete管理动态内存

C++中创建和销毁动态内存的方式如下,可以使用new来创建,使用完内存后需要用delete运算符来将其归还给内存池,使用delete时,后面要加上指向内存块的指针(ps),归还和释放的内存可供程序的其他部分使用。

int * ps = new int;
...
delete ps;
new和delete管理动态数组

类似上面管理动态内存,C++也可以使用new来创建动态数组,如下创建一个包含10个int元素的数组,new运算返回第一个元素的地址,该地址被赋值给指针psome,同时不要使用delete来释放不是new分配的内存,不要使用delete释放同一个内存块两次,如果使用new []为数组分配内存,则应使用delete []来释放,对空指针应用delete是安全的。

int * psome = new int[10];
delete [] psome;

C++和C内部都使用指针来处理数组,因此数组和指针基本等价,可以使用指针指向数组第一个元素,而数组名也是数组第一个元素的地址。

new和delete管理动态结构

程序在运行时创建数组优于编译时创建数组,结构也一样,如下动态创建结构,ps是指向结构的指针,而*ps就是被指向的值即结构本身。

struct inflatable
{
    char name[10];
    float volume;
    double price;
};
inflatable * ps = new inflatable;

因此(*ps).price是该结构的price成员。

三种存储类型

自动存储,在函数内部定义的常规变量使用自动存储空间,被称为自动变量,其随函数被调用时产生,该函数结束时消亡,自动变量通常存储在栈中,其遵循后进先出的规则。
静态存储,是整个程序执行期间都存在的存储方式,一般在函数外面定义它,或者声明时加上static,其变量存在于程序的整个生命周期。
动态存储,new和delete运算符可以灵活管理内存池,这在C++中被称为自由存储空间或者堆。

vector和array类

模板类vector和array是数组的替代品,模板类vector也是一种动态数组,如下,创建一个名为vt的vector对象,它可存储n_elem个类型为typeName的元素,声明一个名为arr的array对象,它包含n_elem个类型为typename的元素,与创建vector对象不同的是,n_elem不能是变量,array对象可以赋值给另一个array对象,但数组不可以。

vector<typeName> vt(n_elem);
array<typeName,n_elem> arr;

转载声明:如果希望转载请于公众号(安全fun)后台联系,或者邮件至anquanfun@163.com,转载时请保留原作者及出处信息,转载文章禁止声明原创,更多合作也可邮件至anquanfun@163.com。

免责声明:本公众号所涉及内容仅供安全研究与教学使用,如出现其他风险,后果自负。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值