指针访问结构体成员疑问:双向链表替代语法报错原因求解
问题解析:双向链表指针访问的语法错误
嘿,我来帮你搞清楚这个问题!你遇到的问题核心是C/C++运算符优先级搞混了,咱们一步步拆解来看:
首先,先明确两种指针访问成员的语法:
ptr->member:等价于(*ptr).member,专门用于指针访问结构体/类的成员obj.member:用于直接访问对象(或引用)的成员
你原来的正确写法temp->next->prev,拆解开来是这样的逻辑:
temp是指向链表节点的指针,temp->next→ 等价于(*temp).next,得到的是下一个节点的指针(Node*类型)- 接着对这个指针访问
prev,所以用->prev,也就是(*(temp->next)).prev,最终得到下一个节点的前驱指针。
那你写的*((*temp).next).prev错在哪?
关键是运算符优先级:成员访问.的优先级比一元解引用*更高!所以编译器会把你的代码解析成:
*( ((*(temp)).next).prev )
也就是说,编译器先尝试访问(*temp).next的prev成员——但(*temp).next是个Node*指针啊!.只能用于结构体/类对象(或引用),不能直接用在指针上,这就导致了类型错误,编译器肯定会报类似“request for member 'prev' in something not a structure or union”的错误。
正确的等价写法
如果你一定要用.替代->,正确的写法有两种:
- 先对
(*temp).next这个指针解引用,再用.访问prev:(*((*temp).next)).prev - 或者保留
->访问(*temp).next的成员(其实这更简洁):((*temp).next)->prev
本质上,只要记住:指针用->,对象用.,或者先把指针解引用成对象再用.,同时注意运算符优先级——.比*优先级高,所以如果要先解引用指针再访问成员,必须加括号明确顺序。
内容的提问来源于stack exchange,提问作者Saurabh Kapoor
相关产品推荐
相关产品推荐

