1 00:00:00,000 --> 00:00:01,110 >> [Přehrávání hudby] 2 00:00:01,110 --> 00:00:10,567 3 00:00:10,567 --> 00:00:11,650 David J. Malan: Dobře. 4 00:00:11,650 --> 00:00:15,610 To je CS50, a to je na konci týdne čtyři. 5 00:00:15,610 --> 00:00:19,420 A jedním z témat dnešní je, že digitální forenzní, 6 00:00:19,420 --> 00:00:20,989 umění obnovovat informace. 7 00:00:20,989 --> 00:00:22,780 A skutečně, i když jste ve středu 8 00:00:22,780 --> 00:00:25,070 teď míru na třech a Breakout, příští týden, 9 00:00:25,070 --> 00:00:27,880 Důraz bude kladen na Právě tato doména. 10 00:00:27,880 --> 00:00:30,686 >> Takže jeden z nejlepších míst, co jsem kdy měl, byl zpátky v postgraduálním studiu, 11 00:00:30,686 --> 00:00:33,560 když jsem pracoval pro místní Middlesex County okresní prokurátor je 12 00:00:33,560 --> 00:00:34,950 kancelář, dělá forenzní práce. 13 00:00:34,950 --> 00:00:37,450 Takže v podstatě, Massachusetts Státní policie, příležitostně, 14 00:00:37,450 --> 00:00:40,100 Při práci na případech by přinést věci, jako jsou pevné disky 15 00:00:40,100 --> 00:00:42,185 a diskety a paměťové karty a podobně. 16 00:00:42,185 --> 00:00:44,060 A oni by jim ruce mně a mým učitelem, 17 00:00:44,060 --> 00:00:48,070 a naším cílem bylo najít důkazy, v případě, že se některý, na těchto médiích. 18 00:00:48,070 --> 00:00:50,700 Nyní, možná jste viděli záblesky z tohoto světa forenzní 19 00:00:50,700 --> 00:00:53,000 v médiích, TV a filmy. 20 00:00:53,000 --> 00:00:55,730 Ale práce, kterou jsem měl, a Troufám si tvrdit, že svět, 21 00:00:55,730 --> 00:00:57,550 není tak docela, jako byste ho vidět. 22 00:00:57,550 --> 00:01:00,794 Pojďme se podívat na to, co pravděpodobně jste viděli. 23 00:01:00,794 --> 00:01:01,460 [PŘEHRÁVÁNÍ] 24 00:01:01,460 --> 00:01:02,930 -OK. 25 00:01:02,930 --> 00:01:05,380 Nyní pojďme dobré podívat se na vás. 26 00:01:05,380 --> 00:01:06,850 >> [Přehrávání hudby] 27 00:01:06,850 --> 00:01:12,260 28 00:01:12,260 --> 00:01:12,932 >> Vydrž to. 29 00:01:12,932 --> 00:01:13,657 Spustit to zpátky. 30 00:01:13,657 --> 00:01:14,733 >> -Počkejte Minutu. 31 00:01:14,733 --> 00:01:15,233 Jděte vpravo. 32 00:01:15,233 --> 00:01:16,371 33 00:01:16,371 --> 00:01:16,870 -Tady. 34 00:01:16,870 --> 00:01:17,369 Freeze to. 35 00:01:17,369 --> 00:01:17,930 -Full Obrazovkou. 36 00:01:17,930 --> 00:01:18,376 >> -OK. 37 00:01:18,376 --> 00:01:18,875 Freeze to. 38 00:01:18,875 --> 00:01:20,160 Utáhnout se na to, že jo? 39 00:01:20,160 --> 00:01:22,126 >> -vector V na to člověk od zadního kola. 40 00:01:22,126 --> 00:01:24,435 >> -zvětšení Tady na tomto místě. 41 00:01:24,435 --> 00:01:28,580 >> -s Pravé zařízení, Obraz lze zvětšit a brousit. 42 00:01:28,580 --> 00:01:29,330 >> Co je to? 43 00:01:29,330 --> 00:01:30,780 >> -To Vylepšení programu. 44 00:01:30,780 --> 00:01:32,170 >> Umíš jasné, že se nějaké? 45 00:01:32,170 --> 00:01:33,070 >> Já nevím. 46 00:01:33,070 --> 00:01:34,150 Pojďme zvýšení. 47 00:01:34,150 --> 00:01:35,440 >> -Enhance § A6. 48 00:01:35,440 --> 00:01:36,570 49 00:01:36,570 --> 00:01:38,562 Zvýšila jsem detail, a-- 50 00:01:38,562 --> 00:01:40,020 Já myslím, že je dost zlepšit. 51 00:01:40,020 --> 00:01:40,976 Uvolněte jej na mé obrazovce. 52 00:01:40,976 --> 00:01:42,559 >> Já lepší odraz v očích. 53 00:01:42,559 --> 00:01:44,322 Nech to běžet tak prostřednictvím Vylepšení videa. 54 00:01:44,322 --> 00:01:45,210 >> -Edgar, Můžete zlepšit to? 55 00:01:45,210 --> 00:01:45,710 >> -Hang Na. 56 00:01:45,710 --> 00:01:47,570 57 00:01:47,570 --> 00:01:49,458 >> -Byl Jsem pracoval na této úvahy. 58 00:01:49,458 --> 00:01:50,402 >> -Je Něčí odraz. 59 00:01:50,402 --> 00:01:50,902 >> -Reflection. 60 00:01:50,902 --> 00:01:52,870 -Je Odraz obličeje. 61 00:01:52,870 --> 00:01:53,694 >> -The Reflexe! 62 00:01:53,694 --> 00:01:54,610 -Je Odraz. 63 00:01:54,610 --> 00:01:55,880 -zvětšení Na zrcadlo. 64 00:01:55,880 --> 00:01:57,860 Můžete vidět odraz. 65 00:01:57,860 --> 00:01:59,630 >> Umíš zlepšit obraz odsud? 66 00:01:59,630 --> 00:02:00,377 67 00:02:00,377 --> 00:02:01,210 Umíš to zlepšit? 68 00:02:01,210 --> 00:02:02,190 Umíš to zlepšit? 69 00:02:02,190 --> 00:02:03,066 -Můžeme Zlepšit to? 70 00:02:03,066 --> 00:02:03,898 Umíš to zlepšit? 71 00:02:03,898 --> 00:02:04,740 Vydrž chvilku. 72 00:02:04,740 --> 00:02:05,281 Budu zvýšit. 73 00:02:05,281 --> 00:02:06,470 -zvětšení Na dveře. 74 00:02:06,470 --> 00:02:06,970 -krát 10. 75 00:02:06,970 --> 00:02:08,009 -zoom. 76 00:02:08,009 --> 00:02:08,509 -Move V. 77 00:02:08,509 --> 00:02:09,340 Víc. 78 00:02:09,340 --> 00:02:10,094 Počkat, zastavit. 79 00:02:10,094 --> 00:02:10,750 Přestaň. 80 00:02:10,750 --> 00:02:11,250 -Pause To. 81 00:02:11,250 --> 00:02:13,542 -Rotate Nás 75 stupňů kolem vertikální, prosím. 82 00:02:13,542 --> 00:02:14,750 83 00:02:14,750 --> 00:02:16,127 >> Přestaň. 84 00:02:16,127 --> 00:02:19,330 Vraťte se do části o dveřím. 85 00:02:19,330 --> 00:02:21,420 >> Rozumím obrazový zesilovač, který může rastrový obrázek? 86 00:02:21,420 --> 00:02:24,420 >> -Možná Můžeme použít Pradeep Singh způsob, jak vidět do oken. 87 00:02:24,420 --> 00:02:25,902 >> -The Software je nejmodernější. 88 00:02:25,902 --> 00:02:26,866 >> -The Vlastní číslo je vypnutý. 89 00:02:26,866 --> 00:02:29,758 >> -S Doprava Kombinace algorithms-- 90 00:02:29,758 --> 00:02:32,168 >> -Je Přijatá na osvětlení algoritmy na další úroveň, 91 00:02:32,168 --> 00:02:34,110 a mohu je použít k zvýšit tuto fotografii. 92 00:02:34,110 --> 00:02:36,840 >> -Lock Dál a rozšířit osy z. 93 00:02:36,840 --> 00:02:37,351 >> -Enhance. 94 00:02:37,351 --> 00:02:37,850 Vylepšit. 95 00:02:37,850 --> 00:02:38,720 -Enhance. 96 00:02:38,720 --> 00:02:40,070 -Freeze A vylepšit. 97 00:02:40,070 --> 00:02:43,420 [END VIDEOPŘEHRÁVÁNÍ] 98 00:02:43,420 --> 00:02:45,830 David J. Malan: Tak to jsou všechna slova, ale nebyly 99 00:02:45,830 --> 00:02:47,870 používá ve větách správně. 100 00:02:47,870 --> 00:02:52,370 A skutečně v budoucnu, kdykoliv, prosím, uslyšíte někoho říkat slovo, 101 00:02:52,370 --> 00:02:54,250 "Posílit," zasmál jen trochu. 102 00:02:54,250 --> 00:02:57,190 Vzhledem k tomu, když se pokusíte zvýšit, Například, to je to, co se stane. 103 00:02:57,190 --> 00:02:58,580 >> Tak tady je nádherná fotka. 104 00:02:58,580 --> 00:02:59,720 To je CS50 vlastní Daven. 105 00:02:59,720 --> 00:03:03,740 A předpokládám, že bychom chtěli zaměřit na jiskrou v oku, 106 00:03:03,740 --> 00:03:05,870 nebo odraz špatný chlap, který byl jasně 107 00:03:05,870 --> 00:03:07,820 zachycen bezpečnostní kamerou. 108 00:03:07,820 --> 00:03:10,330 To je to, co se stane, když můžete přiblížit na obrazu, který 109 00:03:10,330 --> 00:03:14,060 má pouze konečný počet bitů, s ním spojené. 110 00:03:14,060 --> 00:03:15,420 >> To je to, co byste si. 111 00:03:15,420 --> 00:03:19,190 A skutečně, v Daven oka je ale čtyři, možná šest bodů 112 00:03:19,190 --> 00:03:22,110 že skládat přesně to, co tam mihotají. 113 00:03:22,110 --> 00:03:25,890 Takže problém Set Four bude mít v konečném důsledku prozkoumat tento svět, a to zejména 114 00:03:25,890 --> 00:03:28,090 podle povahy něco nazýváme soubor I / O, kde 115 00:03:28,090 --> 00:03:31,000 I / O je jen ozdobný způsob, jak říká, vstup a výstup. 116 00:03:31,000 --> 00:03:34,280 >> Takže dosud, všechny interakce jsme měli s počítačem 117 00:03:34,280 --> 00:03:36,770 byly do značné míry s vaším klávesnice a displej, 118 00:03:36,770 --> 00:03:40,770 ale ne tolik, s pevným diskem, nebo ukládání souborů mimo ty, které 119 00:03:40,770 --> 00:03:41,620 sami napsat. 120 00:03:41,620 --> 00:03:44,570 Vaše programy tak daleko mají není vytváření a ukládání, 121 00:03:44,570 --> 00:03:46,270 a aktualizovat své vlastní soubory. 122 00:03:46,270 --> 00:03:47,150 >> No, co je to soubor? 123 00:03:47,150 --> 00:03:48,105 No, něco jako JPEG. 124 00:03:48,105 --> 00:03:50,520 To je obrázek, který by mohl mají nebo nahrát na Facebook, 125 00:03:50,520 --> 00:03:51,690 nebo vidět nikde na webu. 126 00:03:51,690 --> 00:03:54,460 Ve skutečnosti, že fotografie jsme právě pila Daven byl JPEG. 127 00:03:54,460 --> 00:03:57,570 A co je zajímavé, o souborů, jako je JPEG 128 00:03:57,570 --> 00:04:02,170 je, že mohou být identifikovány, typicky, určitými vzory bitů. 129 00:04:02,170 --> 00:04:05,200 >> Jinými slovy, to, co je možné, že rozlišuje JPEG z GIF 130 00:04:05,200 --> 00:04:08,109 od PING z Wordu Dokument ze souboru aplikace Excel? 131 00:04:08,109 --> 00:04:09,900 No, je to prostě jiný vzory bitů. 132 00:04:09,900 --> 00:04:12,820 A ty různé vzory obvykle na začátku těchto souborů. 133 00:04:12,820 --> 00:04:18,200 >> Takže když váš počítač otevře Word doc, nebo pokud počítač otevře JPEG, 134 00:04:18,200 --> 00:04:20,940 to vypadá typicky Prvních několik bitů v souboru. 135 00:04:20,940 --> 00:04:24,059 A pokud to uzná vzor, říká, oh, to je obraz. 136 00:04:24,059 --> 00:04:25,850 Dovolte mi, abych ji pro uživatel jako grafiku. 137 00:04:25,850 --> 00:04:27,870 Nebo, oh, tohle vypadá jako Word doc. 138 00:04:27,870 --> 00:04:30,480 Dovolte mi ukázat uživateli jako esej. 139 00:04:30,480 --> 00:04:33,020 >> Tak například, JPEG, Ukazuje se, že jsou 140 00:04:33,020 --> 00:04:35,460 poměrně sofistikované pod kapotou. 141 00:04:35,460 --> 00:04:40,140 Ale první tři bajty nejvíce každý Kdo JPEG s těmito třemi čísly. 142 00:04:40,140 --> 00:04:44,680 Tak bajt nula, jedna, a dvě, v Nejvíce každý JPEG, 255, pak číslo 143 00:04:44,680 --> 00:04:46,675 216, pak číslo 255. 144 00:04:46,675 --> 00:04:48,990 >> A to, co budete moci začít dělat příští týden 145 00:04:48,990 --> 00:04:52,920 je vlastně strkat pod kapuce souborů jako JPEG 146 00:04:52,920 --> 00:04:57,210 a jako bitmapové soubory, a viděl Co je tam vždycky tak dlouho, 147 00:04:57,210 --> 00:04:58,650 jak jste byli pomocí počítače. 148 00:04:58,650 --> 00:05:01,860 >> Ale to, co tam není obvykle psaný jako desetinná čísla, jako je tento. 149 00:05:01,860 --> 00:05:04,620 Počítačoví odborníci ne mají tendenci mluvit v desítkové soustavě. 150 00:05:04,620 --> 00:05:06,139 Oni opravdu mluví v binárním formátu. 151 00:05:06,139 --> 00:05:07,930 Typicky, když chceme vyjádřit čísla, 152 00:05:07,930 --> 00:05:10,710 jsme vlastně používat hexadecimální, které mohou vyvolat 153 00:05:10,710 --> 00:05:13,027 z, řekněme, Problem Set Jeden, který napadal 154 00:05:13,027 --> 00:05:14,610 můžete přemýšlet o jiném systému. 155 00:05:14,610 --> 00:05:17,170 >> My, samozřejmě, jsou obeznámeni s desetinné číslo, nula až devět. 156 00:05:17,170 --> 00:05:18,215 Mluvili jsme o binární. 157 00:05:18,215 --> 00:05:20,710 A my opravdu nemáme používat, že mnoho zde 158 00:05:20,710 --> 00:05:22,470 ven, protože počítače se použít. 159 00:05:22,470 --> 00:05:24,900 Ale programátoři budou velmi často, ale ne vždy, 160 00:05:24,900 --> 00:05:29,360 používat hexadecimální, což prostě znamená, budete mít 16 znaků do abecedy, 161 00:05:29,360 --> 00:05:31,330 na rozdíl od dvou nebo 10. 162 00:05:31,330 --> 00:05:34,530 >> Tak jak se vám počítat do vyšší než devět v hexadecimální soustavě? 163 00:05:34,530 --> 00:05:41,120 Ty jít 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, jen konvencí. 164 00:05:41,120 --> 00:05:43,540 Ale co je klíčové je, že každý z nich je jeden symbol. 165 00:05:43,540 --> 00:05:44,340 Neexistuje žádná 10. 166 00:05:44,340 --> 00:05:48,400 Neexistuje žádná 11, sama o sobě, protože každý vaše číslic, stejně jako v desítkové soustavě 167 00:05:48,400 --> 00:05:51,940 a stejně jako v binární, by jen být jediný znak, konvencí. 168 00:05:51,940 --> 00:05:55,280 >> Tak to je tedy abeceda máme které máme k dispozici na šestnáctkové. 169 00:05:55,280 --> 00:05:58,600 Takže co JPEG vypadat, pokud vás měl vypsat ty první tři 170 00:05:58,600 --> 00:06:01,980 bajty ne jako desetinné ale například jako hexadecimální? 171 00:06:01,980 --> 00:06:03,640 A proč je hex i všechno to užitečné? 172 00:06:03,640 --> 00:06:05,290 >> No, rychlý pohled na příklad. 173 00:06:05,290 --> 00:06:09,030 Takže když jsem se vypsat bity, které představují tyto desetinné numbers-- 174 00:06:09,030 --> 00:06:12,450 to by mohlo být trochu rezavý nyní od několika týdnů zpět 175 00:06:12,450 --> 00:06:14,820 ale levý a pravá jsou docela jednoduché. 176 00:06:14,820 --> 00:06:17,990 255 byl největší počet jsme může představovat s osmi bitů. 177 00:06:17,990 --> 00:06:18,820 Bylo to všechny ty. 178 00:06:18,820 --> 00:06:21,320 Takže jediný, který je mírně Zajímavé je prostřední. 179 00:06:21,320 --> 00:06:24,700 A pokud jste trochu mimo to matematika, budete vyvodit, že skutečně 180 00:06:24,700 --> 00:06:27,949 že vzorek z jednoho a nuly představuje 216. 181 00:06:27,949 --> 00:06:30,240 Takže řekněme, stanoví pro teď, že to je správné. 182 00:06:30,240 --> 00:06:31,730 Ale proč je to zajímavé? 183 00:06:31,730 --> 00:06:33,970 >> No, byte, samozřejmě, je osm bitů. 184 00:06:33,970 --> 00:06:38,980 A ukázalo se, že pokud si myslíte, z bytu jako dva kusy čtyř bitů, 185 00:06:38,980 --> 00:06:39,500 takhle. 186 00:06:39,500 --> 00:06:41,000 Dovolte mi přidat trochu prostoru. 187 00:06:41,000 --> 00:06:42,550 Tak před, po. 188 00:06:42,550 --> 00:06:46,520 Právě jsem přidal nějaké bílé místo Z důvodu zde vizualizaci je. 189 00:06:46,520 --> 00:06:51,840 Jak můžeme nyní představují v, řekněme, hexadecimální každý quad bitů, 190 00:06:51,840 --> 00:06:52,880 každá sada čtyř bitů? 191 00:06:52,880 --> 00:06:56,420 >> Tak například, v levé Nyní máme 1111 v binární. 192 00:06:56,420 --> 00:07:00,420 Co je to číslo v desítkové soustavě, pokud si z matematiky? 193 00:07:00,420 --> 00:07:03,780 Máte ones místo, dvojky místo, místo čtyřky a osmičky místo. 194 00:07:03,780 --> 00:07:04,341 >> Diváků: 15. 195 00:07:04,341 --> 00:07:05,340 David J. Malan: Je to 15. 196 00:07:05,340 --> 00:07:08,340 Takže pokud budeme dělat osm plus čtyři plus dva plus jedna, dostaneme 15. 197 00:07:08,340 --> 00:07:11,790 Takže jsem se mohl zapsat 15 pod 1111, ale celý vtip zde 198 00:07:11,790 --> 00:07:13,190 je hexadecimální, ne desítkové. 199 00:07:13,190 --> 00:07:17,310 Takže místo psaní o 15, 1-5, Chystám se napsat, že v hexadecimálním tvaru, 200 00:07:17,310 --> 00:07:22,311 která, pokud si myslíte, že zpět, pokud máte nula až f, co se 15 bude? 201 00:07:22,311 --> 00:07:22,810 DIVÁKŮ: f. 202 00:07:22,810 --> 00:07:24,434 David J. Malan: Tak to dopadá, že je to f. 203 00:07:24,434 --> 00:07:29,140 A můžete na to přišel tím, že říká, No, jestli je 10, pak OK, f je 15. 204 00:07:29,140 --> 00:07:33,250 Takže ve skutečnosti, můžeme přepsat tento stejný soubor čísel je f. 205 00:07:33,250 --> 00:07:35,750 A pak když to uděláme trochu matematiky, budeme odvodit, že to je d. 206 00:07:35,750 --> 00:07:38,650 Osm je docela snadné, protože jsme mít jeden v místě osmičky. 207 00:07:38,650 --> 00:07:40,620 A pak máme ještě pár f f je. 208 00:07:40,620 --> 00:07:44,669 >> Takže to, co lidé mají tendenci dělat podle konvence při použití v šestnáctkové soustavě je prostě 209 00:07:44,669 --> 00:07:47,710 napsat to trochu stručněji, zbavit většiny z toho prázdného místa. 210 00:07:47,710 --> 00:07:50,890 A jen být super jasné čtenáři, že je v šestnáctkové soustavě, 211 00:07:50,890 --> 00:07:54,670 jednoduché konvence mezi lidé se píšete nula 212 00:07:54,670 --> 00:07:58,000 x, který nemá žádný jiný význam než vizuální identifikátor, 213 00:07:58,000 --> 00:07:59,590 tady je hexadecimální číslo. 214 00:07:59,590 --> 00:08:04,210 >> A pak si dal dvě číslice, f f v tomto případě, pak d, pak f f. 215 00:08:04,210 --> 00:08:06,700 Tak dlouhý příběh krátký, hexadecimální jen inklinuje 216 00:08:06,700 --> 00:08:11,990 , že jsou užitečné, protože každý z jeho číslice, nula až f dokonale linky 217 00:08:11,990 --> 00:08:13,880 až se vzorem čtyř bitů. 218 00:08:13,880 --> 00:08:18,080 >> Takže pokud máte dvě hexadecimální číslice, nula až F, znovu a znovu, 219 00:08:18,080 --> 00:08:20,256 které vám umožní dokonale Osm bitů nebo jeden bajt. 220 00:08:20,256 --> 00:08:22,380 Takže to je důvod, proč má tendenci být konvenčně užitečná. 221 00:08:22,380 --> 00:08:24,990 Není k duševnímu Obsah opravdu za to, 222 00:08:24,990 --> 00:08:27,010 jiný než jeho skutečné užitečnosti. 223 00:08:27,010 --> 00:08:29,310 >> Nyní JPEG nejsou jedinou formáty souborů pro grafiku. 224 00:08:29,310 --> 00:08:33,230 Můžete si připomenout, že existují soubory, jako je to ve světě, 225 00:08:33,230 --> 00:08:34,830 alespoň z pár let zpět. 226 00:08:34,830 --> 00:08:37,580 >> Takže to bylo vlastně nainstalován v systému Windows XP 227 00:08:37,580 --> 00:08:39,960 na milionech počítačů po celém světě. 228 00:08:39,960 --> 00:08:43,000 A to byl soubor bitmapy BMP. 229 00:08:43,000 --> 00:08:47,690 A rastrový soubor, jak uvidíte další týden, jen se rozumí vzorek teček, 230 00:08:47,690 --> 00:08:51,710 pixelů, jak se jim říká, Mapa na kousky, opravdu. 231 00:08:51,710 --> 00:08:55,160 >> Takže to, co je zajímavé, i když, o tomto formátu, BMP, je 232 00:08:55,160 --> 00:08:58,590 že pod kapotou, to má více než jen tři byty 233 00:08:58,590 --> 00:09:01,020 které tvoří jeho záhlaví, takže mluvit, prvních pár soust. 234 00:09:01,020 --> 00:09:03,330 Ve skutečnosti to vypadá trochu složité na první pohled. 235 00:09:03,330 --> 00:09:04,704 A uvidíte to v sadě P. 236 00:09:04,704 --> 00:09:06,810 A jak se něco zejména z toho teď 237 00:09:06,810 --> 00:09:10,720 není tak důležité, jak jen to, že na začátku každé bitmapy 238 00:09:10,720 --> 00:09:13,823 soubor, grafický formát, je tu celá banda čísel. 239 00:09:13,823 --> 00:09:14,980 240 00:09:14,980 --> 00:09:16,720 >> Nyní Microsoft, Autorem tohoto formátu, 241 00:09:16,720 --> 00:09:18,820 tendenci volat těm, Věci, které ints a znaky 242 00:09:18,820 --> 00:09:22,259 , plave na hladině, ale slova a d slova a touží a byty. 243 00:09:22,259 --> 00:09:23,800 Takže jsou to jen různé datové typy. 244 00:09:23,800 --> 00:09:25,170 Jsou různé názvy pro stejnou věc. 245 00:09:25,170 --> 00:09:26,740 Ale uvidíte, že v P stanovila čtyři. 246 00:09:26,740 --> 00:09:31,450 >> To je ale pouze říci, že pokud je člověk poklepe nějaký soubor BMP na jeho 247 00:09:31,450 --> 00:09:35,015 nebo její pevný disk, a otevře se okno se ukazuje mu, že obraz, 248 00:09:35,015 --> 00:09:38,500 co se stalo, protože operační Systém pravděpodobně všimli nejen 249 00:09:38,500 --> 00:09:41,460 rozšíření .BMP v názvu souboru, 250 00:09:41,460 --> 00:09:45,010 ale také skutečnost, že tam je nějaký konvence vzoru bitů 251 00:09:45,010 --> 00:09:47,490 na samém počátku tohoto bitmapového souboru. 252 00:09:47,490 --> 00:09:50,270 >> Ale pojďme se zaměřit na takové složité souboru, 253 00:09:50,270 --> 00:09:52,120 ale na něco takového. 254 00:09:52,120 --> 00:09:55,190 Předpokládám, že tady v gedit, I prostě začátky 255 00:09:55,190 --> 00:09:57,070 programu, který je velmi jednoduchý. 256 00:09:57,070 --> 00:09:58,860 Mám nějaké zahrnuje až nahoru. 257 00:09:58,860 --> 00:10:02,120 Teď mám # include "structs.h", ale Vrátím se k tomu za chvíli. 258 00:10:02,120 --> 00:10:03,974 Ale to je užitečné pro teď. 259 00:10:03,974 --> 00:10:05,890 Tak tohle je program že se to realizovat 260 00:10:05,890 --> 00:10:07,335 jako databáze registrátora. 261 00:10:07,335 --> 00:10:09,710 Takže databáze studentů, a každý student ve světě 262 00:10:09,710 --> 00:10:13,190 má své jméno a dům a pravděpodobně některé další věci, ale budeme držet to jednoduchý. 263 00:10:13,190 --> 00:10:15,140 Každý student má své jméno a domu. 264 00:10:15,140 --> 00:10:17,700 >> Takže když jsem chtěl napsat program, jehož smyslem života 265 00:10:17,700 --> 00:10:19,860 právě iterovat od nulu až na tři, 266 00:10:19,860 --> 00:10:22,070 v případě, že je tři studenty na Harvardově univerzitě. 267 00:10:22,070 --> 00:10:25,350 A chci, aby si pomocí getString, jméno a house každého studenta, 268 00:10:25,350 --> 00:10:26,600 a pak už jen vytisknout ty ven. 269 00:10:26,600 --> 00:10:28,630 >> To je něco jako týdne Jeden, týden Dvě věci teď, 270 00:10:28,630 --> 00:10:30,810 kde chci jen pro smyčka nebo něco takového. 271 00:10:30,810 --> 00:10:34,500 A chci volat getString několik krát, a potom vytiskněte f několikrát. 272 00:10:34,500 --> 00:10:37,340 Tak jak bych mohl udělat, i když, když oba jméno a dům 273 00:10:37,340 --> 00:10:39,070 jsou zapojeny pro každého studenta? 274 00:10:39,070 --> 00:10:42,830 >> Takže můj první instinkt by mohly být něco takového. 275 00:10:42,830 --> 00:10:49,620 Mohl bych nejprve říci, dobře, dej mi, říci, pole řetězců s názvem jména. 276 00:10:49,620 --> 00:10:51,530 A nechci zde napevno tři. 277 00:10:51,530 --> 00:10:53,064 Co chci, aby tam dal? 278 00:10:53,064 --> 00:10:55,730 Takže studenti, protože to je právě konstanta deklarována v horní části, 279 00:10:55,730 --> 00:10:57,860 jen tak nemám natvrdo tři na více místech. 280 00:10:57,860 --> 00:11:00,859 Tímto způsobem, může se mi to změnit na jednom místě, a to má dopad na změnu všude. 281 00:11:00,859 --> 00:11:04,470 A pak, já bych mohl dělat string domy studentů. 282 00:11:04,470 --> 00:11:10,250 >> A teď, mohl bych něco takového for (int i = 0; i 00:11:14,390 Takže jsem psát rychle, ale je to nyní pravděpodobně obeznámeni syntaxe. 284 00:11:14,390 --> 00:11:17,030 >> A teď je to novější. 285 00:11:17,030 --> 00:11:22,890 Pokud chci, aby se v i-tém Jméno studenta, myslím, že jsem to udělat. 286 00:11:22,890 --> 00:11:26,480 A pak, ne jako jména ale domy bracketing i. 287 00:11:26,480 --> 00:11:29,930 Já to udělat, getString, a nechat me se vrátit a opravit tuto linku. 288 00:11:29,930 --> 00:11:30,430 Souhlasíte s tím? 289 00:11:30,430 --> 00:11:31,200 Nesouhlasíte? 290 00:11:31,200 --> 00:11:32,366 Není to jako velmi uživatelsky příjemný. 291 00:11:32,366 --> 00:11:33,890 Neřekl jsem na uživateli, co má dělat. 292 00:11:33,890 --> 00:11:36,520 >> Ale teď, když jsem také chtěl později, pojďme 293 00:11:36,520 --> 00:11:40,060 řekněme, vytiskněte si tyto věci out-- tak TODO později. 294 00:11:40,060 --> 00:11:42,330 Budu dělat více s tohle-- to pravděpodobně znamená 295 00:11:42,330 --> 00:11:45,970 správné provádění získání jména a rodinných domů, tři 296 00:11:45,970 --> 00:11:48,870 z nich celkem každý, od uživatele. 297 00:11:48,870 --> 00:11:51,280 >> Ale to není moc dobrý design, ne? 298 00:11:51,280 --> 00:11:55,220 Co když student nemá jen jméno a dům, ale i identifikační číslo, 299 00:11:55,220 --> 00:11:57,770 a telefonní číslo, a e-mailová adresa, 300 00:11:57,770 --> 00:12:00,280 a možná i domovské stránky, a Možná Twitter rukojeť, 301 00:12:00,280 --> 00:12:03,730 a jakýkoliv počet dalších detailů spojeno s studenta nebo osobu, 302 00:12:03,730 --> 00:12:04,610 obecněji. 303 00:12:04,610 --> 00:12:07,720 Jak by se začneme přidávat Funkce tohoto programu? 304 00:12:07,720 --> 00:12:14,080 >> No, mám pocit, že tím nejjednodušším způsobem by mohl bylo to něco jako, řekněme, 305 00:12:14,080 --> 00:12:16,490 int IDS studentů. 306 00:12:16,490 --> 00:12:18,380 Tak jsem si dal všechny své ID tam. 307 00:12:18,380 --> 00:12:22,240 A pak, o něco jako jsou telefonní čísla, 308 00:12:22,240 --> 00:12:24,400 Nejsem si jistý, jak se Prohlašuji, že ještě ne. 309 00:12:24,400 --> 00:12:30,280 Tak pojďme do toho a jen volání tento twitters studenti, které 310 00:12:30,280 --> 00:12:33,550 Je trochu zvláštní, ale-- a spoustu další pole. 311 00:12:33,550 --> 00:12:36,360 >> Jsem začal efektivně zkopírovat a vložit sem. 312 00:12:36,360 --> 00:12:39,416 A to bude růst hodně nemotorné docela rychle, ne? 313 00:12:39,416 --> 00:12:42,290 Nebylo by hezké, kdyby tam byly ve světě známa struktura dat 314 00:12:42,290 --> 00:12:45,600 ne jako int nebo řetězec, ale něco vyšší úroveň, abstrakce, takže 315 00:12:45,600 --> 00:12:47,570 mluvit, známý jako student? 316 00:12:47,570 --> 00:12:50,220 C nepřišel s vestavěným Funkce pro studenty, 317 00:12:50,220 --> 00:12:52,260 ale co když jsem chtěl dát to jako? 318 00:12:52,260 --> 00:12:55,640 >> No, ukázalo se, budu otevřít soubor s názvem structs.h zde 319 00:12:55,640 --> 00:12:57,090 a můžete to udělat přesně to. 320 00:12:57,090 --> 00:12:58,290 A budeme začít dělat teď. 321 00:12:58,290 --> 00:13:01,490 A pod kapotou P nastavit tři, už jste to dělám teď. 322 00:13:01,490 --> 00:13:05,920 Není tam žádná taková věc jako g obdélníku nebo g ovál v programovacím jazyce C. 323 00:13:05,920 --> 00:13:10,570 >> Lidi v Stanford realizován ty datové typy pomocí tohoto přístupu zde, 324 00:13:10,570 --> 00:13:13,900 deklarovat své vlastní nové údaje typy s použitím nové klíčové slovo 325 00:13:13,900 --> 00:13:16,744 nazývá struct a další jeden s názvem typedef. 326 00:13:16,744 --> 00:13:19,660 A skutečně, i když syntaxe vypadá trochu liší od věcí 327 00:13:19,660 --> 00:13:23,550 jsme viděli dříve, princip, že je to super jednoduché. 328 00:13:23,550 --> 00:13:25,297 >> To prostě znamená, že "definovat typ." 329 00:13:25,297 --> 00:13:27,255 Že to bude Struktura, a struktura 330 00:13:27,255 --> 00:13:29,400 je stejně jako nádoby pro více věcí. 331 00:13:29,400 --> 00:13:31,780 A tato struktura bude mít řetězec s názvem název, 332 00:13:31,780 --> 00:13:33,210 a řetězec s názvem dům. 333 00:13:33,210 --> 00:13:37,520 A řekněme, jen pro pohodlí, Celá tato struktura dat studentem. 334 00:13:37,520 --> 00:13:40,320 >> Takže v okamžiku, kdy se dostanete do středník, máte nyní 335 00:13:40,320 --> 00:13:43,280 vytvořili vlastní údaje Typ názvem Student 336 00:13:43,280 --> 00:13:46,420 , která nyní stojí vedle int, a float a char, a řetězec, 337 00:13:46,420 --> 00:13:50,270 a g rect, a g oválné, a libovolný počet jiných věcí, které lidé vymysleli. 338 00:13:50,270 --> 00:13:53,340 >> Takže to, co je užitečné, o tom Nyní je, že když se vrátím 339 00:13:53,340 --> 00:13:57,430 na struct 0 a dokončit implementace, který jsem napsal 340 00:13:57,430 --> 00:14:02,080 předem tady, všimněte si, že všechny nevyhnutelného nepořádek, který 341 00:14:02,080 --> 00:14:05,490 byl asi na začátku děje, jak jsem přidal telefonní čísla a twitters a všechny 342 00:14:05,490 --> 00:14:07,370 tyto jiné věci Definice studenta, 343 00:14:07,370 --> 00:14:11,810 teď je to stručně shrnula jako jediného pole studentů. 344 00:14:11,810 --> 00:14:15,500 >> A každý z těchto studentů se má více co do ní. 345 00:14:15,500 --> 00:14:16,930 Takže zbývá jen jednu otázku. 346 00:14:16,930 --> 00:14:19,700 Jak se dostanete na jméno, a dům a ID, 347 00:14:19,700 --> 00:14:21,640 a cokoliv dalšího, co je uvnitř studenta? 348 00:14:21,640 --> 00:14:22,930 Super jednoduché, stejně. 349 00:14:22,930 --> 00:14:25,730 Nová syntaxe, ale jednoduchá myšlenka. 350 00:14:25,730 --> 00:14:29,239 >> Jednoduše index do pole, jako jsme to udělali minulý týden, a to. 351 00:14:29,239 --> 00:14:31,030 A co je jasně nový kus syntaxe? 352 00:14:31,030 --> 00:14:32,590 353 00:14:32,590 --> 00:14:35,880 Jen., Což znamená "jít dovnitř Struktura a získat pole s názvem 354 00:14:35,880 --> 00:14:39,030 jméno, se na pole s názvem dům, dostat na pole s názvem studentem. " 355 00:14:39,030 --> 00:14:41,940 >> Takže P nastavit tři, pokud jste stále pracuje na tom, 356 00:14:41,940 --> 00:14:44,020 a většina lidí stále je, si uvědomit, že jako vy 357 00:14:44,020 --> 00:14:46,130 začít používat věci, jako je g rects a g ovály 358 00:14:46,130 --> 00:14:50,201 a další věci, které se nezdají pocházejí z týdne nula, jedna, nebo dvě, 359 00:14:50,201 --> 00:14:52,950 Uvědomuji si, že to je proto, že Stanford prohlásil některé nové datové typy. 360 00:14:52,950 --> 00:14:56,160 >> A vskutku, to je přesně to, co budeme ano, i v P stanovila čtyři, když 361 00:14:56,160 --> 00:14:59,880 začneme se zabývat věcmi jako obrázky, rastrové obrázky a další. 362 00:14:59,880 --> 00:15:02,882 Tak to je jen ukázka a mentální model pro to, co má přijít. 363 00:15:02,882 --> 00:15:04,590 Teď jsem otálel trochu dnes ráno. 364 00:15:04,590 --> 00:15:09,560 Byl jsem docela zvědavý na to, co Microsoft tapeta ve skutečnosti 365 00:15:09,560 --> 00:15:10,310 vypadá dnes. 366 00:15:10,310 --> 00:15:15,200 A ukázalo se, někdo v roce 2006 vlastně šel téměř přesně 367 00:15:15,200 --> 00:15:19,210 na stejném místě na fotografii ve skutečnosti co vypadá jako, že v těchto dnech. 368 00:15:19,210 --> 00:15:21,380 Pole je nyní trochu zarostlé. 369 00:15:21,380 --> 00:15:24,850 >> Takže mluvit teď obrazů, vraťme zpět Daven zde 370 00:15:24,850 --> 00:15:26,890 na obrazovce a Mikuláše, a jen vám připomenout, 371 00:15:26,890 --> 00:15:30,540 , že pokud byste se k nám připojit na oběd tento pátek, vedoucí k naší obvyklé adrese 372 00:15:30,540 --> 00:15:31,440 zde. 373 00:15:31,440 --> 00:15:33,530 >> Tak kde jsme to vypnout v pondělí? 374 00:15:33,530 --> 00:15:35,140 Tento problém jsme zavedli, že jo? 375 00:15:35,140 --> 00:15:37,610 Toto bylo zdánlivě správné realizace odkládací prostor, 376 00:15:37,610 --> 00:15:40,460 kdy berete dvě ints, jeden volal, kdo volal b, 377 00:15:40,460 --> 00:15:44,130 vyměnit je, stejně jako tady udělala Laura na jevišti s mlékem a vodou, 378 00:15:44,130 --> 00:15:46,820 pomocí dočasné proměnná, nebo prázdný šálek, 379 00:15:46,820 --> 00:15:50,540 tak, že bychom mohli dát b do a A v b aniž by nepořádek věcí. 380 00:15:50,540 --> 00:15:51,560 Použili jsme proměnnou. 381 00:15:51,560 --> 00:15:52,870 Říká se tomu tepl. 382 00:15:52,870 --> 00:15:55,520 >> Ale co bylo zásadní Problém s tímto kódem v pondělí? 383 00:15:55,520 --> 00:15:57,700 384 00:15:57,700 --> 00:15:58,870 Co to bylo za problém? 385 00:15:58,870 --> 00:16:00,106 386 00:16:00,106 --> 00:16:00,605 Jo. 387 00:16:00,605 --> 00:16:01,970 >> Diváků: Zabírá více místa. 388 00:16:01,970 --> 00:16:04,719 >> David J. Malan: Zabírá více prostor, protože jsem pomocí proměnné, 389 00:16:04,719 --> 00:16:05,400 a to je v pořádku. 390 00:16:05,400 --> 00:16:07,300 To je pravda, ale já jsem bude říkat, že je to OK. 391 00:16:07,300 --> 00:16:10,030 Je to jen 32 bitů ve velkém schéma věcí, takže není velký problém. 392 00:16:10,030 --> 00:16:10,655 Jiné myšlenky? 393 00:16:10,655 --> 00:16:12,572 Diváků: To jen swapy proměnné lokálně. 394 00:16:12,572 --> 00:16:13,571 David J. Malan: Přesně tak. 395 00:16:13,571 --> 00:16:15,090 Je swapy pouze proměnné lokálně. 396 00:16:15,090 --> 00:16:18,173 Protože pokaždé, když volání function-- když jsem měl zásobníky z Annenberg 397 00:16:18,173 --> 00:16:19,840 naposledy, máte hlavní na dně. 398 00:16:19,840 --> 00:16:23,560 Jakmile zavoláte funkci nazvanou swap swap nevede žádné se X a Y 399 00:16:23,560 --> 00:16:24,400 původní hodnoty. 400 00:16:24,400 --> 00:16:26,392 Co odkládací get, jsme se tvrdí? 401 00:16:26,392 --> 00:16:27,100 Diváků: Kopie. 402 00:16:27,100 --> 00:16:28,090 David J. Malan: Takže jejich kopie. 403 00:16:28,090 --> 00:16:31,120 Takže to bude jedna a dvě, pokud máte připomenout si příklad z poslední doby, 404 00:16:31,120 --> 00:16:34,730 ale kopie jednoho a dvou které jsou úspěšně prohozeny. 405 00:16:34,730 --> 00:16:38,550 Ale bohužel na konci, tyto hodnoty jsou stále stejné. 406 00:16:38,550 --> 00:16:41,880 Takže můžeme vidět s našimi nový přítel, doufejme GDB, 407 00:16:41,880 --> 00:16:45,180 že vy nebo TFS a Ca mají se vám vede k takto. 408 00:16:45,180 --> 00:16:51,210 >> Takže žádná výměna odvolání vypadá jako-- pojďme otevřít tohle-- vypadá takto. 409 00:16:51,210 --> 00:16:54,160 Inicializován jsme x na jedné, y na dva. 410 00:16:54,160 --> 00:16:55,620 Měl spoustu tisku f je. 411 00:16:55,620 --> 00:16:58,080 Ale pak, tlačítka Volat zde byl vyměnit, což 412 00:16:58,080 --> 00:17:00,260 je přesně ten kód jsme právě viděli před chvílí. 413 00:17:00,260 --> 00:17:03,180 Což je správné v první pohled, ale funkčně, 414 00:17:03,180 --> 00:17:06,800 tento program nefunguje, protože není trvale zaměnit x a y. 415 00:17:06,800 --> 00:17:10,190 >> Takže pojďme vidět, rychlého ohřevu sem s GDB, a ./noswap. 416 00:17:10,190 --> 00:17:11,867 417 00:17:11,867 --> 00:17:15,200 Banda ohromující informace, které Budu se zbavit s řídící L teď. 418 00:17:15,200 --> 00:17:17,516 A teď, budu pokračovat a spusťte jej. 419 00:17:17,516 --> 00:17:19,349 A bohužel, že Nebylo to tak užitečné. 420 00:17:19,349 --> 00:17:22,355 To běželo program uvnitř této program s názvem gdb debugger, 421 00:17:22,355 --> 00:17:23,730 ale to mi nedovolí hrabat kolem sebe. 422 00:17:23,730 --> 00:17:26,229 >> Tak jak mohu skutečně pozastavit provedení uvnitř tohoto programu? 423 00:17:26,229 --> 00:17:27,410 424 00:17:27,410 --> 00:17:28,329 Tak zlomit. 425 00:17:28,329 --> 00:17:32,340 A já jsem mohl rozbít na jakýkoliv číslo řádku, jeden, 10, 15. 426 00:17:32,340 --> 00:17:35,530 Ale já si také rozdělit symbolicky tím přerušení main. 427 00:17:35,530 --> 00:17:38,980 A že se to nastavit pauzu bod, zřejmě na řádku 16 v hlavní. 428 00:17:38,980 --> 00:17:40,050 A kde je linka 16? 429 00:17:40,050 --> 00:17:42,960 Pojďme do kódu a jít až na noswap. 430 00:17:42,960 --> 00:17:46,930 A skutečně, řádek 16 je první v programu. 431 00:17:46,930 --> 00:17:52,130 >> Takže teď, když jsem se do toho pusťte a typ spustit tento čas, Enter, je pozastaveno. 432 00:17:52,130 --> 00:17:53,080 Takže pojďme hrabat kolem sebe. 433 00:17:53,080 --> 00:17:55,716 Vytisknout x-- proč je x nula? 434 00:17:55,716 --> 00:17:56,705 435 00:17:56,705 --> 00:17:57,830 A ignorovat znak dolaru. 436 00:17:57,830 --> 00:17:59,725 To je jen pro milovník využití programu. 437 00:17:59,725 --> 00:18:00,780 438 00:18:00,780 --> 00:18:03,140 Proč je x nula v současné době? 439 00:18:03,140 --> 00:18:03,640 Jo. 440 00:18:03,640 --> 00:18:07,061 >> Diváků: Zastavil se těsně před linka 16, ne vlastně on-line 16.. 441 00:18:07,061 --> 00:18:08,060 David J. Malan: Přesně tak. 442 00:18:08,060 --> 00:18:11,630 GDB, ve výchozím nastavení se odmlčel provedení těsně před potrubím 16. 443 00:18:11,630 --> 00:18:14,820 Takže to nebyl vykonán, které znamená, x je nějaké neznámé hodnoty. 444 00:18:14,820 --> 00:18:17,150 A měli jsme štěstí, že je něco čisté jako nula. 445 00:18:17,150 --> 00:18:20,310 Takže teď, když jsem psát další, teď je proveden 16. 446 00:18:20,310 --> 00:18:22,000 Čeká na mě vykonat 17. 447 00:18:22,000 --> 00:18:23,400 Nech mě jít napřed a tisk x. 448 00:18:23,400 --> 00:18:24,094 Je to jedna. 449 00:18:24,094 --> 00:18:25,260 Nech mě jít napřed a tisk y. 450 00:18:25,260 --> 00:18:26,176 Co bych měl teď vidět? 451 00:18:26,176 --> 00:18:27,660 452 00:18:27,660 --> 00:18:28,560 >> Diváků: [neslyšitelné] 453 00:18:28,560 --> 00:18:29,165 >> David J. Malan: trochu hlasitěji. 454 00:18:29,165 --> 00:18:30,040 >> Diváků: [neslyšitelné] 455 00:18:30,040 --> 00:18:30,537 456 00:18:30,537 --> 00:18:32,120 David J. Malan: Ne tak docela shoda. 457 00:18:32,120 --> 00:18:34,760 Takže ano, vidíme nějaké odpadky hodnotu. 458 00:18:34,760 --> 00:18:37,862 Nyní, y je 134514064 zde. 459 00:18:37,862 --> 00:18:39,320 No, je to jen nějaký odpad hodnota. 460 00:18:39,320 --> 00:18:41,350 Můj program používá RAM pro různé účely. 461 00:18:41,350 --> 00:18:42,350 Je tu další funkce. 462 00:18:42,350 --> 00:18:44,040 Ostatní lidé psali v mém počítači. 463 00:18:44,040 --> 00:18:46,789 Takže tyto bity jsou použity pro jiné hodnoty, a to, co jsem viděl 464 00:18:46,789 --> 00:18:49,470 Je zbytky některých Před použití této paměti. 465 00:18:49,470 --> 00:18:53,350 >> Takže žádný velký problém, protože jakmile jak píšu další a pak vytisknout y, 466 00:18:53,350 --> 00:18:55,640 to je inicializován hodnota, kterou chci. 467 00:18:55,640 --> 00:18:57,400 Takže teď, pojďme do toho trochu rychleji. 468 00:18:57,400 --> 00:18:58,540 N pro další. 469 00:18:58,540 --> 00:18:59,570 Udělejme to znovu. 470 00:18:59,570 --> 00:19:00,530 Udělejme to znovu. 471 00:19:00,530 --> 00:19:02,404 Ale já nechci hit je to tady, protože když jsem 472 00:19:02,404 --> 00:19:05,110 chcete vidět, co se děje uvnitř swap, co je příkaz? 473 00:19:05,110 --> 00:19:05,520 >> DIVÁKŮ: kroky. 474 00:19:05,520 --> 00:19:06,436 >> David J. Malan: kroky. 475 00:19:06,436 --> 00:19:09,800 Tak tohle mě vstoupí do funkce, spíše než nad ním. 476 00:19:09,800 --> 00:19:12,270 A teď je to trochu záhadný upřímně, ale to je jen 477 00:19:12,270 --> 00:19:14,581 říkal mi, že jsem v řadě 33 teď. 478 00:19:14,581 --> 00:19:15,580 A jdeme na to znovu. 479 00:19:15,580 --> 00:19:16,080 Print temp. 480 00:19:16,080 --> 00:19:17,129 481 00:19:17,129 --> 00:19:20,170 Garbage hodnota, negativní tentokrát ale to je jen stále hodnota odpadky. 482 00:19:20,170 --> 00:19:22,810 Tak pojďme dál, tisku tepl. 483 00:19:22,810 --> 00:19:27,130 Je inicializován na hodnotu 1, což byla hodnota x, aka. 484 00:19:27,130 --> 00:19:29,110 >> A teď, kde jsou naše a X přichází? 485 00:19:29,110 --> 00:19:32,510 Dobře si všimněte, v hlavní, my volal Tyto hodnoty x a y. 486 00:19:32,510 --> 00:19:34,740 Pak jsme kolem nich vyměnit takto. 487 00:19:34,740 --> 00:19:37,010 X přišel první, čárka y. 488 00:19:37,010 --> 00:19:40,020 A pak, swap by jim zavolat x a y. 489 00:19:40,020 --> 00:19:42,630 Ale pro přehlednost je to volat je a, b. 490 00:19:42,630 --> 00:19:45,970 Ale a a b jsou nyní bude kopie x a y, resp. 491 00:19:45,970 --> 00:19:50,660 >> Takže když jsem se vrátit do GDB, temp je nyní jednou a je nyní jedním. 492 00:19:50,660 --> 00:19:56,130 Ale když to udělám další a teď si tisk , již přešel. 493 00:19:56,130 --> 00:20:00,030 Mléko se nalije do bývalé Pomerančová šťáva je sklo, nebo naopak. 494 00:20:00,030 --> 00:20:04,750 >> A když to udělám další zase, a teď když jsem vytisknout jako kontrola sanity, 495 00:20:04,750 --> 00:20:07,687 je ještě dva, ale b je nyní jedna. 496 00:20:07,687 --> 00:20:08,770 Upřímně řečeno, je to tam pořád. 497 00:20:08,770 --> 00:20:10,670 Nezajímá mě, co je teplota. 498 00:20:10,670 --> 00:20:16,850 Ale jakmile jsem se psát, řekněme, pokračovat se vrátit, teď jsem na konci 499 00:20:16,850 --> 00:20:17,480 Program. 500 00:20:17,480 --> 00:20:20,730 A bohužel, x je ještě jednou a y je ještě dva. 501 00:20:20,730 --> 00:20:22,272 >> Takže to, co bylo užitečnost GDB tam? 502 00:20:22,272 --> 00:20:23,980 Nebylo mi pomohl opravit problém sám o sobě, 503 00:20:23,980 --> 00:20:26,265 ale to mi snad pomůže pochopit realizací 504 00:20:26,265 --> 00:20:30,000 že ano, moje logika je v pořádku, ale můj kód není konečném stadiu 505 00:20:30,000 --> 00:20:31,450 trvalý vliv. 506 00:20:31,450 --> 00:20:34,570 Tak to je problém, že jsme bude nyní řešit dnes. 507 00:20:34,570 --> 00:20:37,870 >> Ale pojďme se tam dostat pomocí tohoto. 508 00:20:37,870 --> 00:20:39,230 String je lež. 509 00:20:39,230 --> 00:20:41,860 To také není datový typ která existuje v C. Je to 510 00:20:41,860 --> 00:20:44,750 Byl synonymem pro některé čas na něco jiného, 511 00:20:44,750 --> 00:20:47,300 a můžeme prozradit, že takto. 512 00:20:47,300 --> 00:20:53,282 >> Nech mě jít napřed a otevřít program s názvem compare-0. 513 00:20:53,282 --> 00:20:56,240 A spíše než psát tenhle ven, začneme projít kódu 514 00:20:56,240 --> 00:20:58,040 Už jsem psal, ale Je to jen pár řádků. 515 00:20:58,040 --> 00:20:59,570 To je tak porovnat-0. 516 00:20:59,570 --> 00:21:02,380 A první věc, kterou dělám je stále řádek textu. 517 00:21:02,380 --> 00:21:05,610 >> Ale všimněte, co jsem dělá poprvé. 518 00:21:05,610 --> 00:21:07,910 Jaký je rozdíl jasně o řádku 21? 519 00:21:07,910 --> 00:21:10,020 520 00:21:10,020 --> 00:21:11,402 Vlastně počkej. 521 00:21:11,402 --> 00:21:12,110 Toto je kopie dvou. 522 00:21:12,110 --> 00:21:13,568 To není ani ten správný program. 523 00:21:13,568 --> 00:21:14,780 Tak jo, spoiler. 524 00:21:14,780 --> 00:21:16,890 Dobře, takže to nevadí. 525 00:21:16,890 --> 00:21:18,520 To je odpověď na otázku budoucnosti. 526 00:21:18,520 --> 00:21:21,450 >> Zde je porovnání-0, a já jsem asi dostat řádek textu. 527 00:21:21,450 --> 00:21:22,435 Program je mnohem jednodušší. 528 00:21:22,435 --> 00:21:23,560 Tak to je jednoduché. 529 00:21:23,560 --> 00:21:28,070 To je jako první týden, týden Dvě věci v současné době. řetězci s = GetString. 530 00:21:28,070 --> 00:21:29,700 Teď jsem to znovu tady. 531 00:21:29,700 --> 00:21:31,830 string t = GetString. 532 00:21:31,830 --> 00:21:35,300 A pak poslední věc, kterou v tomto programu, jak již název napovídá, 533 00:21:35,300 --> 00:21:37,090 se budu snažit, aby jejich porovnání. 534 00:21:37,090 --> 00:21:40,709 >> Takže pokud s první řetězec, rovná se = T, pak jsem 535 00:21:40,709 --> 00:21:42,250 chtěl říct, zadejte totéž. 536 00:21:42,250 --> 00:21:44,291 Jinak, já jsem chtěl říct píšete něco jiného. 537 00:21:44,291 --> 00:21:45,880 Takže pojďme sestavit a spustit tento program. 538 00:21:45,880 --> 00:21:48,481 Takže si porovnat nulu. 539 00:21:48,481 --> 00:21:48,980 Vypadá to dobře. 540 00:21:48,980 --> 00:21:50,490 Žádné chyby kompilace. 541 00:21:50,490 --> 00:21:52,386 >> Nech mě jít napřed teď a zadejte ./compare-0. 542 00:21:52,386 --> 00:21:55,230 543 00:21:55,230 --> 00:21:59,220 Nech mě jít napřed a něco říct : Daven a něco: Rob. 544 00:21:59,220 --> 00:22:00,450 A píšu různé věci. 545 00:22:00,450 --> 00:22:01,250 Tak daleko, tak dobrý. 546 00:22:01,250 --> 00:22:02,680 Program se zdá být v pořádku. 547 00:22:02,680 --> 00:22:03,880 >> Ale pojďme jej spustit znovu. 548 00:22:03,880 --> 00:22:05,800 Řekni něco: Gabe. 549 00:22:05,800 --> 00:22:07,140 Řekni něco: Gabe. 550 00:22:07,140 --> 00:22:08,520 551 00:22:08,520 --> 00:22:09,020 V pořádku. 552 00:22:09,020 --> 00:22:10,851 Možná, že jsem narazila mezerník nebo něco funky. 553 00:22:10,851 --> 00:22:11,600 Udělejme to znovu. 554 00:22:11,600 --> 00:22:13,020 Tak Zamyla. 555 00:22:13,020 --> 00:22:13,970 556 00:22:13,970 --> 00:22:14,470 Zamyla. 557 00:22:14,470 --> 00:22:15,740 558 00:22:15,740 --> 00:22:17,330 Různé věci. 559 00:22:17,330 --> 00:22:19,430 Takže to, co se děje? 560 00:22:19,430 --> 00:22:23,200 >> Takže máme tyto dva řádky kód, GetString volána dvakrát. 561 00:22:23,200 --> 00:22:25,760 A pak, já jsem prostě snaží se porovnat s a t. 562 00:22:25,760 --> 00:22:28,370 Ale to, co opravdu pak se to děje? 563 00:22:28,370 --> 00:22:31,180 No, můj rukopis je asi řezník tento příklad poněkud. 564 00:22:31,180 --> 00:22:34,630 A pojďme skutečně hodit to se sem, stejně. 565 00:22:34,630 --> 00:22:37,390 566 00:22:37,390 --> 00:22:45,712 >> Takže máme obdobný řádek řetězci s = GetString. 567 00:22:45,712 --> 00:22:48,295 Tak to je prostě první zajímavé linie z tohoto programu. 568 00:22:48,295 --> 00:22:49,920 569 00:22:49,920 --> 00:22:52,974 Ale to, co celou tu dobu byl děje pod kapotou? 570 00:22:52,974 --> 00:22:55,890 No, na levé straně je řetězec, což je nějaký typ proměnné, 571 00:22:55,890 --> 00:22:56,785 a nazývá se s. 572 00:22:56,785 --> 00:23:00,019 Takže vím, že je to s použitím paměti nebo RAM v počítači nějak. 573 00:23:00,019 --> 00:23:02,060 Takže budu abstraktně kreslit, že jako čtverec. 574 00:23:02,060 --> 00:23:04,820 32 bitů, to dopadá, ale o tom více v budoucnu. 575 00:23:04,820 --> 00:23:06,410 A potom, co se děje tady? 576 00:23:06,410 --> 00:23:08,700 >> No, samozřejmě getString dostane řetězec od uživatele. 577 00:23:08,700 --> 00:23:11,360 A GetString dostal Zamyla nebo Gabe nebo Daven. 578 00:23:11,360 --> 00:23:14,640 Takže pojďme si vybrat jako první z těch, která byla Daven. 579 00:23:14,640 --> 00:23:19,174 Tak efektivně, co GetString dostal mi v tomto prvním případě byl D--v-e-n. 580 00:23:19,174 --> 00:23:22,690 581 00:23:22,690 --> 00:23:25,045 A pak, co ještě dělal dát mi tajně? 582 00:23:25,045 --> 00:23:25,920 Diváků: [neslyšitelné] 583 00:23:25,920 --> 00:23:28,720 David J. Malan: Ano, / 0 nebo null znak. 584 00:23:28,720 --> 00:23:30,550 Tak to mě skutečně dal řetězec. 585 00:23:30,550 --> 00:23:34,550 Ale my už víme z předchozí Vypadá, že řetězec je jen pole 586 00:23:34,550 --> 00:23:37,895 znaků, a je ukončena Tato speciální Sentinel znak, / 0. 587 00:23:37,895 --> 00:23:39,220 588 00:23:39,220 --> 00:23:42,310 >> Ale pokud je to pravda a to je čtverec, 589 00:23:42,310 --> 00:23:44,160 to je samozřejmě mnohem větší obdélník. 590 00:23:44,160 --> 00:23:46,830 A skutečně, to je, Tvrdím, pouze 32 bitů. 591 00:23:46,830 --> 00:23:49,500 A to je samozřejmě více než 32 bitů, protože to je pravděpodobně 592 00:23:49,500 --> 00:23:51,583 osm plus osm plus osm navíc osm plus osm, 593 00:23:51,583 --> 00:23:53,320 jen proto, že z bytů v ASCII. 594 00:23:53,320 --> 00:23:57,030 Jak sakra budeme, aby se vešly Daven do této malé krabičce tady? 595 00:23:57,030 --> 00:23:59,880 >> No, co se getString vlastně dělá? 596 00:23:59,880 --> 00:24:03,680 No, to mřížka zde představuje paměti nebo RAM mého počítače. 597 00:24:03,680 --> 00:24:07,564 Takže pojďme libovolně říci, že pokud každý z nich představuje byte, 598 00:24:07,564 --> 00:24:09,730 pak můžeme myslet na sebe bajt jako mající adresu, 599 00:24:09,730 --> 00:24:13,830 jako 33 Oxford Street nebo 34 Oxford Street nebo 35 Oxford Street. 600 00:24:13,830 --> 00:24:16,700 >> Tak jako domy mají adresy a budovy mají adresy, 601 00:24:16,700 --> 00:24:19,810 tak se jednotlivé bajty Paměť mají adresy nebo čísla 602 00:24:19,810 --> 00:24:21,042 , která jednoznačně identifikovat. 603 00:24:21,042 --> 00:24:22,000 Tohle je libovolná. 604 00:24:22,000 --> 00:24:25,370 Ale aby to jednoduché, budu používat hexadecimální jen konvencí, 605 00:24:25,370 --> 00:24:28,200 ale 0x znamená nic jiného, než "toto je hexadecimální." 606 00:24:28,200 --> 00:24:31,030 a budu tvrdit, že "D" končí Byte One v paměti. 607 00:24:31,030 --> 00:24:34,210 >> Dostal jsem nic jiného se děje v paměť, takže Daven dostal první místo 608 00:24:34,210 --> 00:24:35,509 v byte One. 609 00:24:35,509 --> 00:24:36,800 To pak bude 0x2. 610 00:24:36,800 --> 00:24:37,831 611 00:24:37,831 --> 00:24:38,705 To se děje na 0x3. 612 00:24:38,705 --> 00:24:39,840 613 00:24:39,840 --> 00:24:41,800 To bude 0x4. 614 00:24:41,800 --> 00:24:43,025 To se děje na 0x5. 615 00:24:43,025 --> 00:24:44,025 To bude 0x6. 616 00:24:44,025 --> 00:24:45,560 617 00:24:45,560 --> 00:24:48,290 >> Ale jakmile začnete přemýšlet o tom, co dělá počítače 618 00:24:48,290 --> 00:24:50,710 pod kapotou, můžete začít vyvozovat 619 00:24:50,710 --> 00:24:54,960 jak vám, před několika lety, by zavedly C sám. 620 00:24:54,960 --> 00:24:58,360 Co je GetString pravděpodobně returning-- proto, že 621 00:24:58,360 --> 00:25:00,946 pocit, že to není návratu Daven, sama o sobě, 622 00:25:00,946 --> 00:25:03,320 , protože to určitě nebude aby se vešly do této malé box-- 623 00:25:03,320 --> 00:25:05,090 takže to, co je GetString pravděpodobně vrací? 624 00:25:05,090 --> 00:25:07,958 625 00:25:07,958 --> 00:25:08,920 >> Diváků: [neslyšitelné] 626 00:25:08,920 --> 00:25:10,540 >> David J. Malan: Umístění Daven. 627 00:25:10,540 --> 00:25:12,770 A to dělal to od chvíle, kdy první týden. 628 00:25:12,770 --> 00:25:16,150 Co GetString je opravdu návratu není řetězec, sama o sobě. 629 00:25:16,150 --> 00:25:17,780 To je jedna z těch malých bílých lží. 630 00:25:17,780 --> 00:25:22,520 Je to vrací adresu řetězec v paměti, jedinečná adresa. 631 00:25:22,520 --> 00:25:24,820 Daven žije na 33 Oxford Street. 632 00:25:24,820 --> 00:25:29,310 Ale stručněji, Gavin žije na 0x1, Adresa číslo jedna. 633 00:25:29,310 --> 00:25:32,280 >> Takže to, co dostane dát v tomto krabička pak, aby bylo jasné, 634 00:25:32,280 --> 00:25:35,930 je jen adresa tohoto řetězce. 635 00:25:35,930 --> 00:25:38,110 Takže celou tu dobu, to se děje. 636 00:25:38,110 --> 00:25:41,650 Ale co to naznačuje Nyní je, že pokud vše to má 637 00:25:41,650 --> 00:25:44,710 je číslo uvnitř ní, který je tě zastavit, programátor, 638 00:25:44,710 --> 00:25:47,970 od uvedení jakékoliv číslo v všechny proměnné a jen na lyžích 639 00:25:47,970 --> 00:25:49,080 k tomuto kusu paměti? 640 00:25:49,080 --> 00:25:51,320 A skutečně, uvidíme že je to hrozba příště. 641 00:25:51,320 --> 00:25:53,500 >> Ale teď je to vše nestačí. 642 00:25:53,500 --> 00:25:55,630 Když řeknu, abych řetězec, můžete mi dát Daven. 643 00:25:55,630 --> 00:25:57,230 Ale nemáte opravdu, dejte mi Daven. 644 00:25:57,230 --> 00:25:59,310 Jediné, co mi dal, je Daven je adresa. 645 00:25:59,310 --> 00:26:04,310 Jak mám potom vědět, zda kde Daven začíná a ends-- 646 00:26:04,310 --> 00:26:07,140 příběh je stále weird-- kde Daven začíná a končí, 647 00:26:07,140 --> 00:26:10,435 a pak, další řetězec v paměti začíná? 648 00:26:10,435 --> 00:26:11,520 649 00:26:11,520 --> 00:26:13,620 >> No, pokud jste podal mi začátek Daven, 650 00:26:13,620 --> 00:26:17,230 v podstatě, jak to vím, kde je konec jeho jméno je? 651 00:26:17,230 --> 00:26:20,550 Že zvláštní znak null, což je to více nyní důležité 652 00:26:20,550 --> 00:26:23,040 pokud řetězce pod kapuce jsou identifikována 653 00:26:23,040 --> 00:26:25,820 jednoznačně o jejich umístění v paměti. 654 00:26:25,820 --> 00:26:28,130 Takže celou tu dobu, že je to co se děje. 655 00:26:28,130 --> 00:26:32,470 >> Takže když se podíváme hned na Zde je kód, vysvětlit 656 00:26:32,470 --> 00:26:35,790 pokud by chyba v řádku 26. 657 00:26:35,790 --> 00:26:39,560 Proč je Zamyla a Zamyla liší? 658 00:26:39,560 --> 00:26:41,330 Proč je Gabe Gabe a jiní? 659 00:26:41,330 --> 00:26:42,154 Jo, v zádech. 660 00:26:42,154 --> 00:26:43,390 >> Diváků: Mají různé adresy. 661 00:26:43,390 --> 00:26:45,931 >> David J. Malan: Jednoduše proto, že mají různé adresy. 662 00:26:45,931 --> 00:26:48,820 Vzhledem k tomu, když zavoláte getString znovu, což udělám rychle sem, 663 00:26:48,820 --> 00:26:52,870 pokud se jedná o druhý řádek, řetězec t, jak jsem v tomto programu, 664 00:26:52,870 --> 00:26:55,030 rovná se další volání getString. 665 00:26:55,030 --> 00:26:56,370 666 00:26:56,370 --> 00:26:58,670 Příště zavolám GetString, jdu 667 00:26:58,670 --> 00:27:00,190 jak získat jiný kus paměti. 668 00:27:00,190 --> 00:27:02,220 >> GetString je povoleno požádat provozní 669 00:27:02,220 --> 00:27:03,800 systém více a více paměti. 670 00:27:03,800 --> 00:27:07,894 To nebude znovu stejný šest bajtů každý čas. 671 00:27:07,894 --> 00:27:09,810 Je to dostane nový kus paměti, který 672 00:27:09,810 --> 00:27:12,780 znamená, že t dostane jinou hodnotu než tady. 673 00:27:12,780 --> 00:27:15,380 >> Takže když jsem si s se rovná = t, nejste srovnání 674 00:27:15,380 --> 00:27:17,880 D proti tomu a proti toto a V proti tomu. 675 00:27:17,880 --> 00:27:19,588 Ty porovnání této proti tomu, který 676 00:27:19,588 --> 00:27:24,020 Upřímně řečeno je docela useful-- useless-- je k ničemu, protože kdo opravdu 677 00:27:24,020 --> 00:27:25,830 zajímá, kde jsou řetězce v paměti? 678 00:27:25,830 --> 00:27:26,850 >> A skutečně, nemáme. 679 00:27:26,850 --> 00:27:28,980 A my nebudeme začít především péče. 680 00:27:28,980 --> 00:27:34,180 Pouze do té míry, že chyby mohou nastat a bezpečnostní hrozby mohou vzniknout vůle 681 00:27:34,180 --> 00:27:36,100 jsme vlastně začít se starat o to. 682 00:27:36,100 --> 00:27:37,230 Takže pojďme se tento problém vyřešit. 683 00:27:37,230 --> 00:27:39,650 Ukázalo se, že to opravit Super jednoduše. 684 00:27:39,650 --> 00:27:42,600 >> A ať to vlastně předtím, než jsem ukazují, že opět, co by 685 00:27:42,600 --> 00:27:47,170 dělat, když ve třídě CS50, a vy jste museli provést 686 00:27:47,170 --> 00:27:48,600 srovnání před dvěma řetězci. 687 00:27:48,600 --> 00:27:51,440 Zřejmě je to jen použít s rovná = T. 688 00:27:51,440 --> 00:27:54,090 Ale logicky, jak byste porovnat tento řetězec 689 00:27:54,090 --> 00:27:56,370 Proti tomuto řetězci pomocí C kód? 690 00:27:56,370 --> 00:27:56,880 Jo. 691 00:27:56,880 --> 00:27:58,780 >> Diváků: Prostě to udělej pro smyčce [neslyšitelné] 692 00:27:58,780 --> 00:28:00,670 693 00:28:00,670 --> 00:28:01,670 David J. Malan: Perfect. 694 00:28:01,670 --> 00:28:02,900 Diváků: [neslyšitelné] 695 00:28:02,900 --> 00:28:03,310 David J. Malan: Jo. 696 00:28:03,310 --> 00:28:05,390 Stačí použít pro smyčce, nebo zatímco smyčky nebo cokoliv jiného. 697 00:28:05,390 --> 00:28:08,710 Ale jen aplikovat základní myšlenku, že v případě, To je kus paměti nebo pole 698 00:28:08,710 --> 00:28:11,590 a to je, iteraci obojí současně. 699 00:28:11,590 --> 00:28:12,960 A právě tyto dopisy. 700 00:28:12,960 --> 00:28:14,260 >> A ty musíš být trochu opatrní, protože vás 701 00:28:14,260 --> 00:28:16,247 nechci jeden prst jít kolem druhé 702 00:28:16,247 --> 00:28:18,080 protože jeden řetězec je delší než druhý. 703 00:28:18,080 --> 00:28:21,380 Takže budete chtít zkontrolovat tento zvláštní hodnota na konci null. 704 00:28:21,380 --> 00:28:24,017 Ale je to opravdu, v konec, tak jednoduché to je. 705 00:28:24,017 --> 00:28:26,100 A upřímně řečeno, nepotřebujeme znovu objevovat, že kolo. 706 00:28:26,100 --> 00:28:27,960 Zde je verze Two. 707 00:28:27,960 --> 00:28:32,910 A to, co jsem chtěl říct, je, že místo srovnání s se rovná = T, 708 00:28:32,910 --> 00:28:38,964 Já místo toho chtěl říct, je-li řetězec srovnání s čárkami t se rovná = 0. 709 00:28:38,964 --> 00:28:40,130 A teď, co je řetězec porovnat? 710 00:28:40,130 --> 00:28:43,046 >> Ukazuje se, že je to funkce, která Dodává se s C, jehož smysl života 711 00:28:43,046 --> 00:28:44,650 je porovnat dva řetězce. 712 00:28:44,650 --> 00:28:48,300 A míchejte porovnat, pokud čteme jeho manuálovou stránku nebo dokumentaci nebo CS50 713 00:28:48,300 --> 00:28:50,630 reference, bude to prostě říct, že rozruch 714 00:28:50,630 --> 00:28:55,730 porovnat výnosy buď negativní číslo nebo kladné číslo nebo nula, 715 00:28:55,730 --> 00:28:57,660 kde nula znamená, že jsou stejné. 716 00:28:57,660 --> 00:28:58,570 >> Tak jen dohad. 717 00:28:58,570 --> 00:29:00,390 Co by to znamenalo, kdyby míchejte porovnání výnosů 718 00:29:00,390 --> 00:29:02,110 Záporná hodnota nebo kladnou hodnotu? 719 00:29:02,110 --> 00:29:02,785 720 00:29:02,785 --> 00:29:04,285 Diváků: Větší než nebo menší než. 721 00:29:04,285 --> 00:29:05,570 David J. Malan: Ano, větší než nebo menší než. 722 00:29:05,570 --> 00:29:08,640 Takže pokud byste chtěli seřadit celek banda řetězců v dictionary-- 723 00:29:08,640 --> 00:29:12,975 jak bude nakonec dolů road-- perfektní funkce potenciálně využívat, 724 00:29:12,975 --> 00:29:15,850 protože to bude dělat, že Porovnání řetězců pro vás, a řekni 725 00:29:15,850 --> 00:29:20,060 si dělá je před b, nebo dělá b přijít dříve, než podle abecedy. 726 00:29:20,060 --> 00:29:21,490 Můžeme to udělat přesně to. 727 00:29:21,490 --> 00:29:23,620 >> A všimněte si jsem jeden další věc, v tomto příkladu. 728 00:29:23,620 --> 00:29:26,870 Co jiného se změnilo vyšší se v této hlavní funkce? 729 00:29:26,870 --> 00:29:28,500 730 00:29:28,500 --> 00:29:29,350 Char *. 731 00:29:29,350 --> 00:29:31,150 A to je to, že další lež. 732 00:29:31,150 --> 00:29:33,750 Celou tu dobu, když jsem píše řetězec, 733 00:29:33,750 --> 00:29:38,350 jsme byli tajně přepisování string jako char *, takže vlastně zvonění 734 00:29:38,350 --> 00:29:39,270 chápe vás. 735 00:29:39,270 --> 00:29:42,450 >> Jinými slovy, v CS50.h a jak budeme nakonec vidět, 736 00:29:42,450 --> 00:29:45,950 jsme synonym nazývá řetězec to je to samé jako char *. 737 00:29:45,950 --> 00:29:49,910 A teď, vím jen to, že *, V tomto kontextu, alespoň, 738 00:29:49,910 --> 00:29:51,286 znamená adresu. 739 00:29:51,286 --> 00:29:52,210 >> Adresa, co? 740 00:29:52,210 --> 00:29:56,390 No, to, že jsem řekl, char *, a *, nebo není pravý float *, 741 00:29:56,390 --> 00:30:00,820 Znamená to, že char * je adresa char. 742 00:30:00,820 --> 00:30:06,770 Takže tento malý box tady, aka řetězec, je opravdu typu char *, 743 00:30:06,770 --> 00:30:10,490 což je prostě ozdobný způsob, jak říkat, V tomto boxu půjde adresu. 744 00:30:10,490 --> 00:30:12,430 A co to adresa viz? 745 00:30:12,430 --> 00:30:13,780 Zdá se, char. 746 00:30:13,780 --> 00:30:16,410 >> Ale mohli bychom zcela mají int * a dalších věcí. 747 00:30:16,410 --> 00:30:20,790 Ale teď, char * je opravdu velmi jednoduché a jeden zájmu. 748 00:30:20,790 --> 00:30:23,310 Takže tento problém se děje stoupat, i když, znovu. 749 00:30:23,310 --> 00:30:24,830 >> Dejme tomu, že tento program je otevřený. 750 00:30:24,830 --> 00:30:27,670 Uvidíme, jestli se teď můžeme předvídat co je s tímto kódem v pořádku. 751 00:30:27,670 --> 00:30:31,140 Takže v tomto programu, copy-0, jsem jít dopředu a zavolat znovu 752 00:30:31,140 --> 00:30:34,190 GetString a uložit hodnotu s. 753 00:30:34,190 --> 00:30:38,800 >> A pak, proč to dělám, stejně jako upomínku týdnů minulosti? 754 00:30:38,800 --> 00:30:40,960 Udělali jsme říci, že getString někdy vrátí null. 755 00:30:40,960 --> 00:30:42,793 Co to znamená, když GetString vrátí null? 756 00:30:42,793 --> 00:30:45,040 757 00:30:45,040 --> 00:30:46,034 Něco se pokazilo. 758 00:30:46,034 --> 00:30:48,950 To pravděpodobně znamená, že řetězec je příliš velký, počítače paměť. 759 00:30:48,950 --> 00:30:51,724 Stává se, super, super, super zřídka, ale to by se mohlo stát. 760 00:30:51,724 --> 00:30:53,890 Chceme kontrolovat ji, a to je vše, co děláme. 761 00:30:53,890 --> 00:30:57,910 >> Vzhledem k tomu, uvidíme se, pokud nemáte spustit kontrolu obvykle k věci 762 00:30:57,910 --> 00:31:00,870 jako null, můžete skutečně začít jít 763 00:31:00,870 --> 00:31:03,106 na adresy v paměti, které jsou neplatné. 764 00:31:03,106 --> 00:31:05,980 A vy budete začít vyvolání stále více a více segmentace chyby. 765 00:31:05,980 --> 00:31:08,360 Nebo v Mac nebo PC, jen způsobí, že počítač pro zavěšení 766 00:31:08,360 --> 00:31:10,340 nebo program pro zmrazení, potenciálně. 767 00:31:10,340 --> 00:31:14,930 >> Takže teď, tvrdím v kopírování 0.c, že ​​jsem Chystám se kopírovat tyto řetězce prostřednictvím 768 00:31:14,930 --> 00:31:15,685 linky 28. 769 00:31:15,685 --> 00:31:16,850 770 00:31:16,850 --> 00:31:18,750 A pak, já jdu nároku na dně 771 00:31:18,750 --> 00:31:21,430 zde, že jdu změnit jeden z nich. 772 00:31:21,430 --> 00:31:22,330 >> Takže nevšiml. 773 00:31:22,330 --> 00:31:24,370 Volám náš starý přítel strlen. 774 00:31:24,370 --> 00:31:28,960 A právě vysvětlit v angličtině co tento řádek 34 je na tom? 775 00:31:28,960 --> 00:31:32,480 Co t držák 0 představují na levé straně. 776 00:31:32,480 --> 00:31:32,980 Jo. 777 00:31:32,980 --> 00:31:34,339 >> Diváků: První znak t? 778 00:31:34,339 --> 00:31:35,880 David J. Malan: První znak t. 779 00:31:35,880 --> 00:31:36,379 To je všechno. 780 00:31:36,379 --> 00:31:40,024 První znak t, chci přiřadit velká písmena verze 781 00:31:40,024 --> 00:31:41,190 prvního znaku v t. 782 00:31:41,190 --> 00:31:43,200 Takže to je vydělávat První písmeno. 783 00:31:43,200 --> 00:31:46,340 A pak, úplně poslední věc, kterou udělám V rámci tohoto programu je, že tvrdí, tady je 784 00:31:46,340 --> 00:31:50,340 originál, s, a tady je kopie, t. 785 00:31:50,340 --> 00:31:54,610 >> Ale na základě příběhu jsme právě Řekl o tom, co řetězce jsou opravdu, 786 00:31:54,610 --> 00:31:57,520 co je linka 28 ve skutečnosti dělá, a co je 787 00:31:57,520 --> 00:31:59,405 výsledná chyba bude být na obrazovce? 788 00:31:59,405 --> 00:32:01,300 789 00:32:01,300 --> 00:32:03,500 >> Takže nejprve, první otázka, 28. 790 00:32:03,500 --> 00:32:09,040 Co je to string t = s opravdu dělají? 791 00:32:09,040 --> 00:32:16,430 Pokud máme na levé straně postranní řetězec zde t = y; 792 00:32:16,430 --> 00:32:19,400 že mi dává jedno políčko tady a jedna krabice zde. 793 00:32:19,400 --> 00:32:25,530 A předpokládám, že tato adresa je 0x, řekněme, 50 tentokrát libovolně. 794 00:32:25,530 --> 00:32:28,847 Co string t = s to pod kapotou? 795 00:32:28,847 --> 00:32:30,340 >> Diváků: [neslyšitelné] 796 00:32:30,340 --> 00:32:34,100 >> David J. Malan: Ukládá paměť řešit tam, takže 0x50 je tam. 797 00:32:34,100 --> 00:32:37,980 Takže pokud teď půjdu do první postava ta velká písmena to, 798 00:32:37,980 --> 00:32:39,535 co mám skutečně dělá s? 799 00:32:39,535 --> 00:32:41,300 800 00:32:41,300 --> 00:32:43,450 Jsem opravdu dělají totéž, ne? 801 00:32:43,450 --> 00:32:47,680 Vzhledem k tomu, zda je adresa 0x50-- a jen jsem nemají mnoho prostoru na desce zde 802 00:32:47,680 --> 00:32:51,750 ale předpokládám, že je to 0x50 tady dole, někde v paměti svého počítače. 803 00:32:51,750 --> 00:32:55,825 >> A já jsem se například, Gabe zde malá písmena, jako je tento. 804 00:32:55,825 --> 00:32:57,120 805 00:32:57,120 --> 00:33:01,980 A já jsem řekl: t držák 0 dostane aktivováno. 806 00:33:01,980 --> 00:33:04,860 No, t držák je 0. první písmeno t. 807 00:33:04,860 --> 00:33:07,840 Tak málo g bude stát se velkým G. Ale problém 808 00:33:07,840 --> 00:33:09,410 je to, co se to také poukazují na? 809 00:33:09,410 --> 00:33:10,300 >> Diváků: stejné. 810 00:33:10,300 --> 00:33:11,841 >> David J. Malan: přesně stejný věc. 811 00:33:11,841 --> 00:33:16,342 Tak jednoduché vysvětlení snad i když syntaxe je trochu divný. 812 00:33:16,342 --> 00:33:17,050 Tak pojďme na to. 813 00:33:17,050 --> 00:33:20,210 Udělat kopii-0 a pak ./copy-0. 814 00:33:20,210 --> 00:33:21,820 815 00:33:21,820 --> 00:33:24,110 Řekni něco: Gabe. 816 00:33:24,110 --> 00:33:26,760 A bohužel, oba jim již byly aktivovány, 817 00:33:26,760 --> 00:33:29,500 ale to, že za Důvod, že jsme prostě 818 00:33:29,500 --> 00:33:32,350 nyní řeší s adresami. 819 00:33:32,350 --> 00:33:36,470 >> Tak jak jsme se začít address-- žádná slovní hříčka intended-- 820 00:33:36,470 --> 00:33:39,270 jak jsme se začali zabývat tento konkrétní problém? 821 00:33:39,270 --> 00:33:44,400 No, v copy1.c, co se děje být trochu složitější. 822 00:33:44,400 --> 00:33:49,310 Ale já bych tvrdit, koncepčně jednoduché řešení. 823 00:33:49,310 --> 00:33:50,852 >> Tak těžké se dostat na první pohled. 824 00:33:50,852 --> 00:33:53,560 Nebude snadné pro první Doba napíšete to, snad, 825 00:33:53,560 --> 00:33:57,440 ale v případě, že problém je, že prostě dělá T = je jen 826 00:33:57,440 --> 00:33:59,694 zkopíruje adresu, co, znovu, pokud mi můžete vyzvednout na vás, 827 00:33:59,694 --> 00:34:02,110 bude řešení pro kopíruje řetězec? 828 00:34:02,110 --> 00:34:04,906 829 00:34:04,906 --> 00:34:06,770 >> Diváků: Budeme pravděpodobně znovu použít smyčku. 830 00:34:06,770 --> 00:34:06,890 >> David J. Malan: Jo. 831 00:34:06,890 --> 00:34:08,390 Takže budeme zase potřebovat smyčku. 832 00:34:08,390 --> 00:34:11,800 A protože chceme-li kopírovat řetězec s do jiného řetězce, 833 00:34:11,800 --> 00:34:14,120 asi chceme, aby to znak po znaku. 834 00:34:14,120 --> 00:34:17,199 Ale problém je, pokud To je původně s, 835 00:34:17,199 --> 00:34:22,159 Nyní musíme začít výslovně přidělování paměti pro t. 836 00:34:22,159 --> 00:34:24,320 >> Jinými slovy, ať to překreslit tento jeden poslední čas. 837 00:34:24,320 --> 00:34:28,659 Je-li tento řetězec s = GetString. 838 00:34:28,659 --> 00:34:30,956 839 00:34:30,956 --> 00:34:32,455 A pojďme dát to sem, stejně. 840 00:34:32,455 --> 00:34:36,639 841 00:34:36,639 --> 00:34:37,420 To je GetString. 842 00:34:37,420 --> 00:34:39,070 843 00:34:39,070 --> 00:34:43,860 A pak se obraz na něco jako to bude jako dřív, 844 00:34:43,860 --> 00:34:44,360 g-a-b-e-/ 0. 845 00:34:44,360 --> 00:34:47,294 846 00:34:47,294 --> 00:34:48,960 To vypadá na něco takového. 847 00:34:48,960 --> 00:34:53,650 A s proto nazýváme 0x50, a že to bude 51, 52. 848 00:34:53,650 --> 00:34:54,409 >> Tak tohle je 0x50. 849 00:34:54,409 --> 00:34:55,679 850 00:34:55,679 --> 00:34:59,690 A pak, já řetězec t. 851 00:34:59,690 --> 00:35:02,450 V paměti, že to jen tak dej mi trochu čtverec jako je tento. 852 00:35:02,450 --> 00:35:04,080 Takže to, co je klíčovým krokem teď? 853 00:35:04,080 --> 00:35:09,870 Pokud budu chtít kopírovat s do t to, co prázdné potřebujeme vyplnit tu? 854 00:35:09,870 --> 00:35:12,050 Nebo to, co potřebujeme, abychom dělat na vysoké úrovni? 855 00:35:12,050 --> 00:35:14,101 856 00:35:14,101 --> 00:35:14,600 Jo? 857 00:35:14,600 --> 00:35:16,200 858 00:35:16,200 --> 00:35:17,020 Někdo? 859 00:35:17,020 --> 00:35:17,690 Jo. 860 00:35:17,690 --> 00:35:19,214 >> Diváků: Musíme [neslyšitelné]. 861 00:35:19,214 --> 00:35:21,380 David J. Malan: Jo, to jsme třeba vyplnit toto pole prázdné. 862 00:35:21,380 --> 00:35:24,340 Nemůžu zkopírovat a pak vydělávat Gabe jméno 863 00:35:24,340 --> 00:35:28,120 dokud jsem se zeptat operační systém pro další kus paměti 864 00:35:28,120 --> 00:35:30,640 To je přinejmenším stejně velký jako originál. 865 00:35:30,640 --> 00:35:32,130 Tak, že nás staví otázku. 866 00:35:32,130 --> 00:35:36,080 >> Jak mohu požádat o operační systém není jen jednoduchý malý pointer-- 867 00:35:36,080 --> 00:35:38,530 jak je to se nazývá, adresa, pointer-- ne 868 00:35:38,530 --> 00:35:40,980 pro jednoduché krabičce takhle nazývá řetězec? 869 00:35:40,980 --> 00:35:44,200 Jak mohu požádat o provozní systém pro velký kus paměti? 870 00:35:44,200 --> 00:35:48,430 Zatím jsem se jen dostal to zpátky nepřímo volá getString. 871 00:35:48,430 --> 00:35:50,740 Tak jak je getString i dostat svou paměť? 872 00:35:50,740 --> 00:35:53,430 >> No, ukázalo se, že je tu Tato další funkce zde 873 00:35:53,430 --> 00:35:55,160 že budeme nyní začít používat. 874 00:35:55,160 --> 00:35:59,780 Teď to vypadá mnohem více mystický than-- a já jsem jediný, kdo může vidět to-- 875 00:35:59,780 --> 00:36:03,150 tento řádek vypadá mnohem více mystický pak by měl na první pohled. 876 00:36:03,150 --> 00:36:04,650 Ale pojďme škádlit ji od sebe. 877 00:36:04,650 --> 00:36:07,950 >> Na levé straně, mám char * t. 878 00:36:07,950 --> 00:36:13,280 Tak v angličtině, pojďme začít formulovat správné věty v technickém žargonu. 879 00:36:13,280 --> 00:36:19,757 Tak tohle je přidělování proměnná typu char * s názvem t. 880 00:36:19,757 --> 00:36:21,090 A teď, co to vlastně znamená? 881 00:36:21,090 --> 00:36:23,881 >> No, to znamená, že to, co mám dělat aby v této proměnné s názvem t? 882 00:36:23,881 --> 00:36:24,780 883 00:36:24,780 --> 00:36:26,402 Adresa char. 884 00:36:26,402 --> 00:36:28,360 Tak to je prostě jednodušší, více rozumný způsob, 885 00:36:28,360 --> 00:36:29,930 popisovat levou stranu. 886 00:36:29,930 --> 00:36:32,890 Takže vytváří toto políčko tu jen. 887 00:36:32,890 --> 00:36:34,760 Takže pravá strana, Lze předpokládat, že bude 888 00:36:34,760 --> 00:36:37,170 přidělit, že větší kus paměti, jak na to? 889 00:36:37,170 --> 00:36:38,340 Takže pojďme škádlit to od sebe. 890 00:36:38,340 --> 00:36:41,131 >> Je to ohromující na první pohled, ale to, co se děje uvnitř tady? 891 00:36:41,131 --> 00:36:43,740 Za prvé, je tu malloc, které je zřejmě náš nový přítel, 892 00:36:43,740 --> 00:36:45,450 "Paměť přidělit." 893 00:36:45,450 --> 00:36:49,560 Tak to je argument předávaný do něj, takže je to docela velká hádka. 894 00:36:49,560 --> 00:36:50,970 Takže pojďme škádlit to od sebe. 895 00:36:50,970 --> 00:36:53,410 >> strlen S, samozřejmě, představuje to-- 896 00:36:53,410 --> 00:36:54,142 897 00:36:54,142 --> 00:36:55,600 Diváků: počet znaků. 898 00:36:55,600 --> 00:36:56,710 David J. Malan: Just počet znaků v s. 899 00:36:56,710 --> 00:36:59,040 Takže délka s, původní řetězec. 900 00:36:59,040 --> 00:37:00,350 Tak G-a-b-e. 901 00:37:00,350 --> 00:37:02,320 Takže je to asi čtyři v tomto případě. 902 00:37:02,320 --> 00:37:05,485 Proč to dělám jeden po volání strlen na s? 903 00:37:05,485 --> 00:37:06,360 Diváků: [neslyšitelné] 904 00:37:06,360 --> 00:37:07,590 David J. Malan: Za to speciální znak null. 905 00:37:07,590 --> 00:37:11,260 Jestli se mě ptáte, co je délka Gabe jméno, budu říkat čtyři. 906 00:37:11,260 --> 00:37:14,480 Pod kapotou, i když, musím že pátý bajt na znak NULL. 907 00:37:14,480 --> 00:37:16,100 Takže to je důvod, proč dělám 1. 908 00:37:16,100 --> 00:37:21,730 >> Nyní jen v případě, že používáte tento Program na jiném než v počítači, řekněme, 909 00:37:21,730 --> 00:37:24,610 CS50 spotřebiče, kde je velikost znaku 910 00:37:24,610 --> 00:37:26,350 se může lišit z mé vlastní computer-- 911 00:37:26,350 --> 00:37:30,590 Ukazuje se, že mohu nazvat operátor sizeof, zeptejte se počítač 912 00:37:30,590 --> 00:37:32,870 jaká je velikost char na tomto počítači? 913 00:37:32,870 --> 00:37:37,400 >> A vynásobením pět v tomto například podle velikosti char, který 914 00:37:37,400 --> 00:37:40,440 Na většině počítačů bude být jen jeden, malloc 915 00:37:40,440 --> 00:37:44,830 se chystá vyčlenit pro mě to velké kus paměti, tady vpravo. 916 00:37:44,830 --> 00:37:47,140 A že to bude return-- je function--, takže je to 917 00:37:47,140 --> 00:37:48,265 chystá se vrátit se mnou, co? 918 00:37:48,265 --> 00:37:50,914 919 00:37:50,914 --> 00:37:51,830 Diváků: adresa? 920 00:37:51,830 --> 00:37:53,709 David J. Malan: Adresa, co? 921 00:37:53,709 --> 00:37:55,250 Diváků: Z paměti je přiděleno? 922 00:37:55,250 --> 00:37:56,450 David J. Malan: Z paměť je přiděleno. 923 00:37:56,450 --> 00:37:59,189 Takže nemám tušení, upřímně řečeno, pokud je to skončí. 924 00:37:59,189 --> 00:38:01,480 Chystám se navrhnout, aby bude to skončí na 0x88. 925 00:38:01,480 --> 00:38:02,770 926 00:38:02,770 --> 00:38:06,009 Zcela libovolné, ale někde jinde než 0x50, 927 00:38:06,009 --> 00:38:08,800 protože v operačním systému, co Windows a Mac OS pro mě udělat, je 928 00:38:08,800 --> 00:38:11,230 ujistěte se, že je dává me různé kusy RAM. 929 00:38:11,230 --> 00:38:14,210 >> Tak to je hodnota, pokud to kus paměti, by mohl skončit. 930 00:38:14,210 --> 00:38:16,060 Tak tohle je to, co skončí tady, 0x88. 931 00:38:16,060 --> 00:38:17,480 932 00:38:17,480 --> 00:38:21,570 Takže jasně, chápu, , že to není stejné jako to, 933 00:38:21,570 --> 00:38:23,960 protože to ukazuje na různé kousky paměti. 934 00:38:23,960 --> 00:38:29,980 Takže když jsem teď vlastně chcete zkopírovat tento v, pojďme udělat svůj návrh řešení. 935 00:38:29,980 --> 00:38:36,870 >> Pojďme vytvořit pro smyčce, a to t držák i dostane y držák i. 936 00:38:36,870 --> 00:38:39,760 Protože teď mohu použít Tato pole podobné notace, 937 00:38:39,760 --> 00:38:43,390 protože i když malloc velmi obecně mi přiděluje paměť, 938 00:38:43,390 --> 00:38:45,290 paměť je jen souvislé bajtů. 939 00:38:45,290 --> 00:38:47,240 Byte, byte, byte, zády k sobě k sobě. 940 00:38:47,240 --> 00:38:50,030 >> Mohu jistě jako programátor zacházet s ní jako pole, které 941 00:38:50,030 --> 00:38:55,090 znamená, že můžete použít tento konečně seznámit zápis jen několik hranatých závorkách. 942 00:38:55,090 --> 00:38:56,462 943 00:38:56,462 --> 00:39:00,020 >> Takže mi dovolte pozastavit tam, protože to je hodně najednou, dokonce 944 00:39:00,020 --> 00:39:03,530 i když základní myšlenka shrnout je to, že řetězec, celou tu dobu, 945 00:39:03,530 --> 00:39:05,550 Není to nový datový typ sobě. 946 00:39:05,550 --> 00:39:10,150 Je to takzvaný ukazatel, adresa charakteru, 947 00:39:10,150 --> 00:39:12,650 což právě znamená, že je to číslo že lidské konvence 948 00:39:12,650 --> 00:39:15,350 máme tendenci psát jako 0x něco. 949 00:39:15,350 --> 00:39:18,590 >> Ale je to jen číslo, jako 33 Oxford Street, 950 00:39:18,590 --> 00:39:20,530 který se stane být Adresa ČS budovy. 951 00:39:20,530 --> 00:39:22,000 952 00:39:22,000 --> 00:39:23,545 Jakékoliv dotazy týkající se těchto údajů? 953 00:39:23,545 --> 00:39:24,790 954 00:39:24,790 --> 00:39:25,289 Jo? 955 00:39:25,289 --> 00:39:28,530 >> Diváků: Proč se podíváme pro t se rovná null? 956 00:39:28,530 --> 00:39:30,740 >> David J. Malan: Proč zkontrolujte t rovné null? 957 00:39:30,740 --> 00:39:33,250 Pokud čteme documentation-- velký question-- pro malloc, 958 00:39:33,250 --> 00:39:37,020 to řekne v drobným písmem, někdy malloc může vrátit null, 959 00:39:37,020 --> 00:39:38,080 stejně jako getString. 960 00:39:38,080 --> 00:39:41,820 A skutečně, GetString vrátí null v případě, podle pořadí, se vrací malloc null, 961 00:39:41,820 --> 00:39:43,130 protože GetString používá malloc. 962 00:39:43,130 --> 00:39:46,400 >> A to by mohlo v případě, že operační systém stane, Mac OS, Windows, ať už je prostě 963 00:39:46,400 --> 00:39:48,130 nedostatek paměti pro vás. 964 00:39:48,130 --> 00:39:49,820 Takže to je to, co se tam stalo. 965 00:39:49,820 --> 00:39:52,910 >> A dovolte mi odhalit jednu věc které by mohly jen foukat vaši mysl 966 00:39:52,910 --> 00:39:55,100 nebo zcela být příliš daleko přes linku. 967 00:39:55,100 --> 00:39:59,770 Ale dovolte mi vytáhnout stejné pro smyčku pro kopírování, 968 00:39:59,770 --> 00:40:05,480 který před chvílí, odvolání bylo to. t držák i dostane y držák i. 969 00:40:05,480 --> 00:40:06,740 >> Pěkné a uživatelsky příjemný. 970 00:40:06,740 --> 00:40:09,330 Cítím se jako týden dva znovu. 971 00:40:09,330 --> 00:40:14,920 Ale tato verze vlastně může být přepsat jako je tento, který vypadá záhadné. 972 00:40:14,920 --> 00:40:18,280 Je to technika s názvem ukazatel aritmetika, adresová aritmetika. 973 00:40:18,280 --> 00:40:19,600 Ale proč to funguje? 974 00:40:19,600 --> 00:40:22,220 >> Nyní protivně, Autoři C se rozhodl použít 975 00:40:22,220 --> 00:40:25,070 Symbol * pro různé účely. 976 00:40:25,070 --> 00:40:29,020 Viděli jsme, že používá již jednou, char *, což znamená "dej mi proměnnou 977 00:40:29,020 --> 00:40:31,210 že to bude obsahovat adresa char. " 978 00:40:31,210 --> 00:40:33,990 Takže char * v této souvislosti znamená "dej mi proměnné." 979 00:40:33,990 --> 00:40:40,050 >> Bohužel, pokud budete používat * Bez slovo před ním, jako char, 980 00:40:40,050 --> 00:40:41,905 to je nyní nazýváno operátor dereference. 981 00:40:41,905 --> 00:40:43,530 A uvidíme, víc než to trvat dlouho. 982 00:40:43,530 --> 00:40:44,930 Ale to jen znamená, že "tam". 983 00:40:44,930 --> 00:40:49,070 Je to jako říkat, jestli mě někdo podal na kus papíru "33 Oxford Street," 984 00:40:49,070 --> 00:40:53,830 když to udělám "* 33 Oxford Street," to znamená, že "Jít po silnici do budovy CS." 985 00:40:53,830 --> 00:40:57,220 >> Takže * prostě znamená, že tam, pokud není slovo před ním. 986 00:40:57,220 --> 00:40:59,100 Takže to, co je t, aby bylo jasné,? 987 00:40:59,100 --> 00:41:03,250 t je adresa kus paměť, která byla dána zpět ke mně. 988 00:41:03,250 --> 00:41:06,650 s je adresa toho, co, aby bylo jasné, V příkladu jsme diskutovali, 989 00:41:06,650 --> 00:41:07,500 z malým Gabe? 990 00:41:07,500 --> 00:41:08,990 991 00:41:08,990 --> 00:41:10,005 s je adresa of-- 992 00:41:10,005 --> 00:41:11,585 993 00:41:11,585 --> 00:41:12,460 Diváků: string. 994 00:41:12,460 --> 00:41:14,126 David J. Malan: Z Gabe je původní název. 995 00:41:14,126 --> 00:41:16,660 Takže je to adresa tento kus paměti. 996 00:41:16,660 --> 00:41:22,220 Takže když řeknu, t + já--, oznámení, je jen náš starý přítel. 997 00:41:22,220 --> 00:41:24,770 Je to jen proměnná index to je iterací od nuly nahoru 998 00:41:24,770 --> 00:41:26,960 na délce řetězce s. 999 00:41:26,960 --> 00:41:30,367 Takže to bude nula, pak jeden, pak dvě, pak tři, pak čtyři. 1000 00:41:30,367 --> 00:41:33,200 Takže pojďme sestavit tyto nové Stírací-jako puzzle kousky, chcete-li, 1001 00:41:33,200 --> 00:41:36,140 i když opět, syntaxe je daleko více, než tajemné Scratch. 1002 00:41:36,140 --> 00:41:39,522 Tak t je adresa + i se chystá dát mi 1003 00:41:39,522 --> 00:41:42,480 číslo, protože to jsou všechno čísla, která jsme se kreslení v hexadecimálním tvaru. 1004 00:41:42,480 --> 00:41:43,560 Ale jsou to jen čísla. 1005 00:41:43,560 --> 00:41:49,960 >> Takže v případě, že adresa t jsme si řekli, Byl 0x88, 0x88, co je plus nula. 1006 00:41:49,960 --> 00:41:51,564 1007 00:41:51,564 --> 00:41:53,980 Dokonce i když nejste pohodlné s ještě hex hádat. 1008 00:41:53,980 --> 00:41:54,410 >> Diváků: originální. 1009 00:41:54,410 --> 00:41:55,850 >> David J. Malan: Still 0x88. 1010 00:41:55,850 --> 00:41:58,910 Takže co to * 0x88 znamená? 1011 00:41:58,910 --> 00:42:02,670 To znamená, že "tam", což znamená, že efektivně, "dát prst tady." 1012 00:42:02,670 --> 00:42:06,930 A teď na pravé straně tento výraz, * a pak parens, 1013 00:42:06,930 --> 00:42:11,586 y + i znamená s, který je řešit tady malého g. 1014 00:42:11,586 --> 00:42:16,220 y + 0, je, samozřejmě, s, bez ohledu na to, je. 1015 00:42:16,220 --> 00:42:21,230 >> Takže teď je to * S, který stejně jako * 33 Oxford Street znamená jít na adresu 1016 00:42:21,230 --> 00:42:22,010 s. 1017 00:42:22,010 --> 00:42:24,170 Tak tady je to prst, pravá ruka. 1018 00:42:24,170 --> 00:42:26,050 Takže to, co budu kopírovat do čeho? 1019 00:42:26,050 --> 00:42:30,260 Ta věc na pravé straně, což je Gabe, málo g tady, na zde. 1020 00:42:30,260 --> 00:42:32,750 >> A tak efekt, který první iteraci smyčky, 1021 00:42:32,750 --> 00:42:36,200 jak je navrhováno, i když to vypadá, blázen složitější než cokoli jiného 1022 00:42:36,200 --> 00:42:42,110 jsme viděli předtím, je jednoduše říká, jít sem a kopírovat postavu zde. 1023 00:42:42,110 --> 00:42:44,700 Je to dává vám mapy na obou místech. 1024 00:42:44,700 --> 00:42:46,130 >> A uvidíme mnohem víc než to. 1025 00:42:46,130 --> 00:42:50,600 Ale teď, naděje je jen představit některé z těchto základních myšlenek. 1026 00:42:50,600 --> 00:42:53,550 A skutečně, pojďme se podívat na jeden Konečný program zde 1027 00:42:53,550 --> 00:42:57,480 a pak slíbil claymation, která bude všechno v pořádku. 1028 00:42:57,480 --> 00:42:57,980 V pořádku. 1029 00:42:57,980 --> 00:43:01,680 Takže mi dovolte otevřít up-- tam jdeme. 1030 00:43:01,680 --> 00:43:02,850 1031 00:43:02,850 --> 00:43:05,440 Tak ať já-- vrátíme na obrázku před dlouho. 1032 00:43:05,440 --> 00:43:08,360 Dovolte mi, abych otevřít tuto závěrečnou příklad zde. 1033 00:43:08,360 --> 00:43:09,440 1034 00:43:09,440 --> 00:43:12,710 >> Takže tady je super, super program, který dosáhne 1035 00:43:12,710 --> 00:43:15,050 nic v životě, který dělá následující. 1036 00:43:15,050 --> 00:43:18,740 Nejprve deklaruje dvě proměnné x a y, které nejsou čísla tentokrát, 1037 00:43:18,740 --> 00:43:19,240 sám o sobě. 1038 00:43:19,240 --> 00:43:20,448 Oni nejsou celá čísla, sám o sobě. 1039 00:43:20,448 --> 00:43:22,899 Jsou to zřejmě int *. 1040 00:43:22,899 --> 00:43:25,690 Takže jen tak někdo, co to znamená Pokud váš datový typ, váš variabilní, 1041 00:43:25,690 --> 00:43:26,860 je typu int * hvězda? 1042 00:43:26,860 --> 00:43:30,240 To je adresa int. 1043 00:43:30,240 --> 00:43:31,990 >> Tak jsem ponětí, kde je dosud. 1044 00:43:31,990 --> 00:43:35,150 To prostě znamená "dát, nakonec, adresa int tady. " 1045 00:43:35,150 --> 00:43:38,340 0x50, 0x88, tam, kde je v paměti, adresa se děje zde. 1046 00:43:38,340 --> 00:43:40,200 A to je to, co y je bude, jak je dobře. 1047 00:43:40,200 --> 00:43:44,920 >> Pokud bych teď říci, x = malloc (sizeof (int)), To je ozdobný způsob, jak říkat, 1048 00:43:44,920 --> 00:43:49,000 hej operační systém, pomocí malloc, Dej mi dostatek paměti pro velikost 1049 00:43:49,000 --> 00:43:52,370 z int, což je pravděpodobně bude 32 bitů nebo čtyři bajty. 1050 00:43:52,370 --> 00:43:53,680 >> Takže co malloc vrátí? 1051 00:43:53,680 --> 00:43:55,250 Malloc vrátí adresu. 1052 00:43:55,250 --> 00:43:57,020 Takže, co se děje, aby se uložené v X? 1053 00:43:57,020 --> 00:44:00,600 Adresa kus paměti, čtyři bajty, že malloc 1054 00:44:00,600 --> 00:44:03,360 právě našel pro mě otázkou: operační systém. 1055 00:44:03,360 --> 00:44:08,240 >> Nyní mezitím linka čtyři tady, * x = 42. 1056 00:44:08,240 --> 00:44:09,990 Jen aby bylo jasno, co se děje tam dole? 1057 00:44:09,990 --> 00:44:11,530 Na levé straně, * x. 1058 00:44:11,530 --> 00:44:13,610 to je jako * 33 Oxford Street. 1059 00:44:13,610 --> 00:44:15,523 Takže * x znamená co? 1060 00:44:15,523 --> 00:44:16,450 >> Diváků: Jdi na. 1061 00:44:16,450 --> 00:44:17,908 >> David J. Malan: Přejděte na tuto adresu. 1062 00:44:17,908 --> 00:44:20,466 Všude tam, kde to kus paměť je, jít na to. 1063 00:44:20,466 --> 00:44:21,979 A dal to, co tam samozřejmě? 1064 00:44:21,979 --> 00:44:22,520 Diváků: 42. 1065 00:44:22,520 --> 00:44:23,580 David J. Malan: 42. 1066 00:44:23,580 --> 00:44:25,650 Dobře, * y, stejný nápad. 1067 00:44:25,650 --> 00:44:26,860 Přejděte na adresu v y. 1068 00:44:26,860 --> 00:44:31,740 Vložte číslo 13 tam, ale to, co je y v současné době? 1069 00:44:31,740 --> 00:44:33,172 1070 00:44:33,172 --> 00:44:34,630 Diváků: není paměť pro y. 1071 00:44:34,630 --> 00:44:35,710 David J. Malan: V není paměť pro y. 1072 00:44:35,710 --> 00:44:38,215 Takže to, co y dělá pravděpodobně obsahuje, jak jsme říkali? 1073 00:44:38,215 --> 00:44:38,520 >> DIVÁKŮ: Garbage. 1074 00:44:38,520 --> 00:44:39,480 >> David J. Malan: Některé hodnoty odpadky. 1075 00:44:39,480 --> 00:44:41,320 Nyní, hodnota odpadky je stále číslo. 1076 00:44:41,320 --> 00:44:43,160 To může ještě být zaměněna za adresu. 1077 00:44:43,160 --> 00:44:45,160 Je to, jako by někdo načmáral něco dolů, 1078 00:44:45,160 --> 00:44:48,002 a vyložil jsem si to v tom smyslu, některé budovy na ulici. 1079 00:44:48,002 --> 00:44:50,460 A pokud jste prostě zkuste jít do některé stavební nemáte vlastní, 1080 00:44:50,460 --> 00:44:53,710 nebo nějaký kus paměti, že ne byla dána, špatné věci se může stát. 1081 00:44:53,710 --> 00:44:57,740 Počítač může selhat, nebo nějaký jiný Není určeno chování by se mohlo stát. 1082 00:44:57,740 --> 00:45:01,310 >> Takže intro, pak, aby Binkym je to. 1083 00:45:01,310 --> 00:45:04,290 Stále si pamatuji, 20 některé liché roky později, 1084 00:45:04,290 --> 00:45:07,200 kde jsem byl, když jsem se konečně pochopil ukazatelů. 1085 00:45:07,200 --> 00:45:09,520 >> Což znamená, že pokud nechat za tři minuty 1086 00:45:09,520 --> 00:45:12,170 a myslím, že ne pochopit ukazatelů, si uvědomují, 1087 00:45:12,170 --> 00:45:14,410 Vzpomněl jsem si na 20 let na nějaké šílené důvodu 1088 00:45:14,410 --> 00:45:17,140 kdy a proč to nakonec potopena v, sedí se svým učením 1089 00:45:17,140 --> 00:45:19,501 kolega, Nishat Mehta v zpět Eliota jídelně. 1090 00:45:19,501 --> 00:45:21,250 Teď jsem si vzpomněl, , protože to bylo 1091 00:45:21,250 --> 00:45:23,920 jedním z témat, I, ve zejména bojoval s. 1092 00:45:23,920 --> 00:45:26,470 A pak, konečně klepnutí jako Troufám si říci, hodně témat 1093 00:45:26,470 --> 00:45:27,460 nakonec bude. 1094 00:45:27,460 --> 00:45:32,590 A teď, aby to cítili všichni šťastnější a to více přesvědčivý, 1095 00:45:32,590 --> 00:45:35,360 pojďme se podívat do naší konečné Poslední tři minuty zde na Binkym, 1096 00:45:35,360 --> 00:45:37,675 od našeho přítele, Nick Parlante ze Stanfordu. 1097 00:45:37,675 --> 00:45:38,910 1098 00:45:38,910 --> 00:45:41,580 >> [PŘEHRÁVÁNÍ] 1099 00:45:41,580 --> 00:45:42,750 >> Hej, Binky. 1100 00:45:42,750 --> 00:45:43,500 Probuďte se! 1101 00:45:43,500 --> 00:45:45,960 Je čas na ukazatel zábavy. 1102 00:45:45,960 --> 00:45:47,012 >> Co je to? 1103 00:45:47,012 --> 00:45:48,723 Další informace o ukazateli? 1104 00:45:48,723 --> 00:45:50,580 Oh, dobrota! 1105 00:45:50,580 --> 00:45:53,563 >> No, jak začít, myslím, že jsme bude potřebovat pár rad. 1106 00:45:53,563 --> 00:45:54,390 >> -OK. 1107 00:45:54,390 --> 00:45:57,930 Tento kód přiděluje dva ukazatele, které mohou ukazovat na celá čísla. 1108 00:45:57,930 --> 00:45:58,430 -OK. 1109 00:45:58,430 --> 00:46:02,140 No, vidím dva ukazatele, ale Nezdá se, že by ukazoval na cokoliv. 1110 00:46:02,140 --> 00:46:02,980 >> -Přesně. 1111 00:46:02,980 --> 00:46:05,100 Zpočátku, ukazatele neukazují na nic. 1112 00:46:05,100 --> 00:46:08,030 Věci, které ukazují na, se nazývají pointees a jejich nastavení'S 1113 00:46:08,030 --> 00:46:09,370 samostatný krok. 1114 00:46:09,370 --> 00:46:10,220 >> Oh, dobře, dobře. 1115 00:46:10,220 --> 00:46:10,950 Věděl jsem, že. 1116 00:46:10,950 --> 00:46:12,385 V pointees jsou oddělené. 1117 00:46:12,385 --> 00:46:14,315 Ehm, tak jak si přidělit pointee? 1118 00:46:14,315 --> 00:46:15,340 1119 00:46:15,340 --> 00:46:15,960 >> -OK. 1120 00:46:15,960 --> 00:46:18,970 No, tento kód přiděluje nové číslo pointee, 1121 00:46:18,970 --> 00:46:20,950 a tato část obsahuje x poukázat na to. 1122 00:46:20,950 --> 00:46:22,050 1123 00:46:22,050 --> 00:46:23,230 >> Hej, to vypadá lépe. 1124 00:46:23,230 --> 00:46:25,060 Tak, aby to něco udělat. 1125 00:46:25,060 --> 00:46:25,990 >> -OK. 1126 00:46:25,990 --> 00:46:30,455 Budu dereference ukazatelem X uložit číslo 42 na jeho pointee. 1127 00:46:30,455 --> 00:46:32,830 Pro tento trik, budu potřebovat moje Kouzelná hůlka z dereferencing. 1128 00:46:32,830 --> 00:46:34,130 1129 00:46:34,130 --> 00:46:36,080 >> -Váš Kouzelná hůlka z Získávání? 1130 00:46:36,080 --> 00:46:37,357 1131 00:46:37,357 --> 00:46:38,190 To-- to je skvělé. 1132 00:46:38,190 --> 00:46:39,340 1133 00:46:39,340 --> 00:46:41,080 >> Tohle je to, co kód vypadá. 1134 00:46:41,080 --> 00:46:44,110 Já si jen nastavit číslo a [POP] 1135 00:46:44,110 --> 00:46:44,700 >> Hej, podívej. 1136 00:46:44,700 --> 00:46:46,140 Tam to jde. 1137 00:46:46,140 --> 00:46:50,980 >> Takže dělá Sleduje na x následuje šipky pro přístup k jeho pointee. 1138 00:46:50,980 --> 00:46:53,160 V tomto případě, sklad 42 tam. 1139 00:46:53,160 --> 00:46:57,710 Hej, zkuste ji uložíte číslo 13 přes druhou ukazatel, y. 1140 00:46:57,710 --> 00:46:58,760 >> -OK. 1141 00:46:58,760 --> 00:47:03,270 Půjdu sem y, a dostat číslo 13 nastavit. 1142 00:47:03,270 --> 00:47:07,930 A pak vzít hůlku Získávání a jen [BUZZ] 1143 00:47:07,930 --> 00:47:08,960 >> Oh! 1144 00:47:08,960 --> 00:47:09,500 >> Oh, hey! 1145 00:47:09,500 --> 00:47:11,090 To nefungovalo. 1146 00:47:11,090 --> 00:47:15,630 Řekni, Binky, nemyslím si, že dereferencing y je dobrý nápad, protože víte, 1147 00:47:15,630 --> 00:47:17,850 nastavení pointee je samostatný krok. 1148 00:47:17,850 --> 00:47:20,450 A nemyslím si, že jsme kdy udělali. 1149 00:47:20,450 --> 00:47:21,480 >> Dobrou bod. 1150 00:47:21,480 --> 00:47:21,980 Jo. 1151 00:47:21,980 --> 00:47:25,680 Vložili jsme ukazatel y, ale my Nikdy nastavit, aby ukazoval na pointee. 1152 00:47:25,680 --> 00:47:27,190 1153 00:47:27,190 --> 00:47:28,616 >> -Velmi Pozorný. 1154 00:47:28,616 --> 00:47:30,240 Hej, vypadáš dobře tam, Binky. 1155 00:47:30,240 --> 00:47:33,400 Můžete to opravit tak, že y body na stejné pointee jako X? 1156 00:47:33,400 --> 00:47:34,000 >> -Jistě. 1157 00:47:34,000 --> 00:47:36,780 Budu používat svůj kouzelná hůlka o Ukazatel přiřazení. 1158 00:47:36,780 --> 00:47:38,740 >> -Je To bude problém jako předtím? 1159 00:47:38,740 --> 00:47:39,240 Ne. 1160 00:47:39,240 --> 00:47:40,660 To se nedotýkejte pointees. 1161 00:47:40,660 --> 00:47:44,450 Je to prostě změní jeden ukazatel na poukazují na to samé, jako jiné. 1162 00:47:44,450 --> 00:47:45,450 >> Oh, jak vidím. 1163 00:47:45,450 --> 00:47:48,200 Nyní y body na stejném místě jako x. 1164 00:47:48,200 --> 00:47:48,910 Tak počkat. 1165 00:47:48,910 --> 00:47:49,950 Nyní, y je pevná. 1166 00:47:49,950 --> 00:47:51,120 Má pointee. 1167 00:47:51,120 --> 00:47:54,510 Takže si můžete vyzkoušet hůlku Získávání znovu poslat 13 přes. 1168 00:47:54,510 --> 00:47:56,510 >> Uh, OK. 1169 00:47:56,510 --> 00:47:58,160 Tady to jde. [POP] 1170 00:47:58,160 --> 00:47:59,340 >> Hej, podívej se na to. 1171 00:47:59,340 --> 00:48:00,750 Nyní dereferencing práce na y. 1172 00:48:00,750 --> 00:48:04,991 A proto, že ukazatele jsou sdílení že jeden pointee, oba viz 13. 1173 00:48:04,991 --> 00:48:05,490 Jo. 1174 00:48:05,490 --> 00:48:06,870 Sdílení, cokoliv. 1175 00:48:06,870 --> 00:48:08,820 Takže budeme vymění teď? 1176 00:48:08,820 --> 00:48:09,440 >> Oh, podívej. 1177 00:48:09,440 --> 00:48:10,830 Jsme mimo čas. 1178 00:48:10,830 --> 00:48:11,570 >> -Ale 1179 00:48:11,570 --> 00:48:13,530 >> -Jen Pamatovat tři pravidla ukazatele. 1180 00:48:13,530 --> 00:48:16,560 Number One, základní struktura je, že máte ukazatel, 1181 00:48:16,560 --> 00:48:18,680 a poukazuje na na pointee. 1182 00:48:18,680 --> 00:48:20,640 Ale ukazatel a pointee jsou oddělené, 1183 00:48:20,640 --> 00:48:22,610 a častá chyba je nastavit ukazatel, 1184 00:48:22,610 --> 00:48:25,000 ale zapomenout, aby to pointee. 1185 00:48:25,000 --> 00:48:28,170 >> Číslo dvě, ukazatel dereferencing začíná na ukazatel 1186 00:48:28,170 --> 00:48:31,050 a sleduje šipku nad přístup ke svému pointee. 1187 00:48:31,050 --> 00:48:33,400 Jak všichni víme, to funguje pouze v případě, že je 1188 00:48:33,400 --> 00:48:36,270 pointee, který druh dostane zpět pravidlo číslo jedna. 1189 00:48:36,270 --> 00:48:39,000 >> Číslo tři, ukazatel Přiřazení trvá jeden ukazatel 1190 00:48:39,000 --> 00:48:42,320 a mění ji, aby ukazoval na Totéž pointee jako další ukazatel. 1191 00:48:42,320 --> 00:48:44,160 Takže po zadání, dva ukazatele 1192 00:48:44,160 --> 00:48:45,910 bude ukazovat na stejný pointee. 1193 00:48:45,910 --> 00:48:47,990 Někdy se tomu říká sdílení. 1194 00:48:47,990 --> 00:48:49,740 A to je vše, co se to, opravdu. 1195 00:48:49,740 --> 00:48:50,277 Bye-bye teď. 1196 00:48:50,277 --> 00:48:51,110 [END VIDEOPŘEHRÁVÁNÍ] 1197 00:48:51,110 --> 00:48:52,568 David J. Malan: To je pro CS50. 1198 00:48:52,568 --> 00:48:55,110 Uvidíme se příští týden. 1199 00:48:55,110 --> 00:48:56,064