>> [Prehrávanie hudby]
>> DOUG LLOYD: Ukazovatele, sme tu.
To sa pravdepodobne bude najťažšie téma
že hovoríme o v CS50.
A ak ste dočítali nič o ukazovatele
než by ste mohli byť trochu zastrašujúce ísť do tohto videa.
Je pravda, že ukazovatele Myslíte si, aby schopnosť
aby snáď mhouřit dosť zle, keď ste
práca s premennými a dát, a spôsobuje váš program k havárii.
Ale sú naozaj veľmi užitočné a oni nám to naozaj skvelý spôsob, ako umožniť
odovzdať dáta späť a prepínať medzi funkciami,
že sme schopní robiť inak.
>> A tak to, čo naozaj chcete urobiť, je tu vlak
budete mať dobrý ukazovateľ disciplínu, tak že môžete efektívne využívať ukazovatele
aby sa vaše programy, ktoré oveľa lepšie.
Ako som už povedal ukazovatele nám iný spôsob, ako odovzdať dáta medzi funkciami.
Teraz, ak si spomínate z skoršie video, keď
sme hovorili o variabilný priestor, som sa zmienil,
že všetky údaje, ktoré sme prejsť medzi Funkcie v C je odovzdaný podľa hodnoty.
A ja nemusí mať používal to Termín, čo som tam chcel
bolo to, že sme okolo kópie dát.
Keď sme sa odovzdať premennú do funkcie, nie sme v skutočnosti predkladanie ukazovateľa
do funkcie, že jo?
Sme odovzdaním kópie že dáta na funkciu.
Táto funkcia robí to, čo bude a vypočítava nejakú hodnotu,
a možno použijeme túto hodnotu keď to dáva ju späť.
>> Tam bola jedna výnimka toto pravidlo odovzdávanie hodnotou,
a my sa vrátime k tomu, čo, že je o niečo neskôr v tomto videu.
Ak budeme používať ukazovatele miesto použitie premenných,
alebo namiesto použitia premenných samy alebo kópie premenných,
teraz môžeme prejsť okolo premenné medzi funkcie v inak.
To znamená, že ak urobíme zmena v jednej funkcii,
že zmena bude skutočne trvať vplyv v inej funkcii.
Opäť platí, že to je niečo, sme nemohli urobiť skôr,
a ak ste niekedy skúšali swap Hodnota dvoch premenných vo funkcii,
ste si všimli tento problém nejako zakrádajú, že jo?
>> Ak chceme vymeniť X a Y a my odovzdať ich do funkciu nazvanú swapu,
vnútri funkcie swap premenné robiť výmennej hodnoty.
Jedna sa stáva dvoch, dvoch sa stane jednu, ale nie v skutočnosti
čokoľvek meniť v origináli funkcie, v volajúceho.
Vzhľadom k tomu, nemôžeme, sme len práce s ich kópie.
S ukazovateľmi ale môžeme skutočne prejsť X a Y do funkcie.
Táto funkcia môže robiť čo s nimi.
A tieto premenné hodnoty môže skutočne zmeniť.
Tak to je celkom zmena naša schopnosť pracovať s dátami.
>> Než sme sa ponoriť do ukazovatele, myslím, že to stojí za to
pričom niekoľko minút, aby sa vrátiť k základom tu.
A majú sa pozrieť, ako pamäť počítača práce
pretože tieto dva predmety idú k vlastne byť celkom vzájomne prepojené.
Ako asi viete, v systéme počítača
máte pevný disk alebo snáď solid state drive,
akési miesto uloženia súboru.
Je to zvyčajne niekde v susedstve 250 gigabajtov
sa možno pár terabajtov teraz.
A to je miesto, kde všetky vaše Súbory nakoniec žiť,
aj keď je počítač vypnutý off, môžete ho znovu zapnite
a zistíte, vaše súbory sú tam opäť po reštarte systému.
Ale disky, ako je pevný disk, HDD alebo SSD, SSD,
sú proste úložný priestor.
>> Nemôžeme vlastne robiť nič s dáta, ktoré sú v pevnom disku,
alebo v SSD.
Pre skutočné zmene údaje alebo ju presunúť okolo,
musíme ju presunúť do RAM, pamäť s priamym prístupom.
Teraz RAM, máte veľa menej vo vašom počítači.
Môžete mať niekde v susedstve 512 megabajtov
ak máte staršie počítač, na možno dva, štyri, osem, 16,
možno dokonca aj trochu viac, GB pamäte RAM.
Tak to je oveľa menšie, ale to je kde všetky prchavých dát existuje.
To je miesto, kde môžeme veci zmeniť.
Ale keď sme zase náš počítač vypnúť, všetky dáta v pamäti RAM je zničená.
>> Takže to je dôvod, prečo musíme mať pevný disk Pre viac trvalé umiestnenie toho,
tak, že by to exists- byť naozaj zlé, ak zakaždým, keď
obrátil náš počítač vypnúť, každý súbor v našom systéme bola zničená.
Tak sme prácu vnútri pamäte RAM.
A zakaždým, keď hovoríme o pamäť, do značnej miery, v CS50,
hovoríme o pamäti RAM, nie na pevnom disku.
>> Takže keď sme sa presunúť veci do pamäti, zaberie určitý priestor.
Všetky typy dát, ktoré sme pracovali s
zaujímajú rôzne množstvo priestoru v pamäti RAM.
Takže zakaždým, keď vytvoríte celé číslo variabilný, štyri bajtov pamäte
sú vyčlenené v pamäti RAM, takže vás môže pracovať s týmto celé číslo.
Môžete deklarovať celé číslo, zmeňte ho, priradiť
na hodnotu 10 inkrementovanou jedným, tak ďalej a tak ďalej.
Všetko, čo sa má stať v RAM, a dostanete štyri bajty
pracovať s pre každú integer, ktoré vytvoríte.
>> Každý znak vytvorenie dostane jeden bajt.
To je len, koľko miesta je potrebné k uloženiu charakter.
Každý plavák, skutočný číslo, dostane štyri byty
ak je to double presnosť s plávajúcou desatinnou čiarkou
číslo, ktoré vám umožnia majú presnejšie alebo číslic
za desatinnou čiarkou bez straty presnosti,
ktoré zaberajú osem bajtov pamäte.
Dlhé túži, naozaj veľké celé čísla, tiež zaberajú osem bajtov pamäte.
Koľko bajtov pamäte sa struny zaberajú?
Tak poďme dať kolík v tejto otázke pre teraz, ale vrátime sa k tomu.
>> Takže späť k tejto myšlienke pamäti ako veľké pole bajtov veľkosti buniek.
To je naozaj všetko, čo je, je to len obrovská pole buniek,
rovnako ako akékoľvek iné pole, ktoré ste oboznámení s, a vidieť,
okrem každý prvok je jeden bajt široký.
A rovnako ako pole, každý prvok má adresu.
Každý prvok poľa má index a my
Môžete použiť tento index na to tzv náhodný prístup na zoskupenie.
Nemusíme začínať začiatok poľa,
iterovat každý jediný prvok tejto zmluvy,
nájsť to, čo hľadáme.
Môžeme len povedať, chcem sa dostať do 15 prvok alebo 100. element.
A môžete práve v ten číslo a získať hodnotu hľadáte.
>> Podobne každé miesto V pamäti má adresu.
Takže vaše pamäť by mohla vyzerať nejako takto.
Tu je veľmi malý kus pamäť, to je 20 bajtov pamäte.
Prvých 20 bytov, pretože my rieši tam dole
sú 0, 1, 2, 3, a preto na celú cestu až do 19.
A keď som deklarovať premenné a keď začnem pracovať s nimi,
Systém bude nastavený stranou nejaký priestor pre mňa
V tejto pamäti pracovať s mojimi premenných.
A tak by som mohol povedať, char c rovná kapitál H. A čo sa bude diať?
No systém bude vyčleniť pre mňa jeden bajt.
V tomto prípade si vybral číslo bajtu štyri, byte na adrese štyri,
a to bude ukladať písmeno H kapitál tam pre mňa.
Ak by som potom povedal rýchlosť int Limit sa rovná 65, to je
chystá vyčleniť štyri bajtov pamäte pre mňa.
A to bude liečiť tých, štyri byty ako jeden celok
pretože to, čo pracujeme s je celé číslo sem.
A to bude ukladať 65 tam.
>> Teraz už som si trochu hovorím trochu lož,
pravdu, pretože vieme, že počítače pracujú v binárnej.
Nechápu nutne to, čo je hlavným mestom H
alebo čo je to 65 znamená, že iba pochopiť binárne, núl a jednotiek.
A tak vlastne to, čo sme skladovanie tam
nie je písmeno H a číslo 65, ale skôr binárne reprezentácie
tejto zmluvy, ktoré vyzerajú Trochu niečo také.
A najmä v kontext celočíselné premenné,
to nebude len pľuvať do, že to nebude brať to ako jeden štvorlôžkový
Byte kus nutne, je to vlastne deje
brať to ako štyri jedného byte kúsky, ktorý by mohol vyzerať nejako takto.
A ani to nie je úplne pravda buď,
pretože niečo, čo nazýva endianness, čo nie sme
sa dostať do teraz, ale ak ste zvedaví,
si môžete prečítať na malý a veľké endianness.
Ale na účely tohto argumentu, na účely tohto videa,
poďme len predpokladať, že je v Skutočnosť, ako sa číslo 65 by
byť zastúpený pamäť na každom systéme,
aj keď to nie je úplne pravda.
>> Ale poďme vlastne len dostať zbaviť všetkých binárne úplne,
a len premýšľať o tom, ako H a 65, je to oveľa jednoduchšie
premýšľať o tom takto že ako človek.
Dobre, takže to tiež vyzerá, možno trochu náhodný, že I've- môj systém
Nedal mi bytov 5, 6, 7, a 8 pre uloženie celé číslo.
Je tu dôvod pre to, tiež, čo nebudeme sa do teraz, ale postačí
uviesť, že to, čo Počítač je tu
je pravdepodobne dobrý ťah z jeho strany.
Ak nechcete, dajte mi pamäť, ktorá je nutne chrbtom k sebe.
Aj keď to bude robiť to teraz keď chcem získať ďalšie reťazec,
volal priezvisko, a ja chcem dať Lloyd tam.
Budem potrebovať, aby sa zmestili jeden znak, každé písmeno, ktoré je
bude vyžadovať jeden znak, jeden bajt z pamäte.
Takže ak by som mohol dať Lloyd do môjho poľa takto som celkom dobrý ísť, nie?
Čo chýba?
>> Pamätajte si, že každý reťazec pracujeme sa v C končí spätné lomítko nula,
a nemôžeme zabudnúť, že tu, a to buď.
Musíme vyčleniť jeden bajt pamäti rozhodol, že tak sme
vedieť, kedy náš reťazec skončila.
Takže znovu toto usporiadanie z cesty vecí
sa objaví v pamäti sile byť trochu náhodný,
ale v skutočnosti je to, ako väčšina systémov sú určené.
Ak chcete linka je na násobkoch štyri, z dôvodov, znovu
že nepotrebujeme, aby dostať sa do teraz.
Ale to je, tak stačí povedať, že po týchto troch riadkov kódu,
to je to, čo pamäte by mohol vyzerať.
Ak potrebujem pamäťových miest 4, 8, 12 a držať svoje dáta,
To je to, čo moja pamäť by mohla vyzerať.
>> A len byť obzvlášť tu, keď pedantská
hovoríme o pamäti adresy zvyčajne
tak urobiť pomocou hexadecimálne notácie.
Tak prečo nie my previesť všetky z nich z desiatkovej na hexadecimálne
len preto, že je všeobecne ako sme sa odkazovať na pamäti.
A tak namiesto toho, aby 0 až 19, čo máme, je nulový
x nula až nulovú x1 tri.
Tí, ktorí sú 20 bajtov pamäti, že sme majú alebo sa pozeráme na tejto snímke
práve tu.
>> Takže to všetko bolo povedané, poďme krok od pamäte na sekundu
a späť do ukazovateľa.
Tu je najdôležitejšie vec na zapamätanie
ako sme začať pracovať s ukazovateľmi.
Ukazovateľ je nič viac ako adresu.
Poviem to znovu, pretože je to tak dôležité,
ukazovateľ nie je nič viac ako adresu.
Ukazovatele sú adresy na miestach v pamäti, kde žijú premenné.
S vedomím, že sa stane dúfajme, že trochu jednoduchšie s nimi pracovať.
Ďalšia vec sa mi páči musíte urobiť, je mať triedenie
diagramov vizuálne reprezentovať to, čo je deje s rôznymi riadkov kódu.
A budeme to robiť pár časov v ukazovateľov,
a keď hovoríme o dynamický alokácie pamäti rovnako.
Pretože si myslím, že tieto diagramy môže byť obzvlášť užitočné.
>> Takže keď poviem, napríklad, int k v mojom kódu, čo sa deje?
No čo sa v podstate deje sa Začínam pamäte vyhradený pre mňa,
ale nemám ani rád premýšľať o tom, ako to, že som
Páči sa o tom premýšľať ako krabica.
Mám krabici a je to zelenej farbe, pretože ja
môže dať celé čísla v zelených poliach.
Keby to bol charakter I môže mať modrú škatuľu.
Ale ja vždy hovorím, keď som vytvoriť obdĺžnik, ktorý pojme celé čísla
že box je sfarbená zelene.
A ja sa stálou značku a píšem K na strane.
Takže mám okno s názvom K, do ktorej môžem dať celé čísla.
Takže keď poviem int k, to je čo sa deje v mojej hlave.
Keď poviem k rovná päť, čo mám robiť?
No, dávam päť v poli, vpravo.
Toto je veľmi jednoduché, ak Hovorím int k vytvoriť okno s názvom k.
Keď poviem k rovná 5, dať päť do krabice.
Dúfajme, že to nie je príliš veľký skok.
Tu je miesto, kde sa veci ísť málo zaujímavé hoci.
Keď poviem, int * PK, dobre, aj keď to neurobím viem, čo to nevyhnutne znamená,
Je to jasne niečo čo do činenia s celé číslo.
Takže idem na farbu Tento box green-ish,
Viem, že to má niečo čo do činenia s celým číslom,
ale to nie je celé číslo samo o sebe, pretože je to int hviezda.
Je tu niečo, mierne iný o tom.
Takže zapojiť celé číslo je, ale inak je to
príliš nelíši od to, čo sme hovorili o.
Je to krabica, jej dostal označenie, je to na sebe štítok PK,
a to je schopné udržať int hviezdy, bez ohľadu na to sú.
Majú niečo spoločné s celými číslami, jasne.
Tu je posledný riadok hoci.
Keď poviem pk = & K, Whoa, čo sa práve stalo, že jo?
Takže to náhodné číslo, zdanlivo náhodné číslo, dostane hodená do poľa tam.
Všetko, čo je, je pk dostane adresu k.
Takže som sa držať, kde k býva v pamäti, jeho adresu, na adresu jeho bajtov.
Všetko, čo robím, je, že hovorím táto hodnota je to, čo budem
dať vnútri mojej okno s názvom pk.
A pretože tieto veci sú ukazovatele, a preto, že hľadáte
na povrázku ako nulovú x eight zero c siedmich štyroch ôsmich
dvoch nula je pravdepodobne nemá veľký význam.
Keď sme sa všeobecne predstaviť ukazovatele, máme vlastne robiť tak ako ukazovatele.
Pk nám dáva informáciu musíme nájsť K v pamäti.
Takže v podstate pk má šípku v ňom.
A ak budeme chodiť dĺžku tejto šípky, predstavte si,
je to niečo, čo môžete ísť ďalej, keby sme prechádzka po celej dĺžke šípky,
na samom konci tejto šípky, sme nájde miesto v pamäti
kde k býva.
A to je naozaj dôležité pretože akonáhle budeme vedieť, kde k bývajú,
môžeme začať pracovať s dátami vnútri tej miesto v pamäti.
Aj keď sme sa dostávame Teeny bit pred seba pre túto chvíľu.
>> Takže to, čo je ukazovateľ?
Ukazovateľ je dátová položka, ktorej hodnota je adresa pamäti.
To bolo to, že nulou x osem nula stuff deje, že bola adresa pamäti.
To bol umiestnenia v pamäti.
A typ ukazovateľa opisuje druh
dát nájdete v že adresa pamäti.
Takže je tu int hviezda časť vpravo.
Ak by som sa touto šíp, to je ma viesť k umiestnenie.
A to je miesto, to, čo som Nájdete tu v mojom príklade,
je zelený farebný box.
Je to celé číslo, to je to, čo som Nájdete keď pôjdem na túto adresu.
Typ Dátová ukazovateľ opisuje, čo sa
nájdete na tejto adrese pamäti.
Tak tu je naozaj super vec hoci.
Ukazovatele nám umožňuje prejsť premenné medzi funkciami.
A skutočne odovzdať premenné a neprejde ich kópie.
Pretože ak budeme presne vedieť, kde v pamäti nájsť premennú,
nepotrebujeme, aby kópiu to, môžeme ísť na dané miesto
a prácu s týmto premenné.
Takže v zásade iba ukazovatele sort o vytvorenie prostredia počítača
oveľa viac ako v reálnom svete, hneď.
>> Tak tu je analógiou.
Povedzme, že mám notebook, vpravo, a je plná poznámok.
A ja by som rád, keby ste ho aktualizovať.
Ste funkcia, ktorá aktualizácie poznámky, správne.
V spôsobe, akým sme boli pracuje tak ďaleko, čo
stane sa budete mať môj notebook, pôjdete do obchodu kopírovanie,
budete robiť kópiu Xerox o každá stránka notebooku.
Budete opustiť svoj notebook späť na mojom stole, keď budete hotoví,
pôjdeš a vyškrtnúť veci v mojom notebook, že sú zastarané alebo zle,
a potom budete míňať späť me stoh stránok spoločnosti Xerox
že je replikou môjho notebooku s zmeny, ktoré ste vykonali na neho.
A v tomto bode, je to na mňa ako volajúci funkcie, ako volajúci,
sa rozhodnú vziať svoje poznámky a začleniť ich späť do svojho notebooku.
Takže je tu veľa krokov tu jedná, vpravo.
Ako by to bolo lepšie keď som len povedať, hej, môžete
aktualizovať svoje notebook pre me, odovzdať vám svoje notebook,
a budete mať veci a doslova kríž je von
a aktualizovať svoje poznámky v notebooku.
A potom mi daj môj notebook späť.
Je to niečo, čo ukazovatele nám umožňujú robiť,
robia to prostredie veľa viac ako ako pracujeme v skutočnosti.
>> Dobre, takže to, čo je ukazovateľ je, poďme hovoriť
o tom, ako ukazovatele pracovať v C, a ako môžeme začať pracovať s nimi.
Takže tam je veľmi jednoduchý ukazovateľ v C nazýva nulový ukazovateľ.
Ukazovatele null ukazuje na nič.
To pravdepodobne vyzerá, že to v skutočnosti nie je moc užitočná vec,
ale ako budeme vidieť niečo neskôr, skutočnosť,
že tento ukazovateľ null existuje v skutočnosti naozaj môže prísť vhod.
A pri každom vytvorení ukazovateľ a nenastavíte jej hodnotu immediately-
príklad nastavenia jeho hodnota okamžite
bude pár snímok späť kde som povedal, pk rovná & K,
pk dostane adresy K, ako je uvidíme, čo to znamená,
uvidíme, ako sa kód, ktorý shortly- ak nebudeme nastavte jej hodnotu na niečo
zmysluplné okamžite, by ste mali vždy
nastavte ukazovateľ myši na bod na hodnotu null.
Mali by ste nastaviť tak, aby ukazoval na nič.
>> To je veľmi odlišné, než odchode hodnotu, ako je to
a potom vyhlasuje ukazovateľ a len za predpokladu, že
to je null, pretože to je len zriedka pravda.
Takže by ste mali vždy nastaviť Hodnota ukazovateľa
na null, ak nenastavíte jej hodnotu na niečo zmysluplné okamžite.
Môžete skontrolovať, či hodnoty ukazovateľ je je null pomocou operátora rovnosti
(==), Rovnako ako vy porovnať ľubovoľné celé číslo hodnoty alebo znak hodnoty pomocou (==)
tiež.
Je to zvláštny druh konštanty hodnota, ktorú možno použiť na testovanie.
Takže to bol veľmi jednoduchý ukazovateľ, ukazovatele null.
Ďalším spôsobom, ako vytvoriť ukazovateľ je získať
adresa premenné ste už vytvorili,
a vy to pomocou & adresa extrakcie operátor.
Čo sme už videli skôr V prvom príklade diagrame som ukázal.
Takže ak x je premenná, ktorá máme už vytvorili typu integer,
potom a x je ukazovateľ na celé číslo.
& X je- pamätať, a bude extrahovať adresa veci na pravej strane.
A pretože ukazovateľ je len adresa, než & x je ukazovateľ na celé číslo
, Ktorého hodnota je miesto, kde v pamäti x životoch.
Je to adresa X ..
Tak a x je adresa x.
Zoberme si tento krok ďalej a pripojiť sa k niečomu
Narážal Aj v predchádzajúcom videu.
Ak arr je pole štvorhry, potom & Arr hranatou zátvorku aj je ukazovateľ
na dvojnásobok.
OK.
arr zátvorka I, ak arr je pole sa zdvojnásobí,
potom arr hranatou zátvorku aj je i-tý prvok daného poľa,
a & ARR hranatou zátvorku aj je, kde sa v pamäť i-ty prvok arr existuje.
>> Takže to, čo je tu dôsledky?
Poľa meno, implikácia celej tej veci,
Je to meno Array je vlastne sám ukazovateľ.
Pracovali ste s ukazovateľmi všetky pozdĺž
zakaždým, keď ste použili poľa.
Nezabudnite z príkladu na variabilné rozsah,
blízko konci videa Aj predstaviť príklad, kedy máme funkciu
volal set int a Funkcia tzv set poľa.
A vaša výzva na určenie, či alebo nie, alebo to, čo
hodnoty, ktoré sme vytlačiť, koniec funkcie,
Na konci hlavného programu.
>> Ak si spomínate z tohto príkladu alebo ak ste sledovali video,
Viete, že keď Knižný volanie set int efektívne nič nerobí.
Ale výzva na nastavenie poľa robí.
A nejako som prehliadal prečo že bol prípad v tom čase.
Len som povedal, no je to pole, je to zvláštne, viete, je tu dôvod.
Dôvodom je to, že matica je Názov je naozaj len ukazovateľ,
a tam je to zvláštne hranatá zátvorka syntaxe
aby sa veci oveľa lepšie pracovať.
A oni robia myšlienku ukazovateľ oveľa menej zastrašujúce,
a to je dôvod, prečo oni sú druh prezentované týmto spôsobom.
Ale v skutočnosti polia sú len ukazovatele.
A to je dôvod, prečo, keď sme urobil zmenu poľa,
keď sme míňali pole ako parameter na funkciu alebo ako argument
na funkciu, obsah poľa v skutočnosti zmení v volaným
a v volajúceho.
Ktoré pre každý iný druh variabilný sme videli, nebol tento prípad.
Takže to je proste niečo, čo by ste mali mať na myseľ, keď pracujete s ukazovateľmi,
je to, že na meno array vlastne ukazovateľ
na prvý prvok tohto poľa.
>> OK, takže teraz máme všetky tieto Fakty, poďme ďalej, že jo.
Prečo sa staráme o kde niečo žije.
No ako som povedal, je to celkom užitočné vedieť, kde žije niečo
takže môžete ísť tam a zmeniť to.
Práca s ním a vlastne majú veci, ktoré vás
chcete urobiť, aby tejto premennej sa prejaví a neprejaví na nejaké kópie.
To sa nazýva dereferencing.
Ideme do referencie a zmeníme hodnotu tam.
Takže ak budeme mať ukazovateľ a nazýva pc, a to ukazuje na charakter,
potom môžeme povedať, * a * pc pc je Meno toho, čo nájdeme, keď pôjdeme
na adresu PC.
To, čo sme tam nájdete ich charakter a * Pc je, ako sme sa odkazovať na dáta na to
lokalita.
A tak by sme mohli povedať niečo ako * Ks = D, alebo niečo také,
a to znamená, že bez ohľadu na bol na adresu pamäti PC,
bez ohľadu na charakter bol predtým tam je teraz D, povieme-li, * ks = D.
>> Tak je to tu zase s nejaký divný veci C, vpravo.
Takže sme videli * skôr ako bytia nejako časť dátového typu,
a teraz je to byť používaný v trochu iný kontext
prístup k dátam na mieste.
Viem, že je to trochu mätúce a to je vlastne súčasťou tohto celku
ako, prečo ukazovatele majú túto mytológie okolo nich je tak zložitý,
je tak trochu problém syntaxe, úprimne.
Ale * je používaný v oboch kontextoch ako ako súčasť názvu typu,
a uvidíme trochu neskôr niečo iné, taky.
A práve teraz je operátor dereferencia.
Tak to ide do referencie, pristupuje dáta
v mieste ukazovatele, a vám umožňuje manipulovať podľa ľubovôle.
>> Teraz je to veľmi podobné návšteve vášho suseda, hneď.
Ak viete, aké sú vaše sused žije, si
Nie je potĺkal so svojím susedom.
Vieš, že ste náhodou viem, kde žijú,
ale to neznamená, že by cnosť mať tieto znalosti
ste interakciu s nimi.
Ak chcete pracovať s nimi, budete musieť ísť do svojho domu,
musíš ísť tam, kde žijú.
A akonáhle to urobíte, potom môžete komunikovať
sa s nimi rovnako ako by ste chceli.
A podobne s premennými, musíte ísť na ich adresu
pokiaľ ich chcete komunikovať, môžete nielen poznať adresu.
A ako ste ísť na adresu je používať *, operátor dereferencia.
Čo si myslíte, že sa stane keď sa budeme snažiť a dereferencia
ukazovateľ, ktorého hodnota je null?
Pripomeňme, že null ukazovateľ ukazuje na nič.
Takže ak sa pokúsite a dereferencia nič, alebo ísť na adresu nič,
Čo si myslíte, že sa stane?
No, ak ste uhádol segmentácie chyba, mali by ste byť v poriadku.
Ak sa pokúsite a dereferencia nulový ukazovateľ,
utrpíte segmentácia porucha. Ale počkajte,
Nehovoril som ti, že ak si nebudete
nastaviť hodnotu svojho ukazovateľ na niečo zmysluplné,
mali by ste nastaviť na null?
Urobil som, a vlastne segmentácia vina je niečo dobré správanie.
>> Už ste niekedy vyhlásený za premennú a Nie je okamžite priradená jej hodnotu?
Takže stačí povedať int x; vy nie vlastne priradiť na čokoľvek
a potom neskôr vo svojom kóde, môžete vytlačiť hodnotu x,
majú stále nie je pridelený ho na čokoľvek.
Často dostanete nula, ale niekedy
môže získať nejaké náhodné číslo, a nemáte tušenie, odkiaľ pochádza.
Podobne môžu veci sa stalo s ukazovateľmi.
Keď deklarujete ukazovateľ int * pk napríklad,
a nemusíte priradiť ju na hodnotu, dostanete štyri bajty pre pamäte.
Či už štyri bajty Pamäť môže systém
zistíte, že majú nejakú významnú hodnotu.
A tam by mohol byť niečo, čo už tam, že
už nie je potreba iný funkcie, takže stačí mať
čo dáta boli tam.
>> Čo keď ste sa pokúsili urobiť dereferencia niektorí adresa, ktorú don't- existovali
Už bajtov a informácie v tam, že je teraz v ukazovateľom.
Ak sa pokúsite, že dereferencia ukazovateľ, môžete byť umazávání s nejakou pamäťou
že ste nemal v úmysle , Aby si s tým všetkým.
A v skutočnosti by ste mohli urobiť niečo naozaj zničujúce,
ako zlomiť ďalší program, alebo zlomiť inú funkciu,
alebo robiť niečo nebezpečné, že ste nemal v úmysle robiť vôbec.
A tak to je dôvod, prečo je v skutočnosti dobrý nápad
stanoviť svoje ukazovatele na null, ak sa nenastavujte im niečo zmysluplné.
Je to pravdepodobne lepšie u koniec dňa pre vášho programu
k havárii potom pre to robiť Niečo, čo skrutky hore
iný program či iné funkcie.
To správanie je pravdepodobne ešte menej ako ideálne práve zhadzovať.
A tak to je dôvod, prečo je vlastne dobrý zvyk
dostať sa do nastavenia svojej ukazovateľov na null, ak nechcete nastaviť im
ku zmysluplnému hodnotu okamžite, je hodnota, že viete,
a že môžete bezpečne dereferencia.
>> Takže poďme sa vrátiť teraz a pozrieť sa na celkovú syntax situácie.
Keď poviem, int * p;, čo som práve urobil?
To, čo som urobil, je toto.
Viem, že hodnota p je adresa pretože všetky ukazovatele sú len
adresy.
Môžem dereferencia p pomocou operátora *.
V tejto súvislosti je tu, v samom top Pripomeňme * je súčasťou typu.
Int * je typ dát.
Ale môžem dereferencia p pomocou operátora *,
a keď som to, keď pôjdem na túto adresu, čo nájdem na tejto adrese?
Nájdem celé číslo.
Takže int * p je v podstate povediac, p je adresa.
Môžem dereferencia p a pokiaľ Ja áno, nájdem celé číslo
v tomto umiestnení pamäti.
>> OK, takže som povedal, tam bol ďalší mrzutosť s hviezdami
a tu je, kde to mrzutosť s hviezdami je.
Už ste niekedy skúšali deklarovať viac premenných rovnakého typu
na rovnakom riadku kódu?
Takže na sekundu, predstierať, že riadok, kód Vlastne som tam v zelenej farbe
tam nie je, a to len hovorí int x, y, z;.
Čo to bude robiť, je skutočne vytvoriť Tri celočíselné premenné pre vás,
jeden s názvom x, jeden s názvom y, a jeden s názvom z.
Je to spôsob, ako to urobiť bez toho, aby s rozdeliť na tri riadky.
>> Tu je miesto, kde hviezdy dostať otravné znovu aj keď,
pretože je v skutočnosti súčasťou * ako názov typu a časť
z názvu premennej.
A tak, keď poviem, int * px, py, pz, čo som skutočne dostať je ukazovateľ na celé číslo
volal px a dve celé čísla, py a pz.
A že to asi nie je to, čo Chceme, že to nie je dobré.
>> Takže ak chcem vytvoriť viac ukazovatele na rovnakom riadku, rovnakého typu,
a hviezdy, to, čo som skutočne potrebujú urobiť, je povedať, int * pa, pb *, * ks.
Teraz mať len povedal, že a teraz vám to hovorím,
ste pravdepodobne nikdy urobiť.
A to je asi dobrá vec úprimne, pretože by ste mohli nechtiac
opomenúť hviezdu, niečo také.
Je to asi najlepšia možná vyhlásiť ukazovatele na jednotlivých linkách,
ale je to len ďalší z tie otravné syntaxe
veci s hviezdami, ktoré robia ukazovatele tak ťažké s ním pracovať.
Pretože je to práve tento syntaxe bordel musíte pracovať cez.
S praxou to robí Naozaj stať druhou prirodzenosťou.
Stále robiť chyby s ním ešte po naprogramovaní po dobu 10 rokov,
takže sa nemusíte byť narušená, ak sa niečo stane pre vás, je to celkom bežné úprimne.
Je to naozaj trochu vadou syntaxe.
>> OK, takže som trochu sľúbil že by sme znovu
koncept, aký veľký je reťazec.
No, keby som vám povedal, že string, máme naozaj druh
klamal vám po celú dobu.
Neexistuje žiadny dátový typ nazvaný reťazec, a v skutočnosti ja
zmienil v jednom z našich Najstaršie videá na dátové typy,
že reťazec bol dátový typ, ktorý bol vytvorený pre vás CS50.h.
Musíte #include CS50.h aby sa ju používať.
>> No reťazec je naozaj len alias za niečo
volal char *, a ukazovateľ na znak.
No ukazovatele, odvolanie, sú proste rieši.
Takže to, čo je veľkosť v bytoch reťazca?
No to je štyri alebo osem.
A dôvod, prečo hovorím, štyri alebo eight je preto, že v skutočnosti
závisí na systéme, Ak používate CS50 ide, char * je veľkosť char
* Je osem, to je 64-bitový systém.
Každá adresa v pamäti je 64 bitov.
Ak používate CS50 spotrebiče alebo pomocou ľubovoľného 32-bit stroj,
a vy ste počuli, že termín 32-bit Stroj, čo je 32-bitový stroj?
No to jednoducho znamená, že každý adresa v pamäti, je dlhé 32 bitov.
A tak 32 bitov je štyri bajty.
Takže char * sú štyri alebo osem bajtov v závislosti na vašom systéme.
A skutočne všetky dátové typy, a ukazovateľ na akýchkoľvek údajov
typ, pretože všetky ukazovatele sú len adresy, sú štyri alebo osem bajtov.
Takže poďme to znova diagram a poďme k záveru,
toto video s trochou cvičenia tu.
Tak tu je diagram sme prestali s na samom začiatku videa.
Tak čo sa stane teraz, keď poviem * PK = 35?
Takže čo to znamená, keď hovorím, * pk = 35?
Vezmite chvíľku.
* Pk.
V súvislosti tu, je * operátor dereferencia.
Takže keď dereferencia Operátor sa používa,
ideme na adresu poukázal na o PK, a my sa zmeniť to, čo nájdeme.
Takže * pk = 35 účinne to vykoná na obrázku.
Takže je to v podstate syntakticky identické s z toho, že uvedený k = 35.
>> Ešte jeden.
Keď poviem int m, tvorím novú premennú s názvom m.
Nový box, to je zelené polia, pretože to bude držať celé číslo,
a to je označený m.
Keď poviem m = 4, dal som integer do tohto boxu.
Ak povedzme pk = & m, ako sa robí táto zmena diagram?
Pk = & m, spomínate si, čo sa & Operátor robí alebo sa volá?
Pamätajte si, že nejaké & názov premennej je adresa názvu premenné.
Takže to, čo hovoríme, je pk dostane adresu m.
A čo sa stane, tak efektívne diagram je, že pk nie je dlhšia body
až k, ale pripomína, m.
>> Opäť ukazovatele sú veľmi zložité pre prácu s
a berú veľa praxe, ale preto,
ich schopnosti, aby vám pre prenos dát medzi funkciami
a skutočne tí, Zmeny sa prejavia,
ako sa vaša hlava okolo je naozaj dôležité.
Pravdepodobne je najzložitejšie tému diskutujeme v CS50,
ale hodnota, ktorá vás získať od používania ukazovateľa
zďaleka preváži komplikácií ktoré pochádzajú z zoznámenie sa s nimi.
Takže prajem to najlepšie z šťastie učenie o ukazovatele.
Som Doug Lloyd, je to CS50.