Может кто-нибудь объяснить эту строку кода 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.