Как получить адрес значения, на который указывает указатель - PullRequest
2 голосов
/ 03 июня 2009

У меня есть указатель на int.

int index = 3;
int * index_ptr = &index;

index_ptr является переменной-членом класса IndexHandler.

класс A имеет стандартный индексный вектор IndexHandlers, Avector. класс B имеет указатель std :: vector на IndexHandlers, Bvector, который я установил, чтобы он указывал на элементы в векторе класса A, таким образом:

Bvector.push_back(Avector[i].GetPtr())

Со мной так далеко?

Я хочу проверить, что когда я разрешаю указатели в Bvector и получаю внутренние IndexHandlers index_ptr, они указывают на тот же index_ptr, что и класс A ...

Как я могу проверить, что они указывают на один и тот же адрес памяти? ... Как напечатать адрес значения, на которое указывают оба набора указателей?

Ответы [ 5 ]

3 голосов
/ 03 июня 2009

Чтобы напечатать адрес указателя int и значение int, на которое указывает указатель int, используйте

printf("%p %i\n", ptr, *ptr);
2 голосов
/ 03 июня 2009

метод без итераторов, чтобы выводить их рядом:

for (size_t i = 0; i < Avector.size(); i++)
{
  std::cout << "Avector ptr:" << Avector[i].GetPtr() << ", Bvector ptr:" << Bvector[i] << std::endl;
}

Это напечатает значения указателя каждого из них.

Одна вещь, которую вы должны знать, хотя. Если указатель в IndexHandler указывает на значение в IndexHandler, то при изменении размера вектора он может стать недействительным, а указатели на что-либо выше индекса БУДУТ недействительными, если элемент вставлен или удален по этому индексу. Из-за этого, как правило, плохая идея хранить указатели на элементы в векторе, и если вы хотите это сделать, лучше вместо этого использовать контейнер std :: list (который не делает недействительными указатели на элементы в списке, когда Вы вставляете или удаляете новые значения)

1 голос
/ 03 июня 2009

Как я могу проверить, что они указывают на тот же адрес памяти?

if (index_ptr1 == index_ptr2)
{
  // They point to the same address
}
else
{
  // They don't
}
1 голос
/ 03 июня 2009

Очень простой способ сделать это - использовать printf. Как это:

printf("A = %p, B = %p", (void *)A, (void *)B);

Выше предполагается, что A и B являются типами указателей.

0 голосов
/ 17 сентября 2012

Внутри класса:

//from this to uint value
void*   me=(void*)this;
uint* me_pAddress=(uint*)&me;
uint ThisAddress=*me_pAddress; //address value of 'this' pointer

//from uint value to this pointer
void*** me_ppAddress=(void***)&ThisAddress;
myClass* thisPointer=(myClass* )(*me_ppAddress);
thisPointer->myFunction();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...