2015-12-07 3 views
0

Пока я читал C++ Primer, нашла этот пример, который я не понимаюРазница между указателем инициализациями

double dval; 
double *pd = &dval; //ok:initializer is the address of a double 
double *pd2 = pd; // ok:initializer is a pointer to double 

не должен *pd2 быть указателем на указатель, поскольку *pd является указатель как хорошо? Может ли кто-нибудь объяснить, что происходит в фоновом режиме с адресами памяти (что назначено pd2)?

+1

адрес x == указатель на x – emlai

+0

'* pd' не является указателем. '* pd' является выражением типа' double'. 'pd' - указатель. –

ответ

1

не должны *pd2 быть указателем на указатель, поскольку *pd является указателем как хорошо?

Номер pd2 присваивается значение, которое в настоящее время удерживает pd. Таким образом, pd2 заканчивается, указывая на dval. Вы должны использовать только указатель на указатель, если вы хотите pd2 к точке pd сам, а не то, что pd указывает на, например:

double dval; 
double *pd = &dval; 
double **pd2 = &pd; 

Может кто-нибудь объяснить, что происходит в фоновом режиме, с адресами памяти (что назначено pd2)?

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

double dval; 
uintptr_t pd = address of dval; 
uintptr_t pd2 = pd; 

Вы просто назначая одно значение указателя (число) как есть в другой указатель (число) переменная.

1

Значение pd2 предназначено для него, то есть адрес dval, который был сохранен как значение pd и присвоен первому.

1

Указатель - адрес памяти. double *pd2 = pd; присваивает один указатель другому указателю. Никакой магии, просто простая операция назначения. Оба указателя указывают на один и тот же адрес памяти.

Значение в pd2 такое же значение, как в pd. если вы хотите разыменовать либо pd, либо pd2, вы получите значение, хранящееся в dval.

Присвоение &pd потребует указателя на указатель, так как вы берете адрес указателя.

0

Сначала вы объявляете двойной dval, тогда вы объявляете указатель, который указывает на этот двойник (потому что его задает двойной адрес &dval). Затем второй указатель устанавливается равным первому указателю. Итак, наконец, у вас есть:

pd = pd2 = &dval 

Каких два указателя, указывающий на тот же адрес, не указатель, указывающий на другой указатель.

Смежные вопросы