[Muusika mängimine] DAVID J. Humala: Olgu. See on CS50 ja see on lõpuks neljas nädal. Ja üks teemadest täna on see, et digitaalse kohtuekspertiisi, kunst taastumas teavet. Ja tõepoolest, kuigi sa oled keset praegu rahu Three ja Breakout, järgmisel nädalal Keskendutakse Just selles valdkonnas. Nii et üks lahedam töökohad ma kunagi olid vanasti oli lõpetanud kooli, kui ma töötasin kohaliku Middlesex County District Attorney kontor, teeme ekspertiisi tegema. Nii et sisuliselt, Massachusetts Riigipolitsei, kohati kui tööd juhtudel oleks tuua asju nagu kõvakettad ja disketid ja mälukaardid jms. Ja nad annavad need Mulle ja mu mentor, ja meie eesmärk oli leida tõendeid, kui seal oli, on need meedias. Nüüd võite näinud vilksamisi Selle maailma kohtuekspertiisi meedias, telesaateid ja filme. Aga töö oli mul, ja daresay et maailm, ei ole päris nagu sa näeksid seda. Võtame pilk olete ilmselt näinud. [VIDEO PLAYBACK] -OK. Nüüd lähme hea pilk teile. [Muusika mängimine] Hoia seda. Vii see tagasi. Oota üks hetk. Mine õige. Seal. Freeze et. -Full-Ekraan. -OK. Freeze et. -Tighten Üles, et sa? -Vector Sisse, et mees poolt tagarattal. -ZOOM Aastal siinsamas kohapeal. Hindajaks õige varustus, pilti saab suurendada ja teritatud. Mis see on? -See Suurendamise programmi. Kas sa selge, et kuni kõik? Ma ei tea. Olgem suurendada seda. -Enhance Jagu A6. Ma täiustatud detail ja-- Ma arvan, et seal on piisavalt suurendada. Vabastage see, et mu ekraanil. Ma täiustatud peegeldus oma silmaga. -Ärme Käivitada läbi video lisaseadmega. -Edgar, Saate suurendada seda? Oodake veidi. -Mind Tööd selle peegeldus. Seal on kellegi peegeldus. Peegelduvusega. Seal on peegeldus mehe nägu. -The Peegeldus! Seal on peegeldus. -ZOOM Sisse peegel. Näete peegeldus. Kas sa saad parema pildi siit? Kas sa saad parandada seda? Kas sa saad parandada seda? Kas me võime sisse parandada seda? Kas sa saad parandada seda? Oota üks hetk. Ma suurendada. -ZOOM Sisse uksele. -Times 10. -ZOOM. -Liikuge. -Rohkem. Oota, peatus. Lõpeta. -Pause Ta. -Keerake Meil ​​75 kraadi ümber vertikaaltelje, palun. Lõpeta. Mine tagasi osa umbes uks uuesti. -Saite Pildi tugevdaja, mis võib bitmap? Võibolla saame kasutada Pradeep Singh meetod näha arvesse aknad. -The Tarkvara on nüüdisaegse. -The Eigenvalue on välja lülitatud. Hindajaks õigus kombinatsioon algorithms-- Ta on võtnud valgustus algoritme järgmisele tasemele, ja ma ei saa neid kasutada suurendab see foto. Lukustage kohta ja suuremalt z-telg. -Enhance. Tõsta. -Enhance. Seis ja parandada. [END VIDEO PLAYBACK] DAVID J. Humala: Nii et need on kõik sõnad, kuid need ei olnud lausetes õigesti. Ja tõepoolest tulevikus igal ajal, Palun, kas sa kuuled kedagi ütlemas sõna "Parandada", itsitama natuke. Sest kui sa püüad parandada, Näiteks see, mis juhtub. Nii et siin on ilus pilt. See on CS50 enda Daven. Ja arvan, et me tahtsime keskenduda twinkle oma silmaga, või peegeldus paha poiss, et oli selgelt pildistatud turvakaamera. See juhtub siis, kui sa suumida pilti on ainult piiratud arv bittide sellega seotud. See on see, mida sa saad. Ja tõepoolest, ka Daven silma on vaid neli, võibolla kuus pikslit et kirjutada täpselt, mida oli kume seal. Nii Ülesanded Neli lõpuks on te avastada seda maailma, eriti olemuselt midagi me nimetame faili I / O, kus I / O on lihtsalt fancy viis öeldes, sisend ja väljund. Nii et seni on kõik interaktsioonid oleme olnud koos arvutiga on suures osas oma klaviatuuri ja ekraani, kuid mitte nii palju koos kõvaketta, või säästa faile üle need, mida ise kirjutada. Teie programmid seni on ei ole luues ja salvestades, ja ajakohastada oma faile. Noh, mis on fail? Noh, midagi nagu JPEG. See on pilt, mida võiks on või üles laadida Facebook, või näha kõikjal veebis. Tõepoolest, et foto me lihtsalt Saag on Daven oli JPEG. Ja mis on huvitav umbes faile nagu JPEG on, et neid saab identifitseerida Tavaliselt teatud mustrid bitti. Teisisõnu, mis on see, et eristab JPEG alates GIF alates ping Word dokument Exceli fail? Noh, see on lihtsalt erinevad mustrid bitti. Ja need erinevad mustrid tavaliselt alguses neid faile. Nii et kui arvuti avab Word doc, või kui arvuti avaneb JPEG, tundub tüüpiliselt Esimene mitu bitti fail. Ja kui ta tunnistab, muster, ta ütleb, oh, see on pilt. Lubage mul näidata seda kasutaja on graafiline. Või, oh, see näeb välja nagu Word doc. Las ma näitan seda, et kasutaja on essee. Nii näiteks JPEG, Selgub, et on üsna keerukas all kapuuts. Kuid esimesed kolm baiti enamikus iga JPEG algavad need kolm numbrit. Nii bait null, üks, kaks on, välja Peaaegu iga JPEG, 255, seejärel number 216, siis nr 255. Ja mida sa pead olema võimeline algust teha järgmisel nädalal tegelikult poking all kapuuts faile nagu JPEG ja nagu bitmap faili, ja nähes mis on alati olemas olnud nii kaua kui olete olnud arvuti abil. Aga mis seal on, ei ole tavaliselt kirjutatud nagu koma numbrid niimoodi. Arvuti Teadlased ei kipuvad rääkima koma. Nad tõesti ei räägi kahendsüsteemis. Tavaliselt, kui me tahame väljendada numbrid me tegelikult kasutada kuueteistkümnendsüsteemi, mida te võib-olla mäletate , ütleme, Ülesanded Üks, mis vaidlustas sa mõelda muud süsteemi. Me muidugi tunnevad koos kohaga, nullist üheksani. Rääkisime binaarne. Ja me tõesti ei ole kasutada, et palju siin aasta läbi, sest arvuteid kasutame seda. Aga programmeerijad väga tihti, kuid mitte alati, kasutada kuueteistkümnendsüsteemi, mis tähendab lihtsalt teil on 16 tähte oma tähestik, erinevalt kahest või 10. Niisiis, kuidas sa loota, et kõrgemat kui üheksa kuueteistkümnendsüsteemis? Sa mine 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, vaid kokkuleppeliselt. Aga mis peamine on see, et iga neist on üks sümbol. Puuduvad 10. Puuduvad 11, per se, sest iga oma numbrit, just nagu kohaga ja just nagu binaarsed, tuleb lihtsalt olema üks sümbol, kokkuleppeliselt. Nii et siis on tähestiku meil meie käsutuses kuueteistkümnendsüsteemis. Mis siis JPEG nägema, kui sa kirjutaks välja need esimesed kolm baidid ei kohaga, kuid Näiteks kuueteistkümnendsüsteemi? Ja miks on hex isegi kõik, mis kasulik? Noh, kiire pilk näiteks. Nii et kui ma kirjutan välja bitti, mis esindavad need kohaga numbers-- see võib olla natuke roostes Nüüd alates paar nädalat tagasi kuid vasakpoolne ja õige on üsna lihtne. 255 oli suurim number me võiks olla kaheksa bitti. See kõik oli ones. Nii et ainus, mis on kergelt Huvitav on keskel üks. Ja kui sa sellist tegema läbi matemaatikat, siis järeldada, et tõepoolest, et struktuuris ühe ja nulle esindab 216. Nii et olgem lihtsalt soetama nüüd, et need on õiged. Aga miks on see huvitav? Noh, bait, muidugi, on kaheksa bitti. Ja selgub, et kui te arvate, on bait kahe tükkideks neli bitti, niimoodi. Lubage mul lisada mõned ruumi. Nii et enne, pärast. Ma olen lihtsalt lisada tühikut visualiseerimiseks hoidku siit. Kuidas võiks me nüüd esindame, ütleme, kuueteistkümnendsüsteemis iga quad bittide, Iga komplekt nelja bitti? Nii näiteks on vasakul Nüüd on meil 1111 kahendsüsteemis. Mis on see, et number koma, kui sa läbi matemaatika? Teil on need olemas, kahed koht, püksid koht ja kaheksad koht. Sihtrühm: 15. DAVID J. Humala: On 15. Nii et kui me teeme kaheksa pluss neli pluss kaks pluss üks, saame 15. Nii et ma võiks kirjutada 15 alla 1111, kuid mõte siin on kuueteistkümnendsüsteemis, mitte koma. Nii et selle asemel, et kirjutada alla 15, 1-5, Ma kirjutan, et hex, mis, kui te arvate tagasi, kui teil on nullist f, mis on 15 läheb? Sihtrühm: f. DAVID J. Humala: Nii selgub see on f. Ja saab tööd, et välja öelda, Noh, kui on 10, siis OK, f 15. Nii et tõesti, me võime kirjutada Selle samad numbrid nagu f f. Ja siis, kui me teeme natuke matemaatikat, me järeldada, et see on d. Kaheksa on üsna lihtne, sest me on üks kaheksandikud kohas. Ja siis on meil veel paar f f on. Niisiis, mida inimesed kipuvad tegema kokkuleppeliselt kui nad kasutavad kuueteistkümnendsüsteemis on nad lihtsalt kirjutan seda veidi lühidalt vabaneda enamik, et valge ruum. Ja lihtsalt olla super selge lugejatele, et see on kuueteistkümnendsüsteemis, lihtne konventsiooni vahel Inimestel on teil kirjutada null x, mis ei ole mõtet teiste kui visuaalne tunnus, siin on arvuna. Ja siis paned kaks numbrit, f f antud juhul siis d, siis f f. Nii pikk lugu lühike, kuueteistkümnendsüsteemi lihtsalt kipub olema kasulik, sest iga selle numbrit, nullist f, täiesti read üles struktuuris neli bitti. Nii et kui sul on kaks kuueteistkümnendarvudega, nullist F, ja jälle, mis annab sulle täiesti kaheksa bitti või ühe baidi. Nii et miks see kipub olla tavapäraselt kasulik. Pole mingit intellektuaalset sisu on tõesti kaugemale, peale selle tegelikku kasulikkust. Nüüd JPEG ei ole ainus failiformaate graafika. Sa võiks meenutada, et on olemas faile nagu seda maailmas, vähemalt alates paar aastat tagasi. Nii et see oli tegelikult paigaldatud Windows XP miljoneid arvuteid üle maailma. Ja see oli bitmap faili, BMP. Ja bitmap fail, nagu näete järgmisel nädal, tähendab lihtsalt muster dots, pikslite neid kutsutakse, kaart bitti, tõesti. Mis on huvitav, kuigi selle faili formaat, BMP, on et all kapuuts, see on rohkem kui lihtsalt kolm baiti et koostada selle kaudu, et rääkida, esimesed paar hammustab. See tegelikult tundub veidi keeruline esimesel pilgul. Ja te näete seda P komplekti. Ja saada midagi eelkõige sellest nüüd ei ole nii oluline, sest vaid asjaolu et alguses iga bitmapi fail, graafiline formaat, seal on terve hunnik numbreid. Nüüd Microsoft, autor seda formaati, kipub helistada neile asjad ei ints ja tähemärki ja ujub aga sõnad ja d sõnad ja igatseb ja baiti. Nii et nad on lihtsalt erinevad andmetüübid. Nad erinevad nimed sama asi. Aga näete, et P, neli. Aga see on ainult öelda, et kui inimese topelt-klõpsuga mõned BMP fail oma või tema kõvaketas ja aken üles näidates teda, et pilt, mis juhtus, sest operatsioonisüsteemi süsteem ilmselt märganud, mitte ainult BMP faililaiend faili nimi, vaid ka asjaolu, et seal on mõned konventsiooni muster bitti alguses Selle bitmap faili. Kuid olgem nüüd keskenduma selline keeruline faili kohta, vaid midagi sellist. Oletame siin gedit, I lihtsalt algus on programm, mis on üsna lihtne. Mul on ka üleval. Nüüd ma sain # include "structs.h", kuid Ma tulen tagasi, et hetkel. Kuid see on kasulik praegu. Nii et see on programm, mis toimub rakendada nagu registripidajale andmebaasis. Nii andmebaasi õpilased, ja iga õpilane maailmas on nimi ja maja ja ilmselt mõned muud kraami, kuid me hoida lihtsa. Iga õpilane on oma nimi ja maja. Nii et kui ma tahtsin kirjutada programm, mille eesmärk elus just itereerima alates null kuni kolm, kui seal on kolm õpilast Harvardi ülikoolis. Ja ma lihtsalt tahan, kasutades getString, iga õpilase nimi ja maja, ja siis lihtsalt printida need välja. See on omamoodi nagu nädal Üks, teine ​​nädal värk nüüd, kui ma lihtsalt tahan jaoks loop või midagi sellist. Ja ma tahan, et helistada getString mõne korda ja seejärel printida f paar korda. Niisiis, kuidas oleks mul seda teha, kuigi, kui mõlemad nimi ja maja on kaasatud iga õpilane? Nii et minu esimene instinkt võiks olla midagi sellist. Ma võin kõigepealt öelda, noh, mulle, öelda, massiivi stringe nimega nimed. Ja ma ei taha hardcode kolm siin. Mida ma tahan, et sinna pannakse? Nii õpilased, sest see on just pidev kuulutatud ülaosas, lihtsalt, et ma ei pea hardcode kolm mitmes kohas. Nii, ma ei saa seda muuta ühes kohas, ja see mõjutab muutus kõikjal. Ja siis ma võiks teha string maja õpilastele. Ja nüüd, ma võiks teha midagi jaoks (int i = 0; i <üliõpilast i ++. Nii et ma olen masinakirja kiire, kuid see on ilmselt tuttav süntaks nüüd. Ja nüüd oli see uuemate. Kui ma tahan panna i-nda õpilase nimi, ma arvan, et ma seda teen. Ja siis ei ole nimedega kuid maja ümbritsevad i. Ma teen seda, getString ja lase mul minna tagasi ja määrata see rida. Nõus? Ei ole nõus? See ei ole väga kasutajasõbralik. Ma ei öelnud kasutaja, mida teha. Aga nüüd, kui ma ka tahtis hiljem, olgem ütleme, printida need asjad minemas-- nii TODO hiljem. Ma lähen tegema rohkem seda-- see vaieldamatult tähendab nõuetekohase rakendamise saada nimed ja maja, kolm neist kokku iga alates alla. Kuid see ei ole väga hea disain, eks? Mis siis, kui üliõpilane ei ole lihtsalt nimi ja maja, kuid ka ID number, ja telefoninumber ja e-posti aadress, ja võibolla kodulehekülg ja võibolla Twitter käepide, ja iga rida teisi üksikasju seotud õpilase või isik, üldisemalt. Kuidas me hakkame lisama funktsionaalsust selle programmiga? Noh, ma tunnen, et lihtsaim viis võiks olla midagi nagu, ütleme, int IDS õpilastele. Nii et ma panen kõik oma ID-sinna. Ja siis midagi nagu telefoninumbrid, Ma ei ole kindel, kuidas esindavad, et veel. Nii et lähme edasi ja helista Selle twitters õpilast, mis on natuke imelik, aga-- ja hunnik rohkem välju. Olen hakanud tõhusalt kopeeri ja kleebi siia. Ja see läheb kasvama päris kohmakas päris kiiresti, eks? Kas poleks tore, kui seal oli maailma andmestruktuur teada mitte int või string, kuid midagi kõrgemal tasemel, abstraktsioon, nii rääkida, mida tuntakse õpilane? C ei tulnud koos sisseehitatud funktsionaalsus õpilastele, aga mis siis, kui ma tahtsin, et anda see selline? Noh, selgub, ma lähen avage fail nimega structs.h siin ja mida saate teha just nii. Ja me ei kavatse hakata seda praegu teevad. Ja all kapuuts P Set Three, sa oled juba seda teinud nüüd. Ei ole olemas sellist asja nagu g ristkülik või g ovaalsed programmeerimiskeeles C. Folks at Stanford rakendada neid andmetüübid, kasutades sellist lähenemist siin deklareerides oma uute andmete tüüpi kasutades uut märksõna nimetatakse struct ja muu üks nn typedef. Ja tõepoolest, kuigi süntaks tundub veidi erinevad asjad oleme näinud varem, Põhimõtteliselt see on super lihtne. See tähendab lihtsalt, et "määratleda tüüp." See saab olema struktuuri ja struktuuri on nagu konteiner mitme asja. Ja see struktuur läheb on string nimetatakse nimi ja string nimega maja. Ja olgem helistada, lihtsalt mugavusest kogu see andmestruktuur õpilane. Nii et hetkel sa saad semikoolon, teil on nüüd loonud oma andmed tüüp nimega üliõpilane mis nüüd seisab kõrvuti int, ja float, ja char, ja string, ja g ristkülik, ja g ovaalsed, ja mis tahes arv muid asju inimesed on leiutanud. Mis on kasulik selle Nüüd on see, et kui ma lähen tagasi et struct 0 ja lõpetada see rakendamist, mis ma kirjutasin eelnevalt siin, märkate, et kõik paratamatu segadus, et oli algamas juhtub kui ma lisasin telefoninumbreid ja twitters ja kõik need muud asjad õpilase määratlus, nüüd on tabavalt tõmmati lihtsalt üks massiiv õpilastele. Ja kõik need õpilased nüüd on mitu asja sees on. Nii et lihtsalt jätab ühe küsimuse. Kuidas sa selle nime juures, ja maja, ja ID, ja mis iganes on sees õpilane? Super lihtne, samuti. Uus süntaks, kuid lihtne idee. Sa lihtsalt indeks arvesse massiiv, nagu tegime eelmisel nädalal ja see. Ja mis on selgelt uus tükk süntaks? Just., Mis tähendab "sisse minna struktuur ja saage Väli nimi, saada Väli maja, saada Väli õpilane. " Nii et P Set Three, kui sa oled veel töötan selle kallal, ja kõige vanemad veel on, aru, et kui sa hakata asju g rects ja g ovaali ja muid asju, mis ei tundu pärit Week null, üks või kaks, aru, et see on sellepärast, Stanford deklareeritud uusi andmetüüpe. Ja tõepoolest, see on täpselt see, mida jagame teha, samuti, P, neli, kui hakkame tegelema asjad nagu pildid, rasterpiltidena ja palju muud. Nii et see on lihtsalt teaser ja vaimne mudel, mis on tulemas. Nüüd ma viivitanud natuke hommikul. Mul oli selline uudishimulik näha, mida Microsoft tapeet tegelikult näeb välja nagu praegu. Ja selgub, et keegi aastal 2006 tegelikult läks peaaegu täpselt sama kohapeal pildistada tegelikkuses mida näeb, et nendel päevadel. Valdkonnas on nüüd veidi ülekasvanud. Nii võib öelda nüüd pilte, lähme tagasi tuua Daven siin ekraanil ja Nicholas, ja lihtsalt meelde tuletada, et kui soovite meiega liituda lõunaks sel reedel, pea meie tavaline URL siin. Kust siis jätame välja esmaspäeval? Me tutvustas seda probleemi, eks? See oli ilmselt õige rakendamise swap, mille sa võtad kaks ints, ühe nimega, üks nn B vahetada neid, nagu Laura tegi siin laval piima ja veega, kasutades ajutist muutuja, või tühi tass, nii et me võiks panna B ja in b tegemata jamasid. Me kasutasime muutuja. Seda nimetatakse temp. Aga mis oli põhiline Probleemiks on see kood esmaspäeval? Mis oli probleem? Jah. Sihtrühm: See võtab rohkem ruumi. DAVID J. Humala: võtab rohkem ruum, sest ma kasutan muutuja, ja see on OK. See on tõsi, aga ma olen kavatse öelda, et see on OK. See on ainult 32 bitti grand kava asju, nii et ei ole suur asi. Muud mõtted? Sihtrühm: See ainult vahetuslepingud muutujad kohapeal. DAVID J. Humala: Täpselt. See ainult vahetab muutujad kohapeal. Sest iga kord, kui helistada funktsioon-- kui mul oli salved Annenberg Viimane kord, teil on peamised põhjale. Niipea, kui te helistate funktsiooni nimetatakse swap swap ei saa x ja y, algväärtused. Mida swap get, kas me väita? Sihtrühm: koopiad. DAVID J. Humala: Nii neist koopiaid. Seega saab üks ja kaks, kui te meenutada näiteks viimane kord, kuid koopia üks ja kaks mis on edukalt vahetada. Aga kahjuks lõpuks need väärtused on ikka sama. Nii näeme seda meie uus sõber, loodetavasti GDB, et teie või TFs ja CA on juhtinud sa poole järgmiselt. Nii ei swap turult välja nagu-- olgem avada see-- näeb välja selline. Me vormindatud x ühe, y kahele. Oli hunnik print f on. Aga siis, võti kõne siin oli vahetada, mis Just kood me nägin just hetk tagasi. Milline on õige esimesel lühidalt, kuid funktsionaalselt, see programm ei tööta, sest see ei ole püsivalt vahetada x ja y. Vaatame seda, kiire soe siin koos GDB, ./noswap. Hunnik valdav teavet, mis Ma vabaneda juhtimisega L praegu. Ja nüüd, ma lähen edasi minna ja käivitada. Ja kahjuks, et ei olnud, et kasulik. Ta jooksis programm sees käesoleva programmi nimega GDB, siluri, kuid ta ei lasknud mind tuhnima. Niisiis, kuidas ma tegelikult pausi täitmise sees selle programmi? Nii murda. Ja ma võiks murda mis tahes reanumbril üks, 10, 15. Aga ma ei saa ka murda sümboolselt öeldes break peamine. Ja mis teeb edasi murda punkt, ilmselt real 16 peamine. Ja kus on line 16? Lähme kuni koodi ja minna kuni noswap. Ja tõepoolest, rida 16 on Kõige esimene programmis. Nüüd, kui ma edasi minna ja tüüp joosta seekord Enter, see peatub. Nii et olgem tuhnima. Prindi x-- miks on x null? Ja ignoreerida dollari märk. See on lihtsalt huviline kasutuse programmi. Miks on x null hetkel? Jah. Sihtrühm: See peatus vahetult enne line 16, tegelikult on line 16. DAVID J. Humala: Täpselt. GDB, vaikimisi on peatatud täitmise vahetult enne line 16. Nii et see ei ole täidetud, mis tähendab, et x on mõne tundmatu väärtus. Ja meil vedas, et see on midagi puhas nagu null. Nüüd, kui ma järgmisena, nüüd ta hukati 16. Ta ootab mind täita 17. Lubage mul minna ja print x. See on üks. Lubage mul minna ja print y. Mida ma peaksin nüüd näha? Sihtrühm: [kuuldamatu] DAVID J. Humala: veidi valjem. Sihtrühm: [kuuldamatu] DAVID J. Humala: Mitte päris üksmeel. Nii et jah, me näeme mõned prügi väärtus. Nüüd, y on 134514064 seal. Noh, see on lihtsalt mingi prügi väärtus. Minu programm kasutab RAM erinevatel eesmärkidel. Seal on muid funktsioone. Teised inimesed kirjutas sees minu arvutis. Nii et need bitid on kasutatud muid väärtusi, ja mida ma näen on jäänuseid mõned enne kasutamist, et mälu. Nii et ei ole suur asi, sest niipea nagu ma järgmisena ja seejärel printida y, see lähtestatakse väärtus, mida ma tahan. Nii et nüüd, lähme edasi natuke kiiremini. N järgmisel. Teeme seda uuesti. Teeme seda uuesti. Aga ma ei taha lüüa see siin, sest kui ma tahan näha, mis toimub sees swap, milline on käsk? Sihtrühm: sammud. DAVID J. Humala: sammud. Nii et see samme mind funktsiooni, mitte üle. Ja nüüd, et see on natuke segasena ausalt, kuid see on vaid mulle Olen line 33 nüüd. Ja teeme seda jälle. Prindi temp. Garbage väärtus langeb sel ajal aga see on lihtsalt veel prügi väärtus. Teeme kõrval, print temp. See on vormindatud 1, mis oli väärtus x, aka. Nüüd, kus oleme meie ja X tuleb? Noh, teate peamine, me nimetatakse neid väärtusi x ja y. Siis andis need vahetada järgmiselt. X oli enne, koma y. Ja siis, swap neid kutsuda x ja y. Aga selgus, et see on kutsudes neid ja b. Aga a ja b on nüüd hakkab olema koopiate x ja y, vastavalt. Nii et kui ma lähen tagasi GDB, temp Nüüd on üks ja on nüüd üks. Aga kui ma edasi tegema ja nüüd teha print , on juba üle läinud. On piima valatakse endise apelsinimahl klaasile või vastupidi. Ja kui ma järgmine kord, ja nüüd kui ma välja printida kui mõistuse kontrolli, on veel kaks, aga b nüüd üks. Ausalt, see on ikka seal. Mind ei huvita, mis temp on. Aga niipea, kui ma nüüd kirjutad, ütleme, jätkuvalt, et minna tagasi, nüüd ma olen lõpus programm. Ja kahjuks, x on veel ühe ja y on endiselt kaks. Mis siis oli kasulikkust GDB on? See ei aidanud mind parandada probleem iseenesest, kuid loodetavasti aitab mind aru realiseerimisel et jah, minu loogika on õige, kuid minu kood ei ole lõpuks võttes püsiv mõju. Nii et see on probleem, millega me oleme läheb nüüd lahendada täna. Aga lähme sinna teel seda. String on vale. Ka see ei ole andmetüüp mis eksisteerib C. See olnud sünonüümina mõned aega midagi muud, ja me ei ilmnenud, et järgmine. Lubage mul minna ja avada programmi nimega võrrelda-0. Ja selle asemel, kirjuta see välja, hakkame kõndida läbi kood Ma juba kirjutasin, kuid see on ainult paar rida. Nii et see on võrrelda-0. Ja esimene asi, mida ma teen muutub rida teksti. Aga teate, mida ma olen teeme esmakordselt. Mis on erinevad selgelt umbes liin 21? Tegelikult, oota. See on koopia kaks. See ei ole isegi õige programm. Olgu, spoiler tähelepanelik. Olgu, vahet pole, mis. See on vastus tuleviku küsimuse. Siin on võrrelda-0, ja ma olen umbes saada rida teksti. Programmi palju lihtsam. Nii et see on lihtne. See on nagu esimene nädal, teine ​​nädal stuff hetkel. string s = getString. Ma ütlen seda uuesti siin. string t = getString. Ja siis viimane asi, mida selles programm, nagu nimigi ütleb, on Ma lähen, et proovida neid võrrelda. Nii et kui te esimest string, võrdub = t, siis ma olen ütlen kirjutad sama asja. Else, ma ütlen kirjutad erinevaid asju. Nii et olgem kompileerida ja käivitada see programm. Nii et võrrelda null. Näeb hea välja. No koostamise vigu. Lubage mul minna nüüd ja tippige ./compare-0. Lubage mul minna ja midagi öelda : Daven ja midagi: Rob. Ja ma tüüpi erinevaid asju. Siiani nii hea. Programm tundub olevat õige. Kuid olgem joosta see uuesti. Ütle midagi: Gabe. Ütle midagi: Gabe. Olgu. Võib-olla ma tabanud tühikut või midagi funky. Teeme seda uuesti. Nii Zamyla. Zamyla. Erinevad asjad. Mis siis toimub? Nii et meil on need kaks rida kood, getString kutsutakse kaks korda. Ja siis ma lihtsalt püüavad võrrelda s ja t. Aga mis tegelikult siis toimub? Noh, minu käekiri hakkab lihunik see näiteks mõnevõrra. Ja olgem tegelikult visata see siia üles ka. Nii et meil on rida nagu string s = getString. Nii et see on lihtsalt esimene huvitav joont, et programm. Aga mida see kõik aega olnud toimub all kapuuts? Noh, vasakul servas on string, mis on teatud tüüpi muutuja ja seda nimetatakse s. Nii et ma tean, et see kasutab mälu, või RAM minu arvuti kuidagi. Nii et ma lähen abstraktselt juhtida, et ruut. 32 bitti, selgub, kuid rohkem sellest tulevikus. Ja siis, mis toimub siin? Noh, getString ilmselt saab string kasutaja. Ja getString sai Zamyla või Gabe või Daven. Nii et olgem valida esimese need, mis oli Daven. Nii et tegelikult, mida getString sai mulle, et esimesel juhul oli D-a-v-e-n. Ja siis, mida veel ei see annab mulle salaja? Sihtrühm: [kuuldamatu] DAVID J. Humala: Jah, / 0 või null iseloomu. Nii et tegelikult andis mulle string. Aga me juba teame eelmisest tundub, et string on lihtsalt massiivi märke, ja see lõpetatakse see eriline valvur iseloomuga / 0. Aga kui see on tõsi ja see on ruut, see on ilmselt palju suurem ristkülik. Ja tõepoolest, see on, Väidan, ainult 32 bitti. Ja see on selgelt rohkem kui 32 bitti, kuna see on ilmselt kaheksa pluss kaheksa pluss kaheksa pluss kaheksa pluss kaheksa, lihtsalt sellepärast, et baitide ASCII. Kuidas kuradit me sobitada Daven sellesse väike kast siin? Noh, mis on getString tegelikult teeb? Noh, see võre esindab siin minu arvuti mälu või muutmälu. Nii et olgem suvaliselt öelda, et kui Iga neist tähistab bait, siis me ei mõtle iga bait, millel on aadress, nagu 33 Oxford Street, või 34 Oxford Street, või 35 Oxford Street. Nii nagu kodu on aadressid ja hooned on aadressid, nii teha üksikute baitide mälu on aadressid või numbrid mis üheselt identifitseerib neid. Nii, see on meelevaldne. Kuid hoida lihtsa, ma lähen kasutada kuueteistkümnendsüsteemi lihtsalt kokkuleppeliselt, kuid 0x ei tähenda midagi muud kui "see on kuueteistkümnendsüsteemis." ja ma väita, et "D" jõuab kell bait Üks mällu. Ma sain midagi toimub mälu, nii Daven sai esimese koha kell bait Üks. See on siis läheb 0x2. See läheb 0x3. See saab olema 0x4. See läheb 0x5. See saab olema 0x6. Aga kui sa hakkad mõtlema sellest, mida arvuti teeb all kapuuts, te võite järeldada, kuidas mõned aastad tagasi, siis on rakendatud C ise. Mis on getString ilmselt returning-- sest see tundub, et see pole tagastamise Daven iseenesest sest ta kindlasti ei kavatse mahtuda see väike box-- Mis on getString tõenäoliselt naasmist? Sihtrühm: [kuuldamatu] DAVID J. Humala: asukoht Daven. Ja see on seda teinud kunagi, sest esimene nädal. Mis getString on tõesti naasmist ei ole string, per se. See on üks väike valge vale. Ta naasis aadress stringi mälu, unikaalne aadress. Daven elab 33 Oxford Street. Aga rohkem tabavalt, Gavin elab at 0x1, aadress Number One. Niisiis, mida saab panna selle väike kast siis peab olema selge, on lihtsalt aadress, et string. Niisiis kõik see aeg, seda on kestnud. Aga mida see vihjab Nüüd on see, et kui kõik s on on mitmeid sees on, kes teid peatada, programmeerija, paneks iga number iga muutuja ja lihtsalt hüpped selle patakas mälu? Ja tõepoolest, me näeme, see oht järgmine kord. Aga nüüd, see tundub ebapiisav. Kui ma ütlen, anna mulle string, sa annad mulle Daven. Aga sa tõesti ei anna mulle Daven. Kõik, mida mulle on Daven aadress. Kuidas ma siis tean kindlalt, kus Daven algab ja ends-- lugu on saada kummaline-- kus Daven algab ja lõpeb, ja seejärel, järgmisel stringi mälu hakkab? Noh, kui sa oled teisaldus mulle alguses Daven, sisuliselt, kuidas ma tean, kui lõpuks ta nimi on? See eriline null iseloomu, mis on eriti oluline nüüd kui stringid all kapuuts on lihtsalt tuvastatud üheselt nende asukohta mälus. Nii et kogu see aeg, mis on mis on kestnud. Nii et kui me vaatame praegu kood siia, selgitada kui sa oleks viga line 26. Miks on Zamyla ja Zamyla erinevad? Miks on Gabe ja Gabe erinevad? Jah, on tagasi. Sihtrühm: Need on erinevad aadressid. DAVID J. Humala: Lihtsalt sellepärast, neil on erinevad aadressid. Sest kui sa helistada getString uuesti, mida ma teen siin kiiresti, kui see on teine ​​rida, string t, kui ma tegin, et programmi võrdub teise kõne getString. Järgmine kord, kui ma kutsun GetString, ma lähen saada erinevat patakas mälu. GetString on lubatud küsida operatsioonisüsteemi süsteemi rohkem ja rohkem mälu. Ta ei kavatse uuesti sama kuus baiti iga kord. See läheb aina uusi patakas mälu, mis tähendab t ei hakka mõnda muud väärtust siin. Nii et kui ma s võrdub = t, et sa ei võrdle D vastu ja vastu seda ja V vastu. Sa Võrreldes seda selle vastu, mis ausalt öeldes on päris useful-- useless-- on üsna mõttetu, sest kes tegelikult hoolib, kui stringid on mälu? Ja tõepoolest, me ei ole. Ja me ei kavatse alustada eriti hooliv. Ainult sel määral, et vead võivad tekkida ja julgeolekuohtude võib tekkida tahe me tegelikult hakata hooli sellest. Nii et olgem probleemi lahendada. Selgub, siis kinnitage see super lihtsalt. Ja olgem tegelikult, enne kui ma selgub, et jälle, milline oleks sa teeksid, kui sisse CS50 klass, ja siis tuli rakendada võrdlemine kahe stringe. Sa ilmselgelt ei saa lihtsalt kasutada s võrdub = t. Aga loogiliselt, kuidas oleks võrrelda seda string Seda stringi kasutatakse C-koodi? Jah. Sihtrühm: Lihtsalt tee loop [kuuldamatu] DAVID J. Humala: Perfect. Sihtrühm: [kuuldamatu] DAVID J. Humala: Jah. Lihtsalt silmus või samas silmus või mis iganes. Aga kohaldatakse põhiidee, et kui see on patakas mälu või massiivi ja see on korrake üle mõlemad samal ajal. Ja lihtsalt võrrelda tähte. Ja sa pead olema natuke ettevaatlik, sest sa ei taha ühte sõrme minna mööda teiste sest üks string on pikem kui teised. Nii et sa lähed, et tahad, et kontrollida see eriline väärtus lõpus, null. Aga see tõesti on lõppu, nii lihtne. Ja ausalt öeldes, me ei vaja leiutada, et ratas. Siin on versioon kaks. Ja mida ma siin öelda, on see, et asemel võrreldakse s võrdub = t, Ma asemel ütlen, kui string võrdlemine s eralda t võrdub = 0. Nüüd, mis on string võrrelda? Selgub, et see on funktsioon, mis Kaasas C, kelle eesmärk elus on võrrelda kahe stringe. Ja sega võrrelda, kui me loeme oma man-leheküljelt või dokumente või CS50 viide, siis lihtsalt öelda, et segada võrrelda naaseb kas negatiivne number või positiivne arv või null, kus null tähendab, et nad võrdsed. Nii lihtsalt oletustele. Mis võiks see tähendab, kui sega võrrelda naaseb negatiivne väärtus või positiivne väärtus? Sihtrühm: Suurem või väiksem. DAVID J. Humala: Jah, suurem või väiksem. Nii et kui sa tahad, et sortida kogu hunnik stringid dictionary-- kui me lõpuks alla road-- täiuslik funktsiooni kasutada potentsiaalselt sest see läheb teha Võrdluseks stringide jaoks, ja öelda sa ei tuleb enne b, või ei b tulema enne tähestikulises järjekorras. Me võime teha just seda. Ja teate, ma tegin veel ühe asi selles näites. Mida muud on muutunud kõrgema kuni selles põhiülesanne? Char *. Ja see on see, et teiste hädavale. Kogu selle aja, kui olete Enda kirjutatud string, meil on salaja ümberkirjutamist stringi char * et rõkkama tegelikult mõistab sind. Teisisõnu on CS50.h ja kui me lõpuks näha, tegime sünonüümi nimega string see on sama asi nagu char *. Ja nüüd, tean ainult seda, et * Selles kontekstis vähemalt tähendab aadress. Aadress, mida? Noh, see, et ma ütlesin char *, mitte int * või float *, tähendab, et char * on aadress char. Nii et see väike kast siin, aka string, on tõesti tüüpi char * mis on lihtsalt fancy viis öelda, Selles lahtris lähevad aadress. Ja mida see aadress viidata? Ilmselt char. Kuid võib absoluutselt on int * ja muid asju. Aga nüüd, char * on tõesti kõige lihtne ja üks huvi. Nii et see probleem läheb tõusma, kuigi uuesti. Oletame, ma avada seda programmi. Vaatame, kas me saame nüüd ennustada mis sul viga on see kood. Nii et selles programmis, kopeeri-0, ma olen läheb minna ja uuesti helistada GetString ja hoida väärtus s. Ja siis, miks ma teen seda, lihtsalt meeldetuletuseks alates nädalat varem? Me ei öelda, et getString mõnikord tagastab null. Mida see tähendab, kui GetString tagastab null? Midagi läks valesti. See tähendab ilmselt, et string on liiga suur, arvuti mälu. See juhtub, super, super, super harva, kuid see võib juhtuda. Me tahame kontrollida seda, ja see on kõik, mis me teeme. Sest me näeme nüüd, kui sa seda ei tee alustada kontrollides tavaliselt asju nagu null, siis võib tegelikult alustada minna aadressidele mälu, mis on kehtetu. Ja sa lähed alustada indutseerivate rohkem killustatust vigu. Või Mac või PC, lihtsalt põhjustada arvuti hanguda või programmi külmutada, potentsiaalselt. Nii et nüüd ma väita copy-0.c, et ma lähen kopeerige need stringid teel Line 28. Ja siis ma lähen Nõudluspunktile allosas siin, et ma lähen muuta ühte neist. Nii et seda märgata. Ma kutsun meie vana sõber strlen. Ja lihtsalt seletada inglise keeles mida see rida 34 läheb? Mida t sulg 0 esindavad vasakul. Jah. Sihtrühm: Esimene iseloomu t? DAVID J. Humala: esimene märk t. Ongi kõik. Esimene täht t, ma tahan määrata suure algustähega versioon ning esimene märk t. Nii et see on ära esimene täht. Ja siis, kõige viimane asi, mida ma teha Selles programmis on Väidan siin originaal, S, ja siin on koopia, t. Aga mis põhineb lugu me lihtsalt rääkida, mida stringid tegelikult on, Mis on line 28 tegelikult teeb ja mida on Saadud viga läheb olema ekraanil? Nii et esimene, esimene küsimus, 28. Mis on string t = s tõesti teed? Kui meil on vasakul pool siin string t = s; mis annab mulle üks kast siin ja üks kast siin. Ja arvan, et see aadress on 0x, oletame, 50 seekord meelevaldselt. Mida string t = s seda all kapuuts? Sihtrühm: [kuuldamatu] DAVID J. Humala: See salvestab mälu tegeleda seal, nii et 0x50 läheb sinna. Nii et kui nüüd, ma lähen esimesena märk t ja suurtäheks see, Mida ma tegelikult tegema, et s? Ma tõesti teevad sama asja, eks? Sest kui Aadress 0x50-- ja lihtsalt, ma ei ole palju ruumi laual siin kuid eeldame, et see on 0x50 siia alla, kuskil minu arvuti mällu. Ja ma olen näiteks Gabe väiketähtedega siin niimoodi. Ja ma olen öelnud t sulg 0 saab kapitaliseeritud. Noh, t sulg 0 on esimene täht t. Nii vähe g läheb saada suur G. Aga probleem on, mida see s ka punkt, et? Sihtrühm: sama. DAVID J. Humala: täpselt sama asi. Nii lihtne selgitus ehk isegi kui süntaks on veidi imelik. Nii et teeme seda. Tee copy-0 ja siis ./copy-0. Ütle midagi: Gabe. Ja kahjuks on mõlemad praeguseks on need kapitaliseeritud, kuid selle aluseks Põhjusel, et me oleme lihtsalt Nüüd tegelevad aadressid. Niisiis, kuidas me hakkame address-- no pun intended-- kuidas me hakkame tegelema selle probleemiga? Noh, copy1.c, asjad lähevad saada veidi keerulisem. Aga ma väita, kontseptuaalselt lihtne lahendus. Nii raske saada esimesel pilgul. Ei saa lihtne olema esimese kord, kui sa kirjutad seda, võib-olla, aga kui probleem on see, et lihtsalt teeme t = s lihtsalt koopiad aadress, mida, uuesti, kui ma ei vali teid, saab olema lahendus eest tegelikult kopeerimine string? Sihtrühm: me ilmselt kasutage silmus uuesti. DAVID J. Humala: Jah. Nii et me vajame silmus uuesti. Ja kuna kui me tahame, et kopeerida string s teise string, me ilmselt tahad seda teha tähthaaval. Aga probleem on, kui see on algselt s nüüd peame hakkama selgesõnaliselt eraldades mälu t. Teisisõnu, olgem tõmmata seda viimast korda. Kui see on string s = getString. Ja paneme selle siia samuti. See on getString. Ja siis on pilt midagi niimoodi saab olema nagu enne, g--b-e / 0. See tundub natuke midagi sellist. Ja s seetõttu, et me nimetame seda 0x50, ja mis saab olema 51, 52. Nii et see on 0x50. Ja siis ma teen string t. Mälu, mis on lihtsalt läheb Andke mulle pisut kandiline niimoodi. Mis on oluline samm nüüd? Kui ma tahan kopeerida s arvesse t, mis tühi meil vaja täita siin? Või mida me peame teha kõrgel tasemel? Jah? Keegi? Jah. Sihtrühm: Peame [kuuldamatu]. DAVID J. Humala: Jah, me vaja täita see tühi. Ma ei saa kopeerida ja siis ära Gabe nimi kuni ma küsida operatsioonisüsteemi teise patakas mälu mis on vähemalt sama suur kui originaal. Nii et jätab meile küsimus. Kuidas küsida operatsioonisüsteemi ei lihtsalt lihtne vähe pointer-- nagu seda nimetatakse, aadress, pointer-- ei lihtsa väike kast nagu seda nimetatakse string? Kuidas küsida operatsioonisüsteemi süsteemi suur patakas mälu? Siiani olen ainult saanud, et tagasi kaudselt helistades getString. Niisiis, kuidas on getString isegi saada oma mälu? Noh, selgub, et seal on see teine ​​funktsioon siin et me nüüd seda kasutama hakata. Nüüd, see tundub nii rohkem segasena kui-- ja ma olen ainus, kes suudab näha Kui-- see rida tundub nii rohkem segasena siis peaks ta esimesel pilgul. Kuid olgem tease ta peale. Vasakul servas on mul char * t. Nii inglise, alustame sõnastada õige laused tehnilist kõnepruuki. Nii et see eraldab muutuja tüüpi char * nn t. Nüüd, mida see tegelikult tähendab? Noh, see tähendab, mida ma kavatsen panna see muutuja nimega t? Aadress char. Nii et see on lihtsalt lihtsam, mõistlikum viis kirjeldamiseks vasakul poolel. Nii et loob selle kasti siin ainult. Nii et paremal pool, arvatavasti läheb eraldada, et suurem patakas mälu, kuidas? Nii et olgem kiusupunn see peale. See on valdav esimesel pilgul aga mis sinu sees toimub siin? Esiteks, seal on malloc, mis Ilmselt on meie uus sõber "Mälu eraldada." Nii et see on argument möödutakse sinna, nii et see on päris suur argument. Nii et olgem kiusupunn see peale. strlen s loomulikult esindab selle-- Sihtrühm: tähemärkide arv. DAVID J. Humala: Just tähemärkide arv s. Nii pikkus s, algse stringi. Nii G--b-e. Nii et see on ilmselt neli käesolevas asjas. Miks ma teen 1 pärast kutsudes strlen s? Sihtrühm: [kuuldamatu] DAVID J. Humala: Sest et eriline null iseloomu. Kui te küsite minult, mis on pikkus Gabe nimi, ma ütlen neli. All kapuuts, aga mul on vaja et viies bait null iseloomu. Nii et miks ma teen 1. Nüüd igaks juhuks teil on see arvutiprogrammi muud kui, ütleme, CS50 seade, kus suurus paalia võivad olla erinevad minu enda computer-- Tuleb välja, et ma seda nimetada operaator tähistamaks, küsige arvutis Mis on suurus char selles arvutis? Ja korrutades viis selles näiteks suurus paalia, mis kõige arvutid ainult üks, malloc läheb eraldada mulle see suur patakas mälu üle siin paremal. Ja see läheb return-- see on funktsioon-- nii et see on läheb tagasi mida? Sihtrühm: aadress? DAVID J. Humala: aadress, mis? Sihtrühm: mälu on jaotatud? DAVID J. Humala: Of mälu on eraldatud. Nii et ma ei tea, ausalt, kui see läheb lõpuks. Ma lähen ettepaneku see läheb lõpuks on 0x88. Täiesti suvaline, kuid mujal kui 0x50, sest operatsioonisüsteem, mis Windows ja Mac OS minu jaoks teha, on veenduge, et see annab mulle erinevaid tükke RAM. Seega on see väärtus, kui see patakas mälu sattuda. Nii et see on see, mis jõuab siia, 0x88. Nii et nüüd selgelt, ma saan aru, et see ei ole sama kui seda sest nad osutavad eri tükkideks mälu. Nii et kui ma nüüd tegelikult soovid kopeerida seda aastal, teeme oma pakutud lahendus. Lähme, looma jaoks silmus, ja teha t sulg i saab s sulg i. Sest nüüd ma saan kasutada Selle massiivi-like märke, sest kuigi malloc väga üldiselt eraldab mind mälu mälu on lihtsalt külgnevas baiti. Bait, bait, bait, tagasi tagasi tagasi. Ma ei kindlasti programmeerijana seda ravida massiiv, mis tähendab, et ma ei kasuta seda lõpuks tuttav märkega vaid mõned nurksulgudes. Nii et lubage mul paus seal, sest see on palju korraga, isegi kuigi põhiidee sulgege on, et string, kõik see aeg, ei ole uute andmete tüüp iseenesest. See on lihtsalt nn pointer, aadress iseloomu, mis tähendab lihtsalt, et see number et inimese konventsiooni kaldume kirjutada nagu 0x midagi. Aga see on lihtsalt number, nagu 33 Oxford Street, mis juhtub olema CS hoone aadress. Kõik küsimused on need andmed? Jah? Sihtrühm: Miks me kontrollida t võrdub null? DAVID J. Humala: Miks me kontrollida t võrdub null? Kui me loeme documentation-- suur question-- jaoks malloc, see saab öelda trahvi print, mõnikord malloc võivad naasta null, nagu getString. Ja tõepoolest, getString tagastab null kui omakorda malloc tagastab null, sest getString kasutab malloc. Ja see võib juhtuda, kui OS, Mac OS, Windows, mis iganes, on lihtsalt mälu jaoks. Nii et see, mis juhtus seal. Ja lubage mul esile üks teine ​​asi et võib lihtsalt löök meelt või täielikult olla liiga kaugele üle joone. Aga las ma tõmba sama loop kopeerimise, mis hetk tagasi tagasikutsumine see. t sulg i saab s sulg i. Kena ja kasutajasõbralik. Tundub nagu teine ​​nädal uuesti. Aga see variant tegelikult saab kirjutada kui see, mis tundub segasena. See on tehnika, mida nimetatakse pointer aritmeetika, aadress aritmeetika. Aga miks see toimib? Nüüd tüütult, autorid C otsustanud kasutada * sümbol erinevatel eesmärkidel. Me oleme näinud seda kasutatakse juba korra, char *, mis tähendab "anna mulle muutuja et läheb sisalda aadress char. " Nii char * selles kontekstis tähendab "anna mulle muutuja." Kahjuks, kui te kasutate * ilma sõna ees on, nagu paalia, see on nüüd nimetatakse dereference operaator. Ja me näeme rohkem seda enne pikk. Aga see tähendab lihtsalt "minna." See on nagu öelda, kui keegi andis mulle tükk paberit "33 Oxford Street," kui ma teen "* 33 Oxford Street," mis tähendab, et "Minna mööda teed CS hoone." Nii * tähendab lihtsalt sinna minna, kui seal ei ole sõna selle ees. Mis on t, peab olema selge? t on aadress tüki mälu, mis anti mulle tagasi. s on aadress, mida, peab olema selge, näites, me arutame, väikseid Gabe? s on aadress of-- Sihtrühm: string. DAVID J. Humala: Of Gabe esialgne nimi. Nii et see on aadress see patakas mälu. Nii et kui ma ütlen, t + i-- i, teate, on just meie vana sõber. See on lihtsalt indeks muutuja mis on iterating nullist ülesse Lisa pikkus string s. Nii et see saab olema null, üks, siis kaks, siis kolm, siis neli. Nii et olgem koguda neid uusi Scratch-like puzzle tükki, kui soovite, kuigi jällegi süntaksi on märksa kauge kui Scratch. Nii t on aadress + i läheb mulle arvu, kuna need on kõik numbrid, et oleme olnud joonistus nagu hex. Aga nad on lihtsalt numbrid. Nii et kui aadress t me ütlesime oli 0x88, mis on 0x88 pluss null. Isegi kui sa ei ole mugav kuuskant veel, pakkuge. Sihtrühm: originaal. DAVID J. Humala: Ikka 0x88. Mis siis * 0x88 tähendab? See tähendab, "minna", mis tähendab efektiivselt, "panna oma sõrme siin." Ja nüüd paremas servas see väljend, * ja siis Sulgudes, s + i tähendab s, mis on tegeleda siin on vähe g. s + 0 on muidugi, s, sõltumata s. Nüüd, see * s, mis nagu * 33 Oxford Street tähendab minna aadressile s. Nii et siin on see sõrme, parema käe. Nii et mida ma nüüd kopeerida, milliseid? Asi on õige, mis on Gabe, vähe g siin sisseveo siin. Ja nii et kõnealuse esimese iteratsiooni silmus, kui ettepanek, kuigi see näeb hull keerulisem kui midagi Me oleme näinud, on lihtsalt öeldes minema siit ja kopeeri see märk siin. See annab sulle kaardi mõlemas kohas. Ja me näeme palju seda. Aga nüüd, loodan, on lihtsalt mõningaid neist põhiideed. Ja tõepoolest, vaatame üks lõplik programm siin ja siis lubas claymation, mis muudab kõik on korras. Olgu. Nii et lubage mul avada up-- sinna läheme. Nii et mulle-- tuleme tagasi Selle pildi enne pikk. Lubage mul avada see viimane näide on siin. Nii et siin on super, super programm, millega saavutatakse midagi, elu, mis teeb järgmise. Kõigepealt kinnitab kahe muutuja x ja y, mis ei ole numbrid seekord per se. Nad ei ole täisarvud, per se. Nad on ilmselt int *. Nii lihtsalt keegi, mida see tähendab Kui teie andmed tüüp, oma muutuja, on tüüpi int * star? See on aadress, int. Nii et ma olen ei tea, kus ta on veel. See tähendab lihtsalt "panna lõpuks aadress int siin. " 0x50, 0x88, kus see on mälu, aadress läheb sinna. Ja see, mida y on saab olema, samuti. Kui ma nüüd ütlen x = malloc (sizeof (int)) see on fancy viis öelda, hey operatsioonisüsteemi kaudu malloc, anna mulle piisavalt mälu suurus kohta int, mis on ilmselt saab olema 32 bitti või neli baiti. Mis siis malloc tagasi? Malloc naaseb aadress. Mis siis hakka salvestatud x? Aadress patakas mälu, neli baiti, et malloc leidsin just minu jaoks, küsides operatsioonisüsteemi. Nüüd vahepeal joon neli siin * x = 42. Lihtsalt olla kindel, Mis toimub seal? Vasakul servas, * x. see on nagu * 33 Oxford Street. Nii * x tähendab mida? Sihtrühm: Mine. DAVID J. Humala: Mine aadressile. Kus iganes see patakas mälu on, minna ta. Ja pane mida seal ilmselt? Sihtrühm: 42. DAVID J. Humala: 42. Olgu, * y, sama mõte. Mine aadressile y. Pane number 13 sinna, aga mis on y hetkel? Sihtrühm: Ei ole mälu y. DAVID J. Humala: Ei ole mälu y. Mis siis y ilmselt sisaldab, nagu me oleme öelnud? Sihtrühm: prügi. DAVID J. Humala: Mõned prügi väärtus. Nüüd, prügi väärtus on ikka number. See võib siiski olla eksikombel aadress. See on, nagu oleks keegi kritseldas midagi ette, ja ma tõlgendas seda nii, mõned hoone mööda tänavat. Ja kui sa lihtsalt proovida minna mõned hoone ei kuulu teile, või mõned patakas mälu sul ei antud, halbu asju võib juhtuda. Arvuti võib põrgata, või mõne muu määratlemata käitumine võib juhtuda. Nii intro, siis on Binky on see. Mäletan veel, 20 mõned paaritu aastat hiljem kus ma olin, kui ma lõpuks aru sellest. Mis tähendab, kui sa siit lahkuda kolme minutiga ja arvan, et ma seda ei tee mõista viiteid, mõistma Olen mäletatakse 20 aastatel mõned hull põhjus millal ja miks ta lõpuks vajunud aastal, kes istub minu õpetamise mehe, Nishat Mehta sisse tagasi Eliot söögisaal. Nüüd ma olen meelde seda sellepärast, et see oli üks teemadest I, Eelkõige maadelnud. Ja siis lõpuks klõpsatud, nagu ma julgen öelda, palju teemasid lõpuks teen. Ja nüüd teha, et tunda kõiki õnnelikumad ja enam veenev, Võtame lõplik pilk meie viimase kolme minuti siin Binky, meie sõber Nick Parlante Stanfordi. [VIDEO PLAYBACK] Hei, Binky. Ärka üles! On aeg pointer lõbus. Mis see on? Lugege vihjeid? Oh, tüdruk! Noh, alustada, ma arvan, et me oleme läheb vaja paar suunanäitajaks. -OK. See kood eraldab kaks suunanäitajaks, mis võib tuua täisarvud. -OK. Noh, ma näen kaks suunanäitajaks, kuid nad ei tundu olevat osutades midagi. -Just. Esialgu viiteid ei viita midagi. Asju, mida nad osutavad kutsutakse pointees ja milles neid on Eraldi etapis. Oh, jah, muidugi. Ma teadsin seda. Pointees eraldi. Er, siis kuidas sa jaotada pointee? -OK. Noh, see kood eraldab uus täisarv pointee, ja see osa komplekti x juhtida seda. Hei, mis näeb parem välja. Nii et see midagi teha. -OK. Tulen dereference pointer x salvestada number 42 arvesse oma pointee. Sel trikk, ma vajan oma Magic Wand of Dereferencing. Su Magic Wand of Dereferencing? See-- see on suurepärane. -See Ongi kood välja näeb. Ma lihtsalt loodud number, ja [POP] Hei, vaata. Seal ta läheb. -Nii Teed dereference kohta x järgmiselt Nool juurdepääsu oma pointee. Sel juhul poodi 42 sinna. Hei proovige seda salvestada number 13 kaudu teiste osutiga, y. -OK. Ma lihtsalt lähen üle siin y, ja saada number 13 loodud. Ja siis võtta võlukepp Dereferencing ja lihtsalt [BUZZ] Oh! Oh, hei! See ei õnnestunud. Ütle, Binky, ma ei usu, dereferencing y on hea mõte, sest sa tead, loomise pointee on eraldi etapis. Ja ma ei arva, et me kunagi tegime seda. Hea punkt. Jah. Me eraldatud pointer y, kuid me ei sea see käsk pointee. Väga tähelepanelik. Hei, sa näed hea välja seal, Binky. Kas sa seda parandada nii, et y punktid Lisa sama pointee kui x? Muidugi. Ma kasutan oma võlukepiga of Pointer määramine. Kas see saab olema probleem nagu enne? Ei. See ei puuduta pointees. See lihtsalt muutub üks pointer viitavad sama asi, mis veel. Oh, ma näen. Nüüd y osutab samas kohas kui x. Nii et oodake. Nüüd, y on fikseeritud. See on pointee. Nii et võite proovida Wand of Dereferencing uuesti saata 13 üle. -Uh, OK. Siin see läheb. [POP] Hei, vaata seda. Nüüd dereferencing tööde y. Ja kuna viiteid jagavad et üks pointee nad mõlemad näha 13. Jah. Jagamine, mida iganes. Nii me siis vahetada kohad nüüd? Oh, vaata. Meil on aeg otsas. -But-- -Lihtsalt Mäletan kolm pointer reegleid. Number One põhistruktuur on see, et teil on osuti, ja see juhib üle pointee. Aga osuti ja pointee on eraldi, ja üldine viga on loodud pointer, aga unustada, et anda sellele pointee. Number kaks, pointer dereferencing algab pointer ja järgib oma kursorit üle juurdepääsu oma pointee. Nagu me kõik teame, on see ainult siis, kui on olemas pointee, mis liiki saab tagasi Reegel number üks. Number kolm, pointer ülesande võtab üks pointer ja muudab seda, et see osutaks Sama pointee teise osuti. Nii et pärast üleminekut, kaks viiteid toob välja sama pointee. Mõnikord seda nimetatakse jagamine. Ja see kõik on see, tõesti. Nägemist nüüd. [END VIDEO PLAYBACK] DAVID J. Humala: Ongi CS50. Me näeme järgmisel nädalal.