c/c++语言中的指针传递

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/paulkg12/article/details/83661250

c/c++语言中的指针传递

(指针作为一个函数的形参,被传递了)

我在学习一个算法题目:(LeetCode114)Flatten Binary Tree to Linked List

发现一个国内的解法:

// Recursion
class Solution {
public:
    void flatten(TreeNode *root) {
        if (!root) return;
        if (root->left) flatten(root->left);
        if (root->right) flatten(root->right);
        TreeNode *tmp = root->right;
        root->right = root->left;
        root->left = NULL;
        while (root->right) root = root->right;
        root->right = tmp;
    }
};

我对下图划线处迷惑:到底递归调用的子函数flatten,会否改变传进来的root 的值呢?答案是:NO!!
在这里插入图片描述

我的分析

ref

https://www.cnblogs.com/kane0526/p/3913284.html

note

指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。(这里是在说实参指针本身的地址值不会变)

所以呢,就好比我函数调用的前后,有两个容器:

  1. 一个是主调函数A:装了指针a(a的内容是0x234)
  2. 一个是被调函数B:装了指针a1(a1的内容一开始当然和a一样啦:0x234)

然后我在子函数里令 root = root->right 这样就是把a1 装的内容变来变去,一直root = root->right,比如 最后a1 装的是0x239,但是回到主调函数,没关系啊,一切照旧, a还是0x234

最后说一句

所以,网上常说的 ,call by value 是真的,对C /c++ ,java 都是的。都是把内容值,或者位置值传进下一个函数,下一个函数得到是相同的值啊,因为是相同的值,所以是副本,不过由于我们直接操作指针副本所指向的内容的话,回到上一个函数时,就会发现值真的变了,但是不要以为是引用传递给子函数了。如果我们只是把指针的值进行变化,而非对其指向的内容进行变更,就会发现call by value是句真理,所有函数调用,都是将一个值传过去而已。

猜你喜欢

转载自blog.csdn.net/paulkg12/article/details/83661250