《C++ Primer Plus》学习笔记——第四章 复合类型(三)

指针与自由存储空间

指针是一个变量,其存储的是值的地址,而不是值的本身。对于变量可以使用(&)地址运算符来获取地址。

显示地址时,常用的描述内存的表示法是十六进制表示法。

对于常规变量,值是指定的量,而地址是派生量。

指针名表示的是地址。*运算符被称为间接值或解除引用运算符,将其运用在指针上,可以得到该地址存储的值。

声明和初始化变量:

int* ptr;//指向int的指针
int* ptr=&higgens;//初始化

创建指针时,如果不将指针指向一个地址,是不可以赋值的。因为不知道到底将值放在何处。

new与delete:

在C语言中,可以使用库函数malloc()来分配内存;在C++中仍然可以这样做,但是还有更好的办法——new运算符

int* p=new int;

new int 告诉程序需要存储int的内存,之后p指向这个内存。

new从被称为堆或自由存储区的内存区域分配内存。

当不需要这块由new指定的内存,可以使用delete来释放内存;

int* p=new int;
delete p;

一般不创建两个指向同一个内存块的指针,否则可能会错误的释放内存两次。

用new来创建动态数组以及释放内存

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

使用动态数组可以像使用数组一样使用。

使用new和delete应遵循以下规则:

  • 不要使用delete来释放不是new分配的内存
  • 不要使用delete释放同一个内存两次
  • 如果使用new []为数组分配内存,就应使用delete []来释放内存。
  • 对空指针用delete是安全的。

指针、数组和指针算术

指针和数组基本等价的原因在于指针算术和C++内部处理数组的方式。

将指针加1,增加的量等于它指向的类型的字节数。

可以修改指针的值(指针可运算),而数组名是常量。

对数组运用sizeof得到数组的长度,而对指针用sizeof得到的是类型长度。

数组名被解释为其第一个元素的地址,而对数组名应用地址运算符得到的是整个数组的地址。

指针与字符串:

C-风格字符串

char* bird="wren";
cout<<bird<<endl;
//输出的是wren;

如果给cout提供一个指针,他将打印地址,如果指针的类型为char*,则将显示指向的字符串,如果要显示地址,就必须将这种指针类型强制转换成另一种类型,如:int*。

用new创建动态结构:

首先创建结构,在声明:inflatable* ps=new inflatable;

如果要访问成员,需要使用->箭头成员运算符:ps->price.

另一种是(*ps).price。通过优先级,来访问成员。

自动存储、静态存储和动态存储

自动存储:

在函数内部定义的常规变量使用自动存储空间,他们随函数的调用产生,函数的结束而消失。

静态存储:

在程序执行期间一直存在。定义方式有两种:在函数外定义或声明时加static关键字。

动态存储:

使用new和delete (最好一起用)。

数组的替代品

模板类vector

实质是使用new和delete来管理内存,可在运行阶段设置长度。

要使用vector对象,首先要包含头文件vector,其次要有名称空间std。

vector <typename类型>vt名(n_elem)
//n_elem可以是整型常量,也可以是整型变量

模板类array

长度固定,使用的是栈,效率与数组一样,但更加安全可靠。要使用array,首先包含头文件array和名称空间std。

array<int,5>ad;
array<typename,n_elem>arr;

猜你喜欢

转载自blog.csdn.net/GM_AMRC/article/details/83409323