Может кто-нибудь объяснить эту строку кода C++, используя reinterpret_cast?

Рассмотрим (1):

 uint8_t *pUART = reinterpret_cast<uint8_t*>(0x0800);

Я знаю (1) просто меняет указатель pUART на 0x0800, но я запутался, как это работает.

Это имело бы смысл, если бы это было (2):

 uint8_t* pUART = reinterpret_cast<uint8_t*>(0x0800);

Я в замешательстве, потому что (1) совпадает с (3):

 uint8_t x = reinterpret_cast<uint8_t*>(0x0800);

но компилятор не принимает это. Может кто-нибудь прояснить это для меня? Почему (1) работает, а не (3).

2 ответа

Решение

C++ является токенизированным языком. Это означает, что пробел не имеет значения, за исключением случаев, когда необходимо разделить токены.

uint8_t *pUART а также uint8_t* pUART значит точно так же. Это три жетона, а именно uint8_t, *, а также pUART,

Строка (3) не работает, так как вы пытаетесь назначить uint8_t* тип указателя просто uint8_t, Правильный вариант - ваша строка (1).

Однако, если вы собираетесь с <cstdint> Вы также можете использовать uintptr_t тип, который является беззнаковым указателем int.

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