[Powered by Google Translate] [4. nädalal Jätkub] [David J. Malan - Harvardi Ülikool] [See on CS50. - CS50.TV] See on CS50, ja see on lõpuks 4. nädalal. Nii et häid uudiseid ja halbu uudiseid. Loengut pole vaja esmaspäeval, pole probleemi seadma järgmisel nädalal. [Õpilased cheering] Sa ei meeldi, kuhu see viib. Aga meil on selle asemel järgmisel kolmapäeval, ja seal on ka ühe ainekava 1 Reede loeng järgmisel reedel, et saaksime püsida graafikus. Aga kõik saab filmitud nagu tavaliselt, nii ei muretseks. Ja seoses viktoriin 0 Mida me teeme poole nädala lõpus on postitada käigus kodulehte cs50.net selgitus : millist ootused teil peaks olema, kui tegemist on esimese viktoriini. Üldiselt on see valikvastustega, õige-vale, Lühike vastus, lühike kodeerimine probleeme. Sa ei kavatse oodata, et rakendada võrdväärne probleem, et sa näeksid pset, mille jaoks teil on arvuti ja siluri jms, kuid on olemas ka väike kodeerimine probleeme. Ja tõepoolest, parim teejuht saada tunnet, mida CS50 viktoriinid on nagu on minna cs50.net, minge Viktoriinid link, ja te näete möödunud mitu aastat väärt viktoriine. Lihtsalt aru, et õppekava ei ole alati olnud sama aja jooksul. Mõnikord lisame, mõnikord lahutada, nii et kui te näete mõningaid teema üks neist vana viktoriinid et sul pole aimugi, mida ta räägib, on see kas, et me ei katke või et me ei kata seda. Aga kujul ülevaateid, see pühapäev, esmaspäev ja teisipäev samuti muidugi hõlmavast istungil pühapäeva õhtul - aeg ja koht tehakse teatavaks käigus koduleht - teil kõigil on võimalus vaadata koos muidugi õpetuse stipendiaatide materjali käesoleval aastal nii lõik ja kui täis klass, ja need on filmitud nagu tavaliselt samuti. Hea küll. Niisiis ilma pikema jututa, ühe märkuse läbimise / mitteläbimise ja lisada / tilk. Võib-olla olete näinud mu märgib eile õhtul, ja see on tõesti vaid mõned täiendavat kindlustunnet et kui te olete nende hulgas eriti vähem mugav või kusagil vahepeal ja te ei tunne natuke rohkem oma peaga, aru, et on tõesti täiesti normaalne, ja seal on rohkelt tugistruktuur paigas, millest üks tööaega olid kavatsuste kohta parandada veelgi ühe minu e-posti eile õhtul, ja aru ka, et valik nagu läbimise / mitteläbimise klassi niimoodi tegelikult on mõeldud mehhanismi nüristama on muidugi niimoodi, nii et jälle, kui sa veedad need 10, 15, 20 tundi lihtsalt üritavad mõned pset tööle ja sa tead, et sa oled 90-95% teed seal kuid sa ei leia mõned kuradi bug, mis läbimise / mitteläbimise mudel, mis on omamoodi korras. Idee on selles, et see mehhanism saab siis minna keskenduda oma teistele psets või magada või mis iganes see on, et te soovite keskenduda. Nii mõistame, et teil on kuni tuleval teisipäev - tehniliselt 5. esmaspäev, aga see on puhkus, nii tuleval teisipäev - minna läbimise / mitteläbimise et sorteeritud või vastupidi. Ja kui sa oled tõesti järsak ja mõtled kukutades kokku, palun mind kätte pärast loengu või tilk mulle märkuse. Meile meeldiks vähemalt jututuba enne kui pakkumise Adieu. Hea küll. Nii et me hakkasid abirattad ära viimast korda. Eelkõige oleme keskendunud string. String on midagi, mis on välja kuulutatud CS50 raamatukogu, konkreetselt, et fail nimega cs50.h mis me hakkame vaatama käesoleval ja järgmisel nädalal. Aga string on tõesti ainult lihtsustamine midagi mis on veidi rohkem arcanely kirjeldatud kui char *. Char me oleme tuttavad. See on lihtsalt üks sümbol. Aga * alates esmaspäevast tähistatakse mida? >> [Üliõpilane] pointer. Pointer. Ja mis pointer? >> [Üliõpilane] aadress. See on nagu aadress, asukohta mälus. Mis aadress või asukoht või mälu? Jällegi, kõik meist on sülearvutid kaarik või 2 GB muutmälu tõenäoliselt nendel päevadel, ja mis tähendab, et olete miljardit eurot ehk 2 miljardit baiti väärt mälu. Ja see ei ole tegelikult oluline, mida ta füüsiliselt välja näeb, aga võtta usus, et saate arv Kõik üksikute baitide et oma sülearvuti on - see on bait 0, see on bait 1, see on bait 2 miljardit - ja see on täpselt see, mida arvuti teeb. Kui eraldada ruumi ühe märgi, näiteks see on ilmselt elada kuskil arvuti mälu, ja võibolla see on bait number 12345, ja see on kusagil siin arvuti mälu. Ja aadress seejärel, et märk on 12345. Nüüd, nädal 0 kuni nüüd siiani ei ole me tõesti hoolib Kui mälu asju hoitakse, sest me tavaliselt kasutada sümboleid, muutujad ja massiivid tegelikult saada meie andmed. Aga kui esmaspäeval ja seda enam täna, sa oled nüüd seisab ees kõik rohkem väljendusrikas võimekuse kirjalikult programmid tõesti manipuleerida arvuti mälu aga näed, nii hea eesmärgil ja halb, vead on väga levinud tulemus siinkohal õppimist see kraam. Aga mida see tegelikult tähendab, et char *? Lähme edasi tagasi - ja me tuleme tagasi Binky nagu lubati täna. Lähme lihtsa näite siit. Las ma salvestada see fail compare.c, ja las ma saaksin malli koodi siin seega sisaldavad stdio.h, lubage mul anda ka ise hulka cs50.h. Ma suumida seal üleval. Lubage mul alustada kirjalikult peamised int, main (void), ja nüüd ma tahan teha midagi sellist: printf ("Anna mulle stringi:") ja siis ma kasutan string s saab getString saada stringi kasutaja, siis ma lähen küsida kasutajalt teisele. ("Anna mulle veel stringi:") ja ma lähen paluda neil kaudu getString saada, et. Ma nimetan seda t sest t tuleb pärast s ja s on kena nimi stringi, kui see on päris üldine. Nii getString, ja nüüd ma lihtsalt tahan teha terve mõistuse kontrolli ja ma ütlen if (s == t) siis ma lihtsalt ütlen kasutaja printf ("Sa kirjutasid sama asja! \ n"); muidu ma lähen välja printida midagi ("tipitud midagi! \ n") või mis iganes lause on. Nii et midagi sellist. Siis nagu tavaliselt, ma naasen 0, mis lihtsalt tähendas, et midagi halba ei juhtunud, ja ma lähen edasi minna ja kompileerida ja käivitada see programm. Aga esmaspäeval me jooksime selle programmi, ja tegelikult öeldi, et TERE ei ole tere ja nägemist ei ole hüvasti. Käitumist nägime oli natuke rohkem niimoodi. Lubage mul minna minu allikas kataloog, suurendada siin ja teeme teeb võrrelda. Koostanud okei. Ma jooksen võrrelda. Anna mulle string: Tere. Anna mulle veel string: Tere. Sa kirjutasid midagi! Noh, las ma proovin midagi lihtsamat nagu 50, 50. Sa kirjutasid midagi! tere, tere. Nii selgelt, midagi siin toimub. Aga mis oli selgituseks, miks? Ilmselt rida 12 on täiesti düsfunktsionaalne. Mis on põhiline probleem siin? Jah. >> [Üliõpilane] See võrdleb aadresse. Jah, täpselt. See on tegelikult võrrelda aadressid kus tere ja HELLO hoitakse. See ei ole võrreldes tähed Tere jälle ja jälle, sest, mis tegelikult juhtus, kõik see aeg oleme kasutanud getString - See tahvel on jälle meie arvuti mälu, ja ütleme, et ma kutsun getString pärast kuulutatakse muutuja s. Mis minu mälu välja näeb? Olgem omavoliliselt öelda, et s näeb välja selline. See on ruut. Ja päris palju tahes ajal olen tõmmatud tükk mälu ekraanil kas see on 32 bitti olen joonistus väljakud niimoodi, sest tõepoolest aparaat, pointer, aadress, on 32 bitti. See on sama nagu int. See võib erineda, sõltuvalt arvutisüsteemi. Neile, kes on ähmaselt tuttav asjaolu, et Mac või PC on 64 bitti, et tegelikult tähendab, et arvuti kasutab 64-bitist suunanäitajaks, 64-bit aadressid, ja nende hulgast plussid, mis on oma arvutid võib olla palju rohkem RAM kui Läinud. Pikk lugu lühike, tagasi samal päeval, kui arvuteid kasutatakse ainult 32 bitti esindada aadressid, suurim arv baite võid esindama sel juhul oli mis siis, kui sul on 32 bitti? Nii et 4 miljardit õigus, sest 2 32 on 4 miljardit eurot. See number on korduvate käigus. Nii et kui sul on ainult 32 bitti, kõige rohkem võite loota, et on umbes 4 miljardit eurot. Aga see oli põhimõtteline piiramine arvutid kuni paar aastat tagasi sest kui saad ainult loota koguni 4 miljardit see ei ole oluline, kui teil osta 8 GB RAM või isegi 5 GB RAM; sa ei saa loota, et kõrge, nii et see oli kasutu. Sa võid siseneda ainult esimese 3 või 4 GB arvuti mälu. See on vähem küsimus nüüd, ja saab osta MacBook Plussid ja Dells 8 GB RAM või isegi enam nendel päevadel. Aga kui ma eraldama lihtsalt selles programmis pointer, pointer nimetatakse s, See võib tunduda see ekraanile sest tõepoolest peame koor tagasi see kiht. Hoian öeldes string, kuid alates esmaspäevast, string on tõesti char *, aadress mõned iseloomu. Võtame et koolitus ratta maha, kuigi me jätkuvalt kasutada getString nüüd. Nii et ma olen deklareeritud s, ja see on patakas mälu, 32 bitti. Mis siin mälu vaikimisi? >> [Kuuldamatu õpilase vastus] Mis see on? >> [Üliõpilane] prügi. >> Prügi. Täpselt. Kui te programmeerija ei pane väärtus muutuja, kes teab, mis see on? Mõnikord sa õnnelik ja see on 0, mis on selline ilus, puhas vaikeväärtus, kuid nagu me nägime esmaspäeval, mõnikord on see täiesti mõttetu, mõned tõesti suur positiivne või negatiivne arv, mis tuli kuhu? Jah. >> [Üliõpilane] funktsiooni enne. >> Jah. Sageli funktsioon, mis sai kutsutakse enne sest mäletan, kui helistate funktsiooni mälu, nad võtavad rohkem ja rohkem ruumi alt üles, ja niipea kui tagastab funktsioon, et mälu saab taaskasutada poolt järgmine mees, et saab nimetada, kes kasutab oma sama tükk mälu. Ja kui olete lahkunud prügi seal, eelmised väärtused, me võib ekslikult s, millel mingi väärtus, kui tegelikult me ​​ei ole panna midagi seal. Nii et meie mälu sel hetkel näeb välja selline. Nüüd paremas servas rida 7 me nõuame getString, mis me oleme teinud nüüd nädalaid, kuid mida on getString tegelikult teeme? GetString kirjutada CS50 töötajad on vähe intelligentne aastal, et niipea, kui kasutaja hakkab tippimisklahvid ja vaatamiste Sisesta, GetString arvud, kui palju klahvivajutusi tegin kasutaja hitt, kui palju märke on mul vaja eraldada RAM. Ja kui see RAM on pärit, kes teab? See on kusagil arvuti 2 gigabaiti või tühi-tähi mälu. Aga oletame, et arvuti leida ruumi sõna HELLO siin. Sõna Ma sisestasin oli H-E-L-L-O. Ja kui me tõmbame seda märgijada, me võiksime teha seda niimoodi. Aga mul on vaja teha 1 pildi asi. Mis kuulub lõpus igal stringi C? Null iseloomu, mis me kirjutame kui \ 0. See on tehniliselt number 0, kuid längkriips teeb kõik selgemaks et see on sõna otseses mõttes number 0, täisarv 0; see ei ole, näiteks quote-Tsitaat lõppeb 0 et võite tippida klaviatuuri. Nii et see on tere. Ja mida me ütleme esmaspäeval, et funktsioon nagu getString tegelikult tagasi kõik need nädalat? See ei tule string iseenesest, sest see ei ole tegelikult on tähendus kuna stringid ei ole. Nad on omamoodi väljamõeldis sisse CS50 raamatukogu. Mis on tõesti string, tehniliselt rohkem? >> [Üliõpilane] See on esimene märk. Täpselt. See on lihtsalt aadressi esimene märk, et kasutaja sisestatud sisse Nii et kui minu sõna HELLO lõpeb see üles baidi number 123 ja seejärel baidi number 124, 125, 126, ja nii edasi, kui ma lihtsalt number minu baiti 0 püsti, mis tegelikult getString on tagasi on sõna otseses number 123. Mis siis saab panna s on number 123, mitte täht H, ei sõna HELLO, lihtsalt aadress, kust ma leiaks esimene täht tere. Aga see ei tundu piisavalt. Küsisin teilt string, mitte iseloomu. Niisiis, kuidas me või arvuti tean, et ELLO tüüpi tulevad koos H? Mis on omamoodi leping meil? Jah. [Üliõpilane] See hoiab ütleb ise, et leida mõned rohkem märke. >> Täpselt. Seal on see inimese-arvuti kokkuleppega, mille kohaselt juhul, kui teil on tegemist stringid, muidu tuntud nüüd char tähed, sa lihtsalt pead välja mõtlema kus lõpuks iga stringi elu on teel tõesti ainult itereerimise üle selle jaoks silmus, samas silmus, mis iganes, nii et kui leiad stringi lõpuni nüüd saab järeldada, et, oh, terve sõna oli tere. Neile, kellel eelnev programmeerimise kogemus tunneksid Java võid lihtsalt helistada. pikkus ja teistes keeltes võite helistada pikkus vms. Ongi, sest on palju keeli, eriti asju nimetatakse objektorienteeritud keeltest, pikkus on midagi sellist kapseldatud sees tükk andmed ise, meelega me kapseldatud sümbolid ja nimed ja maja sees õpilane esmaspäeval. Aga C on palju madalam. Puuduvad objektide või klassid, kui olete kuulnud neid tingimusi enne. Kõik, mida tõesti on mälu aadresse. Nii et see on omamoodi vanamoodne viis esindavad huvitav andmestruktuurid. Sul on algusväärtus nagu aadress esimene märk ja siis lihtsalt suvalise konventsiooni, et kõik on nõus järgima. Niisiis, kuidas on stringi pikkus rakendatud, tegime ettepaneku? Strlen, strlen, mis mõned teist on nüüd kasutatud paar korda. See on päris lihtne, eks? See on nagu 2 rida koodi. See on päris palju loop mingisugune, äkki täiendava kohaliku muutuja. Aga strlen lihtsalt peab võtma kursor ja seejärel hakata otsima \ 0. Ja niipea, kui ta leiab, saab naasta koguarv samme, et see on tehtud, et string. Nii saame sellest järeldada, mis juhtub järgmisena. Oletame siis Kinnitan t nagu ma olen seda teinud rea 10. See on mingi prügi väärtus. Kes teab esialgu? Aga paremal servas line 10 Ma helistan getString uuesti. Kes teab, kus see jõuab? Olgem omavoliliselt öelda, et operatsioonisüsteem leitud ruumi ta viis siin. Satun juhuslikult Tüüp H-E-L-L-O uuesti, ja nii saame teha samasugune pilt. Kuid tõsiasi, et ma olen joonistatakse see pilt on tahtliku sest see on erinev HELLO kui see üks. Nii et siin võib see olla kohas 456, see on 457, ja nii edasi. Mis siis saab panna kus küsimärk kord oli? Sellisel juhul 456. Me picking neid numbreid suvaliselt, sest tegelikult pärast tänast me ju ei hooli nii palju, mida aadressi midagi on. Kõik me hoolime on, et me ei suuda välja selgitada aadress mõned tükk andmed nagu tere. Nii et tõesti, mida enamik inimesi ei infotehnoloogia rääkides mälu aadressid ja räägime viiteid täpsemalt mitte vaeva figuring 123 - who cares kus see värk tegelikult on, me lihtsalt tean, et see on mingil numbriline aadress - me lihtsustada maailma ja lihtsalt öelda, et s on suunatud sellele iseloomu ja t on suunatud sellele iseloomu. Ja asjaolu, et see on nool on üsna tahtlik sest sõna otseses mõttes nüüd s on osutavad H ja t on osutavad teistele H sest lõpus päeval, see ei ole oluline milliseid aadress on kuid see asi, et meil on võime väljendada sellele aadressile mõned tükk kood. Me ei ole tõesti manipuleerida need aadressid lihtsalt veel nii et me näeme, kus me saame hüüda, ja omamoodi asju teha suunanäitajaks, kuid nüüd rida 12 sõna otseses mõttes Milliseid väärtusi me võrrelda vastavalt sellele uudisele vastavalt 12? Me ütleme on 123 võrdne võrdne 456? Ja see on kindlasti nii ei ole. Ja ka kontseptuaalselt, see pointer ei ole kindlasti sama, see sest sa helistasid getString kaks korda, ja getString ei püüa olla super tark, ta ei püüa mõista, oh, sa kirjutasid HELLO 5 minutit tagasi; lubage mul anda teile sama pointer kui ma andsin sulle enne, see lihtsalt eraldab uus patakas mälu iga kord, kui seda nimetada. Niisiis, kuidas me probleemi lahendada? Kui kõrgemat Ma tahan võrrelda stringe Tere ja Tere - Ma ei hooli vihjeid - kuidas ma saan minna vastates küsimusele, ei tarbijagrupp sama asi? Mis on vajalik siin? Jah. [Üliõpilane] Kasutage funktsiooni. >> Saan kasutada funktsiooni karbist. Oskan kasutada funktsiooni nimetatakse strcmp, s-t-r-c-m-P, lihtsalt lühendatud versiooni öeldes string võrrelda. Ja kui me läheme sinna, näiteks võrrelda 2, mis on üks tänapäeva jaotusmaterjale, Ma täpselt seda. Hoidsin kõik muu samaks rida 1 kuni 26 või nii, ja nüüd märgata selles osas on muutunud natuke. Olgem ignoreerida rida 28 hetkel ja keskenduda ainult see üks. Mida me ütleme esmaspäeval, et str Võrdle ei? Ta tegeleb protsessi võttes 2 suunanäitajaks, s ja t sel juhul, omamoodi praktiliselt pannes oma sõrme need 2 tähte, ja mida ta peab tegema, on midagi samas loop või jaoks silmus, ja ta ütleb on need samad? Kui nii, siis liigutab sõrmi või viiteid edasi. Kas need samad, need samad, need samad, need samad, need samad? Ja ooh, ma olen lõpus stringi nii s ja t. Ma ei ole leidnud vastuolusid. Jah, need stringid on ühesugused. Ja mida see str võrrelda tulu kui 2 stringid on sama, ilmselt? Null. Nii et 0 on hea sel juhul, sest kui ta tagastab -1 või +1, see tähendab, et te lihtsalt juhtub tulema enne t tähestikuliselt või pärast t. Ja miks see oleks kasulik omada funktsioon, mis ütleb teile, mida string tuleb enne või pärast esitamine sõnaraamatus? [Üliõpilane] Otsimine. >> Otsimine ja sorteerimine. Nii saab teha asju nagu binaarne otsing või mull sorteerida või ühendada sorteeri kus pead võrrelda asju. Siiani oleme omamoodi lõigata mõned nurgad ja ainult rääkisime sorteerimine kontekstis numbreid, sest see on tore ja lihtne rääkida, kuid võite kindlasti võrrelda stringe, õun ja banaan, sest kui õun on teada, et tulevad enne banaan samamoodi saate liikuda stringid ringi mälu nagu Rob tegi ühendamise sorteerida video ja me tegime siin laval valik omamoodi, sisestamise järgi, ja mull sorteerida. Nii et kui me saame seda? Proovime seda. Olgem omamoodi unustage, et õppetund hetk ja proovige nüüd ja kopeerida 1.c teha järgmist. Kooskõlas 21 Ma räägin prindi midagi, siis ma saan stringi kasutaja, siis Ma kontrollin seda. Me pole tõesti läinud see harjumus veel, kuid olgem nüüd seda teha. Olgem tegelikult koor tagasi see kiht. See on tõesti char *. See mees on tõesti char *. Nii et mida see tähendab, et tuleb kontrollida, kas s == NULL? Selgub, et kui te helistate funktsiooni nagu getString või üldisemalt küsige arvuti teile mõned mälu, midagi võiks valesti minna. Sa võiksid olla hull ja küsi arvuti teratavu mälu küsides triljoneid baiti mälu, et lihtsalt ei eksisteeri arvuti, kuid getString ja muid funktsioone vaja mingi võimalus karjuma sa kui olete küsinud liiga palju. Ja kuidas getString see on, kui te olete palunud rohkem mälu kui on olemas arvuti, isegi kui see on super, super väikese tõenäosusega sest keegi meist ei kavatse kirjutada triljonit tähemärki ja vajuta Enter, kuid väikese tõenäosusega kuigi see võib olla, ma tahan veel näha seda igaks juhuks, ja eriline väärtus, et getString, vastus, ja muid funktsioone tulu kui midagi on valesti läinud on NULL kõik mütsid. Ja mis on NULL? NULL just nii juhtub esindama pointer. See on mälu aadress 0. Maailm otsustas, et omavoliliselt, kui see on minu arvuti mälu - sa tead, mida? - me ei kavatse varastada vaid 1 bait iga arvuti mällu ja see on asukoha 0. Me anname ta hüüdnime NULL, ja me ei kavatse lubada et me tegelikult ei pane tegelikke andmeid seal sest me lihtsalt suvaliselt vaja erilist väärtust, 0, teise nimega NULL, et saaksime kisa kasutajate kui midagi läheb valesti. Muidu sa ei pruugi teada ei 0 tähendab panna midagi siin või see tähendab midagi läks valesti? Me peame kõik ühel meelel, et NULL tähenda midagi tagastati, mingit tegelikku aadressi tagastati. Nüüd, siin ma lihtsalt võtta minu inimeste konventsiooni ma tagasi 1 alates peamised kui midagi läheb valesti. Ongi, sest peamine tagasipöördumist konventsioon on naasta 0, kui hea, 1 või mõnda muud väärtust kui halb. Aga getString ja ühtegi funktsiooni, mis tegeleb mälu tagastab null, kui midagi läheb halvasti. Okei. Nii et kahjuks rida 27, super lihtne, kuigi see on, ei ole kuidagi võimalik kopeerida string. Miks? Me näeme seda järgmiselt. Ma väites rida 27 tuleb teha koopia s ja nimetades seda t. Nii et ma ei palu kasutaja jaoks 2 stringid seekord; Ma lihtsalt ütlen väärtust s tuleks kehtestada t samuti. Nii et nüüd lihtsalt näidata, kuidas murtud see on rida 29 aastast mida ma teen? Esimene Ma kontrollin, kas pikkus t on suurem kui 0. Seal on mõned string seal. Kasutaja sisestatud midagi sisse Mis on line 32 teed, ilmselt? [Kuuldamatu õpilase vastus] >> Õigus. Võite selline see tulenema, mida ma ütlesin seda teeb. Aga tehniliselt, mida see teeb? t [0] näitab, mida? [Üliõpilane] 0. iseloomu. >> [Malan] 0. iseloomu. Või rohkem inimese moodi, esimene märk t, mis iganes see on, H ehk antud juhul. Ja toupper teeb mida ta ütleb. See suurtäheks 0. iseloomu t ja see muudab ta. Nii et see tähendab võtta 0. iseloomu t, oleks suureks, ja pane see tagasi, et samas kohas. Nii et kui ma tüüpi tere väiketähtedega, see peaks muutuma väiketähti h kuni kapitali H. Probleem on aga selles, et liinid 35 ja 36, ​​mida ma olen umbes vaja on välja trükkida meie jaoks s ja t. Ja mis on sinu aimdus? Mida ma tegelikult näeme, kui ma trükitud tere kõik väiketähed? Mis hakka trükitud? >> [Kuuldamatu õpilase vastus] >> Mis see on? [Üliõpilane] Big H ja ülejäänud väikesed. >> Suur H ja ülejäänud väikesed, mis s või t? [Üliõpilane] Nii. >> Nii. Täpselt. Nii et vaatame, mis siin toimub. Lubage mul minna ja koostada selle. See on copy1, nii et copy1. Hea küll. Suumimiseks Lubage mul minna ja joosta copy1, Enter, Ütle midagi: tere väiketähtedega. See kapitaliseeritud koopia, aga see ilmselt kapitaliseeritud originaal samuti, sest see, mida nüüd juhtub see lugu? Kooskõlas 27 ma tegelikult ei tundu olevat kopeerimine stringi, aga isegi kui te intuitiivselt on loota, et olla juhul, kui sa mõtled seda pilti, mis tegelikult ma teinud olen? Pool pilt on sama. Nii et anna minna ajas tagasi, nii et t ei ole veel lugu. S võib esineda lugu, kuid olgem väiketähtedeks tere seekord. Nii et lubage mul kinnitada, mida ma tegelikult kirjutada logida Sel juhul on meil siin h-e-l-l-o. Me teha seda märgijada, panen eraldaja read siin ja mu \ 0. Nii et see on koht, kus me oleme niipea kui rida 1 kuni 24-ish, anda või võtta, on täidetud. See on pilt minu mälu. Kui ma saan rida 27, mis juhtub? Nagu enne, ma saan osuti, mis ma joonistan kuna see ruut. Seda nimetatakse t. Ja mis on selle väärtus vaikimisi? Kes teab? Mõned prügi väärtus. Nii et ma abstraktne, et ära nagu küsimärk. Ja niipea kui paremal pool rida 27 hukatakse, mida ma panna sees t? Sama asi, mis on s. Nii et kui me hetkeks eemaldada võtmiseks nool ja me ütleme, oh, see on mälu koormus aadress 123, kui te ütlete, t muutub s, semikoolon, sa sõna otseses mõttes panna 123 siin. Nüüd, kui me sellist lihtsustada meie maailma jälle pilte, mida olen teinud, on lihtsalt lisatud teine ​​nool oma maailma mis on suunatud T-st sama täpne jada. Nii et kui real 31 ja 32 ma tegelikult minna umbes muuta t [0] Mis on t [0] ilmselt sünonüüm nüüd? s [0] Nii ongi kõik, mis seal toimub. Ja kuigi selline tundub natuke madal ja kauge ja selline tunne ehk intuitiivselt see oleks lihtsalt töötas - Olen teinud koopiaid asjad enne ja see lihtsalt toimis - kui sa tegelikult mõelda, mida string tõesti on, see char *. Noh, mis see on? See on aadress mõned iseloomu. Siis võib-olla on mõttekam, et kui sa püüad teha midagi super pealtnäha lihtne niimoodi, kõik mida sa teed on kopeerimine mälu aadressi. Sa tegelikult ei tee midagi koos string ise. Nii et isegi kui sa ei tea, kuidas oleks seda probleemi kood, kõrge tase, kontseptuaalselt, mida me peame tegema, et muuta ta ärakirja s, ilmselt? Jah. >> [Üliõpilane] Anna uude asukohta? >> Täpselt. Me peame andma t uhiuue asukohta. Me peame kuidagi luua maailma, kus me saame uue tüki mälu, mis lihtsalt Selguse mõttes ma joonistan õigus alla selle ühe, kuid see ei pea seal olema. Aga see peab olema sama suur, nii et ma tõmban neid vertikaalpunktist samas kohas. See on hea, kui see kõik prügi esialgu. Kes teab, mis seal kirjas oli? Aga 1. etapp saab olema mulle nii palju mälu kui mul on vaja sobitada koopia tere, siis nuputada, kuidas kopeerida h siin, e siin, l siin ja nii edasi. Aga see juba peaks tunda veidi ilmne, isegi kui mõned andmed on veel abstraktne. Selleks, et kopeerida selle stringi sellesse, see on lihtsalt loop või samas loop või midagi, mis sinust on saanud kõik rohkem tuttav. Nii et proovime seda. Lubage mul minna copy2.c. Aastal copy2.c meil peaaegu sama programmi va rida 27. See paistab pisut keeruline, kuid kui me jaotada see jaokaupa, vasakul pool on sama. Char * t loob see asi mälu, kuigi küsimärk sest me ei tea, mis seal on vaikimisi. Paremal servas me nüüd kasutusele uus funktsioon, malloc, mälu eraldada, anna mulle mälu, ja see ilmselt võtab mitu argumenti, kuidas paljud asjad Sulgudes? Kuulsin murmurings 1 ja 2, kuid see on vaid 1. Pole mingit koma, mis tähendab, seal on ainult 1 asi sulgudesse. Kuigi seal on teised sulud, lubage mul rõhutada mis seal sees äärepoolseimate sulgudes, ja see on see väljend: (Strlen (s) + 1) * sizeof (char). Nii et kui me tegelikult selle läbi mõtlema, see ütleb mulle pikkus s. Miks ma küll, lisada 1 peale pikkus? >> [Kuuldamatu õpilase vastus] Täpselt. Me vajame ruumi see kutt saba, kuues märk, mis ei ole Eesti mõistes kuid see on eriline programmilise tähendusega. Seega peame + 1 mis sest strlen naaseb inimese ootus pikkus, tere või 5, see ei anna teile täiendavaid null iseloomu. Nii et ma käsitsi lisada seda + 1. Ja siis see, * suurus (char), me pole seda varem näinud. See ei ole tehniliselt funktsioon. See on eriline märksõna, mis lihtsalt annab teada suurus on umbes andmetüüp arvutis sest tegelikult, mõned meist on 32-bit arvutid. Mul on päris vana arvuti kodus, ja see kasutab vaid 32 bitti esindama suunanäitajaks. Ja nii kui ma tegin suurus andmetüüp, oleks 32 bitti. Aga kui ma kasutan oma uue fancy arvuti, ma võiks saada tagasi väärtuse 64 bitti midagi nagu aadress. Nii et antud juhul lihtsalt olema super ohutu, me ei kavatse kõva kood midagi - Noh, mis on suurus char vastavalt sellele, mida me oleme öelnud siiani? Me oleme päris palju öelnud suuliselt, et see on 1 bait, ja see on päris palju tõsi kogu laevas. Aga jälle, eeldused kipuvad olema halb. Nad viivad lollakas tarkvara kui inimesed kasutavad oma tarkvara, kuidas sa ei kavatse. Nii et olgem abstraktne see ära ja lihtsalt rohkem üldmõistena öelda Ma vajan seda palju mäluhulka ja iga tüki mälu peaks olema samaväärne suurus iseloomu, mis on tegelikult võrdne 1 antud juhul, aga see on üldisem viis kirjalikult seda. Nii et kui sõna on tere, kui palju baite ei malloc ilmselt eraldada tere? [Üliõpilane] Kuus. >> Kuus. Täpselt nii palju kui meil on küsimärke ekraanil. Ja siis võtta arvan, et nüüd põhineb teie arusaam getString mida see malloc ilmselt tagasi? >> [Üliõpilane] aadress. Aadress mida? Esimese tüki mälu. Meil pole aimugi, mis seal on, sest mõned muud ülesanded oleks võinud kasutada seda mälu varem. Aga malloc, nagu getString, tagastab aadress esimest baiti mälu et ta on kõrvale otsida. Kuid mida ta ei tee, on sisestada see tühi längkriipsuga null iseloomu sest selgub saate malloc eraldada midagi: ints, stringid, massiivid ujukid, üliõpilane struktuure. Võite kasutada malloc täiesti üldiselt. See ei huvita või pead teadma, mida sa eraldades mälu. Seega oleks ennatlik jaoks malloc panna \ 0 aasta lõpus iga tüki mälu see annab teile sest see \ 0 asi on lihtsalt kokkuleppeliselt stringid. See ei ole kasutatud ints, see ei kasutatud ujukid, see ei ole kasutatud õpilastele. Ja nii gotcha koos malloc on see, et koorem on täielikult teie programmeerija meeles pidada, kui palju baite olete eraldatud ja mitte kunagi kasutada loop või samas loop ja minna varem piiri patakas mälu olete saanud. Teisisõnu, niipea kui mälu eraldada, sa ei saa küsida operatsioonisüsteemi, oh, muide, kui suur patakas mälu see oli? See on täiesti su meeles, kui sa pead seda summat. Nii et vaatame, kuidas ma minna seda kasutada mälu. Vastavalt 28 ja 29, miks ma sellega tegelen? Lihtsalt kogu meelerahu kontrolli. Igaks juhuks midagi läks valesti, ma küsida mõned hull mälu või ma olen nii palju asju arvutis, et seal lihtsalt ei ole piisavalt mälu, midagi sellist, ma vähemalt soovite kontrollida null. Tegelikult enamik arvuteid annab teile illusiooni, et iga programmi saab kasutada kogu oma RAM, Aga isegi nii, kui kasutaja liigid mõned hull pikk jada ehk sellepärast, et nad on paha poiss ja nad tegelikult üritavad krahhi programmi või sissemurdmist see, soovite vähemalt kontrollida tagastatav väärtus malloc ja kas see võrdub null. Ja kui ei, lähme lihtsalt loobuda kohe, sest ma ei tea, mida teha sel juhul. Kuidas kopeerida string? Seal on vähe võimalusi seda teha. On tn kopeerida funktsioone C, kuid see on super lihtne, et teeme seda vanal heal moel. Esiteks lubage mul selgitada, mida pikkus s. Ma oleks võinud panna see silmus, kuid selle asemel ma lihtsalt pane see siia selgust. Nii n nüüd salvestab pikkus algse stringi, mis on ilmselt 5. Siis minu jaoks silmus ma itereerimise 0 kohta kuni n, ja iga iteratsiooni Ma panen s [i] sees t [i]. Nii et ma tähendas minu 2 sõrme osutavad stringid enne. Kuna see loop kordab meeldib see, ma lähen tuleb kopeerimine h sisse siin e sisse siin, ma arvesse siin, sest see on s on see t. Ja siis viimaks, reas 35 miks ma sellega tegelen? Mul on vaja veenduda, et ma lõpetades string t. Ja ma tegin selle nii olema super selge. Aga ettepanekuid, keegi, kui sa saaksid, teistmoodi seda teha. Ma tõesti ei vaja rida 35. Seal on veel üks võimalus seda teha. Jah. >> [Kuuldamatu õpilase vastus] >> Ütle seda valjemini. [Üliõpilane] Väiksem või võrdne. >> Täpselt. Me võiksime lihtsalt öelda, väiksem või võrdne n, mis üldiselt on halb sest peaaegu alati, kui me läheme üles võrdub asi Me loodame me minna 1 samm liiga kaugele. Kuid pidage meeles, mitu baiti tegime eraldada? Me eraldatud strlen s, nii et 5 + 1 kokku 6. Nii et sel juhul me võiksime teha midagi sellist nii et me kopeerimine ei ole lihtsalt tere ka \ 0 päris lõpus. Teise saaksime kasutada funktsiooni nimetatakse tn koopia, strcpy, kuid see ei oleks pooltki nii lõbus. Aga see on kõik see all kapuuts. Siis lõpuks, me teeme sama asja nagu enne. Ma lõikama t ja siis ma väita, et originaal näeb välja selline ja koopia näeb välja selline. Nii et proovime seda nüüd. Lubage mul minna siin. Tee copy2. Me suurendada ja joosta copy2. Ma lähen kirjuta tere väiketähtedega, ning tõepoolest saan väiketähtedeks tere kui originaal kuid kapitali Tere jaoks koopia. Aga ma ei teinud veel. Mul on vaja teha 1 viimane asi siin. 46 ja 47 on selgelt vabastades mälu, kuid mida see tegelikult tähendab? Mida ma teen, kas sa arvad, mida helistaja liini 46 ja rida 47? Milline mõju, mis on? Jah. [Kuuldamatu õpilase vastus] >> Täpselt. Sa lihtsalt ütlen operatsioonisüsteem, hei, tänu selle mälu. Nüüd saad kasutada seda kellelegi teisele. Ja siin on suurepärane näide prügi väärtusi. Olen lihtsalt kasutada seda mälu üles kirjutada sõna tere 2 kohti, siin, siin, siin ja siin. Nii et see on h-e-l-l-o-\ 0. Aga siis ma kutsun rida 46 ja rida 47, ja sa tead, mis juhtub seal nii pildil? Tegelikult, oota, see pilt on vana. Kui me teeme koopia, see kutt on tegelikult juhtides siin, niiet eemaldada numbrid ja lihtsalt abstraktne ära nii meie nooled uuesti. Mis juhtub see pilt, kui ma helistada tasuta? [Kuuldamatu õpilase vastus] >> Isegi mitte. Kui ma nimetan tasuta s ja t - selline trikk küsimus - see pilt ei muutu üldse sest helistaja id ja kutsudes t lihtsalt ütleb operatsioonisüsteemi, hei, võite kasutada seda mälu uuesti, kuid see ei muuda seda tühjaks või mõne erilise iseloomu, see ei muuda seda, see ei muuda h või e või l või L või o kas koht midagi muud. Seoses pilt, niipea kui sa helistada tasuta, midagi ei muutu. Ja seal on päritolu prügi väärtusi, sest kui ma hiljem selle programmi küsida operatsioonisüsteemi jaoks rohkem mälu getString või malloc või midagi sellist ja operatsioonisüsteemi ütleb, kindel, Mul on 12 baiti mälu lihtsalt vabanenud, kasutada neid, mida sa lähed antakse? Sa lähed antakse patakas mälu, et meil oleksid tavaliselt teha küsimärki, kuid millised on need küsimärgid? Nad juhtub olema h-e-l-l-o, t-e-l-l-o. Need on meie uus prügi väärtused niipea kui vabaneb, et mälu. Seal on reaalses maailmas mõjuta siin ka. See juhtub pistmist RAM, kuid arvutis tegelikult teha sama plaat. Me räägime sellest eelkõige tulevikus lahendamist, mis keskendub ekspertiisi. Aga mis tegelikult juhtub, kui teil on mõned tundlikke töölaual faili või mõned pealiskaudsed JPEG ja lohistage see oma prügikast, mis juhtub, kui lohistate see prügikasti või prügikasti? Sa teadsid, mida ma rääkisin. [Naer] Mis juhtub, kui sa vedasid neid tõendeid oma prügikasti või prügikasti? [Kuuldamatu õpilase vastus] Noh, nii ettevaatlik. Mis juhtub, kui sa seda tegid? Lühike vastus on midagi, eks? Pealiskaudsed või tundlik fail on ikka lihtsalt istub seal kuskil kõvakettal. Enamik meist vähemalt on mõistnud, et teil on vaja tühjendada oma prügikasti või oma prügikasti tegelikult kustutada faile. Ja tõepoolest, kui sa paremklõps või kontrolli kliki oma prügikast või vali Fail Tühjenda prügikast või mis iganes ja sa tegelikult tühjendada prügikasti või prügikasti, mis tegelikult juhtub siis see pilt? Rohkem midagi. Nii et midagi tegelikult juhtub kettal. Ja kui me lihtsalt ajutiselt põikama ja kirjutada - Ma teen lihtsalt kasutada taga seda. Nii et nüüd lugu muutub alates RAM, mis on koht, kus programmid on olemas samas näed neid, kettale, mis on koht, kus neid hoitakse pikaajalise isegi kui võim läheb, nüüd - ja me tuleme selle juurde tagasi tulevikus - olgem lihtsalt teeselda, et see tähendab kõvaketas sees arvuti sest juba järgmisel päeval nad varem ümmargusi kettaid, palju nagu disketid. Nii et kui sul on mõned tundlikud Exceli faili, see võib võtta kuni see patakas mälu arvuti kettale, ja ma lihtsalt joonistus sama meelevaldne 1s ja 0.. Kui lohistate faili niimoodi oma prügikasti või prügikasti, sõna otseses mõttes midagi juhtub, sest Apple ja Microsoft on lihtsalt otsustanud prügikast ja prügikasti on tõesti ainult ajutine kohatäide. Ehk lõpuks OS tühjenda see teid, kuid tavaliselt, ta ei tee midagi, vähemalt seni, kuni sa oled tõesti vähe ruumi. Samas, kui sa lähed tühja prügikasti või tühi prügikasti, Samamoodi ei juhtu midagi, et see pilt. Kõik, mis juhtub, on mujal arvutis, seal on mingi tabel. See on omamoodi nagu väike cheat sheet, mis ütleb, et, ütleme, resume.doc, nii oma CV Microsoft Word fail elasid saabus 123 kõvakettal, ei mälus ja RAM, kuid kõvakettal, ja teie pealiskaudsed JPEG elu 456, ja teie Exceli faili elab 789 või kus iganes. Kui kustutate faile tegelikult tühjendamist prügikasti või prügikasti, see pilt ei muutu. 0. ja 1s kõvakettal ei lähe kuhugi. Aga see tabel, et see väike andmebaasi kehvasti, ei muutusi. Kui kustutate oma CV, see on justkui kustutatakse teatud mõttes kuid kõik arvuti ei ei unusta, kui see asi elab kõvakettal. 0. ja 1s, et kirjutada oma CV või mõni neist ülejäänud failid on veel puutumata. Nii et kui sa tegid seda kogemata, seal on veel nullist et saate taastada oma andmed, kasutades Norton Utilities või mõned kommertstarkvara kelle eesmärk elus on leida 0. ja 1s, mis on omamoodi jäänud orvuks, unustatud siin aga lahkus siit, nii et võite saada oma andmed tagasi. Või kohtuekspertiisi uurijatele politsei või FBI tegelikult võtta kõvaketas ja tegelikult otsida mustreid 0. ja 1s mis näevad välja nagu JPEG, näeb Exceli faili, ja taastada neid niimoodi isegi kui arvuti on unustanud neid seal. Nii et ainus viis tõesti kustutada andmeid, nii saame arutada ka tulevikus, on võsa või pühkida fail või kõvakettale - Sa ei saa tõesti vabaneda 0. ja 1s sest muidu sa alustada GB kõvaketas ja sa lõpuks koos megabaidi kõvakettale, kui te pidevalt olid kustutamine sõna otseses mõttes, 0. ja 1s. Mida sa teeksid, kui sa tõesti tahtsid, et katta oma lugusid ja peamine probleem on see, et seal on ikka 0. ja 1s kettal? Ma näen kedagi gesticulating et teil oleks füüsiliselt murda seade. See töötab. [Naer] Aga kui see on mingi kallis lahendus, mida oleks mõistlikum? Jah. >> [Üliõpilane] ülekirjutamine neid. >> Ülekirjutamine neile mida? >> [Üliõpilane] Muud andmed. Muud andmed. Sa võid kirjutada oma ketta 0s või 1s või kõik 0s, kõik 1s. Ja see on tõesti see, mida mõned tarkvara teeb. Sa võid osta tarkvara või isegi saada tasuta tarkvara ja isegi ehitatud Mac OS nendel päevadel, vähem Windows, on võime kindlalt kustutada. Tegelikult, kui soovite kõik kulgema koju täna kui teil on Mac ja seda, kui sul on mõned asjad oma prügikast, mida saate teha Secure Empty Trash, mis teeb täpselt seda. Selle asemel, et lihtsalt kustuta failid siin, see ei kustuta 0. ja 1s siin, Pigem on see lihtsalt muudab neid kõiki, näiteks kuni 0. ja dot, dot, dot. Nii et üks sinu tulevik psets tegelikult olla tahtlikult andmete taastamine - fotode, et oleme võtnud inimesi, kohti ja asju ülikoolilinnakus mille teeme kohtuekspertiisi pilt Digikaamera mälukaart, mis on täpselt sama mõte - ja sul on ärgitada tegelikult leida mustreid, mis esindavad JPEG kõvakettal, meelega, et endine õpilane, kelle e-posti Lugesin paar nädalat tagasi tegin tagasi oma õe fotod. Miks me ei võta 5-minutilise pausi siin, ja me koondada rohkem mälu. Nii et siin on koht, kus asjad veidi Hallutsinatsioone, kuid see on väga võimas samm poole mõista seda enam. Siin on programm nimega pointers.c. See on üks tänapäeva proovi kood. Pane tähele, et paar esimest rida, 19 kuni 22, kõik me teeme on midagi getString ja tagasituleku aadress, talletades seda s. Edaspidi jaoks pset isegi 3, kui soovite, kuid pset 4 ja edasi kus saab hakata võtma neid abirattad maha ennast, ei ole põhjust teeselda, et stringide eksisteeri enam. See on kindlasti okei lihtsalt alustada öeldes, char *. Nagu kõrvale, online-viited ja raamatud, mida võib sageli näha tähe kõrval muutuja. Sa võid isegi näha ruumid ümber mõlemal pool. Kõik need on funktsionaalselt õige. Praegu küll, me standardiseerida selline lähenemine teha super selge et char * on nagu öelda iseloomu pointer. See on andmetüüp. Ja siis muutuja nimi on s sel juhul. Nii oleme saanud string ja oleme otsustanud kutsuda seda s. Ja siis siin all märgata, et ma teen tegelikult natuke petmine. Seda nimetatakse pointer aritmeetika, mis on omamoodi super lihtne. See tähendab lihtsalt liita ja lahutada numbreid suunanäitajaks. Aga see tegelikult toimib. See programm ilmselt trükib stringid S 1 märk igale reale nii, et lõpptulemus - Just nii me võib rikkuda, kui see läheb, siis suunanäitajaks, joosta suunanäitajaks, lubage mul suumimiseks Nüüd lubage mul kirjuta midagi tere ja tüüp Sisesta ja ta prindib 1 märk rea kohta. Kuni hetk tagasi, me oleks seda teinud koos square bracket märke. Meil oleks loop ja me tahaks teha printf s [i] ja me tahaks seda uuesti ja uuesti ja uuesti längkriipsuga n lõpus igal real. Aga see programm on erinev. See programm kasutab sõna otseses mõttes, aritmeetika. Mis siis siin toimub? Esiteks, enne seda silmus isegi hukatakse, mida, et asi selge oleks, on s tegelikult? S on? >> [Üliõpilane] aadress. >> Aadress. Ja see on aadress, kui tegemist tere, esimene märk, et sõna, mis h. Nii s on see konkreetne näide, aadress h. Nii et mida see tähendab teha s + i? Noh, ma algab 0 selles jaoks silmus. Me oleme seda teinud mitu korda. Ma ei kavatse minna kuni stringi pikkusena, ilmselt. Nii et esimese iteratsiooni see silmus, ma ilmselt 0. Nii et see väljend ütleb s + i - pigem s +0--see on ilmselt lihtsalt s. Mis on * on siin? Nüüd me kasutame täht veidi teistmoodi. Lubage mul minna ja vabaneda t, sest me oleme valmis rääkima t ja koopiad s. Nüüd me lihtsalt tahame rääkida lugu kaasates s. Ja nii praegu, pärast string-tüüpi, meie maailm välja üsna nagu see oli enne lihtsalt s ladustamiseks aadress h ja üldisemalt osutades string tere. Kui ma nüüd tegema rida nagu * (id + i), proovime seda. Nii * (id + i). Lubage mul seda lihtsustada, sest see on 0, nii et see on * (id +0). Noh, oota natuke. Lihtsam edasi. See on * (id). Noh, nüüd sulgudes on tobe, nii et nüüd lähme lihtsalt teha * s. Nii esimese iteratsiooni see silmus, et rida, mis on esile tõstetud, 26, on päris palju vastab trükkimiseks. Mis on andmetüübi * s? Seoses sellega, sest täht juhtub olema kõrval on iseenesest aga täpsemalt, sest me ei ole enam kuulutatakse s, me ei looda muutuja enam, ei ole mainitud char * kooskõlas 26. seal ei mainita märksõna string, me oleme lihtsalt kasutades muutuja nimega s, Selgub nüüd täht on veidi teistsugune ja küll segane tähenduses. * S tähendab siin minna aadress s ja prindi iganes seal. Nii s on siin, * s on - omamoodi nagu rennid ja redelid, järgige nool - siin. Nii et see on * s. Mis siis saab trükitud esimese iteratsiooni et loop rida 26? Ma printida% c, mis on kohatäide iseloomu, siis \ n uus rida. * (Id + i), kus i on 0 on lihtsalt see. Mis siis char ma paigutama% c jaoks? H. Järgmise iteratsiooni loop - saate tõenäoliselt näha, kui see läheb - järgmise iteratsiooni i on ilmselt 1, nii et see tähendab s +1, ja siis nüüd ma ei pea sulgudes sest nüüd täht peab ütlema mine mälu aadress s +1. Mis on s? Anna minna ajas tagasi ja öelda, et see nool nüüd ei ole tegelikult seda meile mingit teenet. Vaatame täpsemalt öelda, et see on hoidmiseks number 123 sest alguses see string Tere, see on aadress 123, see on 124, ja nii edasi. Nii et teist iteratsiooni kui ma räägin s +1, see on nagu öelda 123 1, muidu tuntud 124, mis siis char saab trükkida teist iteratsiooni? E kell mälu Aadress 124. Siis + jälle, 125, 126, 127, ja see ahel õnneks peatub enne kui saame siin sest ma kasutan strlen veenduda, et ma ei lähe liiga kõrge. Nii et ka see on see. Jällegi, see on lihtsalt nii, nagu oleksime teinud nädal tagasi. Las ma kirjutan seda rida allpool, kuigi me ei taha teha mõlemat. See on identne nüüd sellele. Nii et kuigi s on string, nagu me oleme oodanud seda nädalat, s on tõesti char *. Nii et kui me tahame olla super anal, see on tõesti õige, et kirjutada eripära kell nda asukohta kasutades neid numbreid aadressid ja see täht operaator, kuid ausalt öeldes, see on lihtsalt nii palju puhtam. Nii et see ei ole halb. Mingit põhjust peatus teha rida 27 siin, kuid 26 on praktiliselt samad, ja see on funktsionaalselt sama täpselt põhjuseid, et me arutame siiani. Ja lõpuks, 29 on lihtsalt hea tava. Üleskutse tasuta s tähendab, et nüüd sa annad tagasi mälu getString andis teile sest taas, nagu ma mainisin Esmaspäev, getString nädalaid on kasutusele bug oma kood. Sinu kood nädalat on olnud mälu lekked mille olete küsinud getString mälu, kuid sa pole kunagi olnud anda see tagasi. Ja see oli teadlikult valitud meile pedagoogiliselt sest see on lihtsalt liiga palju mõelda varakult. Aga nüüd meil on vaja rohkem sümmeetria. Kui te küsite arvuti mälu, nagu seda tehakse getString, nagu see on ilmselt jaoks malloc, peate nüüd pset 4 aastast ka tasuta sellist mälu. Teade see erineb öeldes int n. Sa ei pea vabastama, sest sa ei helistanud getString ja sa ei helistanud malloc. Ja isegi kui sa helistasid GetInt kui me lõpuks näha, GetInt ei jätku mälu, sest te võib tegelikult läbida umbes täisarvud ja ujukid ja tähed just nii me oleme seda teinud mitu nädalat. Stringid, kuigi on eriline, sest tegelikult nad ahel mitu tähemärki. Nii et nad on lihtsalt erinevad sümbolid ja ujukid ja ints jms. Aga me tuleme tagasi, et enne pikk. Kõik küsimused siis selle alguses viiteid? Jah. [Kuuldamatu õpilane küsimus] Ah, väga hea küsimus. Üks väheseid asju, C tegelikult teeb teid, mis on mugav, on see nuputab teile, milline suurus on andmetüüp ja siis teeb sellist korrutamine teile. See on oluline, kui tegemist on sümbolid, kuna peaaegu alati char on 1 bait, nii see lihtsalt toimib. Aga huvides arutelu, kui sa olid tegelikult trükkimine täisarvud ja sa tahad välja printida mingi väärtus on, mis osutavad täisarv, sa samamoodi ei ole vaja teha + 4 * i lihtsalt sellepärast, int on 4 baiti. Pointer aritmeetika tähendab, et C ja kompilaator teha kõik, et matemaatika teile. Kõik, mida selleks hoolivad on loendamise omamoodi inimeste mõttes. Jah. [Üliõpilane] Kui teil kuulutada stringi sees jaoks silmus, kas sul on vaba ta hiljem? Hea küsimus. Kui te deklareeritud stringi sees jaoks silmus, sa pead vabastama hiljem? Teil on vaja ainult vaba mälu, et sa jagada koos getString või malloc. Nii et kui sa just öelda midagi sellist - las ma panen looksulg nüüd nii kõik kood on seotud. Kui sa tegid midagi, kuigi buggily, nagu see, char * t = s, sa ei pea tasuta t sest t ei sisalda ühtegi viidet malloc või getString. Kui aga sa tegid seda, getString, siis jah, siis oleks vaja tasuta t. Ja tegelikult sinu ainus võimalus seda teha on nüüd sees see ahel, et sama küsimust ulatus et me oleme arutanud ka varem. Muidu oleksid sa eraldamise mälu, eraldades mälu, eraldades mälu, ja lõpus programm, sest sa oled väljaspool selle kontuuri, t ei ole, aga sa ei öelnud operatsioonisüsteemi et sa ei pea, et mälu enam. Ja enne ammu, pset 4 või 5 me varustada teid programmi nimega Valgrind, mis on sarnase sisuga GDB, et ta sai mõnevõrra kauge liides, kuid tema eesmärk elus on teid aidata. Ja Valgrind on programm, mis tulevikus otsida teie programmid otsin mälu lekib, kas alates getString või malloc, mis me hakkame kasutama kõiki rohkem kui me lõpetama CS50 raamatukogu nii palju. Me lõpuks on nüüd omamoodi sõnavara ja omamoodi vaimne mudel teoreetiliselt mille lahendamiseks purustatud programm. Nii et selles purustatud programm, swap töötab sees swap, kuid ta ei ole kunagi tegelikult töötatud peamised sest peamine möödus x ja y, tagasikutsumine, ja need kiideti poolt väärtused, kui nii võib öelda. Koopiad neist anti vahetada. Aasta lõpuks swap, ja b tõepoolest on vahetatud, aga muidugi x ja y, kui me arutasime esmaspäeval, ei olnud. Nii et ma teen ettepaneku roheline siin, et see on tegelikult lahendus siin. Ja tegelikult, las ma liikuda mu tähte lihtsalt olla järjekindel kuigi jällegi, funktsionaalselt see ei ole oluline. Tulevikus nädalat me selgitame, miks ja millal see asi. Nii roheline nüüd on lahendus. Ausalt öeldes tundub kogu palju Messier, sest mul on kõik need tähed. Lubage mul rõhutada ühte asja. Ülemisel real siin, kus ta ütleb int * ja int * b on põhimõtteliselt teeb sama asja, sest see on alati. Seda kuulutatakse 2 argumendid või parameetreid vahetada, millest esimene on int osuti nimega, millest teine ​​on int osuti nimega b. Ainuke asi mis on uus siinkohal on asjaolu, et seal on täht seal. Mida see tähendab? Ei ole int, b ei ole int. On aadress int ja b on aadress erinevate int. Alla siin on see, kus ma tunnistan C saab segane. Nüüd me kasutame staar, kuid see on erinev tähendus selles kontekstis. Sest me ei kuulutatakse suunanäitajaks, sest me oleme siin üleval, siin me oleme viite mahavõtmine asju. Nii tehniliselt, star selles kontekstis esimese, teise ja kolmanda rea ​​sees swap Kas dereference operaator, mis tähendab lihtsalt sinna minna. Nii nagu mu sõrme järgneb noolt h, * Mingil juhul minna sellele aadressile ja leia mind int, et on olemas. * B vahenditega minna aadress ja andke mulle, mida on seal. Nii et olgem ekraanigraafika pilt esmaspäevast kasutab nüüd virna raamid põhja millest üks saab olema peamine, ülemine millest üks saab olema swap, nii et meie maailm välja, just nagu Esmaspäev, niimoodi. Siin on patakas mälu, et peamine on kavatse kasutada. Meenuta alates esmaspäevast, et programm lihtsalt oli 2 muutujad, üks nn x ja üks nn y, ja hoidsin numbrid 1 ja 2 sinna. Nüüd, kui ma kutsun vahetada nagu ma tegin esmaspäeval, Varem, kui ma kasutasin punane versioon sellest programmist, mis näeb välja selline, Ma sain 2 parameetrite a ja b, ja mis me siis kirjutage siia ja siin? Lihtsalt 1 ja 2, sõna otseses mõttes kopeerib x ja y. Täna me seda muuta. Täna lähitulede asemel sisse ints ja b läheme edasi 2 aadressid. Need aadressid juhtuma juhtida tähelepanu ints, kuid need aadressid ei ole Ints ise. Nad on aadresse. See on nagu postiaadress asemel. Nüüd peame lihtsalt annan endale veidi täpsemalt ekraanil. See on minu arvuti mälu nagu see on olnud kogu päeva. Nüüd tuleb mõned suvalise numeratsiooniplaani. Nii et ütleme lihtsalt, lihtsalt juhus, et see on mälu aadress 123, 124. Ütleme nii, et see on 125, see on 126, ja nii edasi, aga see on täiesti meelevaldne. Vajame ainult natuke nummerdamise skeemi minu mälu. Nii et nüüd, kui ma tegelikult läbida x ja y, ma ei kavatse läbida x ja y; Ma lähen läbima postiaadress, kui nii võib öelda, x ja y nii et mida saab ladustada siin ja siin ei ole 1 ja 2, aga kui näete minu väike tekst, mis saab edasi siin ja siin? [Kuuldamatu õpilase vastus] >> Täpselt. 123 saab panna siin ja 124 saab panna siin. Nüüd, kuna ma kasutasin star selles väga esimene rida viis siin üleval, minu programm lihtsalt teab, et 123 ja 124, kuigi nad ilmselt täisarvud et iga inimese võib märgata, tuleks neid tõlgendada aadressid, numbriline aadresse. Nad ei ole ja ise ints, nad aadressid, ja see on, sest ma ei ole selgelt panna tähed sinna. Nüüd on minu esimene, teine ​​ja kolmas rida tegelik kood, mis juhtub siin? Joonistame ülejäänud pilt. THK on lihtsalt nagu see oli esmaspäeval. Midagi erilist tmp. See on lihtsalt kohalik 32 bitti muutuja, ja sees, et ma olen ilmselt ladustamiseks väärtus *. Nüüd, kui ma just ütlesin tmp =, mida ma panna siia? >> [Üliõpilane] 123. 123. Aga see pole see, mida ma teen. Ma ütlen tmp = *. Star vahenditega sinna minna. Nii et siin on, 123. Kuidas ma sinna minna? Teeskle, nagu seal nool. Noh, seal on, 1. Mis siis saab salvestatud tmp, ilmselt? Just 1. Nii et teiste sõnadega, tmp on *, * mingil juhul minna aadressile, mis on praegu, mis on ilmselt 123. Okei, siin me oleme asukoht 123, näen number 1, nii et ma panen number 1 seal. Nüüd mida ma pean tegema kooskõlas 2 * = * b? See üks on natuke rohkem kaasatud, sest nüüd, mis on? See on 123. Nii * on kus? Parem, kui ma olin varem. Nii et mine sinna. Okei. Nüüd lõpuks, ja siis lõpuks see hakkab mõtet, loodetavasti * B tähendab, mis see B? 124. Nii et ma pean sinna minema, mis on 2. Mida ma panen siis kus? 2 läheb siia, sest * b läheb *. Nii et ma teen seda. Ja sa võid juba näha, võib-olla, et me oleme nii palju lähemal lahendada see loll, lihtne probleem õigesti esimest korda sest nüüd on meil veel mälestus, mis x oli, meil on 2 eksemplari küll, y, kuid rida 3 nüüd ütleb * b. Nii et siin on b. * B vahenditega sinna minna. Nii et kui on asukoht 124? See on ilmselt siin. Mida ma küll siia paneme? Ilmselt tmp. Nii et nüüd ma teen seda. Nii et mul on 1 siin ja 2 siin. Ja nüüd, mida see kõik, 123, 124, ja 1? Niipea kui swap naaseb, seda mälu on sama hea kui kadunud sest niipea kui swap naaseb, operatsioonisüsteemi on tasuta kasutada, et mälu tulevikus uuesti. Ainult peamine mällu allosas see nn korstna pulgad ümber. Ja nii me lõpuks ometi nüüd tööversioon. Lubage mul minna swap.c ja märkate järgmist. Ülaosas programmi ma muutsin prototüüp tuleb int * ja int * b. Nii et ainus asi, mida ma muuta minna punane, mis oli halb, et roheline, mis on hea, on Lisasin need tähed täna. Aga siis siia alla vahetada ise pidin kopeerida, kleepida, mis oli lihtsalt slaidil. Mul on täht siin, star siin - mis sobib prototüüp - ja siis kõik need asjad on nüüd tähte välja arvatud tmp sest kasutada ajutise muutuja, pole midagi uut. Ma pean lihtsalt ajutine ladustamine int. Nii et me ei pea täht seal. Me peame lihtsalt täht, et saaksime piiriülese selline meelevaldne piir vahel need 2 kaadrit minu arvuti mällu. Aga üks asi on muuta, ja sa võisid glimpsed juba. Mida muud on, ilmselt on nüüd muutunud? >> [Üliõpilane] ja x. Jah, nii 25 on viimane rida koodi mul on vaja muuta see töötaks. Nädal tagasi ja isegi esmaspäeval rida 25 nägi välja selline, swap x ja y, ja see oli lihtsalt katki, sest kui sa ütled swap (x, y) Lubate eksemplari x ja y vahetada, siis ta teeb oma asja, kuid sa kunagi tõepoolest muutub x ja y ise. Nii et isegi kui sa pole kunagi näinud seda ette sümbol koos ampersand kodeeritud, võtke lihtsalt oletus. Mis ampersand teha, ilmselt? [Üliõpilane] võtab aadress. >> Võtab aadress. Nii-märk ütleb mulle aadressi x. Kes teab, kus see on? See juhtub olema 123. Mind ei huvita. Lihtsalt anna mulle aadress x. Ja y tähendab, anna mulle aadress y. Ja sel hetkel lugu on täiesti kooskõlas pilt me ​​juhtis hetk tagasi. Nii et ma tunnistama suunanäitajaks, kindlasti minu jaoks kui ma alustasin õppimist see, olid kindlasti üks raskemaid asju pakkima minu meelest ümber. Aga aru, eriti kui me hoiame mängides selliseid asju, kui sa jaotada see, et need super lihtne omamoodi intellektuaalselt ebahuvitav probleeme vaid liigub numbrid ümber, vastus palju segadust viiteid tõesti saab nendest saadud väga lihtne mehaanika. Siin on aadress. Mine sinna, kus täht. Või vastupidi, siin on märk. Joonis välja, mida aadressi tegelikult on. Hea küll. Nii et kui on kõik see mälu tuleb? Oleme juhtinud seda pilti paar korda ja ma hoida paljutõotav me tuleme tagasi selle, kuid siin on esindatud arvuti mälu mis on veidi rohkem märgistatud kui meie kriiditahvel on siin. Tekstiosa tipus näitab, mida seoses oma programmi? [Kuuldamatu õpilase vastus] >> Vabandust? Ütle uuesti. [Üliõpilane] tegelik programm. >> Tegelik programm. Nii et 0. ja 1s et olete koostanud pärast kirjutamist C koodi ja siis töötab rõkkama ja teeniva 0. ja 1s otsad käsile tõmmatud seal mälu sest kui te topeltklõps ikoonil Mac või PC või käivita käsuga nagu Mario oma kiire, teie 0. ja 1s kettalt saada laaditakse mällu, nii et arvuti saab manipuleerida neid ja täidab neid kiiremini. Nii käivitub andmed ja uninitialized andmed, siis me ei räägi palju neid, kuid need on vaid globaalsed muutujad. Käivitub tähendab globaalsed muutujad, mis sa andsid väärtused; uninitialized tähendab globaalsed muutujad, et sa ei anna veel väärtusi. Siis on need keskkonnamuutujaid mis ma täiesti siputan kätt, kuid nad on olemas ja et kauplustes asjad oma kasutajanime ja muud sorti madalama taseme üksikasju. Aga juiciest tükki oma mälu kujunduse on see asi, mida nimetatakse korstnat ja hunnik. Stack jälle, et oleks selge, on mälu, mida kasutatakse siis, kui ülesandeid kutsutakse, kui on kohalike muutujate ja kui on parameetrid on möödas umbes. Kõik see juhtub pinu. Hunnik me ei rääkinud, kuid teen oletuse, kes kasutab hunnik. Lihtsalt erinevad patakas mälu. See juhtub tuleb tõdeda tipus, kuid see on meelevaldne pildiline konventsiooni. Kes ilmselt kasutanud mälu hunnik nädalaid? See on tehniliselt sa vaid kaudselt. >> [Üliõpilane] getString. GetString ja malloc. Nii et siin on põhimõtteline erinevus. Sa tead, et viimase paari nädala jooksul, et kui teil on vaja mälu, lihtsalt kuulutada muutuja. Kui teil on vaja palju mälu deklareerida massiivi õigus sees oma funktsioon. Aga probleem meil hoida silmitsi on, kui te deklareerite muutujad kohapeal sees funktsioone, niipea kui tagastab funktsioon, mis juhtub mälu ja need muutujad? Lihtsalt mingi see ei ole enam sinu oma, eks? See lihtsalt kaob mingi kontseptuaalselt. See on ikka füüsiliselt olemas, muidugi, kuid see ei ole enam teie õigus kasutada. See on muidugi problemaatiline, kui soovite kirjutada funktsioonid elu et tegelikult mälu eraldada ja ei anna seda tagasi kohe. Kohtuasi punktis: getString oma eesmärk elus on, ei tea ette kui suur on string ma lähen tüüp AT klaviatuur, aga see ju olema võimalik mälu eraldada hoida David või tere või terve essee, et kasutaja oleks võinud kirjutada logida Nii getString on kasutanud malloc. Malloc seetõttu tuleb kasutada mitte korstna; selle asemel, et see kasutab see asi nimega hunnik. On midagi muutunud mälu. See ei ole kiirem või aeglasem või midagi sellist. See on lihtsalt füüsiliselt teises kohas. Aga reegel on, et mälu, mis on jaotatud hunnik kunagi ära võtta, kuni te helistada - Take A Guess - tasuta. Vastupidi, iga mälu te küsite kohta virna lihtsalt välja kuulutades massiivi või deklareerib muutuja nagu me oleme seda teinud mitu nädalat, et vaikimisi jõuab pinu. Ja see töötab suurepäraselt 90% ajast, kuid nende haruldasemate korda kuhu soovite mälu eraldada ja hoida seda ümber, siis peate kasutama funktsiooni nagu malloc. Või oleme kasutanud funktsioon nagu getString, mis omakorda kasutab malloc. Vaatame, kus see võib murda ja siis kurkistaa Binky. Me tuleme tagasi, et ka tulevikus. Siin on super lihtne programm, et esimesed 2 rida teeb? Inglise keeles, mida need esimesed 2 rida koodi teha sees peamine? [Kuuldamatu õpilase vastus] Hoolikas. See ei anna mulle aadress x või y. [Üliõpilane] annab vihjeid ints. >> Hea. Andke mulle 2 suunanäitajaks täisühikuteni. Teisisõnu, anna mulle 2 mäluhulka et ma hoida joonistus täna, kuigi ma kustutada see nüüd, kui ruutu. Andke mulle 2 mäluhulka üks nn x, üks nn y - varem ma helistasin neile s ja t - ja mis tüüpi, et patakas mälu? See saab salvestada aadress. See on tüüpi int *. Nii aadress int lõpuks elab x, aadress int lõpuks elab y, kuid esialgu, mis seal sees on x ja y? Kes teab? Prügi väärtused. See on midagi pistmist suunanäitajaks. Kui me ei ole panna midagi seal, kes teab, mis on tegelikult olemas? Nüüd, x. Mis siin toimub? See on legit nüüd, sest x on osuti. See on int *. Nii et see tähendab ma saan panna x-aadress mõned patakas mälu. Mis malloc tagasi? Täiuslik, tagastab aadressid, aadress Esimene bait on kogu patakas mälu. Mitu baiti on see ilmselt eraldatakse, näiteks see, et seadet? Mis suurus int? 4. Kui te arvate tagasi 1. nädal, see pole super oluline alati meeles pidada, et kuid sel juhul on kasulik teada, 4 baiti. Nii et see eraldab kohta hunnik 4 baiti ja see on tagastades aadress esimene, kes mind meelevaldselt. Nüüd, mis on x teed? * X = 42 teeb mida? Kui siinkohal lugu on meil x, mis näeb välja nagu seda mõned prügi väärtus, see on nüüd y mõned prügi raha, nüüd rida 3. Olen eraldatud 4 baiti. See pilt sisuliselt näeb välja selline. Või täpsemalt, kui see on meelevaldne aadress 123, see on see, mida meie lugu nüüd välja näeb. * X = 42 tähendab nüüd mida? See tähendab minna aadress 123 ja pane number 42 seal. Ma ei vaja juhtida need read, sest me ei tee stringid. Ma oleksin pidanud lihtsalt kirjutada seda niimoodi, ja lihtsalt demonstreerimiseks pärast, 42 Nagu int tüüpi kulub palju ruumi, 4 baiti. Nii et see, mis juhtus seal, kuid seal on probleem nüüd. * Y = 13. Mis juhtub siin? Probleem on * y meie lihtsustatud maailmas tähendab lihtsalt minna aadressile y. Mis on y? See on mingi prügi väärtus. Nii oletame, et prügi väärtus on 5551212, midagi hullu niimoodi. * Y mingil juhul minna lahendada 5551212. See on nagu siin. Seda ei ole olemas, näiteks. Nii * y saab 13 tähenduses Püüan teha 13 siin. Seda ei ole olemas. Olen ületanud segment tahvli. Mida ma saan? See krüpteeritud sõnum killustatust süü, sest ma üritan panna mälu väärtus nagu 13 kohas, mida ei eksisteeri. Ülejäänud programmi võiks töötada okei, aga kuni selle punkti see ei ole. Nii et proovime jutustada lugu. Me tuleme tagasi, et kui me rääkisime hex. Lähme tagasi selle ja sõlmida see asi nimega Binky, mis meenutavad on Stanfordi professor istub kodus mängides claymation, öelda lugu täpselt seda sama programmi. See on lihtsalt umbes 3 minutit pikk. Siin on meil Binky. [Mees kõneleja video] Hei Binky, ärka üles. On aeg osuti lõbus. [Binky] Mis see on? Lugege vihjeid? Oi kui tore! [Mees kõneleja] Noh, alustada, ma arvan, et me lähed vaja paar suunanäitajaks. [Binky] Okei. See kood suurusega 2 suunanäitajaks, mis võib tuua täisarvud. [Mees kõneleja] Okei. Noh, ma näen 2 suunanäitajaks, kuid nad ei tundu olevat osutades midagi. [Binky] Just nii. Esialgu vihjeid ei viita midagi. Asjad viitavad need kutsutakse pointees, ja milles nad üles on eraldi etapis. [Mees kõneleja] Oh, ja õigusega. Ma teadsin seda. Pointees eraldi. Er, siis kuidas sa jaotada pointee? [Binky] Okei. See kood eraldab uus täisarv pointee, ja see osa sätestab x juhtida sellele. [Mees kõneleja] Kuule, see näeb parem välja. Nii et see midagi. >> [Binky] Okei. Tulen dereference osuti x salvestada number 42. viimiseks pointee. Seda trikki ma vajan oma võlukeppi ning viite mahavõtmine. [Mees kõneleja] Sinu võlukepp on viite mahavõtmine? See on tore. [Binky] Seda koodi välja näeb. Ma lihtsalt loodud mitmeid ja ... [Pauku] [Mees kõneleja] Hei vaata, seal ta läheb. Seejuures dereference kohta x järgmiselt nool juurdepääsu oma pointee, sel juhul salvestada 42 seal. Hei, proovige see salvestada number 13 läbi teise osuti, y. [Binky] Okei. Ma lähen siia, et y ja saada number 13 moodustatud ja siis võtta võlukepp kohta viite mahavõtmine ja lihtsalt ... [Sumin heli] Vau! [Mees kõneleja] Oh hei, mis ei tööta. Ütle, Binky, ma ei usu viite mahavõtmine y on hea idee sest loomise pointee on eraldi etapis ja ma ei usu me kunagi tegime seda. [Binky] Hmm, hea punkt. [Mees kõneleja] Jah. Me eraldatud kursor y kuid me ei sea see käsk pointee. [Binky] Hmm, väga tähelepanelik. [Mees kõneleja] Hei, sa näed hea välja seal, Binky. Kas sa seda parandada nii, et y osutab sama pointee kui x? >> [Binky] Muidugi. Ma kasutan oma võlukeppi ning osuti loovutamisega. [Mees kõneleja] Kas see saab olema probleem nagu enne? [Binky] Ei, see ei puutu pointees. See lihtsalt muutub üks osuti osutada sama asi nagu teine. [Pauku] [Mees kõneleja] Oh, ma näen. Nüüd y viitab samas kohas kui x. Nii et oota. Nüüd y on fikseeritud. See on pointee. Nii et võite proovida võlukepp kohta viite mahavõtmine uuesti saata 13 üle. [Binky] Ee, okei. Siin läheb. [Pauku] [Mees kõneleja] Hei, vaata seda. Nüüd viite mahavõtmine töötab y. Ja kuna viiteid jagavad, et üks pointee, nad mõlemad vt 13. [Binky] Jah, jagamine. Mida iganes. Nii me siis vahetada kohad nüüd? [Mees kõneleja] Oh, vaata, meil aeg otsa saama. >> [Binky] Aga - [Mees kõneleja] Pea meeles, 3 pointer eeskirju. Number 1, põhistruktuur on see, et teil on osuti ja see toob üle pointee. Aga osuti ja pointee on eraldi, ja levinud viga on loodud pointer aga unustada, et anda sellele pointee. Number 2, osuti viite mahavõtmine algab osuti ja järgis nool üle juurdepääsu oma pointee. Nagu me kõik teame, see töötab ainult siis kui on pointee, millist saab tagasi Reegel number 1. Number 3, osuti loovutamise kulub üks osuti ja muudab selle osutada sama pointee teise osuti. Nii et pärast üleminekut, 2 suunanäitajaks toob välja sama pointee. Vahel kutsutakse seda jagada. Ja see kõik on seda tõesti. Hüvasti nüüd. See on Binky. See on CS50. Näeme järgmisel nädalal. [Aplaus] [CS50.TV]