C++ 结构引用和取消引用运算符
假设我定义这个结构:C++ 结构引用和取消引用运算符,c++,C++,假设我定义这个结构: struct Point { double x, y; }; 现在,假设我创建了这种类型的动态数组: Point *P = new Point[10]; 为什么我要使用p[k].x和p[k].y而不是p[k]>x和p[k]>y来访问k-th点的元素 我认为您必须使用后者作为指针。因为您创建了一个动态分配的数组,其中包含点对象,而不是点*。您可以通过操作员[]访问每个成员: p[0].x = 42; 实际上,您可以使用p[index].x和p[index].y来访
struct Point {
double x, y;
};
现在,假设我创建了这种类型的动态数组:
Point *P = new Point[10];
为什么我要使用p[k].x
和p[k].y
而不是p[k]>x
和p[k]>y
来访问k
-th点的元素
我认为您必须使用后者作为指针。因为您创建了一个动态分配的数组,其中包含
点
对象,而不是点*
。您可以通过操作员[]
访问每个成员:
p[0].x = 42;
实际上,您可以使用
p[index].x
和p[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;
因为指向数组的指针等于指向其第一个元素的指针
为什么我要使用p[k].x和p[k].y而不是p[k]->x和p[k]->y来访问第k点的元素
因为p[k]
不是指针,它是位于k
th位置的对象,其类型是点
,而不是点*
。例如:
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是一个点指针数组,那么您将使用后者我相信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
中存储的,其中p[0]
的第一个8字节
为x
,而p[0]
的第二个8字节
为y
p[0]
占用ADDR-01到ADDR-16(16字节),因为double
是8字节,x和y都定义为double
您不使用p.x
和p.y
。试试看。P.x
和P.y
都是错误的。我猜你的意思是P[0].x
和P[1].y
,这就是区别所在。简短的回答P
可能是一个指针,但P[0]
不是,它是一个对象。现在,为了好玩,试试这个Point**P=new Point*[10];p[k]>x=1.0代码>。这是编译的,因为现在有了指针数组,而不是对象数组。