在函数调用中省略与号

时间:2019-04-07 11:29:06

标签: c

我正在尝试在C中实现ADT二进制树,我想使用API​​,该函数的形式类似于foo(object,value)。到目前为止,我为int值编写了工作树,但是当我调用BinTree_insert函数时,必须使用运算符“&”来获取对象的地址。可以修改此功能以省略&吗?

typedef struct __bintree_node_t
{
    int data;
    struct __bintree_node_t* left;
    struct __bintree_node_t* right;
}bintree_node_t;

static void __BinTree_insert(bintree_node_t** node, int value)
{
    if(!(*node))
    {
        *node = __BinTree_newNode();
        (*node)->data = value;
    }
    else if((*node)->data < value)
        __BinTree_insert(&(*node)->left, value);
    else if((*node)->data > value)
        __BinTree_insert(&(*node)->right, value);
}

void BinTree_insert(bintree_node_t* node, int value)
{
    //??????
}

int main(void)
{
    bintree_node_t* root = 0;

    BinTree_insert(root, 2); //sth like this
    __BinTree_insert(&root, 1); //instead of this
}

2 个答案:

答案 0 :(得分:1)

您有以下选择:

  • 您可以代替返回新的指针,而不是将传递的指针修改为指针。但这意味着使用返回的值,这会使封装有些失败:

    static void BinTree_insert(bintree_node_t* node, int value)
    {
        if (!node)
        {
            node = __BinTree_newNode();
            node->data = value;
        }
        else if (node->data < value)
            node->left = __BinTree_insert(node->left, value);
        else if (node->data > value)
            node->right = __BinTree_insert(node->right, value);
    }
    
    int main(void)
    {
        bintree_node_t* root = 0;
    
        root = BinTree_insert(root, 2);
    }
    
  • 或者,如果您只想更改初始呼叫,则可以自己维护指针到指针:

    int main(void)
    {
        bintree_node_t* root = 0;
        bintree_node_t** rootPtr = 0;
    
        __BinTree_insert(rootPtr, 2);
    }
    
  • 或者您可以定义一个进一步封装指针的类型,但是会增加更多的代码和内存分配。

不过,不确定要点是什么吗?

答案 1 :(得分:0)

您已经实现了insert()函数,以便它修改它的第一个参数。为此,必须通过指针传递根。如果按值(bintree_node_t*)传递它,则BinTree_insert()内根的更改不会反映在函数外部(尽管对根 node 的更改会反映出来)

例如,如果树为空(根等于NULL),则您的插入函数将创建一个新节点,并将根指针指向该节点;如果您想保留原始的根指针(将继续为NULL),则无法做到这一点。

您可以做的是让插入函数返回新的根目录。然后,您可以将旧根作为bintree_node_t*传递(即按值)。