Получение адреса указателя - PullRequest
7 голосов
/ 22 июля 2011

Мои извинения, я знаю, что есть миллион вопросов об указателях, массивах и т. Д., Хотя я и не могу найти ничего, что указывало бы (ха-ха!) На ответ.

У меня есть указатель, который инициализирован, чтобы указывать на кусок памяти, я понимаю, что могу получить доступ к этой памяти подобно тому, как я бы сделал массив:

char *mMem=new char[5000];
cout<<mMem[5]<<endl;

Что на самом деле:

char *mMem=new char[5000];
cout<<*(mMem+5)<<endl;

Однако я не понимаю, как получить адрес элемента - я знаю, что элемент не совсем верное слово, учитывая, что mMem не является массивом - это если мой понимание правильное, хотя и не может быть слишком уверенным, потому что кажется, что каждый сайт использует любые слова, которые он хочет, когда дело доходит до указателей и массивов. Итак, если у меня есть:

char *mMem=new char[5000];
cout<<mMem[5]<<endl;
    or
cout<<*(mMem+5)<<endl;

почему адрес оператора не работает правильно:

cout<<&mMem[5]<<endl;

Вместо того, чтобы получить адрес 5-го элемента, я получаю распечатку содержимого блока памяти с этого элемента и далее. Итак, почему адрес оператора не работал так, как я ожидал, и как я могу получить адрес элемента памяти?

Ответы [ 2 ]

14 голосов
/ 22 июля 2011

&mMem[5] - это адрес 5-го элемента. Причина, по которой вы получаете оттуда распечатку памяти, заключается в том, что они имеют тип &mMem[5], равный char*, но строки в устаревшем C также имеют значение char*, поэтому оператор << просто думает, что вы хотите напечатать строка оттуда. Я бы попробовал навести указатель на void* перед печатью:

cout << static_cast<void*>(&mMem[5]) << endl;

Кстати, &mMem[5] и mMem+5 - это одно и то же.

4 голосов
/ 22 июля 2011

Вы получаете адрес элемента 5, как и ожидалось, но функция печати cout для char * заключается в печати содержимого строки в этой ячейке памяти, а не значения указателя.

Приведите указатель на int: cout << (int)&mMem[5];, и вы должны напечатать адрес.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...