使用箭头 - >和点.C中的运营商

Dan*_*ill 15 c heap binary-tree

我的印象是,可以通过使用箭头和点运算符一起访问链表或类似结构的子节点中的数据,如下所示:

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

tree *sample;
...
if(sample->left.num > sample->right.num)
    //do something
Run Code Online (Sandbox Code Playgroud)

但是当我尝试实现它时,使用 - >和.从子节点访问数据我得到错误"请求成员数字不是结构或联合".

pmg*_*pmg 28

使用->的指针; 使用.的对象.

在你想要的具体情况下

if (sample->left->num > sample->right->num)
Run Code Online (Sandbox Code Playgroud)

因为所有的sample,sample->left以及sample->right是指针.

如果你转换指向对象中的任何指针; 使用.替代

struct a copyright;
copyright = *(sample->right);
// if (sample->left->num > copyright.num)
if (*(sample->left).num > copyright.num)
Run Code Online (Sandbox Code Playgroud)


Mel*_*Mel 10

因为我没有明确提到它:

  • 使用 - > 取消引用其左侧的指针并访问其右侧的成员.
  • 使用 .访问左侧变量右侧的成员.

  • 我在谷歌上搜索了“c 箭头 vs 点运算符”并登陆了这里。假设这是准确的,这是我找到的最清晰、最简洁的描述。如果有更多 C 知识的人可以证实或否认这一点,那就太好了。谢谢。 (2认同)

Sta*_*lis 6

。用于访问结构(或联合)的成员,例如

struct S {
int x;
}

S test;
test.x;
Run Code Online (Sandbox Code Playgroud)

-> 是一种更短的写法 (*pointer_to_struct).struct_member


lui*_*bal 5

Sample->left 给出 a struct a*,而不是 a struct a,所以我们正在处理指针。所以你还是得用->

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