Wskaźniki

BA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
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ć.

Kopiuj
#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:

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

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

Albo tak:

Kopiuj
 for (int i = 0; i <ile ; ++i) {
        cin >> *(tab+i);
        
    }
    for (int j = 0; j < ile; ++j) {
        cout << *tab << endl ;
        tab++;
    }
BA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

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

nullpt4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 103
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

BA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

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

BA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

A jakbym zapisał tak:

Kopiuj
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 ?

BA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
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

BA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

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

AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3561
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ę

Kopiuj
 tab[i] ....
 i++

sposobów jest więcej, np tu wspomniany

Kopiuj
*(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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.