C 需要更好的解释为什么我们在二进制搜索中使用指向指针的指针

C 需要更好的解释为什么我们在二进制搜索中使用指向指针的指针,c,pointers,C,Pointers,我只是想更好地理解指向指针的指针,在互联网上我发现了一个二进制搜索的例子,开发者在插入函数中使用指向指针的指针 我的问题是: 与其他使用单指针的BST代码相比,下面的代码有什么优势 在insert函数的末尾,代码使用递归方法,但我不理解在insert(&(*tree)->right,item)中使用&的语法 insert函数如下所示: void insert(node ** tree, node * item) { if(!(*tree)) {

我只是想更好地理解指向指针的指针,在互联网上我发现了一个二进制搜索的例子,开发者在插入函数中使用指向指针的指针

我的问题是:

  • 与其他使用单指针的BST代码相比,下面的代码有什么优势
  • 在insert函数的末尾,代码使用递归方法,但我不理解在
    insert(&(*tree)->right,item)中使用
    &
    的语法
  • insert
    函数如下所示:

     void insert(node ** tree, node * item)  
     {   
       if(!(*tree))  
       {  
            *tree = item;  
            return;  
       }  
       if(item->val<(*tree)->val)  
          insert(&(*tree)->left, item);  
       else if(item->val>(*tree)->val)  
          insert(&(*tree)->right, item);  
    }  
    
    void插入(节点**树,节点*项)
    {   
    如果(!(*树))
    {  
    *树=项目;
    返回;
    }  
    如果(项目->阀门)
    插入(&(*树)->左侧,项目);
    否则如果(项目->val>(*树)->val)
    插入(&(*树)->右侧,项目);
    }  
    
    因为这一行,如果项目为空,它会将
    分配给项目,也就是说,它会启动一个新的树

    *tree = item;
    
    如果只获取一个
    节点*
    ,则无法为其分配一个从函数外部可见的新值。这是因为指针是按值传递的,因此
    insert
    函数只需修改原始指针的副本即可

    2) 在insert函数的末尾,代码使用递归方法,但我不理解使用“&”insert(&(*tree)->right,item)的语法


    ->
    运算符的优先级比
    &
    运算符的优先级高,因此它要传入
    *树->右
    的地址,即下一行的
    节点**

    。我不能像struct node*insert(struct node*node,int data){if(node==NULL){return(newNode(data));}else{if(data data data)node->left=insert(node->left,data);else node->right=insert(node->right,data);return(node);}HI Ed S.感谢您的解释。你帮我消除了我的疑虑。总之,如果我们想更改该值,可以将该值作为指针传递到函数中。所以在相同的模式下,如果我们想改变指针,那么在这种情况下,我们必须将它作为指针的指针传递。希望我是对的。给像我这样的人更多的解释。。。。。。。。。。。。。听起来你已经知道了。由于所有内容都是按值传递的,因此如果希望调用方看到参数更改的值,则需要传递指针,这也适用于指针。