1 00:00:00,000 --> 00:00:01,110 >> [Predvajanje glasbe] 2 00:00:01,110 --> 00:00:10,567 3 00:00:10,567 --> 00:00:11,650 DAVID J. Malan: Dobro. 4 00:00:11,650 --> 00:00:15,610 To je CS50, in to je konec tedna Four. 5 00:00:15,610 --> 00:00:19,420 In ena od tem danes je, da za digitalno forenziko, 6 00:00:19,420 --> 00:00:20,989 Umetnost obnavljanju informacij. 7 00:00:20,989 --> 00:00:22,780 In res, čeprav ste v sredi 8 00:00:22,780 --> 00:00:25,070 zdaj miru na treh in Breakout, naslednji teden, 9 00:00:25,070 --> 00:00:27,880 Poudarek bo na Ravno to domeno. 10 00:00:27,880 --> 00:00:30,686 >> Tako je eden izmed najboljših mest kar sem jih kdaj imel je že v šoli: 11 00:00:30,686 --> 00:00:33,560 ko sem delal za lokalne Middlesex County District Attorney je 12 00:00:33,560 --> 00:00:34,950 pisarne, delaš forenziki delo. 13 00:00:34,950 --> 00:00:37,450 Torej v bistvu, Massachusetts Državna policija, občasno 14 00:00:37,450 --> 00:00:40,100 Pri delu na primerih bi prinašajo stvari, kot so trdi diski 15 00:00:40,100 --> 00:00:42,185 in diskete in spominske kartice in podobno. 16 00:00:42,185 --> 00:00:44,060 In bi jih roko za mene in moj mentor, 17 00:00:44,060 --> 00:00:48,070 in naš cilj je bil najti dokaze, ali je bil prisoten na teh medijih. 18 00:00:48,070 --> 00:00:50,700 Zdaj, ste morda opazili utrinki od tega sveta forenzike 19 00:00:50,700 --> 00:00:53,000 v medijih, TV in filme. 20 00:00:53,000 --> 00:00:55,730 Ampak delo sem imel, in si trditi, da je svet, 21 00:00:55,730 --> 00:00:57,550 ni čisto tako kot bi jo videl. 22 00:00:57,550 --> 00:01:00,794 Oglejmo si, kaj Verjetno ste že opazili. 23 00:01:00,794 --> 00:01:01,460 [VIDEO PREDVAJANJE] 24 00:01:01,460 --> 00:01:02,930 -OK. 25 00:01:02,930 --> 00:01:05,380 Zdaj, kaj je dobil dober pogled na vas. 26 00:01:05,380 --> 00:01:06,850 >> [Predvajanje glasbe] 27 00:01:06,850 --> 00:01:12,260 28 00:01:12,260 --> 00:01:12,932 >> Ga Počakaj. 29 00:01:12,932 --> 00:01:13,657 Teči nazaj. 30 00:01:13,657 --> 00:01:14,733 >> Počakaj malo. 31 00:01:14,733 --> 00:01:15,233 Desno. 32 00:01:15,233 --> 00:01:16,371 33 00:01:16,371 --> 00:01:16,870 -Obstaja. 34 00:01:16,870 --> 00:01:17,369 Zamrzniti. 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 Zamrzniti. 38 00:01:18,875 --> 00:01:20,160 Omejilo up o tem, boste? 39 00:01:20,160 --> 00:01:22,126 >> -Vector V naprej, da tip z zadnjim kolesom. 40 00:01:22,126 --> 00:01:24,435 >> -Zoom Se tukaj na tem mestu. 41 00:01:24,435 --> 00:01:28,580 >> -z Pravo opremo, slika se lahko razširi in izostrili. 42 00:01:28,580 --> 00:01:29,330 >> Kaj je to? 43 00:01:29,330 --> 00:01:30,780 >> -To Program za izboljšanje. 44 00:01:30,780 --> 00:01:32,170 >> -Lahko Jasno, da se katera koli? 45 00:01:32,170 --> 00:01:33,070 >> Ne vem. 46 00:01:33,070 --> 00:01:34,150 Naj ga izboljšati. 47 00:01:34,150 --> 00:01:35,440 >> -Enhance Oddelek A6. 48 00:01:35,440 --> 00:01:36,570 49 00:01:36,570 --> 00:01:38,562 I okrepljeno podrobnosti in-- 50 00:01:38,562 --> 00:01:40,020 Mislim, da je dovolj za izboljšanje. 51 00:01:40,020 --> 00:01:40,976 Javnost na mojem zaslonu. 52 00:01:40,976 --> 00:01:42,559 >> Jaz povečala odsev v svojem očesu. 53 00:01:42,559 --> 00:01:44,322 Pusti se ta teče skozi video opremo. 54 00:01:44,322 --> 00:01:45,210 >> -Edgar, Lahko okrepi to? 55 00:01:45,210 --> 00:01:45,710 >> -Hang Naprej. 56 00:01:45,710 --> 00:01:47,570 57 00:01:47,570 --> 00:01:49,458 >> -Nikoli Delali na tem razmisleku. 58 00:01:49,458 --> 00:01:50,402 >> Odsev -Tam nekoga. 59 00:01:50,402 --> 00:01:50,902 >> -Reflection. 60 00:01:50,902 --> 00:01:52,870 -Tam Odraz moškega obraza. 61 00:01:52,870 --> 00:01:53,694 >> -V Razmislek! 62 00:01:53,694 --> 00:01:54,610 -Tam Odsev. 63 00:01:54,610 --> 00:01:55,880 -Zoom V na ogledalu. 64 00:01:55,880 --> 00:01:57,860 Lahko vidite odsev. 65 00:01:57,860 --> 00:01:59,630 >> -Lahko Izboljšati podobo od tu? 66 00:01:59,630 --> 00:02:00,377 67 00:02:00,377 --> 00:02:01,210 -Lahko Ga izboljšati? 68 00:02:01,210 --> 00:02:02,190 -Lahko Ga izboljšati? 69 00:02:02,190 --> 00:02:03,066 -Se Lahko okrepi to? 70 00:02:03,066 --> 00:02:03,898 -Lahko Ga izboljšati? 71 00:02:03,898 --> 00:02:04,740 Počakaj trenutek. 72 00:02:04,740 --> 00:02:05,281 Bom povečati. 73 00:02:05,281 --> 00:02:06,470 -Zoom V na vratih. 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 Umakni se. 77 00:02:08,509 --> 00:02:09,340 Bolj. 78 00:02:09,340 --> 00:02:10,094 Počakaj, nehaj. 79 00:02:10,094 --> 00:02:10,750 Nehajte. 80 00:02:10,750 --> 00:02:11,250 Ga -Pause. 81 00:02:11,250 --> 00:02:13,542 -Rotate Za 75 stopinj okoli vertikalne, prosim. 82 00:02:13,542 --> 00:02:14,750 83 00:02:14,750 --> 00:02:16,127 >> Nehajte. 84 00:02:16,127 --> 00:02:19,330 Pojdi nazaj na delu o vratih znova. 85 00:02:19,330 --> 00:02:21,420 >> Imam ga slikovno ojačevalec, ki lahko Bitmap? 86 00:02:21,420 --> 00:02:24,420 >> Mogoče bomo lahko uporabite Pradeep Singh način, da vidite v oknih. 87 00:02:24,420 --> 00:02:25,902 >> -V Programska oprema je stanje tehnike. 88 00:02:25,902 --> 00:02:26,866 >> -V Lastna vrednost je off. 89 00:02:26,866 --> 00:02:29,758 >> -z Desno Kombinacija algorithms-- 90 00:02:29,758 --> 00:02:32,168 >> Sprejeti osvetlitev -On algoritmi na naslednjo stopnjo, 91 00:02:32,168 --> 00:02:34,110 in jih lahko uporabite za krepitev tega fotografijo. 92 00:02:34,110 --> 00:02:36,840 >> -Zakleni Za povečavo in Z-os. 93 00:02:36,840 --> 00:02:37,351 >> -Enhance. 94 00:02:37,351 --> 00:02:37,850 Povečati. 95 00:02:37,850 --> 00:02:38,720 -Enhance. 96 00:02:38,720 --> 00:02:40,070 -Freeze In okrepiti. 97 00:02:40,070 --> 00:02:43,420 [END VIDEO PREDVAJANJE] 98 00:02:43,420 --> 00:02:45,830 DAVID J. Malan: Torej tistih, ki so vse besede, vendar niso bili 99 00:02:45,830 --> 00:02:47,870 pravilno uporablja v stavkih. 100 00:02:47,870 --> 00:02:52,370 In seveda tudi v prihodnje, kadarkoli, prosim, slišiš nekoga reči besedo, 101 00:02:52,370 --> 00:02:54,250 "Izboljšati" hihitati le malo. 102 00:02:54,250 --> 00:02:57,190 Ker, ko boste poskušali povečati, na primer, to se zgodi. 103 00:02:57,190 --> 00:02:58,580 >> Torej, tukaj je čudovito fotografijo. 104 00:02:58,580 --> 00:02:59,720 To je CS50 lastne Daven. 105 00:02:59,720 --> 00:03:03,740 In domnevam, da smo želeli osredotočiti na Svjetlucati v njegovih očeh, 106 00:03:03,740 --> 00:03:05,870 ali odsev slab človek, ki je bil očitno 107 00:03:05,870 --> 00:03:07,820 zajet z varnostno kamero. 108 00:03:07,820 --> 00:03:10,330 To je tisto, kar se zgodi, ko si povečate slike, ki 109 00:03:10,330 --> 00:03:14,060 ima le končno število bitov, povezanih z njim. 110 00:03:14,060 --> 00:03:15,420 >> To je tisto, ki bi jih dobili. 111 00:03:15,420 --> 00:03:19,190 In res, v Daven oko je le štiri, mogoče šest točk 112 00:03:19,190 --> 00:03:22,110 da sestavite točno, kaj je bil tam blesteče. 113 00:03:22,110 --> 00:03:25,890 Torej Problem Set Four bo na koncu imela ste raziskati ta svet, še zlasti 114 00:03:25,890 --> 00:03:28,090 po naravi nekaj pravimo datoteka i / o, kjer 115 00:03:28,090 --> 00:03:31,000 i / o je samo fancy način pravijo, vhod in izhod. 116 00:03:31,000 --> 00:03:34,280 >> Tako doslej, vse interakcij smo imeli z računalnikom 117 00:03:34,280 --> 00:03:36,770 so bili v veliki meri s svojim tipkovnico in zaslon, 118 00:03:36,770 --> 00:03:40,770 vendar ne toliko z trdem disku ali reševanje datotek presegajo tiste, ki jih 119 00:03:40,770 --> 00:03:41,620 sami napisali. 120 00:03:41,620 --> 00:03:44,570 Vaši programi doslej ne ustvarja, in varčevanje, 121 00:03:44,570 --> 00:03:46,270 in posodabljanje svoje datoteke. 122 00:03:46,270 --> 00:03:47,150 >> No, kaj je datoteka? 123 00:03:47,150 --> 00:03:48,105 No, nekaj takega kot JPEG. 124 00:03:48,105 --> 00:03:50,520 To je slika, ki jo morda imeti ali naložite na Facebook, 125 00:03:50,520 --> 00:03:51,690 ali glej kjerkoli na spletu. 126 00:03:51,690 --> 00:03:54,460 Dejansko je ta fotografija smo pravkar žaga za Daven je JPEG. 127 00:03:54,460 --> 00:03:57,570 In kaj je zanimivo o datotekah, kot so JPEG 128 00:03:57,570 --> 00:04:02,170 je, da jih je mogoče identificirati, običajno, z določenimi vzorci bitov. 129 00:04:02,170 --> 00:04:05,200 >> Z drugimi besedami, kaj je to, da ločuje JPEG iz GIF 130 00:04:05,200 --> 00:04:08,109 iz PING iz Worda Dokument iz Excelove datoteke? 131 00:04:08,109 --> 00:04:09,900 No, to je samo drugačna vzorce bitov. 132 00:04:09,900 --> 00:04:12,820 In ti različni vzorci ponavadi na začetku teh datotek. 133 00:04:12,820 --> 00:04:18,200 >> Tako da ko računalnik odpre Word, doc, ali ko računalnik odpre JPEG, 134 00:04:18,200 --> 00:04:20,940 izgleda, običajno na Prvih nekaj bitov v datoteki. 135 00:04:20,940 --> 00:04:24,059 In če je prepozna vzorec, pravi, oh, to je podoba. 136 00:04:24,059 --> 00:04:25,850 Dovolite mi, da jo prikažejo uporabnik kot grafiko. 137 00:04:25,850 --> 00:04:27,870 Ali pa, oh, to izgleda kot Word doc. 138 00:04:27,870 --> 00:04:30,480 Naj pokažejo, da uporabnik kot esej. 139 00:04:30,480 --> 00:04:33,020 >> Torej za primer, JPEG, Izkaže se, da so 140 00:04:33,020 --> 00:04:35,460 dokaj prefinjen pod pokrovom. 141 00:04:35,460 --> 00:04:40,140 Ampak prvi trije bajti v večini vsak JPEG začelo s temi tremi številkami. 142 00:04:40,140 --> 00:04:44,680 Tako bajt nič, ena, dva pa sta v Najbolj vsak JPEG, 255, potem je število 143 00:04:44,680 --> 00:04:46,675 216, nato pa številko 255. 144 00:04:46,675 --> 00:04:48,990 >> In kaj boste lahko za naslednji teden začeti početje 145 00:04:48,990 --> 00:04:52,920 dejansko dreza pod hood datotek, kot so JPEG 146 00:04:52,920 --> 00:04:57,210 in kot bitne datoteke, in videli kaj je bil vedno tam, dokler 147 00:04:57,210 --> 00:04:58,650 kot ste bili z uporabo računalnika. 148 00:04:58,650 --> 00:05:01,860 >> Ampak kaj ni običajno napisana kot decimalni števili, kot je ta. 149 00:05:01,860 --> 00:05:04,620 Računalniški znanstveniki ne ponavadi govorijo decimalko. 150 00:05:04,620 --> 00:05:06,139 Ti res ne govorijo v binarno. 151 00:05:06,139 --> 00:05:07,930 Značilno je, ko želimo izraziti s števili, 152 00:05:07,930 --> 00:05:10,710 smo dejansko uporabili šestnajstiški, ki se morda spomniš 153 00:05:10,710 --> 00:05:13,027 od, recimo, problema, ki Ena, ki je izpodbijala 154 00:05:13,027 --> 00:05:14,610 ste, da razmišljajo o drugačnem sistemu. 155 00:05:14,610 --> 00:05:17,170 >> Mi, seveda, so seznanjeni z decimalko, ničelne skozi devet. 156 00:05:17,170 --> 00:05:18,215 Pogovarjala sva se o binarno. 157 00:05:18,215 --> 00:05:20,710 In ne bomo res za uporabo, da je veliko tukaj 158 00:05:20,710 --> 00:05:22,470 ven, saj bodo računalniki, ki uporabljajo. 159 00:05:22,470 --> 00:05:24,900 Ampak programerji bo zelo pogosto, vendar ne vedno, 160 00:05:24,900 --> 00:05:29,360 uporabite šestnajstiški, kar samo pomeni, imate 16 črk v vaši abecede, 161 00:05:29,360 --> 00:05:31,330 v nasprotju z dvema ali 10. 162 00:05:31,330 --> 00:05:34,530 >> Torej, kako si štej do višje kot devet šestnajstiško? 163 00:05:34,530 --> 00:05:41,120 Ti gredo 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, samo po dogovoru. 164 00:05:41,120 --> 00:05:43,540 Toda kaj je ključnega pomena je, da vsak od teh je ena simbol. 165 00:05:43,540 --> 00:05:44,340 Ni 10. 166 00:05:44,340 --> 00:05:48,400 Ni 11, samo po sebi, ker vsak vaših številk, tako kot v decimalni 167 00:05:48,400 --> 00:05:51,940 in tako kot v binarno, če bi le biti en sam znak, po dogovoru. 168 00:05:51,940 --> 00:05:55,280 >> Tako da je potem abeceda imamo na razpolago za šestnajstiško. 169 00:05:55,280 --> 00:05:58,600 Torej, kaj JPEG videti, če vas je bilo, da napišete tiste prve tri 170 00:05:58,600 --> 00:06:01,980 ne bajti kot decimalko, ampak na primer, kot heksadecimalno? 171 00:06:01,980 --> 00:06:03,640 In zakaj je čarovnica tudi vse to koristno? 172 00:06:03,640 --> 00:06:05,290 >> No, hiter pogled na primer. 173 00:06:05,290 --> 00:06:09,030 Torej, če pišem iz bitov, ki predstavljajo te decimalno numbers-- 174 00:06:09,030 --> 00:06:12,450 to je lahko malo zarjavel zdaj od nekaj tednov nazaj, 175 00:06:12,450 --> 00:06:14,820 vendar leva in pravi, so precej enostavno. 176 00:06:14,820 --> 00:06:17,990 255 je bilo največje število smo lahko predstavlja osem bitov. 177 00:06:17,990 --> 00:06:18,820 To je bilo vse tiste. 178 00:06:18,820 --> 00:06:21,320 Torej, edini, ki je rahlo Zanimivo je sredinska. 179 00:06:21,320 --> 00:06:24,700 In če ste nekako storiti math, boste sklepati, da je res, 180 00:06:24,700 --> 00:06:27,949 da vzorec enega in ničle predstavlja 216. 181 00:06:27,949 --> 00:06:30,240 Tako da se določi, za zdaj, da so to pravilno. 182 00:06:30,240 --> 00:06:31,730 Ampak zakaj je to zanimivo? 183 00:06:31,730 --> 00:06:33,970 >> No, bajt, seveda, je osem bitov. 184 00:06:33,970 --> 00:06:38,980 In izkazalo se je, da če mislite, da bajta kot dveh koščkih štirih bitov, 185 00:06:38,980 --> 00:06:39,500 kot je ta. 186 00:06:39,500 --> 00:06:41,000 Naj samo dodamo nekaj prostora. 187 00:06:41,000 --> 00:06:42,550 Torej, pred, po. 188 00:06:42,550 --> 00:06:46,520 Pravkar sem dodal nekaj belega prostora zavoljo Vizualizacija je tukaj. 189 00:06:46,520 --> 00:06:51,840 Kako bi lahko zdaj zastopa v, recimo, šestnajstiški vsak quad bitov, 190 00:06:51,840 --> 00:06:52,880 vsak niz štirih bitov? 191 00:06:52,880 --> 00:06:56,420 >> Tako, na primer, na levi Zdaj imamo 1111 v binarno. 192 00:06:56,420 --> 00:07:00,420 Kaj je to število v decimalni, če vam iz matematike? 193 00:07:00,420 --> 00:07:03,780 Imate tisti kraj, dvojke mesto, mesto štirice in osmice mesto. 194 00:07:03,780 --> 00:07:04,341 >> OBČINSTVO: 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 Torej, če naredimo osem plus štiri plus dva plus ena, smo dobili 15. 197 00:07:08,340 --> 00:07:11,790 Tako da sem lahko napišejo 15 spodaj 1111, vendar je poanta tu 198 00:07:11,790 --> 00:07:13,190 je šestnajstiški, ni desetiško. 199 00:07:13,190 --> 00:07:17,310 Torej, namesto da bi zapisala 15, 1-5, Jaz bom napisala, da je v šestnajstiškem, 200 00:07:17,310 --> 00:07:22,311 ki, če menite, nazaj, če imate nič do f, kar je 15 bo? 201 00:07:22,311 --> 00:07:22,810 OBČINSTVO: f. 202 00:07:22,810 --> 00:07:24,434 DAVID J. Malan: Torej se je izkazalo, da je f. 203 00:07:24,434 --> 00:07:29,140 In lahko delo, ki ga izvajajo z besedami, tudi, če je 10, potem OK, f je 15. 204 00:07:29,140 --> 00:07:33,250 Torej res, lahko zapišemo ta isti nabor številk kot F f. 205 00:07:33,250 --> 00:07:35,750 In potem, če mi malo matematike, bomo sklepam, da je to d. 206 00:07:35,750 --> 00:07:38,650 Osem je zelo enostavno, saj smo imajo enega v osmic mestu. 207 00:07:38,650 --> 00:07:40,620 In potem imamo nekaj več f f je. 208 00:07:40,620 --> 00:07:44,669 >> Torej, kaj ljudje ponavadi ne po dogovoru ko uporabljajo šestnajstiški je pa samo 209 00:07:44,669 --> 00:07:47,710 napisati to malo bolj na kratko, znebiti večina tega praznega prostora. 210 00:07:47,710 --> 00:07:50,890 In samo, da je zelo jasno, da bralci, da je to šestnajstiški, 211 00:07:50,890 --> 00:07:54,670 preprost konvencija med ljudje se pišeš nič 212 00:07:54,670 --> 00:07:58,000 x, ki nima nobenega drugega pomena kot vizualna identifikator, 213 00:07:58,000 --> 00:07:59,590 Prihaja številka hex. 214 00:07:59,590 --> 00:08:04,210 >> In potem si dal dve številki, f f je v tem primeru, potem d, nato f f. 215 00:08:04,210 --> 00:08:06,700 Tako da skrajšam zgodbo, šestnajstiški samo nagiba 216 00:08:06,700 --> 00:08:11,990 da je koristno, ker je vsak od njenih cifre, nič do f, brezhibno linije 217 00:08:11,990 --> 00:08:13,880 z vzorcem štirih bitov. 218 00:08:13,880 --> 00:08:18,080 >> Torej, če imate dva šestnajstiških številk, nič s F, znova in znova, 219 00:08:18,080 --> 00:08:20,256 ki vam daje odlično osem bitov ali en bajt. 220 00:08:20,256 --> 00:08:22,380 Torej, to je, zakaj se nagiba k je konvencionalno koristno. 221 00:08:22,380 --> 00:08:24,990 Ni intelektualne vsebina res po tem, 222 00:08:24,990 --> 00:08:27,010 razen njegovo dejansko uporabnost. 223 00:08:27,010 --> 00:08:29,310 >> Zdaj JPEG niso le formate za grafiko. 224 00:08:29,310 --> 00:08:33,230 Morda se boste spomnili, da obstajajo datoteke, kot je to v svetu, 225 00:08:33,230 --> 00:08:34,830 vsaj od nekaj let nazaj. 226 00:08:34,830 --> 00:08:37,580 >> Torej, to je bil dejansko nameščen v operacijskem sistemu Windows XP 227 00:08:37,580 --> 00:08:39,960 na milijone osebnih računalnikov po vsem svetu. 228 00:08:39,960 --> 00:08:43,000 In to je bil bitmap datoteke, BMP. 229 00:08:43,000 --> 00:08:47,690 In bitno sliko, kot boste videli naslednji teden, samo pomeni vzorec pik, 230 00:08:47,690 --> 00:08:51,710 pik kot oni imenujejo, map na bitov, res. 231 00:08:51,710 --> 00:08:55,160 >> Torej, kaj je zanimivo, čeprav, O tej obliki zapisa datoteke, BMP, je 232 00:08:55,160 --> 00:08:58,590 da je pod pokrovom, jo je več kot samo treh bajtov 233 00:08:58,590 --> 00:09:01,020 da sestavite svojo glavo, tako da govoriti, prvih nekaj grižljajev. 234 00:09:01,020 --> 00:09:03,330 To dejansko izgleda malo zapleteno na prvi pogled. 235 00:09:03,330 --> 00:09:04,704 In boste videli v P nizu. 236 00:09:04,704 --> 00:09:06,810 In dobili nekaj zlasti od tega zdaj 237 00:09:06,810 --> 00:09:10,720 ni tako pomembna, saj samo dejstvo da je na začetku vsakega bitne 238 00:09:10,720 --> 00:09:13,823 Datoteka, grafični format, tam je cel kup številk. 239 00:09:13,823 --> 00:09:14,980 240 00:09:14,980 --> 00:09:16,720 >> Zdaj Microsoft, avtor tega formata, 241 00:09:16,720 --> 00:09:18,820 skuša poklicati tiste, stvari ne ints in znakov 242 00:09:18,820 --> 00:09:22,259 in boje, ampak besede in d besede in hrepeni in zlogov. 243 00:09:22,259 --> 00:09:23,800 Torej, oni so samo različne vrste podatkov. 244 00:09:23,800 --> 00:09:25,170 Oni so različna imena za isto stvar. 245 00:09:25,170 --> 00:09:26,740 Vendar pa boste videli, da je v P določili štiri. 246 00:09:26,740 --> 00:09:31,450 >> Toda to je samo reči, da če človek double-klikne nekaj .BMP datoteko na njegov 247 00:09:31,450 --> 00:09:35,015 ali pa se odpre njena trdi disk, in okna se mu, da je slika, ki prikazuje, 248 00:09:35,015 --> 00:09:38,500 to se je zgodilo zato, ker je poslovanje Sistem domnevno opazili samo 249 00:09:38,500 --> 00:09:41,460 Podaljšanje .BMP datoteka v ime datoteke, 250 00:09:41,460 --> 00:09:45,010 ampak tudi dejstvo, da je nekaj Konvencija z vzorcem bitov 251 00:09:45,010 --> 00:09:47,490 na samem začetku te bitno sliko. 252 00:09:47,490 --> 00:09:50,270 >> Ampak kaj je zdaj osredotočiti na tako zapleten datoteka 253 00:09:50,270 --> 00:09:52,120 ampak za kaj takega. 254 00:09:52,120 --> 00:09:55,190 Recimo, da sem v gedit, I samo še začetke 255 00:09:55,190 --> 00:09:57,070 programa, ki je zelo preprost. 256 00:09:57,070 --> 00:09:58,860 Imam nekaj vključuje do vrha. 257 00:09:58,860 --> 00:10:02,120 Zdaj imam # include "structs.h", vendar Pridem nazaj, da je v trenutku. 258 00:10:02,120 --> 00:10:03,974 Ampak to je koristno za zdaj. 259 00:10:03,974 --> 00:10:05,890 Torej je to program da bo za izvajanje 260 00:10:05,890 --> 00:10:07,335 kot baze podatkov registrar. 261 00:10:07,335 --> 00:10:09,710 Torej baza študentov, in vsak študent na svetu 262 00:10:09,710 --> 00:10:13,190 ima ime in hišo in verjetno nekaj druge stvari, vendar bomo bo enostavno. 263 00:10:13,190 --> 00:10:15,140 Vsak študent ima ime in hišo. 264 00:10:15,140 --> 00:10:17,700 >> Torej, če sem hotel napisati Program, katerega namen v življenju 265 00:10:17,700 --> 00:10:19,860 Pravkar se je, da izbirate iz nič na do tri, 266 00:10:19,860 --> 00:10:22,070 če obstaja trem študentom na Univerzi Harvard. 267 00:10:22,070 --> 00:10:25,350 In želim, da bi dobili z uporabo GetString, Ime in house vsakega študenta, 268 00:10:25,350 --> 00:10:26,600 in potem samo natisnete jih ven. 269 00:10:26,600 --> 00:10:28,630 >> To je nekako tako kot tednom One, Two Week stvari zdaj, 270 00:10:28,630 --> 00:10:30,810 kadar hočem za zanka ali nekaj takega. 271 00:10:30,810 --> 00:10:34,500 In želim, da pokličete GetString nekaj krat, in nato natisnete f nekajkrat. 272 00:10:34,500 --> 00:10:37,340 Torej, kako bi jaz to narediti, čeprav, kadar tako ime in hiša 273 00:10:37,340 --> 00:10:39,070 sodelujejo za vsakega študenta? 274 00:10:39,070 --> 00:10:42,830 >> Torej moj prvi instinkt morda biti za kaj takega. 275 00:10:42,830 --> 00:10:49,620 Jaz bi najprej rekli, dobro, daj mi, pravijo, niz nizov imenovanih imena. 276 00:10:49,620 --> 00:10:51,530 In jaz ne želim hardcode tri tukaj. 277 00:10:51,530 --> 00:10:53,064 Kaj želim, da tam čaka? 278 00:10:53,064 --> 00:10:55,730 Torej ŠTUDENTI, ker je to ravno stalna razglašen na vrhu, 279 00:10:55,730 --> 00:10:57,860 samo zato, da mi ne bi bilo treba hardcode tri na več mestih. 280 00:10:57,860 --> 00:11:00,859 Na ta način ga lahko spremenite za eno mesto, in vpliva na spremembo povsod. 281 00:11:00,859 --> 00:11:04,470 In potem bi jaz Niz hiš študentov. 282 00:11:04,470 --> 00:11:10,250 >> In zdaj, bi jaz naredil kaj takega for (int i = 0; i <študentov; i ++. 283 00:11:10,250 --> 00:11:14,390 Torej sem tipkanje hitro, vendar je to verjetno seznanjeni sintaksa zdaj. 284 00:11:14,390 --> 00:11:17,030 >> In zdaj, to je novejši. 285 00:11:17,030 --> 00:11:22,890 Če želim dati v i-th ime študenta, mislim, da to storim. 286 00:11:22,890 --> 00:11:26,480 In potem, ne imena ampak hiše oklepati i. 287 00:11:26,480 --> 00:11:29,930 Storim to, GetString, in pustite, grem nazaj in popraviti to linijo. 288 00:11:29,930 --> 00:11:30,430 Se strinjate? 289 00:11:30,430 --> 00:11:31,200 Strinjate? 290 00:11:31,200 --> 00:11:32,366 To ni zelo uporabniku prijazen. 291 00:11:32,366 --> 00:11:33,890 Nisem še povedal, za kaj naj stori. 292 00:11:33,890 --> 00:11:36,520 >> Toda zdaj, če sem prav želel kasneje, dajva 293 00:11:36,520 --> 00:11:40,060 recimo, natisnite te stvari out-- tako TODO kasneje. 294 00:11:40,060 --> 00:11:42,330 Grem narediti več z to-- to verjetno pomeni 295 00:11:42,330 --> 00:11:45,970 pravilno izvajanje dobili imena in hiše, tri 296 00:11:45,970 --> 00:11:48,870 jih skupno vsak od uporabnika. 297 00:11:48,870 --> 00:11:51,280 >> Vendar to ni zelo dober design, kajne? 298 00:11:51,280 --> 00:11:55,220 Kaj pa, če ima študent ne le ime in hiše, ampak tudi ID številko, 299 00:11:55,220 --> 00:11:57,770 in telefonsko številko, in e-poštni naslov, 300 00:11:57,770 --> 00:12:00,280 in morda domača stran, in Mogoče ročaj Twitter, 301 00:12:00,280 --> 00:12:03,730 in poljubno število drugih podrobnosti povezana s študent ali oseba, 302 00:12:03,730 --> 00:12:04,610 bolj na splošno. 303 00:12:04,610 --> 00:12:07,720 Kako bi začeli dodati Funkcionalnost na tem programu? 304 00:12:07,720 --> 00:12:14,080 >> No, počutim se kot najenostavnejši način bi lahko biti, da narediš nekaj podobnega, recimo, 305 00:12:14,080 --> 00:12:16,490 int IDS študentov. 306 00:12:16,490 --> 00:12:18,380 Tako da sem lahko dal vse svoje ID-tam. 307 00:12:18,380 --> 00:12:22,240 In potem, za nekaj kot so telefonske številke, 308 00:12:22,240 --> 00:12:24,400 Nisem prepričan, kako pomenijo, da je samo še. 309 00:12:24,400 --> 00:12:30,280 Torej, gremo naprej in samo klic to Twitters študentov, ki 310 00:12:30,280 --> 00:12:33,550 je malo čudno, ampak-- in kup več področjih. 311 00:12:33,550 --> 00:12:36,360 >> Sem začel, da učinkovito kopiraj in prilepi tukaj. 312 00:12:36,360 --> 00:12:39,416 In to se bo precej povečala nepriročno precej hitro, kajne? 313 00:12:39,416 --> 00:12:42,290 Ali ne bi bilo lepo, če bi bilo v svetu znana podatkovna struktura 314 00:12:42,290 --> 00:12:45,600 ne kot int ali niz, vendar nekaj višji nivo, abstrakcija, tako 315 00:12:45,600 --> 00:12:47,570 govoriti, znano kot študent? 316 00:12:47,570 --> 00:12:50,220 C ni prišel z vgrajenim funkcionalnost za študente, 317 00:12:50,220 --> 00:12:52,260 kaj pa če sem hotel, da bi ga na primer? 318 00:12:52,260 --> 00:12:55,640 >> No, izkazalo se je, da bom Datoteko odprete tako imenovano structs.h tukaj, 319 00:12:55,640 --> 00:12:57,090 in lahko narediš točno to. 320 00:12:57,090 --> 00:12:58,290 In bomo s tem začnemo takoj. 321 00:12:58,290 --> 00:13:01,490 In pod pokrovom zastavila tri P, ste že bili to počne zdaj. 322 00:13:01,490 --> 00:13:05,920 Ni take stvari kot g RECT no ali g oval v programskem jeziku C. 323 00:13:05,920 --> 00:13:10,570 >> Ljudje na Stanfordu izvajajo tisti, Vrste podatkov, ki jih uporabljajo ta pristop tu, 324 00:13:10,570 --> 00:13:13,900 razglasitvi svoje nove podatke Vrste, ki uporabljajo novo ključno besedo 325 00:13:13,900 --> 00:13:16,744 imenovano struct in drugo ena imenovana typedef. 326 00:13:16,744 --> 00:13:19,660 In res, čeprav sintaksa zgleda malo drugačna od stvari 327 00:13:19,660 --> 00:13:23,550 smo videli prej, v Načelo, da je zelo preprost. 328 00:13:23,550 --> 00:13:25,297 >> To samo pomeni, "določite vrsto." 329 00:13:25,297 --> 00:13:27,255 To se dogaja, da se struktura in struktura 330 00:13:27,255 --> 00:13:29,400 je kot vsebnik za več stvari. 331 00:13:29,400 --> 00:13:31,780 In da se bo struktura imeti niz imenovano ime, 332 00:13:31,780 --> 00:13:33,210 in niz imenovano hišo. 333 00:13:33,210 --> 00:13:37,520 In recimo, samo za udobje, vsa ta podatkovna struktura študentov. 334 00:13:37,520 --> 00:13:40,320 >> Torej v trenutku, ko pridemo do podpičje, imate zdaj 335 00:13:40,320 --> 00:13:43,280 ustvarili svoj podatkov tip se imenuje študentski 336 00:13:43,280 --> 00:13:46,420 ki sedaj stoji poleg int, in float, in char, in niz, 337 00:13:46,420 --> 00:13:50,270 in g rect, in g oval, in poljubno število drugih stvari, so ljudje izumili. 338 00:13:50,270 --> 00:13:53,340 >> Torej, kaj je koristno za to Zdaj je, da če grem nazaj 339 00:13:53,340 --> 00:13:57,430 da struct 0 in konča to izvedba, ki sem ga napisal 340 00:13:57,430 --> 00:14:02,080 vnaprej tukaj, opazili, da so vsi neizogibne messiness da 341 00:14:02,080 --> 00:14:05,490 je bil tik pred začetkom dogaja, ko sem dodal telefonske številke in Twitters in vse 342 00:14:05,490 --> 00:14:07,370 ti druge stvari Opredelitev študenta, 343 00:14:07,370 --> 00:14:11,810 zdaj je na kratko zaokrožila kot le en niz študentov. 344 00:14:11,810 --> 00:14:15,500 >> In vsak od teh študentov zdaj ima več stvari znotraj njega. 345 00:14:15,500 --> 00:14:16,930 Tako da samo pusti eno vprašanje. 346 00:14:16,930 --> 00:14:19,700 Kako priti na ime, in hiše, in ID, 347 00:14:19,700 --> 00:14:21,640 in karkoli drugega je znotraj študenta? 348 00:14:21,640 --> 00:14:22,930 Super enostavno, kot tudi. 349 00:14:22,930 --> 00:14:25,730 New sintakso, ampak preprosto idejo. 350 00:14:25,730 --> 00:14:29,239 >> Vi preprosto indeks v polju, kot smo prejšnji teden in to. 351 00:14:29,239 --> 00:14:31,030 In kaj je jasno nov del sintakse? 352 00:14:31,030 --> 00:14:32,590 353 00:14:32,590 --> 00:14:35,880 Just., Kar pomeni "noter struktura in se polje imenuje 354 00:14:35,880 --> 00:14:39,030 ime, dobili polje imenovano hiša, dobili polje z imenom študent. " 355 00:14:39,030 --> 00:14:41,940 >> Torej, v zastavila tri P, če ste še vedno delajo na tem, 356 00:14:41,940 --> 00:14:44,020 in večina ljudi še vedno so spoznali, da so vas 357 00:14:44,020 --> 00:14:46,130 začnete uporabljati stvari, kot so g pravokotnike in g ovala 358 00:14:46,130 --> 00:14:50,201 in druge stvari, ki se ne zdi, da prihajajo iz tedna nič, ena ali dva, 359 00:14:50,201 --> 00:14:52,950 Zavedam se, da je to zato, ker Stanfordu razglasiti nekaj novih vrst podatkov. 360 00:14:52,950 --> 00:14:56,160 >> In res, to je točno tisto, kar bom storiti, kot tudi, v P določili štiri, ko 361 00:14:56,160 --> 00:14:59,880 smo se začeli ukvarjati s stvarmi, kot so slike, bitne slike, in še več. 362 00:14:59,880 --> 00:15:02,882 Torej, to je samo teaser in miselni model za to, kar nas čaka v prihodnosti. 363 00:15:02,882 --> 00:15:04,590 Zdaj sem odlašal bit zjutraj. 364 00:15:04,590 --> 00:15:09,560 Bila sem radovedna, da vidim, kaj Microsoft ozadje dejansko 365 00:15:09,560 --> 00:15:10,310 Izgleda kot danes. 366 00:15:10,310 --> 00:15:15,200 In izkazalo se je nekdo v letu 2006 dejansko šel skoraj natančno 367 00:15:15,200 --> 00:15:19,210 Isto mesto za fotografiranje v resnici , kar izgleda kot da je v teh dneh. 368 00:15:19,210 --> 00:15:21,380 Polje je sedaj malo zaraščena. 369 00:15:21,380 --> 00:15:24,850 >> Torej govorimo zdaj podob, kaj je prinesla nazaj Daven tukaj 370 00:15:24,850 --> 00:15:26,890 na zaslonu in Miklavža, in vas samo opomnim 371 00:15:26,890 --> 00:15:30,540 da, če želite, da se nam pridružite na kosilo ta petek, glavo, da naši običajni URL 372 00:15:30,540 --> 00:15:31,440 tukaj. 373 00:15:31,440 --> 00:15:33,530 >> Torej, kam gremo off v ponedeljek? 374 00:15:33,530 --> 00:15:35,140 Uvedli smo ta problem, kajne? 375 00:15:35,140 --> 00:15:37,610 To je na videz pravilno Izvajanje zamenjave, 376 00:15:37,610 --> 00:15:40,460 pri čemer si vzela dve ints, ena imenovana, ena imenovana b, 377 00:15:40,460 --> 00:15:44,130 swap njih, tako kot si tukaj Laura na odru z mlekom in vodo, 378 00:15:44,130 --> 00:15:46,820 z uporabo začasno spremenljivka ali prazna skodelica, 379 00:15:46,820 --> 00:15:50,540 tako da bi lahko dal b v in A v b, ne da bi zmedo. 380 00:15:50,540 --> 00:15:51,560 Uporabili smo spremenljivko. 381 00:15:51,560 --> 00:15:52,870 Imenuje se temp. 382 00:15:52,870 --> 00:15:55,520 >> Toda kaj je bilo temeljno Težava s to kodo v ponedeljek? 383 00:15:55,520 --> 00:15:57,700 384 00:15:57,700 --> 00:15:58,870 Kaj je bilo narobe? 385 00:15:58,870 --> 00:16:00,106 386 00:16:00,106 --> 00:16:00,605 Ja. 387 00:16:00,605 --> 00:16:01,970 >> OBČINSTVO: To zahteva več prostora. 388 00:16:01,970 --> 00:16:04,719 >> DAVID J. Malan: Zavzema več prostor, ker sem z spremenljivko, 389 00:16:04,719 --> 00:16:05,400 in to je v redu. 390 00:16:05,400 --> 00:16:07,300 To je res, toda jaz sem reči, da je v redu. 391 00:16:07,300 --> 00:16:10,030 To je le 32 bitov v grand Shema stvari, tako da ni nič takega. 392 00:16:10,030 --> 00:16:10,655 Druge misli? 393 00:16:10,655 --> 00:16:12,572 OBČINSTVO: To samo swap spremenljivke lokalno. 394 00:16:12,572 --> 00:16:13,571 DAVID J. Malan: Točno tako. 395 00:16:13,571 --> 00:16:15,090 To samo zamenjave spremenljivke lokalno. 396 00:16:15,090 --> 00:16:18,173 Ker kadarkoli pokličete function-- ko sem imel pladnje iz Annenberg 397 00:16:18,173 --> 00:16:19,840 zadnji čas, imate glavni na dnu. 398 00:16:19,840 --> 00:16:23,560 Takoj, ko pokličete funkcijo swap, swap ne pride x in y, 399 00:16:23,560 --> 00:16:24,400 prvotne vrednosti. 400 00:16:24,400 --> 00:16:26,392 Kaj swap dobimo, pa trdimo? 401 00:16:26,392 --> 00:16:27,100 Ciljna publika: izvodih. 402 00:16:27,100 --> 00:16:28,090 DAVID J. Malan: Torej kopije njih. 403 00:16:28,090 --> 00:16:31,120 Tako, da postane ena in dva, če vas Spominjam se primera iz zadnjega časa, 404 00:16:31,120 --> 00:16:34,730 vendar kopija ene in dveh ki so uspešno zamenjali. 405 00:16:34,730 --> 00:16:38,550 Ampak na žalost na koncu, te vrednosti so vedno enake. 406 00:16:38,550 --> 00:16:41,880 Tako bomo lahko videli z našimi novi prijatelj, upam GDB, 407 00:16:41,880 --> 00:16:45,180 ki ste ali TFS in Ca je imela so te vodi k naslednji. 408 00:16:45,180 --> 00:16:51,210 >> Torej ni swap odpoklic videti takšen-- Dovolite odpirajo to-- izgleda takole. 409 00:16:51,210 --> 00:16:54,160 Inicializirana smo x enem, y, da dva. 410 00:16:54,160 --> 00:16:55,620 Imela kup print f je. 411 00:16:55,620 --> 00:16:58,080 Ampak potem, klicno tipko Tukaj je bil, da bi zamenjali, kar 412 00:16:58,080 --> 00:17:00,260 je točno kodo, ki smo Pravkar sem videla pred nekaj trenutki. 413 00:17:00,260 --> 00:17:03,180 Ki je pravilna sprva pogled, vendar funkcionalno 414 00:17:03,180 --> 00:17:06,800 ta program ne deluje, ker ne stalno zamenjati x in y. 415 00:17:06,800 --> 00:17:10,190 >> Pa poglejmo to, hitro toplo tu z GDB, ki ./noswap. 416 00:17:10,190 --> 00:17:11,867 417 00:17:11,867 --> 00:17:15,200 Kup veliko informacij, ki Bom znebiti s Control L za zdaj. 418 00:17:15,200 --> 00:17:17,516 In zdaj, bom za iti naprej in ga zaženite. 419 00:17:17,516 --> 00:17:19,349 In žal, da ni bilo, da je koristno. 420 00:17:19,349 --> 00:17:22,355 Potekal je program, znotraj tega Program se imenuje GDB, iskalnik napak, 421 00:17:22,355 --> 00:17:23,730 ampak ni mi suniti okrog. 422 00:17:23,730 --> 00:17:26,229 >> Torej, kako lahko dejansko premor izvedba znotraj tega programa? 423 00:17:26,229 --> 00:17:27,410 424 00:17:27,410 --> 00:17:28,329 Tako prekinil. 425 00:17:28,329 --> 00:17:32,340 In jaz bi prekinil na katerokoli linijo številka, ena, 10, 15. 426 00:17:32,340 --> 00:17:35,530 Ampak lahko tudi prekinil simbolično z besedami odmor Main. 427 00:17:35,530 --> 00:17:38,980 In to se dogaja, da se določi odmor točka, očitno v vrstici 16 v glavni. 428 00:17:38,980 --> 00:17:40,050 In kje je linija 16? 429 00:17:40,050 --> 00:17:42,960 Pojdimo do kode in pojdite do noswap. 430 00:17:42,960 --> 00:17:46,930 In res, linija 16 je Prva v programu. 431 00:17:46,930 --> 00:17:52,130 >> Torej, zdaj, če grem naprej in tip teči ta čas, Enter, da začasno ustavi. 432 00:17:52,130 --> 00:17:53,080 Torej, kaj je suniti okrog. 433 00:17:53,080 --> 00:17:55,716 Natisni x-- zakaj je x nič? 434 00:17:55,716 --> 00:17:56,705 435 00:17:56,705 --> 00:17:57,830 In ignorirati znak za dolar. 436 00:17:57,830 --> 00:17:59,725 To je samo za Ljubitelj uporaba programa. 437 00:17:59,725 --> 00:18:00,780 438 00:18:00,780 --> 00:18:03,140 Zakaj je x nič v tem trenutku? 439 00:18:03,140 --> 00:18:03,640 Ja. 440 00:18:03,640 --> 00:18:07,061 >> OBČINSTVO: To začasno ustavljen tik pred linija 16, ni dejansko na liniji 16. 441 00:18:07,061 --> 00:18:08,060 DAVID J. Malan: Točno tako. 442 00:18:08,060 --> 00:18:11,630 GDB, ki ga privzeto, je začasno ustavljen izvedba tik pred črto 16. 443 00:18:11,630 --> 00:18:14,820 Torej ni izvršena, ki pomeni x je neznanega vrednosti. 444 00:18:14,820 --> 00:18:17,150 In imamo srečo, da je Nekaj ​​čisto nič všeč. 445 00:18:17,150 --> 00:18:20,310 Torej, zdaj, če sem tip zraven, zdaj izvajajo 16. 446 00:18:20,310 --> 00:18:22,000 To Čaka me za izvedbo 17. 447 00:18:22,000 --> 00:18:23,400 Dovolite mi, da gredo naprej in print x. 448 00:18:23,400 --> 00:18:24,094 To je eno. 449 00:18:24,094 --> 00:18:25,260 Dovolite mi, da gredo naprej in print y. 450 00:18:25,260 --> 00:18:26,176 Kaj naj zdaj vidim? 451 00:18:26,176 --> 00:18:27,660 452 00:18:27,660 --> 00:18:28,560 >> OBČINSTVO: [neslišno] 453 00:18:28,560 --> 00:18:29,165 >> DAVID J. Malan: malo glasneje. 454 00:18:29,165 --> 00:18:30,040 >> OBČINSTVO: [neslišno] 455 00:18:30,040 --> 00:18:30,537 456 00:18:30,537 --> 00:18:32,120 DAVID J. Malan: Ni čisto soglasje. 457 00:18:32,120 --> 00:18:34,760 Torej, ja, smo videli nekaj smeti vrednost. 458 00:18:34,760 --> 00:18:37,862 Zdaj, y je 134514064 tam. 459 00:18:37,862 --> 00:18:39,320 No, to je samo nekaj smeti vrednost. 460 00:18:39,320 --> 00:18:41,350 Moj program uporablja RAM za različne namene. 461 00:18:41,350 --> 00:18:42,350 Ni druge funkcije. 462 00:18:42,350 --> 00:18:44,040 Drugi ljudje napisal v mojem računalniku. 463 00:18:44,040 --> 00:18:46,789 Tako da so bili ti delci se uporabljajo za druge vrednote, in kaj vidim 464 00:18:46,789 --> 00:18:49,470 je ostanke nekaterih pred uporabo tega spomina. 465 00:18:49,470 --> 00:18:53,350 >> Tako da ni nič takega, ker takoj kot sem tip zraven in nato natisnete y, 466 00:18:53,350 --> 00:18:55,640 to je inicializiran na vrednost, ki jo želim. 467 00:18:55,640 --> 00:18:57,400 Torej, zdaj, gremo naprej malo hitreje. 468 00:18:57,400 --> 00:18:58,540 N za dostavo. 469 00:18:58,540 --> 00:18:59,570 Pa dajmo še enkrat. 470 00:18:59,570 --> 00:19:00,530 Pa dajmo še enkrat. 471 00:19:00,530 --> 00:19:02,404 Vendar ne želim, da hit je tukaj, ker če I 472 00:19:02,404 --> 00:19:05,110 želite videti, kaj se dogaja v notranjosti zamenjave, kaj je ukaz? 473 00:19:05,110 --> 00:19:05,520 >> OBČINSTVO: koraki. 474 00:19:05,520 --> 00:19:06,436 >> DAVID J. Malan: koraki. 475 00:19:06,436 --> 00:19:09,800 Torej, to mi stopi funkcija, namesto nad njim. 476 00:19:09,800 --> 00:19:12,270 In zdaj, to je malce skrivnosten pošteno, ampak to je samo 477 00:19:12,270 --> 00:19:14,581 mi je povedal, da sem v skladu 33 zdaj. 478 00:19:14,581 --> 00:19:15,580 In kaj je to storiti še enkrat. 479 00:19:15,580 --> 00:19:16,080 Print temp. 480 00:19:16,080 --> 00:19:17,129 481 00:19:17,129 --> 00:19:20,170 Garbage vrednost, negativna tokrat, ampak to je samo še smeti vrednost. 482 00:19:20,170 --> 00:19:22,810 Torej, kaj storiti naslednjič, tiskanje temp. 483 00:19:22,810 --> 00:19:27,130 To je inicializiran na 1, kar je vrednost x, alias. 484 00:19:27,130 --> 00:19:29,110 >> No, kje so naše in X prihaja? 485 00:19:29,110 --> 00:19:32,510 No, opazil v glavnem smo imenujemo te vrednosti x in y. 486 00:19:32,510 --> 00:19:34,740 Nato smo opravili jih zamenjati, kot sledi. 487 00:19:34,740 --> 00:19:37,010 X je prišel prvi, vejica y. 488 00:19:37,010 --> 00:19:40,020 In potem bi lahko swap jih imenujemo x in y. 489 00:19:40,020 --> 00:19:42,630 Vendar zaradi jasnosti, saj je jih kliče in b. 490 00:19:42,630 --> 00:19:45,970 Toda a in b so sedaj bo kopije x in y, oz. 491 00:19:45,970 --> 00:19:50,660 >> Torej, če se vrnem k GDB, temp Zdaj je eden in je zdaj ena. 492 00:19:50,660 --> 00:19:56,130 Ampak, če jaz zraven in zdaj naredim print , se je že preselila. 493 00:19:56,130 --> 00:20:00,030 Mleko je zlijemo v bivši Pomarančni sok je iz stekla, ali obratno. 494 00:20:00,030 --> 00:20:04,750 >> In če jaz zraven še enkrat, in zdaj če sem izpisal kot preverjanje razumnosti, 495 00:20:04,750 --> 00:20:07,687 še dva, vendar je b sedaj ena. 496 00:20:07,687 --> 00:20:08,770 Odkrito povedano, da je še vedno tam. 497 00:20:08,770 --> 00:20:10,670 Briga me, kaj je temp. 498 00:20:10,670 --> 00:20:16,850 Toda takoj, ko sem zdaj tip, recimo, naprej iti nazaj, zdaj pa sem na koncu 499 00:20:16,850 --> 00:20:17,480 Program. 500 00:20:17,480 --> 00:20:20,730 In na žalost, je x še ena in je y še dva. 501 00:20:20,730 --> 00:20:22,272 >> Torej, kaj je uporabnost GDB tam? 502 00:20:22,272 --> 00:20:23,980 Ni mi pomaga popraviti Problem po sebi, 503 00:20:23,980 --> 00:20:26,265 vendar pa upajmo, da mi pomaga razumeti z vnovčitvijo 504 00:20:26,265 --> 00:20:30,000 da ja, moja logika je v redu, ampak moja koda ni na koncu z 505 00:20:30,000 --> 00:20:31,450 trajen vpliv. 506 00:20:31,450 --> 00:20:34,570 Torej, to je problem, da smo bomo zdaj rešili še danes. 507 00:20:34,570 --> 00:20:37,870 >> Ampak kaj je tja s pomočjo tega. 508 00:20:37,870 --> 00:20:39,230 String je laž. 509 00:20:39,230 --> 00:20:41,860 Zato tudi ni tip podatkov da obstaja v C. To je 510 00:20:41,860 --> 00:20:44,750 sinonim za nekatere Čas je za nekaj drugega, 511 00:20:44,750 --> 00:20:47,300 in smo lahko pokaže, da takole. 512 00:20:47,300 --> 00:20:53,282 >> Dovolite mi, da gredo naprej in odprla Program se imenuje primerjate-0. 513 00:20:53,282 --> 00:20:56,240 In namesto da vnesete tole ven, bomo začeli hoditi po kodi 514 00:20:56,240 --> 00:20:58,040 Sem že napisal, ampak to je le nekaj vrstic. 515 00:20:58,040 --> 00:20:59,570 Torej je to primerjati-0. 516 00:20:59,570 --> 00:21:02,380 In prva stvar, ki jo počnem postaja vrstico besedila. 517 00:21:02,380 --> 00:21:05,610 >> Ampak obvestilo, kaj sem šel prvič. 518 00:21:05,610 --> 00:21:07,910 Kaj je drugače jasno o vrstici 21? 519 00:21:07,910 --> 00:21:10,020 520 00:21:10,020 --> 00:21:11,402 Pravzaprav, počakaj malo. 521 00:21:11,402 --> 00:21:12,110 To je kopija dva. 522 00:21:12,110 --> 00:21:13,568 To ni niti pravi program. 523 00:21:13,568 --> 00:21:14,780 V redu, alert spojler. 524 00:21:14,780 --> 00:21:16,890 Vse v redu, tako da nikoli ne pozabite, da. 525 00:21:16,890 --> 00:21:18,520 To je odgovor na vprašanje v prihodnosti. 526 00:21:18,520 --> 00:21:21,450 >> Tukaj je primerjati-0, in sem o tem, da bi dobili vrstico besedila. 527 00:21:21,450 --> 00:21:22,435 Program je veliko enostavnejši. 528 00:21:22,435 --> 00:21:23,560 Torej je to enostavno. 529 00:21:23,560 --> 00:21:28,070 To je kot Week One, Two Week stvari v tem trenutku. STRING s = GetString. 530 00:21:28,070 --> 00:21:29,700 Zdaj sem spet pravijo tukaj. 531 00:21:29,700 --> 00:21:31,830 Niz t = GetString. 532 00:21:31,830 --> 00:21:35,300 In potem, zadnja stvar, ki pri tem Program, kot pove že ime, 533 00:21:35,300 --> 00:21:37,090 se bom poskusil, da jih primerjajo. 534 00:21:37,090 --> 00:21:40,709 >> Torej, če s, prvi niz, enaka = T, potem sem 535 00:21:40,709 --> 00:21:42,250 reči vnesete isto stvar. 536 00:21:42,250 --> 00:21:44,291 Drugega, bom rekel, vnesete različne stvari. 537 00:21:44,291 --> 00:21:45,880 Torej, kaj je zbrati in zaženete ta program. 538 00:21:45,880 --> 00:21:48,481 Tako da primerjati nič. 539 00:21:48,481 --> 00:21:48,980 Izgleda dobro. 540 00:21:48,980 --> 00:21:50,490 Ni pripravljanja napake. 541 00:21:50,490 --> 00:21:52,386 >> Dovolite mi, daj zdaj in tip ./compare-0. 542 00:21:52,386 --> 00:21:55,230 543 00:21:55,230 --> 00:21:59,220 Dovolite mi, da gredo naprej in povedati nekaj : Daven in nekaj: Rob. 544 00:21:59,220 --> 00:22:00,450 In sem tip različne stvari. 545 00:22:00,450 --> 00:22:01,250 Do sedaj tako dobro. 546 00:22:01,250 --> 00:22:02,680 Program se zdi, da je pravilna. 547 00:22:02,680 --> 00:22:03,880 >> Ampak kaj je to spet teči. 548 00:22:03,880 --> 00:22:05,800 Nekaj ​​reči: Gabe. 549 00:22:05,800 --> 00:22:07,140 Nekaj ​​reči: Gabe. 550 00:22:07,140 --> 00:22:08,520 551 00:22:08,520 --> 00:22:09,020 V redu. 552 00:22:09,020 --> 00:22:10,851 Mogoče sem udaril preslednico ali nekaj funky. 553 00:22:10,851 --> 00:22:11,600 Pa dajmo še enkrat. 554 00:22:11,600 --> 00:22:13,020 Torej 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čni stvari. 559 00:22:17,330 --> 00:22:19,430 Torej, kaj se dogaja? 560 00:22:19,430 --> 00:22:23,200 >> Torej imamo te dve vrstici koda, GetString se dvakrat klical. 561 00:22:23,200 --> 00:22:25,760 In potem sem preprosto poskušam primerjati s in t. 562 00:22:25,760 --> 00:22:28,370 Toda kaj v resnici pa se dogaja? 563 00:22:28,370 --> 00:22:31,180 No, moj rokopis je na tem, da poklal ta primer nekoliko. 564 00:22:31,180 --> 00:22:34,630 In kaj je pravzaprav vrgel to se tukaj, kot tudi. 565 00:22:34,630 --> 00:22:37,390 566 00:22:37,390 --> 00:22:45,712 >> Torej imamo podobno vrstico STRING s = GetString. 567 00:22:45,712 --> 00:22:48,295 Torej, to je preprosto prva zanimivo linijo s tem programom. 568 00:22:48,295 --> 00:22:49,920 569 00:22:49,920 --> 00:22:52,974 Toda kaj je ves ta čas bilo dogaja pod pokrovom? 570 00:22:52,974 --> 00:22:55,890 No, na levi strani je niz, ki je neke vrste spremenljivke, 571 00:22:55,890 --> 00:22:56,785 in se imenuje s. 572 00:22:56,785 --> 00:23:00,019 Tako da vem, da se to uporablja pomnilnik, ali RAM v mojem računalniku nekako. 573 00:23:00,019 --> 00:23:02,060 Torej bom abstraktno pripraviti, da kot kvadrat. 574 00:23:02,060 --> 00:23:04,820 32 bitov, se izkaže, ampak več o tem v prihodnosti. 575 00:23:04,820 --> 00:23:06,410 In potem, kaj se dogaja tukaj? 576 00:23:06,410 --> 00:23:08,700 >> No, očitno GetString dobi niz od uporabnika. 577 00:23:08,700 --> 00:23:11,360 In GetString dobil Zamyla ali Gabe ali Daven. 578 00:23:11,360 --> 00:23:14,640 Torej, kaj izbrati prvi od tiste, ki je bila Daven. 579 00:23:14,640 --> 00:23:19,174 Tako učinkovito, kaj GetString dobil mi v tem prvem primeru je D-proti-e-n. 580 00:23:19,174 --> 00:23:22,690 581 00:23:22,690 --> 00:23:25,045 In potem, kaj naredil da mi na skrivaj? 582 00:23:25,045 --> 00:23:25,920 OBČINSTVO: [neslišno] 583 00:23:25,920 --> 00:23:28,720 DAVID J. Malan: Ja, / 0 ali null znak. 584 00:23:28,720 --> 00:23:30,550 Torej je dejansko mi je dal niz. 585 00:23:30,550 --> 00:23:34,550 Vendar že vemo iz prejšnjih Izgleda, da je niz le niz 586 00:23:34,550 --> 00:23:37,895 znakov, in se zaključi z to posebno sentinel znak, / 0. 587 00:23:37,895 --> 00:23:39,220 588 00:23:39,220 --> 00:23:42,310 >> Ampak, če je to res in to je kvadrat, 589 00:23:42,310 --> 00:23:44,160 to je očitno precej večji pravokotnik. 590 00:23:44,160 --> 00:23:46,830 In res, to je, Trdim, le 32 bitov. 591 00:23:46,830 --> 00:23:49,500 In to je nedvomno več kot 32 bitov, ker je to verjetno 592 00:23:49,500 --> 00:23:51,583 osem plus osem plus osem plus osem plus osem, 593 00:23:51,583 --> 00:23:53,320 samo zato, ker bajtov v ASCII. 594 00:23:53,320 --> 00:23:57,030 Kako za vraga se bomo fit Daven v tej mali škatli tukaj? 595 00:23:57,030 --> 00:23:59,880 >> No, kaj je GetString pravzaprav počne? 596 00:23:59,880 --> 00:24:03,680 No, to grid tu predstavlja pomnilnik ali RAM mojega računalnika. 597 00:24:03,680 --> 00:24:07,564 Torej, kaj je samovoljno reči, da če vsak od njih predstavlja bajt, 598 00:24:07,564 --> 00:24:09,730 potem lahko razmišljamo o vsaki bajt kot ima naslov 599 00:24:09,730 --> 00:24:13,830 kot 33 Oxford Street, ali 34 Oxford Street, ali 35 Oxford Street. 600 00:24:13,830 --> 00:24:16,700 >> Torej, tako kot hišice imajo naslove in zgradbe imajo naslove, 601 00:24:16,700 --> 00:24:19,810 storijo posamezne bajte Pomnilnik imajo naslove ali številke 602 00:24:19,810 --> 00:24:21,042 da jih enolično identifikacijo. 603 00:24:21,042 --> 00:24:22,000 No, to je samovoljna. 604 00:24:22,000 --> 00:24:25,370 Ampak naj bo enostavno, da bom uporabite šestnajstiški samo po dogovoru 605 00:24:25,370 --> 00:24:28,200 vendar 0x pomeni nič drugega kot "to je šestnajstiško." 606 00:24:28,200 --> 00:24:31,030 in bom trdila, da "D" konča na Byte One v spomin. 607 00:24:31,030 --> 00:24:34,210 >> Nimam kaj drugega za delat v pomnilnik, tako Daven dobil prvo mesto 608 00:24:34,210 --> 00:24:35,509 na Byte One. 609 00:24:35,509 --> 00:24:36,800 To je potem, se bo 0x2. 610 00:24:36,800 --> 00:24:37,831 611 00:24:37,831 --> 00:24:38,705 To se dogaja, da 0x3. 612 00:24:38,705 --> 00:24:39,840 613 00:24:39,840 --> 00:24:41,800 To se bo 0x4. 614 00:24:41,800 --> 00:24:43,025 To se dogaja, da 0x5. 615 00:24:43,025 --> 00:24:44,025 To se bo 0x6. 616 00:24:44,025 --> 00:24:45,560 617 00:24:45,560 --> 00:24:48,290 >> Toda, ko boste začeli razmišljati O tem, kaj počne računalnika 618 00:24:48,290 --> 00:24:50,710 Pod pokrovom motorja, lahko začnete sklepati 619 00:24:50,710 --> 00:24:54,960 kako se vam je pred nekaj leti, bi izvajajo C sebi. 620 00:24:54,960 --> 00:24:58,360 Kaj je GetString verjetno returning--, ker je 621 00:24:58,360 --> 00:25:00,946 se počuti, kot da je ni vračanje Daven po sebi, 622 00:25:00,946 --> 00:25:03,320 ker on zagotovo ne bo da se prilega v tej mali box-- 623 00:25:03,320 --> 00:25:05,090 Torej, kaj je GetString verjetno vrača? 624 00:25:05,090 --> 00:25:07,958 625 00:25:07,958 --> 00:25:08,920 >> OBČINSTVO: [neslišno] 626 00:25:08,920 --> 00:25:10,540 >> DAVID J. Malan: lokacija Daven. 627 00:25:10,540 --> 00:25:12,770 In to je bilo to odkar enem tednu. 628 00:25:12,770 --> 00:25:16,150 Kaj GetString je res vračanje ni niz po sebi. 629 00:25:16,150 --> 00:25:17,780 To je ena izmed majhnih belih laži. 630 00:25:17,780 --> 00:25:22,520 To je vračanje naslov Niz v spomin, edinstven naslov. 631 00:25:22,520 --> 00:25:24,820 Daven živi na 33 Oxford Street. 632 00:25:24,820 --> 00:25:29,310 Ampak bolj na kratko, Gavin živi na 0x1, Naslov številka ena. 633 00:25:29,310 --> 00:25:32,280 >> Torej, kdo bo dal v tem Malo polje, potem, da bo jasno, 634 00:25:32,280 --> 00:25:35,930 je le naslov tega niza. 635 00:25:35,930 --> 00:25:38,110 Torej, ves ta čas, to bil je dogajalo. 636 00:25:38,110 --> 00:25:41,650 Toda kaj to namiguje na Zdaj je, da ima, če vsi S 637 00:25:41,650 --> 00:25:44,710 je število znotraj nje, ki je ustaviti, programer, 638 00:25:44,710 --> 00:25:47,970 od nalagajo številko vsaka spremenljivka in samo skakanje 639 00:25:47,970 --> 00:25:49,080 na ta kos pomnilnika? 640 00:25:49,080 --> 00:25:51,320 In res, bomo videli da je grožnja naslednjič. 641 00:25:51,320 --> 00:25:53,500 >> Ampak za zdaj, to meni ne zadošča. 642 00:25:53,500 --> 00:25:55,630 Če rečem, da me Niz, mi daš Daven. 643 00:25:55,630 --> 00:25:57,230 Vendar ne boste res mi Daven. 644 00:25:57,230 --> 00:25:59,310 Vse, kar mi je dal naslov Daven je. 645 00:25:59,310 --> 00:26:04,310 Kako potem vemo zagotovo kjer Daven začne in ends-- 646 00:26:04,310 --> 00:26:07,140 Zgodba postaja weird-- kjer Daven začne in konča, 647 00:26:07,140 --> 00:26:10,435 in nato, dostavo Niz v spomin začne? 648 00:26:10,435 --> 00:26:11,520 649 00:26:11,520 --> 00:26:13,620 >> No, če ste se predali me začetek Daven, 650 00:26:13,620 --> 00:26:17,230 v bistvu, kako naj vem kjer je konec njegovega imena? 651 00:26:17,230 --> 00:26:20,550 Da posebna null znak, ki je še toliko bolj pomembno zdaj 652 00:26:20,550 --> 00:26:23,040 če strune pod njim hood preprosto prepoznavanje 653 00:26:23,040 --> 00:26:25,820 enolično po lokaciji v pomnilniku. 654 00:26:25,820 --> 00:26:28,130 Torej, vse to čas, ki je kaj se je dogajalo. 655 00:26:28,130 --> 00:26:32,470 >> Torej, če pogledamo zdaj koda tukaj, razložiti 656 00:26:32,470 --> 00:26:35,790 če bi napaka v vrstici 26. 657 00:26:35,790 --> 00:26:39,560 Zakaj je Zamyla in Zamyla drugačen? 658 00:26:39,560 --> 00:26:41,330 Zakaj je Gabe in Gabe drugačen? 659 00:26:41,330 --> 00:26:42,154 Ja, v hrbtu. 660 00:26:42,154 --> 00:26:43,390 >> OBČINSTVO: Imajo različne naslove. 661 00:26:43,390 --> 00:26:45,931 >> DAVID J. Malan: Preprosto zato, ker imajo različne naslove. 662 00:26:45,931 --> 00:26:48,820 Ker, ko pokličete GetString še enkrat, kar bom naredil hitro tukaj, 663 00:26:48,820 --> 00:26:52,870 če je ta druga linija, niz t, saj sem v tem programu, 664 00:26:52,870 --> 00:26:55,030 enaka drug klic GetString. 665 00:26:55,030 --> 00:26:56,370 666 00:26:56,370 --> 00:26:58,670 Naslednjič, ko bom poklical GetString, bom 667 00:26:58,670 --> 00:27:00,190 da bi dobili drugačen kos pomnilnika. 668 00:27:00,190 --> 00:27:02,220 >> GetString je dovoljeno vprašati poslovanja 669 00:27:02,220 --> 00:27:03,800 Sistem za več in več pomnilnika. 670 00:27:03,800 --> 00:27:07,894 To ne bo mogoče ponovno uporabiti enak šest zlogov vsak čas. 671 00:27:07,894 --> 00:27:09,810 To se dogaja, da bi dobili novo kos pomnilnika, ki 672 00:27:09,810 --> 00:27:12,780 pomeni t bo dobil kakšno drugo vrednost tukaj. 673 00:27:12,780 --> 00:27:15,380 >> Torej, ko sem naredil s enaka = t, nisi primerjavo 674 00:27:15,380 --> 00:27:17,880 D proti temu in proti Ta in V pred tem. 675 00:27:17,880 --> 00:27:19,588 Saj primerjave tega proti temu, kar 676 00:27:19,588 --> 00:27:24,020 odkrito je zelo useful-- useless-- je precej neuporabna, ker, ki res 677 00:27:24,020 --> 00:27:25,830 briga, če so strune v spominu? 678 00:27:25,830 --> 00:27:26,850 >> In res, nismo. 679 00:27:26,850 --> 00:27:28,980 In mi ne bo začeti posebno skrb. 680 00:27:28,980 --> 00:27:34,180 Le v obsegu, da lahko pride do napake in varnostne grožnje lahko pojavijo volje 681 00:27:34,180 --> 00:27:36,100 smo dejansko začeli skrbeti za to. 682 00:27:36,100 --> 00:27:37,230 Torej, dajmo se določi ta problem. 683 00:27:37,230 --> 00:27:39,650 Izkazalo se je, ga popravim super enostavno. 684 00:27:39,650 --> 00:27:42,600 >> In kaj je pravzaprav pred I spet razkrivajo, da bi kaj 685 00:27:42,600 --> 00:27:47,170 vi storili, če v razredu CS50, in si moral izvajati 686 00:27:47,170 --> 00:27:48,600 Primerjava z dvema strune. 687 00:27:48,600 --> 00:27:51,440 Vi očitno ne moreš uporabljati s enaka = t. 688 00:27:51,440 --> 00:27:54,090 Ampak samo logično, kako bi primerjali ta niz 689 00:27:54,090 --> 00:27:56,370 glede na to vrvico s kodo C? 690 00:27:56,370 --> 00:27:56,880 Ja. 691 00:27:56,880 --> 00:27:58,780 >> OBČINSTVO: Naredi zanke [neslišno] 692 00:27:58,780 --> 00:28:00,670 693 00:28:00,670 --> 00:28:01,670 DAVID J. Malan: Popolna. 694 00:28:01,670 --> 00:28:02,900 OBČINSTVO: [neslišno] 695 00:28:02,900 --> 00:28:03,310 DAVID J. Malan: Ja. 696 00:28:03,310 --> 00:28:05,390 Samo uporabite za zanke ali a medtem ko zanke ali karkoli. 697 00:28:05,390 --> 00:28:08,710 Ampak velja samo osnovno idejo, da če to je kos pomnilnika ali matrike 698 00:28:08,710 --> 00:28:11,590 in to je, ponovitev čez oba hkrati. 699 00:28:11,590 --> 00:28:12,960 In ravno primerjati črke. 700 00:28:12,960 --> 00:28:14,260 >> In moraš biti malo previdni, saj vas 701 00:28:14,260 --> 00:28:16,247 Ne želim en prst iti mimo drugega 702 00:28:16,247 --> 00:28:18,080 ker je ena niz dlje kot drugi. 703 00:28:18,080 --> 00:28:21,380 Tako da boste želeli, da preverite, Ta posebna vrednost na koncu, null. 704 00:28:21,380 --> 00:28:24,017 Ampak res je, v end, tako enostavno, kot da. 705 00:28:24,017 --> 00:28:26,100 In odkrito povedano, ne potrebujemo na novo izumiti, da kolo. 706 00:28:26,100 --> 00:28:27,960 Tukaj je Version Two. 707 00:28:27,960 --> 00:28:32,910 In kaj bom rekel, tukaj je, da namesto da bi primerjali s enaka = T 708 00:28:32,910 --> 00:28:38,964 Jaz sem namesto tega reči, če niz Primerjava s vejica t = 0 enaka. 709 00:28:38,964 --> 00:28:40,130 Zdaj, kaj je niz primerjati? 710 00:28:40,130 --> 00:28:43,046 >> Izkazalo se je, da je funkcija, ki prihaja s C, katerih namen v življenju 711 00:28:43,046 --> 00:28:44,650 je za primerjavo dveh nizov. 712 00:28:44,650 --> 00:28:48,300 In premešamo primerjati, če beremo njene man stran ali dokumentacijo ali CS50 713 00:28:48,300 --> 00:28:50,630 reference, se bo preprosto vam povem, da je razburjenje 714 00:28:50,630 --> 00:28:55,730 primerjati donose bodisi negativne številko ali pozitivno število ali nič, 715 00:28:55,730 --> 00:28:57,660 kjer nič pomeni, da so enaki. 716 00:28:57,660 --> 00:28:58,570 >> Torej samo ugibanje. 717 00:28:58,570 --> 00:29:00,390 Kaj bi pomenilo, če premešamo primerjavo donose 718 00:29:00,390 --> 00:29:02,110 negativna vrednost ali pozitivna vrednost? 719 00:29:02,110 --> 00:29:02,785 720 00:29:02,785 --> 00:29:04,285 OBČINSTVO: Večja ali manjša od. 721 00:29:04,285 --> 00:29:05,570 DAVID J. Malan: Ja, večja ali manjša od. 722 00:29:05,570 --> 00:29:08,640 Torej, če si hotel, da razvrstite celoto kup strun v dictionary-- 723 00:29:08,640 --> 00:29:12,975 saj bomo na koncu navzdol road-- odlična funkcija za potencialno uporabo, 724 00:29:12,975 --> 00:29:15,850 saj bo to storil Primerjava nizov za vas, in povejte 725 00:29:15,850 --> 00:29:20,060 ti ne pride pred b, ali pa b prišel pred abecedi. 726 00:29:20,060 --> 00:29:21,490 Ne moremo storiti prav to. 727 00:29:21,490 --> 00:29:23,620 >> In opazil, sem eno drugo stvar v tem primeru. 728 00:29:23,620 --> 00:29:26,870 , Kaj se je spremenilo več v to glavno funkcijo? 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 In to je, da je druga bela laž. 732 00:29:31,150 --> 00:29:33,750 Ves ta čas, ko ste jih pisal niz, 733 00:29:33,750 --> 00:29:38,350 smo bili na skrivaj reportaža Niz kot char *, tako da Jek dejansko 734 00:29:38,350 --> 00:29:39,270 vas razume. 735 00:29:39,270 --> 00:29:42,450 >> Z drugimi besedami, v CS50.h in kot bomo sčasoma videli, 736 00:29:42,450 --> 00:29:45,950 smo naredili sinonim imenuje niz to je isto, kot char *. 737 00:29:45,950 --> 00:29:49,910 In sedaj, samo vem, da je *, V tem kontekstu, vsaj 738 00:29:49,910 --> 00:29:51,286 pomeni naslov. 739 00:29:51,286 --> 00:29:52,210 >> Naslov, kaj? 740 00:29:52,210 --> 00:29:56,390 No, dejstvo, da sem rekel, char *, in ne int * ali float * 741 00:29:56,390 --> 00:30:00,820 pomeni, da je char * naslov char. 742 00:30:00,820 --> 00:30:06,770 Torej ta mali box tukaj, aka Niz je res tipa char *, 743 00:30:06,770 --> 00:30:10,490 ki je preprosto fancy način rekel, v tem polju bo šel naslov. 744 00:30:10,490 --> 00:30:12,430 In kaj naj bi to naslov nanašala? 745 00:30:12,430 --> 00:30:13,780 Očitno char. 746 00:30:13,780 --> 00:30:16,410 >> Vendar pa smo lahko povsem imajo int * in druge stvari. 747 00:30:16,410 --> 00:30:20,790 Ampak za zdaj, char * je res najbolj enostavna in eden od obresti. 748 00:30:20,790 --> 00:30:23,310 Tako da je ta problem se dogaja narašča, čeprav, še enkrat. 749 00:30:23,310 --> 00:30:24,830 >> Recimo, da sem ta program odprl. 750 00:30:24,830 --> 00:30:27,670 Poglejmo, če zdaj ne more napovedati kaj je narobe s to kodo. 751 00:30:27,670 --> 00:30:31,140 Torej, v tem programu, kopirni 0, sem dogaja, da gredo naprej in spet poklical 752 00:30:31,140 --> 00:30:34,190 GetString in shranite vrednost v s. 753 00:30:34,190 --> 00:30:38,800 >> In potem, zakaj delam to, prav tako kot opominu tednov preteklosti? 754 00:30:38,800 --> 00:30:40,960 Nismo rekli, da GetString včasih vrne null. 755 00:30:40,960 --> 00:30:42,793 Kaj pomeni, če GetString vrne null? 756 00:30:42,793 --> 00:30:45,040 757 00:30:45,040 --> 00:30:46,034 Nekaj ​​je šlo narobe. 758 00:30:46,034 --> 00:30:48,950 To verjetno pomeni niz je preveč big, računalnika iz spomina. 759 00:30:48,950 --> 00:30:51,724 To se zgodi, super, super, super redko, vendar pa bi se lahko zgodilo. 760 00:30:51,724 --> 00:30:53,890 Smo želeli preveriti za to, in da je vse, kar delamo. 761 00:30:53,890 --> 00:30:57,910 >> Ker bomo videli sedaj, če ne začnete preverjanje običajno stvari 762 00:30:57,910 --> 00:31:00,870 kot null, boste morda dejansko začnejo iti 763 00:31:00,870 --> 00:31:03,106 za naslove v spominu, da so neveljavni. 764 00:31:03,106 --> 00:31:05,980 In boste začeli induciranje več segmentacije napake. 765 00:31:05,980 --> 00:31:08,360 Ali Mac ali PC, samo povzroči računalnik viseti 766 00:31:08,360 --> 00:31:10,340 ali programa, da zamrzne, potencialno. 767 00:31:10,340 --> 00:31:14,930 >> Torej, zdaj, Trdim v copy-0.c, da I bom kopiranje teh nizov z 768 00:31:14,930 --> 00:31:15,685 z linijo 28. 769 00:31:15,685 --> 00:31:16,850 770 00:31:16,850 --> 00:31:18,750 In potem, bom zahtevku na dnu 771 00:31:18,750 --> 00:31:21,430 tu, da bom spremeniti eno od njih. 772 00:31:21,430 --> 00:31:22,330 >> Tako opazijo. 773 00:31:22,330 --> 00:31:24,370 Kličem naš stari prijatelj strlen. 774 00:31:24,370 --> 00:31:28,960 In samo razložiti v angleščini Kaj je to linija 34 počne? 775 00:31:28,960 --> 00:31:32,480 Kaj t nosilec 0 predstavljajo na levi. 776 00:31:32,480 --> 00:31:32,980 Ja. 777 00:31:32,980 --> 00:31:34,339 >> OBČINSTVO: Prvi znak t? 778 00:31:34,339 --> 00:31:35,880 DAVID J. Malan: Prvi znak t. 779 00:31:35,880 --> 00:31:36,379 To je vse. 780 00:31:36,379 --> 00:31:40,024 Prvi znak t, želim dodeliti veliko tiskano različico 781 00:31:40,024 --> 00:31:41,190 prvega znaka v t. 782 00:31:41,190 --> 00:31:43,200 Zato je ta kapitalizacije prva črka. 783 00:31:43,200 --> 00:31:46,340 In potem, zelo zadnja stvar, ki mi V ta program je Trdim tukaj 784 00:31:46,340 --> 00:31:50,340 original, S, in tukaj je kopija, t. 785 00:31:50,340 --> 00:31:54,610 >> Ampak temelji na zgodbi smo pravkar povedal, kaj v resnici so strune, 786 00:31:54,610 --> 00:31:57,520 kaj je linija 28 res počne, in kaj je 787 00:31:57,520 --> 00:31:59,405 Nastalo bug dogaja da se na zaslonu? 788 00:31:59,405 --> 00:32:01,300 789 00:32:01,300 --> 00:32:03,500 >> Torej, najprej, prvo vprašanje, 28. 790 00:32:03,500 --> 00:32:09,040 Kaj je niz t = i res počne? 791 00:32:09,040 --> 00:32:16,430 Če imamo na levi strani stranski tukaj niz t = i; 792 00:32:16,430 --> 00:32:19,400 da mi daje eno okence tu in ena škatla tukaj. 793 00:32:19,400 --> 00:32:25,530 In domnevam, da je ta naslov 0x, recimo, 50 tokrat samovoljno. 794 00:32:25,530 --> 00:32:28,847 Kaj niz t = S storiti pod pokrovom? 795 00:32:28,847 --> 00:32:30,340 >> OBČINSTVO: [neslišno] 796 00:32:30,340 --> 00:32:34,100 >> DAVID J. Malan: V njej so zbrani spomin tam obravnavajo, tako 0x50 hodi tja. 797 00:32:34,100 --> 00:32:37,980 Torej, če zdaj, grem v prvi lik v t in velike črke, 798 00:32:37,980 --> 00:32:39,535 kaj sem dejansko počne s? 799 00:32:39,535 --> 00:32:41,300 800 00:32:41,300 --> 00:32:43,450 Jaz res počne isto stvar, kajne? 801 00:32:43,450 --> 00:32:47,680 Ker če Naslov 0x50-- in samo sem Nimate veliko prostora na krovu tukaj, 802 00:32:47,680 --> 00:32:51,750 ampak predvidevam, da je to 0x50 tukaj, nekje v spominu mojega računalnika. 803 00:32:51,750 --> 00:32:55,825 >> In sem se, na primer, Gabe v male črke tukaj, kot je ta. 804 00:32:55,825 --> 00:32:57,120 805 00:32:57,120 --> 00:33:01,980 In sem rekel t bracket 0 gets kapitalizira. 806 00:33:01,980 --> 00:33:04,860 No, t nosilec je 0 prva črka v t. 807 00:33:04,860 --> 00:33:07,840 Tako malo g bo postala velika G. Ampak problem 808 00:33:07,840 --> 00:33:09,410 je, kaj je tudi poudariti, da? 809 00:33:09,410 --> 00:33:10,300 >> PUBLIKA: Enako. 810 00:33:10,300 --> 00:33:11,841 >> DAVID J. Malan: Enako natančno stvar. 811 00:33:11,841 --> 00:33:16,342 Tako preprosta razlaga morda, tudi če je sintaksa malo čudno. 812 00:33:16,342 --> 00:33:17,050 Torej, kaj je to. 813 00:33:17,050 --> 00:33:20,210 Naredi copy-0 in nato ./copy-0. 814 00:33:20,210 --> 00:33:21,820 815 00:33:21,820 --> 00:33:24,110 Nekaj ​​reči: Gabe. 816 00:33:24,110 --> 00:33:26,760 In na žalost, oba jim je bilo zdaj veliko začetnico, 817 00:33:26,760 --> 00:33:29,500 ampak za to osnovo, Razlog, da smo preprosto 818 00:33:29,500 --> 00:33:32,350 Zdaj se ukvarjajo z naslovi. 819 00:33:32,350 --> 00:33:36,470 >> Torej, kako naj začnemo address-- no pun intended-- 820 00:33:36,470 --> 00:33:39,270 kako naj začnemo obravnavati to predvsem problem? 821 00:33:39,270 --> 00:33:44,400 No, v copy1.c, gredo stvari , da bi dobili malo bolj zapletena. 822 00:33:44,400 --> 00:33:49,310 Ampak jaz bi trdijo konceptualno preprosta rešitev. 823 00:33:49,310 --> 00:33:50,852 >> Tako težko, da se na prvi pogled. 824 00:33:50,852 --> 00:33:53,560 Ne bo enostavno, za prvo ko ga tip ven, morda, 825 00:33:53,560 --> 00:33:57,440 ampak, če je problem, da preprosto delam t = S samo 826 00:33:57,440 --> 00:33:59,694 kopije naslov, kaj, še enkrat, če sem lahko izberete na vas, 827 00:33:59,694 --> 00:34:02,110 se bo rešitev za dejansko kopiranje niz? 828 00:34:02,110 --> 00:34:04,906 829 00:34:04,906 --> 00:34:06,770 >> OBČINSTVO: Verjetno bova ponovno uporabiti zanko. 830 00:34:06,770 --> 00:34:06,890 >> DAVID J. Malan: Ja. 831 00:34:06,890 --> 00:34:08,390 Torej bomo spet potrebovali zanko. 832 00:34:08,390 --> 00:34:11,800 In ker če želimo kopirati Niz je v drugem nizu, 833 00:34:11,800 --> 00:34:14,120 bomo verjetno želeli, da to storite znak za znakom. 834 00:34:14,120 --> 00:34:17,199 Ampak problem je, če je To je prvotno e, 835 00:34:17,199 --> 00:34:22,159 Zdaj moramo izrecno začeti dodeljevanje pomnilnika za t. 836 00:34:22,159 --> 00:34:24,320 >> Z drugimi besedami, dajva izvlečete to zadnjič. 837 00:34:24,320 --> 00:34:28,659 Če tega niza s = GetString. 838 00:34:28,659 --> 00:34:30,956 839 00:34:30,956 --> 00:34:32,455 In kaj je dal to sem gor, kot 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 In potem, slika za nekaj kot da se bo kot prej, 844 00:34:43,860 --> 00:34:44,360 g-b-e / 0. 845 00:34:44,360 --> 00:34:47,294 846 00:34:47,294 --> 00:34:48,960 To izgleda malo kaj takega. 847 00:34:48,960 --> 00:34:53,650 In je zato pravimo to 0x50, in da bo v 51, 52. 848 00:34:53,650 --> 00:34:54,409 >> Torej, to je 0x50. 849 00:34:54,409 --> 00:34:55,679 850 00:34:55,679 --> 00:34:59,690 In potem jaz niza t. 851 00:34:59,690 --> 00:35:02,450 V spomin, da bo le dajte mi malo kvadrat takega. 852 00:35:02,450 --> 00:35:04,080 Torej, kaj je sedaj ključni korak? 853 00:35:04,080 --> 00:35:09,870 Če želim, da bi kopirali s vt, kaj blank pa moramo izpolniti tu? 854 00:35:09,870 --> 00:35:12,050 Ali kaj moramo storite na visoki ravni? 855 00:35:12,050 --> 00:35:14,101 856 00:35:14,101 --> 00:35:14,600 Ja? 857 00:35:14,600 --> 00:35:16,200 858 00:35:16,200 --> 00:35:17,020 Nekdo? 859 00:35:17,020 --> 00:35:17,690 Ja. 860 00:35:17,690 --> 00:35:19,214 >> OBČINSTVO: Moramo [neslišno]. 861 00:35:19,214 --> 00:35:21,380 DAVID J. Malan: Ja, morate zapolniti prazno. 862 00:35:21,380 --> 00:35:24,340 Ne morem kopirati in nato izkoristiti ime Gabe je 863 00:35:24,340 --> 00:35:28,120 dokler nisem vprašal operacijski sistem za drugo kos pomnilnika 864 00:35:28,120 --> 00:35:30,640 da je vsaj tako velika kot original. 865 00:35:30,640 --> 00:35:32,130 Tako da nam ostane vprašanje. 866 00:35:32,130 --> 00:35:36,080 >> Kako prosim, operacijski sistem ne samo za navadno malo pointer-- 867 00:35:36,080 --> 00:35:38,530 kot se to imenuje, naslov, pointer-- ne 868 00:35:38,530 --> 00:35:40,980 za navadno majhno okence kot to imenuje niz? 869 00:35:40,980 --> 00:35:44,200 Kako prosim poslovanja Sistem za velik kos spomina? 870 00:35:44,200 --> 00:35:48,430 Doslej sem dobil samo to nazaj posredno s pozivom GetString. 871 00:35:48,430 --> 00:35:50,740 Torej, kako se GetString celo dobili svoj spomin? 872 00:35:50,740 --> 00:35:53,430 >> No, izkazalo se je, da obstaja ta druga funkcija tukaj 873 00:35:53,430 --> 00:35:55,160 da bomo zdaj začeli uporabljati. 874 00:35:55,160 --> 00:35:59,780 Zdaj, to izgleda tako bolj prikrit than-- in jaz sem edini, ki vidi tem-- 875 00:35:59,780 --> 00:36:03,150 ta vrstica izgleda tako bolj skrivnosten potem pa naj bi se na prvi pogled. 876 00:36:03,150 --> 00:36:04,650 Ampak kaj je to draži narazen. 877 00:36:04,650 --> 00:36:07,950 >> Na levi strani imam char * t. 878 00:36:07,950 --> 00:36:13,280 Torej, v angleščini, začnimo, da oblikujejo ustrezne kazni v tehničnem žargonu. 879 00:36:13,280 --> 00:36:19,757 Torej je to dodeljevanje spremenljivka tipa char * imenuje t. 880 00:36:19,757 --> 00:36:21,090 Zdaj, kaj to v resnici pomeni? 881 00:36:21,090 --> 00:36:23,881 >> No, to pomeni, kaj bom dali v to spremenljivko z imenom t? 882 00:36:23,881 --> 00:36:24,780 883 00:36:24,780 --> 00:36:26,402 Naslov char. 884 00:36:26,402 --> 00:36:28,360 Torej, to je samo enostavnejše, bolj razumen način 885 00:36:28,360 --> 00:36:29,930 opisovanja levo stran. 886 00:36:29,930 --> 00:36:32,890 Tako, da ustvarja to polje tu samo. 887 00:36:32,890 --> 00:36:34,760 Torej desna stran, predvidoma se bo 888 00:36:34,760 --> 00:36:37,170 dodeliti, da večji kos pomnilnika, kako? 889 00:36:37,170 --> 00:36:38,340 Torej, kaj je to draži narazen. 890 00:36:38,340 --> 00:36:41,131 >> To je zasenčila na prvi pogled, ampak kaj se dogaja tu notri? 891 00:36:41,131 --> 00:36:43,740 Prvič, tam je malloc, ki je očitno naš novi prijatelj, 892 00:36:43,740 --> 00:36:45,450 "Spomin dodeliti." 893 00:36:45,450 --> 00:36:49,560 Torej je ta argument prevalili vanj, tako da je precej velik argument. 894 00:36:49,560 --> 00:36:50,970 Torej, kaj je to draži narazen. 895 00:36:50,970 --> 00:36:53,410 >> strlen S, seveda, predstavlja za-- 896 00:36:53,410 --> 00:36:54,142 897 00:36:54,142 --> 00:36:55,600 OBČINSTVO: število znakov. 898 00:36:55,600 --> 00:36:56,710 DAVID J. Malan: Just število znakov v s. 899 00:36:56,710 --> 00:36:59,040 Torej dolžina s, originalni niz. 900 00:36:59,040 --> 00:37:00,350 Torej G-b-e. 901 00:37:00,350 --> 00:37:02,320 Torej je to verjetno štirje v tem primeru. 902 00:37:02,320 --> 00:37:05,485 Zakaj počnem 1 po kliče strlen za s? 903 00:37:05,485 --> 00:37:06,360 OBČINSTVO: [neslišno] 904 00:37:06,360 --> 00:37:07,590 DAVID J. Malan: Za to posebna null znak. 905 00:37:07,590 --> 00:37:11,260 Če me vprašate, kaj je dolžina Ime Gabe je, bom rekel, štiri. 906 00:37:11,260 --> 00:37:14,480 Pod pokrovom motorja, čeprav moram da peti bajtov null značaja. 907 00:37:14,480 --> 00:37:16,100 Torej, to je, zakaj delam 1. 908 00:37:16,100 --> 00:37:21,730 >> Zdaj pa samo v primeru, da to izvajate Program na drugem računalniku, kot, recimo, 909 00:37:21,730 --> 00:37:24,610 CS50 aparata, kjer je velikost char 910 00:37:24,610 --> 00:37:26,350 lahko drugačen Iz lastne computer-- 911 00:37:26,350 --> 00:37:30,590 Izkazalo se je, da sem lahko to imenujemo Operator sizeof, samo vprašati računalnik, 912 00:37:30,590 --> 00:37:32,870 kakšna je velikost char na tem računalniku? 913 00:37:32,870 --> 00:37:37,400 >> In da se pomnoži pet v tem na primer z velikostjo char, ki 914 00:37:37,400 --> 00:37:40,440 na večini računalnikov bo samo ena, malloc 915 00:37:40,440 --> 00:37:44,830 se bo dodelila za mene je to velik kos pomnilnika, tukaj na desni. 916 00:37:44,830 --> 00:37:47,140 In to se dogaja, da return-- je function--, tako da je 917 00:37:47,140 --> 00:37:48,265 dogaja, da se vrnete v meni kaj? 918 00:37:48,265 --> 00:37:50,914 919 00:37:50,914 --> 00:37:51,830 OBČINSTVO: naslov? 920 00:37:51,830 --> 00:37:53,709 DAVID J. Malan: naslov, kaj? 921 00:37:53,709 --> 00:37:55,250 OBČINSTVO: Od spomin je namenila? 922 00:37:55,250 --> 00:37:56,450 DAVID J. Malan: Of spomin je dodeljen. 923 00:37:56,450 --> 00:37:59,189 Tako da nimam pojma, odkrito povedano, kam to pelje na koncu. 924 00:37:59,189 --> 00:38:01,480 Bom predlagal, da da se bo na koncu na 0x88. 925 00:38:01,480 --> 00:38:02,770 926 00:38:02,770 --> 00:38:06,009 Popolnoma poljubna, vendar drugje kot 0x50, 927 00:38:06,009 --> 00:38:08,800 ker operacijskega sistema, kar Windows in Mac OS naredil zame, je 928 00:38:08,800 --> 00:38:11,230 poskrbite, da se daje me različni kosi RAM. 929 00:38:11,230 --> 00:38:14,210 >> Torej, to je vrednost, kadar je to kos pomnilnika, morda na koncu. 930 00:38:14,210 --> 00:38:16,060 Torej, to je tisto, kar konča tukaj, 0x88. 931 00:38:16,060 --> 00:38:17,480 932 00:38:17,480 --> 00:38:21,570 Torej, zdaj je jasno, razumem da to ni enako kot to, 933 00:38:21,570 --> 00:38:23,960 ker oni gledata različne kose pomnilnika. 934 00:38:23,960 --> 00:38:29,980 Torej, če sem zdaj dejansko želite kopirati to leta, naredimo svoj predlog rešitve. 935 00:38:29,980 --> 00:38:36,870 >> Pojdiva, ustvari zanko, in ne t nosilec i dobi e nosilec i. 936 00:38:36,870 --> 00:38:39,760 Ker zdaj sem lahko uporabite To diod kot zapis, 937 00:38:39,760 --> 00:38:43,390 kajti čeprav malloc zelo splošno mi dodeljuje pomnilnik, 938 00:38:43,390 --> 00:38:45,290 spomin je samo sosednja bajta. 939 00:38:45,290 --> 00:38:47,240 Bajt, bajt, bajt, back to back to back. 940 00:38:47,240 --> 00:38:50,030 >> Ne morem zagotovo kot programer obravnavati kot matriko, ki 941 00:38:50,030 --> 00:38:55,090 pomeni, da lahko uporabite to na koncu pozna Zapis v le nekaj kvadratnih oklepajih. 942 00:38:55,090 --> 00:38:56,462 943 00:38:56,462 --> 00:39:00,020 >> Zato mi dovolite, ustavite tam, ker To je veliko naenkrat, čeprav 944 00:39:00,020 --> 00:39:03,530 čeprav je osnovna ideja, da povzamem je, da je niz, ves ta čas, 945 00:39:03,530 --> 00:39:05,550 ni nov tip podatkov po sebi. 946 00:39:05,550 --> 00:39:10,150 To je samo tako imenovani kazalec, naslov značaja, 947 00:39:10,150 --> 00:39:12,650 ki samo pomeni, da je število ki jih človeško dogovoru 948 00:39:12,650 --> 00:39:15,350 smo nagnjeni, da napišete kot 0x nekaj. 949 00:39:15,350 --> 00:39:18,590 >> Ampak to je samo številka, kot 33 Oxford Street, 950 00:39:18,590 --> 00:39:20,530 ki se zgodi, da bo Naslov CS stavbe. 951 00:39:20,530 --> 00:39:22,000 952 00:39:22,000 --> 00:39:23,545 Vsa vprašanja v zvezi s temi podatki? 953 00:39:23,545 --> 00:39:24,790 954 00:39:24,790 --> 00:39:25,289 Ja? 955 00:39:25,289 --> 00:39:28,530 >> OBČINSTVO: Zakaj preveriti za t enaka NULL? 956 00:39:28,530 --> 00:39:30,740 >> DAVID J. Malan: zakaj delamo to preverite t enaka NULL? 957 00:39:30,740 --> 00:39:33,250 Če beremo documentation-- super question-- za funkcije malloc, 958 00:39:33,250 --> 00:39:37,020 to bo rekel, v drobnem tisku, včasih morda malloc vrne null, 959 00:39:37,020 --> 00:39:38,080 tako kot GetString. 960 00:39:38,080 --> 00:39:41,820 In res, GetString vrne null če v zameno, malloc vrne null, 961 00:39:41,820 --> 00:39:43,130 ker GetString uporablja malloc. 962 00:39:43,130 --> 00:39:46,400 >> In da se lahko zgodi, če OS, Mac OS, Windows, karkoli, je preprosto 963 00:39:46,400 --> 00:39:48,130 zmanjkalo pomnilnika za vas. 964 00:39:48,130 --> 00:39:49,820 Torej, to je tisto, kar se je zgodilo. 965 00:39:49,820 --> 00:39:52,910 >> In mi pokažejo še eno drugo stvar da lahko samo blow your mind 966 00:39:52,910 --> 00:39:55,100 ali popolnoma predaleč v liniji. 967 00:39:55,100 --> 00:39:59,770 Ampak, dovolite mi, potegnite navzgor Enako zanko za kopiranje, 968 00:39:59,770 --> 00:40:05,480 ki je pred nekaj trenutki, je bil odpoklic to. t bracket i dobi e nosilec i. 969 00:40:05,480 --> 00:40:06,740 >> Lepo in uporabniku prijazen. 970 00:40:06,740 --> 00:40:09,330 Počutim se kot Week Two znova. 971 00:40:09,330 --> 00:40:14,920 Vendar je ta verzija lahko dejansko zapišemo kot to, kar je videti skrivnosten. 972 00:40:14,920 --> 00:40:18,280 To tehniko, imenovano kazalec aritmetika, naslov aritmetično. 973 00:40:18,280 --> 00:40:19,600 Ampak zakaj to deluje? 974 00:40:19,600 --> 00:40:22,220 >> Zdaj zoprno, Avtorji C, se je odločilo za 975 00:40:22,220 --> 00:40:25,070 * simbol za različne namene. 976 00:40:25,070 --> 00:40:29,020 Videli smo ga uporabili že enkrat, char *, kar pomeni, "da mi spremenljivko 977 00:40:29,020 --> 00:40:31,210 ki bo vsebovala naslov char. " 978 00:40:31,210 --> 00:40:33,990 Torej char * v tem kontekstu pomeni "daj mi spremenljivko." 979 00:40:33,990 --> 00:40:40,050 >> Na žalost, če boste uporabili * brez beseda pred njo, kot char, 980 00:40:40,050 --> 00:40:41,905 to je zdaj imenuje operator dereference. 981 00:40:41,905 --> 00:40:43,530 In bomo videli, več o tem kmalu. 982 00:40:43,530 --> 00:40:44,930 Ampak to samo pomeni "tja." 983 00:40:44,930 --> 00:40:49,070 To je kot bi rekel, če bi me nekdo izročil na kosu papirja "33 Oxford Street," 984 00:40:49,070 --> 00:40:53,830 če naredim "* 33 Oxford Street", kar pomeni, da "Pojdi po cesti do objekta CS." 985 00:40:53,830 --> 00:40:57,220 >> Torej * samo pomeni iti tja, če ni beseda pred njim. 986 00:40:57,220 --> 00:40:59,100 Torej, kaj je t, da bo jasno? 987 00:40:59,100 --> 00:41:03,250 t je naslov kos pomnilnika, ki je dobila nazaj. 988 00:41:03,250 --> 00:41:06,650 s je naslov kaj, da bo jasno, V primeru smo že razpravljali, 989 00:41:06,650 --> 00:41:07,500 z malimi Gabe? 990 00:41:07,500 --> 00:41:08,990 991 00:41:08,990 --> 00:41:10,005 y je naslov o-- 992 00:41:10,005 --> 00:41:11,585 993 00:41:11,585 --> 00:41:12,460 OBČINSTVO: niz. 994 00:41:12,460 --> 00:41:14,126 DAVID J. Malan: Od prvotnega imena Gabe je. 995 00:41:14,126 --> 00:41:16,660 Torej, to je naslov ta kos pomnilnika. 996 00:41:16,660 --> 00:41:22,220 Torej, če rečem, t + jaz-- i, obvestilo, je samo naš stari prijatelj. 997 00:41:22,220 --> 00:41:24,770 To je samo index spremenljivka da je ponavljanjem od nič gor 998 00:41:24,770 --> 00:41:26,960 dolžini niza s. 999 00:41:26,960 --> 00:41:30,367 Tako se dogaja, da se nič, nato pa eno, Nato dva, nato tri, nato štiri. 1000 00:41:30,367 --> 00:41:33,200 Torej, kaj je zbrati te nove Prasko kosov sestavljanke, če hočete, 1001 00:41:33,200 --> 00:41:36,140 čeprav, spet, sintaksa je veliko bolj skrivnostne kot nič. 1002 00:41:36,140 --> 00:41:39,522 Torej t naslov + i se dogaja, da me 1003 00:41:39,522 --> 00:41:42,480 številko, saj so ti vsi Številke, ki smo jih za risanje, kot čarovnica. 1004 00:41:42,480 --> 00:41:43,560 Ampak oni so samo številke. 1005 00:41:43,560 --> 00:41:49,960 >> Torej, če je naslov t smo rekli je 0x88, kaj je 0x88 plus nič. 1006 00:41:49,960 --> 00:41:51,564 1007 00:41:51,564 --> 00:41:53,980 Tudi če niste zadovoljni z hex še, da ugibati. 1008 00:41:53,980 --> 00:41:54,410 >> OBČINSTVO: original. 1009 00:41:54,410 --> 00:41:55,850 >> DAVID J. Malan: Still 0x88. 1010 00:41:55,850 --> 00:41:58,910 Torej, kaj * 0x88 pomeni? 1011 00:41:58,910 --> 00:42:02,670 To pomeni, "tja", kar pomeni, učinkovito, "dal svoj prst sem." 1012 00:42:02,670 --> 00:42:06,930 Zdaj pa na desni strani ta izraz, * nato pa v parens, 1013 00:42:06,930 --> 00:42:11,586 y + i pomeni ov, ki je obravnavati tu v mali g. 1014 00:42:11,586 --> 00:42:16,220 y + 0 je, seveda, s, kar je s. 1015 00:42:16,220 --> 00:42:21,230 >> Torej, zdaj, to je * ov, ki so prav tako kot * 33 Oxford Street pomeni, pojdite na naslov 1016 00:42:21,230 --> 00:42:22,010 e. 1017 00:42:22,010 --> 00:42:24,170 Torej, tukaj je to prst, desno roko. 1018 00:42:24,170 --> 00:42:26,050 Torej, kaj bom skopirala v kaj? 1019 00:42:26,050 --> 00:42:30,260 Stvar na desni strani, ki je Gabe, mali g tukaj, v tukaj. 1020 00:42:30,260 --> 00:42:32,750 >> In tako je učinek, ki Prva ponovitev zanke, 1021 00:42:32,750 --> 00:42:36,200 kot ste predlagali, čeprav je videti crazy bolj zapletena kot karkoli 1022 00:42:36,200 --> 00:42:42,110 smo videli prej, je preprosto rekel pojdite sem in kopiranje tega znaka tukaj. 1023 00:42:42,110 --> 00:42:44,700 To je vas daje zemljevida obeh lokacijah. 1024 00:42:44,700 --> 00:42:46,130 >> In bomo videli veliko več od tega. 1025 00:42:46,130 --> 00:42:50,600 Ampak za zdaj, upanje je, samo da bi uvesti nekatere od teh osnovnih idej. 1026 00:42:50,600 --> 00:42:53,550 In res, si oglejmo en končni program tukaj, 1027 00:42:53,550 --> 00:42:57,480 in nato obljubil claymation, ki bo vse v redu. 1028 00:42:57,480 --> 00:42:57,980 V redu. 1029 00:42:57,980 --> 00:43:01,680 Zato naj odpre up-- tam gremo. 1030 00:43:01,680 --> 00:43:02,850 1031 00:43:02,850 --> 00:43:05,440 Torej jaz-- bomo vrnili za te slike pred dolgo. 1032 00:43:05,440 --> 00:43:08,360 Dovolite mi, da odprejo ta primer končno tukaj. 1033 00:43:08,360 --> 00:43:09,440 1034 00:43:09,440 --> 00:43:12,710 >> Torej, tukaj je super, super Program, ki dosega 1035 00:43:12,710 --> 00:43:15,050 nič v življenju, ki naredi naslednje. 1036 00:43:15,050 --> 00:43:18,740 Najprej izjavlja dve spremenljivki, X in y, ki niso številke tokrat, 1037 00:43:18,740 --> 00:43:19,240 po sebi. 1038 00:43:19,240 --> 00:43:20,448 Oni niso cela števila, per se. 1039 00:43:20,448 --> 00:43:22,899 So očitno int *. 1040 00:43:22,899 --> 00:43:25,690 Torej, kdo, kaj to pomeni če je vaš tip podatkov, vaša spremenljivka, 1041 00:43:25,690 --> 00:43:26,860 je tipa int * zvezdo? 1042 00:43:26,860 --> 00:43:30,240 To je naslov int. 1043 00:43:30,240 --> 00:43:31,990 >> Tako da nimam pojma, tam, kjer je še ni. 1044 00:43:31,990 --> 00:43:35,150 To samo pomeni, "povedano, na koncu, naslov notr tukaj. " 1045 00:43:35,150 --> 00:43:38,340 0x50, 0x88, kjerkoli je v spomin, naslov se dogaja tam. 1046 00:43:38,340 --> 00:43:40,200 In to je tisto, kar je y bo, kot dobro. 1047 00:43:40,200 --> 00:43:44,920 >> Če bom zdaj rekel, x = malloc (sizeof (int)), to je fancy način rekel, 1048 00:43:44,920 --> 00:43:49,000 hej operacijski sistem, s pomočjo funkcije malloc, daj mi dovolj pomnilnika za velikost 1049 00:43:49,000 --> 00:43:52,370 za notr, kar je verjetno bo 32 bitov ali štiri bajte. 1050 00:43:52,370 --> 00:43:53,680 >> Torej, kaj malloc vrne? 1051 00:43:53,680 --> 00:43:55,250 Malloc vrne naslov. 1052 00:43:55,250 --> 00:43:57,020 Torej, kaj se dogaja, da se shranijo v X? 1053 00:43:57,020 --> 00:44:00,600 Naslov kos spomin, štiri bajte, da malloc 1054 00:44:00,600 --> 00:44:03,360 pravkar našel za mene z vprašanjem operacijski sistem. 1055 00:44:03,360 --> 00:44:08,240 >> Zdaj medtem, vrstica štiri tukaj, * x = 42. 1056 00:44:08,240 --> 00:44:09,990 Samo da bo jasno, Kaj se dogaja tam spodaj? 1057 00:44:09,990 --> 00:44:11,530 Na levi strani, * x. 1058 00:44:11,530 --> 00:44:13,610 da je kot * 33 Oxford Street. 1059 00:44:13,610 --> 00:44:15,523 Torej * x pomeni kaj? 1060 00:44:15,523 --> 00:44:16,450 >> OBČINSTVO: Pojdi na. 1061 00:44:16,450 --> 00:44:17,908 >> DAVID J. Malan: Pojdi na ta naslov. 1062 00:44:17,908 --> 00:44:20,466 Kjerkoli, da kos pomnilnik, iti k njej. 1063 00:44:20,466 --> 00:44:21,979 In dal kar tam, seveda? 1064 00:44:21,979 --> 00:44:22,520 OBČINSTVO: 42. 1065 00:44:22,520 --> 00:44:23,580 DAVID J. Malan: 42. 1066 00:44:23,580 --> 00:44:25,650 V redu, * y, ista ideja. 1067 00:44:25,650 --> 00:44:26,860 Pojdi na naslov v y. 1068 00:44:26,860 --> 00:44:31,740 Dal številko 13 ni, ampak kaj je y v tem trenutku? 1069 00:44:31,740 --> 00:44:33,172 1070 00:44:33,172 --> 00:44:34,630 OBČINSTVO: Ni pomnilnik za y. 1071 00:44:34,630 --> 00:44:35,710 DAVID J. Malan: Obstaja Ni pomnilnik za y. 1072 00:44:35,710 --> 00:44:38,215 Torej, kaj y verjetno vsebuje, kot smo že govorili? 1073 00:44:38,215 --> 00:44:38,520 >> OBČINSTVO: Garbage. 1074 00:44:38,520 --> 00:44:39,480 >> DAVID J. Malan: Nekateri smeti vrednost. 1075 00:44:39,480 --> 00:44:41,320 Zdaj, smeti vrednost je še vedno številka. 1076 00:44:41,320 --> 00:44:43,160 To še vedno lahko zamenjali za naslov. 1077 00:44:43,160 --> 00:44:45,160 To je, kot da bi nekdo načečkal nekaj dol, 1078 00:44:45,160 --> 00:44:48,002 in mi je razlagalo v tem smislu, nekatere stavbe na ulici. 1079 00:44:48,002 --> 00:44:50,460 In če si poskusite, da gredo v nekatere stavbe nimate, 1080 00:44:50,460 --> 00:44:53,710 ali nekatere kos pomnilnika, ki ga ima, ne bila dana, bi se slabe stvari dogajajo. 1081 00:44:53,710 --> 00:44:57,740 Računalnik lahko crash, ali kakšno drugo nedoločen vedenje se lahko zgodi. 1082 00:44:57,740 --> 00:45:01,310 >> Torej intro, potem bi Binky je to. 1083 00:45:01,310 --> 00:45:04,290 Še vedno se spomnim, 20 nekaj čudno let kasneje, 1084 00:45:04,290 --> 00:45:07,200 kje sem bil, ko sem končno razumeti napotke. 1085 00:45:07,200 --> 00:45:09,520 >> Kar pomeni, če oditi v treh minutah 1086 00:45:09,520 --> 00:45:12,170 in mislim, da ne razumeti napotke, zavedati 1087 00:45:12,170 --> 00:45:14,410 Sem se spomnil na 20. leta za nekaj norega razloga 1088 00:45:14,410 --> 00:45:17,140 kdaj in zakaj je na koncu potonila leta, ki je sedel s svojim poučevanjem 1089 00:45:17,140 --> 00:45:19,501 kolega, Nishat Mehta v nazaj Eliot Dining Hall. 1090 00:45:19,501 --> 00:45:21,250 Zdaj sem se spomnil zato, ker je bilo to 1091 00:45:21,250 --> 00:45:23,920 ena izmed tem, I, v Zlasti je boril z. 1092 00:45:23,920 --> 00:45:26,470 In potem, končno kliknil, kot sem si upal reči, veliko tem 1093 00:45:26,470 --> 00:45:27,460 sčasoma bo. 1094 00:45:27,460 --> 00:45:32,590 In zdaj, da to čutijo vsi srečnejši in vse bolj prepričljiva, 1095 00:45:32,590 --> 00:45:35,360 Vzemimo končno podobo v naših Zadnje tri minute tukaj na Binky, 1096 00:45:35,360 --> 00:45:37,675 od našega prijatelja, Nick Parlante iz Stanforda. 1097 00:45:37,675 --> 00:45:38,910 1098 00:45:38,910 --> 00:45:41,580 >> [VIDEO PREDVAJANJE] 1099 00:45:41,580 --> 00:45:42,750 >> Hej, Binky. 1100 00:45:42,750 --> 00:45:43,500 Zbudi se! 1101 00:45:43,500 --> 00:45:45,960 To je čas za zabavo kazalca. 1102 00:45:45,960 --> 00:45:47,012 >> Kaj je to? 1103 00:45:47,012 --> 00:45:48,723 Spoznajte kazalci? 1104 00:45:48,723 --> 00:45:50,580 Oh, Goody! 1105 00:45:50,580 --> 00:45:53,563 >> No, za začetek, mislim, da smo Potreboval bo nekaj nasvetov. 1106 00:45:53,563 --> 00:45:54,390 >> -OK. 1107 00:45:54,390 --> 00:45:57,930 Ta koda dodeljeni dve kazalci, , ki lahko kažejo na cela števila. 1108 00:45:57,930 --> 00:45:58,430 -OK. 1109 00:45:58,430 --> 00:46:02,140 No, vidim dva kazalca, vendar pa Ne zdi se, da kaže na nič. 1110 00:46:02,140 --> 00:46:02,980 >> -To Desno. 1111 00:46:02,980 --> 00:46:05,100 Sprva kazalci ne kažejo nič. 1112 00:46:05,100 --> 00:46:08,030 Stvari, ki so kazali, da se imenujejo pointees in njihovo vzpostavitvijo jev 1113 00:46:08,030 --> 00:46:09,370 ločen korak. 1114 00:46:09,370 --> 00:46:10,220 >> Oh, prav, prav. 1115 00:46:10,220 --> 00:46:10,950 Vedel sem, da je. 1116 00:46:10,950 --> 00:46:12,385 V pointees sta ločena. 1117 00:46:12,385 --> 00:46:14,315 Er, tako da kako dodeliti 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 No, to kodo razporeja Novi celo pointee, 1121 00:46:18,970 --> 00:46:20,950 in tem delu so x, da kaže na to. 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 Torej bi bilo nekaj storiti. 1125 00:46:25,060 --> 00:46:25,990 >> -OK. 1126 00:46:25,990 --> 00:46:30,455 Bom dereference kazalca x do shranite številko 42 v svojem pointee. 1127 00:46:30,455 --> 00:46:32,830 Za ta trik, bom potreboval mojo Magic Wand of Dereferenciranje. 1128 00:46:32,830 --> 00:46:34,130 1129 00:46:34,130 --> 00:46:36,080 >> Tvoj Magic Wand of Dereferenciranje? 1130 00:46:36,080 --> 00:46:37,357 1131 00:46:37,357 --> 00:46:38,190 To--, da je super. 1132 00:46:38,190 --> 00:46:39,340 1133 00:46:39,340 --> 00:46:41,080 >> Tole je tisto koda izgleda. 1134 00:46:41,080 --> 00:46:44,110 Bom ustanovil številko in [POP] 1135 00:46:44,110 --> 00:46:44,700 >> Hej, poglej. 1136 00:46:44,700 --> 00:46:46,140 Tukaj gre. 1137 00:46:46,140 --> 00:46:50,980 >> Torej delaš razrešimo na x sledi arrow dostop do svojega pointee. 1138 00:46:50,980 --> 00:46:53,160 V tem primeru, trgovina 42 notri. 1139 00:46:53,160 --> 00:46:57,710 Hej, poskusite ga uporabljali za shranjevanje številke 13 skozi drugi kazalec, y. 1140 00:46:57,710 --> 00:46:58,760 >> -OK. 1141 00:46:58,760 --> 00:47:03,270 Grem tja, da y, in dobili številko 13 postavitev. 1142 00:47:03,270 --> 00:47:07,930 In potem, vzemi palico Dereferenciranje in 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 Da ni delovalo. 1146 00:47:11,090 --> 00:47:15,630 Pravijo, Binky, jaz ne mislim Dereferenciranje y je dobra ideja, saj veš, 1147 00:47:15,630 --> 00:47:17,850 vzpostavitev pointee je samostojen korak. 1148 00:47:17,850 --> 00:47:20,450 In mislim, da ne bomo nikoli naredili. 1149 00:47:20,450 --> 00:47:21,480 >> Dobro točka. 1150 00:47:21,480 --> 00:47:21,980 Ja. 1151 00:47:21,980 --> 00:47:25,680 Dodeljena smo kazalec y, vendar smo Nikoli ga nastavite, da kaže na pointee. 1152 00:47:25,680 --> 00:47:27,190 1153 00:47:27,190 --> 00:47:28,616 >> -Zelo Pazljiv. 1154 00:47:28,616 --> 00:47:30,240 Hej, iščete dobro tam, Binky. 1155 00:47:30,240 --> 00:47:33,400 Lahko popraviš, tako da y točke na isti pointee kot x? 1156 00:47:33,400 --> 00:47:34,000 >> -Seveda. 1157 00:47:34,000 --> 00:47:36,780 Uporabil bom svojo čarobno palico od Pointer odstopu. 1158 00:47:36,780 --> 00:47:38,740 >> Je to bo problem, kot prej? 1159 00:47:38,740 --> 00:47:39,240 Ne. 1160 00:47:39,240 --> 00:47:40,660 To ne dotikajte pointees. 1161 00:47:40,660 --> 00:47:44,450 To samo spremeni en kazalec opozarjajo na isto stvar kot drugo. 1162 00:47:44,450 --> 00:47:45,450 >> Oh, vidim. 1163 00:47:45,450 --> 00:47:48,200 Zdaj y opozarja na istem mestu kot x. 1164 00:47:48,200 --> 00:47:48,910 Torej, počakajte. 1165 00:47:48,910 --> 00:47:49,950 Zdaj je določen y. 1166 00:47:49,950 --> 00:47:51,120 Ima pointee. 1167 00:47:51,120 --> 00:47:54,510 Torej, lahko poskusite palico Ponovno Dereferenciranje poslati 13 konec. 1168 00:47:54,510 --> 00:47:56,510 >> Uh, OK. 1169 00:47:56,510 --> 00:47:58,160 Tukaj gre. [POP] 1170 00:47:58,160 --> 00:47:59,340 >> Hej, poglej to. 1171 00:47:59,340 --> 00:48:00,750 Zdaj Dereferenciranje dela na y. 1172 00:48:00,750 --> 00:48:04,991 In ker so kazalci v skupni rabi da eno pointee, oba videli 13. 1173 00:48:04,991 --> 00:48:05,490 Ja. 1174 00:48:05,490 --> 00:48:06,870 Delitev, karkoli. 1175 00:48:06,870 --> 00:48:08,820 Torej bomo preklopiti krajev zdaj? 1176 00:48:08,820 --> 00:48:09,440 >> Oh, poglej. 1177 00:48:09,440 --> 00:48:10,830 Zmanjkalo nam je časa. 1178 00:48:10,830 --> 00:48:11,570 >> -But-- 1179 00:48:11,570 --> 00:48:13,530 >> Samo spomnite tri pravila kazalec. 1180 00:48:13,530 --> 00:48:16,560 Number One, osnovna struktura je, da imate kazalec, 1181 00:48:16,560 --> 00:48:18,680 in se kaže kot na pointee. 1182 00:48:18,680 --> 00:48:20,640 Ampak kazalec in pointee so ločeni, 1183 00:48:20,640 --> 00:48:22,610 in skupna napaka je ustanoviti kazalec, 1184 00:48:22,610 --> 00:48:25,000 ampak, da bi pozabili, da ga pointee. 1185 00:48:25,000 --> 00:48:28,170 >> Število Dva, kazalec Dereferenciranje začne na kazalec 1186 00:48:28,170 --> 00:48:31,050 in sledi svoji puščico nad dostop do svojega pointee. 1187 00:48:31,050 --> 00:48:33,400 Kot vsi vemo, je to Deluje samo, če je 1188 00:48:33,400 --> 00:48:36,270 pointee, katere vrste vrne na prvo pravilo. 1189 00:48:36,270 --> 00:48:39,000 >> Številka Tri, kazalec Dodelitev traja en kazalec 1190 00:48:39,000 --> 00:48:42,320 in ga spreminja, da kaže na Enako pointee kot drugi kazalec. 1191 00:48:42,320 --> 00:48:44,160 Torej, po odstopu, dve kazalci 1192 00:48:44,160 --> 00:48:45,910 bo opozorila na istem pointee. 1193 00:48:45,910 --> 00:48:47,990 Včasih, da se imenuje delitev. 1194 00:48:47,990 --> 00:48:49,740 In to je vse, kar je z njo, res. 1195 00:48:49,740 --> 00:48:50,277 Adijo zdaj. 1196 00:48:50,277 --> 00:48:51,110 [END VIDEO PREDVAJANJE] 1197 00:48:51,110 --> 00:48:52,568 DAVID J. Malan: To je za CS50. 1198 00:48:52,568 --> 00:48:55,110 Vam bomo videli naslednji teden. 1199 00:48:55,110 --> 00:48:56,064