Почему у указателя два адреса?

pd адрес переменной, а &pd адрес на другой блок памяти или тип данных? pd храниться в стеке, а &pd в куче?

double* pd = new double;
*pd = 10.3;
cout << "*pd = " << *pd<<endl;
cout << "pd = " << pd << endl;
cout << "&pd = " << &pd << endl;

результат

*pd = 10.3
pd = 00B0D7A0
&pd = 0093FDF8

Ответы (2 шт):

Автор решения: KoVadim

&pd - это адрес ячейки, где хранится сам указатель pd. Логично, что у него другой адрес.

pd хранится скорее всего в стеке (хотя если это переменная-член класса, то может быть и в куче).

То, куда указывает pd (&pd) в данном случае скорее всего хранится в куче (да, можно переопределить new и тогда можно разместить даже в стеке).

"где хранится &pd" - а это выражение, ему не нужно явно хранится, пока его не сохранят.

→ Ссылка
Автор решения: Harry

Какие "два разных адреса"?

cout << "*pd = " << *pd<<endl;

Это значение, находящееся по адресу, хранящемуся в переменной pd.

cout << "pd = " << pd << endl;

Это значение адреса, хранящееся в переменной pd.

cout << "&pd = " << &pd << endl;

Это адрес в памяти, где хранится переменная pd.

Это все - разные значения...

→ Ссылка