Преобразование типов с помощью указателей

Я в недоумении, чтобы понять, как приведение типов работает с указателями

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* ) выражение.

Другие вопросы по тегам