Здравствуйте, 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, как будто бы оно беззнаковое целое число.