Tablica i wskaźnik

0
int main()
{

    int liczba, ile;

    cout<<"Ile liczb: ";
    cin>>ile;

    int *tablica;
    int *wskaznik = tablica;
    tablica = new int [ile];

    for(int i=0; i<ile; i++)
    {
        cout<<"Podaj liczbe: ";
        cin>>liczba;

        *tablica = liczba;
        *wskaznik++;

    }

    for(int i=0; i<ile; i++)

    {
        cout<<*tablica<<endl;
        *wskaznik++;

    }


    return 0;
}

Może mi ktoś to wytłumaczyć?? Dlaczego nie działa mi to coś... chce wpisać liczby za pomocą wskaźnika do tablicy, a później pokazać co w niej siedzi... Nie mogę pojąć wskaźników i nie ruszę się z miejsca jeśli mój mózg nie dostanie informacji dlaczego??? :D

0

Ogólnie nie pisze w C++ ale z tego co wiem to żeby wskazać na coś trzeba użyć znaczka &.
Tutaj

int *wskaznik = &tablica;

Kolejna sprawa to na pewno ta tablica ma być wskaźnikiem?

I w sumie pytanie bo nie korzystam z wskaźników i nie wiem - czy wskaźnik inta może wskazywać na całą tablicę, czy powinien być na konkretnym elemencie tej tablicy?

1

Ależ tu nic nie jest dobrze. Po pierwsze nie dałeś kodu który się kompiluje, więc nawet jak coś nie da się sprawdzić co jest nie tak...

Więc zacznijmy od początku.

Brak include'ow:

#include <iostream>

Następnie, zdecyduj czy chcesz używać pełnych nazw std::count, czy dodasz linijkę:

using namespace std;

Dopiero wtedy zaczyna się kompilować.

Zatem przejdźmy do błędów jakie masz w kodzie:

    int *tablica;
    int *wskaznik = tablica;
    tablica = new int [ile];

Masz użycie niezainicjowanego wskaźnika tablica podstawiając go pod wskaźnik wskaznik. Następnie dopiero alokujesz pamięć za pomocą new. Powinno być odwrotnie.
Aby się przed tym zabezpieczyć warto wskaźniki inicjować w ten sposób:

    int *tablica = NULL;
    int *wskaznik = NULL;

W tym fragmencie kodu jakim celu zwiększasz wskaźnik nie robiąc zupełnie nic z nim?

    for(int i=0; i<ile; i++)
    {
        cout<<"Podaj liczbe: ";
        cin>>liczba;

        *tablica = liczba;
        *wskaznik++;

    }

Tutaj natomiast popatrz, że po przebiegu pętli wcześniejszej wskaźnik ustawiony jest na pierwszy element poza tablicą, więc dalsze jego zwiększanie powoduje wypisywanie danych spoza tablicy, czyli śmieci.


    for(int i=0; i<ile; i++)

    {
        cout<<*tablica<<endl;
        *wskaznik++;

    }

Na koniec nie zwalniasz pamięci wcześniej przydzielonej.

PS. na forum programistycznym określenie "nie działa" nie jest zbyt fajnym opisem problemu ;)

0

Oj nie wkleiłem całości chyba już przez długie godziny siedzenia... widze ze biblioteki brakuje i standardu przestrzeni nazw.. no i zwolnienia zasobu przez delete utworzonej tablicy...

Przepraszam za te błędy... nie wiem jak to wkleiłem.

pavarotti

Ampersant chyba się stosuje dla zmiennych i ewentualnie adresów, w sumie na takim poziomie jestem, że tyle wiem od Pana Mirosława Z.

Ok..

Rozumiem.. faktycznie chyba przerwę muszę zrobić..

  for(int i=0; i<ile; i++)
    {
        cout<<"Podaj liczbe: ";
        cin>>liczba;

        *tablica = liczba;
        *wskaznik++;

    }

Tutaj chciałem wpisać wartość zmiennej liczba do szufladki 0 tablicy a następnie wskaźnikiem przesunąć się w tablicy do kolejnej szufladki...
Popróbuje według sugestii i zobaczę jak to będzie szło... Dzięki za rady i na przyszłość uważniej prześledzę kod, który wlepiam..

2

Te wskaźniki nie są jakoś cudownie połączone. To że w skazują na to samo miejsce, nie znaczy, że jak przesuniesz jeden to przesuwasz drugi. Po co w ogóle 2 wskaźniki tam?

Ogólnie na temat tych wskaźników:
Wyobraź sobie, że masz 2 wskaźniki (1 i 2). Wskazujesz oba na element 0 tablicy i mówisz, przypisz tę liczbę tam gdzie wskazuje wskaźnik 1. Potem przesuwasz wskaźnik 2 na kolejną pozycję i mówisz do kogoś, przypisz mi kolejną liczbę tam gdzie wskazuje wskaźnik 1. Następnie znowu przesuwasz wskaźnik 2 i przypisujesz kolejną liczbę tam gdzie wskazuje wskaźnik 1 itd.

0
#include <iostream>

using namespace std;

int main()
{

    int liczba, ile;


    cout<<"Ile liczb: ";
    cin>>ile;

    int *tablica;
    tablica = new int [ile];
    int *wskaznik = tablica;


    for(int i=0; i<ile; i++)
    {
        cout<<"Podaj liczbe: ";
        cin>>liczba;

        *wskaznik = liczba;
        wskaznik++;

    }

    for(int i=0; i<ile; i++)

    {
        cout<<tablica[i]<<endl;

    }
       delete [] tablica;

    return 0;
}


a czy to jest ok??
chodzi o to żeby cofnąć się do zerowej szuflaki w drugiej pętli i wyświetlić jej zawartość... wiem że to jest trochę bez sensu ale chce przerobić wszystkie opcje..

0
dernis napisał(a):

Oj nie wkleiłem całości chyba już przez długie godziny siedzenia... widze ze biblioteki brakuje i standardu przestrzeni nazw.. no i zwolnienia zasobu przez delete utworzonej tablicy...

Przepraszam za te błędy... nie wiem jak to wkleiłem.

No właśnie ;) Na przyszłość mała rada, wklejaj cały kod który kompilujesz. Wtedy będziesz miał 100% pewność, że pytający wie o co chodzi ;)

dernis napisał(a):

chodzi o to żeby cofnąć się do zerowej szuflaki w drugiej pętli i wyświetlić jej zawartość... wiem że to jest trochę bez sensu ale chce przerobić wszystkie opcje..

To po prostu wskaźnik na aktualny element tablicy zapisuj w zmiennej pomocniczej, a przed pętlą ustawiają tą zmienną na pierwszy element tablicy:

  wskaznik = tablica;
  for(int i=0; i<ile; i++)
  {
    cout<<*wskaznik<<endl;
    wskaznik++;
  }

W ten sposób osiągniesz dokładnie to czego chcesz.

2

Wskaźnik, to zwykła zmienna, przechowująca adres. Ma ona jednak tą dodatkową cechę, że można pobierać jej wartość (adres), bądź daną, zapisaną pod tym adresem. Jak piszesz:

int * wsk1;
int * wsk2;

wsk1 = wsk2;
wsk2 = new int [10];

linijka wsk1 = wsk2; powoduje skopiowanie wartości (adresu) zmiennej wsk2 do wsk1. W kolejnej linijce kopiujesz wartość (adres) tablicy na 10 intów, do zmiennej wsk2. W wsk1 cały czas masz starą wartość (adres) [na jaki wskazywał] wsk2. Coś takiego:

int a = 10;
int b = 20;

b = a;
a = 100;

po napisaniu a = 100;, b nadal ma wartość 10. Nie wiem czy jasno to wytłumaczyłem.

M.

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