10

假设我定义了这个结构:

struct Point {
   double x, y;
};

现在,假设我创建了一个这种类型的动态数组:

Point *P = new Point[10];

为什么我使用P[k].xandP[k].y而不是P[k]->xandP[k]->y来访问k-th 点的元素?

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

4

5 回答 5

13

实际上,您使用p[index].xandp[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;

因为指向数组的指针等于指向其第一个元素的指针。

于 2012-11-20T15:28:31.777 回答
1

因为您创建了一个动态分配的数组来保存Point对象,而不是Point*. 您通过以下方式访问每个成员operator[]

p[0].x = 42;
于 2012-11-20T15:27:32.547 回答
1

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

因为P[k]不是指针,所以它是第 th 位置的对象,k的类型是Point, not Point*。例如:

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
于 2012-11-20T15:30:08.230 回答
1

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

于 2012-11-20T15:30:38.463 回答
-1

我相信 Q 与C 间接相关

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

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

因此,

PointerA    behaves like   ArrayA
*PointerA   behaves like   ArrayA[]

对于指针类型的变量,星号 (*) 是用于的间接运算符

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


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

P不是指ADDR-01存储在其中的内容 ADDR-01

P[0]指在第一个存在和第二个存在中存储的内容 ADDR-01ADDR-168 bytesP[0]x8 bytesP[0]y

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

于 2019-03-01T20:02:25.380 回答