在做实验的时候,到二叉树的先序遍历建立二叉树的时候,参照着严蔚敏老奶奶的《数据结构C语言版》第131的如下代码
很多情况下,当传递指针的时候,都是传递指针本身,而如果这里把BiTree &T改成
BiTree T时(BiTree为指针类型),程序就会崩溃。(在这里鄙视自己一下,当一个学生问我这个问题的时候,我居然还和他说,这里用指针和用指针的引用都可以的时候。。。。)
发现传递指针和传递指针的引用有着很大的区别。
例如如果要在主函数定义一个int型指针,然后在函数中将该指针动态分配空间,此时应该传递的是指针的引用,而不是指针本身。
发现程序崩溃。
而采用下面的函数赋值则没有问题
为什么会有上面的原因呢?
下面给出解释。
当我们在主函数里声明一个int型的指针a的时候,系统会取用下面一个结构
其中a是一个指针变量,v代表的是变量a的值,即某个地址,当没有初始化的时候,v是个指向未知区域的值,可能是应用程序地址也可能是系统程序的地址,因此不能直接输出没有初始化指针的值,会造成程序崩溃。
当我们把指针a当做变量传递的时候,会有下面一个分配关系
这时候函数会产生一个形式参数,形式参数就是实参的一个副本。简单来说,就是拷贝一个一模一样的同样内容的变量。在这里会产生一个副本a’,其中a’的地址和a是不同的,但是里面存放的内容是相同的,这也就是为什么很多地方采用指针传值就是对同一个位置上的内容进行操作。
当在函数中进行动态地址分配的时候,即
也就是改变了形参a’的值,变为了v’,其中v’指向堆中动态申请的一个内容为5的变量地址。
而这些操作都没有改变实参中a的值,因此a的内容没有变,还是指向一个未知区域,而当函数返回后,a’的值被释放,产生了堆中的内存泄露。
而在采用引用赋值后,相当于传递的是指针本身,因此所有的操作即是对指针a本身的操作,没有问题。
因此该注意在函数里对主函数的指针进行动态空间分配!
点击查看更多
版权归www.itbuluoge.com所有 转载请注明出处
-----------------------------------PS----------------------------------
为了证明我的结论没有错误
我测试了以下程序:
#include "stdafx.h" void seta(int * p) { p=new int(5); } int main(int argc, char* argv[]) { int* a=new int(7); //经过动态申请空间后,输出a指向的值 seta(a); printf("%d",*a); return 0; }
本结论我分别询问了中科大计算机12级硕士群,C/C++爱好者群,某腾讯开发经理等专业人士,有问题请留言继续探讨~