函数的传值传址——指针篇

在我们写代码的时候,有时候我们去传递一个指针,想让函数去修改他,有的时候可以,有的时候却不行,那我们就要了解其中的原理。
先来看下面的代码,读者自己先思考一下函数的目的达到了吗?

#include<iostream>


struct Treenode
{
    Treenode(int a) : x(a) {}
    int x;
    Treenode *next;
};


void func(Treenode *head)
{
    printf("%p\n", &head);
    Treenode *temp = new Treenode(1);(此处存在内存未释放,仅供例子参考使用)
    head = temp;
}

int main()
{
    Treenode *p = new Treenode(0);
    printf("%p\n", &p);
    printf("%d\n", *p);
    func(p);
    printf("%d\n", *p);
}

上述代码中,在func函数中对head指针进行赋值,那我们在主函数打印的值应该是1,但结果却没有改变仍然是0。

那我们就要来分析原因了。
  • 首先我们在main函数中定义了指针变量p,并为其分配内存,然后将其传入函数func中,众所周知,在参数传入函数中,函数只是将其拷贝了一份。我们假设p的地址 &p = 8, 那func中的head是将其拷贝了一份,所以&head != &p。所以它们的地址不同。但它们是指针, 所以它们指向的地址是相同的,p == head。(这里可能有一点绕,大家多读几遍理解一下)。
    在这里插入图片描述
    这是我们运行打印 p的地址和head的地址是不同的。

  • 我们在函数中为指针赋值,相当于在&head的地址上进行赋值操作,因为&head 和 &p的地址是不同的,所以仅仅是将函数中拷贝的指针进行了赋值操作,真正我们想要赋值的p完全没有改变。

  • 如果想要给指针进行赋值,我们应该传入二级指针。

那可能还有问题, 上述结构体是一个组成链表的结构体,那我们在函数中进行如下操作为什么是可行的?

void func(Treenode *head)
{
    Treenode *temp = new Treenode(1);
    head->next = temp;
}

我们在函数中将temp赋值给head->next,结果p->next->x == 1;
这是为什么?
因为指针自己的地址是不同的(&p != &head),但是next是指针指向的成员,他们的地址是相同的(&p->next == &head->next),所以在相同的地址上进行了赋值操作是可以改变的。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值