以下是示例代码,而不是工作代码。
我只是想知道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;
}
答案 0 :(得分:6)
*
的优先级低于->
所以
*head->next
等同于
*(head->next)
如果您要取消引用head
,则需要将解引用运算符*
放在括号内
(*head)->next
答案 1 :(得分:2)
a + b和(a + b)之间没有区别,但a + b * c和(a + b)* c之间存在很大差异。它与* head和(* head)相同......(* head) - > next使用* head的值作为指针,并访问其下一个字段。 * head-> next相当于*(head-> next)...在你的上下文中无效,因为head不是指向struct节点的指针。
答案 2 :(得分: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
^
答案 3 :(得分:0)
->
*
超过()
(解除引用)运算符,因此需要*head
周围的括号 (*head)->next
覆盖优先级。所以Correct是head
,因为*head->next
是指向struct的指针。
*(head->next)
与{{1}}相同这是错误的(给你编译错误,实际上语法错误)
答案 4 :(得分:0)
没有区别。
一般
然而,在这种情况下,它用于克服运算符优先级的问题:->
绑定比*
更紧密,因此没有括号*head->next
可以达到{{1}的等效值1}}。
由于这不是您想要的,*(head->next)
是括号,以便按正确的顺序进行操作。