32、再论函数传值中指针和引用的区别

一、回忆

    

前面我们谈到过指针和引用的区别及联系,认识到,指针是一个实体,而引用仅是个别名(绰号);对引用型变量进行除赋值以外的一切操作,相当于对被引用变量进行操作。但是,问题还没有结束,今天我想到一个问题,开始破灭我心中对前面引用的认识。

    

对引用的介绍,见
http://blog.163.com/zhoumhan_0351/blog/static/39954227200932753054227/

二、问题的引入

    

在我们讨论线索二叉树的生成和遍历
http://blog.163.com/zhoumhan_0351/blog/static/39954227200991293851204/

时,对于线索二叉树的函数Status InOrderThreading(BiThrTree  &Thrt,BiThrTree T),注意Thrt参数,我们应用了引用(&)。于是出现了一个问题,既然引用和指针的意义一样,那么不用这个引用符号,直接用指针行不行?即用:

Status  InOrderThreading(BiThrTree Thrt,BiThrTree T) 也可以吧?!可是,结果却是不对的。这是为什么呢?一开始我也想不明白。后来,在薛学姐和谢学姐的共同帮助下,我终于明白了为什么了。

三、问题的解决

1、先测试如下一个小程序,观测输出结果:

#include  "stdio.h"

#include  "stdlib.h"

void fun(int *p)

{

p=(int*)malloc(sizeof(int));

}

int main()

{

int *p=NULL;

fun(p);

if(p==NULL)  printf("ov");

return 1;

}

    我们发现输出结果是ov。这下,我们就诧异了,怎么不是在子函数中,给他赋值了吗?怎么还是NULL啊。

2、先来是这样的

    

原来,在函数传值过程中,我们想要传地址(用指针或引用),只要在子函数中通过malloc等函数或相似操作对传过来的指针进行了赋值操作,而还想保留和返回指针所指向的当前地址值,就应该用引用,而不应当用指针。因为,在子函数中,对形参副本-形参中的指针赋值时,已改变了主函数中的实参和子函数形参指向同一地址值的同步性。

    

如图中所示。P1指针显示主函数中定义的实参指针,P2指针显示在子函数中定义的形参指针(引用)。

    

    

           这样,我们就不难明白,我们原来的问题的缘由了。再次谢谢两位学姐指点。

发布了278 篇原创文章 · 获赞 31 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/hopegrace/article/details/104534024
今日推荐