我正在学习C ++中的指针,我注意到如果我声明一个结构指针,我必须使用箭头成员运算符( - >)来访问这些值。这是一个例子。
client * cp = new client;
cp->age = 30;
如果我声明一个动态结构数组,我可以使用点运算符而不是成员运算符,如下所示:
client * cp = new client[10];
cp[1].age = 30;
如果我声明一个动态结构数组,为什么我可以使用点运算符而不是成员运算符?
答案 0 :(得分:3)
因为它们的类型不同。在您的第一个示例中cp
是client*
,因此您使用operator->()
。在第二个示例中,cp[1]
是client&
,因此您使用operator.()
。
如果你有:
client** cp;
然后你会使用:
cp[1]->age = 30;
答案 1 :(得分:0)
[n]
使用指针数学来获取数组中元素n
的实例。
换句话说:
client * cp = new client[10];
cp[1].age = 30;
相当于:
client * cp = new client[10];
*(cp+1).age = 30;
现在,如果你愿意,你也可以这样做:
client * cp = new client[10];
(cp+1)->age = 30;
所有这三个都是相同的,它们只是不同的写作方式。
答案 2 :(得分:0)
如果foo
的类型为*STRUCT
,STRUCT[]
或STRUCT[SOME_SIZE]
,则访问成员时需要使用一个间接(带前缀的星号)运算符。但是,有两种简写符号隐含地包含星号。符号foo->bar
将等同于(*foo).bar
;概念foo[bar]
将等同于*(foo+bar)
。因此,foo[bar].boz
和(foo+bar)->boz
都相当于*((foo+bar)).boz
。概念foo[bar]->boz
等同于(**(foo+bar)).boz
,但仅当foo
类型为**STRUCT
,*STRUCT[]
或{{1}时才适用这需要两个间接运算符。