Przemieszczanie się po tablicy - forma wskaźnikowa/indeksowa

0

Cześć,

mam pewien problem, aczkolwiek posiadam bardzo prosty przykład:

    int rozmiar;
    cin>>rozmiar;
    int *tab = new int[rozmiar];

    for(int i = 0; i < rozmiar; i++)
    {
        cout << "i: " << i << endl;
        tab[i] = i;
    }

    for(int i = 0; i < rozmiar; i++)
    {
        cout << tab[i] << endl;
    }

    int *tab2 = new int[rozmiar];

    for(int i = 0; i < rozmiar; i++)
    {
        cout << "i: " << i << endl;
        *(tab2++) = i;

    }

    for(int i = 0; i < rozmiar; i++)
    {
        cout << *(tab2++) << endl;
    }

Podaje z klawiatury rozmiar tablicy, następnie tworzę tablicę dynamicznie o podanym rozmiarze. Wpisując dane do tablicy pierwszą metodą (indeksową) dane są wprowadzane odpowiednio i odpowiednio wyświetlane, gdy wpisuję dane "wskaźnikowo" wyświetlane dane są randomowe, tak jakbym walił w niebo. Prawdopodobnie jest to jakiś detal, którego nie mogę zauważyć. Ktoś mi odpowie dlaczego tak się dzieje?

1

Przy wypisaniu zaczynasz z tab2 ustawionym na pseudo-element za ostatnim elementem tablicy. Następnie go inkrementujesz i wyświetlasz anty-dane na które wskazuje, czyli popełniasz UB.

0

Jak po zapełnieniu tabeli wskaźnikowo z powrotem ustawić go na początek tabeli by odpowiednio wyświetlić dane?

2

Pracować na kopii albo tab2 -= rozmiar.

W ogóle w jakim celu używasz new i delete zamiast std::vector?

0

W formie wyłącznie edukacyjnej, by odpowiednio zrozumieć przemieszczanie się wskaźników właśnie w takich sytuacjach.

0

W takim razie Twój kod jest analogiczny do

    int i = 0;
    for(; i < rozmiar; i++)
    {
        cout << "i: " << i << endl;
        tab[i] = i;
    }

    for(; i < rozmiar; i++)
    {
        cout << tab[i] << endl;
    }
0

Wiem, że ta forma też jest odpowiednia, ale właśnie nurtowała mnie druga forma gdzie przesuwałem wskaźnik.

Czy to na prawdę jest jedyna możliwość by wrócić na początek tablicy dynamicznej?

    for(int i = 0 ; i < rozmiar; i++)
    {
        tab2--;
    }

Ponieważ stosując kopię w taki sposób:

    int *wynik;
    wynik = tab2;
   // wynik = &tab2[0];

Cały czas wale w niebo, nie cofa wskaźnika na początek tablicy.

0

Analizowałem poprzez wyświetlanie adresów i porównanie klasycznej metody tab[i] a wskaźnikowej widać było że adresy przesuwają się inaczej a wręcz na przemian.

Tutaj działający wynik po zmianie i analizie.

int *tab2 = new int[rozmiar];

	cout << "wskaznik: " << tab2 << endl;
	cout << "adres tablicy: " << &tab2[0] << endl;
	cout << "adres wskaznik: " << &tab2 << endl;

	for (int i = 0; i < rozmiar; i++)
	{
		
		cout << "--" << endl;
		cout << "i: " << i << endl;
		*++tab2 = i;
		cout << *tab2 << endl;
	}

	tab2 = &tab[0];

	for (int i = 0; i < rozmiar; i++)
	{
		cout << "--" << endl;
		cout << tab2[i] << endl; //opcjonalnie *tab2++
	}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1