【问题标题】:"." or "->" C struct accessor [duplicate]“。”或“->”C 结构访问器 [重复]
【发布时间】:2017-11-24 07:01:33
【问题描述】:

在访问 C 结构中的数据时,.-> 有什么区别?在我的几次尝试中我找不到任何不同。两者都让我可以访问所需的数据

【问题讨论】:

  • -> 当您尝试从指向 struct 的指针调用 smt 时使用。当你创建对象并调用
  • 如果找不到任何区别,请尝试在不更改任何其他内容的情况下将其中一个替换为另一个,然后查看您的程序是否仍然可以编译 :-)
  • 从字面上看,这两个东西没有任何区别的代码。总是编译失败
  • 您的数据是什么样的?你的结构是什么样的?你能举个最简单的例子吗?
  • 教科书对这些运算符有什么说明?

标签: c struct operators accessor


【解决方案1】:

-> 运算符只是语法糖:

x->y

相同
(*x).y

括号是必需的,因为 . 运算符的优先级高于 * 运算符。

【讨论】:

    【解决方案2】:

    . 与结构一起使用。 -> 与指针(指向结构)一起使用。

    【讨论】:

      【解决方案3】:

      6.5.2.3 结构和联合成员

      约束

      1 的第一个操作数。操作员应具有原子的、合格的、 或不合格的结构或联合类型,第二个操作数应 命名该类型的成员。

      2 -> 运算符的第一个操作数的类型应为“指针” 原子的、合格的或不合格的结构”或“指向原子的指针, 合格或不合格的联合”,第二个操作数应命名为 指向的类型的成员。

      语义

      3 后缀表达式后跟 .运算符和标识符 指定结构或联合对象的成员。价值在于 的命名成员,95) 并且是一个左值,如果第一个表达式是 左值。如果第一个表达式具有限定类型,则结果具有 指定成员类型的 so-qualified 版本。

      4 后缀表达式,后跟 -> 运算符和标识符 指定结构或联合对象的成员。价值在于 对象的命名成员的第一个表达式 点,并且是左值。96) 如果第一个表达式是指向 限定类型,结果具有类型的限定版本 指定的成员。

      【讨论】:

        【解决方案4】:
        struct MyStruct
        {
          int a;
        }
        
        MyStruct *st;
        st->a = 10;
        
        MyStruct st2;
        st.a = 10;
        

        【讨论】:

          【解决方案5】:

          -> 运算符和普通的structs / unions 或任何其他类型之间没有任何联系,除了指向structs / unions 的指针。 -> 正在访问您的指针指向的 struct / union 中的成员。这意味着,在使用成员创建 struct / union 后,. 可以通过 . 访问成员,如果将 pointer 保持在 struct / union 则可以通过 -> 访问

          一个例子:

          // creating one instance of struct s, and a pointer to an instance of struct s. struct s is a struct holding one int called 'data'.
          
          struct s{int data;}struct_s_instance, *struct_s_instance_pointer = malloc(sizeof(struct s));
          struct_s_instance.data = 3;           // access using the '.' operator 
          struct_s_instance_pointer->data = 4;  // pointer access using the '->' operator 
          printf("%d-%d", struct_s_instance.data, struct_s_instance_pointer->data);
          

          您无法使用struct_s_instance_pointer(即struct_s_instance_pointer.data)访问data in struct_s_instance_pointer(即struct_s_instance_pointer.data)或使用struct_s_instance 访问data->(即struct_s_instance->data)。这些是完全不同的东西。

          请注意,当给定一个指针时,例如struct_s_instance_pointer,您可以取消引用它:*struct_s_instance_pointer,然后可以并且应该使用运算符.(*struct_s_instance_pointer).data

          【讨论】:

          • "-> 操作符和结构体、联合体之间没有联系" -- 肯定有
          • @FelixPalmen 如何使用 -> 访问结构(不是指针)中的数据?
          • 如何使用->访问不是结构或联合成员的对象?
          • 我想我遗漏了一些东西,但 -> 仅用于指针。意思是,不使用结构、联合(以及整数、字符等)。我错了吗?
          • -> 是取消引用和成员访问的简写。所以确定它需要一个指针。它要求指针指向structunion,因为只有在结构和联合中,您才能访问成员
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多