4.7指针
指针的危险:
c++创建指针时,计算机会分配存储地址的内存,但是不会分配存储指针所指向的数据的内存。
如:
long *fellow; *fellow=233233;//危险,fellow指针所指向的位置是不知道的,
一定要在对指针应用解除引用运算符(*)之前,将指针初始化为一个确定的、适当的地址。
使用new 分配内存
指针的真正用武之地是:在运行时分配未命名的内存以存储值。在这种情况下,只能通过指针来访问内存。
#include<iostream> int main() { using namespace std; int nights=1001; int *pt= new int; *pt=1001; cout<<"nights value = "<<nights<<" location "<<&nights<<endl; cout<<"int "<<"value= "<<*pt<<" loaction = "<<pt<<endl; double *pd=new double; *pd=1000001.0; cout<<"double value= "<<*pd<<" lacation= "<<pd<<endl; cout<<"lacation of pointer pd "<<&pd<<endl; cout<<"size of pt "<<sizeof(pt)<<endl<<"size of *pt "<<sizeof(*pt)<<endl; cout<<"size of pd "<<sizeof(pd)<<endl<<"size of *pd "<<sizeof(*pd)<<endl; return 0; }
内存的位置随系统而异。
使用delete释放内存
int *ps=new int; delete ps;
释放ps指向的内存,但是不会删除指针ps本身。
一定要配对使用new 和delete 否则会产生内存泄露。
只能用delete释放new分配的内存,不能使用delete释放变量声明所获得内存。
不要释放已经释放的内存
int *ps=new int;//ok delete ps;//ok delete ps;//not ok int a=5; int *pi=&a; delete pi;//not ok
使用new创建动态数组
动态创建一个包含10个元素的数组
int *a=new int[10];
new返回第一个元素的地址。
对于用new 创建的数组,释放的格式为
delete [] a;
方括号就是释放整的数组,而不仅仅是指针指向的元素。
访问动态数组可直接使用:a[0],a[1],,,a[9]
#include<iostream> int main() { using namespace std; double *p3=new double [3]; p3[0]=0.2; p3[1]=0.5; p3[2]=0.8; cout<<"p3[1] is "<<p3[1]<<endl; p3=p3+1;//指向下一个 cout<<"now p3[0] is "<<p3[0]<< " and p3[1] is "<<p3[1]<<endl; p3=p3-1;//只想原来的值,以便delete的正确使用 delete[] p3; return 0; }