指针p.a和p->a有什么区别吗?或者它们只是同一件事情。
.
运算符实际上是结构体成员访问的运算符。 < /p >
struct Foo
{
int bar;
int baz;
} aFoo;
aFoo.bar = 3;
.
运算符来访问其成员。struct Foo *p;
p = &aFoo;
(*p).baz = 4;
.
的优先级高于 *
。以上代码解引用指向结构体的某个成员非常常见,因此引入了->
作为一种简写方式。p->baz = 4; // identical to (*p).baz = 4
如果p是指针,在普通的C语言中你不会看到p.anything
,至少在任何可以编译通过的地方不会。然而,在Objective-C中,它被用来表示属性访问,我认为这是一个错误。
p = &aFoo
,但这里的 *
是因为声明。它等同于:struct Foo *p; p = &aFoo;
- Kiril Kirov是的,您不能在指针上执行p.a
操作符,因为点操作符需要一个实际的实例,即适当的struct
类型的值。
请注意,“在底层”,p->a
等同于(*p).a
,但更易于键入和阅读。没有人使用后一种形式,但有时它作为理解箭头操作符的方式很方便。
p->a
;如果使用实例,则使用 p.a
。这是99.9%的情况下的做法。 - RedX这是编译时错误... 只有 p->a 是有效的。
p.a
的代码应该无法运行,你的编译器应该会提示错误或警告。 - RedXp
可能是智能指针,而a
可能是它的某个公共方法/成员。那么,例如,p.operator->()
就会非常好。 - Kiril Kirovp.a
对于指针是不起作用的,但是对于重载operator->
的实例,p->a
可能会起作用。他也特别询问了当p
是一个指针时的情况。 - RedXC++
标签吗?我没有。在C语言中没有运算符重载或智能指针。 - JeremyPC
,而不是C++
,我知道在 C 中没有智能指针和运算符重载 (: - Kiril Kirov