skoro sam zajmuje dokładnie takie samo miejsce jak zmienna.
A skąd ten pomysł? :)
Na typowej kompilacji dla x86-64:
https://godbolt.org/z/Eo7ThGe5d
int y;
int *x = &y;
int z = (int)&y; // error: cast from pointer to smaller type 'int' loses information
std::cout << sizeof(int); // 4
std::cout << sizeof(int*); // 8
Typ int oraz typ int* to są różne typy o potencjalnie różnej semantyce, więc konwersja typów nie jest dozwolona - nawet, gdyby miały te same rozmiary:
uintptr_t z = &y; // error: cannot initialize a variable of type 'uintptr_t' with an rvalue of type 'int *'
uintptr_t z = (uintptr_t)&y; // OK