1 00:00:00,000 --> 00:00:02,310 [Powered by Google Translate] [4. týždeň, pokračovanie] 2 00:00:02,310 --> 00:00:04,240 [David J. Malan - Harvard University] 3 00:00:04,240 --> 00:00:07,290 [To je CS50. - CS50.TV] 4 00:00:07,290 --> 00:00:11,290 >> To je CS50, a to je koniec 4. týždni. 5 00:00:11,290 --> 00:00:14,030 Takže nejaká dobrá správa, a niektoré zlé správy. 6 00:00:14,030 --> 00:00:26,240 No prednáška v pondelok, nie je problém nastaviť budúci týždeň. [Študenti fandenie] 7 00:00:26,240 --> 00:00:28,680 Tie nebude páčiť, kde to bude. 8 00:00:28,680 --> 00:00:31,590 Ale máme toto miesto budúcu stredu, 9 00:00:31,590 --> 00:00:37,740 a tam je tiež podľa sylabu 1 prednáške piatok budúci piatok, takže môžeme zostať na trati. 10 00:00:37,740 --> 00:00:40,580 Ale všetko bude natočený ako zvyčajne, tak, aby sa nebála. 11 00:00:40,580 --> 00:00:44,100 >> A s ohľadom na kvíz 0, čo budeme robiť, ku konca týždňa 12 00:00:44,100 --> 00:00:47,140 je príspevok na ihrisku v úvodnej cs50.net vysvetlenie 13 00:00:47,140 --> 00:00:50,160 z akej očakávania, mali by ste mať, pokiaľ ide o prvý kvíz. 14 00:00:50,160 --> 00:00:55,100 Všeobecne platí, že to multiple choice, true-false, krátka odpoveď, krátke kódovanie problémy. 15 00:00:55,100 --> 00:00:57,360 Nebudete sa očakáva, že na vykonanie ekvivalent 16 00:00:57,360 --> 00:01:00,030 o problém, ktorý by videl na PSet, pre ktoré máte počítač 17 00:01:00,030 --> 00:01:03,240 a debugger a podobne, ale bude malé kódovanie problémy. 18 00:01:03,240 --> 00:01:06,900 >> A skutočne, najlepším vodítkom získať pocit z toho, čo CS50 kvízy sú ako 19 00:01:06,900 --> 00:01:09,180 , Je ísť na cs50.net, prejdite na kvízy odkaz, 20 00:01:09,180 --> 00:01:11,920 a môžete vidieť, že v minulých niekoľko rokov v hodnote kvízov. 21 00:01:11,920 --> 00:01:16,600 Len si uvedomiť, že kurikulum nie je vždy rovnaká v priebehu rokov. 22 00:01:16,600 --> 00:01:18,510 Niekedy pridáme, niekedy odčítanie, 23 00:01:18,510 --> 00:01:20,670 takže ak vidíte nejaké témy na jednom z tých starých kvízy 24 00:01:20,670 --> 00:01:25,380 že nemáte tušenie, čo to hovorí, je to buď, že sme sa pokryť 25 00:01:25,380 --> 00:01:27,210 alebo že sme nemali pokryť. 26 00:01:27,210 --> 00:01:31,110 Ale v forma hodnotenia, túto nedeľu, pondelok a utorok 27 00:01:31,110 --> 00:01:34,770 rovnako ako v priebehu kurzu širokú preskúmanie zasadnutí v nedeľu večer - 28 00:01:34,770 --> 00:01:37,500 čas a miesto budú oznámené na ihrisku domovskú stránku - 29 00:01:37,500 --> 00:01:40,120 máte všetci možnosť prezrieť s priebehom v učebných kolegami 30 00:01:40,120 --> 00:01:44,830 materiál pre tento rok, a to ako v priereze a ako plné triedy, 31 00:01:44,830 --> 00:01:48,400 a tie bude natočený ako zvyčajne tiež. 32 00:01:48,400 --> 00:01:53,380 >> Dobrá. Takže bez ďalších okolkov, jeden komentár na vyhovel / nevyhovel a pridajte / drop. 33 00:01:53,380 --> 00:01:57,980 Možno ste videli svoje poznámky minulú noc, a to je naozaj len niektoré ďalšie upokojenie 34 00:01:57,980 --> 00:02:01,250 že ak patríte medzi tých, najmä menej pohodlné, alebo niekde medzi 35 00:02:01,250 --> 00:02:04,870 a máte pocit, len trochu v tom až po hlavu, 36 00:02:04,870 --> 00:02:08,430 si uvedomiť, že je naozaj celkom normálne, a tam je dostatok nosná konštrukcia v mieste, 37 00:02:08,430 --> 00:02:13,530 z ktorých jedna úradné hodiny bol zaujatý na zlepšenie a to tým skôr za mojej e-mailovej minulú noc, 38 00:02:13,530 --> 00:02:16,520 a uvedomiť si, že príliš možností, ako vyhovel / nevyhovel pre triedu, ako je tento 39 00:02:16,520 --> 00:02:21,540 Naozaj je potrebné ako mechanizmus vziať okraj preč kurzu, ako je táto, 40 00:02:21,540 --> 00:02:24,200 takže znovu, ak trávite tých 10, 15, 20 hodín 41 00:02:24,200 --> 00:02:28,160 Len sa snažím získať nejaké PSet do práce a viete, že ste 90-95%, ako je 42 00:02:28,160 --> 00:02:32,100 ale nemôžete nájsť nejaký prekliaty chybu, v priesmyku / zlyhanie modelu, ktorý je trochu v poriadku. 43 00:02:32,100 --> 00:02:36,230 >> Myšlienka je, že sa tohto mechanizmu si potom môžu ísť zamerať na vaše ďalšie psets 44 00:02:36,230 --> 00:02:39,530 alebo spať alebo čo to je, že chcete zamerať. 45 00:02:39,530 --> 00:02:43,390 Takže si uvedomiť, že máte do tejto nadchádzajúcej utorok - technicky 5. pondelok, 46 00:02:43,390 --> 00:02:50,840 ale je to sviatok, takže to príde utorok - prejsť z režimu pass / fail, aby triedených alebo naopak. 47 00:02:50,840 --> 00:02:54,450 A ak ste naozaj nad priepasťou a uvažujete o zvrhnutie celkom, 48 00:02:54,450 --> 00:02:56,440 prosím, chyť ma po prednáške alebo napíšte mi poznámku. 49 00:02:56,440 --> 00:02:59,990 Radi by sme aspoň chatu pred ponuku Adieu. 50 00:02:59,990 --> 00:03:03,470 Dobrá. Takže sme začali brať na školenie kolesá off minule. 51 00:03:03,470 --> 00:03:06,030 Najmä sme sa zamerali na povrázku. 52 00:03:06,030 --> 00:03:09,740 Reťazec je niečo, čo vyhlásil v knižnici CS50, 53 00:03:09,740 --> 00:03:14,340 konkrétne v tomto súbore s názvom cs50.h ktoré začneme pozerať na tento týždeň a budúci. 54 00:03:14,340 --> 00:03:17,250 Ale reťazec je naozaj len zjednodušenie niečo 55 00:03:17,250 --> 00:03:20,980 to je trochu arcanely opísať ako char *. 56 00:03:20,980 --> 00:03:24,090 Char sme zvyknutí. Je to len jeden znak. 57 00:03:24,090 --> 00:03:28,010 Ale * v pondelok označil čo? >> [Študent] ukazovateľ. 58 00:03:28,010 --> 00:03:31,290 Ukazovateľ. A čo je ukazovateľ? >> [Študent] adresa. 59 00:03:31,290 --> 00:03:33,420 >> Je to ako adresa, umiestnenie v pamäti. 60 00:03:33,420 --> 00:03:35,910 Čo je to adresa alebo umiestnenie, alebo spomienka? 61 00:03:35,910 --> 00:03:40,290 Opäť platí, že každý z nás má notebooky s koncertom alebo 2 GB pamäte RAM s najväčšou pravdepodobnosťou v týchto dňoch, 62 00:03:40,290 --> 00:03:44,160 a to znamená, že máte miliárd 2000000000 bajtov v hodnote pamäti. 63 00:03:44,160 --> 00:03:46,240 A to naozaj nie je jedno, čo to fyzicky vyzerá, 64 00:03:46,240 --> 00:03:51,220 ale vziať na viere, že môžete očíslovať všetky jednotlivých bajtov, že váš vlastný notebook má - 65 00:03:51,220 --> 00:03:54,580 To je bajt 0, to je bajt 1, to je byte 2000000000 - 66 00:03:54,580 --> 00:03:56,100 a to je presne to, čo robí počítač. 67 00:03:56,100 --> 00:04:00,030 Keď prideliť priestor pre jeden znak, napríklad, 68 00:04:00,030 --> 00:04:02,480 zrejme musí žiť niekde v pamäti počítača, 69 00:04:02,480 --> 00:04:05,860 a možno, že je to v byte číslo 12345, 70 00:04:05,860 --> 00:04:08,470 a to je niekde tu v pamäti počítača. 71 00:04:08,470 --> 00:04:12,630 A adresa potom tohto charakteru je 12345. 72 00:04:12,630 --> 00:04:16,140 >> Teraz, v týždni 0 až teraz tak ďaleko, sme sa naozaj záleží 73 00:04:16,140 --> 00:04:19,170 kde v pamäti veci sú uložené, pretože sa zvyčajne používajú symboly, 74 00:04:19,170 --> 00:04:22,540 premenné, a pole sa skutočne dostať na naše dáta. 75 00:04:22,540 --> 00:04:24,950 Ale v pondelok a všetkých viac dnes, budete teraz musieť 76 00:04:24,950 --> 00:04:27,710 všetky ďalšie výrazné schopnosti s písaním programov 77 00:04:27,710 --> 00:04:31,330 naozaj manipulovať s pamäti počítača však uznáte za vhodné, 78 00:04:31,330 --> 00:04:33,720 ako pre dobré účely a zlých, 79 00:04:33,720 --> 00:04:39,620 chyby je veľmi bežný výsledok v tomto bode v učení toto. 80 00:04:39,620 --> 00:04:42,460 Ale čo to vlastne znamená byť char *? 81 00:04:42,460 --> 00:04:46,140 Poďme ďalej späť k - a vrátime sa Binkym, ako som sľúbil dnes. 82 00:04:46,140 --> 00:04:48,670 Poďme na jednoduchom príklade tu. 83 00:04:48,670 --> 00:04:53,060 Dovoľte mi, aby som tento súbor uložiť ako compare.c, a dovoľte mi trochu šablóny kód tu 84 00:04:53,060 --> 00:05:00,490 tak patrí stdio.h, dovoľte mi, aby som tiež dávam patrí cs50.h. Budem zoomovať až tam. 85 00:05:00,490 --> 00:05:05,850 Dovoľte mi, aby som začal písať hlavné int, main (void), a teraz chcem urobiť niečo takéto: 86 00:05:05,850 --> 00:05:13,520 printf ("Daj mi reťazec:") a potom budem používať string s dostane GetString 87 00:05:13,520 --> 00:05:16,750 k získaniu reťazca od užívateľa, potom som sa opýtať používateľa na iného. 88 00:05:16,750 --> 00:05:21,870 ("Daj mi ešte reťazec:") a budem sa ich spýtať cez GetString sa dostať, že. 89 00:05:21,870 --> 00:05:27,020 Zavolám jej t, pretože t prichádza po S a S je pekné meno pre reťazce, pokiaľ je to celkom druhový. 90 00:05:27,020 --> 00:05:30,030 Takže GetString, a teraz chcem urobiť zdravý rozum kontrolu a budem hovoriť 91 00:05:30,030 --> 00:05:39,770 if (s == t) potom som len tak povedať užívateľa printf ("Zadali ste to isté \ n!"); 92 00:05:39,770 --> 00:05:45,520 inak budem vytlačiť niečo ako ("Zadali ste niečo iné! \ n") 93 00:05:45,520 --> 00:05:48,460 alebo čo veta bude. Takže niečo také. 94 00:05:48,460 --> 00:05:52,200 Potom ako zvyčajne, vrátim 0, ktorá sa práve znamenali, že sa nič nestalo, 95 00:05:52,200 --> 00:05:54,400 a ja idem ďalej a skompilovať a spustiť tento program. 96 00:05:54,400 --> 00:05:56,540 >> Ale v pondelok sme spustili tento program, 97 00:05:56,540 --> 00:06:00,420 a vlastne bolo povedané, že HELLO nie HELLO a GOODBYE nie je GOODBYE. 98 00:06:00,420 --> 00:06:03,140 Správanie sme videli, bolo trochu viac ako toto. 99 00:06:03,140 --> 00:06:11,450 Nechaj ma ísť do môjho zdrojového adresára, zoom sem, a poďme sa urobiť porovnanie. 100 00:06:11,450 --> 00:06:14,570 Spracovala poriadku. Dovoľte mi, aby som spustiť porovnanie. Daj mi reťazec: HELLO. 101 00:06:14,570 --> 00:06:16,300 Daj mi ešte reťazec: HELLO. 102 00:06:16,300 --> 00:06:18,000 Zadali ste niečo iné! 103 00:06:18,000 --> 00:06:22,650 No, skúsim niečo jednoduchšie ako 50, 50. Zadali ste niečo iné! 104 00:06:22,650 --> 00:06:25,740 hi, hi. Tak jasne, niečo sa deje. 105 00:06:25,740 --> 00:06:28,440 Ale čo bolo vysvetlenie, prečo? 106 00:06:28,440 --> 00:06:33,850 Zdá sa, že linka 12 je úplne nefunkčný. 107 00:06:34,300 --> 00:06:39,430 Čo je to zásadný problém tu? Jo. >> [Študent] Je to porovnaním adries. 108 00:06:39,430 --> 00:06:41,850 Jo, presne tak. Je to vlastne porovnávanie adresy 109 00:06:41,850 --> 00:06:44,580 , V ktorom sú uložené HELLO a HELLO. 110 00:06:44,580 --> 00:06:48,290 Nie je to porovnaním listy HELLO znova a znova, 111 00:06:48,290 --> 00:06:52,370 pretože to, čo sa naozaj stalo, celú tú dobu sme boli s použitím GetString - 112 00:06:52,370 --> 00:06:56,130 Táto tabuľa je opäť našej pamäti počítača, 113 00:06:56,130 --> 00:07:00,100 a povedzme, že som zavolať GetString po deklarovaní premennej s 114 00:07:00,100 --> 00:07:01,930 Čo moja pamäť vyzerať? 115 00:07:01,930 --> 00:07:07,070 Povedzme ľubovoľne povedať, že to vyzerá takto. Je to štvorec. 116 00:07:07,070 --> 00:07:09,040 A skoro žiadne, kedy som kreslila kus pamäte na obrazovke 117 00:07:09,040 --> 00:07:12,860 ak je to 32 bitov som bola kresba štvorcov, ako je tento, pretože skutočne v zariadení, 118 00:07:12,860 --> 00:07:17,380 ukazovateľ, adresa, je 32 bitov. Je to rovnaké ako int. 119 00:07:17,380 --> 00:07:19,420 To môže líšiť v závislosti na počítačovom systéme. 120 00:07:19,420 --> 00:07:24,630 Tí z vás, ktorí sú matne oboznámení s tým, že váš Mac alebo PC je 64 bitov, 121 00:07:24,630 --> 00:07:28,120 že vlastne označuje, že váš počítač používa 64-bitové ukazovatele, 122 00:07:28,120 --> 00:07:33,730 64-bitové adresy, a medzi upsides na ktoré je vaše počítače 123 00:07:33,730 --> 00:07:35,560 môžu mať oveľa viac pamäte RAM, než minulosti. 124 00:07:35,560 --> 00:07:39,240 Dlhý príbeh krátky, späť v deň, keď počítače používa iba 32 bitov 125 00:07:39,240 --> 00:07:42,740 reprezentovať adries, najväčší počet bytov, by mohlo predstavovať 126 00:07:42,740 --> 00:07:46,280 v tomto prípade je to, čo máte 32 bitov? 127 00:07:46,280 --> 00:07:49,590 Takže 4000000000, pravé, pretože 2 na 32 je 4 mld Sk. 128 00:07:49,590 --> 00:07:51,370 Toto číslo sa opakujúce v priebehu. 129 00:07:51,370 --> 00:07:55,240 >> Takže ak máte len 32 bitov, najvyššie číslo, ktoré sa môžete spoľahnúť, je zhruba 4 mld Sk. 130 00:07:55,240 --> 00:07:58,750 Ale to bola zásadné obmedzenie počítačov až do doby pred niekoľkými rokmi 131 00:07:58,750 --> 00:08:01,180 pretože ak môžete len počítať tak vysoko ako 4000000000, 132 00:08:01,180 --> 00:08:05,270 nezáleží na tom, či si kúpite 8 GB pamäte RAM alebo dokonca 5 GB pamäte RAM; 133 00:08:05,270 --> 00:08:07,780 nemôžete počítať, že vysoká, takže to bolo k ničomu. 134 00:08:07,780 --> 00:08:11,430 Dalo by sa pristupovať iba prvé 3 alebo 4 GB pamäte vášho počítača. 135 00:08:11,430 --> 00:08:14,410 To je menší problém teraz, a môžete si kúpiť MacBook Pros a Dells 136 00:08:14,410 --> 00:08:17,680 s 8 GB pamäte RAM alebo ešte v týchto dňoch. 137 00:08:17,680 --> 00:08:24,100 Ale keby som prideliť jednoducho v tomto programe ukazovateľ, ukazovateľ nazvaný s, 138 00:08:24,100 --> 00:08:28,370 by to mohlo vyzerať takto na obrazovke, pretože skutočne potrebujeme odtrhnite tejto vrstvy. 139 00:08:28,370 --> 00:08:33,520 Stále hovoril reťazec, ale v pondelok, string je naozaj char *, 140 00:08:33,520 --> 00:08:35,590 adresa nejakého charakteru. 141 00:08:35,590 --> 00:08:39,280 Takže poďme sa, že školenia koleso off, aj keď budeme aj naďalej používať GetString teraz. 142 00:08:39,280 --> 00:08:42,600 Tak som vyhlásil s, a to je kus pamäte, 32 bitov. 143 00:08:42,600 --> 00:08:47,370 Čo je tu v pamäti v predvolenom nastavení? >> [Nepočuteľné Študent odpoveď] 144 00:08:47,370 --> 00:08:50,040 Čo je to? >> [Študent] Garbage. >> Garbage. Presne tak. 145 00:08:50,040 --> 00:08:54,610 Ak programátor nedávajte hodnotu premennej, kto vie, čo to je? 146 00:08:54,610 --> 00:08:57,990 Niekedy máte šťastie a je to 0, ktorý je tak trochu pekné, čisté predvolené hodnoty, 147 00:08:57,990 --> 00:09:00,310 ale ako sme videli Pondelok, niekedy je to úplný nezmysel, 148 00:09:00,310 --> 00:09:04,130 niektoré naozaj veľké kladné alebo záporné číslo, ktoré prišlo odkiaľ? 149 00:09:05,350 --> 00:09:07,010 Jo. >> [Študent] funkcie pred. Jo >>. 150 00:09:07,010 --> 00:09:10,170 >> Často funkcie, ktorá dostala len predtým, pretože zapamätať, 151 00:09:10,170 --> 00:09:13,920 ako volať funkcie v pamäti, zaberajú viac a viac priestoru zdola nahor, 152 00:09:13,920 --> 00:09:17,040 a akonáhle sa funkcia vráti, dostane znovu, že pamäť 153 00:09:17,040 --> 00:09:20,890 do budúceho chlap, ktorý sa nazýva, ktorý je pomocou rovnakého plátok pamäte. 154 00:09:20,890 --> 00:09:23,450 A ak ste opustil odpadky tam, predchádzajúce hodnoty, 155 00:09:23,450 --> 00:09:28,190 môžeme mylne s ako s nejakú hodnotu, keď naozaj nemáme dať tam niečo. 156 00:09:28,190 --> 00:09:30,960 Takže naše RAM v tomto bode vyzerá takto. 157 00:09:30,960 --> 00:09:36,030 Teraz na pravej strane riadku 7 voláme GetString, 158 00:09:36,030 --> 00:09:40,150 ktoré sme robili teraz týždňov, ale to, čo je GetString naozaj robí? 159 00:09:40,150 --> 00:09:43,350 GetString napísal CS50 personálu je málo inteligentný 160 00:09:43,350 --> 00:09:46,500 v tom, že akonáhle užívateľ začne písať kľúče a hity Enter, 161 00:09:46,500 --> 00:09:50,010 GetString postavy z koľkých úderov robil používateľ hit, 162 00:09:50,010 --> 00:09:53,360 koľko znakov musím prideliť RAM pre. 163 00:09:53,360 --> 00:09:55,660 A kde, že RAM pochádza, kto vie? 164 00:09:55,660 --> 00:09:58,930 Je niekde vo vašom počítači je 2 GB alebo ktovie čo ešte v pamäti. 165 00:09:58,930 --> 00:10:05,200 Ale predpokladajme, že počítač našiel priestor pre slovo HELLO tu. 166 00:10:05,200 --> 00:10:08,710 Slovo som napísal bol H-E-L-L-O. 167 00:10:08,710 --> 00:10:13,510 A ak čerpáme to ako sekvencie znakov, môžeme nakresliť to takto. 168 00:10:13,510 --> 00:10:17,860 Ale musím urobiť 1 ďalšia vec. Čo patrí na konci každého reťazca v C? 169 00:10:17,860 --> 00:10:20,710 Nulový znak, ktorý napíšeme, \ 0. 170 00:10:20,710 --> 00:10:23,980 Je to technicky číslo 0, ale spätné lomítko je celý jasnejšie 171 00:10:23,980 --> 00:10:28,150 , Že je to doslova číslo 0, celé číslo 0; 172 00:10:28,150 --> 00:10:32,440 to nie je, napríklad, citujem-koniec citátu 0, ktoré by vás mohli zadajte na klávesnici. 173 00:10:32,440 --> 00:10:33,940 Tak toto je HELLO. 174 00:10:33,940 --> 00:10:36,350 >> A čo na to povieme v pondelok, že funkcie ako GetString 175 00:10:36,350 --> 00:10:39,580 je vlastne vracia všetky tie týždne? 176 00:10:39,580 --> 00:10:43,960 Nie je to vracia reťazec na sebe, pretože to naozaj nie je mať zmysel 177 00:10:43,960 --> 00:10:47,710 pretože reťazca neexistujú. Sú trochu zhotovenie v CS50 knižnici. 178 00:10:47,710 --> 00:10:51,300 Čo je naozaj reťazec, viac technicky? >> [Študent] Je to prvý znak. 179 00:10:51,300 --> 00:10:55,950 Presne tak. Je to jednoducho adresu prvý znak, ktorý užívateľ zadali dovnútra 180 00:10:55,950 --> 00:11:02,810 Takže ak moje slovo HELLO končí to v byte číslo 123 a potom na byte číslo 124, 181 00:11:02,810 --> 00:11:08,320 125, 126, a tak ďalej, v prípade, som číslo mojej bytov z 0 na hore, 182 00:11:08,320 --> 00:11:12,650 čo naozaj GetString sa vracia je doslova číslo 123. 183 00:11:12,650 --> 00:11:19,270 Takže to, čo sa dal v S je číslo 123, nie písmeno H, nie je slovo HELLO, 184 00:11:19,270 --> 00:11:23,130 jednoducho adresu, na ktoré môžem nájsť prvé písmeno HELLO. 185 00:11:23,130 --> 00:11:26,500 Ale to nevyzerá ako dosť. Pýtal som sa vás na reťazec, nie charakter. 186 00:11:26,500 --> 00:11:32,970 Tak ako sme alebo počítači, že Ello druh prísť spolu s H? 187 00:11:35,760 --> 00:11:37,460 Čo je to druh zmluvy máme? Jo. 188 00:11:37,460 --> 00:11:40,100 [Študent] Je stále hovorí sa nájsť nejaké ďalšie znaky. Presne >>. 189 00:11:40,100 --> 00:11:44,570 >> Tam je to človek-počítač konvencie, kedy keď sa rokovania s reťazcami, 190 00:11:44,570 --> 00:11:49,410 inak známy teraz ako char hviezd, sa jednoducho musí prísť na to, 191 00:11:49,410 --> 00:11:54,350 kde na konci každej reťazca v živote je podľa naozaj len iterácia cez to s pre sláčiky, 192 00:11:54,350 --> 00:11:57,820 while, čokoľvek, takže keď vás koniec reťazca 193 00:11:57,820 --> 00:12:02,160 Teraz si môžete odvodiť z toho, oh, celé slovo bolo HELLO. 194 00:12:02,160 --> 00:12:04,820 Tí z vás, s predchádzajúcim programovacím skúseností by mohol vedieť v Jave 195 00:12:04,820 --> 00:12:09,880 stačí zavolať. dĺžka a v iných jazykoch, môžete volať dĺžku alebo podobný. 196 00:12:09,880 --> 00:12:14,060 To preto, že v mnohých jazykoch, a to najmä čo nazýva objektovo orientované jazyky, 197 00:12:14,060 --> 00:12:18,580 dĺžka niečo je druh zapuzdrený vo vnútri kusu samotná dáta, 198 00:12:18,580 --> 00:12:24,000 veľa ako my zapuzdrený ID a názvy a domy vnútri študenta v pondelok. 199 00:12:24,000 --> 00:12:28,700 Ale C je oveľa nižšej úrovni. Nie sú tu žiadne objekty alebo triedy, ak ste počuli tieto výrazy predtým. 200 00:12:28,700 --> 00:12:31,490 Jediné, čo musíte, je naozaj pamäťové adresy. 201 00:12:31,490 --> 00:12:35,540 Tak toto je niečo ako staromódny spôsob zastupovanie zaujímavé dátové štruktúry. 202 00:12:35,540 --> 00:12:38,760 Tie majú počiatočnú hodnotu ako adresu prvého znaku 203 00:12:38,760 --> 00:12:42,340 a potom už len niektoré svojvoľnými konvenciami, že všetci súhlasia s tým, nasledovať. 204 00:12:42,340 --> 00:12:46,420 Tak ako je dĺžka reťazca realizovaný, to navrhujeme? 205 00:12:46,420 --> 00:12:51,360 Strlen, strlen, ktorý niektorí z vás už používa niekoľkokrát. Je to celkom jednoduché, nie? 206 00:12:51,360 --> 00:12:53,060 Je to ako 2 riadky kódu. 207 00:12:53,060 --> 00:12:56,140 Je to docela veľa pre slučka nejakého druhu, možno s ďalšie miestne premenné. 208 00:12:56,140 --> 00:13:00,540 Ale strlen jednoducho musí vziať ukazovateľ a potom začať hľadať \ 0. 209 00:13:00,540 --> 00:13:05,190 >> A akonáhle zistí, že to, môže vrátiť celkový počet krokov, ktoré je potrebné v tomto reťazci. 210 00:13:05,190 --> 00:13:07,150 Takže môžeme z toho vyvodiť, čo sa deje ďalej. 211 00:13:07,150 --> 00:13:11,850 Predpokladajme, že potom Prehlasujem t, ako som urobil v riadku 10. 212 00:13:11,850 --> 00:13:14,280 To je nejaký odpad hodnota. Kto vie, na prvý? 213 00:13:14,280 --> 00:13:18,490 Ale na pravej strane riadku 10 Volám GetString znova. 214 00:13:18,490 --> 00:13:20,050 Kto vie, kde to skončí? 215 00:13:20,050 --> 00:13:23,830 Povedzme ľubovoľne povedať, že operačný systém našiel priestor pre to spôsobom, tady. 216 00:13:23,830 --> 00:13:28,610 A stalo sa, zhodou okolností typ H-E-L-L-O znova, 217 00:13:28,610 --> 00:13:31,260 a tak môžeme čerpať rovnaký druh obrazu. 218 00:13:31,260 --> 00:13:34,290 Ale fakt, že mám prekresliť tento obrázok je úmyselné 219 00:13:34,290 --> 00:13:37,720 pretože to je iný HELLO ako tento. 220 00:13:37,720 --> 00:13:43,920 Takže tu by mohlo byť miesto 456, to je 457, a tak ďalej. 221 00:13:43,920 --> 00:13:47,170 Takže to, čo sa dal, kde otáznik kedysi? 222 00:13:47,170 --> 00:13:50,190 V tomto prípade sa 456. 223 00:13:50,190 --> 00:13:53,540 Ideme tieto čísla ľubovoľne, pretože naozaj po dnešok 224 00:13:53,540 --> 00:13:57,110 nebudeme sa toľko starať o to, čo je adresa čohokoľvek je. 225 00:13:57,110 --> 00:14:02,690 Všetko, čo ich zaujíma, sú, že môžeme zistiť adresu nejakého kusu dát ako HELLO. 226 00:14:02,690 --> 00:14:07,100 >> Takže naozaj to, čo väčšina ľudí robí v oblasti počítačovej vedy, keď hovorí o pamäťových adries 227 00:14:07,100 --> 00:14:10,210 a hovorí o ukazovatele konkrétne, 228 00:14:10,210 --> 00:14:14,220 skôr než obťažovať prísť na to, 123 -, kto sa stará, kde toto vlastne je, 229 00:14:14,220 --> 00:14:17,440 Vieme len, že je to v určitom číselnom adrese - 230 00:14:17,440 --> 00:14:22,180 sme zjednodušiť svet a len povedať, že to ukazuje na tento znak 231 00:14:22,180 --> 00:14:25,080 a t ukazuje na tento znak. 232 00:14:25,080 --> 00:14:27,430 A to, že je to šípka je docela úmyselné 233 00:14:27,430 --> 00:14:31,610 pretože doslova teraz s ukazuje na H a T je ukazuje na druhú H 234 00:14:31,610 --> 00:14:34,720 pretože na konci dňa, nezáleží na tom, aký je adresa, 235 00:14:34,720 --> 00:14:40,240 ale to záleží, že máme možnosť vyjadriť túto adresu s nejakým kusom kódu. 236 00:14:40,240 --> 00:14:42,730 My sa naozaj manipulovať tieto adresy zatiaľ 237 00:14:42,730 --> 00:14:47,770 takže uvidíme, kde sa môžeme prehodiť a nejako robiť veci s ukazovateľmi, 238 00:14:47,770 --> 00:14:52,030 ale teraz v súlade 12 doslova aké hodnoty sme nákupný 239 00:14:52,030 --> 00:14:55,500 Podľa tohto príbehu v súlade 12? 240 00:14:56,570 --> 00:15:01,290 Hovoríme, je 123 rovné rovná 456? A to rozhodne nie je prípad. 241 00:15:01,290 --> 00:15:05,320 A to aj koncepčne, tento ukazovateľ rozhodne nie je rovnaká ako to 242 00:15:05,320 --> 00:15:09,500 pretože si volal GetString dvakrát, a GetString nesnaží sa byť super šikovný, 243 00:15:09,500 --> 00:15:12,470 nepokúša uvedomiť, oh, ste zadali HELLO pred 5 minútami; 244 00:15:12,470 --> 00:15:15,090 dovoľte mi, aby som vám rovnakú ukazovateľ, ako som ti dal pred, 245 00:15:15,090 --> 00:15:18,450 to len alokuje nový kus pamäte zakaždým, keď hovoríte. 246 00:15:18,450 --> 00:15:20,350 >> Tak ako sme sa tento problém vyriešiť? 247 00:15:20,350 --> 00:15:24,270 Ak vyššiu úroveň chcem porovnať reťazca HELLO HELLO a - 248 00:15:24,270 --> 00:15:28,680 Nezaujíma o ukazovatele - ako môžem ísť o odpoveď na otázku, 249 00:15:28,680 --> 00:15:31,980 sa užívateľ zadať rovnakú vec? Čo treba tu? Jo. 250 00:15:31,980 --> 00:15:35,200 [Študent] Použite funkciu. >> Môžem použiť funkciu po vybalení z krabice. 251 00:15:35,200 --> 00:15:38,170 Môžem použiť funkciu nazvanú strcmp, s-t-r-c-m-p, 252 00:15:38,170 --> 00:15:41,190 len skrátená verzia hovorí string porovnanie. 253 00:15:41,190 --> 00:15:45,070 A ak pôjdeme do, napríklad, porovnať 2, ktorý je medzi dnešnej podkladov, 254 00:15:45,070 --> 00:15:46,690 Ja presne to. 255 00:15:46,690 --> 00:15:51,750 Stále som všetko ostatné rovnaký z linky 1 na až 26 alebo tak, 256 00:15:51,750 --> 00:15:54,360 a teraz si toho všimnúť časť zmenilo len trochu. 257 00:15:54,360 --> 00:15:57,690 Poďme ignorovať linku 28 na chvíľu a sústrediť sa iba na tento jeden. 258 00:15:57,690 --> 00:16:00,410 Čo povieme pondelok, že str compare robí? 259 00:16:00,410 --> 00:16:05,200 Vykonáva proces brať 2 ukazovatele, S a T je v tomto prípade, 260 00:16:05,200 --> 00:16:08,480 druh prakticky tým, že svoje prst na týchto 2 listy, 261 00:16:08,480 --> 00:16:11,530 a čo musí urobiť, je niečo ako while alebo pre sláčiky, 262 00:16:11,530 --> 00:16:16,050 a to hovorí, že sú to rovnaké? Ak áno, to sa pohybuje prstami alebo na ukazovatele vpred. 263 00:16:16,050 --> 00:16:17,970 Zhodujú sa, títo rovnaký, to isté, 264 00:16:17,970 --> 00:16:22,710 Tieto rovnaké, to isté? A ooh, som na konci reťazca na oboch S a T. 265 00:16:22,710 --> 00:16:26,780 Nenašiel som žiadne rozpory. Áno, tieto reťazce sú rovnaké. 266 00:16:26,780 --> 00:16:31,940 A čo str tieto priznanie, ak je 2 reťazce sú rovnaké, zrejme? Zero. 267 00:16:31,940 --> 00:16:35,900 Takže 0 je dobré v tomto prípade, pretože ak sa vráti -1 alebo 1, 268 00:16:35,900 --> 00:16:40,560 to znamená, že je len stane skôr, než t abecedne alebo po t 269 00:16:40,560 --> 00:16:43,760 A prečo by to malo byť užitočné mať funkciu, ktorá vám povie, ktoré reťazec príde pred 270 00:16:43,760 --> 00:16:46,720 alebo po v slovníku? 271 00:16:46,720 --> 00:16:48,740 [Študent] Hľadám. >> Vyhľadávanie a triedenie. 272 00:16:48,740 --> 00:16:51,730 >> Takže si môžete robiť veci, ako binárne vyhľadávanie alebo bublina zoradiť alebo zlúčiť druh 273 00:16:51,730 --> 00:16:53,230 kde budete musieť porovnávať veci. 274 00:16:53,230 --> 00:16:56,420 Tak ďaleko sme druh znížiť niektoré rohy a len hovoril o triedenie 275 00:16:56,420 --> 00:16:59,430 v súvislosti s číslami, pretože je to pekné a jednoduché hovoriť o, 276 00:16:59,430 --> 00:17:02,430 ale môžete samozrejme tieto struny, jablko a banán, 277 00:17:02,430 --> 00:17:05,349 pretože ak jablko je známe, že príde do banánu, podobne, 278 00:17:05,349 --> 00:17:09,319 sa môžete pohybovať reťazca okolo pamäte, rovnako ako Rob robil s radiť zlučovacie vo videu 279 00:17:09,319 --> 00:17:15,880 a my sme tu na javisku s výberom druhu, vloženie zoradiť, a bublina zoradiť. 280 00:17:15,880 --> 00:17:18,710 Takže tam, kde ešte môžeme vziať? Skúsme to. 281 00:17:18,710 --> 00:17:23,980 Poďme trochu zabudnúť, že lekciu na chvíľu a skúste teraz a skopírujte 1.c vykonať nasledujúce kroky. 282 00:17:23,980 --> 00:17:26,800 V riadku 21 Hovorím tlače niečo, 283 00:17:26,800 --> 00:17:28,520 potom som dostať reťazec od užívateľa, 284 00:17:28,520 --> 00:17:30,690 potom som kontrolu to. 285 00:17:30,690 --> 00:17:33,620 Sme sa naozaj dostali do tohto zvyku ešte nie, ale poďme sa teraz to. 286 00:17:33,620 --> 00:17:40,990 Poďme skutočne Zlúpnite tejto vrstvy. To je naozaj char *. Ten chlap je naozaj char *. 287 00:17:40,990 --> 00:17:45,690 Takže čo to znamená byť kontrola, či s == NULL? 288 00:17:45,690 --> 00:17:48,380 Ukazuje sa, že pri volaní funkcie, ako je GetString 289 00:17:48,380 --> 00:17:51,540 alebo všeobecnejšie opýtajte počítača, aby vám nejaké pamäte, 290 00:17:51,540 --> 00:17:53,030 niečo mohlo pokaziť. 291 00:17:53,030 --> 00:17:56,630 Tie by mohli byť blázon a požiadať počítač pre terabajt pamäte 292 00:17:56,630 --> 00:18:01,780 tým, že žiada o bilióny bajtov pamäte, ktoré jednoducho neexistujú v počítači, 293 00:18:01,780 --> 00:18:05,130 ale GetString a ďalšie funkcie potrebovať nejaký spôsob, ako kričí na vás 294 00:18:05,130 --> 00:18:06,820 Ak ste požiadaní o príliš veľa. 295 00:18:06,820 --> 00:18:10,450 A ako GetString robí je, ak ste požiadali o viac pamäte 296 00:18:10,450 --> 00:18:14,250 než je k dispozícii v počítači, a to aj v prípade, že je to super, super malú pravdepodobnosť 297 00:18:14,250 --> 00:18:17,730 pretože nikto z nás sa bude písať bilióna znaky a stlačte Enter, 298 00:18:17,730 --> 00:18:21,980 ale málo pravdepodobné, aj keď to môže byť, stále chcem skontrolovať to len v prípade, 299 00:18:21,980 --> 00:18:26,120 a špeciálne hodnota, ktorá GetString, odpoveď, a ďalšie funkcie vracia 300 00:18:26,120 --> 00:18:30,630 ak niečo zle, je NULL vo všetkých veľkých písmenách. 301 00:18:30,630 --> 00:18:36,520 >> A čo je NULL? NULL len tak náhodou predstavujú ukazovateľ. Je to adresa pamäte 0. 302 00:18:36,520 --> 00:18:40,800 Svet sa rozhodol, že svojvoľne, ak je to mojej pamäti počítača - viete, čo? - 303 00:18:40,800 --> 00:18:46,260 budeme kradnúť len 1 bajt každého pamäte počítača, a to je miesto 0. 304 00:18:46,260 --> 00:18:49,560 Budeme ho prezývku NULL, a budeme sľubovať 305 00:18:49,560 --> 00:18:52,660 , Že nikdy skutočne dať skutočné údaje sú k dispozícii 306 00:18:52,660 --> 00:18:56,770 pretože sme práve ľubovoľne potrebujeme osobitnú hodnotu, 0, NULL, aka 307 00:18:56,770 --> 00:19:00,230 takže môžeme kričať na užívateľa, ak sa niečo pokazí. 308 00:19:00,230 --> 00:19:03,590 Inak možno neviete to 0 znamená dať niečo, čo tu 309 00:19:03,590 --> 00:19:05,490 alebo to znamená niečo pokazilo? 310 00:19:05,490 --> 00:19:09,190 Musíme sa všetci zhodneme, že NULL znamená, nič sa vrátil, 311 00:19:09,190 --> 00:19:11,700 žiadna skutočná adresa bola vrátená. 312 00:19:11,700 --> 00:19:15,210 Teraz, tu som len prijíma svoju ľudskú konvencii Aj return 1 z hlavnej 313 00:19:15,210 --> 00:19:17,040 keď sa niečo pokazí. 314 00:19:17,040 --> 00:19:20,650 To preto, že hlavné je návrat konvencie je nutné vrátiť hodnotu 0, ak dobre, 315 00:19:20,650 --> 00:19:22,990 1 alebo iné hodnoty, ak zle. 316 00:19:22,990 --> 00:19:28,200 Ale GetString a nejaká funkcia, ktorá sa zaoberá v pamäti vracia null, ak sa niečo pokazí. 317 00:19:28,200 --> 00:19:33,480 >> Dobre. Takže bohužiaľ, linka 27, super jednoduchý aj keď je úplne nedokáže skopírovať reťazec. 318 00:19:33,480 --> 00:19:35,740 Prečo? Je vidieť, to nasledujúcim spôsobom. 319 00:19:35,740 --> 00:19:40,120 Ja som tvrdil v súlade 27 bude robiť kópie s a nazývať to t 320 00:19:40,120 --> 00:19:45,790 Tak som sa nepýtam na používateľa pre 2 reťazca tentoraz, len hovorím, hodnoty v s 321 00:19:45,790 --> 00:19:47,870 by mal byť kladený na t i 322 00:19:47,870 --> 00:19:52,890 Teraz už len stačí preukázať, ako je to zlomený, v súlade 29 vpred čo to robím? 323 00:19:52,890 --> 00:19:56,980 Prvý som kontrolu, keď dĺžka t je väčšia ako 0. 324 00:19:56,980 --> 00:19:59,330 Tam je nejaký reťazec tam. Užívateľ napísal niečo dovnútra 325 00:19:59,330 --> 00:20:03,410 Čo je linka 32 robí, zrejme? 326 00:20:03,410 --> 00:20:08,910 [Nepočuteľné Študent odpoveď] >> Právo. Môžete trochu odvodiť z toho, čo som povedal, že to robí. 327 00:20:08,910 --> 00:20:13,200 Ale technicky, čo je to robíš? t [0] predstavuje, čo? 328 00:20:13,200 --> 00:20:15,140 [Študent] znak 0.. >> [Malan] znak 0.. 329 00:20:15,140 --> 00:20:19,620 Alebo, viac človeka-ako, prvý znak v t, bez ohľadu na to je, H možno v tomto prípade. 330 00:20:19,620 --> 00:20:24,990 A toupper robí to, čo hovorí. Ťaží nultého charakter ton a zmení ho. 331 00:20:24,990 --> 00:20:28,430 Takže to znamená, vziať 0. charakter t, aby to veľká, 332 00:20:28,430 --> 00:20:30,320 a vložte ho späť do rovnakej miesto. 333 00:20:30,320 --> 00:20:35,540 Takže ak som typ ahoj malými písmenami, malo by to zmeniť malé písmená h na základnom imaní, H. 334 00:20:35,540 --> 00:20:41,400 Ale problém je, že v radoch 35 a 36, ​​čo sa chystám urobiť, je vytlačiť pre nás S a T. 335 00:20:41,400 --> 00:20:43,120 A aký je váš tušenie? 336 00:20:43,120 --> 00:20:47,250 Čo mám vlastne ísť, či som písať v ahoj vo všetkých malými písmenami? 337 00:20:47,250 --> 00:20:52,280 Čo sa to deje, aby si vytlačiť? >> [Nepočuteľné Študent odpoveď] >> Čo je to? 338 00:20:52,280 --> 00:20:58,360 [Študent] Big H a zvyšok malé. >> Veľký H a zvyšok malý, pre ktoré je alebo t? 339 00:20:58,360 --> 00:21:03,170 [Študent] Oboje. Obe >>. Presne tak. Tak sa pozrime, čo sa tu deje. 340 00:21:03,170 --> 00:21:08,380 >> Nechaj ma ísť napred a zostaviť to. To je Copy1, takže sa COPY1. Dobrá. 341 00:21:08,380 --> 00:21:14,840 Zoom Nechaj ma ísť napred a spustiť COPY1, Enter, povedz niečo: ahoj malými písmenami. 342 00:21:14,840 --> 00:21:19,570 To zarábal kópiu, ale to zrejme zarábal pôvodné a, 343 00:21:19,570 --> 00:21:22,070 pretože to, čo sa deje teraz v tomto príbehu? 344 00:21:22,070 --> 00:21:27,030 V súlade 27 Nemám vlastne Zdá sa, že kopírovanie reťazec, 345 00:21:27,030 --> 00:21:30,450 ale aj keď ste možno intuitívne dúfal, že tomu tak bolo, 346 00:21:30,450 --> 00:21:33,680 ak si myslíte o tejto obrázku, čo sa naozaj som to urobil? 347 00:21:33,680 --> 00:21:35,410 Polovica obrázku je rovnaká. 348 00:21:35,410 --> 00:21:39,390 Takže poďme sa vrátiť v čase tak, aby t doteraz neexistuje v príbehu. 349 00:21:39,390 --> 00:21:43,160 S môže existovať v príbehu, ale poďme malá ahoj tentoraz. 350 00:21:43,160 --> 00:21:46,710 Tak nech mi opraviť to, čo som vlastne napísal palcov 351 00:21:46,710 --> 00:21:51,280 V tomto prípade tu máme h-e-l-l-o. 352 00:21:51,280 --> 00:21:58,050 Budeme nakresliť ako sekvencie znakov, dal som oddeľovačov tu a mojej \ 0. 353 00:21:58,050 --> 00:22:05,980 Takže toto je miesto, kde sme, akonáhle riadok 1 až 24-ish, dávať alebo brať, boli vykonané. 354 00:22:05,980 --> 00:22:07,800 To je obraz mojej pamäti. 355 00:22:07,800 --> 00:22:10,800 Keď som sa dostať do súladu 27, čo sa stane? 356 00:22:10,800 --> 00:22:14,730 Rovnako ako predtým, než som sa ukazovateľ, ktorý budem čerpať ako je námestie. 357 00:22:14,730 --> 00:22:19,740 Hovorí sa t A čo je jeho hodnota v predvolenom nastavení? Kto vie? Niektoré odpadky hodnota. 358 00:22:19,740 --> 00:22:22,060 >> Takže budem abstraktné, že vonku ako otáznik. 359 00:22:22,060 --> 00:22:27,670 A akonáhle pravá strana linky 27 vykoná, čo mám dávať vnútri t? 360 00:22:27,670 --> 00:22:30,770 Rovnaký vec, ktorá je v §. 361 00:22:30,770 --> 00:22:34,120 Takže keď sme sa na chvíľu odstrániť túto abstrakciu šípky a hovoríme, 362 00:22:34,120 --> 00:22:40,330 oh, to je zaťaženie pamäti adresa 123, keď hovoríš t dostane s, bodkočiarku, 363 00:22:40,330 --> 00:22:42,700 ste doslova uvedenie 123 tu. 364 00:22:42,700 --> 00:22:45,200 Teraz, keď sme trochu zjednodušiť náš svet znovu s obrázkami, 365 00:22:45,200 --> 00:22:48,750 čo ste naozaj urobil, je práve pridaná ďalšia šíp do svojho sveta 366 00:22:48,750 --> 00:22:52,910 , Ktorý je polohovacie t na rovnakom presnom reťazci. 367 00:22:52,910 --> 00:22:59,730 Takže keď v súlade 31 a 32 som vlastne ísť o zmenu t [0], 368 00:22:59,730 --> 00:23:05,580 to, čo je t [0] zrejme synonymom teraz? s [0] 369 00:23:05,580 --> 00:23:07,030 Takže to je všetko, čo sa deje. 370 00:23:07,030 --> 00:23:09,900 A aj keď tento druh cíti trochu nízka úroveň a tajomný 371 00:23:09,900 --> 00:23:12,760 a tento druh sa cíti ako snáď intuitívne by to malo byť len pracoval - 372 00:23:12,760 --> 00:23:15,410 Ja som urobil kópie vecí pred a to len fungovalo - 373 00:23:15,410 --> 00:23:18,590 ak si skutočne myslia o tom, čo reťazec skutočne je, je to char *. 374 00:23:18,590 --> 00:23:21,700 No, čo to je? Je to adresa nejakého charakteru. 375 00:23:21,700 --> 00:23:24,930 Potom je možno väčší zmysel, že keď sa pokúsite urobiť niečo 376 00:23:24,930 --> 00:23:29,220 Super zdanlivo jednoduchého, ako to, všetko, čo robíte, je kopírovanie adresa pamäte. 377 00:23:29,220 --> 00:23:32,530 Tie v skutočnosti robiť nič s reťazcami sám. 378 00:23:32,530 --> 00:23:37,500 Takže, aj keď nemáte tušenie, ako by ste tento problém vyriešiť v kóde, 379 00:23:37,500 --> 00:23:45,080 na vysokej úrovni, koncepčne, čo musíme urobiť, aby tá odpis s, zrejme? 380 00:23:46,670 --> 00:23:48,820 Jo. >> [Študent] Daj mu nové umiestnenie? Presne >>. 381 00:23:48,820 --> 00:23:50,800 >> Musíme dať t zbrusu nové umiestnenie. 382 00:23:50,800 --> 00:23:55,230 Musíme sa nejako vytvoriť svet, v ktorom sa dostaneme nový kus pamäte, 383 00:23:55,230 --> 00:24:00,090 ktoré práve z dôvodov prehľadnosti budem čerpať hneď pod týmto jeden, ale to nemusí byť. 384 00:24:00,090 --> 00:24:04,880 Ale to musí byť rovnakej veľkosti, takže budem čerpať tieto zvislé čiary v rovnakom mieste. 385 00:24:04,880 --> 00:24:09,720 Je to v poriadku, ak je to všetko smeti spočiatku. Kto vie, čo tam bol? 386 00:24:09,720 --> 00:24:13,850 Ale krok 1 bude musieť byť dať mi toľko pamäte, ako som potrebné 387 00:24:13,850 --> 00:24:18,630 aby sa zmestili kópiu ahoj, potom zistiť, ako kopírovať h tu, na e tu, 388 00:24:18,630 --> 00:24:20,390 l tu a tak ďalej. 389 00:24:20,390 --> 00:24:24,880 Ale to už by sa nemal cítiť trochu zrejmé, aj keď niektoré detaily sú stále abstraktné. 390 00:24:24,880 --> 00:24:28,690 Ak chcete kopírovať tento reťazec do toho, je to len pre sláčiky alebo slučky while 391 00:24:28,690 --> 00:24:31,580 alebo niečo, s ktorými ste sa ešte zoznámiť. 392 00:24:31,580 --> 00:24:35,970 Tak poďme to skúsiť. Nechaj ma ísť do copy2.c. 393 00:24:35,970 --> 00:24:43,270 V copy2.c máme takmer rovnaký program, s výnimkou linky 27. 394 00:24:43,270 --> 00:24:47,260 Vyzerá to trochu zložitejšie, ale ak sa to všetko pokazí kúsok po kúsku, 395 00:24:47,260 --> 00:24:48,950 ľavá strana je rovnaká. 396 00:24:48,950 --> 00:24:52,790 Char * t vytvára túto vec v pamäti, aj keď s otáznikom 397 00:24:52,790 --> 00:24:54,680 pretože nemáme poňatia, čo je tam v predvolenom nastavení. 398 00:24:54,680 --> 00:24:57,920 Na pravej strane sme teraz predstavujeme novú funkciu, malloc, 399 00:24:57,920 --> 00:25:00,640 pre pamäť alokovať, daj mi pamäť, 400 00:25:00,640 --> 00:25:06,900 a to zrejme trvá, koľko argumentov, koľko vecí vnútri zátvoriek? 401 00:25:09,660 --> 00:25:12,130 Počul som reptania 1 a 2, ale to je len 1. 402 00:25:12,130 --> 00:25:15,320 Nie je čiarka, čo znamená, že je len 1 vec v zátvorkách. 403 00:25:15,320 --> 00:25:17,720 Aj keď je tu ďalší zátvorky, dovoľte mi, aby som spomenul 404 00:25:17,720 --> 00:25:21,460 to, čo je vo vnútri najvzdialenejších zátvoriek, a to je to výraz: 405 00:25:21,460 --> 00:25:25,880 (Strlen (y) + 1) * sizeof (char). 406 00:25:25,880 --> 00:25:29,190 Takže ak sme vlastne si to premyslieť, je to hovorí mi dĺžku s 407 00:25:29,190 --> 00:25:34,440 Prečo som, aj keď s tým, 1 na dĺžku? >> [Nepočuteľné Študent odpoveď] 408 00:25:34,440 --> 00:25:40,200 Presne tak. Potrebujeme priestor pre toho chlapa na chvoste, šiesty znak, ktorý má žiadny anglický význam 409 00:25:40,200 --> 00:25:42,250 ale majú špeciálny programový význam. 410 00:25:42,250 --> 00:25:46,800 >> Takže potrebujeme + 1 za to, pretože strlen vracia ľudské očakávania dĺžky, 411 00:25:46,800 --> 00:25:50,890 ahoj alebo 5, to vám nedáva dodatočné nulový znak. 412 00:25:50,890 --> 00:25:52,980 Tak som ručne pridať to s + 1. 413 00:25:52,980 --> 00:25:56,060 A potom, (char) * veľkosť, sme nevideli skôr. 414 00:25:56,060 --> 00:25:57,480 To nie je technicky funkcie. 415 00:25:57,480 --> 00:26:04,150 Je to zvláštne kľúčové slovo, ktoré práve vám povie, čo je veľkosť niektorých dátového typu na počítači 416 00:26:04,150 --> 00:26:06,980 pretože v skutočnosti, niektorí z nás majú 32-bitové počítače. 417 00:26:06,980 --> 00:26:10,900 Mám docela starý počítač doma, a používa iba 32 bitov na reprezentáciu ukazovatele. 418 00:26:10,900 --> 00:26:13,900 A tak keď som robil veľkosť dátový typ, mohlo by to byť 32 bitov. 419 00:26:13,900 --> 00:26:18,300 Ale keď som pomocou môjho nového ozdobný počítač, mohol by som získať späť hodnotu 64 bitov 420 00:26:18,300 --> 00:26:20,510 niečo ako adresu. 421 00:26:20,510 --> 00:26:25,400 Takže v tomto prípade, len byť super bezpečné, nebudeme na pevný kódu niečo ako - 422 00:26:25,400 --> 00:26:28,740 dobre, čo je veľkosť char podľa toho, čo sme povedali tak ďaleko? 423 00:26:28,740 --> 00:26:34,450 Sme skoro povedal, slovne, že je to 1 byte, a to je celkom veľa platí plošne. 424 00:26:34,450 --> 00:26:37,000 Ale znova, predpoklady bývajú zlé. 425 00:26:37,000 --> 00:26:40,850 Vedú k buggy softvér, ak ľudia používajú softvér spôsobom ste nemali v úmysle. 426 00:26:40,850 --> 00:26:44,750 Takže poďme abstraktné toto preč a len viac druhovo povedať 427 00:26:44,750 --> 00:26:46,830 Potrebujem toľko kúskov pamäte 428 00:26:46,830 --> 00:26:50,210 a každý blok pamäte by mali byť rovnakej veľkosti a charakteru, 429 00:26:50,210 --> 00:26:54,870 ktorá je v skutočnosti rovná 1 v tomto prípade, ale je to všeobecnejší spôsob písania. 430 00:26:54,870 --> 00:27:00,460 Takže, ak je slovo ahoj, koľko bytov sa malloc zrejme prideliť ahoj? 431 00:27:00,460 --> 00:27:04,980 [Študent] Six. Šesť >>. Presne toľko, koľko máme otázniky na obrazovke. 432 00:27:04,980 --> 00:27:07,800 A potom sa hádať teraz založený na pochopení GetString 433 00:27:07,800 --> 00:27:12,790 čo malloc pravdepodobne vráti? >> [Študent] adresa. 434 00:27:12,790 --> 00:27:17,020 Sídlo čoho? Prvý kus pamäte. 435 00:27:17,020 --> 00:27:20,670 >> Nemáme potuchy, čo tam je, pretože niektoré ďalšie funkcie 436 00:27:20,670 --> 00:27:23,010 by boli pomocou tejto pamäte už skôr. 437 00:27:23,010 --> 00:27:28,380 Ale malloc, rovnako ako GetString, vráti adresu prvého bajtu pamäte 438 00:27:28,380 --> 00:27:30,540 že vyčlení pre vás. 439 00:27:30,540 --> 00:27:38,380 Avšak to, čo sa nerobí, je vyplniť tento prázdne s charakterom spätného lomítka null 440 00:27:38,380 --> 00:27:43,030 pretože sa ukázalo, môžete použiť malloc alokovať nič: Ints, struny, polia, 441 00:27:43,030 --> 00:27:45,700 plaváky, študentské štruktúry. 442 00:27:45,700 --> 00:27:47,750 Môžete použiť malloc úplne všeobecne. 443 00:27:47,750 --> 00:27:51,470 Nezaujíma alebo vedieť, čo ste prideľovanie pamäte pre. 444 00:27:51,470 --> 00:27:55,810 Tak to by bolo trúfalé pre malloc dať \ 0 445 00:27:55,810 --> 00:27:58,340 na konci každého kusu pamäti, že to ti dáva 446 00:27:58,340 --> 00:28:02,620 pretože to \ 0 vec je len konvencie pre reťazce. 447 00:28:02,620 --> 00:28:06,310 To nie je použitá pre ints, to nie je použitý pre plaváky, to nie je používaný pre študentov. 448 00:28:06,310 --> 00:28:11,730 A tak mám ťa s malloc je, že bremeno je úplne na vás programátor 449 00:28:11,730 --> 00:28:16,790 pamätať, koľko bytov si pridelené, a nie vždy používať pre sláčiky 450 00:28:16,790 --> 00:28:21,570 alebo while a ísť okolo hranice bloku pamäti, že ste bol daný. 451 00:28:21,570 --> 00:28:23,540 Inak povedané, akonáhle alokovať pamäť, 452 00:28:23,540 --> 00:28:28,510 môžete sa opýtať operačný systém, oh, mimochodom, aký veľký o kus pamäte to bolo? 453 00:28:28,510 --> 00:28:32,080 Je to úplne na vás pamätať, ak budete potrebovať túto hodnotu. 454 00:28:32,080 --> 00:28:34,330 >> Tak sa pozrime, ako mám postupovať použiť túto pamäť. 455 00:28:34,330 --> 00:28:38,430 V súlade 28 a 29, prečo to robím? 456 00:28:39,850 --> 00:28:42,260 Len celkom zdravý rozum kontrola. 457 00:28:42,260 --> 00:28:45,110 Len v prípade, že sa niečo pokazilo, žiadam o nejaké šialené množstvo pamäte 458 00:28:45,110 --> 00:28:48,690 alebo som toľko vecí, na počítači, že tam jednoducho nie je dostatok pamäte, 459 00:28:48,690 --> 00:28:51,780 niečo také, aspon chcem skontrolovať null. 460 00:28:51,780 --> 00:28:55,260 V skutočnosti, väčšina počítačov vám ilúziu, že každý program 461 00:28:55,260 --> 00:28:57,080 môžu používať celistvosť pamäte RAM, 462 00:28:57,080 --> 00:29:00,740 ale aj tak, v prípade, že používateľ zadá do nejakej šialenej dlhej šnúre Možno preto, že si zlý človek 463 00:29:00,740 --> 00:29:03,440 a oni sú vlastne snaží zhodiť váš program alebo hack do neho, 464 00:29:03,440 --> 00:29:07,300 Ak chcete aspoň skontrolovať návratovú hodnotu malloc a či sa rovná null. 465 00:29:07,300 --> 00:29:11,630 A ak áno, nech to jednoducho skončiť práve teraz, pretože ja neviem, čo robiť v tejto veci. 466 00:29:11,630 --> 00:29:13,950 Ako môžem skopírovať reťazec? Tam je niekoľko spôsobov, ako to urobiť. 467 00:29:13,950 --> 00:29:18,850 Existujú str kopírovať funkcie v C, ale je to super jednoduché pre nás urobiť staromódnym spôsobom. 468 00:29:18,850 --> 00:29:23,110 >> Najprv mi dovoľte prísť na to, aká je dĺžka s je. 469 00:29:23,110 --> 00:29:26,930 Mohol som dať do slučky, ale namiesto toho som len dať to sem pre prehľadnosť. 470 00:29:26,930 --> 00:29:30,610 Tak n teraz ukladá dĺžku pôvodného reťazca, ktorý je zrejme 5. 471 00:29:30,610 --> 00:29:35,290 Potom v mojom pre sláčiky som upravujeme od 0 až na n, 472 00:29:35,290 --> 00:29:40,940 a pri každom opakovaní dávam s [i] vo vnútri t [i]. 473 00:29:40,940 --> 00:29:45,060 Takže to je to, čo som naznačil s mojimi 2 prsty ukazujúce na struny pred. 474 00:29:45,060 --> 00:29:49,260 Vzhľadom k tomu, pre sláčiky opakuje takto, budem sa kopírovanie h do tu, 475 00:29:49,260 --> 00:29:52,890 e do tu, l do tu, pretože to je s, to je t 476 00:29:52,890 --> 00:29:58,770 A potom konečne, v súlade 35, prečo to robím? 477 00:29:58,770 --> 00:30:03,770 Musím sa uistiť, že som koniec reťazca t 478 00:30:03,770 --> 00:30:06,170 A ja som to takto bude super explicitné. 479 00:30:06,170 --> 00:30:09,510 Ale navrhnúť niekoho, keby si mohol, iný spôsob, ako to urobiť. 480 00:30:09,510 --> 00:30:13,930 Nemám naozaj potrebujú linku 35. Je tu iný spôsob, ako to urobiť. 481 00:30:13,930 --> 00:30:18,880 Jo. >> [Nepočuteľné Študent odpoveď] >> Povedz to nahlas. 482 00:30:18,880 --> 00:30:20,960 [Študent] Menšie alebo rovné. Presne >>. 483 00:30:20,960 --> 00:30:24,450 Mohli by sme povedať menší ako alebo rovný n, ktorá bola všeobecne zlé 484 00:30:24,450 --> 00:30:28,190 pretože takmer vždy, keď ideme do rovnakej s tým, čo sme počítanie 485 00:30:28,190 --> 00:30:30,000 Pôjdeme 1 krok príliš ďaleko. 486 00:30:30,000 --> 00:30:32,170 Ale pamätajte, koľko bytov sme prideľovať? 487 00:30:32,170 --> 00:30:37,210 Máme pridelené strlen S, takže 5 + 1 o celkovej 6. 488 00:30:37,210 --> 00:30:39,980 Takže v tomto prípade by sme mohli urobiť niečo také 489 00:30:39,980 --> 00:30:46,450 tak, že kopírujete nielen ahoj, ale aj \ 0 na samom konci. 490 00:30:46,450 --> 00:30:49,860 Prípadne, mohli by sme použiť funkciu nazvanú str kopírovanie, strcpy, 491 00:30:49,860 --> 00:30:51,700 ale to by nebol ani zďaleka tak zábavné. 492 00:30:51,700 --> 00:30:54,000 Ale to je všetko, čo robí pod kapotou. 493 00:30:54,000 --> 00:30:56,050 Potom konečne, urobíme to isté ako predtým. 494 00:30:56,050 --> 00:31:01,620 Aj zarábať t a potom som tvrdiť, že pôvodné vyzerá takto a kópie vyzerá, že. 495 00:31:01,620 --> 00:31:08,570 Tak skúsme to teraz. Nechaj ma ísť sem. Urobte kópie copy2. Budeme priblížiť a spustiť kópie copy2. 496 00:31:08,570 --> 00:31:13,840 Budem písať ahoj malými písmenami, a naozaj som si malá ahoj ako originál 497 00:31:13,840 --> 00:31:16,930 ale kapitál Hello pre kópiu. 498 00:31:16,930 --> 00:31:20,300 Ale ja som neurobil zatiaľ. Musím urobiť 1 posledná vec tu. 499 00:31:20,300 --> 00:31:28,000 46 a 47 je jasne uvoľnenie pamäte, ale čo to vlastne znamená? 500 00:31:28,000 --> 00:31:33,250 Čo mám robiť, myslíte tým, že volajúceho 46 a riadok 47? 501 00:31:33,250 --> 00:31:38,900 Aký vplyv to má mať? Jo. 502 00:31:38,900 --> 00:31:43,140 [Nepočuteľné Študent odpoveď] >> Presne tak. 503 00:31:43,140 --> 00:31:46,380 >> Ste len hovorím operačný systém, hej, vďaka za tejto pamäte. 504 00:31:46,380 --> 00:31:48,320 Teraz môžete použiť pre niekoho iného. 505 00:31:48,320 --> 00:31:50,790 A tu je dokonalým príkladom nezmyselné hodnoty. 506 00:31:50,790 --> 00:31:55,430 Práve som použil tento pamäte zapísať slovo ahoj v 2 miestach, 507 00:31:55,430 --> 00:31:57,490 tu, tu, tu, a tu. 508 00:31:57,490 --> 00:32:00,910 Takže je to h-e-l-l-o-\ 0. 509 00:32:00,910 --> 00:32:06,960 Ale potom som zavolať linku 46 a riadok 47, a viete, čo sa tam deje, pokiaľ ide o obrázku? 510 00:32:06,960 --> 00:32:10,010 Vlastne, počkajte, tento obrázok je starý. 511 00:32:10,010 --> 00:32:12,550 Akonáhle urobíme kópiu, ten chlap je vlastne ukazuje tu, 512 00:32:12,550 --> 00:32:16,110 takže sa poďme odstrániť čísla a len abstraktné preč ako naše šípy znova. 513 00:32:16,110 --> 00:32:19,370 Čo sa stane v tomto filme, keď som volať zadarmo? 514 00:32:19,370 --> 00:32:22,750 [Nepočuteľné Študent odpoveď] >> Ani. 515 00:32:22,750 --> 00:32:29,510 Ak by som volať zadarmo na S a T - trochu chyták - tento obrázok sa nemení vôbec 516 00:32:29,510 --> 00:32:33,880 pretože volá sa volá t len ​​hovorí operačný systém, 517 00:32:33,880 --> 00:32:39,010 hej, môžete použiť túto pamäť znova, ale to nič nezmení na null 518 00:32:39,010 --> 00:32:41,840 alebo niektoré špeciálne znak, že tým nič nezmení, 519 00:32:41,840 --> 00:32:47,350 to nemení h alebo e alebo l alebo l alebo O v oboch miesta na čokoľvek iné. 520 00:32:47,350 --> 00:32:51,610 Pokiaľ ide o obraz, akonáhle Volajte zadarmo, nič zmien. 521 00:32:51,610 --> 00:32:56,570 A v tom spočíva pôvod odpadky hodnôt, pretože keď som potom neskôr v tomto programe 522 00:32:56,570 --> 00:33:01,010 požiadať operačný systém pre viac pamäte s GetString alebo malloc alebo niečo také 523 00:33:01,010 --> 00:33:04,900 a operačný systém hovorí, iste, ja mám 12 bajtov pamäti práve uvoľnených, 524 00:33:04,900 --> 00:33:08,080 použitie týchto, čo budete k odovzdaniu? 525 00:33:08,080 --> 00:33:10,830 Tie bude podal kus pamäti, že by sme zvyčajne remíza 526 00:33:10,830 --> 00:33:13,700 s otáznikmi, ale čo sú tie otázniky? 527 00:33:13,700 --> 00:33:17,000 Dochádza k nim byť h-e-l-l-o, h-e-l-l-o. 528 00:33:17,000 --> 00:33:20,940 Toto sú naše nové smetiarske hodnoty, akonáhle uvoľniť túto pamäť. 529 00:33:20,940 --> 00:33:22,750 >> Je tu skutočný svet dôsledky aj tu. 530 00:33:22,750 --> 00:33:24,720 To sa stáva čo do činenia s RAM, ale vaše počítače 531 00:33:24,720 --> 00:33:26,720 vlastne to isté s diskom. 532 00:33:26,720 --> 00:33:30,620 Porozprávame sa o tom najmä s budúcim problémom súbor, ktorý sa zameriava na forenznú. 533 00:33:30,620 --> 00:33:36,170 Ale čo sa skutočne deje, ak máte nejaké citlivé finančné súbor na ploche 534 00:33:36,170 --> 00:33:39,600 alebo niektoré útržkovité JPEG a pretiahnite ju do koša, 535 00:33:39,600 --> 00:33:44,390 čo sa stane, keď ho pretiahnuť do koša alebo koša? 536 00:33:44,390 --> 00:33:47,240 Vedel si, čo som hovoril. [Smiech] 537 00:33:47,240 --> 00:33:52,370 Čo sa stane, keď ste preťažení, že dôkazy do vášho koša alebo popolnice? 538 00:33:52,370 --> 00:33:55,920 [Nepočuteľné Študent odpoveď] 539 00:33:55,920 --> 00:33:58,000 No, tak pozor. Čo sa stane, keď budeš robiť, že? 540 00:33:58,000 --> 00:34:01,030 Stručná odpoveď je nič, nie? 541 00:34:01,030 --> 00:34:04,790 Sketchy alebo citlivé súbor je stále len sedí niekde na pevnom disku. 542 00:34:04,790 --> 00:34:07,940 Väčšina z nás aspoň sa ťažko poučili, že potrebujete vyprázdniť kôš 543 00:34:07,940 --> 00:34:10,429 alebo váš kôš skutočne odstrániť súbory. 544 00:34:10,429 --> 00:34:13,440 A skutočne, keď kliknete pravým tlačidlom myši, alebo regulácia kliknutím na vašom koši 545 00:34:13,440 --> 00:34:15,580 alebo zvoľte Súbor, Empty Trash alebo čokoľvek 546 00:34:15,580 --> 00:34:21,420 a vyprázdniť kôš alebo kôš, čo sa skutočne deje a potom na tomto obrázku? 547 00:34:22,810 --> 00:34:25,969 Viac nič. Takže nič sa skutočne deje na disku. 548 00:34:25,969 --> 00:34:30,880 >> A ak sme len dočasne odbočiť a napísať - budem stačí použiť zadnej strane tohto. 549 00:34:30,880 --> 00:34:34,639 Takže teraz príbeh sa mení z pamäte RAM, čo je miesto, kde programy existujú 550 00:34:34,639 --> 00:34:39,250 kým vediete je, na disk, čo je miesto, kde sú uložené dlhodobo 551 00:34:39,250 --> 00:34:42,920 aj keď vypadne prúd, zatiaľ - a vrátime sa v budúcnosti - 552 00:34:42,920 --> 00:34:46,380 poďme predstierať, že to predstavuje pevného disku vo vnútri vášho počítača 553 00:34:46,380 --> 00:34:50,110 pretože späť v deň, kedy bývali kruhové disky, podobne ako diskety. 554 00:34:50,110 --> 00:34:55,130 Takže ak máte nejaké citlivé súbor Excel, môže trvať až tento kus pamäte 555 00:34:55,130 --> 00:34:59,770 na počítači disk, a ja som len kreslenie rovnaký ľubovoľný 1s a 0s. 556 00:34:59,770 --> 00:35:03,970 Pri pretiahnutí súboru takhle do koša alebo koša, 557 00:35:03,970 --> 00:35:07,750 doslova sa nič nestane, pretože Apple a Microsoft sa rozhodol 558 00:35:07,750 --> 00:35:10,450 koša a kôš je naozaj len dočasný zástupný. 559 00:35:10,450 --> 00:35:14,710 Možno nakoniec OS vyprázdni ju pre vás, ale zvyčajne to nie je nič, 560 00:35:14,710 --> 00:35:17,090 aspoň kým si naozaj málo miesta. 561 00:35:17,090 --> 00:35:20,870 >> Avšak, keď idete do prázdnej koša alebo Vysypať kôš, 562 00:35:20,870 --> 00:35:23,460 podobne, nič sa nestane, aby tento obrázok. 563 00:35:23,460 --> 00:35:28,590 Všetko, čo sa stane, je inde v počítači, tam je nejaký druh tabuľky. 564 00:35:28,590 --> 00:35:35,400 Je to niečo ako malý ťahák, ktorý hovorí, že, povedzme, resume.doc, 565 00:35:35,400 --> 00:35:40,920 takže váš životopis v súbore programu Microsoft Word býval v mieste 123 na pevnom disku, 566 00:35:40,920 --> 00:35:43,710 nie je v pamäti a nie v pamäti RAM, ale na pevnom disku, 567 00:35:43,710 --> 00:35:49,050 a vaše útržkovité JPEG žije v 456, a súbor programu Excel žije na 789 alebo kdekoľvek. 568 00:35:49,050 --> 00:35:53,640 Pri mazaní súborov vlastne vyprázdňovanie koša alebo Kôš, 569 00:35:53,640 --> 00:35:59,530 tento obrázok sa nemení. 0s a 1s na pevnom disku nejdú nikam. 570 00:35:59,530 --> 00:36:03,930 Ale táto tabuľka, tento malý databázy druhov, mení. 571 00:36:03,930 --> 00:36:08,750 Keď zmažete svoj životopis, je to, ako keď je súbor odstránený v nejakom zmysle, 572 00:36:08,750 --> 00:36:12,790 ale všetky sa počítač sa zabudnúť, kde je tá vec žije na pevnom disku. 573 00:36:12,790 --> 00:36:17,870 The 0s a 1s, že skladať svoj životopis alebo niektorý z týchto ďalších súborov sú stále neporušené. 574 00:36:17,870 --> 00:36:21,960 >> Takže ak ste to urobili omylom, je tu stále non-nulová pravdepodobnosť 575 00:36:21,960 --> 00:36:25,800 že môžete obnoviť vaše dáta pomocou Norton Utilities alebo nejaký obchodný softvér 576 00:36:25,800 --> 00:36:29,810 ktorého cieľom v živote je nájsť 0s a 1s, ktoré nejako bolo opustené, 577 00:36:29,810 --> 00:36:33,300 Zabudli ste tu, ale nechal tu, takže môžete získať dáta späť. 578 00:36:33,300 --> 00:36:38,410 Alebo forenznú vyšetrovatelia s políciou alebo FBI by skutočne pevný disk 579 00:36:38,410 --> 00:36:42,550 a vlastne hľadať vzory 0s a 1s, ktoré vyzerajú ako JPEG, vyzerajú ako súbory Excel, 580 00:36:42,550 --> 00:36:46,400 a obnoviť je to tak, aj keď je počítač zabudol je tam. 581 00:36:46,400 --> 00:36:49,820 Takže jediný spôsob, ako naozaj odstrániť dáta, ako budeme diskutovať v budúcnosti, 582 00:36:49,820 --> 00:36:54,190 je drhnúť alebo utrite súbor alebo pevný disk od - 583 00:36:54,190 --> 00:36:56,540 Nemôžete naozaj zbaviť 0s a 1s 584 00:36:56,540 --> 00:36:59,440 pretože inak by ste začať s gigabitovou pevný disk 585 00:36:59,440 --> 00:37:02,380 a vy by ste skončiť s megabajt pevného disku, ak ste neustále museli mazať, 586 00:37:02,380 --> 00:37:04,380 doslovne, 0s a 1s. 587 00:37:04,380 --> 00:37:06,310 Takže to, čo by ste robili, keby ste naozaj chceli pokryť svoje stopy 588 00:37:06,310 --> 00:37:10,510 a zásadný problém je, že je tu stále 0s a 1s na disku? 589 00:37:10,510 --> 00:37:14,930 Vidím niekoho gestikuloval, že by ste fyzicky zlomiť zariadenia. To bude fungovať. 590 00:37:14,930 --> 00:37:19,600 [Smiech] Ale či je to trochu drahé riešenie, čo by bolo rozumnejšie? 591 00:37:19,600 --> 00:37:23,270 Jo. >> [Študent] prepísať. Prepísať >> s tým, čo? >> [Študent] Ďalšie dáta. 592 00:37:23,270 --> 00:37:29,070 Ďalšie údaje. Stačí si len prepísať disku s 0s alebo 1s alebo všetkých 0s, všetko 1s. 593 00:37:29,070 --> 00:37:31,230 >> A to je skutočne to, čo niektoré softvérové ​​robí. 594 00:37:31,230 --> 00:37:33,570 Môžete si kúpiť softvér, alebo dokonca získať zadarmo softvér, 595 00:37:33,570 --> 00:37:36,610 a dokonca postavil do Mac OS v týchto dňoch, menej v systéme Windows, 596 00:37:36,610 --> 00:37:38,660 je schopnosť bezpečne vymazať. 597 00:37:38,660 --> 00:37:41,960 Vlastne, ak chcete, aby všetci beží domov dnes, ak máte Mac, a to, 598 00:37:41,960 --> 00:37:45,740 ak máte nejaké veci v smetiaku, môžete tak urobiť Secure Empty Trash, 599 00:37:45,740 --> 00:37:47,610 ktorý robí presne to. 600 00:37:47,610 --> 00:37:53,350 Skôr než len mazanie súborov tu, že nevymaže 0s a 1s tu, 601 00:37:53,350 --> 00:38:01,240 trochu, to len zmení ich všetky, napríklad, aby 0s a bodka, bodka, bodka. 602 00:38:01,240 --> 00:38:05,330 Takže jeden z vašich budúcich psets bude skutočne úmyselne obnoviť dáta - 603 00:38:05,330 --> 00:38:08,430 fotografie, ktoré ste urobili ľudí, miest a vecí na akademickej pôde 604 00:38:08,430 --> 00:38:12,810 pre ktoré urobíme forenznú obraz z digitálneho fotoaparátu na pamäťovú kartu, 605 00:38:12,810 --> 00:38:17,120 čo je presne rovnaký nápad - a budete musieť byť vyzvaní, aby skutočne nájsť 606 00:38:17,120 --> 00:38:20,160 vzory, ktoré predstavujú JPEG na pevnom disku, 607 00:38:20,160 --> 00:38:23,610 podobne ako tento bývalý študent, ktorého e-mail som čítal pred niekoľkými týždňami urobil 608 00:38:23,610 --> 00:38:25,860 obnoviť jeho sestry fotografií. 609 00:38:25,860 --> 00:38:30,300 Prečo sme sa 5-minút prestávku tu, a my preskupiť sa viac na pamäti. 610 00:38:33,030 --> 00:38:38,610 Tak tu je miesto, kde sa veci trochu myseľ-ohýbanie, ale je to veľmi silný krok 611 00:38:38,610 --> 00:38:40,480 k pochopeniu to všetko viac. 612 00:38:40,480 --> 00:38:42,900 Tu je program s názvom pointers.c. 613 00:38:42,900 --> 00:38:45,430 To je medzi dnešným ukážkovom kóde. 614 00:38:45,430 --> 00:38:51,280 Všimnite si, že v prvých niekoľkých riadkov, 19 až 22, všetko, čo robíte, je niečo ako GetString 615 00:38:51,280 --> 00:38:54,460 a vrátenie adresu, ukladanie v §. 616 00:38:54,460 --> 00:38:58,380 Od tej doby pre PSet aj 3, ak chcete, ale Pset 4 a na 617 00:38:58,380 --> 00:39:01,030 kde si môžete začať užívať tieto vzdelávacie kolies nad seba, 618 00:39:01,030 --> 00:39:04,030 nie je dôvod predstierať, že reťazce už neexistuje. 619 00:39:04,030 --> 00:39:07,030 Je to určite v poriadku len začať hovoriť char *. 620 00:39:07,030 --> 00:39:12,610 >> Ako stranou, on-line odkazy a knihách môžete často vidieť hviezdu vedľa premenné. 621 00:39:12,610 --> 00:39:15,600 Môžete dokonca vidieť priestor okolo oboch stranách. 622 00:39:15,600 --> 00:39:17,680 Všetky z nich sú funkčne správne. 623 00:39:17,680 --> 00:39:21,180 Pre túto chvíľu, keď budeme štandardizovať na tomto prístupe, aby sa super clear 624 00:39:21,180 --> 00:39:24,000 že char * je ako povedať, že znak ukazovateľ. 625 00:39:24,000 --> 00:39:25,680 To je typ dát. 626 00:39:25,680 --> 00:39:28,730 A potom názov premennej je v tomto prípade. 627 00:39:28,730 --> 00:39:31,180 Takže sme dostali reťazec a my sme hovorili s 628 00:39:31,180 --> 00:39:35,180 A potom tu dole si, že robím vlastne trochu podvod. 629 00:39:35,180 --> 00:39:39,080 To sa nazýva ukazovateľ aritmetiku, ktorá je akýmsi super jednoduchý. 630 00:39:39,080 --> 00:39:41,790 To len znamená, že sčítanie a odčítanie čísla ukazovateľov. 631 00:39:41,790 --> 00:39:43,660 Ale to skutočne funguje. 632 00:39:43,660 --> 00:39:49,170 Tento program zrejme vypíše reťazca s 1 znak na riadku taká, že konečný výsledok - 633 00:39:49,170 --> 00:39:54,920 Len tak môžeme pokaziť, kde to bude, aby ukazovatele, spustite ukazovatele, dovoľte mi, aby som Zoom 634 00:39:54,920 --> 00:39:58,940 Teraz mi dovoľte, aby som typ v niečo ako HELLO a typ Enter 635 00:39:58,940 --> 00:40:01,080 a tlačí 1 znak na riadku. 636 00:40:01,080 --> 00:40:04,730 Až do druhej pred, by sme urobili s hranatá zátvorka notácie. 637 00:40:04,730 --> 00:40:09,760 Mali by sme pre sláčiky, a my by sme to printf S [i], a my by sme to urobiť znovu a znovu a znovu 638 00:40:09,760 --> 00:40:11,950 s lomítkom n na konci každého riadku. 639 00:40:11,950 --> 00:40:16,800 Ale tento program je iný. Tento program používa, doslova, aritmetika. 640 00:40:16,800 --> 00:40:18,860 Tak čo sa to tu deje? 641 00:40:18,860 --> 00:40:24,720 Po prvé, pred slučka ešte vykoná, čo, len aby bolo jasno, je to vlastne? 642 00:40:24,720 --> 00:40:27,270 S je? >> [Študent] adresa. >> Adresa. 643 00:40:27,270 --> 00:40:32,980 >> A to je adresa, v prípade ahoj, prvý znak v tomto slova, ktoré je h 644 00:40:32,980 --> 00:40:37,370 Tak s je, že v tomto konkrétnom príklade, adresa h 645 00:40:37,370 --> 00:40:41,850 Takže čo to znamená robiť s + aj? 646 00:40:41,850 --> 00:40:46,280 No, aj začína na hodnote 0 v tomto pre slučke. Urobili sme, že mnohokrát. 647 00:40:46,280 --> 00:40:49,760 I sa ísť do dĺžky reťazca, ako sa zdá. 648 00:40:49,760 --> 00:40:53,950 Tak na prvý iterácii tohto cyklu, aj je samozrejme 0. 649 00:40:53,950 --> 00:41:01,740 Takže tento výraz hovorí s + aj - skôr s +0--to je samozrejme len s 650 00:41:01,740 --> 00:41:04,320 Takže to, čo je * tu? 651 00:41:04,320 --> 00:41:08,530 Teraz sme použili na hviezdičku v trochu iným spôsobom. 652 00:41:08,530 --> 00:41:13,080 Nechaj ma ísť napred a zbaviť t, pretože sme urobili hovoríme o t a kópií s 653 00:41:13,080 --> 00:41:15,540 Teraz už len chcem povedať príbeh zahŕňajúci s. 654 00:41:15,540 --> 00:41:20,090 A tak v tomto okamihu, potom, čo reťazec typu, náš svet vyzerá úplne ako to robil predtým 655 00:41:20,090 --> 00:41:26,630 sa len s uložením adresu h a všeobecne ukazuje na reťazec ahoj. 656 00:41:26,630 --> 00:41:33,170 Keby som teraz robiť čiary ako * (y + i), skúsme to. 657 00:41:33,170 --> 00:41:40,140 Takže * (s + i). Dovoľte mi zjednodušiť, pretože to je 0, tak sa jedná * (y 0). 658 00:41:40,140 --> 00:41:43,790 No, počkajte chvíľku. Ďalej zjednodušiť. To je * (y). 659 00:41:43,790 --> 00:41:47,020 No, teraz zátvorky sú trochu hlúpy, takže teraz poďme urobiť * s 660 00:41:47,020 --> 00:41:50,540 Takže v prvej iterácii tohto cyklu, že linka, ktorá je zvýraznená, 26, 661 00:41:50,540 --> 00:41:53,650 je do značnej miery zodpovedá tlač to. 662 00:41:53,650 --> 00:41:56,040 Aký je typ dát * s? 663 00:41:56,040 --> 00:42:00,770 V tejto súvislosti, pretože hviezdy sa stane, že je v tesnej blízkosti s sám, 664 00:42:00,770 --> 00:42:04,930 ale konkrétne, pretože sme už vyhlásil s, 665 00:42:04,930 --> 00:42:09,730 nie sme vytvorením premenné už, tam žiadna zmienka o char * v súlade 26, 666 00:42:09,730 --> 00:42:14,280 tam žiadna zmienka o kľúčových reťazca, sme len pomocou premennej s názvom s, 667 00:42:14,280 --> 00:42:19,650 to dopadá teraz hviezda má mierne odlišné, a síce, mätúce význam. 668 00:42:19,650 --> 00:42:26,590 * Tu znamená ísť na adresu v s a tlačiť, čo tam je. 669 00:42:26,590 --> 00:42:33,750 Takže s je tu, * s je - niečo ako zásobníky a rebríky, za šípkou - tu. 670 00:42:33,750 --> 00:42:35,850 Tak toto je * s 671 00:42:35,850 --> 00:42:39,060 >> Takže to, čo sa má vytlačiť na prvej iterácii tohto cyklu v súlade 26? 672 00:42:39,060 --> 00:42:42,170 Aj vytlačiť% C, ​​čo je zástupný symbol pre znak, 673 00:42:42,170 --> 00:42:48,520 potom \ n pre nový riadok. * (Y + i), kde i je 0, je práve táto. 674 00:42:48,520 --> 00:42:53,670 Takže to, čo char si môžem v% c? H. 675 00:42:53,670 --> 00:42:56,900 V ďalšom opakovaní slučky - môžete pravdepodobne vidieť, kde to bude - 676 00:42:56,900 --> 00:43:01,350 ďalšie iterácie i je samozrejme 1, takže to znamená s 1, 677 00:43:01,350 --> 00:43:05,580 a potom teraz nemám potrebovať zátvorky, pretože teraz hviezda potrebuje povedať 678 00:43:05,580 --> 00:43:08,620 prejsť na adresu v pamäti s 1. 679 00:43:08,620 --> 00:43:14,170 Čo je to? Poďme sa vrátiť v čase a hovoria, že toto arrow teraz nie je v skutočnosti robí nám žiadnu láskavosť. 680 00:43:14,170 --> 00:43:18,450 Či to konkrétne povedať, že je to uloženie čísla 123 681 00:43:18,450 --> 00:43:25,110 pretože začiatku tohto reťazca ahoj, to je adresa 123, to je 124, a tak ďalej. 682 00:43:25,110 --> 00:43:30,550 Takže na druhej iterácii, keď hovorím s 1, to je ako povedať, že 123 1, 683 00:43:30,550 --> 00:43:35,340 inak známy ako 124, takže to, čo char sa vytlačí na druhú iteráciu? 684 00:43:35,340 --> 00:43:37,850 E na adresu v pamäti 124. 685 00:43:37,850 --> 00:43:44,440 Potom znovu +, 125, 126, 127, a táto slučka našťastie zastaví predtým, než sme sa sem dostali 686 00:43:44,440 --> 00:43:49,040 pretože som pomocou strlen, aby sa ubezpečil, že som sa nepočíta príliš vysoká. 687 00:43:49,040 --> 00:43:50,810 Takže to tiež nie je ono. 688 00:43:50,810 --> 00:43:55,000 Opäť, je to rovnako ako keď sme robili pred týždňom. 689 00:43:55,000 --> 00:43:59,200 Dovoľte mi, aby som napísať na riadku nižšie, aj keď nechceme robiť oboje. 690 00:43:59,200 --> 00:44:02,500 Toto je totožný sa v tejto oblasti. 691 00:44:02,500 --> 00:44:08,310 >> Takže aj keď to je reťazec, ako sme sa volať to týždne, to je naozaj char *. 692 00:44:08,310 --> 00:44:13,270 Takže ak chceme byť super anal, je to naozaj správne napísať osobitný znak 693 00:44:13,270 --> 00:44:17,490 v tej polohe pomocou týchto číselných adries a túto hviezdu operátor, 694 00:44:17,490 --> 00:44:20,470 ale úprimne povedané, je to tak oveľa čistejšie. Takže to nie je zlé. 695 00:44:20,470 --> 00:44:26,720 Nie je dôvod prestať riadok 27 tu, ale 26 je funkčne rovnaký, 696 00:44:26,720 --> 00:44:31,570 a je to funkčne rovnaké presne z dôvodov, ktoré sme boli diskutovať tak ďaleko. 697 00:44:31,570 --> 00:44:33,650 A konečne, 29 je len dobré praxe. 698 00:44:33,650 --> 00:44:38,420 Volanie zadarmo s znamená, že teraz dávate späť pamäť, ktorá GetString vám dal 699 00:44:38,420 --> 00:44:41,630 pretože opäť, ako už som spomenul Pondelok, GetString týždne 700 00:44:41,630 --> 00:44:44,180 bolo zavedenie chybu do kódu. 701 00:44:44,180 --> 00:44:46,490 Váš kód týždne mal úniky pamäte 702 00:44:46,490 --> 00:44:49,970 kedy ste sa pýtali GetString pre pamäť, ale nikdy si dával späť. 703 00:44:49,970 --> 00:44:53,410 A to bol uvážene volený nami pedagogicky 704 00:44:53,410 --> 00:44:55,880 pretože je to jednoducho príliš o čom premýšľať čoskoro. 705 00:44:55,880 --> 00:44:57,710 Ale teraz potrebujeme viac symetriu. 706 00:44:57,710 --> 00:45:00,830 Ak sa opýtate počítač pamäť, ako je tomu v prípade GetString, 707 00:45:00,830 --> 00:45:02,820 ako je tomu v prípade očividne pre malloc, 708 00:45:02,820 --> 00:45:07,970 Teraz musíte pre PSet 4 dopredu aj bez takejto pamäti. 709 00:45:07,970 --> 00:45:11,650 Všimnite si, to je niečo iné ako hovoriť int n 710 00:45:11,650 --> 00:45:15,040 Nemusíte sa uvoľniť, pretože si nevolal GetString 711 00:45:15,040 --> 00:45:16,890 a nevolal malloc. 712 00:45:16,890 --> 00:45:20,610 >> A aj keď si volal GetInt ako budeme nakoniec vidieť, 713 00:45:20,610 --> 00:45:25,520 GetInt nie je alokovať pamäť pre vás, pretože môžete skutočne prejsť okolo celé čísla 714 00:45:25,520 --> 00:45:29,430 a pláva a písmen presne tak, ako sme to robili niekoľko týždňov. 715 00:45:29,430 --> 00:45:33,960 Reťazce, aj keď sú zvláštne, pretože naozaj sú zreťazenie viac znakov. 716 00:45:33,960 --> 00:45:37,450 Takže sú len odlišné od znakov a plaváky a ints a podobne. 717 00:45:37,450 --> 00:45:39,980 Ale vrátime sa, že onedlho. 718 00:45:39,980 --> 00:45:44,920 Akékoľvek otázky, potom na tomto začiatku ukazovateľov? Jo. 719 00:45:44,920 --> 00:45:49,690 [Nepočuteľné Študent otázka] 720 00:45:49,690 --> 00:45:51,440 Ah, veľmi dobrá otázka. 721 00:45:51,440 --> 00:45:55,790 Jedna z mála vecí, C skutočne robí pre vás, čo je výhodné, 722 00:45:55,790 --> 00:46:00,110 je to vyrieši za vás, čo je veľkosť tohto dátového typu 723 00:46:00,110 --> 00:46:03,060 a potom robí, že druh množenie pre vás. 724 00:46:03,060 --> 00:46:06,610 To nie je v prípade znakov, pretože takmer vždy znak je 1 byte, 725 00:46:06,610 --> 00:46:08,150 tak to proste funguje. 726 00:46:08,150 --> 00:46:11,220 Ale v záujme diskusie, pokiaľ ste boli skutočne tlače celé čísla 727 00:46:11,220 --> 00:46:15,500 a vy sa pokúšate vytlačiť nejakú hodnotu s, ktorý ukazoval na celé číslo, 728 00:46:15,500 --> 00:46:20,720 si podobne nebudú musieť robiť + 4 * i len preto, že int je 4 bajty. 729 00:46:20,720 --> 00:46:25,780 Ukazovateľ aritmetické znamená, že C a kompilátor robiť všetky, že matematika pre vás. 730 00:46:25,780 --> 00:46:29,190 Jediné, čo musíte starať len o počítanie v druhu ľudskom zmysle. Jo. 731 00:46:29,190 --> 00:46:35,200 [Študent] Ak deklarujete reťazec vnútri slučky for, musíš uvoľniť neskôr? 732 00:46:35,200 --> 00:46:36,760 Dobrá otázka. 733 00:46:36,760 --> 00:46:41,390 >> Ak ste vyhlásil reťazca vnútri pre slučky, budete potrebovať uvoľniť neskôr? 734 00:46:41,390 --> 00:46:47,520 Jediné, čo potrebujete, aby ste uvoľnili pamäť, že ste prideliť s GetString alebo malloc. 735 00:46:47,520 --> 00:46:53,110 Takže ak ste práve povedal niečo ako - dovoľte mi, aby som zložené zátvorky teraz tak celý kód je venovaná. 736 00:46:53,110 --> 00:46:58,580 Ak ste niečo, hoci buggily, ako je táto, char * t = s, 737 00:46:58,580 --> 00:47:03,450 nemusíte sa zdarma t, pretože t neobsahovala žiadnu zmienku o malloc alebo GetString. 738 00:47:03,450 --> 00:47:08,960 Ak naopak ste to urobili, GetString, potom áno, budete musieť zadarmo t 739 00:47:08,960 --> 00:47:14,350 A v skutočnosti, jediná šanca, ako to urobiť, je teraz vo vnútri tejto slučky, pre rovnakú vydanie pôsobnosti 740 00:47:14,350 --> 00:47:16,060 že sme diskutovali v minulosti. 741 00:47:16,060 --> 00:47:18,830 Inak by ste sa prideľovanie pamäti, prideľovanie pamäti, prideľovanie pamäti, 742 00:47:18,830 --> 00:47:21,230 a na konci programu, pretože to mimo tento slučky, 743 00:47:21,230 --> 00:47:24,240 t neexistuje, ale nikdy si na operačný systém 744 00:47:24,240 --> 00:47:26,750 že ste nepotrebovali, že pamäť už. 745 00:47:26,750 --> 00:47:30,430 A netrvalo dlho, pre PSet 4 alebo 5 budeme vybaviť si s programom s názvom Valgrind, 746 00:47:30,430 --> 00:47:34,160 ktorý je podobný v duchu, aby GDB v tom, že je to má trochu tajomný rozhranie, 747 00:47:34,160 --> 00:47:35,750 ale jeho účel v živote je, aby vám pomohol. 748 00:47:35,750 --> 00:47:39,380 A Valgrind je program, ktorý bude v budúcnosti hľadať svoje programy 749 00:47:39,380 --> 00:47:42,550 hľadá úniky pamäti, či už z GetString alebo malloc, 750 00:47:42,550 --> 00:47:47,800 ktoré začneme používať to viac, ako sme prestali používať CS50 knižnice toľko. 751 00:47:47,800 --> 00:47:53,030 Konečne sme teraz druh slovníka a druh mentálneho modelu v teóriu 752 00:47:53,030 --> 00:47:55,170 s ktorými sa vyriešiť tento rozbité program. 753 00:47:55,170 --> 00:47:59,410 >> Takže v tomto rozbité programu, swap funguje vnútri swapu, 754 00:47:59,410 --> 00:48:05,280 ale nikdy skutočne odpracovaných hodín v hlavnom, pretože hlavné prešiel v x a y, si spomenúť, 755 00:48:05,280 --> 00:48:07,260 a tie boli odovzdané v roku hodnotami, aby som tak povedal. 756 00:48:07,260 --> 00:48:09,330 Kópie z nich dostali na swap. 757 00:48:09,330 --> 00:48:12,520 Do konca roka swapu, a b skutočne boli vymenené, 758 00:48:12,520 --> 00:48:16,120 ale samozrejme x a y, ako sme diskutovali v pondelok, nebol. 759 00:48:16,120 --> 00:48:19,940 Takže navrhujem zelene tu, že to je vlastne riešenie tu. 760 00:48:19,940 --> 00:48:22,640 A skutočne, dovoľte mi, aby som presunúť svoje hviezdy len preto, aby bolo v súlade 761 00:48:22,640 --> 00:48:24,440 aj keď, opäť, funkčne to nevadí. 762 00:48:24,440 --> 00:48:28,730 V budúcnosti týždňov budeme vysvetliť kedy a prečo to robí záležitosť. 763 00:48:28,730 --> 00:48:30,600 Takže zelene Teraz je riešenie. 764 00:48:30,600 --> 00:48:33,700 Úprimne povedané, vyzerá to oveľa chaotičnosti, pretože mám všetky z týchto hviezd. 765 00:48:33,700 --> 00:48:35,380 Dovoľte mi, aby som poukázať na jednu vec. 766 00:48:35,380 --> 00:48:40,040 Horný riadok tu, kde sa hovorí, že int * a int * b 767 00:48:40,040 --> 00:48:42,820 je zásadne robí to isté, ako tomu vždy bolo. 768 00:48:42,820 --> 00:48:47,070 To prehlasuje 2 argumenty alebo parametre vymeniť, 769 00:48:47,070 --> 00:48:49,940 Prvá z nich je int ukazovateľ nazvaný, 770 00:48:49,940 --> 00:48:53,100 z ktorých druhá je int ukazovateľ nazvaný b 771 00:48:53,100 --> 00:48:55,770 Jediná vec, ktorá je nové v tomto bode je fakt, že je tu hviezda tam. 772 00:48:55,770 --> 00:48:59,340 >> Čo to znamená? Nie je int, b nie je int. 773 00:48:59,340 --> 00:49:04,100 Je adresa int a b je adresa iného int. 774 00:49:04,100 --> 00:49:06,980 Tu dole, to je miesto, kde som sa priznať, že C dostane mätúce. 775 00:49:06,980 --> 00:49:09,790 Teraz sme použili hviezdu, ale to má iný význam v tejto súvislosti. 776 00:49:09,790 --> 00:49:13,150 Vzhľadom k tomu, že nie sme deklarovať ukazovatele, ako sme tu, 777 00:49:13,150 --> 00:49:15,500 tu sme dereferencing veci. 778 00:49:15,500 --> 00:49:21,520 Takže technicky, hviezda v tejto súvislosti prvý, druhý a tretí riadok vnútri odkladacieho priestoru 779 00:49:21,520 --> 00:49:24,560 je dereferencia operátor, ktorý jednoducho znamená ísť tam. 780 00:49:24,560 --> 00:49:27,400 Takže rovnako ako môj prst nasledoval na šípku h, 781 00:49:27,400 --> 00:49:31,100 * Prostriedok prejsť na túto adresu a nájdi mi int, ktorá je tam. 782 00:49:31,100 --> 00:49:34,250 * B prostriedky idú na adresu a odovzdať mi, čo tam je. 783 00:49:34,250 --> 00:49:40,730 Takže poďme prekresliť obraz od pondelka teraz používajú hromadu snímok, 784 00:49:40,730 --> 00:49:43,130 spodná z ktorých jeden je bude hlavné, 785 00:49:43,130 --> 00:49:47,600 horné z ktorých jeden je bude výmena, 786 00:49:47,600 --> 00:49:50,880 tak, aby náš svet vyzerá, rovnako ako pondelok takhle. 787 00:49:50,880 --> 00:49:53,620 Tu je kus pamäti, že hlavné je bude používať. 788 00:49:53,620 --> 00:49:56,520 >> Pripomeňme, že od pondelka program jednoducho musel 2 premenné, 789 00:49:56,520 --> 00:50:01,930 jeden volal X a jeden s názvom y, a ja som dal čísla 1 a 2 tam. 790 00:50:01,930 --> 00:50:06,580 Teraz, keď som hovor vymeniť ako ja v pondelok, 791 00:50:06,580 --> 00:50:11,000 skôr, keď som použil červenú verziu tohto programu, ktorý vyzerá takto, 792 00:50:11,000 --> 00:50:17,470 Mám 2 parametre, a a b, a čo píšeme tu a tu? 793 00:50:17,470 --> 00:50:21,160 Len 1 a 2, doslova kopíruje x a y. 794 00:50:21,160 --> 00:50:23,070 Dnes sme zmeniť. 795 00:50:23,070 --> 00:50:28,510 Dnes miesto odovzdania v ints a, b budeme odovzdávať v 2 adresy. 796 00:50:28,510 --> 00:50:34,290 Tieto adresy sa stalo, aby ukazoval na ints, ale tieto adresy nie sú ints sami. 797 00:50:34,290 --> 00:50:37,330 Sú adresy. Je to ako poštovú adresu miesto. 798 00:50:37,330 --> 00:50:40,580 Takže teraz musíme len dať si trochu podrobnejšie na obrazovke. 799 00:50:40,580 --> 00:50:43,250 To je môj počítač pamäti, ako to bolo celý deň. 800 00:50:43,250 --> 00:50:45,120 Teraz potrebujeme nejaký ľubovoľný schéma číslovania. 801 00:50:45,120 --> 00:50:50,580 Takže povedzme, náhodou, že toto je adresa pamäte 123, 124. 802 00:50:50,580 --> 00:50:55,660 Povedzme to je 125, to je 126, a tak ďalej, ale je to úplne ľubovoľný. 803 00:50:55,660 --> 00:50:58,590 Potrebujeme len trochu číslovanie v mojej pamäti. 804 00:50:58,590 --> 00:51:04,030 Takže teraz, keď som vlastne odovzdať x a y, nebudem sa potom x a y; 805 00:51:04,030 --> 00:51:08,400 Idem odovzdať na poštovú adresu, aby som tak povedal, o x a y 806 00:51:08,400 --> 00:51:11,870 tak, že to, čo je uložená tu a tu nie je 1 a 2, 807 00:51:11,870 --> 00:51:16,030 ale ak môžete vidieť môj malý text, čo je odovzdaný v tu a tu? 808 00:51:16,030 --> 00:51:23,340 [Nepočuteľné Študent odpoveď] >> Presne tak. 123 dostane dal sem a 124 dostane dať sem. 809 00:51:23,340 --> 00:51:28,910 >> Teraz, pretože som použil hviezdu v tomto prvom riadku až sem na vrchol, 810 00:51:28,910 --> 00:51:34,340 môj program jednoducho vie, že 123 a 124, aj keď to samozrejme celé čísla 811 00:51:34,340 --> 00:51:40,160 že každý človek môže všimnúť, by sa mali vykladať ako adresy, číselné adresy. 812 00:51:40,160 --> 00:51:43,250 Nie sú samy o sebe ints, sú adresy, 813 00:51:43,250 --> 00:51:46,120 a to preto, že som výslovne dal hviezdy tam. 814 00:51:46,120 --> 00:51:51,360 Takže teraz v mojej prvý, druhý a tretí riadok aktuálneho kódu, čo sa tu deje? 815 00:51:51,360 --> 00:51:53,380 Poďme čerpať zvyšok obrazu. 816 00:51:53,380 --> 00:51:56,980 Tmp je, rovnako ako to bolo v pondelok. Nič zvláštneho tmp. 817 00:51:56,980 --> 00:52:03,060 Je to len miestne 32 bitov premenné, a vnútri, že som zrejme uloženie hodnoty *. 818 00:52:03,060 --> 00:52:08,580 Teraz, keď som povedal, tmp =, čo by som dal tu? >> [Študent] 123. 819 00:52:08,580 --> 00:52:10,370 123. Ale to nie je to, čo robím. 820 00:52:10,370 --> 00:52:13,670 Hovorím tmp = *. Počet hviezdičiek znamená tam. 821 00:52:13,670 --> 00:52:19,370 Takže tu je, 123. Ako mám ísť tam? Predstierať, že sa tam šípka. 822 00:52:19,370 --> 00:52:24,460 No, tu to je, 1. Takže to, čo je uložená v tmp, zrejme? Len 1. 823 00:52:24,460 --> 00:52:29,620 Takže inými slovami, tmp je * a, * prostriedkom prejdite na adresu, ktorá je v súčasnej dobe v, 824 00:52:29,620 --> 00:52:31,320 čo je zrejme 123. 825 00:52:31,320 --> 00:52:33,910 >> Dobre, tu sme na mieste 123, vidím číslo 1, 826 00:52:33,910 --> 00:52:35,670 tak som dám číslo 1 tam. 827 00:52:35,670 --> 00:52:39,020 Teraz, čo mám robiť, v riadku 2, * = * b? 828 00:52:39,020 --> 00:52:44,570 To je trochu viac zapojiť, pretože teraz to, čo je? Je to 123. 829 00:52:44,570 --> 00:52:50,220 Takže * je kde? Presne tam, kde som bol predtým. Takže tam. Dobre. 830 00:52:50,220 --> 00:52:53,420 Teraz, konečne, a potom konečne to začne dávať zmysel, dúfajme, 831 00:52:53,420 --> 00:53:00,280 * B znamená to, čo je v B? 124. Tak som potrebné tam, čo je o 2. 832 00:53:00,280 --> 00:53:03,430 Tak čo som dal, kde? 833 00:53:03,430 --> 00:53:10,100 2 ide do tu, pretože * b prejde do *. Takže to urobím. 834 00:53:10,100 --> 00:53:13,120 A už môžete vidieť, možno, že sme tak oveľa bližšie 835 00:53:13,120 --> 00:53:17,710 k riešeniu tohto hlúpy, jednoduchý problém správne prvýkrát 836 00:53:17,710 --> 00:53:20,920 pretože teraz máme pred sebou ešte spomienku na to, čo bolo x, 837 00:53:20,920 --> 00:53:23,230 máme 2 kópie, síce y, 838 00:53:23,230 --> 00:53:25,850 ale riadok 3 teraz hovorí, * b 839 00:53:25,850 --> 00:53:31,080 Tak tu je b * B prostriedky tam. Tak kde je umiestnenie 124? 840 00:53:31,080 --> 00:53:35,560 Je to vraj tu. Tak čo mám dať sem? Samozrejme, tmp. 841 00:53:35,560 --> 00:53:39,600 Takže teraz som to. Tak som si tu 1 a 2 tu. 842 00:53:39,600 --> 00:53:43,560 A teraz, čo o tom všetkom, 123, 124, a 1? 843 00:53:43,560 --> 00:53:47,910 Akonáhle swapových výnosov, táto pamäť je rovnako dobrý ako stratené 844 00:53:47,910 --> 00:53:51,070 pretože akonáhle swapových vráti, operačný systém 845 00:53:51,070 --> 00:53:54,190 je zadarmo na použitie, že pamäť v budúcnosti znova. 846 00:53:54,190 --> 00:53:58,870 Iba pamäť Hlavné je v dolnej časti tejto tzv zásobníka drží okolo. 847 00:53:58,870 --> 00:54:01,470 >> A tak sme konečne máme teraz pracovnej verzii. 848 00:54:01,470 --> 00:54:06,310 Nechaj ma ísť do swap.c, a všimnite si nasledujúce. 849 00:54:06,310 --> 00:54:11,280 V hornej časti programu zmenil som prototyp byť int * a int * b 850 00:54:11,280 --> 00:54:15,000 Takže jediné, čo som zmenil ísť z červenej, ktorá bola zlá, na zelenú, čo je dobré, 851 00:54:15,000 --> 00:54:17,350 Aj sa pridal tieto hviezdy dnes. 852 00:54:17,350 --> 00:54:21,520 Ale potom tu v prehodiť sám som musel skopírovať, vložiť to, čo bolo práve na snímke. 853 00:54:21,520 --> 00:54:24,140 Mám hviezdu tu, hviezda tu - to zodpovedá prototyp - 854 00:54:24,140 --> 00:54:27,930 a potom všetky tieto veci teraz majú hviezdy s výnimkou tmp 855 00:54:27,930 --> 00:54:30,680 pretože použitie pomocné premenné, tu nič nové. 856 00:54:30,680 --> 00:54:33,040 Potrebujem len dočasné úložisko pre int. 857 00:54:33,040 --> 00:54:34,820 Takže nepotrebujeme hviezdu tam. 858 00:54:34,820 --> 00:54:39,310 Potrebujeme len hviezdu, takže môžeme prejsť tento druh svojvoľné hranice 859 00:54:39,310 --> 00:54:42,900 medzi týmito 2 snímok v mojej pamäti počítača. 860 00:54:42,900 --> 00:54:45,630 Ale jedna posledná vec sa musí zmeniť, a možno ste zahliadli ho už. 861 00:54:45,630 --> 00:54:48,810 Čo druhý riadok je samozrejme iná teraz? >> [Študent] & x. 862 00:54:48,810 --> 00:54:53,270 >> Jo, tak 25 je posledný riadok kódu musím zmeniť pre túto prácu. 863 00:54:53,270 --> 00:54:58,360 Pred týždňom a ešte v pondelok riadok 25 vyzeral, vymeniť X a Y, 864 00:54:58,360 --> 00:55:02,020 a toto bolo práve rozišla, pretože ak hovoríte swap (x, y) 865 00:55:02,020 --> 00:55:05,660 dávate kópie X a Y vymieňať, potom to robí svoju vec, 866 00:55:05,660 --> 00:55:09,080 ale vy ste nikdy skutočne mení, x a y sám. 867 00:55:09,080 --> 00:55:12,880 Takže aj keď ste nikdy nevidel tento znak skôr s ampersand v kóde, 868 00:55:12,880 --> 00:55:15,860 len hádať. Čo ampersand robiť, zrejme? 869 00:55:15,860 --> 00:55:17,890 [Študent] zastáva adresu. >> Zastáva adresu. 870 00:55:17,890 --> 00:55:21,160 Takže ampersand hovorí daj mi adresu x. 871 00:55:21,160 --> 00:55:25,590 Kto vie, kde to je? Stáva sa, že je 123. Nezaujíma ma. Daj mi adresu x. 872 00:55:25,590 --> 00:55:28,340 A y sa rozumie daj mi adresu y. 873 00:55:28,340 --> 00:55:34,450 A v tomto bode príbeh je úplne v súlade s obrázkom sme vychádzali pred chvíľou. 874 00:55:34,450 --> 00:55:38,310 >> Tak som si priznať ukazovatele, určite pre mňa, keď som prvýkrát začal učiť to, 875 00:55:38,310 --> 00:55:40,570 boli rozhodne jedna z najťažších vecí, zabaliť svoju myseľ okolo. 876 00:55:40,570 --> 00:55:43,760 Ale uvedomiť, najmä ak budeme držať hrať s týmito druhmi vecí, 877 00:55:43,760 --> 00:55:48,030 Ak vyraziť na tieto super jednoduchý druh intelektuálne nezaujímavý problémy 878 00:55:48,030 --> 00:55:52,270 jednoduchého pohybu atómov okolo, odpoveď na mnoho zmätku s ukazovateľmi 879 00:55:52,270 --> 00:55:56,590 Naozaj je možné odvodiť z týchto veľmi základné mechaniky. 880 00:55:56,590 --> 00:55:59,070 Tu je adresa. Choďte tam s hviezdou. 881 00:55:59,070 --> 00:56:03,830 Alebo naopak, tu je ampersand. Zistiť, čo je adresa v skutočnosti je. 882 00:56:03,830 --> 00:56:06,270 Dobrá. 883 00:56:06,270 --> 00:56:09,000 Takže tam, kde sa všetky tieto pamäte pochádza z? 884 00:56:09,000 --> 00:56:12,360 Sme vypracovaný tento obrázok niekoľkokrát, a stále perspektívny vrátime k tomu, 885 00:56:12,360 --> 00:56:14,920 ale tu je reprezentácia pamäte vášho počítača 886 00:56:14,920 --> 00:56:17,420 to je trochu viac, než náš označené tabuli je tu. 887 00:56:17,420 --> 00:56:21,590 Text segmente na vrchole predstavuje to, čo vo vzťahu k programu? 888 00:56:21,590 --> 00:56:26,090 [Nepočuteľné Študent odpoveď] >> Je nám ľúto,? Povedz to znovu. 889 00:56:26,090 --> 00:56:28,660 [Študent] skutočný program. >> Aktuálny program. 890 00:56:28,660 --> 00:56:32,430 >> Takže 0s a 1s, ktoré ste zostavili po zápise kód v C a potom beží zvonenie 891 00:56:32,430 --> 00:56:35,910 a generovanie 0s a 1s skončí ako dobývanie zastrčený tam v pamäti 892 00:56:35,910 --> 00:56:38,570 pretože pri poklepaní na ikonu na vašom počítači Mac alebo PC 893 00:56:38,570 --> 00:56:43,010 alebo spustiť príkaz ako Mario u Vášho riadku, vaše 0s a 1s z disku 894 00:56:43,010 --> 00:56:45,700 si nahrá do pamäti tak, že počítač môže manipulovať s nimi 895 00:56:45,700 --> 00:56:47,540 a realizovať rýchlejšie. 896 00:56:47,540 --> 00:56:50,880 Takže inicializované údaje a neinicializovaný dát, nebudeme moc hovoriť o tých, 897 00:56:50,880 --> 00:56:52,420 ale tie sú len globálne premenné. 898 00:56:52,420 --> 00:56:54,710 Inicializované znamená globálne premenné, ktoré ste zadali hodnoty; 899 00:56:54,710 --> 00:56:59,300 neinicializovaný znamená globálne premenné, ktoré ste doteraz dávajú hodnoty. 900 00:56:59,300 --> 00:57:01,900 Potom je tu tieto premenné prostredie, ktoré budem úplne vlnu ruku na, 901 00:57:01,900 --> 00:57:04,860 ale sú tam, a že ukladá veci ako užívateľské meno 902 00:57:04,860 --> 00:57:08,090 a iný druh na nižšej úrovni detailov. 903 00:57:08,090 --> 00:57:12,880 Ale Nejšťavnatější kusy z pamäťovej tieto rozloženie je to, čomu sa hovorí stack a haldy. 904 00:57:12,880 --> 00:57:17,470 Stack znova, aby bolo jasno, je pamäť, ktorá sa používa vždy, keď sú volány funkcie, 905 00:57:17,470 --> 00:57:19,710 ak existujú miestne premenné 906 00:57:19,710 --> 00:57:22,120 a ak sú parametre, ktoré kolovali. 907 00:57:22,120 --> 00:57:24,490 To všetko sa deje v zásobníku. 908 00:57:24,490 --> 00:57:29,570 Halda sme nehovorili o tom, ale hádať, kto používa haldy. 909 00:57:31,120 --> 00:57:32,690 Len iný kus pamäte. 910 00:57:32,690 --> 00:57:36,620 Stáva sa to byť vypracované tu hore, ale to je arbitrárny obrazovej konvencie. 911 00:57:36,620 --> 00:57:41,670 Kto je zrejme používa pamäť z haldy týždne? 912 00:57:41,670 --> 00:57:44,830 Je to technicky vy, ale nepriamo. >> [Študent] GetString. 913 00:57:44,830 --> 00:57:47,950 GetString a malloc. Tak tu je zásadný rozdiel. 914 00:57:47,950 --> 00:57:51,300 >> Viete, za posledných pár týždňov, že ak budete potrebovať pamäť, stačí deklarovať premennú. 915 00:57:51,300 --> 00:57:54,560 Ak potrebujete veľa pamäte, deklarovať pole priamo vo vnútri vášho funkcie. 916 00:57:54,560 --> 00:57:59,620 Ale problém sme stále čelí, je, ak ste deklarovať premenné lokálne vnútri funkcií, 917 00:57:59,620 --> 00:58:05,340 akonáhle sa funkcia vráti, čo sa stane do pamäte a tie premenné? 918 00:58:05,340 --> 00:58:09,620 Tak nejako to už nie je tvoja, že jo? Je to jednoducho zmizne druh koncepčne. 919 00:58:09,620 --> 00:58:13,950 Je to ešte fyzicky tam, samozrejme, ale to je už nie vaše právo na používanie. 920 00:58:13,950 --> 00:58:17,160 To je samozrejme problematické, ak chcete písať funkcie v živote 921 00:58:17,160 --> 00:58:20,440 že skutočne alokovať pamäť a nedávajú ju späť okamžite. 922 00:58:20,440 --> 00:58:24,180 Vec v bode: GetString tieto účel v živote je mať tušenie vopred 923 00:58:24,180 --> 00:58:26,390 ako veľký reťazec budem písať na klávesnici, 924 00:58:26,390 --> 00:58:30,390 ale to musí byť schopný alokovať pamäť držať Davida alebo Hello 925 00:58:30,390 --> 00:58:32,860 alebo celé esej, ktorý užívateľ môže zadali dovnútra 926 00:58:32,860 --> 00:58:35,280 Takže GetString bol pomocou malloc. 927 00:58:35,280 --> 00:58:38,910 Malloc preto musí používať nie stoh; 928 00:58:38,910 --> 00:58:40,770 namiesto toho sa pomocou tohto vec zvanú halda. 929 00:58:40,770 --> 00:58:44,430 Na tom nie je nič iné na pamäti. Nie je to rýchlejšie alebo pomalšie, alebo niečo podobné. 930 00:58:44,430 --> 00:58:46,570 Je to len fyzicky na inom mieste. 931 00:58:46,570 --> 00:58:50,120 >> Ale pravidlo je, že pamäť, ktorá je na halde 932 00:58:50,120 --> 00:58:56,180 nebude nikdy odňaté, kým nezavoláte - hádať - zadarmo. 933 00:58:56,180 --> 00:59:00,510 Naopak, každý pamäť môžete požiadať o na zásobníku len vyhlásením poľa 934 00:59:00,510 --> 00:59:03,320 alebo deklarovaní premenné, ako sme to robili niekoľko týždňov, 935 00:59:03,320 --> 00:59:05,640 že v predvolenom nastavení skončí na zásobníku. 936 00:59:05,640 --> 00:59:09,550 A to funguje veľké 90% času, ale na tých vzácnejších prípadoch 937 00:59:09,550 --> 00:59:12,470 , Kde chcete alokovať pamäť a udržať ho okolo, 938 00:59:12,470 --> 00:59:14,730 potom budete musieť použiť funkciu ako malloc. 939 00:59:14,730 --> 00:59:19,370 Alebo sme používali funkciu ako GetString, čo používa malloc. 940 00:59:19,370 --> 00:59:23,300 Poďme sa pozrieť, kde by to mohlo zlomiť dole a potom sa pozrieť na Binkym. 941 00:59:23,300 --> 00:59:25,820 Vrátime sa k tomu v budúcnosti. 942 00:59:25,820 --> 00:59:29,270 Tu je super jednoduchý program, ktorý v prvých 2 riadky čo robí? 943 00:59:29,270 --> 00:59:33,460 V angličtine, čo tieto prvé 2 riadky kódu vykonávajú vnútri main? 944 00:59:33,460 --> 00:59:35,600 [Nepočuteľné Študent odpoveď] 945 00:59:35,600 --> 00:59:37,880 Opatrne. To mi nedáva adresu X alebo Y. 946 00:59:37,880 --> 00:59:41,840 [Študent] dáva odkazy na ints. Dobrý >>. Dajte mi 2 ukazovatele na celé čísla. 947 00:59:41,840 --> 00:59:45,130 Inými slovami, daj mi 2 kusy pamäti, že som udržujú výkres dnes, 948 00:59:45,130 --> 00:59:46,950 aj keď som vymazal to teraz, ako štvorce. 949 00:59:46,950 --> 00:59:50,000 Dajte mi 2 kusy pamäte, jeden s názvom x, jeden volal y - 950 00:59:50,000 --> 00:59:54,320 skôr som im s a t - a čo je typ tohto kusu pamäti? 951 00:59:54,320 --> 00:59:57,160 Bude to uložiť adresu. 952 00:59:57,160 --> 00:59:59,110 Je to z * typ int. 953 00:59:59,110 --> 01:00:01,630 >> Takže adresa int nakoniec žiť v x, 954 01:00:01,630 --> 01:00:03,860 adresu int nakoniec žiť v y, 955 01:00:03,860 --> 01:00:08,460 ale spočiatku, čo je vo vnútri x a y? Kto vie? Smetiarske hodnoty. 956 01:00:08,460 --> 01:00:10,180 To nemá nič spoločné s ukazovateľmi. 957 01:00:10,180 --> 01:00:12,720 Ak sme sa dať tam niečo, kto vie, čo je to vlastne je? 958 01:00:12,720 --> 01:00:18,950 Teraz, x. Čo sa tu deje? To je legitímna teraz, pretože x je ukazovateľ. Je to int *. 959 01:00:18,950 --> 01:00:21,870 Takže to znamená, že môžem dať do x adresu nejakého kusu pamäte. 960 01:00:21,870 --> 01:00:25,120 Čo malloc vráti? Perfect, vráti adresy, 961 01:00:25,120 --> 01:00:28,510 adresu prvého bajtu v celej kus pamäte. 962 01:00:28,510 --> 01:00:31,140 Koľko bytov sa táto zdanlivo prideľovanie, napríklad, v prístroji? 963 01:00:31,140 --> 01:00:33,510 Čo je to veľkosť int? 4. 964 01:00:33,510 --> 01:00:36,600 Ak si myslíte, že späť do týždňa 1, to nie je super dôležité vždy pamätať na to, 965 01:00:36,600 --> 01:00:38,870 ale v tomto prípade je užitočné vedieť, 4 bajty. 966 01:00:38,870 --> 01:00:41,770 Takže toto je prideľovanie na haldy 4 bajty 967 01:00:41,770 --> 01:00:46,110 a to sa vracia adresu prvej sa mi svojvoľne. 968 01:00:46,110 --> 01:00:47,700 A teraz, čo je x robí? 969 01:00:47,700 --> 01:00:52,200 * X = 42 robí čo? 970 01:00:52,200 --> 01:00:57,150 Ak v tomto okamihu v príbehu máme x, ktorý vyzerá takto s niektorými odpadky hodnotou, 971 01:00:57,150 --> 01:01:04,120 To je teraz y s niektorými odpadky hodnotou, teraz v súlade 3 som pridelená 4 bajty. 972 01:01:04,120 --> 01:01:06,950 Tento obrázok v podstate vyzerá takto. 973 01:01:06,950 --> 01:01:12,010 Alebo viac špecificky, ak je to ľubovoľná adresa 123, to je to, čo náš príbeh teraz vyzerá. 974 01:01:12,010 --> 01:01:23,940 * X = 42 teraz znamená čo? To znamená, že ísť na adresu 123 a dal číslo 42 tam. 975 01:01:23,940 --> 01:01:26,220 Nepotrebujem k tomu tieto riadky, pretože nerobíme reťazca. 976 01:01:26,220 --> 01:01:29,480 >> Mal som práve napísal takto, a len pre demonštráciu boží, 977 01:01:29,480 --> 01:01:33,240 42 ako int druh zaberá veľa miesta, 4 bajty. 978 01:01:33,240 --> 01:01:35,960 Tak to je to, čo sa tam stalo, ale je tu problém teraz. 979 01:01:35,960 --> 01:01:40,580 * Y = 13. Čo sa bude diať tu? 980 01:01:40,580 --> 01:01:46,470 Problém je * y v našom zjednodušenom svete len znamená, že ísť na adresu v y. 981 01:01:46,470 --> 01:01:48,590 Čo je v y? Je to nejaký smetiarske hodnota. 982 01:01:48,590 --> 01:01:53,150 Takže predpokladajme, že odpad hodnota je 5551212, niečo šialené takého. 983 01:01:53,150 --> 01:01:56,750 * Y znamená ísť riešiť 5551212. 984 01:01:56,750 --> 01:02:00,450 To je ako tu. To neexistuje, napríklad. 985 01:02:00,450 --> 01:02:05,310 Takže * y dostane 13 znamená, že som sa snaží čerpať 13 tu. To neexistuje. 986 01:02:05,310 --> 01:02:08,790 Som prekročil segment tabuľu. Čo získam? 987 01:02:08,790 --> 01:02:14,930 To tajomná správa Segmentation fault, pretože sa snažím, aby v pamäti 988 01:02:14,930 --> 01:02:19,470 hodnota ako 13 na mieste, ktoré neexistuje. 989 01:02:19,470 --> 01:02:23,900 Zvyšok programu by mohlo fungovať v poriadku, ale až do tej doby to robí nie. 990 01:02:23,900 --> 01:02:25,350 Takže poďme sa pokúsiť rozprávať tento príbeh. 991 01:02:25,350 --> 01:02:27,830 Vrátime sa k tomu raz sme hovorili o hex. 992 01:02:27,830 --> 01:02:30,290 Vráťme sa k tomu, a uzavrieť s týmto, čomu sa hovorí Binky, 993 01:02:30,290 --> 01:02:33,710 ktorý odvolanie je profesorom Stanfordskej sedí doma hrá s Claymation, 994 01:02:33,710 --> 01:02:36,380 rozprávať príbeh o presne rovnaké programu. 995 01:02:36,380 --> 01:02:40,580 Je to len asi 3 minúty dlhé. Tu máme Binky. 996 01:02:40,580 --> 01:02:45,030 [Male reproduktor na videu] Ahoj Binky, prebudiť. Je čas na ukazovateľ zábavu. 997 01:02:45,030 --> 01:02:50,080 [Binky] Čo je to? Ďalšie informácie o ukazovateli? Oh, dobrota! 998 01:02:50,080 --> 01:02:53,700 [Samec reproduktor] No, začať, myslím, že budeme potrebovať pár rád. 999 01:02:53,700 --> 01:02:57,890 >> [Binky] Dobre. Tento kód prideľuje 2 ukazovatele, ktoré môžu ukazovať na celé čísla. 1000 01:02:57,890 --> 01:03:02,220 [Samec reproduktor] Dobre. No, vidím 2 ukazovatele, ale nezdá sa, že sa ukázal k ničomu. 1001 01:03:02,220 --> 01:03:05,550 [Binky] To je pravda. Spočiatku, ukazovatele neukazujú na nič. 1002 01:03:05,550 --> 01:03:09,270 Veci, ktoré smerujú k sa nazýva pointees, a ich nastavenie je samostatný krok. 1003 01:03:09,270 --> 01:03:12,330 [Samec reproduktor] Oh, dobre, dobre. Vedel som, že. V pointees sú oddelené. 1004 01:03:12,330 --> 01:03:15,630 Ehm, tak ako si prideliť pointee? 1005 01:03:15,630 --> 01:03:21,510 [Binky] Dobre. Tento kód alokuje nový integer pointee, a táto časť nastaví x poukázať na to. 1006 01:03:21,510 --> 01:03:23,500 [Samec reproduktor] Hej, to vyzerá lepšie. 1007 01:03:23,500 --> 01:03:26,030 Tak, aby to niečo urobiť. >> [Binky] Dobre. 1008 01:03:26,030 --> 01:03:30,300 Budem dereferencia ukazovatele x číslo uložiť 42 do svojho pointee. 1009 01:03:30,300 --> 01:03:34,410 Pre tento trik budem potrebovať svoju kúzelnú paličku z dereferencing. 1010 01:03:34,410 --> 01:03:38,610 [Samec reproduktor] Vaše kúzelná palička z dereferencing? To je skvelé. 1011 01:03:38,610 --> 01:03:44,230 [Binky] To je to, čo kód vyzerá. Ja si len nastaviť počet a ... [Praskanie zvuku] 1012 01:03:44,230 --> 01:03:46,100 [Samec reproduktor] Hej pozri, tam to ide. 1013 01:03:46,100 --> 01:03:50,990 Tak robí dereferencia na X nasleduje šípka prístup k jeho pointee, 1014 01:03:50,990 --> 01:03:53,230 v tomto prípade k uloženiu 42 tam. 1015 01:03:53,230 --> 01:03:57,630 Ahoj, skúste ho uložiť číslo 13 cez iné ukazovatele, y. 1016 01:03:57,630 --> 01:04:03,250 [Binky] Dobre. Ja pôjdem sem k y a dostať číslo 13 nastavenie 1017 01:04:03,250 --> 01:04:08,360 a potom mať prútik z dereferencing a len ... [Bzučanie] Whoa! 1018 01:04:08,360 --> 01:04:10,980 [Samec reproduktor] Oh hey, to nepomohlo. 1019 01:04:10,980 --> 01:04:14,870 >> Povedz, Binky, ja si nemyslím, že dereferencing y je dobrý nápad 1020 01:04:14,870 --> 01:04:17,880 pretože nastavenie pointee je samostatný krok 1021 01:04:17,880 --> 01:04:19,850 a ja si nemyslím, že sme kedy urobili. 1022 01:04:19,850 --> 01:04:21,770 [Binky] Hmm, dobrá pripomienka. 1023 01:04:21,770 --> 01:04:26,640 [Samec reproduktor] Jo. Sme pridelené ukazovateľ y, ale nikdy sme nastaviť, aby ukazoval na pointee. 1024 01:04:26,640 --> 01:04:28,780 [Binky] Hmm, veľmi pozorný. 1025 01:04:28,780 --> 01:04:30,690 [Samec reproduktor] Hej, vyzeráš dobre tam, Binky. 1026 01:04:30,690 --> 01:04:34,160 Dokážeš to opraviť tak, že y odkazuje na rovnaký pointee ako x? >> [Binky] Jasne. 1027 01:04:34,160 --> 01:04:37,100 Budem používať svoj kúzelnú paličku ukazovacie práce. 1028 01:04:37,100 --> 01:04:39,070 [Samec reproduktor] je, že bude problém ako predtým? 1029 01:04:39,070 --> 01:04:40,840 [Binky] No, to nedotýka pointees. 1030 01:04:40,840 --> 01:04:44,780 Je to jednoducho zmení jedného ukazovateľ ukazovať na rovnakú vec ako iný. [Praskanie zvuku] 1031 01:04:44,780 --> 01:04:48,570 [Samec reproduktor] Oh, vidím. Teraz y poukazuje na rovnakom mieste ako x. 1032 01:04:48,570 --> 01:04:51,140 Tak počkať. Teraz y je stanovená. Má pointee. 1033 01:04:51,140 --> 01:04:54,520 Takže si môžete vyskúšať prútik z dereferencing znovu poslať 13 OVER. 1034 01:04:54,520 --> 01:04:58,130 [Binky] Uh, jo. Tu ide. [Praskanie zvuku] 1035 01:04:58,130 --> 01:05:01,250 [Samec reproduktor] Hej, pozri sa na to. Teraz dereferencing práce na y. 1036 01:05:01,250 --> 01:05:05,200 A pretože ukazovatele sú nelegálne, že jeden pointee, obaja pozri 13. 1037 01:05:05,200 --> 01:05:06,910 [Binky] Jo, zdieľanie. Čokoľvek. 1038 01:05:06,910 --> 01:05:08,880 >> Takže sa budeme prepínať miesta teraz? 1039 01:05:08,880 --> 01:05:11,420 [Samec reproduktor] Oh look, sme mimo čas. >> [Binky] Ale - 1040 01:05:11,420 --> 01:05:13,880 [Samec reproduktor] Len si spomeňte na 3 ukazovatele pravidlá. 1041 01:05:13,880 --> 01:05:18,630 Číslo 1, základná štruktúra je, že máte ukazovateľ, a to ukazuje na na pointee. 1042 01:05:18,630 --> 01:05:23,120 Ale ukazovateľ a pointee sú oddelené, a Častou chybou je nastaviť ukazovateľ 1043 01:05:23,120 --> 01:05:25,680 ale zabudol dať jej pointee. 1044 01:05:25,680 --> 01:05:29,580 Číslo 2, ukazovateľ dereferencing začína u ukazovatele a sleduje šípku cez 1045 01:05:29,580 --> 01:05:31,060 prístup k jeho pointee. 1046 01:05:31,060 --> 01:05:34,340 Ako všetci vieme, to funguje len v prípade, že je pointee, 1047 01:05:34,340 --> 01:05:36,460 aký druh sa vracia do Pravidlo číslo 1. 1048 01:05:36,460 --> 01:05:39,870 Číslo 3, ukazovateľ priradenie vezme jeden ukazovateľ a zmení ju 1049 01:05:39,870 --> 01:05:42,390 poukázať na rovnakej pointee ako iný ukazovateľ. 1050 01:05:42,390 --> 01:05:45,890 Takže po zadaní, budú tieto 2 ukazovatele ukazovať na rovnakú pointee. 1051 01:05:45,890 --> 01:05:47,800 Niekedy tomu sa hovorí zdieľanie. 1052 01:05:47,800 --> 01:05:50,910 >> A to je všetko, čo k nej naozaj. Bye-bye teraz. 1053 01:05:50,910 --> 01:05:55,840 To je Binky. To je CS50. Uvidíme sa budúci týždeň. [Potlesk] 1054 01:05:55,840 --> 01:05:59,000 >> [CS50.TV]