1 00:00:00,000 --> 00:00:01,110 >> [Muziciranja] 2 00:00:01,110 --> 00:00:10,567 3 00:00:10,567 --> 00:00:11,650 DAVID J. Malan: U redu. 4 00:00:11,650 --> 00:00:15,610 To je CS50, i to je kraj četiri tjedna. 5 00:00:15,610 --> 00:00:19,420 A jedna od tema danas je da digitalne forenzike, 6 00:00:19,420 --> 00:00:20,989 umjetnost oporavlja podatke. 7 00:00:20,989 --> 00:00:22,780 I doista, iako ti si u sredini 8 00:00:22,780 --> 00:00:25,070 upravo sada mira na tri i bijeg, sljedeći tjedan, 9 00:00:25,070 --> 00:00:27,880 Fokus će biti na upravo to područje. 10 00:00:27,880 --> 00:00:30,686 >> Tako je jedan od najboljih poslova koje sam ikada imao je još u srednjoj školi, 11 00:00:30,686 --> 00:00:33,560 kad sam radio za lokalno Middlesex County okružnog tužitelja 12 00:00:33,560 --> 00:00:34,950 ured, rade forenzika raditi. 13 00:00:34,950 --> 00:00:37,450 Dakle, u suštini, Massachusetts Državna policija, na prigodu, 14 00:00:37,450 --> 00:00:40,100 kada se radi o slučajevima bi dovesti u stvarima kao što tvrde diskove 15 00:00:40,100 --> 00:00:42,185 i diskete i memorijske kartice i slično. 16 00:00:42,185 --> 00:00:44,060 I oni će ih predati meni i mojim mentorom, 17 00:00:44,060 --> 00:00:48,070 a naš je cilj bio pronaći dokaze, ako je bilo, na tim medijima. 18 00:00:48,070 --> 00:00:50,700 Sada, možda ste vidjeli bljeskovi ovoga svijeta forenzike 19 00:00:50,700 --> 00:00:53,000 u medijima, serije i filmove. 20 00:00:53,000 --> 00:00:55,730 No, posao koji sam imao, i pretpostavljam da je svijet, 21 00:00:55,730 --> 00:00:57,550 nije baš kao što bi ga vidjeti. 22 00:00:57,550 --> 00:01:00,794 Uzmimo pogled na ono što vjerojatno ste vidjeli. 23 00:01:00,794 --> 00:01:01,460 [Video reprodukciju] 24 00:01:01,460 --> 00:01:02,930 -OK. 25 00:01:02,930 --> 00:01:05,380 Sada, neka je dobiti dobar pogled na vas. 26 00:01:05,380 --> 00:01:06,850 >> [Muziciranja] 27 00:01:06,850 --> 00:01:12,260 28 00:01:12,260 --> 00:01:12,932 >> -Stanite. 29 00:01:12,932 --> 00:01:13,657 Trčanje to natrag. 30 00:01:13,657 --> 00:01:14,733 >> Čekaj malo. 31 00:01:14,733 --> 00:01:15,233 Idi u pravu. 32 00:01:15,233 --> 00:01:16,371 33 00:01:16,371 --> 00:01:16,870 -Tamo. 34 00:01:16,870 --> 00:01:17,369 Zaustavite. 35 00:01:17,369 --> 00:01:17,930 Full-screen. 36 00:01:17,930 --> 00:01:18,376 >> -OK. 37 00:01:18,376 --> 00:01:18,875 Zaustavite. 38 00:01:18,875 --> 00:01:20,160 -Tighten Se na to, hoćeš li? 39 00:01:20,160 --> 00:01:22,126 >> -Vector In na koji momak po stražnjem kotaču. 40 00:01:22,126 --> 00:01:24,435 >> -Zoom U upravo ovdje na ovom mjestu. 41 00:01:24,435 --> 00:01:28,580 >> -S Pravom opremom, slike se mogu uvećati i izoštriti. 42 00:01:28,580 --> 00:01:29,330 >> Što je to? 43 00:01:29,330 --> 00:01:30,780 >> -To Poboljšanja programa. 44 00:01:30,780 --> 00:01:32,170 >> Možeš li jasno da se bilo? 45 00:01:32,170 --> 00:01:33,070 >> Ne znam. 46 00:01:33,070 --> 00:01:34,150 Idemo ga poboljšati. 47 00:01:34,150 --> 00:01:35,440 >> -Enhance Odjeljak A6. 48 00:01:35,440 --> 00:01:36,570 49 00:01:36,570 --> 00:01:38,562 Ja poboljšane detalje, i-- 50 00:01:38,562 --> 00:01:40,020 -Mislim Ima dovoljno kako bi se poboljšala. 51 00:01:40,020 --> 00:01:40,976 Pustite ga da se moj zaslon. 52 00:01:40,976 --> 00:01:42,559 >> -Ja Pojačan odraz u njezinim očima. 53 00:01:42,559 --> 00:01:44,322 -Učinimo Pokrenuti to kroz Video pojašnjenje. 54 00:01:44,322 --> 00:01:45,210 >> -Edgar, Možete poboljšati to? 55 00:01:45,210 --> 00:01:45,710 >> -Hang Dalje. 56 00:01:45,710 --> 00:01:47,570 57 00:01:47,570 --> 00:01:49,458 >> -Ja Radili na tom promišljanju. 58 00:01:49,458 --> 00:01:50,402 >> Tamo je nečiji odraz. 59 00:01:50,402 --> 00:01:50,902 >> -Reflection. 60 00:01:50,902 --> 00:01:52,870 Tamo je odraz čovjekovog lica. 61 00:01:52,870 --> 00:01:53,694 >> -The Odraz! 62 00:01:53,694 --> 00:01:54,610 Tamo je odraz. 63 00:01:54,610 --> 00:01:55,880 -Zoom U na ogledalu. 64 00:01:55,880 --> 00:01:57,860 Možete vidjeti svoj odraz. 65 00:01:57,860 --> 00:01:59,630 >> Možeš li poboljšati sliku odavde? 66 00:01:59,630 --> 00:02:00,377 67 00:02:00,377 --> 00:02:01,210 Možeš li ga poboljšati? 68 00:02:01,210 --> 00:02:02,190 Možeš li ga poboljšati? 69 00:02:02,190 --> 00:02:03,066 Mogu se poboljšala ovo? 70 00:02:03,066 --> 00:02:03,898 Možeš li ga poboljšati? 71 00:02:03,898 --> 00:02:04,740 -Drži Na sekundu. 72 00:02:04,740 --> 00:02:05,281 Ja ću se poboljšala. 73 00:02:05,281 --> 00:02:06,470 -Zoom U na vrata. 74 00:02:06,470 --> 00:02:06,970 -Times 10. 75 00:02:06,970 --> 00:02:08,009 -Zoom. 76 00:02:08,009 --> 00:02:08,509 Pokret u. 77 00:02:08,509 --> 00:02:09,340 -Više. 78 00:02:09,340 --> 00:02:10,094 Čekaj, stani. 79 00:02:10,094 --> 00:02:10,750 Prestani. 80 00:02:10,750 --> 00:02:11,250 -Pause Ga. 81 00:02:11,250 --> 00:02:13,542 -Rotate Nam 75 stupnjeva oko vertikalne, molim te. 82 00:02:13,542 --> 00:02:14,750 83 00:02:14,750 --> 00:02:16,127 >> Prestani. 84 00:02:16,127 --> 00:02:19,330 Vratite se u dijelu oko vrata opet. 85 00:02:19,330 --> 00:02:21,420 >> -Razumijem Sliku pojačivač koji može bitmapa? 86 00:02:21,420 --> 00:02:24,420 >> Možda možemo koristiti Pradeep Singh Metoda vidjeti u prozore. 87 00:02:24,420 --> 00:02:25,902 >> -The Softver je stanje u umjetnosti. 88 00:02:25,902 --> 00:02:26,866 >> -The Svojstvena je isključen. 89 00:02:26,866 --> 00:02:29,758 >> -S Prava Kombinacija algorithms-- 90 00:02:29,758 --> 00:02:32,168 >> Krenuo je uzeti osvjetljenje algoritama na sljedeću razinu, 91 00:02:32,168 --> 00:02:34,110 i mogu ih koristiti za unaprijediti ovu fotografiju. 92 00:02:34,110 --> 00:02:36,840 >> -Lock Na i povećanje z-osi. 93 00:02:36,840 --> 00:02:37,351 >> -Enhance. 94 00:02:37,351 --> 00:02:37,850 Poboljšajte. 95 00:02:37,850 --> 00:02:38,720 -Enhance. 96 00:02:38,720 --> 00:02:40,070 -Freeze I unaprijediti. 97 00:02:40,070 --> 00:02:43,420 [END video reprodukciju] 98 00:02:43,420 --> 00:02:45,830 DAVID J. Malan: Dakle, to su sve riječi, ali oni nisu bili 99 00:02:45,830 --> 00:02:47,870 koristi u rečenicama ispravno. 100 00:02:47,870 --> 00:02:52,370 I doista u budućnosti, u bilo koje vrijeme, molim vas, ne čujete da netko kaže riječ, 101 00:02:52,370 --> 00:02:54,250 "Poboljšati", cerekanje samo malo. 102 00:02:54,250 --> 00:02:57,190 Jer kada bi pokušati povećati, Na primjer, to je ono što se događa. 103 00:02:57,190 --> 00:02:58,580 >> Dakle, ovdje je prekrasna slika. 104 00:02:58,580 --> 00:02:59,720 Ovo je CS50 vlastiti Daven. 105 00:02:59,720 --> 00:03:03,740 I pretpostavimo da smo htjeli usredotočiti se na tren u svom oku, 106 00:03:03,740 --> 00:03:05,870 ili odraz negativac koji je očito 107 00:03:05,870 --> 00:03:07,820 zarobljeni od strane sigurnosnih kamera. 108 00:03:07,820 --> 00:03:10,330 To je ono što se događa kada zumirate sliku koja 109 00:03:10,330 --> 00:03:14,060 ima samo ograničen broj bitova povezane s njom. 110 00:03:14,060 --> 00:03:15,420 >> To je ono što će doći. 111 00:03:15,420 --> 00:03:19,190 I doista, u Daven oku je, ali četiri, možda šest piksela 112 00:03:19,190 --> 00:03:22,110 kako sastaviti točno što je svjetlucave postoji. 113 00:03:22,110 --> 00:03:25,890 Dakle, problem je postavio četiri će u konačnici imati što istraživati ​​ovaj svijet, osobito 114 00:03:25,890 --> 00:03:28,090 po prirodi nečega zovemo file I / O, gdje 115 00:03:28,090 --> 00:03:31,000 I / O je samo fancy način rekavši ulaz i izlaz. 116 00:03:31,000 --> 00:03:34,280 >> Dakle, do sada, sve interakcije smo imali s računalom 117 00:03:34,280 --> 00:03:36,770 bili su velikim dijelom sa svojim tipkovnica i zaslon, 118 00:03:36,770 --> 00:03:40,770 ali ne toliko s tvrdog diska, ili spremanja datoteka pored onih koje 119 00:03:40,770 --> 00:03:41,620 sami napisati. 120 00:03:41,620 --> 00:03:44,570 Vaši programi do sada imaju ne stvaraju, i štedi, 121 00:03:44,570 --> 00:03:46,270 i ažuriranje vlastite datoteke. 122 00:03:46,270 --> 00:03:47,150 >> Pa, što je datoteka? 123 00:03:47,150 --> 00:03:48,105 Pa, nešto poput JPEG. 124 00:03:48,105 --> 00:03:50,520 To je slika koju bi mogao imate ili uploadati na Facebook, 125 00:03:50,520 --> 00:03:51,690 ili vidjeti bilo gdje na webu. 126 00:03:51,690 --> 00:03:54,460 Doista, da smo samo fotografiju Pila od Daven je JPEG. 127 00:03:54,460 --> 00:03:57,570 I što je zanimljivo O datoteka kao što su JPEG 128 00:03:57,570 --> 00:04:02,170 da se mogu identificirati, obično, po određenim obrascima bitova. 129 00:04:02,170 --> 00:04:05,200 >> Drugim riječima, što je to što razlikuje od JPEG GIF 130 00:04:05,200 --> 00:04:08,109 iz PING iz Riječi Dokument iz Excel datoteke? 131 00:04:08,109 --> 00:04:09,900 Pa, to je samo drugačiji obrasci bitova. 132 00:04:09,900 --> 00:04:12,820 I oni su različiti obrasci obično na početku tih datoteka. 133 00:04:12,820 --> 00:04:18,200 >> Tako da kada vaše računalo otvara Word doc, ili kada računalo otvara JPEG, 134 00:04:18,200 --> 00:04:20,940 izgleda obično na Prvih nekoliko bitova u datoteci. 135 00:04:20,940 --> 00:04:24,059 A ako se prepoznaje uzorak, ona kaže, oh, ovo je slika. 136 00:04:24,059 --> 00:04:25,850 Dopustite mi da ga prikazati na korisnik kao grafičkim. 137 00:04:25,850 --> 00:04:27,870 Ili, oh, ovo izgleda kao Word doc. 138 00:04:27,870 --> 00:04:30,480 Dopustite mi da to pokazati na korisnika kao esej. 139 00:04:30,480 --> 00:04:33,020 >> Tako, primjerice, JPEG, ispada, su 140 00:04:33,020 --> 00:04:35,460 prilično sofisticiran ispod haube. 141 00:04:35,460 --> 00:04:40,140 No, prva tri bajta u većini drugih JPEG početi s ova tri broja. 142 00:04:40,140 --> 00:04:44,680 Dakle bajt nula, jedan, a dva su, u najviše svaki JPEG, 255, zatim broj 143 00:04:44,680 --> 00:04:46,675 216, a zatim broj 255. 144 00:04:46,675 --> 00:04:48,990 >> A što ćete biti u mogućnosti početi raditi idući tjedan 145 00:04:48,990 --> 00:04:52,920 je zapravo viri ispod napa datoteka kao što su JPEG 146 00:04:52,920 --> 00:04:57,210 i kao bitmap datoteke, i gledajući ono što je uvijek bio tamo dokle 147 00:04:57,210 --> 00:04:58,650 kao što ste bili pomoću računala. 148 00:04:58,650 --> 00:05:01,860 >> Ali što je tu je nije tipično pisani kao decimalnih brojeva kao što je ovaj. 149 00:05:01,860 --> 00:05:04,620 Računalni znanstvenici ne imaju tendenciju da se govori u decimale. 150 00:05:04,620 --> 00:05:06,139 Oni zapravo ne govori u binarnom. 151 00:05:06,139 --> 00:05:07,930 Obično, kada želimo izraziti brojevima, 152 00:05:07,930 --> 00:05:10,710 mi zapravo koristiti heksadecimalni, koje mogu sjetiti 153 00:05:10,710 --> 00:05:13,027 od, recimo, Problem Set Jedan, koji je izazvao 154 00:05:13,027 --> 00:05:14,610 što da mislim o drugom sustavu. 155 00:05:14,610 --> 00:05:17,170 >> Mi, naravno, upoznati s decimale, nula do devet. 156 00:05:17,170 --> 00:05:18,215 Razgovarali smo o binarnom. 157 00:05:18,215 --> 00:05:20,710 A mi zapravo nemamo koristiti toliko ovdje 158 00:05:20,710 --> 00:05:22,470 na van, jer računala će koristiti. 159 00:05:22,470 --> 00:05:24,900 No, programeri će vrlo često, ali ne uvijek, 160 00:05:24,900 --> 00:05:29,360 koristiti heksadecimalni, što samo znači imate 16 slova u svom pismu, 161 00:05:29,360 --> 00:05:31,330 za razliku od dva ili 10. 162 00:05:31,330 --> 00:05:34,530 >> Pa kako se računati na veći od devet u heksadecimalnom? 163 00:05:34,530 --> 00:05:41,120 Polaska 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, , B, C, D, E, F, samo po konvenciji. 164 00:05:41,120 --> 00:05:43,540 No, ono što je ključno je da svaki od tih je jedan simbol. 165 00:05:43,540 --> 00:05:44,340 Nema 10. 166 00:05:44,340 --> 00:05:48,400 Nema 11, sam po sebi, jer svaki vaših brojki, baš kao u decimale 167 00:05:48,400 --> 00:05:51,940 i baš kao u binarnom, samo treba biti jedan znak, po konvenciji. 168 00:05:51,940 --> 00:05:55,280 >> Pa da onda je abeceda imamo na raspolaganju za heksadecimalni. 169 00:05:55,280 --> 00:05:58,600 Dakle, što to JPEG izgledati ako vas bilo bi napisati tih prvih tri 170 00:05:58,600 --> 00:06:01,980 Ne bajtova kao decimale, ali, Na primjer, kao što je heksadecimalnom? 171 00:06:01,980 --> 00:06:03,640 A zašto je hex čak sve to korisno? 172 00:06:03,640 --> 00:06:05,290 >> Pa, brzi pogled na primjer. 173 00:06:05,290 --> 00:06:09,030 Dakle, ako sam napisati bitove koji predstavljaju ove decimale numbers-- 174 00:06:09,030 --> 00:06:12,450 to bi moglo biti malo zahrđao Sada od nekoliko tjedana vratio, 175 00:06:12,450 --> 00:06:14,820 ali lijeva i pravi su prilično lako. 176 00:06:14,820 --> 00:06:17,990 255 bio je najveći broj smo moglo predstavljati s osam bitova. 177 00:06:17,990 --> 00:06:18,820 To je sve one. 178 00:06:18,820 --> 00:06:21,320 Dakle, jedina koja je blago Zanimljivo je srednji. 179 00:06:21,320 --> 00:06:24,700 A ako ste vrsta napraviti iz matematike, što će zaključiti da je, štoviše, 180 00:06:24,700 --> 00:06:27,949 da je uzorak od jednog i nule predstavlja 216. 181 00:06:27,949 --> 00:06:30,240 Pa neka je samo propisuje za Sada da su točne. 182 00:06:30,240 --> 00:06:31,730 Ali zašto je to zanimljivo? 183 00:06:31,730 --> 00:06:33,970 >> Pa, bajt, naravno, je osam bitova. 184 00:06:33,970 --> 00:06:38,980 I ispada da ako mislite od bajt kao dva komada četiri bita, 185 00:06:38,980 --> 00:06:39,500 kao što je ovaj. 186 00:06:39,500 --> 00:06:41,000 Dopustite mi samo dodati neki prostor. 187 00:06:41,000 --> 00:06:42,550 Dakle, prije, poslije. 188 00:06:42,550 --> 00:06:46,520 Upravo sam dodao malo bijelog prostora Radi vizualizacije je ovdje. 189 00:06:46,520 --> 00:06:51,840 Kako bismo mogli sada predstavlja u, recimo, heksadecimalni svaki quad bitova, 190 00:06:51,840 --> 00:06:52,880 Svaki set od četiri bita? 191 00:06:52,880 --> 00:06:56,420 >> Tako, primjerice, na lijevoj Sada imamo 1111 u binarnom. 192 00:06:56,420 --> 00:07:00,420 Što je taj broj u decimale, ako to učinite iz matematike? 193 00:07:00,420 --> 00:07:03,780 Imate one mjesto, dvojke mjesto, četveronoške mjesto, a osmice mjesto. 194 00:07:03,780 --> 00:07:04,341 >> PUBLIKA: 15. 195 00:07:04,341 --> 00:07:05,340 DAVID J. Malan: To je 15. 196 00:07:05,340 --> 00:07:08,340 Dakle, ako nam je činiti osam plus četiri plus dva plus jedan, dobivamo 15. 197 00:07:08,340 --> 00:07:11,790 Tako sam mogao zapisati 15 u nastavku 1111, ali cijela stvar ovdje 198 00:07:11,790 --> 00:07:13,190 je heksadecimalni, ne decimala. 199 00:07:13,190 --> 00:07:17,310 Dakle, umjesto zapisivao 15, 1-5, Ja ću napisati da je u hex, 200 00:07:17,310 --> 00:07:22,311 što ako mislite vratiti, ako imate nula kroz F, što je 15 će biti? 201 00:07:22,311 --> 00:07:22,810 PUBLIKA: f. 202 00:07:22,810 --> 00:07:24,434 DAVID J. Malan: Tako ispada da je f. 203 00:07:24,434 --> 00:07:29,140 A možete raditi da se govoreći: Pa, ako je 10, onda u redu, f 15. 204 00:07:29,140 --> 00:07:33,250 Dakle, doista, možemo prepisati taj isti skup brojeva kao f f. 205 00:07:33,250 --> 00:07:35,750 A onda, ako ćemo napraviti malo matematike, ćemo zaključiti da je to d. 206 00:07:35,750 --> 00:07:38,650 Osam je prilično jednostavan, jer mi ima jedan u Mau mjestu. 207 00:07:38,650 --> 00:07:40,620 A onda, imamo par više F F-a. 208 00:07:40,620 --> 00:07:44,669 >> Dakle, ono što ljudi imaju tendenciju da se dogovorno kada koriste heksadecimalni je oni samo 209 00:07:44,669 --> 00:07:47,710 pisati ovo malo više jezgrovito, riješiti većinu tog bijelog prostora. 210 00:07:47,710 --> 00:07:50,890 I samo da se super jasno čitatelji da je ovo heksadecimalni, 211 00:07:50,890 --> 00:07:54,670 jednostavna konvencija među ljudi je li pisati nulu 212 00:07:54,670 --> 00:07:58,000 x, koja nema drugo značenje nego vizualni identifikator, 213 00:07:58,000 --> 00:07:59,590 Ovdje dolazi hex broj. 214 00:07:59,590 --> 00:08:04,210 >> A onda, stavite dvije znamenke, f F je u ovom slučaju, tada D, zatim F F. 215 00:08:04,210 --> 00:08:06,700 Dakle, ne duljimo, heksadecimalni baš sklon 216 00:08:06,700 --> 00:08:11,990 da su korisni, jer je svaki od njegovog znamenki, nula do f, savršeno linije 217 00:08:11,990 --> 00:08:13,880 s uzorkom od četiri bita. 218 00:08:13,880 --> 00:08:18,080 >> Dakle, ako imate dva heksadecimalni znamenke, nula kroz F, opet i opet, 219 00:08:18,080 --> 00:08:20,256 koji vam daje savršeno osam bitova ili jedan bajt. 220 00:08:20,256 --> 00:08:22,380 Dakle, to je razlog zašto je sklon biti konvencionalno korisna. 221 00:08:22,380 --> 00:08:24,990 Nema intelektualnog Sadržaj stvarno iza toga, 222 00:08:24,990 --> 00:08:27,010 osim njegove stvarne korisnosti. 223 00:08:27,010 --> 00:08:29,310 >> Sada JPEG nisu samo datoteku formata za grafiku. 224 00:08:29,310 --> 00:08:33,230 Možda ćete se sjetiti da postoje datoteka kao što su to u svijetu, 225 00:08:33,230 --> 00:08:34,830 barem od nekoliko godina unatrag. 226 00:08:34,830 --> 00:08:37,580 >> Dakle, ovo je zapravo instaliran u sustavu Windows XP 227 00:08:37,580 --> 00:08:39,960 na milijune računala diljem svijeta. 228 00:08:39,960 --> 00:08:43,000 A to je bitmap datoteka, BMP. 229 00:08:43,000 --> 00:08:47,690 I bitmap datoteka, kao što ćete vidjeti sljedeći tjedan, samo znači uzorak točaka, 230 00:08:47,690 --> 00:08:51,710 piksela što oni nazivaju, preslikati na komadiće, stvarno. 231 00:08:51,710 --> 00:08:55,160 >> Dakle, ono što je zanimljivo, iako, o ovom formatu, BMP, je 232 00:08:55,160 --> 00:08:58,590 da je ispod haube, to ima više od samo tri bajta 233 00:08:58,590 --> 00:09:01,020 da sastavite svoje zaglavlje, tako govoriti, prvih nekoliko ugriza. 234 00:09:01,020 --> 00:09:03,330 To zapravo izgleda malo komplicirano na prvi pogled. 235 00:09:03,330 --> 00:09:04,704 A to ćete vidjeti u P setu. 236 00:09:04,704 --> 00:09:06,810 I sve nešto Posebno se to sada 237 00:09:06,810 --> 00:09:10,720 nije toliko važno, jer samo činjenice da na početku svakog bitmapi 238 00:09:10,720 --> 00:09:13,823 datoteka, grafičkom obliku, postoji cijela hrpa brojeva. 239 00:09:13,823 --> 00:09:14,980 240 00:09:14,980 --> 00:09:16,720 >> Sada Microsoft, Autor ovog formata, 241 00:09:16,720 --> 00:09:18,820 sklon nazvati onima Stvari nisu ori- i znakova 242 00:09:18,820 --> 00:09:22,259 i pluta, ali riječi i D riječi i čezne i bajtova. 243 00:09:22,259 --> 00:09:23,800 Dakle, to su samo različite vrste podataka. 244 00:09:23,800 --> 00:09:25,170 Oni su različita imena za istu stvar. 245 00:09:25,170 --> 00:09:26,740 No, vidjet ćete da je u P postavio četiri. 246 00:09:26,740 --> 00:09:31,450 >> Ali to je samo reći da ako čovjeka dvaput klikne neki bmp na njegov 247 00:09:31,450 --> 00:09:35,015 ili njezin hard disk, a prozor do njega ili nju da se slika pokazuje, 248 00:09:35,015 --> 00:09:38,500 što se dogodilo, jer je operativni Sustav vjerojatno primijetili, ne samo 249 00:09:38,500 --> 00:09:41,460 Proširenje .BMP datoteke u nazivu datoteke, 250 00:09:41,460 --> 00:09:45,010 ali i činjenica da postoji neki Konvencija za uzorak bitova 251 00:09:45,010 --> 00:09:47,490 na samom početku tog bitmap datoteku. 252 00:09:47,490 --> 00:09:50,270 >> Ali neka se sada usredotočiti na kao komplicirana datoteke, 253 00:09:50,270 --> 00:09:52,120 ali umjesto na takvo nešto. 254 00:09:52,120 --> 00:09:55,190 Recimo ovdje u gedit, ja samo početak 255 00:09:55,190 --> 00:09:57,070 programa koji je prilično jednostavna. 256 00:09:57,070 --> 00:09:58,860 Imam ih i uključuje do vrha. 257 00:09:58,860 --> 00:10:02,120 Sada imam # include "structs.h", ali Vratit ću se na to u trenutku. 258 00:10:02,120 --> 00:10:03,974 No, to je korisno za sada. 259 00:10:03,974 --> 00:10:05,890 Dakle, ovo je program koje će provoditi 260 00:10:05,890 --> 00:10:07,335 Poput matičara baze podataka. 261 00:10:07,335 --> 00:10:09,710 Dakle, baza podataka o studentima, a svaki student na svijetu 262 00:10:09,710 --> 00:10:13,190 ima ime i kuću, a vjerojatno i neki druge stvari, ali ćemo ga zadržati jednostavan. 263 00:10:13,190 --> 00:10:15,140 Svaki student ima ime i kuću. 264 00:10:15,140 --> 00:10:17,700 >> Dakle, ako sam htio napisati Program čiji je cilj u životu 265 00:10:17,700 --> 00:10:19,860 Upravo se ponoviti od usredotočiti na do tri, 266 00:10:19,860 --> 00:10:22,070 ako ima tri učenika na Sveučilištu Harvard. 267 00:10:22,070 --> 00:10:25,350 A ja samo želim da se, koristeći GetString, ime i kuća svakog studenta, 268 00:10:25,350 --> 00:10:26,600 i onda samo ispisati one out. 269 00:10:26,600 --> 00:10:28,630 >> To je nešto poput tjedna Jedan, dva tjedna stvari sada, 270 00:10:28,630 --> 00:10:30,810 gdje sam samo želim za petlje ili nešto slično. 271 00:10:30,810 --> 00:10:34,500 I želim pozvati GetString malo puta, a zatim ispisati f nekoliko puta. 272 00:10:34,500 --> 00:10:37,340 Pa kako bih mogao to učiniti, ipak, kada su i ime i kuću 273 00:10:37,340 --> 00:10:39,070 uključeni su za svakog studenta? 274 00:10:39,070 --> 00:10:42,830 >> Tako je moj prvi instinkt možda biti nešto poput ovoga. 275 00:10:42,830 --> 00:10:49,620 Sam prvi put moglo bi se reći, dobro, daj mi, kažu, niz žice pod nazivom imena. 276 00:10:49,620 --> 00:10:51,530 A ja ne želim hardcode trojica ovdje. 277 00:10:51,530 --> 00:10:53,064 Što želim staviti tamo? 278 00:10:53,064 --> 00:10:55,730 Dakle STUDENTI, jer to je samo konstantna proglasio na vrhu, 279 00:10:55,730 --> 00:10:57,860 Upravo tako ja ne moram hardcode tri na više mjesta. 280 00:10:57,860 --> 00:11:00,859 Na taj način, mogu ga promijeniti jedno mjesto, i to utječe na promjenu posvuda. 281 00:11:00,859 --> 00:11:04,470 A onda, ja mogu učiniti Niz kuće studentima. 282 00:11:04,470 --> 00:11:10,250 >> A sada, ja mogu učiniti nešto slično za (int i = 0; i 00:11:14,390 Pa ja sam tipkati brzo, ali to je vjerojatno upoznati sintaksa sada. 284 00:11:14,390 --> 00:11:17,030 >> A sada, to je novijeg datuma. 285 00:11:17,030 --> 00:11:22,890 Ako želim staviti u i-og Ime studenta, mislim da sam to učiniti. 286 00:11:22,890 --> 00:11:26,480 A onda, a ne imena ali kuće zagrada ja. 287 00:11:26,480 --> 00:11:29,930 Ja to učiniti, GetString, i neka ja vratiti se i ispraviti ovu liniju. 288 00:11:29,930 --> 00:11:30,430 Slažem? 289 00:11:30,430 --> 00:11:31,200 Ne slažem? 290 00:11:31,200 --> 00:11:32,366 To nije vrlo razumljiv. 291 00:11:32,366 --> 00:11:33,890 Nisam rekla korisniku što da radi. 292 00:11:33,890 --> 00:11:36,520 >> Ali sada, ako sam također Htio kasnije, ajmo 293 00:11:36,520 --> 00:11:40,060 recimo, ispis te stvari greda-- tako TODO kasnije. 294 00:11:40,060 --> 00:11:42,330 Ja ću učiniti više s ovo-- to nedvojbeno jest 295 00:11:42,330 --> 00:11:45,970 ispravna primjena uzimajući imena i kuće, tri 296 00:11:45,970 --> 00:11:48,870 od kojih je svaki ukupno od korisnika. 297 00:11:48,870 --> 00:11:51,280 >> No, to nije vrlo dobar dizajn, zar ne? 298 00:11:51,280 --> 00:11:55,220 Što ako učenik ima ne samo ime i kuća, ali i matični broj, 299 00:11:55,220 --> 00:11:57,770 i telefonski broj, i e-mail adresu, 300 00:11:57,770 --> 00:12:00,280 a možda i početna stranica, a Možda Twitter ručka, 301 00:12:00,280 --> 00:12:03,730 i bilo koji broj drugih detalja povezani sa studentom ili osobe, 302 00:12:03,730 --> 00:12:04,610 općenito. 303 00:12:04,610 --> 00:12:07,720 Kako bi se početi dodavati Funkcionalnost ovom programu? 304 00:12:07,720 --> 00:12:14,080 >> Pa, ja se osjećam kao na najjednostavniji način možda biti nešto poput, recimo, 305 00:12:14,080 --> 00:12:16,490 int IDS studenti. 306 00:12:16,490 --> 00:12:18,380 Dakle, ja mogu staviti sve svoje osobne iskaznice tamo. 307 00:12:18,380 --> 00:12:22,240 I onda, za nešto kao što su telefonski brojevi, 308 00:12:22,240 --> 00:12:24,400 Nisam siguran kako predstavljaju da su samo još. 309 00:12:24,400 --> 00:12:30,280 Tako ćemo ići naprijed i samo poziv to twitters učenika, koji 310 00:12:30,280 --> 00:12:33,550 je malo čudno, ali-- i hrpa više polja. 311 00:12:33,550 --> 00:12:36,360 >> Ja sam počeo da učinkovito kopirati i zalijepiti ovdje. 312 00:12:36,360 --> 00:12:39,416 A to će rasti prilično nezgrapan prilično brzo, zar ne? 313 00:12:39,416 --> 00:12:42,290 Zar ne bi bilo lijepo kad bi bilo u svijetu poznata struktura podataka 314 00:12:42,290 --> 00:12:45,600 Ne kao int ili niza, ali nešto višu razinu, apstrakcija, tako 315 00:12:45,600 --> 00:12:47,570 govoriti, poznat kao student? 316 00:12:47,570 --> 00:12:50,220 C nije došao s ugrađenim funkcionalnost za studente, 317 00:12:50,220 --> 00:12:52,260 ali što ako sam htjela dati ga kao? 318 00:12:52,260 --> 00:12:55,640 >> Pa, ispostavilo se, da ću otvoriti datoteku pod nazivom structs.h ovdje, 319 00:12:55,640 --> 00:12:57,090 a vi možete učiniti upravo to. 320 00:12:57,090 --> 00:12:58,290 A mi ćemo početi raditi ovo sada. 321 00:12:58,290 --> 00:13:01,490 A ispod haube P postavila tri, već ste se to sada radi. 322 00:13:01,490 --> 00:13:05,920 Ne postoji takva stvar kao g rect ili g ovalni u programskom jeziku C. 323 00:13:05,920 --> 00:13:10,570 >> Ljudi na Stanfordu provodi onima vrste podataka koristeći ovaj pristup ovdje, 324 00:13:10,570 --> 00:13:13,900 izjavljujući svoju novu podatke Vrste koje koriste novu ključnu riječ 325 00:13:13,900 --> 00:13:16,744 nazvao struct i drugi jedan se zove typedef. 326 00:13:16,744 --> 00:13:19,660 I doista, iako sintaksa izgleda malo drugačije od stvari 327 00:13:19,660 --> 00:13:23,550 što smo vidjeli prije, u Princip, to je super jednostavna. 328 00:13:23,550 --> 00:13:25,297 >> To samo znači "odrediti vrstu." 329 00:13:25,297 --> 00:13:27,255 To će biti struktura, a struktura 330 00:13:27,255 --> 00:13:29,400 je kao kontejner za više stvari. 331 00:13:29,400 --> 00:13:31,780 I da struktura ide imati niz zove ime, 332 00:13:31,780 --> 00:13:33,210 i niz naziva kuću. 333 00:13:33,210 --> 00:13:37,520 I nazovimo, samo za praktičnost, cijela ova struktura podataka studenta. 334 00:13:37,520 --> 00:13:40,320 >> Dakle, u trenutku kada se na zarez, imate sada 335 00:13:40,320 --> 00:13:43,280 stvorili svoj vlastiti podatke Tip se zove studentski 336 00:13:43,280 --> 00:13:46,420 kako sada stoji uz bok int, i plutaju, a char i string, 337 00:13:46,420 --> 00:13:50,270 i g izravni, te g ovalni, i bilo koji broj od ostalog ljudi su izmislili. 338 00:13:50,270 --> 00:13:53,340 >> Dakle, ono što je korisno o tome Trenutno je da, ako se vratim 339 00:13:53,340 --> 00:13:57,430 na ročito 0 i završiti ovo provedba, što sam napisao 340 00:13:57,430 --> 00:14:02,080 Unaprijed ovdje, primijetiti da su sve od neizbježnog nereda koji 341 00:14:02,080 --> 00:14:05,490 tek treba početi događa kao što sam dodao telefonski brojevi i twitters i sve 342 00:14:05,490 --> 00:14:07,370 ove ostale stvari za definicija studenta, 343 00:14:07,370 --> 00:14:11,810 Sada je jezgrovito je zavrsio kao što je samo jedan niz studenata. 344 00:14:11,810 --> 00:14:15,500 >> I svaki od tih studenata sada Ima više stvari unutar nje. 345 00:14:15,500 --> 00:14:16,930 Tako da samo ostavlja jedno pitanje. 346 00:14:16,930 --> 00:14:19,700 Kako ste dobili na ime, i kuća, i ID, 347 00:14:19,700 --> 00:14:21,640 i bilo što drugo je unutar studenta? 348 00:14:21,640 --> 00:14:22,930 Super jednostavno, kao. 349 00:14:22,930 --> 00:14:25,730 Novi sintakse, ali jednostavna ideja. 350 00:14:25,730 --> 00:14:29,239 >> Vi jednostavno indeks u nizu, kao što smo učinili prošli tjedan i to. 351 00:14:29,239 --> 00:14:31,030 A ono što je očito Novi komad sintakse? 352 00:14:31,030 --> 00:14:32,590 353 00:14:32,590 --> 00:14:35,880 Samo., Što znači "ići unutra Struktura i dobiti polje naziva 354 00:14:35,880 --> 00:14:39,030 ime, dobili na terenu pod nazivom kuća, se polje zove učenik. " 355 00:14:39,030 --> 00:14:41,940 >> Tako je u P postavila tri, ako si Još uvijek radimo na tome, 356 00:14:41,940 --> 00:14:44,020 i većina ljudi još uvijek se, shvatiti da kao i vi 357 00:14:44,020 --> 00:14:46,130 početi koristiti stvari poput g rects i G ovali 358 00:14:46,130 --> 00:14:50,201 i druge stvari koje se ne čini da dolaze iz tjedna nijedan, jedan ili dva, 359 00:14:50,201 --> 00:14:52,950 shvatiti da je to zato što Stanford proglasio neke nove vrste podataka. 360 00:14:52,950 --> 00:14:56,160 >> I doista, to je upravo ono što ćemo učiniti, kao i, u P je postavio četiri, kada 361 00:14:56,160 --> 00:14:59,880 počinjemo se baviti stvarima kao što su slike, bitmape, i još mnogo toga. 362 00:14:59,880 --> 00:15:02,882 Dakle, to je samo teaser i mentalni model za ono što dolazi. 363 00:15:02,882 --> 00:15:04,590 Sada, ja procrastinated Malo je jutros. 364 00:15:04,590 --> 00:15:09,560 Bio sam vrsta znatiželjan vidjeti što Microsoft je pozadina zapravo 365 00:15:09,560 --> 00:15:10,310 izgleda danas. 366 00:15:10,310 --> 00:15:15,200 I ispada da netko u 2006 zapravo otišao u gotovo precizno 367 00:15:15,200 --> 00:15:19,210 Isto mjesto za fotografiranje u stvarnosti ono što izgleda kao da je ovih dana. 368 00:15:19,210 --> 00:15:21,380 Polje je sada malo zarastao. 369 00:15:21,380 --> 00:15:24,850 >> Dakle, govoreći sada slika, ajmo vratiti Daven ovdje 370 00:15:24,850 --> 00:15:26,890 na zaslonu i Nikole, i samo da vas podsjetim 371 00:15:26,890 --> 00:15:30,540 da, ako želite da nam se pridružite za ručak ovaj petak, voditeljica na našoj uobičajenoj URL 372 00:15:30,540 --> 00:15:31,440 ovdje. 373 00:15:31,440 --> 00:15:33,530 >> Dakle, gdje smo stali u ponedjeljak? 374 00:15:33,530 --> 00:15:35,140 Uveli smo ovaj problem, zar ne? 375 00:15:35,140 --> 00:15:37,610 To je naizgled točna provedba zamjene, 376 00:15:37,610 --> 00:15:40,460 gdje ste uzimanje dva ints, jedan se zove, jedan se zove b, 377 00:15:40,460 --> 00:15:44,130 mijenjati ih, baš kao i Laura je ovdje na pozornici s mlijekom i vodom, 378 00:15:44,130 --> 00:15:46,820 pomoću privremenog varijabla, ili prazna čaša, 379 00:15:46,820 --> 00:15:50,540 kako bismo mogli staviti B u i A u b bez nered. 380 00:15:50,540 --> 00:15:51,560 Koristili smo varijablu. 381 00:15:51,560 --> 00:15:52,870 To se zove temp. 382 00:15:52,870 --> 00:15:55,520 >> No, ono što je temeljno Problem s ovim kodom u ponedjeljak? 383 00:15:55,520 --> 00:15:57,700 384 00:15:57,700 --> 00:15:58,870 Što je bio problem? 385 00:15:58,870 --> 00:16:00,106 386 00:16:00,106 --> 00:16:00,605 Da. 387 00:16:00,605 --> 00:16:01,970 >> PUBLIKA: Ona zauzima više prostora. 388 00:16:01,970 --> 00:16:04,719 >> DAVID J. Malan: zauzima više prostor, jer ja sam koristeći varijablu, 389 00:16:04,719 --> 00:16:05,400 i to je u redu. 390 00:16:05,400 --> 00:16:07,300 To je istina, ali ja sam će reći da je to u redu. 391 00:16:07,300 --> 00:16:10,030 To je samo 32 bita u Grand poretku stvari, tako da nije velika stvar. 392 00:16:10,030 --> 00:16:10,655 Ostali misli? 393 00:16:10,655 --> 00:16:12,572 PUBLIKA: To je samo swaps varijable na lokalnoj razini. 394 00:16:12,572 --> 00:16:13,571 DAVID J. Malan: Točno. 395 00:16:13,571 --> 00:16:15,090 To je samo swaps varijable na lokalnoj razini. 396 00:16:15,090 --> 00:16:18,173 Jer svaki put kad poziv function-- kada sam imao ladice iz Annenberg 397 00:16:18,173 --> 00:16:19,840 zadnji put, imate glavni na dnu. 398 00:16:19,840 --> 00:16:23,560 Čim pozvati funkciju nazvanu swap, swap ne dobijete X i Y, 399 00:16:23,560 --> 00:16:24,400 izvorne vrijednosti. 400 00:16:24,400 --> 00:16:26,392 Što potrebi zamijenite dobiti, nije mi tvrditi? 401 00:16:26,392 --> 00:16:27,100 Publika: primjeraka. 402 00:16:27,100 --> 00:16:28,090 DAVID J. Malan: Pa kopija njih. 403 00:16:28,090 --> 00:16:31,120 Tako se dobiva jedan i dva, ako vas podsjetiti na primjer iz prošlog vremena, 404 00:16:31,120 --> 00:16:34,730 ali kopija jedan i dva koji su uspješno zamijenio. 405 00:16:34,730 --> 00:16:38,550 No, na žalost, na kraju, Te vrijednosti su još uvijek isti. 406 00:16:38,550 --> 00:16:41,880 Tako možemo vidjeti s našim novi prijatelj, nadamo GDB, 407 00:16:41,880 --> 00:16:45,180 da ili TFS i CA imaju bila vodilja prema kako slijedi. 408 00:16:45,180 --> 00:16:51,210 >> Dakle, nema zamjena Podsjetimo izgleda volimo-članovima Let otvoriti ovo-- izgleda ovako. 409 00:16:51,210 --> 00:16:54,160 Inicijaliziranu smo x na jednu, y na dva. 410 00:16:54,160 --> 00:16:55,620 Da je hrpa ispisa F-a. 411 00:16:55,620 --> 00:16:58,080 Ali onda, tipku za poziv Ovdje je na swap, koji 412 00:16:58,080 --> 00:17:00,260 je upravo kod nas Upravo sam vidio trenutak prije. 413 00:17:00,260 --> 00:17:03,180 Koji je točno na prvi pogled, ali funkcionalno, 414 00:17:03,180 --> 00:17:06,800 Ovaj program ne radi, jer je ne trajno zamijeniti X i Y. 415 00:17:06,800 --> 00:17:10,190 >> Tako ćemo vidjeti, brzo toplo ovdje s GDB, a ./noswap. 416 00:17:10,190 --> 00:17:11,867 417 00:17:11,867 --> 00:17:15,200 Hrpa neodoljiv informacija koje Ja ću se riješiti s kontrolom L za sada. 418 00:17:15,200 --> 00:17:17,516 A sada, ja ću ići naprijed i pokrenuti ga. 419 00:17:17,516 --> 00:17:19,349 I na žalost, da je nije to korisno. 420 00:17:19,349 --> 00:17:22,355 To vodio program unutar toga Program pod nazivom GDB, program za ispravljanje pogrešaka, 421 00:17:22,355 --> 00:17:23,730 ali to nije neka mi džaku okolo. 422 00:17:23,730 --> 00:17:26,229 >> Pa kako se ja zapravo pauzirati Izvršenje unutar ovog programa? 423 00:17:26,229 --> 00:17:27,410 424 00:17:27,410 --> 00:17:28,329 Dakle slomiti. 425 00:17:28,329 --> 00:17:32,340 I ja sam mogao slomiti na bilo Linija broj jedan, 10, 15. 426 00:17:32,340 --> 00:17:35,530 Ali ja se također može slomiti simbolično rekavši prijelom Main. 427 00:17:35,530 --> 00:17:38,980 I to će se postaviti pauzu točka, očito na liniji 16 u glavnom. 428 00:17:38,980 --> 00:17:40,050 A gdje je linija 16? 429 00:17:40,050 --> 00:17:42,960 Idemo do koda i otići do noswap. 430 00:17:42,960 --> 00:17:46,930 I doista, linija 16 je Prvi u programu. 431 00:17:46,930 --> 00:17:52,130 >> Pa sad, ako sam ići naprijed i tip pokrenuti ovaj put, Enter, ona zastala. 432 00:17:52,130 --> 00:17:53,080 Tako ćemo džaku okolo. 433 00:17:53,080 --> 00:17:55,716 Ispis x-- zašto je x nula? 434 00:17:55,716 --> 00:17:56,705 435 00:17:56,705 --> 00:17:57,830 A ignorirati znak za dolar. 436 00:17:57,830 --> 00:17:59,725 To je samo za ljubitelj Korištenje programa. 437 00:17:59,725 --> 00:18:00,780 438 00:18:00,780 --> 00:18:03,140 Zašto je x nula u ovom trenutku? 439 00:18:03,140 --> 00:18:03,640 Da. 440 00:18:03,640 --> 00:18:07,061 >> PUBLIKA: Ona zastane neposredno prije Linija 16, a ne zapravo na liniji 16. 441 00:18:07,061 --> 00:18:08,060 DAVID J. Malan: Točno. 442 00:18:08,060 --> 00:18:11,630 GDB, po defaultu, je zastao Izvršenje prije linije 16. 443 00:18:11,630 --> 00:18:14,820 Dakle, to nije izvršen, što znači X je od neke nepoznate vrijednosti. 444 00:18:14,820 --> 00:18:17,150 A mi se posrećilo da je nešto čisto kao nulu. 445 00:18:17,150 --> 00:18:20,310 Pa sad, ako sam upisati sljedeći, Sada je izvršen 16. 446 00:18:20,310 --> 00:18:22,000 To me čeka izvršiti 17. 447 00:18:22,000 --> 00:18:23,400 Dopustite mi ići naprijed i ispis x. 448 00:18:23,400 --> 00:18:24,094 To je jedno. 449 00:18:24,094 --> 00:18:25,260 Dopustite mi ići naprijed i ispis y. 450 00:18:25,260 --> 00:18:26,176 Što sam trebao vidjeti sada? 451 00:18:26,176 --> 00:18:27,660 452 00:18:27,660 --> 00:18:28,560 >> PUBLIKA: [nečujan] 453 00:18:28,560 --> 00:18:29,165 >> DAVID J. Malan: malo glasnije. 454 00:18:29,165 --> 00:18:30,040 >> PUBLIKA: [nečujan] 455 00:18:30,040 --> 00:18:30,537 456 00:18:30,537 --> 00:18:32,120 DAVID J. Malan: Ne baš konsenzus. 457 00:18:32,120 --> 00:18:34,760 Tako da, vidimo neke smeća vrijednost. 458 00:18:34,760 --> 00:18:37,862 Sada, y je 134514064 postoji. 459 00:18:37,862 --> 00:18:39,320 Pa, to je samo neki smeća vrijednost. 460 00:18:39,320 --> 00:18:41,350 Moj program koristi RAM za različite svrhe. 461 00:18:41,350 --> 00:18:42,350 Ima drugih funkcija. 462 00:18:42,350 --> 00:18:44,040 Drugi ljudi pisao u mom računalu. 463 00:18:44,040 --> 00:18:46,789 Dakle, ti bitovi su korišteni za druge vrijednosti, i što vidim 464 00:18:46,789 --> 00:18:49,470 je ostatke nekih Prije uporabe te memorije. 465 00:18:49,470 --> 00:18:53,350 >> Dakle, nije velika stvar, jer čim kao što sam upisati sljedeći, a zatim y ispisati, 466 00:18:53,350 --> 00:18:55,640 to je inicijalno vrijednost koju želim. 467 00:18:55,640 --> 00:18:57,400 Pa sad, idemo naprijed malo brže. 468 00:18:57,400 --> 00:18:58,540 N za sljedeći. 469 00:18:58,540 --> 00:18:59,570 Idemo to učiniti opet. 470 00:18:59,570 --> 00:19:00,530 Idemo to učiniti opet. 471 00:19:00,530 --> 00:19:02,404 Ali ja ne želim pogoditi je ovdje, jer ako sam 472 00:19:02,404 --> 00:19:05,110 žele vidjeti što se događa unutar swapa, što je naredba? 473 00:19:05,110 --> 00:19:05,520 >> PUBLIKA: koraci. 474 00:19:05,520 --> 00:19:06,436 >> DAVID J. Malan: koraci. 475 00:19:06,436 --> 00:19:09,800 Dakle, ovo mi je korake u funkciju, radije nego preko njega. 476 00:19:09,800 --> 00:19:12,270 I sad, to je malo zagonetan iskreno, ali to je samo 477 00:19:12,270 --> 00:19:14,581 mi govori da sam u liniji 33 danas. 478 00:19:14,581 --> 00:19:15,580 I neka je to učiniti opet. 479 00:19:15,580 --> 00:19:16,080 Ispis temp. 480 00:19:16,080 --> 00:19:17,129 481 00:19:17,129 --> 00:19:20,170 Smeće vrijednost, negativna ovaj put, ali to je samo još vrijednost smeća. 482 00:19:20,170 --> 00:19:22,810 Tako ćemo učiniti, ispis temp. 483 00:19:22,810 --> 00:19:27,130 To je inicijalno 1, što je vrijednost x, zvani. 484 00:19:27,130 --> 00:19:29,110 >> Sada, gdje su naši i X dolazi? 485 00:19:29,110 --> 00:19:32,510 Pa, primjećuju u glavni, mi naziva tih vrijednosti x i y. 486 00:19:32,510 --> 00:19:34,740 Zatim smo prošli da ih zamijene na sljedeći način. 487 00:19:34,740 --> 00:19:37,010 X došao prvi, zarez y. 488 00:19:37,010 --> 00:19:40,020 A onda, zamjena mogla ih zvati X i Y. 489 00:19:40,020 --> 00:19:42,630 Ali radi jasnoće, to je nazivajući ih ib. 490 00:19:42,630 --> 00:19:45,970 No, i b su sada će biti kopije X i Y, respektivno. 491 00:19:45,970 --> 00:19:50,660 >> Dakle, ako sam se vratiti u GDB, temp sada je jedan i sada je jedan. 492 00:19:50,660 --> 00:19:56,130 Ali, ako sam učiniti i sada napraviti print , već je premještena više. 493 00:19:56,130 --> 00:20:00,030 Mlijeka razlivena u bivšem Sok od naranče je staklo, ili obrnuto. 494 00:20:00,030 --> 00:20:04,750 >> A ako sam učiniti opet, a sada ako sam isprintati kao provjera uračunljivosti, 495 00:20:04,750 --> 00:20:07,687 još dva, ali b je sada jedan. 496 00:20:07,687 --> 00:20:08,770 Iskreno, to je još uvijek tamo. 497 00:20:08,770 --> 00:20:10,670 Ne zanima me što je temp. 498 00:20:10,670 --> 00:20:16,850 No, čim sam sada upisati, recimo, i dalje se vratiti, sad sam na kraju 499 00:20:16,850 --> 00:20:17,480 Program. 500 00:20:17,480 --> 00:20:20,730 I na žalost, je x još jedan i y još dva. 501 00:20:20,730 --> 00:20:22,272 >> Dakle, ono što je korisnost GDB tamo? 502 00:20:22,272 --> 00:20:23,980 Nije mi pomoći popraviti problem per se, 503 00:20:23,980 --> 00:20:26,265 ali nadamo se mi pomoći razumijem realizacijom 504 00:20:26,265 --> 00:20:30,000 da da, moja logika je u pravu, ali moj broj nije u konačnici vlasništvo 505 00:20:30,000 --> 00:20:31,450 trajni učinak. 506 00:20:31,450 --> 00:20:34,570 Dakle, to je problem smo će se sada riješiti danas. 507 00:20:34,570 --> 00:20:37,870 >> Ali neka je doći preko toga. 508 00:20:37,870 --> 00:20:39,230 String je laž. 509 00:20:39,230 --> 00:20:41,860 Ona, također, nije tip podataka koja postoji u C. To je 510 00:20:41,860 --> 00:20:44,750 bio sinonim za neke Vrijeme je za nešto drugo, 511 00:20:44,750 --> 00:20:47,300 a možemo otkriti da je na sljedeći način. 512 00:20:47,300 --> 00:20:53,282 >> Dopustite mi ići naprijed i otvoriti Program pod nazivom usporediti-0. 513 00:20:53,282 --> 00:20:56,240 I umjesto da upišete ovo, ćemo početi hodati kroz kod 514 00:20:56,240 --> 00:20:58,040 Već sam napisao, ali To je samo nekoliko redaka. 515 00:20:58,040 --> 00:20:59,570 Dakle, ovo je usporedba-0. 516 00:20:59,570 --> 00:21:02,380 I prvo što radim postaje jedan redak teksta. 517 00:21:02,380 --> 00:21:05,610 >> Ali primijetiti ono što sam radi po prvi put. 518 00:21:05,610 --> 00:21:07,910 Ono što je drugačije jasno o liniji 21? 519 00:21:07,910 --> 00:21:10,020 520 00:21:10,020 --> 00:21:11,402 Zapravo, čekaj malo. 521 00:21:11,402 --> 00:21:12,110 To je kopija dva. 522 00:21:12,110 --> 00:21:13,568 To čak nije ni pravi program. 523 00:21:13,568 --> 00:21:14,780 U redu, spojler na oprezu. 524 00:21:14,780 --> 00:21:16,890 U redu, tako da nikada ne misli da je. 525 00:21:16,890 --> 00:21:18,520 To je odgovor na pitanje budućnosti. 526 00:21:18,520 --> 00:21:21,450 >> Ovdje je usporedba-0, i ja sam o da biste dobili jedan redak teksta. 527 00:21:21,450 --> 00:21:22,435 Program je mnogo jednostavnije. 528 00:21:22,435 --> 00:21:23,560 Dakle, to je jednostavno. 529 00:21:23,560 --> 00:21:28,070 To je kao Week One, Week Two stvari u ovom trenutku. String s = GetString. 530 00:21:28,070 --> 00:21:29,700 Sada, ja to kažem opet ovdje. 531 00:21:29,700 --> 00:21:31,830 Niz t = GetString. 532 00:21:31,830 --> 00:21:35,300 A onda, zadnja stvar u tome Program, kao što mu ime sugerira, 533 00:21:35,300 --> 00:21:37,090 se da ću pokušati ih usporediti. 534 00:21:37,090 --> 00:21:40,709 >> Dakle, ako ih, prvi niz, iznosi = T, onda sam 535 00:21:40,709 --> 00:21:42,250 reći upišete istu stvar. 536 00:21:42,250 --> 00:21:44,291 Inače, ja ću reći upišete različite stvari. 537 00:21:44,291 --> 00:21:45,880 Tako ćemo sastaviti i pokrenuti ovaj program. 538 00:21:45,880 --> 00:21:48,481 Tako bi usporediti nuli. 539 00:21:48,481 --> 00:21:48,980 Izgleda dobro. 540 00:21:48,980 --> 00:21:50,490 Nema kompilaciju pogreške. 541 00:21:50,490 --> 00:21:52,386 >> Dopustite mi ići naprijed sada i upišite ./compare-0. 542 00:21:52,386 --> 00:21:55,230 543 00:21:55,230 --> 00:21:59,220 Dopustite mi ići naprijed i reći nešto : Daven i nešto: Rob. 544 00:21:59,220 --> 00:22:00,450 I sam upisati različite stvari. 545 00:22:00,450 --> 00:22:01,250 Do sada, tako dobro. 546 00:22:01,250 --> 00:22:02,680 Program čini se da je točna. 547 00:22:02,680 --> 00:22:03,880 >> No, budimo ponovno pokrenuti. 548 00:22:03,880 --> 00:22:05,800 Reci nešto: Gabea. 549 00:22:05,800 --> 00:22:07,140 Reci nešto: Gabea. 550 00:22:07,140 --> 00:22:08,520 551 00:22:08,520 --> 00:22:09,020 U redu. 552 00:22:09,020 --> 00:22:10,851 Možda sam pogodio razmaknica ili nešto funky. 553 00:22:10,851 --> 00:22:11,600 Idemo to učiniti opet. 554 00:22:11,600 --> 00:22:13,020 Dakle Zamyla. 555 00:22:13,020 --> 00:22:13,970 556 00:22:13,970 --> 00:22:14,470 Zamyla. 557 00:22:14,470 --> 00:22:15,740 558 00:22:15,740 --> 00:22:17,330 Različite stvari. 559 00:22:17,330 --> 00:22:19,430 Dakle, što se događa? 560 00:22:19,430 --> 00:22:23,200 >> Dakle, imamo ove dvije linije broj, GetString se zove dva puta. 561 00:22:23,200 --> 00:22:25,760 A onda, ja sam jednostavno pokušavate uspoređivati ​​s i t. 562 00:22:25,760 --> 00:22:28,370 No, ono što je stvarno onda se događa? 563 00:22:28,370 --> 00:22:31,180 Pa, moj rukopis je o mesnica ovaj primjer nešto. 564 00:22:31,180 --> 00:22:34,630 I neka je zapravo bacanje ovo ovdje, kao dobro. 565 00:22:34,630 --> 00:22:37,390 566 00:22:37,390 --> 00:22:45,712 >> Dakle, imamo liniju poput String s = GetString. 567 00:22:45,712 --> 00:22:48,295 Dakle, to je jednostavno prvi Zanimljivo linija iz tog programa. 568 00:22:48,295 --> 00:22:49,920 569 00:22:49,920 --> 00:22:52,974 Ali što sve ovo vrijeme nije bilo događa ispod haube? 570 00:22:52,974 --> 00:22:55,890 Pa, na lijevoj strani je niz, koji je neki tip varijable, 571 00:22:55,890 --> 00:22:56,785 i to se zove s. 572 00:22:56,785 --> 00:23:00,019 Dakle, znam da je to pomoću memorije, ili RAM-a, u mom računalu nekako. 573 00:23:00,019 --> 00:23:02,060 Tako ću apstraktno nacrtao kao trg. 574 00:23:02,060 --> 00:23:04,820 32 bita, ispada, ali više o tome u budućnosti. 575 00:23:04,820 --> 00:23:06,410 A onda, što se događa ovdje? 576 00:23:06,410 --> 00:23:08,700 >> Pa, očito GetString dobiva niz od korisnika. 577 00:23:08,700 --> 00:23:11,360 I GetString dobio Zamyla ili Gabe ili Daven. 578 00:23:11,360 --> 00:23:14,640 Tako ćemo izabrati prvi od onih, koji je bio Daven. 579 00:23:14,640 --> 00:23:19,174 Dakle, učinkovito, što GetString dobio ja u tom prvom slučaju je D--V-e-nje. 580 00:23:19,174 --> 00:23:22,690 581 00:23:22,690 --> 00:23:25,045 A onda, što još nije to mi dati tajno? 582 00:23:25,045 --> 00:23:25,920 PUBLIKA: [nečujan] 583 00:23:25,920 --> 00:23:28,720 DAVID J. Malan: Da, / 0 ili null karakter. 584 00:23:28,720 --> 00:23:30,550 Tako da mi je dao niz učinkovito. 585 00:23:30,550 --> 00:23:34,550 Ali, već znamo iz prethodnih Izgleda da je samo niz polje 586 00:23:34,550 --> 00:23:37,895 znakova, i to je prestalo Ova posebna Sentinel likovima / 0. 587 00:23:37,895 --> 00:23:39,220 588 00:23:39,220 --> 00:23:42,310 >> Ali ako je to istina i to je trg, 589 00:23:42,310 --> 00:23:44,160 ovo je očito puno veći pravokutnik. 590 00:23:44,160 --> 00:23:46,830 I doista, to je, Tvrdim, samo 32 bita. 591 00:23:46,830 --> 00:23:49,500 A to je očito više od 32 bita, jer je to vjerojatno 592 00:23:49,500 --> 00:23:51,583 osam plus osam plus osam plus osam plus osam, 593 00:23:51,583 --> 00:23:53,320 Upravo zbog bajtova u ASCII. 594 00:23:53,320 --> 00:23:57,030 Kako dovraga ćemo stati Daven u ovoj maloj kutiji ovdje? 595 00:23:57,030 --> 00:23:59,880 >> Pa, što je GetString zapravo radi? 596 00:23:59,880 --> 00:24:03,680 Pa, ova rešetka ovdje predstavlja memorije mog računala ili RAM-a. 597 00:24:03,680 --> 00:24:07,564 Tako ćemo proizvoljno reći da, ako svaki od njih predstavlja bajt, 598 00:24:07,564 --> 00:24:09,730 onda možemo razmišljati o svakoj Bajt kao vlasništvo adresu, 599 00:24:09,730 --> 00:24:13,830 kao 33 Oxford Streetu, ili 34 Oxford Street, ili 35 Oxford Street. 600 00:24:13,830 --> 00:24:16,700 >> Dakle, baš kao i stanovi imaju adrese i zgrade imaju adrese, 601 00:24:16,700 --> 00:24:19,810 tako se pojedine bajtova memorije imaju adrese ili brojeve 602 00:24:19,810 --> 00:24:21,042 da ih jedinstveno identificirati. 603 00:24:21,042 --> 00:24:22,000 Sada, to je proizvoljna. 604 00:24:22,000 --> 00:24:25,370 No, da i dalje ostane jednostavna, idem koristiti heksadecimalni samo konvencije, 605 00:24:25,370 --> 00:24:28,200 ali 0x ne znači ništa drugo nego "to je heksadecimalni." 606 00:24:28,200 --> 00:24:31,030 i ja ću tvrditi da "D" završi na Byte One u memoriji. 607 00:24:31,030 --> 00:24:34,210 >> Ja nemam ništa drugo događa u memorije, pa Daven dobio prvo mjesto 608 00:24:34,210 --> 00:24:35,509 na Byte One. 609 00:24:35,509 --> 00:24:36,800 To je, dakle, neće biti u 0x2. 610 00:24:36,800 --> 00:24:37,831 611 00:24:37,831 --> 00:24:38,705 To će se 0x3. 612 00:24:38,705 --> 00:24:39,840 613 00:24:39,840 --> 00:24:41,800 To će biti 0x4. 614 00:24:41,800 --> 00:24:43,025 To će se 0x5. 615 00:24:43,025 --> 00:24:44,025 To će biti 0x6. 616 00:24:44,025 --> 00:24:45,560 617 00:24:45,560 --> 00:24:48,290 >> Ali jednom kada počnete razmišljati o tome što radiš računala 618 00:24:48,290 --> 00:24:50,710 ispod haube, možete početi zaključiti 619 00:24:50,710 --> 00:24:54,960 Kako vas, prije nekoliko godina, bi implementirali C sebe. 620 00:24:54,960 --> 00:24:58,360 Što je vjerojatno GetString returning-- zbog nje 621 00:24:58,360 --> 00:25:00,946 osjeća kao da to nije vraća Daven po sebi 622 00:25:00,946 --> 00:25:03,320 jer on sigurno ne ide da stane u ovaj mali box-- 623 00:25:03,320 --> 00:25:05,090 Dakle, što je GetString vjerojatno vraća? 624 00:25:05,090 --> 00:25:07,958 625 00:25:07,958 --> 00:25:08,920 >> PUBLIKA: [nečujan] 626 00:25:08,920 --> 00:25:10,540 >> DAVID J. Malan: Položaj Daven. 627 00:25:10,540 --> 00:25:12,770 I to je to otkad Week One. 628 00:25:12,770 --> 00:25:16,150 Što GetString stvarno povratka nije niz, po sebi. 629 00:25:16,150 --> 00:25:17,780 To je jedan od malih bijelih laži. 630 00:25:17,780 --> 00:25:22,520 To je povratak adresu niz u memoriji, jedinstvena adresa. 631 00:25:22,520 --> 00:25:24,820 Daven živi na 33 Oxford Streetu. 632 00:25:24,820 --> 00:25:29,310 Ali više jezgrovito, Gavin živi na 0x1, Adresa Broj Jedan. 633 00:25:29,310 --> 00:25:32,280 >> Dakle, ono što se stavi u to mala kutija tada, da bude jasno, 634 00:25:32,280 --> 00:25:35,930 je samo adresu tog niza. 635 00:25:35,930 --> 00:25:38,110 Dakle, sve ovo vrijeme, ovo traje već. 636 00:25:38,110 --> 00:25:41,650 No, što to ukazuje na Trenutno je da, ako sve S ima 637 00:25:41,650 --> 00:25:44,710 je broj unutar nje, koji je zaustaviti, programer, 638 00:25:44,710 --> 00:25:47,970 od stavljanja bilo koji broj u bilo koja varijabla i samo skakanje 639 00:25:47,970 --> 00:25:49,080 na taj komad memorije? 640 00:25:49,080 --> 00:25:51,320 I doista, vidjet ćemo to je prijetnja sljedeći put. 641 00:25:51,320 --> 00:25:53,500 >> Ali za sada, to se osjeća nedovoljno. 642 00:25:53,500 --> 00:25:55,630 Ako kažem, me niz, daj mi Daven. 643 00:25:55,630 --> 00:25:57,230 Ali ti stvarno ne mi dati Daven. 644 00:25:57,230 --> 00:25:59,310 Sve što mi je dati Daven je adresa. 645 00:25:59,310 --> 00:26:04,310 Kako da onda znam sigurno gdje Daven počinje i ends-- 646 00:26:04,310 --> 00:26:07,140 Priča postaje sve weird-- gdje Daven počinje i završava, 647 00:26:07,140 --> 00:26:10,435 zatim, slijedeći niz u memoriji počinje? 648 00:26:10,435 --> 00:26:11,520 649 00:26:11,520 --> 00:26:13,620 >> Pa, ako ste predaje ja početak Daven, 650 00:26:13,620 --> 00:26:17,230 u biti, koliko ja znam Gdje je kraj njegovog imena? 651 00:26:17,230 --> 00:26:20,550 Ta posebna null karakter, koji je je sve važnija sada 652 00:26:20,550 --> 00:26:23,040 ako žice ispod napa su jednostavno identificirati 653 00:26:23,040 --> 00:26:25,820 jedinstveno po svojoj poziciji u memoriji. 654 00:26:25,820 --> 00:26:28,130 Dakle, sve ovo vrijeme, to je ono što se događa. 655 00:26:28,130 --> 00:26:32,470 >> Dakle, kada gledamo sada na kod ovdje, objasni 656 00:26:32,470 --> 00:26:35,790 ako bi bug u liniji 26. 657 00:26:35,790 --> 00:26:39,560 Zašto je Zamyla i Zamyla drugačije? 658 00:26:39,560 --> 00:26:41,330 Zašto je Gabe i Gabe drugačije? 659 00:26:41,330 --> 00:26:42,154 Da, u leđima. 660 00:26:42,154 --> 00:26:43,390 >> PUBLIKA: Oni imaju različite adrese. 661 00:26:43,390 --> 00:26:45,931 >> DAVID J. Malan: Jednostavno zato oni imaju različite adrese. 662 00:26:45,931 --> 00:26:48,820 Jer kada zvati GetString opet, što ću učiniti brzo ovdje, 663 00:26:48,820 --> 00:26:52,870 ako je to druga linija, niz t, kao što sam učinio u tom programu, 664 00:26:52,870 --> 00:26:55,030 jednaka je još jedan poziv GetString. 665 00:26:55,030 --> 00:26:56,370 666 00:26:56,370 --> 00:26:58,670 Sljedeći put ću zvati GetString, idem 667 00:26:58,670 --> 00:27:00,190 dobiti drugačiji komad memorije. 668 00:27:00,190 --> 00:27:02,220 >> GetString dopušteno pitati radom 669 00:27:02,220 --> 00:27:03,800 Sustav za više i više memorije. 670 00:27:03,800 --> 00:27:07,894 To se neće ponovno ista šest bajtova svaki put. 671 00:27:07,894 --> 00:27:09,810 To će dobiti novi komad memorije, što 672 00:27:09,810 --> 00:27:12,780 znači t će dobiti neka druga vrijednost ovamo. 673 00:27:12,780 --> 00:27:15,380 >> Dakle, kada radim s jednako = t, ne uspoređujete 674 00:27:15,380 --> 00:27:17,880 D protiv toga i protiv ovo i V. protiv toga. 675 00:27:17,880 --> 00:27:19,588 Vi uspoređujete to Nasuprot tome, što 676 00:27:19,588 --> 00:27:24,020 iskreno je prilično useful-- useless-- je prilično beskoristan, jer tko stvarno 677 00:27:24,020 --> 00:27:25,830 brine gdje su žice su u sjećanju? 678 00:27:25,830 --> 00:27:26,850 >> I doista, nismo. 679 00:27:26,850 --> 00:27:28,980 A mi ne idemo u početi posebno brige. 680 00:27:28,980 --> 00:27:34,180 Samo do te mjere da pogreške mogu nastati i sigurnosne prijetnje mogu nastati volju 681 00:27:34,180 --> 00:27:36,100 mi zapravo početi voditi brigu o tome. 682 00:27:36,100 --> 00:27:37,230 Tako ćemo riješiti ovaj problem. 683 00:27:37,230 --> 00:27:39,650 Ispada, da ga popraviti super jednostavno. 684 00:27:39,650 --> 00:27:42,600 >> I neka je zapravo, prije nego što sam ponovno otkrivaju da, što bi 685 00:27:42,600 --> 00:27:47,170 što učiniti ako u razredu CS50, a vi morali provesti 686 00:27:47,170 --> 00:27:48,600 Usporedba protiv dvije žice. 687 00:27:48,600 --> 00:27:51,440 Vi očito ne može samo koristiti i iznosi = T. 688 00:27:51,440 --> 00:27:54,090 No, baš logično, kako bi li usporediti ovaj niz 689 00:27:54,090 --> 00:27:56,370 Protiv ovog niza koristeći C koda? 690 00:27:56,370 --> 00:27:56,880 Da. 691 00:27:56,880 --> 00:27:58,780 >> PUBLIKA: Dovoljno je učiniti za petlju [nečujan] 692 00:27:58,780 --> 00:28:00,670 693 00:28:00,670 --> 00:28:01,670 DAVID J. Malan: Savršen. 694 00:28:01,670 --> 00:28:02,900 PUBLIKA: [nečujan] 695 00:28:02,900 --> 00:28:03,310 DAVID J. Malan: Da. 696 00:28:03,310 --> 00:28:05,390 Dovoljno je koristiti za petlje ili dok petlje ili bilo što drugo. 697 00:28:05,390 --> 00:28:08,710 Ali primjenjuje samo osnovnu ideju da, ako to je komad memorije ili niz 698 00:28:08,710 --> 00:28:11,590 i to je, ponoviti više i u isto vrijeme. 699 00:28:11,590 --> 00:28:12,960 I samo usporediti slova. 700 00:28:12,960 --> 00:28:14,260 >> I moraš biti malo oprezni, jer vas 701 00:28:14,260 --> 00:28:16,247 Ne želim jedan prst proći pokraj drugoga 702 00:28:16,247 --> 00:28:18,080 jer je jedna struna dulje od druge. 703 00:28:18,080 --> 00:28:21,380 Dakle, vi ćete želite provjeriti Ova posebna vrijednost na kraju, null. 704 00:28:21,380 --> 00:28:24,017 Ali to je stvarno, u kraj, kao jednostavan kao taj. 705 00:28:24,017 --> 00:28:26,100 I iskreno, ne trebamo domisliti da kotač. 706 00:28:26,100 --> 00:28:27,960 Ovdje je verzija dva. 707 00:28:27,960 --> 00:28:32,910 A ono što ću reći je da umjesto da se uspoređujete S jednak = T, 708 00:28:32,910 --> 00:28:38,964 Ja sam umjesto toga ću reći, ako je niz Usporedba s zarezom t = 0 jednaka. 709 00:28:38,964 --> 00:28:40,130 Sada, što je niz usporediti? 710 00:28:40,130 --> 00:28:43,046 >> Ispada, da je funkcija koja dolazi s C, čija je svrha u životu 711 00:28:43,046 --> 00:28:44,650 je usporediti dvije žice. 712 00:28:44,650 --> 00:28:48,300 I promiješati usporedbu, ako čitamo njegova Čovjek stranica ili dokumentaciju ili CS50 713 00:28:48,300 --> 00:28:50,630 referenca, to će jednostavno vam reći da promiješati 714 00:28:50,630 --> 00:28:55,730 usporediti vraća bilo negativnih broj ili pozitivan broj ili nula, 715 00:28:55,730 --> 00:28:57,660 gdje je nula znači da su jednaki. 716 00:28:57,660 --> 00:28:58,570 >> Tako je samo nagađanje. 717 00:28:58,570 --> 00:29:00,390 Što bi to značilo, ako promiješati usporedbu vraća 718 00:29:00,390 --> 00:29:02,110 negativna vrijednost ili pozitivna vrijednost? 719 00:29:02,110 --> 00:29:02,785 720 00:29:02,785 --> 00:29:04,285 PUBLIKA: Veće ili manje od. 721 00:29:04,285 --> 00:29:05,570 DAVID J. Malan: Da, veći ili manji od. 722 00:29:05,570 --> 00:29:08,640 Dakle, ako ste htjeli sortirati cjelinu hrpa nizova u dictionary-- 723 00:29:08,640 --> 00:29:12,975 Kao što ćemo na kraju niz road-- savršena funkcija za korištenje potencijalno, 724 00:29:12,975 --> 00:29:15,850 jer će to učiniti Usporedba žice za vas, i recite 725 00:29:15,850 --> 00:29:20,060 što ne dolazi prije B, ili ne b dolaze prije po abecedi. 726 00:29:20,060 --> 00:29:21,490 Mi možemo učiniti upravo to. 727 00:29:21,490 --> 00:29:23,620 >> I primijetiti sam jednu drugu što je u ovom primjeru. 728 00:29:23,620 --> 00:29:26,870 Što drugo se promijenilo veća u ovoj glavnoj funkciji? 729 00:29:26,870 --> 00:29:28,500 730 00:29:28,500 --> 00:29:29,350 Char *. 731 00:29:29,350 --> 00:29:31,150 A to je da su druge bijele laži. 732 00:29:31,150 --> 00:29:33,750 Sve ovo vrijeme, kad ste bio pisanje niz, 733 00:29:33,750 --> 00:29:38,350 smo potajno prepisivanjem string kao char *, tako da zapravo Zveket 734 00:29:38,350 --> 00:29:39,270 razumije vas. 735 00:29:39,270 --> 00:29:42,450 >> Drugim riječima, u CS50.h i kao što smo na kraju ćemo vidjeti, 736 00:29:42,450 --> 00:29:45,950 smo napravili sinonim zove string to je ista stvar kao char *. 737 00:29:45,950 --> 00:29:49,910 A za sada, znamo samo da je *, U ovom kontekstu, barem 738 00:29:49,910 --> 00:29:51,286 znači adresu. 739 00:29:51,286 --> 00:29:52,210 >> Adresa čega? 740 00:29:52,210 --> 00:29:56,390 Pa, činjenica da sam rekao char *, a ne * int ili float *, 741 00:29:56,390 --> 00:30:00,820 znači da je char * adresa char. 742 00:30:00,820 --> 00:30:06,770 Dakle, ovaj mali box ovdje, zvani string, stvarno tipa char *, 743 00:30:06,770 --> 00:30:10,490 koji je jednostavno fancy način govoreći, U ovoj kutiji će ići adresu. 744 00:30:10,490 --> 00:30:12,430 A što znači da je adresa odnosila? 745 00:30:12,430 --> 00:30:13,780 Očigledno, char. 746 00:30:13,780 --> 00:30:16,410 >> Ali što smo mogli apsolutno imaju int * i druge stvari. 747 00:30:16,410 --> 00:30:20,790 Ali za sada, char * stvarno najviše jednostavan i jedan od interesa. 748 00:30:20,790 --> 00:30:23,310 Dakle, taj problem će rasti, iako, opet. 749 00:30:23,310 --> 00:30:24,830 >> Pretpostavimo da sam otvoriti ovaj program. 750 00:30:24,830 --> 00:30:27,670 Da vidimo sada možemo predvidjeti što nije u redu s ovim brojem. 751 00:30:27,670 --> 00:30:31,140 Tako je u ovom programu, kopirati-0, ja sam ići naprijed i opet pozvati 752 00:30:31,140 --> 00:30:34,190 GetString i pohraniti vrijednost u sekundi. 753 00:30:34,190 --> 00:30:38,800 >> I onda, zašto to radim, Samo kao podsjetnik iz prošlosti tjedna? 754 00:30:38,800 --> 00:30:40,960 Napravili smo rekli da GetString ponekad vraća null. 755 00:30:40,960 --> 00:30:42,793 Što to znači, ako GetString vraća null? 756 00:30:42,793 --> 00:30:45,040 757 00:30:45,040 --> 00:30:46,034 Nešto je pošlo po zlu. 758 00:30:46,034 --> 00:30:48,950 To vjerojatno znači niz je previše Veliki, kompjutora iz memorije. 759 00:30:48,950 --> 00:30:51,724 To se događa super, super, super Rijetko, ali to bi se moglo dogoditi. 760 00:30:51,724 --> 00:30:53,890 Želimo provjeriti za to, i to je sve što radimo. 761 00:30:53,890 --> 00:30:57,910 >> Zato ćemo sada vidjeti, ako ne početi provjeru redovito za stvari 762 00:30:57,910 --> 00:31:00,870 poput null, možda ćete zapravo početi ići 763 00:31:00,870 --> 00:31:03,106 na adrese u memoriji da su netočni. 764 00:31:03,106 --> 00:31:05,980 I ti ćeš početi izazivanja sve više i više segmentacija smetnji. 765 00:31:05,980 --> 00:31:08,360 Ili na Mac ili PC, samo uzrokujući računalo objesiti 766 00:31:08,360 --> 00:31:10,340 ili program za zamrzavanje, potencijalno. 767 00:31:10,340 --> 00:31:14,930 >> Pa sad, ja tvrdim u copy-0.c, da sam ću kopirati ove konce putem 768 00:31:14,930 --> 00:31:15,685 resornih 28. 769 00:31:15,685 --> 00:31:16,850 770 00:31:16,850 --> 00:31:18,750 A onda, idem patentnom zahtjevu pri dnu 771 00:31:18,750 --> 00:31:21,430 Ovdje da idem za promjenu jedan od njih. 772 00:31:21,430 --> 00:31:22,330 >> Dakle primijetiti. 773 00:31:22,330 --> 00:31:24,370 Zovem naš stari prijatelj strlen. 774 00:31:24,370 --> 00:31:28,960 I samo objasniti na engleskom jeziku Što ovaj redak 34 radi? 775 00:31:28,960 --> 00:31:32,480 Što t nosač 0 predstavlja lijevo. 776 00:31:32,480 --> 00:31:32,980 Da. 777 00:31:32,980 --> 00:31:34,339 >> PUBLIKA: Prvo karakter t? 778 00:31:34,339 --> 00:31:35,880 DAVID J. Malan: Prvo karakter t. 779 00:31:35,880 --> 00:31:36,379 To je sve. 780 00:31:36,379 --> 00:31:40,024 Prvi znak t, želim dodijeliti veliko verziju 781 00:31:40,024 --> 00:31:41,190 na prvi znak u t. 782 00:31:41,190 --> 00:31:43,200 Dakle, ovo je kapitaliziranje Prvo slovo. 783 00:31:43,200 --> 00:31:46,340 A onda, vrlo posljednja stvar mi je činiti U ovaj program je Tvrdim evo 784 00:31:46,340 --> 00:31:50,340 izvorni, S, i ovdje je kopija, t. 785 00:31:50,340 --> 00:31:54,610 >> No, temelji na priči mi samo rekli o tome što žice stvarno jesu, 786 00:31:54,610 --> 00:31:57,520 ono što je linija 28 stvarno radi, i što je 787 00:31:57,520 --> 00:31:59,405 rezultiralo bug ide biti na ekranu? 788 00:31:59,405 --> 00:32:01,300 789 00:32:01,300 --> 00:32:03,500 >> Dakle, prvo, prvo pitanje, 28. 790 00:32:03,500 --> 00:32:09,040 Što se niz t = s stvarno radi? 791 00:32:09,040 --> 00:32:16,430 Ako imamo na lijevom strana ovdje niz t = s; 792 00:32:16,430 --> 00:32:19,400 to mi daje jednu kutiju tu i jedna kutija ovdje. 793 00:32:19,400 --> 00:32:25,530 I pretpostavljam da ova adresa je 0x, recimo, 50 ovaj put, samovoljno. 794 00:32:25,530 --> 00:32:28,847 Što znači niz t = S napraviti ispod haube? 795 00:32:28,847 --> 00:32:30,340 >> PUBLIKA: [nečujan] 796 00:32:30,340 --> 00:32:34,100 >> DAVID J. Malan: Ona pohranjuje memorije adresu tamo, tako da 0x50 ide tamo. 797 00:32:34,100 --> 00:32:37,980 Dakle, ako sada idem na prvi lik u t i velika slova ga, 798 00:32:37,980 --> 00:32:39,535 Što ja djelotvorno raditi u S? 799 00:32:39,535 --> 00:32:41,300 800 00:32:41,300 --> 00:32:43,450 Ja sam stvarno radi istu stvar, zar ne? 801 00:32:43,450 --> 00:32:47,680 Jer ako Adresa 0x50-- i samo ja nemaju puno prostora na brodu ovdje, 802 00:32:47,680 --> 00:32:51,750 ali pretpostavljaju da je ova 0x50 ovdje dolje, negdje u memoriji mog računala. 803 00:32:51,750 --> 00:32:55,825 >> I ja sam, na primjer, Gabe u mala slova ovdje, kao što je ovaj. 804 00:32:55,825 --> 00:32:57,120 805 00:32:57,120 --> 00:33:01,980 I što sam rekao t nosač 0 dobiva kapitaliziraju. 806 00:33:01,980 --> 00:33:04,860 Pa, t nosač 0 je Prvo slovo ut. 807 00:33:04,860 --> 00:33:07,840 Dakle, malo g ide postati veliki G. No, problem 808 00:33:07,840 --> 00:33:09,410 je, što se također s Point se? 809 00:33:09,410 --> 00:33:10,300 >> PUBLIKA: ista. 810 00:33:10,300 --> 00:33:11,841 >> DAVID J. Malan: Ista stvar točna. 811 00:33:11,841 --> 00:33:16,342 Tako jednostavno objašnjenje možda, čak i ako je sintaksa je malo čudno. 812 00:33:16,342 --> 00:33:17,050 Tako ćemo to učiniti. 813 00:33:17,050 --> 00:33:20,210 Napravite copy-0, a zatim ./copy-0. 814 00:33:20,210 --> 00:33:21,820 815 00:33:21,820 --> 00:33:24,110 Reci nešto: Gabea. 816 00:33:24,110 --> 00:33:26,760 I na žalost, obojica im sada su kapitaliziraju, 817 00:33:26,760 --> 00:33:29,500 ali za to temeljne Razlog da smo naprosto 818 00:33:29,500 --> 00:33:32,350 Sada se bavi adrese. 819 00:33:32,350 --> 00:33:36,470 >> Pa kako ćemo početi address-- nema dosjetka intended-- 820 00:33:36,470 --> 00:33:39,270 kako ćemo se početi baviti ovaj problem? 821 00:33:39,270 --> 00:33:44,400 Pa, u copy1.c, stvari idu da se malo kompliciranije. 822 00:33:44,400 --> 00:33:49,310 Ali ja bih tvrditi konceptualno jednostavno rješenje. 823 00:33:49,310 --> 00:33:50,852 >> Dakle, teško da se na prvi pogled. 824 00:33:50,852 --> 00:33:53,560 Ne će biti lako za prvi Vrijeme što ga tip iz, možda, 825 00:33:53,560 --> 00:33:57,440 ali ako je problem što jednostavno radi T = je samo 826 00:33:57,440 --> 00:33:59,694 kopira adresa, što, opet, ako ja mogu pokupiti na vas, 827 00:33:59,694 --> 00:34:02,110 će biti rješenje za kopiranje zapravo niz? 828 00:34:02,110 --> 00:34:04,906 829 00:34:04,906 --> 00:34:06,770 >> PUBLIKA: Vjerojatno ćemo koristiti petlju ponovno. 830 00:34:06,770 --> 00:34:06,890 >> DAVID J. Malan: Da. 831 00:34:06,890 --> 00:34:08,390 Tako ćemo morati petlju ponovno. 832 00:34:08,390 --> 00:34:11,800 I zato, ako želimo kopirati Niz e u drugi string, 833 00:34:11,800 --> 00:34:14,120 vjerojatno želite učiniti slovo po slovo. 834 00:34:14,120 --> 00:34:17,199 No, problem je, ako To je izvorno s, 835 00:34:17,199 --> 00:34:22,159 sada moramo početi izričito dodjele memorije za t. 836 00:34:22,159 --> 00:34:24,320 >> Drugim riječima, neka je iscrtavanje ovaj posljednji put. 837 00:34:24,320 --> 00:34:28,659 Ako je ovo String s = GetString. 838 00:34:28,659 --> 00:34:30,956 839 00:34:30,956 --> 00:34:32,455 I neka je stavi to ovdje, kao dobro. 840 00:34:32,455 --> 00:34:36,639 841 00:34:36,639 --> 00:34:37,420 To je GetString. 842 00:34:37,420 --> 00:34:39,070 843 00:34:39,070 --> 00:34:43,860 A onda, slike za nešto kao da će biti kao i prije, 844 00:34:43,860 --> 00:34:44,360 G-A-B-E / 0. 845 00:34:44,360 --> 00:34:47,294 846 00:34:47,294 --> 00:34:48,960 To izgleda malo nešto poput ovoga. 847 00:34:48,960 --> 00:34:53,650 A e, dakle, mi to nazivamo 0x50, a to će biti 51, 52. 848 00:34:53,650 --> 00:34:54,409 >> Dakle, to je 0x50. 849 00:34:54,409 --> 00:34:55,679 850 00:34:55,679 --> 00:34:59,690 A onda, ja string t. 851 00:34:59,690 --> 00:35:02,450 U sjećanju, to je samo idući u daj mi malo kvadrat ovako. 852 00:35:02,450 --> 00:35:04,080 Dakle, što je ključni korak sad? 853 00:35:04,080 --> 00:35:09,870 Ako želim kopirati S u t, što prazno trebamo ispuniti ovdje? 854 00:35:09,870 --> 00:35:12,050 Ili ono što trebamo učiniti na visokoj razini? 855 00:35:12,050 --> 00:35:14,101 856 00:35:14,101 --> 00:35:14,600 Da? 857 00:35:14,600 --> 00:35:16,200 858 00:35:16,200 --> 00:35:17,020 Netko? 859 00:35:17,020 --> 00:35:17,690 Da. 860 00:35:17,690 --> 00:35:19,214 >> PUBLIKA: Moramo [nečujan]. 861 00:35:19,214 --> 00:35:21,380 DAVID J. Malan: Da, mi potrebno je popuniti prazno. 862 00:35:21,380 --> 00:35:24,340 Ja se ne mogu kopirati, a zatim kapitalizirati Gabe ime 863 00:35:24,340 --> 00:35:28,120 dok se ja pitam operacijski sustav za još jedan komad memorije 864 00:35:28,120 --> 00:35:30,640 to je najmanje što je velik kao i original. 865 00:35:30,640 --> 00:35:32,130 Tako da nas ostavlja s pitanjem. 866 00:35:32,130 --> 00:35:36,080 >> Kako mogu pitati operativni sustav ne samo za jednostavne malo pointer-- 867 00:35:36,080 --> 00:35:38,530 jer to se zove, adresa, pointer-- ne 868 00:35:38,530 --> 00:35:40,980 za jednostavnu kutijica kao što je ovaj nazvao niz? 869 00:35:40,980 --> 00:35:44,200 Kako mogu pitati radom Sustav za veliki komad memorije? 870 00:35:44,200 --> 00:35:48,430 Do sada sam samo dobio to natrag posredno pozivom GetString. 871 00:35:48,430 --> 00:35:50,740 Kako je tako GetString čak i uzimajući svoju memoriju? 872 00:35:50,740 --> 00:35:53,430 >> Pa, ispada da postoji ova druga funkcija ovdje 873 00:35:53,430 --> 00:35:55,160 da smo sada ću početi koristiti. 874 00:35:55,160 --> 00:35:59,780 Sada, ovo izgleda više zagonetan način than-- i ja sam jedini koji može vidjeti it-- 875 00:35:59,780 --> 00:36:03,150 Ova linija izgleda više zagonetan način onda bi trebao na prvi pogled. 876 00:36:03,150 --> 00:36:04,650 Ali budimo zafrkavati apart. 877 00:36:04,650 --> 00:36:07,950 >> Na lijevoj strani, moram char * t. 878 00:36:07,950 --> 00:36:13,280 Dakle, na engleskom jeziku, počnimo formulirati odgovarajuće kazne u tehničkom žargonu. 879 00:36:13,280 --> 00:36:19,757 Dakle, ovo je dodjelom varijabla tipa char * nazvao t. 880 00:36:19,757 --> 00:36:21,090 Sada, što to zapravo znači? 881 00:36:21,090 --> 00:36:23,881 >> Pa, to znači da je, što ću staviti u ovom varijablu t? 882 00:36:23,881 --> 00:36:24,780 883 00:36:24,780 --> 00:36:26,402 Adresa char. 884 00:36:26,402 --> 00:36:28,360 Dakle, to je samo jednostavnije, više razuman način 885 00:36:28,360 --> 00:36:29,930 opisivanja lijevu stranu. 886 00:36:29,930 --> 00:36:32,890 Tako da stvara ovaj okvir ovdje samo. 887 00:36:32,890 --> 00:36:34,760 Dakle, desna strana, vjerojatno, ide 888 00:36:34,760 --> 00:36:37,170 izdvojiti da je veći komad memorije kako? 889 00:36:37,170 --> 00:36:38,340 Tako ćemo zafrkavati ovaj apart. 890 00:36:38,340 --> 00:36:41,131 >> To je neodoljiv na prvi pogled, No, ono što se događa unutar ovdje? 891 00:36:41,131 --> 00:36:43,740 Prvo, tu je malloc, koji je očito naš novi prijatelj, 892 00:36:43,740 --> 00:36:45,450 "Memorije izdvojiti." 893 00:36:45,450 --> 00:36:49,560 Dakle, to je argument koji se prenose u njega, tako da je prilično velika rasprava. 894 00:36:49,560 --> 00:36:50,970 Tako ćemo zafrkavati ovaj apart. 895 00:36:50,970 --> 00:36:53,410 >> strlen S, naravno, predstavlja do- 896 00:36:53,410 --> 00:36:54,142 897 00:36:54,142 --> 00:36:55,600 PUBLIKA: broj znakova. 898 00:36:55,600 --> 00:36:56,710 DAVID J. Malan: Samo Broj znakova u sekundi. 899 00:36:56,710 --> 00:36:59,040 Dakle, duljina s, izvorni niz. 900 00:36:59,040 --> 00:37:00,350 Dakle, G-A-B-E. 901 00:37:00,350 --> 00:37:02,320 Dakle, to je vjerojatno i četiri u ovom slučaju. 902 00:37:02,320 --> 00:37:05,485 Zašto ja to radim +1 nakon nazivajući strlen od S? 903 00:37:05,485 --> 00:37:06,360 PUBLIKA: [nečujan] 904 00:37:06,360 --> 00:37:07,590 DAVID J. Malan: Za to Posebna null karakter. 905 00:37:07,590 --> 00:37:11,260 Ako me pitate što je duljina Gabe ime, ja ću reći četiri. 906 00:37:11,260 --> 00:37:14,480 Ispod poklopca motora, iako, moram da je peti Bajt za nultu karaktera. 907 00:37:14,480 --> 00:37:16,100 Dakle, to je razlog zašto radim na +1. 908 00:37:16,100 --> 00:37:21,730 >> Sada samo u slučaju da se radi toga Program na računalu, osim, recimo, 909 00:37:21,730 --> 00:37:24,610 CS50 aparata, gdje je veličina char 910 00:37:24,610 --> 00:37:26,350 moglo biti drugačije Iz vlastitog computer-- 911 00:37:26,350 --> 00:37:30,590 Ispada da ja mogu zvati Operater sizeof, samo pitajte računalo, 912 00:37:30,590 --> 00:37:32,870 ono što je veličina char na ovom računalu? 913 00:37:32,870 --> 00:37:37,400 >> I množenjem pet u to Primjer veličinom char koje 914 00:37:37,400 --> 00:37:40,440 na većini računala će Samo je jedna, malloc 915 00:37:40,440 --> 00:37:44,830 će se izdvojiti za mene je ovo veliki komad memorije ovdje na desnoj strani. 916 00:37:44,830 --> 00:37:47,140 I to će se return-- to je function-- tako da je 917 00:37:47,140 --> 00:37:48,265 će se vratiti na mene što? 918 00:37:48,265 --> 00:37:50,914 919 00:37:50,914 --> 00:37:51,830 PUBLIKA: adresa? 920 00:37:51,830 --> 00:37:53,709 DAVID J. Malan: adresa čega? 921 00:37:53,709 --> 00:37:55,250 PUBLIKA: Od sjećanja se dodjeljuje? 922 00:37:55,250 --> 00:37:56,450 DAVID J. Malan: Od memorije je dodijeljeno. 923 00:37:56,450 --> 00:37:59,189 Dakle, nemam pojma, iskreno, gdje to će završiti. 924 00:37:59,189 --> 00:38:01,480 Ja ću predložiti da to će završiti na 0x88. 925 00:38:01,480 --> 00:38:02,770 926 00:38:02,770 --> 00:38:06,009 Potpuno proizvoljna, ali negdje osim 0x50, 927 00:38:06,009 --> 00:38:08,800 jer operativni sustav, što Windows i Mac OS učiniti za mene, je 928 00:38:08,800 --> 00:38:11,230 pobrinite se da je davanje mi različite komade RAM-a. 929 00:38:11,230 --> 00:38:14,210 >> Dakle, ovo je vrijednost u kojoj to komad memorije moglo završiti. 930 00:38:14,210 --> 00:38:16,060 Dakle, to je ono što završi ovdje, 0x88. 931 00:38:16,060 --> 00:38:17,480 932 00:38:17,480 --> 00:38:21,570 Dakle, sada je jasno, ja mogu razumjeti da to nije isto kao i ovaj, 933 00:38:21,570 --> 00:38:23,960 jer oni pokazujući na različite komade memorije. 934 00:38:23,960 --> 00:38:29,980 Dakle, ako sam sad zapravo žele kopirati ovaj u, neka je učiniti vaš ponuđeno rješenje. 935 00:38:29,980 --> 00:38:36,870 >> Idemo, stvoriti za petlju, i to t nosač ja dobiva e nosač sam. 936 00:38:36,870 --> 00:38:39,760 Budući da sada mogu koristiti Taj niz poput zapis, 937 00:38:39,760 --> 00:38:43,390 jer iako vrlo malloc općenito mi alocira memoriju, 938 00:38:43,390 --> 00:38:45,290 Memorija je samo uzastopnih bajtova. 939 00:38:45,290 --> 00:38:47,240 Bajt, bajt, bajt, vratio se natrag na leđa. 940 00:38:47,240 --> 00:38:50,030 >> Ja sigurno mogu kao programer tretirati ga kao polje, koje 941 00:38:50,030 --> 00:38:55,090 znači ja mogu koristiti ovu konačno upoznati zapis od samo nekoliko četvornih tipkovnici. 942 00:38:55,090 --> 00:38:56,462 943 00:38:56,462 --> 00:39:00,020 >> Pa neka mi pauzirati, jer to je puno odjednom, i 944 00:39:00,020 --> 00:39:03,530 iako je osnovna ideja da se recap je da je niz, sve ovo vrijeme, 945 00:39:03,530 --> 00:39:05,550 nije nova vrsta podataka po sebi. 946 00:39:05,550 --> 00:39:10,150 To je samo tzv pokazivač, adresu karaktera, 947 00:39:10,150 --> 00:39:12,650 što samo znači da je broj da su ljudske konvencije 948 00:39:12,650 --> 00:39:15,350 skloni smo pisati kao 0x nešto. 949 00:39:15,350 --> 00:39:18,590 >> Ali to je samo broj, kao 33 Oxford Street, 950 00:39:18,590 --> 00:39:20,530 koja bi trebala iznositi Adresa CS zgrade. 951 00:39:20,530 --> 00:39:22,000 952 00:39:22,000 --> 00:39:23,545 Bilo kakva pitanja o tim detaljima? 953 00:39:23,545 --> 00:39:24,790 954 00:39:24,790 --> 00:39:25,289 Da? 955 00:39:25,289 --> 00:39:28,530 >> PUBLIKA: Zašto smo provjeriti učiniti za t jednak nulu? 956 00:39:28,530 --> 00:39:30,740 >> DAVID J. Malan: zašto radimo provjeriti t jednaka null? 957 00:39:30,740 --> 00:39:33,250 Ako čitamo documentation-- Veliki question-- za malloc, 958 00:39:33,250 --> 00:39:37,020 to će reći u sitnim slovima, Ponekad malloc mogli vratiti null, 959 00:39:37,020 --> 00:39:38,080 baš kao GetString. 960 00:39:38,080 --> 00:39:41,820 I doista, GetString vraća null Ako je, s druge strane, malloc vraća nula, 961 00:39:41,820 --> 00:39:43,130 jer GetString koristi malloc. 962 00:39:43,130 --> 00:39:46,400 >> A to bi se moglo dogoditi ako OS, Mac OS, Windows, što god, je jednostavno 963 00:39:46,400 --> 00:39:48,130 iz memorije za vas. 964 00:39:48,130 --> 00:39:49,820 Dakle, to je ono što se tamo dogodilo. 965 00:39:49,820 --> 00:39:52,910 >> I neka mi otkriti jednu drugu stvar da samo može vas oduševiti 966 00:39:52,910 --> 00:39:55,100 ili u potpunosti biti previše daleko iznad crte. 967 00:39:55,100 --> 00:39:59,770 No, dopustite mi podići isto za petlje za kopiranje, 968 00:39:59,770 --> 00:40:05,480 koji je prije nekoliko trenutaka, podsjetimo bio ovo. T nosač ja dobiva e nosač sam. 969 00:40:05,480 --> 00:40:06,740 >> Lijepo i razumljiv. 970 00:40:06,740 --> 00:40:09,330 Osjeća kao tjedan dva opet. 971 00:40:09,330 --> 00:40:14,920 No ova verzija zapravo može biti prepisivati ​​kao ovaj, koji izgleda zagonetan. 972 00:40:14,920 --> 00:40:18,280 To je tehnika naziva se kazaljka aritmetika, adresa aritmetika. 973 00:40:18,280 --> 00:40:19,600 Ali zašto ovo radi? 974 00:40:19,600 --> 00:40:22,220 >> Sada dosadno, Autori C odlučio se na 975 00:40:22,220 --> 00:40:25,070 * simbol za različite svrhe. 976 00:40:25,070 --> 00:40:29,020 Vidjeli smo što je nekad već jednom, char *, što znači "daj mi varijablu 977 00:40:29,020 --> 00:40:31,210 koji će sadržavati adresa char. " 978 00:40:31,210 --> 00:40:33,990 Dakle, char * u tom kontekstu znači "daj mi varijablu." 979 00:40:33,990 --> 00:40:40,050 >> Nažalost, ako koristite * Bez Riječ ispred njega, kao što su char, 980 00:40:40,050 --> 00:40:41,905 sada se zove dereference operatera. 981 00:40:41,905 --> 00:40:43,530 A vidjet ćemo još ovoga prije dugo. 982 00:40:43,530 --> 00:40:44,930 No, to samo znači "ići tamo." 983 00:40:44,930 --> 00:40:49,070 To je kao da kažete, ako me netko predao na komad papira "33 Oxford Street" 984 00:40:49,070 --> 00:40:53,830 ako mi je činiti "* 33 Oxford Street", to znači da "Ide niz cestu na CS zgrade." 985 00:40:53,830 --> 00:40:57,220 >> Dakle * samo znači ići tamo, ako Nema riječi ispred njega. 986 00:40:57,220 --> 00:40:59,100 Dakle, što je t, da bude jasno? 987 00:40:59,100 --> 00:41:03,250 t je adresa na komad memorije koji je dobio natrag na mene. 988 00:41:03,250 --> 00:41:06,650 e je adresa ono, da bude jasno, U primjeru smo raspravljalo, 989 00:41:06,650 --> 00:41:07,500 od malih Gabe? 990 00:41:07,500 --> 00:41:08,990 991 00:41:08,990 --> 00:41:10,005 e je adresa of-- 992 00:41:10,005 --> 00:41:11,585 993 00:41:11,585 --> 00:41:12,460 PUBLIKA: niz. 994 00:41:12,460 --> 00:41:14,126 DAVID J. Malan: Od Gabe je izvorni naziv. 995 00:41:14,126 --> 00:41:16,660 Dakle, to je adresa ovaj komad memorije. 996 00:41:16,660 --> 00:41:22,220 Dakle, ako ja kažem t + Ja-- ja, obavijest, samo je naš stari prijatelj. 997 00:41:22,220 --> 00:41:24,770 To je samo varijabla indeksa koji je iterating od nule na gore 998 00:41:24,770 --> 00:41:26,960 duljini niza S. 999 00:41:26,960 --> 00:41:30,367 Dakle, to će biti nula, onda se, zatim dva, zatim tri, pa četiri. 1000 00:41:30,367 --> 00:41:33,200 Tako ćemo okupiti ove nove Scratch poput slagalice, ako hoćete, 1001 00:41:33,200 --> 00:41:36,140 iako, opet, sintaksa je daleko više kompliciranih od nule. 1002 00:41:36,140 --> 00:41:39,522 Tako t je adresa + I ide mi dati 1003 00:41:39,522 --> 00:41:42,480 broj, jer to su sve Brojevi koje smo crtež kao hex. 1004 00:41:42,480 --> 00:41:43,560 No, to su samo brojke. 1005 00:41:43,560 --> 00:41:49,960 >> Dakle, ako adresa t mi je rekao bio 0x88, što je 0x88 plus nula. 1006 00:41:49,960 --> 00:41:51,564 1007 00:41:51,564 --> 00:41:53,980 Čak i ako vam se ne sviđa s hex još, pokušajte pogoditi. 1008 00:41:53,980 --> 00:41:54,410 >> PUBLIKA: originalna. 1009 00:41:54,410 --> 00:41:55,850 >> DAVID J. Malan: Ipak 0x88. 1010 00:41:55,850 --> 00:41:58,910 Dakle, što to znači * 0x88? 1011 00:41:58,910 --> 00:42:02,670 To znači, "tamo", što znači učinkovito, "staviti prst ovamo." 1012 00:42:02,670 --> 00:42:06,930 A sada na desnoj strani od Ovaj izraz, * a potom u parens, 1013 00:42:06,930 --> 00:42:11,586 S + I znači S, koja je obratiti ovdje na malo g gore. 1014 00:42:11,586 --> 00:42:16,220 e + 0 je, naravno, s, s je god. 1015 00:42:16,220 --> 00:42:21,230 >> Tako sada, to je * s, koji baš kao i * 33 Oxford Street znači otići na adresu 1016 00:42:21,230 --> 00:42:22,010 e. 1017 00:42:22,010 --> 00:42:24,170 Dakle, ovdje je to prst, desna ruka. 1018 00:42:24,170 --> 00:42:26,050 Dakle, ono što ću kopirati u što? 1019 00:42:26,050 --> 00:42:30,260 Stvar na desnoj strani, koji je Gabe, malo g ovdje, u ovdje. 1020 00:42:30,260 --> 00:42:32,750 >> I tako učinak koji Prva iteracija petlje, 1021 00:42:32,750 --> 00:42:36,200 kao što je predložila, iako to izgleda luda složeniji od bilo čega 1022 00:42:36,200 --> 00:42:42,110 što smo vidjeli prije, jednostavno govoreći ići ovdje i kopirati taj lik ovdje. 1023 00:42:42,110 --> 00:42:44,700 To ti daje kartu na obje lokacije. 1024 00:42:44,700 --> 00:42:46,130 >> I vidjet ćemo mnogo više od toga. 1025 00:42:46,130 --> 00:42:50,600 Ali za sada, nadam se samo da predstaviti neke od tih osnovnih ideja. 1026 00:42:50,600 --> 00:42:53,550 I doista, pogledajmo jedan konačni program ovdje, 1027 00:42:53,550 --> 00:42:57,480 a zatim obećao claymation, koji će učiniti sve u redu. 1028 00:42:57,480 --> 00:42:57,980 U redu. 1029 00:42:57,980 --> 00:43:01,680 Pa neka mi otvoriti tu idemo up--. 1030 00:43:01,680 --> 00:43:02,850 1031 00:43:02,850 --> 00:43:05,440 Pa neka me-- ćemo se vratiti na ovoj slici ne zadugo. 1032 00:43:05,440 --> 00:43:08,360 Dopustite mi da se otvori taj posljednji primjer ovdje. 1033 00:43:08,360 --> 00:43:09,440 1034 00:43:09,440 --> 00:43:12,710 >> Dakle, ovdje je super, super program koji ostvaruje 1035 00:43:12,710 --> 00:43:15,050 ništa u životu koji će napraviti sljedeće. 1036 00:43:15,050 --> 00:43:18,740 Prvi put deklarira dvije varijable, X i y, koji nisu brojevi ovaj put, 1037 00:43:18,740 --> 00:43:19,240 po sebi. 1038 00:43:19,240 --> 00:43:20,448 Oni nisu cijeli brojevi, sami po sebi. 1039 00:43:20,448 --> 00:43:22,899 Oni su očito int *. 1040 00:43:22,899 --> 00:43:25,690 Dakle, bilo tko, što to znači Ako vaš tip podataka, vaš promjenjiva, 1041 00:43:25,690 --> 00:43:26,860 je tipa int * zvijezde? 1042 00:43:26,860 --> 00:43:30,240 To je adresa int. 1043 00:43:30,240 --> 00:43:31,990 >> Dakle, nemam pojma gdje je još. 1044 00:43:31,990 --> 00:43:35,150 To samo znači "staviti, na kraju, adresu int ovdje. " 1045 00:43:35,150 --> 00:43:38,340 0x50, 0x88, gdje god je to u memorije, adresa ide tamo. 1046 00:43:38,340 --> 00:43:40,200 I to je ono što je y će biti, kao dobro. 1047 00:43:40,200 --> 00:43:44,920 >> Ako ja sada kažem x = malloc (sizeof (int)), ovo je fancy način govoreći, 1048 00:43:44,920 --> 00:43:49,000 hej operacijski sustav, putem malloc, daj mi dovoljno memorije za veličinu 1049 00:43:49,000 --> 00:43:52,370 od int, što je vjerojatno će biti 32 bita ili četiri bajta. 1050 00:43:52,370 --> 00:43:53,680 >> Pa što ne vraća malloc? 1051 00:43:53,680 --> 00:43:55,250 Malloc vraća adresu. 1052 00:43:55,250 --> 00:43:57,020 Dakle, što će se pohranjuju u X? 1053 00:43:57,020 --> 00:44:00,600 Adresu komad memorije, četiri bajta, koji malloc 1054 00:44:00,600 --> 00:44:03,360 upravo pronašao za mene pitajući operativni sustav. 1055 00:44:03,360 --> 00:44:08,240 >> Sada međuvremenu, linija četiri ovdje, * x = 42. 1056 00:44:08,240 --> 00:44:09,990 Samo da bude jasno, Što se događa tamo dolje? 1057 00:44:09,990 --> 00:44:11,530 Na lijevoj strani, * x. 1058 00:44:11,530 --> 00:44:13,610 to je kao * 33 Oxford Streetu. 1059 00:44:13,610 --> 00:44:15,523 Dakle * x znači što? 1060 00:44:15,523 --> 00:44:16,450 >> PUBLIKA: Idite na. 1061 00:44:16,450 --> 00:44:17,908 >> DAVID J. Malan: Idi na tu adresu. 1062 00:44:17,908 --> 00:44:20,466 Gdje god da je komad memorija, ići na njega. 1063 00:44:20,466 --> 00:44:21,979 I stavi ono što postoji, očito? 1064 00:44:21,979 --> 00:44:22,520 PUBLIKA: 42. 1065 00:44:22,520 --> 00:44:23,580 DAVID J. Malan: 42. 1066 00:44:23,580 --> 00:44:25,650 U redu, * y, ista ideja. 1067 00:44:25,650 --> 00:44:26,860 Idi na adresi u y. 1068 00:44:26,860 --> 00:44:31,740 Stavite broj 13 ima, ali ono što je y u ovom trenutku? 1069 00:44:31,740 --> 00:44:33,172 1070 00:44:33,172 --> 00:44:34,630 PUBLIKA: Nema memorije za y. 1071 00:44:34,630 --> 00:44:35,710 DAVID J. Malan: Postoji nema memorije za y. 1072 00:44:35,710 --> 00:44:38,215 Dakle, ono što se vjerojatno y sadrže, kao što smo rekli? 1073 00:44:38,215 --> 00:44:38,520 >> PUBLIKA: Garbage. 1074 00:44:38,520 --> 00:44:39,480 >> DAVID J. Malan: Neki smeća vrijednost. 1075 00:44:39,480 --> 00:44:41,320 Sada, smeće vrijednost je i dalje broj. 1076 00:44:41,320 --> 00:44:43,160 To još uvijek može biti u zabludi za adresu. 1077 00:44:43,160 --> 00:44:45,160 To je kao da je netko pisao nešto dolje, 1078 00:44:45,160 --> 00:44:48,002 i ja ga krivo protumačena kao značenju Neki zgrada niz ulicu. 1079 00:44:48,002 --> 00:44:50,460 A ako ste samo pokušati ići u Neki zgrada ne posjedujete, 1080 00:44:50,460 --> 00:44:53,710 ili neki komad memorije imate ne dano, loše stvari mogu dogoditi. 1081 00:44:53,710 --> 00:44:57,740 Računalo može srušiti, ili neki drugi neodređen ponašanje moglo dogoditi. 1082 00:44:57,740 --> 00:45:01,310 >> Dakle uvod, a zatim, kako bi Binky je to. 1083 00:45:01,310 --> 00:45:04,290 Još uvijek se sjećam, 20 neki ak godina kasnije, 1084 00:45:04,290 --> 00:45:07,200 gdje sam bio kad sam napokon razumio naputke. 1085 00:45:07,200 --> 00:45:09,520 >> Što će reći, ako ostavite ovdje u tri minute 1086 00:45:09,520 --> 00:45:12,170 i mislim da ne razumije naputke, shvatite 1087 00:45:12,170 --> 00:45:14,410 Ja sam se sjetio za 20 godine za nekog ludog razloga 1088 00:45:14,410 --> 00:45:17,140 kada i zašto je konačno potonuo u, sjedi s mojim nastave 1089 00:45:17,140 --> 00:45:19,501 kolega, Nishat Mehta u Stražnji dio Eliot blagovaonici. 1090 00:45:19,501 --> 00:45:21,250 Sad sam se sjetila to, jer je to bio 1091 00:45:21,250 --> 00:45:23,920 jedna od tema sam, u Konkretno, borili sa. 1092 00:45:23,920 --> 00:45:26,470 I onda, konačno kliknuli, kao što sam se usudio reći puno tema 1093 00:45:26,470 --> 00:45:27,460 na kraju će. 1094 00:45:27,460 --> 00:45:32,590 A sada, da bi se to osjetiti sve sretniji i sve uvjerljivije, 1095 00:45:32,590 --> 00:45:35,360 neka je konačni izgled u našem Posljednje tri minute ovdje na Binky, 1096 00:45:35,360 --> 00:45:37,675 od našeg prijatelja, Nick Parlante iz Stanforda. 1097 00:45:37,675 --> 00:45:38,910 1098 00:45:38,910 --> 00:45:41,580 >> [Video reprodukciju] 1099 00:45:41,580 --> 00:45:42,750 >> Hej, Binky. 1100 00:45:42,750 --> 00:45:43,500 Probudite se! 1101 00:45:43,500 --> 00:45:45,960 To je vrijeme za zabavu kazaljke. 1102 00:45:45,960 --> 00:45:47,012 >> Što je to? 1103 00:45:47,012 --> 00:45:48,723 Saznajte više o pokazivače? 1104 00:45:48,723 --> 00:45:50,580 Oh, slatkiši! 1105 00:45:50,580 --> 00:45:53,563 >> Pa, za početak, mislim da smo Trebat će par savjeta. 1106 00:45:53,563 --> 00:45:54,390 >> -OK. 1107 00:45:54,390 --> 00:45:57,930 Ovaj kod izdvaja dva pointera, što može ukazivati ​​na cijelih brojeva. 1108 00:45:57,930 --> 00:45:58,430 -OK. 1109 00:45:58,430 --> 00:46:02,140 Pa, vidim dva naputke, ali oni Ne čini se da ukazuju na ništa. 1110 00:46:02,140 --> 00:46:02,980 >> -Točno. 1111 00:46:02,980 --> 00:46:05,100 U početku, pokazivače ne ukazuju na ništa. 1112 00:46:05,100 --> 00:46:08,030 Stvari su ukazivale na nazivaju pointees, te ih postavljate-a 1113 00:46:08,030 --> 00:46:09,370 zaseban korak. 1114 00:46:09,370 --> 00:46:10,220 >> Oh, da, da. 1115 00:46:10,220 --> 00:46:10,950 Znao sam da je. 1116 00:46:10,950 --> 00:46:12,385 U pointees su odvojeni. 1117 00:46:12,385 --> 00:46:14,315 Hm, pa kako se izdvojiti pointee? 1118 00:46:14,315 --> 00:46:15,340 1119 00:46:15,340 --> 00:46:15,960 >> -OK. 1120 00:46:15,960 --> 00:46:18,970 Pa, ovaj kod izdvaja Novi broj pointee, 1121 00:46:18,970 --> 00:46:20,950 i ovom dijelu seta x ukazati na njega. 1122 00:46:20,950 --> 00:46:22,050 1123 00:46:22,050 --> 00:46:23,230 >> Hej, da izgleda bolje. 1124 00:46:23,230 --> 00:46:25,060 Tako bi se nešto učiniti. 1125 00:46:25,060 --> 00:46:25,990 >> -OK. 1126 00:46:25,990 --> 00:46:30,455 Ja ću dereference pokazivača x za pohraniti broj 42 u svojoj pointee. 1127 00:46:30,455 --> 00:46:32,830 Za ovaj trik, ja ću morati mom Čarobni štapić od Dereferencing. 1128 00:46:32,830 --> 00:46:34,130 1129 00:46:34,130 --> 00:46:36,080 >> -Vaš Čarobni štapić od Dereferencing? 1130 00:46:36,080 --> 00:46:37,357 1131 00:46:37,357 --> 00:46:38,190 To-- to je super. 1132 00:46:38,190 --> 00:46:39,340 1133 00:46:39,340 --> 00:46:41,080 >> -Ovo Je ono što kod izgleda. 1134 00:46:41,080 --> 00:46:44,110 Ja ću samo postaviti broj i [Pop] 1135 00:46:44,110 --> 00:46:44,700 >> Hej, gledaj. 1136 00:46:44,700 --> 00:46:46,140 Tamo to ide. 1137 00:46:46,140 --> 00:46:50,980 >> Znači radi se o dereference x slijedi strelica za pristup svoj pointee. 1138 00:46:50,980 --> 00:46:53,160 U tom slučaju, trgovina 42 unutra. 1139 00:46:53,160 --> 00:46:57,710 Hej pokušajte ga koristiti za pohranu broj 13 kroz druge pokazivača, y. 1140 00:46:57,710 --> 00:46:58,760 >> -OK. 1141 00:46:58,760 --> 00:47:03,270 Ja ću samo ići ovdje na Y, i dobiti broj 13 set up. 1142 00:47:03,270 --> 00:47:07,930 A onda, uzeti štap od Dereferencing i samo [BUZZ] 1143 00:47:07,930 --> 00:47:08,960 >> Oh! 1144 00:47:08,960 --> 00:47:09,500 >> Oh, hej! 1145 00:47:09,500 --> 00:47:11,090 To nije uspjelo. 1146 00:47:11,090 --> 00:47:15,630 Recimo, Binky, ja ne mislim da dereferencing y je dobra ideja, jer znate, 1147 00:47:15,630 --> 00:47:17,850 postavljanje pointee je zasebna korak. 1148 00:47:17,850 --> 00:47:20,450 I ne mislim da smo ikada to učinio. 1149 00:47:20,450 --> 00:47:21,480 >> Dobro točka. 1150 00:47:21,480 --> 00:47:21,980 Da. 1151 00:47:21,980 --> 00:47:25,680 Dodijeljeno smo pokazivača y, ali mi Nikada ga postaviti ukazati na pointee. 1152 00:47:25,680 --> 00:47:27,190 1153 00:47:27,190 --> 00:47:28,616 >> Vrlo pažljiv. 1154 00:47:28,616 --> 00:47:30,240 Hej, ti si izgleda dobro tamo, Binky. 1155 00:47:30,240 --> 00:47:33,400 Možete li to popraviti, tako da y bodova na isto pointee kao X? 1156 00:47:33,400 --> 00:47:34,000 >> Sigurno. 1157 00:47:34,000 --> 00:47:36,780 Ja ću koristiti svoj čarobni štapić od Pointer zadatak. 1158 00:47:36,780 --> 00:47:38,740 >> -Je Da će biti Problem kao prije? 1159 00:47:38,740 --> 00:47:39,240 Ne. 1160 00:47:39,240 --> 00:47:40,660 To ne dirajte pointees. 1161 00:47:40,660 --> 00:47:44,450 To samo mijenja jedan pokazivač ukazuju na istu stvar kao i drugi. 1162 00:47:44,450 --> 00:47:45,450 >> Oh, vidim. 1163 00:47:45,450 --> 00:47:48,200 Sada y ukazuje na istom mjestu kao X. 1164 00:47:48,200 --> 00:47:48,910 Dakle čekati. 1165 00:47:48,910 --> 00:47:49,950 Sada, y je fiksna. 1166 00:47:49,950 --> 00:47:51,120 Ima pointee. 1167 00:47:51,120 --> 00:47:54,510 Na taj način možete isprobati štap od Opet Dereferencing poslati 13 više. 1168 00:47:54,510 --> 00:47:56,510 >> -Uh, U redu. 1169 00:47:56,510 --> 00:47:58,160 Ovdje to ide. [POP] 1170 00:47:58,160 --> 00:47:59,340 >> Hej, vidi ovo. 1171 00:47:59,340 --> 00:48:00,750 Sada dereferencing radove na y. 1172 00:48:00,750 --> 00:48:04,991 I zato što su pokazivači dijele da je jedan pointee, obojica vidjeli 13. 1173 00:48:04,991 --> 00:48:05,490 Da. 1174 00:48:05,490 --> 00:48:06,870 Dijeljenje, god. 1175 00:48:06,870 --> 00:48:08,820 Tako ćemo se prebaciti mjesta sada? 1176 00:48:08,820 --> 00:48:09,440 >> Oh, vidi. 1177 00:48:09,440 --> 00:48:10,830 Nemamo više vremena. 1178 00:48:10,830 --> 00:48:11,570 >> -But-- 1179 00:48:11,570 --> 00:48:13,530 >> Samo zapamtite tri pokazivača pravila. 1180 00:48:13,530 --> 00:48:16,560 Broj Jedan, osnovna struktura je da imate pokazivač, 1181 00:48:16,560 --> 00:48:18,680 i to ukazuje više na pointee. 1182 00:48:18,680 --> 00:48:20,640 Ali pokazivač i pointee su odvojeni, 1183 00:48:20,640 --> 00:48:22,610 i uobičajena pogreška je postaviti pokazivač, 1184 00:48:22,610 --> 00:48:25,000 ali zaboraviti dati ga pointee. 1185 00:48:25,000 --> 00:48:28,170 >> Broj Dva, pokazivač dereferencing počinje u pokazivača 1186 00:48:28,170 --> 00:48:31,050 i slijedi svoj strelicu nad pristupiti njegovu pointee. 1187 00:48:31,050 --> 00:48:33,400 Kao što svi znamo, to radi samo ako postoji 1188 00:48:33,400 --> 00:48:36,270 pointee, koja vrsta dobiva natrag na pravilo broj jedan. 1189 00:48:36,270 --> 00:48:39,000 >> Broj tri, pokazivač Dodjela traje jedan pokazivač 1190 00:48:39,000 --> 00:48:42,320 a mijenja ga ukazati na Isto pointee kao drugi pokazivač. 1191 00:48:42,320 --> 00:48:44,160 Dakle, nakon što je zadatak, dva pokazivače 1192 00:48:44,160 --> 00:48:45,910 će ukazati na isto pointee. 1193 00:48:45,910 --> 00:48:47,990 Ponekad, to se zove dijeljenje. 1194 00:48:47,990 --> 00:48:49,740 I to je sve što je na njega, stvarno. 1195 00:48:49,740 --> 00:48:50,277 Bye-bye sada. 1196 00:48:50,277 --> 00:48:51,110 [END video reprodukciju] 1197 00:48:51,110 --> 00:48:52,568 DAVID J. Malan: To je to za CS50. 1198 00:48:52,568 --> 00:48:55,110 Mi ćemo vas vidjeti sljedeći tjedan. 1199 00:48:55,110 --> 00:48:56,064