假设我定义了这个结构:
struct Point {
double x, y;
};
现在,假设我创建了一个这种类型的动态数组:
Point *P = new Point[10];
为什么我使用P[k].x
和P[k].y
代替P[k]->x
和P[k]->y
来访问k
点的元素?
我认为你必须使用后者作为指针。
答案 0 :(得分:12)
实际上,您使用p[index].x
和p[index].y
来访问数组中struct
的元素,因为在这种情况下,您使用指针来引用动态分配的数组。 / p>
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;
因为指向数组的指针等于指向其第一个元素的指针。
答案 1 :(得分:1)
因为您创建了一个动态分配的数组,其中包含Point
个对象,而不是Point*
。您可以通过operator[]
访问每个成员:
p[0].x = 42;
答案 2 :(得分:1)
为什么我使用P [k] .x和P [k] .y而不是P [k] - > x和P [k] - > y来访问第k个点的元素?
由于P[k]
不是指针,因此它是k
位置的对象,其类型为Point
,而不是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
答案 3 :(得分:1)
通常,箭头->
运算符用于取消引用指针。但在这种情况下,P是一个Point数组。如果P是一个Point指针数组,那么你将使用后者
答案 4 :(得分:-1)
我相信Q与 C间接
有关在C中,数组名称 IS 是类型变量(指向分配给/的数组的第一个内存位置的指针)
指定索引([n]
的方括号符号)会导致间接。
因此
PointerA behaves like ArrayA
*PointerA behaves like ArrayA[]
对于指针类型的变量,星号(*)是用于 Indirection Operator 的
访问值(存储在其中一个存储位置)
给出原始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
占用ADDR-01到ADDR-16(16个字节),因为P[0]
是8个字节,x和y都定义为double