C 什么';p.a和p->;的区别是什么;其中p是指针?

C 什么';p.a和p->;的区别是什么;其中p是指针?,c,pointers,C,Pointers,p.a和p->a有什么区别吗?p是指针?或者它们只是相同的东西。是的,您不能对指针执行p.a,点运算符需要实际实例,即正确的结构类型的值 请注意,“在引擎盖下,p->a相当于(*p).a,但更易于键入和阅读。没有人使用后一种形式,但它有时很方便,可以用来理解箭头运算符的作用。如果p是指针,那么p.a是无效语法。试试(*p)。a或(&p)->a其中p分别是指针和实例;-) 这是编译时错误。。p->a仅有效。操作符实际上是结构成员访问的操作符 struct Foo { int bar;

p.a和p->a有什么区别吗?p是指针?或者它们只是相同的东西。

是的,您不能对指针执行
p.a
,点运算符需要实际实例,即正确的
结构类型的值


请注意,“在引擎盖下,
p->a
相当于
(*p).a
,但更易于键入和阅读。没有人使用后一种形式,但它有时很方便,可以用来理解箭头运算符的作用。

如果p是指针,那么p.a是无效语法。

试试(*p)。a或(&p)->a其中p分别是指针和实例;-)

这是编译时错误。。p->a仅有效。

操作符实际上是结构成员访问的操作符

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.a
不应该起作用。您应该从编译器中得到一个警告/错误。@RedX-这不完全正确
p
可以是智能指针,
a
可以是它的某个公共方法/成员。然后,例如,
p.operator->()
将非常好。@Kiril是的,这可能是真的。所以我可以重新措辞
p.a
不适用于指针,但
p->a
可能适用于重载
operator->
的实例。他还特别问
p
什么时候是指针。@Kiril Kirov:你看到
C++
标记了吗?我不。C或智能指针中没有运算符重载。@JeremyP-Ohhh,该死,我知道我遗漏了什么。对不起,我没有看到,这是
C
,不是
C++
,我知道在C中没有智能指针,也没有运算符重载(:如果p是地址,我可以理解这样的事情吗?我们使用p->a或(*p)。a,如果p是实例,我们使用p.a或(&p)->aBetter:if pointer使用
p->a
;if instance
p.a
。99.9%的时间都是这样做的。@Alan-
p=&aFoo
,但是在这里,
*
是因为声明。它相当于:
struct Foo*p;p=&aFoo;
@Alan:抱歉。这行声明了一个指针并初始化指向add的指针前一个结构变量的ress。我将编辑答案,使发生的事情更加明显。