假设我定义了这个结构:
struct Point {
double x, y;
};
现在,假设我创建了一个这种类型的动态数组:
Point *P = new Point[10];
为什么我使用P[k].x
andP[k].y
而不是P[k]->x
andP[k]->y
来访问k
-th 点的元素?
我认为您必须使用后者作为指针。
假设我定义了这个结构:
struct Point {
double x, y;
};
现在,假设我创建了一个这种类型的动态数组:
Point *P = new Point[10];
为什么我使用P[k].x
andP[k].y
而不是P[k]->x
andP[k]->y
来访问k
-th 点的元素?
我认为您必须使用后者作为指针。
实际上,您使用p[index].x
andp[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;
因为指向数组的指针等于指向其第一个元素的指针。
因为您创建了一个动态分配的数组来保存Point
对象,而不是Point*
. 您通过以下方式访问每个成员operator[]
:
p[0].x = 42;
为什么我使用 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
通常,箭头->
运算符用于取消引用指针。但在这种情况下,P 是一个点数组。如果 P 是 Point 指针数组,那么您将使用后者
我相信 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
8 bytes
P[0]
x
8 bytes
P[0]
y
P[0]
占用 ADDR-01 到 ADDR-16(16 个字节),因为 adouble
是 8 个字节,x 和 y 都定义为double