Re: Преобразование к типу указателя
От: Сыроежка  
Дата: 31.03.12 17:27
Оценка:
Здравствуйте, b_mike, Вы писали:

_>Здравствуйте. Я новичок.Сейчас пытаюсь разобраться с темой указателей. В книге которую читаю есть пример "выбор данных из памяти с помощью разных указателей"

_>
_>unsigned long L = 0x12345678L;
_>char *cp = (char*)&L;
_>int* ip = (int*)&L;
_>cout<<hex;
_>сout<<"&L = "<<&L<<endl;
_>cout<<"cp = "<<(void*)cp<<"\t *cp = 0x"<<*cp<<endl;
_>сout<<"ip = "<<(void*)ip<<"\t *ip = 0x"<<*ip<<endl;

_>соответственно результат выполнения:
_>&L = 0x1E190FFC 
_>cp = 0x1E190FFC         *cp = 0x78
_>ip = 0x1E190FFC         *ip = 0x5678
_>

_>Когда речь идет о преобразовании обычных типов вроде все ясно(для чего и что происходит).
_>А вот когда вижу
_>
_>char *cp = (char*)&L;
_>int* ip = (int*)&L;
_>

_>Мне не совсем понятно что фактически происходит в преобразовании (char*)&L или (int*)&L. В приведенном выше примере результат программы показывает что адрес L и значение указателей cp и ip фактически одинаково = 0x1E190FFC. Это ведь адрес ячейки памяти, зачем его приводить к типу? При этом как я понимаю что значением указателя ip например, является адрес переменной L и при обращении к ее значению через операцию разыменования (*ip) из 4-х байт переменной L будет выбрано 2 байта информации поскольку указатель имеет тип int. Это демонстрирует и результат программы. Что происходит фактически с адресом &L когда его приводят к типу (char*) или (int*) и происходит ли вообще??? Он ведь остается прежним! Поясните пожалуйста момент приведения к типу указателя. Заранее спасибо.

Адрес остается прежним, но зато меняется интерпретация этих данных по этому адресу, а также меняется арифметика указателей, так как каждый раз вы указываете определенный тип указателя.
Например, если у вас есть предложение из вашего примера


char *cp = (char*)&L;

то ++cp сместиться только на размер байта. То есть вы побайтно сможете анализировать значения, расположенные в исходном объекте.

Другой пример.

int x = -10;
unsigned int *p = ( unsigned int * ) &x;

В этом случае вы уже можете манипулировать значением x через указатель p, как будто бы оно беззнаковое целое число.
Меня можно встретить на www.cpp.forum24.ru
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.