1 00:00:00,000 --> 00:00:11,320 2 00:00:11,320 --> 00:00:13,260 >> DAVID Malan: Dobrý den, a vítejte zpátky CS50. 3 00:00:13,260 --> 00:00:14,860 Tak to je konec týdne čtyři. 4 00:00:14,860 --> 00:00:16,680 Jen jeden oznámení jako první. 5 00:00:16,680 --> 00:00:19,600 Takže tzv. páté pondělí přichází letos v pondělí. 6 00:00:19,600 --> 00:00:22,800 To je příležitost pro změnu z SAT / UNSAT na dopis třídy, nebo 7 00:00:22,800 --> 00:00:24,130 dopis grade SAT / UNSAT. 8 00:00:24,130 --> 00:00:27,130 Vzteku, že tento proces vyžaduje podpis, protože je nutné vyplnit 9 00:00:27,130 --> 00:00:28,770 z jednoho z těch růžových Přidat / pokles formy. 10 00:00:28,770 --> 00:00:31,680 >> Vzhledem k tomu, technicky, SAT / UNSAT verze a dopis grade verze 11 00:00:31,680 --> 00:00:33,320 mají odlišné katalogových čísel. 12 00:00:33,320 --> 00:00:34,240 Ale žádný velký problém. 13 00:00:34,240 --> 00:00:36,620 Pojď ke mně, nebo Rob nebo Lauren v každém bodě. 14 00:00:36,620 --> 00:00:39,550 Nebo e-mailem nám, pokud nemáte druh papírování, co potřebujete dnes, a my 15 00:00:39,550 --> 00:00:43,410 bude určitě pomůže vzít péče, že před pondělí. 16 00:00:43,410 --> 00:00:45,780 >> Dobře, takže dnes - 17 00:00:45,780 --> 00:00:47,630 Vlastně je tu trochu ozvěna. 18 00:00:47,630 --> 00:00:51,070 Můžeme tón mě trochu dolů? 19 00:00:51,070 --> 00:00:51,730 OK. 20 00:00:51,730 --> 00:00:54,850 Takže dnes představíme téma známý jako ukazatele. 21 00:00:54,850 --> 00:00:57,770 A musím přiznat, že je to jeden z složitější témata, která máme tendenci 22 00:00:57,770 --> 00:01:00,960 zahrnuje v této třídě, nebo opravdu nějaký úvodní kurz, který používá C. 23 00:01:00,960 --> 00:01:05,510 >> Ale věř mi to, a to zejména pokud vaše mysl se cítí trochu více se ohýbal 24 00:01:05,510 --> 00:01:07,100 dnes av příštích týdnech. 25 00:01:07,100 --> 00:01:10,340 Není to reprezentativní vám daří ještě horší, na to to prostě znamená, že 26 00:01:10,340 --> 00:01:13,360 Je to obzvláště sofistikovaný téma že Slibuji, že za pár týdnů 27 00:01:13,360 --> 00:01:17,610 proto se bude zdát až příliš nápadně jednoduché zpětně. 28 00:01:17,610 --> 00:01:18,720 >> Stále si pamatuji dodnes. 29 00:01:18,720 --> 00:01:22,190 Seděl jsem v jídelně Elliott, sedí vedle mého TF Nishat Mehta, 30 00:01:22,190 --> 00:01:24,070 který byl rezidentem Elliott domu. 31 00:01:24,070 --> 00:01:26,340 A z nějakého důvodu, to téma jen klikne. 32 00:01:26,340 --> 00:01:29,430 Což znamená, že i já jsem se snažil s ní na nějakou dobu, ale já 33 00:01:29,430 --> 00:01:33,610 bude v mých silách, aby nedocházelo každý takový Boj s tématem, které v konečném důsledku 34 00:01:33,610 --> 00:01:34,580 je velmi silný. 35 00:01:34,580 --> 00:01:37,350 >> Ve skutečnosti je jedním z témat, probereme V následujících týdnech je to, že 36 00:01:37,350 --> 00:01:41,130 cenného papíru, a jak můžete skutečně využití stroje způsoby 37 00:01:41,130 --> 00:01:42,320 , které nejsou určeny. 38 00:01:42,320 --> 00:01:45,850 A ty vykořisťování jsou obvykle výsledkem chyb chyby, které se 39 00:01:45,850 --> 00:01:49,740 lidé tím, že pochopení některých podkladového provádění 40 00:01:49,740 --> 00:01:52,250 informace, které jsou prostřednictvím programů. 41 00:01:52,250 --> 00:01:55,410 >> Teď aby to zdát více uživatelsky přátelský, jsem myslel, že hrát 10 42 00:01:55,410 --> 00:01:59,680 Druhý náhled trochu claymation Obrázek s názvem Binky, který byl do 43 00:01:59,680 --> 00:02:03,020 Život by náš přítel na Stanfordu, Profesor Nick Parlante. 44 00:02:03,020 --> 00:02:06,753 Takže mi dovolte, abych vám dal tohle teaser na Binky zde. 45 00:02:06,753 --> 00:02:09,520 >> [PŘEHRÁVÁNÍ] 46 00:02:09,520 --> 00:02:10,380 >> -Hej, Binky. 47 00:02:10,380 --> 00:02:11,050 Probuďte se. 48 00:02:11,050 --> 00:02:13,610 Je čas na ukazatel zábavu. 49 00:02:13,610 --> 00:02:14,741 >> -Co je to? 50 00:02:14,741 --> 00:02:16,440 Informace o ukazateli? 51 00:02:16,440 --> 00:02:17,928 Oh, cukrovinka. 52 00:02:17,928 --> 00:02:18,920 >> [END PŘEHRÁVÁNÍ] 53 00:02:18,920 --> 00:02:20,670 >> DAVID Malan: To je Stanford počítačová věda. 54 00:02:20,670 --> 00:02:23,194 Takže více o tom přijít. 55 00:02:23,194 --> 00:02:24,930 >> [APPLAUSE] 56 00:02:24,930 --> 00:02:26,660 >> DAVID Malan: Je nám líto, Nicku. 57 00:02:26,660 --> 00:02:30,680 >> Takže připomenout, že minule jsme skončili na je to opravdu vzrušující cliffhanger 58 00:02:30,680 --> 00:02:32,960 přičemž tato funkce prostě nefungovalo. 59 00:02:32,960 --> 00:02:34,960 Alespoň intuitivně, bylo to jako by to mělo fungovat. 60 00:02:34,960 --> 00:02:37,600 Jednoduše prohození hodnot ze dvou celých čísel. 61 00:02:37,600 --> 00:02:40,915 Ale vzpomínám, že když jsme si vytiskli původní hodnoty v hlavním jeden a 62 00:02:40,915 --> 00:02:44,210 dva, oni byli ještě jednou a dva a ne dva a jeden. 63 00:02:44,210 --> 00:02:46,070 >> Takže dovolte mi vlastně přepínat přes spotřebiče. 64 00:02:46,070 --> 00:02:50,180 A napsal jsem se trochu kosterního kódu v předem tady, kde tvrdím, že x 65 00:02:50,180 --> 00:02:52,500 bude 1, bude mít y 2. 66 00:02:52,500 --> 00:02:54,810 Pak jsem vytisknout oba jejich hodnoty s potiskem f. 67 00:02:54,810 --> 00:02:57,540 >> Pak jsem tady tvrdí, že budeme swap. 68 00:02:57,540 --> 00:03:00,800 Nechal jsem prázdné místo tu pro nás vyplnit dnes za chvíli. 69 00:03:00,800 --> 00:03:03,380 Pak budu tvrdit, že dvě proměnné byly zaměněny. 70 00:03:03,380 --> 00:03:04,770 Pak jdu k tisku je ven. 71 00:03:04,770 --> 00:03:07,090 A tak doufejme, že bych měl vidět 1, 2. 72 00:03:07,090 --> 00:03:07,380 2, 1. 73 00:03:07,380 --> 00:03:09,830 Je to super jednoduché Cílem právě teď. 74 00:03:09,830 --> 00:03:12,430 >> Tak jak jsme se jít o výměně dvě proměnné? 75 00:03:12,430 --> 00:03:17,220 No, pokud navrhuji zde, že tyto poháry může představovat v paměti počítače. 76 00:03:17,220 --> 00:03:19,070 To je jen pár kousnutí, to Je ještě několik kousnutí. 77 00:03:19,070 --> 00:03:23,260 Mohli bychom se dobrovolnické Pojď nahoru a mix nám něco k pití, když to povědomě? 78 00:03:23,260 --> 00:03:23,920 Pojď nahoru. 79 00:03:23,920 --> 00:03:24,815 Jak se jmenujete? 80 00:03:24,815 --> 00:03:25,260 >> JESS: Jess. 81 00:03:25,260 --> 00:03:25,690 >> DAVID Malan: Jess? 82 00:03:25,690 --> 00:03:26,540 Pojď nahoru, Jess. 83 00:03:26,540 --> 00:03:29,180 Pokud vám to nevadí, musíme dát Google Sklo na vás, takže můžeme 84 00:03:29,180 --> 00:03:30,430 zvěčnit to. 85 00:03:30,430 --> 00:03:32,800 86 00:03:32,800 --> 00:03:34,670 OK, sklo. 87 00:03:34,670 --> 00:03:37,250 Nahrávání videa. 88 00:03:37,250 --> 00:03:43,103 A OK, jsou dobré jít s Jessem zde. 89 00:03:43,103 --> 00:03:43,810 Dobrá. 90 00:03:43,810 --> 00:03:45,120 Rád Vás vidím. 91 00:03:45,120 --> 00:03:47,720 >> Takže to, co bych chtěl tady děláte - pokud byste mohl, poměrně rychle - 92 00:03:47,720 --> 00:03:51,040 právě nalévá nám půl sklenice oranžové šťávy a půl sklenice mléka, 93 00:03:51,040 --> 00:03:55,710 což účinně čísla 1 v jednom šálku a 2 v druhém šálku. 94 00:03:55,710 --> 00:04:01,380 95 00:04:01,380 --> 00:04:02,630 >> To bude dobré záběry. 96 00:04:02,630 --> 00:04:04,910 97 00:04:04,910 --> 00:04:05,860 >> JESS: Omlouvám se. 98 00:04:05,860 --> 00:04:06,330 >> DAVID Malan: Ne, ne. 99 00:04:06,330 --> 00:04:08,703 To je v pořádku. 100 00:04:08,703 --> 00:04:10,120 Pěkný. 101 00:04:10,120 --> 00:04:12,950 Dobře, takže máme čtyři byty stojí pomerančového džusu. 102 00:04:12,950 --> 00:04:14,460 Budeme to nazval hodnotu 1. 103 00:04:14,460 --> 00:04:16,579 Nyní další čtyři bajty v hodnotě mléka. 104 00:04:16,579 --> 00:04:18,519 Bude říkat, že hodnota 2. 105 00:04:18,519 --> 00:04:20,440 Takže x a y, resp. 106 00:04:20,440 --> 00:04:23,450 >> Dobře, takže teď, pokud úkol po ruce - pro vás, Jess, před všemi 107 00:04:23,450 --> 00:04:24,270 svých spolužáků - 108 00:04:24,270 --> 00:04:28,510 je swap hodnoty x a y takové, že chceme pomerančové šťávy 109 00:04:28,510 --> 00:04:32,070 další pohár a mléka v tomto poháru, jak Možná si - než je skutečně dělat 110 00:04:32,070 --> 00:04:34,020 je - jít asi dělá? 111 00:04:34,020 --> 00:04:35,220 >> OK, moudré rozhodnutí. 112 00:04:35,220 --> 00:04:36,340 Takže budete potřebovat trochu více paměti. 113 00:04:36,340 --> 00:04:38,190 Takže pojďme přidělit dočasný pohár, chcete-li. 114 00:04:38,190 --> 00:04:40,540 A nyní přistoupit k výměně x a y. 115 00:04:40,540 --> 00:04:52,950 116 00:04:52,950 --> 00:04:53,530 >> Výborný. 117 00:04:53,530 --> 00:04:54,420 Takže velmi dobře. 118 00:04:54,420 --> 00:04:55,670 Děkuji moc, Jess. 119 00:04:55,670 --> 00:04:59,520 120 00:04:59,520 --> 00:05:00,020 Prosím. 121 00:05:00,020 --> 00:05:01,950 Trochu suvenýr. 122 00:05:01,950 --> 00:05:04,350 >> OK, tak samozřejmě, super jednoduchý nápad. 123 00:05:04,350 --> 00:05:07,500 Zcela intuitivní, že potřebujeme trochu více úložného prostoru - v této podobě, 124 00:05:07,500 --> 00:05:09,750 šálek - pokud se opravdu chcete výměna těchto dvou proměnných. 125 00:05:09,750 --> 00:05:11,110 Takže pojďme dělat přesně to. 126 00:05:11,110 --> 00:05:14,330 Až tady mezi tím, kde tvrdím, že jsem bude dělat nějaké vyměňovat, já 127 00:05:14,330 --> 00:05:15,720 jděte do toho a prohlásit tepl. 128 00:05:15,720 --> 00:05:17,980 A já nastavte ji rovno, řekněme, x. 129 00:05:17,980 --> 00:05:21,110 >> Pak jdu změnit hodnotu x, stejně jako Jess jsem tady s 130 00:05:21,110 --> 00:05:23,200 mléko a pomerančový džus být rovno y. 131 00:05:23,200 --> 00:05:27,460 A já pro změnu y se rovná k ne x, protože teď budeme 132 00:05:27,460 --> 00:05:29,530 uvízl v kruhu, ale spíše temp. 133 00:05:29,530 --> 00:05:33,170 Tam, kde jsem dočasně - nebo tam, kde Jess dočasně dát pomerančový džus 134 00:05:33,170 --> 00:05:35,460 před přepisování, že šálek s mlékem. 135 00:05:35,460 --> 00:05:37,250 >> Tak mě nech jít dopředu a teď aby to. 136 00:05:37,250 --> 00:05:39,210 Říká se noswap.c. 137 00:05:39,210 --> 00:05:41,190 A teď mi dovolte běžet bez swapu. 138 00:05:41,190 --> 00:05:43,910 A skutečně vidím, když jsem rozšířit Okno trochu, že 139 00:05:43,910 --> 00:05:45,160 x je 1, y je 2.. 140 00:05:45,160 --> 00:05:47,230 A pak je x 2, y 1. 141 00:05:47,230 --> 00:05:51,910 >> Ale připomínám, že v pondělí jsme udělali věci trochu jinak, kdy jsem 142 00:05:51,910 --> 00:05:56,760 místo toho splnil pomocnou funkci, chcete-li, že byl vlastně neplatné. 143 00:05:56,760 --> 00:05:58,010 Volal jsem ji vyměnit. 144 00:05:58,010 --> 00:06:01,600 Dal jsem to dva parametry, a zavolal jsem jim a nazval jsem ho b. 145 00:06:01,600 --> 00:06:04,380 >> Upřímně řečeno, bych mohl nazvat x a y. 146 00:06:04,380 --> 00:06:06,040 Není nic zastavit mě v tom, že. 147 00:06:06,040 --> 00:06:08,140 Ale já bych tvrdit, že je to pak trochu nejasné. 148 00:06:08,140 --> 00:06:11,910 Vzhledem k tomu, připomínají na pondělí, že jsme uvedla, že tyto parametry byly 149 00:06:11,910 --> 00:06:13,650 kopie hodnot prošel dovnitř 150 00:06:13,650 --> 00:06:15,640 Tak to prostě zmatky s mysli, myslím, že pokud použijete 151 00:06:15,640 --> 00:06:17,370 přesně stejné proměnné. 152 00:06:17,370 --> 00:06:20,150 >> Tak jsem si místo toho jim říkat a b, jen pro přehlednost. 153 00:06:20,150 --> 00:06:21,840 Ale mohli bychom jim říkat nejvíce něco chceme. 154 00:06:21,840 --> 00:06:26,280 A já jdu zkopírovat a vložit účinně tento kód odtamtud 155 00:06:26,280 --> 00:06:27,170 dolů do zde. 156 00:06:27,170 --> 00:06:29,110 Protože jsem viděl, že to funguje. 157 00:06:29,110 --> 00:06:30,790 Tak to je v dobrém stavu. 158 00:06:30,790 --> 00:06:37,390 A já se změním x do x, mé na můj y b a můj y do bodu B. 159 00:06:37,390 --> 00:06:39,130 >> Takže jinými slovy, přesně stejná logika. 160 00:06:39,130 --> 00:06:40,850 Přesně to samé, že Jess udělal. 161 00:06:40,850 --> 00:06:44,350 A pak jedna věc, kterou musíte udělat, až zde, samozřejmě, je nyní vyvolat toto 162 00:06:44,350 --> 00:06:45,990 funkce nebo volání této funkce. 163 00:06:45,990 --> 00:06:50,430 Tak jsem se volat tuto funkci se dvěma vstupy, x a y, a stiskněte Uložit. 164 00:06:50,430 --> 00:06:52,300 >> Dobře, tak zásadně totéž. 165 00:06:52,300 --> 00:06:55,570 Ve skutečnosti jsem asi udělal program zbytečně složité podle 166 00:06:55,570 --> 00:07:00,820 psát nějakou funkci, která je jen zabírají asi šest řádků kódu zatímco já 167 00:07:00,820 --> 00:07:02,970 předtím realizovány To jen tři. 168 00:07:02,970 --> 00:07:06,230 >> Tak mě nech jít dopředu a hned předělat to, aby žádný swapu. 169 00:07:06,230 --> 00:07:07,920 Dobře, já to zvoral zde. 170 00:07:07,920 --> 00:07:11,290 To by mělo být chyba, kterou by mohly ve stále běžně jako vaše 171 00:07:11,290 --> 00:07:12,380 Programy se složitější. 172 00:07:12,380 --> 00:07:13,470 Ale je snadné opravit. 173 00:07:13,470 --> 00:07:15,650 Dovolte mi, abych se posunout zpět sem. 174 00:07:15,650 --> 00:07:18,190 >> A co je první chyba vidím? 175 00:07:18,190 --> 00:07:19,520 Implicitní prohlášení. 176 00:07:19,520 --> 00:07:21,466 Co to zpravidla označují? 177 00:07:21,466 --> 00:07:22,830 Zapomněl jsem prototyp. 178 00:07:22,830 --> 00:07:26,900 Zapomněl jsem učit kompilátoru, že výměna bude existovat, i když 179 00:07:26,900 --> 00:07:28,920 neexistuje na samém počátku programu. 180 00:07:28,920 --> 00:07:35,780 Tak jsem jen chtěl říct, void, swap, int, int b, středník. 181 00:07:35,780 --> 00:07:37,280 >> Tak jsem se nebudu jej implementujeme. 182 00:07:37,280 --> 00:07:39,140 Ale teď to odpovídá tomu, co tady dole. 183 00:07:39,140 --> 00:07:42,530 A oznámení, absence středníkem zde, což není nutné, pokud 184 00:07:42,530 --> 00:07:43,200 provádění. 185 00:07:43,200 --> 00:07:46,010 >> Dovolte mi tedy předělat to, aby žádný swapu. 186 00:07:46,010 --> 00:07:46,910 Mnohem lepší tvar. 187 00:07:46,910 --> 00:07:48,130 Běh bez swapu. 188 00:07:48,130 --> 00:07:48,740 A sakra. 189 00:07:48,740 --> 00:07:51,650 Teď jsme tam, kde jsme byli v pondělí, kde to nebude zaměnit. 190 00:07:51,650 --> 00:07:55,410 >> A co je intuitivní vysvětlení , proč je tomu tak? 191 00:07:55,410 --> 00:07:56,380 Jo? 192 00:07:56,380 --> 00:07:57,630 >> STUDENT: [neslyšitelné]. 193 00:07:57,630 --> 00:08:04,140 194 00:08:04,140 --> 00:08:05,230 >> DAVID Malan: Přesně tak. 195 00:08:05,230 --> 00:08:07,330 Tak a a b jsou kopie xa y. 196 00:08:07,330 --> 00:08:10,680 A ve skutečnosti, pokaždé, když jsem byl volání funkce tak daleko, že se 197 00:08:10,680 --> 00:08:12,540 prochází proměnných, jako je ints - 198 00:08:12,540 --> 00:08:14,470 stejně jako odkládací čeká zde - 199 00:08:14,470 --> 00:08:16,270 vy byly předáním kopií. 200 00:08:16,270 --> 00:08:19,150 >> Teď to znamená, že to trvá trochu času, zlomek vteřiny, pro 201 00:08:19,150 --> 00:08:23,270 počítače zkopírovat bitů z jednoho variabilní do bitů druhého. 202 00:08:23,270 --> 00:08:24,610 Ale to není tak velký problém. 203 00:08:24,610 --> 00:08:25,920 Ale oni přesto kopie. 204 00:08:25,920 --> 00:08:30,020 >> A tak nyní, v souvislosti s swapu, Jsem ve skutečnosti úspěšně 205 00:08:30,020 --> 00:08:31,180 měnící se a a b. 206 00:08:31,180 --> 00:08:33,000 Ve skutečnosti, pojďme rychle zdravý rozum zkontrolovat. 207 00:08:33,000 --> 00:08:36,830 Vytisknout f je% i, nový řádek. 208 00:08:36,830 --> 00:08:38,770 A pojďme se zapojit. 209 00:08:38,770 --> 00:08:41,830 Nyní se pojďme udělat to samé s b.. 210 00:08:41,830 --> 00:08:43,640 A pojďme udělat to samé tady. 211 00:08:43,640 --> 00:08:47,260 >> A nyní mi dovolte, abych kopírovat ty stejné linky opět ve spodní části funkce 212 00:08:47,260 --> 00:08:51,250 po mé tři řádky zajímavé mohl provádět, a 213 00:08:51,250 --> 00:08:53,270 vytisknout a b ještě jednou. 214 00:08:53,270 --> 00:08:56,030 Takže teď pojďme udělat to, aby žádný swapu. 215 00:08:56,030 --> 00:08:58,430 Dovolte mi, abych okno terminálu trochu vyšší, takže můžeme vidět 216 00:08:58,430 --> 00:08:59,520 víc najednou. 217 00:08:59,520 --> 00:09:00,860 >> A spustit bez swapu. 218 00:09:00,860 --> 00:09:04,000 x je 1, y je 2.. je 1, b je 2. 219 00:09:04,000 --> 00:09:06,070 A pak, je 2, b je 1. 220 00:09:06,070 --> 00:09:09,390 Tak to funguje, stejně jako Jess jsem tady uvnitř swapu. 221 00:09:09,390 --> 00:09:13,090 Ale samozřejmě, že to nemá žádný vliv na proměnné v main. 222 00:09:13,090 --> 00:09:15,360 >> Takže jsme viděli trik, kdy jsme mohl opravit, ne? 223 00:09:15,360 --> 00:09:19,560 Když jste tváří v tvář této vymezení rozsahu problém, mohl by si vsadit a vydělat x 224 00:09:19,560 --> 00:09:22,400 a y jaké proměnné místo? 225 00:09:22,400 --> 00:09:23,390 >> Dalo by se, aby byly globální. 226 00:09:23,390 --> 00:09:27,560 Dejte je na samém vrcholu tohoto souboru jako jsme to udělali, a to i ve hře 15. 227 00:09:27,560 --> 00:09:28,890 Používáme globální proměnné. 228 00:09:28,890 --> 00:09:32,420 Ale v rámci hry 15, to je rozumné mít globální 229 00:09:32,420 --> 00:09:37,170 proměnná reprezentující desku, protože celistvost 15.c je vše 230 00:09:37,170 --> 00:09:38,650 o provádění tohoto hru. 231 00:09:38,650 --> 00:09:41,470 To je to, co existuje soubor dělat. 232 00:09:41,470 --> 00:09:44,170 >> Ale v tomto případě tady, jsem volání funkce swapu. 233 00:09:44,170 --> 00:09:45,380 Chci vyměnit dvě proměnné. 234 00:09:45,380 --> 00:09:48,950 A to by se měl začít cítit nedbalý v případě, že řešení všech našich 235 00:09:48,950 --> 00:09:51,300 problémy, když jsme se spustit do působnosti otázek je, aby to globální. 236 00:09:51,300 --> 00:09:54,730 Protože se velmi rychle, je náš program stane docela zmatek. 237 00:09:54,730 --> 00:09:57,760 A my jsme udělali jen velmi zřídka Výsledkem tohoto 15.c. 238 00:09:57,760 --> 00:10:00,470 >> Ale ukazuje se, že je lepší způsob, jak úplně. 239 00:10:00,470 --> 00:10:05,600 Dovolte mi, abych skutečně vrátit a odstranit vytisknout f je, jen proto, aby zjednodušení tohoto kódu. 240 00:10:05,600 --> 00:10:09,160 A dovolte mi navrhnout, aby to je skutečně špatná. 241 00:10:09,160 --> 00:10:15,990 Ale když jsem se namísto toho v některých hvězdičkami a hvězdy, mohu místo toho proměnit tuto 242 00:10:15,990 --> 00:10:18,670 funkce do jednoho, který je skutečně funkční. 243 00:10:18,670 --> 00:10:25,020 >> Tak nech mě jít zpátky a připustit, říká hvězdička je vždy obtížné, 244 00:10:25,020 --> 00:10:26,170 tak řeknu hvězdy. 245 00:10:26,170 --> 00:10:27,660 Budu Přiznáme do té jedné. 246 00:10:27,660 --> 00:10:28,190 Dobrá. 247 00:10:28,190 --> 00:10:30,190 A teď, co mám dělat místo toho? 248 00:10:30,190 --> 00:10:34,130 >> Takže v první řadě, budu specifikovat že místo předávání int do 249 00:10:34,130 --> 00:10:37,980 Swap funkce, jsem místo jít říct int hvězdu. 250 00:10:37,980 --> 00:10:39,170 A teď, co se hvězda uvést? 251 00:10:39,170 --> 00:10:41,970 Je to, že pojem ukazatel, který Binky, claymation postava, byl 252 00:10:41,970 --> 00:10:43,465 s odkazem na chvíli zpátky. 253 00:10:43,465 --> 00:10:47,610 >> Takže když říkáme pravý hvězdu, význam teď je to, že se nebude 254 00:10:47,610 --> 00:10:49,110 prošel v její hodnotou. 255 00:10:49,110 --> 00:10:50,350 To nebude kopírovat palců 256 00:10:50,350 --> 00:10:54,700 Spíše adresa je bude předán palců 257 00:10:54,700 --> 00:10:57,840 >> Takže připomenout, že uvnitř vašeho počítače je celá parta paměti, jinak 258 00:10:57,840 --> 00:10:58,760 známý jako RAM. 259 00:10:58,760 --> 00:11:00,520 A to je jen RAM celá parta bajtů. 260 00:11:00,520 --> 00:11:03,320 Takže pokud váš Mac nebo PC má dva GB, budete mít 2 261 00:11:03,320 --> 00:11:05,760 miliarda bajtů paměti. 262 00:11:05,760 --> 00:11:08,440 >> Nyní jen předpokládat, že jen proto, aby udržet věci pěkné a uspořádaně jsme 263 00:11:08,440 --> 00:11:09,450 přiřazení adresy - 264 00:11:09,450 --> 00:11:10,170 číslo - 265 00:11:10,170 --> 00:11:12,270 je ke každému byte paměti RAM v počítači. 266 00:11:12,270 --> 00:11:15,410 Úplně první byte z těchto 2 miliard je o číslo nula. 267 00:11:15,410 --> 00:11:18,572 Další je bajt číslo jedna, číslo dva, celou cestu nahoru, dot dot 268 00:11:18,572 --> 00:11:20,530 tečka, na zhruba 2 miliardy. 269 00:11:20,530 --> 00:11:23,640 >> Takže můžete počet bajtů paměti v počítači. 270 00:11:23,640 --> 00:11:26,460 Takže předpokládejme, že to je to, co máme na mysli adresu. 271 00:11:26,460 --> 00:11:31,360 Takže když vidím pravý hvězdu, co se děje které mají být předány do swapu je nyní 272 00:11:31,360 --> 00:11:32,830 adresa. 273 00:11:32,830 --> 00:11:37,150 Ne jeho hodnota, ale bez ohledu na jeho poštovní adresa, abych tak řekl - 274 00:11:37,150 --> 00:11:38,810 jeho umístění v paměti RAM. 275 00:11:38,810 --> 00:11:41,250 >> A podobně pro B, jdu říci totéž. 276 00:11:41,250 --> 00:11:42,720 Int, hvězdu, b. 277 00:11:42,720 --> 00:11:46,350 Jako stranou, technicky hvězdy mohl jít i na jiných místech. 278 00:11:46,350 --> 00:11:50,140 Ale budeme standardizovat hvězdy bytí hned vedle datového typu. 279 00:11:50,140 --> 00:11:54,080 >> Takže vyměnit podpis nyní znamená, dej mi adresa int a volání 280 00:11:54,080 --> 00:11:55,400 že adresa. 281 00:11:55,400 --> 00:11:58,690 A dej mi ještě jednu adresu int a volat, že Adresa B. 282 00:11:58,690 --> 00:12:01,120 >> Ale teď můj kód zde se musí změnit. 283 00:12:01,120 --> 00:12:03,470 Protože pokud Prohlašuji, int temp - 284 00:12:03,470 --> 00:12:05,580 , který je stále ještě typu int - 285 00:12:05,580 --> 00:12:08,700 ale uložit v něm, jaké hodnoty? 286 00:12:08,700 --> 00:12:12,870 Aby bylo jasno, já jsem uvedení se kód, který je napsán právě teď? 287 00:12:12,870 --> 00:12:14,360 >> Dávám umístění v. 288 00:12:14,360 --> 00:12:16,500 Ale já se nestarám o místo, ne? 289 00:12:16,500 --> 00:12:21,940 Temp existuje jen Jess třetí šálek existovala, za jakým účelem? 290 00:12:21,940 --> 00:12:23,090 Pro uložení hodnoty. 291 00:12:23,090 --> 00:12:24,830 Mléko nebo pomerančový džus. 292 00:12:24,830 --> 00:12:28,520 Není skutečně uložit adresu jeden z těch věcí, které se cítí 293 00:12:28,520 --> 00:12:31,200 trochu nesmyslné v tomto reálném světový kontext, tak jako tak. 294 00:12:31,200 --> 00:12:34,990 >> Takže opravdu to, co chci, aby v temp není adresa, ale 295 00:12:34,990 --> 00:12:36,180 obsah. 296 00:12:36,180 --> 00:12:41,930 Takže, pokud je číslo jako 123, to je 123. byte paměti, že právě 297 00:12:41,930 --> 00:12:45,090 stane se okupační, že hodnota v se stane být zabírá. 298 00:12:45,090 --> 00:12:49,040 >> Pokud chci jít na tuto adresu, Musím říci, hvězdu. 299 00:12:49,040 --> 00:12:52,610 Stejně tak, pokud bych měl změnit to, co je na adresu, změním 300 00:12:52,610 --> 00:12:53,570 to spustit. 301 00:12:53,570 --> 00:12:58,185 Pokud chci uložit v tom, co je na místo s tím, co je v místě, 302 00:12:58,185 --> 00:13:02,180 na b, b hvězda hvězda. 303 00:13:02,180 --> 00:13:05,340 >> Takže ve zkratce, i když to není zcela potopení dosud - a já bych nečekal 304 00:13:05,340 --> 00:13:06,560 že by to tak rychle - 305 00:13:06,560 --> 00:13:11,100 Uvědomujeme si, že všechno, co dělám je prefixu tyto hvězdy na mé proměnných, 306 00:13:11,100 --> 00:13:13,350 rčení nechcete chytit hodnoty. 307 00:13:13,350 --> 00:13:14,520 Neměňte hodnoty. 308 00:13:14,520 --> 00:13:17,600 Ale spíše, přejděte na tyto adresy a získat hodnotu. 309 00:13:17,600 --> 00:13:21,430 Přejděte na tuto adresu a změny hodnota tam. 310 00:13:21,430 --> 00:13:25,500 >> Takže teď mi dovolte se posunout zpět na vrchol, jen opravit tento řádek zde, 311 00:13:25,500 --> 00:13:27,690 změnit tak, aby odpovídal prototyp. 312 00:13:27,690 --> 00:13:30,280 Ale já teď musíte udělat jednu věc. 313 00:13:30,280 --> 00:13:35,500 Intuitivně, jestli jsem změnil typy argumentů, že prohodí očekává, 314 00:13:35,500 --> 00:13:37,245 co ještě musím změna v mém kódu? 315 00:13:37,245 --> 00:13:39,750 316 00:13:39,750 --> 00:13:40,840 >> Když říkám swapu. 317 00:13:40,840 --> 00:13:43,340 Protože právě teď, co jsem I kolem vyměnit ještě? 318 00:13:43,340 --> 00:13:47,450 Hodnota x a hodnota y, nebo mléko a pomerančový džus. 319 00:13:47,450 --> 00:13:48,510 Ale já nechci dělat. 320 00:13:48,510 --> 00:13:51,060 Já místo toho chcete předat, co? 321 00:13:51,060 --> 00:13:53,050 Umístění X a umístění y. 322 00:13:53,050 --> 00:13:55,300 Jaké jsou jejich poštovní adresy, abych tak řekl. 323 00:13:55,300 --> 00:13:57,600 >> Takže dělat, že tam je ampersand. 324 00:13:57,600 --> 00:13:59,260 Ampersand trochu zní jako adresu. 325 00:13:59,260 --> 00:14:03,240 tak n, ampersand, adresa z x a y adresu. 326 00:14:03,240 --> 00:14:06,790 Takže je to úmyslné, které používáme ampersandy při volání funkce, 327 00:14:06,790 --> 00:14:10,230 a hvězdy při ohlášení a kdy provádění funkce. 328 00:14:10,230 --> 00:14:14,220 >> A jen si ampersand jako adresa provozovatele, a hvězdy jako 329 00:14:14,220 --> 00:14:15,490 tam operátor - 330 00:14:15,490 --> 00:14:18,640 , nebo, přesněji, dereference operátor. 331 00:14:18,640 --> 00:14:23,480 Tak to je celá řada slov, jen aby říci, že nyní, doufejme, že výměna se děje 332 00:14:23,480 --> 00:14:24,440 správné. 333 00:14:24,440 --> 00:14:26,550 >> Nech mě jít dál a dělat - 334 00:14:26,550 --> 00:14:30,940 pojďme vlastně soubor přejmenovat, jinak tento program i nadále dosažitelní žádný swap. 335 00:14:30,940 --> 00:14:33,240 Tvrdím, že budeme říkat swap.c teď. 336 00:14:33,240 --> 00:14:35,670 Takže si, swap. 337 00:14:35,670 --> 00:14:37,520 Dot, lomítko, swap. 338 00:14:37,520 --> 00:14:40,210 >> A nyní skutečně, x je 1, y je 2.. 339 00:14:40,210 --> 00:14:44,040 A pak, je x 2, y je jedna. 340 00:14:44,040 --> 00:14:46,500 No uvidíme, jestli můžeme to udělat trochu jinak, pokud jde o to, co je 341 00:14:46,500 --> 00:14:47,180 tady děje. 342 00:14:47,180 --> 00:14:51,250 Nejprve mi dovolte přiblížit na našich kreslení obrazovku zde. 343 00:14:51,250 --> 00:14:54,160 A dovolte mi navrhnout na chvíli - a když jsem kreslit zde se odrazí 344 00:14:54,160 --> 00:14:58,660 tam nyní - dovolte mi navrhnout, aby tady je celá parta paměti nebo 345 00:14:58,660 --> 00:15:00,540 RAM, uvnitř mého počítače. 346 00:15:00,540 --> 00:15:04,140 >> A to bude sousto číslo, řekněme, 1. 347 00:15:04,140 --> 00:15:05,720 To bude mít číslo 2 bajty. 348 00:15:05,720 --> 00:15:08,220 A já budu dělat spoustu více, a pak banda dot dot tečky na 349 00:15:08,220 --> 00:15:10,880 naznačují, že tam je 2 miliardy z těchto věcí. 350 00:15:10,880 --> 00:15:13,520 4, 5, a tak dále. 351 00:15:13,520 --> 00:15:17,055 >> Takže tam jsou prvními pěti bajtů mé paměti počítače. 352 00:15:17,055 --> 00:15:17,560 V pořádku? 353 00:15:17,560 --> 00:15:19,060 Velmi málo z 2 mld. Kč. 354 00:15:19,060 --> 00:15:21,120 Ale teď jdu navrhnout následující. 355 00:15:21,120 --> 00:15:27,490 Budu navrhovat, že x bude uložit číslo 1 a y se děje 356 00:15:27,490 --> 00:15:29,690 uložit číslo 2. 357 00:15:29,690 --> 00:15:35,000 A nech mě jít napřed a představuje nyní tyto hodnoty takto. 358 00:15:35,000 --> 00:15:41,510 >> Pojďme na to takto. 359 00:15:41,510 --> 00:15:42,870 Dej mi jednu sekundu. 360 00:15:42,870 --> 00:15:44,150 Jedna sekunda. 361 00:15:44,150 --> 00:15:45,680 OK. 362 00:15:45,680 --> 00:15:47,560 Chci, aby to trochu - 363 00:15:47,560 --> 00:15:50,440 jdeme na to znovu. 364 00:15:50,440 --> 00:15:53,250 Jinak jdu a používání stejná čísla, neúmyslně, 365 00:15:53,250 --> 00:15:54,230 vícekrát. 366 00:15:54,230 --> 00:15:57,320 >> Takže jen tak máme různá čísla mluvit, nazvěme tento bajt 367 00:15:57,320 --> 00:16:03,391 číslo 123, 124, 125, 126, a dot dot dot. 368 00:16:03,391 --> 00:16:08,400 A dovolte mi tvrdí, že teď budu dát hodnotu 1 tady, a hodnotu 2 369 00:16:08,400 --> 00:16:11,990 zde, jinak známý jako x a y. 370 00:16:11,990 --> 00:16:15,300 Tak to jen tak se stane, že to je x, to je y. 371 00:16:15,300 --> 00:16:18,180 >> A jen nějakou náhodou, počítače, operační systém, 372 00:16:18,180 --> 00:16:21,890 stalo, aby X na místě číslo 123. 373 00:16:21,890 --> 00:16:25,590 A y skončil na místě 124 - 374 00:16:25,590 --> 00:16:26,330 sakra. 375 00:16:26,330 --> 00:16:28,700 Měl jsem opravil toto. 376 00:16:28,700 --> 00:16:34,040 Člověče, mám opravdu chcete udělat? 377 00:16:34,040 --> 00:16:37,340 Ano, chci to napravit a b správné o tom dnes. 378 00:16:37,340 --> 00:16:39,950 Omlouváme se, ale na této nové. 379 00:16:39,950 --> 00:16:45,020 >> 127, 131, a nechtěl jsem, aby se to složité, ale proč jsem se změnil 380 00:16:45,020 --> 00:16:46,340 Čísla tam? 381 00:16:46,340 --> 00:16:48,360 Protože chci, aby se ints ve skutečnosti čtyři bajty. 382 00:16:48,360 --> 00:16:49,810 Takže pojďme být super anal o tom. 383 00:16:49,810 --> 00:16:53,800 Tak, že pokud se stane, 1 je třeba se zabývat 123, 2 bude na adrese 384 00:16:53,800 --> 00:16:55,730 127, protože je to jen 4 byes pryč. 385 00:16:55,730 --> 00:16:56,210 To je vše. 386 00:16:56,210 --> 00:16:58,640 A budeme zapomenout na všechny Ostatní adresy na světě. 387 00:16:58,640 --> 00:17:03,320 >> Takže x je v místě 123, y je v místě 127. 388 00:17:03,320 --> 00:17:05,770 A teď, co mám vlastně chcete dělat? 389 00:17:05,770 --> 00:17:10,099 Když říkám odkládací teď, co je vlastně děje? 390 00:17:10,099 --> 00:17:14,920 No, když říkám swapu jsem předáním adresa x a y na adresu. 391 00:17:14,920 --> 00:17:18,540 Tak například, pokud se tyto dva kusy z papíru nyní představují dvě 392 00:17:18,540 --> 00:17:23,510 argumenty a a b vyměnit, co jsem já budu psát o první z nich, 393 00:17:23,510 --> 00:17:27,720 který budu volat označují jako? 394 00:17:27,720 --> 00:17:30,610 >> Přesně tak, 123. 395 00:17:30,610 --> 00:17:31,905 Tak tohle tvrdím je. 396 00:17:31,905 --> 00:17:32,955 Jedná se o parametr. 397 00:17:32,955 --> 00:17:35,856 Dávám adresu x tam. 398 00:17:35,856 --> 00:17:38,152 >> Co je to? 399 00:17:38,152 --> 00:17:40,890 >> Co je to? 400 00:17:40,890 --> 00:17:41,190 >> Ne, ne. 401 00:17:41,190 --> 00:17:41,720 To je v pořádku. 402 00:17:41,720 --> 00:17:42,570 Ještě dobře, stále dobrá. 403 00:17:42,570 --> 00:17:43,530 Tak to je. 404 00:17:43,530 --> 00:17:46,240 A teď na druhý kus papíru, to bude b, a to, co jsem 405 00:17:46,240 --> 00:17:49,010 bude psát na tento kus papíru? 406 00:17:49,010 --> 00:17:50,080 127. 407 00:17:50,080 --> 00:17:53,720 >> Takže jediná věc, která se změnila od té doby naše předchozí vyprávění tohoto příběhu je, 408 00:17:53,720 --> 00:17:58,590 spíše než doslovně 1 a 2, jsem projet na 123 a 127. 409 00:17:58,590 --> 00:18:02,130 A já jsem teď dám těchto dovnitř této kolonky, v pořádku? 410 00:18:02,130 --> 00:18:04,640 Tak, že černá skříňka se představuje swap funkce. 411 00:18:04,640 --> 00:18:07,230 >> Mezitím, pojďme se teď někdo implementovat odkládací funkci. 412 00:18:07,230 --> 00:18:09,090 Někdo by tady jako dobrovolník? 413 00:18:09,090 --> 00:18:09,560 Pojď nahoru. 414 00:18:09,560 --> 00:18:11,080 Jak se jmenujete? 415 00:18:11,080 --> 00:18:11,460 Charlie. 416 00:18:11,460 --> 00:18:12,080 Dobře, Charlie. 417 00:18:12,080 --> 00:18:14,810 Pojď nahoru. 418 00:18:14,810 --> 00:18:17,310 >> Takže Charlie bude hrát role naší černé skříňky. 419 00:18:17,310 --> 00:18:21,460 A Charlie, co bych chtěl, abys Nyní je realizována swapu takovým způsobem, 420 00:18:21,460 --> 00:18:25,320 že vzhledem k tomu, tyto dvě adresy, jste se vlastně děje 421 00:18:25,320 --> 00:18:26,330 ke změně hodnot. 422 00:18:26,330 --> 00:18:28,290 A já budu šeptat do ucha jak spustit TV zde. 423 00:18:28,290 --> 00:18:29,930 >> Takže jděte do toho, a ty jsi černé skříňky. 424 00:18:29,930 --> 00:18:30,920 Oslovte tam. 425 00:18:30,920 --> 00:18:34,054 Jaké hodnoty vidíte na a jaké hodnoty vidíte na b? 426 00:18:34,054 --> 00:18:36,740 >> CHARLIE: je 123 a b je 127. 427 00:18:36,740 --> 00:18:37,530 >> DAVID Malan: OK, přesně tak. 428 00:18:37,530 --> 00:18:38,940 Nyní pozastavit tam jen na chvíli. 429 00:18:38,940 --> 00:18:41,680 První věc, kterou budete dělat teď, podle kódu - což 430 00:18:41,680 --> 00:18:43,220 Budu se vytáhnout na obrazovce - 431 00:18:43,220 --> 00:18:46,750 bude přidělit trochu bit paměti s názvem temp. 432 00:18:46,750 --> 00:18:48,850 Takže budu pokračovat a vám, že paměť. 433 00:18:48,850 --> 00:18:52,210 >> Takže to bude třetí proměnné že máte přístup k 434 00:18:52,210 --> 00:18:54,080 voláš tepl. 435 00:18:54,080 --> 00:18:57,120 A co budete psát na temp kus papíru? 436 00:18:57,120 --> 00:19:02,524 437 00:19:02,524 --> 00:19:03,470 >> CHARLIE: Ukazatele, že jo? 438 00:19:03,470 --> 00:19:04,790 >> DAVID Malan: OK, dobře není nutně ukazatele. 439 00:19:04,790 --> 00:19:07,230 Takže řádek kódu, který jsem zvýrazněna na pravé straně, 440 00:19:07,230 --> 00:19:07,900 začněme tam. 441 00:19:07,900 --> 00:19:08,890 To říká hvězda. 442 00:19:08,890 --> 00:19:11,670 Takže se v současné době skladování číslo 123. 443 00:19:11,670 --> 00:19:16,660 A jen intuitivně, co se hvězda 123 znamená? 444 00:19:16,660 --> 00:19:21,630 >> Ale zejména, je-li je 123, hvězda znamená co? 445 00:19:21,630 --> 00:19:22,560 Hodnota. 446 00:19:22,560 --> 00:19:24,580 Nebo neformálně, jděte tam. 447 00:19:24,580 --> 00:19:28,620 Takže mi dovolte navrhnout, že drží v tvá ruka, jděte do toho a léčbě, které 448 00:19:28,620 --> 00:19:29,430 jako když je to mapa. 449 00:19:29,430 --> 00:19:32,940 A chodit sami se k počítači je paměť, a najít to, co je nám 450 00:19:32,940 --> 00:19:36,520 na místě 123. 451 00:19:36,520 --> 00:19:37,720 Přesně tak. 452 00:19:37,720 --> 00:19:41,100 >> Vidíme tedy, na místě 123 je to, samozřejmě? 453 00:19:41,100 --> 00:19:44,240 OK, takže to, co hodnota teď jste dám do temp? 454 00:19:44,240 --> 00:19:44,750 Přesně tak. 455 00:19:44,750 --> 00:19:45,600 Takže jděte do toho a dělat, že. 456 00:19:45,600 --> 00:19:51,280 A napište číslo 1 na kus papír, který je v současné době s názvem temp. 457 00:19:51,280 --> 00:19:53,540 >> A nyní další krok, který budete realizovat 458 00:19:53,540 --> 00:19:54,310 bude to. 459 00:19:54,310 --> 00:19:57,820 No, na pravé straně Následující řádek kódu je hvězda b. b, o 460 00:19:57,820 --> 00:19:59,260 Samozřejmě, ukládá adresu. 461 00:19:59,260 --> 00:20:02,270 To se týká 127. 462 00:20:02,270 --> 00:20:06,620 Hvězda b znamená to, mimochodem řečeno? 463 00:20:06,620 --> 00:20:08,700 >> Přejít na tomto místě. 464 00:20:08,700 --> 00:20:14,988 Takže jděte do toho a najít to, co je nám na místě 127. 465 00:20:14,988 --> 00:20:15,480 OK. 466 00:20:15,480 --> 00:20:19,170 Samozřejmě, že na místě 127, je stále hodnota 2. 467 00:20:19,170 --> 00:20:24,060 Tak co jdeš skladujte při bez ohledu na to na místě v? 468 00:20:24,060 --> 00:20:26,860 Takže hvězdy prostředkem přejděte do umístění na. 469 00:20:26,860 --> 00:20:29,770 Co je umístění? 470 00:20:29,770 --> 00:20:30,430 >> Přesně tak. 471 00:20:30,430 --> 00:20:34,190 Takže teď, pokud chcete změnit co je na tomto místě - 472 00:20:34,190 --> 00:20:36,470 Půjdu napřed a spusťte guma zde. 473 00:20:36,470 --> 00:20:37,760 A teď ji zpět na štětec. 474 00:20:37,760 --> 00:20:42,190 Jaké číslo se chystáte psát V tomto boxu prázdné teď? 475 00:20:42,190 --> 00:20:42,850 >> Přesně tak. 476 00:20:42,850 --> 00:20:46,470 Takže tento řádek kódu, aby bylo jasno - ať mi pauza, co dělá, a Charlieho 477 00:20:46,470 --> 00:20:51,730 upozornit na to, co právě udělal, je psát do tohoto pole v místě 123 478 00:20:51,730 --> 00:20:55,150 hodnota, která byla dříve v b.. 479 00:20:55,150 --> 00:20:59,140 A tak jsme nyní provádí opravdu Tento druhý řádek kódu. 480 00:20:59,140 --> 00:21:01,920 >> Teď bohužel, je to ještě jeden řádek zbývající. 481 00:21:01,920 --> 00:21:04,900 Teď, co je v teplotě, a to doslova? 482 00:21:04,900 --> 00:21:06,200 Je to zřejmě číslo jedna. 483 00:21:06,200 --> 00:21:07,020 To není adresa. 484 00:21:07,020 --> 00:21:09,380 Je to jen číslo, druh proměnné z jednoho týdne. 485 00:21:09,380 --> 00:21:13,520 >> A teď, když říkáte, hvězdičkový B, to znamená, že přejít na adresu B, který je na 486 00:21:13,520 --> 00:21:15,090 kurz zde. 487 00:21:15,090 --> 00:21:16,020 Takže jakmile se tam dostanete - 488 00:21:16,020 --> 00:21:18,320 Půjdu napřed a vymazat to, co je ve skutečnosti tam - a to, co jste 489 00:21:18,320 --> 00:21:20,820 budu psát nyní v poloze 127? 490 00:21:20,820 --> 00:21:22,010 >> CHARLIE: Temp, který je jeden. 491 00:21:22,010 --> 00:21:23,430 >> DAVID Malan: Temp, který je jeden. 492 00:21:23,430 --> 00:21:25,670 A co se stane, aby teplota na konci? 493 00:21:25,670 --> 00:21:26,600 No, opravdu nevím. 494 00:21:26,600 --> 00:21:27,420 Nemáme opravdu záleží. 495 00:21:27,420 --> 00:21:31,090 Kdykoliv jsme implementovali funkci tak daleko, nějaké lokální proměnné máte 496 00:21:31,090 --> 00:21:31,890 jsou skutečně místní. 497 00:21:31,890 --> 00:21:33,060 A jen tak zmizet. 498 00:21:33,060 --> 00:21:35,040 Jsou převzaty z provozu systém se. 499 00:21:35,040 --> 00:21:39,800 >> Tak, že teplota stále Hodnota 1 je jakýmsi zásadním způsobem 500 00:21:39,800 --> 00:21:41,150 nezajímá nás. 501 00:21:41,150 --> 00:21:43,100 Dobře, takže potlesk kdybychom mohli pro Charlieho. 502 00:21:43,100 --> 00:21:46,400 Velmi dobře. 503 00:21:46,400 --> 00:21:51,520 >> Dobře, takže co víc dělá to znamená, co můžeme udělat? 504 00:21:51,520 --> 00:21:54,400 Takže se ukazuje, že jsme byli říká několik White Lies 505 00:21:54,400 --> 00:21:55,540 pro docela nějaký čas. 506 00:21:55,540 --> 00:21:59,990 Ve skutečnosti se ukazuje, že řetězec, všechny tohoto času, není opravdu 507 00:21:59,990 --> 00:22:02,190 posloupnost znaků na sobě. 508 00:22:02,190 --> 00:22:03,980 Je to druh, který je intuitivně. 509 00:22:03,980 --> 00:22:08,270 >> Ale technicky vzato, je řetězec datový typ, který jsme deklarovali uvnitř 510 00:22:08,270 --> 00:22:12,170 CS50 knihovna zjednodušit svět po dobu prvních několika týdnů třídy. 511 00:22:12,170 --> 00:22:20,130 Co řetězec opravdu je adresa znaku někde v paměti RAM. 512 00:22:20,130 --> 00:22:25,530 Řetězec je opravdu celá řada, stejně jako 123 nebo 127, který se stane vymezit 513 00:22:25,530 --> 00:22:28,420 kde řetězec začíná v paměti počítače. 514 00:22:28,420 --> 00:22:31,870 >> Ale to nepředstavuje řetězec, samo o sobě, sama o sobě. 515 00:22:31,870 --> 00:22:33,460 A vidíme to takto. 516 00:22:33,460 --> 00:22:35,980 Nech mě jít dopředu a otevřít nějaký kód, který je mezi 517 00:22:35,980 --> 00:22:38,340 dnešní příklady zdrojového kódu. 518 00:22:38,340 --> 00:22:42,225 A já jdu dopředu a otevřít do, řekněme, porovnejte-0.c. 519 00:22:42,225 --> 00:22:44,830 520 00:22:44,830 --> 00:22:48,790 Jedná se o kočárek program, který bude která mají být provedena následujícím způsobem. 521 00:22:48,790 --> 00:22:49,040 >> První. 522 00:22:49,040 --> 00:22:50,420 Chystám se něco říct. 523 00:22:50,420 --> 00:22:52,660 Pak budu pokračovat a získat řetězec od uživatele 524 00:22:52,660 --> 00:22:53,750 V tomto dalším řádku. 525 00:22:53,750 --> 00:22:55,370 Pak budu to říkat znovu. 526 00:22:55,370 --> 00:22:57,540 Pak budu mít další řetězec od uživatele. 527 00:22:57,540 --> 00:23:00,390 >> A oznámení, ukážu jeden z řetězce v proměnné s názvem S a 528 00:23:00,390 --> 00:23:03,040 další z těchto řetězců v proměnné s názvem t. 529 00:23:03,040 --> 00:23:07,480 A teď budu tvrdit, velmi rozumně, že pokud je rovná rovná t, 530 00:23:07,480 --> 00:23:08,940 řetězce jsou stejné. 531 00:23:08,940 --> 00:23:09,970 Zde zadejte totéž. 532 00:23:09,970 --> 00:23:11,830 Jinak jsou řetězce není totéž. 533 00:23:11,830 --> 00:23:15,440 >> Koneckonců, pokud bychom vstup dva ints, dvě znaky, dva plováky, dva dvoulůžkové, některý z 534 00:23:15,440 --> 00:23:18,400 datové typy jsme mluvili o tak daleko porovnat je - 535 00:23:18,400 --> 00:23:22,070 Vzpomínám si, že jsme velmi jasně před chvílí že nebudete dělat to, protože 536 00:23:22,070 --> 00:23:25,840 jedno znaménko rovná se je samozřejmě operátor přiřazení. 537 00:23:25,840 --> 00:23:26,820 Tak to by bylo chybou. 538 00:23:26,820 --> 00:23:29,260 >> Používáme stejné rovnítko, který opravdu porovnává 539 00:23:29,260 --> 00:23:31,050 věci pro skutečné rovnosti. 540 00:23:31,050 --> 00:23:32,275 Ale já prohlašují, že toto je chybné. 541 00:23:32,275 --> 00:23:37,400 Když jdu do toho a dělat porovnat nulu, a pak se tečka lomítko porovnat nulu. 542 00:23:37,400 --> 00:23:39,700 A já jsem psát v, řekněme, ahoj. 543 00:23:39,700 --> 00:23:41,590 A pak řekněme, že ahoj znovu. 544 00:23:41,590 --> 00:23:46,040 Doslova totéž, počítač tvrzení jsem napsal různé věci. 545 00:23:46,040 --> 00:23:47,640 >> Teď možná jsem jen něco překlepu. 546 00:23:47,640 --> 00:23:49,910 Budu psát moje jméno tentokrát. 547 00:23:49,910 --> 00:23:52,580 Myslím, ahoj. 548 00:23:52,580 --> 00:23:54,770 Dobrý den. 549 00:23:54,770 --> 00:23:57,360 Je to jiné, každý čas. 550 00:23:57,360 --> 00:23:58,430 >> No, proč to je? 551 00:23:58,430 --> 00:24:00,140 Co se opravdu děje pod kapotou? 552 00:24:00,140 --> 00:24:03,270 No, co se opravdu děje pod kapuce je řetězec, pak 553 00:24:03,270 --> 00:24:07,410 Jsem napsal v tom prvním například je slovo ahoj, samozřejmě. 554 00:24:07,410 --> 00:24:11,660 Ale pokud budeme představovat to pod kapuce, připomenout, že 555 00:24:11,660 --> 00:24:13,470 Řetězec je v poli. 556 00:24:13,470 --> 00:24:15,040 A my jsme řekl, jak v minulosti. 557 00:24:15,040 --> 00:24:20,200 >> Takže pokud čerpám, že pole, jako to, že jsem bude reprezentovat něco zcela 558 00:24:20,200 --> 00:24:23,030 podobné tomu, co jsme dělali před chvílí. 559 00:24:23,030 --> 00:24:25,390 A je to vlastně něco, speciální tady taky. 560 00:24:25,390 --> 00:24:28,090 Co jsme se zjistit, na Na konci každého řetězce? 561 00:24:28,090 --> 00:24:30,760 Jo, to lomítko nula, což je jen způsob, jak reprezentovat, 562 00:24:30,760 --> 00:24:33,610 doslovně, 00000000. 563 00:24:33,610 --> 00:24:35,680 Osm bitů 0 v řadě. 564 00:24:35,680 --> 00:24:37,610 >> Já nevím, upřímně řečeno, co je po tomto. 565 00:24:37,610 --> 00:24:40,090 Je to jen banda více paměti RAM uvnitř mého počítače. 566 00:24:40,090 --> 00:24:40,970 Ale to je pole. 567 00:24:40,970 --> 00:24:42,260 Mluvili jsme o polích předtím. 568 00:24:42,260 --> 00:24:45,010 A my typicky mluvit o pole jako místo nula, 569 00:24:45,010 --> 00:24:46,580 pak jeden, pak dva. 570 00:24:46,580 --> 00:24:47,950 Ale to je jen pro pohodlí. 571 00:24:47,950 --> 00:24:49,380 A to je naprosto relativní. 572 00:24:49,380 --> 00:24:53,010 >> Pokud jste skutečně dostat z paměti počítač, je to samozřejmě jakékoliv 573 00:24:53,010 --> 00:24:55,450 2000000000 některé liché bajtů, potenciálně. 574 00:24:55,450 --> 00:24:59,100 Takže opravdu pod kapotou Celou tu dobu, že ano. 575 00:24:59,100 --> 00:25:01,670 To by mohlo velmi dobře být držák nula. 576 00:25:01,670 --> 00:25:04,780 Ale pokud budete kopat ještě hlouběji pod kapuce, to je opravdu 577 00:25:04,780 --> 00:25:07,000 zabývat číslo 123. 578 00:25:07,000 --> 00:25:09,150 Toto je adresa 124. 579 00:25:09,150 --> 00:25:11,040 Toto je adresa 125. 580 00:25:11,040 --> 00:25:12,540 >> A já jsem nepodělal tentokrát. 581 00:25:12,540 --> 00:25:15,840 Ty jsou nyní jeden bajtů rozdíl z jakého důvodu? 582 00:25:15,840 --> 00:25:17,930 Jak velká je char? 583 00:25:17,930 --> 00:25:19,170 Char je jen jeden bajt. 584 00:25:19,170 --> 00:25:20,570 Int je obvykle čtyři bajty. 585 00:25:20,570 --> 00:25:24,850 Takže to je důvod, proč jsem to 123, 127, 131 a tak dále. 586 00:25:24,850 --> 00:25:27,560 Teď můžu mít matematický jednodušší a prostě plus 1. 587 00:25:27,560 --> 00:25:30,510 A to je teď to, co se skutečně děje na pod pokličku. 588 00:25:30,510 --> 00:25:37,760 >> Takže, když prohlásil něco takového, řetězec s, to je ve skutečnosti - 589 00:25:37,760 --> 00:25:39,170 to dopadá - 590 00:25:39,170 --> 00:25:41,190 char hvězda. 591 00:25:41,190 --> 00:25:44,640 Hvězda, samozřejmě, znamená, že adresa, aka ukazatel. 592 00:25:44,640 --> 00:25:46,200 Takže je to něco adresa. 593 00:25:46,200 --> 00:25:47,510 Co je to adresa? 594 00:25:47,510 --> 00:25:47,760 >> No - 595 00:25:47,760 --> 00:25:51,680 Jsem jediný, kdo může vidět velmi Důležitým bodem dělám, nebo si myslíte, 596 00:25:51,680 --> 00:25:52,560 Dělám. 597 00:25:52,560 --> 00:25:55,270 Tak string - 598 00:25:55,270 --> 00:25:57,180 Smutné je, že máte monitor právě tam, kde jsem 599 00:25:57,180 --> 00:25:58,100 mohl vidět, že. 600 00:25:58,100 --> 00:26:00,990 >> Dobře, takže to je to, co řetězec Jsem prohlásil dříve. 601 00:26:00,990 --> 00:26:04,600 Ukazuje se však, díky malé kouzlo ve CS50 knihovny, to vše 602 00:26:04,600 --> 00:26:08,780 Doba řetězec má doslova Byl char hvězda. 603 00:26:08,780 --> 00:26:11,310 Hvězda opět znamená ukazatel nebo adresu. 604 00:26:11,310 --> 00:26:14,180 Skutečnost, že je to doprovodné slovo znak znamená, že je 605 00:26:14,180 --> 00:26:15,970 adresa charakteru. 606 00:26:15,970 --> 00:26:23,100 >> Takže pokud se řetězec se nazývá, a píšu v H-E-L-L-O, navrhne teď, co se 607 00:26:23,100 --> 00:26:27,330 string doslova vrácení všech tentokrát, i když máme dost 608 00:26:27,330 --> 00:26:29,980 zjednodušený svět? 609 00:26:29,980 --> 00:26:33,310 Co se vlastně řetězec vrátí jako svou návratovou hodnotu? 610 00:26:33,310 --> 00:26:35,830 611 00:26:35,830 --> 00:26:38,720 >> 123 V tomto případě, například. 612 00:26:38,720 --> 00:26:42,630 Jsme již dříve řekl, že se řetězec jednoduše vrátí řetězec, posloupnost 613 00:26:42,630 --> 00:26:43,300 znaků. 614 00:26:43,300 --> 00:26:44,790 Ale to je trochu bílé lži. 615 00:26:44,790 --> 00:26:48,010 Způsob, jakým se string opravdu funguje Pod kapotou je dostane 616 00:26:48,010 --> 00:26:48,930 řetězec od uživatele. 617 00:26:48,930 --> 00:26:51,530 To plops znaky, které on nebo ona typů v paměti. 618 00:26:51,530 --> 00:26:54,680 Klade zpětné lomítko nula na konci z těch posloupnost znaků. 619 00:26:54,680 --> 00:26:57,310 >> Ale co se řetězec doslova vrátit? 620 00:26:57,310 --> 00:27:02,710 Je to doslova vrátí adresu Úplně první bajty RAM 621 00:27:02,710 --> 00:27:04,130 používá se pro tu sílu. 622 00:27:04,130 --> 00:27:07,500 A ukázalo se, že právě tím, že vrátí jediná adresa 623 00:27:07,500 --> 00:27:12,120 První znak v řetězci, který je dostačující pro zjištění celistvost 624 00:27:12,120 --> 00:27:12,630 řetězec. 625 00:27:12,630 --> 00:27:16,930 >> Jinými slovy, dostanete řetězec nemá vrátit 123 a 124 a 125. 626 00:27:16,930 --> 00:27:19,950 Nemusí se mi dlouho Seznam všech bytů, které 627 00:27:19,950 --> 00:27:20,740 můj řetězec používá. 628 00:27:20,740 --> 00:27:22,670 Vzhledem k tomu, jeden, všichni zády k sobě. 629 00:27:22,670 --> 00:27:28,160 A za druhé na základě první adresu, jsem mohou zjistit, kde řetězec končí. 630 00:27:28,160 --> 00:27:29,910 Jak na to? 631 00:27:29,910 --> 00:27:33,490 >> Zvláštní znak null, zpětné lomítko nulu na konci. 632 00:27:33,490 --> 00:27:35,430 Takže jinými slovy, je-li projít kolem - 633 00:27:35,430 --> 00:27:36,530 v proměnných - 634 00:27:36,530 --> 00:27:41,300 adresa char, a předpokládat, , že na konci každého řetězce, každý 635 00:27:41,300 --> 00:27:45,040 posloupnost znaků jako my lidé si řetězců, pokud předpokládáme, že 636 00:27:45,040 --> 00:27:48,600 Na konci takového řetězce je tu nulové zpětné lomítko, jsi zlatá. 637 00:27:48,600 --> 00:27:52,430 Vzhledem k tomu, můžete vždy najít konec řetězce. 638 00:27:52,430 --> 00:27:54,870 >> Teď, co se skutečně děje a pak na v tomto programu? 639 00:27:54,870 --> 00:27:59,990 Proč je tento program, Porovnání 0.c, kočárek? 640 00:27:59,990 --> 00:28:01,690 Co je skutečně v porovnání? 641 00:28:01,690 --> 00:28:02,420 Jo? 642 00:28:02,420 --> 00:28:05,000 >> STUDENT: [neslyšitelné]. 643 00:28:05,000 --> 00:28:05,730 >> DAVID Malan: Přesně tak. 644 00:28:05,730 --> 00:28:08,350 Je to porovnání umístění z řetězců. 645 00:28:08,350 --> 00:28:12,420 Takže pokud uživatel zadal v ahoj jednou, jako já, může paměť skončit 646 00:28:12,420 --> 00:28:13,430 , vypadá takhle. 647 00:28:13,430 --> 00:28:18,210 Pokud pak uživatel druhy uvedené v Ahoj, ale tím, že volá dostat řetězec znovu, c je 648 00:28:18,210 --> 00:28:21,800 nijak zvlášť chytrý, pokud učíte že je chytrý psaní kódu. 649 00:28:21,800 --> 00:28:22,430 >> C - 650 00:28:22,430 --> 00:28:23,860 a počítače obecněji - 651 00:28:23,860 --> 00:28:27,370 Zadáte-li ve slově ahoj znovu, víte, co budete mít. 652 00:28:27,370 --> 00:28:31,480 Ty jen tak dostat druhou řadu paměti, že ano, stane se 653 00:28:31,480 --> 00:28:35,510 skladování H-E-L-L-O, a tak dále. 654 00:28:35,510 --> 00:28:38,240 >> Bude to vypadat stejně na nás, lidi, ale tato adresa 655 00:28:38,240 --> 00:28:39,460 nemusí být 123. 656 00:28:39,460 --> 00:28:42,470 Mohlo by to jen tak stát, že operační systém má některé dispozici 657 00:28:42,470 --> 00:28:45,430 prostor například v místě - 658 00:28:45,430 --> 00:28:49,820 řekněme něco libovolný, jako je to místo 200. 659 00:28:49,820 --> 00:28:51,620 A to je místo 201. 660 00:28:51,620 --> 00:28:53,060 A to je místo 202. 661 00:28:53,060 --> 00:28:55,730 Nemáme ponětí, kde to je bude v paměti. 662 00:28:55,730 --> 00:28:59,110 >> Ale co to znamená, že to, co je bude uložen v konečném důsledku s? 663 00:28:59,110 --> 00:29:00,750 Číslo 123. 664 00:29:00,750 --> 00:29:04,860 Co bude uložen v t, V tomto příkladu libovolné? 665 00:29:04,860 --> 00:29:06,300 Číslo 200. 666 00:29:06,300 --> 00:29:11,410 A to vše znamená, že je pak zřejmé, 123 se nerovná 200. 667 00:29:11,410 --> 00:29:14,940 A tak to, pokud podmínka nikdy vyhodnocen jako true. 668 00:29:14,940 --> 00:29:18,430 Vzhledem k tomu, get string používá jiný kusy paměti pokaždé. 669 00:29:18,430 --> 00:29:20,360 >> Nyní můžeme vidět znovu v dalším příkladu. 670 00:29:20,360 --> 00:29:23,764 Nech mě jít dopředu a otevřít copy-0.c. 671 00:29:23,764 --> 00:29:28,770 Tvrdím, že tento příklad bude vyzkoušet - ale nedaří - kopírovat dva řetězce 672 00:29:28,770 --> 00:29:29,910 následovně. 673 00:29:29,910 --> 00:29:31,730 >> Chystám se něco říct pro uživatele. 674 00:29:31,730 --> 00:29:34,490 Já pak dostanu řetězec a nazývat to je. 675 00:29:34,490 --> 00:29:36,400 A teď, dělám tuto kontrolu zde. 676 00:29:36,400 --> 00:29:37,990 Zmínili jsme se o to chvíli zpět. 677 00:29:37,990 --> 00:29:42,490 Ale když mohl dostat řetězec vrátit hodnotu NULL, jiný speciální znak nebo zvláštní 678 00:29:42,490 --> 00:29:45,050 symbol řekněme. 679 00:29:45,050 --> 00:29:45,900 Pokud je nedostatek paměti. 680 00:29:45,900 --> 00:29:48,970 >> Například, v případě, že uživatel je skutečně je obtížné a typy otřesné 681 00:29:48,970 --> 00:29:51,220 počet znaků na klávesnice a hity Enter. 682 00:29:51,220 --> 00:29:54,580 Pokud to počet znaků prostě nemůžu vejde do paměti RAM, co blázen 683 00:29:54,580 --> 00:29:57,820 Důvodem, dobře se řetězec by mohl velmi dobře vrátit hodnotu null. 684 00:29:57,820 --> 00:30:01,080 >> Nebo pokud váš program sám o sobě dělá hodně dalších věcí, a tam je jen 685 00:30:01,080 --> 00:30:03,790 není dostatek paměti pro get string na úspěch, mohlo by to skončit 686 00:30:03,790 --> 00:30:05,240 se vrací null. 687 00:30:05,240 --> 00:30:07,160 Ale buďme přesnější pokud jde o to, co je to. 688 00:30:07,160 --> 00:30:10,280 Co je S typ dat opravdu? 689 00:30:10,280 --> 00:30:11,610 Char hvězda. 690 00:30:11,610 --> 00:30:14,560 >> Tak to dopadá nyní můžeme oloupat zpět vrstvu null. 691 00:30:14,560 --> 00:30:17,500 Ukázalo se, že je null - ano, samozřejmě speciální symbol. 692 00:30:17,500 --> 00:30:19,190 Ale co je to doopravdy? 693 00:30:19,190 --> 00:30:25,220 Opravdu, null je jen symbol, který jsme lidé používají k reprezentaci na nulové úrovni. 694 00:30:25,220 --> 00:30:29,010 >> Takže autorů C a počítačů obecněji, rozhodl lety 695 00:30:29,010 --> 00:30:30,010 to, že víte, co. 696 00:30:30,010 --> 00:30:34,850 Proč bychom zajistit, aby žádný uživatel údaje nikdy, nikdy, nikdy 697 00:30:34,850 --> 00:30:36,730 uložené na bye nula? 698 00:30:36,730 --> 00:30:39,610 Ve skutečnosti, dokonce i ve svém libovolném příkladu předtím jsem nezačal číslování 699 00:30:39,610 --> 00:30:40,390 byty na nulu. 700 00:30:40,390 --> 00:30:41,540 Začal jsem v jednom. 701 00:30:41,540 --> 00:30:44,950 Protože jsem věděl, že lidé ve světě se rozhodli vyhradit nula 702 00:30:44,950 --> 00:30:47,970 byte v něčí paměti jako něco zvláštního. 703 00:30:47,970 --> 00:30:52,020 >> Důvodem je, kdykoliv chcete signál, že není něco v pořádku 704 00:30:52,020 --> 00:30:55,960 s ohledem na adresy, je vrácena null - jinak známý jako nula - 705 00:30:55,960 --> 00:30:59,410 a protože víte, že není důvěryhodně dat na adrese nula, jasně 706 00:30:59,410 --> 00:31:00,400 Znamená to, že došlo k chybě. 707 00:31:00,400 --> 00:31:04,080 A to je důvod, proč jsme se podle konvence, zkontrolujte, zda pro nulové a zpětné něco 708 00:31:04,080 --> 00:31:06,260 jako jeden v těchto případech. 709 00:31:06,260 --> 00:31:09,300 >> Takže když přejděte dolů teď, je to jen pak některé kontrola chyb, jen v případě, 710 00:31:09,300 --> 00:31:10,610 něco, co se stalo s [? kauci?] 711 00:31:10,610 --> 00:31:13,470 dohromady a ukončit program o předčasném návratu. 712 00:31:13,470 --> 00:31:19,030 Tato řada nyní může být přepsána , protože to, což znamená, že to, co? 713 00:31:19,030 --> 00:31:23,155 Na levé straně, dej mi další ukazatel na znak, a nazývat to t. 714 00:31:23,155 --> 00:31:26,935 Co mám skladování uvnitř t, na základě na tomto jednom řádku kódu? 715 00:31:26,935 --> 00:31:30,950 716 00:31:30,950 --> 00:31:32,170 >> Jsem uložení umístění. 717 00:31:32,170 --> 00:31:34,742 Konkrétně umístění která byla v sekundách. 718 00:31:34,742 --> 00:31:39,000 Takže pokud uživatel zadal v ahoj a že první ahoj stane, že skončí 719 00:31:39,000 --> 00:31:42,567 zde, pak číslo 123 je že se vrátí z dostat 720 00:31:42,567 --> 00:31:43,810 řetězce a uložit - 721 00:31:43,810 --> 00:31:44,780 Jak jsme již řekli dříve - 722 00:31:44,780 --> 00:31:45,440 v sekundách. 723 00:31:45,440 --> 00:31:50,560 >> Když jsem teď prohlásit další ukazatele char a nazývat to t, což je číslo 724 00:31:50,560 --> 00:31:53,940 doslova skončí v t podle příběhu? 725 00:31:53,940 --> 00:31:55,420 Tak 123. 726 00:31:55,420 --> 00:32:00,310 >> Takže technicky nyní i s a t ukazují na přesný 727 00:32:00,310 --> 00:32:02,410 Stejné kousky paměti. 728 00:32:02,410 --> 00:32:06,140 Tak zjistíte, co budu dělat teď, aby dokazují, že tento program je chybné. 729 00:32:06,140 --> 00:32:08,820 >> Nejprve budu tvrdit, s print f, vydělávat 730 00:32:08,820 --> 00:32:10,080 kopii řetězce. 731 00:32:10,080 --> 00:32:11,660 Pak budu dělat něco Kontrola chyb. 732 00:32:11,660 --> 00:32:12,160 Jdu se ujistit. 733 00:32:12,160 --> 00:32:16,710 Pojďme se ujistěte, že řetězec je t alespoň větší než nula na délku, 734 00:32:16,710 --> 00:32:19,190 takže tam je nějaký znak, že skutečně využít. 735 00:32:19,190 --> 00:32:22,840 >> A pak si možná pamatujete tento z předchozích příkladů. 736 00:32:22,840 --> 00:32:25,630 2 horní -, který je v ctype.h soubor. 737 00:32:25,630 --> 00:32:30,800 T držák nula mi dává nulu znak řetězce t. 738 00:32:30,800 --> 00:32:34,360 A 2 horní téže hodnoty, o Samozřejmě, převádí je na velká písmena. 739 00:32:34,360 --> 00:32:38,230 >> Takže intuitivně, to zvýrazněnou linií kódu je vydělávat první 740 00:32:38,230 --> 00:32:40,250 dopis vt. 741 00:32:40,250 --> 00:32:44,485 Ale to není vydělávat, intuitivně, první písmeno v sekundách. 742 00:32:44,485 --> 00:32:48,130 Ale pokud přemýšlíte nad tím, co jsem asi vidět, když jsem spustit tento program 743 00:32:48,130 --> 00:32:54,220 a vytisknout jak původní, s, a tzv. copy, t? 744 00:32:54,220 --> 00:32:55,350 >> Jsou to vlastně bude stejný. 745 00:32:55,350 --> 00:32:56,600 A proč se to bude stejné? 746 00:32:56,600 --> 00:32:58,970 747 00:32:58,970 --> 00:33:01,020 Oba jsou poukazem na přesně totéž. 748 00:33:01,020 --> 00:33:01,610 Tak pojďme na to. 749 00:33:01,610 --> 00:33:03,160 >> Proveďte kopírování nulu. 750 00:33:03,160 --> 00:33:04,070 Shrnuje OK. 751 00:33:04,070 --> 00:33:06,500 Dovolte mi spustit kopírování nulu. 752 00:33:06,500 --> 00:33:10,110 Nech mě psát něco jako ahoj v vše malými písmeny a stiskněte Enter. 753 00:33:10,110 --> 00:33:16,520 A tvrdí, že jak původní s a kopie jsou opravdu totožné. 754 00:33:16,520 --> 00:33:17,920 >> Takže to, co se opravdu stalo tady? 755 00:33:17,920 --> 00:33:20,100 Dovolte mi, abych tento obrázek překreslit jen vyprávět příběh 756 00:33:20,100 --> 00:33:21,340 mírně odlišným způsobem. 757 00:33:21,340 --> 00:33:26,060 Co se opravdu děje pod kapuce, když jsem prohlásil něco jako 758 00:33:26,060 --> 00:33:30,410 char začátek s, nebo řetězec s, Jsem stále ukazatel - 759 00:33:30,410 --> 00:33:33,090 který se stane, že je čtyři byty v CS50 spotřebiče 760 00:33:33,090 --> 00:33:34,410 av mnoha počítačů. 761 00:33:34,410 --> 00:33:36,008 A budu volat toto s.. 762 00:33:36,008 --> 00:33:39,810 A to má v současné době nějaká neznámá hodnota. 763 00:33:39,810 --> 00:33:43,900 >> Když deklarujete proměnnou, pokud sami vložit hodnotu tam, kdo 764 00:33:43,900 --> 00:33:44,570 ví, co tam je. 765 00:33:44,570 --> 00:33:48,110 Mohlo by to být nějaký náhodný sled bitů z předchozího provedení. 766 00:33:48,110 --> 00:33:52,490 Takže když jsem v mém kódu do dostat řetězec, a pak uložit návrat 767 00:33:52,490 --> 00:33:54,800 hodnota v sekundách se řetězec nějak - 768 00:33:54,800 --> 00:33:58,520 A budeme nakonec oloupejte, jak dostat string práce, nějak přiděluje 769 00:33:58,520 --> 00:34:00,480 Pole, které pravděpodobně vypadá něco jako tohle. 770 00:34:00,480 --> 00:34:05,390 H-E-L-L-O, zpětné lomítko nula. 771 00:34:05,390 --> 00:34:09,510 >> Dejme tomu, že to je adresa 123 jen první konzistence. 772 00:34:09,510 --> 00:34:13,000 Tak se vrátí řetězec, v zvýrazněná linka tam, vrátí 773 00:34:13,000 --> 00:34:15,000 číslo jsme si řekli, 123. 774 00:34:15,000 --> 00:34:17,420 Takže to, co se opravdu děje uvnitř je tady? 775 00:34:17,420 --> 00:34:26,590 >> No, co se opravdu děje uvnitř s 123.. 776 00:34:26,590 --> 00:34:29,250 Ale upřímně řečeno, já jsem už trochu zmateni z těchto adres, 777 00:34:29,250 --> 00:34:30,320 všechny tyto libovolných čísel. 778 00:34:30,320 --> 00:34:32,290 123, 124, 127. 779 00:34:32,290 --> 00:34:34,570 Takže pojďme se vlastně zjednodušení svět trochu. 780 00:34:34,570 --> 00:34:38,800 >> Když mluvíme o ukazatele, upřímně řečeno, na nás, lidi, kteří se sakra zajímá, kde 781 00:34:38,800 --> 00:34:39,870 věci jsou v paměti? 782 00:34:39,870 --> 00:34:41,080 To je zcela libovolné. 783 00:34:41,080 --> 00:34:43,370 Bude to záviset na tom, paměti RAM má uživatel. 784 00:34:43,370 --> 00:34:46,590 To bude záviset na tom, kdy v průběhu dne spuštění programu, snad, a 785 00:34:46,590 --> 00:34:48,250 co vstup uživatel vám dává. 786 00:34:48,250 --> 00:34:50,060 Jsme obydlí na nedůležitých detailů. 787 00:34:50,060 --> 00:34:54,230 >> Takže pojďme abstraktní pryč a říkají, že, Při spuštění řádek kódu takhle, 788 00:34:54,230 --> 00:34:57,320 char hvězda je dostane návrat hodnota get řetězce. 789 00:34:57,320 --> 00:35:02,720 Proč se místo toho jen kreslit to, co jsme držet volat ukazatel, jako by to 790 00:35:02,720 --> 00:35:04,140 ukazuje na něco? 791 00:35:04,140 --> 00:35:07,000 Tak jsem teď tvrdí, že je až je ukazatel - 792 00:35:07,000 --> 00:35:08,480 pod kapotou je to adresa. 793 00:35:08,480 --> 00:35:11,330 Ale je to jen ukazuje na první bajt 794 00:35:11,330 --> 00:35:12,780 Řetězec, který byl vrácen. 795 00:35:12,780 --> 00:35:16,710 >> Pokud bych se vrátit do kódu zde co se děje na této lince? 796 00:35:16,710 --> 00:35:20,020 No, v tomto zvýrazněnou linií teď, Já jsem prohlásil prý další 797 00:35:20,020 --> 00:35:21,070 proměnná s názvem t. 798 00:35:21,070 --> 00:35:25,700 Ale je to také ukazatel, takže budu k tomu, jak to, teoreticky, přesné 799 00:35:25,700 --> 00:35:26,710 stejné velikosti krabice. 800 00:35:26,710 --> 00:35:28,160 A budu to nazývat t. 801 00:35:28,160 --> 00:35:33,500 >> A teď, pokud se vrátíme do kódu znovu, když uložím je uvnitř t, 802 00:35:33,500 --> 00:35:36,920 co jsem technicky uvedení uvnitř t? 803 00:35:36,920 --> 00:35:39,350 No technicky, to bylo číslo 123. 804 00:35:39,350 --> 00:35:42,270 Takže opravdu bych měla psát číslo 123 tam. 805 00:35:42,270 --> 00:35:43,900 Ale pojďme to vyšší úroveň. 806 00:35:43,900 --> 00:35:48,090 t, pokud je to jen ukazatel, intuitivně, je právě to. 807 00:35:48,090 --> 00:35:49,800 To je vše, co je jsou v nich uloženy. 808 00:35:49,800 --> 00:35:54,970 >> Takže teď v posledních zajímavé linky kódu, když jsem vlastně jít o 809 00:35:54,970 --> 00:36:00,680 vydělávání nulový znak v tunách, co se děje? 810 00:36:00,680 --> 00:36:06,310 No, t držák nula je nyní ukazuje s tím, co postava, pravděpodobně? 811 00:36:06,310 --> 00:36:07,460 >> Je to ukázal na hodiny. 812 00:36:07,460 --> 00:36:08,870 Vzhledem k tomu, t držák nula - 813 00:36:08,870 --> 00:36:12,490 vzpomínám, je to stará syntaxe. t držák nula prostě znamená, že pokud t je řetězec, t 814 00:36:12,490 --> 00:36:15,590 Držák nula znamená dostat nulu Znak v této síle. 815 00:36:15,590 --> 00:36:18,650 Takže, co to ve skutečnosti znamená je jít do tohoto pole - 816 00:36:18,650 --> 00:36:21,520 a ano, může to být 123, to může být 124. 817 00:36:21,520 --> 00:36:22,790 Ale je to všechno relativní, pamatovat. 818 00:36:22,790 --> 00:36:25,640 Kdykoli mluvíme o matici, máme tu výhodu, že mluví o 819 00:36:25,640 --> 00:36:27,000 relativní indexy. 820 00:36:27,000 --> 00:36:31,120 >> A tak se nyní můžeme jen předpokládat, že t držák h je nula. 821 00:36:31,120 --> 00:36:35,090 Takže když zavolám 2 horní na to, co to je opravdu dělá, je vydělávat 822 00:36:35,090 --> 00:36:38,290 malá h na velká písmena H. Ale samozřejmě, co je to? 823 00:36:38,290 --> 00:36:41,010 Je to ukazuje na stejný zatracený řetězce. 824 00:36:41,010 --> 00:36:44,200 >> Tak to je vše, co se děje v tomto kódu tak daleko. 825 00:36:44,200 --> 00:36:45,960 Takže to, co je, pak implikace? 826 00:36:45,960 --> 00:36:48,300 Jak opravit tyto dva problémy? 827 00:36:48,300 --> 00:36:50,870 Jak můžeme porovnat se skutečnými řetězce? 828 00:36:50,870 --> 00:36:53,720 >> No intuitivně, jak by jdete o porovnávání dvou 829 00:36:53,720 --> 00:36:55,090 struny pro skutečné rovnosti? 830 00:36:55,090 --> 00:36:58,920 831 00:36:58,920 --> 00:37:00,750 >> Co to znamená, když dva řetězce jsou stejné? 832 00:37:00,750 --> 00:37:04,330 Samozřejmě, že ne, že jejich adresy rovnat v paměti, protože to je nízká 833 00:37:04,330 --> 00:37:06,590 úrovni implementační detail. 834 00:37:06,590 --> 00:37:08,360 Všechny znaky jsou stejné. 835 00:37:08,360 --> 00:37:12,810 Takže mi dovolte navrhnout, a dovolte mi představit ve verzi jednoho z compare.c 836 00:37:12,810 --> 00:37:14,970 tady, tak porovnat, 1.c. 837 00:37:14,970 --> 00:37:19,590 >> Dovolte mi navrhnout, že jsme ještě dostat ukazatel nazvaný s, a uložit v něm 838 00:37:19,590 --> 00:37:20,610 vrátí hodnotu get řetězce. 839 00:37:20,610 --> 00:37:21,750 Pojďme udělat to samé s t.. 840 00:37:21,750 --> 00:37:23,230 Žádná z kódu se liší. 841 00:37:23,230 --> 00:37:25,420 Chystám se přidat trochu více kontrolu chyb teď. 842 00:37:25,420 --> 00:37:29,390 Takže teď, že jsme něco peeling zpět této vrstvy v CS50, co řetězec 843 00:37:29,390 --> 00:37:33,520 vlastně je, musíme být anální o tom, zda se nezneužívají 844 00:37:33,520 --> 00:37:35,330 neplatné hodnoty, jako je null. 845 00:37:35,330 --> 00:37:36,440 >> Tak jsem jen tak pro kontrolu. 846 00:37:36,440 --> 00:37:41,490 Pokud to není stejné nulu a t není rovna null, to znamená, že jsi v pořádku. 847 00:37:41,490 --> 00:37:44,460 Získejte řetězec neměl zkazit dostat jeden z těchto řetězců. 848 00:37:44,460 --> 00:37:51,270 A můžete si snad, že teď, co nemá STR CMP pravděpodobně dělat? 849 00:37:51,270 --> 00:37:52,000 String porovnání. 850 00:37:52,000 --> 00:37:55,470 >> Takže pokud jste program v Javě dříve, Je to jako rovná metodě 851 00:37:55,470 --> 00:37:56,490 Třída String. 852 00:37:56,490 --> 00:37:57,890 Ale pro ty z vás, kteří nemají naprogramováno, 853 00:37:57,890 --> 00:37:59,320 je to jen funkce c. 854 00:37:59,320 --> 00:38:02,180 Stává se to přijít soubor s názvem string.h. 855 00:38:02,180 --> 00:38:03,830 To je místo, kde je deklarována. 856 00:38:03,830 --> 00:38:05,110 >> A řetězec porovnat - 857 00:38:05,110 --> 00:38:07,530 Vlastně jsem zapomněl jeho použití, ale to nevadí. 858 00:38:07,530 --> 00:38:10,470 Připomeňme si, že můžeme udělat muž, zamíchat porovnání. 859 00:38:10,470 --> 00:38:12,590 A to se děje, aby se Linux programátoři manuální. 860 00:38:12,590 --> 00:38:14,060 A to je, upřímně řečeno, trochu záhadný. 861 00:38:14,060 --> 00:38:15,270 Ale vidím tady, že jo. 862 00:38:15,270 --> 00:38:17,570 Musím zahrnout string.h. 863 00:38:17,570 --> 00:38:20,590 >> A tady se píše v popisu " string Funkce compare porovná 864 00:38:20,590 --> 00:38:24,560 dva řetězce S1 a S2. "a S1 a S2 jsou zřejmě dva 865 00:38:24,560 --> 00:38:26,120 argumenty předávány palců 866 00:38:26,120 --> 00:38:28,650 Nemám opravdu vzpomenout, co const je, ale teď všimnout - 867 00:38:28,650 --> 00:38:31,480 a jste mohli vidět to již při jste používat manuálové stránky, pokud se 868 00:38:31,480 --> 00:38:32,390 to všechno - 869 00:38:32,390 --> 00:38:36,220 že znak hvězda je jen synonymem provázkem. 870 00:38:36,220 --> 00:38:40,440 >> Tak to porovnává dva řetězce S1 a S2, a vrátí celé číslo menší 871 00:38:40,440 --> 00:38:44,930 než nebo rovnající se nebo větší než nula pokud S1 se nachází, respektive, aby se 872 00:38:44,930 --> 00:38:47,450 menší než, nebo odpovídají, nebo být větší než S2. 873 00:38:47,450 --> 00:38:51,220 To je jen velmi komplexní způsob, jak říkat tento řetězec porovnat výnosy 874 00:38:51,220 --> 00:38:55,760 nula, pokud jsou dva řetězce intuitivně identické znak pro 875 00:38:55,760 --> 00:38:57,120 znak pro znak. 876 00:38:57,120 --> 00:38:59,970 >> Vrací záporné číslo, pokud s, abecedně, má 877 00:38:59,970 --> 00:39:01,010 přijít před t.. 878 00:39:01,010 --> 00:39:05,300 Nebo vrací kladné číslo, pokud s má přijít po t 879 00:39:05,300 --> 00:39:06,170 abecedně. 880 00:39:06,170 --> 00:39:08,360 Takže s tímto jednoduchým funkci, může dojít můžete například seřadit 881 00:39:08,360 --> 00:39:09,770 celá parta slova? 882 00:39:09,770 --> 00:39:13,984 >> Takže v této nové verzi, budu jít dál a dělat compare1. 883 00:39:13,984 --> 00:39:15,750 Dot lomítko porovnat jeden. 884 00:39:15,750 --> 00:39:18,030 Budu psát v ahoj ve všech malými písmeny. 885 00:39:18,030 --> 00:39:20,300 Budu psát v ahoj ve všech malými písmeny znovu. 886 00:39:20,300 --> 00:39:23,340 A naštěstí teď si uvědomuje, Napsal jsem to samé. 887 00:39:23,340 --> 00:39:27,520 >> Mezitím, když jsem zadat ahoj v nižší HELLO případ a velkými písmeny a 888 00:39:27,520 --> 00:39:29,710 porovnat je, jsem napsal různé věci. 889 00:39:29,710 --> 00:39:32,530 Vzhledem k tomu, jsou nejen adresy odlišné, ale my jsme porovnání 890 00:39:32,530 --> 00:39:35,350 odlišné charaktery znovu a znovu. 891 00:39:35,350 --> 00:39:37,320 >> Tak pojďme na to a opravit jednu jiný problém teď. 892 00:39:37,320 --> 00:39:41,590 Dovolte mi otevřít verzi jeden z kopírování, které nyní řeší 893 00:39:41,590 --> 00:39:42,900 tento problém takto. 894 00:39:42,900 --> 00:39:45,650 A tohle bude vypadat trochu složitější. 895 00:39:45,650 --> 00:39:49,320 Ale pokud si myslíte, že o tom, co problém, který jsme Potřebujete vyřešit, doufejme, že to bude 896 00:39:49,320 --> 00:39:51,870 jasné, za chvíli teď. 897 00:39:51,870 --> 00:39:57,280 >> Tak to první řádek, char začátek t, v roce Laicky řečeno někdo mohl navrhnout 898 00:39:57,280 --> 00:39:59,450 Co tato linka zde znamená? 899 00:39:59,450 --> 00:40:01,050 Char hvězda t, co to dělá? 900 00:40:01,050 --> 00:40:06,660 901 00:40:06,660 --> 00:40:07,210 >> Dobře. 902 00:40:07,210 --> 00:40:09,500 Vytvořte ukazatel na některé místo v paměti. 903 00:40:09,500 --> 00:40:10,930 A dovolte mi upřesnit to trochu. 904 00:40:10,930 --> 00:40:17,180 Deklarujete proměnnou, která bude ukládat Adresa některých char v paměti, stejně 905 00:40:17,180 --> 00:40:18,480 být trochu vhodnější. 906 00:40:18,480 --> 00:40:21,210 >> OK, takže teď na pravé straně, jsem nikdy neviděl jednu z těchto funkcí 907 00:40:21,210 --> 00:40:22,660 před, malloc. 908 00:40:22,660 --> 00:40:26,980 Ale co by to mohlo znamenat? 909 00:40:26,980 --> 00:40:28,050 Přidělení paměti. 910 00:40:28,050 --> 00:40:29,410 Přidělení paměti. 911 00:40:29,410 --> 00:40:33,050 >> Tak to dopadá, až do teď, máme se opravdu měli účinný způsob, jak 912 00:40:33,050 --> 00:40:36,210 žádá operační systém, dej mi nějaké paměti. 913 00:40:36,210 --> 00:40:39,980 Spíše máme nyní nazývá funkce malloc, že ​​dělá přesně to. 914 00:40:39,980 --> 00:40:42,960 I když je to trochu rozptýlení teď, všimněte si, že v 915 00:40:42,960 --> 00:40:46,200 mezi těmito dvěma závorkách jen bude číslo. 916 00:40:46,200 --> 00:40:48,510 Kde jsem napsal v otázce značky mohou být číslo. 917 00:40:48,510 --> 00:40:51,020 >> A toto číslo znamená, Dej mi 10 bajtů. 918 00:40:51,020 --> 00:40:52,320 Dejte mi 20 bajtů. 919 00:40:52,320 --> 00:40:53,820 Dejte mi 100 bajtů. 920 00:40:53,820 --> 00:40:56,500 A malloc udělá vše pro to, aby požádat operační systém - 921 00:40:56,500 --> 00:40:57,630 Linux, v tomto případě - 922 00:40:57,630 --> 00:40:59,630 hej, jsou jejich 100 bajtů na dostupné paměti RAM? 923 00:40:59,630 --> 00:41:04,320 Pokud ano, vrátit tyto bajty mi vrácení adresu, která z 924 00:41:04,320 --> 00:41:06,610 ty bajtů, možná? 925 00:41:06,610 --> 00:41:07,610 Úplně první. 926 00:41:07,610 --> 00:41:10,460 >> Takže i zde - a to je převládající v C, kdykoliv budete 927 00:41:10,460 --> 00:41:11,680 jednání s adresami? 928 00:41:11,680 --> 00:41:15,830 Ty téměř vždy řešení První taková adresa, bez ohledu na to, jak velký 929 00:41:15,830 --> 00:41:19,490 kus paměti, kterou je předán zpět, abych tak řekl. 930 00:41:19,490 --> 00:41:20,880 >> Takže pojďme se ponořit zde. 931 00:41:20,880 --> 00:41:23,940 Snažím se přidělit jak mnoho bajtů, přesně? 932 00:41:23,940 --> 00:41:24,080 No. 933 00:41:24,080 --> 00:41:26,090 Délka řetězce s - pojďme to konkrétní příklad. 934 00:41:26,090 --> 00:41:30,700 Pokud je s ahoj, H-E-L-L-O, co je délka řetězce s, samozřejmě? 935 00:41:30,700 --> 00:41:32,010 Takže je to pět. 936 00:41:32,010 --> 00:41:34,590 Ale dělám plus 1 na to, proč? 937 00:41:34,590 --> 00:41:37,700 Proč chci šest bajtů místo pěti? 938 00:41:37,700 --> 00:41:38,790 Znak null. 939 00:41:38,790 --> 00:41:41,210 >> Nechci odejít z tohodle speciální znak null. 940 00:41:41,210 --> 00:41:45,160 Protože když udělám kopii Dobrý večer a jen to H-E-L-L-O, ale nemyslím si, dát 941 00:41:45,160 --> 00:41:50,160 že zvláštní charakter, počítač nemusí mít, náhodou, zpětné lomítko 942 00:41:50,160 --> 00:41:51,730 nulu tam na mě. 943 00:41:51,730 --> 00:41:55,570 A tak když se snažím přijít na to, Délka kopie, může si myslím, že 944 00:41:55,570 --> 00:41:59,360 je to 20 znaků, nebo milion znaků kdybych se nikdy nestane 945 00:41:59,360 --> 00:42:01,050 zasáhnout zpětné lomítko nula. 946 00:42:01,050 --> 00:42:05,780 >> Takže musíme šest bajtů pro uložení H-E-L-L-O, zpětné lomítko nula. 947 00:42:05,780 --> 00:42:07,870 A pak je to jen být super anální. 948 00:42:07,870 --> 00:42:10,700 Dejme tomu, že jsem zapomněl, co velikost char je. 949 00:42:10,700 --> 00:42:12,020 Jsme pořád říkáš, že je to jeden bajt. 950 00:42:12,020 --> 00:42:12,860 A to obvykle je. 951 00:42:12,860 --> 00:42:15,425 Teoreticky by to mohlo být něco jinak, v jiném Mac nebo 952 00:42:15,425 --> 00:42:16,250 jiný PC. 953 00:42:16,250 --> 00:42:19,650 >> Tak to dopadá, že je tento operátor volal sizeof, že pokud omdlíte to na 954 00:42:19,650 --> 00:42:22,680 Název datového typu - jako char nebo int, float nebo - 955 00:42:22,680 --> 00:42:26,930 to vám řekne, dynamicky, kolik bajtů char zabírá na toto téma 956 00:42:26,930 --> 00:42:28,090 konkrétní počítač. 957 00:42:28,090 --> 00:42:31,360 >> Tak to je v podstatě jen jako říkat krát 1 nebo 958 00:42:31,360 --> 00:42:32,440 Časy vůbec nic. 959 00:42:32,440 --> 00:42:36,340 Ale já to dělám jen být super anál, jen v případě, že se liší char 960 00:42:36,340 --> 00:42:40,610 počítače proti dolu, tímto způsobem matematika je vždycky vyzkoušet. 961 00:42:40,610 --> 00:42:43,720 >> Konečně, tady jsem zkontrolovat null, což je vždy dobré praxe - opět 962 00:42:43,720 --> 00:42:44,920 Kdykoliv máme co do činění s ukazateli. 963 00:42:44,920 --> 00:42:47,520 Pokud malloc nebyl schopen dát mě, že šest byes - což je 964 00:42:47,520 --> 00:42:49,210 nepravděpodobné, ale jen v případě, že - 965 00:42:49,210 --> 00:42:50,730 vrátit jednu okamžitě. 966 00:42:50,730 --> 00:42:53,290 A teď, jděte do toho a kopírování řetězec následovně. 967 00:42:53,290 --> 00:42:57,240 A to je známá syntaxe, i když v jiné roli. 968 00:42:57,240 --> 00:43:01,210 >> Chystám se jít dopředu a dostat řetězec Délka s a uložte jej na n. 969 00:43:01,210 --> 00:43:06,620 Já pak bude přecházet ze i rovná nulu až do a včetně N, 970 00:43:06,620 --> 00:43:08,410 větší než nebo rovno. 971 00:43:08,410 --> 00:43:13,540 Takže při každém opakování, dal jsem i-tý znak s-té 972 00:43:13,540 --> 00:43:15,380 charakter t.. 973 00:43:15,380 --> 00:43:18,190 >> Takže to, co se opravdu děje pod kapuce tady? 974 00:43:18,190 --> 00:43:22,140 No, pokud to, například, je s - 975 00:43:22,140 --> 00:43:26,400 a já jsem napsal ve slově H-E-L-L-O a tam je zpětné lomítko nula. 976 00:43:26,400 --> 00:43:29,020 A opět, to je s polohovací zde. 977 00:43:29,020 --> 00:43:30,830 A tady je t. 978 00:43:30,830 --> 00:43:34,860 >> A to se ukazuje nyní kopie paměti, že jo? 979 00:43:34,860 --> 00:43:37,340 Malloc mi dala celý kus paměti. 980 00:43:37,340 --> 00:43:41,440 Nevím, co je zpočátku v každém z těchto umístění. 981 00:43:41,440 --> 00:43:44,340 Takže budu myslet na to, jak celá parta otazníky. 982 00:43:44,340 --> 00:43:50,190 >> Ale jakmile začnu opakování od nuly na nahoru přes délku S, T 983 00:43:50,190 --> 00:43:52,790 držák nuly a t držák 1 - 984 00:43:52,790 --> 00:43:55,080 a já dám teď na stropě - 985 00:43:55,080 --> 00:44:04,190 t držák nuly a držák s nulovou střední že budu se kopírování 986 00:44:04,190 --> 00:44:09,875 opakované h tady, E-L-L-O. Navíc, protože jsem dělal plus 987 00:44:09,875 --> 00:44:12,370 1, zpětné lomítko nula. 988 00:44:12,370 --> 00:44:19,060 >> Takže teď v případě Porovnání 1.C, Nakonec, když jsem vytisknout 989 00:44:19,060 --> 00:44:24,760 kapitalizace t, měli bychom vidět, že to se nemění. 990 00:44:24,760 --> 00:44:26,090 Nech mě jít dopředu a hned na to. 991 00:44:26,090 --> 00:44:28,630 Tak, aby COPY1. 992 00:44:28,630 --> 00:44:30,860 Dot lomítko Copy1. 993 00:44:30,860 --> 00:44:33,670 Budu psát v ahoj, Enter. 994 00:44:33,670 --> 00:44:37,430 A teď nevšiml, pouze kopie bylo aktivováno. 995 00:44:37,430 --> 00:44:40,890 Protože jsem opravdu mají dva kusy paměti. 996 00:44:40,890 --> 00:44:44,390 >> Bohužel, můžete to udělat pěkně špatné a docela nebezpečné věci zde. 997 00:44:44,390 --> 00:44:49,290 Dovolte mi vytáhnout příklad tady, že nám dává příklad několika 998 00:44:49,290 --> 00:44:51,540 odřádkováním. 999 00:44:51,540 --> 00:44:56,040 Takže jen intuitivně tady, první řádek kódu, int x hvězda, prohlašuje, 1000 00:44:56,040 --> 00:44:57,340 proměnnou s názvem x. 1001 00:44:57,340 --> 00:44:58,810 A co je to datový typ této proměnné? 1002 00:44:58,810 --> 00:45:01,820 1003 00:45:01,820 --> 00:45:04,290 Co je to datový typ této proměnné? 1004 00:45:04,290 --> 00:45:06,980 To nebylo cliffhanger. 1005 00:45:06,980 --> 00:45:08,350 >> Datový typ int je hvězda. 1006 00:45:08,350 --> 00:45:12,600 Takže co to znamená? x bude uložit adresu int. 1007 00:45:12,600 --> 00:45:13,520 Jednoduché, jak to. 1008 00:45:13,520 --> 00:45:16,220 Y se bude ukládat adresa int. 1009 00:45:16,220 --> 00:45:18,390 Co je na třetím řádku kódu tam dělá? 1010 00:45:18,390 --> 00:45:21,850 Je to rozdělení, kolik bytů, s největší pravděpodobností? 1011 00:45:21,850 --> 00:45:22,350 Čtyři. 1012 00:45:22,350 --> 00:45:25,460 Vzhledem k velikosti int je zpravidla čtyři, malloc čtyři dává 1013 00:45:25,460 --> 00:45:29,950 mi adresu na kus paměť, jehož první bajtů 1014 00:45:29,950 --> 00:45:32,110 uložené nyní v x. 1015 00:45:32,110 --> 00:45:34,410 >> Teď jdeme trochu rychle. 1016 00:45:34,410 --> 00:45:35,760 Hvězdné x znamená co? 1017 00:45:35,760 --> 00:45:38,480 1018 00:45:38,480 --> 00:45:42,590 To znamená přejít na tuto adresu a dal to číslo tam? 1019 00:45:42,590 --> 00:45:43,870 Dal číslo 42 tam. 1020 00:45:43,870 --> 00:45:47,590 Hvězda y znamená jít do toho, co je v y a dal číslo 13 tam. 1021 00:45:47,590 --> 00:45:48,600 >> Ale počkejte chvilku. 1022 00:45:48,600 --> 00:45:51,640 To, co je v současné době v y? 1023 00:45:51,640 --> 00:45:54,950 Co je adresa y skladování? 1024 00:45:54,950 --> 00:45:55,770 Nevíme, že jo? 1025 00:45:55,770 --> 00:45:59,230 Nikdy jsme jednou použít přiřazení Provozovatel zahrnující y. 1026 00:45:59,230 --> 00:46:03,370 Tak y, jak je deklarováno na druhém řádku Kód je jen nějaký odpad hodnota, velký 1027 00:46:03,370 --> 00:46:04,760 otazník, abych tak řekl. 1028 00:46:04,760 --> 00:46:07,230 Mohlo by se ukazovat náhodně na něco v paměti, což 1029 00:46:07,230 --> 00:46:08,340 je obecně špatné. 1030 00:46:08,340 --> 00:46:13,540 >> Takže jakmile se dostaneme tento řádek tam, hvězda y se rovná 13, něco špatného, 1031 00:46:13,540 --> 00:46:17,220 něco velmi špatného se chystá stát, aby Binky. 1032 00:46:17,220 --> 00:46:25,810 Takže pojďme se podívat, co se chystá skončit Binky děje tady v této minutě 1033 00:46:25,810 --> 00:46:26,200 nebo tak vypadají. 1034 00:46:26,200 --> 00:46:26,490 >> [PŘEHRÁVÁNÍ] 1035 00:46:26,490 --> 00:46:26,745 >> -Hej, Binky. 1036 00:46:26,745 --> 00:46:27,000 Probuďte se. 1037 00:46:27,000 --> 00:46:29,296 Je čas na ukazatel zábavu. 1038 00:46:29,296 --> 00:46:30,680 >> -Co je to? 1039 00:46:30,680 --> 00:46:31,980 Informace o ukazateli? 1040 00:46:31,980 --> 00:46:34,010 Oh, cukrovinka. 1041 00:46:34,010 --> 00:46:37,220 >> No, jak začít, myslím, že jsme bude potřebovat pár rad. 1042 00:46:37,220 --> 00:46:37,930 >> -OK. 1043 00:46:37,930 --> 00:46:41,650 Tento kód přiděluje dva ukazatele , které mohou ukazovat na celá čísla. 1044 00:46:41,650 --> 00:46:43,760 >> -OK, dobře, vidím dva ukazatele. 1045 00:46:43,760 --> 00:46:45,850 Ale nezdá se, že se ukázal na cokoliv. 1046 00:46:45,850 --> 00:46:46,490 >> -Přesně tak. 1047 00:46:46,490 --> 00:46:48,630 Zpočátku, ukazatele nejsou poukazují na cokoliv. 1048 00:46:48,630 --> 00:46:51,700 Věci, které poukazují na to, se nazývají pointees a jejich nastavení je 1049 00:46:51,700 --> 00:46:52,850 samostatný krok. 1050 00:46:52,850 --> 00:46:53,740 >> -Oh, dobře, dobře. 1051 00:46:53,740 --> 00:46:54,500 Věděl jsem, že. 1052 00:46:54,500 --> 00:46:56,270 V pointees jsou oddělené. 1053 00:46:56,270 --> 00:46:58,553 Tak jak se vám přidělit pointee? 1054 00:46:58,553 --> 00:46:59,480 >> -OK. 1055 00:46:59,480 --> 00:47:03,707 No, tento kód přiděluje nové celých čísel pointee, a tato část nastaví x 1056 00:47:03,707 --> 00:47:05,520 poukázat na to. 1057 00:47:05,520 --> 00:47:06,760 >> -Hej, to vypadá lépe. 1058 00:47:06,760 --> 00:47:08,520 Tak, aby to něco udělat. 1059 00:47:08,520 --> 00:47:09,530 >> -OK. 1060 00:47:09,530 --> 00:47:14,110 Budu dereference ukazatel x ukládat číslo 42 na jeho pointee. 1061 00:47:14,110 --> 00:47:17,660 Pro tento trik, budu potřebovat svou magii hůlka dereferencing. 1062 00:47:17,660 --> 00:47:20,695 >> -Vaše kouzelná hůlka z dereferencing? 1063 00:47:20,695 --> 00:47:22,632 No, to je skvělé. 1064 00:47:22,632 --> 00:47:24,620 >> -To je to, co kód vypadá. 1065 00:47:24,620 --> 00:47:27,526 Budu stačí nastavit číslo a - 1066 00:47:27,526 --> 00:47:28,250 >> -Hele, podívej. 1067 00:47:28,250 --> 00:47:29,680 Tam to jde. 1068 00:47:29,680 --> 00:47:34,520 Takže dělá dereferencování na x takto šipka přístup k jeho pointee. 1069 00:47:34,520 --> 00:47:36,690 V tomto případě, pro uložení 42 tam. 1070 00:47:36,690 --> 00:47:40,890 Hele, zkuste ji uložíte číslo 13 přes druhý ukazatel, y. 1071 00:47:40,890 --> 00:47:42,125 >> -OK. 1072 00:47:42,125 --> 00:47:46,810 Půjdu sem pro y a se číslo 13 nastavit. 1073 00:47:46,810 --> 00:47:50,890 A pak se hůlku dereferencing a jen - 1074 00:47:50,890 --> 00:47:52,430 whoa! 1075 00:47:52,430 --> 00:47:53,030 >> -Oh, hej. 1076 00:47:53,030 --> 00:47:54,610 To nefungovalo. 1077 00:47:54,610 --> 00:47:58,200 Řekněme, Binky, já si nemyslím, že dereferencing y je to dobrý nápad, 1078 00:47:58,200 --> 00:48:01,370 protože nastavení pointee je v samostatném kroku. 1079 00:48:01,370 --> 00:48:03,460 A nemyslím si, že jsme kdy udělali. 1080 00:48:03,460 --> 00:48:03,810 >> -Hmm. 1081 00:48:03,810 --> 00:48:05,160 Dobrý postřeh. 1082 00:48:05,160 --> 00:48:07,410 >> -Jo, přiděleno ukazatel y. 1083 00:48:07,410 --> 00:48:10,045 Ale my jsme nikdy nastavit tak, aby poukazují na pointee. 1084 00:48:10,045 --> 00:48:10,490 >> -Hmm. 1085 00:48:10,490 --> 00:48:12,170 Velmi pozorný. 1086 00:48:12,170 --> 00:48:13,790 >> -Hej, vy hledáte tam dobře, Binky. 1087 00:48:13,790 --> 00:48:16,920 Můžete opravit tak, že y body na stejné pointee jako X? 1088 00:48:16,920 --> 00:48:17,810 >> -Jasně. 1089 00:48:17,810 --> 00:48:20,300 Budu používat svou kouzelnou hůlku ukazatel úkol. 1090 00:48:20,300 --> 00:48:22,240 >> , Je, že bude problém jako dřív? 1091 00:48:22,240 --> 00:48:22,665 >> -No. 1092 00:48:22,665 --> 00:48:24,300 Tento nedotýkala pointees. 1093 00:48:24,300 --> 00:48:27,880 Je to jen jeden ukazatel změní na bod na totéž jako další. 1094 00:48:27,880 --> 00:48:28,970 >> -Oh, chápu. 1095 00:48:28,970 --> 00:48:31,730 Nyní y poukazuje na stejném místě jako x. 1096 00:48:31,730 --> 00:48:32,450 Tak počkat. 1097 00:48:32,450 --> 00:48:33,490 Nyní y je pevná. 1098 00:48:33,490 --> 00:48:34,630 Má pointee. 1099 00:48:34,630 --> 00:48:36,520 Takže si můžete vyzkoušet hůlku z dereferencing znovu 1100 00:48:36,520 --> 00:48:39,200 poslat přes 13. 1101 00:48:39,200 --> 00:48:39,840 >> -OK. 1102 00:48:39,840 --> 00:48:41,570 Tady to je. 1103 00:48:41,570 --> 00:48:42,870 >> -Hej, koukni na to. 1104 00:48:42,870 --> 00:48:44,320 Nyní dereferencing práce na y. 1105 00:48:44,320 --> 00:48:47,020 A protože ukazatele jsou sdílení že jeden pointee, že 1106 00:48:47,020 --> 00:48:48,585 jak vidět 13. 1107 00:48:48,585 --> 00:48:49,040 >> -Jo. 1108 00:48:49,040 --> 00:48:49,670 Sdílení. 1109 00:48:49,670 --> 00:48:50,380 To je fuk. 1110 00:48:50,380 --> 00:48:52,290 Takže jdeme vymění teď? 1111 00:48:52,290 --> 00:48:52,970 >> -Oh, podívej. 1112 00:48:52,970 --> 00:48:54,150 Jsme mimo čas. 1113 00:48:54,150 --> 00:48:55,200 >> -Ale - 1114 00:48:55,200 --> 00:48:57,060 >> -Jen si vzpomeňte na tři ukazatel pravidla. 1115 00:48:57,060 --> 00:49:00,100 Za prvé, základní struktura je, že máte ukazatel. 1116 00:49:00,100 --> 00:49:02,170 A poukazuje na na pointee. 1117 00:49:02,170 --> 00:49:04,160 Ale ukazatel a pointee jsou oddělené. 1118 00:49:04,160 --> 00:49:06,460 A Častou chybou je, aby nastavit ukazatel, ale 1119 00:49:06,460 --> 00:49:08,540 zapomněl daný pointee. 1120 00:49:08,540 --> 00:49:12,460 >> Číslo dvě, ukazatel dereferencing začíná u ukazatele a následuje jeho 1121 00:49:12,460 --> 00:49:14,570 Šipka nad přístup k jeho pointee. 1122 00:49:14,570 --> 00:49:18,640 Jak všichni víme, to funguje pouze v případě, že je pointee, která se dostane zpět do 1123 00:49:18,640 --> 00:49:19,790 Pravidlo číslo jedna. 1124 00:49:19,790 --> 00:49:23,670 >> Číslo tři, ukazatel postoupením jeden ukazatel a změny, upozornit na 1125 00:49:23,670 --> 00:49:25,850 stejně jako další ukazatel pointee. 1126 00:49:25,850 --> 00:49:27,840 Takže po zadání, dva ukazatele budou 1127 00:49:27,840 --> 00:49:29,430 o tentýž pointee. 1128 00:49:29,430 --> 00:49:31,600 Někdy se říká, že sdílení. 1129 00:49:31,600 --> 00:49:33,430 A to je všechno, tam je to, opravdu. 1130 00:49:33,430 --> 00:49:33,840 Bye bye teď. 1131 00:49:33,840 --> 00:49:34,300 >> [END PŘEHRÁVÁNÍ] 1132 00:49:34,300 --> 00:49:36,940 >> DAVID Malan: Takže více na ukazateli, více na Binky příští týden. 1133 00:49:36,940 --> 00:49:38,190 Uvidíme se v pondělí. 1134 00:49:38,190 --> 00:49:42,187