指向成员的指针:指针和数组元素
pointer to member: pointer and array element
请验证我对指向成员的指针的理解是否正确。下面是一个示例类:
class T
{
public:
int *p;
int arr[10];
};
对于"标准"指针,以下 opartes 很常见:
int a = 1;
int *p1 = &a;
int *p2 = p1 (other notation: int *p2 = &*p1);
//The pointer p2 points to the same memory location as p1.
指向成员的指针的上述操作是不可能的:
int T::*pM = &(*T::p); // error
指向成员的指针在内存中包含偏移量,即放置多远的信息从课程开始开始的特定成员,所以我们不知道类内的指针指向的阶段。类似地,指向数组元素的成员的指针是不可能的,因为数组元素的地址是未知的:
int T::*pM = &T::arr[5]; //error
但以下操作是正确的:
int* T::*pM = &T::p; //a pointer to a pointer
//the same operation for "standard" pointers:
int **p3 = &p2;
int (T::*pM)[10] = &T::arr; //a pointer to an array
首先,首先使用运算符的取消引用+地址并没有真正的意义,并且在某些情况下可能会导致未定义的行为(例如,如果指针为null)。所以答案的前半部分是你不应该首先
。答案的第二部分是,指向成员的指针不是指针,而是在给定对象的情况下访问成员的机制。即使它们在名称中共享指针词,它们也是完全不同的野兽,您不能取消引用指向成员的指针,不能创建副本,也不能出于任何其他原因或任何其他上下文。
关于指向存储在对象中的数组成员的指针,问题是该数组成员不是您的类型的成员,而是数组的成员。问题不在于位置未知,编译器非常清楚哪个是数组与完整对象的偏移量,哪个是数组中数组元素的偏移量,编译器确实知道如何添加。
从最后三个例子来看,前两个解释起来非常简单。给定一个类型T
(不管是什么)和一个t
该类型的对象,您可以通过获取对象的地址来创建T*
:&t
。无论T
是类、指针、指向成员的指针、枚举......根本不重要。
最后,最后一个案例又很简单了。给定类 C 和该类中类型 T 的成员 m,始终可以使用语法创建指向引用m
的成员的指针:T C::*ptr = &C::m;
。现在 C 和 C++ 中的类型语法很复杂,当类型 T
是一个数组时,类型会像 X (C::*ptr)[5]
一样溢出到两侧,但这与更简单的阅读没有什么不同:
typedef int int5[5];
int5 T::*pM = &T::arr;
- 删除指针数组 (C++) 中的元素
- 存储指向动态数组元素的指针
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- 使用指针访问数组元素时出现意外结果
- 如何获取指针数组中的元素数量?
- C++如何通过超出大小将元素添加到指针数组中
- 整数指针数组的元素是否可以指向整数数组?
- 如何取消引用和打印指针数组的每个元素?
- 在C++中将指针数组的所有元素设置为 nullptr
- 删除 c++ 中指针数组的每个元素所指向的相应元素
- 指针数组.获取指针元素的值
- 如何使用指针更改数组元素
- 通过指针访问数组元素
- 字符指针对象和相应的字符数组元素比较
- 指向数组的指针会更改数组元素的值
- C++如何使用指针来循环移位数组元素
- 取消引用指针数组中的一个元素
- 我怎么知道基类对象的指针数组中元素的类型,它将为派生类分配内存
- 从 C++ 数组元素的指针获取索引的最快方法是什么
- C++:指向对象的指针数组 - 删除元素时程序崩溃>