Hej Już wszystko tłumaczę. Zapis *nazwa_wskaznika++ oznacza to samo co dwie kolejne operacje, czyli *nazwa_wskaznika; nazwa_wskaznika++; Postinkrementacja następuje przed operacją wyłuskania, lecz działa następująco - co prawda zwiększa wskaźnik, lecz odczyt wartości początkowej ma miejsce dla jej starej wersji. Przykład:
int i = 0;
std::cout << i++; //wyswietla 0, ale po tej instrukcji i ma wartosc 1
std::cout << i; //wyswietla 1
Akurat w tej pętli, którą zaprezentowałeś można się pozbyć wyłuskania przy inkrementacji i nie powinno to zmienić wyniku programu. (własciwie nie wiem, dlaczego ta gwiazdka się tam znalazła - być może, żeby pokazać, że w ten sposób nie zmodyfikuje się wartości, która znajduje się pod danym adresem, tylko zmodyfikuje się sam wskaźnik).
Przykład, który to obrazuje:
#include <iostream>
int main() {
int a[2] = {0, 7};
int* wskaznik_1 = a;
std::cout << "PRZYKLAD_1" << std::endl;
std::cout << "Wyswietl wartosc na ktora wskazuje wskaznik_1 i przesun go o 1 adres.\n" \
<< "Postinkrementacja wykonuje sie po odczytaniu wartosci." << std::endl;
std::cout << "Pierwszy element: " << *wskaznik_1++ << std::endl;
std::cout << "Kolejny element: " << *wskaznik_1 << std::endl;
std::cout << "\n\nTo samo, rozbite na dwie operacje" << std::endl;
int* wskaznik_2 = a;
std::cout << "PRZYKLAD_2" << std::endl;
std::cout << "Wyswietl wartosc na ktora wskazuje wskaznik_2 i przesun go o 1 adres.\n";
std::cout << "Pierwszy element: " << *wskaznik_2 << std::endl;
wskaznik_2++;
std::cout << "Kolejny element: " << *wskaznik_2 << std::endl;
return 0;
}
Gdy skompilujesz ten program, to wyniki obu przykladów będą identyczne.
A teraz odnośnie drugiego pytania - Twój drugi przykład wyświetlania, nie wyświetla adresów, tylko wartości, a skoro nie zainicjalizowałeś elementów tablicy, to wyświetlasz śmieci z pamięci. Twoje wyświetlanie powinno wyglądać tak:
for(int i=0; i<n; i++)
{
cout<<&w[i];
}
Zapis w[i] jest równoznaczny z *(w + i), zwraca on wartość, stąd nie wyswietlał adresów, tylko śmieci z pamięci. Jest to uproszczenie, ponieważ tablica w C++ to jakiś blok w pamięci. Przy zapisie:
int tablica[5] = {1, 2, 3, 4, 5};
int* wskaznik = tablica;
Wskaźnik będzie zawierał adres pierwszego elementu tablicy, tj. &tablica[0].
Więc stąd zapis tablica[3] jest równoznaczny z *(tablica + 3).
Kiedy przekazujesz do funkcji zmienną "tablicową", to tak na prawdę przekazujesz adres w pamięci na jej pierwszy element, dlatego późniejszy zapis z użyciem nawiasów kwadratowych działa, bo przesuwasz się w pamięci na kolejne, oryginalne dane.
W razie niejasności pytaj - postaram się uprościć albo podać jakiś sample code.
Pozdrawiam!