为什么我们使用&;(*”语句,当指向struct的双指针是函数的参数时?

为什么我们使用&;(*”语句,当指向struct的双指针是函数的参数时?,c,pointers,tree,double,C,Pointers,Tree,Double,为什么在这里使用“&”:插入(&(*root)->左,值); 但是我们在这里不使用“&”:search(root->left,value);在insert函数中添加了一个额外的间接级别,以便它可以修改指针。对于search函数,这是不必要的,因为它从不修改传递给它的指针 具体来说,在insert函数中需要有这样一个位置: void instert(NODE**root, int value) { ... insert(&(*root)->left,value);

为什么在这里使用“&”:插入(&(*root)->左,值);
但是我们在这里不使用“&”:search(root->left,value);

insert
函数中添加了一个额外的间接级别,以便它可以修改指针。对于
search
函数,这是不必要的,因为它从不修改传递给它的指针

具体来说,在
insert
函数中需要有这样一个位置:

void instert(NODE**root, int value)
{
    ...
    insert(&(*root)->left,value);
    ...
}

void search(NODE*root, int value)
{
    ...
    search(root->left, value);
    ...
}
*root = malloc(sizeof(NODE));
(*root)->left = NULL;
(*root)->right = NULL;
(*root)->value = value;
这将修改指针指向指针的指针

请注意,通过从
insert
返回指针的新值,可以避免这种额外的间接级别,如下所示:

void instert(NODE**root, int value)
{
    ...
    insert(&(*root)->left,value);
    ...
}

void search(NODE*root, int value)
{
    ...
    search(root->left, value);
    ...
}
*root = malloc(sizeof(NODE));
(*root)->left = NULL;
(*root)->right = NULL;
(*root)->value = value;
但是,这改变了所有调用者必须调用
insert
,包括顶级调用者的方式:而不是编写

NODE* insert(NODE*root, int value) {
    ...
    root->left = insert(root->left, value);
    ...
}
他将被迫写作

insert(&root, value);
表达方式:

root = insert(root, value);
相当于:

*root->left
由于运算符的优先级

因此,您需要:

*(root->left)
如果希望
*root
指向的
成员

然后:

(*root)->left
是指向
*根
成员的指针,该成员的类型为
节点**
,是
插入
函数所需的。

&(*
不是一条语句


它是应用于表达式
(*root)->left

&
-运算符的一部分。如果不是这样,我就不清楚您的问题。
插入
需要一个
节点**
。我知道双指针正在修改某些内容。但我想知道为什么“&”在这里插入(&(*root)->left,value);但它不在这里搜索(root->left,value);@AdrianPrzemysławDrozdowski任何指针都意味着“修改某些东西”。双指针通常意味着“修改某些指针”。在您的例子中,指针(单指针和双指针)是
root
。但是,在第一种情况下,更适合将其命名为其他名称,例如,
p\u root
,以便在名称中明确区别。