指针与自由存储空间
指针是一个变量,其存储的是值的地址,而不是值的本身。对于变量可以使用(&)地址运算符来获取地址。
显示地址时,常用的描述内存的表示法是十六进制表示法。
对于常规变量,值是指定的量,而地址是派生量。
指针名表示的是地址。*运算符被称为间接值或解除引用运算符,将其运用在指针上,可以得到该地址存储的值。
声明和初始化变量:
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;