在C语言中同时使用箭头->和点.运算符

17

我原本认为可以通过使用箭头和点操作符一起来访问链表或类似结构中子节点的数据,例如:

typedef struct a{
int num;
struct a *left;
struct a *right;
}tree;

tree *sample;
...
if(sample->left.num > sample->right.num)
    //do something

但是当我尝试实现它时,使用 "->" 和 "." 从子节点访问数据时,我收到了错误消息 "request for member num in something not a structure or union"。

5个回答

37
使用->来操作指针;使用.来操作对象。
在你的具体情况下,你需要...
if (sample->left->num > sample->right->num)
因为所有的samplesample->leftsample->right都是指针。
如果要访问任何这些指针所指向的对象,请使用.代替。
struct a copyright;
copyright = *(sample->right);
// if (sample->left->num > copyright.num)
if (*(sample->left).num > copyright.num)

22

由于我没有看到明确提到:

  • 使用 -> 符号来解引用指针并访问其左侧的成员。
  • 使用 . 来访问其左侧变量的成员

4
我谷歌搜索了“C语言箭头运算符 vs 点运算符”,然后来到了这里。假设这是准确的,那么这是我找到的最清晰简洁的描述。如果有更多 C 语言知识的人能够证实或否认这一点,那就太好了。谢谢。 - Patrick Henning

5

点号(.)用于访问结构体(或联合体)的成员,例如:

struct S {
int x;
}

S test;
test.x;

->是写(*pointer_to_struct).struct_member的缩写形式


5

样例- > left 给出了一个指向 struct a* 的指针,而不是 struct a,因此我们正在处理指针。 因此仍然必须使用 ->

但是,您可以使用 sample->left->num


0

sample->leftsample->right也是指针,所以你需要:

if (sample->left->num > sample->right->num) {
    // do something
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接