C++中对于指针的理解

一、指针变量

指针变量和普通变量区别不大,都是变量。

任何变量都包含两个属性——地址和值,不用的是:普通变量存储的值就是可供用户直接使用的数据,而指针变量存储的值为某个地址。

任何变量只要超出其作用域就会无效(普通变量和指针变量都是如此)。

二、关于创建指针

指针在创建时有三种方式: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成为世界上最流行的语言之一。没有指针,大家一样可以活的好好的)

猜你喜欢

转载自blog.csdn.net/qq_41791653/article/details/81776236