• 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

Object Storage Arubacloud
0 głosów
156 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ź 132 wizyt
0 głosów
2 odpowiedzi 240 wizyt
pytanie zadane 12 lipca 2015 w C i C++ przez criss Mędrzec (172,590 p.)
0 głosów
1 odpowiedź 382 wizyt

92,579 zapytań

141,432 odpowiedzi

319,657 komentarzy

61,963 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...