Jak fungují pointery (ukazatele)?
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
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
Dekuji za dalsi pekne video. Zvetseni textu je mnohem lepsi, je to daleko lip citelne. Ja uvitam delsi video k pointeru.
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
kdyby toto video vyslo, kdyz jsem se ucil C, pochopil bych to mnohem lepe. diky za video
super video, lenze ja som C# programator lol
нічого не зрозуміло але дуже цікаво :D
Wtf
Nechápu co říkáš grizliku ale hezky to vysvětluješ
Njn, pointery jsou celkem složité :D
No právě
2:29 ve skutečnosti mají adresy na procesorech architektury amd64 použitelných jenom 48 bitů, i když jsou to 64bit procesory
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
č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
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
Null pointer pointer já to nechápu mate mě to
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.
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
@@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
@@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
kolik jader taky ram davas na virtualni PC?
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
@@GrizlikD ok
@@GrizlikD a jak delas to ze se ti vse bezi aj otevira rychel?
@@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é
mam v tom gulas noice :D😂
Taky
jsou v bachi pointry ?
Nn
dik
Ja to nechapu
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"
Nakonec z toho Python vyšel zase tak, že to je v něm ještě jednodušší udělat, než v Cčku :D
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
Natoč mrsmajor 2.0 vs windows defender