一、指针变量
指针变量和普通变量区别不大,都是变量。
任何变量都包含两个属性——地址和值,不用的是:普通变量存储的值就是可供用户直接使用的数据,而指针变量存储的值为某个地址。
任何变量只要超出其作用域就会无效(普通变量和指针变量都是如此)。
二、关于创建指针
指针在创建时有三种方式:1.为指针开辟一个内存。2.指针指向的内存为空。3.指针指向的内存为某个可用的内存。形式如下:
int _tmain(int argc, _TCHAR* argv[])
{
CData* data = new CData;
CData* data2 = nullptr;
CData* data3 = data;
someFuncition();
data = new CData;
system("pause");
return 0;
}
需要注意的是,创建时给指针指向空的指针并不能直接拿来使用,即data2。
开辟新内存的指针变量要手动释放其内存(data);使用delete关键词释放内存
三、使用delete释放内存
delete关键字所进行的操作并不是删除指针。而是释放当前指针所指向的内存,如下所示:
#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;
class CData
{
public:
CData()
{
cout << "调用构造函数" << endl;
}
~CData()
{
cout << "调用析构函数" << endl;
}
protected:
private:
int nRow;
int nCol;
};
int _tmain(int argc, _TCHAR* argv[])
{
CData* data = new CData;
delete data;
data = new CData;
system("pause");
return 0;
}
运行结果:
可以看见,在delete data之后,我们还能够对data进行操作。而在进行delete data操作中,释放了data所指向的CData对象的内存,同时,CData对象的析构函数被调用。
这里,可以理解成:CData* data=new CData();data 是一个指针变量,这个变量存储了(指向)一个CData对象的地址,当调用delete关键词时,data指向的地址被释放,即创建的CData对象被销毁了,因此,CData的析构函数会被调用。
需要注意的是,data并没有被销毁,它和普通的变量一样,离开自己的作用域就自动失效。
三、指针的好处、(深复制和浅复制)
指针最直接的好处就是,指针只是用了四个字节存储了一个地址,是直接操作地址的,效率上会比直接操作类的对象要高出许多(尽管java中并没有或者说很少提及指针的概念,但丝毫不影响java成为世界上最流行的语言之一。没有指针,大家一样可以活的好好的)