Может кто-нибудь объяснить следующий тип приведения в C? - PullRequest
2 голосов
/ 28 апреля 2020

У меня следующий фрагмент кода. Я пытаюсь понять, почему мы используем приведение типов с *(uint8 *) вместо просто *(uint8_t)?

  • Разве *(uint8_t *)value не читается как: value это ptr для uint8_t ptr и
  • не *(uint8_t)value читается как: value - это ptr к uint8_t

Я просто немного смущен этими двумя. Любое объяснение высоко ценится.

uint8_t  read_8_function(uint8_t *addr);
uint16_t read_16_function(uint16_t *addr);
uint32_t read_32_function(uint32_t *addr);

int some_function(uint32_t size, uint32_t *value){

    uintptr_t some_addr = (uintptr_t *)0xaaaa5555;

    switch(size) {
        case 1:
               *(uint8_t *)value = read_8_function(some_addr);
        case 2:
               *(uint16_t *)value = read_16_function(some_addr);
        case 4:
               *value = read_32_function(some_addr);
    }

    return 0;
}

1 Ответ

1 голос
/ 28 апреля 2020

value - указатель на uint32_t. Приведение преобразует его в указатель на другой тип; (uint8_t *)value преобразует его в указатель на uint8_t. Затем разыменование, которое используется для присвоения 8-байтовому полю по этому адресу.

(uint8_t)value преобразует указатель в 8-битное целое число. Затем, помещая * перед этим, вы попытаетесь использовать это целое число в качестве адреса для назначения, что недопустимо; Вы не можете разыменовать целое число. Кроме того, указатели имеют размер больше 8 бит (они 32 или 64 бита на большинстве современных процессоров), поэтому преобразование указателя в uint8_t приведет к потере большей части значения указателя.

...