3

以下是示例代码,而不是工作代码。我只想知道C 中的指针*head和指针之间的区别。(*head)

int  insert(struct node **head, int data) {

      if(*head == NULL) {
        *head = malloc(sizeof(struct node));
        // what is the difference between (*head)->next and *head->next ?
        (*head)->next = NULL;
        (*head)->data = data;
    }
4

5 回答 5

6

*优先级低于->

*head->next

相当于

*(head->next)

如果要取消引用head,则需要将取消引用运算符*放在括号内

(*head)->next
于 2013-06-06T09:29:22.450 回答
2

a+b 和 (a+b) 没有区别,但 a+b*c 和 (a+b)*c 有很大区别。*head 和 (*head) ... (*head)->next 也一样,它使用 *head 的值作为指针,并访问它的下一个字段。*head->next 等效于 *(head->next) ... 这在您的上下文中无效,因为 head 不是指向结构节点的指针。

于 2013-06-06T11:52:59.600 回答
0

不同之处在于C 的运算符优先级

->优先级高于*


执行

为了*head->next

 *head->next  // head->next work first ... -> Precedence than *
      ^
 *(head->next) // *(head->next) ... Dereference on result of head->next 
 ^

为了(*head)->next

 (*head)->next  // *head work first... () Precedence
    ^
 (*head)->next  // (*head)->next ... Member selection via pointer *head 
        ^
于 2013-06-06T09:29:05.787 回答
0

->比(取消引用)运算符具有更高的优先级*,因此您需要括号 ()*head 覆盖优先级。所以正确是(*head)->next因为你head是指向结构指针的指针。

*head->next*(head->next)那是错误的(给你编译器错误,实际上是语法错误

于 2013-06-06T09:29:06.380 回答
0

没有区别。

通常。

然而,在这种情况下,它被用来克服运算符优先级的问题:->绑定比 更紧密*,因此没有括号*head->next可以等效于*(head->next).

由于这不是所期望的,*head因此将其括起来以使操作以正确的顺序发生。

于 2013-06-06T09:29:22.713 回答