1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> DAVID Malan: V redu, dobrodošli nazaj. 3 00:00:12,580 --> 00:00:13,290 To je CS50. 4 00:00:13,290 --> 00:00:15,130 To je začetek sedem teden. 5 00:00:15,130 --> 00:00:18,890 Torej, to je bilo hkrati, tako da sem mislil, da bova se tornado turnejo, kjer smo 6 00:00:18,890 --> 00:00:20,760 končali in kje smo zdaj dogaja. 7 00:00:20,760 --> 00:00:23,310 >> Torej bi to stvar tukaj imajo povzročilo kar nekaj angst na prvi. 8 00:00:23,310 --> 00:00:27,680 Ampak upam, da ste se začeli aklimatizirati, kaj to pomeni tukaj - 9 00:00:27,680 --> 00:00:32,670 zvezda predstavlja kazalec, ki je samo tisto, kar je v pogojih, ki so navadnega je? 10 00:00:32,670 --> 00:00:33,400 Torej je naslov. 11 00:00:33,400 --> 00:00:35,490 >> Torej je naslov nekaj v spomin. 12 00:00:35,490 --> 00:00:38,260 In smo začeli Odlepite plasti Pred nekaj tedni, se take stvari 13 00:00:38,260 --> 00:00:41,800 GetString in druge takšne funkcije Ves ta čas so se vračajo 14 00:00:41,800 --> 00:00:46,010 Naslovi stvari v spominu, kot naslov prvega znaka v 15 00:00:46,010 --> 00:00:46,990 nekateri zaporedje. 16 00:00:46,990 --> 00:00:50,360 >> Tako smo uvedli tudi valgrind, ki boste začeli uporabljati za ta problem 17 00:00:50,360 --> 00:00:53,380 nastaviti, zlasti za naslednji Problem nastaviti tudi. 18 00:00:53,380 --> 00:00:54,980 In valgrind počne kaj za nas? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 Preveri za spomin razpoka, in preverja tudi zaradi zlorabe spomina. 21 00:01:01,020 --> 00:01:05,890 >> Prav tako lahko z določeno stopnjo verjetnosti, odkriti, če je kodo se bo dotaknil spomin 22 00:01:05,890 --> 00:01:07,100 da preprosto ne bi smeli. 23 00:01:07,100 --> 00:01:10,410 Torej ni nujno, da pušča, če pa vas presegajo meje nekaterih 24 00:01:10,410 --> 00:01:14,730 matrika, in jo dejansko vodijo valgrind in povzroči, da je vedenje, medtem ko 25 00:01:14,730 --> 00:01:17,870 valgrind teče v svojem programu, je teče notri, boste dobili 26 00:01:17,870 --> 00:01:21,460 sporočila, kot je ta - "neveljavna pisati o velikost 4 ", ki je spomniti nekaj 27 00:01:21,460 --> 00:01:25,880 tedni je pomenilo, da sem imel po nesreči rad na eni notr predaleč 28 00:01:25,880 --> 00:01:27,250 preko meja matrike. 29 00:01:27,250 --> 00:01:30,790 In tako velikost 4 tukaj pomeni velikost te posebne int. 30 00:01:30,790 --> 00:01:35,260 >> Torej bo zagotovilo v dejstvu, da izhodna valgrind je, oblika tega, 31 00:01:35,260 --> 00:01:36,170 je prav krute. 32 00:01:36,170 --> 00:01:40,180 To je res težko videti skozi nered Za zanimivih informacij. 33 00:01:40,180 --> 00:01:42,910 Torej, kaj smo storili tukaj je samo odlomek nekaj nekaj več 34 00:01:42,910 --> 00:01:43,850 atraktivne proge. 35 00:01:43,850 --> 00:01:46,760 Ampak zavedati, da 80% valgrind je Izhod se bo malo 36 00:01:46,760 --> 00:01:47,650 moteča. 37 00:01:47,650 --> 00:01:52,820 >> Samo iščejo vzorce, kot ti - neveljavna pravico, neveljavna brati, 40 zlogov 38 00:01:52,820 --> 00:01:56,690 in nekaj več blokov so definitivno izgubljen, ključne besede, kot to. 39 00:01:56,690 --> 00:02:01,920 In kaj boste videli, upajmo, nekaj vrsta sledu o tem, kaj deluje 40 00:02:01,920 --> 00:02:03,340 napaka je pravzaprav noter 41 00:02:03,340 --> 00:02:07,195 V tem primeru je tukaj, v kakšnem linija moja koda je bila napaka očitno? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 v datoteki z imenom memory.c, ki je bil Primer smo se igrali z 44 00:02:14,130 --> 00:02:14,890 v času. 45 00:02:14,890 --> 00:02:16,460 Torej, to verjetno ni v funkcije malloc. 46 00:02:16,460 --> 00:02:18,630 Verjetno je bila v moji kodi namesto tega. 47 00:02:18,630 --> 00:02:20,910 Torej bomo to še enkrat videti in spet kmalu. 48 00:02:20,910 --> 00:02:24,080 >> Torej scanf, to je v Nekaj ​​oblik doslej. 49 00:02:24,080 --> 00:02:26,410 Videli smo sscanf kratko. 50 00:02:26,410 --> 00:02:28,330 Bilo je nekaj več boste vrgli v vašem 51 00:02:28,330 --> 00:02:29,535 Priprave na kviz. 52 00:02:29,535 --> 00:02:33,130 In scanf je pravzaprav tisto, kar CS50 Knjižnica je bila uporabo pod 53 00:02:33,130 --> 00:02:36,560 senčilo za kar nekaj časa, da bi da se vnos od uporabnika. 54 00:02:36,560 --> 00:02:40,420 >> Na primer, če sem preiti na CS50 Aparat sem, naj odprejo 55 00:02:40,420 --> 00:02:45,315 Primer je danes, da se imenuje scanf-0.c In to je zelo preprosta. 56 00:02:45,315 --> 00:02:46,590 To je le nekaj vrstic kode. 57 00:02:46,590 --> 00:02:50,880 Ampak to kaže, kako zelo getInt je bilo delo vseh tem trenutku. 58 00:02:50,880 --> 00:02:54,710 >> V tem programu tu, v liniji 16 , Obvestilo, da izjavljam int. 59 00:02:54,710 --> 00:02:57,270 Torej nobenih kazalcev, nič magičnega tam, samo int. 60 00:02:57,270 --> 00:03:00,330 Nato pa v skladu 17, sem hitro uporabnik za več, prosim. 61 00:03:00,330 --> 00:03:02,930 Potem je konec 18., uporabljam scanf tukaj. 62 00:03:02,930 --> 00:03:06,910 In jaz določeno, nekako kot printf, da sem pričakoval ponudbo 63 00:03:06,910 --> 00:03:08,110 konec citata i odstotka. 64 00:03:08,110 --> 00:03:10,920 >> Torej odstotkov i seveda označuje int. 65 00:03:10,920 --> 00:03:14,580 Opazil kaj drugega Trditev, da je scanf. 66 00:03:14,580 --> 00:03:17,350 Kako bi opisali drugi Argument za vejico? 67 00:03:17,350 --> 00:03:19,450 Kaj je to? 68 00:03:19,450 --> 00:03:20,670 >> To je naslov x. 69 00:03:20,670 --> 00:03:25,490 Torej je to koristno, ker z zagotavljanjem scanf z naslovom x, kaj 70 00:03:25,490 --> 00:03:29,560 , ki ga pooblasti to funkcijo, da naredim? 71 00:03:29,560 --> 00:03:33,010 Ne samo tja, ampak tudi kaj storil? 72 00:03:33,010 --> 00:03:34,060 >> Narediti spremembo do nje. 73 00:03:34,060 --> 00:03:38,080 Ker lahko greš tja, to je nekako kot zemljevid z lokacijo v pomnilniku. 74 00:03:38,080 --> 00:03:41,900 In tako dolgo, kot vam zagotavljajo scanf, ali vsaka funkcija s tako zemljevidu, da 75 00:03:41,900 --> 00:03:45,840 Funkcija lahko tja, in ne le pogled na vrednosti, lahko pa se tudi 76 00:03:45,840 --> 00:03:49,670 spremenite to vrednost, kar je uporabno, če namen v življenju scanf je 77 00:03:49,670 --> 00:03:53,060 skeniranje vnosa od uporabnika, zlasti od tipkovnice. 78 00:03:53,060 --> 00:03:57,830 In f označuje oblikovano, tako kot printf, f označuje oblikovano 79 00:03:57,830 --> 00:03:58,930 niz, ki ga želite natisniti. 80 00:03:58,930 --> 00:04:04,430 >> Torej na kratko, ta vrstica 18 preprosto pravi, poskusite prebrati int od uporabnika 81 00:04:04,430 --> 00:04:10,420 Tipkovnica in ga shranite znotraj x, pri glede na naslov x zgodi, da živijo na. 82 00:04:10,420 --> 00:04:14,860 In potem končno, vrstica 19 samo pravi, hvala za notr, v tem primeru. 83 00:04:14,860 --> 00:04:15,940 >> Naj gredo naprej in to. 84 00:04:15,940 --> 00:04:18,570 Zato poskrbite, scanf 0. 85 00:04:18,570 --> 00:04:20,130 Dovolite mi, da gredo naprej in povečate palca 86 00:04:20,130 --> 00:04:22,960 Jaz bom šel in zaženete ta z pike poševnica scanf 0. 87 00:04:22,960 --> 00:04:24,020 Številko, prosim? 88 00:04:24,020 --> 00:04:24,720 50. 89 00:04:24,720 --> 00:04:25,730 Hvala za 50 let. 90 00:04:25,730 --> 00:04:27,270 Tako da je čisto preprosta. 91 00:04:27,270 --> 00:04:28,160 >> Zdaj, kaj se ne dela? 92 00:04:28,160 --> 00:04:29,940 To se ne počne cel kup za preverjanje napak. 93 00:04:29,940 --> 00:04:33,000 Na primer, če ne bom sodeloval, in jaz ne tip v številu, ampak 94 00:04:33,000 --> 00:04:37,860 namesto tega sem nekaj podobnega "zdravo," pišejo to je nekako čudno. 95 00:04:37,860 --> 00:04:41,130 In tako je ena od stvari CS50 Knjižnica je delal za nas, za nekatere 96 00:04:41,130 --> 00:04:43,440 Čas je, da reprompting in reprompting. 97 00:04:43,440 --> 00:04:49,320 >> Ponovno stavek odpoklic je bil v cs50.c, in to je razlog, da getInt v 98 00:04:49,320 --> 00:04:51,670 Knjižnica CS50 je pravzaprav celotna kup dolgih progah, ker smo 99 00:04:51,670 --> 00:04:53,190 preverjanje za neumne stvari, kot je ta. 100 00:04:53,190 --> 00:04:55,730 Ali si ne bi nas, v resnici, int? 101 00:04:55,730 --> 00:04:57,910 Ali on ali ona nam kaj kot črka? 102 00:04:57,910 --> 00:05:01,410 Če je tako, smo želeli odkriti da in kričati na njih. 103 00:05:01,410 --> 00:05:03,915 >> Vendar se stvari bolj zanimivo V naslednjem primeru. 104 00:05:03,915 --> 00:05:09,840 Če grem na scanf-1.c, kar je ena stvar, ki je bistveno spremenila 105 00:05:09,840 --> 00:05:11,135 to naslednji primer? 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 Jaz sem z uporabo char *, seveda, namesto int. 108 00:05:16,010 --> 00:05:19,210 >> Torej, to je zanimivo, ker char * spomnim, je res samo 109 00:05:19,210 --> 00:05:20,190 ista stvar kot niz. 110 00:05:20,190 --> 00:05:23,840 Tako se zdi, kot morda je to super enostavno izvajanje GetString. 111 00:05:23,840 --> 00:05:26,010 Ampak sem odlušči plast v knjižnici CS50, zato sem 112 00:05:26,010 --> 00:05:27,550 kliče ta char * zdaj. 113 00:05:27,550 --> 00:05:30,070 Torej, da vidimo, če se uporablja povsod, gremo narobe. 114 00:05:30,070 --> 00:05:30,840 >> Line 17 - 115 00:05:30,840 --> 00:05:33,950 Ponavljam, prosim dajte mi nekaj, v tem primeru niz. 116 00:05:33,950 --> 00:05:37,940 In nato v naslednji vrstici, kličem scanf, še enkrat, kar daje kodo format, 117 00:05:37,940 --> 00:05:39,310 Tokrat odstotkov s. 118 00:05:39,310 --> 00:05:41,900 In potem je to čas, sem ji daje rezerve. 119 00:05:41,900 --> 00:05:43,550 >> Zdaj opazil, da sem ne uporabljate Znak za. 120 00:05:43,550 --> 00:05:47,120 Toda zakaj je to verjetno v redu tukaj? 121 00:05:47,120 --> 00:05:49,760 Ker kaj je buffer že? 122 00:05:49,760 --> 00:05:50,770 To je že kazalec. 123 00:05:50,770 --> 00:05:51,650 To je že naslov. 124 00:05:51,650 --> 00:05:54,510 >> In da je ta beseda "zmesti," naj me Samo to je klic, na primer, za 125 00:05:54,510 --> 00:05:55,050 preprostost. 126 00:05:55,050 --> 00:05:58,250 Ampak sem pozval, da omili, saj v splošno, načrtovanja, če imate 127 00:05:58,250 --> 00:06:02,130 kos pomnilnika, ki je niz res samo se, morda si to buffer klic. 128 00:06:02,130 --> 00:06:04,460 To je mesto za shranjevanje podatkov. 129 00:06:04,460 --> 00:06:07,400 >> Podobne stvari, kot so YouTube, ko oni buffering, tako rekoč, da 130 00:06:07,400 --> 00:06:10,270 samo pomeni, da je prenos bitov od interneta in jih shranite v 131 00:06:10,270 --> 00:06:14,160 lokalni matrika, lokalna kos pomnilnika, tako da si lahko ogledate pozneje brez 132 00:06:14,160 --> 00:06:16,830 ga preskoči ali visi na ste med predvajanjem. 133 00:06:16,830 --> 00:06:20,930 >> Torej je tukaj problem, čeprav, ker sem povedal scanf, pričakujejo 134 00:06:20,930 --> 00:06:22,320 Niz od uporabnika. 135 00:06:22,320 --> 00:06:24,410 Tukaj je naslov kos pomnilnika. 136 00:06:24,410 --> 00:06:26,180 Dal tam, da niz. 137 00:06:26,180 --> 00:06:31,230 Zakaj je to vezano dati nas težave, čeprav? 138 00:06:31,230 --> 00:06:33,490 >> Kaj je to? 139 00:06:33,490 --> 00:06:35,510 Smem dostop tisti del spomina? 140 00:06:35,510 --> 00:06:36,250 Veš, ne vem. 141 00:06:36,250 --> 00:06:39,210 Ker je pufer inicializiran na kaj? 142 00:06:39,210 --> 00:06:39,820 Ni res. 143 00:06:39,820 --> 00:06:43,090 In tako da je tisto, kar smo se kliče smeti vrednost, ki 144 00:06:43,090 --> 00:06:44,040 ni uradna beseda. 145 00:06:44,040 --> 00:06:49,200 To samo pomeni, da nimamo pojma, kaj bitov so znotraj štirih bajtov, ki 146 00:06:49,200 --> 00:06:51,240 Imam dodeljena kot buffer. 147 00:06:51,240 --> 00:06:52,450 >> Nisem se imenuje malloc. 148 00:06:52,450 --> 00:06:53,940 Sem definitivno ni poklical GetString. 149 00:06:53,940 --> 00:06:56,380 Torej, kdo ve, kaj je dejansko znotraj pufra? 150 00:06:56,380 --> 00:07:00,550 In še povedal scanf slepo, tja in dal vse, kar uporabnik natipkan. 151 00:07:00,550 --> 00:07:04,460 >> Torej, kaj bi lahko povzročilo v našem kodo, če jo vodijo? 152 00:07:04,460 --> 00:07:05,700 Verjetno segfault. 153 00:07:05,700 --> 00:07:07,970 Morda ne, ampak verjetno segfault. 154 00:07:07,970 --> 00:07:10,620 In rečem morda ne zato, ker včasih ti, včasih 155 00:07:10,620 --> 00:07:11,380 ne boste dobili segfault. 156 00:07:11,380 --> 00:07:14,280 Včasih si imel srečo, ampak pa je kljub temu bo 157 00:07:14,280 --> 00:07:15,340 bug v našem programu. 158 00:07:15,340 --> 00:07:17,060 >> Naj gredo naprej in sestavi to. 159 00:07:17,060 --> 00:07:18,280 Jaz bom pa stara šola način narediti. 160 00:07:18,280 --> 00:07:23,825 Torej Jek dash 0, scanf-1, scanf-1.c, Enter. 161 00:07:23,825 --> 00:07:24,720 Ups, tudi stara šola. 162 00:07:24,720 --> 00:07:26,550 Poglejmo. 163 00:07:26,550 --> 00:07:28,440 Kaj sem naredil? 164 00:07:28,440 --> 00:07:29,700 Oh, char * buffer. 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 Oh, hvala - 167 00:07:35,130 --> 00:07:36,930 Shrani, OK - 168 00:07:36,930 --> 00:07:37,690 Zelo stara šola. 169 00:07:37,690 --> 00:07:38,900 V redu, to je bilo hkrati. 170 00:07:38,900 --> 00:07:41,720 >> Tako sem pravkar shranili datoteko po tako, da začasno 171 00:07:41,720 --> 00:07:42,700 spremeniti trenutek nazaj. 172 00:07:42,700 --> 00:07:46,090 In zdaj sem ga pripravljeni ročno z Jek. 173 00:07:46,090 --> 00:07:49,500 In zdaj bom šel naprej in vodijo scanf-1, Enter. 174 00:07:49,500 --> 00:07:50,290 Niz prosim. 175 00:07:50,290 --> 00:07:51,600 Bom tip v "zdravo". 176 00:07:51,600 --> 00:07:54,070 >> In zdaj, tukaj, kjer odkrito, printf Lahko je malo nadležno. 177 00:07:54,070 --> 00:07:56,020 To je dejansko ne bo segfault v tem primeru. 178 00:07:56,020 --> 00:07:59,860 Printf je malo poseben, ker to je tako zelo pogosto uporablja, da 179 00:07:59,860 --> 00:08:03,570 v bistvu printf počne nam uslugo in realizacije, 180 00:08:03,570 --> 00:08:04,830 To ni veljaven kazalec. 181 00:08:04,830 --> 00:08:09,080 Dovolite mi, da se ob sebi, da samo tiskanje v oklepaju nična, čeprav 182 00:08:09,080 --> 00:08:13,340 čeprav to ni nujno tisto, kar smo sami pričakovali. 183 00:08:13,340 --> 00:08:16,940 >> Torej, ne moremo zares preprosto izzvati segfault s tem, vendar je jasno to 184 00:08:16,940 --> 00:08:18,600 ni vedenje sem želel. 185 00:08:18,600 --> 00:08:19,800 Torej, kaj je preprosta rešitev? 186 00:08:19,800 --> 00:08:25,650 No, v scanf-2, naj predlaga namesto da bi dejansko le dodeljevanja 187 00:08:25,650 --> 00:08:30,100 char * Naj se malo pametnejši o to, in mi dodeliti pomnilnika 188 00:08:30,100 --> 00:08:32,940 kot zaporedje 16 znakov. 189 00:08:32,940 --> 00:08:34,200 >> Tako da sem lahko to storite v nekaj načinov. 190 00:08:34,200 --> 00:08:35,610 Jaz bi absolutno uporabljati malloc. 191 00:08:35,610 --> 00:08:38,980 Ampak jaz lahko vrnete na dva tedna, ko je Potreboval sem cel kup 192 00:08:38,980 --> 00:08:39,620 znakov. 193 00:08:39,620 --> 00:08:40,860 To je samo polje. 194 00:08:40,860 --> 00:08:44,870 Naj namesto ponovno buffer da je niz 16 znakov. 195 00:08:44,870 --> 00:08:47,340 >> In zdaj, ko grem mimo buffer v - 196 00:08:47,340 --> 00:08:49,940 in to je nekaj, kar ni govoriti v dveh tednu - 197 00:08:49,940 --> 00:08:53,730 vendar pa lahko zdravljenje matriko kot čeprav je naslov. 198 00:08:53,730 --> 00:08:56,390 Tehnično, kot smo videli, oni malo drugačen. 199 00:08:56,390 --> 00:09:01,290 Vendar scanf ne bo motilo, če ga prenese ime array, ker tisto, kar 200 00:09:01,290 --> 00:09:05,030 Jek bo naredil za nas v bistvu zdravljenje ime te matrike kot 201 00:09:05,030 --> 00:09:08,280 naslov kos 16 bajtov. 202 00:09:08,280 --> 00:09:09,550 >> Torej, to je bolje. 203 00:09:09,550 --> 00:09:12,110 To pomeni, da zdaj ne morem upajmo naredite naslednje. 204 00:09:12,110 --> 00:09:16,800 Naj se pomanjšati za trenutek in storiti, da scanf-2, ki se zbirajo v redu. 205 00:09:16,800 --> 00:09:19,390 Zdaj mi pa dobil poševnica scanf-2. 206 00:09:19,390 --> 00:09:22,430 Niz prosim. "Zdravo." In zdelo, da dela ta čas. 207 00:09:22,430 --> 00:09:26,020 >> Vendar pa lahko nekdo predlaga scenarij , v katerem se ne bi še vedno deluje? 208 00:09:26,020 --> 00:09:28,550 Ja? 209 00:09:28,550 --> 00:09:30,640 Nekaj ​​več kot 16 znakov. 210 00:09:30,640 --> 00:09:32,020 In dejansko, smo lahko malo bolj natančno. 211 00:09:32,020 --> 00:09:36,540 Nekaj ​​več časa kot 15 znakov, saj res moramo imeti v mislih 212 00:09:36,540 --> 00:09:39,920 da moramo to backslash nič implicitno na koncu niza, 213 00:09:39,920 --> 00:09:42,950 , ki je poleg scanf bo praviloma skrbijo za nas. 214 00:09:42,950 --> 00:09:46,210 >> Torej, kaj mi kaj takega - 215 00:09:46,210 --> 00:09:48,040 Včasih smo lahko samo pustite tako. 216 00:09:48,040 --> 00:09:50,630 OK, tako da smo sedaj povzročil naša segmentacije krivda. 217 00:09:50,630 --> 00:09:51,000 Zakaj? 218 00:09:51,000 --> 00:09:54,940 Ker sem tipkal na več kot 15. znakov, zato smo jih dejansko 219 00:09:54,940 --> 00:09:58,280 dotaknil spomin, da sem dejansko ne bi smeli imeti. 220 00:09:58,280 --> 00:10:00,180 >> Torej, kaj je res rešitev tukaj? 221 00:10:00,180 --> 00:10:02,210 No, kaj pa če smo morali daljši niz? 222 00:10:02,210 --> 00:10:03,960 No, morda bi bilo 32 bajtov. 223 00:10:03,960 --> 00:10:05,160 No, kaj pa če to ni dovolj dolgo? 224 00:10:05,160 --> 00:10:06,040 Kako približno 64 bitov? 225 00:10:06,040 --> 00:10:07,080 Kaj pa, če to ni dovolj dolgo? 226 00:10:07,080 --> 00:10:09,640 Kako približno 128 ali 200 bajtov? 227 00:10:09,640 --> 00:10:12,660 Kaj je res rešitev tukaj v splošno velja, če ne vemo, v 228 00:10:12,660 --> 00:10:14,460 vnaprej, kaj si bo tip? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> To je nekako velik trn v peti, če sem iskren, zaradi česar 231 00:10:23,050 --> 00:10:29,050 CS50 knjižnica ima nekaj deset vrstic Koda, ki skupaj izvajajo 232 00:10:29,050 --> 00:10:32,390 GetString niz, na način, da ne bomo vedeti vnaprej, kaj 233 00:10:32,390 --> 00:10:33,430 Uporabnik se dogaja na vrsto. 234 00:10:33,430 --> 00:10:37,370 Še posebej, če se ozremo na cs50.c pred dvema tednoma, boste videli 235 00:10:37,370 --> 00:10:40,480 da GetString resnici počne Ne uporabljajte scanf na ta način. 236 00:10:40,480 --> 00:10:43,720 Namesto, prebere en znak naenkrat. 237 00:10:43,720 --> 00:10:46,010 >> Ker je ena lepa stvar branje en znak je, da smo lahko 238 00:10:46,010 --> 00:10:48,490 zagotoviti, da bomo vedno vsaj en sloj. 239 00:10:48,490 --> 00:10:51,740 Jaz lahko samo ugotovi, char, in nato vzemite ti resnično otroške korake, da samo 240 00:10:51,740 --> 00:10:54,380 prebral en znak ob Čas od tipkovnice. 241 00:10:54,380 --> 00:10:58,240 In potem, kaj boste videli GetString pa je vsakič, ko zmanjka, 242 00:10:58,240 --> 00:11:02,280 recimo, 16 bitov pomnilnika, ki jih uporablja malloc ali njegov bratranec, da 243 00:11:02,280 --> 00:11:06,810 dodeliti več pomnilnika, kopiranje stara spomin na novo, nato pa plazenje 244 00:11:06,810 --> 00:11:09,900 skupaj, dobili en znak naenkrat, in ko zmanjka da 245 00:11:09,900 --> 00:11:13,370 kos pomnilnika, ga vrže proč, grabeži večji kos pomnilnika, kopira stare 246 00:11:13,370 --> 00:11:14,750 v nove in ponovitev. 247 00:11:14,750 --> 00:11:18,480 In to je resnično bolečino, da dejansko izvajati nekaj tako preprostega, kot 248 00:11:18,480 --> 00:11:19,710 pridobivanje vnosa od uporabnika. 249 00:11:19,710 --> 00:11:21,090 >> Tako da lahko uporabite scanf. 250 00:11:21,090 --> 00:11:22,430 Lahko uporabite druge podobne funkcije. 251 00:11:22,430 --> 00:11:25,420 In veliko učbenikov in na spletu primerov res, ampak oni so vse 252 00:11:25,420 --> 00:11:27,210 dovzetni za probleme, kot je ta. 253 00:11:27,210 --> 00:11:29,550 In na koncu, pridobivanje segfault je nekako nadležno. 254 00:11:29,550 --> 00:11:30,680 To ni dobro za uporabnika. 255 00:11:30,680 --> 00:11:33,560 >> Ampak v najslabšem primeru, kaj je bistveno Put Your 256 00:11:33,560 --> 00:11:37,160 koda grozi? 257 00:11:37,160 --> 00:11:39,250 Nekakšen napad, potencialno. 258 00:11:39,250 --> 00:11:41,680 Pogovarjali smo se o enem takem napadu - zvrhano kup. 259 00:11:41,680 --> 00:11:44,660 Ampak na splošno, če ste dovoljeno overflow buffer, kot smo 260 00:11:44,660 --> 00:11:48,070 Pred nekaj tedni, s samo pisno več kot "zdravo" na kupu, si 261 00:11:48,070 --> 00:11:52,330 lahko dejansko prevzel, potencialno računalnik, ali vsaj dobili na podatke, ki 262 00:11:52,330 --> 00:11:53,510 ne pripada tebi. 263 00:11:53,510 --> 00:11:55,970 >> Torej na kratko, to je, zakaj imamo ta kolesa usposabljanja. 264 00:11:55,970 --> 00:11:59,090 Ampak zdaj smo začeli, da jih vzlet, kot naši programi ne potrebujejo več, 265 00:11:59,090 --> 00:12:00,610 nujno, vhod od uporabnika. 266 00:12:00,610 --> 00:12:03,960 Vendar pa v primeru težav iz šest, vaš prispevek bo prišel iz velike 267 00:12:03,960 --> 00:12:07,520 slovar datoteka z 150 nekaterimi ak tisoč besed. 268 00:12:07,520 --> 00:12:10,330 >> Tako vam ne bo treba skrbeti za uporabnikov samovoljno vhod. 269 00:12:10,330 --> 00:12:13,720 Mi vam bo dala nekaj predpostavk O tej datoteki. 270 00:12:13,720 --> 00:12:20,340 Vsa vprašanja glede nasvetov ali scanf ali uporabnik vložek na splošno? 271 00:12:20,340 --> 00:12:24,450 >> Vse je v redu, tako da hiter pogled, potem v enem zamujala temo iz pred dvema tednoma. 272 00:12:24,450 --> 00:12:28,590 In da je bil ta pojem struct. 273 00:12:28,590 --> 00:12:34,180 Ali ni to - to pojem struct, ki je bil kaj? 274 00:12:34,180 --> 00:12:35,430 Kaj struct naredil za nas? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> Določite - 277 00:12:39,860 --> 00:12:41,710 žal? 278 00:12:41,710 --> 00:12:42,820 Določite vrsto spremenljivke. 279 00:12:42,820 --> 00:12:44,410 Tako nekako. 280 00:12:44,410 --> 00:12:46,180 Mi smo dejansko združuje dve temi. 281 00:12:46,180 --> 00:12:49,510 Torej s typedef, opozarjajo, da smo lahko razglasi vrsto naših, kot 282 00:12:49,510 --> 00:12:51,500 sinonim, kot niz za char *. 283 00:12:51,500 --> 00:12:56,200 Vendar z uporabo typedef in struct, smo lahko ustvariti resnično lastne podatkovne strukture. 284 00:12:56,200 --> 00:12:59,600 >> Na primer, če grem nazaj v gedit tu le za trenutek, in sem šel naprej 285 00:12:59,600 --> 00:13:08,230 in narediti nekaj takega, mi prihranili To so, recimo, structs.c 286 00:13:08,230 --> 00:13:10,840 začasno, grem da gredo naprej in vključi 287 00:13:10,840 --> 00:13:14,360 standardio.h, int main neveljavne. 288 00:13:14,360 --> 00:13:18,960 In potem je tukaj, domnevam, da želim napisati program, ki shranjuje 289 00:13:18,960 --> 00:13:21,840 več študentov iz več hiše, npr. 290 00:13:21,840 --> 00:13:24,430 Tako da je kot registrarial baza neke vrste. 291 00:13:24,430 --> 00:13:29,550 >> Torej, če rabim ime enega študenta, sem lahko naredite nekaj takega char * ime, 292 00:13:29,550 --> 00:13:31,570 in bom naredil nekaj podobnega - 293 00:13:31,570 --> 00:13:34,410 pravzaprav, kaj je uporabo knjižnice CS50 le za trenutek, da bi to 294 00:13:34,410 --> 00:13:38,380 malo lažje, tako da bomo lahko sposodim tiste ducate vrstic kode. 295 00:13:38,380 --> 00:13:39,340 In kaj je samo keep it simple. 296 00:13:39,340 --> 00:13:42,610 Mi bomo še naprej, da niz in zdaj GetString. 297 00:13:42,610 --> 00:13:47,420 >> Tako da sem zdaj trdijo, da sem shranili ime nekega študenta, in hišo 298 00:13:47,420 --> 00:13:50,240 nekateri študent, preprosto uporabo spremenljivk kot smo v enem tednu. 299 00:13:50,240 --> 00:13:52,370 Recimo jaz zdaj želim podpirati več študentov. 300 00:13:52,370 --> 00:13:58,460 V redu, torej moj instinkt, da naredimo Niz ime2, dobi GetString, niz 301 00:13:58,460 --> 00:14:01,370 house2 dobi GetString. 302 00:14:01,370 --> 00:14:05,850 In potem je naš tretji študent, Naredimo name3 GetString. 303 00:14:05,850 --> 00:14:09,170 >> Vse je v redu, tako da je to, upajmo presenetljiv ste kot vrste neumen, 304 00:14:09,170 --> 00:14:11,580 ker je ta postopek zelo nikoli bo konec, in to je šele tekoč 305 00:14:11,580 --> 00:14:13,130 da moja koda videti slabše in slabše in slabše. 306 00:14:13,130 --> 00:14:14,810 Vendar smo to rešili tudi v dva tedna. 307 00:14:14,810 --> 00:14:19,450 Kakšna je bila naša relativno čista rešitev ko smo imeli več spremenljivk 308 00:14:19,450 --> 00:14:23,580 isto vrsto podatkov, ki so med seboj povezani, vendar nismo želeli te krute nered 309 00:14:23,580 --> 00:14:26,870 za podobno poimenovanih spremenljivk? 310 00:14:26,870 --> 00:14:30,060 Kaj smo storili namesto tega? 311 00:14:30,060 --> 00:14:31,260 >> Zato mislim, da sem slišal nekaj mest. 312 00:14:31,260 --> 00:14:32,590 Imeli smo niz. 313 00:14:32,590 --> 00:14:37,110 Če želite več primerkov kaj, zakaj ne bi čisto vse to 314 00:14:37,110 --> 00:14:39,540 gor in samo reči, da me je matrika se imenuje imena? 315 00:14:39,540 --> 00:14:41,640 >> In za zdaj, kaj je trdo kodo 3. 316 00:14:41,640 --> 00:14:44,450 In mi je potem dal še en niz imenovano hiše, in naj mi za 317 00:14:44,450 --> 00:14:45,800 zdaj težko koda 3. 318 00:14:45,800 --> 00:14:49,220 In sem močno očistiti nered, ki sem ga pravkar ustvarili. 319 00:14:49,220 --> 00:14:52,400 Zdaj pa sem še vedno težko kodirane 3, ampak tudi 3. lahko dinamično prihajajo iz 320 00:14:52,400 --> 00:14:54,350 uporabnika ali argv ali podobno. 321 00:14:54,350 --> 00:14:55,720 Torej, to je že čistejši. 322 00:14:55,720 --> 00:15:00,100 >> Ampak kaj je moteč pri tem je, da Zdaj, čeprav ime je nekako 323 00:15:00,100 --> 00:15:02,280 bistveno povezana z študentske hiša - 324 00:15:02,280 --> 00:15:04,720 je študent, da sem res želeli predstaviti - 325 00:15:04,720 --> 00:15:08,080 Sedaj imam dva polja, ki so vzporedne v smislu, da oni 326 00:15:08,080 --> 00:15:13,930 enake velikosti in imena konzola 0 predvidoma zemljevide hiše razred 0, 327 00:15:13,930 --> 00:15:16,600 in imena bracket 1 zemljevidov do hiš nosilec 1. 328 00:15:16,600 --> 00:15:19,280 Z drugimi besedami, da študent živi v da je hiša, in da drugi študent 329 00:15:19,280 --> 00:15:20,530 živi v tej drugi hiši. 330 00:15:20,530 --> 00:15:23,720 Ampak zagotovo bi to lahko bilo Še bolj pa čisto. 331 00:15:23,720 --> 00:15:24,990 >> No, lahko, v resnici. 332 00:15:24,990 --> 00:15:28,730 In mi gredo naprej in odprite up structs.h, in boste 333 00:15:28,730 --> 00:15:31,130 glej to idejo tukaj. 334 00:15:31,130 --> 00:15:34,905 Obvestilo, da Uporabil sem typedef, kot ti Omenil trenutek nazaj k izjavi naše 335 00:15:34,905 --> 00:15:35,570 lastni podatkovni tip. 336 00:15:35,570 --> 00:15:39,660 Ampak jaz sem tudi s tem drugo ključno besedo imenovano struct, ki mi daje novo 337 00:15:39,660 --> 00:15:40,790 struktura podatkov. 338 00:15:40,790 --> 00:15:43,980 >> In ta struktura podatki Trdim se dogaja da imajo dvoje znotraj 339 00:15:43,980 --> 00:15:47,060 je - niz se imenuje ime in Niz se imenuje hiša. 340 00:15:47,060 --> 00:15:49,820 In ime bom dal ta struktura podatkov se dogaja 341 00:15:49,820 --> 00:15:51,005 da se imenuje študent. 342 00:15:51,005 --> 00:15:54,030 Jaz bi ga poklical kar hočem, vendar pomensko da 343 00:15:54,030 --> 00:15:55,810 občutek, da me v mojih mislih. 344 00:15:55,810 --> 00:15:59,160 >> Torej, zdaj, če sem odprla boljšo različico programa sem začel pisati 345 00:15:59,160 --> 00:16:00,390 tam, naj se pomaknite na vrhu. 346 00:16:00,390 --> 00:16:03,190 In tu je še nekaj vrstic kode tukaj, ampak naj se osredotoči na 347 00:16:03,190 --> 00:16:04,160 Trenutek na ena. 348 00:16:04,160 --> 00:16:07,790 Sem prijavljeni konstantno imenovane študente in težko kodirane 3 za zdaj. 349 00:16:07,790 --> 00:16:11,110 Toda zdaj, opazili, kako čista moja koda se začne, da bi dobili. 350 00:16:11,110 --> 00:16:15,030 >> V vrstico 22, izjavljam, matrika študentov. 351 00:16:15,030 --> 00:16:18,760 In opazili, da je študent očitno Zdaj podatkovni tip. 352 00:16:18,760 --> 00:16:23,360 Ker je na vrhu te datoteke, opazili Sem vključen da glavo datoteke 353 00:16:23,360 --> 00:16:24,820 da sem potegnil ravno pred nekaj trenutki. 354 00:16:24,820 --> 00:16:28,820 In da je glava datoteke preprosto je Ta definicija študenta. 355 00:16:28,820 --> 00:16:32,470 >> Torej, zdaj, ki sem jih ustvaril svoje lastne podatke po meri Tip, da so avtorji C letih 356 00:16:32,470 --> 00:16:33,890 Pred ni misliti vnaprej. 357 00:16:33,890 --> 00:16:34,570 Ampak ni problema. 358 00:16:34,570 --> 00:16:35,870 Lahko naredim sam. 359 00:16:35,870 --> 00:16:39,050 Torej, to je niz imenujemo študentov, vsaka od katerega člani 360 00:16:39,050 --> 00:16:41,100 je študent struktura. 361 00:16:41,100 --> 00:16:44,270 In hočem tri tistih v matriki. 362 00:16:44,270 --> 00:16:46,030 >> In zdaj, kaj pa ostalo tega programa narediti? 363 00:16:46,030 --> 00:16:47,550 Potreboval sem nekaj malo samovoljno. 364 00:16:47,550 --> 00:16:51,450 Torej iz spletnega 24 dalje, Ponovil bom od 0 do 3. 365 00:16:51,450 --> 00:16:54,000 Nato sem vprašal uporabnika za študenta ime. 366 00:16:54,000 --> 00:16:56,110 In potem sem uporabo GetString kot prej. 367 00:16:56,110 --> 00:16:59,410 Potem sem prosil za študenta hiši, in jaz raba GetString kot prej. 368 00:16:59,410 --> 00:17:01,780 >> Ampak obvestilo - malo novo kos sintakse - 369 00:17:01,780 --> 00:17:07,010 Ne morem še indeks i-tega študenta, ampak kako pridem na specifičnih podatkov 370 00:17:07,010 --> 00:17:08,354 polje znotraj struct? 371 00:17:08,354 --> 00:17:11,770 No, kaj je očitno nov del sintakse? 372 00:17:11,770 --> 00:17:13,339 To je samo izvajalec pika. 373 00:17:13,339 --> 00:17:14,510 >> Mi smo v resnici ne videl pred tem. 374 00:17:14,510 --> 00:17:17,819 Videl si jo v pset petih če ste končal v že s bitnih datotek. 375 00:17:17,819 --> 00:17:22,372 Toda pika pomeni samo znotraj tega struct ali več polj, daje piko 376 00:17:22,372 --> 00:17:24,510 ime, ali pa me pika hišo. 377 00:17:24,510 --> 00:17:28,690 To pomeni, da gre v notranjosti struct in dobili tiste posamezna področja. 378 00:17:28,690 --> 00:17:30,200 >> Kaj pa preostali del tega programa narediti? 379 00:17:30,200 --> 00:17:31,190 To pa še ni vse, da je seksi. 380 00:17:31,190 --> 00:17:34,640 Obvestilo, da sem spet ponoviti od 0 do 3, in sem preprosto ustvarite Angleški 381 00:17:34,640 --> 00:17:40,500 Stavek kot tako in tako v kot in taka hiša, ki poteka v dot imena iz 382 00:17:40,500 --> 00:17:43,320 i-študent in njihovi Hiša, kot dobro. 383 00:17:43,320 --> 00:17:47,560 >> In potem končno, zdaj bomo začeli, da bi dobili analni o tem, zdaj, ko smo 384 00:17:47,560 --> 00:17:49,580 seznanjeni s tem, kaj malloc in druge funkcije so bile 385 00:17:49,580 --> 00:17:50,570 delal ves ta čas. 386 00:17:50,570 --> 00:17:54,220 Zakaj moram sprostiti tako ime in hiša, čeprav sem 387 00:17:54,220 --> 00:17:56,960 ni poklical malloc? 388 00:17:56,960 --> 00:17:58,020 >> GetString storil. 389 00:17:58,020 --> 00:18:00,930 In to je bilo umazano malo skrivnost nekaj tednov, vendar pa ima GetString 390 00:18:00,930 --> 00:18:03,530 bili pušča spomin vsem dajo vse semester doslej. 391 00:18:03,530 --> 00:18:05,990 In valgrand bo končno razkrivajo to, da nas. 392 00:18:05,990 --> 00:18:10,730 >> Ampak to ni nič takega, ker vem, da sem lahko preprosto osvoboditi ime 393 00:18:10,730 --> 00:18:15,750 in hiša, čeprav tehnično, da je super, super varno, bi moral biti 394 00:18:15,750 --> 00:18:17,890 delaš nekaj preverjanje napak tukaj. 395 00:18:17,890 --> 00:18:19,040 Kaj so vaše instinkt vam pove? 396 00:18:19,040 --> 00:18:22,480 Kaj bi moral biti preverjanje za preden sem se sprostila, kar je 397 00:18:22,480 --> 00:18:25,470 Niz, ki alias char *? 398 00:18:25,470 --> 00:18:33,460 >> Jaz bi res preverjanje, če študente Nosilec i pika ime ne 399 00:18:33,460 --> 00:18:34,840 enaka null. 400 00:18:34,840 --> 00:18:40,400 Potem bo vse v redu, da gredo naprej in brez da kazalec in isti ali drugi 401 00:18:40,400 --> 00:18:41,160 kot eno dobro. 402 00:18:41,160 --> 00:18:46,860 Če študent nosilec i pika hiša ni enak null, bo to zdaj zaščitili 403 00:18:46,860 --> 00:18:52,520 proti primeru kota, v katerem GetString vrne nekaj podobnega nična. 404 00:18:52,520 --> 00:18:57,310 In smo videli pred nekaj trenutki, printf bo nas ščitijo tu gor ga samo pravim 405 00:18:57,310 --> 00:18:58,990 null, ki bo videti čudno. 406 00:18:58,990 --> 00:19:02,340 Ampak vsaj ne bo segfault, kot smo videli. 407 00:19:02,340 --> 00:19:05,990 >> No, naj stori eno stvar tukaj. konstrukti-0 je nekako neumno programa 408 00:19:05,990 --> 00:19:09,700 ker sem vnesete vse te podatke, nato pa to je izgubljen, ko se program konča. 409 00:19:09,700 --> 00:19:10,940 Ampak naj gredo naprej in to. 410 00:19:10,940 --> 00:19:12,830 Naj terminal Okno malo večji. 411 00:19:12,830 --> 00:19:17,000 Naj konstrukti-1, ki je nova različica tega. 412 00:19:17,000 --> 00:19:18,520 >> Bom povečate malo. 413 00:19:18,520 --> 00:19:21,620 In zdaj mi teče piko poševnica konstrukti-1. 414 00:19:21,620 --> 00:19:22,590 Ime študenta - 415 00:19:22,590 --> 00:19:31,500 David Mather, kaj je naredil Rob Kirkland, Naredimo Lauren Leverett. 416 00:19:31,500 --> 00:19:33,650 Zanimivo je zdaj Obvestilo - 417 00:19:33,650 --> 00:19:35,540 in vem samo to, ker Napisal sem program - 418 00:19:35,540 --> 00:19:38,930 tam je slika zdaj na moj trenutni Imenik imenuje students.csv. 419 00:19:38,930 --> 00:19:40,420 Nekateri ste morda videli ti v resničnem svetu. 420 00:19:40,420 --> 00:19:42,980 >> Kaj je datoteka CSV? 421 00:19:42,980 --> 00:19:44,170 Ločene z vejico vrednosti. 422 00:19:44,170 --> 00:19:46,670 To je nekako tako kot revež je različica Excelove datoteke. 423 00:19:46,670 --> 00:19:50,580 To je tabela vrstic in stolpcev, ki lahko odprete v programu, kot je Excel, 424 00:19:50,580 --> 00:19:51,800 ali številke na Macu. 425 00:19:51,800 --> 00:19:55,180 >> In če to datoteko odprem tukaj na gedit, Obvestilo - in številke niso tam. 426 00:19:55,180 --> 00:19:57,360 To je samo Gedit povedal mi številke vrstic. 427 00:19:57,360 --> 00:19:59,740 Obvestilo o prvi vrsti je to Datoteka je David in Mather. 428 00:19:59,740 --> 00:20:01,450 Naslednja vrstica je Rob vejica Kirkland. 429 00:20:01,450 --> 00:20:04,170 In tretji vrstici je Lauren vejica Leverett. 430 00:20:04,170 --> 00:20:05,480 >> Torej, kaj sem ustvaril? 431 00:20:05,480 --> 00:20:09,580 Jaz sem zdaj napisal program C, ki dejansko lahko ustvari preglednic 432 00:20:09,580 --> 00:20:11,840 da je mogoče odpreti v program, kot so Excel. 433 00:20:11,840 --> 00:20:15,520 Ni vse tako prepričljiv niz podatkov, vendar Če imate veliko večje kose 434 00:20:15,520 --> 00:20:18,440 Podatki, ki jih dejansko želijo manipulirati in da grafov in 435 00:20:18,440 --> 00:20:21,260 všeč, je to morda ena način za ustvarjanje teh podatkov. 436 00:20:21,260 --> 00:20:25,370 Poleg tega CSVs so dejansko zelo pogosti samo za shranjevanje podatkov, preprost - 437 00:20:25,370 --> 00:20:28,940 Yahoo Finance, na primer, če dobiš borzne tečaje preko njihove tako imenovane 438 00:20:28,940 --> 00:20:33,180 API, brezplačna storitev, ki vam omogoča trenutnega up-to-najnovejše parka 439 00:20:33,180 --> 00:20:35,650 kotacije za podjetja, ki jih dati podatke nazaj v 440 00:20:35,650 --> 00:20:37,800 super enostavna CSV formatu. 441 00:20:37,800 --> 00:20:39,380 >> Torej, kako bomo to naredili? 442 00:20:39,380 --> 00:20:42,530 No opazili, večina ta program je skoraj enaka. 443 00:20:42,530 --> 00:20:46,870 Opazil sem dol, namesto print študenti ven, on line 35 444 00:20:46,870 --> 00:20:51,040 naprej, trdim, da hranim študenti na disku, tako varčevanje datoteko. 445 00:20:51,040 --> 00:20:53,630 >> Torej, opazil sem razglasitvi FILE * - 446 00:20:53,630 --> 00:20:57,260 Zdaj, to je neke vrste nepravilnost v C. Za katerega koli razloga, FILE vsi pokrovčki, 447 00:20:57,260 --> 00:21:00,690 kar ni tako kot večina drugih podatkovnih tipov v C. To pa je vgrajen 448 00:21:00,690 --> 00:21:02,320 vrsta podatkov, FILE *. 449 00:21:02,320 --> 00:21:05,900 In jaz razglasitvi kazalec na datoteko, je, kako si lahko zamislite, da. 450 00:21:05,900 --> 00:21:08,070 >> fopen pomeni odprto datoteko. 451 00:21:08,070 --> 00:21:09,470 Kaj datoteka ne želite odpreti? 452 00:21:09,470 --> 00:21:12,620 Želim odpreti datoteko, da bom samovoljno pokličite students.csv. 453 00:21:12,620 --> 00:21:14,480 Jaz bi lahko rekli, da karkoli želim. 454 00:21:14,480 --> 00:21:15,200 >> In potem ugibati. 455 00:21:15,200 --> 00:21:18,960 Kaj drugi argument za fopen verjetno pomenilo? 456 00:21:18,960 --> 00:21:21,480 Pravica, w za odpis, lahko je r za branje. 457 00:21:21,480 --> 00:21:24,120 Tam je za append če želite dodati vrstice in ne 458 00:21:24,120 --> 00:21:25,200 prepiše vso stvar. 459 00:21:25,200 --> 00:21:28,005 >> Ampak samo želim ustvariti to datoteko enkrat, tako da bom uporabiti quote citata w. 460 00:21:28,005 --> 00:21:31,880 In vem, da je le od tega, da se glasi dokumentacijo, ali stran človek. 461 00:21:31,880 --> 00:21:35,100 Če datoteka ni nič - z drugimi besedami, če nič šel tja narobe - 462 00:21:35,100 --> 00:21:37,820 Naj Ponovil preko študenti 0-3. 463 00:21:37,820 --> 00:21:40,410 >> In sedaj opazili, da je nekaj kdaj tako nekoliko drugačna 464 00:21:40,410 --> 00:21:42,110 O line 41 tukaj. 465 00:21:42,110 --> 00:21:42,960 To ni printf. 466 00:21:42,960 --> 00:21:46,530 To je ovrednotenj za datoteke printf. 467 00:21:46,530 --> 00:21:47,790 Tako se dogaja, da pisati v datoteko. 468 00:21:47,790 --> 00:21:48,860 Katere datoteke? 469 00:21:48,860 --> 00:21:53,630 Tisti, katerega kazalec podate kot prvi argument. 470 00:21:53,630 --> 00:21:55,940 >> Potem smo določite oblikovnega niza. 471 00:21:55,940 --> 00:21:59,660 Potem smo opredeliti, kaj niz želimo plug za prvo odstotkov sekund, in 472 00:21:59,660 --> 00:22:04,320 nato pa še spremenljiva ali Drugi odstotkov s. 473 00:22:04,320 --> 00:22:06,760 Nato zapremo datoteko z fclose. 474 00:22:06,760 --> 00:22:09,380 Kot sem osvobodil spomin kot prej, čeprav Moral bi iti nazaj in dodajte 475 00:22:09,380 --> 00:22:10,540 nekateri pregledi za nično. 476 00:22:10,540 --> 00:22:12,090 >> In to je to. 477 00:22:12,090 --> 00:22:16,960 fopen, ovrednotenj, fclose mi daje Sposobnost, da ustvarite besedilne datoteke. 478 00:22:16,960 --> 00:22:19,640 Zdaj boste videli na problem nizu petih, ki vključuje slike, boste uporabljali 479 00:22:19,640 --> 00:22:20,990 binarne datoteke namesto tega. 480 00:22:20,990 --> 00:22:24,200 Ampak bistveno pa je, ideja je ista, čeprav funkcije, ki jih boste 481 00:22:24,200 --> 00:22:28,710 videti je malo drugačen. 482 00:22:28,710 --> 00:22:32,580 >> Torej tornado turnejo, vendar boste dobili vse preveč seznanjeni z datoteko I/O-- 483 00:22:32,580 --> 00:22:34,960 vhod in izhod - s pset pet. 484 00:22:34,960 --> 00:22:38,607 In vsa vprašanja o začetne osnove tukaj? 485 00:22:38,607 --> 00:22:39,857 Ja? 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> Kaj pa, če boste poskušali osvoboditi ničelno vrednost? 488 00:22:43,710 --> 00:22:48,880 Verjamem, razen če je prost gotten malo bolj prijazen, lahko 489 00:22:48,880 --> 00:22:49,890 potencialno segfault. 490 00:22:49,890 --> 00:22:54,160 Mimo je null je slabo, ker jaz ne Menim brezplačno moti, da preverite za vas, 491 00:22:54,160 --> 00:22:57,330 ker bi to lahko bilo odpadki časa za to, da se naredi za 492 00:22:57,330 --> 00:22:59,022 vsi na svetu. 493 00:22:59,022 --> 00:23:00,590 Dobro vprašanje, čeprav. 494 00:23:00,590 --> 00:23:04,300 >> Vse je v redu, tako da je ta vrsta dobi nam zanimivo temo. 495 00:23:04,300 --> 00:23:07,010 Tema problem niz pet je forenziki. 496 00:23:07,010 --> 00:23:08,420 Vsaj to, da je del na problem niza. 497 00:23:08,420 --> 00:23:12,030 Forenziki so na splošno nanaša na obnovitev podatkov, ki lahko ali 498 00:23:12,030 --> 00:23:14,110 ne smejo izbrisati namerno. 499 00:23:14,110 --> 00:23:18,680 In tako sem mislil, da sem vam hitro okus, kaj se v resnici dogaja vse 500 00:23:18,680 --> 00:23:21,230 tokrat pod Pokrov računalnika. 501 00:23:21,230 --> 00:23:23,960 >> Na primer, če imate znotraj vašega prenosni računalnik ali vaš namizni računalnik 502 00:23:23,960 --> 00:23:28,040 trdega diska, je bodisi mehansko Naprava, ki se dejansko vrti - 503 00:23:28,040 --> 00:23:31,650 tam je krožne stvari imenovane plošče , ki izgledajo precej všeč, kar sem 504 00:23:31,650 --> 00:23:34,540 ravnokar na zaslonu tukaj, čeprav To je vse bolj stara šola. 505 00:23:34,540 --> 00:23:37,370 To je tri in pol palčni trdi disk. 506 00:23:37,370 --> 00:23:40,070 In tri in pol cm nanaša na z dne stvar, ko jo namestite 507 00:23:40,070 --> 00:23:40,890 v računalniku. 508 00:23:40,890 --> 00:23:44,890 >> Mnogi od vas fantje v svojih prenosnih računalnikov zdaj imajo SSD diske ali SSD, 509 00:23:44,890 --> 00:23:46,260 ki nimajo gibljivih delov. 510 00:23:46,260 --> 00:23:49,170 Oni so bolj kot RAM in manj kot te mehanske naprave. 511 00:23:49,170 --> 00:23:51,450 Toda ideje so še vedno enaka, Vsekakor se nanašajo 512 00:23:51,450 --> 00:23:52,790 da problem nastaviti pet. 513 00:23:52,790 --> 00:23:57,400 >> In če pomislite zdaj trdi disk predstavlja čemer krog, ki 514 00:23:57,400 --> 00:23:58,930 Pritegnil bom takole tukaj. 515 00:23:58,930 --> 00:24:02,290 Ko ustvarite datoteko na vašem računalniku, ali je SSD, ali 516 00:24:02,290 --> 00:24:06,610 V tem primeru starejša šola trdega diska, da datoteka vsebuje več bitov. 517 00:24:06,610 --> 00:24:10,510 Recimo, da je to 0 in 1, cel kup 0s in 1s. 518 00:24:10,510 --> 00:24:11,660 Torej je to moja celotna trdi disk. 519 00:24:11,660 --> 00:24:13,225 To je očitno precej velika datoteka. 520 00:24:13,225 --> 00:24:18,080 In to je porabil 0s in 1s v tistem Del fizičnega krožnik. 521 00:24:18,080 --> 00:24:19,750 >> No, kaj je to fizično del? 522 00:24:19,750 --> 00:24:25,310 No, izkazalo se je, da je na trdem disku, vsaj te vrste, obstaja 523 00:24:25,310 --> 00:24:27,340 Ti mali magnetni delci. 524 00:24:27,340 --> 00:24:32,630 In v bistvu so imeli proti severu in južni pol do njih, tako da, če ste 525 00:24:32,630 --> 00:24:35,710 pa enega od teh magnetnih delcev Na ta način, bi lahko rekli, da je to 526 00:24:35,710 --> 00:24:36,720 predstavlja 1. 527 00:24:36,720 --> 00:24:39,340 In če je obrnjena proti jugu do severno, bi lahko rekli, da je to 528 00:24:39,340 --> 00:24:40,390 predstavlja 0. 529 00:24:40,390 --> 00:24:43,660 >> Torej, v realnem fizičnem svetu, to je kako si lahko predstavljajo nekaj v 530 00:24:43,660 --> 00:24:45,670 binarni stanje 0 in 1. 531 00:24:45,670 --> 00:24:46,720 Tako, da je vse datoteka. 532 00:24:46,720 --> 00:24:49,300 Obstaja cel kup magnetno Delci, ki so njihova ta način, ali 533 00:24:49,300 --> 00:24:51,920 Na ta način ustvarjajo vzorci v 0s in 1s. 534 00:24:51,920 --> 00:24:56,760 >> Izkaže pa se, ko shranite datoteko, nekateri podatki so shranjeni ločeno. 535 00:24:56,760 --> 00:25:00,000 Torej je to malo miza imenik, tako rekoč. 536 00:25:00,000 --> 00:25:05,810 In poklical bom to ime stolpca, in Poklical bom to mesto stolpca. 537 00:25:05,810 --> 00:25:08,850 >> In jaz bom rekel, domnevam to je moj življenjepis. 538 00:25:08,850 --> 00:25:14,050 Moj resume.doc je shranjena na lokacijo, recimo 123. 539 00:25:14,050 --> 00:25:15,390 Vedno sem šel za to številko. 540 00:25:15,390 --> 00:25:18,810 Ampak je dovolj reči, da tako kot v RAM, si lahko trdi disk 541 00:25:18,810 --> 00:25:22,350 to je gigabajt ali 200 gigabajtov ali terabajt, in lahko 542 00:25:22,350 --> 00:25:23,750 Število vseh bajtov. 543 00:25:23,750 --> 00:25:26,480 Lahko oštevilčiti vse kose 8 bitov. 544 00:25:26,480 --> 00:25:29,030 >> Tako bomo rekli, da je to je lokacija 123. 545 00:25:29,030 --> 00:25:32,070 Torej ta imenik znotraj mojega delovanja Sistem si zapomni, da je moja 546 00:25:32,070 --> 00:25:34,250 spet je na lokaciji 123. 547 00:25:34,250 --> 00:25:36,850 Vendar pa postane zanimivo, ko datoteko izbrišete. 548 00:25:36,850 --> 00:25:37,820 >> Tako na primer - 549 00:25:37,820 --> 00:25:40,790 in na srečo je večina sveta ima ujeli na to - kaj se zgodi, ko 550 00:25:40,790 --> 00:25:45,040 povlečete datoteko na računalniku Mac OS Smetnjak ali vaš Windows Recycle Bin? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 Kaj je namen s tem? 553 00:25:50,510 --> 00:25:53,860 To je očitno, da se znebite datoteke, ampak kaj dejanje povlečete in 554 00:25:53,860 --> 00:25:57,550 spustite v svoj koš ali vaš Koš storiti na računalniku? 555 00:25:57,550 --> 00:25:59,230 >> Popolnoma nič, res. 556 00:25:59,230 --> 00:26:00,320 To je tako kot v mapo. 557 00:26:00,320 --> 00:26:01,800 To je posebno mapo, da se prepričate. 558 00:26:01,800 --> 00:26:04,460 Vendar pa je dejansko izbrisati datoteko? 559 00:26:04,460 --> 00:26:06,780 >> No, no, saj nekateri od vas verjetno so bili, kot so, oh prekleto, niste 560 00:26:06,780 --> 00:26:07,420 pomeni, da to storim. 561 00:26:07,420 --> 00:26:09,130 Tako da dvokliknete Smeti ali koš. 562 00:26:09,130 --> 00:26:11,630 Ste podrezal okoli in si opomogla datoteka samo, da ga povlečete 563 00:26:11,630 --> 00:26:12,110 od tam. 564 00:26:12,110 --> 00:26:14,420 Torej je jasno, da to ni nujno izbris. 565 00:26:14,420 --> 00:26:15,990 >> OK, ti si pametnejši od tega. 566 00:26:15,990 --> 00:26:18,860 Saj veš, da samo, da ga povlečete v Smeti ali koš ne pomeni, 567 00:26:18,860 --> 00:26:19,930 ste praznjenje koša. 568 00:26:19,930 --> 00:26:24,110 Torej, greš v meni, in rečeš Empty Trash ali Empty Recycle Bin. 569 00:26:24,110 --> 00:26:25,360 Kaj se zgodi potem? 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> Ja, tako je črta bolj. 572 00:26:32,530 --> 00:26:37,660 Ampak vse to zgodi, je to. 573 00:26:37,660 --> 00:26:45,350 Računalnik pozabi, kjer resume.doc bilo. 574 00:26:45,350 --> 00:26:47,400 >> Toda tisto, kar očitno ni spremenilo na sliki? 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 Bitov, 0s in 1s da Trdim, so na mestu nekaj fizičnega vidika 577 00:26:55,570 --> 00:26:56,280 strojne opreme. 578 00:26:56,280 --> 00:26:57,110 Oni so še vedno tam. 579 00:26:57,110 --> 00:26:58,930 To je le računalnik pozabili, kaj so. 580 00:26:58,930 --> 00:27:03,160 >> Torej je v bistvu osvobojena datoteka je bitov, tako da jih je mogoče ponovno uporabiti. 581 00:27:03,160 --> 00:27:06,940 Vendar ne, dokler ne boste ustvarili več datotek, in več datotek in še več datotek bo 582 00:27:06,940 --> 00:27:12,150 verjetnostno tisti 0 in 1s, ti magnetni delci, se ponovno uporabi, 583 00:27:12,150 --> 00:27:16,220 glavo ali desno stranjo navzgor za druge datoteke, 0s in 1s. 584 00:27:16,220 --> 00:27:17,980 >> Torej imate to okno časa. 585 00:27:17,980 --> 00:27:19,860 In to ne v predvidljivi dolžina, res. 586 00:27:19,860 --> 00:27:22,240 To je odvisno od velikosti vašega trdega disk in koliko datotek imate in 587 00:27:22,240 --> 00:27:23,490 kako hitro si lahko nove. 588 00:27:23,490 --> 00:27:27,050 Vendar pa je to okno v času trajanja ki jih ta datoteka je še vedno popolnoma 589 00:27:27,050 --> 00:27:27,770 povrnejo. 590 00:27:27,770 --> 00:27:31,050 >> Torej, če ste že kdaj uporabljati programe, kot so McAfee ali Norton, da bi poskušali izterjati 591 00:27:31,050 --> 00:27:35,680 Podatki, vsi počnejo poskuša izterja to tako imenovano imenik za 592 00:27:35,680 --> 00:27:37,340 ugotoviti, kje je bila tvoja slika. 593 00:27:37,340 --> 00:27:40,605 In včasih Norton in reči, Datoteka je 93% povrnejo. 594 00:27:40,605 --> 00:27:42,020 No, kaj to pomeni? 595 00:27:42,020 --> 00:27:45,690 To samo pomeni, da so nekatere druge datoteke naključju končal z, recimo, 596 00:27:45,690 --> 00:27:48,920 ti delci iz vaše izvirne datoteke. 597 00:27:48,920 --> 00:27:51,950 >> Torej, kaj je dejansko vsebovala pri izterjavi podatkov? 598 00:27:51,950 --> 00:27:55,720 No, če nimate kaj takega Norton vnaprej nameščen na računalniku, 599 00:27:55,720 --> 00:27:59,510 Največ kar lahko včasih narediti je pogledati na celoten trdi disk išče 600 00:27:59,510 --> 00:28:00,510 vzorci bitov. 601 00:28:00,510 --> 00:28:05,350 In ena od tem, o problematičnem niz pet je, da si bo poiskal 602 00:28:05,350 --> 00:28:09,570 enakovredno trdega diska, forenzični Podoba Compact Flash kartico iz 603 00:28:09,570 --> 00:28:13,660 digitalni fotoaparat, ki iščejo 0s in 1s, ki običajno, z visoko 604 00:28:13,660 --> 00:28:16,720 Verjetnost, predstavljajo začetek za slike JPEG. 605 00:28:16,720 --> 00:28:21,120 >> In vidva lahko izterja tiste slike, ki jih ob predpostavki, če vidim ta vzorec 606 00:28:21,120 --> 00:28:24,380 bitov na forenzične podobo, s velika verjetnost, da znamke 607 00:28:24,380 --> 00:28:25,650 začetek JPEG. 608 00:28:25,650 --> 00:28:29,520 In če bom spet videl isti vzorec, to verjetno pomeni začetek 609 00:28:29,520 --> 00:28:32,440 drugo JPEG in drugo JPEG, JPEG in drugo. 610 00:28:32,440 --> 00:28:34,970 In to tipično kako regres bo delovala. 611 00:28:34,970 --> 00:28:37,870 Kaj je lepo o JPEG je, čeprav sam format je nekoliko 612 00:28:37,870 --> 00:28:44,400 kompleks, začetek vsak primer Datoteka je pravzaprav precej prepoznaven 613 00:28:44,400 --> 00:28:47,370 in preprosto, kot boste videli, Če ste že ni. 614 00:28:47,370 --> 00:28:50,270 >> Torej, kaj je pobliže pod njim napa, da je točno kaj je bilo 615 00:28:50,270 --> 00:28:53,360 dogaja, in kaj ti 0s in 1s so, da vam malo več 616 00:28:53,360 --> 00:28:55,330 okvir za ta izziv. 617 00:28:55,330 --> 00:28:55,510 >> [Predvajanje videa] 618 00:28:55,510 --> 00:28:58,700 >> Kje računalnik shranjuje najbolj njenih stalnih podatkov. 619 00:28:58,700 --> 00:29:03,390 Da bi to dosegli, podatki potuje od RAM-a skupaj s programskimi signali, ki pripovedujejo 620 00:29:03,390 --> 00:29:06,110 trdi disk za hrambo teh podatkov. 621 00:29:06,110 --> 00:29:09,410 Pogonski vezja trdi translate te signale v napetosti 622 00:29:09,410 --> 00:29:10,870 nihanja. 623 00:29:10,870 --> 00:29:14,970 Ti pa, nadzor trdega diska je gibljivih delov, nekateri izmed redkih 624 00:29:14,970 --> 00:29:17,910 gibljivi deli ostanejo na svojem sodoben računalnik. 625 00:29:17,910 --> 00:29:22,130 >> Nekatere od krmilnih signalov motor ki se vrti metal obložene plošče. 626 00:29:22,130 --> 00:29:25,470 Vaši podatki dejansko shranjeni na te plošče. 627 00:29:25,470 --> 00:29:28,610 Drugi signali premakniti branja / pisanja glave za branje ali 628 00:29:28,610 --> 00:29:30,710 napišite podatke o pladnjih. 629 00:29:30,710 --> 00:29:35,450 Ta stroj tako natančne, da človek dlaka ni mogel niti mimo med 630 00:29:35,450 --> 00:29:37,280 Vodje in predenje krožnikov. 631 00:29:37,280 --> 00:29:40,316 Kljub temu, da vse skupaj deluje na grozen hitrosti. 632 00:29:40,316 --> 00:29:40,660 >> [END predvajanje videa] 633 00:29:40,660 --> 00:29:42,190 >> DAVID Malan: Povečaj malo globlje zdaj, kaj je 634 00:29:42,190 --> 00:29:44,360 dejansko o teh plošče. 635 00:29:44,360 --> 00:29:44,720 >> [Predvajanje videa] 636 00:29:44,720 --> 00:29:47,660 >> -Poglejmo, kaj smo samo videl v počasnem posnetku. 637 00:29:47,660 --> 00:29:51,710 Ko je kratek impulz električne energije pošlje branje / pisanje glave, če prezrcali 638 00:29:51,710 --> 00:29:54,650 na drobne elektromagnetnih za delček sekunde. 639 00:29:54,650 --> 00:29:58,970 Magnet ustvarja na polju, ki Spremembe polarnost drobna, drobna 640 00:29:58,970 --> 00:30:02,850 del kovinski delci, ki Dlaka vsak krožnik površino. 641 00:30:02,850 --> 00:30:05,940 >> Vzorec serija teh drobnih, področja zaračuna-up na disku 642 00:30:05,940 --> 00:30:08,470 predstavlja eno malo Podatki v binarno število 643 00:30:08,470 --> 00:30:10,530 Sistem, ki ga uporabljajo računalnike. 644 00:30:10,530 --> 00:30:13,775 Zdaj, če je trenutna poslal v eno smer z bralno / pisalna glava, območje 645 00:30:13,775 --> 00:30:15,970 je polarizirana v eni smeri. 646 00:30:15,970 --> 00:30:17,950 Če je trenutna pošlje nasprotni smeri, 647 00:30:17,950 --> 00:30:19,930 polarizacija se obrne. 648 00:30:19,930 --> 00:30:22,370 >> Kako prideš do podatkov na trdem disku? 649 00:30:22,370 --> 00:30:24,090 Le obraten proces. 650 00:30:24,090 --> 00:30:26,550 Torej je delci na disku da se trenutno v 651 00:30:26,550 --> 00:30:27,960 branje / pisanje glava premika. 652 00:30:27,960 --> 00:30:30,700 Skupaj milijone teh magnetizirani segmente, in 653 00:30:30,700 --> 00:30:32,160 imaš datoteko. 654 00:30:32,160 --> 00:30:36,060 >> Sedaj lahko koščki eno datoteko razkropljeni po vsem pogon je 655 00:30:36,060 --> 00:30:39,970 plošče, nekako kot nered referatov na vaši mizi. 656 00:30:39,970 --> 00:30:43,500 Torej posebna dodatna datoteka beleži o tem, kje vse je. 657 00:30:43,500 --> 00:30:45,985 Se ti ne želiš, da bi nekaj takega? 658 00:30:45,985 --> 00:30:46,470 >> [END predvajanje videa] 659 00:30:46,470 --> 00:30:47,820 >> DAVID Malan: OK, verjetno ne. 660 00:30:47,820 --> 00:30:52,070 Koliko od vas fantje odraščal z njimi? 661 00:30:52,070 --> 00:30:53,970 OK, tako da je vedno manj vsako leto roke. 662 00:30:53,970 --> 00:30:56,550 Ampak jaz sem vesel, da si vsaj seznanjeni z njimi, ker je to in naše 663 00:30:56,550 --> 00:31:00,520 Knjiga demo, na žalost umirajo zelo počasno smrt tukaj domačnosti. 664 00:31:00,520 --> 00:31:04,010 >> Ampak to je tisto, kar sem vsaj nazaj srednja šola, ki se uporablja uporaba za varnostne kopije. 665 00:31:04,010 --> 00:31:08,110 In bilo je neverjetno, ker ste lahko shranite 1,4 megabajtov na 666 00:31:08,110 --> 00:31:08,930 To zlasti disk. 667 00:31:08,930 --> 00:31:12,260 In to je bila različica visoke gostote, kakor je navedeno v HD, ki ima 668 00:31:12,260 --> 00:31:14,240 torej pred današnjim videoposnetkov HD. 669 00:31:14,240 --> 00:31:16,400 >> Standardna bila gostota 800 kilobajtov. 670 00:31:16,400 --> 00:31:18,640 In pred tem ni bilo 400-kilobajt diskov. 671 00:31:18,640 --> 00:31:23,120 Pred tem pa je bilo 5 in 1/4 palčne diske, ki so bili zares nemaren, 672 00:31:23,120 --> 00:31:25,680 in malo širša in višja od teh stvari tukaj. 673 00:31:25,680 --> 00:31:29,150 Vendar pa lahko dejansko videli tako imenovani floppy vidik teh diskov. 674 00:31:29,150 --> 00:31:32,630 >> In funkcionalno, oni dejansko Precej podobno trde diske na 675 00:31:32,630 --> 00:31:33,570 Vsaj ta tip. 676 00:31:33,570 --> 00:31:37,270 Še enkrat, SSD diski v novejših računalnikih Malo delujejo drugače. 677 00:31:37,270 --> 00:31:41,530 Ampak, če boste premaknili malo kovinski jeziček, lahko dejansko videli malo piškotek, 678 00:31:41,530 --> 00:31:42,560 ali krožnik. 679 00:31:42,560 --> 00:31:43,830 >> To ni kovine, kot je ta. 680 00:31:43,830 --> 00:31:46,000 Ta je dejansko nekaj cenejša plastike. 681 00:31:46,000 --> 00:31:46,750 In lahko nekako jo Mrdanje. 682 00:31:46,750 --> 00:31:50,310 In ste trully samo obrisati nekaj Število bitov ali magnetnih delcev 683 00:31:50,310 --> 00:31:51,220 iz tega diska. 684 00:31:51,220 --> 00:31:52,710 >> Torej, na srečo, ni nič na njem. 685 00:31:52,710 --> 00:31:55,790 Če je to stvar, ki je na poti - in pokrivajo vaše oči in tisti vašega soseda - 686 00:31:55,790 --> 00:31:58,865 lahko nekako to uspe celoti plašč off tako. 687 00:31:58,865 --> 00:32:01,900 Ampak tam je malo pomlad, zato bodite zaveda, da s svojimi očmi. 688 00:32:01,900 --> 00:32:03,620 Torej, sedaj imate resnično disketo. 689 00:32:03,620 --> 00:32:07,090 >> In kaj je izjemna o tem je, da v kolikor je to 690 00:32:07,090 --> 00:32:10,830 mali predstavitev večji trdi disk, te stvari so super, 691 00:32:10,830 --> 00:32:11,590 super enostavno. 692 00:32:11,590 --> 00:32:15,170 Če ste ščepec dna je zdaj, da metal stvar je off, in lupine 693 00:32:15,170 --> 00:32:20,990 da so odprte, vse, kar je, je dva kosa klobučevine in ti disketo 694 00:32:20,990 --> 00:32:22,930 s kosa kovine na notranji strani. 695 00:32:22,930 --> 00:32:25,990 >> In tam gre polovica vsebina mojega diska. 696 00:32:25,990 --> 00:32:27,540 Tu gre druga polovica. 697 00:32:27,540 --> 00:32:31,375 Ampak to je vse, kar je bilo predenje notranjosti računalnika v minulih dni. 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> In spet, da te v perspektivo, kako velik je večino svojega 700 00:32:38,310 --> 00:32:39,560 trde diske v teh dneh? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 gigabajtov terabajt in morda v namizni računalnik, 2 TB, 3 703 00:32:46,230 --> 00:32:47,630 terabajtov, 4 TB, kajne? 704 00:32:47,630 --> 00:32:52,480 To je ena megabajt, Vzemi ali pusti, ki ne more niti fit tipično MP3 705 00:32:52,480 --> 00:32:55,310 anymore teh dneh, ali nekateri podobno glasbo. 706 00:32:55,310 --> 00:32:59,500 >> Tako malo spominek za vas danes, in tudi za pomoč contextualize kaj 707 00:32:59,500 --> 00:33:03,570 bomo ob samoumevnega zdaj problem nastaviti pet. 708 00:33:03,570 --> 00:33:04,820 Torej, to so tvoje, da obdržite. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 Torej, kaj mi prehod, kjer bo porabi naslednjo pset kot dobro. 711 00:33:13,370 --> 00:33:18,470 Torej smo zdaj postavljena te strani - oh, Nekaj ​​objav hitro. 712 00:33:18,470 --> 00:33:21,730 >> Ta petek, če bi želeli pridružiti CS50 za kosilo, pojdite na običajnem mestu, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 In končni projekt - 715 00:33:25,100 --> 00:33:28,520 tako po predmetniku, smo objavili končna specifikacija projekt že. 716 00:33:28,520 --> 00:33:31,410 Zavedam se, da to ne pomeni, to je posledica predvsem kmalu. 717 00:33:31,410 --> 00:33:33,990 To je objavil, res, samo da bi dobili vi razmišljate o tem. 718 00:33:33,990 --> 00:33:37,620 In res, super pomembna Odstotek vas bo reševanje 719 00:33:37,620 --> 00:33:40,780 končni projekti materiala, ki ga celo ni prišel v razred, 720 00:33:40,780 --> 00:33:42,730 ampak bo že prihodnji teden. 721 00:33:42,730 --> 00:33:45,530 >> Obvestilo, čeprav je, da spec zahteva nekaj različnih komponent 722 00:33:45,530 --> 00:33:46,190 končni projekt. 723 00:33:46,190 --> 00:33:49,590 Prvič, v nekaj tednih, je predhodnega predloga, precej športna email 724 00:33:49,590 --> 00:33:52,760 vaš TF mu povedati, ali kaj ste razmišljanje o za vaš projekt, s 725 00:33:52,760 --> 00:33:53,650 brez vezave. 726 00:33:53,650 --> 00:33:56,710 Predlog bo vaša zlasti zaveza, rekoč tukaj, to je tisto, 727 00:33:56,710 --> 00:33:57,770 Rad bi naredil za moj projekt. 728 00:33:57,770 --> 00:33:58,250 Kaj menite? 729 00:33:58,250 --> 00:33:58,650 Prevelik? 730 00:33:58,650 --> 00:33:59,145 Premajhen? 731 00:33:59,145 --> 00:34:00,330 Je obvladljiv? 732 00:34:00,330 --> 00:34:02,230 In vidite spec za več podrobnosti. 733 00:34:02,230 --> 00:34:05,060 >> Nekaj ​​tednov po tem, da je stanje Poročilo, ki je podobno 734 00:34:05,060 --> 00:34:08,260 priložnostno email na vaš TF povedati, kako daleč ste v vaš končni 735 00:34:08,260 --> 00:34:12,360 izvajanje projekta, ki mu sledi CS50 Hackathon, za katere vsi 736 00:34:12,360 --> 00:34:17,520 je pozvala, ki bo dogodek iz 20:00 v enem večeru pa do 07:00 737 00:34:17,520 --> 00:34:19,150 AM naslednje jutro. 738 00:34:19,150 --> 00:34:22,560 Pica, kot sem že omenil, lahko v tednu nič, se wil služil na 09:00, 739 00:34:22,560 --> 00:34:24,120 Kitajsko hrano ob 01:00. 740 00:34:24,120 --> 00:34:27,929 In če ste še budni ob 5:00 AM, vam bom k IHOP za zajtrk. 741 00:34:27,929 --> 00:34:31,310 >> Torej Hackathon je eden izmed več nepozabna doživetja v razredu. 742 00:34:31,310 --> 00:34:35,290 Potem izvajanja je posledica, in potem klimatskih CS50 sejem. 743 00:34:35,290 --> 00:34:38,070 Več podrobnosti o vseh teh V prihodnjih tednih. 744 00:34:38,070 --> 00:34:40,739 >> Ampak vrnimo se nečesa stara šola - 745 00:34:40,739 --> 00:34:41,920 spet matrika. 746 00:34:41,920 --> 00:34:45,040 Torej matrika je bilo lepo, saj rešuje težave, kot smo videli samo 747 00:34:45,040 --> 00:34:49,290 pred nekaj trenutki s študentskimi strukturami dobili malo iz nadzora, če bomo 748 00:34:49,290 --> 00:34:52,405 želijo imeti študent enega, dva študenta, študent tri, študent dot dot dot, 749 00:34:52,405 --> 00:34:54,400 nekaj poljubnega števila študentov. 750 00:34:54,400 --> 00:34:58,850 >> Torej nizi, pred nekaj tedni, poletelo v in rešil vse naše težave, ki ni 751 00:34:58,850 --> 00:35:03,340 vedo vnaprej, koliko stvari neke vrste lahko želimo. 752 00:35:03,340 --> 00:35:07,390 In smo videli, da lahko konstrukti nam pomagajo nadalje organizirati našo kodo in vodi 753 00:35:07,390 --> 00:35:11,660 konceptualno podobne spremenljivke, kot so ime in hiše skupaj, tako da smo 754 00:35:11,660 --> 00:35:15,570 jih lahko obravnava kot en subjekt, znotraj ki so manjše koščke. 755 00:35:15,570 --> 00:35:17,810 >> Vendar nizi imajo nekaj slabosti. 756 00:35:17,810 --> 00:35:19,780 Katere so nekatere slabosti smo naleteli 757 00:35:19,780 --> 00:35:22,320 z nizi tako daleč? 758 00:35:22,320 --> 00:35:23,450 Kaj je to? 759 00:35:23,450 --> 00:35:28,130 Fiksna velikost - tako, čeprav boste morda mogli dodeliti pomnilnika za 760 00:35:28,130 --> 00:35:32,310 matrika, ko veš, koliko študentov imate, koliko znakov ste 761 00:35:32,310 --> 00:35:35,460 od uporabnika, ko ste dodeljeni matrika, ki ste nekako naslikal 762 00:35:35,460 --> 00:35:36,740 sami v kotu. 763 00:35:36,740 --> 00:35:40,600 >> Ker ne morete dodati nove elemente v sredini polja. 764 00:35:40,600 --> 00:35:43,660 Ne morete vstaviti več elementov Na koncu matrike. 765 00:35:43,660 --> 00:35:47,750 Res, boste morali zateči k ustvarjanju Popolnoma nova matrika, kot smo razpravljali, 766 00:35:47,750 --> 00:35:49,320 kopiranje starega v novo. 767 00:35:49,320 --> 00:35:52,610 In spet, da je glavobol, da GetString ukvarja z za vas. 768 00:35:52,610 --> 00:35:56,170 >> Ampak še enkrat, ne moreš celo vstavite nekaj v sredini polja 769 00:35:56,170 --> 00:35:58,200 če se obrestna mera ni povsem napolnjena. 770 00:35:58,200 --> 00:36:03,010 Na primer, če je ta niz tukaj velikosti šest ima samo pet stvari v njem, 771 00:36:03,010 --> 00:36:06,080 No, lahko le dodaste vas nekaj na koncu. 772 00:36:06,080 --> 00:36:08,200 Kaj pa, če želite vstaviti nekaj v sredini 773 00:36:08,200 --> 00:36:11,280 matrika, čeprav gre morda pet od šestih stvari v njem? 774 00:36:11,280 --> 00:36:14,250 >> No, kaj smo počeli, ko smo imeli vsi naših ljudi prostovoljcev na odru v 775 00:36:14,250 --> 00:36:15,110 tedne mimo? 776 00:36:15,110 --> 00:36:18,710 Če bi želeli postaviti nekoga tukaj, bodisi ti ljudje, kako se premakniti to 777 00:36:18,710 --> 00:36:22,540 Tako ali ti ljudje, kako se premakniti to pot, ki je postala draga. 778 00:36:22,540 --> 00:36:26,950 Premikanje ljudi znotraj matrika končal sešteva in stanejo 779 00:36:26,950 --> 00:36:31,240 nam časa, zato veliko naših n kvadrat voznih časov, kot so vstavljanje vrste, za 780 00:36:31,240 --> 00:36:32,550 na primer, v najslabšem primeru. 781 00:36:32,550 --> 00:36:36,520 Torej, nizi so super, ampak moraš vnaprej vedo, kako velik jih želite. 782 00:36:36,520 --> 00:36:38,030 >> Torej OK, tukaj je rešitev. 783 00:36:38,030 --> 00:36:43,860 Če ne vem vnaprej, koliko študenti Morda imam in vem, da enkrat 784 00:36:43,860 --> 00:36:47,870 Sem se odločil, čeprav sem zaljubljen s tem veliko študentov, zakaj ne sem vedno 785 00:36:47,870 --> 00:36:51,740 dodeli dvakrat toliko prostora kot sem morda mislim, da potrebujem? 786 00:36:51,740 --> 00:36:54,450 Je, da ni primerna rešitev? 787 00:36:54,450 --> 00:36:58,240 >> Realno, jaz ne mislim, da smo bodo potrebovali več kot 50 slotov 788 00:36:58,240 --> 00:37:02,190 v matriki za srednje velikostnem razredu je, zato naj samo zaokroži navzgor. 789 00:37:02,190 --> 00:37:07,040 Poskrbel bom, 100 rež na mojem paleto, samo tako da bomo lahko zagotovo dobili 790 00:37:07,040 --> 00:37:10,330 Število študentov pričakujem, da bom se v nekaterih srednje-velikostnem razredu. 791 00:37:10,330 --> 00:37:14,320 Torej, zakaj ne samo zaokrožiti in dodeliti več pomnilnika, tipično za matriko 792 00:37:14,320 --> 00:37:16,290 kot mislite, da bi sploh potrebujemo? 793 00:37:16,290 --> 00:37:20,190 Kaj je to preprosto pushback na to idejo? 794 00:37:20,190 --> 00:37:21,440 >> Ste samo zapravljaš spomin. 795 00:37:21,440 --> 00:37:25,350 Dobesedno vsak program, ki ga pišete, nato je morda z dvakrat toliko pomnilnika, kot 796 00:37:25,350 --> 00:37:26,680 ste dejansko potrebujete. 797 00:37:26,680 --> 00:37:28,990 In da le ne počutim kot še posebej elegantna rešitev. 798 00:37:28,990 --> 00:37:31,990 Poleg tega je to samo zmanjša Verjetnost problem. 799 00:37:31,990 --> 00:37:35,300 Če se zgodi, da imajo ljudski tečaj en semester in imate 101 800 00:37:35,300 --> 00:37:39,610 študentov, vaš program je še vedno bistveno soočajo z isto težavo. 801 00:37:39,610 --> 00:37:44,280 >> Torej, na srečo, obstaja rešitev za Ta oglas vsi naši problemi v obliki 802 00:37:44,280 --> 00:37:46,790 podatkovnih struktur, ki so bolj zapleten, kot tiste, 803 00:37:46,790 --> 00:37:47,970 smo videli doslej. 804 00:37:47,970 --> 00:37:50,530 To Trdim, je povezani seznam. 805 00:37:50,530 --> 00:37:51,920 To je seznam številk - 806 00:37:51,920 --> 00:37:54,970 9, 17, 22, 26 in 34 - 807 00:37:54,970 --> 00:38:00,120 , ki so med seboj povezani s pomočjo česa sem sestavljen kot puščice. 808 00:38:00,120 --> 00:38:03,580 >> Z drugimi besedami, če sem hotel, da zastopa matrika, lahko naredim 809 00:38:03,580 --> 00:38:04,910 kaj takega. 810 00:38:04,910 --> 00:38:07,310 In jaz bom dal to v zgornjem čez nekaj trenutkov. 811 00:38:07,310 --> 00:38:09,970 To lahko storim - 812 00:38:09,970 --> 00:38:12,520 Pozdravljeni, v redu. 813 00:38:12,520 --> 00:38:14,470 Stati. 814 00:38:14,470 --> 00:38:17,360 Nova računalniška tukaj, jasno - 815 00:38:17,360 --> 00:38:18,090 Vse je v redu. 816 00:38:18,090 --> 00:38:21,730 >> Torej, če sem te številke v polju - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 ni nujno, da v merilu. 819 00:38:30,530 --> 00:38:33,730 Vse je v redu, tako da tukaj je moj polje - 820 00:38:33,730 --> 00:38:34,980 O, moj bog. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 Vse je v redu, tako da tukaj je moj polje. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 Oh, moj bog. 825 00:38:45,050 --> 00:38:48,820 >> [SMEH] 826 00:38:48,820 --> 00:38:49,440 >> DAVID Malan: Pretvarjaj se. 827 00:38:49,440 --> 00:38:52,330 To je preveč truda, da se vrnete in da popraviti, tako da - 828 00:38:52,330 --> 00:38:54,290 26. 829 00:38:54,290 --> 00:38:57,650 Torej imamo ta niz 9, 17, 22, 26, in 34. 830 00:38:57,650 --> 00:39:00,260 Za tiste, ki ste lahko videli neprijetno napako sem ravnokar, 831 00:39:00,260 --> 00:39:00,830 tam je. 832 00:39:00,830 --> 00:39:04,490 >> Zato trdim, da je to zelo učinkovita rešitev. 833 00:39:04,490 --> 00:39:07,310 Sem dodeli toliko kot ints Rabim - Ena, dva, tri, 834 00:39:07,310 --> 00:39:09,100 štiri, pet ali šest - 835 00:39:09,100 --> 00:39:11,660 in sem nato shranjeni številke znotraj tega polja. 836 00:39:11,660 --> 00:39:15,220 Recimo, potem hočem vstaviti vrednost, kot je število 8? 837 00:39:15,220 --> 00:39:16,100 No, če ne gre? 838 00:39:16,100 --> 00:39:18,530 Recimo, da želite vstaviti več kot 20. 839 00:39:18,530 --> 00:39:19,790 No, če ne gre? 840 00:39:19,790 --> 00:39:23,160 Nekje na sredini, ali številko 35 je šel 841 00:39:23,160 --> 00:39:24,010 nekje na koncu. 842 00:39:24,010 --> 00:39:25,320 Ampak jaz sem vse ven iz prostora. 843 00:39:25,320 --> 00:39:29,120 >> In tudi to je temeljni izziv od polj, ki so rešitev ne. 844 00:39:29,120 --> 00:39:32,280 Sem trdil pred nekaj trenutki, GetString reši ta problem. 845 00:39:32,280 --> 00:39:37,380 Če želite vstaviti šesti številko v tem polju, je vsaj ena 846 00:39:37,380 --> 00:39:40,090 Rešitev, ki jo lahko pade nazaj na za prepričani, tako kot mi z GetString? 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 Kaj je to? 849 00:39:46,030 --> 00:39:48,190 >> No, da bo večji je lažje reči kot narediti. 850 00:39:48,190 --> 00:39:52,810 Ne moremo nujno, da array večji, ampak kaj lahko storimo? 851 00:39:52,810 --> 00:39:56,570 Naredite nov niz, ki je večji, velikosti 6, ali morda velikost 10, če hočemo 852 00:39:56,570 --> 00:40:00,490 da se pred stvarmi, in nato kopirajte stara matrika v novo in nato 853 00:40:00,490 --> 00:40:01,680 sprostiti staro paleto. 854 00:40:01,680 --> 00:40:05,770 >> Toda kaj, ko teče Zdaj tega procesa? 855 00:40:05,770 --> 00:40:09,870 To je velik O n, saj kopiranje bo stalo nekaj enot 856 00:40:09,870 --> 00:40:13,480 čas, tako da ni tako idealno, če moramo dodeli nov niz, ki se dogaja 857 00:40:13,480 --> 00:40:15,610 porabijo dvakrat toliko pomnilnik začasno. 858 00:40:15,610 --> 00:40:16,660 Kopiranje stare v novo - 859 00:40:16,660 --> 00:40:18,800 Mislim, da je samo glavobol, ki je, še enkrat, zakaj smo pisali 860 00:40:18,800 --> 00:40:19,920 GetString za vas. 861 00:40:19,920 --> 00:40:21,380 >> Torej, kaj lahko storimo namesto tega? 862 00:40:21,380 --> 00:40:25,000 No, kaj pa če je naša podatkovna struktura dejansko ima vrzeli v njej? 863 00:40:25,000 --> 00:40:30,790 Recimo, da sem se sprostite svoj cilj, da sosednje kose pomnilnika, kjer 9 864 00:40:30,790 --> 00:40:34,500 Tik 17, ki je tik do 22, in tako naprej. 865 00:40:34,500 --> 00:40:39,570 >> In domnevam, da se lahko 9. biti tukaj v RAM, 17 pa jih je mogoče tukaj preveč v RAM, 866 00:40:39,570 --> 00:40:40,990 in se 22 lahko tukaj preveč v RAM. 867 00:40:40,990 --> 00:40:43,610 Z drugimi besedami, jaz jih ne potrebujete celo nazaj na več nazaj. 868 00:40:43,610 --> 00:40:47,850 Pravkar sem se nekako nit iglo skozi vsako od teh številk, ali vsak 869 00:40:47,850 --> 00:40:51,010 teh vozlišč, saj bomo klic pravokotniki, kot sem jih vlečeni, do 870 00:40:51,010 --> 00:40:55,670 Spominjam se, kako priti do zadnjega kot vozlišče od prvega. 871 00:40:55,670 --> 00:40:59,940 >> Torej, kaj je programski konstrukt smo videli še pred kratkim, s katerim sem 872 00:40:59,940 --> 00:41:03,030 mogoče izvajati, da se niti, ali sestavi tukaj, s katerim sem lahko 873 00:41:03,030 --> 00:41:05,430 izvajanje te puščice? 874 00:41:05,430 --> 00:41:06,500 Torej kazalci, kajne? 875 00:41:06,500 --> 00:41:09,560 Če sem dodeliti ne le int, vendar vozlišče - in 876 00:41:09,560 --> 00:41:10,810 vozlišče, pravkar sem pomeni posodo. 877 00:41:10,810 --> 00:41:12,900 In vizualno, mislim pravokotnik. 878 00:41:12,900 --> 00:41:16,420 Torej očitno potrebuje vozlišče vsebuje dve vrednosti - 879 00:41:16,420 --> 00:41:21,490 int sama, nato pa, kot je vsebovano v spodnja polovica pravokotnika 880 00:41:21,490 --> 00:41:23,010 dovolj prostora za notr. 881 00:41:23,010 --> 00:41:26,130 >> Torej samo razmišljanje naprej tukaj, kako velik je ta vozel, to 882 00:41:26,130 --> 00:41:27,170 posoda vprašanje? 883 00:41:27,170 --> 00:41:29,250 Koliko bajtov za notr? 884 00:41:29,250 --> 00:41:31,310 Verjetno 4, če je Enako kot običajno. 885 00:41:31,310 --> 00:41:33,270 In potem, koliko zlogov Za kazalca? 886 00:41:33,270 --> 00:41:33,650 4. 887 00:41:33,650 --> 00:41:37,940 Torej je to zabojnik, ali je to vozlišče, je bo 8 bajtov strukturo. 888 00:41:37,940 --> 00:41:41,760 Oh, in da je srečno naključje, da smo pravkar uvedla ta pojem 889 00:41:41,760 --> 00:41:44,400 struct, ali struktura C. 890 00:41:44,400 --> 00:41:48,890 >> Torej trdim, da želim narediti korak proti tem bolj prefinjene 891 00:41:48,890 --> 00:41:52,560 Izvajanje seznama števil, ki povezani seznam številk, moram narediti 892 00:41:52,560 --> 00:41:56,920 Malo več razmišljanja spredaj in izjavi, ne le int, ampak Struct 893 00:41:56,920 --> 00:41:58,620 da bom poklical, konvencionalno tukaj vozlišče. 894 00:41:58,620 --> 00:42:01,630 Lahko bi ga poklical vse, kar si želite, vendar vozlišče se bo tematsko veliko 895 00:42:01,630 --> 00:42:03,560 od stvari, ki smo začeli gledaš zdaj. 896 00:42:03,560 --> 00:42:06,480 >> Znotraj tega vozlišča je int n. 897 00:42:06,480 --> 00:42:09,350 In potem je ta sintaksa, malo čudno na prvi pogled - 898 00:42:09,350 --> 00:42:12,960 struct vozlišče * naslednji. 899 00:42:12,960 --> 00:42:16,900 No slikovno, kaj je to? 900 00:42:16,900 --> 00:42:21,000 To je spodnja polovica pravokotnik, da smo videli 901 00:42:21,000 --> 00:42:22,730 pred nekaj trenutki. 902 00:42:22,730 --> 00:42:27,600 >> Ampak zakaj govorim struct vozlišče * v nasprotju s samo vozlišče *? 903 00:42:27,600 --> 00:42:31,370 Ker če da kazalec kaže na drugem vozlišču, to je samo 904 00:42:31,370 --> 00:42:32,760 naslov vozlišča. 905 00:42:32,760 --> 00:42:35,630 To je v skladu s tem, kar smo jih Doslej razpravljali o kazalca. 906 00:42:35,630 --> 00:42:39,690 Ampak zakaj, če trdim, ta struktura je imenuje vozlišče, moram reči Struct 907 00:42:39,690 --> 00:42:42,660 Vozel tu notri? 908 00:42:42,660 --> 00:42:43,190 >> Točno tako. 909 00:42:43,190 --> 00:42:46,490 To je neke vrste neumna realnosti C. Typedef, tako rekoč nima 910 00:42:46,490 --> 00:42:47,220 še ni zgodilo. 911 00:42:47,220 --> 00:42:48,510 C je super dobesedno. 912 00:42:48,510 --> 00:42:51,050 Glasi svojo kodo vrha do spodaj, z leve proti desni. 913 00:42:51,050 --> 00:42:54,930 In dokler ne pade, da podpičje na Bottom line, ugani kaj ne 914 00:42:54,930 --> 00:42:57,590 obstajati kot podatkovni tip? 915 00:42:57,590 --> 00:42:59,060 Vozlišče quote citata vozlišče. 916 00:42:59,060 --> 00:43:03,050 >> Ampak zaradi bolj verbose Izjava sem v prvi vrstici - 917 00:43:03,050 --> 00:43:05,340 typedef struct vozlišče - 918 00:43:05,340 --> 00:43:08,790 ker je bilo prej, preden zavitih oklepajih, to je nekakšen 919 00:43:08,790 --> 00:43:11,800 pred izobraževanjem Jek, da si veš kaj, daj mi Struct 920 00:43:11,800 --> 00:43:13,570 imenovano struct vozlišče. 921 00:43:13,570 --> 00:43:16,270 Odkrito povedano, ne maram kliče stvari struct vozlišče, vozlišče struct vse 922 00:43:16,270 --> 00:43:17,090 skozi mojo kodo. 923 00:43:17,090 --> 00:43:20,660 Ampak bom jo uporabite le enkrat, samo v notranjosti, tako da bom lahko učinkovito 924 00:43:20,660 --> 00:43:25,010 ustvariti vrste krožne reference, ne kazalec, da sam po sebi, ampak 925 00:43:25,010 --> 00:43:29,400 kazalec na drugo enak tip. 926 00:43:29,400 --> 00:43:32,330 >> Tako se izkaže, da na strukturo podatkov kot je ta, da je malo 927 00:43:32,330 --> 00:43:34,470 operacije, ki bi lahko v interesu nas. 928 00:43:34,470 --> 00:43:37,460 Bomo morda želite vstaviti v seznamu kot je ta. 929 00:43:37,460 --> 00:43:39,850 Mi morda želeli izbrisati s seznama, kot je ta. 930 00:43:39,850 --> 00:43:43,490 Mi bi želeli poiskati seznam za vrednost, ali bolj na splošno, prečno. 931 00:43:43,490 --> 00:43:46,410 In prečno je samo fancy način pravi začetek na levi in ​​premakniti vse 932 00:43:46,410 --> 00:43:47,650 pot v desno. 933 00:43:47,650 --> 00:43:52,640 >> In obvestilo, tudi s tem nekoliko bolj sofisticirane podatkovne strukture, naj 934 00:43:52,640 --> 00:43:56,510 jaz predlagam, da bomo lahko sposodimo od ideje v zadnjih dveh tednih in 935 00:43:56,510 --> 00:43:58,410 izvajati funkcijo imenovano iskanje takole. 936 00:43:58,410 --> 00:44:01,360 To se dogaja, da se vrnete res ali false, kar kaže, da ali 937 00:44:01,360 --> 00:44:03,390 no, n je na seznamu. 938 00:44:03,390 --> 00:44:05,960 Njena Drugi argument je kazalec na seznam same, tako 939 00:44:05,960 --> 00:44:07,920 kazalec na vozlišče. 940 00:44:07,920 --> 00:44:10,350 >> Vse bom naredil, potem je razglasila začasna spremenljivka. 941 00:44:10,350 --> 00:44:12,730 Mi bomo to imenujemo PTR po dogovoru Za kazalec. 942 00:44:12,730 --> 00:44:15,220 In sem ji dodelite enako začetek seznama. 943 00:44:15,220 --> 00:44:16,680 >> In zdaj opazil while zanko. 944 00:44:16,680 --> 00:44:20,640 Dokler kazalec ni enako na nič, grem preveriti. 945 00:44:20,640 --> 00:44:24,520 Je kazalec arrow n enak n, ki je bil sprejet leta? 946 00:44:24,520 --> 00:44:26,410 In počakajte minuto - nov kos sintakse. 947 00:44:26,410 --> 00:44:29,324 Kaj je puščica naenkrat? 948 00:44:29,324 --> 00:44:30,574 Ja? 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> Točno tako. 951 00:44:34,810 --> 00:44:38,860 Torej, ker se je pred nekaj minutami smo uporabili dot zapis za dostop do nekaj 952 00:44:38,860 --> 00:44:43,080 notranjost struct, če je spremenljivka ki ste jih ni struct 953 00:44:43,080 --> 00:44:47,420 , pač kazalec na struct, na srečo, kos sintakse, ki 954 00:44:47,420 --> 00:44:48,620 končno omogoča intuitivno smiselno. 955 00:44:48,620 --> 00:44:52,360 Puščica pomeni, da sledijo kazalcem tako kot naši puščice običajno pomeni 956 00:44:52,360 --> 00:44:56,570 slikovno in pojdite na Polje notri podatki. 957 00:44:56,570 --> 00:44:59,700 Torej puščica je ista stvar kot piko, toda ga uporabite, ko imate kazalec. 958 00:44:59,700 --> 00:45:05,270 >> Torej, nato povzeti, če n polje znotraj struct imenovan kazalec 959 00:45:05,270 --> 00:45:07,760 enaka enaka n, vrne true. 960 00:45:07,760 --> 00:45:11,970 Drugače pa je ta linija tukaj - kazalec enak kazalec naslednji. 961 00:45:11,970 --> 00:45:17,540 Torej, kaj to počne, obvestilo, je, če sem sem trenutno kaže na struct 962 00:45:17,540 --> 00:45:21,430 ki vsebuje 9 in 9 ni več Iščem - domnevam, iščem 963 00:45:21,430 --> 00:45:22,830 za n enak 50 - 964 00:45:22,830 --> 00:45:25,930 Bom posodobiti svoj začasni kazalec da ne bodo kazali na tem vozlišču 965 00:45:25,930 --> 00:45:31,190 več, vendar kazalec puščico, ki se dogaja, da me tukaj. 966 00:45:31,190 --> 00:45:34,270 >> Zdaj sem spoznal, je tornado uvod. 967 00:45:34,270 --> 00:45:37,380 V sredo bomo dejansko to z nekaterimi ljudmi in še več 968 00:45:37,380 --> 00:45:38,900 koda počasneje. 969 00:45:38,900 --> 00:45:42,990 Ampak zavedati, da smo zdaj kar naše podatke strukture bolj zapletene, tako da naši 970 00:45:42,990 --> 00:45:45,780 algoritmi lahko dobite bolj učinkovito, kar se bo pogoj za 971 00:45:45,780 --> 00:45:50,500 pset šest, ko smo naložite, še enkrat, tisti, 150.000 besed, vendar je treba to storiti 972 00:45:50,500 --> 00:45:55,650 učinkovito, in v najboljšem primeru, ustvarite Program, ki teče na naši uporabniki ne 973 00:45:55,650 --> 00:46:00,460 linearna, ne n kvadrat, vendar Časovna konstanta v idealno. 974 00:46:00,460 --> 00:46:02,300 >> Se vidimo v sredo. 975 00:46:02,300 --> 00:46:07,240 >> SPEAKER: Na naslednjem CS50, David pozabi svojo osnovno zadevo. 976 00:46:07,240 --> 00:46:12,770 >> DAVID Malan: In to je, kako boste poslali besedilna sporočila s C. Kaj - 977 00:46:12,770 --> 00:46:14,020 >> [RAZNO besedilno sporočilo OBVESTILO SOUNDS] 978 00:46:14,020 --> 00:46:19,734