1 00:00:00,000 --> 00:00:02,310 [Powered by Google Translate] [4. týden, pokračování] 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 konec 4. týdnu. 5 00:00:11,290 --> 00:00:14,030 Takže nějaká dobrá zpráva, a některé špatné zprávy. 6 00:00:14,030 --> 00:00:26,240 No přednáška v pondělí, není problém nastavit příští týden. [Studenti fandění] 7 00:00:26,240 --> 00:00:28,680 Ty nebude líbit, kde to bude. 8 00:00:28,680 --> 00:00:31,590 Ale máme toto místo příští středu, 9 00:00:31,590 --> 00:00:37,740 a tam je také dle sylabu 1 přednášce pátek příští pátek, takže můžeme zůstat na trati. 10 00:00:37,740 --> 00:00:40,580 Ale všechno bude natočen jako obvykle, takže žádný strach. 11 00:00:40,580 --> 00:00:44,100 >> A pokud jde o kvíz 0, co budeme dělat, ke konce týdne 12 00:00:44,100 --> 00:00:47,140 je příspěvek na hřišti v úvodní cs50.net vysvětlení 13 00:00:47,140 --> 00:00:50,160 z jaké očekávání, měli byste mít, pokud jde o první kvíz. 14 00:00:50,160 --> 00:00:55,100 Obecně platí, že to multiple choice, true-false, krátká odpověď, krátké kódování problémy. 15 00:00:55,100 --> 00:00:57,360 Nebudete se očekává, že k provedení ekvivalent 16 00:00:57,360 --> 00:01:00,030 o problém, který by viděl na PSet, pro které máte počítač 17 00:01:00,030 --> 00:01:03,240 a debugger a podobně, ale bude malé kódování problémy. 18 00:01:03,240 --> 00:01:06,900 >> A skutečně, nejlepším vodítkem získat pocit z toho, co CS50 kvízy jsou jako 19 00:01:06,900 --> 00:01:09,180 , je jít na cs50.net, přejděte na kvízy odkaz, 20 00:01:09,180 --> 00:01:11,920 a můžete vidět, že v minulých několik let v hodnotě kvízů. 21 00:01:11,920 --> 00:01:16,600 Jen si uvědomit, že osnovy není vždy stejná v průběhu let. 22 00:01:16,600 --> 00:01:18,510 Někdy přidáme, někdy odčítání, 23 00:01:18,510 --> 00:01:20,670 takže pokud vidíte nějaké téma na jednom z těch starých kvízy 24 00:01:20,670 --> 00:01:25,380 že nemáte tušení, co to mluví, je to buď, že jsme se pokrýt 25 00:01:25,380 --> 00:01:27,210 nebo že jsme neměli pokrýt. 26 00:01:27,210 --> 00:01:31,110 Ale ve formě recenzí, tuto neděli, pondělí a úterý 27 00:01:31,110 --> 00:01:34,770 stejně jako v průběhu kurzu širokou přezkoumání zasedání v neděli večer - 28 00:01:34,770 --> 00:01:37,500 čas a místo budou oznámeny na hřišti domovskou stránku - 29 00:01:37,500 --> 00:01:40,120 máte všichni možnost prohlédnout s průběhem v učebních kolegy 30 00:01:40,120 --> 00:01:44,830 materiál pro tento rok, a to jak v průřezu a jako plné třídy, 31 00:01:44,830 --> 00:01:48,400 a ty bude natočen jako obvykle také. 32 00:01:48,400 --> 00:01:53,380 >> Dobrá. Takže bez dalších okolků, jeden komentář na vyhověl / nevyhověl a přidejte / drop. 33 00:01:53,380 --> 00:01:57,980 Možná jste viděli své poznámky minulou noc, a to je opravdu jen některé další uklidnění 34 00:01:57,980 --> 00:02:01,250 že patříte-li mezi ty, zejména méně pohodlné, nebo někde mezi 35 00:02:01,250 --> 00:02:04,870 a máte pocit, jen trochu v tom až po hlavu, 36 00:02:04,870 --> 00:02:08,430 si uvědomit, že je opravdu docela normální, a tam je dostatek nosná konstrukce v místě, 37 00:02:08,430 --> 00:02:13,530 z nichž jedna úřední hodiny byl zaujatý na zlepšení všech více na mé e-mailové minulou noc, 38 00:02:13,530 --> 00:02:16,520 a uvědomit si, že příliš možností, jako vyhověl / nevyhověl pro třídu, jako je tento 39 00:02:16,520 --> 00:02:21,540 Opravdu je třeba jako mechanismus vzít okraj pryč kurzu, jako je tato, 40 00:02:21,540 --> 00:02:24,200 takže znovu, pokud trávíte těch 10, 15, 20 hodin 41 00:02:24,200 --> 00:02:28,160 Jen se snažím získat nějaké PSet do práce a víte, že jste 90-95%, jak je 42 00:02:28,160 --> 00:02:32,100 ale nemůžete najít nějaký zatracený chybu, v průsmyku / selhání modelu, který je trochu v pořádku. 43 00:02:32,100 --> 00:02:36,230 >> Myšlenka je, že s tímto mechanismem pak můžete jít se zaměřují na vaše další psets 44 00:02:36,230 --> 00:02:39,530 nebo spát nebo co to je, že chcete zaměřit. 45 00:02:39,530 --> 00:02:43,390 Takže si uvědomit, že máte do této nadcházející úterý - technicky 5. pondělí, 46 00:02:43,390 --> 00:02:50,840 ale je to svátek, takže to přijde úterý - přejít z režimu pass / fail, aby tříděných nebo naopak. 47 00:02:50,840 --> 00:02:54,450 A pokud jste opravdu nad propastí a uvažujete o svržení celkem, 48 00:02:54,450 --> 00:02:56,440 prosím, chyť mě po přednášce nebo napište mi poznámku. 49 00:02:56,440 --> 00:02:59,990 Rádi bychom alespoň chatu před nabídku adieu. 50 00:02:59,990 --> 00:03:03,470 Dobrá. Takže jsme začali brát na školení kola off minule. 51 00:03:03,470 --> 00:03:06,030 Zejména jsme se zaměřili na provázku. 52 00:03:06,030 --> 00:03:09,740 Řetězec je něco, co prohlásil v knihovně CS50, 53 00:03:09,740 --> 00:03:14,340 konkrétně v tomto souboru s názvem cs50.h které začneme dívat na tento týden a příští. 54 00:03:14,340 --> 00:03:17,250 Ale řetězec je opravdu jen zjednodušení něco 55 00:03:17,250 --> 00:03:20,980 to je trochu arcanely popsat jako char *. 56 00:03:20,980 --> 00:03:24,090 Char jsme zvyklí. Je to jen jeden znak. 57 00:03:24,090 --> 00:03:28,010 Ale * v pondělí označil co? >> [Student] ukazatel. 58 00:03:28,010 --> 00:03:31,290 Ukazatel. A co je ukazatel? >> [Student] adresa. 59 00:03:31,290 --> 00:03:33,420 >> Je to jako adresa, umístění v paměti. 60 00:03:33,420 --> 00:03:35,910 Co je to adresa nebo umístění, nebo vzpomínka? 61 00:03:35,910 --> 00:03:40,290 Opět platí, že každý z nás má notebooky s koncertem nebo 2 GB paměti RAM s největší pravděpodobností v těchto dnech, 62 00:03:40,290 --> 00:03:44,160 a to znamená, že máte miliard 2000000000 bajtů v hodnotě paměti. 63 00:03:44,160 --> 00:03:46,240 A to opravdu není jedno, co to fyzicky vypadá, 64 00:03:46,240 --> 00:03:51,220 ale vzít na víře, že můžete očíslovat všechny jednotlivých bajtů, ž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 přesně to, co dělá počítač. 67 00:03:56,100 --> 00:04:00,030 Když přidělit prostor pro jeden znak, například, 68 00:04:00,030 --> 00:04:02,480 zřejmě musí žít někde v paměti počítače, 69 00:04:02,480 --> 00:04:05,860 a možná, že je to v byte číslo 12345, 70 00:04:05,860 --> 00:04:08,470 a to je někde tady v paměti počítače. 71 00:04:08,470 --> 00:04:12,630 A adresa pak tímto znakem je 12345. 72 00:04:12,630 --> 00:04:16,140 >> Nyní, v týdnu 0 až nyní tak daleko, jsme se opravdu záleží 73 00:04:16,140 --> 00:04:19,170 kde v paměti věci jsou uloženy, protože se obvykle používají symboly, 74 00:04:19,170 --> 00:04:22,540 proměnné, a pole se skutečně dostat na naše data. 75 00:04:22,540 --> 00:04:24,950 Ale v pondělí a všech více dnes, budete nyní muset 76 00:04:24,950 --> 00:04:27,710 všechny další výrazné schopnosti s psaním programů 77 00:04:27,710 --> 00:04:31,330 opravdu manipulovat s paměti počítače však uznáte za vhodné, 78 00:04:31,330 --> 00:04:33,720 jak pro dobré účely a špatných, 79 00:04:33,720 --> 00:04:39,620 chyby je velmi běžný výsledek v tomto bodě v učení tohle. 80 00:04:39,620 --> 00:04:42,460 Ale co to vlastně znamená být char *? 81 00:04:42,460 --> 00:04:46,140 Pojďme dál zpět k - a vrátíme se Binkym, jak jsem slíbil dnes. 82 00:04:46,140 --> 00:04:48,670 Pojďme na jednoduchém příkladu zde. 83 00:04:48,670 --> 00:04:53,060 Dovolte mi, abych tento soubor uložit jako compare.c, a dovolte mi trochu šablony kód zde 84 00:04:53,060 --> 00:05:00,490 tak patří stdio.h, dovolte mi, abych také dávám patří cs50.h. Budu zoomovat až tam. 85 00:05:00,490 --> 00:05:05,850 Dovolte mi, abych začal psát hlavní int, main (void), a teď chci udělat něco takového: 86 00:05:05,850 --> 00:05:13,520 printf ("Dej mi řetězec:") a pak budu používat string s dostane GetString 87 00:05:13,520 --> 00:05:16,750 k získání řetězce od uživatele, pak jsem se zeptat uživatele na jiného. 88 00:05:16,750 --> 00:05:21,870 ("Dej mi ještě řetězec:") a budu se jich zeptat přes GetString se dostat, že. 89 00:05:21,870 --> 00:05:27,020 Zavolám jí t, protože t přichází po S a S je hezké jméno pro řetězce, pokud je to docela druhový. 90 00:05:27,020 --> 00:05:30,030 Takže GetString, a teď chci udělat zdravý rozum kontrolu a budu říkat 91 00:05:30,030 --> 00:05:39,770 if (s == t) pak jsem jen tak říct uživatele printf ("Zadali jste to samé \ n!"); 92 00:05:39,770 --> 00:05:45,520 jinak budu vytisknout něco jako ("Zadali jste něco jiného! \ n") 93 00:05:45,520 --> 00:05:48,460 nebo co věta bude. Takže něco takového. 94 00:05:48,460 --> 00:05:52,200 Pak jako obvykle, vrátím 0, která se právě znamenali, že se nic nestalo, 95 00:05:52,200 --> 00:05:54,400 a já jdu dál a zkompilovat a spustit tento program. 96 00:05:54,400 --> 00:05:56,540 >> Ale v pondělí jsme spustili tento program, 97 00:05:56,540 --> 00:06:00,420 a vlastně bylo řečeno, že HELLO není HELLO a GOODBYE není GOODBYE. 98 00:06:00,420 --> 00:06:03,140 Chování jsme viděli, bylo trochu více jako toto. 99 00:06:03,140 --> 00:06:11,450 Nech mě jít do mého zdrojového adresáře, zoom sem, a pojďme se udělat porovnání. 100 00:06:11,450 --> 00:06:14,570 Zpracovala pořádku. Dovolte mi, abych spustit porovnání. Dej mi řetězec: HELLO. 101 00:06:14,570 --> 00:06:16,300 Dej mi ještě řetězec: HELLO. 102 00:06:16,300 --> 00:06:18,000 Zadali jste něco jiného! 103 00:06:18,000 --> 00:06:22,650 No, zkusím něco jednoduššího jako 50, 50. Zadali jste něco jiného! 104 00:06:22,650 --> 00:06:25,740 hi, hi. Tak jasně, něco se děje. 105 00:06:25,740 --> 00:06:28,440 Ale co bylo vysvětlení, proč? 106 00:06:28,440 --> 00:06:33,850 Zdá se, že linka 12 je zcela nefunkční. 107 00:06:34,300 --> 00:06:39,430 Co je to zásadní problém tady? Jo. >> [Student] Je to porovnáním adres. 108 00:06:39,430 --> 00:06:41,850 Jo, přesně tak. Je to vlastně porovnávání adresy 109 00:06:41,850 --> 00:06:44,580 , ve kterém jsou uloženy HELLO a HELLO. 110 00:06:44,580 --> 00:06:48,290 Není to porovnáním dopisy HELLO znovu a znovu, 111 00:06:48,290 --> 00:06:52,370 protože to, co se opravdu stalo, celou tu dobu jsme byli s použitím GetString - 112 00:06:52,370 --> 00:06:56,130 Tato tabule je opět naší paměti počítače, 113 00:06:56,130 --> 00:07:00,100 a řekněme, že jsem zavolat GetString po deklarování proměnné s. 114 00:07:00,100 --> 00:07:01,930 Co moje paměť vypadat? 115 00:07:01,930 --> 00:07:07,070 Řekněme libovolně říci, že to vypadá takhle. Je to čtverec. 116 00:07:07,070 --> 00:07:09,040 A skoro žádné, kdy jsem kreslila kus paměti na obrazovce 117 00:07:09,040 --> 00:07:12,860 pokud je to 32 bitů jsem byla kresba čtverců, jako je tento, protože skutečně v zařízení, 118 00:07:12,860 --> 00:07:17,380 ukazatel, adresa, je 32 bitů. Je to stejné jako int. 119 00:07:17,380 --> 00:07:19,420 To může lišit v závislosti na počítačovém systému. 120 00:07:19,420 --> 00:07:24,630 Ti z vás, kteří jsou matně obeznámeni s tím, že váš Mac nebo PC je 64 bitů, 121 00:07:24,630 --> 00:07:28,120 že vlastně označuje, že váš počítač používá 64-bitové ukazatele, 122 00:07:28,120 --> 00:07:33,730 64-bitové adresy, a mezi upsides na které je vaše počítače 123 00:07:33,730 --> 00:07:35,560 mohou mít mnohem více paměti RAM, než minulosti. 124 00:07:35,560 --> 00:07:39,240 Dlouhý příběh krátký, zpět v den, kdy počítače používá pouze 32 bitů 125 00:07:39,240 --> 00:07:42,740 reprezentovat adres, největší počet bytů, by mohlo představovat 126 00:07:42,740 --> 00:07:46,280 v tomto případě je to, co máte 32 bitů? 127 00:07:46,280 --> 00:07:49,590 Takže 4000000000, pravé, protože 2 na 32 je 4 mld. Kč. 128 00:07:49,590 --> 00:07:51,370 Toto číslo se opakující v průběhu. 129 00:07:51,370 --> 00:07:55,240 >> Takže pokud máte pouze 32 bitů, nejvyšší číslo, které se můžete spolehnout, je zhruba 4 mld. Kč. 130 00:07:55,240 --> 00:07:58,750 Ale to byla zásadní omezení počítačů až do doby před několika lety 131 00:07:58,750 --> 00:08:01,180 protože pokud můžete jen počítat jak vysoce jak 4000000000, 132 00:08:01,180 --> 00:08:05,270 nezáleží na tom, jestli si koupíte 8 GB paměti RAM nebo dokonce 5 GB paměti RAM; 133 00:08:05,270 --> 00:08:07,780 nemůžete počítat, že vysoká, takže to bylo k ničemu. 134 00:08:07,780 --> 00:08:11,430 Dalo by se přistupovat pouze první 3 nebo 4 GB paměti vašeho počítače. 135 00:08:11,430 --> 00:08:14,410 To je menší problém teď, a můžete si koupit MacBook Pros a Dells 136 00:08:14,410 --> 00:08:17,680 s 8 GB paměti RAM nebo ještě v těchto dnech. 137 00:08:17,680 --> 00:08:24,100 Ale kdybych přidělit prostě v tomto programu ukazatel, ukazatel nazvaný s, 138 00:08:24,100 --> 00:08:28,370 by to mohlo vypadat takto na obrazovce, protože skutečně potřebujeme odtrhněte této vrstvy. 139 00:08:28,370 --> 00:08:33,520 Pořád říkal řetězec, ale v pondělí, string je opravdu char *, 140 00:08:33,520 --> 00:08:35,590 adresa nějakého charakteru. 141 00:08:35,590 --> 00:08:39,280 Takže pojďme se, že školení kolo off, i když budeme i nadále používat GetString nyní. 142 00:08:39,280 --> 00:08:42,600 Tak jsem prohlásil s, a to je kus paměti, 32 bitů. 143 00:08:42,600 --> 00:08:47,370 Co je tady v paměti ve výchozím nastavení? >> [Neslyšitelné Student odpověď] 144 00:08:47,370 --> 00:08:50,040 Co je to? >> [Student] Garbage. >> Garbage. Přesně tak. 145 00:08:50,040 --> 00:08:54,610 Pokud programátor nedávejte hodnotu proměnné, kdo ví, co to je? 146 00:08:54,610 --> 00:08:57,990 Někdy máte štěstí a je to 0, který je tak trochu pěkné, čisté výchozí hodnoty, 147 00:08:57,990 --> 00:09:00,310 ale jak jsme viděli Pondělí, někdy je to úplný nesmysl, 148 00:09:00,310 --> 00:09:04,130 některé opravdu velké kladné nebo záporné číslo, které přišlo odkud? 149 00:09:05,350 --> 00:09:07,010 Jo. >> [Student] funkce před. Jo >>. 150 00:09:07,010 --> 00:09:10,170 >> Často funkce, která dostala jen předtím, protože zapamatovat, 151 00:09:10,170 --> 00:09:13,920 jak volat funkce v paměti, zabírají více a více prostoru zdola nahoru, 152 00:09:13,920 --> 00:09:17,040 a jakmile se funkce vrátí, dostane znovu, že paměť 153 00:09:17,040 --> 00:09:20,890 do příštího chlap, který se nazývá, který je pomocí stejného plátek paměti. 154 00:09:20,890 --> 00:09:23,450 A pokud jste opustil odpadky tam, předchozí hodnoty, 155 00:09:23,450 --> 00:09:28,190 můžeme mylně s jako s nějakou hodnotu, když opravdu nemáme dát tam něco. 156 00:09:28,190 --> 00:09:30,960 Takže naše RAM v tomto bodě vypadá takto. 157 00:09:30,960 --> 00:09:36,030 Nyní na pravé straně řádku 7 voláme GetString, 158 00:09:36,030 --> 00:09:40,150 které jsme dělali nyní týdnů, ale to, co je GetString opravdu dělá? 159 00:09:40,150 --> 00:09:43,350 GetString napsal CS50 personálu je málo inteligentní 160 00:09:43,350 --> 00:09:46,500 v tom, že jakmile uživatel začne stisku kláves a hity Enter, 161 00:09:46,500 --> 00:09:50,010 GetString postavy z kolika úhozů dělal uživatel hit, 162 00:09:50,010 --> 00:09:53,360 kolik znaků musím přidělit RAM pro. 163 00:09:53,360 --> 00:09:55,660 A kde, že RAM pochází, kdo ví? 164 00:09:55,660 --> 00:09:58,930 Je někde ve vašem počítači je 2 GB nebo kdoví co ještě v paměti. 165 00:09:58,930 --> 00:10:05,200 Ale předpokládejme, že počítač našel prostor pro slovo HELLO tady. 166 00:10:05,200 --> 00:10:08,710 Slovo jsem napsal byl H-E-L-L-O. 167 00:10:08,710 --> 00:10:13,510 A pokud čerpáme to jako sekvence znaků, můžeme nakreslit to takhle. 168 00:10:13,510 --> 00:10:17,860 Ale musím udělat 1 další věc. Co patří na konci každého řetězce v C? 169 00:10:17,860 --> 00:10:20,710 Null znak, který napíšeme, \ 0. 170 00:10:20,710 --> 00:10:23,980 Je to technicky číslo 0, ale zpětné lomítko je celý jasněji 171 00:10:23,980 --> 00:10:28,150 , že je to doslova číslo 0, je celé číslo 0; 172 00:10:28,150 --> 00:10:32,440 to není, například, cituji-konec citátu 0, které by vás mohly zadejte na klávesnici. 173 00:10:32,440 --> 00:10:33,940 Tak tohle je HELLO. 174 00:10:33,940 --> 00:10:36,350 >> A co na to řekneme v pondělí, že funkce jako GetString 175 00:10:36,350 --> 00:10:39,580 je vlastně vrací všechny ty týdny? 176 00:10:39,580 --> 00:10:43,960 Není to vrací řetězec na sobě, protože to opravdu není mít smysl 177 00:10:43,960 --> 00:10:47,710 protože řetězce neexistují. Jsou trochu zhotovení v CS50 knihovně. 178 00:10:47,710 --> 00:10:51,300 Co je opravdu řetězec, více technicky? >> [Student] Je to první znak. 179 00:10:51,300 --> 00:10:55,950 Přesně tak. Je to prostě adresu první znak, který uživatel zadali dovnitř 180 00:10:55,950 --> 00:11:02,810 Takže pokud moje slovo HELLO končí to v byte číslo 123 a pak na byte číslo 124, 181 00:11:02,810 --> 00:11:08,320 125, 126, a tak dále, v případě, jsem číslo mé bytů z 0 na nahoru, 182 00:11:08,320 --> 00:11:12,650 co opravdu GetString se vrací je doslova číslo 123. 183 00:11:12,650 --> 00:11:19,270 Takže to, co se dal v S je číslo 123, nikoli písmeno H, není slovo HELLO, 184 00:11:19,270 --> 00:11:23,130 prostě adresu, na které mohu najít první písmeno HELLO. 185 00:11:23,130 --> 00:11:26,500 Ale to nevypadá jako dost. Ptal jsem se vás na řetězec, nikoli charakter. 186 00:11:26,500 --> 00:11:32,970 Tak jak jsme nebo počítači, že Ello druh přijít spolu s H? 187 00:11:35,760 --> 00:11:37,460 Co je to druh smlouvy máme? Jo. 188 00:11:37,460 --> 00:11:40,100 [Student] Je pořád říká se najít nějaké další znaky. Přesně >>. 189 00:11:40,100 --> 00:11:44,570 >> Tam je to člověk-počítač konvence, kdy když se jednání s řetězci, 190 00:11:44,570 --> 00:11:49,410 jinak známý nyní jako char hvězd, se prostě musí přijít na to, 191 00:11:49,410 --> 00:11:54,350 kde na konci každé řetězce v životě je podle opravdu jen iterace přes to s pro smyčce, 192 00:11:54,350 --> 00:11:57,820 while, cokoliv, takže když vás konec řetězce 193 00:11:57,820 --> 00:12:02,160 Nyní si můžete odvodit z toho, oh, celé slovo bylo HELLO. 194 00:12:02,160 --> 00:12:04,820 Ti z vás, s předchozím programovacím zkušeností by mohl vědět v Javě 195 00:12:04,820 --> 00:12:09,880 stačí zavolat. délka a v jiných jazycích, můžete volat délku nebo podobný. 196 00:12:09,880 --> 00:12:14,060 To proto, že v mnoha jazycích, a to zejména co nazývá objektově orientované jazyky, 197 00:12:14,060 --> 00:12:18,580 délka něco je druh zapouzdřen uvnitř kusu samotná data, 198 00:12:18,580 --> 00:12:24,000 hodně jako my zapouzdřen ID a názvy a domy uvnitř studenta v pondělí. 199 00:12:24,000 --> 00:12:28,700 Ale C je mnohem nižší úrovni. Nejsou zde žádné objekty nebo třídy, pokud jste slyšeli tyto výrazy předtím. 200 00:12:28,700 --> 00:12:31,490 Jediné, co musíte opravdu paměťové adresy. 201 00:12:31,490 --> 00:12:35,540 Tak tohle je něco jako staromódní způsob zastupování zajímavé datové struktury. 202 00:12:35,540 --> 00:12:38,760 Ty mají počáteční hodnotu jako adresu prvního znaku 203 00:12:38,760 --> 00:12:42,340 a pak už jen některé svévolnými konvencemi, že všichni souhlasí s tím, následovat. 204 00:12:42,340 --> 00:12:46,420 Tak jak je délka řetězce realizován, to navrhujeme? 205 00:12:46,420 --> 00:12:51,360 Strlen, strlen, který někteří z vás již používá několikrát. Je to docela jednoduché, ne? 206 00:12:51,360 --> 00:12:53,060 Je to jako 2 řádky kódu. 207 00:12:53,060 --> 00:12:56,140 Je to docela hodně pro smyčka nějakého druhu, možná s další místní proměnné. 208 00:12:56,140 --> 00:13:00,540 Ale strlen prostě musí vzít ukazatel a pak začít hledat \ 0. 209 00:13:00,540 --> 00:13:05,190 >> A jakmile zjistí, může se vrátit celkový počet kroků, které je třeba v tomto řetězci. 210 00:13:05,190 --> 00:13:07,150 Takže můžeme z toho vyvodit, co se děje dál. 211 00:13:07,150 --> 00:13:11,850 Předpokládejme, že pak Prohlašuji t, jak jsem udělal v řádku 10. 212 00:13:11,850 --> 00:13:14,280 To je nějaký odpad hodnota. Kdo ví, na první? 213 00:13:14,280 --> 00:13:18,490 Ale na pravé straně řádku 10 Volám GetString znovu. 214 00:13:18,490 --> 00:13:20,050 Kdo ví, kde to skončí? 215 00:13:20,050 --> 00:13:23,830 Řekněme libovolně říci, že operační systém našel prostor pro to způsobem, tady. 216 00:13:23,830 --> 00:13:28,610 I stalo se, shodou okolností typ H-E-L-L-O znovu, 217 00:13:28,610 --> 00:13:31,260 a tak můžeme čerpat stejný druh obrazu. 218 00:13:31,260 --> 00:13:34,290 Ale fakt, že mám překreslit tento obrázek je úmyslné 219 00:13:34,290 --> 00:13:37,720 protože to je jiný HELLO než tenhle. 220 00:13:37,720 --> 00:13:43,920 Takže zde by mohlo být místo 456, to je 457, a tak dále. 221 00:13:43,920 --> 00:13:47,170 Takže to, co se dal, kde otazník kdysi? 222 00:13:47,170 --> 00:13:50,190 V tomto případě se 456. 223 00:13:50,190 --> 00:13:53,540 Jedeme tato čísla libovolně, protože opravdu po dnešek 224 00:13:53,540 --> 00:13:57,110 nebudeme se tolik starat o to, co adresa něco je. 225 00:13:57,110 --> 00:14:02,690 Vše, co je zajímá, jsou, že můžeme zjistit adresu nějakého kusu dat jako HELLO. 226 00:14:02,690 --> 00:14:07,100 >> Takže opravdu to, co většina lidí dělá v oblasti počítačové vědy, když mluví o paměťových adres 227 00:14:07,100 --> 00:14:10,210 a mluví o ukazatele konkrétně, 228 00:14:10,210 --> 00:14:14,220 spíše než obtěžovat přijít na to, 123 -, kdo se stará, kde tohle vlastně je, 229 00:14:14,220 --> 00:14:17,440 Víme jen, že je to v určitém číselném adrese - 230 00:14:17,440 --> 00:14:22,180 jsme zjednodušit svět a jen říct, ž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 šipka je docela úmyslné 233 00:14:27,430 --> 00:14:31,610 protože doslova nyní s ukazuje na H a T je ukazuje na druhou H 234 00:14:31,610 --> 00:14:34,720 protože na konci dne, nezáleží na tom, jaký je adresa, 235 00:14:34,720 --> 00:14:40,240 ale to záleží, že máme možnost vyjádřit tuto adresu s nějakým kusem kódu. 236 00:14:40,240 --> 00:14:42,730 My se opravdu manipulovat tyto adresy zatím 237 00:14:42,730 --> 00:14:47,770 takže uvidíme, kde se můžeme prohodit a nějak dělat věci s ukazateli, 238 00:14:47,770 --> 00:14:52,030 ale nyní v souladu 12 doslova jaké hodnoty jsme porovnání 239 00:14:52,030 --> 00:14:55,500 Podle tohoto příběhu v souladu 12? 240 00:14:56,570 --> 00:15:01,290 Říkáme je 123 equal equal až 456? A to rozhodně není případ. 241 00:15:01,290 --> 00:15:05,320 A to i koncepčně, tento ukazatel rozhodně není stejná jako to 242 00:15:05,320 --> 00:15:09,500 protože jsi volal GetString dvakrát, a GetString nesnaží se být super chytrý, 243 00:15:09,500 --> 00:15:12,470 nepokouší uvědomit, oh, jste zadali HELLO před 5 minutami; 244 00:15:12,470 --> 00:15:15,090 dovolte mi, abych vám stejnou ukazatel, jak jsem ti dal před, 245 00:15:15,090 --> 00:15:18,450 to jen alokuje nový kus paměti pokaždé, když říkáte. 246 00:15:18,450 --> 00:15:20,350 >> Tak jak jsme se tento problém vyřešit? 247 00:15:20,350 --> 00:15:24,270 Pokud vyšší úroveň chci porovnat řetězce HELLO HELLO a - 248 00:15:24,270 --> 00:15:28,680 Nezajímá o ukazatele - jak mohu jít o odpověď na otázku, 249 00:15:28,680 --> 00:15:31,980 se uživatel zadat stejnou věc? Co je třeba tady? Jo. 250 00:15:31,980 --> 00:15:35,200 [Student] Použijte funkci. >> Mohu použít funkci po vybalení z krabice. 251 00:15:35,200 --> 00:15:38,170 Mohu použít funkci nazvanou strcmp, s-t-r-c-m-p, 252 00:15:38,170 --> 00:15:41,190 jen zkrácená verze říká string porovnání. 253 00:15:41,190 --> 00:15:45,070 A pokud půjdeme do, například, porovnat 2, který je mezi dnešní podkladů, 254 00:15:45,070 --> 00:15:46,690 Já přesně to. 255 00:15:46,690 --> 00:15:51,750 Pořád jsem všechno ostatní stejné z linky 1 na až 26 nebo tak, 256 00:15:51,750 --> 00:15:54,360 a teď si toho všimnout část změnilo jen trochu. 257 00:15:54,360 --> 00:15:57,690 Pojďme ignorovat linku 28 na chvíli a soustředit se pouze na tento jeden. 258 00:15:57,690 --> 00:16:00,410 Co řekneme pondělí, že str compare dělá? 259 00:16:00,410 --> 00:16:05,200 Provádí proces brát 2 ukazatele, S a T je v tomto případě, 260 00:16:05,200 --> 00:16:08,480 druh prakticky tím, že své prst na těchto 2 dopisy, 261 00:16:08,480 --> 00:16:11,530 a co musí udělat, je něco jako while nebo pro smyčce, 262 00:16:11,530 --> 00:16:16,050 a to říká, že jsou to stejné? Pokud ano, pohybuje prsty nebo ukazatele vpřed. 263 00:16:16,050 --> 00:16:17,970 Jsou to samé, to samé, to samé, 264 00:16:17,970 --> 00:16:22,710 tyto stejné, to samé? A ooh, jsem na konci řetězce na obou S a T. 265 00:16:22,710 --> 00:16:26,780 Nenašel jsem žádné rozpory. Ano, tyto řetězce jsou stejné. 266 00:16:26,780 --> 00:16:31,940 A co str tyto přiznání, pokud je 2 řetězce jsou stejné, zřejmě? Zero. 267 00:16:31,940 --> 00:16:35,900 Takže 0 je dobré v tomto případě, protože pokud se vrátí -1 nebo 1, 268 00:16:35,900 --> 00:16:40,560 to znamená, že je jen stane dřív, než t abecedně nebo po t. 269 00:16:40,560 --> 00:16:43,760 A proč by to mělo být užitečné mít funkci, která vám řekne, které řetězec přijde před 270 00:16:43,760 --> 00:16:46,720 nebo po ve slovníku? 271 00:16:46,720 --> 00:16:48,740 [Student] Hledám. >> Vyhledávání a třídění. 272 00:16:48,740 --> 00:16:51,730 >> Takže si můžete dělat věci, jako binární vyhledávání nebo bublina seřadit nebo sloučit druh 273 00:16:51,730 --> 00:16:53,230 kde budete muset porovnávat věci. 274 00:16:53,230 --> 00:16:56,420 Tak daleko jsme druh snížit některé rohy a jen mluvil o třídění 275 00:16:56,420 --> 00:16:59,430 v souvislosti s čísly, protože je to pěkné a snadné hovořit o, 276 00:16:59,430 --> 00:17:02,430 ale můžete samozřejmě tyto struny, jablko a banán, 277 00:17:02,430 --> 00:17:05,349 protože pokud jablko je známo, že přijde do banánu, podobně, 278 00:17:05,349 --> 00:17:09,319 se můžete pohybovat řetězce kolem paměti, stejně jako Rob dělal s řadit slučovací ve videu 279 00:17:09,319 --> 00:17:15,880 a my jsme tady na jevišti s výběrem druhu, vložení seřadit, a bublina seřadit. 280 00:17:15,880 --> 00:17:18,710 Takže tam, kde ještě můžeme vzít? Zkusme to. 281 00:17:18,710 --> 00:17:23,980 Pojďme trochu zapomenout, že lekci na chvíli a zkuste teď a zkopírujte 1.c provést následující kroky. 282 00:17:23,980 --> 00:17:26,800 V řádku 21 Říkám tisku něco, 283 00:17:26,800 --> 00:17:28,520 pak jsem dostat řetězec od uživatele, 284 00:17:28,520 --> 00:17:30,690 pak jsem kontrolu to. 285 00:17:30,690 --> 00:17:33,620 Jsme se opravdu dostali do tohoto zvyku ještě ne, ale pojďme se teď to. 286 00:17:33,620 --> 00:17:40,990 Pojďme skutečně Sloupněte této vrstvy. To je opravdu char *. Ten chlap je opravdu char *. 287 00:17:40,990 --> 00:17:45,690 Takže co to znamená být kontrola, zda s == NULL? 288 00:17:45,690 --> 00:17:48,380 Ukazuje se, že při volání funkce, jako je GetString 289 00:17:48,380 --> 00:17:51,540 nebo obecněji zeptejte počítače, aby vám nějaké paměti, 290 00:17:51,540 --> 00:17:53,030 něco mohlo pokazit. 291 00:17:53,030 --> 00:17:56,630 Ty by mohly být blázen a požádat počítač pro terabajt paměti 292 00:17:56,630 --> 00:18:01,780 tím, že žádá o biliony bajtů paměti, které prostě neexistují v počítači, 293 00:18:01,780 --> 00:18:05,130 ale GetString a další funkce potřebovat nějaký způsob, jak křičí na vás 294 00:18:05,130 --> 00:18:06,820 Pokud jste požádáni o příliš mnoho. 295 00:18:06,820 --> 00:18:10,450 A jak GetString dělá je, pokud jste požádali o více paměti 296 00:18:10,450 --> 00:18:14,250 než je k dispozici v počítači, a to i v případě, že je to super, super nízkou pravděpodobnost 297 00:18:14,250 --> 00:18:17,730 protože nikdo z nás se bude psát bilionu znaky a stiskněte Enter, 298 00:18:17,730 --> 00:18:21,980 ale málo pravděpodobné, i když to může být, stále chci zkontrolovat to jen v případě, 299 00:18:21,980 --> 00:18:26,120 a speciální hodnota, která GetString, odpověď, a další funkce vrací 300 00:18:26,120 --> 00:18:30,630 pokud něco špatně, je NULL ve všech velkých písmenech. 301 00:18:30,630 --> 00:18:36,520 >> A co je NULL? NULL jen tak náhodou představují ukazatel. Je to adresa paměti 0. 302 00:18:36,520 --> 00:18:40,800 Svět se rozhodl, že svévolně, je-li to mé paměti počítače - víte, co? - 303 00:18:40,800 --> 00:18:46,260 budeme krást jen 1 bajt každého paměti počítače, a to je místo 0. 304 00:18:46,260 --> 00:18:49,560 Budeme jej přezdívku NULL, a budeme slibovat 305 00:18:49,560 --> 00:18:52,660 , že nikdy skutečně dát skutečné údaje jsou k dispozici 306 00:18:52,660 --> 00:18:56,770 protože jsme právě libovolně potřebujeme zvláštní hodnotu, 0, NULL, aka 307 00:18:56,770 --> 00:19:00,230 takže můžeme křičet na uživatele, pokud se něco pokazí. 308 00:19:00,230 --> 00:19:03,590 Jinak možná nevíte to 0 znamená dát něco, co zde 309 00:19:03,590 --> 00:19:05,490 nebo to znamená něco pokazilo? 310 00:19:05,490 --> 00:19:09,190 Musíme se všichni shodneme, že NULL znamená, nic se vrátil, 311 00:19:09,190 --> 00:19:11,700 žádná skutečná adresa byla vrácena. 312 00:19:11,700 --> 00:19:15,210 Teď, tady jsem jen přijímá svou lidskou konvenci I return 1 z hlavní 313 00:19:15,210 --> 00:19:17,040 když se něco pokazí. 314 00:19:17,040 --> 00:19:20,650 To proto, že hlavní je návrat konvence je nutné vrátit hodnotu 0, pokud dobře, 315 00:19:20,650 --> 00:19:22,990 1 nebo jiné hodnoty, pokud špatně. 316 00:19:22,990 --> 00:19:28,200 Ale GetString a nějaká funkce, která se zabývá v paměti vrací null, pokud se něco pokazí. 317 00:19:28,200 --> 00:19:33,480 >> Dobře. Takže bohužel, linka 27, super jednoduchý i když je zcela nedokáže zkopírovat řetězec. 318 00:19:33,480 --> 00:19:35,740 Proč? Je vidět, to následujícím způsobem. 319 00:19:35,740 --> 00:19:40,120 Já jsem tvrdil v souladu 27 bude dělat kopie s a nazývat to t. 320 00:19:40,120 --> 00:19:45,790 Tak jsem se neptám na uživatele pro 2 řetězce tentokrát, jen říkám, hodnoty v s 321 00:19:45,790 --> 00:19:47,870 by měl být kladen na t i. 322 00:19:47,870 --> 00:19:52,890 Teď už jen stačí prokázat, jak je to zlomený, v souladu 29 vpřed co to dělám? 323 00:19:52,890 --> 00:19:56,980 První jsem kontrolu, když délka t je větší než 0. 324 00:19:56,980 --> 00:19:59,330 Tam je nějaký řetězec tam. Uživatel napsal něco dovnitř 325 00:19:59,330 --> 00:20:03,410 Co je linka 32 dělá, zřejmě? 326 00:20:03,410 --> 00:20:08,910 [Neslyšitelné Student odpověď] >> Právo. Můžete trochu odvodit z toho, co jsem řekl, že to dělá. 327 00:20:08,910 --> 00:20:13,200 Ale technicky, co je to děláš? t [0] představuje, co? 328 00:20:13,200 --> 00:20:15,140 [Student] znak 0.. >> [Malan] znak 0.. 329 00:20:15,140 --> 00:20:19,620 Nebo, více člověka-jako, první znak v t, bez ohledu na to je, H možná v tomto případě. 330 00:20:19,620 --> 00:20:24,990 A toupper dělá to, co říká. Těží nultého charakter tun a změní jej. 331 00:20:24,990 --> 00:20:28,430 Takže to znamená, vzít 0. charakter t, aby to velká, 332 00:20:28,430 --> 00:20:30,320 a vložte jej zpět do stejné místo. 333 00:20:30,320 --> 00:20:35,540 Takže pokud jsem typ ahoj malými písmeny, mělo by to změnit malá písmena h na základním kapitálu, H. 334 00:20:35,540 --> 00:20:41,400 Ale problém je, že v řadách 35 a 36, ​​co se chystám udělat, je vytisknout pro nás S a T. 335 00:20:41,400 --> 00:20:43,120 A jaký je váš tušení? 336 00:20:43,120 --> 00:20:47,250 Co mám vlastně jít, jestli jsem psát v ahoj ve všech malými písmeny? 337 00:20:47,250 --> 00:20:52,280 Co se to děje, aby si vytisknout? >> [Neslyšitelné Student odpověď] >> Co je to? 338 00:20:52,280 --> 00:20:58,360 [Student] Big H a zbytek malé. >> Velký H a zbytek malý, pro které je nebo t? 339 00:20:58,360 --> 00:21:03,170 [Student] Obojí. Obě >>. Přesně tak. Tak se podívejme, co se tady děje. 340 00:21:03,170 --> 00:21:08,380 >> Nech mě jít napřed a sestavit to. To je Copy1, takže se COPY1. Dobrá. 341 00:21:08,380 --> 00:21:14,840 Zoom Nech mě jít napřed a spustit COPY1, Enter, řekni něco: ahoj malými písmeny. 342 00:21:14,840 --> 00:21:19,570 To vydělával kopii, ale to zřejmě vydělával původní a, 343 00:21:19,570 --> 00:21:22,070 protože to, co se děje nyní v tomto příběhu? 344 00:21:22,070 --> 00:21:27,030 V souladu 27 Nemám vlastně Zdá se, že kopírování řetězec, 345 00:21:27,030 --> 00:21:30,450 ale i když jste možná intuitivně doufal, že tomu tak bylo, 346 00:21:30,450 --> 00:21:33,680 pokud si myslíte o této obrázku, co se opravdu jsem to udělal? 347 00:21:33,680 --> 00:21:35,410 Polovina obrázku je stejná. 348 00:21:35,410 --> 00:21:39,390 Takže pojďme se vrátit v čase tak, aby t dosud neexistuje v příběhu. 349 00:21:39,390 --> 00:21:43,160 S může existovat v příběhu, ale pojďme malá ahoj tentokrát. 350 00:21:43,160 --> 00:21:46,710 Tak ať mi opravit to, co jsem vlastně napsal palců 351 00:21:46,710 --> 00:21:51,280 V tomto případě zde máme h-e-l-l-o. 352 00:21:51,280 --> 00:21:58,050 Budeme nakreslit jako sekvence znaků, dal jsem oddělovačů tady a mé \ 0. 353 00:21:58,050 --> 00:22:05,980 Takže tohle je místo, kde jsme, jakmile řádek 1 až 24-ish, dávat nebo brát, byly provedeny. 354 00:22:05,980 --> 00:22:07,800 To je obraz mé paměti. 355 00:22:07,800 --> 00:22:10,800 Když jsem se dostat do souladu 27, co se stane? 356 00:22:10,800 --> 00:22:14,730 Stejně jako předtím, než jsem se ukazatel, který budu čerpat jako je náměstí. 357 00:22:14,730 --> 00:22:19,740 Říká se t. A co je jeho hodnota ve výchozím nastavení? Kdo ví? Některé odpadky hodnota. 358 00:22:19,740 --> 00:22:22,060 >> Takže budu abstraktní, že venku jako otazník. 359 00:22:22,060 --> 00:22:27,670 A jakmile pravá strana linky 27 provede, co mám dávat uvnitř t? 360 00:22:27,670 --> 00:22:30,770 Stejný věc, která je v §. 361 00:22:30,770 --> 00:22:34,120 Takže když jsme se na chvíli odstranit tuto abstrakci šipky a říkáme, 362 00:22:34,120 --> 00:22:40,330 oh, to je zatížení paměti adresa 123, když říkáš t dostane s, středník, 363 00:22:40,330 --> 00:22:42,700 jste doslova uvedení 123 zde. 364 00:22:42,700 --> 00:22:45,200 Nyní, když jsme trochu zjednodušit náš svět znovu s obrázky, 365 00:22:45,200 --> 00:22:48,750 co jste opravdu udělal, je právě přidána další šíp do svého světa 366 00:22:48,750 --> 00:22:52,910 , který je polohovací t na stejném přesném řetězci. 367 00:22:52,910 --> 00:22:59,730 Takže když v souladu 31 a 32 jsem vlastně jít o změnu t [0], 368 00:22:59,730 --> 00:23:05,580 to, co je t [0] zřejmě synonymem teď? s [0] 369 00:23:05,580 --> 00:23:07,030 Takže to je všechno, co se děje. 370 00:23:07,030 --> 00:23:09,900 A i když tento druh cítí trochu nízká úroveň a tajemný 371 00:23:09,900 --> 00:23:12,760 a tento druh se cítí jako snad intuitivně by to mělo být jen pracoval - 372 00:23:12,760 --> 00:23:15,410 Já jsem udělal kopie věcí před a to jen fungovalo - 373 00:23:15,410 --> 00:23:18,590 pokud si skutečně myslí o tom, co řetězec skutečně je, je to char *. 374 00:23:18,590 --> 00:23:21,700 No, co to je? Je to adresa nějakého charakteru. 375 00:23:21,700 --> 00:23:24,930 Pak je možná větší smysl, že když se pokusíte udělat něco 376 00:23:24,930 --> 00:23:29,220 Super zdánlivě jednoduchého, jako to, všechno, co děláte, je kopírování adresa paměti. 377 00:23:29,220 --> 00:23:32,530 Ty ve skutečnosti dělat nic s řetězci sám. 378 00:23:32,530 --> 00:23:37,500 Takže, i když nemáte tušení, jak byste tento problém vyřešit v kódu, 379 00:23:37,500 --> 00:23:45,080 na vysoké úrovni, koncepčně, co musíme udělat, aby ta opis s, zřejmě? 380 00:23:46,670 --> 00:23:48,820 Jo. >> [Student] Dej mu nové umístění? Přesně >>. 381 00:23:48,820 --> 00:23:50,800 >> Musíme dát t zbrusu nové umístění. 382 00:23:50,800 --> 00:23:55,230 Musíme se nějak vytvořit svět, v němž se dostaneme nový kus paměti, 383 00:23:55,230 --> 00:24:00,090 které právě z důvodů přehlednosti budu čerpat hned pod tímto jeden, ale to nemusí být. 384 00:24:00,090 --> 00:24:04,880 Ale to musí být stejné velikosti, takže budu čerpat tyto svislé čáry ve stejném místě. 385 00:24:04,880 --> 00:24:09,720 Je to v pořádku, pokud je to všechno smetí zpočátku. Kdo ví, co tam byl? 386 00:24:09,720 --> 00:24:13,850 Ale krok 1 bude muset být dát mi tolik paměti, jak jsem třeba 387 00:24:13,850 --> 00:24:18,630 aby se vešly kopii ahoj, pak zjistit, jak kopírovat h tady, na e zde, 388 00:24:18,630 --> 00:24:20,390 l zde a tak dále. 389 00:24:20,390 --> 00:24:24,880 Ale to už by se neměl cítit trochu zřejmé, i když některé detaily jsou stále abstraktní. 390 00:24:24,880 --> 00:24:28,690 Chcete-li zkopírovat tento řetězec do toho, je to jen pro smyčce nebo smyčky while 391 00:24:28,690 --> 00:24:31,580 nebo něco, s nimiž jste se ještě seznámit. 392 00:24:31,580 --> 00:24:35,970 Tak pojďme to zkusit. Nech mě jít do copy2.c. 393 00:24:35,970 --> 00:24:43,270 V copy2.c máme téměř stejný program, s výjimkou linky 27. 394 00:24:43,270 --> 00:24:47,260 Vypadá to trochu složitější, ale pokud se to všechno pokazí kousek po kousku, 395 00:24:47,260 --> 00:24:48,950 levá strana je stejná. 396 00:24:48,950 --> 00:24:52,790 Char * t vytváří tuto věc v paměti, i když s otazníkem 397 00:24:52,790 --> 00:24:54,680 protože nemáme ponětí, co je tam ve výchozím nastavení. 398 00:24:54,680 --> 00:24:57,920 Na pravé straně jsme nyní představujeme novou funkci, malloc, 399 00:24:57,920 --> 00:25:00,640 pro paměť alokovat, dej mi paměť, 400 00:25:00,640 --> 00:25:06,900 a to zřejmě trvá, kolik argumentů, kolik věcí uvnitř závorek? 401 00:25:09,660 --> 00:25:12,130 Slyšel jsem reptání 1 a 2, ale to je jen 1. 402 00:25:12,130 --> 00:25:15,320 Není čárka, což znamená, že je jen 1 věc v závorkách. 403 00:25:15,320 --> 00:25:17,720 I když je tu další závorky, dovolte mi, abych zmínil 404 00:25:17,720 --> 00:25:21,460 to, co je uvnitř nejvzdálenějších závorek, 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 pokud jsme vlastně si to promyslet, je to říká mi délku s. 407 00:25:29,190 --> 00:25:34,440 Proč jsem, i když s tím, 1 na délku? >> [Neslyšitelné Student odpověď] 408 00:25:34,440 --> 00:25:40,200 Přesně tak. Potřebujeme prostor pro toho chlapa na ocasu, šestý znak, který má žádný anglický význam 409 00:25:40,200 --> 00:25:42,250 ale mají speciální programový význam. 410 00:25:42,250 --> 00:25:46,800 >> Takže potřebujeme + 1 za to, protože strlen vrací lidské očekávání délky, 411 00:25:46,800 --> 00:25:50,890 ahoj nebo 5, to vám nedává dodatečné nulový znak. 412 00:25:50,890 --> 00:25:52,980 Tak jsem ručně přidat to s + 1. 413 00:25:52,980 --> 00:25:56,060 A pak, (char) * velikost, jsme neviděli dřív. 414 00:25:56,060 --> 00:25:57,480 To není technicky funkce. 415 00:25:57,480 --> 00:26:04,150 Je to zvláštní klíčové slovo, které právě vám řekne, co je velikost některých datového typu na počítači 416 00:26:04,150 --> 00:26:06,980 protože ve skutečnosti, někteří 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žívá pouze 32 bitů k reprezentaci ukazatele. 418 00:26:10,900 --> 00:26:13,900 A tak když jsem dělal velikost datový typ, mohlo by to být 32 bitů. 419 00:26:13,900 --> 00:26:18,300 Ale když jsem pomocí mého nového ozdobný počítač, mohl bych získat zpět hodnotu 64 bitů 420 00:26:18,300 --> 00:26:20,510 něco jako adresu. 421 00:26:20,510 --> 00:26:25,400 Takže v tomto případě, jen být super bezpečné, nebudeme na pevný kódu něco jako - 422 00:26:25,400 --> 00:26:28,740 dobře, co je velikost char podle toho, co jsme řekli tak daleko? 423 00:26:28,740 --> 00:26:34,450 Jsme skoro řekl, slovně, že je to 1 byte, a to je docela hodně platí plošně. 424 00:26:34,450 --> 00:26:37,000 Ale znovu, předpoklady bývají špatné. 425 00:26:37,000 --> 00:26:40,850 Vedou k buggy software, pokud lidé používají software způsobem jste neměli v úmyslu. 426 00:26:40,850 --> 00:26:44,750 Takže pojďme abstraktní toto pryč a jen více druhově říct 427 00:26:44,750 --> 00:26:46,830 Potřebuji tolik kousků paměti 428 00:26:46,830 --> 00:26:50,210 a každý blok paměti by měly být stejné velikosti a charakteru, 429 00:26:50,210 --> 00:26:54,870 která je ve skutečnosti rovná 1 v tomto případě, ale je to obecnější způsob psaní. 430 00:26:54,870 --> 00:27:00,460 Takže, pokud je slovo ahoj, kolik bytů se malloc zřejmě přidělit ahoj? 431 00:27:00,460 --> 00:27:04,980 [Student] Six. Šest >>. Přesně tolik, kolik máme otazníky na obrazovce. 432 00:27:04,980 --> 00:27:07,800 A pak se hádat nyní založen na pochopení GetString 433 00:27:07,800 --> 00:27:12,790 co malloc pravděpodobně vrátí? >> [Student] adresa. 434 00:27:12,790 --> 00:27:17,020 Adresa čeho? První kus paměti. 435 00:27:17,020 --> 00:27:20,670 >> Nemáme ponětí, co tam je, protože některé další funkce 436 00:27:20,670 --> 00:27:23,010 by byly pomocí této paměti již dříve. 437 00:27:23,010 --> 00:27:28,380 Ale malloc, stejně jako GetString, vrátí adresu prvního bajtu paměti 438 00:27:28,380 --> 00:27:30,540 že vyčlení pro vás. 439 00:27:30,540 --> 00:27:38,380 Avšak to, co se nedělá, je vyplnit tento prázdné s charakterem zpětného lomítka null 440 00:27:38,380 --> 00:27:43,030 protože se ukázalo, můžete použít malloc alokovat nic: Ints, struny, pole, 441 00:27:43,030 --> 00:27:45,700 plováky, studentské struktury. 442 00:27:45,700 --> 00:27:47,750 Můžete použít malloc zcela obecně. 443 00:27:47,750 --> 00:27:51,470 Nezajímá nebo vědět, co jste přidělování paměti pro. 444 00:27:51,470 --> 00:27:55,810 Tak to by bylo troufalé pro malloc dát \ 0 445 00:27:55,810 --> 00:27:58,340 na konci každého kusu paměti, že to ti dává 446 00:27:58,340 --> 00:28:02,620 protože to \ 0 věc je jen konvence pro řetězce. 447 00:28:02,620 --> 00:28:06,310 To není použita pro ints, to není použit pro plováky, to není používán pro studenty. 448 00:28:06,310 --> 00:28:11,730 A tak mám tě s malloc je, že zátěž je zcela na vás programátor 449 00:28:11,730 --> 00:28:16,790 pamatovat, kolik bytů si přiděleno, a ne vždy používat pro smyčce 450 00:28:16,790 --> 00:28:21,570 nebo while a jít kolem hranice bloku paměti, že jste byl dán. 451 00:28:21,570 --> 00:28:23,540 Jinak řečeno, jakmile alokovat paměť, 452 00:28:23,540 --> 00:28:28,510 můžete se zeptat operační systém, oh, mimochodem, jak velký o kus paměti to bylo? 453 00:28:28,510 --> 00:28:32,080 Je to zcela na vás pamatovat, pokud budete potřebovat tuto hodnotu. 454 00:28:32,080 --> 00:28:34,330 >> Tak se podívejme, jak mám postupovat použít tuto paměť. 455 00:28:34,330 --> 00:28:38,430 V souladu 28 a 29, proč to dělám? 456 00:28:39,850 --> 00:28:42,260 Jen celkem zdravý rozum kontrola. 457 00:28:42,260 --> 00:28:45,110 Jen v případě, že se něco pokazilo, žádám o nějaké šílené množství paměti 458 00:28:45,110 --> 00:28:48,690 nebo jsem tolik věcí, na počítači, že tam prostě není dostatek paměti, 459 00:28:48,690 --> 00:28:51,780 něco takového, aspoň chci zkontrolovat null. 460 00:28:51,780 --> 00:28:55,260 Ve skutečnosti, většina počítačů vám iluzi, že každý program 461 00:28:55,260 --> 00:28:57,080 mohou používat celistvost paměti RAM, 462 00:28:57,080 --> 00:29:00,740 ale i tak, pokud uživatel zadá do nějaké šílené dlouhé šňůře Možná proto, že jsi špatný člověk 463 00:29:00,740 --> 00:29:03,440 a oni jsou vlastně snaží shodit váš program nebo hack do něj, 464 00:29:03,440 --> 00:29:07,300 Chcete-li alespoň zkontrolovat návratovou hodnotu malloc a zda se rovná null. 465 00:29:07,300 --> 00:29:11,630 A pokud ano, ať to prostě skončit právě teď, protože já nevím, co dělat v této věci. 466 00:29:11,630 --> 00:29:13,950 Jak mohu zkopírovat řetězec? Tam je několik způsobů, jak to udělat. 467 00:29:13,950 --> 00:29:18,850 Existují str kopírovat funkce v C, ale je to super jednoduché pro nás udělat staromódním způsobem. 468 00:29:18,850 --> 00:29:23,110 >> Nejprve mi dovolte přijít na to, jaká je délka s je. 469 00:29:23,110 --> 00:29:26,930 Mohl jsem dát do smyčky, ale místo toho jsem jen dát to sem pro přehlednost. 470 00:29:26,930 --> 00:29:30,610 Tak n nyní ukládá délku původního řetězce, který je zřejmě 5. 471 00:29:30,610 --> 00:29:35,290 Pak v mém pro smyčce jsem upravujeme od 0 až na n, 472 00:29:35,290 --> 00:29:40,940 a při každém opakování dávám s [i] uvnitř t [i]. 473 00:29:40,940 --> 00:29:45,060 Takže to je to, co jsem naznačil s mými 2 prsty ukazující na struny před. 474 00:29:45,060 --> 00:29:49,260 Vzhledem k tomu, pro smyčce opakuje takhle, budu se kopírování h do tady, 475 00:29:49,260 --> 00:29:52,890 e do zde, l do zde, protože to je s, to je t. 476 00:29:52,890 --> 00:29:58,770 A pak konečně, v souladu 35, proč to dělám? 477 00:29:58,770 --> 00:30:03,770 Musím se ujistit, že jsem konec řetězce t. 478 00:30:03,770 --> 00:30:06,170 A já jsem to takhle bude super explicitní. 479 00:30:06,170 --> 00:30:09,510 Ale navrhnout někoho, kdybys mohl, jiný způsob, jak to udělat. 480 00:30:09,510 --> 00:30:13,930 Nemám opravdu potřebují linku 35. Je tu jiný způsob, jak to udělat. 481 00:30:13,930 --> 00:30:18,880 Jo. >> [Neslyšitelné Student odpověď] >> Řekni to nahlas. 482 00:30:18,880 --> 00:30:20,960 [Student] Menší než nebo rovno. Přesně >>. 483 00:30:20,960 --> 00:30:24,450 Mohli bychom říci menší než nebo roven n, která byla obecně špatné 484 00:30:24,450 --> 00:30:28,190 protože téměř vždy, když jdeme do stejné s tím, co jsme počítání 485 00:30:28,190 --> 00:30:30,000 Půjdeme 1 krok příliš daleko. 486 00:30:30,000 --> 00:30:32,170 Ale pamatujte, kolik bytů jsme přidělovat? 487 00:30:32,170 --> 00:30:37,210 Máme přiděleno strlen S, takže 5 + 1 o celkové 6. 488 00:30:37,210 --> 00:30:39,980 Takže v tomto případě bychom mohli udělat něco takového 489 00:30:39,980 --> 00:30:46,450 tak, že kopírujete nejen ahoj, ale také \ 0 na samém konci. 490 00:30:46,450 --> 00:30:49,860 Případně, mohli bychom použít funkci nazvanou str kopírování, strcpy, 491 00:30:49,860 --> 00:30:51,700 ale to by nebyl ani zdaleka tak zábavné. 492 00:30:51,700 --> 00:30:54,000 Ale to je vše, co dělá pod kapotou. 493 00:30:54,000 --> 00:30:56,050 Pak konečně, uděláme to samé jako předtím. 494 00:30:56,050 --> 00:31:01,620 I vydělávat t a pak jsem tvrdit, že původní vypadá takhle a kopie vypadá, že. 495 00:31:01,620 --> 00:31:08,570 Tak zkusme to teď. Nech mě jít sem. Udělejte kopie copy2. Budeme přiblížit a spustit kopie copy2. 496 00:31:08,570 --> 00:31:13,840 Budu psát ahoj malými písmeny, a opravdu jsem si malá ahoj jako originál 497 00:31:13,840 --> 00:31:16,930 ale kapitál Hello pro kopii. 498 00:31:16,930 --> 00:31:20,300 Ale já jsem neudělal zatím. Musím udělat 1 poslední věc zde. 499 00:31:20,300 --> 00:31:28,000 46 a 47 je jasně uvolnění paměti, ale co to vlastně znamená? 500 00:31:28,000 --> 00:31:33,250 Co mám dělat, myslíte tím, že volajícího 46 a řádek 47? 501 00:31:33,250 --> 00:31:38,900 Jaký vliv to má mít? Jo. 502 00:31:38,900 --> 00:31:43,140 [Neslyšitelné Student odpověď] >> Přesně tak. 503 00:31:43,140 --> 00:31:46,380 >> Jste jen říkám operační systém, hej, díky za této paměti. 504 00:31:46,380 --> 00:31:48,320 Nyní můžete použít pro někoho jiného. 505 00:31:48,320 --> 00:31:50,790 A tady je dokonalým příkladem nesmyslné hodnoty. 506 00:31:50,790 --> 00:31:55,430 Právě jsem použil tento paměti zapsat slovo ahoj v 2 místech, 507 00:31:55,430 --> 00:31:57,490 zde, zde, zde, a zde. 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 pak jsem zavolat linku 46 a řádek 47, a víte, co se tam děje, pokud jde o obrázku? 510 00:32:06,960 --> 00:32:10,010 Vlastně, počkejte, tento obrázek je starý. 511 00:32:10,010 --> 00:32:12,550 Jakmile uděláme kopii, ten chlap je vlastně ukazuje zde, 512 00:32:12,550 --> 00:32:16,110 takže se pojďme odstranit čísla a jen abstraktní pryč jako naše šípy znovu. 513 00:32:16,110 --> 00:32:19,370 Co se stane v tomto filmu, když jsem volat zdarma? 514 00:32:19,370 --> 00:32:22,750 [Neslyšitelné Student odpověď] >> Ani. 515 00:32:22,750 --> 00:32:29,510 Pokud bych volat zdarma na S a T - trochu chyták - tento obrázek se nemění vůbec 516 00:32:29,510 --> 00:32:33,880 protože volá sa volá t jen říká operační systém, 517 00:32:33,880 --> 00:32:39,010 hej, můžete použít tuto paměť znovu, ale to nic nezmění na null 518 00:32:39,010 --> 00:32:41,840 nebo některé speciální znak, že tím nic nezmění, 519 00:32:41,840 --> 00:32:47,350 to nemění h nebo e nebo l nebo l nebo O v obou místa na cokoliv jiného. 520 00:32:47,350 --> 00:32:51,610 Pokud jde o obraz, jakmile Volejte zdarma, nic změn. 521 00:32:51,610 --> 00:32:56,570 A v tom spočívá původ odpadky hodnot, protože když jsem pak později v tomto programu 522 00:32:56,570 --> 00:33:01,010 požádat operační systém pro více paměti s GetString nebo malloc nebo něco takového 523 00:33:01,010 --> 00:33:04,900 a operační systém říká, jistě, já mám 12 bajtů paměti právě uvolněných, 524 00:33:04,900 --> 00:33:08,080 použití těchto, co budete k předání? 525 00:33:08,080 --> 00:33:10,830 Ty bude podal kus paměti, že bychom obvykle remíza 526 00:33:10,830 --> 00:33:13,700 s otazníky, ale co jsou ty otazníky? 527 00:33:13,700 --> 00:33:17,000 Dochází k nim být h-e-l-l-o, h-e-l-l-o. 528 00:33:17,000 --> 00:33:20,940 Toto jsou naše nové popelářské hodnoty, jakmile uvolnit tuto paměť. 529 00:33:20,940 --> 00:33:22,750 >> Je tu skutečný svět důsledky i zde. 530 00:33:22,750 --> 00:33:24,720 To se stává co do činění s RAM, ale vaše počítače 531 00:33:24,720 --> 00:33:26,720 vlastně to samé s diskem. 532 00:33:26,720 --> 00:33:30,620 Promluvíme si o tom zejména s budoucím problémem soubor, který se zaměřuje na forenzní. 533 00:33:30,620 --> 00:33:36,170 Ale co se skutečně děje, pokud máte nějaké citlivé finanční soubor na ploše 534 00:33:36,170 --> 00:33:39,600 nebo některé útržkovité JPEG a přetáhněte ji do koše, 535 00:33:39,600 --> 00:33:44,390 co se stane, když jej přetáhnout do koše nebo koše? 536 00:33:44,390 --> 00:33:47,240 Věděl jsi, co jsem mluvil. [Smích] 537 00:33:47,240 --> 00:33:52,370 Co se stane, když jste přetažení, že důkazy do vašeho koše nebo popelnice? 538 00:33:52,370 --> 00:33:55,920 [Neslyšitelné Student odpověď] 539 00:33:55,920 --> 00:33:58,000 No, tak pozor. Co se stane, když budeš dělat, že? 540 00:33:58,000 --> 00:34:01,030 Stručná odpověď je nic, ne? 541 00:34:01,030 --> 00:34:04,790 Sketchy nebo citlivé soubor je stále jen sedí někde na pevném disku. 542 00:34:04,790 --> 00:34:07,940 Většina z nás alespoň se těžce poučili, že potřebujete vyprázdnit koš 543 00:34:07,940 --> 00:34:10,429 nebo váš koš skutečně odstranit soubory. 544 00:34:10,429 --> 00:34:13,440 A skutečně, když kliknete pravým tlačítkem myši, nebo regulace kliknutím na vašem koši 545 00:34:13,440 --> 00:34:15,580 nebo zvolte Soubor, Empty Trash nebo cokoliv 546 00:34:15,580 --> 00:34:21,420 a vyprázdnit koš nebo koš, co se skutečně děje a pak na tomto obrázku? 547 00:34:22,810 --> 00:34:25,969 Víc nic. Takže nic se skutečně děje na disku. 548 00:34:25,969 --> 00:34:30,880 >> A pokud jsme jen dočasně odbočit a napsat - budu stačí použít zadní straně tohoto. 549 00:34:30,880 --> 00:34:34,639 Takže teď příběh se mění z paměti RAM, což je místo, kde programy existují 550 00:34:34,639 --> 00:34:39,250 zatímco vedete je, na disk, což je místo, kde jsou uloženy dlouhodobě 551 00:34:39,250 --> 00:34:42,920 i když vypadne proud, prozatím - a vrátíme se v budoucnosti - 552 00:34:42,920 --> 00:34:46,380 pojďme předstírat, že to představuje pevného disku uvnitř vašeho počítače 553 00:34:46,380 --> 00:34:50,110 protože zpět v den, kdy bývaly kruhové disky, podobně jako diskety. 554 00:34:50,110 --> 00:34:55,130 Takže pokud máte nějaké citlivé soubor Excel, může trvat až tento kus paměti 555 00:34:55,130 --> 00:34:59,770 na počítači disk, a já jsem jen kreslení stejný libovolný 1s a 0s. 556 00:34:59,770 --> 00:35:03,970 Při přetažení souboru takhle do koše nebo koše, 557 00:35:03,970 --> 00:35:07,750 doslova se nic nestane, protože Apple a Microsoft se rozhodl 558 00:35:07,750 --> 00:35:10,450 koše a koš je opravdu jen dočasný zástupný. 559 00:35:10,450 --> 00:35:14,710 Možná nakonec OS vyprázdní ji pro vás, ale obvykle to není nic, 560 00:35:14,710 --> 00:35:17,090 alespoň dokud jsi opravdu málo místa. 561 00:35:17,090 --> 00:35:20,870 >> Nicméně, když jdete do prázdné koše nebo Vysypat koš, 562 00:35:20,870 --> 00:35:23,460 podobně, nic se nestane, aby tento obrázek. 563 00:35:23,460 --> 00:35:28,590 Vše, co se stane, je jinde v počítači, tam je nějaký druh tabulky. 564 00:35:28,590 --> 00:35:35,400 Je to něco jako malý tahák, který říká, že, řekněme, resume.doc, 565 00:35:35,400 --> 00:35:40,920 takže váš životopis v souboru aplikace Microsoft Word bydlel v místě 123 na pevném disku, 566 00:35:40,920 --> 00:35:43,710 není v paměti a ne v paměti RAM, ale na pevném disku, 567 00:35:43,710 --> 00:35:49,050 a vaše útržkovité JPEG žije v 456, a soubor aplikace Excel žije na 789 nebo kdekoliv. 568 00:35:49,050 --> 00:35:53,640 Při mazání souborů vlastně vyprazdňování koše nebo Koš, 569 00:35:53,640 --> 00:35:59,530 tento obrázek se nemění. 0s a 1s na pevném disku nejdou nikam. 570 00:35:59,530 --> 00:36:03,930 Ale tato tabulka, tento malý databáze druhů, mění. 571 00:36:03,930 --> 00:36:08,750 Když smažete svůj životopis, je to, jako když je soubor odstraněn v nějakém smyslu, 572 00:36:08,750 --> 00:36:12,790 ale všechny se počítač se zapomenout, kde je ta věc žije na pevném disku. 573 00:36:12,790 --> 00:36:17,870 0s a 1s, že skládat svůj životopis nebo některý z těchto dalších souborů jsou stále neporušené. 574 00:36:17,870 --> 00:36:21,960 >> Takže pokud jste to udělali omylem, je tu stále non-nulová pravděpodobnost 575 00:36:21,960 --> 00:36:25,800 že můžete obnovit vaše data pomocí Norton Utilities nebo nějaký obchodní software 576 00:36:25,800 --> 00:36:29,810 jehož cílem v životě je najít 0s a 1s, které nějak bylo opuštěno, 577 00:36:29,810 --> 00:36:33,300 Zapomněli jste tady, ale nechal tady, takže můžete získat data zpět. 578 00:36:33,300 --> 00:36:38,410 Nebo forenzní vyšetřovatelé s policií nebo FBI by skutečně pevný disk 579 00:36:38,410 --> 00:36:42,550 a vlastně hledat vzory 0s a 1s, které vypadají jako JPEG, vypadají jako soubory Excel, 580 00:36:42,550 --> 00:36:46,400 a obnovit je to tak, i když je počítač zapomněl je tam. 581 00:36:46,400 --> 00:36:49,820 Takže jediný způsob, jak opravdu odstranit data, jak budeme diskutovat v budoucnosti, 582 00:36:49,820 --> 00:36:54,190 je drhnout nebo otřete soubor nebo pevný disk od - 583 00:36:54,190 --> 00:36:56,540 Nemůžete opravdu zbavit 0s a 1s 584 00:36:56,540 --> 00:36:59,440 protože jinak byste začít s gigabitovou pevný disk 585 00:36:59,440 --> 00:37:02,380 a vy byste skončit s megabajt pevného disku, pokud jste neustále museli mazat, 586 00:37:02,380 --> 00:37:04,380 doslovně, 0s a 1s. 587 00:37:04,380 --> 00:37:06,310 Takže to, co byste dělali, kdyby jste opravdu chtěli pokrýt své 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 někoho gestikuloval, že byste fyzicky zlomit zařízení. To bude fungovat. 590 00:37:14,930 --> 00:37:19,600 [Smích] Ale jestli je to trochu drahé řešení, co by bylo rozumnější? 591 00:37:19,600 --> 00:37:23,270 Jo. >> [Student] přepsat. Přepsat >> s tím, co? >> [Student] Další data. 592 00:37:23,270 --> 00:37:29,070 Další údaje. Stačí si jen přepsat disku s 0s nebo 1s nebo všech 0s, vše 1s. 593 00:37:29,070 --> 00:37:31,230 >> A to je skutečně to, co některé softwarové dělá. 594 00:37:31,230 --> 00:37:33,570 Můžete si koupit software, nebo dokonce získat zdarma software, 595 00:37:33,570 --> 00:37:36,610 a dokonce postavil do Mac OS v těchto dnech, méně v systému Windows, 596 00:37:36,610 --> 00:37:38,660 je schopnost bezpečně vymazat. 597 00:37:38,660 --> 00:37:41,960 Vlastně, pokud chcete, aby všichni běží domů dnes, pokud máte Mac, a to, 598 00:37:41,960 --> 00:37:45,740 pokud máte nějaké věci v popelnici, můžete tak učinit Secure Empty Trash, 599 00:37:45,740 --> 00:37:47,610 který dělá přesně to. 600 00:37:47,610 --> 00:37:53,350 Spíše než jen mazání souborů zde, že nevymaže 0s a 1s zde, 601 00:37:53,350 --> 00:38:01,240 poněkud, to jen změní je všechny, například, aby 0s a tečka, tečka, tečka. 602 00:38:01,240 --> 00:38:05,330 Takže jeden z vašich budoucích psets bude skutečně úmyslně obnovit data - 603 00:38:05,330 --> 00:38:08,430 fotografie, které jste udělali lidí, míst a věcí na akademické půdě 604 00:38:08,430 --> 00:38:12,810 pro které uděláme forenzní obraz z digitálního fotoaparátu na paměťovou kartu, 605 00:38:12,810 --> 00:38:17,120 což je přesně stejný nápad - a budete muset být vyzváni, aby skutečně najít 606 00:38:17,120 --> 00:38:20,160 vzory, které představují JPEG na pevném disku, 607 00:38:20,160 --> 00:38:23,610 podobně jako tento bývalý student, jehož e-mail jsem četl před několika týdny udělal 608 00:38:23,610 --> 00:38:25,860 obnovit jeho sestry fotografií. 609 00:38:25,860 --> 00:38:30,300 Proč jsme se 5-minut přestávku tady, a my přeskupit se více na paměti. 610 00:38:33,030 --> 00:38:38,610 Tak tady je místo, kde se věci trochu mysl-ohýbání, ale je to velmi silný krok 611 00:38:38,610 --> 00:38:40,480 k pochopení to všechno víc. 612 00:38:40,480 --> 00:38:42,900 Zde je program s názvem pointers.c. 613 00:38:42,900 --> 00:38:45,430 To je mezi dnešním ukázkovém kódu. 614 00:38:45,430 --> 00:38:51,280 Všimněte si, že v prvních několika řádků, 19 až 22, vše, co děláte, je něco jako GetString 615 00:38:51,280 --> 00:38:54,460 a vrácení adresu, ukládání v §. 616 00:38:54,460 --> 00:38:58,380 Od té doby pro PSet i 3, pokud chcete, ale Pset 4 a na 617 00:38:58,380 --> 00:39:01,030 kde si můžete začít užívat tyto vzdělávací kol nad sebe, 618 00:39:01,030 --> 00:39:04,030 není důvod předstírat, že řetězce už neexistuje. 619 00:39:04,030 --> 00:39:07,030 Je to určitě v pořádku jen začít říkat char *. 620 00:39:07,030 --> 00:39:12,610 >> Jak stranou, on-line odkazy a knihách můžete často vidět hvězdu vedle proměnné. 621 00:39:12,610 --> 00:39:15,600 Můžete dokonce vidět prostor kolem obou stranách. 622 00:39:15,600 --> 00:39:17,680 Všechny z nich jsou funkčně správné. 623 00:39:17,680 --> 00:39:21,180 Pro tuto chvíli, když budeme standardizovat na tomto přístupu, aby se super clear 624 00:39:21,180 --> 00:39:24,000 že char * je jako říct, že znak ukazatel. 625 00:39:24,000 --> 00:39:25,680 To je typ dat. 626 00:39:25,680 --> 00:39:28,730 A pak název proměnné je v tomto případě. 627 00:39:28,730 --> 00:39:31,180 Takže jsme dostali řetězec a my jsme říkali s. 628 00:39:31,180 --> 00:39:35,180 A pak tady dole si, že dělám vlastně trochu podvod. 629 00:39:35,180 --> 00:39:39,080 To se nazývá ukazatel aritmetiku, která je jakýmsi super jednoduchý. 630 00:39:39,080 --> 00:39:41,790 To jen znamená, že sčítání a odčítání čísla ukazatelů. 631 00:39:41,790 --> 00:39:43,660 Ale to skutečně funguje. 632 00:39:43,660 --> 00:39:49,170 Tento program zřejmě vypíše řetězce s 1 znak na řádku taková, že konečný výsledek - 633 00:39:49,170 --> 00:39:54,920 Jen tak můžeme zkazit, kde to bude, aby ukazatele, spusťte ukazatele, dovolte mi, abych Zoom 634 00:39:54,920 --> 00:39:58,940 Nyní mi dovolte, abych typ v něco jako HELLO a typ Enter 635 00:39:58,940 --> 00:40:01,080 a tiskne 1 znak na řádku. 636 00:40:01,080 --> 00:40:04,730 Až do druhé před, by jsme udělali s hranatá závorka notace. 637 00:40:04,730 --> 00:40:09,760 Měli bychom pro smyčce, a my bychom to printf S [i], a my bychom to udělat znovu a znovu a znovu 638 00:40:09,760 --> 00:40:11,950 s lomítkem n na konci každého řádku. 639 00:40:11,950 --> 00:40:16,800 Ale tento program je jiný. Tento program používá, doslova, aritmetika. 640 00:40:16,800 --> 00:40:18,860 Tak co se to tady děje? 641 00:40:18,860 --> 00:40:24,720 Za prvé, před smyčka ještě provede, co, jen aby bylo jasno, je to vlastně? 642 00:40:24,720 --> 00:40:27,270 S je? >> [Student] adresa. >> Adresa. 643 00:40:27,270 --> 00:40:32,980 >> A to je adresa, v případě ahoj, první znak v tomto slova, které je h. 644 00:40:32,980 --> 00:40:37,370 Tak s je, že v tomto konkrétním příkladu, adresa h. 645 00:40:37,370 --> 00:40:41,850 Takže co to znamená dělat s. + i? 646 00:40:41,850 --> 00:40:46,280 No, i začíná na hodnotě 0 v tomto pro smyčce. Udělali jsme, že mnohokrát. 647 00:40:46,280 --> 00:40:49,760 I se jít do délky řetězce, jak se zdá. 648 00:40:49,760 --> 00:40:53,950 Tak na první iteraci tohoto cyklu, i je samozřejmě 0. 649 00:40:53,950 --> 00:41:01,740 Takže tento výraz říká s + i - spíše s +0--to je samozřejmě jen s. 650 00:41:01,740 --> 00:41:04,320 Takže to, co je * tady? 651 00:41:04,320 --> 00:41:08,530 Nyní jsme použili na hvězdičku v trochu jiným způsobem. 652 00:41:08,530 --> 00:41:13,080 Nech mě jít napřed a zbavit t, protože jsme udělali mluvíme o t a kopií s. 653 00:41:13,080 --> 00:41:15,540 Teď už jen chci říct příběh zahrnující s.. 654 00:41:15,540 --> 00:41:20,090 A tak v tomto okamžiku, poté, co řetězec typu, náš svět vypadá úplně jako to dělal předtím 655 00:41:20,090 --> 00:41:26,630 se jen s uložením adresu h a obecně ukazuje na řetězec ahoj. 656 00:41:26,630 --> 00:41:33,170 Kdybych teď dělat čáry jako * (y + i), zkusme to. 657 00:41:33,170 --> 00:41:40,140 Takže * (s + i). Dovolte mi zjednodušit, protože to je 0, tak se jedná * (y 0). 658 00:41:40,140 --> 00:41:43,790 No, počkejte chvilku. Dále zjednodušit. To je * (y). 659 00:41:43,790 --> 00:41:47,020 No, teď závorky jsou trochu hloupý, takže teď pojďme udělat * s. 660 00:41:47,020 --> 00:41:50,540 Takže v první iteraci tohoto cyklu, že linka, která je zvýrazněna, 26, 661 00:41:50,540 --> 00:41:53,650 je do značné míry odpovídá tisk to. 662 00:41:53,650 --> 00:41:56,040 Jaký je typ dat * s? 663 00:41:56,040 --> 00:42:00,770 V této souvislosti, protože hvězda se stane, že vedle s sám, 664 00:42:00,770 --> 00:42:04,930 ale konkrétně, protože jsme již prohlásil s, 665 00:42:04,930 --> 00:42:09,730 nejsme vytvořením proměnné už, tam žádná zmínka o char * v souladu 26, 666 00:42:09,730 --> 00:42:14,280 tam žádná zmínka o klíčových řetězce, jsme jen pomocí proměnné s názvem s, 667 00:42:14,280 --> 00:42:19,650 to dopadá nyní hvězda má mírně odlišné, a sice, matoucí význam. 668 00:42:19,650 --> 00:42:26,590 * Tady znamená jít na adresu v s a tisknout, co tam je. 669 00:42:26,590 --> 00:42:33,750 Takže s je tady, * s je - něco jako zásobníky a žebříky, za šipkou - zde. 670 00:42:33,750 --> 00:42:35,850 Tak tohle je * s. 671 00:42:35,850 --> 00:42:39,060 >> Takže to, co se má vytisknout na první iteraci tohoto cyklu v souladu 26? 672 00:42:39,060 --> 00:42:42,170 I vytisknout% C, což je zástupný symbol pro znak, 673 00:42:42,170 --> 00:42:48,520 pak \ n pro nový řádek. * (Y + i), kde i je 0, je právě tato. 674 00:42:48,520 --> 00:42:53,670 Takže to, co char si mohu v% c.? H. 675 00:42:53,670 --> 00:42:56,900 V dalším opakování smyčky - můžete pravděpodobně vidět, kde to bude - 676 00:42:56,900 --> 00:43:01,350 další iterace i je samozřejmě 1, takže to znamená s 1, 677 00:43:01,350 --> 00:43:05,580 a pak teď nemám potřebovat závorky, protože nyní hvězda potřebuje říci 678 00:43:05,580 --> 00:43:08,620 přejít na adresu v paměti s 1. 679 00:43:08,620 --> 00:43:14,170 Co je to? Pojďme se vrátit v čase a říkají, že toto arrow teď není ve skutečnosti dělá nám žádnou laskavost. 680 00:43:14,170 --> 00:43:18,450 Ať to konkrétně říci, že je to uložení čísla 123 681 00:43:18,450 --> 00:43:25,110 protože začátku tohoto řetězce ahoj, to je adresa 123, to je 124, a tak dále. 682 00:43:25,110 --> 00:43:30,550 Takže na druhé iteraci, když říkám s. 1, to je jako říct, že 123 1, 683 00:43:30,550 --> 00:43:35,340 jinak známý jako 124, takže to, co char se vytiskne na druhou iteraci? 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 Pak znovu +, 125, 126, 127, a tato smyčka naštěstí zastaví předtím, než jsme se sem dostali 686 00:43:44,440 --> 00:43:49,040 protože jsem pomocí strlen, aby se ujistil, že jsem se nepočítá příliš vysoká. 687 00:43:49,040 --> 00:43:50,810 Takže to taky není ono. 688 00:43:50,810 --> 00:43:55,000 Opět, je to stejně jako když jsme dělali před týdnem. 689 00:43:55,000 --> 00:43:59,200 Dovolte mi, abych napsat na řádku níže, i když nechceme dělat obojí. 690 00:43:59,200 --> 00:44:02,500 Toto je totožný se v této oblasti. 691 00:44:02,500 --> 00:44:08,310 >> Takže i když to je řetězec, jak jsme se volat to týdny, to je opravdu char *. 692 00:44:08,310 --> 00:44:13,270 Takže pokud chceme být super anal, je to opravdu správné napsat zvláštní znak 693 00:44:13,270 --> 00:44:17,490 v té poloze pomocí těchto číselných adres a tuto hvězdu operátor, 694 00:44:17,490 --> 00:44:20,470 ale upřímně řečeno, je to tak mnohem čistší. Takže to není špatné. 695 00:44:20,470 --> 00:44:26,720 Není důvod přestat řádek 27 zde, ale 26 je funkčně stejný, 696 00:44:26,720 --> 00:44:31,570 a je to funkčně stejné přesně z důvodů, které jsme byli diskutovat tak daleko. 697 00:44:31,570 --> 00:44:33,650 A konečně, 29 je jen dobré praxe. 698 00:44:33,650 --> 00:44:38,420 Volání zdarma s znamená, že nyní dáváte zpět paměť, která GetString vám dal 699 00:44:38,420 --> 00:44:41,630 protože opět, jak už jsem zmínil Pondělí, GetString týdny 700 00:44:41,630 --> 00:44:44,180 bylo zavedení chybu do kódu. 701 00:44:44,180 --> 00:44:46,490 Váš kód týdny měl úniky paměti 702 00:44:46,490 --> 00:44:49,970 kdy jste se ptali GetString pro paměť, ale nikdy jsi dával zpět. 703 00:44:49,970 --> 00:44:53,410 A to byl uváženě volený námi pedagogicky 704 00:44:53,410 --> 00:44:55,880 protože je to prostě příliš o čem přemýšlet brzy. 705 00:44:55,880 --> 00:44:57,710 Ale teď potřebujeme více symetrii. 706 00:44:57,710 --> 00:45:00,830 Zeptáte-li se počítač paměť, jako je tomu v případě GetString, 707 00:45:00,830 --> 00:45:02,820 jako je tomu v případě očividně pro malloc, 708 00:45:02,820 --> 00:45:07,970 Nyní musíte pro PSet 4 kupředu i bez takové paměti. 709 00:45:07,970 --> 00:45:11,650 Všimněte si, to je něco jiného než říkat int n. 710 00:45:11,650 --> 00:45:15,040 Nemusíte se uvolnit, protože jsi nevolal GetString 711 00:45:15,040 --> 00:45:16,890 a nevolal malloc. 712 00:45:16,890 --> 00:45:20,610 >> A i když jsi volal GetInt jak budeme nakonec vidět, 713 00:45:20,610 --> 00:45:25,520 GetInt není alokovat paměť pro vás, protože můžete skutečně projít kolem celá čísla 714 00:45:25,520 --> 00:45:29,430 a plave a písmen přesně tak, jak jsme to dělali několik týdnů. 715 00:45:29,430 --> 00:45:33,960 Řetězce, i když jsou zvláštní, protože opravdu jsou zřetězení více znaků. 716 00:45:33,960 --> 00:45:37,450 Takže jsou jen odlišné od znaků a plováky a ints a podobně. 717 00:45:37,450 --> 00:45:39,980 Ale vrátíme se, že zanedlouho. 718 00:45:39,980 --> 00:45:44,920 Jakékoli otázky, pak na tomto začátku ukazatelů? Jo. 719 00:45:44,920 --> 00:45:49,690 [Neslyšitelné Student otázka] 720 00:45:49,690 --> 00:45:51,440 Ah, velmi dobrá otázka. 721 00:45:51,440 --> 00:45:55,790 Jedna z mála věcí, C skutečně dělá pro vás, což je výhodné, 722 00:45:55,790 --> 00:46:00,110 je to vyřeší za vás, co je velikost tohoto datového typu 723 00:46:00,110 --> 00:46:03,060 a pak dělá, že druh množení pro vás. 724 00:46:03,060 --> 00:46:06,610 To není v případě znaků, neboť téměř vždy znak je 1 byte, 725 00:46:06,610 --> 00:46:08,150 tak to prostě funguje. 726 00:46:08,150 --> 00:46:11,220 Ale v zájmu diskuse, pokud jste byli skutečně tisku celá čísla 727 00:46:11,220 --> 00:46:15,500 a vy se pokoušíte vytisknout nějakou hodnotu s, který ukazoval na celé číslo, 728 00:46:15,500 --> 00:46:20,720 si podobně nebudou muset dělat + 4 * i jen proto, že int je 4 bajty. 729 00:46:20,720 --> 00:46:25,780 Ukazatel aritmetické znamená, že C a kompilátor dělat všechny, že matematika pro vás. 730 00:46:25,780 --> 00:46:29,190 Jediné, co musíte starat jen o počítání v druhu lidském smyslu. Jo. 731 00:46:29,190 --> 00:46:35,200 [Student] Pokud deklarujete řetězec uvnitř smyčky for, musíš uvolnit později? 732 00:46:35,200 --> 00:46:36,760 Dobrá otázka. 733 00:46:36,760 --> 00:46:41,390 >> Pokud jste prohlásil řetězce uvnitř pro smyčky, budete potřebovat uvolnit později? 734 00:46:41,390 --> 00:46:47,520 Jediné, co potřebujete, abyste uvolnili paměť, že jste přidělit s GetString nebo malloc. 735 00:46:47,520 --> 00:46:53,110 Takže pokud jste právě řekl něco jako - dovolte mi, abych složené závorky nyní tak celý kód je věnována. 736 00:46:53,110 --> 00:46:58,580 Pokud jste něco, byť buggily, jako je tato, char * t = s, 737 00:46:58,580 --> 00:47:03,450 nemusíte se zdarma t, protože t neobsahovala žádnou zmínku o malloc nebo GetString. 738 00:47:03,450 --> 00:47:08,960 Pokud naopak jste to udělali, GetString, pak ano, budete muset zdarma t. 739 00:47:08,960 --> 00:47:14,350 A ve skutečnosti, jediná šance, jak to udělat, je nyní uvnitř této smyčky, pro stejnou vydání působnosti 740 00:47:14,350 --> 00:47:16,060 že jsme diskutovali v minulosti. 741 00:47:16,060 --> 00:47:18,830 Jinak byste se přidělování paměti, přidělování paměti, přidělování paměti, 742 00:47:18,830 --> 00:47:21,230 a na konci programu, protože to mimo tento smyčky, 743 00:47:21,230 --> 00:47:24,240 t neexistuje, ale nikdy jsi na operační systém 744 00:47:24,240 --> 00:47:26,750 že jste nepotřebovali, že paměť už. 745 00:47:26,750 --> 00:47:30,430 A netrvalo dlouho, pro PSet 4 nebo 5 budeme vybavit si s programem s názvem Valgrind, 746 00:47:30,430 --> 00:47:34,160 který je podobný v duchu, aby GDB v tom, že je to má poněkud tajemný rozhraní, 747 00:47:34,160 --> 00:47:35,750 ale jeho účel v životě je, aby vám pomohl. 748 00:47:35,750 --> 00:47:39,380 A Valgrind je program, který bude v budoucnu hledat své programy 749 00:47:39,380 --> 00:47:42,550 hledá úniky paměti, ať už z GetString nebo malloc, 750 00:47:42,550 --> 00:47:47,800 které začneme používat to více, jak jsme přestali používat CS50 knihovny tolik. 751 00:47:47,800 --> 00:47:53,030 Konečně jsme nyní druh slovníku a druh mentálního modelu v teorii 752 00:47:53,030 --> 00:47:55,170 s nimiž se vyřešit tento rozbité program. 753 00:47:55,170 --> 00:47:59,410 >> Takže v tomto rozbité programu, swap funguje uvnitř swapu, 754 00:47:59,410 --> 00:48:05,280 ale nikdy skutečně odpracovaných hodin v hlavním, protože hlavní prošel v x a y, si vzpomenout, 755 00:48:05,280 --> 00:48:07,260 a ty byly předány v roce hodnotami, abych tak řekl. 756 00:48:07,260 --> 00:48:09,330 Kopie z nich dostali na swap. 757 00:48:09,330 --> 00:48:12,520 Do konce roku swapu, a b skutečně byly vyměněny, 758 00:48:12,520 --> 00:48:16,120 ale samozřejmě x a y, jak jsme diskutovali v pondělí, nebyl. 759 00:48:16,120 --> 00:48:19,940 Takže navrhuji zeleně zde, že to je vlastně řešení zde. 760 00:48:19,940 --> 00:48:22,640 A skutečně, dovolte mi, abych přesunout své hvězdy jen proto, aby bylo v souladu 761 00:48:22,640 --> 00:48:24,440 i když, opět, funkčně to nevadí. 762 00:48:24,440 --> 00:48:28,730 V budoucnu týdnů budeme vysvětlit kdy a proč to dělá záležitost. 763 00:48:28,730 --> 00:48:30,600 Takže zeleně Nyní je řešení. 764 00:48:30,600 --> 00:48:33,700 Upřímně řečeno, vypadá to mnohem chaotičnosti, protože mám všechny z těchto hvězd. 765 00:48:33,700 --> 00:48:35,380 Dovolte mi, abych poukázat na jednu věc. 766 00:48:35,380 --> 00:48:40,040 Horní řádek zde, kde se říká, že int * a int * b 767 00:48:40,040 --> 00:48:42,820 je zásadně dělá to samé, jako tomu vždy bylo. 768 00:48:42,820 --> 00:48:47,070 To prohlašuje 2 argumenty nebo parametry vyměnit, 769 00:48:47,070 --> 00:48:49,940 První z nich je int ukazatel nazvaný, 770 00:48:49,940 --> 00:48:53,100 z nichž druhá je int ukazatel nazvaný b. 771 00:48:53,100 --> 00:48:55,770 Jediná věc, která je nová v tomto bodě je fakt, že je tu hvězda tam. 772 00:48:55,770 --> 00:48:59,340 >> Co to znamená? Není int, b není int. 773 00:48:59,340 --> 00:49:04,100 Je adresa int a b je adresa jiného int. 774 00:49:04,100 --> 00:49:06,980 Tady dole, to je místo, kde jsem se přiznat, že C dostane matoucí. 775 00:49:06,980 --> 00:49:09,790 Nyní jsme použili hvězdu, ale to má jiný význam v této souvislosti. 776 00:49:09,790 --> 00:49:13,150 Vzhledem k tomu, že nejsme deklarovat ukazatele, jak jsme tady, 777 00:49:13,150 --> 00:49:15,500 zde jsme dereferencing věci. 778 00:49:15,500 --> 00:49:21,520 Takže technicky, hvězda v této souvislosti první, druhý a třetí řádek uvnitř odkládacího prostoru 779 00:49:21,520 --> 00:49:24,560 je dereference operátor, který prostě znamená jít tam. 780 00:49:24,560 --> 00:49:27,400 Takže stejně jako můj prst následoval na šipku h, 781 00:49:27,400 --> 00:49:31,100 * Prostředek přejít na tuto adresu a najdi mi int, která je tam. 782 00:49:31,100 --> 00:49:34,250 * B prostředky jdou na adresu a předat mi, co tam je. 783 00:49:34,250 --> 00:49:40,730 Takže pojďme překreslit obraz od pondělí nyní používají hromadu snímků, 784 00:49:40,730 --> 00:49:43,130 spodní z nichž jeden je bude hlavní, 785 00:49:43,130 --> 00:49:47,600 horní z nichž jeden je bude výměna, 786 00:49:47,600 --> 00:49:50,880 tak, aby náš svět vypadá, stejně jako pondělí takhle. 787 00:49:50,880 --> 00:49:53,620 Zde je kus paměti, že hlavní je bude používat. 788 00:49:53,620 --> 00:49:56,520 >> Připomeňme, že od pondělí program prostě musel 2 proměnné, 789 00:49:56,520 --> 00:50:01,930 jeden volal X a jeden s názvem y, a já jsem dal čísla 1 a 2 tam. 790 00:50:01,930 --> 00:50:06,580 Teď, když jsem hovor vyměnit jako já v pondělí, 791 00:50:06,580 --> 00:50:11,000 dříve, když jsem použil červenou verzi tohoto programu, který vypadá takto, 792 00:50:11,000 --> 00:50:17,470 Mám 2 parametry, a a b, a co píšeme zde a zde? 793 00:50:17,470 --> 00:50:21,160 Jen 1 a 2, doslova kopíruje x a y. 794 00:50:21,160 --> 00:50:23,070 Dnes jsme změnit. 795 00:50:23,070 --> 00:50:28,510 Dnes místo předání v ints a, b budeme předávat v 2 adresy. 796 00:50:28,510 --> 00:50:34,290 Tyto adresy se stalo, aby ukazoval na ints, ale tyto adresy nejsou ints sami. 797 00:50:34,290 --> 00:50:37,330 Jsou adresy. Je to jako poštovní adresu místo. 798 00:50:37,330 --> 00:50:40,580 Takže teď musíme jen dát si trochu podrobněji na obrazovce. 799 00:50:40,580 --> 00:50:43,250 To je můj počítač paměti, jak to bylo celý den. 800 00:50:43,250 --> 00:50:45,120 Nyní potřebujeme nějaký libovolný schéma číslování. 801 00:50:45,120 --> 00:50:50,580 Takže řekněme, náhodou, že toto je adresa paměti 123, 124. 802 00:50:50,580 --> 00:50:55,660 Řekněme to je 125, to je 126, a tak dále, ale je to zcela libovolný. 803 00:50:55,660 --> 00:50:58,590 Potřebujeme jen trochu číslování v mé paměti. 804 00:50:58,590 --> 00:51:04,030 Takže teď, když jsem vlastně předat x a y, nebudu se pak x a y; 805 00:51:04,030 --> 00:51:08,400 Jdu předat v poštovní adresu, abych tak řekl, o x a y 806 00:51:08,400 --> 00:51:11,870 tak, že to, co je uložena zde a zde není 1 a 2, 807 00:51:11,870 --> 00:51:16,030 ale pokud můžete vidět můj malý text, co je předán v tady a tady? 808 00:51:16,030 --> 00:51:23,340 [Neslyšitelné Student odpověď] >> Přesně tak. 123 dostane dal sem a 124 dostane dát sem. 809 00:51:23,340 --> 00:51:28,910 >> Teď, protože jsem použil hvězdu v tomto prvním řádku až sem na vrchol, 810 00:51:28,910 --> 00:51:34,340 můj program prostě ví, že 123 a 124, i když to samozřejmě celá čísla 811 00:51:34,340 --> 00:51:40,160 že každý člověk může všimnout, by měly být vykládány jako adresy, číselné adresy. 812 00:51:40,160 --> 00:51:43,250 Nejsou samy o sobě ints, jsou adresy, 813 00:51:43,250 --> 00:51:46,120 a to proto, že jsem výslovně dal hvězdy tam. 814 00:51:46,120 --> 00:51:51,360 Takže teď v mé první, druhý a třetí řádek aktuálního kódu, co se tu děje? 815 00:51:51,360 --> 00:51:53,380 Pojďme čerpat zbytek obrazu. 816 00:51:53,380 --> 00:51:56,980 Tmp je, stejně jako to bylo v pondělí. Nic zvláštního tmp. 817 00:51:56,980 --> 00:52:03,060 Je to jen místní 32 bitů proměnné, a uvnitř, že jsem zřejmě uložení hodnoty *. 818 00:52:03,060 --> 00:52:08,580 Teď, když jsem řekl, tmp =, co bych dal tu? >> [Student] 123. 819 00:52:08,580 --> 00:52:10,370 123. Ale to není to, co dělám. 820 00:52:10,370 --> 00:52:13,670 Říkám tmp = *. Počet hvězdiček znamená tam. 821 00:52:13,670 --> 00:52:19,370 Takže zde je, 123. Jak mám jít tam? Předstírat, že se tam šipka. 822 00:52:19,370 --> 00:52:24,460 No, tady to je, 1. Takže to, co je uložena v tmp, zřejmě? Jen 1. 823 00:52:24,460 --> 00:52:29,620 Takže jinými slovy, tmp je * a, * prostředkem přejděte na adresu, která je v současné době v, 824 00:52:29,620 --> 00:52:31,320 což je zřejmě 123. 825 00:52:31,320 --> 00:52:33,910 >> Dobře, tady jsme na místě 123, vidím číslo 1, 826 00:52:33,910 --> 00:52:35,670 tak jsem dám číslo 1 tam. 827 00:52:35,670 --> 00:52:39,020 Teď, co mám dělat, v řádku 2, * = * b? 828 00:52:39,020 --> 00:52:44,570 To je trochu více zapojit, protože nyní to, co je? Je to 123. 829 00:52:44,570 --> 00:52:50,220 Takže * je kde? Přesně tam, kde jsem byl předtím. Takže tam. Dobře. 830 00:52:50,220 --> 00:52:53,420 Nyní, konečně, a pak konečně to začne dávat smysl, doufejme, 831 00:52:53,420 --> 00:53:00,280 * B znamená to, co je v B? 124. Tak jsem třeba tam, což je o 2. 832 00:53:00,280 --> 00:53:03,430 Tak co jsem dal, kde? 833 00:53:03,430 --> 00:53:10,100 2 jde do tady, protože * b přejde do *. Takže to udělám. 834 00:53:10,100 --> 00:53:13,120 A už můžete vidět, možná, že jsme tak mnohem blíže 835 00:53:13,120 --> 00:53:17,710 k řešení tohoto hloupý, jednoduchý problém správně poprvé 836 00:53:17,710 --> 00:53:20,920 protože nyní máme před sebou ještě vzpomínku na to, co bylo x, 837 00:53:20,920 --> 00:53:23,230 máme 2 kopie, sice y, 838 00:53:23,230 --> 00:53:25,850 ale řádek 3 nyní říká, * b. 839 00:53:25,850 --> 00:53:31,080 Tak tady je b. * B prostředky tam. Tak kde je umístění 124? 840 00:53:31,080 --> 00:53:35,560 Je to prý tady. Tak co mám dát sem? Samozřejmě, tmp. 841 00:53:35,560 --> 00:53:39,600 Takže teď jsem to. Tak jsem si tady 1 a 2 zde. 842 00:53:39,600 --> 00:53:43,560 A teď, co o tom všem, 123, 124, a 1? 843 00:53:43,560 --> 00:53:47,910 Jakmile swapových výnosů, tato paměť je stejně dobrý jako ztracené 844 00:53:47,910 --> 00:53:51,070 protože jakmile swapových vrátí, operační systém 845 00:53:51,070 --> 00:53:54,190 je zdarma k použití, že paměť v budoucnu znovu. 846 00:53:54,190 --> 00:53:58,870 Pouze paměť Hlavní je v dolní části této tzv. zásobníku drží kolem. 847 00:53:58,870 --> 00:54:01,470 >> A tak jsme konečně máme nyní pracovní verzi. 848 00:54:01,470 --> 00:54:06,310 Nech mě jít do swap.c, a všimněte si následující. 849 00:54:06,310 --> 00:54:11,280 V horní části programu změnil jsem prototyp být int * a int * b. 850 00:54:11,280 --> 00:54:15,000 Takže jediné, co jsem změnil jít z červené, která byla špatná, na zelenou, což je dobré, 851 00:54:15,000 --> 00:54:17,350 I se přidal tyto hvězdy dnes. 852 00:54:17,350 --> 00:54:21,520 Ale pak tady v prohodit sám jsem musel zkopírovat, vložit to, co bylo právě na snímku. 853 00:54:21,520 --> 00:54:24,140 Mám hvězdu tady, hvězda zde - to odpovídá prototyp - 854 00:54:24,140 --> 00:54:27,930 a pak všechny tyto věci teď mají hvězdy s výjimkou tmp 855 00:54:27,930 --> 00:54:30,680 protože použití pomocné proměnné, tu nic nového. 856 00:54:30,680 --> 00:54:33,040 Potřebuju jen dočasné úložiště pro int. 857 00:54:33,040 --> 00:54:34,820 Takže nepotřebujeme hvězdu tam. 858 00:54:34,820 --> 00:54:39,310 Potřebujeme jen hvězdu, takže můžeme přejít tento druh svévolné hranice 859 00:54:39,310 --> 00:54:42,900 mezi těmito 2 snímků v mé paměti počítače. 860 00:54:42,900 --> 00:54:45,630 Ale jedna poslední věc se musí změnit, a možná jste zahlédli ho již. 861 00:54:45,630 --> 00:54:48,810 Co druhý řádek je samozřejmě jiná teď? >> [Student] & x. 862 00:54:48,810 --> 00:54:53,270 >> Jo, tak 25 je poslední řádek kódu musím změnit pro tuto práci. 863 00:54:53,270 --> 00:54:58,360 Před týdnem a ještě v pondělí řádek 25 vypadal, vyměnit X a Y, 864 00:54:58,360 --> 00:55:02,020 a toto bylo právě rozešla, protože pokud říkáte swap (x, y) 865 00:55:02,020 --> 00:55:05,660 dáváte kopie X a Y vyměňovat, pak to dělá svou věc, 866 00:55:05,660 --> 00:55:09,080 ale vy jste nikdy skutečně mění, x a y sám. 867 00:55:09,080 --> 00:55:12,880 Takže i když jste nikdy neviděl tento znak dříve s ampersand v kódu, 868 00:55:12,880 --> 00:55:15,860 jen hádat. Co ampersand dělat, zřejmě? 869 00:55:15,860 --> 00:55:17,890 [Student] zastává adresu. >> Zastává adresu. 870 00:55:17,890 --> 00:55:21,160 Takže ampersand říká dej mi adresu x. 871 00:55:21,160 --> 00:55:25,590 Kdo ví, kde to je? Stává se, že je 123. Nezajímá mě. Dej mi adresu x. 872 00:55:25,590 --> 00:55:28,340 A y se rozumí dej mi adresu y. 873 00:55:28,340 --> 00:55:34,450 A v tomto bodě příběh je zcela v souladu s obrázkem jsme vycházeli před chvílí. 874 00:55:34,450 --> 00:55:38,310 >> Tak jsem si přiznat ukazatele, určitě pro mě, když jsem poprvé začal učit to, 875 00:55:38,310 --> 00:55:40,570 byly rozhodně jedna z nejtěžších věcí, zabalit svou mysl kolem. 876 00:55:40,570 --> 00:55:43,760 Ale uvědomit, zejména pokud budeme držet hrát s těmito druhy věcí, 877 00:55:43,760 --> 00:55:48,030 Pokud vyrazit na tyto super jednoduchý druh intelektuálně nezajímavý problémy 878 00:55:48,030 --> 00:55:52,270 pouhého pohybu atomů kolem, odpověď na mnoho zmatku s ukazateli 879 00:55:52,270 --> 00:55:56,590 Opravdu je možné odvodit z těchto velmi základní mechaniky. 880 00:55:56,590 --> 00:55:59,070 Tady je adresa. Jděte tam s hvězdou. 881 00:55:59,070 --> 00:56:03,830 Nebo naopak, tady je ampersand. Zjistit, co je adresa ve skuteč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 se všechny tyto paměti pochází z? 884 00:56:09,000 --> 00:56:12,360 Jsme vypracován tento obrázek několikrát, a pořád perspektivní vrátíme k tomu, 885 00:56:12,360 --> 00:56:14,920 ale tady je reprezentace paměti vašeho počítače 886 00:56:14,920 --> 00:56:17,420 to je trochu víc, než náš označené tabuli je zde. 887 00:56:17,420 --> 00:56:21,590 Text segment na vrcholu představuje to, co ve vztahu k programu? 888 00:56:21,590 --> 00:56:26,090 [Neslyšitelné Student odpověď] >> Je nám líto,? Řekni to znovu. 889 00:56:26,090 --> 00:56:28,660 [Student] skutečný program. >> Aktuální program. 890 00:56:28,660 --> 00:56:32,430 >> Takže 0s a 1s, které jste sestavili po zápisu kód v C a pak běží zvonění 891 00:56:32,430 --> 00:56:35,910 a generování 0s a 1s skončí jako dobývání zastrčený tam v paměti 892 00:56:35,910 --> 00:56:38,570 protože při poklepání na ikonu na vašem počítači Mac nebo PC 893 00:56:38,570 --> 00:56:43,010 nebo spustit příkaz jako Mario u Vašeho řádku, vaše 0s a 1s z disku 894 00:56:43,010 --> 00:56:45,700 si nahraje do paměti tak, že počítač může manipulovat s nimi 895 00:56:45,700 --> 00:56:47,540 a realizovat rychleji. 896 00:56:47,540 --> 00:56:50,880 Takže inicializované údaje a neinicializované dat, nebudeme moc mluvit o těch, 897 00:56:50,880 --> 00:56:52,420 ale ty jsou jen globální proměnné. 898 00:56:52,420 --> 00:56:54,710 Inicializováno znamená globální proměnné, které jste zadali hodnoty; 899 00:56:54,710 --> 00:56:59,300 neinicializované znamená globální proměnné, které jste dosud dávají hodnoty. 900 00:56:59,300 --> 00:57:01,900 Pak je tu tyto proměnné prostředí, které budu úplně vlnu ruku na, 901 00:57:01,900 --> 00:57:04,860 ale jsou tam, a že ukládá věci jako uživatelské jméno 902 00:57:04,860 --> 00:57:08,090 a jiný druh na nižší úrovni detailů. 903 00:57:08,090 --> 00:57:12,880 Ale Nejšťavnatější kusy z paměťové tyto rozložení je to, čemu se říká stack a haldy. 904 00:57:12,880 --> 00:57:17,470 Stack znovu, aby bylo jasno, je paměť, která se používá vždy, když jsou volány funkce, 905 00:57:17,470 --> 00:57:19,710 pokud existují místní proměnné 906 00:57:19,710 --> 00:57:22,120 a pokud jsou parametry, které prošel kolem. 907 00:57:22,120 --> 00:57:24,490 To vše se děje v zásobníku. 908 00:57:24,490 --> 00:57:29,570 Haldy jsme nemluvili o tom, ale hádat, kdo používá haldy. 909 00:57:31,120 --> 00:57:32,690 Jen jiný kus paměti. 910 00:57:32,690 --> 00:57:36,620 Stává se to být vypracovány zde nahoře, ale to je arbitrární obrazové konvence. 911 00:57:36,620 --> 00:57:41,670 Kdo je zřejmě používá paměť z haldy týdny? 912 00:57:41,670 --> 00:57:44,830 Je to technicky vy, ale nepřímo. >> [Student] GetString. 913 00:57:44,830 --> 00:57:47,950 GetString a malloc. Tak tady je zásadní rozdíl. 914 00:57:47,950 --> 00:57:51,300 >> Víte, za posledních pár týdnů, že pokud budete potřebovat paměť, stačí deklarovat proměnnou. 915 00:57:51,300 --> 00:57:54,560 Pokud potřebujete hodně paměti, deklarovat pole přímo uvnitř vašeho funkce. 916 00:57:54,560 --> 00:57:59,620 Ale problém jsme stále čelí, je, pokud jste deklarovat proměnné lokálně uvnitř funkcí, 917 00:57:59,620 --> 00:58:05,340 jakmile se funkce vrátí, co se stane do paměti a ty proměnné? 918 00:58:05,340 --> 00:58:09,620 Jen trochu z toho je již tvoje, že jo? Je to prostě zmizí druh koncepčně. 919 00:58:09,620 --> 00:58:13,950 Je to ještě fyzicky tam, samozřejmě, ale to je už ne vaše právo na používání. 920 00:58:13,950 --> 00:58:17,160 To je samozřejmě problematické, pokud chcete psát funkce v životě 921 00:58:17,160 --> 00:58:20,440 že skutečně alokovat paměť a nedávají ji zpět okamžitě. 922 00:58:20,440 --> 00:58:24,180 Věc v bodě: GetString tyto účel v životě je mít tušení předem 923 00:58:24,180 --> 00:58:26,390 jak velký řetězec budu psát na klávesnici, 924 00:58:26,390 --> 00:58:30,390 ale to musí být schopen alokovat paměť držet Davida nebo Hello 925 00:58:30,390 --> 00:58:32,860 nebo celé esej, který uživatel může zadali dovnitř 926 00:58:32,860 --> 00:58:35,280 Takže GetString byl pomocí malloc. 927 00:58:35,280 --> 00:58:38,910 Malloc proto musí používat ne stoh; 928 00:58:38,910 --> 00:58:40,770 místo toho se pomocí tohoto věc s názvem haldy. 929 00:58:40,770 --> 00:58:44,430 Na tom není nic jiného na paměti. Není to rychlejší nebo pomalejší, nebo něco podobného. 930 00:58:44,430 --> 00:58:46,570 Je to jen fyzicky na jiném místě. 931 00:58:46,570 --> 00:58:50,120 >> Ale pravidlo je, že paměť, která je na haldě 932 00:58:50,120 --> 00:58:56,180 nebude nikdy odňato, dokud nezavoláte - hádat - zdarma. 933 00:58:56,180 --> 00:59:00,510 Naopak, každý paměť můžete požádat o na stacku jen deklarovat pole 934 00:59:00,510 --> 00:59:03,320 nebo deklarování proměnné, jako jsme to dělali několik týdnů, 935 00:59:03,320 --> 00:59:05,640 že ve výchozím nastavení skončí na zásobníku. 936 00:59:05,640 --> 00:59:09,550 A to funguje velké 90% času, ale na těch vzácnějších případech 937 00:59:09,550 --> 00:59:12,470 , kde chcete alokovat paměť a udržovat ji kolem, 938 00:59:12,470 --> 00:59:14,730 pak budete muset použít funkci jako malloc. 939 00:59:14,730 --> 00:59:19,370 Nebo jsme používali funkci jako GetString, což používá malloc. 940 00:59:19,370 --> 00:59:23,300 Pojďme se podívat, kde by to mohlo zlomit dolů a pak se podívat na Binkym. 941 00:59:23,300 --> 00:59:25,820 Vrátíme se k tomu v budoucnu. 942 00:59:25,820 --> 00:59:29,270 Zde je super jednoduchý program, který v prvních 2 řádky co dělá? 943 00:59:29,270 --> 00:59:33,460 V angličtině, co tyto první 2 řádky kódu provádějí uvnitř main? 944 00:59:33,460 --> 00:59:35,600 [Neslyšitelné Student odpověď] 945 00:59:35,600 --> 00:59:37,880 Opatrně. To mi nedává adresu X nebo Y. 946 00:59:37,880 --> 00:59:41,840 [Student] dává odkazy na ints. Dobrý >>. Dejte mi 2 ukazatele na celá čísla. 947 00:59:41,840 --> 00:59:45,130 Jinými slovy, dej mi 2 kusy paměti, že jsem udržují výkres dnes, 948 00:59:45,130 --> 00:59:46,950 i když jsem vymazal to teď, jako čtverce. 949 00:59:46,950 --> 00:59:50,000 Dejte mi 2 kusy paměti, jeden s názvem x, jeden volal y - 950 00:59:50,000 --> 00:59:54,320 dříve jsem jim s a t - a co je typ tohoto kusu paměti? 951 00:59:54,320 --> 00:59:57,160 Bude to uložit 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 nakonec žít v x, 954 01:00:01,630 --> 01:00:03,860 adresa int nakonec žít v y, 955 01:00:03,860 --> 01:00:08,460 ale zpočátku, co je uvnitř x a y? Kdo ví? Popelářské hodnoty. 956 01:00:08,460 --> 01:00:10,180 To nemá nic společného s ukazateli. 957 01:00:10,180 --> 01:00:12,720 Pokud jsme se dát tam něco, kdo ví, co je to vlastně je? 958 01:00:12,720 --> 01:00:18,950 Nyní, x. Co se tu děje? To je legitimní nyní, protože x je ukazatel. Je to int *. 959 01:00:18,950 --> 01:00:21,870 Takže to znamená, že mohu dát do x adresu nějakého kusu paměti. 960 01:00:21,870 --> 01:00:25,120 Co malloc vrátí? Perfect, vrátí adresy, 961 01:00:25,120 --> 01:00:28,510 adresa prvního bajtu v celé kus paměti. 962 01:00:28,510 --> 01:00:31,140 Kolik bytů se tato zdánlivě přidělování, například, v přístroji? 963 01:00:31,140 --> 01:00:33,510 Co je to velikost int? 4. 964 01:00:33,510 --> 01:00:36,600 Pokud si myslíte, že zpět do týdne 1, to není super důležité vždy pamatovat na to, 965 01:00:36,600 --> 01:00:38,870 ale v tomto případě je užitečné vědět, 4 bajty. 966 01:00:38,870 --> 01:00:41,770 Takže tohle je přidělování na haldy 4 bajty 967 01:00:41,770 --> 01:00:46,110 a to se vrací adresu první se mi svévolně. 968 01:00:46,110 --> 01:00:47,700 A teď, co je x dělá? 969 01:00:47,700 --> 01:00:52,200 * X = 42 dělá co? 970 01:00:52,200 --> 01:00:57,150 Pokud v tomto okamžiku v příběhu máme x, který vypadá takto s některými odpadky hodnotou, 971 01:00:57,150 --> 01:01:04,120 To je nyní y s některými odpadky hodnotou, nyní v souladu 3 jsem přidělena 4 bajty. 972 01:01:04,120 --> 01:01:06,950 Tento obrázek v podstatě vypadá takto. 973 01:01:06,950 --> 01:01:12,010 Nebo více specificky, pokud je to libovolná adresa 123, to je to, co náš příběh teď vypadá. 974 01:01:12,010 --> 01:01:23,940 * X = 42 nyní znamená co? To znamená, že jít na adresu 123 a dal číslo 42 tam. 975 01:01:23,940 --> 01:01:26,220 Nepotřebuji k tomu tyto řádky, protože neděláme řetězce. 976 01:01:26,220 --> 01:01:29,480 >> Měl jsem právě napsal takhle, a jen pro demonstraci boží, 977 01:01:29,480 --> 01:01:33,240 42 jako int druh zabírá hodně místa, 4 bajty. 978 01:01:33,240 --> 01:01:35,960 Tak to je to, co se tam stalo, ale je tu problém nyní. 979 01:01:35,960 --> 01:01:40,580 * Y = 13. Co se bude dít tady? 980 01:01:40,580 --> 01:01:46,470 Problém je * y v našem zjednodušeném světě jen znamená, že jít na adresu v y. 981 01:01:46,470 --> 01:01:48,590 Co je v y? Je to nějaký popelářský hodnota. 982 01:01:48,590 --> 01:01:53,150 Takže předpokládejme, že odpad hodnota je 5551212, něco šílené takového. 983 01:01:53,150 --> 01:01:56,750 * Y znamená jít řešit 5551212. 984 01:01:56,750 --> 01:02:00,450 To je jako tady. To neexistuje, například. 985 01:02:00,450 --> 01:02:05,310 Takže * y dostane 13 znamená, že jsem se snaží čerpat 13 zde. To neexistuje. 986 01:02:05,310 --> 01:02:08,790 Jsem překročil segment tabuli. Co získám? 987 01:02:08,790 --> 01:02:14,930 To tajemná zpráva segmentation fault, protože se snažím, aby v paměti 988 01:02:14,930 --> 01:02:19,470 hodnota jako 13 na místě, které neexistuje. 989 01:02:19,470 --> 01:02:23,900 Zbytek programu by mohlo fungovat v pořádku, ale až do té doby to dělá ne. 990 01:02:23,900 --> 01:02:25,350 Takže pojďme se pokusit vyprávět tento příběh. 991 01:02:25,350 --> 01:02:27,830 Vrátíme se k tomu jednou jsme mluvili o hex. 992 01:02:27,830 --> 01:02:30,290 Vraťme se k tomu, a uzavřít s tímto, čemu se říká Binky, 993 01:02:30,290 --> 01:02:33,710 který odvolání je profesorem Stanfordské sedí doma hraje s Claymation, 994 01:02:33,710 --> 01:02:36,380 vyprávět příběh o přesně stejné programu. 995 01:02:36,380 --> 01:02:40,580 Je to jen asi 3 minuty dlouhé. Zde máme Binky. 996 01:02:40,580 --> 01:02:45,030 [Male reproduktor na videu] Ahoj Binky, probudit. Je čas na ukazatel zábavu. 997 01:02:45,030 --> 01:02:50,080 [Binky] Co je to? Další informace o ukazateli? Oh, dobrota! 998 01:02:50,080 --> 01:02:53,700 [Samec reproduktor] No, začít, myslím, že budeme potřebovat pár rad. 999 01:02:53,700 --> 01:02:57,890 >> [Binky] Dobře. Tento kód přiděluje 2 ukazatele, které mohou ukazovat na celá čísla. 1000 01:02:57,890 --> 01:03:02,220 [Samec reproduktor] Dobře. No, vidím 2 ukazatele, ale nezdá se, že se ukázal k ničemu. 1001 01:03:02,220 --> 01:03:05,550 [Binky] To je pravda. Zpočátku, ukazatele neukazují na nic. 1002 01:03:05,550 --> 01:03:09,270 Věci, které směřují k se nazývá pointees, a jejich nastavení je samostatný krok. 1003 01:03:09,270 --> 01:03:12,330 [Samec reproduktor] Oh, dobře, dobře. Věděl jsem, že. V pointees jsou oddělené. 1004 01:03:12,330 --> 01:03:15,630 Ehm, tak jak si přidělit pointee? 1005 01:03:15,630 --> 01:03:21,510 [Binky] Dobře. Tento kód alokuje nový integer pointee, a tato část nastaví x poukázat na to. 1006 01:03:21,510 --> 01:03:23,500 [Samec reproduktor] Hej, to vypadá lépe. 1007 01:03:23,500 --> 01:03:26,030 Tak, aby to něco udělat. >> [Binky] Dobře. 1008 01:03:26,030 --> 01:03:30,300 Budu dereference ukazatele x pro uložení čísla 42 do svého pointee. 1009 01:03:30,300 --> 01:03:34,410 Pro tento trik budu potřebovat svou kouzelnou hůlku z dereferencing. 1010 01:03:34,410 --> 01:03:38,610 [Samec reproduktor] Vaše kouzelná hůlka z dereferencing? To je skvělé. 1011 01:03:38,610 --> 01:03:44,230 [Binky] To je to, co kód vypadá. Já si jen nastavit počet a ... [Praskání zvuku] 1012 01:03:44,230 --> 01:03:46,100 [Samec reproduktor] Hele podívej, tam to jde. 1013 01:03:46,100 --> 01:03:50,990 Tak dělá dereference na X následuje šipka přístup k jeho pointee, 1014 01:03:50,990 --> 01:03:53,230 v tomto případě k uložení 42 tam. 1015 01:03:53,230 --> 01:03:57,630 Ahoj, zkuste jej uložit číslo 13 přes jiné ukazatele, y. 1016 01:03:57,630 --> 01:04:03,250 [Binky] Dobře. Já půjdu sem k y a dostat číslo 13 nastavení 1017 01:04:03,250 --> 01:04:08,360 a pak mít hůlku z dereferencing a jen ... [Bzučení] 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 >> Řekni, Binky, já si nemyslím, že dereferencing y je dobrý nápad 1020 01:04:14,870 --> 01:04:17,880 protože nastavení pointee je samostatný krok 1021 01:04:17,880 --> 01:04:19,850 a já si nemyslím, že jsme kdy udělali. 1022 01:04:19,850 --> 01:04:21,770 [Binky] Hmm, dobrá připomínka. 1023 01:04:21,770 --> 01:04:26,640 [Samec reproduktor] Jo. Jsme přiděleno ukazatel y, ale nikdy jsme nastavit, aby ukazoval na pointee. 1024 01:04:26,640 --> 01:04:28,780 [Binky] Hmm, velmi pozorný. 1025 01:04:28,780 --> 01:04:30,690 [Samec reproduktor] Hej, vypadáš dobře tam, Binky. 1026 01:04:30,690 --> 01:04:34,160 Dokážeš to opravit tak, že y odkazuje na stejný pointee jako x? >> [Binky] Jasně. 1027 01:04:34,160 --> 01:04:37,100 Budu používat svůj kouzelnou hůlku ukazovací práce. 1028 01:04:37,100 --> 01:04:39,070 [Samec reproduktor] je, že bude problém jako dřív? 1029 01:04:39,070 --> 01:04:40,840 [Binky] No, to nedotýká pointees. 1030 01:04:40,840 --> 01:04:44,780 Je to prostě změní jednoho ukazatel ukazovat na stejnou věc jako jiný. [Praskání zvuku] 1031 01:04:44,780 --> 01:04:48,570 [Samec reproduktor] Oh, vidím. Nyní y poukazuje na stejném místě jako x. 1032 01:04:48,570 --> 01:04:51,140 Tak počkat. Nyní y je stanovena. Má pointee. 1033 01:04:51,140 --> 01:04:54,520 Takže si můžete vyzkoušet hůlku z dereferencing znovu poslat 13 OVER. 1034 01:04:54,520 --> 01:04:58,130 [Binky] Uh, jo. Tady jde. [Praskání zvuku] 1035 01:04:58,130 --> 01:05:01,250 [Samec reproduktor] Hele, podívej se na to. Nyní dereferencing práce na y. 1036 01:05:01,250 --> 01:05:05,200 A protože ukazatele jsou nelegální, že jeden pointee, oba viz 13. 1037 01:05:05,200 --> 01:05:06,910 [Binky] Jo, sdílení. Cokoliv. 1038 01:05:06,910 --> 01:05:08,880 >> Takže se budeme přepínat místa teď? 1039 01:05:08,880 --> 01:05:11,420 [Samec reproduktor] Oh look, jsme mimo čas. >> [Binky] Ale - 1040 01:05:11,420 --> 01:05:13,880 [Samec reproduktor] Jen si vzpomeňte na 3 ukazatele pravidla. 1041 01:05:13,880 --> 01:05:18,630 Číslo 1, základní struktura je, že máte ukazatel, a to ukazuje na na pointee. 1042 01:05:18,630 --> 01:05:23,120 Ale ukazatel a pointee jsou oddělené, a Častou chybou je nastavit ukazatel 1043 01:05:23,120 --> 01:05:25,680 ale zapomněl dát jí pointee. 1044 01:05:25,680 --> 01:05:29,580 Číslo 2, ukazatel dereferencing začíná u ukazatele a sleduje šipku přes 1045 01:05:29,580 --> 01:05:31,060 přístup k jeho pointee. 1046 01:05:31,060 --> 01:05:34,340 Jak všichni víme, to funguje pouze v případě, že je pointee, 1047 01:05:34,340 --> 01:05:36,460 jaký druh se vrací do Pravidlo číslo 1. 1048 01:05:36,460 --> 01:05:39,870 Číslo 3, ukazatel přiřazení vezme jeden ukazatel a změní ji 1049 01:05:39,870 --> 01:05:42,390 poukázat na stejné pointee jako jiný ukazatel. 1050 01:05:42,390 --> 01:05:45,890 Takže po zadání, budou tyto 2 ukazatele ukazovat na stejnou pointee. 1051 01:05:45,890 --> 01:05:47,800 Někdy tomu se říká sdílení. 1052 01:05:47,800 --> 01:05:50,910 >> A to je vše, co k ní opravdu. Bye-bye teď. 1053 01:05:50,910 --> 01:05:55,840 To je Binky. To je CS50. Uvidíme se příští týden. [Potlesk] 1054 01:05:55,840 --> 01:05:59,000 >> [CS50.TV]