Wskaźnik przesuwa się... normalnie. ;) Wskaźnik posiada 'w sobie' dwie informacje. Pierwszą jest oczywiście adres. Drugą jest typ danych, na które pokazuje.
Typ wskaźnika służy do dwóch rzeczy. Po pierwsze do weryfikacji poprawności działań programisty. Kompilator (języka C++) nie pozwala na przypisywanie adresu zmiennych innego typu, niż typ wskaźnika (i bardzo dobrze ;).
Druga rzecz, to arytmetyka wskaźników. Chcesz następny element tablicy? Zwiększasz wskaźnik o jeden, a nie kłopoczesz się tym, o ile faktycznie przesunie się sam adres, co jest ściśle zależne właśnie od typu zmiennej, która pod danym adresem rezyduje. Ty, jako programista, dostajesz adres na kolejny element tablicy. Po prostu, po zwykłej inkremendacji.
I czy jest jakiś inny sposób na powrót do zerowego elementu tablicy po jej alokacji niż stworzenie dodatkowego wskaźnika wskazującego na jej zerowy element?
Nazwa tablicy działa jak wskaźnik na zerowy element tablicy. ;)
int *tablica;
tablica = new int[15];
// pomijam sprawdzenie poprawności alokacji
tablica[0] = 26;
std::cout<<tablica[0]<<" "<<*tablica;