«Самый правильный» способ конвертировать целое число в указатель без каких-либо предупреждений, вы должны привести к uintptr_t
, затем к void*
, затем к вашему типу указателя.
uint32_t b = 1;
uint32_t *p = (uint32_t*)(void*)(uintptr_t)b;
Но обычно программисты просто делают макросы , которые правильно отлиты:
#define A_ADDR ((uint32_t*)0x0000000A)
#define B_ADDR ((uint32_t*)0x0000000B)
uint32_t *p = A_ADDR;
p = B_ADDR;
, который компилируется без предупреждений на gcc -Wall -Wextra -pedantic
.
Или иногда просто макросыс постоянными числами, и пользователь должен привести к (void*)
или к правильному типу:
#define A_ADDR 0x0000000A
#define B_ADDR 0x0000000B
uint32_t *p = (uint32_t*)A_ADDR;
p = (uint32_t*)B_ADDR;
В качестве альтернативы, если вы доверяете своему компилятору, они могут быть static const
переменными, напр.static const uint32_t *A_ADDR = (uint32_t*)0x0000000A;