结构引用和解引用运算符

时间:2012-11-20 15:25:26

标签: c++

假设我定义了这个结构:

struct Point {
   double x, y;
};

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

Point *P = new Point[10];

为什么我使用P[k].xP[k].y代替P[k]->xP[k]->y来访问k点的元素?

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

5 个答案:

答案 0 :(得分:12)

实际上,您使用p[index].xp[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-01ADDR-16中的8 bytes的第一个P[0] },而x中的第二个8 bytesP[0]

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