先看有如下代码
我们预期的结果是输出两个 a.
可是运行的结果却是下图。
为什么只输出了一个a?
下面我们分析一下:
在fun1中,我们用malloc分配了一段内存,并将该段内存的首地址放在指针变量n,然后我们就用n这个地址,开始给结构体赋值。
在fun2中,我们以为在fun1中已经给node分配好了内存,也赋好值了。所以调用cout将其数据输出。
貌似都没有问题,符合指针传递的可以改变值的思想,一切很正确。那么为什么得不到预期结果??
问题就出在 理解指针变量与内存地址区别!
简单看一下参数传递类型
指针传递:
在指针函数参数传递 fun(int *p) 时,我们可以利用p来确定一段内存地址,然后直接将这段内存地址中的内容改变,这样就实现了通过指针传递改变变量的值。
值传递:
如果传递的是fun(int i)时,我们在fun中有语句 i= 6,等出了函数,大家都知道i并不一定6,i还是它原来的值。
有了这个基础,我们再来分析:
指针变量是一个普通变量,只不过它保存的内容是一个内存地址。
在main函数中,node=0x00,
调用fun1后,在fun1函数中,给node(n)赋了一个新地址,如n=0XFF,等fun1函数调用完毕,node其实还是0x00。这个过程其实就是上面讲的值传递,并没有涉及到通过指针改变内存地址里的内容。
为了达到预期的效果,也为了验证以上阐述,我们修改代码如下:
运行效果如下:
结果正确!