2016-05-24 2 views
1
double d = 1.1; 
double *p = &d; 
cout << *p; 
int i = 1; 
int * q = &i; 
cout << *q; 

В приведенном выше коде, когда мы разыменования указателя p (соиЬ < < * р;), как же компилятор знает размер *p? Я имею в виду, если размер double равен 8, а адрес d начинается с 1000, как компилятор знает, что он должен принимать данные от 1000 до 1007, тогда как для *q это должно занять 4 байта?
как же компилятор знает тип указателя

Поскольку размеры p и q - все 4, я не знаю, как компилятор получает информацию о типе из указателя.

+19

Вы сказали это тип, когда вы указали указатель. – chris

+3

'double * p' является указателем на' double', размер которого известен. Не путайте размер указателя с размером того типа, на который он указывает. –

ответ

3

Чтобы уточнить пост Криса. Когда вы объявляете double *p, вы явно сообщаете компилятору, что «я объявляю указатель, указывающий на двойной». Во время компиляции компилятор тогда помнит, что в каждой части кода, которая ссылается на p (в соответствии с правилами области), p является указателем на double, а по расширению p является указателем на ячейку памяти, размер как двойной. Поэтому везде он видит p, компилятор знает: «p - это указатель на двойной размер double».

+1

Я бы сказал, без лишних усилий. Но, вероятно, подходит OP. – SergeyA

+1

Я согласен, что это чрезмерное упрощение. Но попытка написать, как компилятор C/C++ обрабатывает типы и указатель, вероятно, будет многостраничной длинной статьей. Конечно, я не так хорошо объясняю сложные концепции, так просто. – ShuberFu

+1

Вы можете подтвердить вывод этого типа, пытаясь вывести 'void * p'. Компилятор будет ошибкой, так как он не может определить размер памяти, которую вы хотите разыменовать. Вы должны сначала ввести указатель на указатель, чтобы позволить компилятору разыменовать правильный размер памяти. –

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