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

对指针变量 + 1,增加的量等于它指向的类型的字节数。
获取数组地址的两种方式

double * pw = wages; // 数组名 = 地址 ;将pw声明为指向double类型的指针。然后将其初始化为wages - - - wages数组中第一个元素的地址。 short * ps = &wages[0]; // 使用地址操作;使用地址运算符来将ps指针初始化为stacks数组的第一个元素。 8.1 指针问题小结 8.1.1 声明指针

要声明指向特定类型的指针,语法格式:

TypeName *pointerName; // 例子 double * pn; // pn 指向一个double类型 char * ps; // ps 指向一个char类型 8.1.2 给指针赋值

将内存地址赋给指针。可以对变量名应用 & 运算符,来获得被变量名的内存地址,new运算符返回未命名的内存的地址。

示例:

double * pn; // pn 指向一个double类型 double * pa; // pa 指向一个double类型 char * pc; // pc 指向一个char类型 double bubble = 3.2; pn = &bubble; // 把bubble的地址赋值给 pn pc = new char; // 新建char地址并分配给pc 8.1.3 对指针解除引用

对指针解除引用意味着获得指针指向的值。

方法1:对指针应用解除引用或间接值运算符(*)来解除引用。

cout<<*pn; *pc = 's';

方法2:使用数组表示法。不可以对未初始化为适当地址的指针解除引用。

8.1.4 数组名

多数情况下,C++将数组名视为数组的第一个元素的地址。

int tacos[10]; // 此时的tacos同样也是&tacos[0] 8.1.5 指针算术

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

也可以将一个指针减去另一个指针,获得两个指针的差。得到一个整数,仅当两个指针指向同一个数组(也可以指向超出结尾的一个位置)时,这种情况会得到两个元素的间隔。

8.1.6 数组的动态联编和静态联编

使用数组声明来创建数组时,将采用静态联编,即数组长度在编译时设置。

int tacos[10] // 静态联编

使用new[]运算符创建数组时,将采用动态联编(动态数组),即将在运行时为数组分配空间,其长度为运行时设置。

使用这类数组后,要使用delete[]释放所占用的内存。

8.1.7 数组表示法和指针表示法

使用方括号数组表示法等同于对指针解除引用。

数组名和指针变量也是一样。所以对于指针和数组名,既可以使用指针表示法,也可以使用数组表示法。

int * pt = new int [10]; *pt = 5; pt[0] = 6; pt[9] = 5; int coats[10]; *(coats + 4) = 12; 8.2 指针和字符串

数组名是第一个元素地址。

如果给cout提供一个字符的地址,则它将从该字符开始打印,直到遇到空字符为止。

在cout和多数C++表达式中,char数组名、char指针以及用引号括起来的字符串常量都被解释为字符串第一个字符的地址。

不要使用字符串常量或未被初始化的指针来接收输入。

在字符串读入程序时,应使用已分配的内存地址。该地址不是数组名,也可以使用new初始化过的指针。

strcpy()接受两个参数,第一个:目标地址,第二个:要复制的字符串的地址。

要确定目标空间有足够的空间来存储副本。

8.3 使用new创建动态结构

对于在指定结构成员时,句点运算符和箭头运算符的选择时:

如果结构标识符是结构名,则使用句点运算符(.)。

如果标识符是指向结构的指针,则使用箭头运算符(->)。

把new用于结构的两个步骤

创建结构

要创建结构,需要同时使用结构类型和new。

创建访问其成员。

8.4 C++管理数据内存的方式

自动存储
在函数内部定义的常规变量使用自动存储空间,称为自动变量。

只在特定函数被执行时存在。

自动变量时一个局部变量,作用域为包含它的代码块。通常存储在栈中,遵循后进先出(LIFO)。

静态存储

变量称为静态的方式

在函数外面定义

在声明变量时使用关键字static。

整个程序执行期间都存在的存储方式(存在于程序的整个生命周期)。

动态存储
内存池(自由存储空间或堆)用于静态变量和自动变量,且内存是分开的。

线程存储(C++11特性)

9. 数组替代品 --- 模板类

模板类vector和array是数组的替代品。

9.1 模板类vector

模板类vector类似于string类,也是一种动态数组。

vector对象包含在vector头文件中。

vector包含在名称空间std中,使用using编译指令、using声明或std::vector。

模板使用不同的语法来指出它存储的数据类型。

vector类使用不用的语法来指定元素数。

9.2 模板类array(C++11)

位于名称空间std中,与数组一样,array对象的长度固定,也使用栈(静态内存分配),而不是自由存储区。

头文件 array。

9.3 数组、vector和array的区别

无论是数组、vector对象还是array对象,都可使用标准数组表示法来访问各个元素。

从地址可知,array对象和数组存储在相同的内存区域(即栈)中,vector对象存储在自由存储区域或堆中。

可以将一个array对象赋给另一个array对象,对于数组,必须逐个元素复制数据。

Github地址:https://github.com/SolerHo/cpp-Primer-Plus-6e-Notes/blob/master/Chapter04/README.md

第四章 学习笔记完毕,如有大佬在文中发现错误,请指出,谢谢

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zysdjw.html