2013-06-06 2 views
3

Ниже приведен пример кода, а не рабочий. Я просто хочу знать разницу между *head и (*head) в указатели на C.разница между * head и (* head) указатели в C

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

ответ

6

* имеет более низкий приоритет, чем -> так

*head->next 

было бы эквивалентно

*(head->next) 

Если вы хотите разыгратьвам необходимо поместить оператор разыменовывания * внутри скобок

(*head)->next 
+2

* (head) -> следующий? (* Голова) -> следующий! –

+0

@PeterMiehle Спасибо, это была довольно важная/неловкая опечатка! – simonc

0

Разница из-за оператора precedence of 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 
     ^
+0

эй а также в чем разница между головой-> следующий и * head-> следующий ?? –

+0

Оба варианта, поскольку 'head-> next' не будут разыменованы. И '* head-> next' работают как ->' * (head-> next) ', поэтому всегда используйте'() 'для обеспечения правильного выполнения. –

+0

@RahulReddy: Вы поняли? Не стесняйтесь спрашивать запрос. –

0

-> имеет higher precedence над * оператора (разыменования), поэтому вам нужно скобок()*head вокруг перезаписать приоритет. So Правильно (*head)->next как вы head является указателем на указатель структуры.

*head->next же, как *(head->next) Это неправильно (дать вам компилятор ошибку, на самом деле ошибку синтаксиса)

+0

В чем разница между (* head) -> next и head-> next –

+0

@RahulReddy '(* head) -> next' is correct where ad' head-> next' is error, синтаксическая ошибка, поскольку head - указатель на указатель и не имеет следующего члена. –

0

Там нет никакой разницы.

Обычно.

В этом случае, однако, он используется, чтобы преодолеть проблемы с оператором старшинства: -> связывает более плотно, чем *, поэтому без скобок *head->next работает на эквивалент *(head->next).

Поскольку это не то, что необходимо, *head заключен в скобки для того, чтобы операции выполнялись в правильном порядке.

2

Нет никакой разницы между a + b и (a + b), но существует большая разница между + b * c и (a + b) * c. То же самое с * head и (* head) ... (* head) -> next использует значение * head в качестве указателя и обращается к следующему полю. * head-> next эквивалентно * (head-> next) ... что недопустимо в вашем контексте, потому что head не является указателем на узел struct.

 Смежные вопросы

  • Нет связанных вопросов^_^