Wskaźniki

0

Cześć, staram się w pełni zrozumieć wskaźniki, wymyśliłem sobie takie zadanie.
Stworzyć tablicę o wielkości podanej przez użytkownika, w 1 pętli podać wartości a w 2 wypisać.

#include <iostream>

using namespace std;

int main() {

    int ile;
    cout << "Ile liczb chcesz podac";
    cin >> ile;
    int *tab;
    tab = new int [ile];

    for (int i = 0; i <ile ; ++i) {
        cin >> *tab;
        tab++;

    }
    for (int j = 0; j < ile; ++j) {
        cout << *tab << endl ;
        tab++;
    }

    delete[] tab;
    return 0;
}

Wiem że mógłbym to napisać tak:

for (int i = 0; i < ile ; ++i) {
        cin >> tab[i];
    }

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

Albo tak:

 for (int i = 0; i <ile ; ++i) {
        cin >> *(tab+i);
        
    }
    for (int j = 0; j < ile; ++j) {
        cout << *tab << endl ;
        tab++;
    }
0

Chciałbym wiedzieć gdzie jest błąd, ponieważ pierwszy przykład który podałem nie działa prawidłowo

0

Spróbuj przed drugim forem odjąć od tab wartość ile.
tab = tab - ile

Dwa kolejne przykłady które podałeś działają, bo nie zmieniasz miejsca na które wskazuje tab.
*(tab + 3) -> wskaźnik tab nie jest przesunięty, tzn zostaje bez zmian
tab++ -> wskaźnik jest przesunięty o jeden, to jest to samo co tab = tab + 1

0

Działa, chodzi tutaj o to aby ustawić wskaźnik na początek tablicy ?

0

A jakbym zapisał tak:

for (int i = 0; i <ile ; ++i) {
        cin >> *tab;
        tab++;

    }
    //tab=tab-ile;

    for (int j = 0; j < ile; ++j) {
        cout << tab[j] << endl ;
        //tab++;
    }

Czyli w 1 pętli przesunąłbym wskaźnik o wartość "ile", a później próbował odczytać wartość przesuniętego wskaźnika + o kolejne wartości w zależności od j ?

0

Wielkie dzięki, wskaźników uczyłem się już jakiś czas temu, niby rozumiałem, rozróżniałem jak pobrać adres itp ale jednak jeszcze jakieś kruczki zostały :D

0

Chyba nie można tytułu zmienić, przynajmniej ja nwm jak

0

Jeśli wskaźnik jest alokowany, to zwyczajowo się go nie inkrementuje, tylko kopiuje pod drugą zmienną wskaźnikową itd...

Sposób drugi, używa się

 tab[i] ....
 i++

sposobów jest więcej, np tu wspomniany

*(tab+i)
i++

Wszystkie dają taki sam skutek i kompilator to zoptymalizuje do tego samego kodu maszynowego.
MOIM ZDANIEM dwa podane przeze mnie są najbardziej czytelne. Daje do myślenia "aha, facet chroni wartość wskaźnika tab, zaraz zobaczymy dlaczego".
Najmniej czytelny (i groźny w kodzie wielowątkowym) jest inklrementacja i przywrócenie z kopii

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