1. 布尔类型
bool is_ready = true;
2.C++字符串
一种是和C一样的字符数组
一种是string类
3.指针与C++基本原理
面向对象编程与传统的过程性编程的区别在于,OOP强调的是在运行阶段(而不是编译阶段)进行决策。
C++采用的方法是,使用关键字new请求正确数量的内存以及使用指针来跟踪新分配的内存的位置。
4.使用常规变量时,值是指定的量,而地址为派生量
int a; - -> &a
处理存储数据的新策略刚好相反,将地址视为指定的量,而将值视为派生量。
int * a; --> *a
5.指针的危险
极其重要的一点是:在C++中创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存。
long * fellow;
*fellow = 2333;
fellow确实是一个指针,但是它指向哪里呢?上述代码没有将地址赋给fellow.由于fellow没有被初始化,它可能有任何值,即通常说的“野指针”
警告:一定要在对指针应用解除应用运算符之前,将指针初始化为一个确定的、适当的地址。这是关于使用指针的金科玉律。
6.int * pt;
pt = (int *)0xB8000000;
指针不是整数,因此,不能简单地将整数赋给指针,应通过强制类型转换将数字转换为适当的地址类型;
7.前面我们都是将指针初始化为变量的地址;变量是在编译时分配的有名称的内存,而指针只是为可以通过名称直接访问的内存提供了一个别名。
指针真正的用武之地在于,在运行阶段分配未命名的内存以存储值。在这种情况下,只能通过指针来访问内存。
int * pn = new int;
new分配的内存块通常与常规变量声明分配的内存块不同。常规变量的值都存储在被称为栈的内存区域中,而new从被称为堆或自由存储区的内存区域分配内存。
8. 值为0的指针被称为空指针(null)。C++确保空指针不会指向有效的数据,因此它常被用来表示运算符或函数失败(如果成功,它们将返回一个有用的指针)。
9. int * ps = new int;
...
delete ps;
一定要配对地使用new和delete否则将发生内存泄露
不要尝试释放已经释放的内存块,这样做的结果是不确定的。另外,不能使用delete来释放常规变量声明所获得的内存。
10. 使用new来创建动态数组
int * psome = new int [10];
delete [] psome;
如果使用new时,带方括号,则使用delete时,也应带方括号。
11. 指针、数组和指针算术
很多情况下,可以相同的方式使用指针名和数组名。在多数表达式中,他们都表示地址。区别之一是,可以修改指针的值,而数组名是常量;
另一个区别是,对数组应用sizeof运算符得到的是数组的长度,而对指针应用sizeof得到的是指针的长度,即使指针指向的是一个数组
12. 指针和字符串
在cout和多数C++表达式中,char数组名、char指针以及用引号括起的字符串常量都被解释为字符串第一个字符的地址。
13. 使用new创建动态结构
访问结构成员:如果结构标识符是结构名,则使用句点运算符;如果标识符是指向结构的指针,则使用箭头成员运算符(->)。
14. C++3种管理数据内存的方式:自动存储、静态存储和动态存储(有时也叫自由存储空间或堆)。
1. 自动存储
在函数内部定义的常规变量使用自动存储空间,被称为自动变量。这意味着它们在所属的函数被调用时自动产生,在该函数结束时消亡。实际上,自动变量是一个局部变量,其作用域为包含它的代码块。代码块是被包含在花括号中的一段代码。到目前为止,我们使用的所有代码块都是整个函数。然而,函数内也可以有代码块。如果在其中的某个代码块定义了一个变量,则该变量仅在程序执行该代码块中的代码时存在。
自动变量通常存储在栈中。这意味着执行代码块时,其中的变量将依次加入到栈中,而在离开代码块时,将按相反的顺序释放这些变量,这被称为后进先出(LIFO)。因此,在程序执行过程中,栈将不断地增大和缩小。
2. 静态存储
静态存储是整个程序执行期间都存在的存储方式。使变量成为静态的方式有两种:一种是在函数外面定义它;另一种是在声明变量时使用关键字static;
3. 动态存储
new和delete运算符提供了一种比自动变量和静态变量更灵活的方法。它们管理了一个内存池,这在C++中被称为自由存储空间或堆。该内存池同用于静态变量和自动变量的内存是分开的。因此,数据的生命周期不完全受程序或函数的生存时间控制。
在栈中,自动添加和删除机制使得占用的内存总是连续的,但new和delete的相互影响可能导致占用的自由存储区不连续,这使得跟踪新分配内存的位置更困难。