【c++学习记录】指针 & new & delede & 类 & 内存

使用c++过程中常会遇到这几点,现在把这些做个整合

指针和自由存储空间

常规变量的地址

概念 意义
& 地址运算符
&home home是常规变量,&home是home得地址

代码示例:

int dog = 6;
std::cout << &dog << std::endl;
//输出为: 0x0065fd40
  1. 显示地址用 十六进制 表示法
  2. 使用常规变量时,值是指定量,地址为派生量

指针

重要相关概念

  1. 是一个变量,存储值得地址,而不是值本身
  2. 将地址视为指定量,值为派生量

代码示例:

int update = 6;
int * p_update; //声明创造指针的方法
p_update = &update;

std::cout<< update << "," << *p_update << std::endl;
//输出  6 ,6

std::cout<< &update << "," << p_update << std::endl;
//输出  0x0065fd48,0x0065fd48

*p_update = *p_update + 1;
std::cout << update << std::endl;
//输出 7 

– - - 由于 p_update 指向 update :

  • *p_update 和 update 完全等价
  • 可以像使用 int 变量那样使用 *p_update
  • 赋值给*p_update,可以改变指向的值 update

*运算符 两边的空格在哪对编译器来说都一样

运算符 * 间接值 或 解除引用
指针 ptr ptr 表示的是地址 ,*ptr 表示储存在该地址的值
int* ptr 强调 int* 是指向 int 的指针
int *ptr 强调 *ptr 是一个 int 值
int*ptr

创建指针的方法:

注意区别,要给每个指针变量名都加 *

int* p1,p2; //创建了指针p1 和 int 变量 p2
int *p1,*p2;//创建了指针p1 和 指针p2

初始化为地址:

int update = 6;
int * p_update = &update;

使用 new 来分配内存

为一个数据对象 获得并指定 分配内存

typeName * pointer_name = new typeName;

示例:

int nights = 1001;
int * pt = new int;
*pt = 1001;

使用 delete 来释放内存

示例:

int * pt = new int;
...
delete pt;

这会释放 pt指向的内存,但不会删除 pt 指针本身,可以将pt重新分配给新内存。

使用 new 来创建动态数组

示例:

double * p3 = new double [3];
p3[0] = 0.2;
p3[1] = 0.5;
p3[2] = 0.8;

p3 = p3 +1;
// now : p3[0] = 0.5; p3[1] = 0.8;

p3 = p3 -1; //回到原来的值
delete [] p3;

使用 new 来创建动态结构

示例:

struck inflatable
{
	char name[20];
	float volume;
	double price;
}

inflatable * ps = new inflatable;
cin.get(ps->name, 20);
cin >> (*ps).volume;
cin >> ps->price;
...
delete ps;

ps 指向 inflatable 结构,ps->price 是被指向的结构的 price 成员

类和动态内存分配

示例:

class StringBad
{
private:
	char * str;
	int len;
public:
	StringBad(const char * s);
	StringBad();
	~StringBad();
}

上述示例特点:

  • 使用了 char 指针,但是没有分配存储空间
  • 在构造函数中使用 new 来 为 char 分配空间,这样就可以避免在类中限定str 长度
StringBad::StringBad(const char * s)
{
	len = std::strlen(s);
	str = new char [len+1];
	std::strcpy(str,s);
}

在构造函数中 使用 new 分配内存

StringBad::StringBad()
{
	len = 4;
	str = new char [4];
	std::strcpy(str,"c++");
}

一定要 在析构函数中 使用delete释放内存

StringBad::~StringBad()
{
	delete [] str;
}

你可能感兴趣的:(C++学习记录,c++,学习,算法)