Kiedy napiszę np. int *x; cout << *x; w konsoli pojawia się liczba 1528349827. Co to za liczba, co ona oznacza i skąd się tam wzięła?
Tworzysz wskaźnik. Wskaźnik jest niczym innym jak typem liczb całkowitych, tylko że tutaj jest jasno powiedziane, że ta liczba jest adresem. Do wskaźnika nic nie przypisałeś więc przetrzymywana przez niego liczba (adres) to jakieś śmieci z pamięci. Następnie dostajesz się pod ten adres i wyświetlasz liczbe powstałą z 4 bajtów (bo int*) od tego adresu. Wyświetlona liczba jest zawartością pamięci pod adresem jaki "losowo otrzymał" wskaźnik.
Kiedy napiszę np. int *x; cout << x; w konsoli pojawia się 0x41655e.
Identyczna sytuacja jak byś napisał
int a; std::cout << a;
Wyświetlone zostają śmieci z pamięci. U ciebie ta sama sytuacja (powiedzieliśmy już sobie, że wskaźnik to typ liczb całkowitych). Jest tylko ta różnica w outpucie ("0x"). 0x symbolicznie oznacza zapis szesnastkowy - tzn. "0x" jest swego rodzaju informacją, że wszystko za iksem powinieneś czytać jako liczbe w systemie szesnastkowym. Typy wskaźnikowe tak są po prostu domyślnie wyświetlane pewnie dlatego, że adresy to z reguły duże liczby.
Jest to adres wskaźnika *x?
Nie. Jest to adres przetrzymywany przez wskaźnik x (btw.: x, nie *x - gwiazdka nie należy do nazwy). Tak samo jak utworzysz sobie zwykłego inta i go wyświetlisz. Wyświetlona liczba jest tym co int przetrzymuje, a nie jego adresem.
We wskaźnikach nie ma żadnej magii. To zwykłe integery. Ok, jest mała różnica z "arytmetyką wskaźnikową", ale to wszystko.
Arytmetyka wskaźnikowa:
T* ptr = 0;
ptr = ptr + 1;
std::cout << std::boolalpha << ( (std::size_t)ptr == sizeof(T) ); // true
Dodanie do wskaźnika 1, nie oznacza dosłownie dodanie jedynki, tylko przesunięcie o sizeof typu T.