[Powered by Google Translate] [4. týždeň, pokračovanie]
[David J. Malan - Harvard University]
[To je CS50. - CS50.TV]
>> To je CS50, a to je koniec 4. týždni.
Takže nejaká dobrá správa, a niektoré zlé správy.
No prednáška v pondelok, nie je problém nastaviť budúci týždeň. [Študenti fandenie]
Tie nebude páčiť, kde to bude.
Ale máme toto miesto budúcu stredu,
a tam je tiež podľa sylabu 1 prednáške piatok budúci piatok, takže môžeme zostať na trati.
Ale všetko bude natočený ako zvyčajne, tak, aby sa nebála.
>> A s ohľadom na kvíz 0, čo budeme robiť, ku konca týždňa
je príspevok na ihrisku v úvodnej cs50.net vysvetlenie
z akej očakávania, mali by ste mať, pokiaľ ide o prvý kvíz.
Všeobecne platí, že to multiple choice, true-false, krátka odpoveď, krátke kódovanie problémy.
Nebudete sa očakáva, že na vykonanie ekvivalent
o problém, ktorý by videl na PSet, pre ktoré máte počítač
a debugger a podobne, ale bude malé kódovanie problémy.
>> A skutočne, najlepším vodítkom získať pocit z toho, čo CS50 kvízy sú ako
, Je ísť na cs50.net, prejdite na kvízy odkaz,
a môžete vidieť, že v minulých niekoľko rokov v hodnote kvízov.
Len si uvedomiť, že kurikulum nie je vždy rovnaká v priebehu rokov.
Niekedy pridáme, niekedy odčítanie,
takže ak vidíte nejaké témy na jednom z tých starých kvízy
že nemáte tušenie, čo to hovorí, je to buď, že sme sa pokryť
alebo že sme nemali pokryť.
Ale v forma hodnotenia, túto nedeľu, pondelok a utorok
rovnako ako v priebehu kurzu širokú preskúmanie zasadnutí v nedeľu večer -
čas a miesto budú oznámené na ihrisku domovskú stránku -
máte všetci možnosť prezrieť s priebehom v učebných kolegami
materiál pre tento rok, a to ako v priereze a ako plné triedy,
a tie bude natočený ako zvyčajne tiež.
>> Dobrá. Takže bez ďalších okolkov, jeden komentár na vyhovel / nevyhovel a pridajte / drop.
Možno ste videli svoje poznámky minulú noc, a to je naozaj len niektoré ďalšie upokojenie
že ak patríte medzi tých, najmä menej pohodlné, alebo niekde medzi
a máte pocit, len trochu v tom až po hlavu,
si uvedomiť, že je naozaj celkom normálne, a tam je dostatok nosná konštrukcia v mieste,
z ktorých jedna úradné hodiny bol zaujatý na zlepšenie a to tým skôr za mojej e-mailovej minulú noc,
a uvedomiť si, že príliš možností, ako vyhovel / nevyhovel pre triedu, ako je tento
Naozaj je potrebné ako mechanizmus vziať okraj preč kurzu, ako je táto,
takže znovu, ak trávite tých 10, 15, 20 hodín
Len sa snažím získať nejaké PSet do práce a viete, že ste 90-95%, ako je
ale nemôžete nájsť nejaký prekliaty chybu, v priesmyku / zlyhanie modelu, ktorý je trochu v poriadku.
>> Myšlienka je, že sa tohto mechanizmu si potom môžu ísť zamerať na vaše ďalšie psets
alebo spať alebo čo to je, že chcete zamerať.
Takže si uvedomiť, že máte do tejto nadchádzajúcej utorok - technicky 5. pondelok,
ale je to sviatok, takže to príde utorok - prejsť z režimu pass / fail, aby triedených alebo naopak.
A ak ste naozaj nad priepasťou a uvažujete o zvrhnutie celkom,
prosím, chyť ma po prednáške alebo napíšte mi poznámku.
Radi by sme aspoň chatu pred ponuku Adieu.
Dobrá. Takže sme začali brať na školenie kolesá off minule.
Najmä sme sa zamerali na povrázku.
Reťazec je niečo, čo vyhlásil v knižnici CS50,
konkrétne v tomto súbore s názvom cs50.h ktoré začneme pozerať na tento týždeň a budúci.
Ale reťazec je naozaj len zjednodušenie niečo
to je trochu arcanely opísať ako char *.
Char sme zvyknutí. Je to len jeden znak.
Ale * v pondelok označil čo? >> [Študent] ukazovateľ.
Ukazovateľ. A čo je ukazovateľ? >> [Študent] adresa.
>> Je to ako adresa, umiestnenie v pamäti.
Čo je to adresa alebo umiestnenie, alebo spomienka?
Opäť platí, že každý z nás má notebooky s koncertom alebo 2 GB pamäte RAM s najväčšou pravdepodobnosťou v týchto dňoch,
a to znamená, že máte miliárd 2000000000 bajtov v hodnote pamäti.
A to naozaj nie je jedno, čo to fyzicky vyzerá,
ale vziať na viere, že môžete očíslovať všetky jednotlivých bajtov, že váš vlastný notebook má -
To je bajt 0, to je bajt 1, to je byte 2000000000 -
a to je presne to, čo robí počítač.
Keď prideliť priestor pre jeden znak, napríklad,
zrejme musí žiť niekde v pamäti počítača,
a možno, že je to v byte číslo 12345,
a to je niekde tu v pamäti počítača.
A adresa potom tohto charakteru je 12345.
>> Teraz, v týždni 0 až teraz tak ďaleko, sme sa naozaj záleží
kde v pamäti veci sú uložené, pretože sa zvyčajne používajú symboly,
premenné, a pole sa skutočne dostať na naše dáta.
Ale v pondelok a všetkých viac dnes, budete teraz musieť
všetky ďalšie výrazné schopnosti s písaním programov
naozaj manipulovať s pamäti počítača však uznáte za vhodné,
ako pre dobré účely a zlých,
chyby je veľmi bežný výsledok v tomto bode v učení toto.
Ale čo to vlastne znamená byť char *?
Poďme ďalej späť k - a vrátime sa Binkym, ako som sľúbil dnes.
Poďme na jednoduchom príklade tu.
Dovoľte mi, aby som tento súbor uložiť ako compare.c, a dovoľte mi trochu šablóny kód tu
tak patrí stdio.h, dovoľte mi, aby som tiež dávam patrí cs50.h. Budem zoomovať až tam.
Dovoľte mi, aby som začal písať hlavné int, main (void), a teraz chcem urobiť niečo takéto:
printf ("Daj mi reťazec:") a potom budem používať string s dostane GetString
k získaniu reťazca od užívateľa, potom som sa opýtať používateľa na iného.
("Daj mi ešte reťazec:") a budem sa ich spýtať cez GetString sa dostať, že.
Zavolám jej t, pretože t prichádza po S a S je pekné meno pre reťazce, pokiaľ je to celkom druhový.
Takže GetString, a teraz chcem urobiť zdravý rozum kontrolu a budem hovoriť
if (s == t) potom som len tak povedať užívateľa printf ("Zadali ste to isté \ n!");
inak budem vytlačiť niečo ako ("Zadali ste niečo iné! \ n")
alebo čo veta bude. Takže niečo také.
Potom ako zvyčajne, vrátim 0, ktorá sa práve znamenali, že sa nič nestalo,
a ja idem ďalej a skompilovať a spustiť tento program.
>> Ale v pondelok sme spustili tento program,
a vlastne bolo povedané, že HELLO nie HELLO a GOODBYE nie je GOODBYE.
Správanie sme videli, bolo trochu viac ako toto.
Nechaj ma ísť do môjho zdrojového adresára, zoom sem, a poďme sa urobiť porovnanie.
Spracovala poriadku. Dovoľte mi, aby som spustiť porovnanie. Daj mi reťazec: HELLO.
Daj mi ešte reťazec: HELLO.
Zadali ste niečo iné!
No, skúsim niečo jednoduchšie ako 50, 50. Zadali ste niečo iné!
hi, hi. Tak jasne, niečo sa deje.
Ale čo bolo vysvetlenie, prečo?
Zdá sa, že linka 12 je úplne nefunkčný.
Čo je to zásadný problém tu? Jo. >> [Študent] Je to porovnaním adries.
Jo, presne tak. Je to vlastne porovnávanie adresy
, V ktorom sú uložené HELLO a HELLO.
Nie je to porovnaním listy HELLO znova a znova,
pretože to, čo sa naozaj stalo, celú tú dobu sme boli s použitím GetString -
Táto tabuľa je opäť našej pamäti počítača,
a povedzme, že som zavolať GetString po deklarovaní premennej s
Čo moja pamäť vyzerať?
Povedzme ľubovoľne povedať, že to vyzerá takto. Je to štvorec.
A skoro žiadne, kedy som kreslila kus pamäte na obrazovke
ak je to 32 bitov som bola kresba štvorcov, ako je tento, pretože skutočne v zariadení,
ukazovateľ, adresa, je 32 bitov. Je to rovnaké ako int.
To môže líšiť v závislosti na počítačovom systéme.
Tí z vás, ktorí sú matne oboznámení s tým, že váš Mac alebo PC je 64 bitov,
že vlastne označuje, že váš počítač používa 64-bitové ukazovatele,
64-bitové adresy, a medzi upsides na ktoré je vaše počítače
môžu mať oveľa viac pamäte RAM, než minulosti.
Dlhý príbeh krátky, späť v deň, keď počítače používa iba 32 bitov
reprezentovať adries, najväčší počet bytov, by mohlo predstavovať
v tomto prípade je to, čo máte 32 bitov?
Takže 4000000000, pravé, pretože 2 na 32 je 4 mld Sk.
Toto číslo sa opakujúce v priebehu.
>> Takže ak máte len 32 bitov, najvyššie číslo, ktoré sa môžete spoľahnúť, je zhruba 4 mld Sk.
Ale to bola zásadné obmedzenie počítačov až do doby pred niekoľkými rokmi
pretože ak môžete len počítať tak vysoko ako 4000000000,
nezáleží na tom, či si kúpite 8 GB pamäte RAM alebo dokonca 5 GB pamäte RAM;
nemôžete počítať, že vysoká, takže to bolo k ničomu.
Dalo by sa pristupovať iba prvé 3 alebo 4 GB pamäte vášho počítača.
To je menší problém teraz, a môžete si kúpiť MacBook Pros a Dells
s 8 GB pamäte RAM alebo ešte v týchto dňoch.
Ale keby som prideliť jednoducho v tomto programe ukazovateľ, ukazovateľ nazvaný s,
by to mohlo vyzerať takto na obrazovke, pretože skutočne potrebujeme odtrhnite tejto vrstvy.
Stále hovoril reťazec, ale v pondelok, string je naozaj char *,
adresa nejakého charakteru.
Takže poďme sa, že školenia koleso off, aj keď budeme aj naďalej používať GetString teraz.
Tak som vyhlásil s, a to je kus pamäte, 32 bitov.
Čo je tu v pamäti v predvolenom nastavení? >> [Nepočuteľné Študent odpoveď]
Čo je to? >> [Študent] Garbage. >> Garbage. Presne tak.
Ak programátor nedávajte hodnotu premennej, kto vie, čo to je?
Niekedy máte šťastie a je to 0, ktorý je tak trochu pekné, čisté predvolené hodnoty,
ale ako sme videli Pondelok, niekedy je to úplný nezmysel,
niektoré naozaj veľké kladné alebo záporné číslo, ktoré prišlo odkiaľ?
Jo. >> [Študent] funkcie pred. Jo >>.
>> Často funkcie, ktorá dostala len predtým, pretože zapamätať,
ako volať funkcie v pamäti, zaberajú viac a viac priestoru zdola nahor,
a akonáhle sa funkcia vráti, dostane znovu, že pamäť
do budúceho chlap, ktorý sa nazýva, ktorý je pomocou rovnakého plátok pamäte.
A ak ste opustil odpadky tam, predchádzajúce hodnoty,
môžeme mylne s ako s nejakú hodnotu, keď naozaj nemáme dať tam niečo.
Takže naše RAM v tomto bode vyzerá takto.
Teraz na pravej strane riadku 7 voláme GetString,
ktoré sme robili teraz týždňov, ale to, čo je GetString naozaj robí?
GetString napísal CS50 personálu je málo inteligentný
v tom, že akonáhle užívateľ začne písať kľúče a hity Enter,
GetString postavy z koľkých úderov robil používateľ hit,
koľko znakov musím prideliť RAM pre.
A kde, že RAM pochádza, kto vie?
Je niekde vo vašom počítači je 2 GB alebo ktovie čo ešte v pamäti.
Ale predpokladajme, že počítač našiel priestor pre slovo HELLO tu.
Slovo som napísal bol H-E-L-L-O.
A ak čerpáme to ako sekvencie znakov, môžeme nakresliť to takto.
Ale musím urobiť 1 ďalšia vec. Čo patrí na konci každého reťazca v C?
Nulový znak, ktorý napíšeme, \ 0.
Je to technicky číslo 0, ale spätné lomítko je celý jasnejšie
, Že je to doslova číslo 0, celé číslo 0;
to nie je, napríklad, citujem-koniec citátu 0, ktoré by vás mohli zadajte na klávesnici.
Tak toto je HELLO.
>> A čo na to povieme v pondelok, že funkcie ako GetString
je vlastne vracia všetky tie týždne?
Nie je to vracia reťazec na sebe, pretože to naozaj nie je mať zmysel
pretože reťazca neexistujú. Sú trochu zhotovenie v CS50 knižnici.
Čo je naozaj reťazec, viac technicky? >> [Študent] Je to prvý znak.
Presne tak. Je to jednoducho adresu prvý znak, ktorý užívateľ zadali dovnútra
Takže ak moje slovo HELLO končí to v byte číslo 123 a potom na byte číslo 124,
125, 126, a tak ďalej, v prípade, som číslo mojej bytov z 0 na hore,
čo naozaj GetString sa vracia je doslova číslo 123.
Takže to, čo sa dal v S je číslo 123, nie písmeno H, nie je slovo HELLO,
jednoducho adresu, na ktoré môžem nájsť prvé písmeno HELLO.
Ale to nevyzerá ako dosť. Pýtal som sa vás na reťazec, nie charakter.
Tak ako sme alebo počítači, že Ello druh prísť spolu s H?
Čo je to druh zmluvy máme? Jo.
[Študent] Je stále hovorí sa nájsť nejaké ďalšie znaky. Presne >>.
>> Tam je to človek-počítač konvencie, kedy keď sa rokovania s reťazcami,
inak známy teraz ako char hviezd, sa jednoducho musí prísť na to,
kde na konci každej reťazca v živote je podľa naozaj len iterácia cez to s pre sláčiky,
while, čokoľvek, takže keď vás koniec reťazca
Teraz si môžete odvodiť z toho, oh, celé slovo bolo HELLO.
Tí z vás, s predchádzajúcim programovacím skúseností by mohol vedieť v Jave
stačí zavolať. dĺžka a v iných jazykoch, môžete volať dĺžku alebo podobný.
To preto, že v mnohých jazykoch, a to najmä čo nazýva objektovo orientované jazyky,
dĺžka niečo je druh zapuzdrený vo vnútri kusu samotná dáta,
veľa ako my zapuzdrený ID a názvy a domy vnútri študenta v pondelok.
Ale C je oveľa nižšej úrovni. Nie sú tu žiadne objekty alebo triedy, ak ste počuli tieto výrazy predtým.
Jediné, čo musíte, je naozaj pamäťové adresy.
Tak toto je niečo ako staromódny spôsob zastupovanie zaujímavé dátové štruktúry.
Tie majú počiatočnú hodnotu ako adresu prvého znaku
a potom už len niektoré svojvoľnými konvenciami, že všetci súhlasia s tým, nasledovať.
Tak ako je dĺžka reťazca realizovaný, to navrhujeme?
Strlen, strlen, ktorý niektorí z vás už používa niekoľkokrát. Je to celkom jednoduché, nie?
Je to ako 2 riadky kódu.
Je to docela veľa pre slučka nejakého druhu, možno s ďalšie miestne premenné.
Ale strlen jednoducho musí vziať ukazovateľ a potom začať hľadať \ 0.
>> A akonáhle zistí, že to, môže vrátiť celkový počet krokov, ktoré je potrebné v tomto reťazci.
Takže môžeme z toho vyvodiť, čo sa deje ďalej.
Predpokladajme, že potom Prehlasujem t, ako som urobil v riadku 10.
To je nejaký odpad hodnota. Kto vie, na prvý?
Ale na pravej strane riadku 10 Volám GetString znova.
Kto vie, kde to skončí?
Povedzme ľubovoľne povedať, že operačný systém našiel priestor pre to spôsobom, tady.
A stalo sa, zhodou okolností typ H-E-L-L-O znova,
a tak môžeme čerpať rovnaký druh obrazu.
Ale fakt, že mám prekresliť tento obrázok je úmyselné
pretože to je iný HELLO ako tento.
Takže tu by mohlo byť miesto 456, to je 457, a tak ďalej.
Takže to, čo sa dal, kde otáznik kedysi?
V tomto prípade sa 456.
Ideme tieto čísla ľubovoľne, pretože naozaj po dnešok
nebudeme sa toľko starať o to, čo je adresa čohokoľvek je.
Všetko, čo ich zaujíma, sú, že môžeme zistiť adresu nejakého kusu dát ako HELLO.
>> Takže naozaj to, čo väčšina ľudí robí v oblasti počítačovej vedy, keď hovorí o pamäťových adries
a hovorí o ukazovatele konkrétne,
skôr než obťažovať prísť na to, 123 -, kto sa stará, kde toto vlastne je,
Vieme len, že je to v určitom číselnom adrese -
sme zjednodušiť svet a len povedať, že to ukazuje na tento znak
a t ukazuje na tento znak.
A to, že je to šípka je docela úmyselné
pretože doslova teraz s ukazuje na H a T je ukazuje na druhú H
pretože na konci dňa, nezáleží na tom, aký je adresa,
ale to záleží, že máme možnosť vyjadriť túto adresu s nejakým kusom kódu.
My sa naozaj manipulovať tieto adresy zatiaľ
takže uvidíme, kde sa môžeme prehodiť a nejako robiť veci s ukazovateľmi,
ale teraz v súlade 12 doslova aké hodnoty sme nákupný
Podľa tohto príbehu v súlade 12?
Hovoríme, je 123 rovné rovná 456? A to rozhodne nie je prípad.
A to aj koncepčne, tento ukazovateľ rozhodne nie je rovnaká ako to
pretože si volal GetString dvakrát, a GetString nesnaží sa byť super šikovný,
nepokúša uvedomiť, oh, ste zadali HELLO pred 5 minútami;
dovoľte mi, aby som vám rovnakú ukazovateľ, ako som ti dal pred,
to len alokuje nový kus pamäte zakaždým, keď hovoríte.
>> Tak ako sme sa tento problém vyriešiť?
Ak vyššiu úroveň chcem porovnať reťazca HELLO HELLO a -
Nezaujíma o ukazovatele - ako môžem ísť o odpoveď na otázku,
sa užívateľ zadať rovnakú vec? Čo treba tu? Jo.
[Študent] Použite funkciu. >> Môžem použiť funkciu po vybalení z krabice.
Môžem použiť funkciu nazvanú strcmp, s-t-r-c-m-p,
len skrátená verzia hovorí string porovnanie.
A ak pôjdeme do, napríklad, porovnať 2, ktorý je medzi dnešnej podkladov,
Ja presne to.
Stále som všetko ostatné rovnaký z linky 1 na až 26 alebo tak,
a teraz si toho všimnúť časť zmenilo len trochu.
Poďme ignorovať linku 28 na chvíľu a sústrediť sa iba na tento jeden.
Čo povieme pondelok, že str compare robí?
Vykonáva proces brať 2 ukazovatele, S a T je v tomto prípade,
druh prakticky tým, že svoje prst na týchto 2 listy,
a čo musí urobiť, je niečo ako while alebo pre sláčiky,
a to hovorí, že sú to rovnaké? Ak áno, to sa pohybuje prstami alebo na ukazovatele vpred.
Zhodujú sa, títo rovnaký, to isté,
Tieto rovnaké, to isté? A ooh, som na konci reťazca na oboch S a T.
Nenašiel som žiadne rozpory. Áno, tieto reťazce sú rovnaké.
A čo str tieto priznanie, ak je 2 reťazce sú rovnaké, zrejme? Zero.
Takže 0 je dobré v tomto prípade, pretože ak sa vráti -1 alebo 1,
to znamená, že je len stane skôr, než t abecedne alebo po t
A prečo by to malo byť užitočné mať funkciu, ktorá vám povie, ktoré reťazec príde pred
alebo po v slovníku?
[Študent] Hľadám. >> Vyhľadávanie a triedenie.
>> Takže si môžete robiť veci, ako binárne vyhľadávanie alebo bublina zoradiť alebo zlúčiť druh
kde budete musieť porovnávať veci.
Tak ďaleko sme druh znížiť niektoré rohy a len hovoril o triedenie
v súvislosti s číslami, pretože je to pekné a jednoduché hovoriť o,
ale môžete samozrejme tieto struny, jablko a banán,
pretože ak jablko je známe, že príde do banánu, podobne,
sa môžete pohybovať reťazca okolo pamäte, rovnako ako Rob robil s radiť zlučovacie vo videu
a my sme tu na javisku s výberom druhu, vloženie zoradiť, a bublina zoradiť.
Takže tam, kde ešte môžeme vziať? Skúsme to.
Poďme trochu zabudnúť, že lekciu na chvíľu a skúste teraz a skopírujte 1.c vykonať nasledujúce kroky.
V riadku 21 Hovorím tlače niečo,
potom som dostať reťazec od užívateľa,
potom som kontrolu to.
Sme sa naozaj dostali do tohto zvyku ešte nie, ale poďme sa teraz to.
Poďme skutočne Zlúpnite tejto vrstvy. To je naozaj char *. Ten chlap je naozaj char *.
Takže čo to znamená byť kontrola, či s == NULL?
Ukazuje sa, že pri volaní funkcie, ako je GetString
alebo všeobecnejšie opýtajte počítača, aby vám nejaké pamäte,
niečo mohlo pokaziť.
Tie by mohli byť blázon a požiadať počítač pre terabajt pamäte
tým, že žiada o bilióny bajtov pamäte, ktoré jednoducho neexistujú v počítači,
ale GetString a ďalšie funkcie potrebovať nejaký spôsob, ako kričí na vás
Ak ste požiadaní o príliš veľa.
A ako GetString robí je, ak ste požiadali o viac pamäte
než je k dispozícii v počítači, a to aj v prípade, že je to super, super malú pravdepodobnosť
pretože nikto z nás sa bude písať bilióna znaky a stlačte Enter,
ale málo pravdepodobné, aj keď to môže byť, stále chcem skontrolovať to len v prípade,
a špeciálne hodnota, ktorá GetString, odpoveď, a ďalšie funkcie vracia
ak niečo zle, je NULL vo všetkých veľkých písmenách.
>> A čo je NULL? NULL len tak náhodou predstavujú ukazovateľ. Je to adresa pamäte 0.
Svet sa rozhodol, že svojvoľne, ak je to mojej pamäti počítača - viete, čo? -
budeme kradnúť len 1 bajt každého pamäte počítača, a to je miesto 0.
Budeme ho prezývku NULL, a budeme sľubovať
, Že nikdy skutočne dať skutočné údaje sú k dispozícii
pretože sme práve ľubovoľne potrebujeme osobitnú hodnotu, 0, NULL, aka
takže môžeme kričať na užívateľa, ak sa niečo pokazí.
Inak možno neviete to 0 znamená dať niečo, čo tu
alebo to znamená niečo pokazilo?
Musíme sa všetci zhodneme, že NULL znamená, nič sa vrátil,
žiadna skutočná adresa bola vrátená.
Teraz, tu som len prijíma svoju ľudskú konvencii Aj return 1 z hlavnej
keď sa niečo pokazí.
To preto, že hlavné je návrat konvencie je nutné vrátiť hodnotu 0, ak dobre,
1 alebo iné hodnoty, ak zle.
Ale GetString a nejaká funkcia, ktorá sa zaoberá v pamäti vracia null, ak sa niečo pokazí.
>> Dobre. Takže bohužiaľ, linka 27, super jednoduchý aj keď je úplne nedokáže skopírovať reťazec.
Prečo? Je vidieť, to nasledujúcim spôsobom.
Ja som tvrdil v súlade 27 bude robiť kópie s a nazývať to t
Tak som sa nepýtam na používateľa pre 2 reťazca tentoraz, len hovorím, hodnoty v s
by mal byť kladený na t i
Teraz už len stačí preukázať, ako je to zlomený, v súlade 29 vpred čo to robím?
Prvý som kontrolu, keď dĺžka t je väčšia ako 0.
Tam je nejaký reťazec tam. Užívateľ napísal niečo dovnútra
Čo je linka 32 robí, zrejme?
[Nepočuteľné Študent odpoveď] >> Právo. Môžete trochu odvodiť z toho, čo som povedal, že to robí.
Ale technicky, čo je to robíš? t [0] predstavuje, čo?
[Študent] znak 0.. >> [Malan] znak 0..
Alebo, viac človeka-ako, prvý znak v t, bez ohľadu na to je, H možno v tomto prípade.
A toupper robí to, čo hovorí. Ťaží nultého charakter ton a zmení ho.
Takže to znamená, vziať 0. charakter t, aby to veľká,
a vložte ho späť do rovnakej miesto.
Takže ak som typ ahoj malými písmenami, malo by to zmeniť malé písmená h na základnom imaní, H.
Ale problém je, že v radoch 35 a 36, ​​čo sa chystám urobiť, je vytlačiť pre nás S a T.
A aký je váš tušenie?
Čo mám vlastne ísť, či som písať v ahoj vo všetkých malými písmenami?
Čo sa to deje, aby si vytlačiť? >> [Nepočuteľné Študent odpoveď] >> Čo je to?
[Študent] Big H a zvyšok malé. >> Veľký H a zvyšok malý, pre ktoré je alebo t?
[Študent] Oboje. Obe >>. Presne tak. Tak sa pozrime, čo sa tu deje.
>> Nechaj ma ísť napred a zostaviť to. To je Copy1, takže sa COPY1. Dobrá.
Zoom Nechaj ma ísť napred a spustiť COPY1, Enter, povedz niečo: ahoj malými písmenami.
To zarábal kópiu, ale to zrejme zarábal pôvodné a,
pretože to, čo sa deje teraz v tomto príbehu?
V súlade 27 Nemám vlastne Zdá sa, že kopírovanie reťazec,
ale aj keď ste možno intuitívne dúfal, že tomu tak bolo,
ak si myslíte o tejto obrázku, čo sa naozaj som to urobil?
Polovica obrázku je rovnaká.
Takže poďme sa vrátiť v čase tak, aby t doteraz neexistuje v príbehu.
S môže existovať v príbehu, ale poďme malá ahoj tentoraz.
Tak nech mi opraviť to, čo som vlastne napísal palcov
V tomto prípade tu máme h-e-l-l-o.
Budeme nakresliť ako sekvencie znakov, dal som oddeľovačov tu a mojej \ 0.
Takže toto je miesto, kde sme, akonáhle riadok 1 až 24-ish, dávať alebo brať, boli vykonané.
To je obraz mojej pamäti.
Keď som sa dostať do súladu 27, čo sa stane?
Rovnako ako predtým, než som sa ukazovateľ, ktorý budem čerpať ako je námestie.
Hovorí sa t A čo je jeho hodnota v predvolenom nastavení? Kto vie? Niektoré odpadky hodnota.
>> Takže budem abstraktné, že vonku ako otáznik.
A akonáhle pravá strana linky 27 vykoná, čo mám dávať vnútri t?
Rovnaký vec, ktorá je v §.
Takže keď sme sa na chvíľu odstrániť túto abstrakciu šípky a hovoríme,
oh, to je zaťaženie pamäti adresa 123, keď hovoríš t dostane s, bodkočiarku,
ste doslova uvedenie 123 tu.
Teraz, keď sme trochu zjednodušiť náš svet znovu s obrázkami,
čo ste naozaj urobil, je práve pridaná ďalšia šíp do svojho sveta
, Ktorý je polohovacie t na rovnakom presnom reťazci.
Takže keď v súlade 31 a 32 som vlastne ísť o zmenu t [0],
to, čo je t [0] zrejme synonymom teraz? s [0]
Takže to je všetko, čo sa deje.
A aj keď tento druh cíti trochu nízka úroveň a tajomný
a tento druh sa cíti ako snáď intuitívne by to malo byť len pracoval -
Ja som urobil kópie vecí pred a to len fungovalo -
ak si skutočne myslia o tom, čo reťazec skutočne je, je to char *.
No, čo to je? Je to adresa nejakého charakteru.
Potom je možno väčší zmysel, že keď sa pokúsite urobiť niečo
Super zdanlivo jednoduchého, ako to, všetko, čo robíte, je kopírovanie adresa pamäte.
Tie v skutočnosti robiť nič s reťazcami sám.
Takže, aj keď nemáte tušenie, ako by ste tento problém vyriešiť v kóde,
na vysokej úrovni, koncepčne, čo musíme urobiť, aby tá odpis s, zrejme?
Jo. >> [Študent] Daj mu nové umiestnenie? Presne >>.
>> Musíme dať t zbrusu nové umiestnenie.
Musíme sa nejako vytvoriť svet, v ktorom sa dostaneme nový kus pamäte,
ktoré práve z dôvodov prehľadnosti budem čerpať hneď pod týmto jeden, ale to nemusí byť.
Ale to musí byť rovnakej veľkosti, takže budem čerpať tieto zvislé čiary v rovnakom mieste.
Je to v poriadku, ak je to všetko smeti spočiatku. Kto vie, čo tam bol?
Ale krok 1 bude musieť byť dať mi toľko pamäte, ako som potrebné
aby sa zmestili kópiu ahoj, potom zistiť, ako kopírovať h tu, na e tu,
l tu a tak ďalej.
Ale to už by sa nemal cítiť trochu zrejmé, aj keď niektoré detaily sú stále abstraktné.
Ak chcete kopírovať tento reťazec do toho, je to len pre sláčiky alebo slučky while
alebo niečo, s ktorými ste sa ešte zoznámiť.
Tak poďme to skúsiť. Nechaj ma ísť do copy2.c.
V copy2.c máme takmer rovnaký program, s výnimkou linky 27.
Vyzerá to trochu zložitejšie, ale ak sa to všetko pokazí kúsok po kúsku,
ľavá strana je rovnaká.
Char * t vytvára túto vec v pamäti, aj keď s otáznikom
pretože nemáme poňatia, čo je tam v predvolenom nastavení.
Na pravej strane sme teraz predstavujeme novú funkciu, malloc,
pre pamäť alokovať, daj mi pamäť,
a to zrejme trvá, koľko argumentov, koľko vecí vnútri zátvoriek?
Počul som reptania 1 a 2, ale to je len 1.
Nie je čiarka, čo znamená, že je len 1 vec v zátvorkách.
Aj keď je tu ďalší zátvorky, dovoľte mi, aby som spomenul
to, čo je vo vnútri najvzdialenejších zátvoriek, a to je to výraz:
(Strlen (y) + 1) * sizeof (char).
Takže ak sme vlastne si to premyslieť, je to hovorí mi dĺžku s
Prečo som, aj keď s tým, 1 na dĺžku? >> [Nepočuteľné Študent odpoveď]
Presne tak. Potrebujeme priestor pre toho chlapa na chvoste, šiesty znak, ktorý má žiadny anglický význam
ale majú špeciálny programový význam.
>> Takže potrebujeme + 1 za to, pretože strlen vracia ľudské očakávania dĺžky,
ahoj alebo 5, to vám nedáva dodatočné nulový znak.
Tak som ručne pridať to s + 1.
A potom, (char) * veľkosť, sme nevideli skôr.
To nie je technicky funkcie.
Je to zvláštne kľúčové slovo, ktoré práve vám povie, čo je veľkosť niektorých dátového typu na počítači
pretože v skutočnosti, niektorí z nás majú 32-bitové počítače.
Mám docela starý počítač doma, a používa iba 32 bitov na reprezentáciu ukazovatele.
A tak keď som robil veľkosť dátový typ, mohlo by to byť 32 bitov.
Ale keď som pomocou môjho nového ozdobný počítač, mohol by som získať späť hodnotu 64 bitov
niečo ako adresu.
Takže v tomto prípade, len byť super bezpečné, nebudeme na pevný kódu niečo ako -
dobre, čo je veľkosť char podľa toho, čo sme povedali tak ďaleko?
Sme skoro povedal, slovne, že je to 1 byte, a to je celkom veľa platí plošne.
Ale znova, predpoklady bývajú zlé.
Vedú k buggy softvér, ak ľudia používajú softvér spôsobom ste nemali v úmysle.
Takže poďme abstraktné toto preč a len viac druhovo povedať
Potrebujem toľko kúskov pamäte
a každý blok pamäte by mali byť rovnakej veľkosti a charakteru,
ktorá je v skutočnosti rovná 1 v tomto prípade, ale je to všeobecnejší spôsob písania.
Takže, ak je slovo ahoj, koľko bytov sa malloc zrejme prideliť ahoj?
[Študent] Six. Šesť >>. Presne toľko, koľko máme otázniky na obrazovke.
A potom sa hádať teraz založený na pochopení GetString
čo malloc pravdepodobne vráti? >> [Študent] adresa.
Sídlo čoho? Prvý kus pamäte.
>> Nemáme potuchy, čo tam je, pretože niektoré ďalšie funkcie
by boli pomocou tejto pamäte už skôr.
Ale malloc, rovnako ako GetString, vráti adresu prvého bajtu pamäte
že vyčlení pre vás.
Avšak to, čo sa nerobí, je vyplniť tento prázdne s charakterom spätného lomítka null
pretože sa ukázalo, môžete použiť malloc alokovať nič: Ints, struny, polia,
plaváky, študentské štruktúry.
Môžete použiť malloc úplne všeobecne.
Nezaujíma alebo vedieť, čo ste prideľovanie pamäte pre.
Tak to by bolo trúfalé pre malloc dať \ 0
na konci každého kusu pamäti, že to ti dáva
pretože to \ 0 vec je len konvencie pre reťazce.
To nie je použitá pre ints, to nie je použitý pre plaváky, to nie je používaný pre študentov.
A tak mám ťa s malloc je, že bremeno je úplne na vás programátor
pamätať, koľko bytov si pridelené, a nie vždy používať pre sláčiky
alebo while a ísť okolo hranice bloku pamäti, že ste bol daný.
Inak povedané, akonáhle alokovať pamäť,
môžete sa opýtať operačný systém, oh, mimochodom, aký veľký o kus pamäte to bolo?
Je to úplne na vás pamätať, ak budete potrebovať túto hodnotu.
>> Tak sa pozrime, ako mám postupovať použiť túto pamäť.
V súlade 28 a 29, prečo to robím?
Len celkom zdravý rozum kontrola.
Len v prípade, že sa niečo pokazilo, žiadam o nejaké šialené množstvo pamäte
alebo som toľko vecí, na počítači, že tam jednoducho nie je dostatok pamäte,
niečo také, aspon chcem skontrolovať null.
V skutočnosti, väčšina počítačov vám ilúziu, že každý program
môžu používať celistvosť pamäte RAM,
ale aj tak, v prípade, že používateľ zadá do nejakej šialenej dlhej šnúre Možno preto, že si zlý človek
a oni sú vlastne snaží zhodiť váš program alebo hack do neho,
Ak chcete aspoň skontrolovať návratovú hodnotu malloc a či sa rovná null.
A ak áno, nech to jednoducho skončiť práve teraz, pretože ja neviem, čo robiť v tejto veci.
Ako môžem skopírovať reťazec? Tam je niekoľko spôsobov, ako to urobiť.
Existujú str kopírovať funkcie v C, ale je to super jednoduché pre nás urobiť staromódnym spôsobom.
>> Najprv mi dovoľte prísť na to, aká je dĺžka s je.
Mohol som dať do slučky, ale namiesto toho som len dať to sem pre prehľadnosť.
Tak n teraz ukladá dĺžku pôvodného reťazca, ktorý je zrejme 5.
Potom v mojom pre sláčiky som upravujeme od 0 až na n,
a pri každom opakovaní dávam s [i] vo vnútri t [i].
Takže to je to, čo som naznačil s mojimi 2 prsty ukazujúce na struny pred.
Vzhľadom k tomu, pre sláčiky opakuje takto, budem sa kopírovanie h do tu,
e do tu, l do tu, pretože to je s, to je t
A potom konečne, v súlade 35, prečo to robím?
Musím sa uistiť, že som koniec reťazca t
A ja som to takto bude super explicitné.
Ale navrhnúť niekoho, keby si mohol, iný spôsob, ako to urobiť.
Nemám naozaj potrebujú linku 35. Je tu iný spôsob, ako to urobiť.
Jo. >> [Nepočuteľné Študent odpoveď] >> Povedz to nahlas.
[Študent] Menšie alebo rovné. Presne >>.
Mohli by sme povedať menší ako alebo rovný n, ktorá bola všeobecne zlé
pretože takmer vždy, keď ideme do rovnakej s tým, čo sme počítanie
Pôjdeme 1 krok príliš ďaleko.
Ale pamätajte, koľko bytov sme prideľovať?
Máme pridelené strlen S, takže 5 + 1 o celkovej 6.
Takže v tomto prípade by sme mohli urobiť niečo také
tak, že kopírujete nielen ahoj, ale aj \ 0 na samom konci.
Prípadne, mohli by sme použiť funkciu nazvanú str kopírovanie, strcpy,
ale to by nebol ani zďaleka tak zábavné.
Ale to je všetko, čo robí pod kapotou.
Potom konečne, urobíme to isté ako predtým.
Aj zarábať t a potom som tvrdiť, že pôvodné vyzerá takto a kópie vyzerá, že.
Tak skúsme to teraz. Nechaj ma ísť sem. Urobte kópie copy2. Budeme priblížiť a spustiť kópie copy2.
Budem písať ahoj malými písmenami, a naozaj som si malá ahoj ako originál
ale kapitál Hello pre kópiu.
Ale ja som neurobil zatiaľ. Musím urobiť 1 posledná vec tu.
46 a 47 je jasne uvoľnenie pamäte, ale čo to vlastne znamená?
Čo mám robiť, myslíte tým, že volajúceho 46 a riadok 47?
Aký vplyv to má mať? Jo.
[Nepočuteľné Študent odpoveď] >> Presne tak.
>> Ste len hovorím operačný systém, hej, vďaka za tejto pamäte.
Teraz môžete použiť pre niekoho iného.
A tu je dokonalým príkladom nezmyselné hodnoty.
Práve som použil tento pamäte zapísať slovo ahoj v 2 miestach,
tu, tu, tu, a tu.
Takže je to h-e-l-l-o-\ 0.
Ale potom som zavolať linku 46 a riadok 47, a viete, čo sa tam deje, pokiaľ ide o obrázku?
Vlastne, počkajte, tento obrázok je starý.
Akonáhle urobíme kópiu, ten chlap je vlastne ukazuje tu,
takže sa poďme odstrániť čísla a len abstraktné preč ako naše šípy znova.
Čo sa stane v tomto filme, keď som volať zadarmo?
[Nepočuteľné Študent odpoveď] >> Ani.
Ak by som volať zadarmo na S a T - trochu chyták - tento obrázok sa nemení vôbec
pretože volá sa volá t len ​​hovorí operačný systém,
hej, môžete použiť túto pamäť znova, ale to nič nezmení na null
alebo niektoré špeciálne znak, že tým nič nezmení,
to nemení h alebo e alebo l alebo l alebo O v oboch miesta na čokoľvek iné.
Pokiaľ ide o obraz, akonáhle Volajte zadarmo, nič zmien.
A v tom spočíva pôvod odpadky hodnôt, pretože keď som potom neskôr v tomto programe
požiadať operačný systém pre viac pamäte s GetString alebo malloc alebo niečo také
a operačný systém hovorí, iste, ja mám 12 bajtov pamäti práve uvoľnených,
použitie týchto, čo budete k odovzdaniu?
Tie bude podal kus pamäti, že by sme zvyčajne remíza
s otáznikmi, ale čo sú tie otázniky?
Dochádza k nim byť h-e-l-l-o, h-e-l-l-o.
Toto sú naše nové smetiarske hodnoty, akonáhle uvoľniť túto pamäť.
>> Je tu skutočný svet dôsledky aj tu.
To sa stáva čo do činenia s RAM, ale vaše počítače
vlastne to isté s diskom.
Porozprávame sa o tom najmä s budúcim problémom súbor, ktorý sa zameriava na forenznú.
Ale čo sa skutočne deje, ak máte nejaké citlivé finančné súbor na ploche
alebo niektoré útržkovité JPEG a pretiahnite ju do koša,
čo sa stane, keď ho pretiahnuť do koša alebo koša?
Vedel si, čo som hovoril. [Smiech]
Čo sa stane, keď ste preťažení, že dôkazy do vášho koša alebo popolnice?
[Nepočuteľné Študent odpoveď]
No, tak pozor. Čo sa stane, keď budeš robiť, že?
Stručná odpoveď je nič, nie?
Sketchy alebo citlivé súbor je stále len sedí niekde na pevnom disku.
Väčšina z nás aspoň sa ťažko poučili, že potrebujete vyprázdniť kôš
alebo váš kôš skutočne odstrániť súbory.
A skutočne, keď kliknete pravým tlačidlom myši, alebo regulácia kliknutím na vašom koši
alebo zvoľte Súbor, Empty Trash alebo čokoľvek
a vyprázdniť kôš alebo kôš, čo sa skutočne deje a potom na tomto obrázku?
Viac nič. Takže nič sa skutočne deje na disku.
>> A ak sme len dočasne odbočiť a napísať - budem stačí použiť zadnej strane tohto.
Takže teraz príbeh sa mení z pamäte RAM, čo je miesto, kde programy existujú
kým vediete je, na disk, čo je miesto, kde sú uložené dlhodobo
aj keď vypadne prúd, zatiaľ - a vrátime sa v budúcnosti -
poďme predstierať, že to predstavuje pevného disku vo vnútri vášho počítača
pretože späť v deň, kedy bývali kruhové disky, podobne ako diskety.
Takže ak máte nejaké citlivé súbor Excel, môže trvať až tento kus pamäte
na počítači disk, a ja som len kreslenie rovnaký ľubovoľný 1s a 0s.
Pri pretiahnutí súboru takhle do koša alebo koša,
doslova sa nič nestane, pretože Apple a Microsoft sa rozhodol
koša a kôš je naozaj len dočasný zástupný.
Možno nakoniec OS vyprázdni ju pre vás, ale zvyčajne to nie je nič,
aspoň kým si naozaj málo miesta.
>> Avšak, keď idete do prázdnej koša alebo Vysypať kôš,
podobne, nič sa nestane, aby tento obrázok.
Všetko, čo sa stane, je inde v počítači, tam je nejaký druh tabuľky.
Je to niečo ako malý ťahák, ktorý hovorí, že, povedzme, resume.doc,
takže váš životopis v súbore programu Microsoft Word býval v mieste 123 na pevnom disku,
nie je v pamäti a nie v pamäti RAM, ale na pevnom disku,
a vaše útržkovité JPEG žije v 456, a súbor programu Excel žije na 789 alebo kdekoľvek.
Pri mazaní súborov vlastne vyprázdňovanie koša alebo Kôš,
tento obrázok sa nemení. 0s a 1s na pevnom disku nejdú nikam.
Ale táto tabuľka, tento malý databázy druhov, mení.
Keď zmažete svoj životopis, je to, ako keď je súbor odstránený v nejakom zmysle,
ale všetky sa počítač sa zabudnúť, kde je tá vec žije na pevnom disku.
The 0s a 1s, že skladať svoj životopis alebo niektorý z týchto ďalších súborov sú stále neporušené.
>> Takže ak ste to urobili omylom, je tu stále non-nulová pravdepodobnosť
že môžete obnoviť vaše dáta pomocou Norton Utilities alebo nejaký obchodný softvér
ktorého cieľom v živote je nájsť 0s a 1s, ktoré nejako bolo opustené,
Zabudli ste tu, ale nechal tu, takže môžete získať dáta späť.
Alebo forenznú vyšetrovatelia s políciou alebo FBI by skutočne pevný disk
a vlastne hľadať vzory 0s a 1s, ktoré vyzerajú ako JPEG, vyzerajú ako súbory Excel,
a obnoviť je to tak, aj keď je počítač zabudol je tam.
Takže jediný spôsob, ako naozaj odstrániť dáta, ako budeme diskutovať v budúcnosti,
je drhnúť alebo utrite súbor alebo pevný disk od -
Nemôžete naozaj zbaviť 0s a 1s
pretože inak by ste začať s gigabitovou pevný disk
a vy by ste skončiť s megabajt pevného disku, ak ste neustále museli mazať,
doslovne, 0s a 1s.
Takže to, čo by ste robili, keby ste naozaj chceli pokryť svoje stopy
a zásadný problém je, že je tu stále 0s a 1s na disku?
Vidím niekoho gestikuloval, že by ste fyzicky zlomiť zariadenia. To bude fungovať.
[Smiech] Ale či je to trochu drahé riešenie, čo by bolo rozumnejšie?
Jo. >> [Študent] prepísať. Prepísať >> s tým, čo? >> [Študent] Ďalšie dáta.
Ďalšie údaje. Stačí si len prepísať disku s 0s alebo 1s alebo všetkých 0s, všetko 1s.
>> A to je skutočne to, čo niektoré softvérové ​​robí.
Môžete si kúpiť softvér, alebo dokonca získať zadarmo softvér,
a dokonca postavil do Mac OS v týchto dňoch, menej v systéme Windows,
je schopnosť bezpečne vymazať.
Vlastne, ak chcete, aby všetci beží domov dnes, ak máte Mac, a to,
ak máte nejaké veci v smetiaku, môžete tak urobiť Secure Empty Trash,
ktorý robí presne to.
Skôr než len mazanie súborov tu, že nevymaže 0s a 1s tu,
trochu, to len zmení ich všetky, napríklad, aby 0s a bodka, bodka, bodka.
Takže jeden z vašich budúcich psets bude skutočne úmyselne obnoviť dáta -
fotografie, ktoré ste urobili ľudí, miest a vecí na akademickej pôde
pre ktoré urobíme forenznú obraz z digitálneho fotoaparátu na pamäťovú kartu,
čo je presne rovnaký nápad - a budete musieť byť vyzvaní, aby skutočne nájsť
vzory, ktoré predstavujú JPEG na pevnom disku,
podobne ako tento bývalý študent, ktorého e-mail som čítal pred niekoľkými týždňami urobil
obnoviť jeho sestry fotografií.
Prečo sme sa 5-minút prestávku tu, a my preskupiť sa viac na pamäti.
Tak tu je miesto, kde sa veci trochu myseľ-ohýbanie, ale je to veľmi silný krok
k pochopeniu to všetko viac.
Tu je program s názvom pointers.c.
To je medzi dnešným ukážkovom kóde.
Všimnite si, že v prvých niekoľkých riadkov, 19 až 22, všetko, čo robíte, je niečo ako GetString
a vrátenie adresu, ukladanie v §.
Od tej doby pre PSet aj 3, ak chcete, ale Pset 4 a na
kde si môžete začať užívať tieto vzdelávacie kolies nad seba,
nie je dôvod predstierať, že reťazce už neexistuje.
Je to určite v poriadku len začať hovoriť char *.
>> Ako stranou, on-line odkazy a knihách môžete často vidieť hviezdu vedľa premenné.
Môžete dokonca vidieť priestor okolo oboch stranách.
Všetky z nich sú funkčne správne.
Pre túto chvíľu, keď budeme štandardizovať na tomto prístupe, aby sa super clear
že char * je ako povedať, že znak ukazovateľ.
To je typ dát.
A potom názov premennej je v tomto prípade.
Takže sme dostali reťazec a my sme hovorili s
A potom tu dole si, že robím vlastne trochu podvod.
To sa nazýva ukazovateľ aritmetiku, ktorá je akýmsi super jednoduchý.
To len znamená, že sčítanie a odčítanie čísla ukazovateľov.
Ale to skutočne funguje.
Tento program zrejme vypíše reťazca s 1 znak na riadku taká, že konečný výsledok -
Len tak môžeme pokaziť, kde to bude, aby ukazovatele, spustite ukazovatele, dovoľte mi, aby som Zoom
Teraz mi dovoľte, aby som typ v niečo ako HELLO a typ Enter
a tlačí 1 znak na riadku.
Až do druhej pred, by sme urobili s hranatá zátvorka notácie.
Mali by sme pre sláčiky, a my by sme to printf S [i], a my by sme to urobiť znovu a znovu a znovu
s lomítkom n na konci každého riadku.
Ale tento program je iný. Tento program používa, doslova, aritmetika.
Tak čo sa to tu deje?
Po prvé, pred slučka ešte vykoná, čo, len aby bolo jasno, je to vlastne?
S je? >> [Študent] adresa. >> Adresa.
>> A to je adresa, v prípade ahoj, prvý znak v tomto slova, ktoré je h
Tak s je, že v tomto konkrétnom príklade, adresa h
Takže čo to znamená robiť s + aj?
No, aj začína na hodnote 0 v tomto pre slučke. Urobili sme, že mnohokrát.
I sa ísť do dĺžky reťazca, ako sa zdá.
Tak na prvý iterácii tohto cyklu, aj je samozrejme 0.
Takže tento výraz hovorí s + aj - skôr s +0--to je samozrejme len s
Takže to, čo je * tu?
Teraz sme použili na hviezdičku v trochu iným spôsobom.
Nechaj ma ísť napred a zbaviť t, pretože sme urobili hovoríme o t a kópií s
Teraz už len chcem povedať príbeh zahŕňajúci s.
A tak v tomto okamihu, potom, čo reťazec typu, náš svet vyzerá úplne ako to robil predtým
sa len s uložením adresu h a všeobecne ukazuje na reťazec ahoj.
Keby som teraz robiť čiary ako * (y + i), skúsme to.
Takže * (s + i). Dovoľte mi zjednodušiť, pretože to je 0, tak sa jedná * (y 0).
No, počkajte chvíľku. Ďalej zjednodušiť. To je * (y).
No, teraz zátvorky sú trochu hlúpy, takže teraz poďme urobiť * s
Takže v prvej iterácii tohto cyklu, že linka, ktorá je zvýraznená, 26,
je do značnej miery zodpovedá tlač to.
Aký je typ dát * s?
V tejto súvislosti, pretože hviezdy sa stane, že je v tesnej blízkosti s sám,
ale konkrétne, pretože sme už vyhlásil s,
nie sme vytvorením premenné už, tam žiadna zmienka o char * v súlade 26,
tam žiadna zmienka o kľúčových reťazca, sme len pomocou premennej s názvom s,
to dopadá teraz hviezda má mierne odlišné, a síce, mätúce význam.
* Tu znamená ísť na adresu v s a tlačiť, čo tam je.
Takže s je tu, * s je - niečo ako zásobníky a rebríky, za šípkou - tu.
Tak toto je * s
>> Takže to, čo sa má vytlačiť na prvej iterácii tohto cyklu v súlade 26?
Aj vytlačiť% C, ​​čo je zástupný symbol pre znak,
potom \ n pre nový riadok. * (Y + i), kde i je 0, je práve táto.
Takže to, čo char si môžem v% c? H.
V ďalšom opakovaní slučky - môžete pravdepodobne vidieť, kde to bude -
ďalšie iterácie i je samozrejme 1, takže to znamená s 1,
a potom teraz nemám potrebovať zátvorky, pretože teraz hviezda potrebuje povedať
prejsť na adresu v pamäti s 1.
Čo je to? Poďme sa vrátiť v čase a hovoria, že toto arrow teraz nie je v skutočnosti robí nám žiadnu láskavosť.
Či to konkrétne povedať, že je to uloženie čísla 123
pretože začiatku tohto reťazca ahoj, to je adresa 123, to je 124, a tak ďalej.
Takže na druhej iterácii, keď hovorím s 1, to je ako povedať, že 123 1,
inak známy ako 124, takže to, čo char sa vytlačí na druhú iteráciu?
E na adresu v pamäti 124.
Potom znovu +, 125, 126, 127, a táto slučka našťastie zastaví predtým, než sme sa sem dostali
pretože som pomocou strlen, aby sa ubezpečil, že som sa nepočíta príliš vysoká.
Takže to tiež nie je ono.
Opäť, je to rovnako ako keď sme robili pred týždňom.
Dovoľte mi, aby som napísať na riadku nižšie, aj keď nechceme robiť oboje.
Toto je totožný sa v tejto oblasti.
>> Takže aj keď to je reťazec, ako sme sa volať to týždne, to je naozaj char *.
Takže ak chceme byť super anal, je to naozaj správne napísať osobitný znak
v tej polohe pomocou týchto číselných adries a túto hviezdu operátor,
ale úprimne povedané, je to tak oveľa čistejšie. Takže to nie je zlé.
Nie je dôvod prestať riadok 27 tu, ale 26 je funkčne rovnaký,
a je to funkčne rovnaké presne z dôvodov, ktoré sme boli diskutovať tak ďaleko.
A konečne, 29 je len dobré praxe.
Volanie zadarmo s znamená, že teraz dávate späť pamäť, ktorá GetString vám dal
pretože opäť, ako už som spomenul Pondelok, GetString týždne
bolo zavedenie chybu do kódu.
Váš kód týždne mal úniky pamäte
kedy ste sa pýtali GetString pre pamäť, ale nikdy si dával späť.
A to bol uvážene volený nami pedagogicky
pretože je to jednoducho príliš o čom premýšľať čoskoro.
Ale teraz potrebujeme viac symetriu.
Ak sa opýtate počítač pamäť, ako je tomu v prípade GetString,
ako je tomu v prípade očividne pre malloc,
Teraz musíte pre PSet 4 dopredu aj bez takejto pamäti.
Všimnite si, to je niečo iné ako hovoriť int n
Nemusíte sa uvoľniť, pretože si nevolal GetString
a nevolal malloc.
>> A aj keď si volal GetInt ako budeme nakoniec vidieť,
GetInt nie je alokovať pamäť pre vás, pretože môžete skutočne prejsť okolo celé čísla
a pláva a písmen presne tak, ako sme to robili niekoľko týždňov.
Reťazce, aj keď sú zvláštne, pretože naozaj sú zreťazenie viac znakov.
Takže sú len odlišné od znakov a plaváky a ints a podobne.
Ale vrátime sa, že onedlho.
Akékoľvek otázky, potom na tomto začiatku ukazovateľov? Jo.
[Nepočuteľné Študent otázka]
Ah, veľmi dobrá otázka.
Jedna z mála vecí, C skutočne robí pre vás, čo je výhodné,
je to vyrieši za vás, čo je veľkosť tohto dátového typu
a potom robí, že druh množenie pre vás.
To nie je v prípade znakov, pretože takmer vždy znak je 1 byte,
tak to proste funguje.
Ale v záujme diskusie, pokiaľ ste boli skutočne tlače celé čísla
a vy sa pokúšate vytlačiť nejakú hodnotu s, ktorý ukazoval na celé číslo,
si podobne nebudú musieť robiť + 4 * i len preto, že int je 4 bajty.
Ukazovateľ aritmetické znamená, že C a kompilátor robiť všetky, že matematika pre vás.
Jediné, čo musíte starať len o počítanie v druhu ľudskom zmysle. Jo.
[Študent] Ak deklarujete reťazec vnútri slučky for, musíš uvoľniť neskôr?
Dobrá otázka.
>> Ak ste vyhlásil reťazca vnútri pre slučky, budete potrebovať uvoľniť neskôr?
Jediné, čo potrebujete, aby ste uvoľnili pamäť, že ste prideliť s GetString alebo malloc.
Takže ak ste práve povedal niečo ako - dovoľte mi, aby som zložené zátvorky teraz tak celý kód je venovaná.
Ak ste niečo, hoci buggily, ako je táto, char * t = s,
nemusíte sa zdarma t, pretože t neobsahovala žiadnu zmienku o malloc alebo GetString.
Ak naopak ste to urobili, GetString, potom áno, budete musieť zadarmo t
A v skutočnosti, jediná šanca, ako to urobiť, je teraz vo vnútri tejto slučky, pre rovnakú vydanie pôsobnosti
že sme diskutovali v minulosti.
Inak by ste sa prideľovanie pamäti, prideľovanie pamäti, prideľovanie pamäti,
a na konci programu, pretože to mimo tento slučky,
t neexistuje, ale nikdy si na operačný systém
že ste nepotrebovali, že pamäť už.
A netrvalo dlho, pre PSet 4 alebo 5 budeme vybaviť si s programom s názvom Valgrind,
ktorý je podobný v duchu, aby GDB v tom, že je to má trochu tajomný rozhranie,
ale jeho účel v živote je, aby vám pomohol.
A Valgrind je program, ktorý bude v budúcnosti hľadať svoje programy
hľadá úniky pamäti, či už z GetString alebo malloc,
ktoré začneme používať to viac, ako sme prestali používať CS50 knižnice toľko.
Konečne sme teraz druh slovníka a druh mentálneho modelu v teóriu
s ktorými sa vyriešiť tento rozbité program.
>> Takže v tomto rozbité programu, swap funguje vnútri swapu,
ale nikdy skutočne odpracovaných hodín v hlavnom, pretože hlavné prešiel v x a y, si spomenúť,
a tie boli odovzdané v roku hodnotami, aby som tak povedal.
Kópie z nich dostali na swap.
Do konca roka swapu, a b skutočne boli vymenené,
ale samozrejme x a y, ako sme diskutovali v pondelok, nebol.
Takže navrhujem zelene tu, že to je vlastne riešenie tu.
A skutočne, dovoľte mi, aby som presunúť svoje hviezdy len preto, aby bolo v súlade
aj keď, opäť, funkčne to nevadí.
V budúcnosti týždňov budeme vysvetliť kedy a prečo to robí záležitosť.
Takže zelene Teraz je riešenie.
Úprimne povedané, vyzerá to oveľa chaotičnosti, pretože mám všetky z týchto hviezd.
Dovoľte mi, aby som poukázať na jednu vec.
Horný riadok tu, kde sa hovorí, že int * a int * b
je zásadne robí to isté, ako tomu vždy bolo.
To prehlasuje 2 argumenty alebo parametre vymeniť,
Prvá z nich je int ukazovateľ nazvaný,
z ktorých druhá je int ukazovateľ nazvaný b
Jediná vec, ktorá je nové v tomto bode je fakt, že je tu hviezda tam.
>> Čo to znamená? Nie je int, b nie je int.
Je adresa int a b je adresa iného int.
Tu dole, to je miesto, kde som sa priznať, že C dostane mätúce.
Teraz sme použili hviezdu, ale to má iný význam v tejto súvislosti.
Vzhľadom k tomu, že nie sme deklarovať ukazovatele, ako sme tu,
tu sme dereferencing veci.
Takže technicky, hviezda v tejto súvislosti prvý, druhý a tretí riadok vnútri odkladacieho priestoru
je dereferencia operátor, ktorý jednoducho znamená ísť tam.
Takže rovnako ako môj prst nasledoval na šípku h,
* Prostriedok prejsť na túto adresu a nájdi mi int, ktorá je tam.
* B prostriedky idú na adresu a odovzdať mi, čo tam je.
Takže poďme prekresliť obraz od pondelka teraz používajú hromadu snímok,
spodná z ktorých jeden je bude hlavné,
horné z ktorých jeden je bude výmena,
tak, aby náš svet vyzerá, rovnako ako pondelok takhle.
Tu je kus pamäti, že hlavné je bude používať.
>> Pripomeňme, že od pondelka program jednoducho musel 2 premenné,
jeden volal X a jeden s názvom y, a ja som dal čísla 1 a 2 tam.
Teraz, keď som hovor vymeniť ako ja v pondelok,
skôr, keď som použil červenú verziu tohto programu, ktorý vyzerá takto,
Mám 2 parametre, a a b, a čo píšeme tu a tu?
Len 1 a 2, doslova kopíruje x a y.
Dnes sme zmeniť.
Dnes miesto odovzdania v ints a, b budeme odovzdávať v 2 adresy.
Tieto adresy sa stalo, aby ukazoval na ints, ale tieto adresy nie sú ints sami.
Sú adresy. Je to ako poštovú adresu miesto.
Takže teraz musíme len dať si trochu podrobnejšie na obrazovke.
To je môj počítač pamäti, ako to bolo celý deň.
Teraz potrebujeme nejaký ľubovoľný schéma číslovania.
Takže povedzme, náhodou, že toto je adresa pamäte 123, 124.
Povedzme to je 125, to je 126, a tak ďalej, ale je to úplne ľubovoľný.
Potrebujeme len trochu číslovanie v mojej pamäti.
Takže teraz, keď som vlastne odovzdať x a y, nebudem sa potom x a y;
Idem odovzdať na poštovú adresu, aby som tak povedal, o x a y
tak, že to, čo je uložená tu a tu nie je 1 a 2,
ale ak môžete vidieť môj malý text, čo je odovzdaný v tu a tu?
[Nepočuteľné Študent odpoveď] >> Presne tak. 123 dostane dal sem a 124 dostane dať sem.
>> Teraz, pretože som použil hviezdu v tomto prvom riadku až sem na vrchol,
môj program jednoducho vie, že 123 a 124, aj keď to samozrejme celé čísla
že každý človek môže všimnúť, by sa mali vykladať ako adresy, číselné adresy.
Nie sú samy o sebe ints, sú adresy,
a to preto, že som výslovne dal hviezdy tam.
Takže teraz v mojej prvý, druhý a tretí riadok aktuálneho kódu, čo sa tu deje?
Poďme čerpať zvyšok obrazu.
Tmp je, rovnako ako to bolo v pondelok. Nič zvláštneho tmp.
Je to len miestne 32 bitov premenné, a vnútri, že som zrejme uloženie hodnoty *.
Teraz, keď som povedal, tmp =, čo by som dal tu? >> [Študent] 123.
123. Ale to nie je to, čo robím.
Hovorím tmp = *. Počet hviezdičiek znamená tam.
Takže tu je, 123. Ako mám ísť tam? Predstierať, že sa tam šípka.
No, tu to je, 1. Takže to, čo je uložená v tmp, zrejme? Len 1.
Takže inými slovami, tmp je * a, * prostriedkom prejdite na adresu, ktorá je v súčasnej dobe v,
čo je zrejme 123.
>> Dobre, tu sme na mieste 123, vidím číslo 1,
tak som dám číslo 1 tam.
Teraz, čo mám robiť, v riadku 2, * = * b?
To je trochu viac zapojiť, pretože teraz to, čo je? Je to 123.
Takže * je kde? Presne tam, kde som bol predtým. Takže tam. Dobre.
Teraz, konečne, a potom konečne to začne dávať zmysel, dúfajme,
* B znamená to, čo je v B? 124. Tak som potrebné tam, čo je o 2.
Tak čo som dal, kde?
2 ide do tu, pretože * b prejde do *. Takže to urobím.
A už môžete vidieť, možno, že sme tak oveľa bližšie
k riešeniu tohto hlúpy, jednoduchý problém správne prvýkrát
pretože teraz máme pred sebou ešte spomienku na to, čo bolo x,
máme 2 kópie, síce y,
ale riadok 3 teraz hovorí, * b
Tak tu je b * B prostriedky tam. Tak kde je umiestnenie 124?
Je to vraj tu. Tak čo mám dať sem? Samozrejme, tmp.
Takže teraz som to. Tak som si tu 1 a 2 tu.
A teraz, čo o tom všetkom, 123, 124, a 1?
Akonáhle swapových výnosov, táto pamäť je rovnako dobrý ako stratené
pretože akonáhle swapových vráti, operačný systém
je zadarmo na použitie, že pamäť v budúcnosti znova.
Iba pamäť Hlavné je v dolnej časti tejto tzv zásobníka drží okolo.
>> A tak sme konečne máme teraz pracovnej verzii.
Nechaj ma ísť do swap.c, a všimnite si nasledujúce.
V hornej časti programu zmenil som prototyp byť int * a int * b
Takže jediné, čo som zmenil ísť z červenej, ktorá bola zlá, na zelenú, čo je dobré,
Aj sa pridal tieto hviezdy dnes.
Ale potom tu v prehodiť sám som musel skopírovať, vložiť to, čo bolo práve na snímke.
Mám hviezdu tu, hviezda tu - to zodpovedá prototyp -
a potom všetky tieto veci teraz majú hviezdy s výnimkou tmp
pretože použitie pomocné premenné, tu nič nové.
Potrebujem len dočasné úložisko pre int.
Takže nepotrebujeme hviezdu tam.
Potrebujeme len hviezdu, takže môžeme prejsť tento druh svojvoľné hranice
medzi týmito 2 snímok v mojej pamäti počítača.
Ale jedna posledná vec sa musí zmeniť, a možno ste zahliadli ho už.
Čo druhý riadok je samozrejme iná teraz? >> [Študent] & x.
>> Jo, tak 25 je posledný riadok kódu musím zmeniť pre túto prácu.
Pred týždňom a ešte v pondelok riadok 25 vyzeral, vymeniť X a Y,
a toto bolo práve rozišla, pretože ak hovoríte swap (x, y)
dávate kópie X a Y vymieňať, potom to robí svoju vec,
ale vy ste nikdy skutočne mení, x a y sám.
Takže aj keď ste nikdy nevidel tento znak skôr s ampersand v kóde,
len hádať. Čo ampersand robiť, zrejme?
[Študent] zastáva adresu. >> Zastáva adresu.
Takže ampersand hovorí daj mi adresu x.
Kto vie, kde to je? Stáva sa, že je 123. Nezaujíma ma. Daj mi adresu x.
A y sa rozumie daj mi adresu y.
A v tomto bode príbeh je úplne v súlade s obrázkom sme vychádzali pred chvíľou.
>> Tak som si priznať ukazovatele, určite pre mňa, keď som prvýkrát začal učiť to,
boli rozhodne jedna z najťažších vecí, zabaliť svoju myseľ okolo.
Ale uvedomiť, najmä ak budeme držať hrať s týmito druhmi vecí,
Ak vyraziť na tieto super jednoduchý druh intelektuálne nezaujímavý problémy
jednoduchého pohybu atómov okolo, odpoveď na mnoho zmätku s ukazovateľmi
Naozaj je možné odvodiť z týchto veľmi základné mechaniky.
Tu je adresa. Choďte tam s hviezdou.
Alebo naopak, tu je ampersand. Zistiť, čo je adresa v skutočnosti je.
Dobrá.
Takže tam, kde sa všetky tieto pamäte pochádza z?
Sme vypracovaný tento obrázok niekoľkokrát, a stále perspektívny vrátime k tomu,
ale tu je reprezentácia pamäte vášho počítača
to je trochu viac, než náš označené tabuli je tu.
Text segmente na vrchole predstavuje to, čo vo vzťahu k programu?
[Nepočuteľné Študent odpoveď] >> Je nám ľúto,? Povedz to znovu.
[Študent] skutočný program. >> Aktuálny program.
>> Takže 0s a 1s, ktoré ste zostavili po zápise kód v C a potom beží zvonenie
a generovanie 0s a 1s skončí ako dobývanie zastrčený tam v pamäti
pretože pri poklepaní na ikonu na vašom počítači Mac alebo PC
alebo spustiť príkaz ako Mario u Vášho riadku, vaše 0s a 1s z disku
si nahrá do pamäti tak, že počítač môže manipulovať s nimi
a realizovať rýchlejšie.
Takže inicializované údaje a neinicializovaný dát, nebudeme moc hovoriť o tých,
ale tie sú len globálne premenné.
Inicializované znamená globálne premenné, ktoré ste zadali hodnoty;
neinicializovaný znamená globálne premenné, ktoré ste doteraz dávajú hodnoty.
Potom je tu tieto premenné prostredie, ktoré budem úplne vlnu ruku na,
ale sú tam, a že ukladá veci ako užívateľské meno
a iný druh na nižšej úrovni detailov.
Ale Nejšťavnatější kusy z pamäťovej tieto rozloženie je to, čomu sa hovorí stack a haldy.
Stack znova, aby bolo jasno, je pamäť, ktorá sa používa vždy, keď sú volány funkcie,
ak existujú miestne premenné
a ak sú parametre, ktoré kolovali.
To všetko sa deje v zásobníku.
Halda sme nehovorili o tom, ale hádať, kto používa haldy.
Len iný kus pamäte.
Stáva sa to byť vypracované tu hore, ale to je arbitrárny obrazovej konvencie.
Kto je zrejme používa pamäť z haldy týždne?
Je to technicky vy, ale nepriamo. >> [Študent] GetString.
GetString a malloc. Tak tu je zásadný rozdiel.
>> Viete, za posledných pár týždňov, že ak budete potrebovať pamäť, stačí deklarovať premennú.
Ak potrebujete veľa pamäte, deklarovať pole priamo vo vnútri vášho funkcie.
Ale problém sme stále čelí, je, ak ste deklarovať premenné lokálne vnútri funkcií,
akonáhle sa funkcia vráti, čo sa stane do pamäte a tie premenné?
Tak nejako to už nie je tvoja, že jo? Je to jednoducho zmizne druh koncepčne.
Je to ešte fyzicky tam, samozrejme, ale to je už nie vaše právo na používanie.
To je samozrejme problematické, ak chcete písať funkcie v živote
že skutočne alokovať pamäť a nedávajú ju späť okamžite.
Vec v bode: GetString tieto účel v živote je mať tušenie vopred
ako veľký reťazec budem písať na klávesnici,
ale to musí byť schopný alokovať pamäť držať Davida alebo Hello
alebo celé esej, ktorý užívateľ môže zadali dovnútra
Takže GetString bol pomocou malloc.
Malloc preto musí používať nie stoh;
namiesto toho sa pomocou tohto vec zvanú halda.
Na tom nie je nič iné na pamäti. Nie je to rýchlejšie alebo pomalšie, alebo niečo podobné.
Je to len fyzicky na inom mieste.
>> Ale pravidlo je, že pamäť, ktorá je na halde
nebude nikdy odňaté, kým nezavoláte - hádať - zadarmo.
Naopak, každý pamäť môžete požiadať o na zásobníku len vyhlásením poľa
alebo deklarovaní premenné, ako sme to robili niekoľko týždňov,
že v predvolenom nastavení skončí na zásobníku.
A to funguje veľké 90% času, ale na tých vzácnejších prípadoch
, Kde chcete alokovať pamäť a udržať ho okolo,
potom budete musieť použiť funkciu ako malloc.
Alebo sme používali funkciu ako GetString, čo používa malloc.
Poďme sa pozrieť, kde by to mohlo zlomiť dole a potom sa pozrieť na Binkym.
Vrátime sa k tomu v budúcnosti.
Tu je super jednoduchý program, ktorý v prvých 2 riadky čo robí?
V angličtine, čo tieto prvé 2 riadky kódu vykonávajú vnútri main?
[Nepočuteľné Študent odpoveď]
Opatrne. To mi nedáva adresu X alebo Y.
[Študent] dáva odkazy na ints. Dobrý >>. Dajte mi 2 ukazovatele na celé čísla.
Inými slovami, daj mi 2 kusy pamäti, že som udržujú výkres dnes,
aj keď som vymazal to teraz, ako štvorce.
Dajte mi 2 kusy pamäte, jeden s názvom x, jeden volal y -
skôr som im s a t - a čo je typ tohto kusu pamäti?
Bude to uložiť adresu.
Je to z * typ int.
>> Takže adresa int nakoniec žiť v x,
adresu int nakoniec žiť v y,
ale spočiatku, čo je vo vnútri x a y? Kto vie? Smetiarske hodnoty.
To nemá nič spoločné s ukazovateľmi.
Ak sme sa dať tam niečo, kto vie, čo je to vlastne je?
Teraz, x. Čo sa tu deje? To je legitímna teraz, pretože x je ukazovateľ. Je to int *.
Takže to znamená, že môžem dať do x adresu nejakého kusu pamäte.
Čo malloc vráti? Perfect, vráti adresy,
adresu prvého bajtu v celej kus pamäte.
Koľko bytov sa táto zdanlivo prideľovanie, napríklad, v prístroji?
Čo je to veľkosť int? 4.
Ak si myslíte, že späť do týždňa 1, to nie je super dôležité vždy pamätať na to,
ale v tomto prípade je užitočné vedieť, 4 bajty.
Takže toto je prideľovanie na haldy 4 bajty
a to sa vracia adresu prvej sa mi svojvoľne.
A teraz, čo je x robí?
* X = 42 robí čo?
Ak v tomto okamihu v príbehu máme x, ktorý vyzerá takto s niektorými odpadky hodnotou,
To je teraz y s niektorými odpadky hodnotou, teraz v súlade 3 som pridelená 4 bajty.
Tento obrázok v podstate vyzerá takto.
Alebo viac špecificky, ak je to ľubovoľná adresa 123, to je to, čo náš príbeh teraz vyzerá.
* X = 42 teraz znamená čo? To znamená, že ísť na adresu 123 a dal číslo 42 tam.
Nepotrebujem k tomu tieto riadky, pretože nerobíme reťazca.
>> Mal som práve napísal takto, a len pre demonštráciu boží,
42 ako int druh zaberá veľa miesta, 4 bajty.
Tak to je to, čo sa tam stalo, ale je tu problém teraz.
* Y = 13. Čo sa bude diať tu?
Problém je * y v našom zjednodušenom svete len znamená, že ísť na adresu v y.
Čo je v y? Je to nejaký smetiarske hodnota.
Takže predpokladajme, že odpad hodnota je 5551212, niečo šialené takého.
* Y znamená ísť riešiť 5551212.
To je ako tu. To neexistuje, napríklad.
Takže * y dostane 13 znamená, že som sa snaží čerpať 13 tu. To neexistuje.
Som prekročil segment tabuľu. Čo získam?
To tajomná správa Segmentation fault, pretože sa snažím, aby v pamäti
hodnota ako 13 na mieste, ktoré neexistuje.
Zvyšok programu by mohlo fungovať v poriadku, ale až do tej doby to robí nie.
Takže poďme sa pokúsiť rozprávať tento príbeh.
Vrátime sa k tomu raz sme hovorili o hex.
Vráťme sa k tomu, a uzavrieť s týmto, čomu sa hovorí Binky,
ktorý odvolanie je profesorom Stanfordskej sedí doma hrá s Claymation,
rozprávať príbeh o presne rovnaké programu.
Je to len asi 3 minúty dlhé. Tu máme Binky.
[Male reproduktor na videu] Ahoj Binky, prebudiť. Je čas na ukazovateľ zábavu.
[Binky] Čo je to? Ďalšie informácie o ukazovateli? Oh, dobrota!
[Samec reproduktor] No, začať, myslím, že budeme potrebovať pár rád.
>> [Binky] Dobre. Tento kód prideľuje 2 ukazovatele, ktoré môžu ukazovať na celé čísla.
[Samec reproduktor] Dobre. No, vidím 2 ukazovatele, ale nezdá sa, že sa ukázal k ničomu.
[Binky] To je pravda. Spočiatku, ukazovatele neukazujú na nič.
Veci, ktoré smerujú k sa nazýva pointees, a ich nastavenie je samostatný krok.
[Samec reproduktor] Oh, dobre, dobre. Vedel som, že. V pointees sú oddelené.
Ehm, tak ako si prideliť pointee?
[Binky] Dobre. Tento kód alokuje nový integer pointee, a táto časť nastaví x poukázať na to.
[Samec reproduktor] Hej, to vyzerá lepšie.
Tak, aby to niečo urobiť. >> [Binky] Dobre.
Budem dereferencia ukazovatele x číslo uložiť 42 do svojho pointee.
Pre tento trik budem potrebovať svoju kúzelnú paličku z dereferencing.
[Samec reproduktor] Vaše kúzelná palička z dereferencing? To je skvelé.
[Binky] To je to, čo kód vyzerá. Ja si len nastaviť počet a ... [Praskanie zvuku]
[Samec reproduktor] Hej pozri, tam to ide.
Tak robí dereferencia na X nasleduje šípka prístup k jeho pointee,
v tomto prípade k uloženiu 42 tam.
Ahoj, skúste ho uložiť číslo 13 cez iné ukazovatele, y.
[Binky] Dobre. Ja pôjdem sem k y a dostať číslo 13 nastavenie
a potom mať prútik z dereferencing a len ... [Bzučanie] Whoa!
[Samec reproduktor] Oh hey, to nepomohlo.
>> Povedz, Binky, ja si nemyslím, že dereferencing y je dobrý nápad
pretože nastavenie pointee je samostatný krok
a ja si nemyslím, že sme kedy urobili.
[Binky] Hmm, dobrá pripomienka.
[Samec reproduktor] Jo. Sme pridelené ukazovateľ y, ale nikdy sme nastaviť, aby ukazoval na pointee.
[Binky] Hmm, veľmi pozorný.
[Samec reproduktor] Hej, vyzeráš dobre tam, Binky.
Dokážeš to opraviť tak, že y odkazuje na rovnaký pointee ako x? >> [Binky] Jasne.
Budem používať svoj kúzelnú paličku ukazovacie práce.
[Samec reproduktor] je, že bude problém ako predtým?
[Binky] No, to nedotýka pointees.
Je to jednoducho zmení jedného ukazovateľ ukazovať na rovnakú vec ako iný. [Praskanie zvuku]
[Samec reproduktor] Oh, vidím. Teraz y poukazuje na rovnakom mieste ako x.
Tak počkať. Teraz y je stanovená. Má pointee.
Takže si môžete vyskúšať prútik z dereferencing znovu poslať 13 OVER.
[Binky] Uh, jo. Tu ide. [Praskanie zvuku]
[Samec reproduktor] Hej, pozri sa na to. Teraz dereferencing práce na y.
A pretože ukazovatele sú nelegálne, že jeden pointee, obaja pozri 13.
[Binky] Jo, zdieľanie. Čokoľvek.
>> Takže sa budeme prepínať miesta teraz?
[Samec reproduktor] Oh look, sme mimo čas. >> [Binky] Ale -
[Samec reproduktor] Len si spomeňte na 3 ukazovatele pravidlá.
Číslo 1, základná štruktúra je, že máte ukazovateľ, a to ukazuje na na pointee.
Ale ukazovateľ a pointee sú oddelené, a Častou chybou je nastaviť ukazovateľ
ale zabudol dať jej pointee.
Číslo 2, ukazovateľ dereferencing začína u ukazovatele a sleduje šípku cez
prístup k jeho pointee.
Ako všetci vieme, to funguje len v prípade, že je pointee,
aký druh sa vracia do Pravidlo číslo 1.
Číslo 3, ukazovateľ priradenie vezme jeden ukazovateľ a zmení ju
poukázať na rovnakej pointee ako iný ukazovateľ.
Takže po zadaní, budú tieto 2 ukazovatele ukazovať na rovnakú pointee.
Niekedy tomu sa hovorí zdieľanie.
>> A to je všetko, čo k nej naozaj. Bye-bye teraz.
To je Binky. To je CS50. Uvidíme sa budúci týždeň. [Potlesk]
>> [CS50.TV]