指向成员的指针:指针和数组元素

时间:2013-11-06 17:13:54

标签: c++

请验证我对指向成员的指针的理解是否正确。这是一个示例类:

class T
{
public:
       int *p;
       int arr[10];
};

对于opartions之后的“标准”指针很常见:

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

1 个答案:

答案 0 :(得分:1)

首先,首先使用dereference + address of operator是没有意义的,并且它可能导致未定义的行为(例如,如果指针为null)。所以答案的前半部分是你首先不应该

答案的第二部分是指向成员的指针不是指针,而是一种在给定对象的情况下访问成员的机制。即使他们在名字中共享指针单词,它们也是完全不同的野兽,你不能取消引用指向成员的指针,不能创建副本,不得出于任何其他原因或在任何其他上下文中

关于指向存储在对象中的数组成员的指针,问题是该数组成员是您的类型的成员,而是该数组的成员。问题不在于位置是未知的,编译器是众所周知的,它是数组与完整对象的偏移量,它是数组中数组元素的偏移量,编译器确实知道如何添加

从最后三个例子中,前两个只是简单易懂的解释。给定类型T(无论是什么)和该类型的对象t,您可以通过获取对象的地址来创建T*&tT是一个类,一个指针,一个指向成员的指针,枚举......根本不重要。

最后,最后一个案例再次简单。给定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;