c++plus学习
指针
!!!
4.7.2指针的危险
···················
使用指针必须有初始值
int *p;
*p = 2333;
···················
4.7.1初始化
//两种操作
*p=a;
p=&a;
//取地址运算符 &
//间接寻址运算符 *
int a = 2;
int *p = &a;
cout << p//p为地址,int*可以看成两步,p=&a,r=*p,cout<<r
//多级指针
//指针变量也是一种变量,也会占用存储空间,也可以使用&获取它的地址。
//C语言不限制指针的级数,每增加一级指针,在定义指针变量时就得增加一个星号*。
//p1 是一级指针,指向普通类型的数据,定义时有一个*;
//p2 是二级指针,指向一级指针 p1,定义时有两个*。
int b = 1;
int *a = &b;
int **p=&a;
cout << a<<endl;
cout << b<<endl;
cout << &a<<endl;
cout << &b<<endl;
cout << p<<endl;
cout << *p<<endl;
cout << **p<<endl;
cout << &p<<endl;
0x7fff3c99fb2c//a
1 //b
0x7fff3c99fb30//&a
0x7fff3c99fb2c//&b
0x7fff3c99fb30//p
0x7fff3c99fb2c//*p
1 //**p
0x7fff3c99fb38//&p
4.7.3指针和数字
int *p;
*p = OxB8000000;//c99之前c语言允许,但c++严格,认为该为数值,通知类型不匹配
//需要将数值转化为地址
int *p;
*p = (int *)OxB8000000;
4.7.4new
int * p = new int;//typeName * pointer_name = new typeName;
double *a = new int;//指向int的指针长度和指向double的指针相同,都是地址
*a=1000001.0;
此时可&a(可看初始化的多级指针)
注意事项
new分配的内存块与常规变量分配的内存块不同
变量储存在栈(stack)的内存区域
new从堆(heap)或自由存储区(free store)的内存区域分配内存
4.7.5 delete内存
delete释放内存(释放指针指向的内存,不会删除指针本身)delete p后p会变成野指针,一般加上p = NULL
一般的规则是这样的:
先new,申请内存
不用时,delete释放掉,然后将指针赋值成NULL。
·不要使用delete来释放不是new分配的内存。
·不要使用delete释放同一个内存块两次。
·如果使用new[]为数组分配内存,则应使用delete []来释放。
·如果使用new[]为一个实体分配内存,则应使用delete (没有方括号)来释放.
·对空指针应用delete是安全的。