>> [Prehrávanie hudby]
David J. Malan: Dobre.
To je CS50, a to je na konci týždňa štyri.
A jedným z tém dnešnej je, že digitálne forenznú,
umenie obnovovať informácie.
A skutočne, aj keď ste v stredu
teraz mieri na troch a Breakout, budúci týždeň,
Dôraz sa bude klásť na Práve táto doména.
>> Takže jeden z najlepších miest, čo som kedy mal, bol späť v postgraduálnom štúdiu,
keď som pracoval pre miestnu Middlesex County okresný prokurátor je
kancelária, robí forenznú práce.
Takže v podstate, Massachusetts Štátnej polície, príležitostne,
Pri práci na prípadoch by priniesť veci, ako sú pevné disky
a diskety a pamäťové karty a podobne.
A oni by im ruky mne a mojim učiteľom,
a naším cieľom bolo nájsť dôkazy, v prípade, že sa niektorý, na týchto médiách.
Teraz, možno ste videli záblesky z tohto sveta forenznú
v médiách, TV a filmy.
Ale práca, ktorú som mal, a Trúfam si tvrdiť, že svet,
nie je tak celkom, ako by ste ho vidieť.
Poďme sa pozrieť na to, čo pravdepodobne ste videli.
[PREHRÁVANIE]
-OK.
Teraz poďme dobré pozrieť sa na vás.
>> [Prehrávanie hudby]
>> Vydrž to.
Spustiť to späť.
>> -Počkajte Minútu.
Choďte vpravo.
-Tu.
Freeze to.
-full Obrazovka.
>> -OK.
Freeze to.
Utiahnuť sa na to, že jo?
>> -vector V na to človek od zadného kolesa.
>> -zvětšení Tu na tomto mieste.
>> -s Pravé zariadení, Obraz je možné zväčšiť a brúsiť.
>> Čo je to?
>> -to Vylepšenia programu.
>> Vieš jasné, že sa nejaké?
>> Ja neviem.
Poďme zvýšenie.
>> -Enhance § A6.
Zvýšila som detail, a--
Ja myslím, že je dosť zlepšiť.
Uvoľnite ho na mojej obrazovke.
>> Ja lepší odraz v očiach.
Nechaj to bežať tak prostredníctvom Vylepšenie videa.
>> -Edgar, Môžete zlepšiť to?
>> -Hang Na.
>> -Bol Som pracoval na tejto úvahy.
>> -je Niečí odraz.
>> -Reflection.
-je Odraz tváre.
>> -The Reflexia!
-je Odraz.
-zvětšení Na zrkadlo.
Môžete vidieť odraz.
>> Vieš zlepšiť obraz odtiaľto?
Vieš to zlepšiť?
-Môžeme Zlepšiť to?
Vieš to zlepšiť?
Vydrž chvíľku.
Budem zvýšiť.
-zvětšení Na dvere.
-krát 10.
-zoom.
-Move V.
Viac.
Počkať, zastaviť.
Prestaň.
-Pause To.
-Rotate Nás 75 stupňov okolo vertikálnej, prosím.
>> Prestaň.
Vráťte sa do časti o dverám.
>> Rozumiem obrazový zosilňovač, ktorý môže rastrový obrázok?
>> -Možno Môžeme použiť Pradeep Singh spôsob, ako vidieť do okien.
>> -The Software je najmodernejšia.
>> -The Vlastné číslo je vypnutý.
>> -S Doprava Kombinácia algorithms--
>> -je Prijatá na osvetlenie algoritmy na ďalšiu úroveň,
a môžem ich použiť na zvýšiť túto fotografiu.
>> -Lock Ďalej a rozšíriť osi z.
>> -Enhance.
Vylepšiť.
-Enhance.
-Freeze A vylepšiť.
[END Videoprehrávanie]
David J. Malan: Tak to sú všetky slová, ale neboli
používa vo vetách správne.
A skutočne v budúcnosti, kedykoľvek, prosím, počujete niekoho hovoriť slovo,
"Posilniť," zasmial len trochu.
Vzhľadom k tomu, keď sa pokúsite zvýšiť, Napríklad, to je to, čo sa stane.
>> Tak tu je nádherná fotka.
To je CS50 vlastné Daven.
A predpokladám, že by sme chceli zamerať na iskrou v oku,
alebo odraz zlý chlap, ktorý bol jasne
zachytený bezpečnostnou kamerou.
To je to, čo sa stane, keď môžete priblížiť na obrazu, ktorý
má iba konečný počet bitov, s ním spojené.
>> To je to, čo by ste si.
A skutočne, v Daven oka je ale štyri, možno šesť bodov
že skladať presne to, čo tam mihajú.
Takže problém Set Four bude mať v konečnom dôsledku preskúmať tento svet, a to najmä
podľa povahy niečo nazývame súbor I / O, kde
I / O je len ozdobný spôsob, ako hovorí, vstup a výstup.
>> Takže doteraz, všetky interakcie sme mali s počítačom
boli do značnej miery s vaším klávesnica a displej,
ale nie toľko, s pevným diskom, alebo ukladanie súborov mimo tie, ktoré
sami napísať.
Vaše programy tak ďaleko majú nie je vytváranie a ukladanie,
a aktualizovať svoje vlastné súbory.
>> No, čo je to súbor?
No, niečo ako JPEG.
To je obrázok, ktorý by mohol majú alebo nahrať na Facebook,
alebo vidieť nikde na webe.
V skutočnosti, že fotografie sme práve píla Daven bol JPEG.
A čo je zaujímavé, o súborov, ako je JPEG
je, že môžu byť identifikované, typicky, určitými vzormi bitov.
>> Inými slovami, to, čo je možné, že rozlišuje JPEG z GIF
od PING z Wordu Dokument zo súboru programu Excel?
No, je to proste iný vzory bitov.
A tie rôzne vzory zvyčajne na začiatku týchto súborov.
>> Takže keď váš počítač otvorí Word doc, alebo ak počítač otvorí JPEG,
to vyzerá typicky Prvých niekoľko bitov v súbore.
A ak to uzná vzor, hovorí, oh, to je obraz.
Dovoľte mi, aby som ju pre užívateľ ako grafiku.
Alebo, oh, toto vyzerá ako Word doc.
Dovoľte mi ukázať užívateľovi ako esej.
>> Tak napríklad, JPEG, Ukazuje sa, že sú
pomerne sofistikované pod kapotou.
Ale prvé tri bajty najviac každý Kto JPEG s týmito tromi číslami.
Tak bajt nula, jedna, a dve, v Najviac každý JPEG, 255, potom číslo
216, potom číslo 255.
>> A to, čo budete môcť začať robiť budúci týždeň
je vlastne strkať pod kapucňa súborov ako JPEG
a ako bitmapové súbory, a videl Čo je tam vždy tak dlho,
ako ste boli pomocou počítača.
>> Ale to, čo tam nie je zvyčajne písaný ako desatinné čísla, ako je tento.
Počítačoví experti nie majú tendenciu hovoriť v desiatkovej sústave.
Oni naozaj hovoria v binárnom formáte.
Typicky, keď chceme vyjadriť čísla,
sme vlastne používať hexadecimálne, ktoré môžu vyvolať
z, povedzme, Problem Set Jeden, ktorý napádal
môžete premýšľať o inom systéme.
>> My, samozrejme, sú oboznámení s desatinné číslo, nula až deväť.
Hovorili sme o binárne.
A my naozaj nemáme používať, že veľa tu
von, pretože počítače sa použiť.
Ale programátori budú veľmi často, ale nie vždy,
používať hexadecimálne, čo jednoducho znamená, budete mať 16 znakov do abecedy,
na rozdiel od dvoch alebo 10.
>> Tak ako sa vám počítať do vyššej ako deväť v hexadecimálnej sústave?
Ty ísť 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, len konvencií.
Ale čo je kľúčové je, že každý z nich je jeden symbol.
Neexistuje žiadna 10.
Neexistuje žiadna 11, sama o sebe, pretože každý vaše číslic, rovnako ako v desiatkovej sústave
a rovnako ako v binárnej, by len byť jediný znak, konvencií.
>> Tak to je teda abeceda máme ktoré máme k dispozícii na šestnástkové.
Takže čo JPEG vyzerať, ak vás mal vypísať tie prvé tri
bajty nie ako desatinné ale napríklad ako hexadecimálne?
A prečo je hex aj všetko to užitočné?
>> No, rýchly pohľad na príklad.
Takže keď som sa vypísať bity, ktoré predstavujú tieto desatinné numbers--
to by mohlo byť trochu hrdzavý teraz od niekoľkých týždňov späť
ale ľavý a pravá sú celkom jednoduché.
255 bol najväčší počet sme môže predstavovať s ôsmich bitov.
Bolo to všetky tie.
Takže jediný, ktorý je mierne Zaujímavé je prostredný.
A ak ste trochu mimo to matematika, budete vyvodiť, že skutočne
že vzorka z jedného a nuly predstavuje 216.
Takže povedzme, stanovuje pre teraz, že to je správne.
Ale prečo je to zaujímavé?
>> No, byte, samozrejme, je osem bitov.
A ukázalo sa, že ak si myslíte, z bytu ako dva kusy štyroch bitov,
takto.
Dovoľte mi pridať trochu priestoru.
Tak pred, po.
Práve som pridal nejaké biele miesto Z dôvodu tu vizualizáciu je.
Ako môžeme teraz predstavujú v, povedzme, hexadecimálne každý quad bitov,
každá sada štyroch bitov?
>> Tak napríklad, v ľavej Teraz máme 1111 v binárnej.
Čo je to číslo v desiatkovej sústave, ak si z matematiky?
Máte ones miesto, dvojky miesto, miesto štvorky a osmičky miesto.
>> Divákov: 15.
David J. Malan: Je to 15.
Takže ak budeme robiť osem plus štyri plus dva plus jedna, dostaneme 15.
Takže som sa mohol zapísať 15 pod 1111, ale celý vtip tu
je hexadecimálny, nie desiatkovej.
Takže namiesto písania o 15, 1-5, Chystám sa napísať, že v hexadecimálnom tvare,
ktorá, ak si myslíte, že späť, ak máte nula až f, čo sa 15 bude?
DIVÁKOV: f.
David J. Malan: Tak to dopadá, že je to f.
A môžete na to prišiel tým, že hovorí, No, či je 10, potom OK, f je 15.
Takže v skutočnosti, môžeme prepísať tento rovnaký súbor čísel je f.
A potom keď to urobíme trochu matematiky, budeme odvodiť, že to je d.
Osem je celkom jednoduché, pretože sme mať jeden v mieste osmičky.
A potom máme ešte pár f f je.
>> Takže to, čo ľudia majú tendenciu robiť podľa konvencie pri použití v šestnástkovej sústave je jednoducho
napísať to trochu stručnejšie, zbaviť väčšiny z toho prázdneho miesta.
A len byť super jasné čitateľovi, že je v šestnástkovej sústave,
jednoduché konvencie medzi ľudia sa píšete nula
x, ktorý nemá žiadny iný význam ako vizuálny identifikátor,
tu je hexadecimálne číslo.
>> A potom si dal dve číslice, f f v tomto prípade, potom d, potom f f.
Tak dlhý príbeh krátky, hexadecimálne len inklinuje
, Že sú užitočné, pretože každý z jeho číslice, nula až f dokonale linky
až sa vzorom štyroch bitov.
>> Takže ak máte dve hexadecimálne číslice, nula až F, znova a znova,
ktoré vám umožnia dokonale Osem bitov alebo jeden bajt.
Takže to je dôvod, prečo má tendenciu byť konvenčne užitočná.
Nie je k duševnému Obsah naozaj za to,
iný ako jeho skutočné užitočnosti.
>> Teraz JPEG nie sú jedinou formáty súborov pre grafiku.
Môžete si pripomenúť, že existujú súbory, ako je to vo svete,
aspoň z pár rokov späť.
>> Takže to bolo vlastne nainštalovaný v systéme Windows XP
na miliónoch počítačov po celom svete.
A to bol súbor bitmapy BMP.
A rastrový súbor, ako uvidíte ďalšie týždeň, len sa rozumie vzorka bodiek,
pixelov, ako sa im hovorí, Mapa na kúsky, naozaj.
>> Takže to, čo je zaujímavé, aj keď, o tomto formáte, BMP, je
že pod kapotou, to má viac ako len tri byty
ktoré tvoria jeho hlavičky, takže hovoriť, prvých pár súst.
V skutočnosti to vyzerá trochu zložité na prvý pohľad.
A uvidíte to v sade P.
A ako sa niečo najmä z toho teraz
nie je tak dôležité, ako len to, že na začiatku každej bitmapy
súbor, grafický formát, je tu celá banda čísel.
>> Teraz Microsoft, Autorom tohto formátu,
tendenciu volať tým, Veci, ktoré ints a znaky
, Pláva na hladine, ale slová a d slová a túži a byty.
Takže sú to len rôzne dátové typy.
Sú rôzne názvy pre rovnakú vec.
Ale uvidíte, že v P stanovila štyri.
>> To je ale iba povedať, že ak je človek poklepe nejaký súbor BMP na jeho
alebo jej pevný disk, a otvorí sa okno sa ukazuje mu, že obraz,
čo sa stalo, pretože operačný Systém pravdepodobne všimli nielen
rozšírenie .BMP v názve súboru,
ale aj skutočnosť, že tam je nejaký konvencie vzoru bitov
na samom začiatku tohto bitmapového súboru.
>> Ale poďme sa zamerať na také zložité súboru,
ale na niečo také.
Predpokladám, že tu v gedit, I proste začiatky
programu, ktorý je veľmi jednoduchý.
Mám nejaké zahŕňa až hore.
Teraz mám # include "structs.h", ale Vrátim sa k tomu za chvíľu.
Ale to je užitočné pre teraz.
Tak toto je program že sa to realizovať
ako databáza registrátora.
Takže databázy študentov, a každý študent vo svete
má svoje meno a dom a pravdepodobne niektoré ďalšie veci, ale budeme držať to jednoduchý.
Každý študent má svoje meno a domu.
>> Takže keď som chcel napísať program, ktorého zmyslom života
práve iterovat od nulu až na tri,
v prípade, že je tri študentmi na Harvardovej univerzite.
A chcem, aby si pomocou getString, meno a house každého študenta,
a potom už len vytlačiť tie von.
>> To je niečo ako týždňa Jeden, týždeň Dve veci teraz,
kde chcem len pre slučka alebo niečo také.
A chcem volať getString niekoľko krát, a potom vytlačte f niekoľkokrát.
Tak ako by som mohol urobiť, aj keď, keď obaja meno a dom
sú zapojené pre každého študenta?
>> Takže môj prvý inštinkt by mohli byť niečo také.
Mohol by som najprv povedať, dobre, daj mi, povedať, pole reťazcov s názvom mena.
A nechcem tu napevno tri.
Čo chcem, aby tam dal?
Takže študenti, pretože to je práve konštanta deklarovaná v hornej časti,
len tak nemám natvrdo tri na viacerých miestach.
Týmto spôsobom, môže sa mi to zmeniť na jednom mieste, a to má vplyv na zmenu všade.
A potom, ja by som mohol robiť string domy študentov.
>> A teraz, mohol by som niečo také for (int i = 0; i <študentov; i ++.
Takže som písať rýchlo, ale je to teraz pravdepodobne oboznámení syntaxe.
>> A teraz je to novší.
Ak chcem, aby sa v i-tom Meno študenta, myslím, že som to urobiť.
A potom, nie ako mená ale domy bracketing aj.
Ja to urobiť, getString, a nechať me sa vrátiť a opraviť túto linku.
Súhlasíte s tým?
Nesúhlasíte?
Nie je to ako veľmi užívateľsky príjemný.
Nepovedal som na užívateľovi, čo má robiť.
>> Ale teraz, keď som tiež chcel neskôr, poďme
povedzme, vytlačte si tieto veci out-- tak TODO neskôr.
Budem robiť viac s tohle-- to pravdepodobne znamená
správne vykonávanie získanie mena a rodinných domov, tri
z nich celkom každý, od užívateľa.
>> Ale to nie je moc dobrý dizajn, nie?
Čo keď študent nemá len meno a dom, ale aj identifikačné číslo,
a telefónne číslo, a e-mailová adresa,
a možno aj domovské stránky, a Možno Twitter rukoväť,
a akýkoľvek počet ďalších detailov spojené s študenta alebo osoby,
všeobecnejšie.
Ako by sa začneme pridávať Funkcie tohto programu?
>> No, mám pocit, že tým najjednoduchším spôsobom by mohol bolo to niečo ako, povedzme,
int IDS študentov.
Tak som si dal všetky svoje ID tam.
A potom, o niečo ako sú telefónne čísla,
Nie som si istý, ako sa Prehlasujem, že ešte nie.
Tak poďme do toho a len volania tento twitters študenti, ktoré
Je trochu zvláštne, ale-- a veľa ďalšie pole.
>> Som začal efektívne skopírovať a vložiť sem.
A to bude rast veľa nemotorné celkom rýchlo, nie?
Nebolo by pekné, keby tam boli vo svete známa štruktúra dát
nie ako int alebo reťazec, ale niečo vyššiu úroveň, abstrakcie, takže
hovoriť, známy ako študent?
C neprišiel s vstavaným Funkcie pre študentov,
ale čo keď som chcel dať to ako?
>> No, ukázalo sa, budem otvoriť súbor s názvom structs.h tu
a môžete to urobiť presne to.
A budeme začať robiť teraz.
A pod kapotou P nastaviť tri, už ste to robím teraz.
Nie je tam žiadna taká vec ako g obdĺžnika alebo g ovál v programovacom jazyku C.
>> Ľudí v Stanford realizovaný tie dátové typy pomocou tohto prístupu tu,
deklarovať svoje vlastné nové údaje typy s použitím novej kľúčové slovo
nazýva struct a ďalšie jeden s názvom typedef.
A skutočne, aj keď syntaxe vyzerá trochu líši od vecí
sme videli skôr, princíp, že je to super jednoduché.
>> To jednoducho znamená, že "definovať typ."
Že to bude Štruktúra, a štruktúra
je rovnako ako nádoby pre viac vecí.
A táto štruktúra bude mať reťazec s názvom názov,
a reťazec s názvom dom.
A povedzme, len pre pohodlie, Celá táto štruktúra dát študentom.
>> Takže v okamihu, keď sa dostanete do bodkočiarka, máte teraz
vytvorili vlastné údaje Typ názvom Študent
, Ktorá teraz stojí vedľa int, a float a char, a reťazec,
a g rect, a g oválne, a ľubovoľný počet iných vecí, ktoré ľudia vymysleli.
>> Takže to, čo je užitočné, o tom Teraz je, že keď sa vrátim
na struct 0 a dokončiť implementácia, ktorý som napísal
vopred tu, všimnite si, že všetky nevyhnutného neporiadok, ktorý
bol asi na začiatku deja, ako som pridal telefónne čísla a twitters a všetky
tieto iné veci Definície študenta,
teraz je to stručne zhrnula ako jediného poľa študentov.
>> A každý z týchto študentov sa má viac čo do nej.
Takže zostáva len jednu otázku.
Ako sa dostanete na meno, a dom a ID,
a čokoľvek ďalšieho, čo je vnútri študenta?
Super jednoduché, rovnako.
Nová syntax, ale jednoduchá myšlienka.
>> Jednoducho index do poľa, ako sme to urobili minulý týždeň, a to.
A čo je jasne nový kus syntaxe?
Len., Čo znamená "ísť dovnútra Štruktúra a získať pole s názvom
meno, sa na pole s názvom dom, dostať na pole s názvom študentom. "
>> Takže P nastaviť tri, ak ste stále pracuje na tom,
a väčšina ľudí stále je, si uvedomiť, že ako vy
začať používať veci, ako je g rects a g ovály
a ďalšie veci, ktoré sa nezdajú pochádzajú z týždňa nula, jedna, alebo dve,
Uvedomujem si, že to je preto, že Stanford vyhlásil niektoré nové dátové typy.
>> A vskutku, to je presne to, čo budeme áno, aj v P stanovila štyri, keď
začneme sa zaoberať vecami ako obrázky, rastrové obrázky a ďalšie.
Tak to je len ukážka a mentálny model pre to, čo má prísť.
Teraz som otáľal trochu dnes ráno.
Bol som celkom zvedavý na to, čo Microsoft tapeta v skutočnosti
vyzerá dnes.
A ukázalo sa, niekto v roku 2006 vlastne išiel takmer presne
na rovnakom mieste na fotografiu v skutočnosti čo vyzerá ako, že v týchto dňoch.
Pole je teraz trochu zarastené.
>> Takže hovoriť teraz obrazov, vráťme späť Daven tu
na obrazovke a Mikuláša, a len vám pripomenúť,
, Že ak by ste sa k nám pripojiť na obed tento piatok, vedúce k našej obvyklej adrese
tu.
>> Tak kde sme to vypnúť v pondelok?
Tento problém sme zaviedli, že jo?
Toto bolo zdanlivo správne realizácia odkladací priestor,
kedy beriete dve ints, jeden volal, kto volal b,
vymeniť je, rovnako ako tu urobila Laura na javisku s mliekom a vodou,
pomocou dočasné premenná, alebo prázdny šálka,
tak, že by sme mohli dať b do a A v b bez neporiadok vecí.
Použili sme premennú.
Hovorí sa tomu tepl.
>> Ale čo bolo zásadné Problém s týmto kódom v pondelok?
Čo to bolo za problém?
Jo.
>> Divákov: Zaberá viac miesta.
>> David J. Malan: Zaberá viac priestor, pretože som pomocou premennej,
a to je v poriadku.
To je pravda, ale ja som bude hovoriť, že je to OK.
Je to len 32 bitov vo veľkom schéma vecí, takže nie je veľký problém.
Iné myšlienky?
Divákov: To len swapy premenné lokálne.
David J. Malan: Presne tak.
Je swapy iba premenné lokálne.
Pretože zakaždým, keď volanie function-- keď som mal zásobníky z Annenberg
naposledy, máte hlavné na dne.
Akonáhle zavoláte funkciu nazvanú swap swap nevedie žiadne sa X a Y
pôvodnej hodnoty.
Čo odkladacia get, sme sa tvrdí?
Divákov: Kópia.
David J. Malan: Takže ich kópie.
Takže to bude jedna a dve, ak máte pripomenúť si príklad z poslednej doby,
ale kópia jedného a dvoch ktoré sú úspešne prehodené.
Ale bohužiaľ na konci, tieto hodnoty sú stále rovnaké.
Takže môžeme vidieť s našimi nový priateľ, dúfajme GDB,
že vy alebo TFS a Ca majú sa vám vedie k takto.
>> Takže žiadna výmena odvolanie vyzerá ako-- poďme otvoriť tohle-- vyzerá takto.
Inicializovaný sme x na jednej, y na dva.
Mal veľa tlače f je.
Ale potom, tlačidlá Volať tu bol vymeniť, čo
je presne ten kód sme práve videli pred chvíľou.
Čo je správne v prvej pohľad, ale funkčne,
tento program nefunguje, pretože nie je trvalo zameniť x a y.
>> Takže poďme vidieť, rýchleho ohrevu sem s GDB, a ./noswap.
Banda ohromujúci informácie, ktoré Budem sa zbaviť s riadiacou L teraz.
A teraz, budem pokračovať a spustite ho.
A bohužiaľ, že Nebolo to tak užitočné.
To bežalo program vnútri tejto program s názvom gdb debugger,
ale to mi nedovolí hrabať okolo seba.
>> Tak ako môžem skutočne pozastaviť prevedenie vnútri tohto programu?
Tak zlomiť.
A ja som mohol rozbiť na akýkoľvek číslo riadku, jeden, 10, 15.
Ale ja si tiež rozdeliť symbolicky tým prerušenie main.
A že sa to nastaviť pauzu bod, zrejme na riadku 16 v hlavnej.
A kde je linka 16?
Poďme do kódu a ísť až na noswap.
A skutočne, riadok 16 je prvý v programe.
>> Takže teraz, keď som sa do toho pustite a typ spustiť tento čas, Enter, je pozastavené.
Takže poďme hrabať okolo seba.
Vytlačiť x-- prečo je x nula?
A ignorovať znak dolára.
To je len pre milovník využitia programu.
Prečo je x nula v súčasnej dobe?
Jo.
>> Divákov: Zastavil sa tesne pred linka 16, nie vlastne on-line 16 ..
David J. Malan: Presne tak.
GDB, v predvolenom nastavení sa odmlčal prevedenie tesne pred potrubím 16.
Takže to nebol vykonaný, ktoré znamená, x je nejaké neznáme hodnoty.
A mali sme šťastie, že je niečo čisté ako nula.
Takže teraz, keď som písať ďalšie, teraz je prevedený 16.
Čaká na mňa vykonať 17.
Nechaj ma ísť napred a tlač x.
Je to jedna.
Nechaj ma ísť napred a tlač y.
Čo by som mal teraz vidieť?
>> Divákov: [nepočuteľné]
>> David J. Malan: trochu hlasnejšie.
>> Divákov: [nepočuteľné]
David J. Malan: Nie tak celkom zhoda.
Takže áno, vidíme nejaké odpadky hodnotu.
Teraz, y je 134514064 tu.
No, je to len nejaký odpad hodnota.
Môj program používa RAM pre rôzne účely.
Je tu ďalšie funkcie.
Ostatní ľudia písali v mojom počítači.
Takže tieto bity sú použité pre iné hodnoty, a to, čo som videl
Je zvyšky niektorých Pred použití tejto pamäti.
>> Takže žiadny veľký problém, pretože akonáhle ako píšem ďalšie a potom vytlačiť y,
to je inicializovaný hodnota, ktorú chcem.
Takže teraz, poďme do toho trochu rýchlejšie.
N pre ďalšie.
Urobme to znova.
Ale ja nechcem hit je to tu, pretože keď som
chcete vidieť, čo sa deje vo vnútri swap, čo je príkaz?
>> DIVÁKOV: kroky.
>> David J. Malan: kroky.
Tak toto ma vstúpi do funkcie, skôr než nad ním.
A teraz je to trochu záhadný úprimne, ale to je len
hovoril mi, že som v rade 33 teraz.
A ideme na to znova.
Print temp.
Garbage hodnota, negatívne tentoraz ale to je len stále hodnota odpadky.
Tak poďme ďalej, tlače tepl.
Je inicializovaný na hodnotu 1, čo bola hodnota x, aka.
>> A teraz, kde sú naše a X prichádza?
Dobre si všimnite, v hlavnej, my volal Tieto hodnoty x a y.
Potom sme okolo nich vymeniť takto.
X prišiel prvý, čiarka y.
A potom, swap by im zavolať x a y.
Ale pre prehľadnosť je to volať je a, b.
Ale a a b sú teraz bude kópie x a y, resp.
>> Takže keď som sa vrátiť do GDB, temp je teraz jednou a je teraz jedným.
Ale keď to urobím ďalší a teraz si tlač , Už prešiel.
Mlieko sa naleje do bývalej Pomarančová šťava je sklo, alebo naopak.
>> A keď to urobím ďalší zase, a teraz keď som vytlačiť ako kontrola sanity,
je ešte dvaja, ale b je teraz jedna.
Úprimne povedané, je to tam stále.
Nezaujíma ma, čo je teplota.
Ale akonáhle som sa písať, povedzme, pokračovať sa vrátiť, teraz som na konci
Program.
A bohužiaľ, x je ešte raz a y je ešte dva.
>> Takže to, čo bolo užitočnosť GDB tam?
Nebolo mi pomohol opraviť problém sám o sebe,
ale to mi snáď pomôže pochopiť realizáciou
že áno, moja logika je v poriadku, ale môj kód nie je konečnom štádiu
trvalý vplyv.
Tak to je problém, že sme bude teraz riešiť dnes.
>> Ale poďme sa tam dostať pomocou tohto.
String je lož.
To tiež nie je dátový typ ktorá existuje v C. Je to
Bol synonymom pre niektoré čas na niečo iné,
a môžeme prezradiť, že takto.
>> Nechaj ma ísť napred a otvoriť program s názvom compare-0.
A skôr než písať tento von, začneme prejsť kódu
Už som písal, ale Je to len pár riadkov.
To je tak porovnať-0.
A prvá vec, ktorú robím je stále riadok textu.
>> Ale všimnite, čo som robí prvýkrát.
Aký je rozdiel jasne o riadku 21?
Vlastne počkaj.
Toto je kópia dvoch.
To nie je ani ten správny program.
Tak jo, spojler.
Dobre, takže to nevadí.
To je odpoveď na otázku budúcnosti.
>> Tu je porovnanie-0, a ja som asi dostať riadok textu.
Program je oveľa jednoduchšie.
Tak to je jednoduché.
To je ako prvý týždeň, týždeň Dve veci v súčasnej dobe. reťazci s = GetString.
Teraz som to znova tu.
string t = GetString.
A potom posledná vec, ktorú v tomto programu, ako už názov napovedá,
sa budem snažiť, aby ich porovnanie.
>> Takže ak s prvou reťazec, rovná sa = T, potom som
chcel povedať, zadajte to isté.
Inak, ja som chcel povedať píšete niečo iné.
Takže poďme zostaviť a spustiť tento program.
Takže si porovnať nulu.
Vyzerá to dobre.
Žiadne chyby kompilácie.
>> Nechaj ma ísť napred teraz a zadajte ./compare-0.
Nechaj ma ísť napred a niečo povedať : Daven a niečo: Rob.
A píšem rôzne veci.
Tak ďaleko, tak dobrý.
Program sa zdá byť v poriadku.
>> Ale poďme ho spustiť znova.
Povedz niečo: Gabe.
V poriadku.
Možno, že som narazila medzerník alebo niečo funky.
Urobme to znova.
Tak Zamyla.
Zamyla.
Rôzne veci.
Takže to, čo sa deje?
>> Takže máme tieto dva riadky kód, GetString volaná dvakrát.
A potom, ja som proste snaží sa porovnať s a t.
Ale to, čo naozaj potom sa to deje?
No, môj rukopis je asi mäsiar tento príklad trochu.
A poďme skutočne hodiť to sa sem, rovnako.
>> Takže máme takýto riadok reťazci s = GetString.
Tak to je jednoducho prvý zaujímavé línie z tohto programu.
Ale to, čo celú tú dobu bol deje pod kapotou?
No, na ľavej strane je reťazec, čo je nejaký typ premennej,
a nazýva sa s.
Takže viem, že je to s použitím pamäte alebo RAM v počítači nejako.
Takže budem abstraktne kresliť, že ako štvorec.
32 bitov, to dopadá, ale o tom viac v budúcnosti.
A potom, čo sa deje tu?
>> No, samozrejme getString dostane reťazec od užívateľa.
A GetString dostal Zamyla alebo Gabe alebo Daven.
Takže poďme si vybrať ako prvý z tých, ktorá bola Daven.
Tak efektívne, čo GetString dostal mi v tomto prvom prípade bol D - v-e-n.
A potom, čo ešte robil dať mi tajne?
Divákov: [nepočuteľné]
David J. Malan: Áno, / 0 alebo null znak.
Tak to ma skutočne dal reťazec.
Ale my už vieme z predchádzajúcej Vyzerá, že reťazec je len pole
znakov, a je ukončená Táto špeciálna Sentinel znak, / 0.
>> Ale ak je to pravda a to je štvorec,
to je samozrejme oveľa väčší obdĺžnik.
A skutočne, to je, Tvrdím, iba 32 bitov.
A to je samozrejme viac ako 32 bitov, pretože to je pravdepodobne
osem plus osem plus osem navyše osem plus osem,
len preto, že z bytov v ASCII.
Ako sakra budeme, aby sa zmestili Daven do tejto malej krabičke tu?
>> No, čo sa getString vlastne robí?
No, to mriežka tu predstavuje pamäte alebo RAM môjho počítača.
Takže poďme ľubovoľne povedať, že ak každý z nich predstavuje byte,
potom môžeme myslieť na seba bajt ako majúce adresu,
ako 33 Oxford Street alebo 34 Oxford Street alebo 35 Oxford Street.
>> Tak ako domy majú adresy a budovy majú adresy,
tak sa jednotlivé bajty Pamäť majú adresy alebo čísla
, Ktorá jednoznačne identifikovať.
Toto je ľubovoľná.
Ale aby to jednoduché, budem používať hexadecimálne len konvencií,
ale 0x znamená nič iné, ako "toto je hexadecimálne."
a budem tvrdiť, že "D" končia Byte One v pamäti.
>> Dostal som nič iné sa deje v pamäť, takže Daven dostal prvé miesto
v byte One.
To potom bude 0x2.
To sa deje na 0x3.
To bude 0x4.
To sa deje na 0x5.
To bude 0x6.
>> Ale akonáhle začnete premýšľať o tom, čo robí počítače
pod kapotou, môžete začať vyvodzovať
ako vám, pred niekoľkými rokmi, by zaviedli C sám.
Čo je GetString pravdepodobne returning-- preto, že
pocit, že to nie je návrate Daven, sama o sebe,
, Pretože to určite nebude aby sa zmestili do tejto malej box--
takže to, čo je GetString pravdepodobne vracia?
>> Divákov: [nepočuteľné]
>> David J. Malan: Umiestnenie Daven.
A to robil to od chvíle, keď prvý týždeň.
Čo GetString je naozaj návratu nie je reťazec, sama o sebe.
To je jedna z tých malých bielych lží.
Je to vracia adresu reťazec v pamäti, jedinečná adresa.
Daven žije na 33 Oxford Street.
Ale stručnejšie, Gavin žije na 0x1, Adresa číslo jedna.
>> Takže to, čo dostane dať v tomto krabička potom, aby bolo jasné,
je len adresa tohto reťazca.
Takže celú tú dobu, to sa deje.
Ale čo to naznačuje Teraz je, že ak všetko to má
je číslo vnútri nej, ktorý je ťa zastaviť, programátor,
od uvedenia akékoľvek číslo v všetky premenné a len na lyžiach
k tomuto kusu pamäti?
A skutočne, uvidíme že je to hrozba nabudúce.
>> Ale teraz je to všetko nestačí.
Keď poviem, aby som reťazec, môžete mi dať Daven.
Ale nemáte naozaj, dajte mi Daven.
Jediné, čo mi dal, je Daven je adresa.
Ako mám potom vedieť, či kde Daven začína a ends--
príbeh je stále weird-- kde Daven začína a končí,
a potom, ďalšie reťazec v pamäti začína?
>> No, ak ste podal mi začiatok Daven,
v podstate, ako to viem, kde je koniec jeho meno je?
Že osobitný znak null, čo je to viac teraz dôležité
ak reťazca pod kapucňa sú identifikované
jednoznačne o ich umiestnení v pamäti.
Takže celú tú dobu, že je to čo sa deje.
>> Takže keď sa pozrieme hneď na Tu je kód, vysvetliť
ak by chyba v riadku 26.
Prečo je Zamyla a Zamyla líšia?
Prečo je Gabe Gabe a iní?
Jo, v chrbte.
>> Divákov: Majú rôzne adresy.
>> David J. Malan: Jednoducho preto, že majú rôzne adresy.
Vzhľadom k tomu, keď zavoláte getString znova, čo urobím rýchlo sem,
ak ide o druhý riadok, reťazec t, ako som v tomto programe,
rovná sa ďalšie volanie getString.
Nabudúce zavolám GetString, idem
ako získať iný kus pamäte.
>> GetString je povolené požiadať prevádzkové
systém viac a viac pamäte.
To nebude znova rovnaký šesť bajtov každý čas.
Je to dostane nový kus pamäti, ktorý
znamená, že t dostane inú hodnotu ako tu.
>> Takže keď som si s sa rovná = t, nie ste porovnanie
D proti tomu a proti toto a V proti tomu.
Ty nákupný tejto proti tomu, ktorý
Úprimne povedané je celkom useful-- useless-- je k ničomu, pretože kto naozaj
zaujíma, kde sú reťazce v pamäti?
>> A skutočne, nemáme.
A my nebudeme začať predovšetkým starostlivosť.
Len do tej miery, že chyby môžu nastať a bezpečnostné hrozby môžu vzniknúť vôľa
sme vlastne začať sa starať o to.
Takže poďme sa tento problém vyriešiť.
Ukázalo sa, že to opraviť Super jednoducho.
>> A nech to vlastne predtým, než som ukazujú, že opäť, čo by
robiť, keď v triede CS50, a vy ste museli vykonať
porovnanie pred dvoma reťazcami.
Zrejme je to len použiť s rovná = T.
Ale logicky, ako by ste porovnať tento reťazec
Proti tomuto reťazcu pomocou C kód?
Jo.
>> Divákov: Jednoducho to urob pre sláčiky [nepočuteľné]
David J. Malan: Perfect.
Divákov: [nepočuteľné]
David J. Malan: Jo.
Stačí použiť pre sláčiky, alebo zatiaľ čo slučky alebo čokoľvek iného.
Ale len aplikovať základnú myšlienku, že v prípade, To je kus pamäte alebo poľa
a to je, iterácii oboje súčasne.
A práve tieto listy.
>> A ty musíš byť trochu opatrní, pretože vás
nechcem jeden prst ísť okolo druhej
pretože jeden reťazec je dlhší ako druhý.
Takže budete chcieť skontrolovať tento osobitný hodnota na konci null.
Ale je to naozaj, v koniec, tak jednoduché to je.
A úprimne povedané, nepotrebujeme znovu objavovať, že koleso.
Tu je verzia Two.
A to, čo som chcel povedať, je, že miesto porovnaní s sa rovná = T,
Ja namiesto toho chcel povedať, ak je reťazec porovnaní s čiarkami t sa rovná = 0.
A teraz, čo je reťazec porovnať?
>> Ukazuje sa, že je to funkcia, ktorá Dodáva sa s C, ktorého zmysel života
je porovnať dva reťazce.
A miešajte porovnať, ak čítame jeho manuálovú stránku alebo dokumentáciu alebo CS50
referencie, bude to jednoducho povedať, že rozruch
porovnať výnosy buď negatívne číslo alebo kladné číslo alebo nula,
kde nula znamená, že sú rovnaké.
>> Tak len dohad.
Čo by to znamenalo, keby miešajte porovnanie výnosov
Záporná hodnota alebo kladnú hodnotu?
Divákov: Väčší ako alebo menšie ako.
David J. Malan: Áno, väčší alebo menší ako.
Takže ak by ste chceli zoradiť celok banda reťazcov v dictionary--
ako bude nakoniec dole road-- perfektné funkcie potenciálne využívať,
pretože to bude robiť, že Porovnanie reťazcov pre vás, a povedz
si robí je pred b, alebo robí b prísť skôr, než podľa abecedy.
Môžeme to urobiť presne to.
>> A všimnite si som jeden ďalší vec, v tomto príklade.
Čo iného sa zmenilo vyššia sa v tejto hlavnej funkcie?
Char *.
A to je to, že ďalšia lož.
Celú tú dobu, keď som píše reťazec,
sme boli tajne prepisovanie string ako char *, takže vlastne zvonenie
chápe vás.
>> Inými slovami, v CS50.h a ako budeme nakoniec vidieť,
sme synoným nazýva reťazec to je to isté ako char *.
A teraz, viem len to, že *, V tomto kontexte, aspoň,
znamená adresu.
>> Adresa, čo?
No, to, že som povedal, char *, a *, alebo nie je pravý float *,
Znamená to, že char * je adresa char.
Takže tento malý box tu, aka reťazec, je naozaj typu char *,
čo je jednoducho ozdobný spôsob, ako hovoriť, V tomto boxe pôjde adresu.
A čo to adresa viď?
Zdá sa, char.
>> Ale mohli by sme úplne majú int * a ďalších vecí.
Ale teraz, char * je naozaj veľmi jednoduché a jeden záujmu.
Takže tento problém sa deje stúpať, aj keď, znovu.
>> Dajme tomu, že tento program je otvorený.
Uvidíme, či sa teraz môžeme predvídať čo je s týmto kódom v poriadku.
Takže v tomto programe, copy-0, som ísť dopredu a zavolať znova
GetString a uložiť hodnotu s.
>> A potom, prečo to robím, rovnako ako spomienku týždňov minulosti?
Urobili sme povedať, že getString niekedy vráti null.
Čo to znamená, keď GetString vráti null?
Niečo sa pokazilo.
To pravdepodobne znamená, že reťazec je príliš veľký, počítače pamäť.
Stáva sa, super, super, super zriedka, ale to by sa mohlo stať.
Chceme kontrolovať ju, a to je všetko, čo robíme.
>> Vzhľadom k tomu, uvidíme sa, ak nemáte spustiť kontrolu zvyčajne k veci
ako null, môžete skutočne začať ísť
na adresy v pamäti, ktoré sú neplatné.
A vy budete začať vyvolanie stále viac a viac segmentácia chyby.
Alebo v Mac alebo PC, len spôsobí, že počítač pre zavesenie
alebo program pre zmrazenie, potenciálne.
>> Takže teraz, tvrdím v kopírovaní 0.c, že ​​som Chystám sa kopírovať tieto reťazce prostredníctvom
linky 28.
A potom, ja idem nároku na dne
tu, že idem zmeniť jeden z nich.
>> Takže nevšimol.
Volám náš starý priateľ strlen.
A práve vysvetliť v angličtine čo tento riadok 34 je na tom?
Čo t držiak 0 predstavujú na ľavej strane.
Jo.
>> Divákov: Prvý znak t?
David J. Malan: Prvý znak t.
To je všetko.
Prvý znak t, chcem priradiť veľké písmená verzia
prvého znaku v t.
Takže to je zarábať Prvé písmeno.
A potom, úplne posledná vec, ktorú urobím V rámci tohto programu je, že tvrdí, tu je
originál, s, a tu je kópia, t.
>> Ale na základe príbehu sme práve Povedal o tom, čo reťazce sú naozaj,
čo je linka 28 v skutočnosti robí, a čo je
výsledná chyba bude byť na obrazovke?
>> Takže najprv, prvá otázka, 28.
Čo je to string t = s naozaj robia?
Ak máme na ľavej strane postranný reťazec tu t = y;
že mi dáva jedno políčko tu a jedna škatuľa tu.
A predpokladám, že táto adresa je 0x, povedzme, 50 tentoraz ľubovoľne.
Čo string t = s to pod kapotou?
>> Divákov: [nepočuteľné]
>> David J. Malan: Ukladá pamäť riešiť tam, takže 0x50 je tam.
Takže ak teraz pôjdem do prvej postava tá veľké písmená to,
čo mám skutočne robí s?
Som naozaj robia to isté, nie?
Vzhľadom k tomu, či je adresa 0x50-- a len som nemajú veľa priestoru na doske tu
ale predpokladám, že je to 0x50 tu dole, niekde v pamäti svojho počítača.
>> A ja som sa napríklad, Gabe tu malé písmená, ako je tento.
A ja som povedal: t držiak 0 dostane aktivované.
No, t držiak je 0. prvé písmeno t.
Tak málo g bude stať sa veľkým G. Ale problém
je to, čo sa to tiež poukazujú na?
>> Divákov: rovnaké.
>> David J. Malan: presne rovnaký vec.
Tak jednoduché vysvetlenie snáď aj keď syntax je trochu divný.
Tak poďme na to.
Urobiť kópiu-0 a potom ./copy-0.
Povedz niečo: Gabe.
A bohužiaľ, obaja im už boli aktivované,
ale to, že za Dôvod, že sme jednoducho
teraz rieši s adresami.
>> Tak ako sme sa začať address-- žiadna slovná hračka intended--
ako sme sa začali zaoberať tento konkrétny problém?
No, v copy1.c, čo sa deje byť trochu zložitejšie.
Ale ja by som tvrdiť, koncepčne jednoduché riešenie.
>> Tak ťažké sa dostať na prvý pohľad.
Nebude ľahké pre prvý Doba napíšete to, snáď,
ale v prípade, že problém je, že proste robí T = je len
skopíruje adresu, čo, znova, ak mi môžete vyzdvihnúť na vás,
bude riešenie pre kopíruje reťazec?
>> Divákov: Budeme pravdepodobne znovu použiť slučku.
>> David J. Malan: Jo.
Takže budeme zase potrebovať slučku.
A pretože ak chceme kopírovať reťazec s do iného reťazca,
asi chceme, aby to znak po znaku.
Ale problém je, ak To je pôvodne s,
Teraz musíme začať výslovne prideľovanie pamäte pre t.
>> Inými slovami, nech to prekresliť tento jeden posledný čas.
Ak je tento reťazec s = GetString.
A poďme dať to sem, rovnako.
To je GetString.
A potom sa obraz na niečo ako to bude ako predtým,
g-a-b-e / 0.
To vyzerá na niečo také.
A s preto nazývame 0x50, a že to bude 51, 52.
>> Tak toto je 0x50.
A potom, ja reťazec t.
V pamäti, že to len tak daj mi trochu štvorec ako je tento.
Takže to, čo je kľúčovým krokom teraz?
Ak budem chcieť kopírovať s do t to, čo prázdne potrebujeme vyplniť tú?
Alebo to, čo potrebujeme, aby sme robiť na vysokej úrovni?
Jo?
Niekto?
Jo.
>> Divákov: Musíme [nepočuteľné].
David J. Malan: Jo, to sme treba vyplniť toto pole prázdne.
Nemôžem skopírovať a potom zarábať Gabe meno
kým som sa opýtať operačný systém pre ďalší kus pamäte
To je prinajmenšom rovnako veľký ako originál.
Tak, že nás stavia otázku.
>> Ako môžem požiadať o operačný systém nie je len jednoduchý malý pointer--
ako je to sa nazýva, adresa, pointer-- nie
pre jednoduché krabičke takto nazýva reťazec?
Ako môžem požiadať o prevádzkové systém pre veľký kus pamäti?
Zatiaľ som sa len dostal to späť nepriamo volá getString.
Tak ako je getString aj dostať svoju pamäť?
>> No, ukázalo sa, že je tu Táto ďalšie funkcie tu
že budeme teraz začať používať.
Teraz to vyzerá oveľa viac mystický than-- a ja som jediný, kto môže vidieť to--
tento riadok vyzerá oveľa viac mystický potom by mal na prvý pohľad.
Ale poďme podpichovať ju od seba.
>> Na ľavej strane, mám char * t.
Tak v angličtine, poďme začať formulovať správne vety v technickom žargóne.
Tak toto je prideľovanie premenná typu char * s názvom t.
A teraz, čo to vlastne znamená?
>> No, to znamená, že to, čo mám robiť aby v tejto premennej s názvom t?
Adresa char.
Tak to je proste jednoduchšie, viac rozumný spôsob,
popisovať ľavú stranu.
Takže vytvára toto políčko tu len.
Takže pravá strana, Možno predpokladať, že bude
prideliť, že väčšie kus pamäti, ako na to?
Takže poďme podpichovať to od seba.
>> Je to ohromujúci na prvý pohľad, ale to, čo sa deje vo vnútri tu?
Po prvé, je tu malloc, ktoré je zrejme náš nový priateľ,
"Pamäť prideliť."
Tak to je argument odovzdávaný do neho, takže je to celkom veľká hádka.
Takže poďme podpichovať to od seba.
>> strlen S, samozrejme, predstavuje to--
Divákov: počet znakov.
David J. Malan: Just počet znakov v s.
Takže dĺžka s, pôvodný reťazec.
Tak G-a-b-e.
Takže je to asi štyri v tomto prípade.
Prečo to robím jeden po volanie strlen na s?
Divákov: [nepočuteľné]
David J. Malan: Za to špeciálny znak null.
Ak sa ma pýtate, čo je dĺžka Gabe meno, budem hovoriť štyri.
Pod kapotou, aj keď, musím že piaty bajt na znak NULL.
Takže to je dôvod, prečo robím 1.
>> Teraz len v prípade, že používate tento Program na inom ako v počítači, povedzme,
CS50 spotrebiče, kde je veľkosť znaku
sa môže líšiť z mojej vlastnej computer--
Ukazuje sa, že môžem nazvať operátor sizeof, opýtajte sa počítač
aká je veľkosť char na tomto počítači?
>> A vynásobením päť v tomto napríklad podľa veľkosti char, ktorý
Na väčšine počítačov bude byť len jeden, malloc
sa chystá vyčleniť pre mňa to veľké kus pamäti, tu vpravo.
A že to bude return-- je function--, takže je to
chystá sa vrátiť so mnou, čo?
Divákov: adresa?
David J. Malan: Adresa, čo?
Divákov: Z pamäte je pridelené?
David J. Malan: Z pamäť je pridelené.
Takže nemám tušenie, úprimne povedané, ak je to skončí.
Chystám sa navrhnúť, aby bude to skončí na 0x88.
Úplne ľubovoľné, ale niekde inde ako 0x50,
pretože v operačnom systéme, čo Windows a Mac OS pre mňa urobiť, je
uistite sa, že ich dáva me rôzne kusy RAM.
>> Tak to je hodnota, pokiaľ to kus pamäti, by mohol skončiť.
Tak toto je to, čo skončí tu, 0x88.
Takže jasne, chápem, , Že to nie je rovnaké ako to,
pretože to ukazuje na rôzne kúsky pamäti.
Takže keď som teraz vlastne chcete skopírovať tento v, poďme urobiť svoj návrh riešenia.
>> Poďme vytvoriť pre sláčiky, a to t držiak aj dostane y držiak i.
Pretože teraz môžem použiť Tieto polia podobné notácie,
pretože aj keď malloc veľmi všeobecne mi prideľuje pamäť,
pamäť je len súvislé bajtov.
Byte, byte, byte, chrbtom k sebe k sebe.
>> Môžem iste ako programátor zaobchádzať s ňou ako pole, ktoré
znamená, že môžete použiť tento konečne zoznámiť zápis len niekoľko hranatých zátvorkách.
>> Takže mi dovoľte pozastaviť tam, pretože to je veľa naraz, dokonca
aj keď základná myšlienka zhrnúť je to, že reťazec, celú tú dobu,
Nie je to nový dátový typ sebe.
Je to takzvaný ukazovateľ, adresa charakteru,
čo práve znamená, že je to číslo že ľudské konvencie
máme tendenciu písať ako 0x niečo.
>> Ale je to len číslo, ako 33 Oxford Street,
ktorý sa stane byť Adresa ČS budovy.
Akékoľvek otázky týkajúce sa týchto údajov?
Jo?
>> Divákov: Prečo sa pozrieme pre t sa rovná null?
>> David J. Malan: Prečo skontrolujte t rovné null?
Ak čítame documentation-- veľký question-- pre malloc,
to povie v drobným písmom, niekedy malloc môže vrátiť null,
rovnako ako getString.
A skutočne, GetString vráti null v prípade, podľa poradia, sa vracia malloc null,
pretože GetString používa malloc.
>> A to by mohlo v prípade, že operačný systém stane, Mac OS, Windows, či už je jednoducho
nedostatok pamäte pre vás.
Takže to je to, čo sa tam stalo.
>> A dovoľte mi odhaliť jednu vec ktoré by mohli len fúkať vašu myseľ
alebo úplne byť príliš ďaleko cez linku.
Ale dovoľte mi vytiahnuť rovnaké pre slučku pre kopírovanie,
ktorý pred chvíľou, odvolanie bolo to. t držiak aj dostane y držiak i.
>> Pekné a užívateľsky príjemný.
Cítim sa ako týždeň dva znova.
Ale táto verzia vlastne môže byť prepísať ako je tento, ktorý vyzerá záhadné.
Je to technika s názvom ukazovateľ aritmetika, adresová aritmetika.
Ale prečo to funguje?
>> Teraz protivne, Autori C sa rozhodol použiť
Symbol * pre rôzne účely.
Videli sme, že používa už raz, char *, čo znamená "daj mi premennú
že to bude obsahovať adresa char. "
Takže char * v tejto súvislosti znamená "daj mi premennej."
>> Bohužiaľ, ak budete používať * Bez slovo pred ním, ako char,
to je teraz nazývané operátor dereferencia.
A uvidíme, viac než to trvať dlho.
Ale to len znamená, že "tam".
Je to ako hovoriť, či ma niekto podal na kus papiera "33 Oxford Street,"
keď to urobím "* 33 Oxford Street," to znamená, že "Choď po ceste do budovy SK."
>> Takže * jednoducho znamená, že tam, ak nie je slovo pred ním.
Takže to, čo je t, aby bolo jasné ,?
t je adresa kus pamäť, ktorá bola daná späť ku mne.
s je adresa toho, čo, aby bolo jasné, V príklade sme diskutovali,
z malým Gabe?
s je adresa of--
Divákov: string.
David J. Malan: Z Gabe je pôvodný názov.
Takže je to adresa tento kus pamäte.
Takže keď poviem, t + ja--, oznámenia, je len náš starý priateľ.
Je to len premenná index to je iterácií od nuly hore
na dĺžke reťazca s.
Takže to bude nula, potom jeden, potom dve, potom tri, potom štyri.
Takže poďme zostaviť tieto nové Stieraciu-ako puzzle kúsky, ak chcete,
aj keď opäť, syntaxe je ďaleko viac, než tajomné Scratch.
Tak t je adresa + i sa chystá dať mi
číslo, pretože to sú všetko čísla, ktoré sme sa kreslenie v hexadecimálnom tvare.
Ale sú to len čísla.
>> Takže v prípade, že adresa t sme si povedali, Bol 0x88, 0x88, čo je plus nula.
Dokonca aj keď nie ste pohodlné s ešte hex hádať.
>> Divákov: originálne.
>> David J. Malan: Still 0x88.
Takže čo to * 0x88 znamená?
To znamená, že "tam", čo znamená, že efektívne, "dať prst tu."
A teraz na pravej strane tento výraz, * a potom parens,
y + i znamená s, ktorý je riešiť tu malého g.
y + 0, je, samozrejme, s, bez ohľadu na to, je.
>> Takže teraz je to * S, ktorý rovnako ako * 33 Oxford Street znamená ísť na adresu
s.
Tak tu je to prst, pravá ruka.
Takže to, čo budem kopírovať do čoho?
Tá vec na pravej strane, čo je Gabe, málo g tu, na tu.
>> A tak efekt, ktorý prvú iteráciu slučky,
ako sa to navrhuje, aj keď to vyzerá, blázon zložitejšie ako čokoľvek iné
sme videli predtým, je jednoducho hovorí, ísť sem a kopírovať postavu tu.
Je to dáva vám mapy na oboch miestach.
>> A uvidíme oveľa viac než to.
Ale teraz, nádej je len predstaviť niektoré z týchto základných myšlienok.
A skutočne, poďme sa pozrieť na jeden Konečný program tu
a potom sľúbil claymation, ktorá bude všetko v poriadku.
V poriadku.
Takže mi dovoľte otvoriť up-- tam ideme.
Tak nech ja-- vrátime na obrázku pred dlho.
Dovoľte mi, aby som otvoriť túto záverečnú príklad tu.
>> Takže tu je super, super program, ktorý dosiahne
nič v živote, ktorý robí nasledujúce.
Najprv deklaruje dve premenné x a y, ktoré nie sú čísla tentoraz,
sám o sebe.
Oni nie sú celé čísla, sám o sebe.
Sú to zrejme int *.
Takže len tak niekto, čo to znamená Ak váš dátový typ, váš variabilný,
je typu int * hviezda?
To je adresa int.
>> Tak som potuchy, kde je doteraz.
To jednoducho znamená "dať, nakoniec, adresa int tu. "
0x50, 0x88, tam, kde je v pamäti, adresa sa deje tu.
A to je to, čo y je bude, ako je dobre.
>> Ak by som teraz povedať, x = malloc (sizeof (int)), To je ozdobný spôsob, ako hovoriť,
hej operačný systém, pomocou malloc, Daj mi dostatok pamäte pre veľkosť
z int, čo je pravdepodobne bude 32 bitov alebo štyri bajty.
>> Takže čo malloc vráti?
Malloc vráti adresu.
Takže, čo sa deje, aby sa uložené v X?
Adresa kus pamäti, štyri bajty, že malloc
práve našiel pre mňa otázkou: operačný systém.
>> Teraz medzitým linka štyri tu, * x = 42.
Len aby bolo jasno, čo sa deje tam dole?
Na ľavej strane, * x.
to je ako * 33 Oxford Street.
Takže * x znamená čo?
>> Divákov: Choď na.
>> David J. Malan: Prejdite na túto adresu.
Všade tam, kde to kus pamäť je, ísť na to.
A dal to, čo tam samozrejme?
Divákov: 42.
David J. Malan: 42.
Dobre, * y, rovnaký nápad.
Prejdite na adresu v y.
Vložte číslo 13 tam, ale to, čo je y v súčasnej dobe?
Divákov: nie je pamäť pre y.
David J. Malan: V nie je pamäť pre y.
Takže to, čo y robí pravdepodobne obsahuje, ako sme hovorili?
>> DIVÁKOV: Garbage.
>> David J. Malan: Niektoré hodnoty odpadky.
Teraz, hodnota odpadky je stále číslo.
To môže ešte byť zamenená za adresu.
Je to, ako by niekto načmáral niečo dole,
a vyložil som si to v tom zmysle, niektoré budovy na ulici.
A ak ste jednoducho skúste ísť do niektoré stavebné nemáte vlastné,
alebo nejaký kus pamäti, že nie bola daná, zlé veci sa môže stať.
Počítač môže zlyhať, alebo nejaký iný Nie je určené správanie by sa mohlo stať.
>> Takže intro, potom, aby Binkym je to.
Stále si pamätám, 20 niektoré nepárne roky neskôr,
kde som bol, keď som sa konečne pochopil ukazovateľov.
>> Čo znamená, že ak nechať za tri minúty
a myslím, že nie pochopiť ukazovateľov, si uvedomujú,
Spomenul som si na 20 rokov na nejaké šialené dôvodu
kedy a prečo to nakoniec potopená v, sedí so svojím učením
kolega, Nishat Mehta v späť Eliota jedálni.
Teraz som si spomenul, , Pretože to bolo
jednou z tém, I, vo najmä bojoval s.
A potom, konečne kliknutí ako Trúfam si povedať, veľa tém
nakoniec bude.
A teraz, aby to cítili všetci šťastnejší a to viac presvedčivý,
poďme sa pozrieť do našej konečnej Posledné tri minúty tu na Binkym,
od nášho priateľa, Nick Parlante zo Stanforde.
>> [PREHRÁVANIE]
>> Hej, Binky.
Prebuďte sa!
Je čas na ukazovateľ zábavy.
>> Čo je to?
Ďalšie informácie o ukazovateli?
Oh, dobrota!
>> No, ako začať, myslím, že sme bude potrebovať pár rád.
>> -OK.
Kód prideľuje dva ukazovatele, ktoré môžu ukazovať na celé čísla.
-OK.
No, vidím dva ukazovatele, ale Nezdá sa, že by ukazoval na čokoľvek.
>> -Presne.
Spočiatku, ukazovatele neukazujú na nič.
Veci, ktoré ukazujú na, sa nazývajú pointees a ich nastavenie'S
samostatný krok.
>> Oh, dobre, dobre.
Vedel som, že.
V pointees sú oddelené.
Ehm, tak ako si prideliť pointee?
>> -OK.
No, kód prideľuje nové číslo pointee,
a táto časť obsahuje x poukázať na to.
>> Hej, to vyzerá lepšie.
Tak, aby to niečo urobiť.
>> -OK.
Budem dereferencia ukazovateľom X uložiť číslo 42 na jeho pointee.
Pre tento trik, budem potrebovať moja Kúzelná palička z dereferencing.
>> -Váš Kúzelná palička z Získavanie?
To-- to je skvelé.
>> Toto je to, čo kód vyzerá.
Ja si len nastaviť číslo a [POP]
>> Hej, pozri.
Tam to ide.
>> Takže robí Sleduje na x nasleduje šípky pre prístup k jeho pointee.
V tomto prípade, sklad 42 tam.
Hej, skúste ho uložíte číslo 13 cez druhú ukazovateľ, y.
>> -OK.
Pôjdem sem y, a dostať číslo 13 nastaviť.
A potom vziať prútik Získavanie a len [BUZZ]
>> Oh!
>> Oh, hey!
To nefungovalo.
Povedz, Binky, nemyslím si, že dereferencing y je dobrý nápad, pretože viete,
nastavenie pointee je samostatný krok.
A nemyslím si, že sme kedy urobili.
>> Dobrú bod.
Jo.
Vložili sme ukazovateľ y, ale my Nikdy nastaviť, aby ukazoval na pointee.
>> -veľmi Pozorný.
Hej, vyzeráš dobre tam, Binky.
Môžete to opraviť tak, že y body na rovnakej pointee ako X?
>> -Iste.
Budem používať svoj kúzelná palička o Ukazovateľ priradenie.
>> -je To bude problém ako predtým?
Nie.
To sa nedotýkajte pointees.
Je to jednoducho zmení jeden ukazovateľ na poukazujú na to isté, ako iné.
>> Oh, ako vidím.
Teraz y body na rovnakom mieste ako x.
Tak počkať.
Teraz, y je pevná.
Má pointee.
Takže si môžete vyskúšať prútik Získavanie znova poslať 13 cez.
>> Uh, OK.
Tu to ide. [POP]
>> Hej, pozri sa na to.
Teraz dereferencing práce na y.
A preto, že ukazovatele sú zdieľanie že jeden pointee, obaja viď 13.
Jo.
Zdieľanie, čokoľvek.
Takže budeme vymení teraz?
>> Oh, pozri.
Sme mimo čas.
>> -Ale
>> -len Pamätať tri pravidlá ukazovatele.
Number One, základná štruktúra je, že máte ukazovateľ,
a poukazuje na na pointee.
Ale ukazovateľ a pointee sú oddelené,
a častá chyba je nastaviť ukazovateľ,
ale zabudnúť, aby to pointee.
>> Číslo dve, ukazovateľ dereferencing začína na ukazovateľ
a sleduje šípku nad prístup k svojmu pointee.
Ako všetci vieme, to funguje iba v prípade, že je
pointee, ktorý druh dostane späť pravidlo číslo jedna.
>> Číslo tri, ukazovateľ Priradenie trvá jeden ukazovateľ
a mení ju, aby ukazoval na To isté pointee ako ďalší ukazovateľ.
Takže po zadaní, dva ukazovatele
bude ukazovať na rovnaký pointee.
Niekedy sa tomu hovorí zdieľanie.
A to je všetko, čo sa to, naozaj.
Bye-bye teraz.
[END Videoprehrávanie]
David J. Malan: To je pre CS50.
Uvidíme sa budúci týždeň.