Для подобных целей уже давно заведены
intptr_t
и
uintptr_t
[
?], а еще
ptrdiff_t
[
?].
Именно эти типы и стоит использовать для прямой работы с адресами.
Теги C и C++ смешивать не совсем уместно. Это мешает выбору более подходящего варианта ответа.
В C++, например, если нужно только хранить адрес и позволять с ним только определенные операции, лучше мог бы подойти
enum class MemoryAddress : uintptr_t;
. Пустое перечисление с достаточной шириной и выравниванием избавит от возможности случайно что-то куда-то прибавить или умножить, да и от неявных преобразований убережет. А перегрузка операторов поможет разрешить только определенные операции.
Но в C так не получится.