目录
4.7 指针和自由储存空间
4.7.1声明和初始化指针
int* ps;
//ps是一个指向int的指针
int* p1, p2;
//p1是一个指向int的指针,而p2是一个int变量
地址的长度都是一样的。
4.7.2指针的危险
(无new的情况下)一定要现设个变量(已经占用了一定的内存),让某个指针指向它。不能让指针指向一个没有内存的东西。
4.7.3 地址和数字转换
地址是十六进制数,但不能把数字(即使是十六进制的)赋给地址。
可以进行类型转换。
pt = (int*)0xB8000000;
4.7.4用new分配内存
int* pn = new int;
//第二个int说明 new为pn准备了可以储存一个int数的内存
//pn指向这个内存
int* pn = new int[2];
//第二个int说明 new为pn准备了可以储存一个int数组(这个数组中有两个元素)的内存
//pn指向这个内存
使用动态数组只要把指针当作数组名使用即可
4.7.5用delete释放内存
int* ps = new int;
delete ps;
int* psome = new int[10];
delete [] psome;
//若写成 delete psome ,只会删除数组中第一个元素
只能用delete释放用new建的指针
若用new创建了指针A,又把指针A赋给指针B,那么deleteB也可以。但是A和B中只能delete一个且只能delete一次。
4.8指针、数组和指针算数
c++将数组名解释为数组第一个元素的地址。
double* pw = wages;
//将pw初始化为wages数组中的第一个元素的地址
wages = &wages[0];
//数组名是数组中第一个元素的地址
pw++;
//pw将指向wages中的第二个元素
指针的值可以修改,数组名不能。
sizeof(数组)得到数组长度,sizeof(指针)得到指针长度 即一个十六进制数占用的内存
short tell[10];
short* pas[10] = &tell
//pas时一个指针数组,包含10个元素,pas[1]---pas[9]都是指针,每个指针指向一个short
short(*pas)[10] = &tell;
//pas指向 含有10个元素的short数组
4.8.3 让指针等于数组名
如果指针指向数组,要想输出地址数组地址
int main()
{
char ch[10] = "qwrty";
char* ps;
ps = ch;
cout << ps; //输出 qwrty
cout << (int*)ps; //输出十六进制数
cout << (int)ps; //输出十进制数
return 0;
}
4.8.4 用new创建动态结构
4.8.5 自动储存、静态储存和动态储存
在函数内部定义的常规变量使用的自动储存空间,被称为自动变量。
静态储存是整个程序执行期间都存在的储存方式。要么在函数外面定义它,要么在声明变量是用static
动态储存 new delete
4.10 数组替代品 vector 和 array
4.10.1 模板类vector
类似于string,也是动态数组。
使用vector要包含头文件vector,vector包含在名空间std中
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> vi; //vi是一个int变量
vector<double> dddo(9); //dddo是一个 包含 9 个double类型数的数组
//这个‘9’可以是常量 也可以是变量
return 0;
}
4.10.2 模板类array(C++11)
使用array要包含头文件array,array也位于名空间std
使用静态内存分配
#include<iostream>
#include<array>
using namespace std;
int main()
{
array<int, 1> vi; //vi是一个int变量,这个“1”要写,否则会少一个参数
array<double, 9> dddo; //dddo是一个 包含 9 个double类型数的数组
//这段代码 上述的“1” “9”都不能是变量
return 0;
}
可以对vector和array的数组使用 .at()
dddo.at(11) ,c++会检查超界错误