[Powered by Google Translate] [4 savaitė, Tęsinys] [David J. Malan - Harvardo universiteto] [Tai CS50. - CS50.TV] Tai CS50, o tai yra 4 savaitės pabaigos. Taigi gerų naujienų ir blogų naujienų. Ne paskaita pirmadienį, jokių problemų kitą savaitę. [Studentai Dopingowanie] Jūs nesiruošia patinka, kur tai vyksta. Bet mes turime tai, o ne kitą trečiadienį, , o taip pat už mokymo programos 1 penktadienis paskaitą kitą penktadienį, kad mes galime likti ant bėgių. Bet viskas bus nufilmuotas, kaip įprasta, todėl ne nerimauti. Ir atsižvelgiant viktorina 0, ką mes padarysime, link savaitės pabaigos rašyti aikštyno Tinklapis cs50.net paaiškinimas kokios rūšies lūkesčių jūs turėtumėte turėti, kai jis ateina į pirmą viktorinos. Apskritai, tai bus daug pasirinkimo, tiesa klaidingas, trumpas atsakymas, trumpi kodavimo problemos. Jūs esate nesiruošia, galima tikėtis įgyvendinti ekvivalento problema, kad galėtumėte pamatyti ant pset, dėl kurių turite kompiuterį Debugger ir panašiai, bet ten bus mažos kodavimo problemos. Ir iš tiesų, geriausias vadovas, ką CS50 viktorinos jausmą yra tarsi , tai eikite į cs50.net, eikite į viktorinos nuorodą, ir jūs galite pamatyti verta viktorinos Pastaruosius kelerius metus. Tiesiog suprasti, kad mokymo programos ne visada buvo tas pats per metus. Kartais mes, kartais atimti, taigi jei tam tikrą temą vienoje iš tų senų viktorinos kad jūs neturite idėjos, ką jis kalbėti apie, tai, kad mes jį padengti arba, kad mes ne jį padengti. , Bet ir nuomonių forma, šį sekmadienį, pirmadienį, ir antradienį taip pat kurso pasaulyje sesijos apžvalgos sekmadienio naktį - laikas ir vieta bus paskelbta kurso puslapyje - jūs visi turite galimybę peržiūrėti kurso mokymo bičiuliais šiais metais medžiaga, tiek iš atskirų sekcijų ir kaip visą klasę, ir tiems, bus filmuojamas, kaip įprasta, taip pat. Gerai. Taigi, be tolesnio ceremonija, vienas komentaras apie praeiti / nesugeba ir pridėti / drop. Tu gali matyti savo užrašus praeitą naktį, ir tai tikrai tik keletas papildomo užtikrinimo kad, jei esate tarp tų, ypač mažiau patogūs ar kažkur tarp ir jūs jaučiatės tik šiek tiek virš galvos, suprasti, kad iš tikrųjų yra visai normalu, ir ten daug paramos struktūra, iš kurių vienas biuro darbo valandomis ketina pagerinti dar labiau per mano elektroninio pašto paskutinę naktį, ir suprasti, taip pat, kad kaip Pass / nesugeba panašaus į tai klasei tikrai reiškia kaip mechanizmo imtis kraštą, kaip šis, kad dar kartą, jei jūs išleidžiate tuos 10, 15, 20 valandų tiesiog bando gauti šiek tiek pset dirbti, ir jūs žinote, esate 90-95%, kaip yra , bet jūs negalite rasti šiek tiek velniškai klaidą, praeiti / nesugeba modelį, tai tarsi gerai. Idėja yra tai, kad su šiuo mechanizmu galite tada eikite sutelkti dėmesį į savo kitų psets ar miegoti ar kokia ji yra, kad jūs norite sutelkti dėmesį į šiuos uždavinius. Taigi suprantame, kad turite iki ateinančiais antradienis - techniškai 5. pirmadienis, bet tai šventė, todėl ateinančiais antradienis - pereiti nuo verčių atitikimo / neatitikimo surūšiuoti arba atvirkščiai. Ir jei jūs tikrai bedugnės ir galvoja bus atsisakyta visiškai, sugauti mane po paskaitos ar Drop me a note. Mes norėtume bent Čate prieš pateikiant pasiūlymą Atleisti. Gerai. Taigi mes pradėjome mokymo ratams paskutinį kartą. Visų pirma, mes sutelktas į eilutę. Eilutė yra kažkas, kad deklaruoti į CS50 bibliotekoje, tame faile vadinamas cs50.h pradėsime pažvelgti į šią savaitę ir kitą. Tačiau eilutė yra tikrai tik kažkas supaprastinimas tai šiek tiek daugiau arcanely kaip char *. Char mes esate susipažinę su. Tai tik vienas simbolis. Bet * pirmadienio žymimas ką? >> [Studentas] rodyklė. Rodyklę. Ir kas rodyklė? >> [Studentas] adresas. Tai, pavyzdžiui, adresą, ATMINTIES VIETA. Kas yra adresas arba vieta arba atminties? Vėlgi, visi iš mūsų turi nešiojamuosius kompiuterius koncertą ar 2 GB RAM, labiausiai tikėtina, šių dienų, ir tai reiškia, kad turite milijardą arba 2 mlrd. atminties baitų verta. Ir tai tikrai ne klausimas, ką jis fiziškai atrodo, bet tikėjimu, kad jūs galite sunumeruoti visi atskirų baitų, kad jūsų nešiojamasis kompiuteris turi 0 baitų, tai yra 1 baitas, tai yra baitas 2 mlrd. ir tai, ką kompiuteris. Kai jums skirti vietos vieną požymį, pavyzdžiui, jis akivaizdžiai turi gyventi kažkur jūsų kompiuterio atmintyje, o gal tai ne baitų skaičius 12.345 ir kad turi būti kažkur čia, jūsų kompiuterio atminties. Ir adresas, tada šio pobūdžio yra 12345. Dabar, savaitę 0 per dabar iki šiol, mes tikrai ne slaugomi kur yra saugomi atminties dalykų, nes mes paprastai naudoti simbolius, kintamieji, masyvai, kad iš tikrųjų gauti mūsų duomenų. Bet nuo pirmadienio o juo labiau šiandien, jūs dabar ketinate turėti tuo labiau išraiškingas programų rašymo galimybes su tikrai manipuliuoti kompiuterio atmintį, tačiau jums atrodo tinkama, ir geriems tikslams, ir blogų, klaidų yra labai dažnas rezultatas šiuo mokymosi šią medžiagą. Bet ką iš tikrųjų reiškia būti char *? Leiskite eiti į priekį atgal - ir mes grįžti į Binky, kaip buvo žadėta šiandien. Eikime paprastas pavyzdys čia. Leiskite man išsaugoti šį failą kaip compare.c, ir leiskite man tiesiog gauti tam tikrą šabloną kodą čia taip stdio.h, leiskite man atsiduoti apima cs50.h. Aš padidinti ten. Leiskite man pradėti rašyti pagrindinio int main (void), o dabar aš noriu padaryti kažką panašaus į tai: printf ("Duok man eilutę:") ir tada aš būsiu naudoti string ai gauna GetString gauti eilutę iš vartotojo, tada aš ruošiuosi paprašyti vartotoją vienas kitą. ("Duok man dar vieną eilutę:") ir aš ruošiuosi paprašyti juos per GetString gauti, kad. Aš jį vadiname t, nes t ateina po s ir s yra gražus pavadinimas eilutę, jei ji gana bendrinis. Taigi GetString, ir dabar aš tiesiog noriu daryti normalumas patikrinti ir aš norėčiau pasakyti, jei (-ai == t), tada aš tik ketina pranešti vartotojui printf ("Jūs įvedėte tą patį \ n"); nors aš ruošiuosi atsispausdinti kažką panašaus ("Jūs įvedėte kažką kitą! \ n") ar kokia bausmė bus. Taigi kažkas panašaus. Tada, kaip įprasta, aš sugrįšiu 0, kuris tiesiog reiškė, kad nieko blogo negali atsitikti, ir aš ruošiuosi eiti į priekį ir sukompiliuoti ir paleisti šią programą. Tačiau pirmadienį nubėgome šią programą, ir iš tikrųjų buvo pasakyta, kad Hello neatliekamas hello and goodbye nėra sudie. Elgesys, mes matėme, buvo šiek tiek daugiau kaip šis. Leiskite man eiti į savo šaltinio katalogą, padidinti čia ir darykime, kad palyginti. Parengė gerai. Aš bėgsiu palyginti. Duok man eilutę: Hello. Duok man dar vieną eilutę: Hello. Jūs įvedėte kažką kitą! Na, leiskite man pabandyti kažką paprasčiau, pavyzdžiui, 50, 50. Jūs įvedėte kažką kitą! hi, hi. Taigi aišku, kažkas vyksta čia. Bet kas buvo paaiškinimas, kodėl? Matyt, 12 linija yra visiškai asocialių. , Kas yra pagrindinė problema čia? Taip. >> [Studentas] Tai palyginti adresus. Taip, tiksliai. Tai tikrai lyginant adresus hello and HELLO yra saugomi. Tai ne lyginant raides HELLO vėl ir vėl, nes tai, kas iš tikrųjų nutiko, visą šį laiką mes naudoju GetString Ši lenta yra vėl mūsų kompiuterio atminties, ir tarkim aš vadinu GetString po skelbiantis kintamųjų s. Ką mano atmintis atrodo? Tegul savavališkai sako, kad ai atrodo taip. Tai kvadratas. Ir gana daug, bet kuriuo metu, aš sudarytas iš atminties gabalas ekrane jei tai 32 bitų, aš buvo piešimo kvadratų, pavyzdžiui, tai, nes iš tikrųjų prietaiso, rodyklė, adresas, yra 32 bitai. Tai tas pats kaip int. , Kurie gali skirtis priklausomai nuo kompiuterio sistemos. Tie iš jūsų, kurie miglotai susipažinęs su tuo, kad jūsų Mac arba PC 64 bitų, kad iš tikrųjų reiškia, kad kompiuteris naudoja 64-bitų patarimų, 64-bitų adresus ir tarp tos upsides jūsų kompiuteriuose gali turėti daug daugiau RAM nei pasekėjai. Trumpai tariant, atgal į tą dieną, kai tik kompiuteriuose naudojamas 32 bitų atstovauti adresus, didžiausias baitų skaičius, gali kilti šiuo atveju buvo tai, ką, jei turite 32 bitų? SO 4 mlrd., Į dešinę, nes 2 iki 32 yra 4 mlrd. Šis skaičius buvo pasikartojančių kursuose. Taigi, jei turite tik 32 bitų, didžiausias skaičius, kurį galima suskaičiuoti iki maždaug 4 mlrd. Bet tai buvo pagrindinis apribojimas kompiuterius, kol prieš keletą metų nes jei jūs galite tik tikėtis tokio pat aukščio kaip 4 mlrd. nesvarbu, jei jūs perkate 8 GB RAM arba net 5 GB RAM; jūs negalite tikėtis, kad didelis, todėl jis buvo nenaudingas. Galima tik pasiekti pirmuosius 3 ar 4 gigabaitų kompiuterio atmintyje. Kad mažiau klausimas dabar, ir jūs galite nusipirkti MacBook Pros ir Dells 8 GB RAM ar net daugiau šių dienų. Bet jei aš skirti tiesiog šioje programoje rodyklę, žymeklis, vadinamas s ji gali atrodyti ekrane, nes iš tiesų mes turime žievelės atgal šio sluoksnio. Aš nuolat sakau eilutę, bet pirmadienį, eilutė yra tikrai char *, kokio nors pobūdžio adresas. Todėl galime imtis, kad mokymo ratas išjungti, net jei mes ir toliau naudojant GetString dabar. Taigi, aš pareiškė, ai, ir tai yra daug atminties, 32 bitų riekė. Kas čia atmintyje pagal nutylėjimą? >> [Nesigirdi studentas atsakas] Kas tai? >> [Studentas] šiukšlių. >> Šiukšlių. Tiksliai. Jei jūs programuotojas nereikia įdėti vertę į kintamąjį, kuris žino, kas tai yra? Kartais jums pasisekė ir tai 0, kuris yra tipo gražiu, švariu numatytąją vertę, bet kaip matėme Pirmadienis, kartais tai visiška nesąmonė, tikrai didelis teigiamas ar neigiamas sveikasis skaičius, iš kur atėjo? Taip. >> [Studentas] funkcija anksčiau. >> Taip. Dažnai funkcija, kuri gavo iki šiol, nes prisiminti, kaip jūs vadinate atminties funkcijas, kurių jos imasi vis daugiau ir daugiau vietos iš apačios į viršų, ir kuo greičiau funkcija grąžina gauna pakartotinai naudoti, kad atmintis iškviečiamas kitas vaikinas, kuris naudoja savo patį atminties gabalas. Ir jei jūs jau palikote šiukšlių ten, ankstesnes reikšmes, mes galime klaida s kaip turintis tam tikrą vertę tada, kai tikrai mes neskirti nieko ten. Taigi, mūsų RAM šiuo metu atrodo taip. Dabar dešinėje pusėje linijos 7 mes kuriam skambinate GetString , kuriame mes jau darome dabar savaites, bet kas yra GetString tikrai daro? GetString parašė CS50 personalo yra šiek tiek protingas kad kuo greičiau vartotojas pradeda įvesdami raktai ir hitai Įveskite GetString skaičiai iš kiek klavišų paspaudimus Ar vartotojas nukentėjo, kiek simbolių aš turiu skirti RAM. Ir kur, kad RAM ateina, kas žino? Ji turi būti kažkur kompiuterio 2 GB arba Papuošalą atminties. Bet tarkime, kad kompiuteris čia rasti vietos žodžio HELLO. Žodis Įvedžiau H E-L-L-O. Ir, jei mes atkreipiame tai simbolių seka, mes galime padaryti tai, kaip šis. Bet man reikia daryti 1 papildomą dalyką. Nuo ko priklauso bet C eilutės pabaigos? Null charakteris, kurią mes rašome \ 0. Tai techniškai skaičius 0, bet Backslash daro viską, kad aiškiau , kad tai yra tiesiog skaičius 0, sveikasis skaičius 0; tai ne, pavyzdžiui, kotiravimu Unquote 0, kad galite įvesti ne klaviatūra. Taigi tai yra HELLO. Ir ką mes sakome, pirmadienį, kad, kaip GetString funkcija yra iš tikrųjų grįžta visas šias savaites? Jis negrįžta per se eilutę, nes tai nėra tikrai turi prasmę nes stygos nėra. Jie tarsi gamyba CS50 bibliotekoje. Kas yra tikrai eilutė, daugiau techniškai? >> [Studentas] Tai pirmasis simbolis. Tiksliai. Tai paprasčiausiai pirmą pobūdžio adresas, kad vartotojas turi įvesti. Taigi jei mano žodis HELLO baigiasi jį baitų skaičius 123 ir tada baitų skaičius 124, 125, 126, ir tt, jei aš tiesiog mano baitų skaičius nuo 0 iki , kas iš tiesų GetString grįžta, yra tiesiog skaičius 123. Taigi, ką gauna įdėti s yra skaičius 123, o ne Raidė H, nėra žodžio Sveiki, tiesiog adresas, kuriuo galiu rasti pirmąją raidę HELLO. Bet tai nereiškia, atrodo pakankamai. Aš paklausiau jūsų eilutę, o ne charakterį. Taigi, kaip mes arba "pranešė, kad Ello ateiti kartu su H tipo? Kas susitarimo ir mes turime? Taip. [Studentas] Jis saugo pasakoja rasti šiek tiek daugiau simbolių. >> Būtent. Yra toks "žmogus-kompiuteris sutartį, pagal kurią, kai susiduriame su Styga, kitaip žinomas dabar char žvaigždžių, jūs tiesiog turite išsiaiškinti, kur visų gyvenimo eilutės pabaigoje yra tikrai tik iteravimu per jį už linijos, while cikle, nepriklausomai, kad kai jums rasti eilutės pabaigos dabar galima daryti išvadą, kad, oh, visą žodį HELLO. Tiems iš jūsų, iš anksto programavimo patirtis gali žinoti, "Java" galite tiesiog paskambinti. ilgis ir kitomis kalbomis galite skambinti ilgį arba panašų. Tai todėl, kad daug kalbų, ypač dalykų vadinama objektinės kalbos, ko nors ilgis yra natūra aplieti viduje pačių duomenų gabalas, daug, kaip mes aplieti ID ir pavadinimus ir namų viduje pirmadienį studentas. Bet C yra daug žemesnio lygio. Nėra objektai ar klasės, jei jūs girdėjote šias sąlygas prieš. Viskas, ką jums iš tiesų yra atminties adresai. Taigi tai yra tarsi senamadiškas būdas atstovaujanti įdomių duomenų struktūras. Turite pradžios vertę, pavyzdžiui, pirmojo pobūdžio adresą ir tada tiesiog kai kurie vienašaliai, kad visi sutinka laikytis. Taigi, kaip yra įgyvendinama eilutės ilgis, mes siūlome? Strlen, strlen, kai kurie iš jūsų jau naudojami kelis kartus. Tai gana paprasta, tiesa? Tai lyg 2 eilučių kodo. Tai gana daug už tam tikra kilpa, o gal su papildomu vietos kintamąjį. Bet strlen tiesiog turi imtis žymiklį ir tada pradėti ieškoti \ 0. Ir kuo greičiau tokį, koks jis, jis gali grąžinti ėmėsi veiksmų, kad ji toje eilutėje skaičių. Taigi galime daryti išvadą, iš to, kas vyksta šalia. Tarkim, aš pareiškiu, t, kaip aš padariau 10 eilutės. Tai kai šiukšlių vertė. Kas žino iš pradžių? Bet 10 eilutėje dešinėje pusėje vadinu GetString vėl. Kas žino, kur tai baigiasi? Tegul savavališkai teigia, kad operacinė sistema rasti vietos tai būdas per čia. Aš atsitikti, kad atsitiktinai vėl įveskite H-e-L-L-O, ir taip galima padaryti tos pačios rūšies vaizdą. Bet tai, kad aš atkuriamas šią nuotrauką tyčinio nes tai yra skiriasi HELLO nei šis. Taigi čia, tai gali būti vieta 456, tai 457, ir tt. Taigi, ką gauna įdėti, kur kažkada buvo klaustukas? Šiuo atveju 456. Mes skinti šiuos numerius savavališkai, nes tikrai po to, kai šiandien mes neketiname rūpintis tiek daug apie ką nieko adresas. Visi, mums rūpi, kad mes galime išsiaiškinti kai kurių duomenų lapo adresą, kaip HELLO. Taigi tikrai, ką dauguma žmonių informatikos, kai kalbame apie atminties adresai ir kalbėti apie rodykles konkrečiau, o ne vargintis suprasti, 123 - who cares, kur iš tikrųjų yra ši medžiaga, mes tiesiog žinome, kad tai yra tam tikru skaitmeninis adresas - mes supaprastinti pasaulį ir tiesiog pasakyti, kad ai yra nukreipta į šio pobūdžio ir t yra nukreipta į šio pobūdžio. Ir tai, kad ji rodyklė yra gana sąmoningas nes tiesiog dabar s nukreipta į H ir t yra nukreipta kitame H , nes bent dienos pabaigoje, ji nesvarbu koks adresas, bet tai tikrai svarbu, kad mes turime galimybę pareikšti, kad kai kodo fragmentą adresą su. Mes tikrai ne tik dar manipuliavo šiuos adresus todėl mes pamatyti, kur mes galime įsikišti ir rūšiuoti, ką papildyta nuorodomis, bet ir dabar atitinka 12 pažodžiui Kokios vertybės yra palyginti atsižvelgiant į šios linijos 12 istorija? Mes sakome, yra 123 lygus lygus 456? Ir tai tikrai ne tas atvejis. Ir net konceptualiai, tai rodyklė yra tikrai ne tas pats, kaip ir nes jūs vadinamas GetString du kartus, o GetString nesistengia būti itin protingas, jis nesistengia suvokti, oi, įvedėte HELLO prieš 5 minutes; leiskite man duoti jums tą patį žymiklį, kaip aš jums davė prieš, jis tiesiog paskirsto atmintį kiekvieną kartą, kai jį vadiname naują riekė. Taigi, kaip mes galime išspręsti šią problemą? Jei aukštesnio lygio Noriu palyginti eilutes Sveiki ir HELLO - Man nerūpi, apie rodykles, kaip aš galiu eiti apie atsakant į klausimą, vartotojo įveskite tą patį? Tai, kas būtina? Taip. [Studentas] Naudokite funkciją. >> Galiu naudoti funkciją out of the box. Aš galiu naudoti funkcija vadinama strcmp, s-t-r-c-m, p-, tik sutrumpinta versija pasakyti eilutė palyginti. Ir jei mes einame į, pavyzdžiui, palyginti 2, kuri yra viena iš šiandienos dalomoji medžiaga, Aš lygiai taip pat. Aš nuolat visa kita iš 1 eilutę žemyn iki 26, arba tiek, ir dabar pastebėsite, ši dalis tik šiek tiek pasikeitė. Ignoruoti for a moment, 28 eilutę ir sutelkti dėmesį tik į šį vieną. Ką mes sakome, pirmadienis g lyginimas? Jis tvarko 2 patarimų, S ir T procesą, šiuo atveju, tarsi beveik savo pirštą ant tų 2 raides, ir tai, ką jis turi padaryti, tai kažkas panašaus į while cikle ar už linijos, ir ji sako, tai yra tas pats? Jei taip, tai juda pirštais arba rodykles į priekį. Ar tai tas pats, tai tas pats, tai tas pats, tai tas pats, tai tas pats? Ir ooh, aš ne eilutės pabaigos S ir T. Neradau jokių prieštaravimų. Taip, šios eilutės yra tokios pačios. Ir ką g palyginti grąžinti, jei 2 eilutės yra tokios pačios, matyt? Nuliui. Taigi 0 yra geras šiuo atveju, nes jei ji grąžina -1 arba +1 tai reiškia, kad ai tiesiog atsitinka prieš t abėcėlę arba po t. Ir kodėl tai būtų naudinga turėti funkciją, kuri jums pasakys, styginių ateina prieš arba po žodyne? [Studentas] Paieška. >> Paieška ir rūšiavimas. Todėl jūs galite daryti tokius dalykus, kaip dvejetainis paieškos ar burbulas rūšiuoti arba sujungti rūšiuoti kur jūs turite palyginti dalykų. Iki šiol mes natūra sumažinti kai kampus ir tik kalbėjo apie rūšiavimas skaičių, nes tai malonu ir lengva kalbėti, bet tu tikrai gali palyginti eilutes, obuolių ir bananų, nes jei "Apple" yra žinoma, kad prieš bananų, panašiai, galite perkelti eilutes aplink atmintyje kaip Rob su Merge sort vaizdo ir mes čia ant scenos atrankos rūšiuoti, įterpimo rūšiuoti ir burbulas rūšiuoti. Taigi, kur dar galime į tai? Pabandykime tai. Leiskite tarsi pamiršti, kad pamoką for a moment, ir pabandyti ir kopijuoti 1.c, atlikite šiuos veiksmus. Atitinka 21, aš sakau ką nors atspausdinti, tada gaunu eilutę nuo vartotojo, tada aš patikrinti. Mes tikrai ne Dotarłeś į šio įpročio dar, bet tegul dabar tai padaryti. Leiskite faktiškai žievelės atgal šio sluoksnio. Tai tikrai char *. Šis vaikinas yra tikrai char *. Taigi, ką tai reiškia, turi būti patikrinti, jei s == NULL? Pasirodo, kad kai skambinate kaip GetString funkciją arba apskritai tiesiog paprašykite kompiuterį duoti jums šiek tiek atminties, kažkas gali suklysti. Jums gali būti crazy, ir paklausti kompiuterį terabaito atminties prašo trilijonų baitų atminties, kad tiesiog neegzistuoja kompiuterio, bet GetString ir kitas funkcijas reikia šiek tiek šaukiantį į kelią jei jūs paprašė per daug. Ir būdas GetString tai daro tai, jei jūs paprašė daugiau atminties nei yra kompiuteryje, net jei tai super, super maža tikimybė nes nė vienas iš mūsų ketinate tipo trilijoną simbolių ir tada paspauskite Enter, bet maža tikimybė, tačiau ji gali būti, aš vis tiek noriu patikrinti, ar jį tik tuo atveju, ir ypatingą vertę, kad GetString, atsakymas, ir kitos funkcijos grąžina jei kažkas negerai yra NULL visais dangteliais. Ir, kas yra NULL? NULL, tiesiog taip atsitinka, atstovauti rodyklę. Tai atminties adresas 0. Pasaulis nusprendė, kad savavališkai, jei tai mano kompiuterio atminties - žinote, ką? - mes ketiname pavogti tik 1 baitas kiekvieno kompiuterio atmintyje, ir tai yra vieta, 0. Mes ketiname suteikti jai NULL slapyvardį, ir mes ketiname pažadėti kad mes niekada iš tikrųjų pateikė realius duomenis nes mes tiesiog savavališkai reikia ypatingą vertę, 0, dar žinomas kaip NULL, , kad galėtume klykauti vartotojams, jei kažkas negerai. Priešingu atveju jums gali nežinoti nėra 0 reiškia, įdėti ką nors čia ar tai reiškia, kažkas negerai? Mes visi sutinkame, kad NULL reiškia nieko buvo grąžintas, jokio realaus adresas buvo grąžintas. Dabar, čia aš tiesiog priimti savo žmogaus konvencijos I return 1 iš pagrindinės jei kažkas negerai. Tai todėl, kad pagrindinis sugrįžimas konvencija turėtų grįžti 0, jei geras, 1 ar kokios nors kitos vertė, jei blogai. Bet GetString ir bet kokia funkcija, kuri pasiūlymai atminties grąžina NULL, jei kas nors blogai. Gerai. Taigi, deja, 27 eilutėje, nors tai yra super paprasta, visiškai nepavyksta nukopijuoti eilutę. Kodėl? Mes galime pamatyti, tai taip. Aš teigdamas, atitinka 27 s kopiją ir pavadino jį t. Todėl aš nesu klausia vartotojui 2 stygos šį kartą, aš tiesiog pasakyti, s vertę turėtų būti t, taip pat. Taigi dabar tiesiog parodyti, kaip tai yra skaldytų, atitinka 29 tolimesnė ką aš darau? Pirmiausia aš patikrinti, jei t ilgis yra didesnis už 0. Yra ten kokį nors tekstą. Vartotojas turi įvesti ką nors in Kas yra eilutė 32 veikia, matyt? [Nesigirdi studentas atsakas] >> Teisė. Galite rūšies daryti išvadą, kad tai iš to, ką aš pasakiau tai daro. , Tačiau techniniu požiūriu, kas tai daro? t [0] yra kas? [Studentas] 0. charakterį. >> [Malan] 0. pobūdis. , Arba daugiau žmonių, pavyzdžiui, pirmasis simbolis t, kas tai bebūtų, H gal šiuo atveju. Ir toupper ką ji sako. Kapitalizuoja 0. pobūdį, t, ir pakeičia jį. Taigi, tai reiškia, kad imtis 0. charakterį t, kad jis didžiąsias, ir padėkite jį atgal toje pačioje vietoje. Taigi, jei aš tipo hello mažosiomis raidėmis, tai turėtų pakeisti mažosiomis h kapitalo H. Tačiau problema yra ta, kad eilutes 35 ir 36, ką aš apie tai padaryti yra atsispausdinti mums ir t. Ir kas tavo nuojauta? Ką aš iš tikrųjų ketiname pamatyti, jei aš įvedėte hello mažosiomis? Tai, kas vyksta norint atspausdinti? >> [Nesigirdi studentas atsakas] >> Kas tai? [Studentas] Big H ir poilsio mažas. >> Didelis H ir poilsio mažas, dėl kurių, s arba t? [Studentas] Tiek. >> Tiek. Tiksliai. Taigi pažiūrėkime, kas čia vyksta. Leiskite man eiti į priekį, ir kaupti šią. Tai Copy1, todėl įsitikinkite, Copy1. Gerai. Artinti Leiskite man eiti į priekį ir paleisti Copy1, įveskite Pasakykite ką nors: Apie mažosiomis raidėmis. Kapitalizuojamos kopiją, tačiau jis akivaizdžiai kapitalizuojamos originalus, taip pat, nes tai, kas dabar vyksta šioje istorijoje? Atitinka 27 aš ne iš tikrųjų atrodo, kad reikia nukopijuoti eilutę, bet net jei jums galėjo intuityviai tikėjosi, kad tuo atveju, , jei jūs manote apie šį paveikslėlį, kas iš tikrųjų aš padariau? Paveikslo pusė yra ta pati. Taigi leiskite įvirsta laiku, kad t dar neegzistuoja istorija. S gali egzistuoti į istoriją, bet tegul mažosiomis Apie šį kartą. Taigi, leiskite man nustatyti, ką aš įvedėte. Šiuo atveju čia mes turime h-e-l-l-o. Mes pavaizduoti ją kaip simbolių seką, čia įdėti savo separatorius linijas ir mano \ 0. Taigi tai yra, kur mes esame, kuo greičiau line 1 24-ish, duoti ar priimti, įvykdė. Tai vaizdas mano atmintyje. Kai gaunu 27 eilutėje, kas atsitiks? Kaip ir anksčiau, man žymeklį, kurį aš atkreipti šioje aikštėje. Tai vadinama k. Ir kas jo reikšmė pagal nutylėjimą? Kas žino? Kai šiukšlių vertė. Taigi aš abstrakti, kad toli kaip klaustuko. Ir kuo greičiau vykdo 27 linijos dešinėje pusėje, kas aš išleisti viduje t? Tas pats dalykas, kad s. For a moment, todėl, jei mes pašalinti šį imti rodyklės kryptimi ir sakome: oh, tai atminties apkrova adresas 123, kai jūs sakote, t gauna s, kabliataškiu, jūs tiesiog išleisti 123 čia. Dabar, jei mes rūšies supaprastinti mūsų pasaulį vėl su paveikslėliais, tai, ką jūs tikrai padaryti ką tik pridėjo dar rodyklę į jūsų pasaulį nukreipta iš t toje pačioje tiksliai eilutę. Taigi, kai atitinka 31 ir 32 aš iš tikrųjų eiti apie besikeičiančius t [0] kas yra t [0] matyt tapatinama su dabar? [0] Taigi, kad visa tai vyksta. Ir nors tai tarsi jaučiasi šiek tiek žemo lygio ir slaptas ir tai tarsi jaučiasi galbūt intuityviai tai turėjo būti tik dirbo - Aš padariau kopijas dalykų anksčiau, ir tai tik dirbo jei jūs iš tikrųjų galvoja apie tai, ką eilutė tikrai yra, tai char *. Na, kas tai yra? Tai kai kurių charakterio adresas. Tada galbūt tai suteikia daugiau prasmės, kad bandant kažką daryti super atrodytų, paprastas, kaip šis, visi jūs darote, yra kopijavimo atminties adresas. Esate ne iš tikrųjų nieko daryti su styginių. Taigi, net jei jūs neturite idėjos, kaip jums būtų išspręsti šią problemą kode, aukšto lygio, konceptualiai, ką mes turime padaryti, siekiant, kad ta kopija s, matyt? Taip. >> [Studentas] Duok jai naują vietą? >> Būtent. Mes turime duoti T naują vietą. Mums reikia kažkaip sukurti pasaulį, kuriame mes gauti naują atminties riekė, tik siekiant aiškumo, aš atkreipti tiesiai po šį vieną, bet ji nebūtinai turi būti ten. Tačiau jis turi būti to paties dydžio, todėl aš padaryti šias vertikalias linijas toje pačioje vietoje. Tai gerai, jei tai yra visi šiukšlių pradžių. Kas žino, kas ten buvo? 1 etapo rezultatai yra going to turi būti duoti man tiek daug atminties, kaip man reikia kad tilptų Hello kopiją, tada išsiaiškinti,, kaip kopijuoti h čia, čia e l čia, ir taip toliau. Bet tai jau turėtų jaustis šiek tiek akivaizdu, net jei kai kurios detalės dar yra abstraktus. Norėdami kopijuoti šią eilutę į tai, tai tik už linijos arba while cikle ar kažkas, su kuria jūs tapti labiau susipažinę. Taigi, pabandykime tai. Tegul man eiti į copy2.c. Į copy2.c turime beveik tą pačią programą, išskyrus 27 eilutėje. Ji atrodo šiek tiek sudėtinga, bet jei mes ją padalyti Kuskas, kairėje pusėje yra tas pats. Char * t sukuria atmintyje, nors šis dalykas su klaustuku nes mes neįsivaizduoju, ką ten pagal nutylėjimą. Dešinėje pusėje mes dabar pradedame naują funkciją, malloc, už atminties skirti, duok man atmintį, ir matyt, kiek argumentų, kaip daug dalykų viduje skliausteliuose? Aš girdėjau murmėjimą 1 ir 2, bet jis yra tik 1. Yra ne kablelis, kuris reiškia, kad yra tik 1 dalykas skliausteliuose. Nors yra kitų skliaustus, leiskite man pabrėžti, , kas viduje atokiausių skliausteliuose, ir tai tik išraiška: (Strlen (-ai) + 1) * sizeof (char). Taigi, jei mes iš tikrųjų manau, kad tai per, tai sako duok man s ilgis. Kodėl aš, nors ant ilgio pridedant 1? >> [Nesigirdi studentas atsakas] Tiksliai. Mums reikia vietos šis vaikinas už uodegos, šeštoji simbolių, kurie neturi anglų kalboje bet turi specialų programinį prasmę. Taigi, mes turime a + 1 už tai, nes strlen grįžta žmonių lūkesčiai ilgio, Apie arba 5, tai nėra suteikti jums papildomą null charakterį. Taigi, aš rankiniu būdu įtraukti + 1. Ir tada tai, * dydis (char), mes dar nematėte anksčiau. Tai nėra techniškai funkcija. Tai specialus raktinis žodis, kad tik jums pasakys, kokio dydžio yra kai kurių duomenų tipo kompiuteryje nes iš tikrųjų, kai kurie iš mūsų 32-bit kompiuterius. Turiu gana seną kompiuterį namuose, ir jis naudoja tik 32 bitų atstovauti patarimų. Ir todėl, jei aš padariau duomenų tipą, dydį, jis gali būti 32 bitų. Bet jei aš naudoju savo naują išgalvotas kompiuterį, aš galėtų gauti 64 bitų reikšmę kažką panašaus adresą. Taigi šiuo atveju, tiesiog super saugus, mes neketiname į kietąjį kodas kažką panašaus - gerai, kas yra char pagal tai, ką mes iki šiol buvo pasakyta dydis? Mes beveik sakė žodžiu, kad ji yra 1 baitas, ir kad gana daug visur. Bet vėl, prielaidos yra linkę būti blogai. Jie veda į Buggy programinės įrangos, jei žmonės savo programinę įrangą į būdų, kaip neketino. Todėl galime Anotacija toli ir tik daugiau bendrine pasakyti Man reikia tai daug atminties gabaliukus ir kiekvienas atminties riekė pobūdžio dydžio turėtų būti lygiavertis, , kuris iš tikrųjų yra lygi šiuo atveju 1, bet tai labiau bendro pobūdžio būdas raštu jį. Taigi, jei žodis yra Apie, kiek baitų malloc matyt skirti Apie? [Studentas] Šeši. >> Šeši. Tiksliai taip, kaip daugelis, kaip mes turime klaustukų ekrane. Ir tada imtis atspėti dabar remiasi savo supratimą apie GetString ką malloc tikriausiai grįžti? >> [Studentas] adresas. Koks adresas? Pirmojo atminties riekė. Mes neturime jokio supratimo, kas ten, nes kai kitas funkcijas, galėjo būti naudojant šią atmintį anksčiau. Tačiau, malloc, kaip GetString, grąžina adresą pirmojo baito atminties kad ji atidėta. Tačiau tai, kas ji nėra, tai užpildyti šį lauką tuščią įžambiuoju kairiniu brūkšniu null pobūdžio nes paaiškėja, galite naudoti malloc skirti nieko: int, stygos, masyvus, plūdes, studentų struktūros. Galite naudoti malloc visiškai bendrine. Ji nerūpi ar turi žinoti, ką jūs skiriant atminties. Taigi būtų įžūlu malloc įdėti \ 0 kiekvienas atminties riekė pabaigos ji suteikia jums nes tai \ 0 dalykas yra tik styginiams konvencija. Jis nėra naudojamas int, tai nėra naudojamos plūdės, tai ne studentams. Ir taip su malloc kabliuko, kad sunkumai yra visiškai jums programuotojas prisiminti, kiek baitų skiriama, o ne kada nors naudoti už linijos o linijos ir eiti pro riekė jums suteikta atminties ribos. Kitaip tariant, kuo greičiau paskirstyti atmintį, negali reikalauti, kad operacinę sistemą, oi, beje, kaip didelis atminties riekė buvo? Tai visiškai iki jums prisiminti, jei jums reikia, kad vertę. Taigi pažiūrėkime, kaip pradėti naudoti šią atmintį. Atsižvelgiant į 28 ir 29 kodėl aš tai daryti? Tik viso normalumas patikrinti. Tik tuo atveju, kažkas negerai, aš prašau nors crazy suma atminties ar aš turiu tiek daug dalykų veikia kompiuteryje, kad tiesiog nėra pakankamai atminties, kažką panašaus, kad aš bent norite patikrinti for null. Iš tiesų, dauguma kompiuterių duos jums iliuziją, kad kiekviena programa galite naudoti visas savo atminties, tačiau net ir taip, jei vartotojas įveda į šiek tiek beprotiškai ilgą eilutę gal, nes jie blogiukas ir jie iš tikrųjų bando katastrofos savo programą arba nulaužti į jį, norite bent patikrinti grąžinimo vertę malloc ir ar ji yra lygi NULL. Ir jei jis, tegul tiesiog mesti dabar, nes aš nežinau, ką daryti tokiu atveju. Kaip nukopijuoti eilutę? Yra keletas būdų, kaip tai padaryti. Yra g kopijuoti C funkcijas, bet tai super paprasta, mums tai padaryti senamadiškas būdas. Pirmiausia leiskite man išsiaiškinti, kas s ilgis yra. Aš galėjo įdėti šią nuorodą į kilpą, bet, o aš tiesiog įdėti jį čia dėl aiškumo. Taigi n dabar saugo pradinės eilutės ilgį, kuris, matyt, 5. Tada mano Loop aš iteravimu nuo 0 iki n, ir kiekvienos iteracijos aš pradėti s [i] viduje t [i]. Todėl tai, ką aš reiškė, su mano 2 pirštais, nukreiptos stygos prieš. Kaip for ciklas kartojasi, kaip šis, aš ruošiuosi reikia nukopijuoti h į čia, e į čia, l čia, nes tai yra, tai yra t. Ir tada galiausiai, line 35, kodėl aš tai padaryti? Man reikia įsitikinti, kad aš baigiasi eilutės t. Ir aš jį šiuo būdu būti itin aiškus. Bet pasiūlyti, ką nors, jei galėtumėte, įvairių būdų tai padaryti. Aš tikrai nereikia line 35. Yra dar vienas būdas tai padaryti. Taip. >> [Nesigirdi studentas atsakas] >> Pasakyk tai garsiau. [Studentas] Mažiau nei arba lygu. >> Būtent. Galėtume tiesiog pasakyti mažesnis arba lygus n, kuris apskritai buvo blogai nes beveik visada, kai mes einame į lygus dalykas mes skaičiavimo mes einame 1 žingsnį per toli. Bet atsiminkite, kiek baitų mes skirti? Skyrėme strlen s, taigi 5 + 1 už iš viso 6. Taigi šiuo atveju, mes galime padaryti kažką panašaus į tai todėl, kad mes kopijuojant ne tik Apie bet ir \ 0 pačioje pabaigoje. Be to, mes galime naudoti funkcija vadinama, g kopija, strcpy bet kad nebūtų beveik taip smagu. Bet tai viskas, ji po gaubtu. Tada galiausiai, mes darome tą patį, kaip ir anksčiau. Galiu pasinaudoti t ir tada aš tvirtina, kad pradinis atrodo ir kopija atrodo, kad. Taigi, pabandykime tai dabar. Leiskite man eiti čia. Padaryti copy2. Mes padidinti ir paleisti copy2. Aš ruošiuosi įvesti hello mažosiomis raidėmis, ir iš tiesų aš gausiu mažosiomis hello kaip originalas tačiau kapitalas Hello kopijos. Bet aš ne padaryti tik dar. 1 paskutinis dalykas, man reikia padaryti čia. 46 ir 47 yra aiškiai atlaisvinti atminties, bet ką tai iš tikrųjų reiškia? Ką aš darau, ar manote, paskambinus linija 46 ir 47 linijos? Kokį poveikį tai turi bendro? Taip. [Nesigirdi studentas atsakas] >> Taip. Jūs tiesiog pasako, kad operacinės sistemos, ei, ačiū už šios atminties. Dabar galite naudoti ją kažkam kitam. Ir štai puikus pavyzdys, šiukšlių vertybių. Aš tiesiog naudoti šią atminties užrašyti žodį hello 2 vietose, čia, čia, čia, ir čia. Taigi tai yra h-e-l-l-o-\ 0. Bet tada aš skambinti linija 46 ir 47 linijos, ir jūs žinote, kas jose vyksta paveikslėlio? Tiesą sakant, palauk, šis vaizdas yra senas. Kai mes darome kopiją, šis vaikinas yra iš tikrųjų nukreipta čia, tad pašalinti numerius ir tiesiog abstrakti toli, kaip mūsų rodyklėmis vėl. Tai, kas vyksta šioje nuotraukoje, kai aš skambinti nemokamai? [Nesigirdi studentas atsakas] >> Net. Jei aš vadinu nemokamai S ir T - tipo triukas klausimą - šį paveiksliuką nėra keisti nes paskambinus s ir raginama t tik pasakoja operacinę sistemą, Ei, jūs galite naudoti šią atminties dar kartą, bet tai nekeičia, tai nulis specialus simbolis arba kai, ji negali pakeisti tai, jis nekeičia h arba e arba L arba L arba THE O kas nors kitas bet kurios vietos. Paveikslėlio, kuo greičiau skambinti nemokamai, niekas nesikeičia. Ir jame slypi šiukšlių vertybių kilmę, nes, jei aš vėliau šioje programoje paklausti operacinę sistemą daugiau atminties su GetString ar malloc ar kažką panašaus, kad ir operacinė sistema sako, tikrai, aš turiu 12 baitų atminties, tik atsiradusiomis jomis naudotis, ką jūs ketinate būti perduotas? Jūs ketinate būti perduotas iš atminties riekė, kad mes paprastai atkreipti su klaustukais, bet kas yra tie klaustukai? Jie atsitikti, kad h-e-l-l-o, h-e-l-l-o. Tai yra mūsų nauji šiukšlių vertes kuo greičiau atlaisvinti, kad atmintis. Yra realus pasaulis potekstė čia. Tai atsitinka su RAM, tačiau jūsų kompiuteryje iš tikrųjų tą patį diską. Mes kalbame apie tai, ypač su būsimu problemą, kad pagrindinis dėmesys skiriamas ekspertizės. Bet kas iš tikrųjų vyksta, jei turite kokių nors jautrią finansinę failą darbalaukyje, arba kai paviršutiniškas JPEG ir vilkite jį į savo krepšio, kas atsitinka, kai jūs vilkite jį į šiukšlių dėžę ar "Recycle Bin"? Žinai, ką aš kalbu apie. [Juokas] Kas atsitinka, kai jūs tempia, kad įrodymai, į jūsų šiukšlinę ar šiukšliadėžės? [Nesigirdi studentas atsakas] Gerai, todėl atsargūs. Kas atsitinka, kai jūs darote, kad? Trumpas atsakymas yra nieko, tiesa? Paviršutiniškas arba jautrus byla vis dar tik sėdi ten kažkur kietajame diske. Daugelis iš mūsų bent jau sužinojau kietąjį būdu, kad jums reikia išvalyti šiukšles ar jūsų šiukšlinę, kad iš tikrųjų ištrinti failus. Ir iš tiesų, kai jūs dešiniuoju pelės mygtuku spustelėkite arba kontroliuoti savo krepšio, spustelėkite arba pasirinkti failą, Empty Trash ar whatever ir jūs iš tikrųjų ištuštinti šiukšlinės ar šiukšlinę, kas iš tikrųjų vyksta tada šioje nuotraukoje? Daugiau nieko. Todėl nieko iš tikrųjų vyksta diske. Ir jei mes tik laikinai nutolti ir rašyti - I'll tiesiog naudoti tai atgal. Taigi, dabar istorija keičiasi iš atminties, kur yra programos veikia o jūs naudojate juos į diską, kuris yra, kai jie yra saugomi ilgą laiką net tada, kai galios išeina, dabar - ir mes grįžti į tai ateityje - tegul tiesiog apsimesti, kad tai rodo, jūsų kompiuterio kietojo disko viduje , nes atgal per dieną, jie turi būti apskrito diskai, panašiai kaip diskeliai. Taigi, jei jūs turite kai slapta "Excel" failą, ji gali imtis šią atminties riekė kompiuterio diske, ir aš tik piešimo pati savavališką 1s ir 0s. Kai jūs vilkite failą, pavyzdžiui, kad į jūsų šiukšliadėžę ar šiukšlinę, tiesiog nieko neįvyksta, nes "Apple" ir "Microsoft" tiesiog nusprendė šiukšliadėžės ir šiukšlinę yra tikrai tik laikinas vietos rezervavimo ženklas. Gal pagaliau OS bus tuščias tai už jus, bet paprastai, jis nedaro nieko, bent tol, kol jūs tikrai mažai vietos. Tačiau, kai jūs einate į tuščią šiukšlių arba tuščias šiukšlinę, panašiai, nieko neįvyksta į šį paveikslėlį. Visa tai atsitiks, tai kitoje kompiuterio vietoje, yra kažkoks lentelės. Tai tarsi šiek tiek apgauti lapo, sako, kad, tarkim, resume.doc, todėl savo CV "Microsoft Word" failą kietajame diske 123 vietoje gyventi, ne atminties, o ne RAM, bet kietajame diske, ir jūsų apytikrės JPEG gyvena 456, ir jūsų "Excel" failų gyvena 789 ar kur. Jei norite ištrinti failus iš tikrųjų ištuštinti šiukšlinę, ar "Recycle Bin", šį paveiksliuką nesikeičia. 0s ir 1s kietajame diske neturi eiti bet kur. Tačiau šioje lentelėje, tai šiek tiek duomenų bazės rūšių, pasikeičia. Jei norite ištrinti savo CV, tai kaip nors failas yra ištrintas, tam tikra prasme, bet visi kompiuteris pamiršti, kur gyvena tas dalykas ant jūsų standžiojo disko. 0s ir 1s, kad rašyti savo CV ar bet kurį iš šių kitų failų yra vis dar nepaliestas. Taigi, jei jūs tai padarė netyčia, dar ne nulis tikimybė kad jūs galite atgauti savo duomenis, naudojant Norton Utilities ar tam tikrą komercinę programinę įrangą kurių gyvenimo tikslas yra rasti 0s ir 1s, kurie tarsi našlaičiai, pamiršote čia, bet paliko čia, kad jūs galite gauti savo duomenis atgal. Ar teismo tyrėjai su policija ar FTB iš tikrųjų kietąjį diską 0s ir 1s, kad atrodo kaip JPEG, atrodo Excel failus modelius iš tikrųjų atrodo, ir atkurti juos, kad taip, net jei kompiuteris pamiršo juos ten. Taigi vienintelis būdas tikrai ištrinti duomenis, nes mes aptarsime ateityje, krūmų arba nuvalykite failą arba kietajame diske - Jūs tikrai negali atsikratyti 0s ir 1s nes kitaip jums reikia pradėti su gigabaitų kietąjį diską ir norite baigti su megabaitą kietąjį diską, jei jūs nuolat buvo ištrinti, pažodžiui, 0s ir 1s. Taigi, ką jūs darytumėte, jei tikrai nori padengti savo dainos ir pagrindinė problema yra ta, kad vis dar 0s ir 1s diske? Aš matau, kad kas nors gesticulating, kad jums būtų fiziškai pertrauka prietaisą. , Kad bus dirbti. [Juokas] Bet jei tai tipo brangios tirpalo, kas būtų labiau pagrįsta? Taip. >> [Studentas] perrašyti juos. >> Perrašyti juos su tuo, ką? >> [Studentas] Kiti duomenys. Kiti duomenys. Jūs galite tiesiog perrašyti savo diską su 0s ar 1s ar visų 0s, visi 1s. Ir kad iš tikrųjų tai, ką kai kurie programinės įrangos ar. Jūs galite įsigyti programinės įrangos ar net gauti nemokamą programinę įrangą, ir net pastatytas mažiau, Windows, Mac OS šių dienų, yra galimybė saugiai ištrinti. Tiesą sakant, jei norite viso nuotekų namuose šiandien, jei turite "Mac", tai padaryti, jei jūs turite kai savo krepšio stuff, jūs galite padaryti, Secure Empty Trash , kuri veikia lygiai taip pat. , O ne tik ištrinti failus čia, tai nereiškia ištrinti 0s ir 1s, o jis tiesiog keičia juos visus, pavyzdžiui, 0s ir taškas, taškas, tašku. Taigi vienas iš Jūsų būsimų psets tikrai bus tyčia atkurti duomenis - nuotraukos, kad mes atlikome žmonių, vietų ir daiktų miesteliu , dėl kurių mes padaryti teismo ekspertizės vaizdą iš skaitmeninio fotoaparato atminties kortelės, kuris yra lygiai toks pats idėja - ir jūs turite būti ginčijamas, iš tikrųjų rasti modeliai,, kurios atstovauja JPEG kietajame diske, toks, koks buvęs jo studentas, kurio laišką aš perskaičiau prieš kelias savaites susigrąžinti savo sesers nuotraukas. Kodėl mes 5 minučių pertrauką čia, ir mes pergrupuoti su daugiau atminties. Taigi čia yra, kai ko gauti šiek tiek proto-lenkimo, tačiau tai yra labai galingas žingsnis link suprasti visa tai daugiau. Čia yra programa, vadinama pointers.c. Jis yra vienas iš šiandienos mėginio kodą. Atkreipkite dėmesį, kad pirmųjų eilučių, 19 per 22, visa, ką mes darome, yra kažkas panašaus GetString ir grąžinimo adresas, ją saugoti s. Nuo šiol už pset net 3, jei norite, bet pset 4 ir kur jūs galite pradėti imtis šių mokymo ratams sau, nėra jokios priežasties, apsimesti, kad stygos nebeegzistuoja. Tai tikrai gerai, tiesiog pradėti sakydamas char *. Kaip panaikinti, interneto nuorodas ir knygų galite dažnai pamatyti žvaigždę šalia kintamojo. Galbūt net pamatyti erdves aplink abiejų pusių. Visiems tiems, funkciniu požiūriu yra teisingi. Nes dabar, nors mes standartizuoti šiuo požiūriu, kad super aišku kad char * yra tarsi sakydamas simbolių žymeklį. Kad yra duomenų tipas. Ir tada kintamojo vardas yra s šiuo atveju. Taigi, mes Dotarłeś eilutę ir mes pavadino ji s. Ir tada žemyn čia pastebėti, kad aš darau iš tikrųjų šiek tiek gudrybės. Tai vadinama rodyklė aritmetiką, kuri yra tarsi super paprasta. Tai tiesiog reiškia, pridėti ir atimti skaičius rodykles. Bet tai iš tiesų veikia. Ši programa, matyt, spausdina styginių s 1 charakterį vieną eilutę, pavyzdžiui, kad galutinis rezultatas - Tik taip mes galime sugadinti, kur tai vyksta, kad patarimų, vykdykite nurodymus, leiskite man padidinti. Dabar leiskite man tipo kažką panašaus HELLO ir tipas Enter ir jis spausdina 1 požymį už linijos. Iki tol, kol prieš antrą, mes padarėme tai su kvadratiniu kronšteino notacijos. Mes norime turėti linijos ir mes norime padaryti printf s [i] ir mes norime padaryti, kad vėl ir vėl ir vėl kairinį pasvirąjį brūkšnį n prie kiekvienos eilutės gale. Tačiau ši programa yra skirtinga. Ši programa naudoja, pažodžiui, aritmetinis. Taigi, kas čia vyksta? Visų pirma, kol šis ciklas netgi vykdo, ką, tiesiog, kad būtų aišku, yra iš tikrųjų? S? >> [Studentas] adresas. >> Adresas. Ir tai adresas, Hello, šio žodžio pirmas simbolis, kuris yra h. Taigi s, šiuo konkrečiu pavyzdžiu, h adresas. Taigi, ką tai reiškia, tai padaryti s + i? Na, aš prasideda 0, už linijos. Mes padarėme, kad daug kartų. I ketinate eiti į eilutės ilgis, matyt. Pirmajam iteracijos procesui šio ciklo Taigi, aš, žinoma, 0. Taigi, šis posakis sako s + i - o, ai +0- kad akivaizdžiai tiesiog ai. Taigi, kas yra * čia? Dabar mes naudojame žvaigždė šiek tiek kitaip. Leiskite man eiti į priekį ir atsikratyti t, nes mes kalbame apie s t ir kopijas. Dabar mes tiesiog norime papasakoti istoriją, įtraukiant s. Ir taip šiuo metu, po to, kai tipo String, kad mūsų pasaulis atrodo gana, kaip ji tai padarė prieš tiesiog ai saugoti H adresą ir apskritai nukreipta į eilutę hello. Jeigu aš dabar liniją, pavyzdžiui, * (s + i), galime pabandyti šį variantą. Taigi * (s + i). Leiskite man supaprastinti, nes tai yra 0, todėl tai yra * (-ai +0). Na, palauk. Toliau supaprastinti. Tai * (s). Na, dabar skliausteliai yra kind of stupid, todėl dabar galime tik padaryti * s. Taigi pirmajam iteracijos procesui šio ciklo, kad linija bus paryškinta, 26, yra beveik atitinka spausdinimo. Kas yra duomenų tipas * s? Šiame kontekste, nes žvaigždė atsitinka būti šalia pačiai s, bet tiksliau, nes mes nebėra skelbiantis s, mes ne sukurti kintamąjį nebėra, yra ne 26 eilutėje char * paminėjimas, ten neužsimenama raktažodį eilutę, mes tik naudojant kintamasis vadinamas ai, paaiškėja, žvaigždė dabar yra šiek tiek kitoks ir, žinoma, painu prasmę. * Čia reiškia eiti į s adresą ir spausdinti viską, kas ten. Taigi s čia * s - tarsi Chutes ir kopėčios, atlikite rodyklę - čia. Taigi tai yra * s. Taigi, ką bus atspausdintas pirmajam iteracijos procesui tos linijos 26 linijos? Aš atsispausdinti% C, kuris yra vietos rezervavimo ženklo simbolį, \ n naujoje eilutėje. * (S + i), kur i yra elektronų, 0 yra tik tai. Taigi, kas char aš įdėti į% c? H. Į kitą iteracijos kilpos - jūs tikriausiai galite pamatyti, kur tai vyksta - kito pakartojimo i akivaizdžiai 1, todėl tai reiškia, s +1, Ir dabar aš reikia skliausteliuose, nes dabar žvaigždė turi pasakyti eiti į atminties adresą S +1. Kas yra? Tegul įvirsta metu ir pasakyti, dabar yra tokia rodyklė nėra iš tikrųjų daro mums jokių malonių. Tegul tiksliau pasakyti, kad tai saugoti numeris 123 , nes šios eilutės pradžia hello, this is adresas 123, tai 124, ir tt. Taigi antrajame iteracijos, kai aš sakau S +1, tai tarsi sakydamas, 123 1, kitaip žinomas kaip 124, tai kas char bus atspausdintas dėl antrosios iteracijos? E 124 atminties adresą. Tada + vėl 125, 126, 127, ir šis ciklas laimei sustoja, kol mes gauti čia nes aš naudoju strlen įsitikinti, kad aš nesiskaito per didelis. Taip, kad taip pat yra. Vėlgi, tai yra tiesiog taip, lyg mes padarė prieš savaitę. Leiskite man rašyti jį ant linijos žemiau nors nenorime daryti abu. Tai yra identiška dabar. Taigi, nors s eilutę, kaip mes pavadino jį savaites, s tikrai char *. Taigi, jei norime būti super analinis, tai tikrai tinkamai rašyti specifiką ith vietą naudojant šias skaitines adresai ir ši žvaigždė operatorius bet atvirai kalbant, tai yra tik tiek daug švaresnis. Taigi, tai nėra blogai. Jokios priežasties nustoti daryti 27 eilutėje čia, bet 26 yra praktiškai tas pats, ir tai praktiškai tas pats, lygiai priežasčių, kad mes buvo aptarti iki šiol. Ir galiausiai, 29 yra tiesiog gera praktika. Skambinimas s reiškia, kad dabar jūs suteikiant atmintį, GetString davė jums , nes vėl, kaip jau minėjau, pirmadienis, GetString savaites buvo įvesti klaidą į savo kodą. Jūsų kodas savaites turėjo Atminties nutekėjimas , pagal kurią jūs jau klausia GetString atminties, bet jūs niekada nebuvo suteikiant jai atgal. Ir tai buvo sąmoningai pasirinko mus pedagogiškai nes ji tiesiog per daug galvoti apie tai iš anksto. Bet dabar mums reikia daugiau simetrija. Jei paklausite kompiuterio atminties, kaip už GetString atveju, kaip yra šiuo atveju, matyt, malloc, dabar jūs turite 4 tolyn pset taip pat nemokamai visi tokie atminties. Atkreipkite dėmesį, tai skiriasi nuo sakydamas, int n. Jums nereikia atlaisvinti, nes tu negali paskambinti GetString ir tu negali paskambinti malloc. Ir net, jei paragino GetInt kaip mes galų gale pamatyti, GetInt nepriskiria atminties jums, nes jūs iš tikrųjų galite aplenkti sveikieji skaičiai plūdės ir simbolių, tik taip, kaip mes buvo padaryti per kelias savaites. Stygos, nors yra ypatingas, nes tikrai jie kelių simbolių sąryšis. Taigi jie tiesiog skiriasi nuo simbolių ir plūdes ir int ir pan. Bet mes grįžti, kad iki kol. Kokių nors klausimų, tada šios rodyklės pradžioje? Taip. [Nesigirdi studentas klausimas] Ah, labai geras klausimas. Vienas iš nedaugelio dalykų, C iš tiesų daro už jus, kuri yra patogi, tai skaičiai, kokio dydžio yra duomenų tipo ir tada toks dauginimosi jums. Simbolių atveju tai nesvarbu, nes beveik visada char yra 1 baitas, todėl tai tiesiog veikia. Tačiau diskusijos dėlei, jei jūs iš tikrųjų spausdinimo sveikieji skaičiai ir jūs bandėte spausdinti kai vertė, kuri buvo nukreipta į sveikasis skaičius, panašiai nebūtų reikia padaryti + 4 * aš tiesiog nes int yra 4 baitų. Rodyklė aritmetinis reiškia, kad C ir sudarytojas padaryti viską, kad jums matematikos. Viskas, ką jums rūpi, yra rūšies žmogiškąja prasme skaičiavimas. Taip. [Studentas] Jei paskelbti eilutę viduje už linijos, jūs turite išlaisvinti jį vėliau? Geras klausimas. Jei deklaruojamas eilutės viduje už linijos, jums reikia atlaisvinti jį vėliau? Jums reikia tik laisvos atminties, kad jums skirti su GetString arba su malloc. Taigi, jei jūs tiesiog pasakyti kažką panašaus - leiskite man įdėti garbanotas petnešos dabar, todėl visi kodas yra susijusi. Jei jums padarė kažką, nors ir buggily, panašaus į tai, char * t = s, jums nereikia t nemokamai, nes t nebuvo jokios malloc ar GetString paminėti. Tačiau jeigu tu tai padarei, GetString, tada taip, jūs turės nemokamai t. Ir iš tiesų, jūsų vienintelis šansas tai padaryti dabar šio ciklo viduje, tuo pačiu klausimu taikymo sritį kad mes aptarėme anksčiau. Kitaip norite būti paskirstant atmintį, skiriant atmintį, skiriant atmintį, ir programos pabaigoje, todėl, kad jūs ne tos linijos, t nėra, bet jūs niekada sakė operacinę sistemą , kad jums nereikia, kad atminties nebėra. Ir prieš ilgas, 4 ar 5 pset mes išmokyti jus su programa, vadinama Valgrind kuris yra panašus dvasios GDB, kad jis gavo šiek tiek paslaptingą sąsaja, , tačiau jo gyvenimo tikslas yra padėti jums. Ir Valgrind yra programa, kad ateityje ieškoti savo programas ieško atminties nutekėjimas, ar iš GetString ar malloc mes pradėsime, tuo labiau, kaip mes sustabdyti naudojant CS50 biblioteką kiek. Mes pagaliau turėti žodyno rūšiuoti ir psichikos modelio teorijos Rūšiuoti pagal su kuriuo būtų galima išspręsti šią skaldytų programą. Taigi, šio skaldytų programos, apsikeitimo viduje apsikeitimo sandorio, bet ji niekada faktiškai dirbtų pagrindinis, nes pagrindinis vyko X ir Y priminti, ir tie, buvo priimtas vertybėmis, taip sakant. Jų kopijos buvo sukeisti. Apsikeitimo sandorio pabaigoje, a ir b punktai iš tiesų buvo keičiamasi, x ir y, kaip aptarėme pirmadienį, tačiau, žinoma, nebuvo. Taigi siūlau žalias čia, kad iš tikrųjų tai yra sprendimas. Ir iš tikrųjų, leiskite man perkelti savo žvaigždės tiesiog turi būti suderinti dar kartą, nors funkciškai tai nesvarbu. Ateityje savaites mes paaiškinti, kada ir kodėl tai yra svarbu. Taigi, žalia spalva dabar yra sprendimas. Atvirai kalbant, tai atrodo visai daug Mesjė, nes turiu visus šių žvaigždžių. Leiskite man atkreipti dėmesį į vieną dalyką. Viršutinėje eilutėje čia, kur ji sako, int * ir int * b yra iš esmės daro tą patį, kaip visada. Jis yra skelbiantis 2 argumentų ar parametrai sukeisti, iš kurių pirmasis yra int rodyklė vadinama, antruoju yra int rodyklė, pavadintą "B. Vienintelis dalykas, kad naujo šiuo metu yra tai, kad yra žvaigždė. Ką tai reiškia? Nėra int b ne int. Yra int adresas ir b yra kitu int adresas. Žemyn čia, tai ten, kur aš pripažinti, C gauna painu. Dabar mes naudojant žvaigždę, bet ji turi kitokią prasmę šiame kontekste. Nes mes nėra skelbiama patarimų, nes mes esame čia, čia mes dereferencing dalykų. Taigi techniškai šiame kontekste pirmojo, antrojo ir trečiojo linija viduje apsikeitimo žvaigždė yra dereference operatorius, kuris tiesiog reiškia, kad ten eiti. Taigi tiesiog kaip mano pirštas po rodyklę, jei norite h, * Reiškia eiti tuo adresu ir rasti man int, kad ten. * B reiškia eiti į adresą ir perduoti man, kas ten. Taigi leiskite vėl įtraukti paveikslėlį pirmadienis dabar naudoja krūvą kadrų, apačioje iš kurių vienas bus pagrindinis, viršutinė iš kurių vienas bus apsikeitimo, taip, kad mūsų pasaulis atrodo, kaip ir pirmadienį, kaip šis. Čia yra atminties riekė, kad pagrindinis ketinate naudoti. Prisiminkite, nuo pirmadienio, kad programa tik 2 kintamuosius, vienas vadinamas X ir vienas vadinamas y, ir aš įdėti skaičiais 1 ir 2 ten. Dabar, kai aš skambinti apsikeitimo kaip aš pirmadienį, anksčiau, kai aš raudoną versiją šios programos, kurios atrodo taip, Aš turiu 2 parametrus a ir b, ir ką mes rašome čia ir čia? Tik 1 ir 2, tiesiog kopijuoja x ir y. Šiandien mes turime tai pakeisti. Šiandien vietoj einančios į int a ir b mes ketiname pereiti per 2 adresus. Šie adresai atsitikti taip, kad rodytų į int, tačiau šie adresai yra ne int. Jie yra adresai. Tai tarsi pašto adresą vietoj. Taigi, dabar mes turime tiesiog suteikti sau šiek tiek daugiau informacijos apie ekrano. Tai mano kompiuterio atminties, kaip jis buvo visą dieną. Dabar mums reikia šiek tiek savavališkas numeravimo schemą. Taigi, tegul tiesiog pasakyti, tiesiog atsitiktinai, kad tai yra atminties adresas 123, 124. Tegul tiesiog pasakyti, tai yra 125, tai 126, ir tt, bet tai visiškai savavališkai. Mes tiesiog reikia šiek tiek numeravimo schemą mano atmintyje. Kad dabar, kai aš iš tikrųjų pereina x ir y, aš nesiruošia važiuoti, x ir y; Aš ruošiuosi perduoti pašto adresą, taip sakant, x ir y kad čia ir čia pasireiškia saugomi ne 1 ir 2, bet jei jūs galite matyti mano mažas tekstas, kas bus priimtas čia ir čia? [Nesigirdi studentas atsakas] >> Taip. 123 bus įdėti čia ir 124 bus įdėti čia. Dabar, nes aš naudojamas žvaigždė šiame pirmajame linijos kelią iki čia viršuje, mano programa, tiesiog žino, kad 123 ir 124, nors jie akivaizdžiai sveikieji skaičiai , kad bet koks žmogus gali pastebėti, jie turėtų būti aiškinama, adresai, skaitmeniniai adresai. Jie nėra ir patys int, jie adresai, ir kad todėl, kad aš aiškiai įdėti į žvaigždes. Taigi dabar mano pirmojo, antrojo ir trečiojo linija, tai kodas, kas atsitinka, čia? Leiskite atkreipti paveikslėlio poilsio. TVP yra tik, kaip jis buvo pirmadienį. Nieko ypatingo apie tmp. Jis yra vos vietos 32 bitų kintamasis, ir viduje, kad aš, matyt, laikyti * vertę. Dabar, jei aš ką tik pasakė tmp =, kas galėtų jį sudėjau? >> [Studentas] 123. 123. Bet tai ne tai, ką aš darau. Aš sakau tmp = *. Žvaigždučių reiškia ten. Taigi čia yra, 123. Kaip aš galiu eiti? Apsimesti, kaip rodyklė. Na, tai yra, 1. Taigi, ką gauna saugomi tmp matyt? Tik 1. Taigi, kitaip tariant, tmp * a * priemonė nurodytu adresu, kad šiuo metu, , kuri, matyt, 123. Gerai, čia yra 123 vietoje, matau skaičių 1, todėl aš įdėti skaitmeniu "1". Dabar ką man daryti 2 eilutėje, * = * b? Tai viena yra šiek tiek daugiau dalyvauja, nes dabar, kas yra? Tai 123. Taigi * yra kur? Ten, kur aš anksčiau. Taigi eikite ten. Gerai. Dabar, galiausiai, ir galiausiai tai bus pradėti prasmės, tikiuosi, * B tai, kas b? 124. Taigi man reikia eiti ten, kuris yra 2. Taigi, ką aš įdėti, kur? 2 eina į čia,, nes * b eina į *. Taigi aš tai padaryti. Ir jau galite pamatyti, gal, kad mes tiek daug arčiau sprendžiant šį kvailas, paprasta problema teisingai pirmą kartą nes dabar mes vis dar turime X atsiminimai, mes turime 2 kopijas, tiesa, y, bet 3 eilutė, dabar sako, * b. Taigi čia b. * B reiškia eiti ten. Taigi, kur yra vieta 124? Tai matyt čia. Taigi, ką aš galiu įdėti čia? Akivaizdu, kad tmp. Taigi, dabar aš tai padaryti. Taigi, aš turiu čia 1 ir 2 čia. Ir dabar, ką apie visa tai, 123, 124, ir 1? Kuo greičiau apsikeitimo grįžta, ši atmintis yra taip gerai, kaip prarado nes kuo greičiau apsikeitimo grąža, operacinė sistema yra laisvai naudoti, kad atmintis vėl ateityje. Tik pagrindinės atminties šitą vadinamąjį kamino apačioje lazdelės aplink. Ir taip mes pagaliau dabar darbinė versija. Leiskite man eiti į swap.c, ir pastebite tokius dalykus. Tuo programos viršuje Aš pasikeitė mano prototipas int * ir int * b. Taigi vienintelis dalykas, aš pakeičiau į eiti, kuris buvo blogai, nuo raudonos į žalią, kuris yra geras, Aš pridėjo šias žvaigždes šiandien. Bet tada žemyn čia apsikeitimo save aš turėjau kopijuoti, įklijuoti, kas buvo tik ant skaidrės. Turiu žvaigždė čia, žvaigždė čia - kuris atitinka prototipą ir tada visi iš šių dalykų dabar žvaigždės išskyrus tmp nes laikino kintamojo naudojimas, nieko naujo ten. Aš tiesiog reikia laikinąjį saugojimą int. Taigi, mes nereikia žvaigždę. Mes tiesiog reikia žvaigždutę, taip, kad mes galime kirsti tokio savavališko ribų tarp šių 2 kadrų mano kompiuterio atmintyje. Tačiau paskutinis dalykas yra pakeisti, ir jums gali tekti prabėgomis tai jau. Kas kita linija yra akivaizdžiai skiriasi dabar? >> [Studentas] ir x. Taip, kad 25 yra paskutinė eilutė kodo Man reikia pakeisti, kad tai veiktų. Prieš savaitę ir net pirmadienį linija 25 atrodė taip, apsikeitimo X ir Y ir tai buvo tiesiog neveikia, nes jei pasakysi apsikeitimo (x, y) duodate Sukeisti x ir y kopijas, tada jis daro savo dalyką, , bet jūs niekada iš tikrųjų keičiasi x ir y pati. Taigi, net jei jūs niekada matė šį simbolį prieš kodą ampersend tiesiog atspėti. Ką Ampersand padaryti, matyt? [Studentas] mano adresą. >> Mano adresą. Taigi Ampersand sako duok man x adresą. Kas žino, kur ji yra? Taip atsitinka, turi būti 123. Man tai nerūpi. Tik duok man x adresą. & Y reiškia, kad duoti man y adresą. Ir tuo momentu, istorija yra puikiai suderinamas su nuotrauka atkreipė metu senumo. Taigi, aš pripažinti, patarimų, tikrai už mane, kai aš pirmą kartą pradėjo mokytis tai, buvo tikrai vienas iš sudėtingiausių dalykų, wrap savo mintis aplink. Bet suprantame, ypač, nes mes nuolat žaisti su šių rūšių dalykų, jei jūs ją padalyti šių super paprasta rūšies intelektualiai neįdomu problemas tiesiog perkelti numerius aplink, atsakymą į daug painiavos su rodyklės tikrai galima gauti iš šių pagrindinių mechanikos. Štai adresas. Eiti su žvaigždutėmis. Arba atvirkščiai, čia ampersendo. Išsiaiškinti, ką adresas iš tiesų yra. Gerai. Taigi, jeigu yra visos šios atminties iš? Mes atkreipė šį paveiksliuką porą kartų, ir aš nuolat perspektyvus, mes grįžti į ją, bet čia yra kompiuterio atmintyje atstovavimas , kad šiek tiek daugiau ženklinami nei mūsų lentos, čia yra. Teksto segmento viršuje parodo, ką su savo programą? [Nesigirdi studentas atsakas] >> Atsiprašome? Pakartosiu dar kartą. [Studentas] Tikrasis programa. >> Faktinis programa. Taigi 0s ir 1s, kad jūs turite surinkti po raštu C kodą, o paskui Apsukite metalinis garsas ir 0s ir 1s baigiasi gauti sukišti į atmintį nes, kai jūs dukart spustelėkite piktogramą jūsų Mac arba PC arba paleisti komandą kaip Mario jūsų greitai, jūsų 0s ir 1s iš disko gauti pakrautas į atmintį taip, kad kompiuteris gali jais manipuliuoti ir vykdyti juos greičiau. Taigi inicializuoti duomenų ir niezainicjowanymi duomenų, mes ne kalbėti daug apie tuos, bet tie, kurie tik visuotiniai kintamieji. Inicializuoti - globalių kintamųjų, kad jums davė vertybes; niezainicjowanymi - globalių kintamųjų, kad tu negali dar duoti vertybes. Tada yra šios aplinkos kintamieji, kuriuos aš visiškai WAVE savo jėgas, bet jie ten ir kad parduotuvėse dalykų, pavyzdžiui, savo vartotojo vardą ir kitos rūšies žemesnio lygio informacijos. Bet juiciest vienetų savo atminties išdėstymo yra šis dalykas, vadinamas kamino ir krūvos. Kamino vėl, viskas būtų aišku, yra atminties, kuri naudojama, kai yra vadinamas funkcijos, kai yra vietos kintamieji ir kai yra parametrai apdalytas. Visa tai vyksta ant klojinio. Krūvos mes ne kalbėjo apie tai, bet atspėti, kuris naudoja krūvą. Tiesiog skiriasi riekė atminties. Taip atsitinka, turi būti sudarytas čia, viršuje, bet tai savavališkai vaizdinę konvencija. Kas, matyt, buvo naudojant atminties iš krūvos savaites? Tai techniškai jums, bet netiesiogiai. >> [Studentas] GetString. GetString ir malloc. Taigi čia yra esminis skirtumas. Jūs žinote, per pastaruosius keletą savaičių, kad jei jums reikia atminties, tiesiog paskelbti kintamąjį. Jei jums reikia daug atminties, paskelbti masyvą, tiesiai iš savo funkciją. Bet mes nuolat susiduria su problema yra, jei jūs deklaruoti kintamuosius vietoje viduje funkcijų, kuo greičiau funkcija grąžina, kas atsitiks su atminties ir šių kintamųjų? Tiesiog tarsi nebėra tavo, tiesa? Jis tiesiog dingsta tarsi konceptualiai. Jis vis dar fiziškai yra, be abejo, bet tai nebėra jūsų teisė naudotis. Tai, žinoma, sudėtinga, jei norite rašyti gyvenimo funkcijas kad iš tikrųjų paskirstyti atmintį ir nepasiduokite jį grąžinti nedelsiant. Byla punktas: GetString gyvenimo tikslas, neturi iš anksto idėja kaip didelis aš norėčiau įveskite klaviatūros eilutę, bet jis gavo, kad būtų galima paskirstyti atmintį turėti Dovydą arba Hello arba visą esė, kurią vartotojas galėtų įvedėte. Taigi buvo naudojant malloc GetString. Malloc todėl turi būti ne kamino; vietoj to naudoti šį dalyką, vadinamą krūvos. Nėra nieko skiriasi apie atminties. Tai ne greičiau arba lėčiau ar ko nors panašaus. Tai tiesiog fiziškai kitoje vietoje. Tačiau ši taisyklė yra, kad krūvos atminties, kuri skirta niekada nebus atimta iš jūsų, kol jūs vadinate - spėti - nemokamai. Priešingai, bet koks atminties jūs paprašykite kamino tiesiog deklaruojant masyvą arba paskelbiama, kintamąjį, kaip mes buvo padaryti per kelias savaites, kad pagal nutylėjimą baigiasi kamino. Ir kad puikiai veikia 90% laiko, bet tų retesnių kartų ten, kur norite paskirstyti atmintį ir laikyti jį aplink, tada jums reikia naudoti kaip malloc funkciją. Ar mes turime naudoti funkciją kaip GetString, o tai savo ruožtu naudoja malloc. Pažiūrėkime, tais atvejais, kai tai gali sugriauti ir tada už Binky žvilgtelėti. Sugrįšiu, kad ateityje. Čia yra super paprasta programa, kuri per pirmuosius 2 eilučių ką daro? Anglų kalba, ką šie pirmieji 2 eilučių kodo padaryti viduje pagrindinis? [Nesigirdi studentas atsakas] Atsargūs. Jis nesuteikia man X arba Y adresą. [Studentas] Duoda patarimų int. >> Gerai. Duok man 2 rodykles iki sveikųjų skaičių. Kitaip tariant, duok man 2 gabaliukus atminties, kad aš nuolat brėžinys šiandien nors aš ištrinami, tai dabar, kvadratų. Duok man 2 gabaliukus atminties, vienas vadinamas x, vienas vadinamas Y - anksčiau aš ragino juos s ir t - ir kas yra tos atminties riekė tipas? Ji ketina saugoti adresą. Tai tipo int *. Taigi int adresas galų gale gyventi x, int adresas galų gale gyventi y, bet iš pradžių, kas viduje X ir Y? Kas žino? Šiukšlių vertybės. Tai neturi nieko daryti su rodykles. Jei mes ne įdėti ką nors ten, kurie žino, kas iš tikrųjų yra? Dabar, x. Kas vyksta čia? Tai yra teisėtas dabar nes x yra rodyklė. Tai int *. Taigi, tai reiškia, kad aš galiu įdėti trigubas kai atminties riekė adresą. Ką malloc grįžti? Tobula, bet ji grąžina adresus, pirmojo baito visą riekė atminties adresas. Kiek baitų tai, matyt, skyrimą, pavyzdžiui, į prietaisą? Kas yra int dydis? 4. Jei manote, kad atgal 1 savaitę, tai nėra itin svarbu visada prisiminti, kad, tačiau šiuo atveju tai naudinga žinoti, 4 baitai. Todėl tai skiriant krūvos 4 baitų ir jis grąžina pirmąjį adresą man savavališkai. Dabar, kas yra x darai? * X = 42 ką daro? Jeigu Šiuo istorija X, kuris atrodo taip, su kai kurių šiukšlių vertės, tai dabar y su kai kurių šiukšlių vertės, dabar 3 eilutę aš skiriama 4 baitai. Šį paveiksliuką iš esmės atrodo taip. Arba, tiksliau, jei tai yra savavališkas adresas 123, tai yra tai, kas dabar atrodo, mūsų istorija. * X = 42 dabar reiškia ką? Tai reiškia, kad eiti į adresų 123 ir įdėti, kurios numeris 42 ten. Man nereikia daryti šias eilutes, nes mes ne daro eilutes. Aš turėjo tik parašyta tai, kaip šis, ir tik demonstravimo labui, 42 kaip int rūšies užima daug vietos, 4 baitai. Taigi, kad tai, kas nutiko ten, bet dabar yra problema. * Y = 13. Kas nutiks? Problema yra * y mūsų supaprastinta pasaulyje tiesiog reiškia eiti į Y adresą. Kas y? Tai kai šiukšlių vertė. Taigi, galime daryti prielaidą, kad, kad šiukšlės vertė yra 5551212, kažkas crazy, kaip kad. * Y reiškia eiti spręsti 5.551.212. Tai kaip čia. Jis neegzistuoja, pavyzdžiui. Taigi * y gauna 13 reiškia, kad aš bando atkreipti 13 čia. Ji neegzistuoja. Aš viršijo lentos segmentą. Ką aš gausiu? Kad paslaptingas pranešimą segmentavimo kaltės, nes aš bandau įdėti atminties kaip 13 toje pačioje vietoje, kuris neegzistuoja. Kitos programos gali dirbti gerai, tačiau iki kol šiuo klausimu nėra. Taigi pabandykime papasakoti šią istoriją. Mes grįžti į, kad, kai mes kalbėjome apie šešioliktainį. Grįžkime ir sudaryti su šiuo dalykas vadinamas Binky, išėmimas iš apyvartos yra Stanfordo profesorius sėdi namie žaisti su Claymation, papasakoti istoriją lygiai tos pačios programos. Tai tiesiog apie 3 minučių ilgio. Čia mes turime Binky. [Vyriška garsiakalbis video] Ei Binky, pabusti. Atėjo laikas rodykliniams įdomus. [Binky] Kas tai? Sužinokite daugiau apie rodykles? Oh, geruolis! [Vyriška garsiakalbis] Na, pradėti, aš manau, mes ketiname reikia keletą patarimų. [Binky] Gerai. Šis kodas skiria 2 patarimų, kurie gali nurodyti sveikaisiais skaičiais. [Vyriška garsiakalbis] Gerai. Na, aš žr. 2 patarimų, bet jie neatrodo, kad būti nukreipta į ką nors. [Binky] Tai tiesa. Iš pradžių, rodyklės nesudaro nieko. Jie atkreipia dėmesį į tai, ką yra vadinami Pointees ir nustatyti juos, yra atskiras žingsnis. [Vyriška garsiakalbis] O, teisė, teisė. Aš tai žinojau. Atskiras Pointees yra. Er, taip, kaip jūs skirti pointee? [Binky] Gerai. Šis kodas skiria naują sveikasis skaičius pointee, ir ši dalis nustato x atkreipti į jį. [Vyriška garsiakalbis] Ei, atrodo geriau. Todėl, kad jis kažką daryti. >> [Binky] Gerai. Aš dereference žymiklį x įrašykite šį numerį iš 42 į savo pointee. Už šį triuką man reikės savo stebuklinga lazdele dereferencing. [Vyriška garsiakalbis] Jūsų stebuklinga lazdele dereferencing? Tai puiku. [Binky] Tai ką kodas išvaizda. Aš tiesiog sukurti skaičių ir ... [Pokštelėjimas] [Vyriška garsiakalbis] Ei atrodo, kad jis eina. Taip daro dereference x, taip rodyklę ir atidarykite savo pointee šiuo atveju laikyti 42 ten. Ei, pabandykite naudojant jį įrašykite šį numerį iš 13 per kitą rodyklė, y. [Binky] Gerai. Aš tiesiog eiti per y ir gauti skaičius 13 ir lazdelę dereferencing ir tik tada imtis ... [Šurmuliuos garsas] Oho! [Vyriška garsiakalbis] Oh hey, tai nepadėjo. Pasakykite, Binky, aš nemanau, kad dereferencing y gera idėja ,, nes įsteigti pointee atskiras žingsnis ir aš nemanau, kad mes kada nors padarė. [Binky] Hmm, gera vieta. [Vyriška garsiakalbis] Taip. Skyrėme žymiklį y bet mes niekada atkreipti į pointee. [Binky] Hmm, labai pastabus. [Vyriška garsiakalbis] Ei, jūs ieškote gero ten, Binky. Galite nustatyti jį taip, kad y atkreipia dėmesį į tą patį pointee kaip X? >> [Binky] Žinoma. Aš naudoti savo stebuklinga lazdele Marker perleidimo. [Vyriška garsiakalbis] Ar tai bus problema, kaip ir anksčiau? [Binky] Ne, tai neliečia Pointees. Jis tiesiog keičia vieną žymiklį, kad rodytų į tą patį, kaip ir kitas. [Pokštelėjimas] [Vyriška garsiakalbis] Oi, aš matau. Dabar y atkreipia dėmesį į tą pačią vietą kaip x. Todėl laukti. Dabar y yra fiksuotas. Ji turi pointee. Taigi, galite pabandyti vėl dereferencing siųsti 13 per lazdelę. [Binky] Uh, gerai. Čia eina. [Pokštelėjimas] [Vyriška garsiakalbis] Ei, pažiūrėkit. Dabar dereferencing darbus y. Ir,, nes rodykles dalinasi, kad vienas pointee, jie abu pamatyti 13. [Binky] Taip, dalijimasis. Koks skirtumas. Taigi, mes ketiname pereiti vietas dabar? [Vyriška garsiakalbis] O atrodo, mes pavėluotai. >> [Binky] Bet - [Vyriška garsiakalbis] Tiesiog neužmirškite, 3 rodyklę taisykles. Numeris 1, pagrindinės struktūros, kad jūs turite rodyklę ir pasuksite jį į pointee. Bet rodyklė ir pointee yra atskiras ir dažna klaida yra sukurti rodyklę bet pamiršti suteikti jai pointee. Numeris 2, rodyklė dereferencing prasideda žymeklis ir taip savo rodyklę per atidarykite savo pointee. Kaip mes visi žinome, tai veikia tik jei yra pointee, kokios grįš taisyklė numeris 1. Numeris 3, rodyklė nublokštų vieną žymiklį ir pakeičia jį atkreipti dėmesį į tos pačios, kaip ir kitas rodyklė pointee. Taigi, po užduoties, 2 rodykles nurodyti su tuo pačiu pointee. Kartais tai vadinama pasidalijimas. Ir kad viskas yra į jį tikrai. Čučumuiža dabar. Tai Binky. Tai CS50. Mes Pasimatysime kitą savaitę. [Plojimai] [CS50.TV]