假设我定义了这个结构:
struct Point {
double x, y;
};
现在,假设我创建了一个这种类型的动态数组:
Point *P = new Point[10];
为什么我使用P[k].xandP[k].y而不是P[k]->xandP[k]->y来访问k-th 点的元素?
我认为您必须使用后者作为指针。
假设我定义了这个结构:
struct Point {
double x, y;
};
现在,假设我创建了一个这种类型的动态数组:
Point *P = new Point[10];
为什么我使用P[k].xandP[k].y而不是P[k]->xandP[k]->y来访问k-th 点的元素?
我认为您必须使用后者作为指针。
实际上,您使用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;
因为指向数组的指针等于指向其第一个元素的指针。
因为您创建了一个动态分配的数组来保存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-01ADDR-168 bytesP[0]x8 bytesP[0]y
P[0]占用 ADDR-01 到 ADDR-16(16 个字节),因为 adouble是 8 个字节,x 和 y 都定义为double