Wskaźniki

Odpowiedz Nowy wątek
2019-07-11 19:57

Rejestracja: 1 rok temu

Ostatnio: 1 miesiąc temu

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

Rejestracja: 1 rok temu

Ostatnio: 1 miesiąc temu

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

Rejestracja: 1 rok temu

Ostatnio: 22 godziny temu

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

Rejestracja: 1 rok temu

Ostatnio: 1 miesiąc temu

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

Rejestracja: 1 rok temu

Ostatnio: 1 miesiąc temu

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

Rejestracja: 1 rok temu

Ostatnio: 1 miesiąc temu

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

Rejestracja: 1 rok temu

Ostatnio: 1 miesiąc temu

0

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

Pozostało 580 znaków

2019-07-11 21:13

Rejestracja: 2 lata temu

Ostatnio: 3 godziny temu

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

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