Kurs C++ odc. 10: Wskaźniki. Dynamiczne alokowanie pamięci



Jeżeli masz ochotę zobaczyć więcej naszych filmów, podcastów i artykułów w coraz lepszej jakości, to zachęcamy do pozostawienia subskrypcji. Można także wesprzeć nasze działania w sieci drobną kwotą za pośrednictwem profilu Patronite lub donacji. Zachęcamy do odwiedzenia prowadzonych przez nas witryn oraz do polubienia fanpage’u Pasji informatyki na Facebooku.

🔔 Subskrybuj – http://bit.ly/pasja-sub

👉 Fanpage na Facebooku – http://bit.ly/pasja-fb
👉 Profil Patronite – https://patronite.pl/pasja-informatyki
👉 Lista Patronów – http://pasja-informatyki.pl/patroni
👉 Donacje na blogu – http://miroslawzelent.pl/donate
👉 Harmonogram publikacji – http://bit.ly/pasja-harmonogram
👉 Kontakt z nami – http://pasja-informatyki.pl/kontakt/
👉 Współpraca reklamowa – http://bit.ly/pasja-wspolpraca
👉 Kursy video dla technikum – http://pasja-informatyki.pl
👉 Blog informatyczny – http://miroslawzelent.pl
👉 Trenażer egzaminacyjny – http://egzamin-informatyk.pl
👉 Egzamin-E13.pl – http://egzamin-e13.pl
👉 Forum dyskusyjne – https://forum.pasja-informatyki.pl/
👉 Witryna podcastowa – http://podcast.pasja-informatyki.pl/
👉 Twitter MZ – https://twitter.com/MiroslawZelent
👉 Twitter DS – https://twitter.com/stelmach_damian

Wskaźniki to stosunkowo trudny temat w programowaniu. Podjąłem się jednak próby wyjaśnienia jak i dlaczego je stosujemy. Dzięki wskaźnikom zyskujemy cztery nowe możliwości: 1. Możemy dynamicznie alokować pamięć RAM; 2. Zwiększamy szybkość działania programu; 3. Możemy przekazywać podprogramom do pracy oryginalne zmienne jako argumenty, w tym również całe tablice; 4. Możliwa jest współpraca z urządzeniami zewnętrznymi.

Jeżeli jest Ci ciężko od razu pojąć konceptualnie te wszystkie zastosowania wskaźników, nie przejmuj się – potrzeba do tego czasu i praktyki. Na szczęście C++ jest elastyczny i możesz na tyle używać wskaźników, na ile potrafisz. Ale oczywiście im częściej ich użyjesz tym szybszy będzie Twój program, tym wydajniej będzie korzystał z pamięci RAM i tym więcej będzie miał możliwości. Jedynym minusem jest niewątpliwie fakt, iż kod źródłowy jest trudniejszy do analizy.

💾 POBIERZ PLIKI Z ODCINKA:

http://miroslawzelent.pl/kurs-c++/wskazniki-alokowanie-pamieci/

📑 CODE REVIEW NA FORUM:

http://bit.ly/code-reviews-odcinkow

#pasjainformatyki #cplusplus #programowanie

24 thoughts on “Kurs C++ odc. 10: Wskaźniki. Dynamiczne alokowanie pamięci

  1. Nie wiem dlaczego, za każdym razem, jak wykonam działanie na wskaźniku np.
    Tablica++;
    To po włączeniu programu i wyjściu z pętli for, która zawierała

    cout<< (intptr_t) tablica<<endl;
    tablica++;
    Wyświetla mi się :
    Program wskazniki.exe przestał działać.
    Program przestał działać poprawnie z powodu wystąpienie problemu. System Windows zamknie program i powiadomi Cię, jeśli istnieje dostępne rozwiązane

    Dzieje się tak tylko wtedy, kiedy wykonam jakieś działała na wskaźniku (nie używając gwiazdki przed nazwą)
    I co ciekawe, jeśli potem będzie np.
    cin >>n;
    cout<<n;
    To program zaczeka, aż wpiszę n, potem je wypisuje i dopiero jest błąd…

    Ok
    Właśnie zobaczyłem, że wpisuje się wtedy, kiedy wykonam jakieś działała na wskaźniku, a potem będzie komenda delete [] tablica;
    Jeżeli jeden z tych warunków nie jest spełniony błąd nie występuje
    (Pozwalał mi wpisać n, bo błąd jest, kiedy występuje delete)

  2. Kiedy wpisuje tak to jak jest u Pana Mirosława pomiędzy czasem zapisu bez wskaznika a ze wskaźnikiem polecenie delete[]tablica; to wyświetla mi tylko w konsoli czas zapisu bez wskaźnika. Nie wiem dlaczego skoro wszystko mam identycznie wpisane.

  3. Znalazlem rozwiazanie bledu z kodu z filmiku. Bylo na stronie Pana Miroslawa na forum : "W linii 33 kodu porównującego czas następuje przypisanie zmiennej wskaznik obiektu tablica, który został właśnie usunięty, i zostaje ponownie zdefiniowany dopiero w następnej linii. W skrócie wydaje mi się, że linie 33 i 34 powinny być zamienione miejscami, jak ma to miejsce w kodzie dołączonym do odcinka. "

  4. Rzutowanie zmiennej na typ int , czyli cout<<(int)tablica<<endl; , sprawia u mnie że program z początku filmiku nie działa -.- wie ktoś jak zrobić to poprawnie?

  5. Robiłem jakiś czas temu jakiś kurs C++ i właśnie do wskaźników doszedłem i na tym zakończyłem kurs… 😉 Poza napisanie prostego programiku liczącego zużycie paliwa albo cenę danej wagi lub objętości np. złota i podobne żenady – nie wyszedłem. Co ciekawe z programiku liczącego zużycie paliwa nawet korzystam… 😉

  6. W 21 minucie funkcja wykorzystuje przekazanie danych poprzez wskaźnik, a nie referencję.
    Dla zmiennych podstawowych:
    srednia (float x) – przez wartość
    srednia (float &x) – przez referencje
    srednia (float *x) – przez wskaznik
    Dla tablic mamy:
    srednia (float tab[]) – przez referencje
    srednia (float *tab) – przez wskaznik

  7. Dlaczego pierwszy program mi nie działa, dostaje błąd cast from 'int*' to 'int' loses precision [-fpermissive]|, przy wyświetlaniu tablicy z (int)

  8. Mam pewien problem. Mianowicie, gdy piszę:
    cout<<(int)w<<endl;
    Wyświetla mi się błąd "cast from 'int*' to 'int' loses precision [-fpermissive]"

    Wpisuję wtedy:
    cout<<(int*)w<<endl;
    Ale nie zamienia mi to na liczby całkowite dziesiętne

  9. naleprze jest to ze ja to rozumiem ale komputaer mi pisze ze4 int nie sprecyzowalem i nie moze go w3czytac , nie wiem o co chodzi ale ide dalej.

  10. Mam pytanie apropo dynamicznego alokowania pamięci. Czy taki kod:
    int ile;
    cin >> ile;
    int tab[ile]

    To też dynamiczne alokowanie pamięcią bez użycia wskaźników ? W końcu program nie wie w trakcie kompilacji ile pamięci zarezerwować, a zaczeka na użytkownika aby ten mu powiedział jak duża tablicę chce stworzyć.

  11. Witam,
    do kursu C++ podchodzę nie po raz pierwszy w swoim życiu i mam nadzieję, że nie ostatni. Pan Mirosław prowadzi mnie przez moje studia Informatyki, gdzie programować po prostu trzeba umieć i nie ma czasu na tyle poświęcenia ile [pan Mirosław] wkłada w dbałość o zrozumienie u uczniów. Odcinek ze wskaźnikami początkowo był dla mnie przerażający, ale teraz jestem już w miarę oswojony z tematem i nie boję się tej wiedzy. Pozwoliłem sobie zamieścić komentarz ze względu na drobny problem, który napotkałem podczas kompilacji kodu w CodeBlocks na swojej maszynie. W momencie 8:20 "Po prostu int w nawiasach, to wystarczy", okazało się, że u mnie nie wystarczy. Kompilator narzekał, że nie otworzy programu, bo:
    error: cast from 'int*' to 'int' loses precision [-fpermissive]|
    Jako, że jako przyszły informatyk jestem leniwy to zrezygnowalem z badania przyczyn tego bledu i zastosowalem u siebie rozwiązanie alternatywne:
    Zamiast tej linii:
    cout << (int)tablica << endl;
    Kompiluje program z tą:
    cout << reinterpret_cast<uintptr_t>(tablica) << endl;
    i biblioteką:
    #include <stdint.h>

    Na tym etapie nauki nie rozumiem jeszcze dobrze co sie dzieje, ale czasami nie ma na to czasu. Rozwiazanie pochodzi ze Stacka o ponizszym adresie:
    https://stackoverflow.com/questions/25224906/c-treat-the-address-location-as-an-integer

    Panu Miroslawowi zycze dużo zdrowia i pogody ducha, oraz bardzo dziekuje za wszystkie kursy, nie tylko C++.
    Osobiscie najmocniej wyczekuję rozwoju kursu JavaScript.

Leave a Reply

Your email address will not be published. Required fields are marked *