1 00:00:00,000 --> 00:00:03,381 >> [Prehrávanie hudby] 2 00:00:03,381 --> 00:00:10,626 3 00:00:10,626 --> 00:00:11,610 >> [Videoprehrávanie] 4 00:00:11,610 --> 00:00:13,640 >> -Je Klame. 5 00:00:13,640 --> 00:00:14,380 >> -O čom? 6 00:00:14,380 --> 00:00:17,182 >> -Neviem. 7 00:00:17,182 --> 00:00:19,990 >> -Tak Čo vieme? 8 00:00:19,990 --> 00:00:23,145 >> -to V 9:15, Ray Santoyo bol pri bankomate. 9 00:00:23,145 --> 00:00:23,644 Jo. 10 00:00:23,644 --> 00:00:27,030 Takže otázka je, čo robil v 9:16? 11 00:00:27,030 --> 00:00:29,720 >> -Shooting Č.9 milimeter na niečo. 12 00:00:29,720 --> 00:00:31,540 Možno videl ostreľovača. 13 00:00:31,540 --> 00:00:33,412 >> -alebo Pracoval s ním. 14 00:00:33,412 --> 00:00:34,340 >> Počkať. 15 00:00:34,340 --> 00:00:36,200 Naspäť o jednu. 16 00:00:36,200 --> 00:00:36,975 >> -Čo vidíš? 17 00:00:36,975 --> 00:00:44,400 18 00:00:44,400 --> 00:00:47,805 >> -Bring Jeho tvár plnom rozsahu. 19 00:00:47,805 --> 00:00:48,680 >> His okuliare. 20 00:00:48,680 --> 00:00:50,060 >> -Je To odraz. 21 00:00:50,060 --> 00:01:00,455 22 00:01:00,455 --> 00:01:02,280 >> -Je To baseballového tímu Nuevitas. 23 00:01:02,280 --> 00:01:03,110 To je ich logo. 24 00:01:03,110 --> 00:01:05,820 >> -A Hovorí sa kto má na sebe tú bundu. 25 00:01:05,820 --> 00:01:06,670 >> [END Prehrávanie] 26 00:01:06,670 --> 00:01:07,628 >> DAVID Malan: Dobre. 27 00:01:07,628 --> 00:01:11,210 To je CS50 a to je trochu viac z [nepočuteľný], s ktorou ste 28 00:01:11,210 --> 00:01:12,890 pustili s problémom set štyri. 29 00:01:12,890 --> 00:01:16,606 Dnes začneme trochu vyzerať viac hlboko sa na tieto veci zvanej ukazovatele, 30 00:01:16,606 --> 00:01:18,480 ktorý aj keď je to docela tajomný tému, 31 00:01:18,480 --> 00:01:20,813 Ukazuje sa, že to bude byť prostriedky, ktoré sme 32 00:01:20,813 --> 00:01:24,320 môže začať stavať a montáže omnoho sofistikovanejšie programy. 33 00:01:24,320 --> 00:01:28,150 Ale my sme to urobili na poslednú stredu prostredníctvom nejakého claymation prvého. 34 00:01:28,150 --> 00:01:30,190 Takže to, odvolanie, je Binky a my ho použiť 35 00:01:30,190 --> 00:01:33,148 aby sa pozrieť na program, ktorý sa naozaj robiť nič zaujímavého, 36 00:01:33,148 --> 00:01:34,950 ale to predsa odhalil niekoľko problémov. 37 00:01:34,950 --> 00:01:38,570 Takže začať dnes, prečo chodíme rýchlo prechádzať niektoré z týchto krokov, 38 00:01:38,570 --> 00:01:41,920 sa snaží páliť do ľudského hľadiska je presne to, čo sa tu deje 39 00:01:41,920 --> 00:01:45,410 a prečo je to zlé, a potom prejsť na a skutočne začať budovať niečo, 40 00:01:45,410 --> 00:01:46,309 s touto technikou? 41 00:01:46,309 --> 00:01:48,350 Tak to bol prvý dva riadky v tomto programe 42 00:01:48,350 --> 00:01:51,340 a Laicky povedané, to, čo sú tieto dva riadky robia? 43 00:01:51,340 --> 00:01:55,600 Niekto, kto je primerane komfortné s tým, čo je deklarované na obrazovke? 44 00:01:55,600 --> 00:01:58,340 45 00:01:58,340 --> 00:02:00,120 Aké sú tieto dva riadky robia? 46 00:02:00,120 --> 00:02:02,070 To nie je všetko, sa líši od jedného týždňa, 47 00:02:02,070 --> 00:02:03,611 ale tam je nejaká nová špeciálna symbol. 48 00:02:03,611 --> 00:02:04,152 Jo? 49 00:02:04,152 --> 00:02:05,628 Tam vzadu. 50 00:02:05,628 --> 00:02:07,092 >> Divákov: Deklarovanie ukazovatele? 51 00:02:07,092 --> 00:02:08,050 DAVID Malan: znova, povedz? 52 00:02:08,050 --> 00:02:08,860 Divákov: Deklarovanie ukazovatele? 53 00:02:08,860 --> 00:02:11,776 DAVID Malan: Deklarácia ukazovatele a poďme upresniť to trochu viac. 54 00:02:11,776 --> 00:02:14,050 Divákov: [Nepočuteľné] adresa x a potom y. 55 00:02:14,050 --> 00:02:15,300 DAVID Malan: A potom sa zaoberať. 56 00:02:15,300 --> 00:02:18,550 Takže, čo konkrétne robíme je deklarujeme dve premenné. 57 00:02:18,550 --> 00:02:21,252 Tieto premenné, hoci, idú byť typu int hviezdy, ktoré 58 00:02:21,252 --> 00:02:23,210 konkrétnejšie znamená, idú na ukladanie 59 00:02:23,210 --> 00:02:26,450 adresu int, respektíve, x a y. 60 00:02:26,450 --> 00:02:27,660 Teraz existujú nejaké hodnoty? 61 00:02:27,660 --> 00:02:32,621 Existujú nejaké skutočné adresy v nich dve premenné v tomto okamihu? 62 00:02:32,621 --> 00:02:33,120 Nie. 63 00:02:33,120 --> 00:02:35,030 Je to len tzv hodnoty odpadky. 64 00:02:35,030 --> 00:02:38,120 Ak nemáte skutočne priradiť variabilné, čo bolo v RAM 65 00:02:38,120 --> 00:02:42,224 predtým sa chystá vyplniť nulami a tie, obe z týchto premenných. 66 00:02:42,224 --> 00:02:44,140 Ale my ešte nevieme čo sú a to je 67 00:02:44,140 --> 00:02:47,060 Bude kľúčom k prečo Binkym stratil hlavu minulý týždeň. 68 00:02:47,060 --> 00:02:49,980 >> Tak toto bol claymation stelesnenie tohto 69 00:02:49,980 --> 00:02:53,580 kedy máte len dve premenné, malé kruhové kusy hliny, 70 00:02:53,580 --> 00:02:57,330 ktoré možno ukladať premenné, ale ako zabalený up šípky naznačujú, 71 00:02:57,330 --> 00:03:00,640 oni nie sú v skutočnosti ukazujúci kamkoľvek o sebe známe. 72 00:03:00,640 --> 00:03:03,670 A tak sme mali tento riadok, a to bol nový minulý týždeň, malloc pre pamäť 73 00:03:03,670 --> 00:03:07,130 alokácie, čo je len ozdobný spôsob, ako rozprávanie operačný systém, Linux 74 00:03:07,130 --> 00:03:09,750 alebo Mac OS alebo Windows, hej, daj mi nejakú pamäť, 75 00:03:09,750 --> 00:03:11,780 a všetko, čo musíte povedať, operačný systém 76 00:03:11,780 --> 00:03:14,699 je to, čo keď žiadajú to pre pamäť. 77 00:03:14,699 --> 00:03:16,990 Nie je to bude jedno, čo budeš robiť s tým, 78 00:03:16,990 --> 00:03:19,786 ale musíte povedať prevádzkové Systém, čo cestou malloc. 79 00:03:19,786 --> 00:03:20,286 Jo? 80 00:03:20,286 --> 00:03:21,078 >> Divákov: Koľko? 81 00:03:21,078 --> 00:03:21,994 DAVID Malan: Koľko? 82 00:03:21,994 --> 00:03:25,280 Koľko v bytoch, a tak, tak sa opäť neobvyklý spôsob príklad, je len povedať, 83 00:03:25,280 --> 00:03:27,360 daj mi veľkosť int. 84 00:03:27,360 --> 00:03:30,550 Teraz, veľkosť int štyri bajtov alebo 32 bitov. 85 00:03:30,550 --> 00:03:32,850 Tak to je len spôsob, ako povediac, hej, operačný systém, 86 00:03:32,850 --> 00:03:37,290 daj mi štyri bajtov pamäte že môžem použiť mám k dispozícii, 87 00:03:37,290 --> 00:03:40,560 a najmä, čo robí malloc Daňové priznanie s ohľadom 88 00:03:40,560 --> 00:03:41,795 k tomuto kusu štyri bajty? 89 00:03:41,795 --> 00:03:44,110 90 00:03:44,110 --> 00:03:44,860 Publikum: Adresa? 91 00:03:44,860 --> 00:03:45,901 DAVID Malan: Adresa. 92 00:03:45,901 --> 00:03:47,580 Adresa tohto kusu štyroch bajtov. 93 00:03:47,580 --> 00:03:48,190 Presne tak. 94 00:03:48,190 --> 00:03:51,430 A tak to je to, čo je uložené v konečnom v x, a to je dôvod, prečo sme naozaj nemám 95 00:03:51,430 --> 00:03:55,240 jedno, čo je počet, ktorý adresa, či už je to OX1 alebo OX2 96 00:03:55,240 --> 00:03:57,110 alebo nejaký tajomný hexadecimálne adresa. 97 00:03:57,110 --> 00:03:59,850 Len Staráme obrazovo že táto premenná x je teraz 98 00:03:59,850 --> 00:04:01,630 smerovať k tomuto kusu pamäti. 99 00:04:01,630 --> 00:04:05,570 Takže šípka predstavuje ukazovateľ, alebo Viac špecificky, adresa pamäte. 100 00:04:05,570 --> 00:04:09,120 Ale opäť, my nie typicky jedno čo tieto skutočné adresy. 101 00:04:09,120 --> 00:04:11,780 Teraz hovorí, že tento riadok čo v Laicky povedané? 102 00:04:11,780 --> 00:04:14,330 Hviezda x dostane 42 bodkočiarku. 103 00:04:14,330 --> 00:04:17,390 Čo to znamená? 104 00:04:17,390 --> 00:04:18,200 Chceš ísť? 105 00:04:18,200 --> 00:04:20,102 Nepoškrabte krk. 106 00:04:20,102 --> 00:04:22,360 >> Divákov: Adresa x je na 42. 107 00:04:22,360 --> 00:04:24,300 >> DAVID Malan: Adresa x je na 42. 108 00:04:24,300 --> 00:04:25,190 Nie tak celkom. 109 00:04:25,190 --> 00:04:28,485 Tak blízko, ale nie tak celkom, pretože tam je hviezda, ktorá je prefixu túto x. 110 00:04:28,485 --> 00:04:29,860 Preto musíme vyladiť trochu. 111 00:04:29,860 --> 00:04:31,032 Jo? 112 00:04:31,032 --> 00:04:36,044 >> Divákov: Hodnota, že pointer x ukazuje, je 42. 113 00:04:36,044 --> 00:04:36,710 DAVID Malan: OK. 114 00:04:36,710 --> 00:04:40,840 Hodnota, že ukazovateľ je x ukázal na, povedzme, bude 42, 115 00:04:40,840 --> 00:04:44,165 alebo inak povedané, hviezdu x hovorí, choďte na adresu akéhokoľvek 116 00:04:44,165 --> 00:04:48,340 je v x, či už je to 1 Oxford Ulice alebo 33 Oxford Street 117 00:04:48,340 --> 00:04:51,850 alebo OX1 alebo ox33, čokoľvek že číselná adresa, 118 00:04:51,850 --> 00:04:54,380 hviezda x je dereferencing x. 119 00:04:54,380 --> 00:04:57,297 Tak choďte na túto adresu a potom dal číslo 42 tam. 120 00:04:57,297 --> 00:04:59,380 Tak, že by bolo ekvivalent spôsob, ako povedať, že. 121 00:04:59,380 --> 00:05:01,860 Tak to je všetko v poriadku a potom by sme predstavovať obraz 122 00:05:01,860 --> 00:05:05,370 takto, kde sme pridali element 42 na tento kus štyroch 123 00:05:05,370 --> 00:05:09,370 bajtov na pravej strane, ale Táto linka bola, kde veci pokazilo 124 00:05:09,370 --> 00:05:11,120 a Binky hlava vyskočila off v tomto bode, 125 00:05:11,120 --> 00:05:15,290 preto, že zlé veci sa stávajú, keď ste dereferencia hodnôt odpadky 126 00:05:15,290 --> 00:05:18,210 alebo dereferencia neplatné ukazovatele, a ja hovorím neplatné 127 00:05:18,210 --> 00:05:21,020 pretože v tomto bode príbeh, čo je vo vnútri y? 128 00:05:21,020 --> 00:05:24,440 Aká je hodnota y na báze Na posledných niekoľkých krokoch? 129 00:05:24,440 --> 00:05:25,360 Jo? 130 00:05:25,360 --> 00:05:26,115 Čo je to? 131 00:05:26,115 --> 00:05:26,990 >> Divákov: Adresu. 132 00:05:26,990 --> 00:05:28,460 DAVID Malan: adresy. 133 00:05:28,460 --> 00:05:31,910 Malo by sa jednať o adresu ale som inicializácii to? 134 00:05:31,910 --> 00:05:32,800 Takže mám ešte nie. 135 00:05:32,800 --> 00:05:35,430 Takže to, čo je známe, že je tam? 136 00:05:35,430 --> 00:05:37,590 Je to len nejaký odpad hodnotu. 137 00:05:37,590 --> 00:05:41,500 Mohlo by to byť akákoľvek adresa od nuly do 2000000000 ak máte dva koncerty RAM, 138 00:05:41,500 --> 00:05:44,289 alebo nula až 4000000000, ak ste dostal štyri GB pamäte RAM. 139 00:05:44,289 --> 00:05:46,080 Je to nejaký odpad hodnota, ale problém je 140 00:05:46,080 --> 00:05:48,200 že operačný systém, ak nie je vám dal 141 00:05:48,200 --> 00:05:51,140 že kus pamäte špecificky že sa snažíte ísť do, 142 00:05:51,140 --> 00:05:54,650 to všeobecne bude spôsobovať to, čo sme videli ako poruchu segmentáciu. 143 00:05:54,650 --> 00:05:57,810 Takže v skutočnosti, niektoré z vás, ktorí majú bojoval na problémy v úradných hodinách 144 00:05:57,810 --> 00:06:00,393 alebo problémov, ktoré je viac všeobecne sa snaží prísť na to, 145 00:06:00,393 --> 00:06:02,150 chyba segmentácia, že vo všeobecnosti znamená, 146 00:06:02,150 --> 00:06:05,017 ste dotýka segment pamäti, že by ste nemali byť. 147 00:06:05,017 --> 00:06:07,350 Tie dotýka pamäť, ktorá operačný systém nemá 148 00:06:07,350 --> 00:06:10,450 nechá vás dotknúť, či už je to tým, že ide príliš ďaleko vo svojom poli 149 00:06:10,450 --> 00:06:12,870 alebo od tejto chvíle, či už je to preto, že ste sa dotknete 150 00:06:12,870 --> 00:06:14,780 pamäť, ktorá proste nejaký odpad hodnota. 151 00:06:14,780 --> 00:06:18,230 >> Tak robí hviezda x tu druh nedefinované chovanie. 152 00:06:18,230 --> 00:06:22,030 Nikdy by ste nemali robiť, pretože kurzy sú, program to len bude k havárii, 153 00:06:22,030 --> 00:06:24,050 pretože ste hovoril, choďte na túto adresu 154 00:06:24,050 --> 00:06:27,000 a nemáte tušenie, kde že adresa v skutočnosti je. 155 00:06:27,000 --> 00:06:30,300 Teda systém je pravdepodobné spadne svoj program 156 00:06:30,300 --> 00:06:33,840 ako výsledok a naozaj, to je čo sa tam stalo, aby Binkym. 157 00:06:33,840 --> 00:06:37,210 Takže nakoniec, Binky fixné tento problém s tým. 158 00:06:37,210 --> 00:06:38,909 Takže tento program sám bol chybný. 159 00:06:38,909 --> 00:06:41,450 Ale ak ste nejako dopredu a namiesto toho spustiť tento riadok, 160 00:06:41,450 --> 00:06:45,580 y sa rovná x jednoducho znamená čokoľvek adresa je x, tiež dať ju do y. 161 00:06:45,580 --> 00:06:48,740 >> A tak obrazovo, máme reprezentovaný to s dvoma šípkami 162 00:06:48,740 --> 00:06:51,570 z x a y z ukazujúci na rovnaké miesto. 163 00:06:51,570 --> 00:06:55,760 Takže sémanticky, x je rovné k y, pretože oba tieto 164 00:06:55,760 --> 00:07:00,300 ukladáte rovnaký adresa, ergo ukázal na 42, 165 00:07:00,300 --> 00:07:04,910 a teraz, keď hovoríte, hviezda y, choďte na adresu v y, 166 00:07:04,910 --> 00:07:06,790 to má zaujímavý vedľajší efekt. 167 00:07:06,790 --> 00:07:10,320 Takže adresu v y je to isté ako adresu v x. 168 00:07:10,320 --> 00:07:15,060 Takže ak ste, že ísť na adresu v y a zmeňte hodnotu na 13, 169 00:07:15,060 --> 00:07:17,140 kto iný je ovplyvnený? 170 00:07:17,140 --> 00:07:21,100 X, bod D, aby som tak povedal, by mali byť ovplyvnené tiež. 171 00:07:21,100 --> 00:07:24,340 >> A skutočne, ako sa Nick nakreslil tento obrázok v claymation bolo presne to. 172 00:07:24,340 --> 00:07:28,665 Aj keď sme sledovať ukazovateľ y, sme skončili na rovnakom mieste, 173 00:07:28,665 --> 00:07:32,780 a tak ak by sme mali na vytlačenie out X alebo Y je pointee, 174 00:07:32,780 --> 00:07:35,720 potom by sme vidieť hodnotu 13. 175 00:07:35,720 --> 00:07:37,927 A teraz, hovorím pointee byť v súlade s videom. 176 00:07:37,927 --> 00:07:39,760 Programátori, k môjmu vedomosti, vlastne nikdy 177 00:07:39,760 --> 00:07:42,460 povedz slovo pointee, to, čo je špicatá 178 00:07:42,460 --> 00:07:44,650 na, ale pre konzistencie s videom, realizovať 179 00:07:44,650 --> 00:07:47,520 to je všetko, čo bolo znamenalo v takejto situácii. 180 00:07:47,520 --> 00:07:54,190 Takže akékoľvek otázky týkajúce claymation alebo ukazovátka alebo malloc ešte nie? 181 00:07:54,190 --> 00:07:54,850 Nie? 182 00:07:54,850 --> 00:07:55,470 Dobre. 183 00:07:55,470 --> 00:07:58,560 >> Takže bez ďalšieho ado, poďme sa pozrieť 184 00:07:58,560 --> 00:08:00,700 na to, kde to má vlastne bol používaný na nejakú dobu. 185 00:08:00,700 --> 00:08:03,580 Takže sme mali túto knižnicu CS50 že má všetky tieto funkcie. 186 00:08:03,580 --> 00:08:06,810 Použili sme GetInt veľa, getString, Pravdepodobne GetLongLong skôr 187 00:08:06,810 --> 00:08:09,840 v mojom pset jedného alebo tak, ale čo sa skutočne deje? 188 00:08:09,840 --> 00:08:12,920 Dobre, poďme sa rýchlo pozrieť pod kapotou v programe, ktorý 189 00:08:12,920 --> 00:08:17,017 inšpiruje, prečo dávame vám to CS50 knižnica, a dokonca od minulého týždňa, 190 00:08:17,017 --> 00:08:18,850 sme začali brať tie, tréningové kolesá off. 191 00:08:18,850 --> 00:08:21,080 Takže toto je teraz zoradená z toho, čo posmrtné 192 00:08:21,080 --> 00:08:23,690 má sa deje vnútri knižnice CS50, 193 00:08:23,690 --> 00:08:27,250 aj keď sme teraz začne pohybovať preč od toho u väčšiny programov. 194 00:08:27,250 --> 00:08:29,460 >> Takže toto je program s názvom scanf 0. 195 00:08:29,460 --> 00:08:30,510 Je to super krátke. 196 00:08:30,510 --> 00:08:33,909 To sa jednoducho musí tieto riadky, ale to zavádza funkciu nazvanú scanf 197 00:08:33,909 --> 00:08:36,909 že sme skutočne uvidí v moment vnútri knižnice CS50, 198 00:08:36,909 --> 00:08:38,600 aj keď v trochu inej podobe. 199 00:08:38,600 --> 00:08:41,330 Takže tento program na riadku 16 je deklarovanie premennej x. 200 00:08:41,330 --> 00:08:43,150 Tak mi daj štyri byty pre int. 201 00:08:43,150 --> 00:08:45,750 Je to už hovoril užívateľa, číslo, prosím, a potom 202 00:08:45,750 --> 00:08:49,010 To je zaujímavé, že linka v skutočnosti spája dohromady minulý týždeň 203 00:08:49,010 --> 00:08:49,790 a to. 204 00:08:49,790 --> 00:08:53,230 Scanf, a potom všimnete, že trvá formát reťazca, rovnako ako printf, 205 00:08:53,230 --> 00:08:57,480 % I znamená int, a potom to trvá Druhý argument, ktorý vyzerá trochu 206 00:08:57,480 --> 00:08:58,260 funky. 207 00:08:58,260 --> 00:09:01,880 Je to ampersand x, a pripomenúť, sme videli len raz minulý týždeň. 208 00:09:01,880 --> 00:09:03,465 Čo ampersand x predstavuje? 209 00:09:03,465 --> 00:09:06,210 210 00:09:06,210 --> 00:09:08,450 Čo ampersand robiť v C? 211 00:09:08,450 --> 00:09:08,950 Jo? 212 00:09:08,950 --> 00:09:10,024 >> Divákov: Adresa. 213 00:09:10,024 --> 00:09:11,190 DAVID Malan: Adresa. 214 00:09:11,190 --> 00:09:13,190 Takže je to naopak prevádzkovateľa hviezdy, 215 00:09:13,190 --> 00:09:17,270 že sa prevádzkovateľ hviezda hovorí, choďte na táto adresa, ampersand operátor 216 00:09:17,270 --> 00:09:20,280 hovorí, zistiť adresa tejto premennej, 217 00:09:20,280 --> 00:09:23,530 a preto je tento kľúč, pretože Účelom scanf v živote 218 00:09:23,530 --> 00:09:26,320 je pre skenovanie užívateľa vstup z klávesnice, 219 00:09:26,320 --> 00:09:29,970 v závislosti na čo on alebo ona typy, a potom si prečítajte vstup daného užívateľa 220 00:09:29,970 --> 00:09:32,970 do premennej, ale videli v posledných dvoch týždňoch 221 00:09:32,970 --> 00:09:36,080 že táto funkcia odkladacia, že sme Snažil ľahko implementovať 222 00:09:36,080 --> 00:09:37,110 Len rozbité. 223 00:09:37,110 --> 00:09:42,470 Pripomeňme si, že s funkciou odkladací, ak by sme proste vyhlásil, A a B, ako ints, 224 00:09:42,470 --> 00:09:47,040 sme sa úspešne swap dve premenné vnútro swapu 225 00:09:47,040 --> 00:09:50,080 Rovnako ako u mlieka a úradnom vestníku, ale akonáhle odkladacie vrátil, 226 00:09:50,080 --> 00:09:55,200 čo bol výsledok s ohľadom k x a y, pôvodné hodnoty? 227 00:09:55,200 --> 00:09:55,700 Nič. 228 00:09:55,700 --> 00:09:56,200 Jo. 229 00:09:56,200 --> 00:09:59,754 Nič sa nestalo, že čas, pretože swapy meniť iba jeho miestnej kópie, 230 00:09:59,754 --> 00:10:01,670 čo znamená, všetky Tentoraz, kedykoľvek máme 231 00:10:01,670 --> 00:10:04,010 odovzdával v argumentoch k funkciám, my sme 232 00:10:04,010 --> 00:10:05,939 práve prechádzajúcej kópie týchto argumentov. 233 00:10:05,939 --> 00:10:07,980 Môžete to urobiť s tým čo chcete s nimi, 234 00:10:07,980 --> 00:10:10,890 ale oni budú mať žiadny vplyv na pôvodné hodnoty. 235 00:10:10,890 --> 00:10:13,650 Tak to je problematické, ak vás Chcete mať funkciu ako scanf 236 00:10:13,650 --> 00:10:17,170 v živote, ktorých účelom je skenovanie užívateľského vstupu z klávesnice 237 00:10:17,170 --> 00:10:22,010 a potom vyplniť prázdne miesta, tak aby hovoriť, to je, dať premenné, ako je x 238 00:10:22,010 --> 00:10:25,410 hodnotu, pretože keby som bol len prejsť x na scanf, 239 00:10:25,410 --> 00:10:28,790 ak sa domnievate, logiku posledný týždeň, môže scanf robiť, čo chce 240 00:10:28,790 --> 00:10:33,100 s kópiou x, ale to nemohlo trvalú zmenu x, keď dávame 241 00:10:33,100 --> 00:10:37,120 scanf mapu pokladu, aby som tak povedal, kde x označuje miesto, pričom 242 00:10:37,120 --> 00:10:41,860 míňame v adrese X tak, scanf môže ísť tam a vlastne zmena 243 00:10:41,860 --> 00:10:42,920 hodnota x. 244 00:10:42,920 --> 00:10:45,080 A tak naozaj, všetko že tento program robí 245 00:10:45,080 --> 00:10:53,180 keď urobím scanf 0, v mojom zdroji 5 m adresár, aby scanf 0, 246 00:10:53,180 --> 00:10:57,730 dot lomítko scanf, číslo prosím 50, vďaka za 50. 247 00:10:57,730 --> 00:11:01,020 >> Takže to nie je všetko tak zaujímavé, ale čo sa skutočne deje 248 00:11:01,020 --> 00:11:04,820 je to, že akonáhle som zavolať scanf tu, hodnotu x 249 00:11:04,820 --> 00:11:06,410 sa trvale meniť. 250 00:11:06,410 --> 00:11:08,335 Teraz sa to zdá pekné a dobre, a v skutočnosti je 251 00:11:08,335 --> 00:11:11,200 Zdá sa, ako by sme vlastne nepotrebujeme CS50 knižnica vôbec už nie. 252 00:11:11,200 --> 00:11:13,960 Napríklad, poďme bežať tento viac tu raz. 253 00:11:13,960 --> 00:11:15,750 Dovoľte mi, aby som ho znova na sekundu. 254 00:11:15,750 --> 00:11:20,600 Skúsme číslo, prosím, a namiesto toho hovorí, 50 ako predtým, 255 00:11:20,600 --> 00:11:22,810 povedzme, nie. 256 00:11:22,810 --> 00:11:24,000 OK, to je trochu divný. 257 00:11:24,000 --> 00:11:25,270 OK. 258 00:11:25,270 --> 00:11:28,680 A len niektoré nezmysel tu. 259 00:11:28,680 --> 00:11:31,170 Takže to nevyzerá, zvládnuť chybné situácie. 260 00:11:31,170 --> 00:11:33,620 Preto musíme minimálne začiatok pridá nejaká chyba v kontrole 261 00:11:33,620 --> 00:11:37,460 aby sa uistil, že má užívateľ napísané v skutočného počtu, ako 50, 262 00:11:37,460 --> 00:11:40,720 pretože vraj písania slova nie je detekovaný ako problematické, 263 00:11:40,720 --> 00:11:42,020 ale pravdepodobne by malo byť. 264 00:11:42,020 --> 00:11:46,450 >> Pozrime sa na túto verziu teraz to je môj pokus o reimplement getString. 265 00:11:46,450 --> 00:11:48,437 Ak scanf má toto všetko funkčnosť postavený v roku, 266 00:11:48,437 --> 00:11:51,270 Preto sme boli pustili s týmito koliesok, ako getString? 267 00:11:51,270 --> 00:11:55,450 No, tu je snáď moje vlastné jednoduchá verzia getString 268 00:11:55,450 --> 00:12:00,766 pričom pred týždňom, možno som už uviedol, daj mi reťazec a hovoria vyrovnávacej pamäte. 269 00:12:00,766 --> 00:12:03,390 Dnes, budem začať práve povediac: char hviezdu, ktorú si spomínať, 270 00:12:03,390 --> 00:12:04,400 je to len synonymá. 271 00:12:04,400 --> 00:12:06,629 Vyzerá to desivejšie, ale je to presne to isté. 272 00:12:06,629 --> 00:12:09,420 Tak mi daj premennú s názvom vyrovnávacej pamäte že to bude ukladať reťazec, 273 00:12:09,420 --> 00:12:12,780 povedzte užívateľské reťazec, prosím, a potom, rovnako ako predtým, 274 00:12:12,780 --> 00:12:17,760 Skúsme si požičať tejto lekcii scanf % S tentoraz a odovzdať do vyrovnávacej pamäte. 275 00:12:17,760 --> 00:12:19,310 Teraz, rýchla kontrola zdravý rozum. 276 00:12:19,310 --> 00:12:22,120 Prečo som nehovorím ampersand vyrovnávacej pamäte tentoraz? 277 00:12:22,120 --> 00:12:25,190 278 00:12:25,190 --> 00:12:26,625 Vyvodiť z predchádzajúceho príkladu. 279 00:12:26,625 --> 00:12:28,000 Divákov: Char hviezda je ukazovateľ. 280 00:12:28,000 --> 00:12:29,920 DAVID Malan: Presne tak, pretože tentoraz, char 281 00:12:29,920 --> 00:12:34,080 Hviezda je už ukazovateľ, adresu, podľa definície tejto hviezdy bytia tam. 282 00:12:34,080 --> 00:12:37,530 A ak scanf očakáva adresu, stačí len prejsť do vyrovnávacej pamäte. 283 00:12:37,530 --> 00:12:39,260 Nepotrebujem hovoriť ampersand vyrovnávacej pamäte. 284 00:12:39,260 --> 00:12:42,177 Pre zvedavá, mohol by ste niečo také. 285 00:12:42,177 --> 00:12:43,510 Mala by mať iný význam. 286 00:12:43,510 --> 00:12:47,240 To by vám ukazovateľ na ukazovateľ, ktorý je vlastne 287 00:12:47,240 --> 00:12:50,050 platný vec C, ale pre Teraz, poďme aby to jednoduché 288 00:12:50,050 --> 00:12:51,750 a udržať príbeh konzistentné. 289 00:12:51,750 --> 00:12:54,100 Ja som jednoducho ísť prejsť do vyrovnávacej pamäti, a to je správne. 290 00:12:54,100 --> 00:12:56,487 Problémom však je toto. 291 00:12:56,487 --> 00:12:58,820 Nechaj ma ísť napred a spustenie tohto Program po kompilácii to. 292 00:12:58,820 --> 00:13:00,902 Vykonajte scanf 1. 293 00:13:00,902 --> 00:13:02,610 Sakra, moje kompilátora lov moja chyba. 294 00:13:02,610 --> 00:13:04,090 Dajte mi jednu sekundu. 295 00:13:04,090 --> 00:13:05,460 Rinčanie. 296 00:13:05,460 --> 00:13:06,990 Povedzme, že scanf-1.C. 297 00:13:06,990 --> 00:13:10,880 298 00:13:10,880 --> 00:13:11,380 OK. 299 00:13:11,380 --> 00:13:12,720 Tam sme ísť. 300 00:13:12,720 --> 00:13:14,280 Potrebujem to. 301 00:13:14,280 --> 00:13:16,750 CS50 ID má rôzne nastavenia konfigurácie 302 00:13:16,750 --> 00:13:18,280 že vás chráni proti sebe. 303 00:13:18,280 --> 00:13:21,300 Potreboval som vypnúť tie by spustenie rinčanie ručne tejto doby. 304 00:13:21,300 --> 00:13:22,140 Takže reťazec prosím. 305 00:13:22,140 --> 00:13:25,560 Chystám sa ísť dopredu a zadajte v mojej obľúbenej Hello World. 306 00:13:25,560 --> 00:13:26,490 OK, null. 307 00:13:26,490 --> 00:13:27,700 To nie je to, čo som napísal. 308 00:13:27,700 --> 00:13:29,690 Takže je to svedčí o niečo mýliť. 309 00:13:29,690 --> 00:13:33,920 Nechaj ma ísť dopredu a zadajte v naozaj dlhý reťazec. 310 00:13:33,920 --> 00:13:37,210 Vďaka za null, a ja neviem, ak budem mať možnosť to zlyhanie. 311 00:13:37,210 --> 00:13:40,240 Skúsme trochu kópie vložiť, a uvidíme, či to pomôže. 312 00:13:40,240 --> 00:13:43,290 Stačí vložiť veľa to. 313 00:13:43,290 --> 00:13:47,310 Je to určite väčšie string než obvykle. 314 00:13:47,310 --> 00:13:51,450 Poďme sa len naozaj napísať. 315 00:13:51,450 --> 00:13:51,950 Nie. 316 00:13:51,950 --> 00:13:52,650 Dočerta. 317 00:13:52,650 --> 00:13:53,480 Command not found. 318 00:13:53,480 --> 00:13:54,550 Tak to je nesúvisí. 319 00:13:54,550 --> 00:13:56,440 Je to preto, že som vložiť niektoré zlé znaky, 320 00:13:56,440 --> 00:13:59,780 ale to ukáže, nebude fungovať. 321 00:13:59,780 --> 00:14:03,510 >> Skúsme to ešte raz, pretože je to väčšia zábava, keď sme vlastne jeho zrútenie. 322 00:14:03,510 --> 00:14:09,116 Poďme napíšte to a teraz som bude kopírovať naozaj dlhý reťazec 323 00:14:09,116 --> 00:14:10,990 a teraz uvidíme, či budeme môže spôsobiť zrútenie túto vec. 324 00:14:10,990 --> 00:14:14,235 Všimnite si, som vynechal priestory a Nové linky a bodkočiarkami 325 00:14:14,235 --> 00:14:16,035 a všetky funky znaky. 326 00:14:16,035 --> 00:14:16,535 Enter. 327 00:14:16,535 --> 00:14:21,090 328 00:14:21,090 --> 00:14:22,880 A teraz sieť práve bytia pomaly. 329 00:14:22,880 --> 00:14:27,460 Držal som sa Command-V príliš dlhý, jasne. 330 00:14:27,460 --> 00:14:28,190 Dočerta! 331 00:14:28,190 --> 00:14:29,260 Command not found. 332 00:14:29,260 --> 00:14:29,780 >> OK. 333 00:14:29,780 --> 00:14:32,240 No, ide o to, Avšak nasledujúce. 334 00:14:32,240 --> 00:14:36,910 Takže čo sa vlastne deje Na tomuto vyhláseniu 335 00:14:36,910 --> 00:14:39,240 char hviezdy vyrovnávacej pamäte na riadku 16? 336 00:14:39,240 --> 00:14:41,820 Takže to, čo som dostať Prehlasujem, keď ukazovateľ? 337 00:14:41,820 --> 00:14:47,440 Všetko Začínam je hodnota štyroch bajtov volal vyrovnávacej pamäte, ale to, čo je vo vnútri nej 338 00:14:47,440 --> 00:14:49,540 práve teraz? 339 00:14:49,540 --> 00:14:50,930 Je to len nejaký odpad hodnotu. 340 00:14:50,930 --> 00:14:54,170 Vzhľadom k tomu, kedykoľvek budete deklarovať premennú v C, je to len nejaký odpad hodnota, 341 00:14:54,170 --> 00:14:56,220 a my teraz začíname Podrazeniu tejto reality. 342 00:14:56,220 --> 00:14:59,720 Teraz, keď poviem scanf, choďte na túto adresu 343 00:14:59,720 --> 00:15:01,520 a dal za akýchkoľvek užívateľ zadá. 344 00:15:01,520 --> 00:15:06,400 Ak sa používateľ zadá vo ahoj svet, no, kde mám dať? 345 00:15:06,400 --> 00:15:07,750 Buffer je hodnota odpadky. 346 00:15:07,750 --> 00:15:11,510 >> Takže to je niečo ako šíp to je ukázal, kto vie kde. 347 00:15:11,510 --> 00:15:13,880 Možno, že je to ukázal priamo tu v mojej pamäti. 348 00:15:13,880 --> 00:15:16,560 A tak, keď sa používateľ druhy uvedené v hello world, 349 00:15:16,560 --> 00:15:22,380 sa program pokúsi dať string hello world spätné lomítko 0 350 00:15:22,380 --> 00:15:23,910 sa tým, že kus pamäte. 351 00:15:23,910 --> 00:15:27,070 Ale s vysokou pravdepodobnosťou, ale zjavne nie je 100% pravdepodobnosť, 352 00:15:27,070 --> 00:15:30,440 Počítač bude potom pád program pretože to nie je 353 00:15:30,440 --> 00:15:32,490 pamäť Aj by malo byť umožnené na dotyk. 354 00:15:32,490 --> 00:15:36,330 Takže v skratke, je tento program chybná presne z tohto dôvodu. 355 00:15:36,330 --> 00:15:38,070 Ja zásadne nerobím to, čo? 356 00:15:38,070 --> 00:15:42,366 Aké kroky mám vynechané, rovnako ako sme sa vynechať Binkym prvý príklad? 357 00:15:42,366 --> 00:15:42,866 Jo? 358 00:15:42,866 --> 00:15:43,710 >> Divákov: alokácia pamäte? 359 00:15:43,710 --> 00:15:45,001 >> DAVID Malan: alokácia pamäte. 360 00:15:45,001 --> 00:15:48,400 Nemám v skutočnosti pridelené akýkoľvek pamäte pre tento reťazec. 361 00:15:48,400 --> 00:15:50,270 Takže môžeme opraviť v niekoľkými spôsobmi. 362 00:15:50,270 --> 00:15:52,700 Jeden z nich, môžeme aby to jednoduché a v skutočnosti, teraz si 363 00:15:52,700 --> 00:15:55,116 začnú vidieť rozostrenie z liniek medzi tým, čo 364 00:15:55,116 --> 00:15:58,520 Pole je, aký je reťazec, aká char hviezda je to, čo rad znakov 365 00:15:58,520 --> 00:15:59,020 je. 366 00:15:59,020 --> 00:16:02,450 Tu je druhý príklad zahŕňajúce reťazcov a oznámenia 367 00:16:02,450 --> 00:16:05,690 všetko, čo som urobil na linke 16 je, namiesto toho hovoriť 368 00:16:05,690 --> 00:16:09,530 že vyrovnávacia pamäť bude char hviezda, ukazovateľ na kus pamäti, 369 00:16:09,530 --> 00:16:14,057 Budem veľmi aktívne dať sám seba ako buffer pre 16 znakov, 370 00:16:14,057 --> 00:16:16,390 a v skutočnosti, ak ste oboznámení s termínom vyrovnávacej pamäte, 371 00:16:16,390 --> 00:16:20,570 pravdepodobne zo sveta videí, kde je video do vyrovnávacej pamäte, ukladanie do vyrovnávacej pamäte, 372 00:16:20,570 --> 00:16:21,175 ukladanie do vyrovnávacej pamäte. 373 00:16:21,175 --> 00:16:22,550 No, čo je tu súvislosť? 374 00:16:22,550 --> 00:16:24,960 No, Vnútri YouTube a vo vnútri video prehrávača 375 00:16:24,960 --> 00:16:27,200 všeobecne je pole to je väčšia ako 16 rokov. 376 00:16:27,200 --> 00:16:30,340 To by mohlo byť poľa veľkosti jednej megabajt, možno 10 megabajtov, 377 00:16:30,340 --> 00:16:34,330 a do tohto poľa sa váš prehliadač stiahnuť veľa bytov, 378 00:16:34,330 --> 00:16:37,500 celá partia megabajtov video, a video prehrávač, 379 00:16:37,500 --> 00:16:40,930 YouTube je, alebo ten, kto to začína čítanie bajtov z tohto poľa, 380 00:16:40,930 --> 00:16:43,530 a kedykoľvek vidíte Slovo buffering, ukladanie do vyrovnávacej pamäte, 381 00:16:43,530 --> 00:16:46,350 to znamená, že má hráč dostali na koniec tohto poľa. 382 00:16:46,350 --> 00:16:50,430 Sieť je tak pomalé, že to nemá naplnil pole s viacerými bytmi 383 00:16:50,430 --> 00:16:55,610 a tak ste mimo bitov Pre zobrazenie pre užívateľa. 384 00:16:55,610 --> 00:16:59,430 >> Takže vyrovnávacia pamäť je výstižný termín tu v tom, že je to len pole, kus pamäte. 385 00:16:59,430 --> 00:17:02,530 A to bude opraviť preto, že sa ukazuje, 386 00:17:02,530 --> 00:17:07,410 že môžete liečiť pole, ako keby sú adresy, aj keď pufer 387 00:17:07,410 --> 00:17:10,710 je len symbol, je to postupnosť znakov, pufer, 388 00:17:10,710 --> 00:17:14,760 To je užitočné pre mňa, programátor, môžete odovzdať svoje meno okolo 389 00:17:14,760 --> 00:17:17,079 ako by sa jednalo o ukazovateľ, ako by to 390 00:17:17,079 --> 00:17:21,000 boli adresa bloku pamäte pre 16 znakov. 391 00:17:21,000 --> 00:17:24,530 Takže to má hovoriť, môžem prejsť scanf presne to slovo 392 00:17:24,530 --> 00:17:30,670 a tak teraz, keď som robiť tento program, aby scanf 2, bodka lomka scanf 2, 393 00:17:30,670 --> 00:17:35,386 a zadajte hello world, Enter, že time-- 394 00:17:35,386 --> 00:17:37,590 >> Hmm, čo sa stalo? 395 00:17:37,590 --> 00:17:39,340 String prosím. 396 00:17:39,340 --> 00:17:41,430 Čo som urobil zle? 397 00:17:41,430 --> 00:17:43,800 Hello world, vyrovnávacej pamäti. 398 00:17:43,800 --> 00:17:44,705 Hello world. 399 00:17:44,705 --> 00:17:48,201 400 00:17:48,201 --> 00:17:49,420 Ach, ja viem, čo to robí. 401 00:17:49,420 --> 00:17:49,920 OK. 402 00:17:49,920 --> 00:17:51,628 Takže to číta up až do prvého priestoru. 403 00:17:51,628 --> 00:17:55,680 Takže poďme cheat na chvíľu a hovoria Chcel som písať niečo 404 00:17:55,680 --> 00:18:01,408 naozaj dlhé, ako je to dlhá veta to je jedna, dva, tri, štyri, päť, 405 00:18:01,408 --> 00:18:04,420 šesť, sedem, osem, deväť, 10, 11, 12, 13, 14, 15, 16. 406 00:18:04,420 --> 00:18:05,300 OK. 407 00:18:05,300 --> 00:18:07,600 Je to skutočne dlhá veta. 408 00:18:07,600 --> 00:18:10,710 Takže táto veta dlhší ako 16 znakov 409 00:18:10,710 --> 00:18:13,670 a tak keď som stlačte klávesu Enter, čo sa bude diať? 410 00:18:13,670 --> 00:18:16,940 No, v tomto prípade z príbeh, som vyhlásil, vyrovnávacie 411 00:18:16,940 --> 00:18:22,190 v skutočnosti, že pole s 16 znakmi pripravený ísť. 412 00:18:22,190 --> 00:18:27,426 Takže jeden, dva, tri, štyri, päť, šesť, sedem, osem, deväť, 10, 11, 12, 13, 14, 413 00:18:27,426 --> 00:18:29,440 15, 16. 414 00:18:29,440 --> 00:18:34,410 Takže 16 postavy, a teraz, keď som čítať v niečom, ako je to dlhá 415 00:18:34,410 --> 00:18:43,950 veta, čo sa bude diať so že budem čítať v tomto je dlhá 416 00:18:43,950 --> 00:18:49,660 S-E-N-T-E-N-C-E, vety. 417 00:18:49,660 --> 00:18:52,270 >> Tak toto je zámerne zlá vec, ktorú som 418 00:18:52,270 --> 00:18:55,060 udržať písanie za hranice Hranice môjho poľa, 419 00:18:55,060 --> 00:18:56,660 za hranice mojej pamäti. 420 00:18:56,660 --> 00:19:00,100 Mohol by som mať šťastie a program bude mať na chod a nie jedno, 421 00:19:00,100 --> 00:19:03,450 ale všeobecne povedané, toto bude skutočne dôjsť k zlyhaniu môjho programu, 422 00:19:03,450 --> 00:19:06,440 a to je chyba v mojom kód v okamihu, keď vyjdem 423 00:19:06,440 --> 00:19:08,576 za hranice tohto poľa, pretože ja 424 00:19:08,576 --> 00:19:10,450 Neviem, či je to nutne spadne 425 00:19:10,450 --> 00:19:12,120 alebo či som len tak mať šťastie. 426 00:19:12,120 --> 00:19:15,750 Takže to je problematické, pretože v Tento prípad, nezdá sa, že práca 427 00:19:15,750 --> 00:19:20,931 a poďme sa pokúšať osud tu, aj keď IDE Zdá sa, že tolerovať docela dost 428 00:19:20,931 --> 00:19:21,430 of-- 429 00:19:21,430 --> 00:19:22,040 >> Tam sme ísť. 430 00:19:22,040 --> 00:19:23,240 Konečne. 431 00:19:23,240 --> 00:19:26,470 Takže ja som jediný, ktorý môže vidieť. 432 00:19:26,470 --> 00:19:29,630 Tak som jednoducho musel veľa zábavné písanie out naozaj dlhú skutočné frázy 433 00:19:29,630 --> 00:19:32,800 že to určite prekročila 16 bajtov, pretože ja 434 00:19:32,800 --> 00:19:38,050 napísaný v tejto bláznivej dlhej multi-linka frázy, a Všimnite si, čo sa stalo. 435 00:19:38,050 --> 00:19:41,110 Program to skúsil tlač a potom sa dostal chybu segmentácie 436 00:19:41,110 --> 00:19:44,430 a segmentácia chyby je, keď niečomu takému dôjde, 437 00:19:44,430 --> 00:19:47,650 a operačný systém hovorí, Nie, nemôže dotknúť, že pamäť. 438 00:19:47,650 --> 00:19:49,570 Chystáme sa zabiť program úplne. 439 00:19:49,570 --> 00:19:51,180 >> Takže to vyzerá problematické. 440 00:19:51,180 --> 00:19:54,540 Ja som zlepšil programu, ktorý zaručuje mať aspoň časť pamäti, 441 00:19:54,540 --> 00:19:58,000 ale bude to zdá sa, že obmedziť Funkcie GetString k získaniu 442 00:19:58,000 --> 00:20:00,780 reťazca nejakého konečnej dĺžky 16. 443 00:20:00,780 --> 00:20:04,200 Takže ak chcete podporiť dlhšie vety ako 16 znakov, 444 00:20:04,200 --> 00:20:04,880 čo robíš? 445 00:20:04,880 --> 00:20:07,970 No, môžete zvýšiť veľkosť vyrovnávacej pamäte do 32 446 00:20:07,970 --> 00:20:09,190 alebo že sa zdá trochu krátka. 447 00:20:09,190 --> 00:20:12,260 Prečo nie my len aby to 1000, ale tlačiť späť. 448 00:20:12,260 --> 00:20:17,100 Aká je odpoveď intuitívne z Len vyhnúť sa tento problém tým, že 449 00:20:17,100 --> 00:20:20,660 môj vyrovnávacej pamäte väčšie, rovnako ako 1000 znakov? 450 00:20:20,660 --> 00:20:23,470 Realizáciou getString týmto spôsobom. 451 00:20:23,470 --> 00:20:27,130 Čo je to tu dobré alebo zlé? 452 00:20:27,130 --> 00:20:28,033 Jo? 453 00:20:28,033 --> 00:20:30,574 Divákov: Ak zviazať až veľa priestoru a nechcete používať, 454 00:20:30,574 --> 00:20:33,500 potom nemôžete prerozdeliť ten priestor. 455 00:20:33,500 --> 00:20:34,500 DAVID Malan: Rozhodne. 456 00:20:34,500 --> 00:20:38,480 Je to plytvanie, ak, ak nemáte skutočne potrebujú 900 týchto bytov 457 00:20:38,480 --> 00:20:41,057 a napriek tomu žiadate 1000 celkom tak ako tak, 458 00:20:41,057 --> 00:20:44,140 ste práve náročný na pamäť počítač užívateľa, ako je potrebné, 459 00:20:44,140 --> 00:20:45,740 a po tom všetkom, niektoré ste sa už stretli 460 00:20:45,740 --> 00:20:47,620 v živote, že keď ste beh veľa programov 461 00:20:47,620 --> 00:20:50,470 a jedia až veľké množstvo pamäte, to môže skutočne ovplyvniť výkon 462 00:20:50,470 --> 00:20:52,220 a skúsenosti užívateľa na počítači. 463 00:20:52,220 --> 00:20:56,090 Tak to je trochu lenivý riešenie, pre istotu, a naopak, 464 00:20:56,090 --> 00:21:00,140 to nie je len plytvanie, aký problém stále zostáva, aj keď som sa, aby môj vyrovnávacej pamäte 465 00:21:00,140 --> 00:21:02,100 1000? 466 00:21:02,100 --> 00:21:02,600 Jo? 467 00:21:02,600 --> 00:21:04,475 >> Divákov: Reťazec je dĺžka 1001. 468 00:21:04,475 --> 00:21:05,350 DAVID Malan: Presne tak. 469 00:21:05,350 --> 00:21:08,280 Ak je váš reťazec je dĺžka 1001, máte presne rovnaký problém, 470 00:21:08,280 --> 00:21:10,705 a mojím argumentom, urobil by som to Len potom 2.000 robiť, 471 00:21:10,705 --> 00:21:12,830 ale neviete, v vopred, ako veľký by to malo byť, 472 00:21:12,830 --> 00:21:16,890 a napriek tomu, musím zostaviť svoj program predtým, než povolí ľudia používajú a download 473 00:21:16,890 --> 00:21:17,390 za to. 474 00:21:17,390 --> 00:21:21,490 Tak toto je presne ten druh veci, ktoré sa knižnica snažia CS50 475 00:21:21,490 --> 00:21:24,750 aby nám pomohli s a my len pohľad na niektoré z podkladovej vykonávania 476 00:21:24,750 --> 00:21:29,790 tu, ale je to CS50 bodka C. Táto je súbor, ktorý je už na CS50 IDE 477 00:21:29,790 --> 00:21:31,420 všetky tieto týždne, ktoré ste používali. 478 00:21:31,420 --> 00:21:34,280 Je to pre-skompilovaný a vy ste bola automaticky používať to 479 00:21:34,280 --> 00:21:38,780 podľa povahy majúce pomlčka L CS50 vlajku s zazvonením, 480 00:21:38,780 --> 00:21:42,300 ale keď som sa posunúť dole cez všetky tieto funkcie, tu je getString, 481 00:21:42,300 --> 00:21:44,636 a len na vás vzniku chuť, čo sa deje, 482 00:21:44,636 --> 00:21:46,760 poďme sa rýchlo pozrieť na relatívnu zložitosť. 483 00:21:46,760 --> 00:21:48,870 Nie je to super dlhé funkcie, ale my nie 484 00:21:48,870 --> 00:21:52,530 musieť premýšľať o všetko tvrdo ako ísť o získanie reťazca. 485 00:21:52,530 --> 00:21:55,660 >> Takže tu je moja vyrovnávacej pamäte a ja zrejme inicializovať ju na hodnotu null. 486 00:21:55,660 --> 00:21:57,990 To, samozrejme, je to isté ako char hviezda, 487 00:21:57,990 --> 00:22:00,585 ale ja som sa rozhodol v realizáciu knižnice CS50 488 00:22:00,585 --> 00:22:02,460 že ak budeme úplne dynamický, 489 00:22:02,460 --> 00:22:05,770 Neviem vopred, ako velkej Užívatelia reťazec budú chcieť dostať. 490 00:22:05,770 --> 00:22:08,140 Takže ja idem začať len s prázdny reťazec 491 00:22:08,140 --> 00:22:11,507 a budem vybudovať toľko pamäť as Potrebujem, aby sa zmestili užívateľa reťazec 492 00:22:11,507 --> 00:22:13,340 a či nemám dosť, idem sa opýtať 493 00:22:13,340 --> 00:22:15,010 operačný systém pre viac pamäte. 494 00:22:15,010 --> 00:22:17,510 Chystám sa presúvať svoje reťazec do väčšieho kusu pamäti 495 00:22:17,510 --> 00:22:21,847 a budem uvoľniť alebo oslobodiť nedostatočne veľký kus pamäte 496 00:22:21,847 --> 00:22:23,680 a my len tak k tomu opakovane. 497 00:22:23,680 --> 00:22:25,570 >> Tak rýchly pohľad, tu je len premenná 498 00:22:25,570 --> 00:22:28,780 s ktorou budem sledovať kapacity mojej pufra. 499 00:22:28,780 --> 00:22:30,071 Koľko bytov môžem fit? 500 00:22:30,071 --> 00:22:32,070 Tu je premenná n s ktorý budem držať 501 00:22:32,070 --> 00:22:36,200 Trať koľko bajtov sú vlastne v vyrovnávacej pamäti, alebo že užívateľ napísali. 502 00:22:36,200 --> 00:22:39,900 Ak ste ešte nevideli to predtým, vás môžete určiť, že premenná ako int 503 00:22:39,900 --> 00:22:46,370 je nepodpísaný, ktorý, ako názov napovedá, znamená, že je nezáporné, a prečo by 504 00:22:46,370 --> 00:22:50,590 Čo som kedy chcel obťažovať špecifikujúca že int nie je len int, 505 00:22:50,590 --> 00:22:52,540 ale je to unsigned int? 506 00:22:52,540 --> 00:22:55,064 To je non-negatívne int. 507 00:22:55,064 --> 00:22:56,355 Čo [nepočuteľné] znamená? 508 00:22:56,355 --> 00:22:58,910 >> Divákov: Je to popisujúce čiastku pamäte, ktorá môže byť [nepočuteľných]. 509 00:22:58,910 --> 00:22:59,660 >> DAVID Malan: Jo. 510 00:22:59,660 --> 00:23:03,710 Takže keď poviem unsigned, je to vlastne ktorá vám jeden bit navyše pamäti 511 00:23:03,710 --> 00:23:07,440 a zdá sa, trochu hlúpe, ale ak budete majú jeden bit prídavnej pamäte, že 512 00:23:07,440 --> 00:23:09,940 znamená, že máte dvakrát toľko Hodnoty môžete zastupujú, 513 00:23:09,940 --> 00:23:11,570 pretože to môže byť 0 alebo 1. 514 00:23:11,570 --> 00:23:14,660 Takže v predvolenom nastavení, int môže byť hrubo negatívne 2000000000 celú cestu 515 00:23:14,660 --> 00:23:16,030 až do pozitívneho 2 miliardy. 516 00:23:16,030 --> 00:23:18,540 Tí, ktorí sú veľkými rozsahy, ale je to stále trochu márnotratný 517 00:23:18,540 --> 00:23:21,280 ak ste len o veľkosti, ktorá sa práve intuitívne 518 00:23:21,280 --> 00:23:24,620 by mala byť non-negatívne alebo kladné alebo 0, no a potom, 519 00:23:24,620 --> 00:23:28,884 prečo ste strácaš 2 miliardy Možné hodnoty pre záporných čísel 520 00:23:28,884 --> 00:23:30,300 ak ste nikdy používať? 521 00:23:30,300 --> 00:23:35,350 Takže tým, že hovorí nepodpísaný, teraz môj int môže byť medzi 0 a približne 4 miliardy. 522 00:23:35,350 --> 00:23:39,280 >> Tak tu je len int C z dôvodov, nebudeme sa do práve teraz ako 523 00:23:39,280 --> 00:23:42,280 prečo je to int miesto na char, ale tu je 524 00:23:42,280 --> 00:23:44,630 podstata toho, čo sa deje o, a niektorí z vás 525 00:23:44,630 --> 00:23:48,340 by mohli byť za použitia, napríklad, fgetc fungovať aj v pset štyri 526 00:23:48,340 --> 00:23:51,580 alebo neskôr, budeme ho vidieť opäť v probléme set päť, 527 00:23:51,580 --> 00:23:55,410 fgetc je pekné, pretože ako názov druh, druh arcanely napovedá, 528 00:23:55,410 --> 00:23:57,940 je to funkcia, ktorá dostane charakter, a tak, 529 00:23:57,940 --> 00:24:00,690 čo je zásadne odlišná o tom, čo robíme v getString 530 00:24:00,690 --> 00:24:03,110 je, že nepoužívate scanf rovnakým spôsobom. 531 00:24:03,110 --> 00:24:07,550 Sme len plazivej po krok-za-krokom cez čo užívateľ zadal, 532 00:24:07,550 --> 00:24:10,970 pretože môžeme vždy prideliť jeden char, a preto môžeme vždy bezpečne 533 00:24:10,970 --> 00:24:15,599 sa na jednej znak v čase, a kúzlo začne diať tu. 534 00:24:15,599 --> 00:24:17,890 Chystám sa nalistujte prostredný tejto funkcie 535 00:24:17,890 --> 00:24:20,360 Len stručne predstaviť túto funkciu. 536 00:24:20,360 --> 00:24:22,670 Rovnako ako je tu Funkcia malloc, je tu 537 00:24:22,670 --> 00:24:27,740 funkcia realloc kde realloc vám umožní prerozdeliť kus pamäti 538 00:24:27,740 --> 00:24:29,570 a robiť to väčšie alebo menšie. 539 00:24:29,570 --> 00:24:33,060 Tak dlhý príbeh krátky as vlna mojej ruky pre dnešok, 540 00:24:33,060 --> 00:24:35,620 viem, že to, čo getString robí, je, že to niečo 541 00:24:35,620 --> 00:24:39,720 z magicky rastúcej alebo zmršťovanie vyrovnávacej pamäti ako užívateľ 542 00:24:39,720 --> 00:24:41,440 typy vo svojom reťazci. 543 00:24:41,440 --> 00:24:43,962 >> Takže v prípade, že užívateľ zadá krátky reťazec, tento kód 544 00:24:43,962 --> 00:24:45,920 Iba prideľuje dosť pamäť, aby sa zmestili reťazec. 545 00:24:45,920 --> 00:24:48,086 Ak užívateľ stále písať ako som to urobil znova a znova 546 00:24:48,086 --> 00:24:50,330 a znovu, no, v prípade, že vyrovnávacia pamäť je spočiatku tento veľký 547 00:24:50,330 --> 00:24:53,310 a program realizuje, aby počkaj, ja som z vesmíru, 548 00:24:53,310 --> 00:24:55,410 to bude dvojnásobok veľkosť vyrovnávacej pamäte 549 00:24:55,410 --> 00:24:59,110 a potom zdvojnásobiť veľkosť vyrovnávacej pamäte a kód, ktorý robí zdvojnásobenie, 550 00:24:59,110 --> 00:25:03,170 Ak sa pozrieme na to tu, je to práve tento šikovný jednoriadkový. 551 00:25:03,170 --> 00:25:06,830 Je možné, že ste videli túto syntax predtým, ale keď poviete hviezda rovná, 552 00:25:06,830 --> 00:25:10,470 To je to isté, ako hovorí časy objeme 2. 553 00:25:10,470 --> 00:25:13,390 Tak to jednoducho stále zdvojnásobenie kapacita pufru 554 00:25:13,390 --> 00:25:17,480 a potom hovoriť realloc dať sama o sebe, že oveľa viac pamäte. 555 00:25:17,480 --> 00:25:19,720 >> A teraz, ako stranou, tam sú ďalšie funkcie v tu 556 00:25:19,720 --> 00:25:23,680 že nebudeme pozerať do detailov iné ako ukázať v GetInt, 557 00:25:23,680 --> 00:25:26,150 používame getString v GetInt. 558 00:25:26,150 --> 00:25:28,192 Overíme, že to nie je null, čo, odvolanie, 559 00:25:28,192 --> 00:25:30,400 je zvláštne hodnota, ktorá znamená, že sa niečo pokazilo. 560 00:25:30,400 --> 00:25:31,233 Sme z pamäte. 561 00:25:31,233 --> 00:25:32,310 Lepšie skontrolovať, že. 562 00:25:32,310 --> 00:25:33,710 A my sme sa vrátiť hodnotu sentinelovej. 563 00:25:33,710 --> 00:25:37,850 Ale budem odložiť na pripomienky pokiaľ ide o prečo a potom sme sa použiť tento bratranec scanf 564 00:25:37,850 --> 00:25:42,100 volal sscanf a ukazuje sa, že sscanf, alebo reťazec scanf, 565 00:25:42,100 --> 00:25:45,310 vám umožní sa pozrieť na riadku užívateľ zadal, a nechať vás 566 00:25:45,310 --> 00:25:49,610 analyzovať je v podstate, a to, čo ja som tu je Hovorím sscanf, 567 00:25:49,610 --> 00:25:54,440 analyzovať bez ohľadu má užívateľ zadali a uistite sa, že% i, 568 00:25:54,440 --> 00:25:59,250 je celé číslo v nej, a my nie dostať sa do dneška presne dôvod, prečo tam je tiež 569 00:25:59,250 --> 00:26:03,760 A% c tu, ale že v kocke umožňuje us zistiť, či má používateľ zadanej 570 00:26:03,760 --> 00:26:06,050 v niečom falošné za číslom. 571 00:26:06,050 --> 00:26:11,766 Takže dôvod, že GetInt a GetString tí k opakovanie, opakovanie, opakovanie 572 00:26:11,766 --> 00:26:13,640 Je to preto, zo všetkých že kód písali sme, 573 00:26:13,640 --> 00:26:17,900 Je to trochu pozerá na vstupe užívateľa V uistite sa, že je to úplne číselné 574 00:26:17,900 --> 00:26:21,700 alebo je to skutočný floating Bodová hodnota alebo podobne, 575 00:26:21,700 --> 00:26:24,233 V závislosti na tom, aký hodnote funkciu, ktorú používate. 576 00:26:24,233 --> 00:26:25,060 >> Uff. 577 00:26:25,060 --> 00:26:25,710 OK. 578 00:26:25,710 --> 00:26:27,592 To bolo sústo ale bod je tu 579 00:26:27,592 --> 00:26:29,550 že dôvod, prečo sme mali tieto školenia kolesá na 580 00:26:29,550 --> 00:26:32,880 Je tomu tak preto na najnižšej úrovni, tam je len toľko vecí, ktoré 581 00:26:32,880 --> 00:26:35,674 môže ísť zle, že sme chceli preventívne zvládnuť 582 00:26:35,674 --> 00:26:38,090 tieto veci určite v najskoršie týždňov triedy, 583 00:26:38,090 --> 00:26:42,230 ale teraz s pset štyri a päť a pset za uvidíte, že je to skôr k 584 00:26:42,230 --> 00:26:45,570 vy, ale aj vy ste schopnejší riešiť tieto druhy problémov 585 00:26:45,570 --> 00:26:47,180 sami. 586 00:26:47,180 --> 00:26:51,770 Akékoľvek otázky týkajúce getString alebo GetInt? 587 00:26:51,770 --> 00:26:52,630 Jo? 588 00:26:52,630 --> 00:26:55,130 >> Divákov: Prečo by ste zdvojnásobí kapacita pufru 589 00:26:55,130 --> 00:26:57,630 skôr než len rastúce to o presné sumy? 590 00:26:57,630 --> 00:26:58,100 >> DAVID Malan: Dobrá otázka. 591 00:26:58,100 --> 00:27:00,474 Prečo by sme zdvojnásobiť kapacitu pufra, na rozdiel 592 00:27:00,474 --> 00:27:02,800 len ju zvýšiť nejakú konštantnú hodnotu? 593 00:27:02,800 --> 00:27:03,900 Bolo rozhodnutie o dizajne. 594 00:27:03,900 --> 00:27:08,590 Jednoducho sme sa rozhodli, že preto, že má tendenciu byť o niečo drahšie časovo sa opýtať 595 00:27:08,590 --> 00:27:10,440 operačný systém pre pamäť, my nie 596 00:27:10,440 --> 00:27:13,210 chcú nakoniec dostať do situácia pre veľké reťazce 597 00:27:13,210 --> 00:27:14,960 že sme sa pýtali znovu a znovu OS 598 00:27:14,960 --> 00:27:17,500 a znovu a znovu Rýchla obmena pre pamäť. 599 00:27:17,500 --> 00:27:20,387 Tak sme sa jednoducho rozhodli, trochu ľubovoľne, ale dúfame, že rozumne, 600 00:27:20,387 --> 00:27:22,720 že, viete čo, poďme pokúsiť sa dostať pred seba 601 00:27:22,720 --> 00:27:25,520 a len držať zdvojnásobenie to tak, že sme sa minimalizovalo množstvo časov 602 00:27:25,520 --> 00:27:29,010 musíme zavolať malloc alebo realloc, ale celkom rozsudok 603 00:27:29,010 --> 00:27:31,820 volania v neprítomnosti vedieť čo používatelia chcieť písať. 604 00:27:31,820 --> 00:27:33,600 Oba spôsoby môžu byť diskutabilná. 605 00:27:33,600 --> 00:27:35,430 Pravdepodobne dobre. 606 00:27:35,430 --> 00:27:39,240 >> Takže poďme sa pozrieť na pár iných vedľajších účinkov pamäti, 607 00:27:39,240 --> 00:27:41,610 veci, ktoré sa môžu pokaziť a nástroje, ktoré vám môžu 608 00:27:41,610 --> 00:27:43,880 používajú na zachytenie tieto druhy chýb. 609 00:27:43,880 --> 00:27:47,800 Ukazuje sa, že vás všetkých, aj keď check50 nepovedal ti toľko, 610 00:27:47,800 --> 00:27:50,050 Boli písanie buggy kód od jedného týždňa, 611 00:27:50,050 --> 00:27:53,630 aj keby všetky check50 testy prešiel, a to aj v prípade, vy a vaše TF 612 00:27:53,630 --> 00:27:56,010 sú super presvedčení, že váš kód funguje, ako bolo zamýšľané. 613 00:27:56,010 --> 00:27:59,190 Váš kód bol kočík alebo chybná v tom, že všetci z vás, 614 00:27:59,190 --> 00:28:02,540 v pomocou knižnice CS50, Boli netesní pamäte. 615 00:28:02,540 --> 00:28:06,040 Boli ste žiada operačný systém pre pamäť vo väčšine programov 616 00:28:06,040 --> 00:28:08,850 ste napísali, ale vy ste vlastne nikdy dal ju späť. 617 00:28:08,850 --> 00:28:12,110 Vy ste volal GetString a GetInt a GetFloat, 618 00:28:12,110 --> 00:28:15,270 ale s getString, nemáš nikdy volal unGetString alebo Daj 619 00:28:15,270 --> 00:28:19,890 Reťazec Back alebo podobne, ale my sme videli že GetString robí alokovať pamäť 620 00:28:19,890 --> 00:28:22,810 prostredníctvom malloc alebo to Funkcie realloc, čo je len 621 00:28:22,810 --> 00:28:25,670 veľmi podobný v duchu, a napriek tomu sme boli 622 00:28:25,670 --> 00:28:28,629 žiada operačný systém pre pamäť a pamäť znovu a znovu 623 00:28:28,629 --> 00:28:29,670 ale nikdy dávať to späť. 624 00:28:29,670 --> 00:28:33,550 >> A teraz, ako stranou, sa ukazuje, že keď je program ukončený, všetky pamäte 625 00:28:33,550 --> 00:28:34,870 je automaticky uvoľnená. 626 00:28:34,870 --> 00:28:36,150 Takže to nebol veľký problém. 627 00:28:36,150 --> 00:28:38,590 Nebude to rozbiť IDE alebo spomaľujú, 628 00:28:38,590 --> 00:28:40,670 Ale keď programy sa všeobecne úniku pamäti 629 00:28:40,670 --> 00:28:42,170 a oni beží na dlhú dobu. 630 00:28:42,170 --> 00:28:45,640 Ak ste niekedy videli stupídny nafukovacia lopta v Mac OS alebo presýpacie hodiny 631 00:28:45,640 --> 00:28:51,160 v systéme Windows, kde je to trochu spomalenie alebo myslenie alebo myslenie 632 00:28:51,160 --> 00:28:53,770 alebo len naozaj začína spomaliť na prechádzanie, 633 00:28:53,770 --> 00:28:56,960 Je to veľmi pravdepodobne mohlo byť výsledkom pretekanie pamäte. 634 00:28:56,960 --> 00:28:59,970 Programátori, ktorí písali softvér, ktorý používate 635 00:28:59,970 --> 00:29:03,570 opýtajte operačný systém pre pamäť každých pár minút, každú hodinu. 636 00:29:03,570 --> 00:29:05,570 Ale ak ste beží softvér, aj keď je to 637 00:29:05,570 --> 00:29:08,680 minimalizovať vo vašom počítači hodiny alebo dni na konci, 638 00:29:08,680 --> 00:29:11,980 môžete sa pýtať na viac a viac Pamäť a vlastne nikdy používať 639 00:29:11,980 --> 00:29:15,180 a tak váš kód môže byť, alebo programy by mohli byť netesní pamäti, 640 00:29:15,180 --> 00:29:18,350 a ak začnete úniku pamäti, tam je menej pamäte pre ostatné programy, 641 00:29:18,350 --> 00:29:21,220 a výsledok je pre spomaliť všetko dole. 642 00:29:21,220 --> 00:29:23,600 >> Teraz, to je zďaleka jedným z tých najdesivejších programy 643 00:29:23,600 --> 00:29:26,350 budete mať možnosť spustiť v CS50, pokiaľ 644 00:29:26,350 --> 00:29:31,650 lebo jeho výkon je ešte viac ako ezoterická rinčať je alebo urobiť, alebo niektorý z príkazu 645 00:29:31,650 --> 00:29:35,930 linka programy Urobili sme skôr, ale našťastie, vložené do jeho výstupu 646 00:29:35,930 --> 00:29:39,810 je niekoľko užitočných tipov, ktoré výborný budú užitočné buď pre pset štyri 647 00:29:39,810 --> 00:29:41,510 alebo rozhodne pset päť. 648 00:29:41,510 --> 00:29:44,250 Takže Valgrind je nástroj , Ktoré môžu byť použité na vyzerať 649 00:29:44,250 --> 00:29:46,930 pre úniky pamäte v programe. 650 00:29:46,930 --> 00:29:48,570 Je relatívne jednoduché pre spustenie. 651 00:29:48,570 --> 00:29:51,420 Spustiť Valgrind a potom, dokonca aj keď je to trochu ukecaný, 652 00:29:51,420 --> 00:29:54,440 pomlčka únik pomlčka kontrola rovná plné, a potom dot 653 00:29:54,440 --> 00:29:56,320 lomítko a názov vášho programu. 654 00:29:56,320 --> 00:30:00,010 Takže Valgrind potom pobeží program a na samom konci svojho programu 655 00:30:00,010 --> 00:30:02,240 beh pred tým, než ukončí a vám dáva ďalšiu výzvu, 656 00:30:02,240 --> 00:30:04,980 to bude analyzovať váš Program, zatiaľ čo to bola spustená 657 00:30:04,980 --> 00:30:07,740 a tí si úniku akýkoľvek pamäte a ešte lepšie, 658 00:30:07,740 --> 00:30:10,610 ste sa dotknete pamäť, ktorá nepatril k vám? 659 00:30:10,610 --> 00:30:13,700 To nemôže chytiť všetko, ale je to celkom dobrý v chytaní väčšinu vecí. 660 00:30:13,700 --> 00:30:19,700 >> Tak tu je príklad, ktorý má moje behu tento program, majú beh Valgrind, 661 00:30:19,700 --> 00:30:21,470 na programe s názvom pamäť, a ja idem 662 00:30:21,470 --> 00:30:24,730 upozorniť na riadky, ktoré sú nakoniec nás zaujímajú. 663 00:30:24,730 --> 00:30:27,690 Takže tam je ešte viac rozptýlenie že som vymazané zo snímky. 664 00:30:27,690 --> 00:30:30,930 Ale poďme sa jednoducho vidieť, čo to Program je schopný nám hovorí. 665 00:30:30,930 --> 00:30:34,800 To je schopné rozprávať nám veci ako neplatné zápisu o veľkosti 4. 666 00:30:34,800 --> 00:30:38,020 Inými slovami, ak sa dotknete pamäť, konkrétne 4 bajtov pamäte 667 00:30:38,020 --> 00:30:40,350 že by ste nemali mať, Valgrind vám môže povedať, že. 668 00:30:40,350 --> 00:30:41,660 Neplatný zápis veľkosti 4. 669 00:30:41,660 --> 00:30:43,640 Dotkol si sa štyri byty že by ste nemali mať. 670 00:30:43,640 --> 00:30:44,840 Kde si to urobil? 671 00:30:44,840 --> 00:30:45,900 To je krása. 672 00:30:45,900 --> 00:30:50,000 Pamäť dot c linka 21 je miesto, kde vás podelal, a to je dôvod, prečo je to užitočné. 673 00:30:50,000 --> 00:30:53,410 Rovnako ako GDB, môže pomôcť bod, ktorý v aktuálnom chyby. 674 00:30:53,410 --> 00:30:57,170 >> Teraz, to je trochu viac verbose, ak nie mätúce. 675 00:30:57,170 --> 00:31:01,307 40 bytov v 1 blokoch sú rozhodne stratený v záznam straty 1 z 1. 676 00:31:01,307 --> 00:31:02,140 Čo to znamená? 677 00:31:02,140 --> 00:31:05,920 No, to jednoducho znamená, že ste požiadal o 40 bytov a nikdy ju vrátil. 678 00:31:05,920 --> 00:31:08,930 Volal ste malloc alebo ste volal GetString a operačný systém 679 00:31:08,930 --> 00:31:12,450 ti dal 40 bytov, ale tie nikdy oslobodený alebo povolený, že pamäť, 680 00:31:12,450 --> 00:31:15,400 a byť spravodlivý, nikdy sme sa ukázať, , Ako sa vrátiť pamäť. 681 00:31:15,400 --> 00:31:17,910 Ukázalo sa, že tam je super jednoduchá funkcia s názvom zadarmo. 682 00:31:17,910 --> 00:31:21,170 Prijíma jeden argument, vec Ak chcete uvoľniť alebo vrátiť, 683 00:31:21,170 --> 00:31:23,430 ale 40 bytov, zdá sa, v tomto programe 684 00:31:23,430 --> 00:31:27,300 boli stratené na riadku 20 pamäte dot c. 685 00:31:27,300 --> 00:31:28,650 >> Tak uvidíme, tento program. 686 00:31:28,650 --> 00:31:31,020 Je to super k ničomu. 687 00:31:31,020 --> 00:31:33,980 To len dokazuje, tento konkrétny chybe. 688 00:31:33,980 --> 00:31:34,920 Takže poďme sa pozrieť. 689 00:31:34,920 --> 00:31:39,920 Tu je hlavné a hlavné, vývesné, hovory funkcia nazvaná f, a potom sa vráti. 690 00:31:39,920 --> 00:31:41,550 Takže nie je všetko tak zaujímavé. 691 00:31:41,550 --> 00:31:42,664 Čo f robiť? 692 00:31:42,664 --> 00:31:44,330 Všimnite si, som sa neobťažoval s prototypom. 693 00:31:44,330 --> 00:31:46,520 Chcel som, aby kód čo najmenší. 694 00:31:46,520 --> 00:31:49,530 Tak som dal f nad hlavnou a to je v poriadku, určite, 695 00:31:49,530 --> 00:31:51,500 pre krátke programy, ako je tento. 696 00:31:51,500 --> 00:31:56,910 Takže f nič nevracia a robí neberie nič, ale je to to urobiť. 697 00:31:56,910 --> 00:31:59,620 To prehlasuje, podobne ako v príklade binky, 698 00:31:59,620 --> 00:32:02,682 ukazovateľ s názvom x, čo sa deje uložiť adresu int. 699 00:32:02,682 --> 00:32:03,890 Tak to je ľavá strana. 700 00:32:03,890 --> 00:32:07,230 V angličtine, čo je pravá strana robí? 701 00:32:07,230 --> 00:32:09,770 Každý, kto? 702 00:32:09,770 --> 00:32:13,665 Čo je to robí pre nás? 703 00:32:13,665 --> 00:32:14,651 Jo? 704 00:32:14,651 --> 00:32:16,623 >> Divákov: [Nepočuteľné] meria veľkosť int 705 00:32:16,623 --> 00:32:19,175 čo je 10-krát vyššia ako [nepočuteľných] 706 00:32:19,175 --> 00:32:20,800 DAVID Malan: Dobrý, a dovoľte mi zhrnúť. 707 00:32:20,800 --> 00:32:25,480 Takže prideliť dostatočný priestor pre 10 celé čísla alebo 10, čo je veľkosť int, 708 00:32:25,480 --> 00:32:29,340 je to štyri bajtov, takže 10 krát 4 je 40, takže pravej strane, ktoré som 709 00:32:29,340 --> 00:32:33,930 zvýraznený, je dať mi 40 bajtov a uložiť adresu prvého bajtu 710 00:32:33,930 --> 00:32:34,940 do x. 711 00:32:34,940 --> 00:32:38,380 A teraz konečne, a tu je miesto, kde tento program je buggy, čo je 712 00:32:38,380 --> 00:32:41,540 s čiarou 21 zlé na základe tejto logiky? 713 00:32:41,540 --> 00:32:45,197 714 00:32:45,197 --> 00:32:46,280 Čo je na riadku 21 v neporiadku? 715 00:32:46,280 --> 00:32:46,780 Jo? 716 00:32:46,780 --> 00:32:49,550 Divákov: Nemôžete index do x [nepočuteľných]. 717 00:32:49,550 --> 00:32:50,300 DAVID Malan: Jo. 718 00:32:50,300 --> 00:32:52,270 Nemala by som index do x, ako je to. 719 00:32:52,270 --> 00:32:53,850 Takže syntakticky, to je v poriadku. 720 00:32:53,850 --> 00:32:56,990 Čo je príjemné je, rovnako ako vy môže liečiť názov poľa 721 00:32:56,990 --> 00:33:01,080 , Ako keď je to ukazovateľ, podobne môžete liečiť ukazovateľ, ako keď je to 722 00:33:01,080 --> 00:33:06,425 poľa, a tak môžem syntakticky hovoria x držiak niečo, x držiak i, 723 00:33:06,425 --> 00:33:07,800 ale 10 je problematické. 724 00:33:07,800 --> 00:33:09,096 Prečo? 725 00:33:09,096 --> 00:33:10,910 >> Divákov: Pretože to nie je vo vnútri. 726 00:33:10,910 --> 00:33:12,390 >> DAVID Malan: To nie je Vnútri tohto kusu pamäti. 727 00:33:12,390 --> 00:33:15,306 Aká je najväčšia hodnota by som mal byť uvedení v tých hranatých zátvorkách? 728 00:33:15,306 --> 00:33:16,870 9, 0 až 9. 729 00:33:16,870 --> 00:33:18,160 Vzhľadom k tomu, nulového indexovanie. 730 00:33:18,160 --> 00:33:20,190 Takže od 0 do 9 bude v poriadku. 731 00:33:20,190 --> 00:33:23,960 Držiak 10 nie je dobrá a ale spomínam aj keď, zakaždým 732 00:33:23,960 --> 00:33:27,017 Pripadá mi, že sa snaží, aby sa CS50 IDE crash zadaním falošných hodnôt, 733 00:33:27,017 --> 00:33:29,100 to nie je vždy spolupracovať, a naozaj, často 734 00:33:29,100 --> 00:33:31,460 šťastie len preto, že Operačný systém nie je 735 00:33:31,460 --> 00:33:35,467 Všimnite si, že ste niekedy tak trochu prejsť nejaký kus pamäti, 736 00:33:35,467 --> 00:33:38,300 preto, že ste zostal v technicky Váš segmentu, ale o tom viac 737 00:33:38,300 --> 00:33:40,940 v triede operačných systémov, a tak sa niečo také 738 00:33:40,940 --> 00:33:43,000 by mohla veľmi ľahko uniknú pozornosti. 739 00:33:43,000 --> 00:33:48,120 Váš program sa nikdy havárii dôsledne ale možno raz za čas. 740 00:33:48,120 --> 00:33:50,610 >> A tak sa poďme skúsiť Valgrind na to, a tu je 741 00:33:50,610 --> 00:33:52,870 kde budeme dostať ohromený na výstupe za okamih. 742 00:33:52,870 --> 00:34:00,810 Tak, aby pretekanie pamäte valgrind šek sa rovná plnej bodka lomítko pamäte. 743 00:34:00,810 --> 00:34:03,040 A tu je dôvod, prečo Sľubujem To by premôcť. 744 00:34:03,040 --> 00:34:05,700 Tu je to, čo valgrind, tu je to, čo programátor, niektoré roky ago- 745 00:34:05,700 --> 00:34:08,469 rozhodol, že by to bol dobrý nápad pre výstup vyzerať. 746 00:34:08,469 --> 00:34:09,750 Takže poďme zmysel tohto. 747 00:34:09,750 --> 00:34:13,120 A tak celú cestu na ľavej strane side bezdôvodne 748 00:34:13,120 --> 00:34:16,620 je proces ID programu my stačí spustiť, jedinečný identifikátor 749 00:34:16,620 --> 00:34:18,030 pre program sme práve utiekol. 750 00:34:18,030 --> 00:34:19,738 Vypúšťa sme, že z posúvač, ale tam 751 00:34:19,738 --> 00:34:22,190 je niekoľko užitočných informácií tu. 752 00:34:22,190 --> 00:34:24,684 >> Poďme rolovať hore až na samý vrchol. 753 00:34:24,684 --> 00:34:25,600 Tu je miesto, kde sme začali. 754 00:34:25,600 --> 00:34:27,040 Takže to nie je tak moc výstup. 755 00:34:27,040 --> 00:34:30,429 Tu je neplatné write veľkosti 4 na riadku 21. 756 00:34:30,429 --> 00:34:31,760 No, čo bolo riadku 21? 757 00:34:31,760 --> 00:34:34,500 Linka 21 bolo presne to a to dáva zmysel 758 00:34:34,500 --> 00:34:37,290 že som v platne písanie 4 bajty, pretože som 759 00:34:37,290 --> 00:34:40,389 sa snaží dať túto číslo, čo môže byť čokoľvek, 760 00:34:40,389 --> 00:34:42,370 to len sa stane byť nula, ale snažím 761 00:34:42,370 --> 00:34:44,940 aby ju na mieste že nepatrí ku mne. 762 00:34:44,940 --> 00:34:50,900 Okrem toho, tu dole, 40 bytov v jednom bloky sú definitívne stratené v zázname 1. 763 00:34:50,900 --> 00:34:56,500 To preto, že keď volám malloc tu, som vlastne nikdy uvoľniť pamäť. 764 00:34:56,500 --> 00:34:58,140 >> Tak ako môžeme opraviť? 765 00:34:58,140 --> 00:35:02,970 Nechaj ma ísť ďalej a byť trochu bezpečnejšie a robiť 9 tam a dovoľte mi, aby som tu zadarmo x. 766 00:35:02,970 --> 00:35:04,820 Toto je nová funkcia pre dnešok. 767 00:35:04,820 --> 00:35:11,520 Keby som teraz znovu spustiť, aby spomienka dot lomítko, poďme bežať valgrind na to znova, 768 00:35:11,520 --> 00:35:14,990 maximalizovať okno a stlačte Enter. 769 00:35:14,990 --> 00:35:16,900 Teraz, je to dobré. 770 00:35:16,900 --> 00:35:19,590 Oni pochovať dobré správy vo všetkých tohto výstupu. 771 00:35:19,590 --> 00:35:20,810 Všetky haldy bloky sú zadarmo. 772 00:35:20,810 --> 00:35:23,604 Vrátime sa na to, čo haldy je, ale žiadna úniky sú možné. 773 00:35:23,604 --> 00:35:25,520 Takže je to len ďalší nástrojom pre vaše sade náradia 774 00:35:25,520 --> 00:35:30,220 s ktorými môžete začať teraz nájsť chyby, ako to. 775 00:35:30,220 --> 00:35:34,532 >> Ale poďme sa pozrieť, čo viac sa môže pokaziť tu. 776 00:35:34,532 --> 00:35:38,890 Poďme prechod teraz v skutočnosti riešenie problému. 777 00:35:38,890 --> 00:35:42,440 Ako stranou, ak to bude uľahčiť Trochu zmätku alebo napätia, 778 00:35:42,440 --> 00:35:43,430 toto je teraz smiešny. 779 00:35:43,430 --> 00:35:46,400 780 00:35:46,400 --> 00:35:46,900 Jo. 781 00:35:46,900 --> 00:35:49,040 To je celkom dobrý. 782 00:35:49,040 --> 00:35:50,890 Vzhľadom k tomu, ukazovatele sú adresy a adresy 783 00:35:50,890 --> 00:35:53,098 sú všeobecne konvencií písaný s šestnástkovej. 784 00:35:53,098 --> 00:35:54,650 Ha, ha, to je teraz smiešne. 785 00:35:54,650 --> 00:35:58,390 Tak či onak, takže poďme teraz v skutočnosti vyriešiť problém. 786 00:35:58,390 --> 00:36:00,840 To bol výborný, extra low-level tak ďaleko, 787 00:36:00,840 --> 00:36:03,950 a my môžeme vlastne robiť užitočné veci s týmito detaily low-level. 788 00:36:03,950 --> 00:36:06,710 >> Preto sme zaviedli niekoľko týždňov Pred pojem pole. 789 00:36:06,710 --> 00:36:09,177 Pole bolo fajn, pretože je ťažké upratať náš kód 790 00:36:09,177 --> 00:36:11,760 pretože ak by sme chceli napísať program s niekoľkými študentmi 791 00:36:11,760 --> 00:36:15,270 alebo viac názvov a domy a dorms a vysoké školy a všetko, 792 00:36:15,270 --> 00:36:19,430 sme mohli uložiť všetko viac čisto vnútri poľa. 793 00:36:19,430 --> 00:36:23,039 Ale navrhnúť jednu tienistú stránku z poľa tak ďaleko. 794 00:36:23,039 --> 00:36:26,080 Aj keď ste neutrpelo sami v programe, jednoducho inštinktívne, 795 00:36:26,080 --> 00:36:30,870 čo je to zlá vec o maticu, snáď? 796 00:36:30,870 --> 00:36:32,337 Počul som nejaké mumlanie. 797 00:36:32,337 --> 00:36:34,170 Divákov: Je to ťažké zmeniť veľkosť. 798 00:36:34,170 --> 00:36:36,128 DAVID Malan: Je to ťažké zmeniť veľkosť. 799 00:36:36,128 --> 00:36:38,660 Nemožno zmeniť veľkosť z poľa, v skutočnosti, samo o sebe 800 00:36:38,660 --> 00:36:43,040 v C. môžete prideliť ďalšie pole, presunúť všetko od starého 801 00:36:43,040 --> 00:36:45,380 do nového, a teraz mať nejaký priestor navyše, 802 00:36:45,380 --> 00:36:47,469 ale nie je to asi tak, ako jazyk ako Java alebo Python 803 00:36:47,469 --> 00:36:49,760 alebo ľubovoľný počet iné jazyky, s ktorými niektorí z vás 804 00:36:49,760 --> 00:36:52,070 môže byť oboznámení kde na vás stačí držať pridanie veci 805 00:36:52,070 --> 00:36:53,930 omrzenia na koniec poľa. 806 00:36:53,930 --> 00:36:57,880 Keď máte rad veľkosť 6, to je jeho veľkosť, 807 00:36:57,880 --> 00:37:01,970 a tak rovnako ako myšlienka skôr ktorý má vyrovnávaciu pamäť určitej veľkosti, 808 00:37:01,970 --> 00:37:05,940 musíte uhádnuť z brány Akú veľkosť chceš, aby to bolo? 809 00:37:05,940 --> 00:37:07,880 Ak máte hádať príliš veľký, strácate priestor. 810 00:37:07,880 --> 00:37:10,950 Ak máte hádať príliš malá, vás nemôže uložiť, že dáta, prinajmenšom 811 00:37:10,950 --> 00:37:12,940 bez oveľa viac práce. 812 00:37:12,940 --> 00:37:18,180 >> Takže dnes, vďaka ukazovatele, môžeme začiatok šitia dohromady vlastné vlastné 813 00:37:18,180 --> 00:37:20,989 dátové štruktúry, a fakt, tu je niečo, 814 00:37:20,989 --> 00:37:23,030 že vyzerá trochu viac mystické na prvý pohľad, 815 00:37:23,030 --> 00:37:26,440 ale to je to, čo budeme nazývať pripojený Zoznam a jeho meno druh zhŕňa 816 00:37:26,440 --> 00:37:26,940 za to. 817 00:37:26,940 --> 00:37:29,550 Je to zoznam čísel, alebo tento prípad, zoznam čísel, 818 00:37:29,550 --> 00:37:33,480 ale môže to byť zoznam čohokoľvek, ale to je prepojené prostredníctvom šípok, 819 00:37:33,480 --> 00:37:36,380 a len sa hádať s tým, čo technika 820 00:37:36,380 --> 00:37:38,310 budeme môcť šiť dohromady, 821 00:37:38,310 --> 00:37:42,540 niečo ako popcorn so závitom, prepojené zoznamy obdĺžniky tu? 822 00:37:42,540 --> 00:37:43,936 Jej čísla? 823 00:37:43,936 --> 00:37:45,560 Čo je základný jazyk funkcie? 824 00:37:45,560 --> 00:37:46,350 >> Divákov: Ukazovateľ. 825 00:37:46,350 --> 00:37:47,308 >> DAVID Malan: Ukazovateľ. 826 00:37:47,308 --> 00:37:51,700 Takže každý z týchto šípok tu reprezentuje ukazovateľ alebo len adresa. 827 00:37:51,700 --> 00:37:54,590 Takže inými slovami, keď budem chcieť pre uloženie zoznam čísel, 828 00:37:54,590 --> 00:37:59,040 Nemôžem len ukladať, ak chcem, schopnosť rásť a zmenšiť 829 00:37:59,040 --> 00:38:00,990 môj štruktúra dát v poli. 830 00:38:00,990 --> 00:38:03,000 Tak som potrebné mať trochu viac prepracovanosť, 831 00:38:03,000 --> 00:38:05,720 nevšimnúť, že tento obrázok druh naznačuje, 832 00:38:05,720 --> 00:38:08,650 že ak ste práve dostali malé závity spojovacie všetko dohromady, 833 00:38:08,650 --> 00:38:13,100 asi nie je tak ťažké, aby sa priestor medzi dve z týchto obdĺžnikov 834 00:38:13,100 --> 00:38:16,750 alebo dva z týchto uzlov, ako začneme volať, vložte novú uzla, 835 00:38:16,750 --> 00:38:19,547 a potom s nejakým novým závitom, len priekopa tri uzly dohromady, 836 00:38:19,547 --> 00:38:22,880 prvý, posledný, a ten, že ste práve vložená do stredu. 837 00:38:22,880 --> 00:38:26,000 >> A vskutku spájať zoznam, Na rozdiel od poľa, je dynamický. 838 00:38:26,000 --> 00:38:27,840 To môže rásť, a to môže zmenšovať a vy nie 839 00:38:27,840 --> 00:38:32,434 musí poznať alebo starostlivosť vopred, ako veľa dát budete sa skladovania, 840 00:38:32,434 --> 00:38:35,600 ale ukázalo sa, musíme byť trochu Dbajte na to, ako to urobiť. 841 00:38:35,600 --> 00:38:39,070 Takže najprv uvažujme, ako implementovať jeden z týchto malých obdĺžnikov. 842 00:38:39,070 --> 00:38:40,690 Je to jednoduché implementovať int. 843 00:38:40,690 --> 00:38:44,000 Stačí povedať int N, a získate 4 bajty pre int, 844 00:38:44,000 --> 00:38:49,089 ale ako to mám dostať int, hovoria n, a potom ukazovateľ, nazvime to nabudúce. 845 00:38:49,089 --> 00:38:50,880 Mohli by sme zavolať títo veci, čokoľvek chceme, 846 00:38:50,880 --> 00:38:53,590 ale potrebujem štruktúru vlastné dáta. 847 00:38:53,590 --> 00:38:54,257 Jo? 848 00:38:54,257 --> 00:38:57,020 >> Divákov: Ampersand [Nepočuteľné]. 849 00:38:57,020 --> 00:39:00,940 >> DAVID Malan: Takže ampersand budeme používať na získať adresu uzla potenciálne. 850 00:39:00,940 --> 00:39:02,740 Ale my potrebujeme ďalšie rysom C za účelom 851 00:39:02,740 --> 00:39:06,700 mi dať schopnosť vytvárať Tento zvyk obdĺžnik, tento zvyk 852 00:39:06,700 --> 00:39:08,919 Premenná ak chcete, v pamäti. 853 00:39:08,919 --> 00:39:09,710 Divákov: struct. 854 00:39:09,710 --> 00:39:10,626 DAVID Malan: struct. 855 00:39:10,626 --> 00:39:14,310 Pripomeňme, od minulého týždňa, sme zaviedli struct, tento pomerne jednoduchý kľúčové slovo 856 00:39:14,310 --> 00:39:16,254 že nám umožňuje robiť veci, ako je tento. 857 00:39:16,254 --> 00:39:18,420 C neprišiel s dátami štruktúru zvanú študent. 858 00:39:18,420 --> 00:39:22,190 Dodáva sa s int a plavákom a char a taký, ale to neprichádza s študent, 859 00:39:22,190 --> 00:39:26,750 ale môžeme vytvoriť typ študenta dát, štruktúra študent, s touto syntaxou 860 00:39:26,750 --> 00:39:27,250 sem. 861 00:39:27,250 --> 00:39:28,350 A budete vidieť znova a znova. 862 00:39:28,350 --> 00:39:30,426 Takže sa nemusíte báť, memorovanie kľúčové slová, 863 00:39:30,426 --> 00:39:33,300 ale kľúčové slovo, ktoré je dôležité je, len to, že sme si povedali, struct 864 00:39:33,300 --> 00:39:37,590 a potom sme hovorili, že študenta a vnútri študenta bolo meno a dom 865 00:39:37,590 --> 00:39:39,390 alebo koľaji alebo podobne. 866 00:39:39,390 --> 00:39:41,980 >> A tak teraz, dnes poďme navrhnúť toto. 867 00:39:41,980 --> 00:39:45,240 Pridal som pár slov, ale ak chcem na vykonanie tohto obdĺžnik, ktorý je 868 00:39:45,240 --> 00:39:48,440 dostal obaja int a ukazovateľ, viete čo, ja som 869 00:39:48,440 --> 00:39:51,540 chystá vyhlásiť struct názvom uzla. 870 00:39:51,540 --> 00:39:55,630 Som tiež, vnútri nej, povieš že uzol, tento obdĺžnik, má int 871 00:39:55,630 --> 00:39:59,730 a my budeme nazývať n a to má ďalší ukazovateľ. 872 00:39:59,730 --> 00:40:02,540 A to je trochu ukecaný, ale ak si myslíte o tom, 873 00:40:02,540 --> 00:40:07,300 šípky, ktoré boli v obraze pred chvíľou sú akého dátového typu? 874 00:40:07,300 --> 00:40:12,330 Tam, kde každý z týchto šípok ukazuje aký typ dátové štruktúry? 875 00:40:12,330 --> 00:40:14,332 Nie je to len preto, aby ukázal int per sa. 876 00:40:14,332 --> 00:40:16,165 Je to ukazujúc na Celá vec obdĺžnikový 877 00:40:16,165 --> 00:40:18,720 a že obdĺžnikový vec, sme si povedali, sa nazýva uzol. 878 00:40:18,720 --> 00:40:21,720 A tak sme sa trochu musieť rekurzívne definovať to, ako 879 00:40:21,720 --> 00:40:26,270 že uzol, povedzme, bude obsahovať int názvom n 880 00:40:26,270 --> 00:40:31,070 a ukazovateľ s názvom ďalšie a druh dátové štruktúry, ku ktorému 881 00:40:31,070 --> 00:40:35,770 že ukazovateľ bodov je zrejme Bude struct uzla. 882 00:40:35,770 --> 00:40:41,550 >> Tak toto je protivne ukecaný a jednoducho byť pedantská, 883 00:40:41,550 --> 00:40:44,100 dôvod, prečo nemôžeme Len hovorím, čo úprimne povedané 884 00:40:44,100 --> 00:40:46,860 vyzerá oveľa čitateľnejší, Je to preto, pripomeňme, že C čítať 885 00:40:46,860 --> 00:40:48,710 veci zhora nadol, zľava doprava. 886 00:40:48,710 --> 00:40:54,120 Nie je to až dostaneme bodkočiarka že uzol kľúčové slovo skutočne existuje. 887 00:40:54,120 --> 00:40:57,980 Takže ak chceme mať tento druh cyklické referencie vnútri dáta 888 00:40:57,980 --> 00:41:02,120 štruktúra, musíme to urobiť, ak hovoríme struct uzol na vrchole, ktorý 889 00:41:02,120 --> 00:41:06,770 nám dáva dlhší spôsob, ako opísať to vec, potom vnútri hovoríme struct uzol, 890 00:41:06,770 --> 00:41:09,560 a potom na posledný riadok hovoríme, v poriadku, C, mimochodom, 891 00:41:09,560 --> 00:41:12,060 stačí zavolať celú tá prekliata vec uzol a zastaviť 892 00:41:12,060 --> 00:41:14,360 pomocou kľúčového slova struct úplne. 893 00:41:14,360 --> 00:41:18,030 Takže je to len niečo ako syntaxe trik, ktorý nakoniec nám umožňuje vytvárať 894 00:41:18,030 --> 00:41:21,370 niečo, čo vyzerá presne takto. 895 00:41:21,370 --> 00:41:25,010 >> Takže ak budeme predpokladať, teraz môžeme vykonávať túto vec C, 896 00:41:25,010 --> 00:41:28,040 Ako máme vlastne začať pojazdu to? 897 00:41:28,040 --> 00:41:32,360 No, v skutočnosti, všetko, čo musíte urobiť, je opakovať zľava doprava a len 898 00:41:32,360 --> 00:41:35,960 druh vložiť uzlov alebo odstrániť uzly alebo hľadať veci, všade tam, kde chceme, 899 00:41:35,960 --> 00:41:39,560 ale k tomu, poďme do toho a robiť o niečo reálnejšie veci, pretože to 900 00:41:39,560 --> 00:41:42,560 bola mimoriadne nízkej úrovni tak ďaleko. 901 00:41:42,560 --> 00:41:45,700 By niekto doslova chcel byť prvý? 902 00:41:45,700 --> 00:41:46,200 OK. 903 00:41:46,200 --> 00:41:47,092 Poď hore. 904 00:41:47,092 --> 00:41:47,800 Ako sa voláš? 905 00:41:47,800 --> 00:41:48,499 >> DAVID: David. 906 00:41:48,499 --> 00:41:49,290 DAVID Malan: David. 907 00:41:49,290 --> 00:41:49,998 Rád som ťa spoznal. 908 00:41:49,998 --> 00:41:50,960 Ja tiež. 909 00:41:50,960 --> 00:41:52,450 Dobre. 910 00:41:52,450 --> 00:41:53,990 A my potrebujeme číslo 9. 911 00:41:53,990 --> 00:41:55,240 Nie tak dobrý ako predtým, možno. 912 00:41:55,240 --> 00:41:56,430 OK, číslo 9. 913 00:41:56,430 --> 00:41:59,667 Číslo 17, prosím. 914 00:41:59,667 --> 00:42:01,000 Dovoľte mi, aby som sa vrátiť o kúsok ďalej. 915 00:42:01,000 --> 00:42:03,980 Číslo 22, prosím, a Ako sa o ďalej späť 916 00:42:03,980 --> 00:42:06,344 či môžem vidieť žiadne ruky sa všetko svetlo, alebo nie. 917 00:42:06,344 --> 00:42:08,010 Niekto sa prihlásil práve tam. 918 00:42:08,010 --> 00:42:08,968 Chcete prísť? 919 00:42:08,968 --> 00:42:10,450 Vaše predlaktia sa násilne stúpa. 920 00:42:10,450 --> 00:42:12,340 OK, 17. 921 00:42:12,340 --> 00:42:13,690 22. 922 00:42:13,690 --> 00:42:15,120 26 prichádza dole. 923 00:42:15,120 --> 00:42:18,450 By niekto iný chcel forcefully-- Poď hore. 924 00:42:18,450 --> 00:42:21,030 Skutočný dobrovoľník. 925 00:42:21,030 --> 00:42:23,330 >> Takže veľmi rýchlo, ak je vy mohol zariadiť 926 00:42:23,330 --> 00:42:26,550 sami rovnako ako uzly na obrazovke. 927 00:42:26,550 --> 00:42:27,510 Ďakujem. 928 00:42:27,510 --> 00:42:29,234 A budete mať 26. 929 00:42:29,234 --> 00:42:30,650 Všetky správne a rýchle úvody. 930 00:42:30,650 --> 00:42:32,139 Takže som Dávid a ste tiež? 931 00:42:32,139 --> 00:42:32,680 DAVID: David. 932 00:42:32,680 --> 00:42:33,721 DAVID Malan: A vy ste? 933 00:42:33,721 --> 00:42:34,229 JAKE: Jake. 934 00:42:34,229 --> 00:42:34,729 SUE: Sue. 935 00:42:34,729 --> 00:42:35,229 ALEX: Alex. 936 00:42:35,229 --> 00:42:36,475 RAPHAEL: Raphael. 937 00:42:36,475 --> 00:42:37,100 TL: taylor. 938 00:42:37,100 --> 00:42:37,466 DAVID Malan: Taylor. 939 00:42:37,466 --> 00:42:37,590 Výborne. 940 00:42:37,590 --> 00:42:39,810 Tak to sú naši dobrovoľníci pre dnes a pokračovať 941 00:42:39,810 --> 00:42:43,090 a posunúť trochu to tak, a jednoducho ísť dopredu a držať 942 00:42:43,090 --> 00:42:47,024 holding vaše čísla ako vy alebo váš Prvé známkou a ľavou rukou, 943 00:42:47,024 --> 00:42:48,940 choďte do toho a jednoducho realizovať Tieto šípky, len 944 00:42:48,940 --> 00:42:51,360 tak, aby vaša ľavá ruka je doslova ukazuje na čo by ste sa mali ukázať 945 00:42:51,360 --> 00:42:54,610 u, a dať si tak, aby nejaké miesto môžeme vizuálne vidieť ruky vlastne 946 00:42:54,610 --> 00:42:58,120 bodovania, a vy môžete len bod druh u krajina je v poriadku. 947 00:42:58,120 --> 00:43:03,040 >> Takže tu máme prepojeného zoznamu jedného, dva, tri, štyri, päť uzly spočiatku, 948 00:43:03,040 --> 00:43:05,860 a všimnite si, máme to zvláštne ukazovateľ na začiatku, kto je 949 00:43:05,860 --> 00:43:09,770 key pretože musíme sledovať celej dĺžke zoznamu nejako. 950 00:43:09,770 --> 00:43:13,590 Títo chlapci, a to aj napriek tomu, že ste opustili doprava, chrbtom k sebe v pamäti, 951 00:43:13,590 --> 00:43:15,950 môžu v skutočnosti byť kdekoľvek V pamäti počítača. 952 00:43:15,950 --> 00:43:18,240 Takže títo ľudia môžu byť stojaci kdekoľvek na pódiu 953 00:43:18,240 --> 00:43:20,960 a to je v poriadku, tak dlho, ako oni sú v skutočnosti ukazuje na seba, 954 00:43:20,960 --> 00:43:22,770 ale udržať veci čistý a jednoduchý, budeme 955 00:43:22,770 --> 00:43:25,728 len kresliť je zľava doprava, ako , Ale mohlo by byť masívny medzery 956 00:43:25,728 --> 00:43:26,790 medzi týmito uzlami. 957 00:43:26,790 --> 00:43:30,710 >> A teraz, keď chcem naozaj vložiť niektoré nová hodnota, poďme do toho a to urobiť. 958 00:43:30,710 --> 00:43:33,720 Máme príležitosť teraz zvoliť iný uzol. 959 00:43:33,720 --> 00:43:39,820 Povedzme, poďme začať s mallocing 55. 960 00:43:39,820 --> 00:43:41,320 Nevadilo by ich niekto malloc? 961 00:43:41,320 --> 00:43:42,280 OK, poď hore. 962 00:43:42,280 --> 00:43:42,992 Ako sa voláš? 963 00:43:42,992 --> 00:43:43,700 RAINBOW: Dúha. 964 00:43:43,700 --> 00:43:44,050 DAVID Malan: Dúha? 965 00:43:44,050 --> 00:43:44,810 Dobre. 966 00:43:44,810 --> 00:43:46,600 Malloc Dúha. 967 00:43:46,600 --> 00:43:47,450 Poď hore. 968 00:43:47,450 --> 00:43:51,610 Takže teraz sa musíme pýtať sami seba, algoritmickým kde môžeme dať 55. 969 00:43:51,610 --> 00:43:53,610 Takže všetci vieme, samozrejme, kde zrejme 970 00:43:53,610 --> 00:43:55,401 Patrí-li, že sa snažíme aby tento zoradená 971 00:43:55,401 --> 00:43:58,299 a ak by bolo vy mať jednu krok späť, takže nemáme spadnúť 972 00:43:58,299 --> 00:43:59,590 fázy, to by bolo skvelé. 973 00:43:59,590 --> 00:44:01,420 Takže vlastne, Dúha, začať znovu tu so mnou, 974 00:44:01,420 --> 00:44:04,200 preto, že sme ako počítač teraz môže vidieť iba jednu premennú naraz. 975 00:44:04,200 --> 00:44:05,190 Takže ak sa jedná o prvý uzol. 976 00:44:05,190 --> 00:44:07,160 Všimnite si, že to nie je uzol, je to len ukazovateľ, 977 00:44:07,160 --> 00:44:10,270 a to je dôvod, prečo je potrebné venovať sa iba veľkosť ukazovatele, nie 978 00:44:10,270 --> 00:44:11,780 jeden z týchto plných obdĺžnikov. 979 00:44:11,780 --> 00:44:16,650 Takže ideme skontrolovať na seba iterácie je 55 menej ako 9? 980 00:44:16,650 --> 00:44:17,150 Nie. 981 00:44:17,150 --> 00:44:19,060 Je 55 menej ako 17? 982 00:44:19,060 --> 00:44:19,720 Nie. 983 00:44:19,720 --> 00:44:20,800 Menej ako 22? 984 00:44:20,800 --> 00:44:22,020 Menej ako 26? 985 00:44:22,020 --> 00:44:23,390 Menej ako 34? 986 00:44:23,390 --> 00:44:25,890 A tak teraz, samozrejme Dúha patrí na záver. 987 00:44:25,890 --> 00:44:27,270 Tak aby bolo jasno, a to, čo bolo vaše meno, Taylor? 988 00:44:27,270 --> 00:44:27,895 >> TL: taylor. 989 00:44:27,895 --> 00:44:32,510 DAVID Malan: Takže medzi Taylora Ľavá ruka a rainbow ruky tu, 990 00:44:32,510 --> 00:44:38,324 ktorého rúk je potrebné poukázať na to, čo v Pre vloženie 55 do tohto zoznamu? 991 00:44:38,324 --> 00:44:39,240 Čo musíme urobiť? 992 00:44:39,240 --> 00:44:39,700 Jo? 993 00:44:39,700 --> 00:44:41,140 >> Divákov: Taylor ruka potrebuje k bodu doľava. 994 00:44:41,140 --> 00:44:41,680 >> DAVID Malan: Presne tak. 995 00:44:41,680 --> 00:44:43,800 Takže vloženie uzla na koniec zoznamu 996 00:44:43,800 --> 00:44:47,140 je veľmi jednoduché, pretože práve Taylor má na bod, namiesto na zem 997 00:44:47,140 --> 00:44:49,640 alebo budeme nazývať null, null je niečo absencia 998 00:44:49,640 --> 00:44:51,640 z ukazovateľa alebo špeciálne nulový ukazovateľ, že ste 999 00:44:51,640 --> 00:44:53,740 ísť k bodu s vašou ľavici ruka Rainbow a potom Rainbow, 1000 00:44:53,740 --> 00:44:55,910 kde by mala byť vaša doľava ruka pravdepodobne bod? 1001 00:44:55,910 --> 00:44:56,570 Down. 1002 00:44:56,570 --> 00:45:00,140 Nie je to dobré, keď jej ruka je trochu ukazovanie tu, alebo tak nejako akékoľvek off 1003 00:45:00,140 --> 00:45:00,640 akým spôsobom. 1004 00:45:00,640 --> 00:45:02,407 Ktoré by bolo považované hodnota odpadky, 1005 00:45:02,407 --> 00:45:04,240 ale keď poukazuje na Niektoré známe hodnoty, budeme 1006 00:45:04,240 --> 00:45:07,360 nazývajú nula alebo null, to je v poriadku pretože máme termín v tom 1007 00:45:07,360 --> 00:45:09,390 a vieme, že zoznam je teraz kompletná. 1008 00:45:09,390 --> 00:45:11,550 >> Takže to, čo je ďalší pomerne jednoduchý prípad? 1009 00:45:11,550 --> 00:45:13,125 Mohli by sme malloc 5? 1010 00:45:13,125 --> 00:45:14,010 Poď hore. 1011 00:45:14,010 --> 00:45:14,782 Ako sa voláš? 1012 00:45:14,782 --> 00:45:15,490 TIFFANY: Tiffany. 1013 00:45:15,490 --> 00:45:16,000 DAVID Malan: Je mi to ľúto? 1014 00:45:16,000 --> 00:45:16,470 TIFFANY: Tiffany. 1015 00:45:16,470 --> 00:45:16,880 DAVID Malan: Tiffany. 1016 00:45:16,880 --> 00:45:17,110 Dobre. 1017 00:45:17,110 --> 00:45:19,071 Tiffany bola malloced s hodnotou 5. 1018 00:45:19,071 --> 00:45:19,570 Poď hore. 1019 00:45:19,570 --> 00:45:23,820 Toto je relatívne ľahké taky, ale uvažujme poradí operácií teraz. 1020 00:45:23,820 --> 00:45:25,820 Bolo to celkom jednoduché s Taylorom na konci. 1021 00:45:25,820 --> 00:45:30,302 Číslo 5 je samozrejme menšie ako 9, a tak máme Davida, máme Tiffany, 1022 00:45:30,302 --> 00:45:31,260 a aká bola vaše meno? 1023 00:45:31,260 --> 00:45:31,680 >> JAKE: Jake. 1024 00:45:31,680 --> 00:45:32,470 >> DAVID Malan: Jake. 1025 00:45:32,470 --> 00:45:34,300 Tiffany Jake, a David. 1026 00:45:34,300 --> 00:45:36,580 Čí ruka by mali byť aktualizované ako prvé? 1027 00:45:36,580 --> 00:45:39,260 1028 00:45:39,260 --> 00:45:40,590 Čo chceš robiť? 1029 00:45:40,590 --> 00:45:45,244 Je tu pár možné spôsoby, ale tam je tiež jeden alebo viac zlé cesty. 1030 00:45:45,244 --> 00:45:46,620 >> Divákov: Začnite s úplne vľavo. 1031 00:45:46,620 --> 00:45:47,800 >> DAVID Malan: Začnite úplne vľavo. 1032 00:45:47,800 --> 00:45:49,008 Kto je tu vľavo potom? 1033 00:45:49,008 --> 00:45:49,700 Divákov: Prvý. 1034 00:45:49,700 --> 00:45:50,366 >> DAVID Malan: OK. 1035 00:45:50,366 --> 00:45:53,781 Takže začať s prvým a kam vás Chcete aktualizovať Dávidovi ruky byť? 1036 00:45:53,781 --> 00:45:54,780 Divákov: Smerom k 5. 1037 00:45:54,780 --> 00:45:55,446 DAVID Malan: OK. 1038 00:45:55,446 --> 00:45:59,026 A tak Dávid, bod v päť alebo Tiffany tu a teraz? 1039 00:45:59,026 --> 00:46:01,072 >> Divákov: Tiffany poukazuje na 9? 1040 00:46:01,072 --> 00:46:04,030 DAVID Malan: Perfect, s výnimkou Binky je Hlava tak nejako spadol, že jo? 1041 00:46:04,030 --> 00:46:06,820 Vzhľadom k tomu, čo je zle tento obrázok doslova? 1042 00:46:06,820 --> 00:46:08,070 Divákov: Nič sa ukázal. 1043 00:46:08,070 --> 00:46:09,945 DAVID Malan: Nič nie je ukázal na Jakom teraz. 1044 00:46:09,945 --> 00:46:13,360 My sme doslova osirelý 9 a 17, a my sme doslova 1045 00:46:13,360 --> 00:46:18,450 unikli všetky tejto pamäti, pretože tým, Prvá aktualizácia Dávidovmu ruku, to je 1046 00:46:18,450 --> 00:46:21,660 poriadku, ak je to správne ukázal na Tiffany teraz, 1047 00:46:21,660 --> 00:46:25,410 ale ak nikto mal predvídavosť poukázať na Jakea, 1048 00:46:25,410 --> 00:46:27,490 potom sme stratili celistvosť tohto zoznamu. 1049 00:46:27,490 --> 00:46:28,200 Takže poďme vrátiť späť. 1050 00:46:28,200 --> 00:46:30,950 Takže to bola dobrá vec, zakopnúť ale poďme napraviť teraz. 1051 00:46:30,950 --> 00:46:33,624 Čo by sme mali urobiť ako prvé miesto? 1052 00:46:33,624 --> 00:46:34,124 Jo? 1053 00:46:34,124 --> 00:46:35,791 >> Divákov: Tiffany by mal ukázať na 9? 1054 00:46:35,791 --> 00:46:37,582 DAVID Malan: Nemôžem dostať, že blízko k vám. 1055 00:46:37,582 --> 00:46:38,720 Kto by mal ukázať na 9? 1056 00:46:38,720 --> 00:46:39,220 >> Divákov: Tiffany. 1057 00:46:39,220 --> 00:46:39,390 >> DAVID Malan: Dobre. 1058 00:46:39,390 --> 00:46:41,200 Takže Tiffany by Prvý bod na 9. 1059 00:46:41,200 --> 00:46:43,550 Takže Tiffany by mali prijať na rovnakú hodnotu 1060 00:46:43,550 --> 00:46:45,820 Dávidovi, ktorý sa zdá redundantné na chvíľu, 1061 00:46:45,820 --> 00:46:48,820 ale to je v poriadku, pretože hneď na druhý krok, môžeme aktualizovať Dávidovmu ruku 1062 00:46:48,820 --> 00:46:52,680 poukázať na Tiffany, a potom v prípade my tak nejako čisté veci hore 1063 00:46:52,680 --> 00:46:55,740 ako by toto je druh jar-ako, Teraz to je správne vloženie. 1064 00:46:55,740 --> 00:46:56,700 Tak vynikajúce. 1065 00:46:56,700 --> 00:46:57,970 Sme skoro tam, takže teraz máme. 1066 00:46:57,970 --> 00:47:01,075 Poďme vložte jeden finále hodnota ako hodnota 20. 1067 00:47:01,075 --> 00:47:03,010 Keby sme mohli malloc jednu záverečnú dobrovoľník? 1068 00:47:03,010 --> 00:47:04,140 Poď hore. 1069 00:47:04,140 --> 00:47:06,224 Tak toto je trochu zložitejšie. 1070 00:47:06,224 --> 00:47:08,390 Ale vážne, kód sme písanie, aj keď slovne, 1071 00:47:08,390 --> 00:47:10,610 je rovnako ako mať hromadu ze ak to podmienky, nie? 1072 00:47:10,610 --> 00:47:12,318 Mali sme podmienku kontrolovať, či patrí 1073 00:47:12,318 --> 00:47:13,840 na konci, možno na počiatku. 1074 00:47:13,840 --> 00:47:15,940 Potrebujeme nejaký druh slučky nájsť miesto uprostred. 1075 00:47:15,940 --> 00:47:17,400 Takže poďme to urobiť s Ako sa voláte? 1076 00:47:17,400 --> 00:47:17,700 >> ERIC: Eric. 1077 00:47:17,700 --> 00:47:18,340 >> DAVID Malan: Eric? 1078 00:47:18,340 --> 00:47:18,660 Eriku. 1079 00:47:18,660 --> 00:47:19,368 Rád som ťa spoznal. 1080 00:47:19,368 --> 00:47:20,490 Takže máme 20. 1081 00:47:20,490 --> 00:47:21,220 Menej ako päť? 1082 00:47:21,220 --> 00:47:21,530 Nie. 1083 00:47:21,530 --> 00:47:22,160 Menej ako deväť? 1084 00:47:22,160 --> 00:47:22,410 Nie. 1085 00:47:22,410 --> 00:47:23,050 Menej ako 17? 1086 00:47:23,050 --> 00:47:23,550 Nie. 1087 00:47:23,550 --> 00:47:23,740 OK. 1088 00:47:23,740 --> 00:47:25,701 On sem patrí, a Vaše mená sú opäť? 1089 00:47:25,701 --> 00:47:26,200 SUE: Sue. 1090 00:47:26,200 --> 00:47:26,880 DAVID Malan: Sue. 1091 00:47:26,880 --> 00:47:27,379 ALEX: Alex. 1092 00:47:27,379 --> 00:47:28,790 DAVID Malan: Sue, Alex, a? 1093 00:47:28,790 --> 00:47:29,290 ERIC: Eric. 1094 00:47:29,290 --> 00:47:30,120 DAVID Malan: Eric. 1095 00:47:30,120 --> 00:47:32,140 Potrebujete, aby ste mohli aktualizovať ako prvý, ktorých ruky? 1096 00:47:32,140 --> 00:47:32,930 >> Divákov: Eric. 1097 00:47:32,930 --> 00:47:33,429 OK. 1098 00:47:33,429 --> 00:47:35,200 Takže Eric to by mala ukazovať na to, kde? 1099 00:47:35,200 --> 00:47:35,930 Na 22. 1100 00:47:35,930 --> 00:47:36,430 Dobre. 1101 00:47:36,430 --> 00:47:38,180 A teraz, čo bude ďalej? 1102 00:47:38,180 --> 00:47:40,800 Sue potom môžu poukázať na Eric a teraz, ak ste chlapci len 1103 00:47:40,800 --> 00:47:44,077 urobiť nejaký priestor, čo je v poriadku vizuálne, teraz sme urobili vloženie. 1104 00:47:44,077 --> 00:47:47,160 Takže poďme teraz posúdenie otázky, ale ďakujem moc za naše dobrovoľníkmi. 1105 00:47:47,160 --> 00:47:48,090 Veľmi dobre. 1106 00:47:48,090 --> 00:47:50,831 Si môžete nechať tie, ak sa vám páči. 1107 00:47:50,831 --> 00:47:54,140 A máme krásny darček na rozlúčku, ak by ste každý rád, aby sa stres loptičku. 1108 00:47:54,140 --> 00:47:56,030 Dovoľte mi to prejsť nadol. 1109 00:47:56,030 --> 00:47:58,430 Takže to, čo je stánok s jedlom to? 1110 00:47:58,430 --> 00:48:02,430 To sa zdá byť úžasná ak máme teraz 1111 00:48:02,430 --> 00:48:06,360 predstavil alternatívu k Pole, ktoré nie je tak obmedzený 1112 00:48:06,360 --> 00:48:07,780 na maticu nejakého pevnú veľkosť. 1113 00:48:07,780 --> 00:48:09,380 Môžu dorásť dynamicky. 1114 00:48:09,380 --> 00:48:13,220 >> Ale podobne ako sme videli v týždňoch minulosť, sme sa nikdy dostať niečo zadarmo, 1115 00:48:13,220 --> 00:48:15,740 rovnako ako určite tam je trade-off tu. 1116 00:48:15,740 --> 00:48:18,890 Takže sa nahor prepojeného zoznam, je táto dynamika? 1117 00:48:18,890 --> 00:48:21,590 Táto schopnosť rásť a úprimne povedané, sme mohli urobiť delete 1118 00:48:21,590 --> 00:48:23,570 a tak by sme mohli zmenšovať podľa potreby. 1119 00:48:23,570 --> 00:48:24,710 Akú cenu platíme? 1120 00:48:24,710 --> 00:48:28,510 1121 00:48:28,510 --> 00:48:30,340 Dvakrát toľko priestoru, prvý zo všetkých. 1122 00:48:30,340 --> 00:48:34,010 Ak sa pozriete na obrázok, už nie som ukladanie zoznam celých čísel. 1123 00:48:34,010 --> 00:48:36,740 Som ukladanie zoznam celé čísla plus ukazovatele. 1124 00:48:36,740 --> 00:48:38,240 Takže som zdvojnásobenie množstvo priestoru. 1125 00:48:38,240 --> 00:48:40,740 Teraz, možno to nie je tak veľký problém 4 bajtov, 8 bajtov, 1126 00:48:40,740 --> 00:48:43,160 ale mohla by určite pridať up pre veľké súbory dát. 1127 00:48:43,160 --> 00:48:45,570 Čo je ďalšia nevýhoda? 1128 00:48:45,570 --> 00:48:46,070 Jo? 1129 00:48:46,070 --> 00:48:48,010 >> Divákov: Musíme prejsť im jeden po druhom. 1130 00:48:48,010 --> 00:48:48,760 DAVID Malan: Jo. 1131 00:48:48,760 --> 00:48:50,260 Musíme je prejsť jeden po druhom. 1132 00:48:50,260 --> 00:48:53,860 Vieš čo, sme sa vzdali tento super užitočná funkcia z hranatých zátvorkách 1133 00:48:53,860 --> 00:48:57,240 notácie, viac vhodne známy ako náhodný prístup, 1134 00:48:57,240 --> 00:48:59,280 kde si môžeme len skok na jednotlivé elementy 1135 00:48:59,280 --> 00:49:01,470 ale teraz, keď som ešte mal moja dobrovoľníci tu, 1136 00:49:01,470 --> 00:49:04,660 keby som chcel nájsť číslo 22, nemôžem len 1137 00:49:04,660 --> 00:49:06,620 skočiť na držiak niečo niečo. 1138 00:49:06,620 --> 00:49:10,530 Musím sa pozrieť cez zoznam, veľa ako lineárne našich vyhľadávacích príkladov, 1139 00:49:10,530 --> 00:49:12,260 nájsť číslo 22. 1140 00:49:12,260 --> 00:49:14,340 Takže sa zdá, že zaplatili cenu tam. 1141 00:49:14,340 --> 00:49:16,430 Ale môžeme napriek tomu vyriešiť ďalšie problémy. 1142 00:49:16,430 --> 00:49:18,587 >> V skutočnosti, dovoľte mi predstaviť len pár vizuálne. 1143 00:49:18,587 --> 00:49:20,920 Takže ak ste boli dole Mather jedálni v poslednej dobe, 1144 00:49:20,920 --> 00:49:23,320 budete pripomenúť, že ich stohy zásobníkov, ako je táto, 1145 00:49:23,320 --> 00:49:26,300 Požičali sme tieto od Annenberg pred triedy. 1146 00:49:26,300 --> 00:49:28,930 Takže tento stĺpec podložiek, aj keď, je vlastne reprezentatívny 1147 00:49:28,930 --> 00:49:30,860 dátové štruktúry počítačovej vedy. 1148 00:49:30,860 --> 00:49:32,910 K dispozícii je dátová štruktúra v informatike 1149 00:49:32,910 --> 00:49:38,010 známy ako zásobník, ktorý veľmi pekne požičiava seba presne to vizuálne. 1150 00:49:38,010 --> 00:49:41,380 Takže ak každý z týchto zásobníkov nie je zásobník, ale rovnako ako rad a ja som chcel, 1151 00:49:41,380 --> 00:49:45,010 uloženie telefónnych čísel, ja mohol dať tu jeden dole, 1152 00:49:45,010 --> 00:49:48,320 a ja som mohol dať ďalší tu, a pokračovať stohovanie čísla 1153 00:49:48,320 --> 00:49:53,180 nad sebou, a to, čo je potenciálne užitočné o tom 1154 00:49:53,180 --> 00:49:55,450 je to, že to, čo je implikácia tejto dátové štruktúry? 1155 00:49:55,450 --> 00:49:58,045 Ktoré číslo môžem vytiahnuť Prvý najvýhodnejšie? 1156 00:49:58,045 --> 00:50:00,640 1157 00:50:00,640 --> 00:50:03,030 Najviac v súčasnosti jeden dal tam. 1158 00:50:03,030 --> 00:50:06,430 >> Takže to je to, čo by sme nazvali v informatika dátová štruktúra LIFO. 1159 00:50:06,430 --> 00:50:08,070 Last in, first out. 1160 00:50:08,070 --> 00:50:10,800 A uvidíme onedlho, prečo to by mohlo byť užitočné, ale pre túto chvíľu, 1161 00:50:10,800 --> 00:50:12,200 zváž vlastnosť. 1162 00:50:12,200 --> 00:50:15,158 A je to trochu hlúpe, ak si myslíte, o tom, ako ju jedáleň robí. 1163 00:50:15,158 --> 00:50:17,910 Zakaždým, keď čisté podnosy a dal najčerstvejšie ty na vrchole, 1164 00:50:17,910 --> 00:50:22,160 Tie by mohli mať skôr čisté ale nakoniec veľmi špinavé a zaprášené 1165 00:50:22,160 --> 00:50:24,360 zásobník na samom dne Ak ste nikdy vlastne 1166 00:50:24,360 --> 00:50:26,820 dostať sa až na dno, ktoré stack, pretože ste práve 1167 00:50:26,820 --> 00:50:29,380 udržať uvedenie novej a Čisté tie, na vrchole toho. 1168 00:50:29,380 --> 00:50:31,840 Rovnaká vec sa môže stať v supermarkete príliš. 1169 00:50:31,840 --> 00:50:35,450 Ak máte vitrínu mlieka a zakaždým CVS 1170 00:50:35,450 --> 00:50:37,610 alebo ten, kto dostane viac mlieka, stačí strčiť mlieka 1171 00:50:37,610 --> 00:50:39,880 že už máte na zadnej strane a dáte nové vpredu, 1172 00:50:39,880 --> 00:50:43,088 budete mať niektoré docela škaredé mlieko na konci dátové štruktúry, 1173 00:50:43,088 --> 00:50:46,390 pretože je to vždy na dne alebo ekvivalentne to je vždy na zadnej strane. 1174 00:50:46,390 --> 00:50:50,407 >> Ale je tu iný spôsob, ako premýšľať o tom, čakajú, až dáta a napríklad tento. 1175 00:50:50,407 --> 00:50:53,490 Ak ste jeden z tých ľudí, kto má rád na line up mimo obchodoch Apple 1176 00:50:53,490 --> 00:50:55,610 keď nový výrobok pochádza out, budete pravdepodobne 1177 00:50:55,610 --> 00:50:58,780 bez použitia zásobníka dát štruktúra, pretože vás 1178 00:50:58,780 --> 00:51:03,070 by odcudziť všetci ostatní, kto je zoraďovať kúpiť nejakú novú hračku. 1179 00:51:03,070 --> 00:51:06,610 Skôr, budete pravdepodobne používať aký druh dátové štruktúry 1180 00:51:06,610 --> 00:51:10,050 alebo aký druh systému v reálnom svete? 1181 00:51:10,050 --> 00:51:13,493 Dúfajme, že je to čiara, alebo viac správne alebo viac Briti-like, front. 1182 00:51:13,493 --> 00:51:17,700 A ukázalo sa, front je tiež štruktúra dát v informatike, 1183 00:51:17,700 --> 00:51:19,700 ale front má veľmi iný majetok. 1184 00:51:19,700 --> 00:51:20,820 Nie je to LIFO. 1185 00:51:20,820 --> 00:51:21,990 Last in, first out. 1186 00:51:21,990 --> 00:51:22,800 Chráň Boh. 1187 00:51:22,800 --> 00:51:24,280 Je to miesto FIFO. 1188 00:51:24,280 --> 00:51:26,110 Prvý dovnútra, prvý von. 1189 00:51:26,110 --> 00:51:27,970 A to je dobrá vec na poctivosti "kvôli 1190 00:51:27,970 --> 00:51:30,428 iste, keď ste obloženie up Super skoro ráno. 1191 00:51:30,428 --> 00:51:33,400 Ak sa tam dostať ako prvý, chcú sa dostať von najprv rovnako. 1192 00:51:33,400 --> 00:51:35,880 >> A tak sa všetky z týchto údajov štruktúry, fronty a komíny 1193 00:51:35,880 --> 00:51:39,220 a zväzky iných, dopadá vás môžete myslieť na to ako len pole. 1194 00:51:39,220 --> 00:51:41,820 Toto je pole, možno pevnú veľkosť 4, ale to by 1195 00:51:41,820 --> 00:51:44,990 byť celkom pekné, keby sme mohli len hromadu podnosy takmer nekonečne vysoký keby sme 1196 00:51:44,990 --> 00:51:46,780 majú, že mnoho zásobníky alebo čísla. 1197 00:51:46,780 --> 00:51:48,840 Takže možno chceme použite prepojeného zoznamu tu, 1198 00:51:48,840 --> 00:51:51,800 ale trade-off sa bude potenciálne, že potrebujeme viac pamäte, 1199 00:51:51,800 --> 00:51:55,930 zaberie trochu viac času, ale my neobmedzujú výšku stohu, 1200 00:51:55,930 --> 00:51:59,550 podobne ako Mather v vitríne môže obmedziť veľkosť stohu, 1201 00:51:59,550 --> 00:52:03,117 a preto sa jedná o rozhodnutie návrhu alebo dostupné možnosti k nám nakoniec. 1202 00:52:03,117 --> 00:52:04,950 Takže s týmito údajmi štruktúry, sme začali 1203 00:52:04,950 --> 00:52:09,360 videnie nová horná hranica potenciálne na to, čo predtým bolo veľmi rýchle 1204 00:52:09,360 --> 00:52:11,260 a kde necháme off ešte dnes a kde 1205 00:52:11,260 --> 00:52:13,200 budeme dúfať, že sa dostať do je v stredu, budeme 1206 00:52:13,200 --> 00:52:15,740 začať hľadať na dátach štruktúra, ktorá nám umožňuje vyhľadávať 1207 00:52:15,740 --> 00:52:18,260 prostredníctvom dát v čase konečného znovu prihlásiť. 1208 00:52:18,260 --> 00:52:21,470 A my sme videli, že, spomínam, v týždni nula a jeden s binárne vyhľadávania alebo delenie 1209 00:52:21,470 --> 00:52:22,180 a dobyť. 1210 00:52:22,180 --> 00:52:26,240 Je to vracia, a ešte lepšie, svätý grál pre túto stredu 1211 00:52:26,240 --> 00:52:29,510 bude prísť s Dátová štruktúra, ktorá beží skutočne 1212 00:52:29,510 --> 00:52:32,070 alebo teoreticky konštantný čas, pričom 1213 00:52:32,070 --> 00:52:34,760 nezáleží na tom, koľko milióny či miliardy vecí 1214 00:52:34,760 --> 00:52:38,470 máme v dátovej štruktúre, to bude trvať nás konštantný čas, možno jeden krok 1215 00:52:38,470 --> 00:52:41,387 alebo dva kroky, alebo 10 krokov, ale konštantný počet krokov 1216 00:52:41,387 --> 00:52:42,970 prehľadávať tejto štruktúry dát. 1217 00:52:42,970 --> 00:52:46,300 To samozrejme bude svätý grál ale o tom v stredu. 1218 00:52:46,300 --> 00:52:49,045 Uvidíme sa potom. 1219 00:52:49,045 --> 00:52:53,704 >> [Prehrávanie hudby] 1220 00:52:53,704 --> 00:56:08,448