(*x).y 与 x->y 相同吗?

Is (*x).y the same as x->y?

是否允许在 C 中使用运算符 -> 而不是 .?它的可用性取决于我们使用的编译器吗? -> 运算符在最新的 C 标准中可用还是来自 C++ 标准?这两者有何不同?

这里有3个运算符,*.->。这很重要,因为 .-> 都有优先级 1,但是 *precedence 2。因此 *foo.barfoo->bar 不同并且需要括号,如 (*foo).bar.

所有都是原始的 C 运算符,并且一直存在。

在一般情况下,是的 - 编译器应该为两者生成相同的代码。但是这些运算符可以被重载,从而具有不同的功能。

在 C 中,c->m 等同于 (*c).m。括号是必需的,因为 . 的优先级高于 *。任何受人尊敬的编译器都会生成相同的代码。

在C++中,除非->*overloaded,否则等价如上。

在 C 中,a->b(*a).b 是 100% 等价的,在 C 中引入 -> 的真正原因是优先级——这样你就不必输入(*a).

中的括号

在C++中,operator *operator ->可以独立重写,所以你不能再说a->b(*a).b在所有情况下都是等价的。但是,当 a 是内置指针类型时,它们是 100% 等价的。

运算符 -> 在 C 中是标准的。 .-> 都允许访问 struct 字段。您应该在 struct 变量上使用 .,在 struct pointer 变量上使用 ->

struct foo {
    int x;
    int y;
}

struct foo f1;
f1.x = 1;
f1.y = 3;
struct foo *f2 = &f1;
printf("%d\n", f1.x);     // 1
printf("%d\n", f2->x);    // 1

*运算符被称为dereference operator和returns指针地址处的值。所以 (*f2).x 等价于 f2->x.