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

问题描述 投票:-1回答:3
void instert(NODE**root, int value)
{
    ...
    insert(&(*root)->left,value);
    ...
}

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

为什么我们在这里使用“&”:insert(&(* root) - > left,value);但我们这里不使用“&”:搜索(root-> left,value);

c pointers tree double
3个回答
2
投票

insert函数添加了额外的间接级别,以便它可以修改指针。在search函数的情况下,这不是必需的,因为它永远不会修改传递给它的指针。

具体来说,需要在insert函数中有一个这样的地方:

*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的方式,包括顶级呼叫者:而不是写作

insert(&root, value);

他会被迫写作

root = insert(root, value);

3
投票

表达方式:

*root->left

相当于:

*(root->left)

由于运营商优先权。

所以你需要:

(*root)->left

如果你想要left指向的*root成员。

然后:

&(*root)->left

是指向left*root成员的指针,然后是NODE **类型,insert函数需要什么。


0
投票

&(*不是声明。

它是&运算符的一部分应用于表达式(*root)->left

© www.soinside.com 2019 - 2024. All rights reserved.