4
void push(struct node** head_ref, int new_data)
{
    /* allocate node */
    struct node* new_node =
            (struct node*) malloc(sizeof(struct node));

    /* put in the data  */
    new_node->data  = new_data;

    /* link the old list off the new node */
    new_node->next = (*head_ref);   

    /* move the head to point to the new node */
    (*head_ref)    = new_node;
}

如果我没记错的话,将括号放在指针上意味着调用函数?如果这是真的,我真的不明白为什么 *head_ref 上有括号。我喜欢解释一下为什么我需要*head_ref在这段代码中加上括号。

4

4 回答 4

6

在这种特殊情况下,方括号除了阐明程序员的意图外没有其他用途,即他们想要取消引用head_ref.

注意head_ref是一个指向指针的指针,所以在这种情况下,new_node->next被设置为指向链表的原始头,然后指向的指针head_ref被更新为指向new_node现在是链表的开头。

正如迈克尔·克雷林(Michael Krelin)在下面指出的那样,将括号括在指针周围并不意味着它是调用函数或指向函数的指针。如果你看到了这个:(*head_ref)() 那么这将是对 指向的函数的调用head_ref

于 2012-08-21T10:25:45.133 回答
1

调用函数看起来像这样:

(*some_func_pointer)();

你的情况下的括号是没有意义的。

此外,无需在 C中转换malloc( ) 的结果。void*

于 2012-08-21T10:26:54.717 回答
1

在您的情况下,它只是在此处取消引用指针。

你说的那个:“把括号放在指针上意味着调用一个函数”

如果 * 之后的内容是函数指针,则为 true。基本上它取决于指针的类型。

于 2012-08-21T10:29:31.303 回答
1

这些括号仅用于分组。

通过指向函数的指针调用函数:

(* funcPointer)(param1,param2)
^             ^^         ^
|             |`---------`--- These brackets tell the compiler 
|             |               it's a function call
|             |
`-------------`---------------These brackets just group the * 
                              with the variable name

对于不带参数的函数,它只是()

您的示例在变量后没有一对括号,因此它不是函数调用。

于 2012-08-21T10:33:11.110 回答