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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当指向struct的双指针是函数的参数时,为什么我们使用“&(*”语句?相关的知识,希望对你有一定的参考价值。

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);

答案

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);
另一答案

表达方式:

*root->left

相当于:

*(root->left)

由于运营商优先权。

所以你需要:

(*root)->left

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

然后:

&(*root)->left

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

另一答案

&(*不是声明。

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

以上是关于当指向struct的双指针是函数的参数时,为什么我们使用“&(*”语句?的主要内容,如果未能解决你的问题,请参考以下文章

SWIG Python - 包装一个需要指向结构的双指针的函数

使用指向具有结构的指针的指针的函数

结构体指针与结构体变量用作函数参数时有啥区别,在用法上

struct“proto_ops”中的函数指针指向哪里?

将全局数组复制到由双指针引用的数组中

指针不更新它在 void 函数中指向的值