可能是重复问题:
为什么C语言有->和.的区别?
假设我有这个结构体:
struct movies
{
string title;
int year;
} my_movie, *ptrMovie;
现在我这样访问
my_movie
:my_movie.year = 1999;
。现在要访问指针,必须这样做:ptrMovie->year = 1999;
为什么指针使用->
运算符,而普通数据类型使用.
运算符?它们不能都使用.
运算符吗?可能是重复问题:
为什么C语言有->和.的区别?
假设我有这个结构体:
struct movies
{
string title;
int year;
} my_movie, *ptrMovie;
my_movie
:my_movie.year = 1999;
。现在要访问指针,必须这样做:ptrMovie->year = 1999;
为什么指针使用->
运算符,而普通数据类型使用.
运算符?它们不能都使用.
运算符吗?点运算符(.)用于访问结构体的成员,只能操作结构体变量。
如果您想对指针执行此操作,您需要先解引用指针(使用*
),然后访问成员(使用.
)。类似以下代码:
(*ptrMovie).year = 1999
< p > ->
运算符是对此的简写。< /p >
class
关键字创建一个结构体。然而,有些类不是结构体,它们是联合体,并且成员访问运算符也可以用于这些类。 - Ben Voigt.
运算符仅适用于结构体或类。指针不是结构体或类,因此您需要对指针进行解引用,以获取它所指向的结构体/类,如下所示。(*ptrMovie).year
.
的优先级高于解引用运算符*
,因此您需要在括号中包含解引用操作。或者您可以这样做。ptrMovie->year
两者是等价的。'->'运算符是对指针进行解引用,然后访问结构体成员的一种快捷方式。在我的意见中,这种方式打字更少,使用起来更加友好。显然,大多数人都同意我的看法,因为这是我所见过的大多数代码中从指向结构体的指针访问结构体成员的标准方式。当您需要进行多级间接访问时,您会特别感激这种差异:
ptrToStruct->memberPtr->subMemberPtr->subsubPtr->subsubsubPtr->x
(*(*(*(*(ptrToStruct).memberPtr).subMemberPtr).subsubPtr).subsubsubPtr).x
这两个语句是等价的,但第一个更易于处理。
union
怎么样?实际上,它适用于所有类(这些类是由 class
、struct
或 union
类键引入的类型)。 - Ben Voigt->
这让我想起了一个指向某个东西的箭头,所以我认为使用->很好。
与其输入(*myPointer).
,使用myPointer->
更加简单。
operator->
需要与运算符operator.
区别开来。对于实现智能指针类,operator->
必须可重载以委托到所指向的对象,但operator.
必须是独立且不可重载的,以允许访问智能指针对象本身的方法。 - jamesdlin