You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

指针访问结构体成员疑问:双向链表替代语法报错原因求解

问题解析:双向链表指针访问的语法错误

嘿,我来帮你搞清楚这个问题!你遇到的问题核心是C/C++运算符优先级搞混了,咱们一步步拆解来看:

首先,先明确两种指针访问成员的语法:

  • ptr->member:等价于(*ptr).member,专门用于指针访问结构体/类的成员
  • obj.member:用于直接访问对象(或引用)的成员

你原来的正确写法temp->next->prev,拆解开来是这样的逻辑:

  1. temp是指向链表节点的指针,temp->next → 等价于(*temp).next,得到的是下一个节点的指针(Node*类型)
  2. 接着对这个指针访问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”的错误。

正确的等价写法

如果你一定要用.替代->,正确的写法有两种:

  1. 先对(*temp).next这个指针解引用,再用.访问prev:
    (*((*temp).next)).prev
    
  2. 或者保留->访问(*temp).next的成员(其实这更简洁):
    ((*temp).next)->prev
    

本质上,只要记住:指针用->,对象用.,或者先把指针解引用成对象再用.,同时注意运算符优先级——.比*优先级高,所以如果要先解引用指针再访问成员,必须加括号明确顺序。

内容的提问来源于stack exchange,提问作者Saurabh Kapoor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:05:55