怎么做“ - >”和“。”成员访问操作在C中有所不同

时间:2010-08-06 13:15:21

标签: c

我已经查看了一些资源,告诉我->.是如何不同的,但它们似乎做同样的事情。 ->是否像结构上的点运算符一样?

10 个答案:

答案 0 :(得分:17)

当你有一个结构时使用

.,当你有一个指向结构的指针时使用->。箭头是用于取消引用指针然后使用.的简短形式:p->field(*p).field相同。

答案 1 :(得分:7)

它们几乎是一回事。唯一的区别是“ - >”在“。”的同时获取指向左侧结构的指针。采取结构; “ - >” 中在访问struct成员之前的指针的deferences(即跟随)。所以,

struct foo bar;
bar.x = 0;

与:

相同
struct foo bar;
struct foo *diddly = &bar;
diddly->x = 0;

答案 2 :(得分:2)

您在访问对象的成员时使用了一个点,并且箭头 - >通过指向对象的指针访问成员时

答案 3 :(得分:2)

->是一个结构指针,.是一个结构。

struct Data data;
data.content = 1;

struct Data* pData = &data;
pData->content = 2;

答案 4 :(得分:2)

啊,我在查看区域设置时遇到了同样的问题。一个用于通过指针访问属性,一个用于解除引用的结构:

#include <locale.h>

int main (void) {

    struct lconv *locale_ptr; 
    locale_ptr = localeconv();
    printf("Currency symbol: %s\n", (*locale_ptr).currency_symbol);
}

相当于:

int main (void) {

    struct lconv *locale_ptr; 
    locale_ptr = localeconv();
    printf("Currency symbol: %s\n", locale_ptr->currency_symbol);
}

答案 5 :(得分:1)

最简单的就是你使用。在Struct本身上操作时 - &gt;当操作指向结构的指针时。

在代码中显示:

  struct s myStruct;
  myStruct.num = 5;

有效,但是:

  struct s myStruct;
  myStruct->num = 5;

无效,因为myStruct不是指针。

  struct s *myStruct;
  myStruct->num = 5;

有效。

- &gt; operator实际上是(* myStruct).num的简写;

答案 6 :(得分:1)

与许多其他语言不同,C语言允许变量将对象(此处为结构)作为值,并将对象指针作为值。根据使用的变量类型,“。”或“ - &gt;”必须分别使用。

答案 7 :(得分:1)

[。] 对结构的对象进行操作。一旦声明了特定结构的对象,[。]运算符就可以用于直接与成员一起操作。

[ - &gt;] 对指向结构对象的指针进行操作。这是一个取消引用运算符,专门用于指向具有成员的对象的指针。从而使我们能够访问我们有参考对象的成员。

根据声明,您可以使用这些运算符。

答案 8 :(得分:0)

算子a-> b,规范地表示(* a).b。 因此,与“。”不同,它将取消引用它的第一个参数。

我在这一点上可能是错的,但我的理解是它不是“正式”C的一部分(你在问题中特别提到C)。这是C ++构造,大多数C编译器供应商已经添加到C中。但是,我必须承认我没有跟上C的变化,所以我可能完全错了。

在C ++中还有其他差异。 “ - &gt;”运算符是可重载的,其中“。”不是。

答案 9 :(得分:0)

C中都使用

来访问类的成员。但是

  • .不可重载,
  • 可重载

下面是一个示例,展示了如何同时使用它们:

#include<iostream>
class A {
   public: int b;
   A() { b = 5; }
};

int main() {
   A a = A();
   A* x = &a;
   std::cout << "a.b = " << a.b << "\n";
   std::cout << "x->b = " << x->b << "\n";
   return 0;
}