C 验证在处理二叉树时使用指向指针的指针更好的说法

C 验证在处理二叉树时使用指向指针的指针更好的说法,c,pointers,binary-tree,cs50,C,Pointers,Binary Tree,Cs50,,大约在1小时00分,学生讲师将讨论指向指针的指针,以及为什么以这种方式在二叉树上实现insert更有效。至少,这是我从争论中得到的 我用两种方法实现了递归。我不明白为什么选项A比下面的选项B好……如果我被误解了,也许你可以帮我解释一下,或者给我指出正确的方向 选项A(带指向指针的指针) 我相信您误解了为什么原始代码中有指向指针的指针。“选项a”没有任何意义,仅仅为了它而使用指针对指针没有任何好处 使用指针指向指针的唯一原因是,您希望更改指向的地址并将其返回给调用者 比如说 void func

,大约在1小时00分,学生讲师将讨论指向指针的指针,以及为什么以这种方式在二叉树上实现insert更有效。至少,这是我从争论中得到的

我用两种方法实现了递归。我不明白为什么选项A比下面的选项B好……如果我被误解了,也许你可以帮我解释一下,或者给我指出正确的方向

选项A(带指向指针的指针)
我相信您误解了为什么原始代码中有指向指针的指针。“选项a”没有任何意义,仅仅为了它而使用指针对指针没有任何好处

使用指针指向指针的唯一原因是,您希望更改指向的地址并将其返回给调用者

比如说

void func (int** ptr)
{
  *ptr = something;
}

func(&my_ptr);

// is the very thing same as

int* func (int* ptr)
{
  return something;
}

my_ptr = func(my_ptr);
您不能在函数中使用第二个版本并键入
ptr=something
,因为
ptr
是一个局部变量,一旦您离开函数,它将不再存在。给它赋值不会影响调用者端的原始指针

指针到指针版本的唯一优点是,返回的类型可以用于其他用途,例如返回错误代码

这似乎正是视频中那个家伙使用它的原因。他的功能看起来像

bool insert (int value, node** tree);

*树
被分配到函数内部的另一个地址,当它到达树分支的末尾时,bool被用作状态代码。

您的第二个实现根本不起作用。您在哪里看到问题?当一个值作为C中的参数传递时,它被复制。这样做
节点**tmptree=&tree是无用的,因为它引用的是副本,而不是原始树。因此,当您使用函数
*tmptree=build\u node(value)修改您的副本,但不会向树中添加任何内容。如果你想使用常规指针,那么你需要在函数式中实现它。更好的是使用缩进!更准确地说,A和B都是错误的。在这种情况下,指向本地指针的指针是毫无意义的。我认为你完全正确。我重新观看了视频中卡住的部分,学生通过
节点**
的原因是,如果指向节点指针的指针为
NULL
,则会更改树的组成。这样,如果有人传入
&root
,其中
节点*root=NULL,树只需将插入的值设为根
节点*
,这是二叉树上插入的预期行为。
    node* build_node(int value)
    {
        node* node = malloc(sizeof( node ));
        if(node == NULL)
            return NULL;
        node->value = value;
        node->left = NULL;
        node->right = NULL;
        return node;
    }
void func (int** ptr)
{
  *ptr = something;
}

func(&my_ptr);

// is the very thing same as

int* func (int* ptr)
{
  return something;
}

my_ptr = func(my_ptr);
bool insert (int value, node** tree);