Wskaźniki

Odpowiedz Nowy wątek
2019-07-11 19:57
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++;
    }
Jaki jest problem? - lion137 2019-07-11 20:10

Pozostało 580 znaków

2019-07-11 20:25
0

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

Pozostało 580 znaków

2019-07-11 20:33
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

edytowany 8x, ostatnio: nullpt4, 2019-07-11 20:39

Pozostało 580 znaków

2019-07-11 20:36
0

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

chodzi o to że używając zapisu tab++ zmieniasz miejsce na które wskazuje tab, i dlatego musisz z powrotem ustawić go na początek tablicy tak jak wspomniałeś :P - nullpt4 2019-07-11 20:37

Pozostało 580 znaków

2019-07-11 20:41
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 ?

dokładnie ! :) - nullpt4 2019-07-11 20:42
tylko zmień tytuł wątku na bardziej jasny, np problem z inkrementacją wskaźników czy coś - nullpt4 2019-07-11 20:43

Pozostało 580 znaków

2019-07-11 20:43
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

Pozostało 580 znaków

2019-07-11 20:49
0

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

Pozostało 580 znaków

2019-07-11 21:13
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

edytowany 4x, ostatnio: AnyKtokolwiek, 2019-07-11 21:24

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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