Преобразование типов с помощью указателей
Я в недоумении, чтобы понять, как приведение типов работает с указателями
double x = 0.7;
int *ptr = (int *)&x;
Что происходит с *(байт ) & x? & x означает адрес переменной x. Тогда что означает типизация адреса? Может теперь ptr также относится к x? И если да, то не потеряем ли мы данные?
И каков размер ptr?
2 ответа
Давайте немного реорганизовать ваш код:
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int i;
double d = 0.7;
unsigned char* c = (unsigned char*)&d;
for (i = 0; i < sizeof(d); i++) {
printf("%x ", c[i]);
}
unsigned int* n = (unsigned int*) &d;
printf("\n%x", *n);
return 0;
}
Программа выше выводит что-то вроде этого:
$ ./test.exe
66 66 66 66 66 66 e6 3f
66666666
Тогда что означает типизация адреса? Может теперь ptr также относится к x? И если да, то не потеряем ли мы данные?
По сути, вы берете &d, который является двойным * и конвертируете его в int*. Делая это, вы интерпретируете все, что находится в памяти в &d, в int. Это не простой тип, который вводит тип double с типом int, а скорее переосмысление всей схемы памяти. Это может иметь разные выходные данные на разных машинах в зависимости от их архитектуры (32/64 бита) и порядкового номера.
Строка принимает адрес переменной x
и хранит это значение для ptr
, Вы должны разыграть присваивание, потому что это присвоение double* для int* не разрешено.
Разыменованием ptr
после назначения вы нарушаете правила псевдонимов и заставляете вашу программу отображать неопределенное поведение.
Размер ptr
равен результату от sizeof( ptr )
или же sizeof( int* )
выражение.