C语言中如何仅用.、*和()替代嵌套->运算符访问结构体成员
核心问题解答
1. a->b->c->d的等价写法
C语言中->是语法糖,p->member完全等价于(*p).member。多级箭头只需从左到右逐层展开即可,因此a->b->c->d的等价写法为:
(*(*(*a).b).c).d
展开逻辑:
- 第一步:
a->b→(*a).b - 第二步:上述结果为指针,接
->c→(*(*a).b).c - 第三步:上述结果为指针,接
->d→(*(*(*a).b).c).d
2. 两种错误写法的原因解释
错误写法1:(*_liste).(*first)
C语言规定.运算符右侧必须是结构体/联合体的成员名标识符,不能是任意表达式。你写的(*first)是解引用表达式,不符合.的语法规则,会直接触发编译错误。
错误写法2:*(*_liste).first
运算符优先级.高于*,这个表达式的计算顺序是:
- 计算
(*_liste)得到Liste*类型的指针 - 取成员
first得到Element*类型的指针 - 对
Element*指针解引用,得到Element类型的值
你最终得到的是first指向的元素的值,不是first指针本身,自然不能用来给first赋值。
3. 不使用->的正确写法
你的场景中_liste是Liste**二级指针,要访问Liste结构体的成员,只需先两层解引用拿到结构体实例,再用.取成员即可:
// 给first赋值为NULL (**_liste).first = NULL; // 给last赋值为NULL (**_liste).last = NULL; // 给length赋值为0 (**_liste).length = 0; // 操作test_for_more_fun指向的int值 *((**_liste).test_for_more_fun) = 123;
如果first改为二级指针Element** first,需要给first指向的Element*赋值的话写法如下,逻辑完全一致:
*((**_liste).first) = xxx;
内容的提问来源于stack exchange,提问作者Plaikeeaan
相关产品推荐
相关产品推荐

