>> [Zenelejátszás]
David J. MALAN: Rendben.
Ez CS50, és ez a a hét végén négy.
És az egyik téma ma az, hogy a digitális kriminalisztika,
A művészet az adatmentés.
És valóban, bár te vagy a közepén
most a béke a Three és a Breakout, jövő héten,
a hangsúly a pontosan ezen a területen.
>> Tehát az egyik legmenőbb munkahelyek én valaha az volt vissza a doktori iskola,
amikor dolgoztam a helyi Middlesex County kerületi ügyész
iroda, ezzel kriminalisztika működik.
Tehát lényegében a Massachusetts Állami Rendőrség, alkalmanként,
ha dolgozik az esetekről lenne hogy a dolgok, mint a merevlemezek
és floppy lemezek és memóriakártyák és a hasonlók.
És ők adják őket az én és a mentor,
és a célunk az volt, hogy bizonyítékot találjanak, ha volt, ezeken a média.
Nos, lehet, hogy láttam pillantások ennek a világnak a kriminalisztika
A média, a TV és mozi.
De a munka volt, és mondhatnám, hogy az a világ,
nem egészen, mint te is látod.
Vessünk egy pillantást, amit akkor már valószínűleg látott.
[Videolejátszás]
-OK.
Most térjünk jól néz rád.
>> [Zenelejátszás]
>> Tartsd meg.
Fuss vissza.
>> Várj egy percet.
Menj jobbra.
-Ott.
Freeze az.
-Teljes Képernyőn.
>> -OK.
Freeze az.
-Tighten Fel, hogy jó?
>> -vector Be az fickó a hátsó kerék.
>> -zoom Az itt, ezen a helyen.
>> -with A megfelelő felszereléssel, a kép nagyítható és éles.
>> Mi az?
>> -Ez Egy tartozékot programot.
>> -Tud Tiszta, hogy akár minden?
>> -Nem Tudom.
Nézzük fokozza azt.
>> -Enhance § A6.
Én jobb a részleteket, és--
-Szerintem Van elég, hogy fokozza.
Engedje meg, hogy a képernyő.
>> -I Fokozott a tükörképét szeme.
-Reméljük Futtatásához át video javítása.
>> -Edgar, Meg tudja erősíteni ezt?
>> -Hang Tovább.
>> -Én Már dolgozom a reflexió.
>> -Van Valaki gondolkodás.
>> Reflexió.
-Van Tükrözi a férfi arcát.
>> -A Elmélkedés!
-Van Tükrözi.
-zoom Az a tükör.
Láthatjuk a reflexió.
>> -Tud Fokozza a kép innen?
-Tud Növeli meg?
-Tud Mozdítható ez?
-Tud Növeli meg?
Tartsd egy kicsit.
Én fokozza.
-zoom Be az ajtón.
-Times 10.
-zoom.
Mozgás a.
-több.
Várj, állj meg.
-stop.
-Pause Azt.
-Rotate Us 75 fok körül a függőleges, kérem.
>> -stop.
Menj vissza a rész az ajtót.
>> -Van Kép fokozó, amely bitmap?
>> Tán tudjuk használni a Pradeep Singh módszer, hogy a Windows.
>> -A Szoftver a legkorszerűbb.
>> -A Sajátérték ki.
>> -with A jobb kombinációja algorithms--
>> -Nyitva Vett megvilágítás algoritmusok a következő szintre,
és tudom használni őket, hogy fokozza ezt a fényképet.
>> -Lock, És bővíteni a z-tengely.
>> -Enhance.
Fokozza.
-Enhance.
-Freeze És fokozza.
[END Videolejátszás]
David J. MALAN: Tehát ezek minden szót, de nem voltak
használt mondatok helyesen.
És valóban, a jövőben bármikor, Kérjük, hallod, hogy valaki azt a szót,
"Fokozza", kuncogott egy kicsit.
Mert amikor megpróbál növelése, Például, ez az, ami történik.
>> Tehát itt van egy gyönyörű fénykép.
Ez CS50 saját Daven.
És tegyük fel, hogy mi volna hangsúly a csillogás a szemében,
vagy az tükrözi a rossz srác, hogy egyértelműen
által rögzített a biztonsági kamera.
Ez az, ami történik, ha ráközelít egy kép
csak véges számú bitek társul hozzá.
>> Ez az, amit akkor kap.
És valóban, a Daven szeme csupán négy, talán hat pixel
alkotó pontosan mit volt ragyogó ott.
Tehát Probléma Set Négy végül is felfedezni ezt a világot, különösen
a természet valami nevezzük I / O, ahol
i / o csak egy divatos módon mondván, input és output.
>> Szóval eddig, mind a kölcsönhatások már volt egy számítógéppel
jórészt a saját billentyűzet és a képernyő,
de nem annyira a merevlemez, vagy mentés fájlok túl az is
magad levelet.
A programokat eddig is nem teremt, és mentés,
és frissítése a saját fájljait.
>> Nos, mi egy fájlt?
Nos, valami hasonló a JPEG.
Ez a kép lehet, hogy van, vagy feltölteni a Facebook,
vagy nézze meg bárhol az interneten.
Sőt, hogy fénykép mi csak saw of Daven volt a JPEG.
És ami érdekes, a kép, mint a JPEG
az, hogy azonosítani lehet, Általában bizonyos minták bit.
>> Más szóval, mi az, ami megkülönbözteti a JPEG a GIF
egy PING egy Word- dokumentum egy Excel file?
Nos, ez csak más minták bit.
És ezek a különböző minták általában az elején ezeket a fájlokat.
>> Tehát, hogy ha a számítógép megnyitja a Word- doc, vagy ha a számítógép megnyitja a JPEG,
úgy néz ki, jellemzően a első néhány bit a fájlban.
És ha felismeri a minta, azt mondja, ó, ez egy kép.
Hadd megjeleníteni a a felhasználó számára a grafikus.
Vagy, ó, ez úgy néz ki, mint egy Word doc.
Hadd mutassam meg, hogy a felhasználó, mint egy esszé.
>> Így például, JPEG, kiderül, vannak
meglehetősen bonyolult a motorháztető alatt.
De az első három bájt a legtöbb minden JPEG kezdeni ezzel a három számot.
Tehát byte nulla, egy, kettő és, a legtöbb minden JPEG, 255, majd a szám
216, akkor a szám 255.
>> És mi leszel képes kezdeni ezzel a jövő héten
valójában dugta alatt A motorháztető fájlokat, mint JPEG
és mint a bitmap kép, és látta, mi mindig is ott volt, amíg
ahogy már a számítógép segítségével.
>> De mi van, általában nem írva, mint decimális számok, mint ez.
Számítógépes szakemberek nem inkább beszélni tizedes.
Nem igazán beszél bináris.
Általában, ha azt akarjuk, kifejezni számok,
mi ténylegesen használni hexadecimális, amely lehet felidézni
, mondjuk, Problem Set Az egyik, amely kétségbe
hogy gondoljon egy másik rendszer.
>> Mi, persze, ismerős A tizedes, nulla és kilenc.
Beszéltünk bináris.
És nem igazán van használni, hogy sok itt
a ki, mert a számítógép fogja használni.
De programozók igen gyakran, de nem mindig,
használni hexadecimális, ami csak azt jelenti, van 16 betű az ábécé,
szemben a két vagy 10.
>> Szóval hogyan lehet számolni, hogy a magasabb mint kilenc hexadecimális?
Menj 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, csak a konvenció.
De mi a kulcs az, hogy minden ezek közül egyetlen szimbólum.
Nincs 10.
Nincs 11, önmagában, mert minden a számjegyek, csak úgy, mint a decimális
és csakúgy, mint a bináris, kéne egyetlen karakter, a konvenció.
>> Annak érdekében, hogy akkor ez az ábécé van rendelkezésünkre álló hexadecimális.
Szóval, mit csinál egy JPEG néz ki, ha volt, hogy írjon ki az első három
bytes nem decimális, hanem, Például, amint hexadecimális?
És miért hexadecimális még minden hasznos?
>> Nos, egy gyors pillantást egy példát.
Tehát, ha írok ki a bitek képviseli ezeket decimális numbers--
ez lehet egy kicsit rozsdás már néhány hete,
de a bal oldali és a jobbra egy meglehetősen egyszerű.
255 volt a legnagyobb szám, amit jelenthet nyolc bit.
Ez volt minden is.
Tehát az egyetlen, aki enyhén érdekes a középső.
És ha a fajta nem ki a matek, akkor következtetni, hogy valóban,
ezt a mintát egy és nullát jelent 216.
Úgyhogy csak kikötik a Most, hogy ezek a helyes.
De miért is érdekes ez?
>> Nos, egy byte, persze, nyolc bit.
És kiderül, hogy ha úgy gondolja, Egy byte két darabokat négy bit,
mint ez.
Hadd adjunk egy kis helyet.
Szóval mielőtt után.
Már csak hozzá néhány fehér térben A megjelenítés kedvéért itt.
Hogyan lehet, hogy most képviselt, mondjuk, hexadecimális minden quad bit,
mindegyik a négy bit?
>> Így például, a bal oldalon Most már 1111 bináris.
Mi az, hogy a szám a decimális, ha nem ki a matek?
Van az is hely, a kettes is, a négyes helyet, és a nyolcas helyen.
>> Közönség: 15.
David J. MALAN: Ez 15.
Tehát, ha nem nyolc plusz négy plusz kettő plusz egy, kapunk 15.
Így tudtam leírni az alábbi 15. 1111, de a lényeg itt
hexadecimális, nem decimális.
Tehát ahelyett, hogy leírom, 15, 1-5, Fogok írni, hogy a hex,
amely ha úgy gondolja, vissza, ha van nulla és f, mi 15 lesz?
Közönség: f.
David J. MALAN: Kiderült, hogy a f.
És akkor a munka, hogy ki mondja, Nos, ha a 10, majd az OK gombra, f 15.
Tehát valóban tudtuk átírni ez ugyanazokat a számokat f f.
És aztán, ha teszünk egy kis matematika, fogjuk következtetni, hogy ez a d.
Eight elég könnyű, mert Van egy a nyolcas helyen.
Aztán, van egy pár f f a.
>> Tehát, amit az emberek általában nem az egyezmény ha az általuk használt hexadecimális is, hogy csak
írom ezt egy kicsit tömören, megszabadulni a legtöbb a fehér térben.
És csak hogy szuper világos olvasó, hogy ez hexadecimális,
az egyszerű egyezmény között emberekben írsz nulla
x, aminek nincs értelme más mint a vizuális azonosítója,
itt jön egy hexadecimális szám.
>> És akkor, akkor tegye a két számjegy, f Ebben az esetben az F, majd egy d, akkor f f.
Tehát hosszú történet rövid, hexadecimális csak hajlamos
hasznos lehet, mivel minden egyes számjegy, nulla és f, tökéletesen vonalak
fel a minta négy bit.
>> Tehát, ha van két számjegy, nulla a F, újra és újra,
hogy ad tökéletesen nyolc bit vagy egy byte.
Szóval ezért hajlamos hagyományosan lehet hasznos.
Nincs szellemi tartalom nagyon túl,
más, mint a tényleges hasznosságát.
>> Most JPEG nem csak fájl formátumokat grafika.
Lehet, emlékeztetnek arra, hogy vannak kép, mint ez a világ,
legalább egy pár évvel ezelőtt.
>> Tehát ez valójában telepített Windows XP
több millió PC-k szerte a világon.
És ez volt a bitmap fájlt, BMP.
És egy bitmap fájlt, ahogy látni fogod a következő hét, csak azt jelenti, egy minta a pontok,
pixel, mint ők nevezik, A térkép a bitek, tényleg.
>> Szóval, mi az érdekes, bár, a fájl formátum, BMP, a
hogy a motorháztető alatt, az több mint három bájt
alkotó a fejléc, így beszélni, az első pár falatot.
Ez valójában úgy néz ki, egy kicsit bonyolultnak első pillantásra.
És látni fogod ezt a P halmaz.
És kezd valamit különösen ki most
nem olyan fontos, mint éppen az a tény, hogy az elején minden bitmap
fájl grafikus formátum, van egy csomó számot.
>> Most a Microsoft, a szerzője ezt a formátumot,
szokta így hívni azokat dolgok nem ints és karakter
és úszik, de a szavak és d szavak és vágyik és bájt.
Tehát ők csak különböző adattípusok.
Ők különböző nevek ugyanazt a dolgot.
De látni fogod, hogy a P meg négy.
>> De ez csak azt jelenti, hogy ha az emberi dupla kattintás néhány .bmp az ő
vagy a merevlemez, és egy ablak nyílik meg feltüntetve neki a kép,
hogy azért történt, mert a működési rendszer valószínűleg észre nem csak
a bmp fájl kiterjesztését a fájl neve,
hanem az a tény, hogy van néhány egyezmény a minta bitek
a kezdet kezdetén Az, hogy a bitmap fájlt.
>> De nézzük most összpontosítani ilyen bonyolult fájl
hanem valami, mint ez.
Tegyük fel, hogy itt GEdit, I Csak a kezdet
Egy program, ami nagyon egyszerű.
Van néhány tartalmaz felfelé tetején.
Most kaptam #include "structs.h", de Majd gyere vissza, hogy egy pillanatra.
De ez hasznos most.
Tehát ez egy olyan program, hogy fog végrehajtani
mint az anyakönyvvezető az adatbankjában tárol.
Így egy adatbázist a diákok, és minden diák a világ
van neve, és a házat, és talán néhány más dolog, de majd tartsa egyszerű.
Minden hallgató neve és a házat.
>> Tehát, ha azt akartam írni egy programot, amelynek a célja az életben
Csak a közelítéseket a nulla három,
ha van három diák a Harvard Egyetemen.
És én csak azt szeretném, hogy segítségével getString, minden diák nevét és a ház,
és aztán csak nyomtassa ki azokat.
>> Ez az a fajta, mint hét Egy, Két hét dolog most,
ahol csak akar a számára hurok vagy valami ilyesmi.
És szeretném hívni getString néhány alkalommal, majd nyomtassa f néhányszor.
Szóval, hogyan lehet, hogy én ezt, mégis, amikor mind a nevét és a ház
vesz részt minden hallgató?
>> Tehát az első gondolatom talán lehet tenni valamit, mint ez.
Lehet, hogy először azt mondják, jó, hogy nekem, mondjuk, egy sor húrok hívott neveket.
És én nem akarok a Bedrótozhatsz három itt.
Amit akarok, hogy ott?
, Hogy a diákok, mert ez csak állandó nyilvánította a tetején,
csak azért, hogy ne kelljen Bedrótozhatsz Három több helyen.
Így tudok változtatni egy helyen, és ez hatással van a változás mindenhol.
És akkor talán nem karakterlánc otthont versenyző.
>> És most, talán valami hasonló for (int i = 0; i <hallgatók, i ++.
Szóval gépelés gyors, de ez talán ismerős szintaxist most.
>> És most, ez volt az újabb.
Ha azt akarom, hogy az i-edik hallgató nevét, azt hiszem, ezt csinálom.
És akkor, nem nevek de házak zárójelbe én.
Én ezt, getString, és hagyja, hogy menjek vissza, és oldja meg a vonal.
Egyetért?
Nem ért egyet?
Ez nem túl felhasználóbarát.
Még nem mondtam el a felhasználót, hogy mit kell tennie.
>> De most, ha én is volna később, nézzük
mondjuk, nyomtassa ki ezeket a dolgokat out-- így TODO később.
Fogok csinálni többet Ez-- ez vitathatatlanul IS
helyes végrehajtása szerzés nevek és házak, három
közülük összesen egyes, egy felhasználó.
>> De ez nem túl jó design, igaz?
Mi van, ha a hallgató nem csak egy név és a ház, hanem egy azonosító számot,
és a telefonszám, és egy e-mail cím,
és talán a honlapján, és talán egy Twitter fogantyú,
és számos más részletek kapcsolódó egy diák, vagy egy személy,
általában.
Hogyan kezdjük hozzá funkciókat a program?
>> Nos, úgy érzem, a legegyszerűbb módja, esetleg lehet tenni valamit, mint, mondjuk,
int ids versenyző.
Szóval nem tud minden azonosítók ott.
És akkor, valami mint a telefonszámok,
Nem vagyok biztos benne, hogyan Kijelentem, hogy csak még.
Szóval, menjünk előre, és csak hívás ez csiripelnek diákok, ami
egy kicsit furcsa, de-- és egy csomó több területen.
>> Kezdtem, hogy hatékonyan másolja be itt.
És ez meg fog nőni szép ormótlan elég gyorsan, nem igaz?
Nem lenne jó, ha lenne A világ egy adatstruktúrát ismert
nem mint egy int vagy egy string, de valami magasabb szinten, egy absztrakció, így
beszélni, vagyis a diák?
C nem jött beépített funkcionalitás a diákok,
de mi van, ha azt akartam, hogy ez ilyen?
>> Nos, kiderült, megyek Egy fájl megnyitásához nevű structs.h itt,
és meg tudod csinálni, hogy pontosan.
És meg fogjuk kezdeni ezt most.
És a motorháztető alatt a P Set Three, amit már ezt most.
Nincs olyan dolog, mint a g rect vagy G ovális a programozási nyelv C.
>> Hozzátartozók a Stanford végre azokat adattípusok ezzel a megközelítéssel itt,
bejelentette, hogy saját új adatok típusok egy új kulcsszó
hívott struct és egy másik egy úgynevezett typedef.
És valóban, bár a szintaxis úgy néz ki, egy kicsit más a dolog
láttunk korábban, elv, ez szuper egyszerű.
>> Ez csak annyit jelent: "határozza meg a típus."
Ez lesz a szerkezet, struktúra és
olyan, mint egy konténer több dolgok.
És ez a szerkezet lesz hogy egy string nevű nevet,
és egy string nevű ház.
És hívjuk, csak a kényelem, ez az egész adatstruktúra diák.
>> Tehát abban a pillanatban kapsz a pontosvessző, akkor most
létrehozta a saját adatait típusú úgynevezett diák
hogy most áll mellett int, és úszó és a karakter, és a húr,
és g rect, és g ovális, és a szám más dolog, az emberek találták.
>> Szóval, mi hasznos erről most az, hogy ha visszamegyek
a struct 0. és befejezni ezt a végrehajtás, amit írtam
előre itt, észreveheti, hogy minden Az elkerülhetetlen messiness hogy
volt, hogy kezdenek történni, ahogy hozzá telefonszámok és csiripelnek és minden
ezeket más dolog, hogy egy diák definíciója,
most már tömören csomagolva mivel csak egy sor a diákok.
>> És minden azon hallgatók most többszörös dolgok belsejébe.
Annak érdekében, hogy csak hagy egy kérdés.
Hogyan kap meg a nevét, és a házat, és az azonosító,
és bármi mást belül a hallgató?
Szuper egyszerű, valamint.
Új szintaxis, hanem egy egyszerű ötlet.
>> Egyszerűen index a tömb, mint mi a múlt héten, és ez.
És mi pontosan a új darab szintaxis?
Csak., Ami azt jelenti: "bemenni a szerkezet és kap a mező hívott
nevet, hogy a terület az úgynevezett ház, kap a mező nevű diák. "
>> Tehát P Set Three, ha még mindig dolgozik, hogy a
és a legtöbb ember még mindig is, rájönnek, hogy ahogy
kezdi el használni a dolgok, mint g rects és g ovális
és más dolog, hogy a jelek szerint nem származik Week nulla, egy, vagy két
észre, hogy azért, mert a Stanford bejelentett néhány új adattípusok.
>> És valóban, pontosan ezt fogjuk nem, illetve, hogy a P meg négy, amikor
kezdjük kezelni a dolgokat például képek, kép, stb.
Szóval ez csak egy teaser, és a mentális modell, ami jön.
Most Halogattam egy kicsit ma reggel.
Kedves volt kíváncsi, hogy mi A Microsoft tapéta ténylegesen
úgy néz ki, mint a mai.
És kiderül, hogy valaki 2006-ban valóban elment majdnem pontosan
ugyanazon a helyen fotózni a valóságban amit úgy néz ki, mint az ezekben a napokban.
A mező most egy kicsit benőtt.
>> Így beszél most a képek, hozzuk vissza Daven ide
a képernyőn, és Nicholas, és csak emlékeztetni,
hogy ha szeretne csatlakozni hozzánk ebédre pénteken, egymás a szokásos URL
itt.
>> Szóval, ha nem hagyjuk ki hétfőn?
Bemutattuk ezt a problémát, igaz?
Ez látszólag a helyes végrehajtása csere,
amely akkor vesz két ints, egy úgynevezett, egy úgynevezett b,
cserélni őket, csakúgy, mint Laura volt itt a színpadon a tejet és a vizet,
használatával egy ideiglenes változó, vagy egy üres poharat,
hogy mi is tesz b egy és a b anélkül, hogy a rendetlenség a dolgokat.
Mi egy változó.
Úgy hívják temp.
>> De mi volt az alapvető probléma ezzel a kóddal hétfőn?
Mi volt a probléma?
Igen.
>> Közönség: Tart több helyet.
>> David J. MALAN: úgy több hely, mert én egy változó,
és ez rendben van.
Ez igaz, de én vagyok fogja mondani, hogy rendben van.
Ez csak 32 bites a nagy rendszer a dolgok, tehát nem nagy ügy.
Más gondolatok?
Közönség: Csak swapok változók helyileg.
David J. MALAN: Pontosan.
Csak elcseréli változók helyileg.
Mert minden alkalommal, amikor hívjon function-- mikor volt a tálcákat Annenberg
utoljára, akkor legfontosabb az alján.
Amint hívja a funkció az úgynevezett csere, csere nem kap x és y,
az eredeti értékeket.
Mit csere get, nem azt állítjuk?
Közönség: másolatok.
David J. MALAN: Tehát másolatát.
Így kap egy-két, ha felidézni a példa utoljára,
de egy példányát egy és két hogy sikeresen cserélve.
De sajnos a végén, ezek az értékek még mindig ugyanaz.
Így látjuk ezt a mi új barátja, remélhetőleg GDB,
hogy te vagy a TF és a CA is már vezetni Önt felé a következők szerint.
>> Így nincs csere visszahívás néz mint-- nézzük nyit Ez-- néz ki.
Inicializáltuk x az egyik, y-két.
Volt egy csomó nyomtatott f a.
De aztán, a kulcs hívás itt volt a csere, ami
pontosan a kód is Most láttam egy perce.
Melyik helyes az első pillantásra, de funkcionálisan,
ez a program nem működik, mert a nem állandóan cserélni x és y.
>> Nézzük ezt egy gyors meleg itt a GDB, a ./noswap.
Egy rakás elsöprő információk Majd, hogy megszabaduljon a Control L most.
És most megyek megy előre, és futtassa azt.
És sajnos, az nem volt hasznos.
Futott a program belsejében ez nevű program GDB, a debugger,
de nem engedi piszkálni körül.
>> Tehát hogyan tudok valójában szünet végrehajtás belül ez a program?
Így szünet.
És tudtam törni bármelyik sorszám, egy, 10, 15.
De én is megtörni jelképesen mondván szünet fő.
És ez fog meg egy kis szünetet pont, látszólag a sor 16 fő.
És hol van vonal 16?
Menjünk fel a kódot és menj fel a noswap.
És valóban, vonal 16 a legelső a programban.
>> Tehát most, ha megyek előre és típusa futni ebben az időben, az Enter, akkor megállt.
Szóval piszkálni körül.
Nyomtassa x-- miért x nulla?
És figyelmen kívül hagyja a dollár jel.
Ez csak a szakértő A program használata.
Miért x nulla a pillanatban?
Igen.
>> Közönség: Megállt mielőtt vonal 16, valójában nem on-line 16.
David J. MALAN: Pontosan.
GDB alapértelmezésben szünetelteti végrehajtás előtt sor 16.
Így azt nem hajtották végre, ami azt az x egy ismeretlen érték.
És szerencsénk volt, hogy ez az valami tiszta, mint a nulla.
Tehát most, ha azt írja a következő, most végre 16.
Ez vár rám, hogy végre 17.
Hadd menjek előre, és a nyomtatási x.
Ez az egyik.
Hadd menjek előre, és a nyomtatási y.
Mit kell most látni?
>> KÖZÖNSÉG: [nem hallható]
>> David J. MALAN: Egy kicsit hangosabban.
>> KÖZÖNSÉG: [nem hallható]
David J. MALAN: Nem egészen egy konszenzus.
Szóval igen, azt látjuk, néhány szemetet érték.
Most, y 134514064 ott.
Nos, ez csak valami szemét érték.
Saját program a RAM különböző célokra.
Van más funkciókat.
Más emberek azt írta benne a számítógép.
Tehát ezeket a biteket óta használják más értékek, és mit látok
a maradványait néhány korábbi ezzel a memóriát.
>> Tehát nem nagy ügy, mert amint mint az I. típusú mellett, majd nyomtassa y,
ez inicializálja a az érték, amit szeretnék.
Tehát most, menjünk előre egy kicsit gyorsabban.
N a következő.
Csináljuk újra.
De én nem akarom, hogy elérje ide, mert ha én
szeretné látni, mi folyik odabent swap, mi a parancs?
>> Közönség: lépések.
>> David J. MALAN: lépések.
Tehát ez a lépés nekem egy funkció, ahelyett felette.
És most, hogy egy kicsit rejtélyes őszintén, de ez csak
azt mondta, én vagyok a 33. sor most.
És csináljuk újra.
Print temp.
Szemét érték, negatív ebben az időben, de ez csak még egy szemetes értéket.
Tehát lássuk a következő, nyomtatás temp.
Ez inicializált 1, ami volt az x értékét, más néven a.
>> Most hol vannak a A és X jön?
Nos, hirdetmény fő, mi hívott ezeket az értékeket az x és y.
Ezután át őket cserélni a következők szerint.
X volt előbb, vessző y.
És akkor, csere nevezhetnénk őket x és y.
De az egyszerűség kedvéért, ez hívja őket, a és b.
De a és b most lesz példányban x és y, ill.
>> Tehát, ha visszamegyek GDB, temp most az egyik, és a ma már az egyik.
De ha a következő, és most nem nyomtat Egy, a már költözött át.
A tejet önteni a korábbi narancslé poharába, vagy fordítva.
>> És ha a következő újra, és most ha nyomtassa ki mint a józanság ellenőrzése,
A még két, de b most az egyik.
Őszintén szólva, még mindig ott van.
Nem érdekel, mi temp is.
De amint most írja, mondjuk, továbbra is, hogy menjen vissza, most én vagyok a végén
a programot.
És sajnos, az x még mindig az egyik és y még kettő.
>> Tehát mi volt a haszna GDB ott?
Ez nem segített kijavítani A probléma önmagában,
de ez remélhetőleg segíteni értem megvalósításával
hogy igen, az én logika helyes, de a kód végül nem rendelkező
állandó hatás.
Szóval ez a probléma vagyunk fog most megoldani ma.
>> De térjünk oda útján ezt.
Karakterlánc egy hazugság.
Ez is nem egy adattípust hogy létezik C. Ez
óta szinonimája néhány idő valami mást,
és mi is azt mutatják, hogy a következő.
>> Hadd menjek előre, és nyissa fel a program neve összehasonlítani-0-ra.
És ahelyett, hogy írja ezt ki, kezdjük a séta a kód
Már írtam, de ez csak egy pár sort.
Szóval ez az összehasonlítandó-0-ra.
És az első dolog, amit csinálok kezd egy sort.
>> De figyeljük meg, hogy mire vagyok Ennek az első alkalommal.
Mi a különbség egyértelműen a vonal 21?
Valójában, várj egy percet.
Ez példány kettő.
Hogy még csak nem is a megfelelő programot.
Rendben, spoiler.
Rendben, akkor nem számít, hogy.
Ez a válasz, hogy a jövő kérdése.
>> Itt összehasonlítani-0, és én vagyok arról, hogy egy sort.
Program sokkal egyszerűbb.
Tehát ez egyértelmű.
Ez olyan, mint hét, hét két dolog abban a pillanatban. húr s = getString.
Most azt mondom, hogy újra itt.
húr t = getString.
És akkor, az utolsó dolog, amit ebben a programot, mint a neve is sugallja,
nem fogom próbálja összehasonlítani őket.
>> Tehát, ha s, az első húr, egyenlő = t, akkor én vagyok
fogja mondani, hogy írja be ugyanezt.
Más, én fogok mondani beírt különböző dolog.
Szóval lefordítani és futtatni ezt a programot.
Tehát, hogy összehasonlítani nulla.
Jól néz ki.
Nem fordítási hibák.
>> Hadd menjek előre most és írja ./compare-0-ra.
Hadd menjek előre, és mond valamit : Daven és valami: Rob.
És az I. típusú különböző dolog.
Eddig jó.
Program helyesnek tűnik.
>> De fussunk újra.
Mondj valamit: Gabe.
Rendben.
Talán megüt a szóköz vagy valami funky.
Csináljuk újra.
Így Zamyla.
Zamyla.
Különböző dolog.
Szóval, mi folyik itt?
>> Tehát ez a két sor kód, getString hogy hívják kétszer.
És akkor én vagyok csak próbálunk összehasonlítani s és t.
De ami igazán akkor folyik itt?
Nos, a kézírás mindjárt hentes ezt a példát kissé.
És nézzünk tulajdonképpen dobja ezt fel itt is.
>> Tehát van egy sor, mint a húr s = getString.
Szóval ez csak az első érdekes sort a program.
De mi ebben az időben már folyik a motorháztető alatt?
Nos, a bal oldalon a húr, amely bizonyos típusú változó,
és hívják s.
Úgy tudom, hogy ez a memória, vagy RAM, a gépemen valahogy.
Így fogok elvontan felhívni, hogy a tér.
32 bit, kiderül, de erről bővebben a jövőben.
És akkor, mi folyik itt?
>> Nos, getString nyilvánvalóan kap egy húr a felhasználó.
És getString kapott Zamyla vagy Gabe vagy Daven.
Úgyhogy választani az első e, ami Daven.
Olyan hatékonyan, mi getString kapott engem az első eset volt a D-a-v-e-n.
És akkor mit tett ez ad nekem titokban?
KÖZÖNSÉG: [nem hallható]
David J. MALAN: Igen, A / 0 vagy null karaktert.
Tehát gyakorlatilag kaptam egy húr.
De mi már tudjuk, a korábbi úgy néz ki, hogy a szöveg csak egy tömb
A karakterek, és ez megszüntetheti ez a különleges sentinel karakter / 0.
>> De ha ez igaz, és ez a tér,
ez nyilvánvalóan sokkal nagyobb téglalap.
És valóban, ez az, Azt állítom, csak 32 bit.
És ez nyilvánvalóan több, mint 32 bit, mivel ez valószínűleg
nyolc plusz nyolc plusz nyolc plusz nyolc plusz nyolc,
csak azért, mert byte ASCII.
Hogy a fenébe megyünk, hogy illeszkedjen Daven ebbe a kis dobozba itt?
>> Nos, mi getString valójában csinál?
Nos, ez a rács itt jelent a számítógép memóriájában vagy RAM.
Szóval önkényesen azt mondják, hogy ha minden ilyen bájt képvisel,
akkor el tudunk képzelni az egyes bájt, mint amelyek egy címet,
mint 33 Oxford Street, vagy a 34. Oxford Street, vagy a 35 Oxford Street.
>> Szóval, mint otthon van címe és épületek címek,
így nem egyedi bájt memória van címek és számok
hogy egyedileg azonosítani őket.
Na, ez önkényes.
De, hogy ez egyszerű, megyek használni hexadecimális csak megállapodás szerint,
de a 0x jelent semmit más mint "ez hexadecimális."
és én fogom azt állítani, hogy a "D" végül a Byte One a memóriában.
>> Nincs semmi más folyik memória, így Daven van az első helyen
A Byte One.
Ez akkor lesz 0x2.
Ez lesz a 0x3.
Ez lesz 0x4.
Ez lesz a 0x5.
Ez lesz 0x6.
>> De ha egyszer elkezdesz gondolkodni arról, hogy mi a számítógép csinál
a motorháztető alatt, akkor elkezd következtetni
hogyan, néhány évvel ezelőtt, lenne hajtotta végre C is.
Mi getString valószínűleg returning-- mert
úgy érzi, hogy nem visszatérő Daven, önmagában,
mert ő biztosan nem fogja hogy beleférjen a kis box--
akkor mi getString valószínűleg visszatér?
>> KÖZÖNSÉG: [nem hallható]
>> David J. MALAN: A helyszín Daven.
És ez már ezt azóta Week One.
Mi getString igazán vissza nem karakterlánc, önmagában.
Ez az egyik a kis hazugságokat.
Ez visszatérő a címét húr a memóriában, az egyedi cím.
Daven él 33 Oxford Street.
De még tömören, Gavin él A 0x1, Cím Number One.
>> Tehát mi lesz ebbe a kis doboz akkor, hogy világos legyen,
csak a címe, hogy a húr.
Tehát ebben az időben, ez a már folyik.
De mi ez utal most az, hogy ha az összes s
egy szám belsejébe, aki megállítani, a programozó,
attól, hogy bármilyen számot minden változó és csak ugrás
az, hogy a darab a memória?
És valóban, majd meglátjuk ez egy fenyegetés legközelebb.
>> De most, ez olyan elégtelen.
Ha azt mondom, hogy nekem a húr, adsz nekem Daven.
De nem igazán ad nekem Daven.
Minden adsz nekem Daven címét.
Hogyan akkor tudom biztosan ahol Daven kezdődik és ends--
A történet kezd weird-- ahol Daven kezdődik és végződik,
, majd a következő string memória kezd?
>> Nos, ha átadod nekem az elején Daven,
lényegében, hogyan tudom ahol a végén az ő neve?
Ez a különleges null karakter, ami annál is inkább fontosabb most
ha húrok alatt a Hood egyszerűen azonosítható
egyedülálló a helyük a memóriában.
Tehát ebben az időben, hogy ez mi folyik.
>> Tehát, ha megnézzük most A kód itt, magyarázza
ha lenne a hibát a 26.
Miért Zamyla és Zamyla más?
Miért van Gabe és Gabe más?
Igen, vissza.
>> Közönség: A különböző címekre.
>> David J. MALAN: Egyszerűen azért, mert vannak különböző címekre.
Mert amikor telefonál getString megint, amit megteszek gyorsan itt
ha ez a második vonal, húr t, mint én abban a programban,
megegyezik egy másik hívás getString.
A következő alkalommal, amikor hívni GetString, megyek
hogy egy másik darab memória.
>> GetString megengedett kérni a működési
rendszer több és több memóriát.
Ez nem fog újra ugyanazt hat bájt minden egyes alkalommal.
Ez lesz, hogy egy új darab memória, amely
azt t fog kapni más érték itt.
>> Tehát, amikor én s értéke = t, te nem összehasonlítása
D ez ellen, és egy ellen ez és az V. ellen.
Te összehasonlítjuk ezt ellen, amely
őszintén szólva elég useful-- useless-- elég használhatatlan, mert aki igazán
érdekel, ahol a húrok a memória?
>> És valóban, mi nem.
És mi nem fogunk indítsa különösen gondoskodó.
Csak olyan mértékben, hogy a hibákat támadhatnak és a biztonsági fenyegetések merülnek akaratát
valójában elkezd érdekel ez.
Szóval megoldhatja a problémát.
Kiderült, tudod javítani szuper egyszerűen.
>> És nézzünk valójában, mielőtt azt mutatják, hogy újra, mi lenne
tenni, ha egy CS50 osztály, és meg kellett végrehajtani
összehasonlítás ellen két szálakat.
Akkor nyilvánvalóan nem csak használni s egyenlő = t.
De logikusan, hogy milyen lenne összehasonlítani ezt a fonalat
szemben ez a karakterlánc a C kódot?
Igen.
>> Közönség: Csak nem a A hurok [nem hallható]
David J. MALAN: Tökéletes.
KÖZÖNSÉG: [nem hallható]
David J. MALAN: Igen.
Csak használ egy for ciklus vagy while ciklus vagy bármi.
De csak alkalmazza az alapötlet, hogy ha Ez a darab a memória, vagy egy tömb
és ez az, végighaladni mind ugyanabban az időben.
És vessük össze a leveleket.
>> És neked, hogy egy kis óvatos, mert
nem akarnak egy ujj hogy megy a többi
mert az egyik húr hosszabb, mint a másik.
Így fogsz szeretné ellenőrizni ez a különleges érték a végén, null.
De ez tényleg az, a end, ennyire egyszerű.
És őszintén szólva, nem kell kell újra feltalálni a kereket.
Itt Version Two.
És mit fogok mondani, az, hogy ahelyett, hogy összehasonlítjuk s egyenlő = t,
Én inkább akartam mondani, ha húr összehasonlítása s vessző t egyenlő = 0-ra.
Nos, mi húr között?
>> Kiderült, hogy ez a funkció, amely jön a C, melynek célja az életben
össze kell hasonlítani a két szálakat.
És keverjük összehasonlítani, ha azt olvassuk, hogy man oldalt vagy a dokumentációt CS50
utalás, ez lesz csak mondom, hogy feltűnést
összehasonlítani hozamok negatív szám vagy pozitív szám vagy nulla,
ahol nulla azt jelenti, ők egyenlő.
>> Így csak találgatás.
Mi lehet jelent az, ha keverjük összehasonlítása visszatér
negatív érték vagy pozitív érték?
Közönség: Nagyobb vagy kisebb.
David J. MALAN: Igen, nagyobb vagy kisebb, mint.
Tehát, ha akart rendezni egy egész csokor húrok a dictionary--
ahogy előbb-utóbb le a road-- tökéletes funkció használata potenciálisan,
mert meg fog tenni, hogy a összehasonlítása húrok az Ön számára, és mondd meg
Ön nem egy szó, mielőtt b, vagy nem b elé a betűrendben.
Meg tudjuk csinálni, hogy pontosan.
>> És észre tettem egy másik dolog ebben a példában.
Mi más változott magasabb fel ebben a fő funkciója?
Char *.
És ez a másik fehér hazugság.
Egész idő alatt, amikor már Készítettem húr,
akkor már titokban átírta string char *, hogy a csengés valójában
érti meg.
>> Más szóval, a CS50.h és mivel mi végül látni,
tettünk egy szinonima nevű húr ez ugyanaz, mint a char *.
És most tudom, csak hogy a *, Ebben az összefüggésben, legalábbis
jelent a cím.
>> A címe mi?
Nos, az a tény, hogy azt mondtam, char *, és nem int * vagy float *
azt jelenti, hogy char * az címét a kar.
Szóval ez a kis doboz itt, más néven húr, tényleg típusú char *
amely egyszerűen egy divatos szóval, ebben a dobozban megy egy címet.
És mit jelent, hogy a cím utal?
Úgy tűnik, a kar.
>> De teljesen Van int * és egyéb dolgok.
De most, char * valóban a leginkább egyszerű és az egyik érdek.
Így ez a probléma lesz emelkedik, mégis, újra.
>> Tegyük fel, hogy nyissa meg ezt a programot.
Lássuk most már tudjuk megjósolni mi a baj ezzel a kóddal.
Tehát ebben a programban, copy-0, vagyok menni előre, és újra hívni
GetString és tárolja az értéket s.
>> És akkor, miért csinálom ezt, Csak emlékeztetőül a hét múlt?
Azt mondtam, hogy getString néha vissza null.
Mit jelent, ha GetString vissza null?
Valami nem stimmel.
Ez valószínűleg azt jelenti, a szöveg túl nagy, a számítógép a memória.
Ez történik szuper, szuper, szuper ritkán, de megtörténhet.
Azt akarjuk, hogy ellenőrizze azt, és ez minden, amit csinálunk.
>> Mert akkor most látni, ha nem vizsgáljuk meg szokásos dolgok
mint null, lehet, hogy tényleg elkezd menni
a címeket memória érvénytelen.
És fogsz kezdeni indukáló egyre több és több szegmentáció hibák.
Vagy egy Mac vagy PC, csak ami a számítógép lefagy
vagy program, hogy fagyassza be, esetleg.
>> Szóval, most azt állítják, a copy-0.c, hogy én megyek másolni ezeket a húrok útján
A 28. sor.
És akkor megyek igényelni az alján
hogy itt fogok megváltoztatni az egyiket.
>> Így észre.
Hívom a régi barát strlen.
És csak magyarázni angolul mi ez a sor 34 csinál?
Mit t konzol 0 képviseli a bal oldalon.
Igen.
>> Közönség: első karaktere t?
David J. MALAN: első karaktere t.
Ennyi.
Első karakterét t, azt akarom, rendelni a nagybetűs változatát
Az első karakter t.
Szóval ez kihasználva az első betű.
És akkor, az utolsó dolog, amit teszek ebben a programban azt állítom itt
az eredeti, s, és itt van a másolat, t.
>> Alapján azonban a történet már csak elmondta, hogy mi vonósok valójában,
mi is sor 28 valóban csinál, és mi a
az ebből eredő hiba lesz Ahhoz, hogy a képernyőn?
>> Tehát az első, az első kérdés, 28.
Mi a húr t = s valóban csinál?
Ha van a bal oldali oldal itt húr t = s;
hogy ad nekem egy doboz itt és egy doboz itt.
És tegyük fel, ez a cím 0x, mondjuk, 50 ebben az időben, önkényesen.
Mit húr t = s nem a motorháztető alatt?
>> KÖZÖNSÉG: [nem hallható]
>> David J. MALAN: tárolja a memória foglalkozik ott, tehát 0x50 megy oda.
Tehát, ha most megyek az első karakter t és nagybetű azt,
Mit is hatékonyan tesz s?
Én tényleg ugyanazt a dolgot, ugye?
Mert ha Address 0x50-- és csak azt Nem sok hely a fedélzeten van,
de azt feltételezik, hogy ez a 0x50 le itt, valahol a számítógép memóriájában.
>> És én, például, Gabe kisbetűvel itt, mint ez.
És azt mondtam t tartó 0 lesz aktiválásra.
Nos, t konzol a 0 Az első betű a t.
Tehát kis g fog lesz nagy G. De a probléma
az, hogy mit s arra is rámutatnak, hogy?
>> Közönség: Ugyanaz.
>> David J. MALAN: pontosan ugyanolyan dolog.
Így egy egyszerű magyarázat talán, akkor is, ha a szintaxis egy kicsit furcsa.
Így csináljuk.
Készíts copy-0, majd ./copy-0-ra.
Mondj valamit: Gabe.
És sajnos, mind a Közülük most aktiválásra,
de hogy az alapul szolgáló az oka, hogy mi csak
most foglalkozik a címeket.
>> Szóval hogyan kezdenek address-- no pun intended--
hogy kezdünk foglalkozni ezt a problémát?
Nos, copy1.c, mennek a dolgok hogy egy kicsit bonyolultabb.
De azt állítják, a fogalmilag egyszerű megoldás.
>> Olyan nehéz, hogy az első pillantásra.
Nem lesz könnyű az első alkalommal írja ki, talán,
de ha a probléma az, hogy egyszerűen azt tette, t = s csak
példányban a cím, milyen, újra, ha én is vegye magára,
lesz a megoldás az egy másolat a húr?
>> Közönség: Majd talán használja a hurok újra.
>> David J. MALAN: Igen.
Szóval szükségünk lesz egy hurok újra.
És mert ha azt akarjuk másolni egy string s egy másik szöveget,
azt érdemes csinálni karakterenként.
De a probléma az, hogy ha Ez eredetileg s,
most el kell kezdenünk kifejezetten kiosztása memória t.
>> Más szóval, nézzük dolgozza át ezt még egyszer, utoljára.
Ha ez karaktersorozat s = getString.
És mondjuk ez itt is.
Ez getString.
És akkor, a kép valami ilyen lesz, mint korábban,
g-a-b-e / 0.
Úgy néz ki, egy kis valamit, mint ez.
És s ezért nevezzük ezt a 0x50, és ez lesz a 51., 52..
>> Szóval ez a 0x50.
És akkor én húr t.
A memóriában, hogy csak fog adj egy kis tér, mint ez.
Szóval mi a legfontosabb lépés most?
Ha azt akarom, hogy másolni s a t, amit üres van szükségünk, hogy töltse itt?
Vagy mit kell nem magas szinten?
Igen?
Valaki?
Igen.
>> Közönség: Meg kell [nem hallható].
David J. MALAN: Igen, kell kitölteni üresen.
Nem tudok másolni, majd hasznosítani Gabe neve
amíg kérem az operációs rendszer A másik darab memória
ez legalább akkora, mint az eredeti.
Annak érdekében, hogy hagy bennünket a kérdés.
>> Hogyan kérni az operációs rendszer nem csak egy egyszerű kis pointer--
mivel ez az úgynevezett, egy cím, a pointer-- nem
egy egyszerű kis doboz így hívják húr?
Hogyan kérni a működési rendszer egy nagy darab memória?
Eddig én még csak ütött vissza közvetve hívja getString.
Szóval, hogyan getString még kezd a memória?
>> Nos, kiderült, hogy nincs ez a másik funkció itt
hogy mi lesz most kezdenek használni.
Nos, ez úgy néz ki, így több rejtélyes mint-- és én vagyok az egyetlen, aki képes látni it--
ezt a sort úgy néz ki, így több rejtélyes akkor meg kell első pillantásra.
De nézzük kötekedik szét.
>> A bal oldali, van char * t.
Tehát az angol, kezdjük megfogalmazni megfelelő mondatokat szakzsargont.
Szóval ez elosztása a típusú változó char * nevű t.
Nos, mit is jelent valójában?
>> Nos, ez azt jelenti, hogy mit fogok , hogy ebben a változó nevű t?
Címeit char.
Szóval ez csak az egyszerűbb, ésszerűbb módon
leírására a bal oldalon.
Annak érdekében, hogy létrehozza ezt a dobozt csak itt.
Tehát a jobb oldali, Feltételezhető, hogy megy
kiosztani, hogy a nagyobb darab memória, hogyan?
Szóval kötekedik ezt szét.
>> Ez elsöprő első pillantásra, de mi folyik odabent itt?
Először is, ott van a malloc, amely látszólag új barátunk,
"Memória lefoglalni."
Tehát ez az érv, hogy telt bele, tehát ez egy elég nagy érv.
Szóval kötekedik ezt szét.
>> strlen s, persze, jelentése a--
Közönség: A karakterek száma.
David J. MALAN: Csak az karakterek száma s.
Így a hossza s, az eredeti szöveg.
Tehát a G-A-B-E.
Így talán négy ebben az esetben.
Miért csinálom 1 után hívás strlen s?
KÖZÖNSÉG: [nem hallható]
David J. MALAN: E speciális null karakter.
Ha engem kérdezel, mi van a hossza Gabe nevét fogom mondani négy.
A motorháztető alatt is, azt kell hogy az ötödik bájt a null karakter.
Szóval ezért csinálom a +1.
>> Most csak abban az esetben, ha fut ez a programot a számítógép más, mint, mondjuk,
A CS50 készülék, ahol akkora, mint egy char
eltérő lehet a saját computer--
Kiderült, hogy én is hívni ezt a operátor sizeof, csak kérni a számítógép,
ami akkora, mint egy char ezen a számítógépen?
>> És szorozni öt ebben például akkora, mint egy char, amely
A legtöbb számítógépek csak az egyik, malloc
fog kiosztani számomra ez a nagy darab memória itt a jobb oldalon.
És ez fog return-- ez egy így ez function--
vissza fog térni, hogy mit?
Közönség: a cím?
David J. MALAN: A cím, mi?
Közönség: a memória azt kiosztott?
David J. MALAN: a memóriát kiosztott.
Szóval fogalmam sincs, őszintén szólva, ahol ez lesz a vége fel.
Fogom javasolni, hogy ez lesz a végén a 0x88.
Teljesen önkényes, de valahol más, mint 0x50,
mert az operációs rendszer, milyen A Windows és Mac OS értem, ez
győződjön meg arról, hogy ez így nekem különböző darabokat a RAM.
>> Tehát ez az érték, ahol ez a darab memória talán a végén.
Szóval, ez az, amit végül itt, 0x88.
Tehát most már egyértelműen, meg tudom érteni hogy ez nem ugyanaz, mint ez,
mert ők mutatott különböző darabokat a memória.
Tehát, ha most valóban akar másolni ezt A, csináljuk a javasolt megoldás.
>> Csak menjünk, hozzon létre egy for ciklus, és nem t konzol én lesz s konzol i.
Mert most már használni A tömb-szerű jelölés,
mert bár malloc nagyon általánosságban osztja meg memória,
memória csak összefüggő bájt.
Byte, byte, byte, vissza háttal.
>> Tudom biztosan, mint a programozó kezelni, mint egy tömb, amely
azt jelenti, hogy tudom használni ezt végre ismerős jelölés csupán néhány szögletes zárójelben.
>> Hadd álljak oda, mert ez sok egyszerre, még
bár az alapötlet, hogy zárja az, hogy a szöveg, mind ebben az időben,
nem egy új adattípus önmagában.
Ez csak egy úgynevezett mutató, címet a karakter,
ami csak azt jelenti, hogy egy sor hogy az emberi egyezmény
hajlamosak vagyunk írni, 0x valami.
>> De ez csak egy szám, mint 33 Oxford Street,
ami történik, hogy a CS épület címét.
Bármilyen kérdése a részletekre?
Igen?
>> Közönség: Miért ellenőrizni T egyenlő null?
>> David J. MALAN: Miért ellenőrizze t egyenlő null?
Ha olvassuk a documentation-- nagy question-- a malloc,
azt fogja mondani az apró betűs, néha malloc adhatja vissza null,
mint getString.
És valóban, getString vissza null ha viszont malloc vissza null,
mert getString használja malloc.
>> És ez fog történni, ha az operációs rendszer, Mac OS, Windows, bármi, egyszerűen
Elfogyott a memória az Ön számára.
Szóval, ez az, ami ott történt.
>> És hadd felfedi egy másik dolog hogy talán csak az agyad
vagy teljesen túl messze a vonalon.
De hadd húzza fel a ugyanaz a hurok a másolás,
amely egy pillanattal ezelőtt, visszahívás ezt. t tartó i lesz s konzol i.
>> Szép és felhasználóbarát.
Olyan, mint a második hét megint.
De ez a verzió valóban lehet újraírt, mint ez, ami úgy néz ki, rejtélyes.
Ez a technika az úgynevezett mutató aritmetikai, cím számtani.
De miért is működik ez?
>> Most bosszantóan, a szerzők C ezúttal
a * jel különböző célokra.
Láttuk, hogy egyszer használható már, char *, ami azt jelenti: "adj egy változó
hogy fog tartalmaz a címét char. "
Tehát char * ezzel összefüggésben azt jelenti: "adj egy változó."
>> Sajnos, ha használja a * nélkül szó előtte, mint a char,
ez most az úgynevezett dereference operátor.
És majd meglátjuk, még ebből nemsokára.
De ez csak azt jelenti: "ott."
Ez olyan, mint azt, ha valaki a kezembe egy darab papír "33 Oxford Street,"
ha én "* 33 Oxford Street," azt jelenti, hogy "Menj le az úton, hogy a CS épület."
>> Így * csak azt jelenti, hogy ott, ha nincs szó előtte.
Tehát mi t, hogy világos?
t a címe darab memória kapott vissza hozzám.
s az a címe, hogy mi, hogy világos legyen, A példa, amit tárgyalunk,
A kisbetűs Gabe?
s az a cím of--
Közönség: a húr.
David J. MALAN: Gabe eredeti nevét.
Szóval ez a címe ez darab memória.
Tehát, ha azt mondom, t + Én-- i, értesítés, csak a régi barát.
Ez csak egy index változó ez iterációjával nullától akár
a hossza a húr s.
Szóval ez lesz nulla, akkor egy, majd kettő, majd három, majd négy.
Szóval össze ezeket az új Scratch-szerű puzzle-darabokat, ha úgy tetszik,
jóllehet, újra, a szintaxis sokkal több misztikus, mint a Scratch.
Így t egy cím + i fog adni nekem
egy számot, mert ezek mind szám, amit már rajz hexa.
De ezek csak számok.
>> Tehát, ha a címét t mondtunk volt 0x88, mi 0x88 plusz nulla.
Akkor is, ha nem kényelmes hexadecimális mégis, akkor gondolom.
>> Közönség: Az eredeti.
>> David J. MALAN: Still 0x88.
Szóval, mit jelent * 0x88 jelent?
Ez azt jelenti, "menj oda", ami azt jelenti, hatékonyan, "tegye az ujját itt."
És most a jobb oldali ezt a kifejezést, * majd parens,
s + s i jelenti, amely a foglalkozik itt a kis g.
S + 0, természetesen, s, s bármi.
>> Tehát most, hogy * s, amely ugyanúgy, mint * 33 Oxford Street azt megy a cím
s.
Tehát itt van az ujjamon, a jobb kezét.
Szóval, mit fogok másolni abba, hogy mi?
A dolog a jobb oldalon, ami Gabe, kis g itt, a itt.
>> És így a hatása, hogy a első közelítésben a hurok,
ahogy javasolta, bár úgy néz ki, őrült sokkal bonyolultabb, mint bármi
láttunk korábban, egyszerűen azt mondja megy itt, és másolja a karakter itt.
Ez ad neked egy térképet, hogy mindkét helyen.
>> És majd meglátjuk, sokkal többet.
De most, a remény, csak bemutatni néhány ilyen alapvető ötleteket.
És valóban, nézzük meg egy végleges program itt
majd az ígért claymation, amely biztosítja, hogy minden rendben van.
Rendben.
Ezért hadd nyissa hurok-- ott vagyunk.
Úgyhogy hozzám-- visszajövünk ezt a képet nemsokára.
Hadd nyissa meg ezt az utolsó példa itt.
>> Tehát itt van egy szuper, szuper program, amely megvalósítja
semmi az életben, hogy nem a következő.
Először kijelenti két változó, x és y, amelyek nem számok ebben az időben,
önmagában.
Ők nem egész számok, önmagában.
Ezek látszólag int *.
Szóval valaki, mit jelent Ha az adatok típusát, a változó,
A típusa int * csillag?
Ez a cím egy int.
>> Szóval fogalmam sincs, hol van még.
Ez csak azt jelenti, hogy "tegye, végül, címét int itt. "
0x50, 0x88, ahol ez a memória, egy címet oda.
És ez az, ami az y lesz, valamint.
>> Ha most azt mondják, x = malloc (sizeof (int)) ez a divatos módja mondván,
Hé operációs rendszer keresztül malloc, adj elég memória méretének
Egy int, ami valószínűleg lesz 32 bites vagy négy bájt.
>> Szóval mit malloc vissza?
Malloc vissza a címet.
Szóval mi kap tárolt x?
A címet a darab memória, a négy bájt, hogy malloc
Most találtam nekem azzal, hogy felkéri az operációs rendszer.
>> Most Eközben vonal négy itt, a * x = 42.
Csak hogy világos legyen, mi folyik odalent?
A bal oldali, * x.
ez olyan, mintha * 33 Oxford Street.
Így * x mit jelent?
>> Közönség: Menj a.
>> David J. MALAN: Menj arra a címre.
Bárhol is darab memória, megy hozzá.
És tedd, hogy mi van, nyilván?
Közönség: 42.
David J. MALAN: 42.
Rendben, * y, ugyanezt a gondolatot.
Menj a címre y.
Tegye a 13-as szám van, de mi az y ebben a pillanatban?
Közönség: nincs memória y.
David J. MALAN: Van nincs memória y.
Szóval mit y valószínűleg tartalmaz, ahogy azt már mondtam?
>> Közönség: Garbage.
>> David J. MALAN: Néhány szemét érték.
Most, szemét az érték még mindig egy szám.
Akkor még lehet összetéveszteni egy címet.
Olyan, mintha valaki felírta valamit le,
és tévesen értelmezte ezt a bekezdését néhány épület az utcán.
És ha csak megpróbál bemenni néhány épület nem a saját,
vagy néhány darab memória van nem volt adott, rossz dolgok történnek.
Számítógép lehet, lezuhan, vagy valami más meghatározatlan viselkedés megtörténhet.
>> Tehát az intro, akkor a Muci ez.
Még mindig emlékszem, 20 néhány furcsa évvel később,
hol voltam, amikor végre megértette mutatók.
>> Ami azt jelenti, ha hagyjuk itt három perc alatt
és hiszem, hogy nem megérteni mutatók, észre
Már emlékezett 20 évben valamilyen őrült oknál fogva
mikor és miért végül elsüllyedt az ül az én tanítási
ember, Nishat Mehta a Vissza az Eliot étkezőben.
Most, Eszembe jutott , mert ez volt
az egyik téma I, a különös, küzdött.
És akkor végül kattintott, mint merem állítani, sok téma
végül is.
És most, hogy hogy érzi magát a boldogabb és annál inkább meggyőző,
vessünk egy utolsó pillantást a mi utolsó három percben itt Muci,
barátunk, Nick Parlante a Stanford.
>> [Videolejátszás]
>> Hé, Muci.
Ébredj fel!
Itt az ideje a mutató móka.
>> Mi az?
Tudjon meg többet a mutatók?
Oh, nagyszerű!
>> Nos, az induláshoz, azt hiszem vagyunk Szükségem lesz egy pár mutatók.
>> -OK.
Ez a kód mellé két mutató, amely pont egész.
-OK.
Nos, látom a két mutató, de Nem úgy tűnik, hogy mutat valamit.
>> -Ez Jobb.
Kezdetben, pointerek nem mutatnak semmit.
Dolog, amit mutatnak az úgynevezett pointees, és számukra a kialakításukban a
egy külön lépésben.
>> Ó, jobb, jobb.
Tudtam, hogy.
A pointees külön.
Ööö, így hogyan osztja a pointee?
>> -OK.
Nos, ezt a kódot oszt egy új egész pointee,
és ez a rész az x, hogy pont azt.
>> Hé, hogy jobban néz ki.
Tehát, hogy csinál valamit.
>> -OK.
Én dereference a mutatót x tárolja a szám 42 bele pointee.
Mert ez a trükk, szükségem lesz a Varázspálca a Dereferencing.
>> -El Varázspálca a Dereferencing?
Hogy-- ez nagyszerű.
>> -Ez Mi a kód így néz ki.
Én csak létre a számot, és a [POP]
>> Hé, figyelj.
Ott megy.
>> Szóval ezzel a hivatkozás feloldási be x következik a nyíl, hogy hozzáférjen az pointee.
Ebben az esetben, a bolt 42 oda.
Hé, próbálja meg, hogy a szám tárolásához 13. a másik mutató, y.
>> -OK.
Megyek ide, hogy y, és kap a 13-as szám létre.
És akkor, hogy a Mágus a Dereferencing és csak [BUZZ]
>> Ó!
>> Ó, hé!
Ez nem működik.
Azt mondják, Muci, nem hiszem dereferencing y egy jó ötlet, mert tudod,
létrehozása a pointee egy külön lépésben.
És nem hiszem, hogy valaha is tette.
>> Jó pont.
Igen.
Mi juttatott a mutató y, de sosem azt, hogy pont a pointee.
>> -nagyon Figyelmes.
Hé, te jól nézel ki ott, Muci.
Meg tudod javítani, hogy y pont azonos pointee mint x?
>> Persze.
Fogom használni a Varázspálca mutató kiosztása.
>> -Ez Lesz A probléma, mint korábban?
Nem.
Ez nem érinti a pointees.
Csak változik egy mutatót pont ugyanaz, mint a másik.
>> Ó, értem.
Most y pont ugyanazon a helyen, mint x.
Így várni.
Most, y rögzített.
Ez egy pointee.
Így próbálja a Mágus a Dereferencing ismét elküldeni a 13-át.
>> Uh, OK.
Itt megy. [POP]
>> Hé, ezt nézd meg.
Most dereferencing működik y.
És mivel a mutatók osztoznak hogy az egyik pointee, mindketten lásd a 13..
Igen.
Megosztása, bármi.
Így fogunk felcserélődnek most?
>> Ó, nézd.
Kifutunk az időből.
>> -But--
>> -Csak Emlékszik a három mutató szabályokat.
Number One, az alapvető struktúra az, hogy van egy mutató,
és mutat át a pointee.
De a mutató és a pointee külön,
és a közös hiba hogy hozzanak létre egy mutatót,
hanem elfelejteni, hogy ez egy pointee.
>> Number Two, mutató dereferencing indul a mutató
és követi a nyíl felett eléréséhez a pointee.
Mint azt mindannyian tudjuk, ez csak akkor működik, ha van
a pointee, hogy milyen tér vissza az szabály.
>> Number Three, mutató feladat úgy egy mutató
és megváltoztatja azt, hogy pont a ugyanaz pointee egy másik mutató.
Tehát miután a feladat, a két mutató
majd ugyanarra a pointee.
Néha, hogy hívják megosztását.
És ez minden van rá, tényleg.
Viszlát most.
[END Videolejátszás]
David J. MALAN: Ez az a CS50.
Látni fogjuk, hogy a jövő héten.