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

あなたの場合、ここでポインターを逆参照するだけです。

あなたが言ったもの:「ポインターに括弧を付けると、関数を呼び出すことを意味します」

* の後に続くものが関数ポインタである場合に真です。基本的にはポインタの型に依存します。

于 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 に答える
1

関数を呼び出すと、次のようになります。

(*some_func_pointer)();

あなたの場合の括弧は無意味です。

また、 Cでmalloc( )の結果をキャストする必要はありません。void*

于 2012-08-21T10:26:54.717 に答える