指针:是说指针名表示的是地址。是一个变量,存储的是值的地址,而不是值本身
*运算符被称为间接值或解除引用运算符也可以叫做取地址符
声明一个指针
int * p_data;
* p_data的类型为int 由于*运算符被用于指针,因此p_data变量本身必须是指针。
我们说p_data指向int类型,我们还说P_data的类型是指向int的指针,或int*
可以这样说p_data是指针(地 址),而*p_data是int,而不是指针
初始化指针
int value=1;
int * pt=&value;
&的作用就是取变量的地址
初始化指针就是把pt的值设置为&value,
输出
cout<<"value"<<value<<endl;
cout<<"*pt"<<*pt<<endl;
cout<<"&value"<<&value<<endl;
cout<<"pt"<<pt<<endl;
你就会发现pt和&value是一样的
*pt和value 是一样的
一般如果只是声明一个指针,可以把指针初始化等于0的指针指针为nullptr不指向任何对象
int* myValue(nullptr);
nullptr可以隐式转换为bool类型
可以这么判断
if(!myValue)
........
-----------------------------------------------------------------------------------
用new 来分配内存,程序员要告诉new 需要为哪种数据类型分配内存,new 将找到一个长度正确
的内存块,并返回该内存的地址。
int *pt =new int;
new int 告诉程序,需要适合存储Int的内存。new运算符根据类型来确定需要多少字节的内存。
然后找到这样的内存并返回地址,再把地址赋值给pt,pt被声明为指向int的指针
现在pt是地址,*pt是指向该内存的值
使用完内存后我们就要把内存归还给内存池,这就用到了delete
使用delete时要加上指向内存块的指针
int * pt=new int;
delete pt;
一定要配对的使用new 和delete,也不能释放已经释放完的内存块
也不能向下面这样释放声明变量所得的内存
int value=1;
int * pt=&value;
delete pt;//这样做是不对的
下面说一下指针创建数组
int * pt =new int[10];
new 运算符返回的是第一个元素的地址,用完后我们要用delete释放它们
delete [] pt;//[] 告诉程序应释放整个数组,而不是仅仅是指针指向的元素
使用new 和delete时,应遵守以下规则
1.不要用delete 来释放不是new分配的内存
2.不用使用delete来释放同一个内存块两次
3.如果使用new[] 为数组分配内存,则应使用delete[]释放
4.如果用new为一个实体分配内存,则应使用delete(没有[])来释放
5.对于空指针应用delete是安全的
创建数组后我们就可以用指针访问这些数组了
int * pt =new int[3]
pt[0] =1;
pt[1] =2;
pt[2] =3;
使用指针符号可以处理数组中的数据,相应的执行速度往往比使用数组符号要快