1 00:00:00,000 --> 00:00:03,381 >> [Glazbom] 2 00:00:03,381 --> 00:00:10,626 3 00:00:10,626 --> 00:00:11,610 >> [VIDEO PLAYBACK] 4 00:00:11,610 --> 00:00:13,640 >> -On Laže. 5 00:00:13,640 --> 00:00:14,380 >> -O čemu? 6 00:00:14,380 --> 00:00:17,182 >> -Ne Znam. 7 00:00:17,182 --> 00:00:19,990 >> -Pa Što znamo? 8 00:00:19,990 --> 00:00:23,145 >> -To Na 9:15, Ray Santoya bio na bankomatu. 9 00:00:23,145 --> 00:00:23,644 -Da. 10 00:00:23,644 --> 00:00:27,030 Dakle, pitanje je, što je radio u 9:16? 11 00:00:27,030 --> 00:00:29,720 >> -Shooting Na 9 milimetar na nešto. 12 00:00:29,720 --> 00:00:31,540 Možda je vidio snajper. 13 00:00:31,540 --> 00:00:33,412 >> -Ili Je radio s njim. 14 00:00:33,412 --> 00:00:34,340 >> -Wait. 15 00:00:34,340 --> 00:00:36,200 Vrati se jedan. 16 00:00:36,200 --> 00:00:36,975 >> -Što vidiš? 17 00:00:36,975 --> 00:00:44,400 18 00:00:44,400 --> 00:00:47,805 >> -Bring Lice do punog zaslona. 19 00:00:47,805 --> 00:00:48,680 >> -His Naočale. 20 00:00:48,680 --> 00:00:50,060 >> -Postoji Je odraz. 21 00:00:50,060 --> 00:01:00,455 22 00:01:00,455 --> 00:01:02,280 >> -To Je Nuevitas bejzbol momčad. 23 00:01:02,280 --> 00:01:03,110 To je njihov logo. 24 00:01:03,110 --> 00:01:05,820 >> -I On je u razgovoru s tko je nosio tu jaknu. 25 00:01:05,820 --> 00:01:06,670 >> [END PLAYBACK] 26 00:01:06,670 --> 00:01:07,628 >> DAVID Malan: U redu. 27 00:01:07,628 --> 00:01:11,210 Ovo je CS50 i to je malo više od [nečujan] s kojima ste 28 00:01:11,210 --> 00:01:12,890 brbljanje s problemom postaviti četiri. 29 00:01:12,890 --> 00:01:16,606 Danas ćemo početi gledati malo više Duboko u te stvari zovu naputke, 30 00:01:16,606 --> 00:01:18,480 koji, iako je prilično Arcane tema, 31 00:01:18,480 --> 00:01:20,813 ispada da će biti sredstvo kojim ćemo 32 00:01:20,813 --> 00:01:24,320 možete početi graditi i montaže mnogo više sofisticirane programe. 33 00:01:24,320 --> 00:01:28,150 Ali mi je to na prošlu srijedu pomoću nekog prvog claymation. 34 00:01:28,150 --> 00:01:30,190 Dakle, to, podsjetimo, je Binky ga koristili smo 35 00:01:30,190 --> 00:01:33,148 uzeti pogledati program koji zapravo nije to ništa zanimljivo, 36 00:01:33,148 --> 00:01:34,950 ali je otkrio nekoliko problema. 37 00:01:34,950 --> 00:01:38,570 Dakle, za početak danas, zašto ne živimo brzo kroz neke od tih koraka, 38 00:01:38,570 --> 00:01:41,920 pokušati destilirati u ljudske uvjete upravo ono što se događa ovdje 39 00:01:41,920 --> 00:01:45,410 i zašto je to loše, a zatim prijeđite na i zapravo početi graditi nešto 40 00:01:45,410 --> 00:01:46,309 s ovom tehnikom? 41 00:01:46,309 --> 00:01:48,350 Dakle, to su bili prvi dvije linije u ovom programu 42 00:01:48,350 --> 00:01:51,340 te u laik uvjete, što se su ove dvije linije radi? 43 00:01:51,340 --> 00:01:55,600 Netko tko je razumno udoban s tim što je proglasio na zaslonu? 44 00:01:55,600 --> 00:01:58,340 45 00:01:58,340 --> 00:02:00,120 Koje su to dvije linije rade? 46 00:02:00,120 --> 00:02:02,070 To nije sve što je razlikuje od tjedan jednom, 47 00:02:02,070 --> 00:02:03,611 ali postoji neki novi poseban simbol. 48 00:02:03,611 --> 00:02:04,152 Da? 49 00:02:04,152 --> 00:02:05,628 Povratak postoji. 50 00:02:05,628 --> 00:02:07,092 >> PUBLIKA: Onaj upućuje? 51 00:02:07,092 --> 00:02:08,050 DAVID Malan: Reci opet? 52 00:02:08,050 --> 00:02:08,860 PUBLIKA: Onaj upućuje? 53 00:02:08,860 --> 00:02:11,776 DAVID Malan: proglašavanje naputke i budimo pročistite malo više. 54 00:02:11,776 --> 00:02:14,050 PUBLIKA: [nečujan] Adresa X i zatim y. 55 00:02:14,050 --> 00:02:15,300 DAVID Malan: I onda rješavati. 56 00:02:15,300 --> 00:02:18,550 Dakle, konkretno što radimo je da se proglašenje dvije varijable. 57 00:02:18,550 --> 00:02:21,252 Te varijable, ipak, idu biti tipa int zvijezde, koje 58 00:02:21,252 --> 00:02:23,210 točnije znači oni su idući za pohranu 59 00:02:23,210 --> 00:02:26,450 adresu int, odnosno, X i Y. 60 00:02:26,450 --> 00:02:27,660 Sada postoje li vrijednosti? 61 00:02:27,660 --> 00:02:32,621 Postoje li stvarni adrese u njih dvije varijable u ovom trenutku? 62 00:02:32,621 --> 00:02:33,120 Ne. 63 00:02:33,120 --> 00:02:35,030 To je samo tzv vrijednosti smeće. 64 00:02:35,030 --> 00:02:38,120 Ako ne zapravo dodijeliti varijabla, sve što je u RAM 65 00:02:38,120 --> 00:02:42,224 prethodno će se popuniti s nulama i one su obje od tih varijabli. 66 00:02:42,224 --> 00:02:44,140 Ali mi još uvijek ne znam što su i kako je 67 00:02:44,140 --> 00:02:47,060 će biti ključ zašto Binky izgubio glavu prošli tjedan. 68 00:02:47,060 --> 00:02:49,980 >> Dakle, to je bio claymation utjelovljenje toga 69 00:02:49,980 --> 00:02:53,580 gdje imate samo dvije varijable, mali kružne komada gline, 70 00:02:53,580 --> 00:02:57,330 koji može pohraniti varijable, ali kao je zavrsio strelice ukazuju, 71 00:02:57,330 --> 00:03:00,640 oni ne zapravo pokazujući gdje se samo po sebi poznato. 72 00:03:00,640 --> 00:03:03,670 Pa onda smo imali ovu liniju, a to je nova prošlog tjedna, malloc za pamćenje 73 00:03:03,670 --> 00:03:07,130 raspodjele, koji je samo fancy način reći operativni sustav, Linux 74 00:03:07,130 --> 00:03:09,750 ili Mac OS ili Windows, hej, dajte mi neke memorije, 75 00:03:09,750 --> 00:03:11,780 i sve što morate reći operativni sustav 76 00:03:11,780 --> 00:03:14,699 je ono kad ga pita za pamćenje. 77 00:03:14,699 --> 00:03:16,990 To neće brinuti što ti ćeš učiniti s njim, 78 00:03:16,990 --> 00:03:19,786 ali to ne treba reći radom Sustav ono putem malloc. 79 00:03:19,786 --> 00:03:20,286 Da? 80 00:03:20,286 --> 00:03:21,078 >> PUBLIKA: Koliko? 81 00:03:21,078 --> 00:03:21,994 DAVID Malan: Koliko? 82 00:03:21,994 --> 00:03:25,280 Koliko u bajtovima, i tako, to, opet, neprirodan primjer, samo je rekao: 83 00:03:25,280 --> 00:03:27,360 daj mi veličinu int. 84 00:03:27,360 --> 00:03:30,550 Sada, veličina int je četiri bajta ili 32 bita. 85 00:03:30,550 --> 00:03:32,850 Dakle, ovo je samo način govoreći, hej, operativni sustav, 86 00:03:32,850 --> 00:03:37,290 daj mi četiri bajta memorije da ja mogu koristiti na mom raspolaganju, 87 00:03:37,290 --> 00:03:40,560 a posebno, što se malloc povratak s poštovanjem 88 00:03:40,560 --> 00:03:41,795 na taj komad četiri bajta? 89 00:03:41,795 --> 00:03:44,110 90 00:03:44,110 --> 00:03:44,860 PUBLIKA: Adresa? 91 00:03:44,860 --> 00:03:45,901 DAVID Malan: adresa. 92 00:03:45,901 --> 00:03:47,580 Adresa tog komad četiri bajta. 93 00:03:47,580 --> 00:03:48,190 Točno. 94 00:03:48,190 --> 00:03:51,430 I tako to je ono što je pohranjena u konačnici u X i to je razlog zašto mi ne stvarno 95 00:03:51,430 --> 00:03:55,240 briga što je broj koji adresa, da li je ox1 ili OX2 96 00:03:55,240 --> 00:03:57,110 ili neki zagonetan heksadecimalni adresu. 97 00:03:57,110 --> 00:03:59,850 Mi smo samo stalo slikovno da je varijabla x je sad 98 00:03:59,850 --> 00:04:01,630 pokazujući na taj komad memorije. 99 00:04:01,630 --> 00:04:05,570 Dakle strelica predstavlja pokazivač, ili točnije, memorijsku adresu. 100 00:04:05,570 --> 00:04:09,120 Ali opet, mi obično ne briga ono što oni stvarni adrese su. 101 00:04:09,120 --> 00:04:11,780 Sada, ovaj redak govori ono što je u laik uvjete? 102 00:04:11,780 --> 00:04:14,330 Star x dobiva 42 zarezom. 103 00:04:14,330 --> 00:04:17,390 Što to znači? 104 00:04:17,390 --> 00:04:18,200 Želiš ići? 105 00:04:18,200 --> 00:04:20,102 Nemojte ispočetka vrat. 106 00:04:20,102 --> 00:04:22,360 >> PUBLIKA: Adresa X na 42. 107 00:04:22,360 --> 00:04:24,300 >> DAVID Malan: Adresa X na 42. 108 00:04:24,300 --> 00:04:25,190 Ne baš. 109 00:04:25,190 --> 00:04:28,485 Tako blizu, ali ne sasvim, jer je zvijezda koja je prefixing ovaj x. 110 00:04:28,485 --> 00:04:29,860 Dakle, moramo štipanje malo. 111 00:04:29,860 --> 00:04:31,032 Da? 112 00:04:31,032 --> 00:04:36,044 >> PUBLIKA: Vrijednost da pokazivač x ukazuje na je 42. 113 00:04:36,044 --> 00:04:36,710 DAVID Malan: U redu. 114 00:04:36,710 --> 00:04:40,840 Vrijednost da pokazivač x ukazujući na, recimo, bit će 42, 115 00:04:40,840 --> 00:04:44,165 ili staviti drugi način, zvijezdu X kaže, ići na bilo adresu 116 00:04:44,165 --> 00:04:48,340 je x, bilo da je 1 Oxford Ulica ili 33 Oxford Street 117 00:04:48,340 --> 00:04:51,850 ili ox1 ili ox33, što god da numerička adresa, 118 00:04:51,850 --> 00:04:54,380 Star je x dereferencing x. 119 00:04:54,380 --> 00:04:57,297 Dakle, ići na tu adresu i zatim staviti broj 42 tamo. 120 00:04:57,297 --> 00:04:59,380 Tako da bi bilo ekvivalent način govoreći da je. 121 00:04:59,380 --> 00:05:01,860 Tako da je sve u redu, a zatim bismo predstavljaju sliku 122 00:05:01,860 --> 00:05:05,370 kako slijedi kojoj smo dodali 42 na taj komad četiri 123 00:05:05,370 --> 00:05:09,370 bajtova na desnoj strani, ali Ova linija je gdje stvari ode naopako 124 00:05:09,370 --> 00:05:11,120 i Binky glava popped off u ovom trenutku, 125 00:05:11,120 --> 00:05:15,290 jer se loše stvari događaju kada što dereference vrijednosti smeća 126 00:05:15,290 --> 00:05:18,210 ili dereference nevažeći naputke, a ja kažem nevažeći 127 00:05:18,210 --> 00:05:21,020 jer u ovom trenutku u Priča, ono što je unutar y? 128 00:05:21,020 --> 00:05:24,440 Što je vrijednost y temelji na proteklih nekoliko koraka? 129 00:05:24,440 --> 00:05:25,360 Da? 130 00:05:25,360 --> 00:05:26,115 Što je to? 131 00:05:26,115 --> 00:05:26,990 >> PUBLIKA: adresu. 132 00:05:26,990 --> 00:05:28,460 DAVID Malan: adresu. 133 00:05:28,460 --> 00:05:31,910 To bi trebao biti adresa ali sam ga inicijalizirati? 134 00:05:31,910 --> 00:05:32,800 Dakle, imam još nisu. 135 00:05:32,800 --> 00:05:35,430 Dakle, što se zna da je tamo? 136 00:05:35,430 --> 00:05:37,590 To je samo neki smeća vrijednost. 137 00:05:37,590 --> 00:05:41,500 To bi mogao biti bilo adresa od nula do 2 milijarde ako imate dva nastupa RAM, 138 00:05:41,500 --> 00:05:44,289 ili nula do 4 milijarde, ako ste dobio četiri gigabajta RAM-a. 139 00:05:44,289 --> 00:05:46,080 To je neka smeća vrijednost, ali problem je 140 00:05:46,080 --> 00:05:48,200 koji operativni sustav, ako nije ti dao 141 00:05:48,200 --> 00:05:51,140 koji komad memorije posebno da ste pokušavate ići, 142 00:05:51,140 --> 00:05:54,650 općenito će izazvati što vidjeli smo kako je greške segmentacije. 143 00:05:54,650 --> 00:05:57,810 Dakle, u stvari, bilo tko od vas koji imaju borili na probleme u uredovno vrijeme 144 00:05:57,810 --> 00:06:00,393 ili problemima koje je više obično s pokušavate odgonetnuti 145 00:06:00,393 --> 00:06:02,150 segmentiranja kvar, to obično znači 146 00:06:02,150 --> 00:06:05,017 ti dira segment memorije da ne bi trebalo biti. 147 00:06:05,017 --> 00:06:07,350 Vi dira sjećanje koje operativni sustav nema 148 00:06:07,350 --> 00:06:10,450 dopustio da dotakne, da li je tako ide predaleko u svom nizu 149 00:06:10,450 --> 00:06:12,870 ili početkom sad, je li to je zato jer ste dira 150 00:06:12,870 --> 00:06:14,780 memorije da je samo neka smeće vrijednost. 151 00:06:14,780 --> 00:06:18,230 >> Dakle, radi zvijezda x ovdje vrsta nedefiniranog ponašanja. 152 00:06:18,230 --> 00:06:22,030 Vi nikada ne bi trebao to učiniti, jer izgledi su, program samo će srušiti, 153 00:06:22,030 --> 00:06:24,050 zato što govoriš, idite na ovu adresu 154 00:06:24,050 --> 00:06:27,000 a vi nemate pojma gdje to je zapravo adresa. 155 00:06:27,000 --> 00:06:30,300 Pa operativni sustav je vjerojatno će se srušiti vaš program 156 00:06:30,300 --> 00:06:33,840 kao rezultat i doista, to je što se dogodilo tamo Binky. 157 00:06:33,840 --> 00:06:37,210 Dakle u konačnici, Binky fiksna ovaj problem s tim. 158 00:06:37,210 --> 00:06:38,909 Dakle, taj program sam po sebi je manjkav. 159 00:06:38,909 --> 00:06:41,450 Ali ako vrsta kretati i izvršiti tu liniju, umjesto, 160 00:06:41,450 --> 00:06:45,580 y jednako x samo znači ono adresa je x, također ga staviti u y. 161 00:06:45,580 --> 00:06:48,740 >> I tako slikovito, mi smo zastupljena s dvije strelice 162 00:06:48,740 --> 00:06:51,570 od X i od y usmjerenim na istom mjestu. 163 00:06:51,570 --> 00:06:55,760 Dakle semantički, x je jednaka y jer obje onih 164 00:06:55,760 --> 00:07:00,300 pohranjujete isti adresa, ergo pokazujući na 42, 165 00:07:00,300 --> 00:07:04,910 i sad, kad kažeš zvijezda y, idite na adresu u y, 166 00:07:04,910 --> 00:07:06,790 to ima zanimljivu nuspojavu. 167 00:07:06,790 --> 00:07:10,320 Dakle adresa y je Ista stvar kao adresu u x. 168 00:07:10,320 --> 00:07:15,060 Dakle, ako ti kažeš ići na adresu u y i promijenite vrijednost na 13, 169 00:07:15,060 --> 00:07:17,140 tko još je pod utjecajem? 170 00:07:17,140 --> 00:07:21,100 X, točka D, da tako kažemo, treba utjecati, kao dobro. 171 00:07:21,100 --> 00:07:24,340 >> I doista, kako je Nick nacrtao ovu sliku u claymation je upravo to. 172 00:07:24,340 --> 00:07:28,665 Iako pratimo pokazivač y, završili smo na istom mjestu, 173 00:07:28,665 --> 00:07:32,780 pa ako smo bili za ispis iz X ili Y je pointee, 174 00:07:32,780 --> 00:07:35,720 onda bismo vidjeli vrijednost 13. 175 00:07:35,720 --> 00:07:37,927 Sada, ja kažem pointee se u skladu sa slikom. 176 00:07:37,927 --> 00:07:39,760 Programeri, na moje znanje, zapravo nikada 177 00:07:39,760 --> 00:07:42,460 reci pointee, ono što je šiljasta 178 00:07:42,460 --> 00:07:44,650 , ali zbog dosljednosti s video, shvatiti 179 00:07:44,650 --> 00:07:47,520 to je sve što je bilo znači u toj situaciji. 180 00:07:47,520 --> 00:07:54,190 Dakle bilo kakvih pitanja o claymation ili naputke ili malloc samo još? 181 00:07:54,190 --> 00:07:54,850 Ne? 182 00:07:54,850 --> 00:07:55,470 U redu. 183 00:07:55,470 --> 00:07:58,560 >> Dakle, bez daljnjeg ado, neka je pogledati 184 00:07:58,560 --> 00:08:00,700 u kojoj to ima zapravo je korišten za neko vrijeme. 185 00:08:00,700 --> 00:08:03,580 Tako smo imali ovu CS50 knjižnici koji je dobio sve te funkcije. 186 00:08:03,580 --> 00:08:06,810 Koristili smo GetInt puno, GetString, Vjerojatno GetLongLong ranije 187 00:08:06,810 --> 00:08:09,840 u mom PSet jedan ili tako, ali Što se zapravo događa? 188 00:08:09,840 --> 00:08:12,920 Pa, neka je uzme brzi pogled ispod haube na program koji 189 00:08:12,920 --> 00:08:17,017 nadahnjuje zašto smo Vam dati CS50 knjižnica, i doista od prošlog tjedna, 190 00:08:17,017 --> 00:08:18,850 počeli smo uzimati one Trening kotači off. 191 00:08:18,850 --> 00:08:21,080 Dakle, to je sada razvrstani o nakon smrti onoga 192 00:08:21,080 --> 00:08:23,690 traje unutar CS50 knjižnici, 193 00:08:23,690 --> 00:08:27,250 iako smo sada će početi kreće daleko od toga za većinu programa. 194 00:08:27,250 --> 00:08:29,460 >> Dakle, ovo je program pod nazivom scanf 0. 195 00:08:29,460 --> 00:08:30,510 To je super kratka. 196 00:08:30,510 --> 00:08:33,909 To je upravo ove retke, ali to uvodi funkcija zove scanf 197 00:08:33,909 --> 00:08:36,909 da smo zapravo ćete vidjeti trenutak unutar CS50 knjižnici, 198 00:08:36,909 --> 00:08:38,600 iako u nešto drugačijem obliku. 199 00:08:38,600 --> 00:08:41,330 Dakle, ovaj program na liniji 16 je proglašenje varijablu x. 200 00:08:41,330 --> 00:08:43,150 Pa daj mi četiri bajta za int. 201 00:08:43,150 --> 00:08:45,750 To je bio govorio korisnika, Broj molimo, a potom 202 00:08:45,750 --> 00:08:49,010 ovo je zanimljiv linija koja zapravo veže zajedno prošli tjedan 203 00:08:49,010 --> 00:08:49,790 i to. 204 00:08:49,790 --> 00:08:53,230 Scanf, a zatim primijetite da traje Format string, baš kao printf, 205 00:08:53,230 --> 00:08:57,480 % i znači int, a onda to traje Drugi argument koji izgleda malo 206 00:08:57,480 --> 00:08:58,260 funky. 207 00:08:58,260 --> 00:09:01,880 To je znak za struju x, i podsjetiti, smo vidjeli samo ovaj put prošli tjedan. 208 00:09:01,880 --> 00:09:03,465 Što znak za struju x predstavlja? 209 00:09:03,465 --> 00:09:06,210 210 00:09:06,210 --> 00:09:08,450 Što učiniti u znak za struju C? 211 00:09:08,450 --> 00:09:08,950 Da? 212 00:09:08,950 --> 00:09:10,024 >> PUBLIKA: Adresu. 213 00:09:10,024 --> 00:09:11,190 DAVID Malan: Adresu. 214 00:09:11,190 --> 00:09:13,190 Dakle, to je suprotno operatora zvjezdice, 215 00:09:13,190 --> 00:09:17,270 dok je operator zvijezda kaže, idite na ova adresa, znakom operater 216 00:09:17,270 --> 00:09:20,280 kaže, shvatiti adresu te varijable, 217 00:09:20,280 --> 00:09:23,530 pa to je ključ, jer scanf je svrha u životu 218 00:09:23,530 --> 00:09:26,320 je skenirati korisnik je unos s tipkovnice, 219 00:09:26,320 --> 00:09:29,970 ovisno o tome što on ili ona vrste, a zatim pročitao da je ulaz korisnika 220 00:09:29,970 --> 00:09:32,970 u varijablu, ali mi Vidio je u protekla dva tjedna 221 00:09:32,970 --> 00:09:36,080 da je zamjena funkcija koje smo Pokušao napora za provedbu 222 00:09:36,080 --> 00:09:37,110 Samo slomljen. 223 00:09:37,110 --> 00:09:42,470 Sjetite se da s funkcijom swapu, ako mi samo proglasio A i B, kao Ints, 224 00:09:42,470 --> 00:09:47,040 uspješno je swap dvije varijable unutar swapa 225 00:09:47,040 --> 00:09:50,080 baš kao i sa mlijekom i SL, ali čim se vratio zamjena, 226 00:09:50,080 --> 00:09:55,200 što je bio rezultat s obzirom za x i y, izvorne vrijednosti? 227 00:09:55,200 --> 00:09:55,700 Ništa. 228 00:09:55,700 --> 00:09:56,200 Da. 229 00:09:56,200 --> 00:09:59,754 Ništa se nije dogodilo da je vrijeme, jer je swaps promijeniti samo svoje lokalne kopije, 230 00:09:59,754 --> 00:10:01,670 što će reći, sve ovaj put, kad god imamo 231 00:10:01,670 --> 00:10:04,010 prolazio je u argumentima funkcijama, mi smo 232 00:10:04,010 --> 00:10:05,939 samo u prolazu kopije tih argumenata. 233 00:10:05,939 --> 00:10:07,980 To možete učiniti s tim što god želite s njima, 234 00:10:07,980 --> 00:10:10,890 ali oni će imati nikakav utjecati na izvorne vrijednosti. 235 00:10:10,890 --> 00:10:13,650 Dakle, to je problematično, ako vas Želite imati funkciju kao scanf 236 00:10:13,650 --> 00:10:17,170 u životu, čija je svrha za skeniranje korisnikov unos s tipkovnice 237 00:10:17,170 --> 00:10:22,010 a zatim popuniti praznine, tako da se govore, odnosno, dati varijablu poput x 238 00:10:22,010 --> 00:10:25,410 vrijednost, jer ako sam ja samo proći X za scanf, 239 00:10:25,410 --> 00:10:28,790 ako uzmete u obzir logiku posljednji tjedna, scanf može raditi što god želi 240 00:10:28,790 --> 00:10:33,100 s kopijom x, ali to ne može trajno promijeniti x osim dajemo 241 00:10:33,100 --> 00:10:37,120 scanf karta blaga, da se tako izrazim, gdje je X označava mjesto, pri čemu 242 00:10:37,120 --> 00:10:41,860 prolazimo adresu x tako da scanf može ići tamo i zapravo promjene 243 00:10:41,860 --> 00:10:42,920 vrijednost x. 244 00:10:42,920 --> 00:10:45,080 I tako doista, sve da je ovaj program radi 245 00:10:45,080 --> 00:10:53,180 ako bi scanf 0, u mom izvoru 5m katalog, provjerite scanf 0, 246 00:10:53,180 --> 00:10:57,730 dot slash scanf, broj molim 50, hvala na 50. 247 00:10:57,730 --> 00:11:01,020 >> Dakle, to nije sve što je zanimljivo, ali ono što doista događa 248 00:11:01,020 --> 00:11:04,820 je da čim sam nazvao scanf ovdje, vrijednost x 249 00:11:04,820 --> 00:11:06,410 se stalno mijenjaju. 250 00:11:06,410 --> 00:11:08,335 Sada, ovo izgleda lijepo i dobro, i zapravo, to 251 00:11:08,335 --> 00:11:11,200 Čini se kao da stvarno ne treba CS50 knjižnica na sve više. 252 00:11:11,200 --> 00:11:13,960 Na primjer, neka je trčanje ovo još jednom ovdje. 253 00:11:13,960 --> 00:11:15,750 Dopustite mi da ga ponovno na sekundu. 254 00:11:15,750 --> 00:11:20,600 Pokušajmo broj molimo te umjesto da kaže 50 kao i prije, 255 00:11:20,600 --> 00:11:22,810 neka je samo reći ne. 256 00:11:22,810 --> 00:11:24,000 U redu, to je malo čudno. 257 00:11:24,000 --> 00:11:25,270 U REDU. 258 00:11:25,270 --> 00:11:28,680 I samo su neke gluposti ovdje. 259 00:11:28,680 --> 00:11:31,170 Dakle, to ne čini da nositi pogrešnih situacije. 260 00:11:31,170 --> 00:11:33,620 Dakle, trebamo minimalno početak dodao neke pogreške pravopisa 261 00:11:33,620 --> 00:11:37,460 kako bi bili sigurni da korisnik ima upisali u stvarnog broja kao i 50, 262 00:11:37,460 --> 00:11:40,720 jer očito upisivanjem riječi nije otkrivena kao problematično, 263 00:11:40,720 --> 00:11:42,020 ali vjerojatno bi trebao biti. 264 00:11:42,020 --> 00:11:46,450 >> Pogledajmo ovu verziju sada je to moj pokušaj da reimplement GetString. 265 00:11:46,450 --> 00:11:48,437 Ako scanf ima sve to funkcionalnost sagrađena, 266 00:11:48,437 --> 00:11:51,270 Zato smo bili brbljanje s njima Trening kotači poput GetString? 267 00:11:51,270 --> 00:11:55,450 Pa, ovdje je možda moja jednostavna verzija GetString 268 00:11:55,450 --> 00:12:00,766 gdje je prije tjedan dana, možda sam rekao, dajte mi string i nazvati ga tampon. 269 00:12:00,766 --> 00:12:03,390 Danas ću početi jednostavno rekavši char zvijezdu, koja je, opoziv, 270 00:12:03,390 --> 00:12:04,400 to je samo sinonimi. 271 00:12:04,400 --> 00:12:06,629 Izgleda strasnije, ali to je točno istu stvar. 272 00:12:06,629 --> 00:12:09,420 Pa daj mi varijablu naziva tampon koje će pohraniti string, 273 00:12:09,420 --> 00:12:12,780 reći korisnički string molimo, a onda, baš kao i prije, 274 00:12:12,780 --> 00:12:17,760 pokušajmo posuditi ovu lekciju scanf % s ovog puta, a zatim prođe u puferu. 275 00:12:17,760 --> 00:12:19,310 Sada, brza provjera razum. 276 00:12:19,310 --> 00:12:22,120 Zašto se ne govori znak za struju tampon ovaj put? 277 00:12:22,120 --> 00:12:25,190 278 00:12:25,190 --> 00:12:26,625 Zaključiti iz prethodnog primjera. 279 00:12:26,625 --> 00:12:28,000 PUBLIKA: Char zvijezda je pokazivač. 280 00:12:28,000 --> 00:12:29,920 DAVID Malan: Točno, jer ovaj put, char 281 00:12:29,920 --> 00:12:34,080 Star je već pokazivač, adresa, po definiciji tog zvijezde biti tamo. 282 00:12:34,080 --> 00:12:37,530 A ako scanf očekuje adresu, dovoljno je samo da prođe u puferu. 283 00:12:37,530 --> 00:12:39,260 Ne trebam reći ampersand tampon. 284 00:12:39,260 --> 00:12:42,177 Za radoznale, što bi učiniti nešto ovako. 285 00:12:42,177 --> 00:12:43,510 Bilo bi drugačije značenje. 286 00:12:43,510 --> 00:12:47,240 To će vam dati pokazivač na pokazivač, koji je zapravo 287 00:12:47,240 --> 00:12:50,050 valjana stvar u C, ali za Sada, neka je i dalje ostane jednostavan 288 00:12:50,050 --> 00:12:51,750 i zadržati priču dosljedna. 289 00:12:51,750 --> 00:12:54,100 Samo ću proći u buffer i to je točno. 290 00:12:54,100 --> 00:12:56,487 Problem je ipak to. 291 00:12:56,487 --> 00:12:58,820 Dopustite mi ići naprijed i pokrenuti ovaj Program nakon što ga sastavljanju. 292 00:12:58,820 --> 00:13:00,902 Napravite scanf 1. 293 00:13:00,902 --> 00:13:02,610 Kvragu, moj prevodilac je uhvatiti moju pogrešku. 294 00:13:02,610 --> 00:13:04,090 Daj mi jednu sekundu. 295 00:13:04,090 --> 00:13:05,460 Jeka. 296 00:13:05,460 --> 00:13:06,990 Recimo scanf-1.c. 297 00:13:06,990 --> 00:13:10,880 298 00:13:10,880 --> 00:13:11,380 U REDU. 299 00:13:11,380 --> 00:13:12,720 Idemo tamo. 300 00:13:12,720 --> 00:13:14,280 Ja ga treba. 301 00:13:14,280 --> 00:13:16,750 CS50 ID ima razne postavke konfiguracije 302 00:13:16,750 --> 00:13:18,280 koja vas štiti od sebe. 303 00:13:18,280 --> 00:13:21,300 Morao sam onemogućiti one strane trčanje zveket ručno ovaj put. 304 00:13:21,300 --> 00:13:22,140 Dakle niz molim. 305 00:13:22,140 --> 00:13:25,560 Ja ću ići naprijed i upišite u mom omiljenom Hello World. 306 00:13:25,560 --> 00:13:26,490 OK, null. 307 00:13:26,490 --> 00:13:27,700 To nije ono što sam upisali. 308 00:13:27,700 --> 00:13:29,690 Dakle, to je indikativno nešto što nije u redu. 309 00:13:29,690 --> 00:13:33,920 Dopustite mi ići naprijed i upišite u jako dugom nizu. 310 00:13:33,920 --> 00:13:37,210 Hvala na null, a ja ne znam ako ću biti u mogućnosti da ga srušiti. 311 00:13:37,210 --> 00:13:40,240 Pokušajmo malo kopiju paste i vidjeti ako to pomaže. 312 00:13:40,240 --> 00:13:43,290 Samo zalijepite mnogo toga. 313 00:13:43,290 --> 00:13:47,310 To je svakako veći string nego obično. 314 00:13:47,310 --> 00:13:51,450 Ajmo stvarno napisati. 315 00:13:51,450 --> 00:13:51,950 Ne. 316 00:13:51,950 --> 00:13:52,650 Prokletstvo. 317 00:13:52,650 --> 00:13:53,480 Naredi nije pronađen. 318 00:13:53,480 --> 00:13:54,550 Dakle, to je nevezano. 319 00:13:54,550 --> 00:13:56,440 To je zato što sam zalijepiti neke loše likove, 320 00:13:56,440 --> 00:13:59,780 ali to ispada ne ide na posao. 321 00:13:59,780 --> 00:14:03,510 >> Pokušajmo to još jednom, jer to je zabavnije, ako smo zapravo srušiti ga. 322 00:14:03,510 --> 00:14:09,116 Idemo ovaj tip, a sada sam će kopirati jako dugi niz 323 00:14:09,116 --> 00:14:10,990 a sad ćemo vidjeti ako mi mogu srušiti ovu stvar. 324 00:14:10,990 --> 00:14:14,235 Obavijest izostavljen sam prostore i nove linije i zarezom 325 00:14:14,235 --> 00:14:16,035 i sve funky znakova. 326 00:14:16,035 --> 00:14:16,535 Unesite. 327 00:14:16,535 --> 00:14:21,090 328 00:14:21,090 --> 00:14:22,880 A sada je mreža je samo biti spor. 329 00:14:22,880 --> 00:14:27,460 Držao sam dolje Command-V predugo, jasno. 330 00:14:27,460 --> 00:14:28,190 Prokletstvo! 331 00:14:28,190 --> 00:14:29,260 Naredi nije pronađen. 332 00:14:29,260 --> 00:14:29,780 >> U REDU. 333 00:14:29,780 --> 00:14:32,240 Pa, poanta je ipak sljedeće. 334 00:14:32,240 --> 00:14:36,910 Dakle, ono što se zapravo događa o ovoj izjavi 335 00:14:36,910 --> 00:14:39,240 Čar tampon zvjezdica na liniji 16? 336 00:14:39,240 --> 00:14:41,820 Dakle, ono što sam ja sve kad sam proglasiti pokazivač? 337 00:14:41,820 --> 00:14:47,440 Sve sam uzimajući je četiri bajta vrijednost zove tampon, ali ono što je unutar nje 338 00:14:47,440 --> 00:14:49,540 Trenutno? 339 00:14:49,540 --> 00:14:50,930 To je samo neki smeća vrijednost. 340 00:14:50,930 --> 00:14:54,170 Jer bilo kojem trenutku deklarirati varijablu u C, to je samo neki smeća vrijednost, 341 00:14:54,170 --> 00:14:56,220 a mi smo počeli zapeti ove stvarnosti. 342 00:14:56,220 --> 00:14:59,720 Sada, kada sam rekao scanf, idite na ovu adresu 343 00:14:59,720 --> 00:15:01,520 i staviti bez obzira na vrstu korisnika u. 344 00:15:01,520 --> 00:15:06,400 Ako korisnik upiše u pozdravi svijet, dobro, gdje sam ga stavio? 345 00:15:06,400 --> 00:15:07,750 Buffer je vrijednost smeća. 346 00:15:07,750 --> 00:15:11,510 >> Dakle, to je vrsta poput strijele što se pokazuje tko zna gdje. 347 00:15:11,510 --> 00:15:13,880 Možda to ukazuje upravo ovdje u mom sjećanju. 348 00:15:13,880 --> 00:15:16,560 I tako kada korisnik vrste u svijetu, zdravo 349 00:15:16,560 --> 00:15:22,380 program pokušava staviti string Hello World backslash 0 350 00:15:22,380 --> 00:15:23,910 u tom komad memorije. 351 00:15:23,910 --> 00:15:27,070 No, s velikom vjerojatnošću, ali očito nije 100% vjerojatnosti, 352 00:15:27,070 --> 00:15:30,440 računalo će tada srušiti program, jer to nije 353 00:15:30,440 --> 00:15:32,490 memorija mi treba dopustiti da dodir. 354 00:15:32,490 --> 00:15:36,330 Dakle ukratko, ovaj program je manjkav za točno tog razloga. 355 00:15:36,330 --> 00:15:38,070 Ja sam u osnovi ne radi ono? 356 00:15:38,070 --> 00:15:42,366 Koje korake izostavili sam, baš kao i smo izostavili s Binky je prvi primjer? 357 00:15:42,366 --> 00:15:42,866 Da? 358 00:15:42,866 --> 00:15:43,710 >> PUBLIKA: dodjela memorije? 359 00:15:43,710 --> 00:15:45,001 >> DAVID Malan: dodjela memorije. 360 00:15:45,001 --> 00:15:48,400 Nisam zapravo dodijeljeno bilo memorija za taj niz. 361 00:15:48,400 --> 00:15:50,270 Tako možemo popraviti u nekoliko načina. 362 00:15:50,270 --> 00:15:52,700 Jedan, možemo ga zadržati jednostavan i zapravo, sada si 363 00:15:52,700 --> 00:15:55,116 će početi da biste vidjeli zamućenje linija između onoga što 364 00:15:55,116 --> 00:15:58,520 niz je, što je string, što char zvijezda je, što se niz znakova 365 00:15:58,520 --> 00:15:59,020 je. 366 00:15:59,020 --> 00:16:02,450 Evo Drugi primjer uključuje žice i obavijesti 367 00:16:02,450 --> 00:16:05,690 Sve što sam učinio na liniji 16 je, umjesto da kaže 368 00:16:05,690 --> 00:16:09,530 da tampon će biti char zvijezda, pointer na komad memorije, 369 00:16:09,530 --> 00:16:14,057 Idem vrlo proaktivno dati ja tampon 16 znakova, 370 00:16:14,057 --> 00:16:16,390 i zapravo, ako ste upoznati s pojmom međuspremnika, 371 00:16:16,390 --> 00:16:20,570 Vjerojatno iz svijeta video, gdje je video je pufersko, puferski, 372 00:16:20,570 --> 00:16:21,175 puferski. 373 00:16:21,175 --> 00:16:22,550 Pa, što je veza ovdje? 374 00:16:22,550 --> 00:16:24,960 Pa, Unutar YouTube i unutar video player 375 00:16:24,960 --> 00:16:27,200 općenito je niz koji je veći od 16. 376 00:16:27,200 --> 00:16:30,340 To bi moglo biti niz veličine jedne megabajt, možda 10 megabajta, 377 00:16:30,340 --> 00:16:34,330 i na taj niz ne preglednik preuzeti hrpu bajtova, 378 00:16:34,330 --> 00:16:37,500 cijela hrpa megabajta video i video player, 379 00:16:37,500 --> 00:16:40,930 YouTube je ili tko je, počinje čitajući bajtova iz tog niza, 380 00:16:40,930 --> 00:16:43,530 i svaki put kad vidi Riječ puferski, puferski, 381 00:16:43,530 --> 00:16:46,350 to znači da igrač mora dobivši na kraju tog polja. 382 00:16:46,350 --> 00:16:50,430 Mreža je tako sporo da je ne puniti u polje s više bajtova 383 00:16:50,430 --> 00:16:55,610 pa ti si iz bitova prikazati korisniku. 384 00:16:55,610 --> 00:16:59,430 >> Dakle tampon je sposoban pojam ovdje da to je samo niz, komad memorije. 385 00:16:59,430 --> 00:17:02,530 A to će se popraviti jer ispada 386 00:17:02,530 --> 00:17:07,410 koje možete liječiti polja kao da je oni su adrese, iako tampon 387 00:17:07,410 --> 00:17:10,710 je samo simbol, to je slijed znakova, pufer, 388 00:17:10,710 --> 00:17:14,760 to je korisno za mene, programer, možete proći svoje ime oko 389 00:17:14,760 --> 00:17:17,079 kao da je to bila pokazivač, kao da je to 390 00:17:17,079 --> 00:17:21,000 bili adresu komad memorije za 16 znakova. 391 00:17:21,000 --> 00:17:24,530 Dakle, to je za reći, ja mogu proći scanf upravo ta riječ 392 00:17:24,530 --> 00:17:30,670 pa sad, ako sam napraviti ovaj program, bi scanf 2, točka Slash scanf 2, 393 00:17:30,670 --> 00:17:35,386 i upisati Hello World, Unesite, da time-- 394 00:17:35,386 --> 00:17:37,590 >> Hmm, što se dogodilo? 395 00:17:37,590 --> 00:17:39,340 Gudački molim. 396 00:17:39,340 --> 00:17:41,430 Što sam učinio krivo? 397 00:17:41,430 --> 00:17:43,800 Pozdrav svijetu, tampon. 398 00:17:43,800 --> 00:17:44,705 Bok svijete. 399 00:17:44,705 --> 00:17:48,201 400 00:17:48,201 --> 00:17:49,420 Ah, ja znam što radi. 401 00:17:49,420 --> 00:17:49,920 U REDU. 402 00:17:49,920 --> 00:17:51,628 Dakle, to je čitanje gore do prvog mjesta. 403 00:17:51,628 --> 00:17:55,680 Tako ćemo varaju samo na trenutak i Samo sam htio reći da upišete nešto 404 00:17:55,680 --> 00:18:01,408 stvarno dugo kao što je to duga kazna To je jedan, dva, tri, četiri, pet, 405 00:18:01,408 --> 00:18:04,420 šest, sedam, osam, devet, 10, 11, 12, 13, 14, 15, 16. 406 00:18:04,420 --> 00:18:05,300 U REDU. 407 00:18:05,300 --> 00:18:07,600 To je doista duga rečenica. 408 00:18:07,600 --> 00:18:10,710 Dakle, ova rečenica je dulje od 16 znakova 409 00:18:10,710 --> 00:18:13,670 pa kad sam pritisnite Enter, što će se dogoditi? 410 00:18:13,670 --> 00:18:16,940 Pa, u ovom slučaju od Priča, sam proglasio tampon 411 00:18:16,940 --> 00:18:22,190 zapravo se niz sa 16 znakova spremni otići. 412 00:18:22,190 --> 00:18:27,426 Dakle, jedan, dva, tri, četiri, pet, šest, sedam, osam, devet, 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 Tako 16 znakova, a sada, kada sam pročitati u nešto kao što je to dug 415 00:18:34,410 --> 00:18:43,950 rečenica, što će se dogoditi je da ću čitati ovo je dugo 416 00:18:43,950 --> 00:18:49,660 S-E-N-T-E-C-N-E, rečenica. 417 00:18:49,660 --> 00:18:52,270 >> Dakle, ovo je namjerno loša stvar koju sam 418 00:18:52,270 --> 00:18:55,060 držati pisanja s onu stranu Granice moje polje, 419 00:18:55,060 --> 00:18:56,660 izvan granica moje pufera. 420 00:18:56,660 --> 00:19:00,100 Sam mogao dobiti sretan i program će se zadržati na trčanje, a ne briga, 421 00:19:00,100 --> 00:19:03,450 ali općenito govoreći, to će doista srušiti moj program, 422 00:19:03,450 --> 00:19:06,440 i to je bug u mom kodirajte trenutak sam korak 423 00:19:06,440 --> 00:19:08,576 izvan granica tog polja, jer sam 424 00:19:08,576 --> 00:19:10,450 Ne znam je li to nužno će se srušiti 425 00:19:10,450 --> 00:19:12,120 ili ako ja samo ću dobiti sretan. 426 00:19:12,120 --> 00:19:15,750 Dakle, to je problematično, jer u ovaj slučaj, čini se da rade 427 00:19:15,750 --> 00:19:20,931 i neka je iskušati sudbinu ovdje, iako IDE čini tolerirati vrlo malo 428 00:19:20,931 --> 00:19:21,430 of-- 429 00:19:21,430 --> 00:19:22,040 >> Idemo tamo. 430 00:19:22,040 --> 00:19:23,240 Konačno. 431 00:19:23,240 --> 00:19:26,470 Dakle, ja sam jedini koji može vidjeti. 432 00:19:26,470 --> 00:19:29,630 Dakle, samo sam imala puno zabave tipkanja iz jako dugo stvarne frazu 433 00:19:29,630 --> 00:19:32,800 da je sigurno veći 16 bajtova, jer sam 434 00:19:32,800 --> 00:19:38,050 upisali u ovom ludom dugo višelinijski izraz, a zatim primijetite što se dogodilo. 435 00:19:38,050 --> 00:19:41,110 Program je pokušao tiskanje a onda je dobio grešku segmentiranja 436 00:19:41,110 --> 00:19:44,430 i segmentacija greške kada nešto slično se to dogodi 437 00:19:44,430 --> 00:19:47,650 a operativni sustav, kaže ne, ne može dirati tu memoriju. 438 00:19:47,650 --> 00:19:49,570 Idemo ubiti program uopce. 439 00:19:49,570 --> 00:19:51,180 >> Dakle, to se čini problematično. 440 00:19:51,180 --> 00:19:54,540 Ja sam poboljšao program kojim barem imaju neke memorije, 441 00:19:54,540 --> 00:19:58,000 ali to bi čini se ograničiti funkcija GetString za dobivanje 442 00:19:58,000 --> 00:20:00,780 nizovi nekog konačnih duljine 16. 443 00:20:00,780 --> 00:20:04,200 Dakle, ako želite podržati više rečenice od 16 znakova, 444 00:20:04,200 --> 00:20:04,880 što radiš? 445 00:20:04,880 --> 00:20:07,970 Pa, možete povećati Veličina ove tampon do 32 446 00:20:07,970 --> 00:20:09,190 ili se to čini nekako kratko. 447 00:20:09,190 --> 00:20:12,260 Zašto ne možemo jednostavno napraviti je 1000, ali gurati natrag. 448 00:20:12,260 --> 00:20:17,100 Što je odgovor intuitivno od Upravo izbjegavanje ovaj problem tako što 449 00:20:17,100 --> 00:20:20,660 moj tampon veći, kao što je 1000 znakova? 450 00:20:20,660 --> 00:20:23,470 Uvođenjem GetString na ovaj način. 451 00:20:23,470 --> 00:20:27,130 Što je dobro ili loše ovdje? 452 00:20:27,130 --> 00:20:28,033 Da? 453 00:20:28,033 --> 00:20:30,574 PUBLIKA: Ako vežu se puno prostora i ne ga koristiti, 454 00:20:30,574 --> 00:20:33,500 onda ne možete preraspodijeliti taj prostor. 455 00:20:33,500 --> 00:20:34,500 DAVID Malan: Apsolutno. 456 00:20:34,500 --> 00:20:38,480 To je razoran ukoliko ako ne zapravo treba 900 onih bajtova 457 00:20:38,480 --> 00:20:41,057 a ti tražiš 1.000 ukupno svejedno, 458 00:20:41,057 --> 00:20:44,140 ti si jednostavno konzumiranje više memorije na korisnikovo računalo nego što je potrebno, 459 00:20:44,140 --> 00:20:45,740 i nakon svega, neke od već ste naišli 460 00:20:45,740 --> 00:20:47,620 u životu kad ste radi puno programa 461 00:20:47,620 --> 00:20:50,470 i oni jede puno memorije, to zapravo može utjecati na performanse 462 00:20:50,470 --> 00:20:52,220 i korisnički doživljaj na kompjuteru. 463 00:20:52,220 --> 00:20:56,090 Dakle, to je vrsta lijen rješenje, sigurno, i obratno, 464 00:20:56,090 --> 00:21:00,140 to ne samo rastrošna, ono što je problem i dalje, čak i ako sam izraditi moj tampon 465 00:21:00,140 --> 00:21:02,100 1.000? 466 00:21:02,100 --> 00:21:02,600 Da? 467 00:21:02,600 --> 00:21:04,475 >> PUBLIKA: Niz je duljina 1.001. 468 00:21:04,475 --> 00:21:05,350 DAVID Malan: Točno. 469 00:21:05,350 --> 00:21:08,280 Ako vaš string duljine 1.001, imate isti problem, 470 00:21:08,280 --> 00:21:10,705 i moj argument, ja bih Samo onda bi 2000, 471 00:21:10,705 --> 00:21:12,830 ali ne znate u unaprijed koliko velika treba biti, 472 00:21:12,830 --> 00:21:16,890 a ipak, ja moram sastaviti moj program prije nego ostavljajući ljudi koriste i preuzimanje 473 00:21:16,890 --> 00:21:17,390 to. 474 00:21:17,390 --> 00:21:21,490 Dakle, to je točno vrsta stvari koje su CS50 knjižnica pokušava 475 00:21:21,490 --> 00:21:24,750 da nam pomogne, a mi ćemo samo ukratko na neke od provedbe temeljne 476 00:21:24,750 --> 00:21:29,790 Ovdje, ali ovo je točka CS50 C. Ovaj je datoteka koja je bila na CS50 IDE 477 00:21:29,790 --> 00:21:31,420 Svi ovi tjedni koji ste koristili. 478 00:21:31,420 --> 00:21:34,280 To je unaprijed sastavljen i da ste bio koristeći automatski 479 00:21:34,280 --> 00:21:38,780 po prirodi koji ima crtica L CS50 zastavu s zveket, 480 00:21:38,780 --> 00:21:42,300 ali ako sam se pomaknite prema dolje kroz sve ove funkcije, evo GetString, 481 00:21:42,300 --> 00:21:44,636 i samo da vam dati djelić onoga što se događa, 482 00:21:44,636 --> 00:21:46,760 neka je uzme brzi pogled na relativna složenost. 483 00:21:46,760 --> 00:21:48,870 To nije super dugo funkcija, ali nismo 484 00:21:48,870 --> 00:21:52,530 moramo razmišljati sve teško o kako ići oko dobivanja žice. 485 00:21:52,530 --> 00:21:55,660 >> Dakle ovdje je moj tampon i ja očito ga inicijalizirati na nulu. 486 00:21:55,660 --> 00:21:57,990 To, naravno, je Ista stvar kao char zvijezda, 487 00:21:57,990 --> 00:22:00,585 ali sam odlučio u provedbu CS50 knjižnici 488 00:22:00,585 --> 00:22:02,460 da, ako ćemo biti potpuno dinamičan, 489 00:22:02,460 --> 00:22:05,770 Ne znam unaprijed koliko je velika string korisnici htjeti doći. 490 00:22:05,770 --> 00:22:08,140 Zato ću početi sa samo prazan string 491 00:22:08,140 --> 00:22:11,507 a ja ću izgraditi koliko memorije kako moram stati korisnički string 492 00:22:11,507 --> 00:22:13,340 a ako nemam dosta, idem pitati 493 00:22:13,340 --> 00:22:15,010 operativni sustav za više memorije. 494 00:22:15,010 --> 00:22:17,510 Idem da se presele svoje string u veći komad memorije 495 00:22:17,510 --> 00:22:21,847 i ja ću objaviti ili besplatno nedovoljno veliki komad memorije 496 00:22:21,847 --> 00:22:23,680 i samo ćemo to učiniti iterativno. 497 00:22:23,680 --> 00:22:25,570 >> Tako brz pogled, Ovdje je samo varijabla 498 00:22:25,570 --> 00:22:28,780 s kojima ću pratiti kapaciteta moje tampon. 499 00:22:28,780 --> 00:22:30,071 Koliko bajtova mogu stati? 500 00:22:30,071 --> 00:22:32,070 Evo varijabla n s koje ću zadržati 501 00:22:32,070 --> 00:22:36,200 Staza koliko bajtova su zapravo u tampon ili da je korisnik upisali. 502 00:22:36,200 --> 00:22:39,900 Ako nisam vidio ovo prije, vas može odrediti da varijabla poput int 503 00:22:39,900 --> 00:22:46,370 je nepotpisan, koji kao što ime sugerira, znači da je ne-negativni, i zašto bi 504 00:22:46,370 --> 00:22:50,590 Sam ikada htio gnjaviti navodeći da int nije samo int, 505 00:22:50,590 --> 00:22:52,540 ali to je tipa unsigned int? 506 00:22:52,540 --> 00:22:55,064 To je ne-negativni int. 507 00:22:55,064 --> 00:22:56,355 Što [nečujan] znači? 508 00:22:56,355 --> 00:22:58,910 >> PUBLIKA: To opisuje iznos memorije koja može biti [nečujan]. 509 00:22:58,910 --> 00:22:59,660 >> DAVID Malan: Da. 510 00:22:59,660 --> 00:23:03,710 Dakle, ako ja kažem ružan, to je zapravo dajući vam jedan malo extra memorije 511 00:23:03,710 --> 00:23:07,440 a čini vrsta glup, ali ako vas imaju jedan malo dodatne memorije, da 512 00:23:07,440 --> 00:23:09,940 znači da imate dvostruko više Vrijednosti možete zastupaju, 513 00:23:09,940 --> 00:23:11,570 jer može biti 0 ili 1. 514 00:23:11,570 --> 00:23:14,660 Pa po defaultu, int može biti grubo negativna 2 milijarde skroz 515 00:23:14,660 --> 00:23:16,030 do pozitivnog 2 milijarde. 516 00:23:16,030 --> 00:23:18,540 Oni su veliki rasponi, ali to je još uvijek vrsta rasipan 517 00:23:18,540 --> 00:23:21,280 ako je samo stalo veličina, koji je upravo intuitivno 518 00:23:21,280 --> 00:23:24,620 treba biti pozitivan ili pozitivan ili 0, i onda, 519 00:23:24,620 --> 00:23:28,884 zašto trošiš 2 milijarde Vrijednosti za negativne brojeve 520 00:23:28,884 --> 00:23:30,300 ako nikada ćeš ih koristiti? 521 00:23:30,300 --> 00:23:35,350 Tako rekavši nepotpisan, sada moj int mogu biti između 0 i oko 4 milijarde. 522 00:23:35,350 --> 00:23:39,280 >> Dakle, ovdje je samo int C razloga nećemo ući samo sada kao 523 00:23:39,280 --> 00:23:42,280 zašto je to int umjesto od char, ali ovdje je 524 00:23:42,280 --> 00:23:44,630 suština onoga što se događa na, a neki od vas 525 00:23:44,630 --> 00:23:48,340 može se koristiti, na primjer, fgetc funkcija čak četiri PSet 526 00:23:48,340 --> 00:23:51,580 ili nakon toga, mi ćemo ga vidjeti opet u problemu postaviti pet, 527 00:23:51,580 --> 00:23:55,410 fgetc je lijepo, jer kao ime vrsta, vrsta arcanely sugerira, 528 00:23:55,410 --> 00:23:57,940 je funkcija koja dobiva karakter i tako, 529 00:23:57,940 --> 00:24:00,690 ono što je bitno drugačija o tome što radimo u GetString 530 00:24:00,690 --> 00:24:03,110 je što ne koristite scanf na isti način. 531 00:24:03,110 --> 00:24:07,550 Mi samo puzanje po korak-po-korak više god je korisnik upisali u, 532 00:24:07,550 --> 00:24:10,970 jer uvijek možemo izdvojiti jedan char, i tako možemo uvijek sigurno 533 00:24:10,970 --> 00:24:15,599 pogledajte jedan char na vrijeme, i čarolija počinje događati ovdje. 534 00:24:15,599 --> 00:24:17,890 Idem pomaknite se dolje do usred ove funkcije 535 00:24:17,890 --> 00:24:20,360 samo ukratko predstaviti ovu funkciju. 536 00:24:20,360 --> 00:24:22,670 Slično kao i tu je malloc funkcija, postoji 537 00:24:22,670 --> 00:24:27,740 realloc funkcija gdje realloc omogućuje preraspodijeliti komad memorije 538 00:24:27,740 --> 00:24:29,570 a čine ga veći ili manji. 539 00:24:29,570 --> 00:24:33,060 Dakle duljimo i val ruci za danas, 540 00:24:33,060 --> 00:24:35,620 znam da je ono što GetString radi je to vrsta 541 00:24:35,620 --> 00:24:39,720 od magično raste ili smanjivanjem pufer kao korisnik 542 00:24:39,720 --> 00:24:41,440 vrste u svom nizu. 543 00:24:41,440 --> 00:24:43,962 >> Dakle, ako korisnik upiše Ukratko niz, ovaj kod 544 00:24:43,962 --> 00:24:45,920 Samo izdvaja dovoljno memorije da stane string. 545 00:24:45,920 --> 00:24:48,086 Ako korisnik drži tipkati kao što sam to učinio ponovno i ponovno 546 00:24:48,086 --> 00:24:50,330 i opet, dobro, ako je tampon je u početku ovaj veliki 547 00:24:50,330 --> 00:24:53,310 a program realizira, da se Čekaj malo, ja sam iz prostora, 548 00:24:53,310 --> 00:24:55,410 to će se udvostručiti veličina pufera 549 00:24:55,410 --> 00:24:59,110 a zatim dvaput veličinu pufera i kod koji radi udvostručenje, 550 00:24:59,110 --> 00:25:03,170 ako ćemo gledati na to ovdje, to je samo ovaj pametan jedan brod. 551 00:25:03,170 --> 00:25:06,830 Vi ne bi vidjeli ovu sintaksu prije, ali ako ti kažeš zvijezda jednak, 552 00:25:06,830 --> 00:25:10,470 to je ista stvar kao rekavši puta kapaciteta 2. 553 00:25:10,470 --> 00:25:13,390 Tako da samo čuva udvostručenje kapacitet pufera 554 00:25:13,390 --> 00:25:17,480 a onda reći realloc dati Sama da je mnogo više memorije. 555 00:25:17,480 --> 00:25:19,720 >> Sada, kao stranu, postoji i druge funkcije u ovdje 556 00:25:19,720 --> 00:25:23,680 da nećemo gledati u bilo detalje osim pokazati u GetInt, 557 00:25:23,680 --> 00:25:26,150 koristimo GetString u GetInt. 558 00:25:26,150 --> 00:25:28,192 Mi smo provjeriti da to nije null, koja je, podsjetimo, 559 00:25:28,192 --> 00:25:30,400 je posebna vrijednost koja znači nešto pošlo po zlu. 560 00:25:30,400 --> 00:25:31,233 Mi smo iz memorije. 561 00:25:31,233 --> 00:25:32,310 Bolje provjerite to. 562 00:25:32,310 --> 00:25:33,710 I vraćamo čuvara vrijednosti. 563 00:25:33,710 --> 00:25:37,850 Ali ja ću odgoditi na komentare kao da zašto i onda koristiti ovaj rođak scanf 564 00:25:37,850 --> 00:25:42,100 zove sscanf i ispada da sscanf ili niz scanf, 565 00:25:42,100 --> 00:25:45,310 omogućuje pogledati na liniji koja je korisnik upisali u i neka vas 566 00:25:45,310 --> 00:25:49,610 analizirati ga u biti i što sam radiš ovdje govorim sscanf, 567 00:25:49,610 --> 00:25:54,440 analizirati ono što korisnik ima upisali i pobrinite% ja, 568 00:25:54,440 --> 00:25:59,250 postoji cijeli broj u njoj, i nećemo dobiti u danas točno zašto tu je i 569 00:25:59,250 --> 00:26:03,760 A% c ovdje, ali da je u Ukratko omogućuje nam otkriti ako je korisnik upisali 570 00:26:03,760 --> 00:26:06,050 nešto lažnom nakon broja. 571 00:26:06,050 --> 00:26:11,766 Dakle razlog da GetInt i GetString kažem vam da ponovno pokušamo, ponovite, ponovno pokušati 572 00:26:11,766 --> 00:26:13,640 je zbog sve da kod nas napisano, 573 00:26:13,640 --> 00:26:17,900 To je vrsta gleda na korisnikov unos u tome da je u potpunosti numerička 574 00:26:17,900 --> 00:26:21,700 ili je to stvarna Plutajući Točka vrijednost ili slično, 575 00:26:21,700 --> 00:26:24,233 Ovisno o tome što vrijednost funkcionirati koju koristite. 576 00:26:24,233 --> 00:26:25,060 >> Uh. 577 00:26:25,060 --> 00:26:25,710 U REDU. 578 00:26:25,710 --> 00:26:27,592 To je bila mala količina ali poanta je da se ovdje 579 00:26:27,592 --> 00:26:29,550 da je razlog što smo imali ti trening kotača na 580 00:26:29,550 --> 00:26:32,880 je zato na najnižoj razini, Postoji samo toliko stvari koje 581 00:26:32,880 --> 00:26:35,674 možete pogriješiti da smo htjeli da preventivno obraditi 582 00:26:35,674 --> 00:26:38,090 te stvari sigurno u Najraniji tjedana klase, 583 00:26:38,090 --> 00:26:42,230 ali sada s PSet četiri i pet i PSet izvan vidjet ćete da je to više k 584 00:26:42,230 --> 00:26:45,570 ti već da si sposobnija rješavanja tih vrsta problema 585 00:26:45,570 --> 00:26:47,180 sami. 586 00:26:47,180 --> 00:26:51,770 Bilo kakva pitanja o GetString ili GetInt? 587 00:26:51,770 --> 00:26:52,630 Da? 588 00:26:52,630 --> 00:26:55,130 >> PUBLIKA: Zašto bi udvostručiti kapacitet pufera 589 00:26:55,130 --> 00:26:57,630 a ne samo povećanje to je točan iznos? 590 00:26:57,630 --> 00:26:58,100 >> DAVID Malan: Dobro pitanje. 591 00:26:58,100 --> 00:27:00,474 Zašto bismo udvostručiti kapacitet pufera nasuprot 592 00:27:00,474 --> 00:27:02,800 samo ga porastu neki konstantnu vrijednost? 593 00:27:02,800 --> 00:27:03,900 Bilo je dizajn odluka. 594 00:27:03,900 --> 00:27:08,590 Upravo smo se odlučili jer je sklon biti malo skupo vrijeme pametno pitati 595 00:27:08,590 --> 00:27:10,440 operativni sustav za pamćenje, nismo 596 00:27:10,440 --> 00:27:13,210 želite završiti uzimajući u situacija za velike žice 597 00:27:13,210 --> 00:27:14,960 koje smo pitali i opet OS 598 00:27:14,960 --> 00:27:17,500 i opet i opet u redom za pamćenje. 599 00:27:17,500 --> 00:27:20,387 Tako smo samo odlučili, nešto proizvoljno, ali nadamo se razumno, 600 00:27:20,387 --> 00:27:22,720 da, znate što, neka je pokušati dobiti ispred sebe 601 00:27:22,720 --> 00:27:25,520 i samo bi ga udvostručenje da smo smanjili količinu vremena 602 00:27:25,520 --> 00:27:29,010 moramo zvati malloc ili realloc, ali ukupno presuda 603 00:27:29,010 --> 00:27:31,820 poziv u nedostatku poznavanja što korisnici možda želite upisati. 604 00:27:31,820 --> 00:27:33,600 Oba načina bi mogao biti sporan. 605 00:27:33,600 --> 00:27:35,430 Uvjerljivo dobro. 606 00:27:35,430 --> 00:27:39,240 >> Tako ćemo pogledati par drugih nuspojava pamćenja, 607 00:27:39,240 --> 00:27:41,610 stvari koje mogu poći po zlu i alata koje možete 608 00:27:41,610 --> 00:27:43,880 koristiti za ulov ove vrste pogreške. 609 00:27:43,880 --> 00:27:47,800 Ispada sve vas, iako check50 nije ti rekao koliko, 610 00:27:47,800 --> 00:27:50,050 su pisanje lud broj jer tjedan jednu, 611 00:27:50,050 --> 00:27:53,630 čak i ako su svi check50 testovi prošlo, pa čak i ako vi i vaš TF 612 00:27:53,630 --> 00:27:56,010 su super sigurni da Vaš broj radi onako kako bi trebalo. 613 00:27:56,010 --> 00:27:59,190 Vaš broj je lud ili pogrešno, da svi vi, 614 00:27:59,190 --> 00:28:02,540 u korištenju CS50 knjižnici, su curenje memorije. 615 00:28:02,540 --> 00:28:06,040 Vi ste bili pitate operativnog sustava za memoriju u većini programa 616 00:28:06,040 --> 00:28:08,850 si napisao, ali ste Nikad zapravo vraćen. 617 00:28:08,850 --> 00:28:12,110 Vi ste pozvani GetString i GetInt i GetFloat, 618 00:28:12,110 --> 00:28:15,270 ali s GetString, vi ste Nikad se zove unGetString ili dati 619 00:28:15,270 --> 00:28:19,890 Gudački Natrag ili slično, ali smo vidjeli da GetString se alocirati memoriju 620 00:28:19,890 --> 00:28:22,810 putem malloc ili ovo Funkcija realloc, što je samo 621 00:28:22,810 --> 00:28:25,670 vrlo slični u duhu, a opet, mi smo bili 622 00:28:25,670 --> 00:28:28,629 traži operativni sustav za memorije i pamćenja opet i opet 623 00:28:28,629 --> 00:28:29,670 ali nikada to davanje natrag. 624 00:28:29,670 --> 00:28:33,550 >> Sada, kao stranu, ispada da kada program zatvara, sve memorije 625 00:28:33,550 --> 00:28:34,870 automatski oslobođen. 626 00:28:34,870 --> 00:28:36,150 Dakle, to nije bio veliki posao. 627 00:28:36,150 --> 00:28:38,590 To neće razbiti IDE ili usporiti stvari, 628 00:28:38,590 --> 00:28:40,670 ali kad programe učiniti uglavnom curenje memorije 629 00:28:40,670 --> 00:28:42,170 i oni trčanje za dugo vremena. 630 00:28:42,170 --> 00:28:45,640 Ako ste ikada vidjeli glupa mala lopta za plažu u Mac OS ili pješčanog sata 631 00:28:45,640 --> 00:28:51,160 na Windowsima gdje je vrsta usporavanje ili misli ili misli 632 00:28:51,160 --> 00:28:53,770 ili samo stvarno počinje usporiti na puzati, 633 00:28:53,770 --> 00:28:56,960 to vrlo vjerojatno mogao biti rezultat memorijske curenja. 634 00:28:56,960 --> 00:28:59,970 Programeri koji su napisali softver koji koristite 635 00:28:59,970 --> 00:29:03,570 pitajte operacijski sustav memorije svakih nekoliko minuta, svaki sat. 636 00:29:03,570 --> 00:29:05,570 Ali, ako ste trčanje softver, čak i ako je 637 00:29:05,570 --> 00:29:08,680 minimiziran na vašem računalu za nekoliko sati ili dana na kraju, 638 00:29:08,680 --> 00:29:11,980 možda se traži sve više i više memorije i nikad ga zapravo koristi 639 00:29:11,980 --> 00:29:15,180 i tako je vaš broj može biti ili programi mogu se curenje memorije, 640 00:29:15,180 --> 00:29:18,350 a ako počnu curiti memorije, ima manje memorije za druge programe, 641 00:29:18,350 --> 00:29:21,220 a učinak je usporiti sve dolje. 642 00:29:21,220 --> 00:29:23,600 >> Sada, ovo je daleko jedan od su najokrutniji programi 643 00:29:23,600 --> 00:29:26,350 imat ćete prilike pokrenuti u CS50 mjeri 644 00:29:26,350 --> 00:29:31,650 kao svoj izlaz je još ezoterička od zveket a ili napraviti-a ili bilo koje naredbe 645 00:29:31,650 --> 00:29:35,930 crta programe smo pokrenuti prije nego srećom, ugrađen u svoj izlaz 646 00:29:35,930 --> 00:29:39,810 je neki super korisnih savjeta koji će biti koristan ni za PSet četiri 647 00:29:39,810 --> 00:29:41,510 ili svakako PSet pet. 648 00:29:41,510 --> 00:29:44,250 Dakle Valgrind je alat koja se može koristiti da izgleda 649 00:29:44,250 --> 00:29:46,930 curenja memorije na vašem programu. 650 00:29:46,930 --> 00:29:48,570 To je relativno jednostavan za pokretanje. 651 00:29:48,570 --> 00:29:51,420 Možete pokrenuti Valgrind i onda, čak i iako je malo preopširan, 652 00:29:51,420 --> 00:29:54,440 crtica crtica provjera propuštanja jednako pun, a zatim dot 653 00:29:54,440 --> 00:29:56,320 slash i ime vašeg programa. 654 00:29:56,320 --> 00:30:00,010 Tako Valgrind onda će pokrenuti vaš program a na samom kraju svog programa 655 00:30:00,010 --> 00:30:02,240 pokrenut prije nego što je podnio ostavku i daje vam još jedan redak, 656 00:30:02,240 --> 00:30:04,980 to će analizirati svoje Program dok je bio pokrenut 657 00:30:04,980 --> 00:30:07,740 i reći da si curiti bilo memorije i još bolje, 658 00:30:07,740 --> 00:30:10,610 Jeste li dirajte uspomenu da ne pripada vama? 659 00:30:10,610 --> 00:30:13,700 To se ne može uhvatiti sve, ali to je prilično dobar u lov većinu stvari. 660 00:30:13,700 --> 00:30:19,700 >> Dakle ovdje je primjer moje ima vožnji Ovaj program, koji ima run Valgrind, 661 00:30:19,700 --> 00:30:21,470 na program pod nazivom memorije, a ja ću 662 00:30:21,470 --> 00:30:24,730 označite linije koje su u konačnici od interesa za nas. 663 00:30:24,730 --> 00:30:27,690 Dakle, tu je još više distractions da sam izbrisan iz slajda. 664 00:30:27,690 --> 00:30:30,930 Ali neka je samo vidjeti što je to Program je sposoban nam reći. 665 00:30:30,930 --> 00:30:34,800 To je u stanju reći nam stvari kao nevažeće pisati veličine 4. 666 00:30:34,800 --> 00:30:38,020 Drugim riječima, ako touch memorije, konkretno 4 bajta memorije 667 00:30:38,020 --> 00:30:40,350 da ne bi trebali imati, Valgrind mogu vam reći da. 668 00:30:40,350 --> 00:30:41,660 Pogrešna pisati veličine 4. 669 00:30:41,660 --> 00:30:43,640 Dotakla si četiri bajta da ne bi trebali imati. 670 00:30:43,640 --> 00:30:44,840 Gdje si to učinio? 671 00:30:44,840 --> 00:30:45,900 To je ljepota. 672 00:30:45,900 --> 00:30:50,000 Memorija točka c linija 21, gdje vas zajebao i to je razlog zašto je to korisno. 673 00:30:50,000 --> 00:30:53,410 Slično kao GDB, to može pomoći te ukazati na stvarne pogreške. 674 00:30:53,410 --> 00:30:57,170 >> Sad, ovo je malo više preopširan, ako ne i konfuzno. 675 00:30:57,170 --> 00:31:01,307 40 bajtova u 1 blokovi su svakako izgubljena u gubitak rekord 1 od 1. 676 00:31:01,307 --> 00:31:02,140 Što to znači? 677 00:31:02,140 --> 00:31:05,920 Pa, to samo znači da ste zatražili 40 bajtova i nikad ga vrati. 678 00:31:05,920 --> 00:31:08,930 Zvao si malloc ili naziva GetString i operativni sustav 679 00:31:08,930 --> 00:31:12,450 dao vam 40 bajtova, ali nikad oslobođen ili objavio tu memoriju, 680 00:31:12,450 --> 00:31:15,400 i da se pošteno, mi nikada pokazati vam kako vratiti memoriju. 681 00:31:15,400 --> 00:31:17,910 Ispalo je da postoji super jednostavna funkcija zove besplatno. 682 00:31:17,910 --> 00:31:21,170 Uzeti jedan argument, stvar Želite li osloboditi ili vratiti, 683 00:31:21,170 --> 00:31:23,430 ali 40 bajtova, očito, u ovom programu 684 00:31:23,430 --> 00:31:27,300 su izgubili na liniji 20 memorije točke c. 685 00:31:27,300 --> 00:31:28,650 >> Tako ćemo vidjeti ovaj program. 686 00:31:28,650 --> 00:31:31,020 To je super beskorisno. 687 00:31:31,020 --> 00:31:33,980 To samo pokazuje ovaj greška. 688 00:31:33,980 --> 00:31:34,920 Tako ćemo pogledati. 689 00:31:34,920 --> 00:31:39,920 Ovdje je glavni i glavni, najave, pozive funkcija zove F i zatim se vraća. 690 00:31:39,920 --> 00:31:41,550 Dakle, nije sve što je zanimljivo. 691 00:31:41,550 --> 00:31:42,664 Što f učiniti? 692 00:31:42,664 --> 00:31:44,330 Obavijest Nisam gnjaviti s prototip. 693 00:31:44,330 --> 00:31:46,520 Želio sam zadržati kod što je minimalna što je više moguće. 694 00:31:46,520 --> 00:31:49,530 Pa sam stavio f iznad glavnog i to je u redu, sigurno, 695 00:31:49,530 --> 00:31:51,500 za kratke programe kao što je ovaj. 696 00:31:51,500 --> 00:31:56,910 Dakle f ne vrati ništa i ne ne uzeti ništa, ali to ne učiniti. 697 00:31:56,910 --> 00:31:59,620 To izjavljuje, slično kao u Binky primjer, 698 00:31:59,620 --> 00:32:02,682 pokazivač zove x da će pohraniti adresu int. 699 00:32:02,682 --> 00:32:03,890 Tako da je Lijeva strana. 700 00:32:03,890 --> 00:32:07,230 U engleskom jeziku, što je desna strana radi? 701 00:32:07,230 --> 00:32:09,770 Bilo tko? 702 00:32:09,770 --> 00:32:13,665 Što je to za nas? 703 00:32:13,665 --> 00:32:14,651 Da? 704 00:32:14,651 --> 00:32:16,623 >> PUBLIKA: [nečujan] puta veći od int 705 00:32:16,623 --> 00:32:19,175 što je 10 puta da [nečujan] 706 00:32:19,175 --> 00:32:20,800 DAVID Malan: Dobro i neka mi ukratko. 707 00:32:20,800 --> 00:32:25,480 Dakle izdvojiti dovoljno prostora za 10 brojeva ili 10, što je veličina int, 708 00:32:25,480 --> 00:32:29,340 to je četiri bajtova, pa 10 puta 4 je 40, tako da desna strana koje sam 709 00:32:29,340 --> 00:32:33,930 Istaknuta je daj mi 40 bajtova i pohraniti adresu prvog bajta 710 00:32:33,930 --> 00:32:34,940 u x. 711 00:32:34,940 --> 00:32:38,380 I sada na kraju, a evo i gdje ovaj program je lud, ono što je 712 00:32:38,380 --> 00:32:41,540 u redu sa linije 21 na temelju toj logici? 713 00:32:41,540 --> 00:32:45,197 714 00:32:45,197 --> 00:32:46,280 Što nije u redu s linije 21? 715 00:32:46,280 --> 00:32:46,780 Da? 716 00:32:46,780 --> 00:32:49,550 PUBLIKA: Ne možete Indeks na x [nečujan]. 717 00:32:49,550 --> 00:32:50,300 DAVID Malan: Da. 718 00:32:50,300 --> 00:32:52,270 Nisam trebao indeks u X kao što je to. 719 00:32:52,270 --> 00:32:53,850 Dakle sintaktički, to je u redu. 720 00:32:53,850 --> 00:32:56,990 Što je lijepo je, baš kao i ti može liječiti ime niza 721 00:32:56,990 --> 00:33:01,080 kao da je pokazivač, na sličan način možete liječiti pokazivač kao da je 722 00:33:01,080 --> 00:33:06,425 niz, pa ja mogu sintaktički kažu x noseći nešto, x nosač ja, 723 00:33:06,425 --> 00:33:07,800 ali 10 je problematično. 724 00:33:07,800 --> 00:33:09,096 Zašto? 725 00:33:09,096 --> 00:33:10,910 >> PUBLIKA: Budući da nije unutra. 726 00:33:10,910 --> 00:33:12,390 >> DAVID Malan: Nije unutar tog komad memorije. 727 00:33:12,390 --> 00:33:15,306 Što je najveća vrijednost trebam se stavljanjem u tim uglatim zagradama? 728 00:33:15,306 --> 00:33:16,870 9, 0 do 9. 729 00:33:16,870 --> 00:33:18,160 Zbog nula indeksiranja. 730 00:33:18,160 --> 00:33:20,190 Tako 0 do 9 bi bilo u redu. 731 00:33:20,190 --> 00:33:23,960 Nosač 10 nije dobro i ali, sjećam ipak, svaki put 732 00:33:23,960 --> 00:33:27,017 Čini mi se da pokušati napraviti CS50 IDE sudar upišete u lažnim vrijednostima, 733 00:33:27,017 --> 00:33:29,100 to ne uvijek surađuju, i doista, često 734 00:33:29,100 --> 00:33:31,460 dobiti sretan samo zato što je Operativni sustav ne 735 00:33:31,460 --> 00:33:35,467 primijetiti da ste ikada tako nešto proći neke komad memorije, 736 00:33:35,467 --> 00:33:38,300 zato što je ostao u tehnički Vaša segmentu, no više o tome 737 00:33:38,300 --> 00:33:40,940 u operacijskim sustavima klase, i tako nešto kao što je ovaj 738 00:33:40,940 --> 00:33:43,000 bi vrlo lako mogao otići neprimijećen. 739 00:33:43,000 --> 00:33:48,120 Vaš program nikad neće srušiti dosljedno ali možda jednom u neko vrijeme. 740 00:33:48,120 --> 00:33:50,610 >> I tako pokušajmo Valgrind o tome, i ovdje je 741 00:33:50,610 --> 00:33:52,870 gdje ćemo dobiti osvaja od izlaza na trenutak. 742 00:33:52,870 --> 00:34:00,810 Tako bi memorije ček Valgrind curenja jednako punu točkica kose crte memorije. 743 00:34:00,810 --> 00:34:03,040 A evo i zašto obećajem to bi pobijediti. 744 00:34:03,040 --> 00:34:05,700 Evo što Valgrind, evo što programer, nekoliko godina ago- 745 00:34:05,700 --> 00:34:08,469 odlučio da će to biti dobra ideja za izlaz izgledati. 746 00:34:08,469 --> 00:34:09,750 Tako ćemo shvatiti ovo. 747 00:34:09,750 --> 00:34:13,120 Dakle, sve na lijevom strana bez dobrog razloga 748 00:34:13,120 --> 00:34:16,620 je proces ID programa mi samo trčanje, jedinstveni identifikator 749 00:34:16,620 --> 00:34:18,030 za program mi samo trčao. 750 00:34:18,030 --> 00:34:19,738 Izbrisali smo da je od slajd, ali postoji 751 00:34:19,738 --> 00:34:22,190 neke korisne informacije ovdje. 752 00:34:22,190 --> 00:34:24,684 >> Idemo dođite do samog vrha. 753 00:34:24,684 --> 00:34:25,600 Evo gdje smo počeli. 754 00:34:25,600 --> 00:34:27,040 Dakle, to nije sve što je mnogo izlaz. 755 00:34:27,040 --> 00:34:30,429 Evo kako nevažeća pisati veličine 4 na liniji 21. 756 00:34:30,429 --> 00:34:31,760 Pa, što je redak 21? 757 00:34:31,760 --> 00:34:34,500 Linija 21 je upravo ovo i ima smisla 758 00:34:34,500 --> 00:34:37,290 da sam u valjano pisanje 4 bajta, jer sam 759 00:34:37,290 --> 00:34:40,389 pokušavam staviti ovaj cijeli broj, koji bi mogao biti bilo što, 760 00:34:40,389 --> 00:34:42,370 to samo događa da se nula, ali ja pokušavam 761 00:34:42,370 --> 00:34:44,940 staviti ga na mjestu koji ne pripada meni. 762 00:34:44,940 --> 00:34:50,900 Štoviše, ovdje dolje, 40 bajtova u jedan blokovi su definitivno izgubili u rekordnom 1. 763 00:34:50,900 --> 00:34:56,500 To je zato što kad ja zovem malloc Ovdje, nikada nisam zapravo osloboditi memoriju. 764 00:34:56,500 --> 00:34:58,140 >> Pa kako možemo popraviti ovo? 765 00:34:58,140 --> 00:35:02,970 Dopustite mi ići naprijed i biti malo sigurniji i to 9 tamo i neka me ovdje besplatno x. 766 00:35:02,970 --> 00:35:04,820 Ovo je nova funkcija za danas. 767 00:35:04,820 --> 00:35:11,520 Ako ja sada ponoviti napraviti memorije dot crta, neka je trčanje Valgrind na to opet, 768 00:35:11,520 --> 00:35:14,990 povećala sam prozor i pritisnite Enter. 769 00:35:14,990 --> 00:35:16,900 Sada, to je dobro. 770 00:35:16,900 --> 00:35:19,590 Oni pokopam dobre vijesti u svim ovim izlaz. 771 00:35:19,590 --> 00:35:20,810 Svi hrpu blokova bili slobodni. 772 00:35:20,810 --> 00:35:23,604 Mi ćemo se vratiti na ono što je gomila je, ali nema curenja su moguće. 773 00:35:23,604 --> 00:35:25,520 Dakle, ovo je samo još jedan alat za vaš alat kit 774 00:35:25,520 --> 00:35:30,220 s kojima možete početi nalaze se sada pogreške kao što je to. 775 00:35:30,220 --> 00:35:34,532 >> Ali da vidimo što Više možete pogriješiti ovdje. 776 00:35:34,532 --> 00:35:38,890 Idemo prijelaz sada zapravo rješavanje problema. 777 00:35:38,890 --> 00:35:42,440 Kao na stranu, ako je to će osloboditi malo konfuzije ili napetosti, 778 00:35:42,440 --> 00:35:43,430 ovo je sada smiješno. 779 00:35:43,430 --> 00:35:46,400 780 00:35:46,400 --> 00:35:46,900 Da. 781 00:35:46,900 --> 00:35:49,040 To je vrlo dobro. 782 00:35:49,040 --> 00:35:50,890 Zbog pokazivače su adrese i adrese 783 00:35:50,890 --> 00:35:53,098 uglavnom po konvenciji napisan s heksadecimalnom. 784 00:35:53,098 --> 00:35:54,650 Ha, ha, to je smiješno sada. 785 00:35:54,650 --> 00:35:58,390 U svakom slučaju, pa neka je sada zapravo riješiti problem. 786 00:35:58,390 --> 00:36:00,840 To je super, super niske razine do sada, 787 00:36:00,840 --> 00:36:03,950 i mi zapravo može učiniti korisnim stvari s tim detaljima niske razine. 788 00:36:03,950 --> 00:36:06,710 >> Tako smo uveli nekoliko tjedana Prije pojam niza. 789 00:36:06,710 --> 00:36:09,177 Niz je lijepo, jer to je teško očistiti našu šifru 790 00:36:09,177 --> 00:36:11,760 jer ako smo htjeli napisati Program s više studenata 791 00:36:11,760 --> 00:36:15,270 ili više imena i kuće i dorms i visokih škola i sve to, 792 00:36:15,270 --> 00:36:19,430 možemo pohraniti sve više čisto unutar niza. 793 00:36:19,430 --> 00:36:23,039 No, predlaže jedan minus od niza do sada. 794 00:36:23,039 --> 00:36:26,080 Čak i ako ne sam to trpio sebe u programu, samo instinktivno, 795 00:36:26,080 --> 00:36:30,870 ono što je loše o nizu, možda? 796 00:36:30,870 --> 00:36:32,337 Čujem neke murmurs. 797 00:36:32,337 --> 00:36:34,170 PUBLIKA: Teško je za promjenu veličine. 798 00:36:34,170 --> 00:36:36,128 DAVID Malan: Teško je za promjenu veličine. 799 00:36:36,128 --> 00:36:38,660 Ne možete promijeniti veličinu od niza, u stvari, kao takvi 800 00:36:38,660 --> 00:36:43,040 u C. Možete izdvojiti još jedan niz, premjestiti sve od stare 801 00:36:43,040 --> 00:36:45,380 u novi, a sada imaju neki dodatni prostor, 802 00:36:45,380 --> 00:36:47,469 ali to ne sviđa jezik poput Java ili Python 803 00:36:47,469 --> 00:36:49,760 ili bilo kojom drugom jezika s kojih su neki od vas 804 00:36:49,760 --> 00:36:52,070 možda upoznati gdje vas mogu samo držati dodajući stvari 805 00:36:52,070 --> 00:36:53,930 gadosti na kraj niza. 806 00:36:53,930 --> 00:36:57,880 Kada imate niz Veličina 6, da je njegova veličina, 807 00:36:57,880 --> 00:37:01,970 i tako mnogo kao ideja ranije ima pufera određene veličine, 808 00:37:01,970 --> 00:37:05,940 morate pogoditi od vrata što veličini želiš da bude? 809 00:37:05,940 --> 00:37:07,880 Ako pogodite prevelika, ste gubit prostor. 810 00:37:07,880 --> 00:37:10,950 Ako pogodite premala, te Ne mogu pohraniti te podatke, barem 811 00:37:10,950 --> 00:37:12,940 bez puno rada. 812 00:37:12,940 --> 00:37:18,180 >> Tako je danas, zahvaljujući pokazivača, možemo započeti povezivanjem vlastite običaj 813 00:37:18,180 --> 00:37:20,989 strukture podataka, te po Činjenica, ovdje je nešto 814 00:37:20,989 --> 00:37:23,030 da izgleda malo više grobni na prvi pogled, 815 00:37:23,030 --> 00:37:26,440 ali to je ono što ćemo nazvati povezan Lista, a ime vrste rezimira 816 00:37:26,440 --> 00:37:26,940 to. 817 00:37:26,940 --> 00:37:29,550 To je popis brojeva, ili ovaj slučaj, popis brojeva, 818 00:37:29,550 --> 00:37:33,480 ali to bi mogao biti popis svega, ali to je međusobno povezane preko strelice, 819 00:37:33,480 --> 00:37:36,380 i samo uzeti pogodak s tim što je tehnika 820 00:37:36,380 --> 00:37:38,310 ćemo biti u mogućnosti bodom zajedno, 821 00:37:38,310 --> 00:37:42,540 vrsta kao kokica s navojem, je povezani popisi pravokutnici ovdje? 822 00:37:42,540 --> 00:37:43,936 Njegovi brojevi? 823 00:37:43,936 --> 00:37:45,560 Što je jezik lik podlozi? 824 00:37:45,560 --> 00:37:46,350 >> PUBLIKA: Pokazivač. 825 00:37:46,350 --> 00:37:47,308 >> DAVID Malan: Pokazivač. 826 00:37:47,308 --> 00:37:51,700 Dakle, svaki od tih strelice ovdje predstavlja pokazivač ili samo adresa. 827 00:37:51,700 --> 00:37:54,590 Dakle, drugim riječima, ako želim pohraniti popis brojeva, 828 00:37:54,590 --> 00:37:59,040 Ne mogu ga samo spremiti ako želim sposobnost da raste i smanjiti 829 00:37:59,040 --> 00:38:00,990 moja struktura podataka u polja. 830 00:38:00,990 --> 00:38:03,000 Dakle, moram imati malo više sofisticiranost, 831 00:38:03,000 --> 00:38:05,720 ali primijetiti da je ovaj Slika vrsta sugerira 832 00:38:05,720 --> 00:38:08,650 da, ako ste upravo je dobio malo teme povezivanje sve zajedno, 833 00:38:08,650 --> 00:38:13,100 vjerojatno nije da je teško napraviti prostor između dva od tih pravokutnika 834 00:38:13,100 --> 00:38:16,750 ili dva od tih čvorova, kao što ćemo početi nazivajući ih, stavite u novi čvor, 835 00:38:16,750 --> 00:38:19,547 a onda s nekim novim konac, samo jarku tri čvorova zajedno, 836 00:38:19,547 --> 00:38:22,880 prvi, zadnji i onaj da se samo umetne u sredini. 837 00:38:22,880 --> 00:38:26,000 >> I doista popis povezani, za razliku od niza, je dinamičan. 838 00:38:26,000 --> 00:38:27,840 To može rasti i to može smanjiti, a vi ne 839 00:38:27,840 --> 00:38:32,434 znati ili briga unaprijed koliko mnogo podataka da ćeš biti pohranjivanje, 840 00:38:32,434 --> 00:38:35,600 ali ispada da moramo biti malo Pazite kako implementirati ovaj. 841 00:38:35,600 --> 00:38:39,070 Prvo ćemo razmotriti kako ćemo provesti jednoga od ovih najmanjih pravokutnika. 842 00:38:39,070 --> 00:38:40,690 To je jednostavan za implementaciju int. 843 00:38:40,690 --> 00:38:44,000 Vi samo reći int n, a zatim dobivate 4 bajta za int, 844 00:38:44,000 --> 00:38:49,089 ali kako mogu dobiti int, zovu ga n, a zatim pokazivač, nazovimo ga sljedeći. 845 00:38:49,089 --> 00:38:50,880 Mogli bismo nazvati njih stvari sve što želimo 846 00:38:50,880 --> 00:38:53,590 ali moram struktura prilagođenih podataka. 847 00:38:53,590 --> 00:38:54,257 Da? 848 00:38:54,257 --> 00:38:57,020 >> PUBLIKA: Ampersand [nečujan]. 849 00:38:57,020 --> 00:39:00,940 >> DAVID Malan: Tako znak za struju ćemo koristiti za dobili adresu čvora potencijalno. 850 00:39:00,940 --> 00:39:02,740 No, moramo još značajka C kako 851 00:39:02,740 --> 00:39:06,700 da mi daju mogućnost stvaranja Ovaj običaj pravokutnik, ovaj običaj 852 00:39:06,700 --> 00:39:08,919 varijabla ako hoćete, u memoriju. 853 00:39:08,919 --> 00:39:09,710 PUBLIKA: a struct. 854 00:39:09,710 --> 00:39:10,626 DAVID Malan: a struct. 855 00:39:10,626 --> 00:39:14,310 Sjetite se od prošlog tjedna, uveli smo struct, ovaj relativno jednostavan ključne riječi 856 00:39:14,310 --> 00:39:16,254 koji omogućuje nam da stvari kao što je ovaj. 857 00:39:16,254 --> 00:39:18,420 C nije došao s podacima Struktura zove student. 858 00:39:18,420 --> 00:39:22,190 Ona dolazi s int i float i char i takav, ali to ne dolazi s studenta, 859 00:39:22,190 --> 00:39:26,750 ali možemo stvoriti tip studenta podataka, student struktura, s ovim sintaksa 860 00:39:26,750 --> 00:39:27,250 ovdje. 861 00:39:27,250 --> 00:39:28,350 I vidjet ćete to opet i opet. 862 00:39:28,350 --> 00:39:30,426 Zato ne brini memoriranje riječi, 863 00:39:30,426 --> 00:39:33,300 ali ključna riječ koja je važna samo činjenica da smo rekli struct 864 00:39:33,300 --> 00:39:37,590 a onda smo ga zove student i unutar studenta je ime i kuća 865 00:39:37,590 --> 00:39:39,390 ili domu ili slično. 866 00:39:39,390 --> 00:39:41,980 >> I tako sad i danas, neka predloži ovo. 867 00:39:41,980 --> 00:39:45,240 Ja sam dodao nekoliko riječi, ali ako želim implementirati ovaj pravokutnik koji je 868 00:39:45,240 --> 00:39:48,440 dobio oba int i A pokazivač, znate što, ja sam 869 00:39:48,440 --> 00:39:51,540 će proglasiti struct zove čvor. 870 00:39:51,540 --> 00:39:55,630 Ja sam također, unutar njega, reći da čvor, ovaj pravokutnik, ima int 871 00:39:55,630 --> 00:39:59,730 a mi ćemo ga zvati n i ima sljedeći pokazivač. 872 00:39:59,730 --> 00:40:02,540 A to je malo preopširan, ali ako mislite o tome, 873 00:40:02,540 --> 00:40:07,300 strelice koje su na slici trenutak prije su na vrstu podataka? 874 00:40:07,300 --> 00:40:12,330 Gdje je svaki od tih strelica ukazuje na kakvu vrstu strukture podataka? 875 00:40:12,330 --> 00:40:14,332 Nije upućuju samo na int po sebi. 876 00:40:14,332 --> 00:40:16,165 To ukazuje na Cijela stvar pravokutni 877 00:40:16,165 --> 00:40:18,720 i da pravokutnog stvar, rekli smo, zove se čvor. 878 00:40:18,720 --> 00:40:21,720 I tako smo vrsta moramo rekurzivno definira ovo kao 879 00:40:21,720 --> 00:40:26,270 da čvor, ćemo reći, će sadržavati int zove n 880 00:40:26,270 --> 00:40:31,070 a pokazivač zove pored te vrsta strukture podataka na koje 881 00:40:31,070 --> 00:40:35,770 da pokazivač bodova je očito će biti struct čvor. 882 00:40:35,770 --> 00:40:41,550 >> Dakle, ovo je dosadno preopširan i samo da se pedantan, 883 00:40:41,550 --> 00:40:44,100 razlog zašto ne možemo samo reći ovo, što iskreno 884 00:40:44,100 --> 00:40:46,860 izgleda puno više čitati, je zato Podsjetimo da je C pročitati 885 00:40:46,860 --> 00:40:48,710 stvari od vrha do dna, s lijeva na desno. 886 00:40:48,710 --> 00:40:54,120 To nije sve dok ne dobijete zarezom da je ključna riječ čvor zapravo postoji. 887 00:40:54,120 --> 00:40:57,980 Dakle, ako želimo imati ovu vrstu ciklična referenca unutar podataka 888 00:40:57,980 --> 00:41:02,120 Struktura, moramo to učiniti, gdje kažemo struct čvor na vrhu, što 889 00:41:02,120 --> 00:41:06,770 daje nam duži način opisivanja ove stvar, a onda iznutra kažemo struct čvor, 890 00:41:06,770 --> 00:41:09,560 a onda u zadnji redak kažemo, u redu, C, usput, 891 00:41:09,560 --> 00:41:12,060 samo nazvati cijelu ovu osuditi stvar čvor i zaustaviti 892 00:41:12,060 --> 00:41:14,360 pomoću ključnih riječi struct uopce. 893 00:41:14,360 --> 00:41:18,030 Dakle, ovo je samo neka vrsta sintaktička Trik koji u konačnici omogućuje nam stvaranje 894 00:41:18,030 --> 00:41:21,370 nešto što izgleda upravo ovako. 895 00:41:21,370 --> 00:41:25,010 >> Dakle, ako pretpostavimo sada možemo provesti ovo u C, 896 00:41:25,010 --> 00:41:28,040 kako radimo zapravo početi poprijeko ovo? 897 00:41:28,040 --> 00:41:32,360 Pa, zapravo, sve što morate učiniti je ponoviti s lijeva na desno i samo 898 00:41:32,360 --> 00:41:35,960 vrsta umetanje čvora ili brisanje čvorova ili tražiti stvari gdje god želimo, 899 00:41:35,960 --> 00:41:39,560 ali za to, idemo naprijed i učiniti stvari malo realnije, jer je ova 900 00:41:39,560 --> 00:41:42,560 je super niske razine do sada. 901 00:41:42,560 --> 00:41:45,700 Bi li netko doslovno htjeli biti prvi? 902 00:41:45,700 --> 00:41:46,200 U REDU. 903 00:41:46,200 --> 00:41:47,092 Dođi gore. 904 00:41:47,092 --> 00:41:47,800 Kako se zoveš? 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 Drago mi je. 908 00:41:49,998 --> 00:41:50,960 Ja isto. 909 00:41:50,960 --> 00:41:52,450 U redu. 910 00:41:52,450 --> 00:41:53,990 I trebamo broj 9. 911 00:41:53,990 --> 00:41:55,240 Nije dobar kao prvi, možda. 912 00:41:55,240 --> 00:41:56,430 OK, broj 9. 913 00:41:56,430 --> 00:41:59,667 Broj 17, molim vas. 914 00:41:59,667 --> 00:42:01,000 Pusti me da se vratim malo dalje. 915 00:42:01,000 --> 00:42:03,980 Broj 22, molim te o tome kako dalje natrag 916 00:42:03,980 --> 00:42:06,344 ako ja mogu vidjeti bilo ruke sa svim svjetlo ili ne. 917 00:42:06,344 --> 00:42:08,010 Netko se dobrovoljno javio upravo tamo. 918 00:42:08,010 --> 00:42:08,968 Želite li doći gore? 919 00:42:08,968 --> 00:42:10,450 Vaš podlaktice prisilno ide gore. 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 silazi. 923 00:42:15,120 --> 00:42:18,450 Bi li itko drugi želio forcefully-- Dođi gore. 924 00:42:18,450 --> 00:42:21,030 Stvarna volonter. 925 00:42:21,030 --> 00:42:23,330 >> Tako vrlo brzo, ako se vi mogli dogovoriti 926 00:42:23,330 --> 00:42:26,550 sami baš kao čvorovi na zaslonu. 927 00:42:26,550 --> 00:42:27,510 Hvala. 928 00:42:27,510 --> 00:42:29,234 I vi ćete biti 26. 929 00:42:29,234 --> 00:42:30,650 Svi pravi i brzo upoznavanje. 930 00:42:30,650 --> 00:42:32,139 Dakle, ja sam David i vi ste također? 931 00:42:32,139 --> 00:42:32,680 DAVID: David. 932 00:42:32,680 --> 00:42:33,721 DAVID Malan: A vi 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 TAYLOR: Taylor. 938 00:42:37,100 --> 00:42:37,466 DAVID Malan: Taylor. 939 00:42:37,466 --> 00:42:37,590 Izvrsno. 940 00:42:37,590 --> 00:42:39,810 Dakle, to su naši volonteri za danas i ići naprijed 941 00:42:39,810 --> 00:42:43,090 i guraju malo na taj način, i samo ići naprijed i držati 942 00:42:43,090 --> 00:42:47,024 drži svoje brojeve kao što su ili vaš Prvi znak i lijevom rukom, 943 00:42:47,024 --> 00:42:48,940 ići naprijed i samo provesti ove strelice, samo 944 00:42:48,940 --> 00:42:51,360 tako da tvoja lijeva ruka doslovno pokazujući na sve što treba istaknuti 945 00:42:51,360 --> 00:42:54,610 na, i dati vam malo mjesta, tako da vizualno može vidjeti vaše ruke zapravo 946 00:42:54,610 --> 00:42:58,120 bodovnom, a vi samo možete istaknuti vrsta na terenu je u redu. 947 00:42:58,120 --> 00:43:03,040 >> Dakle, ovdje imamo povezani popis jednog, dva, tri, četiri, pet čvorova početku, 948 00:43:03,040 --> 00:43:05,860 i primjetiti imamo ovaj posebni pokazivač na početku tko je 949 00:43:05,860 --> 00:43:09,770 Ključ jer moramo pratiti cijelog popisa duljine nekako. 950 00:43:09,770 --> 00:43:13,590 Ovi momci, iako su oni ostavili na desno, natrag na leđa u memoriji, 951 00:43:13,590 --> 00:43:15,950 oni zapravo može biti bilo gdje u memoriju računala. 952 00:43:15,950 --> 00:43:18,240 Dakle, ti dečki mogu biti stoji nigdje na pozornici 953 00:43:18,240 --> 00:43:20,960 i to je u redu, tako dugo dok su oni zapravo pokazujući jedan drugome, 954 00:43:20,960 --> 00:43:22,770 ali da bi stvari čist i jednostavan, mi ćemo 955 00:43:22,770 --> 00:43:25,728 samo ih privući lijeva na desno kao što je to, ali moglo bi biti masivna praznine 956 00:43:25,728 --> 00:43:26,790 između tih čvorova. 957 00:43:26,790 --> 00:43:30,710 >> Sada, ako želim da zapravo umetnuti neke nova vrijednost, idemo naprijed i učiniti. 958 00:43:30,710 --> 00:43:33,720 Imamo priliku sada odabrati neki drugi čvor. 959 00:43:33,720 --> 00:43:39,820 Recimo Počnimo s mallocing 55. 960 00:43:39,820 --> 00:43:41,320 Bi li netko smeta što malloc? 961 00:43:41,320 --> 00:43:42,280 U redu, hajde gore. 962 00:43:42,280 --> 00:43:42,992 Kako se zoveš? 963 00:43:42,992 --> 00:43:43,700 RAINBOW: Rainbow. 964 00:43:43,700 --> 00:43:44,050 DAVID Malan: Rainbow? 965 00:43:44,050 --> 00:43:44,810 U redu. 966 00:43:44,810 --> 00:43:46,600 Malloc Rainbow. 967 00:43:46,600 --> 00:43:47,450 Dođi gore. 968 00:43:47,450 --> 00:43:51,610 Zato sada moramo zapitati algoritamski gdje možemo staviti 55. 969 00:43:51,610 --> 00:43:53,610 Dakle, svi mi znamo, Očito, gdje je vjerojatno 970 00:43:53,610 --> 00:43:55,401 pripada ako nastojimo zadržati ovu razvrstani 971 00:43:55,401 --> 00:43:58,299 a ako vi mogli uzeti jedan korak natrag, tako da ne padne 972 00:43:58,299 --> 00:43:59,590 na pozornici, to bi bilo sjajno. 973 00:43:59,590 --> 00:44:01,420 Pa zapravo, Rainbow, početi ovamo sa mnom, 974 00:44:01,420 --> 00:44:04,200 jer mi kao računalo može sada vidjeti samo jednu varijablu u isto vrijeme. 975 00:44:04,200 --> 00:44:05,190 Dakle, ako je to prvi čvor. 976 00:44:05,190 --> 00:44:07,160 Obavijest on nije čvor, on je samo pokazivač, 977 00:44:07,160 --> 00:44:10,270 i to je razlog zašto je on privlači biti samo veličina pokazivač, ne 978 00:44:10,270 --> 00:44:11,780 jedan od onih punih pravokutnika. 979 00:44:11,780 --> 00:44:16,650 Tako ćemo provjeriti kod svakog iteracija je 55 manje od 9? 980 00:44:16,650 --> 00:44:17,150 Ne. 981 00:44:17,150 --> 00:44:19,060 Je li 55 manje od 17? 982 00:44:19,060 --> 00:44:19,720 Ne. 983 00:44:19,720 --> 00:44:20,800 Manje od 22? 984 00:44:20,800 --> 00:44:22,020 Manje od 26? 985 00:44:22,020 --> 00:44:23,390 Manje od 34? 986 00:44:23,390 --> 00:44:25,890 I tako sada, očito Duga spada na kraju. 987 00:44:25,890 --> 00:44:27,270 Dakle, da bude jasno, i što je vaše ime, Taylor? 988 00:44:27,270 --> 00:44:27,895 >> TAYLOR: Taylor. 989 00:44:27,895 --> 00:44:32,510 DAVID Malan: Tako među Taylor je lijeva ruka i Rainbow ruke ovdje, 990 00:44:32,510 --> 00:44:38,324 koga treba ukazati na ono što je u narediti da ubacite 55 u ovaj popis? 991 00:44:38,324 --> 00:44:39,240 Što trebamo učiniti? 992 00:44:39,240 --> 00:44:39,700 Da? 993 00:44:39,700 --> 00:44:41,140 >> PUBLIKA: Taylor ruku treba istaknuti lijevo. 994 00:44:41,140 --> 00:44:41,680 >> DAVID Malan: Točno. 995 00:44:41,680 --> 00:44:43,800 Dakle umetanje čvora u kraju liste 996 00:44:43,800 --> 00:44:47,140 je prilično jednostavan, jer je Taylor samo mora istaknuti, umjesto na terenu 997 00:44:47,140 --> 00:44:49,640 ili ćemo ga nazvati null, null je vrsta odsutnosti 998 00:44:49,640 --> 00:44:51,640 od pokazivača ili posebna nula pokazivač, ti si 999 00:44:51,640 --> 00:44:53,740 ide do točke s lijeve strane ruku na Rainbow i zatim Rainbow, 1000 00:44:53,740 --> 00:44:55,910 Gdje bi vaš lijevi Ruka vjerojatno ukazati? 1001 00:44:55,910 --> 00:44:56,570 Dolje. 1002 00:44:56,570 --> 00:45:00,140 To nije dobro ako joj je ruka je vrsta ukazivanja off ovdje ili nekako bilo 1003 00:45:00,140 --> 00:45:00,640 koji put. 1004 00:45:00,640 --> 00:45:02,407 To bi se smatrati vrijednost smeća, 1005 00:45:02,407 --> 00:45:04,240 ali ako je ona ukazuje na neki poznati vrijednost, mi ćemo 1006 00:45:04,240 --> 00:45:07,360 nazovite ga nula ili nula, to je u redu jer imamo termin u to 1007 00:45:07,360 --> 00:45:09,390 a znamo popis je potpun. 1008 00:45:09,390 --> 00:45:11,550 >> Dakle, ono što je još relativno jednostavan slučaj? 1009 00:45:11,550 --> 00:45:13,125 Možemo malloc 5? 1010 00:45:13,125 --> 00:45:14,010 Dođi gore. 1011 00:45:14,010 --> 00:45:14,782 Kako se zoveš? 1012 00:45:14,782 --> 00:45:15,490 TIFFANY: Tiffany. 1013 00:45:15,490 --> 00:45:16,000 DAVID Malan: Žao mi? 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 U redu. 1017 00:45:17,110 --> 00:45:19,071 Tiffany je malloced s vrijednošću 5. 1018 00:45:19,071 --> 00:45:19,570 Dođi gore. 1019 00:45:19,570 --> 00:45:23,820 Ovaj je relativno lako previše, ali uzmimo redoslijed operacija sada. 1020 00:45:23,820 --> 00:45:25,820 Bilo je prilično lako s Taylor na kraju. 1021 00:45:25,820 --> 00:45:30,302 Broj 5 je naravno manji od 9, i tako smo Davida, imamo Tiffany, 1022 00:45:30,302 --> 00:45:31,260 i što je vaše ime? 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, i David. 1026 00:45:34,300 --> 00:45:36,580 Čija ruka treba biti obnovljeno prvi? 1027 00:45:36,580 --> 00:45:39,260 1028 00:45:39,260 --> 00:45:40,590 Što želite raditi ovdje? 1029 00:45:40,590 --> 00:45:45,244 Postoji nekoliko mogućih načina, ali tu je i jedna ili više pogrešne načine. 1030 00:45:45,244 --> 00:45:46,620 >> PUBLIKA: Počnite s lijevom. 1031 00:45:46,620 --> 00:45:47,800 >> DAVID Malan: Počnite s lijevom. 1032 00:45:47,800 --> 00:45:49,008 Tko je lijevom onda ovdje? 1033 00:45:49,008 --> 00:45:49,700 PUBLIKA: Prvo. 1034 00:45:49,700 --> 00:45:50,366 >> DAVID Malan: U redu. 1035 00:45:50,366 --> 00:45:53,781 Dakle, početi s prva i gdje vi želite ažurirati Davidove ruke da bude? 1036 00:45:53,781 --> 00:45:54,780 PUBLIKA: Prema 5. 1037 00:45:54,780 --> 00:45:55,446 DAVID Malan: U redu. 1038 00:45:55,446 --> 00:45:59,026 Tako je David, točka na pet ili Tiffany ovdje i sada? 1039 00:45:59,026 --> 00:46:01,072 >> PUBLIKA: Tiffany ukazuje na 9? 1040 00:46:01,072 --> 00:46:04,030 DAVID Malan: Savršen, osim Binky je glava samo vrsta pao, zar ne? 1041 00:46:04,030 --> 00:46:06,820 Zato što nije u redu s ta slika doslovno? 1042 00:46:06,820 --> 00:46:08,070 PUBLIKA: Ništa se ne pokazuje. 1043 00:46:08,070 --> 00:46:09,945 DAVID Malan: Ništa se pokazujući Jake sada. 1044 00:46:09,945 --> 00:46:13,360 Mi smo doslovno smo siročad 9 i 17, a mi smo doslovno 1045 00:46:13,360 --> 00:46:18,450 procurila sve ove memorije, jer po ažuriranje Davida ruku prvo, to je 1046 00:46:18,450 --> 00:46:21,660 fino utoliko što je ispravno pokazujući na Tiffany sada, 1047 00:46:21,660 --> 00:46:25,410 ali ako nitko nema Predviđanja ukazati na Jakea, 1048 00:46:25,410 --> 00:46:27,490 onda smo izgubili cjelokupnost tog popisa. 1049 00:46:27,490 --> 00:46:28,200 Tako ćemo poništiti. 1050 00:46:28,200 --> 00:46:30,950 Dakle, to je dobra stvar za spotakne ali ćemo ispraviti sada. 1051 00:46:30,950 --> 00:46:33,624 Ono što trebamo učiniti prvi umjesto toga? 1052 00:46:33,624 --> 00:46:34,124 Da? 1053 00:46:34,124 --> 00:46:35,791 >> PUBLIKA: Tiffany treba ukazati na 9? 1054 00:46:35,791 --> 00:46:37,582 DAVID Malan: Ne mogu dobiti tu blizu tebe. 1055 00:46:37,582 --> 00:46:38,720 Tko bi trebao ukazati na 9? 1056 00:46:38,720 --> 00:46:39,220 >> PUBLIKA: Tiffany. 1057 00:46:39,220 --> 00:46:39,390 >> DAVID Malan: U redu. 1058 00:46:39,390 --> 00:46:41,200 Dakle Tiffany trebali prvo mjesto na 9. 1059 00:46:41,200 --> 00:46:43,550 Dakle Tiffany treba uzeti na identičnom vrijednost 1060 00:46:43,550 --> 00:46:45,820 Davidu, što se čini suvišan na trenutak, 1061 00:46:45,820 --> 00:46:48,820 ali to je u redu, jer sada, drugi korak, možemo ažurirati Davida za ruku 1062 00:46:48,820 --> 00:46:52,680 ukazati na Tiffany, a onda, ako mi samo vrsta čista stvari 1063 00:46:52,680 --> 00:46:55,740 kao da je to neka vrsta proljeće-poput, sada da je točna umetanja. 1064 00:46:55,740 --> 00:46:56,700 Tako izvrsno. 1065 00:46:56,700 --> 00:46:57,970 Dakle, sada smo skoro tamo. 1066 00:46:57,970 --> 00:47:01,075 Idemo umetnite jedan finale vrijednost poput vrijednosti 20. 1067 00:47:01,075 --> 00:47:03,010 Ako smo mogli malloc posljednji volonter? 1068 00:47:03,010 --> 00:47:04,140 Dođi gore. 1069 00:47:04,140 --> 00:47:06,224 Dakle, ovaj je malo lukav. 1070 00:47:06,224 --> 00:47:08,390 Ali stvarno, kod smo pisanje, iako verbalno, 1071 00:47:08,390 --> 00:47:10,610 je samo kao da hrpa odnosno ako uvjeti sada, zar ne? 1072 00:47:10,610 --> 00:47:12,318 Imali smo stanje provjere da li to spada 1073 00:47:12,318 --> 00:47:13,840 Na kraju, možda na početku. 1074 00:47:13,840 --> 00:47:15,940 Trebamo neku vrstu petlje na naći mjesto u sredini. 1075 00:47:15,940 --> 00:47:17,400 Tako ćemo učiniti s onim što je vaše ime? 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 Eric. 1079 00:47:18,660 --> 00:47:19,368 Drago mi je. 1080 00:47:19,368 --> 00:47:20,490 Dakle, imamo 20. 1081 00:47:20,490 --> 00:47:21,220 Manje od pet? 1082 00:47:21,220 --> 00:47:21,530 Ne. 1083 00:47:21,530 --> 00:47:22,160 Manje od devet? 1084 00:47:22,160 --> 00:47:22,410 Ne. 1085 00:47:22,410 --> 00:47:23,050 Manje od 17? 1086 00:47:23,050 --> 00:47:23,550 Ne. 1087 00:47:23,550 --> 00:47:23,740 U REDU. 1088 00:47:23,740 --> 00:47:25,701 On pripada ovdje i vaša imena su opet? 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 Čije ruke je potrebno da biste dobili ažurirani prvi? 1096 00:47:32,140 --> 00:47:32,930 >> PUBLIKA: Eric. 1097 00:47:32,930 --> 00:47:33,429 U REDU. 1098 00:47:33,429 --> 00:47:35,200 Dakle, Eric je trebao ukazati na kojoj? 1099 00:47:35,200 --> 00:47:35,930 U 22. 1100 00:47:35,930 --> 00:47:36,430 Dobra. 1101 00:47:36,430 --> 00:47:38,180 A sada što je sljedeće? 1102 00:47:38,180 --> 00:47:40,800 Sue onda može ukazati na Erica a sad, ako dečki jednostavno 1103 00:47:40,800 --> 00:47:44,077 napravite malo mjesta, što je u redu vizualno, sada smo učinili umetanje. 1104 00:47:44,077 --> 00:47:47,160 Tako ćemo sada razmotriti pitanje, ali hvala vam toliko za naše volontere. 1105 00:47:47,160 --> 00:47:48,090 Vrlo dobro učinio. 1106 00:47:48,090 --> 00:47:50,831 Možete zadržati one, ako vam se sviđa. 1107 00:47:50,831 --> 00:47:54,140 I mi imamo loptu oproštajne dar, ako ti bi svako želio uzeti stres loptu. 1108 00:47:54,140 --> 00:47:56,030 Dopustite mi samo proći ovo. 1109 00:47:56,030 --> 00:47:58,430 Dakle, ono što je takeaway to? 1110 00:47:58,430 --> 00:48:02,430 Čini se da je nevjerojatna utoliko što imamo danas 1111 00:48:02,430 --> 00:48:06,360 uvela alternativa za niz koji nije toliko ograničen 1112 00:48:06,360 --> 00:48:07,780 na niz neke fiksne veličine. 1113 00:48:07,780 --> 00:48:09,380 Oni mogu rasti dinamički. 1114 00:48:09,380 --> 00:48:13,220 >> No, baš kao što smo vidjeli u nekoliko tjedana prošlosti, mi nikada ne dobiti ništa besplatno, 1115 00:48:13,220 --> 00:48:15,740 kao što sigurno postoji trade-off ovdje. 1116 00:48:15,740 --> 00:48:18,890 Dakle, s naopako povezanog Lista je to dinamika? 1117 00:48:18,890 --> 00:48:21,590 Ova sposobnost da raste i iskreno, smo mogli učiniti za brisanje 1118 00:48:21,590 --> 00:48:23,570 i da bismo mogli smanjiti po potrebi. 1119 00:48:23,570 --> 00:48:24,710 Što cijenu plaćamo? 1120 00:48:24,710 --> 00:48:28,510 1121 00:48:28,510 --> 00:48:30,340 Dvostruko više prostora, prije svega. 1122 00:48:30,340 --> 00:48:34,010 Ako pogledate na slici, više nije sam spremanje popis brojeva. 1123 00:48:34,010 --> 00:48:36,740 Ja spremanje popis integers plus naputke. 1124 00:48:36,740 --> 00:48:38,240 Tako sam udvostručenje količinu prostora. 1125 00:48:38,240 --> 00:48:40,740 Sad, možda to nije tako velika stvar 4 bajta, 8 bitova, 1126 00:48:40,740 --> 00:48:43,160 ali svakako može dodati za velike skupove podataka. 1127 00:48:43,160 --> 00:48:45,570 Što je još jedan minus? 1128 00:48:45,570 --> 00:48:46,070 Da? 1129 00:48:46,070 --> 00:48:48,010 >> PUBLIKA: Moramo proći ih jednog po jednog. 1130 00:48:48,010 --> 00:48:48,760 DAVID Malan: Da. 1131 00:48:48,760 --> 00:48:50,260 Moramo ih proći jedan po jedan. 1132 00:48:50,260 --> 00:48:53,860 Znaš što mi je dao ovu super zgodan značajka uglata zagrada 1133 00:48:53,860 --> 00:48:57,240 zapis, točnije poznat kao slučajni pristup, 1134 00:48:57,240 --> 00:48:59,280 gdje mi samo može skočiti za pojedinog elementa 1135 00:48:59,280 --> 00:49:01,470 ali sada, ako sam još uvijek imao moji volonteri ovdje, 1136 00:49:01,470 --> 00:49:04,660 ako sam htjela pronaći broj 22, ne mogu jednostavno 1137 00:49:04,660 --> 00:49:06,620 skok na nosač nešto nešto. 1138 00:49:06,620 --> 00:49:10,530 Moram gledati preko popisa, mnogo poput naših potrazi primjera linearno, 1139 00:49:10,530 --> 00:49:12,260 naći broj 22. 1140 00:49:12,260 --> 00:49:14,340 Zato mi se čini da su platili cijenu tamo. 1141 00:49:14,340 --> 00:49:16,430 Ali možemo svejedno riješiti ostale probleme. 1142 00:49:16,430 --> 00:49:18,587 >> U stvari, neka mi se predstavimo samo par vizuala. 1143 00:49:18,587 --> 00:49:20,920 Dakle, ako ste bili do Mather blagovaonici nedavno, 1144 00:49:20,920 --> 00:49:23,320 vi ćete se sjetiti da je njihov hrpe ladice kao što je ovaj, 1145 00:49:23,320 --> 00:49:26,300 smo posudili od njih Annenberg prije nastave. 1146 00:49:26,300 --> 00:49:28,930 Dakle, ovaj snop ladice, ipak, prikazuje zapravo 1147 00:49:28,930 --> 00:49:30,860 od računalnih znanosti strukture podataka. 1148 00:49:30,860 --> 00:49:32,910 Tu je struktura podataka u računalnoj znanosti 1149 00:49:32,910 --> 00:49:38,010 poznat kao stog koji vrlo lijepo pada u upravo to vizualni. 1150 00:49:38,010 --> 00:49:41,380 Dakle, ako svaki od tih ladica nije ladica, ali kao broj i ja sam htjela 1151 00:49:41,380 --> 00:49:45,010 za spremanje brojeva, ja mogao staviti ovdje jedan dolje, 1152 00:49:45,010 --> 00:49:48,320 i ja mogao staviti još ovdje, i dalje slaganje brojeva 1153 00:49:48,320 --> 00:49:53,180 na vrhu jedan drugoga, i što je potencijalno korisno o tome 1154 00:49:53,180 --> 00:49:55,450 je da je ono što je implikacija ove strukture podataka? 1155 00:49:55,450 --> 00:49:58,045 Koji broj mogu izvaditi Prvi najprikladnije? 1156 00:49:58,045 --> 00:50:00,640 1157 00:50:00,640 --> 00:50:03,030 Najviše je nedavno jedan staviti tamo. 1158 00:50:03,030 --> 00:50:06,430 >> Dakle, to je ono što bismo nazvali u informatika LIFO struktura podataka. 1159 00:50:06,430 --> 00:50:08,070 Posljednji u, prvi van. 1160 00:50:08,070 --> 00:50:10,800 I vidjet ćemo ubrzo zašto to bi moglo biti korisno, ali za sada, 1161 00:50:10,800 --> 00:50:12,200 Samo razmislite imovine. 1162 00:50:12,200 --> 00:50:15,158 I to je vrsta glupo ako mislite o tome kako je blagovaonica to radi. 1163 00:50:15,158 --> 00:50:17,910 Svaki put kad su čiste posude i staviti najsvježije one na vrhu, 1164 00:50:17,910 --> 00:50:22,160 možete imati prethodno čista ali na kraju vrlo prljav i prašnjav 1165 00:50:22,160 --> 00:50:24,360 ladicu na samom dnu Ako nikad zapravo 1166 00:50:24,360 --> 00:50:26,820 doći do dna da stog, jer ste upravo 1167 00:50:26,820 --> 00:50:29,380 zadržati stavljajući novi i Čiste one na vrhu. 1168 00:50:29,380 --> 00:50:31,840 Ista stvar se može dogoditi u supermarketu previše. 1169 00:50:31,840 --> 00:50:35,450 Ako imate slučaj prikaza mlijeka i svaki put CVS 1170 00:50:35,450 --> 00:50:37,610 ili tko dobiva više mlijeka, ti samo gurati mlijeka 1171 00:50:37,610 --> 00:50:39,880 već imate na leđima i ste stavili nove up front, 1172 00:50:39,880 --> 00:50:43,088 ti si idući u imati neki prilično gadan mlijeka na kraju strukture podataka, 1173 00:50:43,088 --> 00:50:46,390 jer je uvijek na dnu ili ekvivalentno je uvijek na leđima. 1174 00:50:46,390 --> 00:50:50,407 >> No, postoji još jedan način razmišljanja o podstava gore podatke i na primjer, to. 1175 00:50:50,407 --> 00:50:53,490 Ako ste jedan od onih ljudi koji vole da se postroje izvan Apple trgovinama 1176 00:50:53,490 --> 00:50:55,610 kada novi proizvod dolazi van, vjerojatno ste 1177 00:50:55,610 --> 00:50:58,780 Ne koristite stog podatke Struktura zbog tebe 1178 00:50:58,780 --> 00:51:03,070 bi otuđiti svi drugi koji je podstava gore kupiti neku novu igračku. 1179 00:51:03,070 --> 00:51:06,610 Umjesto toga, vjerojatno ste koristeći kakva struktura podataka 1180 00:51:06,610 --> 00:51:10,050 ili kakav sustav u stvarnom svijetu? 1181 00:51:10,050 --> 00:51:13,493 Nadam se da je linija ili više ispravno ili više Britansko-kao, red. 1182 00:51:13,493 --> 00:51:17,700 I ispada red je i struktura podataka u računalnoj znanosti, 1183 00:51:17,700 --> 00:51:19,700 ali red je vrlo različite imovine. 1184 00:51:19,700 --> 00:51:20,820 Nije LIFO. 1185 00:51:20,820 --> 00:51:21,990 Posljednji u, prvi van. 1186 00:51:21,990 --> 00:51:22,800 Bože sačuvaj. 1187 00:51:22,800 --> 00:51:24,280 To je umjesto FIFO. 1188 00:51:24,280 --> 00:51:26,110 Prvi u, prvi van. 1189 00:51:26,110 --> 00:51:27,970 I to je dobra stvar za pravednost 'radi 1190 00:51:27,970 --> 00:51:30,428 sigurno kada ste obloge se super u ranim jutarnjim satima. 1191 00:51:30,428 --> 00:51:33,400 Ako doći prvi, vi želite izaći prvi, kao dobro. 1192 00:51:33,400 --> 00:51:35,880 >> I tako sve ove podatke strukture, redovi i hrpe 1193 00:51:35,880 --> 00:51:39,220 i grozdovima drugih, ispada vas mogu misliti na to kao samo polje. 1194 00:51:39,220 --> 00:51:41,820 To je niz, možda fiksna veličina 4, ali to bih 1195 00:51:41,820 --> 00:51:44,990 biti vrsta lijepo da smo mogli samo gomilati ladice gotovo beskrajno visok ako mi 1196 00:51:44,990 --> 00:51:46,780 ima da mnogi ladice ili brojeve. 1197 00:51:46,780 --> 00:51:48,840 Dakle, možda želimo koristite popis povezano ovdje 1198 00:51:48,840 --> 00:51:51,800 ali trade-off će biti potencijalno da trebamo više memorije, 1199 00:51:51,800 --> 00:51:55,930 Potrebno je malo više vremena, ali smo ne ograničavaju visinu dimnjaka, 1200 00:51:55,930 --> 00:51:59,550 slično kao Mather je prikaz slučaja može ograničiti veličinu iz dimnjaka, 1201 00:51:59,550 --> 00:52:03,117 pa to su dizajn odluke ili Opcije dostupne za nas u konačnici. 1202 00:52:03,117 --> 00:52:04,950 Dakle, s ovim podacima strukture, koje smo započeli 1203 00:52:04,950 --> 00:52:09,360 vidim nove gornje granice potencijalno na ono što je prethodno bilo super brzi 1204 00:52:09,360 --> 00:52:11,260 i gdje ćemo ostaviti off danas i gdje 1205 00:52:11,260 --> 00:52:13,200 mi ćemo se nadam da bi se je u srijedu, mi ćemo 1206 00:52:13,200 --> 00:52:15,740 početi gledati na podatke struktura koja omogućuje nam da traži 1207 00:52:15,740 --> 00:52:18,260 kroz podatke u log kraj vremena opet. 1208 00:52:18,260 --> 00:52:21,470 A vidjeli smo da je, podsjećamo, u tjednu nula i jedan s binarnim pretraživanje ili podijeli 1209 00:52:21,470 --> 00:52:22,180 i osvojiti. 1210 00:52:22,180 --> 00:52:26,240 Dolazi natrag i još bolje, Sveti Gral za ovu srijedu 1211 00:52:26,240 --> 00:52:29,510 bit će da se s struktura podataka koji se izvodi doista 1212 00:52:29,510 --> 00:52:32,070 ili teoretski u vremenska konstanta, pri čemu 1213 00:52:32,070 --> 00:52:34,760 nije važno koliko je milijuni ili milijarde stvari 1214 00:52:34,760 --> 00:52:38,470 imamo u strukture podataka, to će uzeti nam stalnu vremena, možda jedan korak 1215 00:52:38,470 --> 00:52:41,387 ili dva koraka ili 10 koraka, ali stalni broj koraka 1216 00:52:41,387 --> 00:52:42,970 tražiti kroz tu strukturu podataka. 1217 00:52:42,970 --> 00:52:46,300 To će doista biti sveti gral ali više o tome u srijedu. 1218 00:52:46,300 --> 00:52:49,045 Vidimo se onda. 1219 00:52:49,045 --> 00:52:53,704 >> [Glazbom] 1220 00:52:53,704 --> 00:56:08,448