Tablica i wskaźnik

Tablica i wskaźnik
DE
  • Rejestracja:ponad 5 lat
  • Ostatnio:około 5 lat
  • Postów:4
0
Kopiuj
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

PA
PA
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 3 lata
  • Postów:288
0

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

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

edytowany 7x, ostatnio: pavarotti
szweszwe
"z tego co wiem to żeby wskazać na coś trzeba użyć znaczka &" no nie... To co napisałeś się nie skompiluje.
PA
A no tak, chyba żeby skorzystać z z tego wskaźnika np wypisac jego wartość w cout trzeba dać &wskaznik, popraw mnie jeśli się mylę ;p tak jak pisałem, nie korzystam z C++
lion137
Dobrze jest chociaż skompilować, jak się coś wrzuca;)
AK
Elit zwykłe zasady nie dotyczą ...
MY
  • Rejestracja:ponad 9 lat
  • Ostatnio:8 dni
  • Postów:1083
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:

Kopiuj
#include <iostream>

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

Kopiuj
using namespace std;

Dopiero wtedy zaczyna się kompilować.

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

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

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

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

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

Kopiuj

    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 ;)

AK
Kolega to rozumie, bo "napisał" program pod Qt ;)
MY
@AnyKtokolwiek to zmienia postać rzeczy. Swoja drogą nie wiedziałem, że w Qt będzie ok :)
DE
  • Rejestracja:ponad 5 lat
  • Ostatnio:około 5 lat
  • Postów:4
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ć..

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

edytowany 1x, ostatnio: dernis
szweszwe
  • Rejestracja:ponad 11 lat
  • Ostatnio:5 dni
  • Lokalizacja:Kraków
  • Postów:1694
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.

DE
  • Rejestracja:ponad 5 lat
  • Ostatnio:około 5 lat
  • Postów:4
0
Kopiuj
#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..

edytowany 1x, ostatnio: dernis
Azarien
dodaj jeszcze linijkę delete[] tablica; przed return 0.
MY
  • Rejestracja:ponad 9 lat
  • Ostatnio:8 dni
  • Postów:1083
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:

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

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

mpaw
  • Rejestracja:około 9 lat
  • Ostatnio:24 dni
  • Postów:530
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:

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

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


That's all folks ;)
edytowany 4x, ostatnio: mpaw

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.