*pointervar与(*pointervar)的区别及链表代码中指针括号使用原因
关于
*pointervar与(*pointervar)的区别 在C/C++里,核心是运算符优先级在起作用:
->(指针成员访问)和.(普通成员访问)的优先级,比*(解引用运算符)更高。- 单纯写
*pointervar,就是直接对指针做解引用,但如果后面跟着成员访问操作,编译器会优先处理成员访问,这就会出问题。比如你代码里的head是struct Node**(二级指针,指向链表头指针的指针),要是写*head->next,编译器会先尝试访问head的next成员——但head是二级指针,根本没有这个成员,直接编译报错。 - 加了括号的
(*pointervar),会强制先执行解引用操作,拿到pointervar指向的那个一级指针,之后再去做成员访问就没问题了,比如(*head)->next就是正确的写法。
再看你提供的代码里的第三行newNode->next = (*head);:
这里*head和(*head)的结果其实完全等价——因为没有其他高优先级运算符干扰,都是对二级指针head解引用,得到指向链表头的一级指针,再赋值给newNode->next。加括号的目的主要是提升可读性,明确告诉看代码的人:我们是先对head这个二级指针做解引用,再拿它的值来赋值。如果不加括号,虽然语法没问题,但对于新手来说可能会混淆*的作用范围。
简单总结:
- 当只是单纯解引用指针(比如赋值、传参场景),
*pointervar和(*pointervar)效果一致; - 当解引用后还要访问成员(用
->或.),必须加括号写成(*pointervar)->xxx,否则会触发语法错误。
内容的提问来源于stack exchange,提问作者Uwe_98
相关产品推荐
相关产品推荐

