5、指针
1、指针的创建
【1】在C++创建指针时,计算机将分配用于存储地址的内存,而不是分配用来存储指针所指向数据的内存。
【2】在使用*访问变量之前,将指针初始化成一个确定的、适当的地址。
【3】要将数字值作为地址来使用,应该通过强制类型转换将数字转换成指针类型。
int *pt; pt = 0xB8000000;//出错 pt = (int *)0xB8000000;//valid
2、使用new来分配内存
在C里面,使用malloc分配内存,C++里面还可以使用new.
new找到一个长度正确的内存块并返回该内存块的地址,程序员则需要将该地址赋值给一个指针。
int *pn=new int;
new int告诉程序,需要适合存储int的内存,new运算符根据类型来确定需要多少字节的内存、找到这样的内存并返回地址。
pn指向的内存块没有名字,如何称呼呢,我们说pn指向一个数据对象(这里指内存块而不是变量)。
3、使用delete释放内存
int *ps = new int; delete ps; /*以上语句将释放ps指向的内存,但不会删除指针ps本身, 可以将ps指向另一个新分配的内存块*/
int *ps2 = new int;
int *pt = ps;//一般来说不要创建指向同一个内存块的指针
//将增加错误地删除同一个内存块的风险
return 0;
4、使用new来创建动态数组
/*在编译时给数组分配内存称为静态联编(static binding,意味着数组是在编译时加入程序。 使用new时,如果在运行阶段需要数组则创建,还可以在运行时选择数组长度,称为动态联编。 在运行时创建的数组叫做动态数组。 */
int *psome = new int[10];//new元素返回第一个元素的地址,并赋给psome
delete[]psome;//使用方括号告诉程序,应该释放整个数组而不是指针指向的元素
- 不能使用delete释放不是new分配的内存
- 不能使用delete释放同一个内存块两次
- 若使用new []为数组分配内存,应该使用delete []
- 若使用new []为一个实体分配内存,应该使用delete
- 对空指针使用delete是安全的
short tell[10]; cout << tell << endl; cout << &tell << endl;
从数字上说,tell与&tell相同;但从概念上,tell指&tell[0]是一个2字节内存块的地址,&tell是20字节内存块的地址。tell+1将地址增加2,&tell+1将内存地址加20。
tell是一个short指针(*short),而&tell是指向包含20个元素的short数组(short(*)[20]).