c++中指针的相关知识
在看书中链式栈中,看到了删除栈中有以下语句:
ListNode *p=new ListNode();
p = top; top = top->link; delete p;
这里p的出现引起了我的困惑。可能是c++基础不牢固,所以进行了一系列搜集资料,最后理解如下:
1、首先说一下指针的有关知识。例,int *p;p = &3;
p指向的是地址,*p指的是数值。或者说,在内存中,p所在的那块内存中存的是一个地址数值,这里是3这个数值的地址存到了p所指的那块内存里。
*p=*q,意思是说,将q指针指向地址的值传给p指针指向的地址,这时,p和q所指的两个地址中的值是相同的了,但是此时p和q是指向不同地址的(当然是在原先p和q就不同的情况下)。
而p=q,则是说将q指针指向p指针指向的地址,此时pq指向同一位置,共享同一段内存,但是,p和q是有自己的内存的,只是两者内存中存的地址是一样的。(不代表p和q是一直相等的)
2、所以,这里删除节点操作就需要有一个新的指针来标记一下原先的top头指针,否则top进行后退后,原先的top就找不到了(只是找不到指它的指针,但它还在那里占据空间)
3、delete操作和new操作相对应(就如c语言中的malloc和free相对应),一般成对出现。但是delete指针操作不代表把这个指针删掉了,而是清空指针p所指那部分内存。
这里摘抄一个网上的说法,我觉得很有意思:
delete命令指示释放了那个指针原本所指的那部分内存而已。
被delete后的指针p的值(地址值)并非就是NULL,而是随机值。
也就是被delete后,如果不再加上一句p=NULL,p就成了“野指针”,在内存里乱指一通。
如果在定义p的那个函数在delete了p后,没再调用p,就没什么问题,在这个函数结束后,p就会跟其它变量一样被消除。
但若在那个函数里delete了p后,又没再给p赋值(地址值),再次调用p就危险了,因为这时p在内存里乱指,有可能指到一些重要地址,随时可能系统崩溃。
//p=NULL是个好习惯
//就像你蹲完厕所要洗手一样