【问题标题】:Using arrow -> and dot . operators together in C使用箭头 -> 和点。 C中的运算符一起
【发布时间】:2011-08-16 05:49:25
【问题描述】:

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

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

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

但是当我尝试实现这一点时,使用 -> 和 .要从子节点访问数据,我收到错误“请求非结构或联合中的成员编号”。

【问题讨论】:

    标签: c binary-tree


    【解决方案1】:

    使用-> 作为指针;对对象使用.

    在你想要的具体情况下

    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)
    

    【讨论】:

    • @luiscubal 很好,我看到你在删除之前也发表了评论。感谢您的帮助。
    【解决方案2】:

    因为我没有明确提到它:

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

    【讨论】:

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

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

    不过,您可以使用sample->left->num

    【讨论】:

      【解决方案4】:

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

      struct S {
      int x;
      }
      
      S test;
      test.x;
      

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2013-07-16
          • 1970-01-01
          • 2011-02-04
          • 2012-12-04
          • 2012-04-19
          • 2012-10-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多