Проверьте, верно ли мое понимание указателя на элемент. Ниже приведен пример класса:Указатель на элемент: указатель и элемент массива
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
Указатель член содержит смещение в памяти, то есть информацию о том, как далеко находится конкретный участник, начинающийся с начала класса, поэтому мы не знаем об этом этот этап , где указатель внутри точек класса. Similary указатель на элемент, который является элементом массива невозможно, так как адрес элемента массива неизвестен:
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
Я предлагаю что вы задаете один вопрос одновременно. Дополнительную информацию о запросе см. В [help] (http://stackoverflow.com/help/asking). –
Так в чем же вопрос, в конце концов? –
Несмотря на имя, указатель на элемент является * не * указателем и не ведет себя так. Не имеет смысла говорить о «той же операции» для обоих типов, так как нет никаких операций, применимых к обоим. Ваши ошибки связаны с попыткой разыменовать его (вы можете только указатели разыменования) и пытаться указать что-то другое, кроме члена (так как только массив является членом, а не его элементами). –