将嵌套的 -> 运算符替换为 . 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 中的和 * 运算符的主要内容,如果未能解决你的问题,请参考以下文章

Python递归替换嵌套字典键中的字符?

递归替换字典中的字符

将一个分隔的 id 字段转换为它们的漂亮值 - 嵌套替换是最佳选择吗?

002-小白学python-运算符/判断/循环

[SHOI2017]相逢是问候

如何用C语言求1至100所有素数的和?