将嵌套的 -> 运算符替换为 . C 中的和 * 运算符
Posted
技术标签:
【中文标题】将嵌套的 -> 运算符替换为 . C 中的和 * 运算符【英文标题】:Replace nested -> operator with . and * operators in C 【发布时间】:2021-08-28 20:44:55 【问题描述】:基本上,我的问题可以概括为“在 C 中只有 .
、*
和 ()
相当于 a->b->c->d
是什么?”
我正在练习用 C 语言创建一个链表,以重现 Python 列表的一些行为并更好地理解该语言。我有一个基本结构来控制我的列表
typedef struct _list
Element* first;
Element* last;
int length;
int* test_for_more_fun;
Liste;
然后在我的 main() Liste* liste=NULL;
中声明一个空指针,并发送他的地址以便能够修改它指向 init(&liste);
的内容。
然后init()
分配内存
void init(Liste** _liste)
*_liste=(Liste*)malloc(sizeof(Liste));
(**_liste).test_for_more_fun=(int*)malloc(sizeof(int));
然后我想访问字段 first、last 和 length,我发现这样做的方法
(*_liste)->first=NULL;
_liste[0]->last=NULL;
但是,假设 first 和 last 也是指针的指针,我不确定这个技巧是否仍然有效,所以我问自己:如果没有->
,我该怎么办?我浏览了网页没有答案,C 编程语言书页 118 说
括号在 (*pp).x 中是必需的,因为结构成员 operator 的优先级。高于*。表达式 *pp.x 表示 *(pp.x),这里是非法的,因为 x 不是指针。
所以我尝试了(*_liste).(*first)
,因为()
运算符具有与->
相同的优先级,我希望它可以工作但没有,*(*_liste).first
,但又不起作用。谁能解释一下为什么这两种方法不起作用,正确的方法是什么?
最好的问候
【问题讨论】:
Liste* liste=NULL;
不是空指针
【参考方案1】:
(*_liste).(*first)
不起作用,因为.(*first)
不是 C 中的有效语法。
*(*_liste).first
不起作用,因为.
运算符的优先级高于*
运算符,它尝试读取*_liste
的成员,这是一个指针Liste*
,并且没有任何成员。
A->B
表示(*A).B
,所以(*_liste)->first
可以写成(*(*_liste)).first
。你可以去掉内括号,写成(**_liste).first
。
这也可以说_liste
是指向Liste
的指针,所以要解引用两次才能得到结构体Liste
。
【讨论】:
好的,谢谢,我明白了。但是让我们假设我在Liste
中有一个int* test
,因为.(*test)
无效,我该如何访问它?我可以声明一个int* value = (**_liste).test;
,然后使用价值,但没有更好的方法吗?
*(**_liste).test
?以上是关于将嵌套的 -> 运算符替换为 . C 中的和 * 运算符的主要内容,如果未能解决你的问题,请参考以下文章