函数的指针参数传递问题--理解指针变量

先看有如下代码

#include <iostream> #include <malloc.h> using namespace std; typedef struct Node{ struct Node* lchild; char data; }Node; void fun1(Node *n){ n = (Node*)malloc(sizeof(Node)); n->data = 'a'; n->lchild = NULL; cout<<n->data<<endl; } void fun2(Node* n){ cout<<n->data<<endl; } int main() { Node* node = NULL; fun1(node); fun2(node); return 0; } 

我们预期的结果是输出两个 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。这个过程其实就是上面讲的值传递,并没有涉及到通过指针改变内存地址里的内容。

 

为了达到预期的效果,也为了验证以上阐述,我们修改代码如下:

#include <iostream> #include <malloc.h> using namespace std; typedef struct Node{ struct Node* lchild; char data; }Node; void fun1(Node **n){ *n = (Node*)malloc(sizeof(Node)); (*n)->data = 'a'; (*n)->lchild = NULL; cout<<(*n)->data<<endl; } void fun2(Node* n){ cout<<n->data<<endl; } int main() { Node* node = NULL; fun1(&node); fun2(node); return 0; } 

运行效果如下:

 

结果正确!

转载于:https://www.cnblogs.com/JarvisChu/archive/2011/04/23/2752498.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值