C++ 结构引用和取消引用运算符

C++ 结构引用和取消引用运算符,c++,C++,假设我定义这个结构: struct Point { double x, y; }; 现在,假设我创建了这种类型的动态数组: Point *P = new Point[10]; 为什么我要使用p[k].x和p[k].y而不是p[k]>x和p[k]>y来访问k-th点的元素 我认为您必须使用后者作为指针。因为您创建了一个动态分配的数组,其中包含点对象,而不是点*。您可以通过操作员[]访问每个成员: p[0].x = 42; 实际上,您可以使用p[index].x和p[index].y来访

假设我定义这个结构:

struct Point {
   double x, y;
};
现在,假设我创建了这种类型的动态数组:

Point *P = new Point[10];
为什么我要使用
p[k].x
p[k].y
而不是
p[k]>x
p[k]>y
来访问
k
-th点的元素


我认为您必须使用后者作为指针。

因为您创建了一个动态分配的数组,其中包含
对象,而不是
点*
。您可以通过
操作员[]
访问每个成员:

p[0].x = 42;

实际上,您可以使用
p[index].x
p[index].y
来访问数组中
struct
的元素,因为在这种情况下,您使用的是指针来引用动态分配的数组

ptr->member
操作符只是
(*ptr.member
的简写。要使用它,您需要在左手边有一个指针:

Point *p = new Point;
p->x = 12.34;
p->y = 56.78;
请注意,即使对于动态分配的数组,
->
操作符也可以工作:

Point *p = new Point[10];
p->x = 12.34;
p->y = 56.78;
这相当于

p[0].x = 12.34;
p[0].y = 56.78;
因为指向数组的指针等于指向其第一个元素的指针

为什么我要使用p[k].x和p[k].y而不是p[k]->x和p[k]->y来访问第k点的元素

因为
p[k]
不是指针,它是位于
k
th位置的对象,其类型是
,而不是
点*
。例如:

Point p = P[0]; // Copy 0th object
p.x; // Access member x
Point* pp = &(P[0]); // Get address of 0th element, equivalent to just P
pp->x; // Access member x

通常,箭头
->
运算符用于取消对指针的引用。但在这种情况下,P是一个点数组。如果P是一个点指针数组,那么您将使用后者

我相信Q与C间接相关

在C语言中,数组名类型的变量(指向分配给数组的第一个内存位置的指针)

指定索引(方括号表示法,
[n]
)会导致间接

因此,

PointerA    behaves like   ArrayA
*PointerA   behaves like   ArrayA[]
对于指针类型的变量,星号(*)是用于

访问值(存储在
内存位置中)


给定原始Q中的代码示例,假设p被分配到内存地址位置
ADDR-01

p
指的是
ADDR-01
而不是存储在
ADDR-01

p[0]
是指
ADDR-01
ADDR-16
中存储的,其中
p[0]
的第一个
8字节
x
,而
p[0]
的第二个
8字节
y


p[0]
占用ADDR-01到ADDR-16(16字节),因为
double
是8字节,x和y都定义为
double

您不使用
p.x
p.y
。试试看。
P.x
P.y
都是错误的。我猜你的意思是
P[0].x
P[1].y
,这就是区别所在。简短的回答
P
可能是一个指针,但
P[0]
不是,它是一个对象。现在,为了好玩,试试这个
Point**P=new Point*[10];p[k]>x=1.0。这是编译的,因为现在有了指针数组,而不是对象数组。