>> [Přehrávání hudby]
David J. Malan: Dobře.
To je CS50, a to je na konci týdne čtyři.
A jedním z témat dnešní je, že digitální forenzní,
umění obnovovat informace.
A skutečně, i když jste ve středu
teď míru na třech a Breakout, příští týden,
Důraz bude kladen na Právě tato doména.
>> Takže jeden z nejlepších míst, co jsem kdy měl, byl zpátky v postgraduálním studiu,
když jsem pracoval pro místní Middlesex County okresní prokurátor je
kancelář, dělá forenzní práce.
Takže v podstatě, Massachusetts Státní policie, příležitostně,
Při práci na případech by přinést věci, jako jsou pevné disky
a diskety a paměťové karty a podobně.
A oni by jim ruce mně a mým učitelem,
a naším cílem bylo najít důkazy, v případě, že se některý, na těchto médiích.
Nyní, možná jste viděli záblesky z tohoto světa forenzní
v médiích, TV a filmy.
Ale práce, kterou jsem měl, a Troufám si tvrdit, že svět,
není tak docela, jako byste ho vidět.
Pojďme se podívat na to, co pravděpodobně jste viděli.
[PŘEHRÁVÁNÍ]
-OK.
Nyní pojďme dobré podívat se na vás.
>> [Přehrávání hudby]
>> Vydrž to.
Spustit to zpátky.
>> -Počkejte Minutu.
Jděte vpravo.
-Tady.
Freeze to.
-Full Obrazovkou.
>> -OK.
Freeze to.
Utáhnout se na to, že jo?
>> -vector V na to člověk od zadního kola.
>> -zvětšení Tady na tomto místě.
>> -s Pravé zařízení, Obraz lze zvětšit a brousit.
>> Co je to?
>> -To Vylepšení programu.
>> Umíš jasné, že se nějaké?
>> Já nevím.
Pojďme zvýšení.
>> -Enhance § A6.
Zvýšila jsem detail, a--
Já myslím, že je dost zlepšit.
Uvolněte jej na mé obrazovce.
>> Já lepší odraz v očích.
Nech to běžet tak prostřednictvím Vylepšení videa.
>> -Edgar, Můžete zlepšit to?
>> -Hang Na.
>> -Byl Jsem pracoval na této úvahy.
>> -Je Něčí odraz.
>> -Reflection.
-Je Odraz obličeje.
>> -The Reflexe!
-Je Odraz.
-zvětšení Na zrcadlo.
Můžete vidět odraz.
>> Umíš zlepšit obraz odsud?
Umíš to zlepšit?
-Můžeme Zlepšit to?
Umíš to zlepšit?
Vydrž chvilku.
Budu zvýšit.
-zvětšení Na dveře.
-krát 10.
-zoom.
-Move V.
Víc.
Počkat, zastavit.
Přestaň.
-Pause To.
-Rotate Nás 75 stupňů kolem vertikální, prosím.
>> Přestaň.
Vraťte se do části o dveřím.
>> Rozumím obrazový zesilovač, který může rastrový obrázek?
>> -Možná Můžeme použít Pradeep Singh způsob, jak vidět do oken.
>> -The Software je nejmodernější.
>> -The Vlastní číslo je vypnutý.
>> -S Doprava Kombinace algorithms--
>> -Je Přijatá na osvětlení algoritmy na další úroveň,
a mohu je použít k zvýšit tuto fotografii.
>> -Lock Dál a rozšířit osy z.
>> -Enhance.
Vylepšit.
-Enhance.
-Freeze A vylepšit.
[END VIDEOPŘEHRÁVÁNÍ]
David J. Malan: Tak to jsou všechna slova, ale nebyly
používá ve větách správně.
A skutečně v budoucnu, kdykoliv, prosím, uslyšíte někoho říkat slovo,
"Posílit," zasmál jen trochu.
Vzhledem k tomu, když se pokusíte zvýšit, Například, to je to, co se stane.
>> Tak tady je nádherná fotka.
To je CS50 vlastní Daven.
A předpokládám, že bychom chtěli zaměřit na jiskrou v oku,
nebo odraz špatný chlap, který byl jasně
zachycen bezpečnostní kamerou.
To je to, co se stane, když můžete přiblížit na obrazu, který
má pouze konečný počet bitů, s ním spojené.
>> To je to, co byste si.
A skutečně, v Daven oka je ale čtyři, možná šest bodů
že skládat přesně to, co tam mihotají.
Takže problém Set Four bude mít v konečném důsledku prozkoumat tento svět, a to zejména
podle povahy něco nazýváme soubor I / O, kde
I / O je jen ozdobný způsob, jak říká, vstup a výstup.
>> Takže dosud, všechny interakce jsme měli s počítačem
byly do značné míry s vaším klávesnice a displej,
ale ne tolik, s pevným diskem, nebo ukládání souborů mimo ty, které
sami napsat.
Vaše programy tak daleko mají není vytváření a ukládání,
a aktualizovat své vlastní soubory.
>> No, co je to soubor?
No, něco jako JPEG.
To je obrázek, který by mohl mají nebo nahrát na Facebook,
nebo vidět nikde na webu.
Ve skutečnosti, že fotografie jsme právě pila Daven byl JPEG.
A co je zajímavé, o souborů, jako je JPEG
je, že mohou být identifikovány, typicky, určitými vzory bitů.
>> Jinými slovy, to, co je možné, že rozlišuje JPEG z GIF
od PING z Wordu Dokument ze souboru aplikace Excel?
No, je to prostě jiný vzory bitů.
A ty různé vzory obvykle na začátku těchto souborů.
>> Takže když váš počítač otevře Word doc, nebo pokud počítač otevře JPEG,
to vypadá typicky Prvních několik bitů v souboru.
A pokud to uzná vzor, říká, oh, to je obraz.
Dovolte mi, abych ji pro uživatel jako grafiku.
Nebo, oh, tohle vypadá jako Word doc.
Dovolte mi ukázat uživateli jako esej.
>> Tak například, JPEG, Ukazuje se, že jsou
poměrně sofistikované pod kapotou.
Ale první tři bajty nejvíce každý Kdo JPEG s těmito třemi čísly.
Tak bajt nula, jedna, a dvě, v Nejvíce každý JPEG, 255, pak číslo
216, pak číslo 255.
>> A to, co budete moci začít dělat příští týden
je vlastně strkat pod kapuce souborů jako JPEG
a jako bitmapové soubory, a viděl Co je tam vždycky tak dlouho,
jak jste byli pomocí počítače.
>> Ale to, co tam není obvykle psaný jako desetinná čísla, jako je tento.
Počítačoví odborníci ne mají tendenci mluvit v desítkové soustavě.
Oni opravdu mluví v binárním formátu.
Typicky, když chceme vyjádřit čísla,
jsme vlastně používat hexadecimální, které mohou vyvolat
z, řekněme, Problem Set Jeden, který napadal
můžete přemýšlet o jiném systému.
>> My, samozřejmě, jsou obeznámeni s desetinné číslo, nula až devět.
Mluvili jsme o binární.
A my opravdu nemáme používat, že mnoho zde
ven, protože počítače se použít.
Ale programátoři budou velmi často, ale ne vždy,
používat hexadecimální, což prostě znamená, budete mít 16 znaků do abecedy,
na rozdíl od dvou nebo 10.
>> Tak jak se vám počítat do vyšší než devět v hexadecimální soustavě?
Ty jít 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, jen konvencí.
Ale co je klíčové je, že každý z nich je jeden symbol.
Neexistuje žádná 10.
Neexistuje žádná 11, sama o sobě, protože každý vaše číslic, stejně jako v desítkové soustavě
a stejně jako v binární, by jen být jediný znak, konvencí.
>> Tak to je tedy abeceda máme které máme k dispozici na šestnáctkové.
Takže co JPEG vypadat, pokud vás měl vypsat ty první tři
bajty ne jako desetinné ale například jako hexadecimální?
A proč je hex i všechno to užitečné?
>> No, rychlý pohled na příklad.
Takže když jsem se vypsat bity, které představují tyto desetinné numbers--
to by mohlo být trochu rezavý nyní od několika týdnů zpět
ale levý a pravá jsou docela jednoduché.
255 byl největší počet jsme může představovat s osmi bitů.
Bylo to všechny ty.
Takže jediný, který je mírně Zajímavé je prostřední.
A pokud jste trochu mimo to matematika, budete vyvodit, že skutečně
že vzorek z jednoho a nuly představuje 216.
Takže řekněme, stanoví pro teď, že to je správné.
Ale proč je to zajímavé?
>> No, byte, samozřejmě, je osm bitů.
A ukázalo se, že pokud si myslíte, z bytu jako dva kusy čtyř bitů,
takhle.
Dovolte mi přidat trochu prostoru.
Tak před, po.
Právě jsem přidal nějaké bílé místo Z důvodu zde vizualizaci je.
Jak můžeme nyní představují v, řekněme, hexadecimální každý quad bitů,
každá sada čtyř bitů?
>> Tak například, v levé Nyní máme 1111 v binární.
Co je to číslo v desítkové soustavě, pokud si z matematiky?
Máte ones místo, dvojky místo, místo čtyřky a osmičky místo.
>> Diváků: 15.
David J. Malan: Je to 15.
Takže pokud budeme dělat osm plus čtyři plus dva plus jedna, dostaneme 15.
Takže jsem se mohl zapsat 15 pod 1111, ale celý vtip zde
je hexadecimální, ne desítkové.
Takže místo psaní o 15, 1-5, Chystám se napsat, že v hexadecimálním tvaru,
která, pokud si myslíte, že zpět, pokud máte nula až f, co se 15 bude?
DIVÁKŮ: f.
David J. Malan: Tak to dopadá, že je to f.
A můžete na to přišel tím, že říká, No, jestli je 10, pak OK, f je 15.
Takže ve skutečnosti, můžeme přepsat tento stejný soubor čísel je f.
A pak když to uděláme trochu matematiky, budeme odvodit, že to je d.
Osm je docela snadné, protože jsme mít jeden v místě osmičky.
A pak máme ještě pár f f je.
>> Takže to, co lidé mají tendenci dělat podle konvence při použití v šestnáctkové soustavě je prostě
napsat to trochu stručněji, zbavit většiny z toho prázdného místa.
A jen být super jasné čtenáři, že je v šestnáctkové soustavě,
jednoduché konvence mezi lidé se píšete nula
x, který nemá žádný jiný význam než vizuální identifikátor,
tady je hexadecimální číslo.
>> A pak si dal dvě číslice, f f v tomto případě, pak d, pak f f.
Tak dlouhý příběh krátký, hexadecimální jen inklinuje
, že jsou užitečné, protože každý z jeho číslice, nula až f dokonale linky
až se vzorem čtyř bitů.
>> Takže pokud máte dvě hexadecimální číslice, nula až F, znovu a znovu,
které vám umožní dokonale Osm bitů nebo jeden bajt.
Takže to je důvod, proč má tendenci být konvenčně užitečná.
Není k duševnímu Obsah opravdu za to,
jiný než jeho skutečné užitečnosti.
>> Nyní JPEG nejsou jedinou formáty souborů pro grafiku.
Můžete si připomenout, že existují soubory, jako je to ve světě,
alespoň z pár let zpět.
>> Takže to bylo vlastně nainstalován v systému Windows XP
na milionech počítačů po celém světě.
A to byl soubor bitmapy BMP.
A rastrový soubor, jak uvidíte další týden, jen se rozumí vzorek teček,
pixelů, jak se jim říká, Mapa na kousky, opravdu.
>> Takže to, co je zajímavé, i když, o tomto formátu, BMP, je
že pod kapotou, to má více než jen tři byty
které tvoří jeho záhlaví, takže mluvit, prvních pár soust.
Ve skutečnosti to vypadá trochu složité na první pohled.
A uvidíte to v sadě P.
A jak se něco zejména z toho teď
není tak důležité, jak jen to, že na začátku každé bitmapy
soubor, grafický formát, je tu celá banda čísel.
>> Nyní Microsoft, Autorem tohoto formátu,
tendenci volat těm, Věci, které ints a znaky
, plave na hladině, ale slova a d slova a touží a byty.
Takže jsou to jen různé datové typy.
Jsou různé názvy pro stejnou věc.
Ale uvidíte, že v P stanovila čtyři.
>> To je ale pouze říci, že pokud je člověk poklepe nějaký soubor BMP na jeho
nebo její pevný disk, a otevře se okno se ukazuje mu, že obraz,
co se stalo, protože operační Systém pravděpodobně všimli nejen
rozšíření .BMP v názvu souboru,
ale také skutečnost, že tam je nějaký konvence vzoru bitů
na samém počátku tohoto bitmapového souboru.
>> Ale pojďme se zaměřit na takové složité souboru,
ale na něco takového.
Předpokládám, že tady v gedit, I prostě začátky
programu, který je velmi jednoduchý.
Mám nějaké zahrnuje až nahoru.
Teď mám # include "structs.h", ale Vrátím se k tomu za chvíli.
Ale to je užitečné pro teď.
Tak tohle je program že se to realizovat
jako databáze registrátora.
Takže databáze studentů, a každý student ve světě
má své jméno a dům a pravděpodobně některé další věci, ale budeme držet to jednoduchý.
Každý student má své jméno a domu.
>> Takže když jsem chtěl napsat program, jehož smyslem života
právě iterovat od nulu až na tři,
v případě, že je tři studenty na Harvardově univerzitě.
A chci, aby si pomocí getString, jméno a house každého studenta,
a pak už jen vytisknout ty ven.
>> To je něco jako týdne Jeden, týden Dvě věci teď,
kde chci jen pro smyčka nebo něco takového.
A chci volat getString několik krát, a potom vytiskněte f několikrát.
Tak jak bych mohl udělat, i když, když oba jméno a dům
jsou zapojeny pro každého studenta?
>> Takže můj první instinkt by mohly být něco takového.
Mohl bych nejprve říci, dobře, dej mi, říci, pole řetězců s názvem jména.
A nechci zde napevno tři.
Co chci, aby tam dal?
Takže studenti, protože to je právě konstanta deklarována v horní části,
jen tak nemám natvrdo tři na více místech.
Tímto způsobem, může se mi to změnit na jednom místě, a to má dopad na změnu všude.
A pak, já bych mohl dělat string domy studentů.
>> A teď, mohl bych něco takového for (int i = 0; i <studentů; i ++.
Takže jsem psát rychle, ale je to nyní pravděpodobně obeznámeni syntaxe.
>> A teď je to novější.
Pokud chci, aby se v i-tém Jméno studenta, myslím, že jsem to udělat.
A pak, ne jako jména ale domy bracketing i.
Já to udělat, getString, a nechat me se vrátit a opravit tuto linku.
Souhlasíte s tím?
Nesouhlasíte?
Není to jako velmi uživatelsky příjemný.
Neřekl jsem na uživateli, co má dělat.
>> Ale teď, když jsem také chtěl později, pojďme
řekněme, vytiskněte si tyto věci out-- tak TODO později.
Budu dělat více s tohle-- to pravděpodobně znamená
správné provádění získání jména a rodinných domů, tři
z nich celkem každý, od uživatele.
>> Ale to není moc dobrý design, ne?
Co když student nemá jen jméno a dům, ale i identifikační číslo,
a telefonní číslo, a e-mailová adresa,
a možná i domovské stránky, a Možná Twitter rukojeť,
a jakýkoliv počet dalších detailů spojeno s studenta nebo osobu,
obecněji.
Jak by se začneme přidávat Funkce tohoto programu?
>> No, mám pocit, že tím nejjednodušším způsobem by mohl bylo to něco jako, řekněme,
int IDS studentů.
Tak jsem si dal všechny své ID tam.
A pak, o něco jako jsou telefonní čísla,
Nejsem si jistý, jak se Prohlašuji, že ještě ne.
Tak pojďme do toho a jen volání tento twitters studenti, které
Je trochu zvláštní, ale-- a spoustu další pole.
>> Jsem začal efektivně zkopírovat a vložit sem.
A to bude růst hodně nemotorné docela rychle, ne?
Nebylo by hezké, kdyby tam byly ve světě známa struktura dat
ne jako int nebo řetězec, ale něco vyšší úroveň, abstrakce, takže
mluvit, známý jako student?
C nepřišel s vestavěným Funkce pro studenty,
ale co když jsem chtěl dát to jako?
>> No, ukázalo se, budu otevřít soubor s názvem structs.h zde
a můžete to udělat přesně to.
A budeme začít dělat teď.
A pod kapotou P nastavit tři, už jste to dělám teď.
Není tam žádná taková věc jako g obdélníku nebo g ovál v programovacím jazyce C.
>> Lidi v Stanford realizován ty datové typy pomocí tohoto přístupu zde,
deklarovat své vlastní nové údaje typy s použitím nové klíčové slovo
nazývá struct a další jeden s názvem typedef.
A skutečně, i když syntaxe vypadá trochu liší od věcí
jsme viděli dříve, princip, že je to super jednoduché.
>> To prostě znamená, že "definovat typ."
Že to bude Struktura, a struktura
je stejně jako nádoby pro více věcí.
A tato struktura bude mít řetězec s názvem název,
a řetězec s názvem dům.
A řekněme, jen pro pohodlí, Celá tato struktura dat studentem.
>> Takže v okamžiku, kdy se dostanete do středník, máte nyní
vytvořili vlastní údaje Typ názvem Student
, která nyní stojí vedle int, a float a char, a řetězec,
a g rect, a g oválné, a libovolný počet jiných věcí, které lidé vymysleli.
>> Takže to, co je užitečné, o tom Nyní je, že když se vrátím
na struct 0 a dokončit implementace, který jsem napsal
předem tady, všimněte si, že všechny nevyhnutelného nepořádek, který
byl asi na začátku děje, jak jsem přidal telefonní čísla a twitters a všechny
tyto jiné věci Definice studenta,
teď je to stručně shrnula jako jediného pole studentů.
>> A každý z těchto studentů se má více co do ní.
Takže zbývá jen jednu otázku.
Jak se dostanete na jméno, a dům a ID,
a cokoliv dalšího, co je uvnitř studenta?
Super jednoduché, stejně.
Nová syntaxe, ale jednoduchá myšlenka.
>> Jednoduše index do pole, jako jsme to udělali minulý týden, a to.
A co je jasně nový kus syntaxe?
Jen., Což znamená "jít dovnitř Struktura a získat pole s názvem
jméno, se na pole s názvem dům, dostat na pole s názvem studentem. "
>> Takže P nastavit tři, pokud jste stále pracuje na tom,
a většina lidí stále je, si uvědomit, že jako vy
začít používat věci, jako je g rects a g ovály
a další věci, které se nezdají pocházejí z týdne nula, jedna, nebo dvě,
Uvědomuji si, že to je proto, že Stanford prohlásil některé nové datové typy.
>> A vskutku, to je přesně to, co budeme ano, i v P stanovila čtyři, když
začneme se zabývat věcmi jako obrázky, rastrové obrázky a další.
Tak to je jen ukázka a mentální model pro to, co má přijít.
Teď jsem otálel trochu dnes ráno.
Byl jsem docela zvědavý na to, co Microsoft tapeta ve skutečnosti
vypadá dnes.
A ukázalo se, někdo v roce 2006 vlastně šel téměř přesně
na stejném místě na fotografii ve skutečnosti co vypadá jako, že v těchto dnech.
Pole je nyní trochu zarostlé.
>> Takže mluvit teď obrazů, vraťme zpět Daven zde
na obrazovce a Mikuláše, a jen vám připomenout,
, že pokud byste se k nám připojit na oběd tento pátek, vedoucí k naší obvyklé adrese
zde.
>> Tak kde jsme to vypnout v pondělí?
Tento problém jsme zavedli, že jo?
Toto bylo zdánlivě správné realizace odkládací prostor,
kdy berete dvě ints, jeden volal, kdo volal b,
vyměnit je, stejně jako tady udělala Laura na jevišti s mlékem a vodou,
pomocí dočasné proměnná, nebo prázdný šálek,
tak, že bychom mohli dát b do a A v b aniž by nepořádek věcí.
Použili jsme proměnnou.
Říká se tomu tepl.
>> Ale co bylo zásadní Problém s tímto kódem v pondělí?
Co to bylo za problém?
Jo.
>> Diváků: Zabírá více místa.
>> David J. Malan: Zabírá více prostor, protože jsem pomocí proměnné,
a to je v pořádku.
To je pravda, ale já jsem bude říkat, že je to OK.
Je to jen 32 bitů ve velkém schéma věcí, takže není velký problém.
Jiné myšlenky?
Diváků: To jen swapy proměnné lokálně.
David J. Malan: Přesně tak.
Je swapy pouze proměnné lokálně.
Protože pokaždé, když volání function-- když jsem měl zásobníky z Annenberg
naposledy, máte hlavní na dně.
Jakmile zavoláte funkci nazvanou swap swap nevede žádné se X a Y
původní hodnoty.
Co odkládací get, jsme se tvrdí?
Diváků: Kopie.
David J. Malan: Takže jejich kopie.
Takže to bude jedna a dvě, pokud máte připomenout si příklad z poslední doby,
ale kopie jednoho a dvou které jsou úspěšně prohozeny.
Ale bohužel na konci, tyto hodnoty jsou stále stejné.
Takže můžeme vidět s našimi nový přítel, doufejme GDB,
že vy nebo TFS a Ca mají se vám vede k takto.
>> Takže žádná výměna odvolání vypadá jako-- pojďme otevřít tohle-- vypadá takto.
Inicializován jsme x na jedné, y na dva.
Měl spoustu tisku f je.
Ale pak, tlačítka Volat zde byl vyměnit, což
je přesně ten kód jsme právě viděli před chvílí.
Což je správné v první pohled, ale funkčně,
tento program nefunguje, protože není trvale zaměnit x a y.
>> Takže pojďme vidět, rychlého ohřevu sem s GDB, a ./noswap.
Banda ohromující informace, které Budu se zbavit s řídící L teď.
A teď, budu pokračovat a spusťte jej.
A bohužel, že Nebylo to tak užitečné.
To běželo program uvnitř této program s názvem gdb debugger,
ale to mi nedovolí hrabat kolem sebe.
>> Tak jak mohu skutečně pozastavit provedení uvnitř tohoto programu?
Tak zlomit.
A já jsem mohl rozbít na jakýkoliv číslo řádku, jeden, 10, 15.
Ale já si také rozdělit symbolicky tím přerušení main.
A že se to nastavit pauzu bod, zřejmě na řádku 16 v hlavní.
A kde je linka 16?
Pojďme do kódu a jít až na noswap.
A skutečně, řádek 16 je první v programu.
>> Takže teď, když jsem se do toho pusťte a typ spustit tento čas, Enter, je pozastaveno.
Takže pojďme hrabat kolem sebe.
Vytisknout x-- proč je x nula?
A ignorovat znak dolaru.
To je jen pro milovník využití programu.
Proč je x nula v současné době?
Jo.
>> Diváků: Zastavil se těsně před linka 16, ne vlastně on-line 16..
David J. Malan: Přesně tak.
GDB, ve výchozím nastavení se odmlčel provedení těsně před potrubím 16.
Takže to nebyl vykonán, které znamená, x je nějaké neznámé hodnoty.
A měli jsme štěstí, že je něco čisté jako nula.
Takže teď, když jsem psát další, teď je proveden 16.
Čeká na mě vykonat 17.
Nech mě jít napřed a tisk x.
Je to jedna.
Nech mě jít napřed a tisk y.
Co bych měl teď vidět?
>> Diváků: [neslyšitelné]
>> David J. Malan: trochu hlasitěji.
>> Diváků: [neslyšitelné]
David J. Malan: Ne tak docela shoda.
Takže ano, vidíme nějaké odpadky hodnotu.
Nyní, y je 134514064 zde.
No, je to jen nějaký odpad hodnota.
Můj program používá RAM pro různé účely.
Je tu další funkce.
Ostatní lidé psali v mém počítači.
Takže tyto bity jsou použity pro jiné hodnoty, a to, co jsem viděl
Je zbytky některých Před použití této paměti.
>> Takže žádný velký problém, protože jakmile jak píšu další a pak vytisknout y,
to je inicializován hodnota, kterou chci.
Takže teď, pojďme do toho trochu rychleji.
N pro další.
Udělejme to znovu.
Ale já nechci hit je to tady, protože když jsem
chcete vidět, co se děje uvnitř swap, co je příkaz?
>> DIVÁKŮ: kroky.
>> David J. Malan: kroky.
Tak tohle mě vstoupí do funkce, spíše než nad ním.
A teď je to trochu záhadný upřímně, ale to je jen
říkal mi, že jsem v řadě 33 teď.
A jdeme na to znovu.
Print temp.
Garbage hodnota, negativní tentokrát ale to je jen stále hodnota odpadky.
Tak pojďme dál, tisku tepl.
Je inicializován na hodnotu 1, což byla hodnota x, aka.
>> A teď, kde jsou naše a X přichází?
Dobře si všimněte, v hlavní, my volal Tyto hodnoty x a y.
Pak jsme kolem nich vyměnit takto.
X přišel první, čárka y.
A pak, swap by jim zavolat x a y.
Ale pro přehlednost je to volat je a, b.
Ale a a b jsou nyní bude kopie x a y, resp.
>> Takže když jsem se vrátit do GDB, temp je nyní jednou a je nyní jedním.
Ale když to udělám další a teď si tisk , již přešel.
Mléko se nalije do bývalé Pomerančová šťáva je sklo, nebo naopak.
>> A když to udělám další zase, a teď když jsem vytisknout jako kontrola sanity,
je ještě dva, ale b je nyní jedna.
Upřímně řečeno, je to tam pořád.
Nezajímá mě, co je teplota.
Ale jakmile jsem se psát, řekněme, pokračovat se vrátit, teď jsem na konci
Program.
A bohužel, x je ještě jednou a y je ještě dva.
>> Takže to, co bylo užitečnost GDB tam?
Nebylo mi pomohl opravit problém sám o sobě,
ale to mi snad pomůže pochopit realizací
že ano, moje logika je v pořádku, ale můj kód není konečném stadiu
trvalý vliv.
Tak to je problém, že jsme bude nyní řešit dnes.
>> Ale pojďme se tam dostat pomocí tohoto.
String je lež.
To také není datový typ která existuje v C. Je to
Byl synonymem pro některé čas na něco jiného,
a můžeme prozradit, že takto.
>> Nech mě jít napřed a otevřít program s názvem compare-0.
A spíše než psát tenhle ven, začneme projít kódu
Už jsem psal, ale Je to jen pár řádků.
To je tak porovnat-0.
A první věc, kterou dělám je stále řádek textu.
>> Ale všimněte, co jsem dělá poprvé.
Jaký je rozdíl jasně o řádku 21?
Vlastně počkej.
Toto je kopie dvou.
To není ani ten správný program.
Tak jo, spoiler.
Dobře, takže to nevadí.
To je odpověď na otázku budoucnosti.
>> Zde je porovnání-0, a já jsem asi dostat řádek textu.
Program je mnohem jednodušší.
Tak to je jednoduché.
To je jako první týden, týden Dvě věci v současné době. řetězci s = GetString.
Teď jsem to znovu tady.
string t = GetString.
A pak poslední věc, kterou v tomto programu, jak již název napovídá,
se budu snažit, aby jejich porovnání.
>> Takže pokud s první řetězec, rovná se = T, pak jsem
chtěl říct, zadejte totéž.
Jinak, já jsem chtěl říct píšete něco jiného.
Takže pojďme sestavit a spustit tento program.
Takže si porovnat nulu.
Vypadá to dobře.
Žádné chyby kompilace.
>> Nech mě jít napřed teď a zadejte ./compare-0.
Nech mě jít napřed a něco říct : Daven a něco: Rob.
A píšu různé věci.
Tak daleko, tak dobrý.
Program se zdá být v pořádku.
>> Ale pojďme jej spustit znovu.
Řekni něco: Gabe.
V pořádku.
Možná, že jsem narazila mezerník nebo něco funky.
Udělejme to znovu.
Tak Zamyla.
Zamyla.
Různé věci.
Takže to, co se děje?
>> Takže máme tyto dva řádky kód, GetString volána dvakrát.
A pak, já jsem prostě snaží se porovnat s a t.
Ale to, co opravdu pak se to děje?
No, můj rukopis je asi řezník tento příklad poněkud.
A pojďme skutečně hodit to se sem, stejně.
>> Takže máme obdobný řádek řetězci s = GetString.
Tak to je prostě první zajímavé linie z tohoto programu.
Ale to, co celou tu dobu byl děje pod kapotou?
No, na levé straně je řetězec, což je nějaký typ proměnné,
a nazývá se s.
Takže vím, že je to s použitím paměti nebo RAM v počítači nějak.
Takže budu abstraktně kreslit, že jako čtverec.
32 bitů, to dopadá, ale o tom více v budoucnu.
A potom, co se děje tady?
>> No, samozřejmě getString dostane řetězec od uživatele.
A GetString dostal Zamyla nebo Gabe nebo Daven.
Takže pojďme si vybrat jako první z těch, která byla Daven.
Tak efektivně, co GetString dostal mi v tomto prvním případě byl D--v-e-n.
A pak, co ještě dělal dát mi tajně?
Diváků: [neslyšitelné]
David J. Malan: Ano, / 0 nebo null znak.
Tak to mě skutečně dal řetězec.
Ale my už víme z předchozí Vypadá, že řetězec je jen pole
znaků, a je ukončena Tato speciální Sentinel znak, / 0.
>> Ale pokud je to pravda a to je čtverec,
to je samozřejmě mnohem větší obdélník.
A skutečně, to je, Tvrdím, pouze 32 bitů.
A to je samozřejmě více než 32 bitů, protože to je pravděpodobně
osm plus osm plus osm navíc osm plus osm,
jen proto, že z bytů v ASCII.
Jak sakra budeme, aby se vešly Daven do této malé krabičce tady?
>> No, co se getString vlastně dělá?
No, to mřížka zde představuje paměti nebo RAM mého počítače.
Takže pojďme libovolně říci, že pokud každý z nich představuje byte,
pak můžeme myslet na sebe bajt jako mající adresu,
jako 33 Oxford Street nebo 34 Oxford Street nebo 35 Oxford Street.
>> Tak jako domy mají adresy a budovy mají adresy,
tak se jednotlivé bajty Paměť mají adresy nebo čísla
, která jednoznačně identifikovat.
Tohle je libovolná.
Ale aby to jednoduché, budu používat hexadecimální jen konvencí,
ale 0x znamená nic jiného, než "toto je hexadecimální."
a budu tvrdit, že "D" končí Byte One v paměti.
>> Dostal jsem nic jiného se děje v paměť, takže Daven dostal první místo
v byte One.
To pak bude 0x2.
To se děje na 0x3.
To bude 0x4.
To se děje na 0x5.
To bude 0x6.
>> Ale jakmile začnete přemýšlet o tom, co dělá počítače
pod kapotou, můžete začít vyvozovat
jak vám, před několika lety, by zavedly C sám.
Co je GetString pravděpodobně returning-- proto, že
pocit, že to není návratu Daven, sama o sobě,
, protože to určitě nebude aby se vešly do této malé box--
takže to, co je GetString pravděpodobně vrací?
>> Diváků: [neslyšitelné]
>> David J. Malan: Umístění Daven.
A to dělal to od chvíle, kdy první týden.
Co GetString je opravdu návratu není řetězec, sama o sobě.
To je jedna z těch malých bílých lží.
Je to vrací adresu řetězec v paměti, jedinečná adresa.
Daven žije na 33 Oxford Street.
Ale stručněji, Gavin žije na 0x1, Adresa číslo jedna.
>> Takže to, co dostane dát v tomto krabička pak, aby bylo jasné,
je jen adresa tohoto řetězce.
Takže celou tu dobu, to se děje.
Ale co to naznačuje Nyní je, že pokud vše to má
je číslo uvnitř ní, který je tě zastavit, programátor,
od uvedení jakékoliv číslo v všechny proměnné a jen na lyžích
k tomuto kusu paměti?
A skutečně, uvidíme že je to hrozba příště.
>> Ale teď je to vše nestačí.
Když řeknu, abych řetězec, můžete mi dát Daven.
Ale nemáte opravdu, dejte mi Daven.
Jediné, co mi dal, je Daven je adresa.
Jak mám potom vědět, zda kde Daven začíná a ends--
příběh je stále weird-- kde Daven začíná a končí,
a pak, další řetězec v paměti začíná?
>> No, pokud jste podal mi začátek Daven,
v podstatě, jak to vím, kde je konec jeho jméno je?
Že zvláštní znak null, což je to více nyní důležité
pokud řetězce pod kapuce jsou identifikována
jednoznačně o jejich umístění v paměti.
Takže celou tu dobu, že je to co se děje.
>> Takže když se podíváme hned na Zde je kód, vysvětlit
pokud by chyba v řádku 26.
Proč je Zamyla a Zamyla liší?
Proč je Gabe Gabe a jiní?
Jo, v zádech.
>> Diváků: Mají různé adresy.
>> David J. Malan: Jednoduše proto, že mají různé adresy.
Vzhledem k tomu, když zavoláte getString znovu, což udělám rychle sem,
pokud se jedná o druhý řádek, řetězec t, jak jsem v tomto programu,
rovná se další volání getString.
Příště zavolám GetString, jdu
jak získat jiný kus paměti.
>> GetString je povoleno požádat provozní
systém více a více paměti.
To nebude znovu stejný šest bajtů každý čas.
Je to dostane nový kus paměti, který
znamená, že t dostane jinou hodnotu než tady.
>> Takže když jsem si s se rovná = t, nejste srovnání
D proti tomu a proti toto a V proti tomu.
Ty porovnání této proti tomu, který
Upřímně řečeno je docela useful-- useless-- je k ničemu, protože kdo opravdu
zajímá, kde jsou řetězce v paměti?
>> A skutečně, nemáme.
A my nebudeme začít především péče.
Pouze do té míry, že chyby mohou nastat a bezpečnostní hrozby mohou vzniknout vůle
jsme vlastně začít se starat o to.
Takže pojďme se tento problém vyřešit.
Ukázalo se, že to opravit Super jednoduše.
>> A ať to vlastně předtím, než jsem ukazují, že opět, co by
dělat, když ve třídě CS50, a vy jste museli provést
srovnání před dvěma řetězci.
Zřejmě je to jen použít s rovná = T.
Ale logicky, jak byste porovnat tento řetězec
Proti tomuto řetězci pomocí C kód?
Jo.
>> Diváků: Prostě to udělej pro smyčce [neslyšitelné]
David J. Malan: Perfect.
Diváků: [neslyšitelné]
David J. Malan: Jo.
Stačí použít pro smyčce, nebo zatímco smyčky nebo cokoliv jiného.
Ale jen aplikovat základní myšlenku, že v případě, To je kus paměti nebo pole
a to je, iteraci obojí současně.
A právě tyto dopisy.
>> A ty musíš být trochu opatrní, protože vás
nechci jeden prst jít kolem druhé
protože jeden řetězec je delší než druhý.
Takže budete chtít zkontrolovat tento zvláštní hodnota na konci null.
Ale je to opravdu, v konec, tak jednoduché to je.
A upřímně řečeno, nepotřebujeme znovu objevovat, že kolo.
Zde je verze Two.
A to, co jsem chtěl říct, je, že místo srovnání s se rovná = T,
Já místo toho chtěl říct, je-li řetězec srovnání s čárkami t se rovná = 0.
A teď, co je řetězec porovnat?
>> Ukazuje se, že je to funkce, která Dodává se s C, jehož smysl života
je porovnat dva řetězce.
A míchejte porovnat, pokud čteme jeho manuálovou stránku nebo dokumentaci nebo CS50
reference, bude to prostě říct, že rozruch
porovnat výnosy buď negativní číslo nebo kladné číslo nebo nula,
kde nula znamená, že jsou stejné.
>> Tak jen dohad.
Co by to znamenalo, kdyby míchejte porovnání výnosů
Záporná hodnota nebo kladnou hodnotu?
Diváků: Větší než nebo menší než.
David J. Malan: Ano, větší než nebo menší než.
Takže pokud byste chtěli seřadit celek banda řetězců v dictionary--
jak bude nakonec dolů road-- perfektní funkce potenciálně využívat,
protože to bude dělat, že Porovnání řetězců pro vás, a řekni
si dělá je před b, nebo dělá b přijít dříve, než podle abecedy.
Můžeme to udělat přesně to.
>> A všimněte si jsem jeden další věc, v tomto příkladu.
Co jiného se změnilo vyšší se v této hlavní funkce?
Char *.
A to je to, že další lež.
Celou tu dobu, když jsem píše řetězec,
jsme byli tajně přepisování string jako char *, takže vlastně zvonění
chápe vás.
>> Jinými slovy, v CS50.h a jak budeme nakonec vidět,
jsme synonym nazývá řetězec to je to samé jako char *.
A teď, vím jen to, že *, V tomto kontextu, alespoň,
znamená adresu.
>> Adresa, co?
No, to, že jsem řekl, char *, a *, nebo není pravý float *,
Znamená to, že char * je adresa char.
Takže tento malý box tady, aka řetězec, je opravdu typu char *,
což je prostě ozdobný způsob, jak říkat, V tomto boxu půjde adresu.
A co to adresa viz?
Zdá se, char.
>> Ale mohli bychom zcela mají int * a dalších věcí.
Ale teď, char * je opravdu velmi jednoduché a jeden zájmu.
Takže tento problém se děje stoupat, i když, znovu.
>> Dejme tomu, že tento program je otevřený.
Uvidíme, jestli se teď můžeme předvídat co je s tímto kódem v pořádku.
Takže v tomto programu, copy-0, jsem jít dopředu a zavolat znovu
GetString a uložit hodnotu s.
>> A pak, proč to dělám, stejně jako upomínku týdnů minulosti?
Udělali jsme říci, že getString někdy vrátí null.
Co to znamená, když GetString vrátí null?
Něco se pokazilo.
To pravděpodobně znamená, že řetězec je příliš velký, počítače paměť.
Stává se, super, super, super zřídka, ale to by se mohlo stát.
Chceme kontrolovat ji, a to je vše, co děláme.
>> Vzhledem k tomu, uvidíme se, pokud nemáte spustit kontrolu obvykle k věci
jako null, můžete skutečně začít jít
na adresy v paměti, které jsou neplatné.
A vy budete začít vyvolání stále více a více segmentace chyby.
Nebo v Mac nebo PC, jen způsobí, že počítač pro zavěšení
nebo program pro zmrazení, potenciálně.
>> Takže teď, tvrdím v kopírování 0.c, že ​​jsem Chystám se kopírovat tyto řetězce prostřednictvím
linky 28.
A pak, já jdu nároku na dně
zde, že jdu změnit jeden z nich.
>> Takže nevšiml.
Volám náš starý přítel strlen.
A právě vysvětlit v angličtině co tento řádek 34 je na tom?
Co t držák 0 představují na levé straně.
Jo.
>> Diváků: První znak t?
David J. Malan: První znak t.
To je všechno.
První znak t, chci přiřadit velká písmena verze
prvního znaku v t.
Takže to je vydělávat První písmeno.
A pak, úplně poslední věc, kterou udělám V rámci tohoto programu je, že tvrdí, tady je
originál, s, a tady je kopie, t.
>> Ale na základě příběhu jsme právě Řekl o tom, co řetězce jsou opravdu,
co je linka 28 ve skutečnosti dělá, a co je
výsledná chyba bude být na obrazovce?
>> Takže nejprve, první otázka, 28.
Co je to string t = s opravdu dělají?
Pokud máme na levé straně postranní řetězec zde t = y;
že mi dává jedno políčko tady a jedna krabice zde.
A předpokládám, že tato adresa je 0x, řekněme, 50 tentokrát libovolně.
Co string t = s to pod kapotou?
>> Diváků: [neslyšitelné]
>> David J. Malan: Ukládá paměť řešit tam, takže 0x50 je tam.
Takže pokud teď půjdu do první postava ta velká písmena to,
co mám skutečně dělá s?
Jsem opravdu dělají totéž, ne?
Vzhledem k tomu, zda je adresa 0x50-- a jen jsem nemají mnoho prostoru na desce zde
ale předpokládám, že je to 0x50 tady dole, někde v paměti svého počítače.
>> A já jsem se například, Gabe zde malá písmena, jako je tento.
A já jsem řekl: t držák 0 dostane aktivováno.
No, t držák je 0. první písmeno t.
Tak málo g bude stát se velkým G. Ale problém
je to, co se to také poukazují na?
>> Diváků: stejné.
>> David J. Malan: přesně stejný věc.
Tak jednoduché vysvětlení snad i když syntaxe je trochu divný.
Tak pojďme na to.
Udělat kopii-0 a pak ./copy-0.
Řekni něco: Gabe.
A bohužel, oba jim již byly aktivovány,
ale to, že za Důvod, že jsme prostě
nyní řeší s adresami.
>> Tak jak jsme se začít address-- žádná slovní hříčka intended--
jak jsme se začali zabývat tento konkrétní problém?
No, v copy1.c, co se děje být trochu složitější.
Ale já bych tvrdit, koncepčně jednoduché řešení.
>> Tak těžké se dostat na první pohled.
Nebude snadné pro první Doba napíšete to, snad,
ale v případě, že problém je, že prostě dělá T = je jen
zkopíruje adresu, co, znovu, pokud mi můžete vyzvednout na vás,
bude řešení pro kopíruje řetězec?
>> Diváků: Budeme pravděpodobně znovu použít smyčku.
>> David J. Malan: Jo.
Takže budeme zase potřebovat smyčku.
A protože chceme-li kopírovat řetězec s do jiného řetězce,
asi chceme, aby to znak po znaku.
Ale problém je, pokud To je původně s,
Nyní musíme začít výslovně přidělování paměti pro t.
>> Jinými slovy, ať to překreslit tento jeden poslední čas.
Je-li tento řetězec s = GetString.
A pojďme dát to sem, stejně.
To je GetString.
A pak se obraz na něco jako to bude jako dřív,
g-a-b-e-/ 0.
To vypadá na něco takového.
A s proto nazýváme 0x50, a že to bude 51, 52.
>> Tak tohle je 0x50.
A pak, já řetězec t.
V paměti, že to jen tak dej mi trochu čtverec jako je tento.
Takže to, co je klíčovým krokem teď?
Pokud budu chtít kopírovat s do t to, co prázdné potřebujeme vyplnit tu?
Nebo to, co potřebujeme, abychom dělat na vysoké úrovni?
Jo?
Někdo?
Jo.
>> Diváků: Musíme [neslyšitelné].
David J. Malan: Jo, to jsme třeba vyplnit toto pole prázdné.
Nemůžu zkopírovat a pak vydělávat Gabe jméno
dokud jsem se zeptat operační systém pro další kus paměti
To je přinejmenším stejně velký jako originál.
Tak, že nás staví otázku.
>> Jak mohu požádat o operační systém není jen jednoduchý malý pointer--
jak je to se nazývá, adresa, pointer-- ne
pro jednoduché krabičce takhle nazývá řetězec?
Jak mohu požádat o provozní systém pro velký kus paměti?
Zatím jsem se jen dostal to zpátky nepřímo volá getString.
Tak jak je getString i dostat svou paměť?
>> No, ukázalo se, že je tu Tato další funkce zde
že budeme nyní začít používat.
Teď to vypadá mnohem více mystický than-- a já jsem jediný, kdo může vidět to--
tento řádek vypadá mnohem více mystický pak by měl na první pohled.
Ale pojďme škádlit ji od sebe.
>> Na levé straně, mám char * t.
Tak v angličtině, pojďme začít formulovat správné věty v technickém žargonu.
Tak tohle je přidělování proměnná typu char * s názvem t.
A teď, co to vlastně znamená?
>> No, to znamená, že to, co mám dělat aby v této proměnné s názvem t?
Adresa char.
Tak to je prostě jednodušší, více rozumný způsob,
popisovat levou stranu.
Takže vytváří toto políčko tu jen.
Takže pravá strana, Lze předpokládat, že bude
přidělit, že větší kus paměti, jak na to?
Takže pojďme škádlit to od sebe.
>> Je to ohromující na první pohled, ale to, co se děje uvnitř tady?
Za prvé, je tu malloc, které je zřejmě náš nový přítel,
"Paměť přidělit."
Tak to je argument předávaný do něj, takže je to docela velká hádka.
Takže pojďme škádlit to od sebe.
>> strlen S, samozřejmě, představuje to--
Diváků: počet znaků.
David J. Malan: Just počet znaků v s.
Takže délka s, původní řetězec.
Tak G-a-b-e.
Takže je to asi čtyři v tomto případě.
Proč to dělám jeden po volání strlen na s?
Diváků: [neslyšitelné]
David J. Malan: Za to speciální znak null.
Jestli se mě ptáte, co je délka Gabe jméno, budu říkat čtyři.
Pod kapotou, i když, musím že pátý bajt na znak NULL.
Takže to je důvod, proč dělám 1.
>> Nyní jen v případě, že používáte tento Program na jiném než v počítači, řekněme,
CS50 spotřebiče, kde je velikost znaku
se může lišit z mé vlastní computer--
Ukazuje se, že mohu nazvat operátor sizeof, zeptejte se počítač
jaká je velikost char na tomto počítači?
>> A vynásobením pět v tomto například podle velikosti char, který
Na většině počítačů bude být jen jeden, malloc
se chystá vyčlenit pro mě to velké kus paměti, tady vpravo.
A že to bude return-- je function--, takže je to
chystá se vrátit se mnou, co?
Diváků: adresa?
David J. Malan: Adresa, co?
Diváků: Z paměti je přiděleno?
David J. Malan: Z paměť je přiděleno.
Takže nemám tušení, upřímně řečeno, pokud je to skončí.
Chystám se navrhnout, aby bude to skončí na 0x88.
Zcela libovolné, ale někde jinde než 0x50,
protože v operačním systému, co Windows a Mac OS pro mě udělat, je
ujistěte se, že je dává me různé kusy RAM.
>> Tak to je hodnota, pokud to kus paměti, by mohl skončit.
Tak tohle je to, co skončí tady, 0x88.
Takže jasně, chápu, , že to není stejné jako to,
protože to ukazuje na různé kousky paměti.
Takže když jsem teď vlastně chcete zkopírovat tento v, pojďme udělat svůj návrh řešení.
>> Pojďme vytvořit pro smyčce, a to t držák i dostane y držák i.
Protože teď mohu použít Tato pole podobné notace,
protože i když malloc velmi obecně mi přiděluje paměť,
paměť je jen souvislé bajtů.
Byte, byte, byte, zády k sobě k sobě.
>> Mohu jistě jako programátor zacházet s ní jako pole, které
znamená, že můžete použít tento konečně seznámit zápis jen několik hranatých závorkách.
>> Takže mi dovolte pozastavit tam, protože to je hodně najednou, dokonce
i když základní myšlenka shrnout je to, že řetězec, celou tu dobu,
Není to nový datový typ sobě.
Je to takzvaný ukazatel, adresa charakteru,
což právě znamená, že je to číslo že lidské konvence
máme tendenci psát jako 0x něco.
>> Ale je to jen číslo, jako 33 Oxford Street,
který se stane být Adresa ČS budovy.
Jakékoliv dotazy týkající se těchto údajů?
Jo?
>> Diváků: Proč se podíváme pro t se rovná null?
>> David J. Malan: Proč zkontrolujte t rovné null?
Pokud čteme documentation-- velký question-- pro malloc,
to řekne v drobným písmem, někdy malloc může vrátit null,
stejně jako getString.
A skutečně, GetString vrátí null v případě, podle pořadí, se vrací malloc null,
protože GetString používá malloc.
>> A to by mohlo v případě, že operační systém stane, Mac OS, Windows, ať už je prostě
nedostatek paměti pro vás.
Takže to je to, co se tam stalo.
>> A dovolte mi odhalit jednu věc které by mohly jen foukat vaši mysl
nebo zcela být příliš daleko přes linku.
Ale dovolte mi vytáhnout stejné pro smyčku pro kopírování,
který před chvílí, odvolání bylo to. t držák i dostane y držák i.
>> Pěkné a uživatelsky příjemný.
Cítím se jako týden dva znovu.
Ale tato verze vlastně může být přepsat jako je tento, který vypadá záhadné.
Je to technika s názvem ukazatel aritmetika, adresová aritmetika.
Ale proč to funguje?
>> Nyní protivně, Autoři C se rozhodl použít
Symbol * pro různé účely.
Viděli jsme, že používá již jednou, char *, což znamená "dej mi proměnnou
že to bude obsahovat adresa char. "
Takže char * v této souvislosti znamená "dej mi proměnné."
>> Bohužel, pokud budete používat * Bez slovo před ním, jako char,
to je nyní nazýváno operátor dereference.
A uvidíme, víc než to trvat dlouho.
Ale to jen znamená, že "tam".
Je to jako říkat, jestli mě někdo podal na kus papíru "33 Oxford Street,"
když to udělám "* 33 Oxford Street," to znamená, že "Jít po silnici do budovy CS."
>> Takže * prostě znamená, že tam, pokud není slovo před ním.
Takže to, co je t, aby bylo jasné,?
t je adresa kus paměť, která byla dána zpět ke mně.
s je adresa toho, co, aby bylo jasné, V příkladu jsme diskutovali,
z malým Gabe?
s je adresa of--
Diváků: string.
David J. Malan: Z Gabe je původní název.
Takže je to adresa tento kus paměti.
Takže když řeknu, t + já--, oznámení, je jen náš starý přítel.
Je to jen proměnná index to je iterací od nuly nahoru
na délce řetězce s.
Takže to bude nula, pak jeden, pak dvě, pak tři, pak čtyři.
Takže pojďme sestavit tyto nové Stírací-jako puzzle kousky, chcete-li,
i když opět, syntaxe je daleko více, než tajemné Scratch.
Tak t je adresa + i se chystá dát mi
číslo, protože to jsou všechno čísla, která jsme se kreslení v hexadecimálním tvaru.
Ale jsou to jen čísla.
>> Takže v případě, že adresa t jsme si řekli, Byl 0x88, 0x88, co je plus nula.
Dokonce i když nejste pohodlné s ještě hex hádat.
>> Diváků: originální.
>> David J. Malan: Still 0x88.
Takže co to * 0x88 znamená?
To znamená, že "tam", což znamená, že efektivně, "dát prst tady."
A teď na pravé straně tento výraz, * a pak parens,
y + i znamená s, který je řešit tady malého g.
y + 0, je, samozřejmě, s, bez ohledu na to, je.
>> Takže teď je to * S, který stejně jako * 33 Oxford Street znamená jít na adresu
s.
Tak tady je to prst, pravá ruka.
Takže to, co budu kopírovat do čeho?
Ta věc na pravé straně, což je Gabe, málo g tady, na zde.
>> A tak efekt, který první iteraci smyčky,
jak je navrhováno, i když to vypadá, blázen složitější než cokoli jiného
jsme viděli předtím, je jednoduše říká, jít sem a kopírovat postavu zde.
Je to dává vám mapy na obou místech.
>> A uvidíme mnohem víc než to.
Ale teď, naděje je jen představit některé z těchto základních myšlenek.
A skutečně, pojďme se podívat na jeden Konečný program zde
a pak slíbil claymation, která bude všechno v pořádku.
V pořádku.
Takže mi dovolte otevřít up-- tam jdeme.
Tak ať já-- vrátíme na obrázku před dlouho.
Dovolte mi, abych otevřít tuto závěrečnou příklad zde.
>> Takže tady je super, super program, který dosáhne
nic v životě, který dělá následující.
Nejprve deklaruje dvě proměnné x a y, které nejsou čísla tentokrát,
sám o sobě.
Oni nejsou celá čísla, sám o sobě.
Jsou to zřejmě int *.
Takže jen tak někdo, co to znamená Pokud váš datový typ, váš variabilní,
je typu int * hvězda?
To je adresa int.
>> Tak jsem ponětí, kde je dosud.
To prostě znamená "dát, nakonec, adresa int tady. "
0x50, 0x88, tam, kde je v paměti, adresa se děje zde.
A to je to, co y je bude, jak je dobře.
>> Pokud bych teď říci, x = malloc (sizeof (int)), To je ozdobný způsob, jak říkat,
hej operační systém, pomocí malloc, Dej mi dostatek paměti pro velikost
z int, což je pravděpodobně bude 32 bitů nebo čtyři bajty.
>> Takže co malloc vrátí?
Malloc vrátí adresu.
Takže, co se děje, aby se uložené v X?
Adresa kus paměti, čtyři bajty, že malloc
právě našel pro mě otázkou: operační systém.
>> Nyní mezitím linka čtyři tady, * x = 42.
Jen aby bylo jasno, co se děje tam dole?
Na levé straně, * x.
to je jako * 33 Oxford Street.
Takže * x znamená co?
>> Diváků: Jdi na.
>> David J. Malan: Přejděte na tuto adresu.
Všude tam, kde to kus paměť je, jít na to.
A dal to, co tam samozřejmě?
Diváků: 42.
David J. Malan: 42.
Dobře, * y, stejný nápad.
Přejděte na adresu v y.
Vložte číslo 13 tam, ale to, co je y v současné době?
Diváků: není paměť pro y.
David J. Malan: V není paměť pro y.
Takže to, co y dělá pravděpodobně obsahuje, jak jsme říkali?
>> DIVÁKŮ: Garbage.
>> David J. Malan: Některé hodnoty odpadky.
Nyní, hodnota odpadky je stále číslo.
To může ještě být zaměněna za adresu.
Je to, jako by někdo načmáral něco dolů,
a vyložil jsem si to v tom smyslu, některé budovy na ulici.
A pokud jste prostě zkuste jít do některé stavební nemáte vlastní,
nebo nějaký kus paměti, že ne byla dána, špatné věci se může stát.
Počítač může selhat, nebo nějaký jiný Není určeno chování by se mohlo stát.
>> Takže intro, pak, aby Binkym je to.
Stále si pamatuji, 20 některé liché roky později,
kde jsem byl, když jsem se konečně pochopil ukazatelů.
>> Což znamená, že pokud nechat za tři minuty
a myslím, že ne pochopit ukazatelů, si uvědomují,
Vzpomněl jsem si na 20 let na nějaké šílené důvodu
kdy a proč to nakonec potopena v, sedí se svým učením
kolega, Nishat Mehta v zpět Eliota jídelně.
Teď jsem si vzpomněl, , protože to bylo
jedním z témat, I, ve zejména bojoval s.
A pak, konečně klepnutí jako Troufám si říci, hodně témat
nakonec bude.
A teď, aby to cítili všichni šťastnější a to více přesvědčivý,
pojďme se podívat do naší konečné Poslední tři minuty zde na Binkym,
od našeho přítele, Nick Parlante ze Stanfordu.
>> [PŘEHRÁVÁNÍ]
>> Hej, Binky.
Probuďte se!
Je čas na ukazatel zábavy.
>> Co je to?
Další informace o ukazateli?
Oh, dobrota!
>> No, jak začít, myslím, že jsme bude potřebovat pár rad.
>> -OK.
Tento kód přiděluje dva ukazatele, které mohou ukazovat na celá čísla.
-OK.
No, vidím dva ukazatele, ale Nezdá se, že by ukazoval na cokoliv.
>> -Přesně.
Zpočátku, ukazatele neukazují na nic.
Věci, které ukazují na, se nazývají pointees a jejich nastavení'S
samostatný krok.
>> Oh, dobře, dobře.
Věděl jsem, že.
V pointees jsou oddělené.
Ehm, tak jak si přidělit pointee?
>> -OK.
No, tento kód přiděluje nové číslo pointee,
a tato část obsahuje x poukázat na to.
>> Hej, to vypadá lépe.
Tak, aby to něco udělat.
>> -OK.
Budu dereference ukazatelem X uložit číslo 42 na jeho pointee.
Pro tento trik, budu potřebovat moje Kouzelná hůlka z dereferencing.
>> -Váš Kouzelná hůlka z Získávání?
To-- to je skvělé.
>> Tohle je to, co kód vypadá.
Já si jen nastavit číslo a [POP]
>> Hej, podívej.
Tam to jde.
>> Takže dělá Sleduje na x následuje šipky pro přístup k jeho pointee.
V tomto případě, sklad 42 tam.
Hej, zkuste ji uložíte číslo 13 přes druhou ukazatel, y.
>> -OK.
Půjdu sem y, a dostat číslo 13 nastavit.
A pak vzít hůlku Získávání a jen [BUZZ]
>> Oh!
>> Oh, hey!
To nefungovalo.
Řekni, Binky, nemyslím si, že dereferencing y je dobrý nápad, protože víte,
nastavení pointee je samostatný krok.
A nemyslím si, že jsme kdy udělali.
>> Dobrou bod.
Jo.
Vložili jsme ukazatel y, ale my Nikdy nastavit, aby ukazoval na pointee.
>> -Velmi Pozorný.
Hej, vypadáš dobře tam, Binky.
Můžete to opravit tak, že y body na stejné pointee jako X?
>> -Jistě.
Budu používat svůj kouzelná hůlka o Ukazatel přiřazení.
>> -Je To bude problém jako předtím?
Ne.
To se nedotýkejte pointees.
Je to prostě změní jeden ukazatel na poukazují na to samé, jako jiné.
>> Oh, jak vidím.
Nyní y body na stejném místě jako x.
Tak počkat.
Nyní, y je pevná.
Má pointee.
Takže si můžete vyzkoušet hůlku Získávání znovu poslat 13 přes.
>> Uh, OK.
Tady to jde. [POP]
>> Hej, podívej se na to.
Nyní dereferencing práce na y.
A proto, že ukazatele jsou sdílení že jeden pointee, oba viz 13.
Jo.
Sdílení, cokoliv.
Takže budeme vymění teď?
>> Oh, podívej.
Jsme mimo čas.
>> -Ale
>> -Jen Pamatovat tři pravidla ukazatele.
Number One, základní struktura je, že máte ukazatel,
a poukazuje na na pointee.
Ale ukazatel a pointee jsou oddělené,
a častá chyba je nastavit ukazatel,
ale zapomenout, aby to pointee.
>> Číslo dvě, ukazatel dereferencing začíná na ukazatel
a sleduje šipku nad přístup ke svému pointee.
Jak všichni víme, to funguje pouze v případě, že je
pointee, který druh dostane zpět pravidlo číslo jedna.
>> Číslo tři, ukazatel Přiřazení trvá jeden ukazatel
a mění ji, aby ukazoval na Totéž pointee jako další ukazatel.
Takže po zadání, dva ukazatele
bude ukazovat na stejný pointee.
Někdy se tomu říká sdílení.
A to je vše, co se to, opravdu.
Bye-bye teď.
[END VIDEOPŘEHRÁVÁNÍ]
David J. Malan: To je pro CS50.
Uvidíme se příští týden.