>> [Přehrávání hudby]
>> DOUG LLOYD: Ukazatele, jsme tady.
To se pravděpodobně bude nejtěžší téma
že mluvíme o v CS50.
A pokud jste dočetli nic o ukazatele
než byste mohli být trochu zastrašující jít do tohoto videa.
Je pravda, že ukazatele Myslíte si, aby schopnost
aby snad mhouřit dost špatně, když jste
práce s proměnnými a dat, a způsobuje váš program k havárii.
Ale jsou opravdu velmi užitečné a oni nám to opravdu skvělý způsob, jak umožnit
předat data zpět a přepínat mezi funkcemi,
že jsme schopni dělat jinak.
>> A tak to, co opravdu chcete udělat, je zde vlak
budete mít dobrý ukazatel disciplínu, tak že můžete efektivně využívat ukazatele
aby se vaše programy, které mnohem lépe.
Jak jsem již řekl ukazatele nám jiný způsob, jak předat data mezi funkcemi.
Nyní, pokud si vzpomínáte z dřívější video, když
jsme mluvili o variabilní prostor, jsem se zmínil,
že všechny údaje, které jsme projít mezi Funkce v C je předán podle hodnoty.
A já nemusí mít používal to Termín, co jsem tam chtěl
bylo to, že jsme kolem kopie dat.
Když jsme se předat proměnnou do funkce, nejsme ve skutečnosti předávání proměnné
do funkce, že jo?
Jsme předáním kopie že data na funkci.
Tato funkce dělá to, co bude a vypočítává nějakou hodnotu,
a možná použijeme tuto hodnotu když to dává ji zpět.
>> Tam byla jedna výjimka toto pravidlo předávání hodnotou,
a my se vrátíme k tomu, co, že je o něco později v tomto videu.
Pokud budeme používat ukazatele místo použití proměnných,
nebo namísto použití proměnných samy nebo kopie proměnných,
nyní můžeme projít kolem proměnné mezi funkce v jinak.
To znamená, že pokud uděláme změna v jedné funkci,
že změna bude skutečně trvat vliv v jiné funkci.
Opět platí, že to je něco, jsme nemohli udělat dříve,
a pokud jste někdy zkoušeli swap Hodnota dvou proměnných ve funkci,
jste si všimli tento problém nějak plíží, že jo?
>> Pokud chceme vyměnit X a Y a my předat je do funkci nazvanou swapu,
uvnitř funkce swap proměnné dělat směnné hodnoty.
Jedna se stává dvou, dvou se stane jednu, ale ne ve skutečnosti
cokoliv měnit v originále funkce, v volajícího.
Vzhledem k tomu, nemůžeme, jsme jen práce s jejich kopie.
S ukazateli ale můžeme skutečně projít X a Y do funkce.
Tato funkce může dělat co s nimi.
A tyto proměnné hodnoty může skutečně změnit.
Tak to je docela změna naše schopnost pracovat s daty.
>> Než jsme se ponořit do ukazatele, myslím, že to stojí za to
přičemž několik minut, aby se vrátit k základům zde.
A mají se podívat, jak paměť počítače práce
protože tyto dva předměty jdou k vlastně být docela vzájemně propojeny.
Jak asi víte, v systému počítače
máte pevný disk nebo snad solid state drive,
jakési místo uložení souboru.
Je to obvykle někde v sousedství 250 gigabajtů
se možná pár terabajtů nyní.
A to je místo, kde všechny vaše Soubory nakonec žít,
i když je počítač vypnut off, můžete jej znovu zapněte
a zjistíte, vaše soubory jsou tam opět po restartu systému.
Ale disky, jako je pevný disk, HDD nebo SSD, SSD,
jsou prostě úložný prostor.
>> Nemůžeme vlastně dělat nic s data, která jsou v pevném disku,
nebo v SSD.
Pro skutečné změně údaje nebo ji přesunout kolem,
musíme ji přesunout do RAM, paměť s přímým přístupem.
Nyní RAM, máte hodně méně ve vašem počítači.
Můžete mít někde v sousedství 512 megabajtů
pokud máte starší počítač, na možná dva, čtyři, osm, 16,
možná dokonce i trochu více, GB paměti RAM.
Tak to je mnohem menší, ale to je kde všechny těkavých dat existuje.
To je místo, kde můžeme věci změnit.
Ale když jsme zase náš počítač vypnout, všechna data v paměti RAM je zničena.
>> Takže to je důvod, proč musíme mít pevný disk Pro více trvalé umístění toho,
tak, že by to exists- být opravdu špatné, pokud pokaždé, když
obrátil náš počítač vypnout, každý soubor v našem systému byla zničena.
Tak jsme práci uvnitř paměti RAM.
A pokaždé, když mluvíme o paměť, do značné míry, v CS50,
mluvíme o paměti RAM, nikoliv na pevném disku.
>> Takže když jsme se přesunout věci do paměti, zabere určitý prostor.
Všechny typy dat, které jsme pracovali s
zaujímají různé množství prostoru v paměti RAM.
Takže pokaždé, když vytvoříte celé číslo variabilní, čtyři bajtů paměti
jsou vyčleněny v paměti RAM, takže vás může pracovat s tímto celé číslo.
Můžete deklarovat celé číslo, změňte jej, přiřadit
na hodnotu 10 inkrementovanou jedním, tak dále a tak dále.
Vše, co se má stát v RAM, a dostanete čtyři bajty
pracovat s pro každou integer, které vytvoříte.
>> Každý znak vytvoření dostane jeden bajt.
To je jen, kolik místa je potřebné k uložení charakter.
Každý plovák, skutečný číslo, dostane čtyři byty
pokud je to double přesnost s plovoucí desetinnou čárkou
číslo, které vám umožní mají přesnější nebo číslic
za desetinnou čárkou bez ztráty přesnosti,
které zabírají osm bajtů paměti.
Dlouhé touží, opravdu velké celá čísla, také zabírají osm bajtů paměti.
Kolik bajtů paměti se struny zabírají?
Tak pojďme dát kolík v této otázce pro teď, ale vrátíme se k tomu.
>> Takže zpět k této myšlence paměti jako velké pole bajtů velikosti buněk.
To je opravdu vše, co je, je to jen obrovská pole buněk,
stejně jako jakékoli jiné pole, které jste obeznámeni s, a vidět,
kromě každý prvek je jeden bajt široký.
A stejně jako pole, každý prvek má adresu.
Každý prvek pole má index a my
Můžete použít tento index k tomu tzv náhodný přístup na seskupení.
Nemusíme začínat začátek pole,
iterovat každý jediný prvek této smlouvy,
najít to, co hledáme.
Můžeme jen říct, chci se dostat do 15 prvek nebo 100. element.
A můžete právě v ten číslo a získat hodnotu hledáte.
>> Podobně každé místo V paměti má adresu.
Takže vaše paměť by mohla vypadat nějak takto.
Zde je velmi malý kus paměť, to je 20 bajtů paměti.
Prvních 20 bytů, protože my řeší tam dole
jsou 0, 1, 2, 3, a proto na celou cestu až do 19.
A když jsem deklarovat proměnné a když začnu pracovat s nimi,
Systém bude nastaven stranou nějaký prostor pro mě
V této paměti pracovat s mými proměnných.
A tak bych mohl říci, char c rovná kapitál H. A co se bude dít?
No systém bude vyčlenit pro mě jeden bajt.
V tomto případě si vybral číslo bajtu čtyři, byte na adrese čtyři,
a to bude ukládat písmeno H kapitál tam pro mě.
Pokud bych pak řekl rychlost int Limit se rovná 65, to je
chystá vyčlenit čtyři bajtů paměti pro mě.
A to bude léčit ty, čtyři byty jako jeden celek
protože to, co pracujeme s je celé číslo sem.
A to bude ukládat 65 tam.
>> Teď už jsem si trochu říkám trochu lež,
pravdu, protože víme, že počítače pracují v binární.
Nechápou nutně to, co je hlavním městem H
nebo co je to 65 znamená, že pouze pochopit binární, nul a jedniček.
A tak vlastně to, co jsme skladování tam
není písmeno H a číslo 65, ale spíše binární reprezentace
této smlouvy, které vypadají Trochu něco takového.
A zejména v kontext celočíselné proměnné,
to nebude jen plivat do, že to nebude brát to jako jeden čtyřlůžkový
byte kus nutně, je to vlastně děje
brát to jako čtyři jednoho byte kousky, který by mohl vypadat nějak takto.
A ani to není úplně pravda buď,
protože něco, co nazývá endianness, což nejsme
se dostat do teď, ale pokud jste zvědaví,
si můžete přečíst na malý a velké endianness.
Ale pro účely tohoto argumentu, pro účely tohoto videa,
pojďme jen předpokládat, že je v Skutečnost, jak se číslo 65 by
být zastoupen paměť na každém systému,
i když to není úplně pravda.
>> Ale pojďme vlastně jen dostat zbavit všech binární úplně,
a jen přemýšlet o tom, jak H a 65, je to mnohem snazší
přemýšlet o tom takhle že jako člověk.
Dobře, takže to také vypadá, možná trochu náhodný, že I've- můj systém
Nedal mi bytů 5, 6, 7, a 8 pro uložení celé číslo.
Je tu důvod pro to, také, což nebudeme se do teď, ale postačí
uvést, že to, co Počítač je tady
je pravděpodobně dobrý tah z jeho strany.
Nechcete-li, dejte mi paměť, která je nutně zády k sobě.
I když to bude dělat to teď když chci získat další řetězec,
volal příjmení, a já chci dát Lloyd tam.
Budu potřebovat, aby se vešly jeden znak, každé písmeno, které je
bude vyžadovat jeden znak, jeden bajt z paměti.
Takže pokud bych mohl dát Lloyd do mého pole takhle jsem docela dobrý jít, ne?
Co chybí?
>> Pamatujte si, že každý řetězec pracujeme se v C končí zpětné lomítko nula,
a nemůžeme opomenout, že tady, a to buď.
Musíme vyčlenit jeden bajt paměti rozhodl, že tak jsme
vědět, kdy náš řetězec skončila.
Takže znovu toto uspořádání z cesty věcí
se objeví v paměti síle být trochu náhodný,
ale ve skutečnosti je to, jak většina systémů jsou určeny.
Chcete-li linka je na násobcích čtyři, z důvodů, znovu
že nepotřebujeme, aby dostat se do teď.
Ale to je, tak stačí říct, že po těchto tří řádků kódu,
to je to, co paměti by mohl vypadat.
Pokud potřebuji paměťových míst 4, 8, 12 a držet svá data,
To je to, co moje paměť by mohla vypadat.
>> A jen být zvláště tady, když pedantský
mluvíme o paměti adresy obvykle
tak učinit pomocí hexadecimální notace.
Tak proč ne my převést všechny z nich z desítkové na šestnáctkové soustavě
jen proto, že je všeobecně jak jsme se odkazovat na paměti.
A tak místo toho, aby 0 až 19, co máme, je nulový
x nula až nulovou x1 tři.
Ti, kteří jsou 20 bajtů paměti, že jsme mají nebo se díváme na tomto snímku
právě tady.
>> Takže to všechno bylo řečeno, pojďme krok od paměti na vteřinu
a zpět do ukazatele.
Zde je nejdůležitější věc k zapamatování
jak jsme začít pracovat s ukazateli.
Ukazatel je nic více než adresu.
Řeknu to znovu, protože je to tak důležité,
ukazatel není nic více než adresu.
Ukazatele jsou adresy na místech v paměti, kde žijí proměnné.
S vědomím, že se stane doufejme, že trochu jednodušší s nimi pracovat.
Další věc se mi líbí musíte udělat, je mít třídění
diagramů vizuálně reprezentovat to, co je děje s různými řádků kódu.
A budeme to dělat pár časů v ukazatelů,
a když hovoříme o dynamický alokace paměti stejně.
Protože si myslím, že tyto diagramy může být zvláště užitečné.
>> Takže když řeknu, například, int k v mém kódu, co se děje?
No co se v podstatě děje se Začínám paměti vyhrazený pro mě,
ale nemám ani rád přemýšlet o tom, jako to, že jsem
Líbí se o tom přemýšlet jako krabice.
Mám krabici a je to zelené barvě, protože já
může dát celá čísla v zelených polích.
Kdyby to byl charakter I může mít modrou krabici.
Ale já vždycky říkám, když jsem vytvořit obdélník, který pojme celá čísla
že box je zbarvena zeleně.
A já se stálou značku a píšu K na straně.
Takže mám okno s názvem K, do které mohu dát celá čísla.
Takže když řeknu int k, to je co se děje v mé hlavě.
Když řeknu k rovná pět, co mám dělat?
No, dávám pět v poli, vpravo.
Toto je velice jednoduché, pokud Říkám int k vytvořit okno s názvem k.
Když řeknu k rovná 5, dát pět do krabice.
Doufejme, že to není příliš velký skok.
Tady je místo, kde se věci jít málo zajímavé ačkoli.
Když řeknu, int * PK, dobře, i když to neudělám vím, co to nutně znamená,
Je to jasně něco co do činění s celé číslo.
Takže jdu na barvu Tento box green-ish,
Vím, že to má něco co do činění s celým číslem,
ale to není celé číslo samo o sobě, protože je to int hvězda.
Je tu něco, mírně jiný o tom.
Takže zapojit celé číslo je, ale jinak je to
příliš neliší od to, co jsme mluvili o.
Je to krabice, její dostal označení, je to na sobě štítek PK,
a to je schopné udržet int hvězdy, bez ohledu na to jsou.
Mají něco společného s celými čísly, jasně.
Zde je poslední řádek ačkoli.
Když řeknu pk = & K, Whoa, co se právě stalo, že jo?
Takže to náhodné číslo, zdánlivě náhodné číslo, dostane hozen do pole tam.
Vše, co je, je pk dostane adresu k.
Takže jsem se držet, kde k bydlí v paměti, jeho adresu, na adresu jeho bajtů.
Všechno, co dělám, je, že říkám tato hodnota je to, co budu
dát uvnitř mé okno s názvem pk.
A protože tyto věci jsou ukazatele, a proto, že hledáte
na provázku jako nulovou x eight zero c sedmi čtyř osmi
dvou nula je pravděpodobně nemá velký význam.
Když jsme se obecně představit ukazatele, máme vlastně dělat tak jako ukazatele.
Pk nám dává informaci musíme najít K v paměti.
Takže v podstatě pk má šipku v něm.
A pokud budeme chodit délku této šipky, představte si,
je to něco, co můžete jít dál, kdybychom procházka po celé délce šipky,
na samém konci této šipky, jsme najde místo v paměti
kde k bydlí.
A to je opravdu důležité protože jakmile budeme vědět, kde k bydlí,
můžeme začít pracovat s daty uvnitř té místo v paměti.
I když jsme se dostáváme Teeny bit před sebe pro tuto chvíli.
>> Takže to, co je ukazatel?
Ukazatel je datová položka, jejíž hodnota je adresa paměti.
To bylo to, že nulou x osm nula stuff děje, že byla adresa paměti.
To byl umístění v paměti.
A typ ukazatele popisuje druh
dat najdete v že adresa paměti.
Takže je tu int hvězda část vpravo.
Pokud bych se touto šíp, to je mě vést k umístění.
A to je místo, to, co jsem Naleznete zde v mém příkladu,
je zelený barevný box.
Je to celé číslo, to je to, co jsem Najdete když půjdu na tuto adresu.
Typ Datová ukazatel popisuje, co se
najdete na této adrese paměti.
Tak tady je opravdu super věc ačkoli.
Ukazatele nám umožňuje projít proměnné mezi funkcemi.
A skutečně předat proměnné a neprojde jejich kopie.
Protože pokud budeme přesně vědět, kde v paměti najít proměnnou,
nepotřebujeme, aby kopii to, můžeme jít na dané místo
a práci s tímto proměnné.
Takže v zásadě pouze ukazatele sort o vytvoření prostředí počítače
mnohem více jako v reálném světě, hned.
>> Tak tady je analogií.
Řekněme, že mám notebook, vpravo, a je plná poznámek.
A já bych rád, kdybyste jej aktualizovat.
Jste funkce, která aktualizace poznámky, správně.
Ve způsobu, jakým jsme byli pracuje tak daleko, co
stane se budete mít můj notebook, půjdete do obchodu kopírování,
budete dělat kopii Xerox o každá stránka notebooku.
Budete opustit svůj notebook zpět na mém stole, když budete hotovi,
půjdeš a vyškrtnout věci v mém notebook, že jsou zastaralé nebo špatně,
a pak budete míjet zpět me stoh stránek společnosti Xerox
že je replikou mého notebooku s změny, které jste provedli na něj.
A v tomto bodě, je to na mě jako volající funkce, jako volající,
se rozhodnou vzít své poznámky a začlenit je zpět do svého notebooku.
Takže je tu spousta kroků zde jedná, vpravo.
Jako by to bylo lepší když jsem jen říct, hej, můžete
aktualizovat své notebook pro me, předat vám své notebook,
a budete mít věci a doslova kříž je ven
a aktualizovat své poznámky v notebooku.
A pak mi dej můj notebook zpět.
Je to něco, co ukazatele nám umožňují dělat,
dělají to prostředí hodně víc jako jak pracujeme ve skutečnosti.
>> Dobře, takže to, co je ukazatel je, pojďme mluvit
o tom, jak ukazatele pracovat v C, a jak můžeme začít pracovat s nimi.
Takže tam je velmi jednoduchý ukazatel v C nazývá nulový ukazatel.
Ukazatele null ukazuje na nic.
To pravděpodobně vypadá, že to ve skutečnosti není moc užitečná věc,
ale jak budeme vidět něco později, skutečnost,
že tento ukazatel null existuje ve skutečnosti opravdu může přijít vhod.
A při každém vytvoření ukazatel a nenastavíte její hodnotu immediately-
příklad nastavení jeho hodnota okamžitě
bude pár snímků zpět kde jsem řekl, pk rovná & K,
pk dostane adresy K, jak je uvidíme, co to znamená,
uvidíme, jak se kód, který shortly- pokud nebudeme nastavte její hodnotu na něco
smysluplné okamžitě, byste měli vždy
nastavte ukazatel myši na bod na hodnotu null.
Měli byste nastavit tak, aby ukazoval na nic.
>> To je velmi odlišné, než odchodu hodnotu, jak je to
a pak prohlašující ukazatel a jen za předpokladu, že
to je null, protože to je jen zřídka pravda.
Takže byste měli vždy nastavit Hodnota ukazatele
na null, pokud nenastavíte její hodnotu na něco smysluplného okamžitě.
Můžete zkontrolovat, zda hodnoty ukazatel je je null pomocí operátoru rovnosti
(==), Stejně jako vy porovnat libovolné celé číslo hodnoty nebo znak hodnoty pomocí (==)
také.
Je to zvláštní druh konstanty hodnota, kterou lze použít k testování.
Takže to byl velmi jednoduchý ukazatel, ukazatele null.
Dalším způsobem, jak vytvořit ukazatel je získat
adresa proměnné jste již vytvořili,
a vy to pomocí & adresa extrakce operátor.
Což jsme již viděli dříve V prvním příkladu diagramu jsem ukázal.
Takže pokud x je proměnná, která máme již vytvořili typu integer,
pak a x je ukazatel na celé číslo.
& x je- pamatovat, a bude extrahovat adresa věci na pravé straně.
A protože ukazatel je jen adresa, než & x je ukazatel na celé číslo
, jehož hodnota je místo, kde v paměti x životech.
Je to adresa X..
Tak a x je adresa x.
Vezměme si tento krok dále a připojit se k něčemu
Narážel I v předchozím videu.
Pokud arr je pole čtyřhry, pak & arr hranatou závorku i je ukazatel
na dvojnásobek.
DOBŘE.
arr hranatou závorku I, pokud arr je pole se zdvojnásobí,
pak arr hranatou závorku i je i-tý prvek daného pole,
a & arr hranatou závorku i je, kde se v paměť i-tý prvek arr existuje.
>> Takže to, co je tady důsledky?
Pole jméno, implikace celé té věci,
Je to jméno Array je vlastně sám ukazatel.
Pracovali jste s ukazateli všechny podél
pokaždé, když jste použili pole.
Nezapomeňte z příkladu na variabilní rozsah,
blízko konci videa I představit příklad, kdy máme funkci
volal set int a Funkce tzv set pole.
A vaše výzva k určení, zda nebo ne, nebo to, co
hodnoty, které jsme vytisknout, konec funkce,
Na konci hlavního programu.
>> Pokud si vzpomínáte z tohoto příkladu nebo pokud jste sledovali video,
Víte, že když Ty- volání set int efektivně nic nedělá.
Ale výzva k nastavení pole dělá.
A nějak jsem přehlížel proč že byl případ v té době.
Jen jsem řekl, no je to pole, je to zvláštní, víte, je tu důvod.
Důvodem je to, že matice je Název je opravdu jen ukazatel,
a tam je to zvláštní hranatá závorka syntaxe
aby se věci mnohem lepší pracovat.
A oni dělají myšlenku ukazatel mnohem méně zastrašující,
a to je důvod, proč oni jsou druh prezentované tímto způsobem.
Ale ve skutečnosti pole jsou jen ukazatele.
A to je důvod, proč, když jsme udělal změnu pole,
když jsme míjeli pole jako parametr na funkci nebo jako argument
na funkci, obsah pole ve skutečnosti změní v volaným
a v volajícího.
Které pro každý jiný druh variabilní jsme viděli, nebyl tento případ.
Takže to je prostě něco, co byste měli mít na mysl, když pracujete s ukazateli,
je to, že na jméno array vlastně ukazatel
na první prvek tohoto pole.
>> OK, takže teď máme všechny tyto Fakta, pojďme dál, že jo.
Proč se staráme o kde něco žije.
No jak jsem řekl, je to docela užitečné vědět, kde žije něco
takže můžete jít tam a změnit to.
Práce s ním a vlastně mají věci, které vás
chcete udělat, aby této proměnné se projeví a neprojeví na nějaké kopie.
To se nazývá dereferencing.
Jdeme do reference a změníme hodnotu tam.
Takže pokud budeme mít ukazatel a nazývá pc, a to ukazuje na charakter,
pak můžeme říci, * a * pc pc je Jméno toho, co najdeme, když půjdeme
na adresu PC.
To, co jsme tam najdete je charakter a * pc je, jak jsme se odkazovat na data na to
lokalita.
A tak bychom mohli říci něco jako * ks = D, nebo něco takového,
a to znamená, že bez ohledu na byl na adresu paměti PC,
bez ohledu na charakter byl dříve tam je nyní D, řekneme-li, * ks = D.
>> Tak je to tady zase s nějaký divný věci C, vpravo.
Takže jsme viděli * dříve jako bytí nějak část datového typu,
a teď je to být používán v trochu jiný kontext
přístup k datům na místě.
Vím, že je to trochu matoucí a to je vlastně součástí tohoto celku
jako, proč ukazatele mají tuto mytologie kolem nich je tak složitý,
je tak trochu problém syntaxe, upřímně.
Ale * je používán v obou kontextech jak jako součást názvu typu,
a uvidíme trochu později něco jiného, ​​taky.
A právě teď je operátor dereference.
Tak to jde do reference, přistupuje data
v místě ukazatele, a vám umožňuje manipulovat dle libosti.
>> Nyní je to velmi podobné návštěvě vašeho souseda, hned.
Pokud víte, jaké jsou vaše soused žije, jsi
Není potloukal se svým sousedem.
Víš, že jste náhodou vím, kde žijí,
ale to neznamená, že by ctnost mít tyto znalosti
jste interakci s nimi.
Chcete-li pracovat s nimi, budete muset jít do svého domu,
musíš jít tam, kde žijí.
A jakmile to uděláte, pak můžete komunikovat
se s nimi stejně jako byste chtěli.
A podobně s proměnnými, musíte jít na jejich adresu
pokud je chcete komunikovat, můžete nejen znát adresu.
A jak jste jít na adresu je používat *, operátor dereference.
Co si myslíte, že se stane když se budeme snažit a dereference
ukazatel, jehož hodnota je null?
Připomeňme, že null ukazatel ukazuje na nic.
Takže pokud se pokusíte a dereference nic, nebo jít na adresu nic,
Co si myslíte, že se stane?
No, pokud jste uhodl segmentace chyba, měli byste být v pořádku.
Pokud se pokusíte a dereference nulový ukazatel,
utrpíte segmentace porucha. Ale počkejte,
Neříkal jsem ti, že pokud si nebudete
nastavit hodnotu svého ukazatel na něco smysluplného,
měli byste nastavit na null?
Udělal jsem, a vlastně segmentace vina je něco dobrého chování.
>> Už jste někdy prohlášen za proměnnou a Není okamžitě přiřazena její hodnotu?
Takže stačí říct int x; vy ne vlastně přiřadit na cokoliv
a pak později ve svém kódu, můžete vytisknout hodnotu x,
mají stále není přidělen ho na cokoli.
Často dostanete nula, ale někdy
může získat nějaké náhodné číslo, a nemáte tušení, odkud pochází.
Podobně mohou věci se stalo s ukazateli.
Když deklarujete ukazatel int * pk například,
a nemusíte přiřadit ji na hodnotu, dostanete čtyři bajty pro paměti.
Ať už čtyři bajty Paměť může systém
zjistíte, že mají nějakou významnou hodnotu.
A tam by mohl být něco, co už tam, že
již není potřeba jiný funkce, takže stačí mít
co data byla tam.
>> Co když jste se pokusili udělat dereference někteří adresa, kterou don't- existovaly
Již bajtů a informace v tam, že je nyní v ukazatelem.
Pokusíte-li se, že dereference ukazatel, můžete být umazávání s nějakou pamětí
že jste neměl v úmyslu , aby si s tím vším.
A ve skutečnosti byste mohli udělat něco opravdu zničující,
jako zlomit další program, nebo zlomit jinou funkci,
nebo dělat něco nebezpečného, ​​že jste neměl v úmyslu dělat vůbec.
A tak to je důvod, proč je ve skutečnosti dobrý nápad
stanovit své ukazatele na null, pokud se nenastavujte jim něco smysluplného.
Je to pravděpodobně lepší u konec dne pro vašeho programu
k havárii pak pro to dělat Něco, co šrouby nahoru
jiný program či jiné funkce.
To chování je pravděpodobně ještě méně než ideální právě shazovat.
A tak to je důvod, proč je vlastně dobrý zvyk
dostat se do nastavení své ukazatelů na null, pokud nechcete nastavit jim
ke smysluplnému hodnotu okamžitě, je hodnota, že víte,
a že můžete bezpečně dereference.
>> Takže pojďme se vrátit teď a podívat se na celkovou syntaxi situace.
Když řeknu, int * p ;, co jsem právě udělal?
To, co jsem udělal, je toto.
Vím, že hodnota p je adresa protože všechny ukazatele jsou jen
adresy.
Mohu dereference p pomocí operátoru *.
V této souvislosti je tady, v samém top Připomeňme * je součástí typu.
Int * je typ dat.
Ale mohu dereference p pomocí operátoru *,
a když jsem to, když půjdu na tuto adresu, co najdu na této adrese?
Najdu celé číslo.
Takže int * p je v podstatě řka, p je adresa.
Mohu dereference p a pokud Já ano, najdu celé číslo
v tomto umístění paměti.
>> OK, takže jsem řekl, tam byl další mrzutost s hvězdami
a tady je, kde to mrzutost s hvězdami je.
Už jste někdy zkoušeli deklarovat více proměnných stejného typu
na stejném řádku kódu?
Takže na vteřinu, předstírat, že řádek, kód Vlastně jsem tam v zelené barvě
tam není, a to jen říká int x, y, z ;.
Co to bude dělat, je skutečně vytvořit Tři celočíselné proměnné pro vás,
jeden s názvem x, jeden s názvem y, a jeden s názvem z.
Je to způsob, jak to udělat, aniž by s rozdělit na tři řádky.
>> Tady je místo, kde hvězdy dostat otravné znovu i když,
protože je ve skutečnosti součástí * jak název typu a část
z názvu proměnné.
A tak, když řeknu, int * px, py, pz, co jsem skutečně dostat je ukazatel na celé číslo
volal px a dvě celá čísla, py a pz.
A že to asi není to, co Chceme, že to není dobré.
>> Takže pokud chci vytvořit více ukazatele na stejném řádku, stejného typu,
a hvězdy, to, co jsem skutečně potřebují udělat, je říci, int * pa, pb *, * ks.
Teď mít jen řekl, že a teď vám to říkám,
jste pravděpodobně nikdy udělat.
A to je asi dobrá věc upřímně, protože byste mohli nechtěně
opomenout hvězdu, něco takového.
Je to asi nejlepší možná prohlásit ukazatele na jednotlivých linkách,
ale je to jen další z ty otravné syntaxe
věci s hvězdami, které dělají ukazatele tak těžké s ním pracovat.
Protože je to právě tento syntaktický bordel musíte pracovat přes.
S praxí to dělá Opravdu stát druhou přirozeností.
Pořád dělat chyby s ním ještě po naprogramování po dobu 10 let,
takže se nemusíte být narušena, pokud se něco stane pro vás, je to docela běžné upřímně.
Je to opravdu trochu vadou syntaxe.
>> OK, takže jsem trochu slíbil že bychom znovu
koncept, jak velký je řetězec.
No, kdybych vám řekl, že string, máme opravdu druh
lhal vám po celou dobu.
Neexistuje žádný datový typ nazvaný řetězec, a ve skutečnosti já
zmínil v jednom z našich Nejstarší videa na datové typy,
že řetězec byl datový typ, který byl vytvořen pro vás CS50.h.
Musíte #include CS50.h aby se ji používat.
>> No řetězec je opravdu jen alias za něco
volal char *, a ukazatel na znak.
No ukazatele, odvolání, jsou prostě řeší.
Takže to, co je velikost v bytech řetězce?
No to je čtyři nebo osm.
A důvod, proč říkám, čtyři nebo eight je proto, že ve skutečnosti
závisí na systému, Pokud používáte CS50 ide, char * je velikost char
* Je osm, to je 64-bitový systém.
Každá adresa v paměti je 64 bitů.
Pokud používáte CS50 spotřebiče nebo pomocí libovolného 32-bit stroj,
a vy jste slyšeli, že termín 32-bit Stroj, co je 32-bitový stroj?
No to prostě znamená, že každý adresa v paměti, je dlouhé 32 bitů.
A tak 32 bitů je čtyři bajty.
Takže char * jsou čtyři nebo osm bajtů v závislosti na vašem systému.
A skutečně všechny datové typy, a ukazatel na jakýchkoliv údajů
typ, protože všechny ukazatele jsou jen adresy, jsou čtyři nebo osm bajtů.
Takže pojďme to znovu diagram a pojďme k závěru,
toto video s trochou cvičení zde.
Tak tady je diagram jsme přestali s na samém začátku videa.
Tak co se stane teď, když řeknu * PK = 35?
Takže co to znamená, když říkám, * pk = 35?
Vezměte chvilku.
* pk.
V souvislosti tady, je * operátor dereference.
Takže když dereference Operátor se používá,
jdeme na adresu poukázal na o PK, a my se změnit to, co najdeme.
Takže * pk = 35 účinně to provede na obrázku.
Takže je to v podstatě syntakticky identické s z toho, že uvedený k = 35.
>> Ještě jeden.
Když řeknu int m, tvořím novou proměnnou s názvem m.
Nový box, to je zelené pole, protože to bude držet celé číslo,
a to je označen m.
Když řeknu m = 4, dal jsem integer do tohoto boxu.
Pokud řekněme pk = & m, jak se dělá tato změna diagram?
Pk = & m, vzpomínáte si, co se & Operátor dělá nebo se jmenuje?
Pamatujte si, že nějaké & název proměnné je adresa názvu proměnné.
Takže to, co říkáme, je pk dostane adresu m.
A co se stane, tak efektivně diagram je, že pk není delší body
až k, ale připomíná, m.
>> Opět ukazatele jsou velmi složité pro práci s
a berou hodně praxe, ale proto,
jejich schopnosti, aby vám pro přenos dat mezi funkcemi
a skutečně ti, Změny se projeví,
jak se vaše hlava kolem je opravdu důležité.
Pravděpodobně je nejsložitější téma diskutujeme v CS50,
ale hodnota, která vás získat od používání ukazatele
zdaleka převáží komplikací které pocházejí z seznámení se s nimi.
Takže přeji to nejlepší z štěstí učení o ukazatele.
Jsem Doug Lloyd, je to CS50.