如果第一个变量未初始化,默认为0。后面没有被初始化的枚举量的值将比其前面的枚举量大1。也可以创建多个值相同的枚举量。
enum {zero,null = 0,numero_one,one = 1}; 6.2 枚举的取值范围每个枚举都有取值范围的上限,通过强制类型转换,可以将取值范围中的任何整数值赋给枚举常量,即使这个值不是枚举值。
6.3 取值范围的定义找出上限,需要知道枚举量的最大值。
找到大于最大值的,最小的2的幂,减去1,得到就是取值范围的上限。
计算下限,知道枚举量的最小值。
如果不小于0,则取值范围的下限为0,否则,采用寻找上限方式相同的方式,但是要加上负号。
对于选择使用多少空间来存储枚举由编译器决定。
7. 指针和自由空间对于地址显示结果是十六进制表示法,因为都是常常描述内存的表示法。
指针与C++基本原理
面向对象编程和传统的过程性编程的区别,OOP强调的是运行阶段(而不是编译阶段)进行决策。
运行阶段:程序正在运行是,取决于不同的情况。
编译阶段:编译器将程序组合起来时。坚持原先设定的安排
指针用于存储值的地址。指针名表示的是地址。
*运算符称为间接值或解除引用运算符,将其应用于指针,得到该地址处存储的值。
7.1 声明和初始化指针指针的声明必须指定指向的数据的类型。
int *p_updates;*p_updates 的类型是int,所以*运算符被用于指针,所以p_updates变量必须是指针。
运算符*两边的空格是可选的。
int *ptr; /*该情况强调:*ptr是一个int类型的值。*/ int* ptr; /*该情况强调:int* 是一种类型,指向int的指针。*/在C++中,int*是一种复合类型,是指向int的指针。
double *tax_ptr; 7.2 指针的危险在C++创建指针时,计算机将分配用来存储地址的内存,但是不会分配用来存储指针所指向的数据的内存。
⚠️注意:一定要在对指针应用解除引用运算符(*)之前,将指针初始化为一个确定的、适当的地址。
7.3 指针和数字整数可以加减乘除等运算,而指针描述的是位置。
C++语言数字不能作为地址使用,如果要把数字当地址来使用,应通过强制类型转换将数字转换为适当的地址类型。
7.4 使用new分配和delete释放内存指针在运行阶段 分配未命名的内存以存储值。然后使用内存来访问内存。
C语言中,使用 库函数malloc()来分配内存。C++中使用 ———— new运算符。
7.4.1 要注意使用delete进行内存的释放需要内存时,直接使用new来请求,这是内存管理数据包的一个方面。
如果使用了delete运算符,使得在使用完内存后,能够将其归还给内存池,这是有效使用内存的关键。
使用delete时,后面要加上指向内存块的指针。
int * ps = new int; // 使用new进行内存分配 ... delete ps; // 使用delete进行内存的释放 ⚠️注意点:1.使用delete释放ps的内存,但是不会删除指针ps本身。
2.只能用delete来释放使用new分配的内存,但是如果是空的指针使用delete是安全的。
使用delete的关键:用于new分配的内存。不是要使用于new的指针,而是用于new的地址。
❌警告:不能创建两个指向同一个内存块的指针。会增加错误地删除同一个内存块两次的可能性。
7.5 使用new创建动态数组C++中,创建动态数组,只需要将数组的元素类型和元素数目告诉new即可。必须在类型名后面加上方括号,其中包含了元素数目。
通用格式:
Type_name *pointer_name = new Type_name[num_element]; //例子 int * psome =new int[10]; // 创建10个int元素的数组new运算符会返回第一个元素的地址
如果使用完new分配的内存,使用delete进行内存的释放。
delete [] psome; // 进行内存的释放delete和指针直接的方括号告诉程序,应释放整个数组,不仅仅是指针指向的元素。
delete中的方括号的有无取决于使用new时的方括号有无。
对于指针数组的使用,直接可以按照普通数组的使用即可。
7.6 使用new和delete时,要遵循的规则不要使用delete来释放不是new分配的内存。
不要使用delete释放同一个内存块两次。
如果使用new[]为数组分配内存时,则应使用delete[] 来释放。
如果使用new[]为一个实体分配内存,则应使用delete(没有方括号)来释放。
对空指针使用delete时很安全。
8. 指针、数组和指针算术指针和数组基本等价的原因:指针算术(pointer arithmetic) 和C++ 内部处理数组的方式。
对整数变量 + 1,其值增加1