c++学习总结
c++ primer plus中指针和自由存储空间一节
前言
在对new创建的内存进行赋值时,通过观看案例与自身写的代码比较,发现自己一直以来的存在的误区,现进行小结。
提示:水平有限,仅供参考
一、指针的定义
首先根据计算机程序在存储数据时必须要确定的3种属性:
1.信息村存储的位置;
2.信息存储的类型;
3.信息存储的大小。
这个策略用来存储简单变量,但现在存储指针用一新的策略:
指针是一个变量,用于存储值的地址,而不是值本身。
二、声明和初始化指针
1.声明指针需要确定指针指向的值的类型。
指针声明代码:
int *p; //指向int的指针,int*是一种复合
2.指针初始化是指被初始化的是指针,而不是指针指向的值
指针初始化代码:
int num =10;
int *p = # //指向int的指针,将指针初始化为num的地址
3.可能会出现下面的问题:
指针初始化易出错的代码:
int *p ;
*p = 10; //此时没有将指针初始化为地址
此时仅有地址的声明,没有初始化,即没有将指针指向内存的地址,容易引起地址随即指向内存地址。
故在对指针进行解引用之前必须要将指针指向一个确定的,适当的地址。
三、new来分配地址
1.new运算符用来找到指定长度的内存块,然后返回该内存块的地址。
代码如下:
int *p = new int;
new int; // 返回一段内存大小为int大小的内存,然后返回该段内存的地址;
int *p; //声明p为指向int的指针,然后将p指向返回内存的地址;
此时p完成了声明跟初始化,所以可以使用解引用操作来对p指向的内存进行赋值操作。此时p所指向的内存在堆区中(heap)。
int *p = new int;
*p = 10;
cout << *p << "\tp = " << p << endl; // 指向的内存在堆区
2.对于使用new得到的内存完毕后,使用delete将内存块进行释放。
delete p;//将new int得到的int大小的内存进行释放,
此操作并非对指针p进行删除,指针p还能正常使用。只是相当于取消了对指针p的初始化操作,但声明依旧存在。
delete p;
p = NULL;
int num = 20;
p = #
cout << *p << "\tp = " << p << endl; // 指向的内存在栈区
在delete之后,若是再将p指向一个简单变量的地址,此时p指向的值为简单变量的地址,指向栈区的地址。
总结
以上就是这次对指针的小结,本文仅仅简单总结了指针的使用,而指针对于数组,结构等类型有更多的场景。
本文是关于C++学习的总结,重点讨论了指针的定义、声明与初始化,以及如何使用new运算符分配和释放内存。指针是一个存储地址的变量,声明时需指定其指向的类型。使用new分配内存后,需注意对指针进行初始化,防止未定义行为。使用delete释放内存后,指针并未删除,但仍需将其设为NULL以示无关联。
809

被折叠的 条评论
为什么被折叠?



