为什么我们使用&;(*”语句,当指向struct的双指针是函数的参数时?
为什么在这里使用“&”:插入(&(*root)->左,值);为什么我们使用&;(*”语句,当指向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);
但是我们在这里不使用“&”: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
,以便在名称中明确区别。