[Muusika mängib] [Video taasesitus] -Ta Valetab. -Millest? Ma ei tea. -Nii, Mida me teame? -See 9.15 järele, Ray Santoya oli ATM. Jah. Seega on küsimus selles, mida oli ta teinud on 9:16? -Shooting 9 millimeetri midagi. Võib-olla ta nägi snaiper. -or Töötas koos temaga. Oota. Mine tagasi ühe. -Mida sa näed? -Bring Tema nägu üles täisekraanil. -Tema Prille. -On See peegeldus. -See On Nuevitas pesapalli meeskond. See on nende logo. -Ja Ta räägib Kes kannab selle jope. [Taasesituse lõpetamiseks] DAVID Humala: Okei. See on CS50 ja see on natuke rohkem on [kuuldamatu], millega sa oled espalla probleem seatud neli. Täna hakkame vaatama natuke rohkem sügavalt neid asju nimetatakse suunanäitajaks, mis, kuigi see on päris kauge teema, Selgub, et see läheb olema vahendid, mille me võib alustada hoone ja kokkupanek palju keerukam programme. Aga me tegime seda eelmisel kolmapäeval teel mõned claymation esimene. Nii et see, meenutavad, on Binky ja me kasutasime teda võtta pilk programm, mis tegelikult ei tee midagi huvitavat, kuid ta tegi paljastada mõningaid probleeme. Nii algab täna, miks me ei kõnni kiiresti läbi mõned neist sammudest, proovida ajama inimese mõttes täpselt, mis toimub siin ja miks see on halb, ja seejärel liikuda ja tegelikult alustada hoone midagi seda tehnikat? Nii et need olid esimesed kaks rida selles programmis ja üldarusaadavat mõttes, mida on need kaks rida läheb? Keegi, kes on piisavalt mugav mida on deklareeritud ekraanil? Mis on need kaks rida läheb? See pole veel kõik, mis erineb nädal üks, kuid seal on mõned uued eriline sümbol. Jah? Tagasi olemas. Sihtrühm: deklareerimine viiteid? DAVID Humala: Ütle uuesti? Sihtrühm: deklareerimine viiteid? DAVID Humala: deklareerimine viiteid ja olgem viimistleda natuke rohkem. Sihtrühm: [kuuldamatu] aadress x ja siis y. DAVID Humala: Ja siis tegeleda. Nii konkreetselt, mida me teeme on meie kuulutatakse kahe muutuja. Need muutujad, aga ei kavatse tüübiks int täht, mis täpsemalt tähendab nad ei kavatse hoida aadressi int, vastavalt x ja y. Nüüd on olemas väärtused? Kas on olemas tegelik aadressid nendes Kahe muutuja on sel hetkel? Ei. See on lihtsalt nn prügi väärtusi. Kui sul ei ole tegelikult määrata muutuja, mis iganes oli RAM Varem läheb täita nullidega ja need mõlemad need muutujad. Aga me ei tea veel mida nad on ja mis on saab olema võti, miks Binky kaotas pea eelmisel nädalal. Nii et see oli claymation kehastus selles millega sa pead lihtsalt kahe muutuja, väike ümmargune tükki savi, mida saab salvestada muutujad, kuid kuna Pakitud ülesnoolega näitavad, nad tegelikult ei juhtides kõikjal tuntud. Siis pidime selle rea, ja seda oli uus eelmisel nädalal, malloc mälu jaotamist, mis on lihtsalt fancy viis ütlen operatsioonisüsteem, Linux või Mac OS või Windows, hei, anna mulle mällu, ja kõik mida sa pead ütlema operatsioonisüsteemi mida küsides seda mälu. Ta ei kavatse huvita, mida sa lähed teha seda, aga sa ei pea ütlema operatsioonisüsteemi süsteem, mida teel malloc. Jah? Sihtrühm: Kui palju? DAVID Humala: Kui palju? Kui palju baite ja nii see jällegi kunstlik Näiteks on lihtsalt öeldes, mulle suurust int. Nüüd suurust int on nelja baiti ehk 32 bitti. Nii et see on lihtsalt viis öeldes, hei, operatsioonisüsteemi, mulle neli baiti mälu et ma saan kasutada minu käsutuses, ja konkreetselt, mida ei malloc tagastamise osas Selle tüki neli baiti? Sihtrühm: Aadress? DAVID Humala: aadress. Aadress, et patakas neli baiti. Täpselt. Ja nii see on, mida on salvestatud lõpuks x ja see on põhjus, miks me tegelikult ei huvita, mida arv, mis aadress on, kas see on ox1 või OX2 või mõne segasena kuueteistkümnendsüsteemis aadress. Me lihtsalt hoolitseda piltlikult et selle muutuja x on nüüd osutades, et patakas mälu. Nii nool näitab osuti või täpsemalt mälu aadress. Aga jälle, me tavaliselt ei huvita millised need tegelikud aadressid. Nüüd, see rida ütleb Mis üldarusaadavat mõttes? Star x saab 42 semikooloniga. Mida see tähendab? Tahad minna? Ärge kraapige oma kaela. Sihtrühm: aadress x on kell 42. DAVID Humala: aadress x on 42. Mitte päris. Nii lähedal, kuid mitte päris, sest seal on täht, mis on prefixing see x. Seega on meil vaja kohendada natuke. Jah? Sihtrühm: väärtus, et pointer x osutades on 42. DAVID Humala: OK. Väärtus, et osuti x on osutades, oletame, peab olema 42, või teisisõnu täht x ütleb, minna ükskõik aadress on x, kas see on 1 Oxford Street või 33 Oxford Street või ox1 või ox33, olenemata et numbriline aadress on star x on dereferencing x. Nii et minge sellele aadressile ja siis pane number 42 sinna. Nii et oleks samaväärne viis öelda, et. Nii et kõik on hästi ja siis me kujutaks pilt järgmiselt kus oleme lisanud 42 selle tüki neli baiti paremas servas, kuid Selle liini kus asjad läksid viltu ja Binky pea lõhki lüüa ära sel hetkel, sest halvad asjad juhtuvad, kui sa apparent prügi väärtused või sa apparent kehtetuks suunanäitajaks, ja ma ütlen kehtetuks sest sel hetkel Lugu, mis on seestpoolt y? Mis väärtus y põhineb mineviku mõne sammu? Jah? Mis see on? Sihtrühm: aadressi. DAVID Humala: aadressi. Peaks olema aadress aga ma olen tuleb kõigepealt? Nii et ma ei ole veel. Mis on teadaolevalt seal? See on lihtsalt mõned prügi väärtus. See võib olla ka muu aadress nullist 2 miljardit, kui teil on kaks kontserti RAM, või null 4 miljardi, kui olete sai neli gigabaiti muutmälu. See on mõned prügi väärtus, kuid probleem on et operatsioonisüsteem, kui ta ei ole andnud teile et patakas mälu spetsiaalselt et sa üritad minna, see on tavaliselt läheb põhjustada, mida oleme näinud ka killustatust süü. Nii et tegelikult keegi teist, kes on võitlesid probleeme tööaega või probleeme, mis on rohkem üldiselt püüdnud aru saada, laevastikuosi süü, mis tähendab üldiselt Sa puudutad segment mälu, et sa ei peaks olema. Sa puudutad mälu operatsioonisüsteem ei ole Lubatud sa puudutada, kas see on minnes liiga kaugele oma valikut või algavad nüüd, kas sellepärast sa puudutades mälu, et lihtsalt on mõned prügi väärtus. Seejuures star x siin omamoodi määratlemata käitumine. Te ei tohiks kunagi teha, sest koefitsiendid on programm lihtsalt läheb krahhi, sest sa räägid, minge sellele aadressile ja sa ei tea, kus sellele aadressile tegelikult on. Nii operatsioonisüsteem on tõenäoliselt läheb krahhi programmi tulemusena ja tõepoolest, see on Mis seal juhtus, et Binky. Nii lõpuks Binky fikseeritud Selle probleemi sellega. Nii et programm ise oli ekslik. Aga kui sa mingi pürgida ja täidab selle joone asemel, y võrdub x tähendab lihtsalt iganes aadress on x, samuti pane see y. Ja nii piltlikult oleme esindatud see kahe noolega alates x ja y juhtides samas kohas. Nii semantiliselt, x on võrdne y, sest need mõlemad ladustamiseks sama aadress, ergo osutades 42, ja nüüd, kui sa ütled täht y, minge aadressile y, Selle on huvitav kõrvaltoime. Nii aadress y on sama asi nagu aadress x. Nii et kui sa ütled minna aadressile y ja väärtust muuta kuni 13, kes veel mõjutab? X on punkti D, nii et rääkida, peaks samuti olla mõjutatud. Ja tõepoolest, kuidas Nick juhtis seda pilti in claymation oli just nii. Kuigi me järgime pointer y, oleme jõudnud samasse kohta, ja nii kui me printida välja x või y pointee, siis me näeksime väärtus 13. Nüüd, ma ütlen pointee olla kooskõlas video. Programmeerijad, et minu teadmised, tegelikult kunagi öelda sõna pointee, seda, mis on terava kell, kuid järjepidevuse videoga, mõistad see on kõik, mis oli tähendas, et olukord. Nii lisaküsimusi claymation või viiteid või malloc lihtsalt veel? No? Hästi. Nii edasise jututa, võtame pilk kell, kus see on tegelikult on mõnda aega kasutatud. Nii et me oleme olnud selles CS50 raamatukogu et ju kõik need funktsioonid. Oleme kasutanud GetInt palju, getString, ilmselt GetLongLong varem minu pset ühe või nii, kuid mis tegelikult kestnud? Noh, olgem võtta Kiire pilk all kapuuts on programm, mis inspireerib miks me anname teile CS50 raamatukogu ja tõepoolest, nagu eelmisel nädalal, meil hakkasid need abirattad maha. Nii et see on nüüd järjestatud ja Surmajärgne mida on kestnud sees CS50 raamatukogu kuigi nüüd hakkab liikuma eemale enamiku programmide. Nii et see on programm nimega scanf 0. See on super lühike. See lihtsalt on need read, kuid see tutvustab funktsioon nimega scanf et me tegelikult näeme in hetkel sees CS50 raamatukogu ent veidi teistsuguses vormis. Nii et see programm on line 16 deklareerib muutuja x. Nii et anna mulle neli baiti int. See on rääkinud kasutaja, number palun, ja seejärel see on huvitav joon, mis tegelikult seob kokku eelmisel nädalal ja see. Scanf ja siis märkate kulub stringi, nagu printf, % i tähendab int ja seejärel kulub Teine argument, mis tundub veidi funky. See on ampersand x, ja meenutada, me ainult nägin seda, kui eelmisel nädalal. Mida ampersand x esindavad? Mida ampersand teha C? Jah? Sihtrühm: aadress. DAVID Humala: aadress. Nii et see on vastupidine Tähe operaator, samas tähe operaator ütleb, minna Selle aadressi, ampersand operaator ütleb, nuputada aadress muutuja, ja nii on see võti, sest scanf on elu mõte on skaneerida kasutaja sisend klaviatuurilt, sõltuvalt iganes ta tüüpi, ja siis lugesin, et kasutaja sisend muutujaks, kuid me nägin viimase kahe nädala jooksul et see swap funktsiooni, et me Üritasin vaevata rakendada oli lihtsalt katki. Tuletame meelde, et swap funktsiooni, kui me lihtsalt deklareeritud A- ja B-ints, Me ei edukalt vahetada Kahe muutuja sees swap Just nagu piim ja talitus, kuid niipea, kui swap tagasi, milline oli tulemus seoses to x ja y, esialgseid väärtusi? Mitte midagi. Jah. Midagi ei juhtunud, et aeg, sest vahetustehingute muuta ainult oma kohalikku koopiat, mis tähendab, kes kõik Sel ajal, kui me olen on liikuvate argumendid funktsioonidele, me oleme sõidame koopiad neile argumentidele. Võite teha, et mida iganes sa tahad nendega, aga nad ei kavatse ei ole mõju algväärtused. Nii et see on problemaatiline, kui teil tahad olla funktsioon nagu scanf elus, mille eesmärk on otsida kasutaja sisend klaviatuurilt ja siis täitke lüngad, nii et räägivad, et on, anda muutuva nagu x väärtus, sest kui ma oleksin lihtsalt mööda x scanf, kui teie arvates loogika viimase nädalas, scanf saab teha mida iganes ta tahab koopia x, kuid see ei suutnud jäädavalt muuta x, kui me ei anna scanf aare kaart, nii et rääkida, kus x tähistab kohapeal, kusjuures võtame in aadress x nii, et scanf saa sinna minna ja tegelikult muutus väärtuse x. Ja nii tõepoolest kõik et see programm ei kui ma teen scanf 0, minu allikas 5m kataloog, teha scanf 0, dot kaldkriips scanf, number palun 50, aitäh 50. Nii see ei ole kõik, et huvitav, Aga mis on tegelikult toimub on see, et niipea, kui ma nimetan scanf siin, väärtus x on jäädavalt muutunud. Nüüd tundub, et see kena ja hea, ja tegelikult see Tundub, nagu me tegelikult ei vaja CS50 raamatukogu üldse enam. Näiteks oletame, joosta see veel kord siin. Lubage mul uuesti avada teist. Proovime mitmeid palun ja selle asemel, et öelda 50 nagu enne, Ütleme ole. OK, see on natuke imelik. OKEI. Ja just mõned jama siin. Seega ei tundu hakkama ekslik olukordades. Seega peame minimaalselt algus lisades mõned Tõrkekontroll veenduda, et kasutaja on sisestatud tegelik number nagu 50, sest ilmselt kirjutades sõnad ei avastatud problemaatiline, kuid ilmselt peaks olema. Vaatame seda versiooni nüüd, et minu katse implementeerid getString. Kui scanf on see kõik funktsionaalsust ehitatud, miks on meil olnud espalla nende Apupyörät nagu getString? Noh, siin on ehk oma Lihtne versioon getString kusjuures nädal tagasi, ma oleks võinud öelda, mulle string ja nimetavad seda puhverdada. Täna ma hakkan lihtsalt öeldes char täht, mis meenutavad, see on lihtsalt sünonüüm. Tundub scarier kuid see on täpselt sama asi. Nii et anna mulle muutuja nimega puhver et läheb salvestada string, rääkige kasutaja string palun, ja siis, nagu enne, Proovime seda laenata õppetund scanf % s sel ajal ja siis edasi puhvris. Nüüd, kiire meelerahu kontrolli. Miks ma ei ütle, ampersand puhver seekord? Järeldada eelmises näites. Sihtrühm: Char täht on osuti. DAVID Humala: Täpselt, sest seekord paalia star on juba osuti, aadressi, määratluse kohta, et täht on seal. Ja kui scanf ootab aadress, piisab lihtsalt läbida puhvris. Ma ei pea ütlema ampersand puhvri. Sest uudishimulik, siis võiks midagi sellist. See oleks erinev tähendus. See annaks sulle pointer kuni osuti, mis on tegelikult kehtiv asi C, kuid Nüüd saab hoida lihtsa ja hoida lugu järjekindel. Ma lihtsalt läbida puhver ja see on õige. Probleem aga on selles. Lubage mul minna ja teha selle programmi pärast kompileerimisel. Tee scanf 1. Kurat, minu koostaja püüdmine minu viga. Anna mulle üks sekund. Rõkkama. Oletame scanf-1.c. OKEI. Seal me läheme. Ma vajan seda. CS50 ID on erinevad seadistusi et sind kaitsta ennast. Mul oli vaja keelata neid poolt töötab rõkkama käsitsi seekord. Nii string palun. Ma lähen edasi minna ja kirjutada minu lemmik hello world. OK, null. See ei ole see, mida ma kirjutada. Nii et see on soovituslik midagi on valesti. Lubage mul minna ja kirjuta on tõesti pikk jada. Täname null ja ma ei tea, kui ma lähen, et oleks võimalik murdma. Proovime veidi koopia pasta ja vaata, kas see aitab. Just kleebi palju seda. See on kindlasti suurem string kui tavaliselt. Lihtsalt tõesti kirjutada. Ei. Pagan võtaks. Käsi ei leitud. Nii et see ei ole seotud. Seda sellepärast, et ma kleebitud halbu tähemärki kuid see osutub ei hakka tööle. Proovime veelkord, sest see on lõbusam kui me tegelikult murdma. Olgem tüüp seda ja nüüd, ma olen läheb kopeerida tõesti pikk string ja nüüd vaatame, kas me võib krahhi see asi. Pange tähele, ma jätta ruumid ja uued liinid ja semikoolonid ja kõik funky tähemärki. Sisesta. Ja nüüd võrgu lihtsalt on aeglane. Ma hoitakse Command-V liiga pikk, selgelt. Pagan võtaks! Käsi ei leitud. OKEI. Noh, asi on siiski järgmist. Mis siis tegelikult toimub kohta käesoleva avaldusega Söe star puhver real 16? Mida ma saan kui ma kuulutada osuti? Kõik Saan on neli baiti väärtus nimetatakse puhver, kuid mis on sees see hetkel? See on lihtsalt mõned prügi väärtus. Sest iga kord, kui kuulutada muutuja C, see on lihtsalt mõned prügi väärtus, ja me hakanud komistada see reaalsus. Nüüd, kui ma ütlen scanf, minge sellele aadressile ja pane olenemata kasutaja liigid. Kui kasutaja liigid hello maailma, noh, kus ma pane see? Puhver on prügi väärtus. Nii et see on selline nagu nool mis on suunatud kes teab kus. Võib-olla see osutavad siinsamas minu mälu. Ja nii, kui kasutaja liigid hello world, programm püüab panna string hello world kurakriips 0 et patakas mälu. Aga suure tõenäosusega, kuid ilmselgelt ei ole 100% tõenäosusega, arvuti läheb siis krahhi Programmi kuna tegemist ei ole mälu ma peaks tohi puudutada. Lühidalt öeldes on see programm vigane täpselt sel põhjusel. Ma põhimõtteliselt ei tee seda, mida? Milliseid samme on mul jätta, nagu me jätta koos Binky esimene näide? Jah? Sihtrühm: Memory eraldamise? DAVID Humala: Memory jaotamine. Ma ei ole tegelikult eraldatud mis tahes mälu, et string. Nii saame parandada seda paar võimalust. Üks, suudame hoida seda lihtne ja tegelikult, nüüd sa oled hakkan nägema ähmastumine read vahel, mida massiivi on, mida string on, mida char täht, mida array tähemärki on. Siin on üks näide kaasates stringid ja teate ma olen teinud on line 16 on, selle asemel, et öelda et puhver saab olema char star, kursor patakas mälu Ma väga ennetavalt anda mina puhver 16 märki, ja tegelikult, kui te olete juba tuttav mõistega puhverdusvõime, arvatavasti maailma videos, Kui video on puhverdusvõime, puhverdamine, puhverdusvõime. Noh, mis on seotud siin? Noh, Inside of YouTube ja seest video mängijad üldiselt on massiiv see on suurem kui 16. See võib olla hulgaliselt suurus ühe megabaidi, võibolla 10 megabaiti, ja sellesse massiivi teeb oma brauseri lae alla terve hunnik baiti, terve hunnik MB video ja video mängija, YouTube'i või kes on, hakkab Lugedes baitide et massiiv, ja iga kord, kui näete Sõna puhverdusvõime, puhverdamine, see tähendab, et mängija peab saanud lõpuks, et massiivi. Võrk on nii aeglane, et see ei ole uuesti täita massiivi rohkem baiti ja et sa oled out of bits kuvada kasutajale. Nii puhver on apt terminit siin, et see on lihtsalt massiivi, patakas mälu. Ja see parandada sest selgub, mis saab ravida massiivid, nagu oleks nad on aadressid, kuigi puhvris on lihtsalt sümbol, see on märgijada, puhver, see on kasulik mulle, programmeerija, sa ei liigu oma nime ümber nagu ta oli pointer, nagu ta olid aadressi patakas mälu 16 tähemärki. Nii et öelda, ma ei liigu scanf täpselt, et sõna ja nii nüüd, kui ma teen seda programmi, teha scanf 2 dot kaldkriipsuga scanf 2, ja kirjuta hello world, Sisesta, et AEG_ Hmm, mis juhtus? String palun. Mida ma valesti tegin? Tere maailm, puhvri. Tere, Maailm. Ah, ma tean, mida ta teeb. OKEI. Seega loeb üles kuni esimese ruumi. Nii saab petta hetkeks ja öelda tahtsin kirjutada midagi tõesti kaua nagu see on pikk lause see on üks, kaks, kolm, neli, viis, kuus, seitse, kaheksa, üheksa, 10, 11, 12, 13, 14, 15, 16. OKEI. See on tõesti pikk lause. Nii et see lause on enam kui 16 tähemärki ja nii kui ma Enter, Mis juhtub? Noh, sel juhul on lugu, mul oli deklareeritud puhver tegelikult on hulgaliselt 16 tähemärki valmis minema. Nii üks, kaks, kolm, neli, viis, kuus, seitsme, kaheksa, üheksa, 10, 11, 12, 13, 14, 15, 16. Nii 16 märki, ja nüüd, kui ma lugeda midagi sellist on pikk lause, mida juhtub on et ma lähen lugema see on pikk S-E-N-T-E-N-C-E, lause. Nii et see on sihilikult halb asi, mis ma hoida kirjalikult kaugemale piirid minu rida, piiridest minu puhvri. Ma võiks saada õnnelik ja programm hoiab töötab ja ei hooli, kuid üldiselt, selle tõepoolest krahhi minu programm, ja see on viga minu kood praegu astun piiridest Selle massiivi, sest ma ei tea, kas see on tingimata kukku või kui ma lihtsalt hakka õnnelik. Nii et see on problemaatiline, sest Sel juhul ei tundu töö ja olgem kiusate saatus siin, kuigi IDE tundub talu üsna vähe of-- Seal me läheme. Lõpuks. Nii et ma olen ainus, kes seda näeb. Nii et ma lihtsalt pidin lõbus kirjutades välja tõesti pikk tegelik fraasi et see kindlasti ületanud 16 baiti, sest ma trükitud selles hull pikk mitmeliiniline lause ja siis pane tähele, mis juhtus. Programm proovinud printimine ja siis sain killustatust süü ja killustatust vead on kui midagi sellist juhtub ja operatsioonisüsteemi ütleb Ei, ei puuduta see mälestus. Me läheme tappa programmi kokku. Nii et see tundub problemaatiline. Olen parandanud programm, mille vähemalt mõned mälu aga see tundub piirata funktsiooni getString saada stringe mõned piiratud pikkusega 16. Nii et kui sa tahad, et toetada enam lauseid kui 16 tähemärki, mida sa teed? Noh, saate suurendada mõõtmed selles puhvris kuni 32 või mis tundub selline lühike. Miks me lihtsalt ei tee see 1000, kuid tagurdamise. Mis on vastuseks intuitiivselt kohta lihtsalt seda probleemi vältida, muutes minu puhver suurem, nagu 1000 tähemärki? Rakendades getString sel viisil. Mis on hea või halb siin? Jah? Sihtrühm: Kui te kel palju ruumi ja te ei kasuta seda, siis ei saa ümber, et ruumi. DAVID Humala: Absoluutselt. See on mõttetu, sest kui sa seda ei tee tegelikult vaja 900 neist baiti ja veel sa küsida 1000 kokku niikuinii, sa oled lihtsalt tarbivad rohkem mälu kasutaja arvutisse kui teil on vaja, ja lõppude lõpuks mõned oled juba kokku puutunud elus, et kui sa oled töötab palju programme ja nad söövad palju mälu, see võib tegelikult mõjutada tulemuslikkust ja kasutaja kogemus arvuti. Nii et selline laisk lahendus, kindlasti, ja vastupidi, see ei ole ainult mõttetu, mida probleemi endiselt, isegi siis, kui ma oma puhver 1000? Jah? Sihtrühm: String pikkusega 1001. DAVID Humala: Täpselt. Kui teie string on pikkus 1001, sul on täpselt sama probleem, ja minu argument, oleksin just siis oleks 2000 kuid sa ei tea edasi, kui suur see peaks olema, ja veel, ma ei pea koostama oma programmi enne rendile inimesed kasutavad ja alla seda. Nii et see on täpselt selline värk, et CS50 raamatukogu üritab aidata meil ja me ainult lühidalt mõningaid aluseks rakendamine siin, kuid see on CS50 dot C. See on fail, mis on olnud CS50 IDE kõik need nädalat, et olete kasutanud. See on eelnevalt kompileeritud ja olete kasutanud seda automaatselt olemuse põhjal, mille kriips L CS50 lipp rõkkama, aga kui ma kerige läbi kõik neid funktsioone, siin on getString, ja lihtsalt teile maitse, mis toimub, Võtame pilgu suhteline keerukus. See ei ole super pikk funktsiooni, kuid me ei on mõelda kõik kõvasti kuidas minna saan stringid. Nii et siin on minu puhver ja ma ilmselt initsialiseerida see tühjaks. See muidugi on sama asi nagu char star, aga ma otsustanud rakendamise CS50 raamatukogu et kui me läheme täiesti dünaamiline, Ma ei tea ette, kui suurt string kasutajad ei kavatse taha. Nii et ma hakkan lihtsalt tühi string ja ma lähen üles ehitada nii palju mälu nagu mul on vaja sobitada kasutaja string ja kui mul ei ole piisavalt, ma küsin Operatsioonisüsteem rohkem mälu. Ma lähen liikuda oma string suuremasse patakas mälu ja ma lähen vabastada või vabastada piisavalt suure tüki mälu ja me lihtsalt läheb seda teha korduvalt. Nii kiire pilgu, siin on lihtsalt muutuja kellega ma lähen jälgida võimsuse minu puhvri. Mitu baiti mahub? Siin on muutuja n koos mis ma lähen hoida jälgida, kui palju baite on tegelikult puhver või et kasutaja on trükitud. Kui oled ei näinud seda enne, siis on võimalik määrata, et muutuv nagu int on allkirjastamata, mis nagu nimigi ütleb, tähendab see mitte negatiivne, ja miks Ma taha kunagi viitsinud täpsustatakse et int pole lihtsalt int, aga see on allkirjastamata int? See on mitte-negatiivne int. Mida teeb [kuuldamatu] tähendab? Sihtrühm: See kirjeldab summa mälu, mis võib olla [kuuldamatu]. DAVID Humala: Jah. Nii et kui ma ütlen allkirjastamata, see on tegelikult annab teile üks natuke extra mälu ja tundub selline rumal, kuid kui te üks natuke lisamälu, et tähendab, et pead kaks korda rohkem väärtused saab esindada, sest see võib olla 0 või 1. Nii vaikimisi int võib laias laastus negatiivne 2 miljardit kogu tee kuni positiivsete 2 miljardit. Need on suured vahemikud, kuid see on ikka mingi mõttetu kui te ainult hoolid suurused, mis lihtsalt intuitiivselt peaks olema mitte-negatiivne või positiivne või 0, ka siis, miks sa raiskad 2 miljardit võimalikud väärtused negatiivsed arvud kui sa kunagi neid kasutada? Nii öeldes allkirjastamata, nüüd on mu Int võib olla vahemikus 0 kuni umbes 4 miljardit. Nii et siin on lihtsalt int C põhjustel me ei hakka just nagu miks see int asemel on char, kuid siin on põhisisu, mis toimub kohta, ning mõned teist võivad olla kasutades, näiteks kui fgetc funktsiooni isegi pset neli või pärast seda, siis me näeme seda jälle probleem määrata viis, fgetc on tore, sest nagu nimigi selline, justkui arcanely ütleb, see on funktsioon, mis saab iseloomu ja nii, Mis põhimõtteliselt erinev mida me teeme getString on meil parajasti ei kasuta scanf samamoodi. Me lihtsalt hiiliva mööda samm-sammult üle olenemata kasutaja sisestatud, sest meil on alati võimalik eraldada ühe char, ja nii saame alati turvaliselt vaadata ühe char korraga, ja magic hakkab juhtuma siin. Ma lähen keri Keset seda funktsiooni lihtsalt tutvustada lühidalt selle funktsiooni. Palju nagu seal on malloc funktsioon, seal on RealLOC funktsioon, kus RealLOC võimaldab teil suunata patakas mälu ja teha see suuremaks või väiksemaks. Nii pikk lugu lühike ja laine mu käest täna, tean, et see, mida getString teeb on see omamoodi of võluväel kasvab või kahanemine puhvri kui kasutaja tüüpi tema string. Nii et kui kasutaja sisestab lühike string see kood Ainult eraldab piisavalt mälu sobib stringi. Kui kasutaja hoiab kirjutades nagu ma tegin seda jälle ja jälle ja jälle hästi, kui puhver on esialgu see suur ja programmi mõistab, et oota üks hetk, ma olen läbi ruumi, see saab kahekordistada suurust puhvrit ja seejärel kahekordistada puhver ja kood, mis kahekordistumine, Kui me vaatame seda siin, see on lihtsalt see tark Sutkaus. Sa ei pruugi näinud seda süntaksit Enne, aga kui sa ütled star võrdne, see on sama asi nagu öeldes võimet korda 2. Nii see lihtsalt hoiab kahekordistada suutlikkust puhvris ja siis ütlen RealLOC anda ise, et palju mälu. Nüüd, kui kõrvale, seal on ka teisi funktsioone siin et me ei vaata ühtegi detail peale näidata GetInt, Me kasutame getString in GetInt. Me kontrollime, et see ei ole null, mis meenutavad, on eriline väärtus, mis tähendab midagi läks valesti. Oleme mälu. Parem vaadake selle eest. Ja me tagasi valvur väärtus. Aga ma edasi lükata kuni kommentaaridega miks ja siis me kasutame seda nõbu scanf nimetatakse sscanf ja selgub, et sscanf või string scanf, võimaldab teil võtta pilk line, et kasutaja on sisestanud ja teile analüüsida sisuliselt ja mida ma olen teeme siin räägin ma sscanf, analüüsida olenemata kasutaja trükitud ja veenduge% i, seal on täisarv, ja me ei sattuda täna täpselt, miks seal on ka A% c siin, kuid lühikokkuvõte võimaldab meil avastada, kui kasutaja on sisestanud midagi võltsi pärast arvu. Nii seetõttu, et GetInt ja getString ütlen sulle uuesti proovida, uuesti, uuesti Sellepärast, et kõik Selle koodiga oleme kirjutatud, See on selline vaadates kasutaja sisend hoolitsedes see on täiesti numbriline või see on tegelik ujuv Punkti väärtus vms, sõltuvalt sellest, milline väärtus toimida te kasutate. Whew. OKEI. See oli suutäie kuid siinkohal on et põhjus oli meil need abirattad on seetõttu madalaimal tasemel, seal on lihtsalt nii palju asju, võib valesti minna, et me tahtsime ennetavalt tegelema need asjad kindlasti ka esimesel nädalal klassi, kuid nüüd pset neli ja pset viis ja kaugemale sa näed, et see on rohkem juurde sa ka oled võimekam lahendada neid erinevaid probleeme ise. Iga küsimustele getString või GetInt? Jah? Sihtrühm: Miks sa kahekordistada suutlikkust puhvris mitte ainult suureneb see täpne summa? DAVID Humala: Hea küsimus. Miks me kahekordistada võimsust puhvri vastandina lihtsalt suureneb see Mõned püsiv väärtus? See oli disaini otsuse. Me lihtsalt otsustas, et kuna see kipub olla natuke kallim aja mõistlik küsida operatsioonisüsteemi mälu, me ei taha lõpuks sattumist Olukorras suur stringid et Palusime OS uuesti ja uuesti ja ikka ja jälle üksteise järel mälu. Nii et me lihtsalt otsustas, mõnevõrra meelevaldselt kuid loodame, mõistlikult, et sa tead, mida, olgem proovida saada enne ise ja lihtsalt duubeldada seda nii, et meil minimiseerida korda meil helistada malloc või RealLOC, kuid kokku kohtuotsus helistada ilma teades mida kasutajad võiksid sisestada. Mõlemad viisid võivad olla vaieldav. Väidetavalt hea. Võtame pilk mõned muud kõrvaltoimed mälu, asju, mida saab valesti minna ja vahendid, mida saab kasuta püüda selliseid vigu. Selgub, te kõik, kuigi check50 ei öelnud sulle nii palju, on kirjalikult lollakas koodi kuna nädalal üks, isegi kui kõik check50 testid möödas, ja isegi siis, kui teie ja teie TF on super kindel, et Sinu kood töötab nagu ette nähtud. Sinu kood on vigane või ekslik, et te kõik, kasutamisel CS50 raamatukogu on lekib mälu. Sa oled palunud operatsioonisüsteemi mälu enamikus programmide olete kirjutanud, kuid sa oled tegelikult ei antud tagasi. Olete kutsutud getString ja GetInt ja GetFloat, kuid getString, olete ei helistanud unGetString või Anna String Tagasi vms, kuid me oleme näinud et getString ei mälu eraldada teel malloc või selle funktsiooni RealLOC, mis on lihtsalt väga sarnase sisuga, ja veel, me oleme olnud küsib operatsioonisüsteemi mälu ja uuesti ja uuesti kuid mitte kunagi anna seda tagasi. Nüüd, kui kõrvale, selgub, et kui programm sulgub, kes kõik mälu automaatselt vabastatud. Nii see ei ole suur asi. Ta ei kavatse murda IDE või aeglane asju ette, aga kui programmid ei üldiselt lekkida mälu ja nad töötavad juba pikka aega. Kui sa oled kunagi näinud loll väike rannas palli Mac OS või liivakell Windows kus see on selline aeglustub või mõelnud või mõtlemine või lihtsalt tõesti hakkab aeglane indekseerimine, on väga võimalik, et võiks olla tulemus Mälulekke. Programmeerijad, kes kirjutas tarkvara te kasutate küsida operatsioonisüsteemi mälu iga paari minuti, iga tund. Aga kui sa oled töötab tarkvara, isegi kui see on minimaalne arvuti mitu tundi või päeva lõpus, võite küsida rohkem ja rohkem mälu ja tegelikult ei kasuta seda ja nii oma kood võiks olla, või programmid võivad olla lekkivad mälu ja kui hakkad lekkida mälu seal on vähem mälu teisi programme, ja tagajärjeks on aeglane kõike ette. Nüüd on see siiani üks kõige metsik programmid siis on võimalused joosta CS50 niivõrd kui selle väljund on isegi rohkem esoteeriline kui rõkkama on või teha või mõne käsu line programme oleme kulgema enne, kuid õnneks põimitud oma toodangut on mõned super kasulikke näpunäiteid, et on kasulik kas pset nelja või kindlasti pset viis. Nii valgrind on vahend mida saab kasutada otsima mälu lekked oma programmi. See on suhteliselt lihtne sõita. Sa jooksed valgrind ja seejärel ka kuigi see on natuke paljusõnaline, kriips kriips lekke kontrolli võrdub täis ja siis dot kaldkriips ja oma programmi nime. Nii valgrind siis käivitada oma programmi ja päris lõpus oma programmi töötab, enne kui see sulgub ja annab teile teise kiire, see saab analüüsida oma programmi, kui see on kestnud ja öelda, sa lekkima mis tahes mälu ja veel parem, sa puudutage mälu ei kuulu sulle? See ei saagi kõike, kuid see on päris hea püüdmine enamik asju. Nii et siin on näide minu jooksis Selles programmis, mille run valgrind, kohta programmi nimega mälu, ja ma lähen rõhutada read, mis on lõppkokkuvõttes meid huvitab. Nii et isegi rohkem distractions et ma olen kustutatakse slide. Aga olgem lihtsalt näha, mida see Programm on võimeline meile. See on võimeline meile asju nagu vigane kirjutada suuruse 4. Teisisõnu, kui te puudutage mälu spetsiaalselt 4 baiti mälu et sa ei tohiks olla, valgrind võin öelda, et. Vale kirjutada suuruse 4. Sa puudutasid nelja baiti et sa ei tohiks olla. Kus sa seda tegid? See on ilu. Mälu dot c line 21 on koht, kus sa silmamunad ja sellepärast on kasulik. Sarnaselt GDB, see aitab juhtida teid tegelik viga. Nüüd on see üks on natuke rohkem lobise, kui ei ole segane. 40 baiti 1 plokid on kindlasti kadunud kaotus rekord 1 1. Mida see tähendab? Noh, see lihtsalt tähendab, et sa palusid 40 baiti ja sa ei ole kunagi andnud selle tagasi. Sa kutsusid malloc või siis nn GetString ja operatsioonisüsteemi saatis sulle 40 baiti, kuid kunagi vabanenud või vabaneb selle mälu, ja kui aus olla, siis pole kunagi näidata kuidas anda tagasi mälu. Selgub, seal on super lihtne funktsioon nimega tasuta. Võtab üks argument, asi tahad tasuta või tagasi anda, kuid 40 baiti ilmselt Selles programmis on kadunud real 20 mälu dot c. Vaatame seda programmi. See on super kasutu. See ainult näitab, see konkreetne viga. Võtame pilk. Siin on peamine ja peamine, teate, kõned Funktsiooni nimetatakse f ja siis tagasi. Nii ei ole sugugi nii huvitav. Mida f teha? Pange tähele, et ma ei viitsinud prototüüp. Ma tahtsin hoida kood võimalikult väike. Nii panin f eespool põhi- ja see on hea, kindlasti, lühikese programmid nagu see. Nii f ei tagasta midagi ja ei ei võta midagi, kuid see ei tee seda. See kinnitab, meelega on Binky näiteks osuti nimetatakse x, et läheb salvestada aadress int. Nii et vasakul pool. Inglise keeles, mis on parempoolne teed? Igaüks? Mis on selle teinud meie jaoks? Jah? Sihtrühm: [kuuldamatu] korda suurem int mis on 10 korda suurem [kuuldamatu] DAVID Humala: Hea ja andke mulle kokku. Nii eraldada piisavalt ruumi 10 täisarvud või 10, mis on suurus int, see on neli baiti, seega 10 korda 4 on 40, nii et paremal küljel, et ma olen Märgitud on mulle 40 baiti ja Hoida aadressi esimene bait arvesse x. Ja nüüd viimaks, ja siin on, kus see programm on vigane, mis on valesti line 21 põhineb loogika? Mis sul viga on line 21? Jah? Sihtrühm: Sa ei saa indeksi x [kuuldamatu]. DAVID Humala: Jah. Ma ei peaks indeksi x niimoodi. Nii süntaktiliselt, see on OK. Mis on tore on, palju nagu sina ravib nimi massiivi nagu ta on osuti, sarnaselt saab ravida osuti, nagu oleks see massiivi, ja nii ma ei süntaktiliselt öelda x sulg midagi, x sulg i, kuid 10 on problemaatiline. Miks? Sihtrühm: Sest see ei ole sees. DAVID Humala: See ei ole sees, et patakas mälu. Mis on suurim väärtus ma peaks võimalik saavutada nendes nurksulgudes? 9, 0 kuni 9. Kuna null indekseerimine. Nii 0 kuni 9 oleks trahvi. Bracket 10 ei ole hea ja aga meenutada küll, iga kord Mulle tundub, et proovida teha CS50 IDE crash kirjutades fiktiivseid väärtusi, see ei ole alati koostööd, ja tõesti, siis sageli saada õnnelik lihtsalt sellepärast, operatsioonisüsteem ei märgata, et sa kunagi nii veidi edasi mõned patakas mälu sest sa jäid jooksul tehniliselt Sinu segment, kuid rohkem, et ühes operatsioonisüsteemid klassi, ja nii midagi sellist võib väga kergesti märkamata jääda. Teie programm pole kunagi kukku järjekindlalt, kuid äkki kord aega. Ja nii proovime valgrind Sellel, ja siin on kus me saada ülekoormatud poolt väljund korraks. Nii et mälu valgrind lekke kontrolli võrdub täispunktmaatriks kaldkriipsuga mälu. Ja siin on põhjus, miks ma luban see uputama. Siin on, mida valgrind, siin on, mida programmeerija, mõned aastad ago- otsustasin, et see oleks hea mõte toodangu nägema. Nii saab sellest aru. Nii et kõik viis kohta vasakul pool mingit põhjust on protsess ID programmi me lihtsalt joosta, kordumatu tunnus programmi me lihtsalt jooksis. Me kustutatakse et alates slaidi, kuid on mõned kasulikku teavet siin. Olgem kerida kuni ülaservas. Siin, kus hakkasime. Nii see ei ole kõik, et palju toodangut. Siin on, et vigane kirjutada suurus 4 real 21. Noh, mis oli line 21? Line 21 oli täpselt seda ja see on mõistlik et ma olen kehtivalt kirjalikult 4 baiti, sest ma olen üritab panna see täisarv, mis võiks olla midagi, see lihtsalt juhtub olema null, kuid ma üritan pane see kohas mis ei kuulu mulle. Lisaks siia, 40 baiti ühes klotsid on kindlasti kaotanud rekordiliselt 1. Seda sellepärast, et kui ma kutsun malloc siin, ma ei ole kunagi tegelikult vaba mälu. Niisiis, kuidas me saame parandada? Lubage mul minna ja olla veidi turvalisem ja teha 9 sinna ja laske mul siin vabalt x. See on uus funktsioon täna. Kui ma nüüd uuesti, et mälu dot kaldkriipsuga Laseme valgrind seda uuesti, maksimeerida oma aken ja vajuta Enter. Nüüd, see on hea. Nad matta hea uudis kõik selle toodangut. Kõik hunnik plokid olid vabad. Me tuleme tagasi, mida hunnik on, kuid lekked on võimalikud. Nii et see on lihtsalt üks vahend oma tööriistakomplekt millega saab hakkama leida nüüd viga niimoodi. Aga vaatame, mis rohkem võib siin olla. Olgem üleminek nüüd tegelikult probleemi lahendamisel. Selle kõrvale, kui see leevendada natuke segadust või pinge, see on nüüd naljakas. Jah. See on päris hea. Kuna suunanäitajaks on aadressid ja aadressid on üldiselt kombeks kirjutatud kuueteistkümnendsüsteemis. Ha, ha, see on naljakas nüüd. Igatahes, nii et vaatame nüüd tegelikult lahendada probleemi. See on super, super madala seni, ja me saame tegelikult teha kasulikke asju nende madala üksikasjad. Nii me tutvustas paar nädalat tagasi mõiste massiivi. Hulgaliselt oli tore, sest see on raske puhastada meie koodi sest kui me tahtsime kirjutada Programm mitme õpilased või mitu nime ja maja ja üliõpilaselamu ja kolledžid ja kõik see, me võiks salvestada kõike rohkem puhtalt sees massiivi. Aga ettepanek ühe negatiivsed massiivi siiani. Isegi kui sa oled ei kannatanud seda ise programmis, vaid instinktiivselt, Mis on halb umbes massiivi, ehk? Kuulen murmurs. Sihtrühm: See on raske suurust muuta. DAVID Humala: See on raske suurust muuta. Sa ei saa muuta suurust massiivi tegelikult iseenesest C. Võite eraldab massiiv, liikuda kõike vana uude ja nüüd on mõned ekstra ruumi, kuid see ei meeldi keelt nagu Java või Python või mõnel teisel keeles, mille mõned teist Võib olla kursis, kus te lihtsalt hoida lisades asju tüütuseni lõpuni massiivi. Kui teil on hulgaliselt suurus 6, mis on selle suurus, ja nii palju nagu idee varem võttes puhvrit teatav suurus, sa pead vist väravast läbi millise suurusega sa tahad seda? Kui sa vist liiga suur, sa raiskad ruumi. Kui sa vist liiga väike, siis ei saa salvestada, et andmete puhul vähemalt ilma palju rohkem tööd. Nii et täna, tänu suunanäitajaks, saame alustada õmblemisega koos oma custom andmestruktuurid ja Tegelikult siin on midagi mis näeb natuke rohkem segasena esimesel pilgul, aga see on see, mida me nimetame seotud nimekirja ja selle nimi selline esitatakse kokkuvõtlikult seda. See on nimekiri numbrid, või Sel juhul numbrite loendi, kuid see võiks olla nimekirja midagi, aga see on omavahel ühendatud nii, nooled, ja lihtsalt võtta vist mida tehnika me läheme, et oleks võimalik õmblema kokku omamoodi nagu popcorn niit, lingitud nimekirjad ristkülikud siin? Selle arvu? Mis on aluseks keele funktsioon? Sihtrühm: Pointer. DAVID Humala: Pointer. Nii kõik need nooled näitab siin osuti või lihtsalt aadressi. Nii teisisõnu, kui ma tahan salvestada numbrite loendi, Ma ei saa lihtsalt salvestada see, kui ma tahan võime kasvada ja kahaneb minu andmete struktuuri massiivi. Nii et ma pean olema natuke rafineeritumalt, aga märgata, et see pilt selline soovitab et kui oled just vähe teemasid ühendades kõike koos, Ilmselt ei ole nii raske teha ruumi vahele kaks nendest ristkülikud või kaks neist sõlmed, kui hakkame kutsudes neid, pane uus sõlm, ja siis mõned uut teemat, vaid kraavi kolm tipud kokku esimene, viimane, ja teiselt et sa lihtsalt lisada keskel. Ja tõepoolest seotud nimekirja, Erinevalt massiivi, on dünaamiline. Ta võib kasvada ja see võib kahaneb ja sa ei on teada, või hooli ette, kuidas palju andmeid sa lähed tuleb ladustamiseks, Aga selgub, et me peame olema natuke ettevaatlik, kuidas rakendada seda. Nii esimese Vaatleme, kuidas me ellu üks neist vähe ristkülikud. See on lihtne rakendada int. Sa lihtsalt öelda, int n ja seejärel sa saad 4 baiti int, aga kuidas ma saan int, nimetame seda n, ja siis osuti, olgem kutsuvad seda edasi. Võiksime nimetame neid asjad midagi tahame aga mul on vaja kohandatud andmete struktuuri. Jah? Sihtrühm: Ampersand [kuuldamatu]. DAVID Humala: Nii ampersand me kasutame saada aadressile sõlme potentsiaalselt. Aga me peame teise funktsioon C, et mulle võime luua See komme ristkülik, see custom varieeruv kui soovite, mälu. PUBLIKU a struct. DAVID Humala a struct. Meenuta eelmisel nädalal tutvustasime struct, seda suhteliselt lihtne märksõna mis võimaldab meil teha selliseid asju. C ei tulnud andmebaasi struktuuri nimetatakse õpilane. Kaasas int ja float ja char ja selline, kuid see ei tule koos õpilase, kuid me saame luua õpilaste andmete tüübi, üliõpilane struktuuri, selle süntaks siin. Ja te näete seda ikka ja jälle. Nii et ärge muretsege meeldejätmist märksõnu aga märksõna, mis on oluline on lihtsalt sellest, et me ütlesime struct ja siis me kutsusime ta õpilane ja sees õpilase oli nimi ja maja või ühiselamus vms. Ja nii nüüd täna teeme ettepaneku see. Olen lisanud mõned sõnad, aga kui ma tahan rakendada seda ristkülik, mis on sain nii int ja pointer, sa tead, mida ma olen läheb kuulutada struct nimetatakse sõlme. Ma olen ka sees on, ütled mis sõlme, see ristkülik, on int ja me nimetame seda n ja tal on järgmisel osuti. Ja see on natuke paljusõnaline, aga kui sa arvad, nooled, mis olid pildil Hetk tagasi on, mida andmete tüübi? Kui kõik need nooled on suunatud millist tüüpi andmestruktuuri? See ei ole suunatud ainult int per se. See osutab Kogu ristkülikukujuline asi ja et ristkülikukujuline asi, me ütlesime, nimetatakse sõlme. Ja nii me mingi pea rekursiivselt määratleda seda, nagu et sõlm, ütleme, sisaldab int nimetatakse n ja osuti nimetas tuleva ja tüüpi andmestruktuuri, mille et osuti punktid on ilmselt saab olema struct node. Nii et see on tüütult paljusõnaline ja lihtsalt olla pedantne, põhjus, miks me ei saa lihtsalt öelda seda, mis ausalt öeldes tundub palju loetavamaks seetõttu, meenutavad, et C lugeda asju ülevalt alla, vasakult paremale. See ei ole kuni saame semikoolonit et märksõna sõlme tegelikult olemas. Nii et kui me tahame sellist tsükliline viide sees andmed struktuuri, me peame seda tegema, kus ütleme struct node ülaosas, mis annab meile enam viis kirjeldada seda asi, siis sees ütleme struct node, ja siis kõige viimane rida ütleme, kõik õige, C, muide, lihtsalt nimetame seda kogu kuradi asi sõlme ja lõpetage kasutades märksõna struct kokku. Nii et see on lihtsalt omamoodi süntaktilise trikk, mis lõppkokkuvõttes võimaldab meil luua midagi, mis näeb välja täpselt nagu see. Nii et kui me eeldame, nüüd saame rakendada seda asja C, kuidas me tegelikult alustada liiklevad see? Noh, tegelikult kõik me peame tegema, on itereerima vasakult paremale ja lihtsalt Selline sisestada sõlmede või kustutada sõlmed või otsida asju kus me tahame, aga et seda teha, lähme edasi ja teha asju veidi rohkem reaalne, sest see on super madala siiani. Kas keegi sõna otseses mõttes meeldib olla esimene? OKEI. Tule üles. Mis su nimi on? DAVID: David. DAVID Humala: David. Meeldiv tutvuda. Mina ka. Hästi. Ja me vajame number 9. Mitte nii hea kui esimene, ehk. OK, number 9. Mitmed 17, palun. Lubage mul minna tagasi veidi kaugemal. Number 22, palun, ja kuidas kaugemal tagasi kui ma ei näe käed kõik väikesed või ei. Keegi on vabatahtlikult seal. Kas sa tahad tulla? Sinu küünarvarre vägisi läheb üles. OK, 17. 22. 26 on tulemas alla. Kas keegi tahaks forcefully-- Tule üles. Tegelik vabatahtlikuna. Nii väga kiiresti, kui kutid võiks korraldada ise lihtsalt meeldib sõlmed ekraanil. Aitäh. Ja sa pead olema 26. Kõik õige ja kiire asustamise. Nii et ma olen David ja sa oled ka? DAVID: David. DAVID Humala: Ja sa oled? JAKE: Jake. Sue: Sue. ALEX: Alex. Raphael: Raphael. TAYLOR: Taylor. DAVID Humala: Taylor. Suurepärane. Nii et need on meie vabatahtlikud täna ja minna ja vahetustega natuke niimoodi, ja lihtsalt minna ja hoida kellel oma numbrid olete või teie Esimene märk ja vasaku käega, minna ja lihtsalt ellu Nende nooled, lihtsalt nii, et vasak käsi on sõna otseses mõttes osutades iganes sa peaksid meelde kell, ja anda endale ruumi, nii et saame visuaalselt näha oma käsi tegelikult juhtides, ja te saate lihtsalt meelde omamoodi maapinnal on hea. Nii et siin on meil ahelloend ühe, kaks, kolm, neli, viis sõlmede esialgu ja teate, meil on see eriline pointer alguses, kes on võti, sest meil on jälgida kogu pikkuses nimekirja kuidagi. Need poisid, kuigi nad oled jäänud paremale, seljad mälu, nad võivad tegelikult olla kuskil in arvuti mällu. Nii et need poisid olla seisab kuskil laval ja see on hea, nii kaua, kui nad tegelikult osutades üksteisest aga hoida asjad puhas ja lihtne, siis me lihtsalt juhtida neid vasakult paremale, nagu Selles, kuid seal võib olla tohutu lüngad nende vahel sõlmi. Nüüd, kui ma tahan tegelikult lisada mõned uus väärtus, lähme edasi ja tee seda. Meil on võimalus nüüd valida teise sõlme. Ütle alustame koos mallocing 55. Kas keegi mind on malloc? OK, tulge sisse. Mis su nimi on? RAINBOW: Rainbow. DAVID Humala: Rainbow? Hästi. Malloc Rainbow. Tule üles. Nüüd peame endalt küsima algoritmiliselt kus saame panna 55. Nii et kõik meist ei tea, Ilmselt kus ta ilmselt kuulub, kui me üritame hoida seda järjestatud ja kui te poisid võiksid ühe samm tagasi, et me ei jääks välja laval, et oleks tore. Seega tegelikult Rainbow, alustada siin koos minuga, sest me arvuti nüüd saab näha ainult üks muutuja korraga. Nii et kui see on esimese sõlme. Pange tähele, et ta ei ole sõlme, ta on lihtsalt kursoriga ja sellepärast on ta juhtinud olla ainult suurus osuti, mitte üks neist täis ristkülikud. Nii et me läheme vaadata igal iteratsiooni on 55 alla 9? Ei. Kas 55 alla 17? Ei. Vähem kui 22? Vähem kui 26? Vähem kui 34? Ja nii nüüd, muidugi Rainbow kuulub lõpus. Nii et on selge, ja mida oli oma nimi, Taylor? TAYLOR: Taylor. DAVID Humala: Nii hulgast Taylori vasak käsi ja Rainbow käed siin kelle käest tuleb märkida, mida on Selleks, et lisada 55 sellesse nimekirja? Mida me peame tegema? Jah? Sihtrühm: Taylor käsi peab käsk vasakule. DAVID Humala: Täpselt. Nii sisestamist sõlme meie nimekirja lõppu on üsna lihtne, sest Taylor lihtsalt on punkti asemel maapinnal või me nimetame seda null, null on omamoodi puudumisel pointer või spetsiaalse null pointer, sa oled läheb meelde oma vasaku kätt Rainbow ja siis Rainbow, Kuhu vasak Samas ilmselt juhtida? Alla. See ei ole hea, kui tema käsi on omamoodi juhtides siin maha või mingi tahes mis teed. See võiks pidada prügi väärtus, aga kui ta osutab mõned tuntud väärtust, siis me nimetame seda nulli või null, see on OK sest meil on mõiste selle ja me teame nimekirja nüüd on lõppenud. Mis siis veel üks suhteliselt lihtne juhul? Kas me malloc 5? Tule üles. Mis su nimi on? Tiffany: Tiffany. DAVID Humala: Vabandust? Tiffany: Tiffany. DAVID Humala: Tiffany. Hästi. Tiffany on malloced väärtusega 5. Tule üles. See üks on suhteliselt lihtne liiga, kuid Vaatleme et operatsioonide nüüd. See oli päris lihtne Taylor lõpus. Number 5 on muidugi alla 9, ja nii on meil David meil Tiffany, ja mis oli su nimi on? JAKE: Jake. DAVID Humala: Jake. Tiffany, Jake ja David. Kelle poolt tuleks ajakohastada esimesena? Mida sa tahad teha siin? Seal on paar võimalusi, kuid seal on ka üks või mitu viga viisil. Sihtrühm: Alusta vasakpoolsem. DAVID Humala: Alusta vasakpoolsem. Kes on kõige vasakpoolsem siin siis on? Sihtrühm: Esiteks. DAVID Humala: OK. Seega tuleb alustada esimesel ja kus sa soovite värskendada Davidi käsi olema? Sihtrühm: Teel 5. DAVID Humala: OK. Taavet punkt kell viis või Tiffany siin ja praegu? Sihtrühm: Tiffany viitab 9? DAVID Humala: Perfect, välja arvatud Binky on Pea lihtsalt selline kukkus, eks? Sest see, mis sul viga on see pilt sõna otseses mõttes? Sihtrühm: Midagi on suunatud. DAVID Humala: Miski pole osutades Jake nüüd. Me oleme sõna otseses mõttes orvuks 9 ja 17, ja me oleme sõna otseses mõttes lekkinud kõik see mälu, sest ajakohastamine Davidi käsi esimene, mis on fine, kuivõrd see on õigesti osutades Tiffany nüüd, aga kui keegi oli prognoos osutavad Jake, siis me kaotasime kogu selles nimekirjas. Nii saab tagasi võtta. Nii et oli hea asi komistada, kuid olgem korrigeerida nüüd. Mida me peaksime tegema esimese asemel? Jah? Sihtrühm: Tiffany nentima kell 9? DAVID Humala: ma ei saa saada, et close to you. Kes peaks viitama kell 9? Sihtrühm: Tiffany. DAVID Humala: Okei. Nii Tiffany peaks esimese punkti juures 9. Nii Tiffany peaks samasugusele väärtus David, mis tundub koondatud hetkeks, aga see on hea, sest nüüd, teisel samm, saame uuendada Davidi käsi punkti Tiffany juures, ja siis, kui me lihtsalt selline puhas asju nagu oleks see mingi kevadel nagu, Nüüd see on õige sisestamise. Nii hea. Nüüd me oleme peaaegu kohal. Lisame veel ühe väärtus, nagu väärtus 20. Kui meil oleks malloc üks lõplik vabatahtliku? Tule üles. Nii et see üks on natuke rohkem keeruline. Aga tõesti, kood oleme kirjalikult, kuigi sõnades, on nagu võttes kamp ja kui tingimused on nüüd, eks? Meil oli tingimus kontrollida, kas see kuulub lõpus, võibolla alguses. Me peame mingi silmuse leida kohapeal keskel. Nii saab teha, et mis su nimi on? ERIC: Eric. DAVID Humala: Eric? Eric. Meeldiv tutvuda. Nii et meil on 20. Vähem kui viis? Ei. Vähem kui üheksa? Ei. Vähem kui 17? Ei. OKEI. Ta kuulub siin Teie nimed jälle on? Sue: Sue. DAVID Humala: Sue. ALEX: Alex. DAVID Humala: Sue, Alex ja? ERIC: Eric. DAVID Humala: Eric. Kelle käes on vaja saada ajakohastatud esimesena? Sihtrühm: Eric. OKEI. Nii Ericu peaks osutavad, kus? Kell 22. Väga hea. Ja nüüd mis järgmiseks? Sue saab siis osutavad Eric ja nüüd, kui te poisid lihtsalt tegema ruumi, mis on hea visuaalselt, nüüd me oleme teinud sisestamist. Nii saab nüüd arutama küsimust, kuid Tänan sind nii palju vabatahtlikke. Väga hästi tehtud. Saate hoida neid, kui soovite. Ja meil on ilus lahkuminek kingitus, kui sa iga meeldib teha stressi pall. Lubage mul taolist alla. Mis on Buffee seda? See tundub olevat hämmastav kuivõrd meil nüüd kasutusele alternatiivina massiivi ei ole nii piiratud massiivi mõned fikseeritud suurus. Nad võivad kasvada dünaamiliselt. Aga palju nagu oleme näinud nädalat Varem me ei saa kunagi midagi tasuta, nagu kindlasti seal on kompromiss siin. Nii tagurpidi on seotud nimekirja, on see dünaamika? See võime kasvada ja ausalt öeldes Me oleks võinud teha delete ja me võiks väheneda, kui vaja. Mis hind on meil maksavad? Kaks korda nii palju ruumi, esiteks. Kui te vaatate pilti, enam olen ma talletamise täisarvud. Ma talletamise täisarvud pluss suunanäitajaks. Nii et ma kahekordistada palju ruumi. Nüüd, võibolla see ei ole selline suur asi 4 baiti, 8 baiti, kuid see võiks kindlasti lisada kuni suurte andmekogumite. Mis on veel puudusi? Jah? Sihtrühm: Me peame läbida neist üks-by-one. DAVID Humala: Jah. Me peame läbida neist üks-by-one. Tead mis, loobusime sellest super mugav funktsioon nurksulg märke, õigemini tuntud muutmälu, kus saame lihtsalt hüpata indiviidile element kuid nüüd, kui ma veel olnud minu vabatahtlike siin kui ma tahtsin leida number 22, ma ei saa lihtsalt hüpata sulg midagi midagi. Mul on üle vaatama nimekirja, palju nagu meie otsides näiteid lineaarselt, leida number 22. Nii näib, et oleme maksis seal. Aga me ei saa siiski lahendada muid probleeme. Tegelikult, las ma tutvustan vaid paar visuaale. Nii et kui sa oled olnud alla Ema söögisaalis hiljuti, sa meenutada, et nende korstnad plaate nagu see, oleme laenanud need alates Annenberg enne klassi. Nii et see virn, kuigi esindab tegelikult arvuti teadust andmete struktuuri. On andmeid struktuur infotehnoloogia tuntakse virna, mis väga kenasti sobiv just see visuaalne. Nii et kui kõik need kandikud ei ole salve, kuid nagu number ja ma tahtsin salvestada numbreid, ma võiks panna ühte siin, ja ma võiks panna teise siia, ja jätkata virnastamine numbrid peal üksteist, ja mis potentsiaalselt kasulikke sellest on see, et milline on mõju Käesoleva andmestruktuur? Milline number ma tõmmake Esimene kõige mugavam? Kõige hiljuti ühe panna seal. Nii et see on see, mida me nimetame sisse arvuti teadusele LIFO andmete struktuuri. Viimane, first out. Ja me näeme peagi, miks mis võib olla kasulik, kuid nüüd, lihtsalt kaaluda vara. Ja see on selline loll, kui te arvate, kuidas söögisaal teeb. Iga kord, kui nad puhtad plaate ja pane uuemad need peal, sa oleks võinud varem puhas kuid lõpuks väga määrdunud ja tolmune salve väga põhjas kui sa tegelikult kunagi põhjani selle stack, sest sa lihtsalt hoida paneb uue ja puhas need peal. Sama asi võib juhtuda supermarket liiga. Kui teil on ekraani puhul Piima ja iga kord CVS või kes saab rohkem piima, sa lihtsalt pista piimad sul on juba tahapoole ja paned uued, kuni ees, sa lähed on päris vastik piima lõpus andmestruktuuri, sest see on alati allosas või samaväärselt see alati tagasi. Aga seal on veel üks võimalus mõelda vooder andmed ja näiteks see. Kui sa oled üks neist inimestest, kellele meeldib rivistama väljaspool Apple kauplustes kui uus toode on läbi, siis oled ilmselt ei kasuta virna andmeid struktuuri, sest sa oleks võõrandada kõigile teistele, kes on vooder osta mõned uued mänguasjad. Pigem oled ilmselt kasutades millist andmestruktuuri või millist süsteemi reaalses maailmas? Loodetavasti on see rida või rohkem korralikult või rohkem Briti-like, järjekorda. Ja selgub järjekorras on ka andmestruktuur infotehnoloogia, kuid järjekord on väga atribuut. See ei ole LIFO. Viimane, first out. Jumal hoidku. See on vaid FIFO. Esiteks on esimene välja. Ja see on hea asi õigluse "nimel kindlasti, kui sa vooder up super varahommikul. Kui teil seal esimene, siis saada tahame kõigepealt hästi. Ja nii kõik need andmed struktuure, järjekorrad ja korstnad ja kobarad teised, selgub sa ei mõtle seda lihtsalt massiivi. See on massiiv, võibolla fikseeritud suurus 4, aga see tahaks olla omamoodi tore, kui me võiks lihtsalt hunnikusse plaate peaaegu lõpmatult pikk, kui me on, et paljud plaate või numbrid. Ehk me tahame kasuta ahelloend siin kuid kompromiss saab olema potentsiaalselt et meil on vaja rohkem mälu, võtab veidi rohkem aega, kuid me ei piirata kõrgust virna, meelega Mather ekraani puhul Võib mahtu piirata virna ja nii need disaini otsuseid või võimalusi meile lõpuks. Nii need andmed struktuure, oleme alustanud näha uusi ülemised piirid potentsiaalselt mida varem oli super kiire ja kus me jätan välja täna ja kus Loodame saada on kolmapäeval, siis me hakkavad vaadata andmebaasi struktuur, mis võimaldab meil otsida läbi andmete log lõpuks jälle. Ja me nägime, et meenutavad nädalal null ja üks binaarne otsing või lõhe ja vallutada. See tuleb tagasi ja veel parem, Püha Graal jaoks sel kolmapäeval saab tulla koos andmestruktuur, mis töötab tõesti või teoreetiliselt konstantse ajaga, kusjuures see ei ole oluline, kui palju miljoneid või miljardeid asju meil on andmestruktuur, siis meid konstantset aega, võib-olla üks samm või kaks sammu või 10 sammu, kuid pidev hulga samme otsida, et andmete struktuuri. See tõepoolest on Püha Graal kuid rohkem, et kolmapäeval. Näeme siis. [Muusika mängib]