Jak fungují pointery (ukazatele)?

Sdílet
Vložit
  • čas přidán 14. 06. 2024
  • Když programujete aplikaci v nízkoúrovňovém programovacím jazyce, budete muset řešit jednotlivé přístupy k datům v operační paměti a konkrétní pozice, kde jsou tyto data uložené. K tomu se používají tzv. POINTERY, neboli v češtině UKAZATELE.
    V tomto videu si vysvětlíme, co jsou to adresy paměti, co jsou to pointery a jak s nimi můžete pracovat. Kromě toho si také zmíníme trochu pokročilejší funkce pointerů, jako je přístup k prvkům v poli nebo NULL pointer, který ukazuje na nultou pozici v paměti.
    Pokud ani po tomto videu moc pointerům nerozumíte, tak je to naprosto v pořádku... I mě trvalo několik dní a několik hotových aplikací, než jsem si pořádně uvědomil, jak pointery doopravdy fungují 😅
    Znalost pointerů je v nízkoúrovňových jazycích celkem důležitá a umožňuje vám spoustu dalších možností, jako je například dynamické alokováni paměti (že by námět na další video? :D)
    Můj Discord: github.com/Grizlikk/GrizlikYT...
    0:00 Úvod
    1:28 Příprava projektu v jazyce C
    2:27 Adresy paměti
    2:59 Pointery
    4:28 Přístup k proměnné přes pointer
    5:36 Vícenásobné pointery
    6:28 Pointerová aritmetika
    7:34 Vnitřní fungování pole přes pointery
    8:57 Předávání parametrů funkcím
    9:38 Předávání pointerů funkcím
    10:09 Ukázka předávání pointerů funkcím
    11:44 NULL pointer
    12:15 Ukázka NULL pointeru
    13:29 Shrnutí pointerů
    14:09 Definice více pointerů na jednom řádku
    15:10 Závěr

Komentáře • 34

  • @GrizlikD
    @GrizlikD  Před 3 měsíci +2

    V tomto videu jsem si trochu více vyhrál s tím editováním, např. to červené zvýraznění kódu, o kterém zrovna mluvím, tak mi můžete říct, co na to říkáte :D
    A taky jestli by vás zajímalo to téma dynamické alokace paměti, tedy jak je možné, aby program zabral paměť až za běhu... Například aby si uživatel mohl vybrat, kolik operační paměti chce použít

  • @stefan_hladek
    @stefan_hladek Před 3 měsíci +1

    Dekuji za dalsi pekne video. Zvetseni textu je mnohem lepsi, je to daleko lip citelne. Ja uvitam delsi video k pointeru.

  • @Rift_Walker_Lombax
    @Rift_Walker_Lombax Před 3 měsíci +1

    Super video, moc mi to pomohlo, nějakou dobu jsem hledal způsob jak přepisovat ty proměnné funkcí z jiné funkce a nemohl jsem na to přijít, ale teď už vím jak, takže super, dík

  • @Thund3rMan3
    @Thund3rMan3 Před 2 měsíci

    kdyby toto video vyslo, kdyz jsem se ucil C, pochopil bych to mnohem lepe. diky za video

  • @sankx_SK
    @sankx_SK Před 2 měsíci

    super video, lenze ja som C# programator lol

  • @demnyan
    @demnyan Před 3 měsíci +2

    нічого не зрозуміло але дуже цікаво :D

  • @djj1108
    @djj1108 Před 3 měsíci +2

    Nechápu co říkáš grizliku ale hezky to vysvětluješ

    • @GrizlikD
      @GrizlikD  Před 3 měsíci +3

      Njn, pointery jsou celkem složité :D

    • @djj1108
      @djj1108 Před 3 měsíci +2

      No právě

  • @int32_
    @int32_ Před 3 měsíci +1

    2:29 ve skutečnosti mají adresy na procesorech architektury amd64 použitelných jenom 48 bitů, i když jsou to 64bit procesory

    • @GrizlikD
      @GrizlikD  Před 2 měsíci

      Aha, tak to jsem ani nevěděl, díky za doplnění :D
      Jako ono to dává smysl... Protože 64 bitů je na adresu paměti strašně moc, ani operační systém by nedovedl pracovat s tak velkou pamětí :D

  • @Matyas85
    @Matyas85 Před měsícem

    čau, měl bych otázku. Můžu ty adresy nějakým způsobem měnit, nebo aspoň vypsat jejich hodnotu přes batch programy ? Myslím adresy jiných programů, jen bych je chtěl změnit přes batch

    • @GrizlikD
      @GrizlikD  Před měsícem +1

      Batch přímý přístup k paměti nepodporuje, takže bohužel ne. K tomu je nutné použít nějaký hodně nízkoúrovňový jazyk, jako je třeba zmíněné C
      Stejně ale počítej s tím, že Windows nedovolí přístup na pozice v paměti, patřící jiným programům :D

  • @djj1108
    @djj1108 Před 3 měsíci +1

    Null pointer pointer já to nechápu mate mě to

  • @santory5788
    @santory5788 Před 3 měsíci +1

    Cele video perfektne, robis to dobre, pokracuj.
    A len drobnost. dava tu hviezdicku pred datovy typ spravne, pretoze ked to das pred premennu, tak je to vizualny bordel kde vznika vizualne identicka premenna s dereferenciou, int *pointer a *pointer , kde v jednej je adresa a v druhej hodnota, ale vizualne ich napises rovnako.
    Ano C/C++ je jedno kde ta hviezdicka je, ale program pise clovek a ten sa na to pozera ocami nie cez kompilator ;)
    A zaciatocnik budu mat z toho potom v hlave gulas.

    • @raven-vr5yz
      @raven-vr5yz Před 3 měsíci +1

      Cauky, nevim odkud ses ucil programovat... jestli z umele intelegence nebo kouzelne skolky, ale to co rikas nedava smysl :). Je pravda, ze na umisteni asterisku nezalezi a ze to je ciste subjektivni zalezitost, ale jenom male decko by si inicializaci spletlo s dereferenci. V moment, kdy deklarujes vice pointeru, tak chces asterisk umistit pred nazev promenne.
      int *num1, *num2;
      v moment, kdybys napsal
      int* num1, num2;
      tak mas jeden pointer a jeden integer :)
      Nezalezi na tom, jaky ma clovek zpusob psani, nemusis psat komentar za kazdou cenu, jenom abys vypadal chytre, protoze pak to skonci takhle... prosim nepis uz dalsi hovna a radsi se jdi ucit psat kvalitni kod

    • @GrizlikD
      @GrizlikD  Před 3 měsíci

      @@raven-vr5yz Proč hnedka taková negetivita? Zrovna tohle je jenom otázka názoru a každý může preferovat něco jiného :D
      Jenom já jsem právě říkal, že podle mě by dávalo mnohem větší smysl psát tu hvězdičku hned před proměnnou, protože podle mě když ji to Visual Studio napíše hned za datový typ, tak v tom naopak mají začátečníci ještě větší guláš... Jelikož si myslí, že datový typ je *"int*",* což však ve skutečnosti není datový typ
      Právě z tohoto důvodu nechápu, proč to tak Visual Studio formátuje, protože doslova i kdybych ty hvězdičky ručně psal hned před název proměnné, tak Visual Studio mi to automaticky opraví a napíše tu hvězdičku hned za datový typ, ale možná by to šlo nějak přenastavit, já jsem se v nastavení Visual Studia nikdy moc nehrabal :D

    • @raven-vr5yz
      @raven-vr5yz Před 3 měsíci

      ​@@GrizlikDMas pravdu, ze to je otazka nazoru, proto jsem to aji ve svem komentari zminil. prave proto, ze to je subjektivni, tak nechapu, proc by nekdo psal takovy nesmyslny komentar. mimo to jeste podal nepravdive informace. nemam rad, kdyz se vyjadruji lide, kteri tematu nerozumi. nekdy je lepsi drzet hubu

  • @IceBeetle
    @IceBeetle Před 2 měsíci

    kolik jader taky ram davas na virtualni PC?

    • @GrizlikD
      @GrizlikD  Před 2 měsíci +1

      Běžně 2 jádra a 4 GB RAM, konkrétně pro toto video jsem si nastavil 4 jádra, ať ta kompilace běží plynuleji :D

    • @IceBeetle
      @IceBeetle Před 2 měsíci

      @@GrizlikD ok

    • @IceBeetle
      @IceBeetle Před 2 měsíci

      @@GrizlikD a jak delas to ze se ti vse bezi aj otevira rychel?

    • @GrizlikD
      @GrizlikD  Před 2 měsíci

      @@IceBeetle Když ten virtuální počítač spustím, tak je potřeba všechno nechat načíst úplně na 100 %, takže nechám virtuální počítač běžet na pozadí a začnu natáčet až za chvíli
      Případně když jde o konkrétní aplikaci, tak je mnohem rychlejší, když ta aplikace už předtím běžela: Takže například otevřu Visual Studio, načtu projekt, zavřu Visual Studio a když ho potom otevřu znovu, tak už se načítá výrazně rychleji než napoprvé

  • @dominikvrba6210
    @dominikvrba6210 Před 3 měsíci +1

    mam v tom gulas noice :D😂

  • @evanovotna3730
    @evanovotna3730 Před 3 měsíci +1

    jsou v bachi pointry ?

  • @djj1108
    @djj1108 Před 3 měsíci +1

    Ja to nechapu

  • @filip.kroupa7
    @filip.kroupa7 Před 3 měsíci +1

    9:54 Čau, v Pythonu bys přepsal obsah proměnné, která se nachází mimo tělo funkce, takto:
    def Funkce():
    *global* cislo
    cislo = 10
    cislo = 5
    print("Pred: ", cislo)
    Funkce()
    print("Po: ", cislo)
    Je tam stěžejní to "global"

    • @filip.kroupa7
      @filip.kroupa7 Před 3 měsíci +1

      Nakonec z toho Python vyšel zase tak, že to je v něm ještě jednodušší udělat, než v Cčku :D

    • @GrizlikD
      @GrizlikD  Před 3 měsíci +3

      Tady bych ale argumentoval, že to už je globální proměnná (což v Cčku existuje taky), ale abych si vyloženě mohl vybrat, které funkce tu proměnnou mohou upravit a které ne, přesně jak to dělají pointery :D
      V C můžu napsat třeba:
      _int cislo = 5;_
      _void Funkce() {_
      _cislo = 10;_
      _}_
      _int main() {_
      _printf("%d
      ", cislo);_
      _Funkce();_
      _printf("%d
      ", cislo);_
      _}_
      Tohle skutečně přepíše tu proměnnou _cislo,_ ale teď už by ji dokázala upravovat jakákoliv funkce, což nemusí být zrovna optimální, ale díky pointerům mohu jasně určit, která funkce upraví originální proměnnou a která k ní jen dostane přístup
      Ale máš pravdu, že v Pythonu to jde napsat taky :D

  • @djj1108
    @djj1108 Před 3 měsíci +1

    Natoč mrsmajor 2.0 vs windows defender