• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Uzupełnienie i odczyt tablicy na wskaźnikach

Mały hosting, OGROMNE możliwości
0 głosów
300 wizyt
pytanie zadane 14 listopada 2015 w C i C++ przez Kloda Użytkownik (760 p.)

Witam.
Mam problem ze wskaźnikami.
Chciałbym po prostu wpisać ręcznie jakąś ilość liczb a następnie wypisać je w konsoli. Bez wskaźników nie mam z tym problemu.

Napisałem kod, który wydaje mi się poprawny lecz wypisuje nieoczekiwane przeze mnie rzeczy. Jak to zrobić na wskaźnikach?

#include <iostream>

using namespace std;

int ile;

int main()
{
    cout<<"Jaki rozmiar tablicy: ";
    cin>>ile;
    cout<<endl;

    int *tablica; //Nowy wskaznik
    tablica=new int [ile]; // Stworzony wskaznik bedzie teraz tablica

    for (int i=0; i<ile; i++)
    {
        cout<<"liczba nr "<<i+1<<": ";
        cin>>*tablica;
        tablica++;
    }
    for (int i=0; i<ile; i++)
    {
        cout<<endl<<(int)tablica<< " - "<<*tablica;
        tablica++;
    }


    delete [] tablica;
    tablica=NULL;

    return 0;
}

 

1 odpowiedź

+1 głos
odpowiedź 14 listopada 2015 przez Dorion300 Szeryf (90,250 p.)
wybrane 15 listopada 2015 przez Kloda
 
Najlepsza

Nie polecam tykać wskaźnika głównego tablicy. 
Zrób jakiś osobny, niech będzie równy tablicy int i na nim operuj. 
Ponieważ operujesz na głównym wskaźniku tablicy. 
Musisz cofnąć się tyle razy ile razy się przeniosłeś do przodu.

#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
    int ile;
    cout<<"Jaki rozmiar tablicy: ";
    cin>>ile;
    cout<<endl;

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

    for (int i=0; i<ile; i++){
        cout<<"liczba nr "<<i+1<<": ";
        cin>>*wsk;
        wsk++;
    }

    wsk = tablica;

    for (int i=0; i<ile; i++){
        cout<<endl<<(int)wsk<< " - "<<*wsk;
        wsk++;
    }

    delete [] tablica;
    tablica=NULL;
    getch();
    return 0;
}

 

komentarz 15 listopada 2015 przez Kloda Użytkownik (760 p.)
tzn?
mam stworzyć mniej więcej coś takiego?: int *nowy = &tablica lub bez operatora ampersandu, tak?

I w pętlach zamiast wskaznika "tablica" używać "nowy"?
komentarz 15 listopada 2015 przez emSon Stary wyjadacz (10,480 p.)
Nie podajesz ampersanda, ponieważ robisz wskaźnik do wskaźnika, a nie do zmiennej.

Sama nazwa tablica to wskaźnik do jej pierwszego elementu.
komentarz 15 listopada 2015 przez Dorion300 Szeryf (90,250 p.)
Bez ampersandu ponieważ jest niepotrzebny.
Nie ma sensu tworzyć wskaźnik wskaźnika to takich prostych rzeczy.
Ale tak, o to mi chodzi mniej więcej.

Nie polecam "tykać" czy zmieniać adresu głównego a zamiast tego zrobić drugi wskaźnik (poboczny) i na nim spokojnie zmniejszać, zwiększać jego wartość (adresu)
Ponieważ robiłeś tak że wskaźnik tablica przesuwała się non-stop do przodu, i nawet się nie cofałeś aby odczytać ją tylko zamiast tego to jechałeś dalej (poza tablicę) i odczytywałeś rożne informacje.
Warto dodać że po takich złych akcjach raczej "delete [] tablica" nie będzie działała prawidłowo ponieważ wskaźnik już nie wskazuje na tablicę.
komentarz 15 listopada 2015 przez Kloda Użytkownik (760 p.)
Dziękuję.
Będę "męczył", ćwiczył to jutro z rana :)
Dziękuję za pomoc i wyjaśnienie.

Dobrej Nocy!
komentarz 15 listopada 2015 przez Sebastian Fojcik Nałogowiec (43,040 p.)

Po zerknięciu na kod właśnie miałem o tym pisać. Jeżeli rozumiesz wskaźniki, to powinieneś wiedzieć, że:

Nazwa tablicy jest jednocześnie wskaźnikiem na jej pierwszy element

I później, na pomocą nawiasów przesuwamy go względem początku.
Zapis tab[ 5 ] jest równoważny tab + 5, bo po prostu przesuwamy wskaźnik.

Nie można natomiast zmieniać wartości tego wskaźnika:
tab++ ani tab += 5.
Bo później będzie taka sytuacja:

Jest tablica 10 elementowa int tablica = new int [ 10 ];
przestawiamy wskaźnik na 5 element:
tablica += 4;
i teraz chcemy wypisać 6 element:
cout << tablica[ 6 ];
I mamy wyjście poza zakres.
Mało tego! Próba usunięcia takiej tablicy (delete[]) może (ale nie musi) zakończyć się niepowodzeniem. W odcinku o wskaźnikach Pana Mirka jest właśnie inkrementowana nazwa tablicy, co jest błędem lecz Code::Blocks sobie z tym radzi.
Pamięć nie jest wtedy zwalniana. Zgłaszałem tę usterkę, ale bez rezultatów.

Podobne pytania

0 głosów
1 odpowiedź 379 wizyt
0 głosów
2 odpowiedzi 673 wizyt
pytanie zadane 12 lipca 2015 w C i C++ przez criss Mędrzec (172,570 p.)
0 głosów
1 odpowiedź 740 wizyt

93,717 zapytań

142,629 odpowiedzi

323,261 komentarzy

63,262 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...