1 00:00:00,000 --> 00:00:01,110 >> [Musikk spilles] 2 00:00:01,110 --> 00:00:10,567 3 00:00:10,567 --> 00:00:11,650 DAVID J. MALAN: All right. 4 00:00:11,650 --> 00:00:15,610 Dette er CS50, og denne er slutten av uke Four. 5 00:00:15,610 --> 00:00:19,420 Og et av temaene i dag er at av digital etterforskning, 6 00:00:19,420 --> 00:00:20,989 kunsten å utvinne informasjon. 7 00:00:20,989 --> 00:00:22,780 Og ja, selv om du er midt 8 00:00:22,780 --> 00:00:25,070 akkurat nå of Peace på tre og Breakout, neste uke, 9 00:00:25,070 --> 00:00:27,880 fokuset vil være på nettopp dette domenet. 10 00:00:27,880 --> 00:00:30,686 >> Så en av de kuleste jobbene jeg noensinne hadde var tilbake i gradsstudier, 11 00:00:30,686 --> 00:00:33,560 da jeg jobbet for den lokale Middlesex County District Attorney 12 00:00:33,560 --> 00:00:34,950 kontor, gjør etterforskning fungere. 13 00:00:34,950 --> 00:00:37,450 Så egentlig, Massachusetts State Police, til tider, 14 00:00:37,450 --> 00:00:40,100 Ved arbeid på tilfeller ville få inn ting som harddisker 15 00:00:40,100 --> 00:00:42,185 og disketter og minnekort og lignende. 16 00:00:42,185 --> 00:00:44,060 Og de ville overlevere dem til meg og min mentor, 17 00:00:44,060 --> 00:00:48,070 og vårt mål var å finne bevis, hvis det var noen, av disse medier. 18 00:00:48,070 --> 00:00:50,700 Nå, har du kanskje sett glimt av denne verden av forensics 19 00:00:50,700 --> 00:00:53,000 i media, TV og filmer. 20 00:00:53,000 --> 00:00:55,730 Men den jobben jeg hadde, og daresay at verden, 21 00:00:55,730 --> 00:00:57,550 er ikke helt som du ville se det. 22 00:00:57,550 --> 00:01:00,794 La oss ta en titt på hva du har sikkert sett. 23 00:01:00,794 --> 00:01:01,460 [VIDEOAVSPILLING] 24 00:01:01,460 --> 00:01:02,930 -OK. 25 00:01:02,930 --> 00:01:05,380 Nå, la oss få en god titt på deg. 26 00:01:05,380 --> 00:01:06,850 >> [Musikk spilles] 27 00:01:06,850 --> 00:01:12,260 28 00:01:12,260 --> 00:01:12,932 >> -Vent Det. 29 00:01:12,932 --> 00:01:13,657 Kjør det tilbake. 30 00:01:13,657 --> 00:01:14,733 >> -Vent Litt. 31 00:01:14,733 --> 00:01:15,233 Gå til høyre. 32 00:01:15,233 --> 00:01:16,371 33 00:01:16,371 --> 00:01:16,870 -Det. 34 00:01:16,870 --> 00:01:17,369 Fryse det. 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 Fryse det. 38 00:01:18,875 --> 00:01:20,160 -Tighten Opp på det, vil du? 39 00:01:20,160 --> 00:01:22,126 >> -Vector Inn på det fyr ved bakhjulet. 40 00:01:22,126 --> 00:01:24,435 >> Zoome inn her på dette stedet. 41 00:01:24,435 --> 00:01:28,580 >> -Med Riktig utstyr, Bildet kan forstørres og skjerpet. 42 00:01:28,580 --> 00:01:29,330 >> Hva er det? 43 00:01:29,330 --> 00:01:30,780 >> -Det er en forbedring program. 44 00:01:30,780 --> 00:01:32,170 >> Kan du klare det opp noe? 45 00:01:32,170 --> 00:01:33,070 >> Jeg vet ikke. 46 00:01:33,070 --> 00:01:34,150 La oss forbedre den. 47 00:01:34,150 --> 00:01:35,440 >> -Enhance Seksjon A6. 48 00:01:35,440 --> 00:01:36,570 49 00:01:36,570 --> 00:01:38,562 Jeg forbedret detalj, og-- 50 00:01:38,562 --> 00:01:40,020 -Jeg tror det er nok til å forbedre. 51 00:01:40,020 --> 00:01:40,976 Slipp den til skjermen min. 52 00:01:40,976 --> 00:01:42,559 >> -Jeg Forbedret refleksjon i øyet hennes. 53 00:01:42,559 --> 00:01:44,322 -Vi Kjøre dette gjennom video ekstrautstyr. 54 00:01:44,322 --> 00:01:45,210 >> -Edgar, Kan du forbedre dette? 55 00:01:45,210 --> 00:01:45,710 >> -Heng På. 56 00:01:45,710 --> 00:01:47,570 57 00:01:47,570 --> 00:01:49,458 >> Jeg har jo jobbet med dette refleksjon. 58 00:01:49,458 --> 00:01:50,402 >> -Det Er noens refleksjon. 59 00:01:50,402 --> 00:01:50,902 >> Lysreflekterende. 60 00:01:50,902 --> 00:01:52,870 -Det er en refleksjon av mannens ansikt. 61 00:01:52,870 --> 00:01:53,694 >> -The Refleksjon! 62 00:01:53,694 --> 00:01:54,610 -Det er en refleksjon. 63 00:01:54,610 --> 00:01:55,880 Zoome inn på speilet. 64 00:01:55,880 --> 00:01:57,860 Du kan se en refleksjon. 65 00:01:57,860 --> 00:01:59,630 >> Kan du forbedre bildet herfra? 66 00:01:59,630 --> 00:02:00,377 67 00:02:00,377 --> 00:02:01,210 Kan du forbedre det? 68 00:02:01,210 --> 00:02:02,190 Kan du forbedre det? 69 00:02:02,190 --> 00:02:03,066 Kan vi forbedre dette? 70 00:02:03,066 --> 00:02:03,898 Kan du forbedre det? 71 00:02:03,898 --> 00:02:04,740 -Vent Et sekund. 72 00:02:04,740 --> 00:02:05,281 Jeg skal forbedre. 73 00:02:05,281 --> 00:02:06,470 Zoome inn på døren. 74 00:02:06,470 --> 00:02:06,970 -Times 10. 75 00:02:06,970 --> 00:02:08,009 Zoome. 76 00:02:08,009 --> 00:02:08,509 -Flytt Inn. 77 00:02:08,509 --> 00:02:09,340 -Mer. 78 00:02:09,340 --> 00:02:10,094 Vent, stopp. 79 00:02:10,094 --> 00:02:10,750 -Slutt. 80 00:02:10,750 --> 00:02:11,250 -Pause Det. 81 00:02:11,250 --> 00:02:13,542 -Rotate Oss 75 grader rundt den vertikale, takk. 82 00:02:13,542 --> 00:02:14,750 83 00:02:14,750 --> 00:02:16,127 >> -Slutt. 84 00:02:16,127 --> 00:02:19,330 Gå tilbake til den delen om døren igjen. 85 00:02:19,330 --> 00:02:21,420 >> -Fikk Et forbedret lydbilde som kan bitmap? 86 00:02:21,420 --> 00:02:24,420 >> Kanskje vi kan bruke Pradeep Singh metode for å se inn vinduene. 87 00:02:24,420 --> 00:02:25,902 >> -Programvaren Er state of the art. 88 00:02:25,902 --> 00:02:26,866 >> -The Egenverdi er av. 89 00:02:26,866 --> 00:02:29,758 >> -Med Høyre Kombinasjonen av algorithms-- 90 00:02:29,758 --> 00:02:32,168 >> Han er tatt belysning algoritmer til det neste nivå, 91 00:02:32,168 --> 00:02:34,110 og jeg kan bruke dem til forbedre dette fotografiet. 92 00:02:34,110 --> 00:02:36,840 >> -LOCK På og forstørre z-aksen. 93 00:02:36,840 --> 00:02:37,351 >> -Enhance. 94 00:02:37,351 --> 00:02:37,850 Forbedre. 95 00:02:37,850 --> 00:02:38,720 -Enhance. 96 00:02:38,720 --> 00:02:40,070 -Freeze Og styrke. 97 00:02:40,070 --> 00:02:43,420 [END VIDEOAVSPILLING] 98 00:02:43,420 --> 00:02:45,830 DAVID J. MALAN: Så de er alle ord, men de var ikke 99 00:02:45,830 --> 00:02:47,870 brukes i setninger på riktig måte. 100 00:02:47,870 --> 00:02:52,370 Og faktisk i fremtiden, når som helst, vær så snill, hører du noen si ordet, 101 00:02:52,370 --> 00:02:54,250 "Forbedre", humrer bare litt. 102 00:02:54,250 --> 00:02:57,190 Fordi når du prøver å forbedre, for eksempel, er dette hva som skjer. 103 00:02:57,190 --> 00:02:58,580 >> Så her er en nydelig bilde. 104 00:02:58,580 --> 00:02:59,720 Dette er CS50 egen Daven. 105 00:02:59,720 --> 00:03:03,740 Og anta at vi ønsket å fokusere på glimt i øyet, 106 00:03:03,740 --> 00:03:05,870 eller refleksjonen av bad guy som var tydelig 107 00:03:05,870 --> 00:03:07,820 fanget opp av overvåkningskamera. 108 00:03:07,820 --> 00:03:10,330 Dette er hva som skjer når du zoome inn på et bilde som 109 00:03:10,330 --> 00:03:14,060 har bare et endelig antall bits som er knyttet til den. 110 00:03:14,060 --> 00:03:15,420 >> Det er hva du ville få. 111 00:03:15,420 --> 00:03:19,190 Og ja, i Daven øye er, men fire, kanskje seks piksler 112 00:03:19,190 --> 00:03:22,110 at komponere nøyaktig hva var glitrende der. 113 00:03:22,110 --> 00:03:25,890 Så Problem Set Fire til slutt vil ha du utforske denne verden, spesielt 114 00:03:25,890 --> 00:03:28,090 av natur av noe vi kaller fil I / O, hvor 115 00:03:28,090 --> 00:03:31,000 i / o er bare en fancy måte å sier input og output. 116 00:03:31,000 --> 00:03:34,280 >> Så så langt, alle interaksjoner vi har hatt med en datamaskin 117 00:03:34,280 --> 00:03:36,770 har i stor grad vært med tastaturet og skjermen 118 00:03:36,770 --> 00:03:40,770 men ikke så mye med harddisken, eller lagre filer utover de du 119 00:03:40,770 --> 00:03:41,620 selv skrive. 120 00:03:41,620 --> 00:03:44,570 Programmene så langt har ikke vært å skape, og sparing, 121 00:03:44,570 --> 00:03:46,270 og oppdatere sine egne filer. 122 00:03:46,270 --> 00:03:47,150 >> Vel, hva er en fil? 123 00:03:47,150 --> 00:03:48,105 Vel, noe som en JPEG. 124 00:03:48,105 --> 00:03:50,520 Dette er et bilde du kanskje har eller laste opp til Facebook, 125 00:03:50,520 --> 00:03:51,690 eller se hvor som helst på nettet. 126 00:03:51,690 --> 00:03:54,460 Ja, det bildet vi bare sag av Daven var en JPEG. 127 00:03:54,460 --> 00:03:57,570 Og hva er interessant om filer som JPEG 128 00:03:57,570 --> 00:04:02,170 er at de kan bli identifisert, typisk, etter visse mønstre av biter. 129 00:04:02,170 --> 00:04:05,200 >> Med andre ord, hva er det som skiller en JPEG fra en GIF 130 00:04:05,200 --> 00:04:08,109 fra en PING fra et Word dokument fra en Excel-fil? 131 00:04:08,109 --> 00:04:09,900 Vel, det er bare annerledes mønstre. 132 00:04:09,900 --> 00:04:12,820 Og de forskjellige mønstre er vanligvis i begynnelsen av disse filene. 133 00:04:12,820 --> 00:04:18,200 >> Slik at når datamaskinen åpner et Word doc, eller når en datamaskin åpner en JPEG, 134 00:04:18,200 --> 00:04:20,940 det ser vanligvis på første flere bits i filen. 135 00:04:20,940 --> 00:04:24,059 Og hvis det gjenkjenner et mønster, den sier, oh, er dette et bilde. 136 00:04:24,059 --> 00:04:25,850 La meg vise det til brukeren som grafikk. 137 00:04:25,850 --> 00:04:27,870 Eller, oh, dette ser ut som et Word-dokument. 138 00:04:27,870 --> 00:04:30,480 La meg vise det til brukeren som et essay. 139 00:04:30,480 --> 00:04:33,020 >> Så for eksempel, JPEG, det viser seg, er 140 00:04:33,020 --> 00:04:35,460 ganske sofistikert under panseret. 141 00:04:35,460 --> 00:04:40,140 Men de tre første byte i de fleste hver JPEG starte med disse tre tall. 142 00:04:40,140 --> 00:04:44,680 Så byte null, en, to, og er, i de fleste hver JPEG, 255, deretter nummeret 143 00:04:44,680 --> 00:04:46,675 216, deretter nummeret 255. 144 00:04:46,675 --> 00:04:48,990 >> Og hva vil du kunne å begynne å gjøre neste uke 145 00:04:48,990 --> 00:04:52,920 er faktisk poking under panseret på filer som JPEG 146 00:04:52,920 --> 00:04:57,210 og som bitmap-filer, og se hva har alltid vært der så lenge 147 00:04:57,210 --> 00:04:58,650 som du har vært å bruke en datamaskin. 148 00:04:58,650 --> 00:05:01,860 >> Men hva er det ikke typisk skrevet som desimaltall som dette. 149 00:05:01,860 --> 00:05:04,620 Dataforskere ikke tendens til å snakke i desimal. 150 00:05:04,620 --> 00:05:06,139 De har egentlig ikke snakke i binær. 151 00:05:06,139 --> 00:05:07,930 Vanligvis når vi ønsker å uttrykke tall, 152 00:05:07,930 --> 00:05:10,710 vi faktisk bruker heksadesimale, som du kanskje husker 153 00:05:10,710 --> 00:05:13,027 fra, sier Problem Set One, som utfordret 154 00:05:13,027 --> 00:05:14,610 du til å tenke på et annet system. 155 00:05:14,610 --> 00:05:17,170 >> Vi, selvfølgelig, er kjent med desimal, null til ni. 156 00:05:17,170 --> 00:05:18,215 Vi snakket om binær. 157 00:05:18,215 --> 00:05:20,710 Og vi har egentlig ikke å bruke så mye her 158 00:05:20,710 --> 00:05:22,470 på ut, fordi datamaskiner vil bruke det. 159 00:05:22,470 --> 00:05:24,900 Men programmerere vil veldig ofte, men ikke alltid, 160 00:05:24,900 --> 00:05:29,360 bruke heksadesimale, som bare betyr du har 16 bokstaver i alfabetet, 161 00:05:29,360 --> 00:05:31,330 i motsetning til to eller 10. 162 00:05:31,330 --> 00:05:34,530 >> Så hvordan du telle til høyere enn ni i heksadesimal? 163 00:05:34,530 --> 00:05:41,120 Du går 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, bare ved konvensjonen. 164 00:05:41,120 --> 00:05:43,540 Men kjernen er at hver Av disse er en enkelt symbol. 165 00:05:43,540 --> 00:05:44,340 Det er ingen 10. 166 00:05:44,340 --> 00:05:48,400 Det er ingen 11, per se, fordi hvert av dine sifre, akkurat som i desimal 167 00:05:48,400 --> 00:05:51,940 og akkurat som i binær, bør bare være et enkelt tegn, etter konvensjonen. 168 00:05:51,940 --> 00:05:55,280 >> Så det er da alfabetet vi har til rådighet for heksadesimale. 169 00:05:55,280 --> 00:05:58,600 Så hvordan ser en JPEG som om du var å skrive ut de første tre 170 00:05:58,600 --> 00:06:01,980 bytes ikke som desimal, men, for eksempel som en heksadesimal? 171 00:06:01,980 --> 00:06:03,640 Og hvorfor er hex selv alt som er nyttig? 172 00:06:03,640 --> 00:06:05,290 >> Vel, en rask titt på et eksempel. 173 00:06:05,290 --> 00:06:09,030 Så hvis jeg skriver ut biter som representerer disse desimal numbers-- 174 00:06:09,030 --> 00:06:12,450 dette kan være litt rusten nå fra et par uker tilbake, 175 00:06:12,450 --> 00:06:14,820 men den venstre og den rette er ganske enkelt. 176 00:06:14,820 --> 00:06:17,990 255 var det største antallet vi kunne representere med åtte biter. 177 00:06:17,990 --> 00:06:18,820 Det var alle de. 178 00:06:18,820 --> 00:06:21,320 Så det eneste som er mildt interessant er den mellomste. 179 00:06:21,320 --> 00:06:24,700 Og hvis du slags gjøre ut matte, vil du utlede at, ja, 180 00:06:24,700 --> 00:06:27,949 at mønsteret av ett og nuller representerer 216. 181 00:06:27,949 --> 00:06:30,240 Så la oss bare fastsette for nå at disse er korrekte. 182 00:06:30,240 --> 00:06:31,730 Men hvorfor er dette interessant? 183 00:06:31,730 --> 00:06:33,970 >> Vel, en byte, selvfølgelig, er åtte bits. 184 00:06:33,970 --> 00:06:38,980 Og det viser seg at hvis du tror av en byte som to biter av fire biter, 185 00:06:38,980 --> 00:06:39,500 som dette. 186 00:06:39,500 --> 00:06:41,000 La meg bare legge til noen plass. 187 00:06:41,000 --> 00:06:42,550 Så før, etter. 188 00:06:42,550 --> 00:06:46,520 Jeg har nettopp lagt inn mellomrom for visualisering skyld her. 189 00:06:46,520 --> 00:06:51,840 Hvordan kan vi nå representerer i, si, heksadesimale hver quad biter, 190 00:06:51,840 --> 00:06:52,880 hvert sett med fire biter? 191 00:06:52,880 --> 00:06:56,420 >> Så for eksempel, på venstre nå har vi 1111 i binær. 192 00:06:56,420 --> 00:07:00,420 Hva er det nummeret i desimal, hvis du gjør ut regnestykket? 193 00:07:00,420 --> 00:07:03,780 Du har de plass, toere sted, The Fours sted, og åttere sted. 194 00:07:03,780 --> 00:07:04,341 >> PUBLIKUM: 15. 195 00:07:04,341 --> 00:07:05,340 DAVID J. MALAN: Det er 15. 196 00:07:05,340 --> 00:07:08,340 Så hvis vi gjør åtte pluss fire pluss to pluss en, får vi 15. 197 00:07:08,340 --> 00:07:11,790 Så jeg kunne skrive ned 15 nedenfor 1111, men hele poenget her 198 00:07:11,790 --> 00:07:13,190 er heksadesimale, ikke desimal. 199 00:07:13,190 --> 00:07:17,310 Så i stedet for å skrive ned 15, 1-5, Jeg kommer til å skrive at i hex, 200 00:07:17,310 --> 00:07:22,311 som hvis du tenker tilbake, hvis du har null gjennom f, hva er 15 kommer til å bli? 201 00:07:22,311 --> 00:07:22,810 PUBLIKUM: f. 202 00:07:22,810 --> 00:07:24,434 DAVID J. MALAN: Så det viser seg at det er f. 203 00:07:24,434 --> 00:07:29,140 Og du kan jobbe det ut ved å si: vel, hvis en er 10, så OK, er f 15. 204 00:07:29,140 --> 00:07:33,250 Så ja, kan vi omskrive denne samme sett med tall som f f. 205 00:07:33,250 --> 00:07:35,750 Og så hvis vi gjør litt matte, vi utlede at det er d. 206 00:07:35,750 --> 00:07:38,650 Åtte er ganske lett, fordi vi har en i det ekt sted. 207 00:07:38,650 --> 00:07:40,620 Og så har vi et par mer f f-tallet. 208 00:07:40,620 --> 00:07:44,669 >> Så hva mennesker har en tendens til å gjøre etter konvensjonen når de bruker heksadesimale er de bare 209 00:07:44,669 --> 00:07:47,710 skrive dette litt mer konsist, kvitte seg med det meste av det hvite området. 210 00:07:47,710 --> 00:07:50,890 Og bare for å være super klar til leserne om at dette er heksadesimale, 211 00:07:50,890 --> 00:07:54,670 den enkle konvensjonen blant mennesker er du skriver null 212 00:07:54,670 --> 00:07:58,000 x, som ikke har noen mening annet enn en visuell identifikasjon av, 213 00:07:58,000 --> 00:07:59,590 her kommer en hex tall. 214 00:07:59,590 --> 00:08:04,210 >> Og så setter du de to sifrene, f f i dette tilfellet, så d en, deretter f f. 215 00:08:04,210 --> 00:08:06,700 Så lang historie kort, heksadesimale bare har en tendens 216 00:08:06,700 --> 00:08:11,990 å være nyttig fordi hver av dens siffer, null gjennom f, perfekt linjer 217 00:08:11,990 --> 00:08:13,880 opp med et mønster av fire bits. 218 00:08:13,880 --> 00:08:18,080 >> Så hvis du har to heksadesimale sifre, null gjennom F, igjen og igjen, 219 00:08:18,080 --> 00:08:20,256 som gir deg perfekt åtte biter eller én byte. 220 00:08:20,256 --> 00:08:22,380 Så det er derfor det har en tendens til være konvensjonelt stoff. 221 00:08:22,380 --> 00:08:24,990 Det er ingen intellektuell innholdet virkelig utover det, 222 00:08:24,990 --> 00:08:27,010 annet enn den faktiske nytten. 223 00:08:27,010 --> 00:08:29,310 >> Nå JPEG er ikke den eneste filformater for grafikk. 224 00:08:29,310 --> 00:08:33,230 Du husker kanskje at det er filer som dette i verden, 225 00:08:33,230 --> 00:08:34,830 i hvert fall fra et par år tilbake. 226 00:08:34,830 --> 00:08:37,580 >> Så dette var faktisk installert i Windows XP 227 00:08:37,580 --> 00:08:39,960 på millioner av PCer verden rundt. 228 00:08:39,960 --> 00:08:43,000 Og dette var en bitmap fil, BMP. 229 00:08:43,000 --> 00:08:47,690 Og en bitmap fil, som du vil se neste uke, betyr bare et mønster av punkter, 230 00:08:47,690 --> 00:08:51,710 piksler som de heter, Et kart på bits, egentlig. 231 00:08:51,710 --> 00:08:55,160 >> Så hva er interessant, skjønt, om dette filformatet, BMP, er 232 00:08:55,160 --> 00:08:58,590 at under panseret, det har mer enn bare tre bytes 233 00:08:58,590 --> 00:09:01,020 at komponere sin header, så å snakke, de første par biter. 234 00:09:01,020 --> 00:09:03,330 Det faktisk ser litt komplisert ved første øyekast. 235 00:09:03,330 --> 00:09:04,704 Og du vil se dette i P sett. 236 00:09:04,704 --> 00:09:06,810 Og få noe Spesielt av denne nå 237 00:09:06,810 --> 00:09:10,720 er ikke så viktig, så bare det faktum at i begynnelsen av hver bitmap 238 00:09:10,720 --> 00:09:13,823 fil, et grafisk format, det er en hel haug med tall. 239 00:09:13,823 --> 00:09:14,980 240 00:09:14,980 --> 00:09:16,720 >> Nå Microsoft, Forfatteren av dette formatet, 241 00:09:16,720 --> 00:09:18,820 en tendens til å kalle dem ting som ikke ints og tegn 242 00:09:18,820 --> 00:09:22,259 Flyter men ord og d ord og lengter og bytes. 243 00:09:22,259 --> 00:09:23,800 Så de er bare forskjellige datatyper. 244 00:09:23,800 --> 00:09:25,170 De er forskjellige navn for det samme. 245 00:09:25,170 --> 00:09:26,740 Men vil du se at i P Set Fire. 246 00:09:26,740 --> 00:09:31,450 >> Men dette er bare å si at hvis et menneske dobbeltklikker noen BMP-filen på sin 247 00:09:31,450 --> 00:09:35,015 eller hennes harddisk, og et vindu åpner opp som viser ham eller henne det bildet, 248 00:09:35,015 --> 00:09:38,500 som skjedde fordi drifts Systemet formodentlig merke ikke bare 249 00:09:38,500 --> 00:09:41,460 .BMP filtypen i filnavnet, 250 00:09:41,460 --> 00:09:45,010 men også det faktum at det er noen konvensjonen til mønsteret av biter 251 00:09:45,010 --> 00:09:47,490 helt i begynnelsen av at bitmap fil. 252 00:09:47,490 --> 00:09:50,270 >> Men la oss nå fokusere på slik komplisert fil, 253 00:09:50,270 --> 00:09:52,120 men i stedet på noe sånt som dette. 254 00:09:52,120 --> 00:09:55,190 Anta her i GEdit, jeg må bare begynnelsen 255 00:09:55,190 --> 00:09:57,070 av et program som er ganske enkelt. 256 00:09:57,070 --> 00:09:58,860 Jeg har fått noen inkluderer opp toppen. 257 00:09:58,860 --> 00:10:02,120 Nå har jeg fått # include "structs.h", men Jeg skal komme tilbake til det i et øyeblikk. 258 00:10:02,120 --> 00:10:03,974 Men dette er nyttig for å nå. 259 00:10:03,974 --> 00:10:05,890 Så dette er et program som kommer til å implementere 260 00:10:05,890 --> 00:10:07,335 som registrar database. 261 00:10:07,335 --> 00:10:09,710 Så en database av studenter, og hver elev i verden 262 00:10:09,710 --> 00:10:13,190 har et navn og et hus og sannsynligvis noen andre ting, men vi vil holde det enkelt. 263 00:10:13,190 --> 00:10:15,140 Hver student har et navn og et hus. 264 00:10:15,140 --> 00:10:17,700 >> Så hvis jeg ønsket å skrive en program hvis formål i livet 265 00:10:17,700 --> 00:10:19,860 var bare for å veksle fra null på opp til tre, 266 00:10:19,860 --> 00:10:22,070 hvis det er tre studenter ved Harvard University. 267 00:10:22,070 --> 00:10:25,350 Og jeg vil bare få ved å bruke GetString, hver elev navn og hus, 268 00:10:25,350 --> 00:10:26,600 og så bare skrive dem ut. 269 00:10:26,600 --> 00:10:28,630 >> Dette er liksom som Week One, uke to ting nå, 270 00:10:28,630 --> 00:10:30,810 hvor jeg bare vil ha en for løkke eller noe sånt. 271 00:10:30,810 --> 00:10:34,500 Og jeg vil ringe GetString noen ganger, og deretter skrive ut f et par ganger. 272 00:10:34,500 --> 00:10:37,340 Så hvordan kan jeg gjøre dette, skjønt, når både et navn og et hus 273 00:10:37,340 --> 00:10:39,070 er involvert for hver elev? 274 00:10:39,070 --> 00:10:42,830 >> Så mitt første instinkt kanskje være å gjøre noe som dette. 275 00:10:42,830 --> 00:10:49,620 Jeg kan først si, vel, gi meg, si, en rekke strenger kalt navn. 276 00:10:49,620 --> 00:10:51,530 Og jeg vil ikke ha en hardcode tre her. 277 00:10:51,530 --> 00:10:53,064 Hva ønsker jeg å sette det? 278 00:10:53,064 --> 00:10:55,730 Slik at studenter, fordi det er bare en konstant erklært på toppen, 279 00:10:55,730 --> 00:10:57,860 bare så jeg ikke trenger å hardcode tre på flere steder. 280 00:10:57,860 --> 00:11:00,859 På denne måten kan jeg forandre det ett sted, og det påvirker en endring overalt. 281 00:11:00,859 --> 00:11:04,470 Og da kan jeg gjøre string huser studenter. 282 00:11:04,470 --> 00:11:10,250 >> Og nå, kan jeg gjøre noe sånt for (int i = 0; i 00:11:14,390 Så jeg skriver fort, men dette er sikkert kjent syntaks nå. 284 00:11:14,390 --> 00:11:17,030 >> Og nå, dette var nyere. 285 00:11:17,030 --> 00:11:22,890 Hvis jeg ønsker å sette i i-te studentens navn, tror jeg at jeg gjør dette. 286 00:11:22,890 --> 00:11:26,480 Og da, ikke navn men husene brakett jeg. 287 00:11:26,480 --> 00:11:29,930 Jeg gjør dette, GetString, og la meg gå tilbake og rette denne linjen. 288 00:11:29,930 --> 00:11:30,430 Enig? 289 00:11:30,430 --> 00:11:31,200 Uenig? 290 00:11:31,200 --> 00:11:32,366 Det er ikke veldig brukervennlig. 291 00:11:32,366 --> 00:11:33,890 Jeg har ikke fortalt brukeren hva de skal gjøre. 292 00:11:33,890 --> 00:11:36,520 >> Men nå, hvis jeg også ønsket å senere, la oss 293 00:11:36,520 --> 00:11:40,060 si, skrive ut disse tingene out-- så TODO senere. 294 00:11:40,060 --> 00:11:42,330 Jeg kommer til å gjøre mer med dette-- dette uten tvil si 295 00:11:42,330 --> 00:11:45,970 en korrekt gjennomføring av få navn og hus, tre 296 00:11:45,970 --> 00:11:48,870 av dem sum av hver, fra en bruker. 297 00:11:48,870 --> 00:11:51,280 >> Men dette er ikke veldig bra design, ikke sant? 298 00:11:51,280 --> 00:11:55,220 Hva hvis en student har ikke bare et navn og et hus, men også et ID-nummer, 299 00:11:55,220 --> 00:11:57,770 og et telefonnummer, og en e-postadresse, 300 00:11:57,770 --> 00:12:00,280 og kanskje en hjemmeside, og kanskje en Twitter håndtak, 301 00:12:00,280 --> 00:12:03,730 og hvilket som helst antall av andre detaljer forbundet med en elev eller en person 302 00:12:03,730 --> 00:12:04,610 mer generelt. 303 00:12:04,610 --> 00:12:07,720 Hvordan ville vi begynne å legge funksjonaliteten til dette programmet? 304 00:12:07,720 --> 00:12:14,080 >> Vel, jeg føler meg som den enkleste måten kanskje være å gjøre noe sånt som, la oss si, 305 00:12:14,080 --> 00:12:16,490 int IDS studenter. 306 00:12:16,490 --> 00:12:18,380 Så jeg kan sette alle sine IDer der inne. 307 00:12:18,380 --> 00:12:22,240 Og så, etter noe som telefonnumre, 308 00:12:22,240 --> 00:12:24,400 Jeg er ikke sikker på hvordan du representerer det ennå. 309 00:12:24,400 --> 00:12:30,280 Så la oss gå videre og bare samtale dette twitrere studenter, som 310 00:12:30,280 --> 00:12:33,550 er litt rart, men-- og en haug mer felt. 311 00:12:33,550 --> 00:12:36,360 >> Jeg har begynt å effektivt kopiere og lime inn her. 312 00:12:36,360 --> 00:12:39,416 Og dette kommer til å vokse ganske uhåndterlig ganske raskt, ikke sant? 313 00:12:39,416 --> 00:12:42,290 Ville det ikke være fint hvis det var i verden en datastruktur kjent 314 00:12:42,290 --> 00:12:45,600 ikke som en int eller en streng, men noe høyere nivå, en abstraksjon, slik at 315 00:12:45,600 --> 00:12:47,570 å snakke, kjent som student? 316 00:12:47,570 --> 00:12:50,220 C kom ikke med innebygd funksjonalitet for studenter, 317 00:12:50,220 --> 00:12:52,260 men hva hvis jeg ønsket å gi det slik? 318 00:12:52,260 --> 00:12:55,640 >> Vel, det viser seg, kommer jeg til å åpne en fil som heter structs.h her, 319 00:12:55,640 --> 00:12:57,090 og du kan gjøre akkurat det. 320 00:12:57,090 --> 00:12:58,290 Og vi kommer til å begynne å gjøre dette nå. 321 00:12:58,290 --> 00:13:01,490 Og under panseret på P sette tre, du allerede har gjort dette nå. 322 00:13:01,490 --> 00:13:05,920 Det er ikke noe slikt som en g rect eller en g oval i programmeringsspråket C. 323 00:13:05,920 --> 00:13:10,570 >> Folk på Stanford implementert de datatyper ved hjelp av denne tilnærmingen her, 324 00:13:10,570 --> 00:13:13,900 erklære sin egen nye data typer som bruker et nytt søkeord 325 00:13:13,900 --> 00:13:16,744 heter struct og en annen en som heter typedef. 326 00:13:16,744 --> 00:13:19,660 Og ja, selv om syntaksen ser litt forskjellig fra ting 327 00:13:19,660 --> 00:13:23,550 vi har sett før, i prinsipp, det er super enkelt. 328 00:13:23,550 --> 00:13:25,297 >> Dette betyr bare "definere en type." 329 00:13:25,297 --> 00:13:27,255 Det kommer til å bli en struktur, og en struktur 330 00:13:27,255 --> 00:13:29,400 er akkurat som en container for flere ting. 331 00:13:29,400 --> 00:13:31,780 Og at strukturen kommer å ha en streng kalt navn, 332 00:13:31,780 --> 00:13:33,210 og en streng kalte huset. 333 00:13:33,210 --> 00:13:37,520 Og la oss kalle, bare for enkelhets skyld, hele denne datastruktur student. 334 00:13:37,520 --> 00:13:40,320 >> Så det øyeblikket du kommer til semikolon, har du nå 335 00:13:40,320 --> 00:13:43,280 opprettet din egen data type kalt student 336 00:13:43,280 --> 00:13:46,420 som nå står sammen med int, og flyte, og røye, og streng, 337 00:13:46,420 --> 00:13:50,270 og g rect, og g oval, og en rekke av andre ting folk har oppfunnet. 338 00:13:50,270 --> 00:13:53,340 >> Så hva er nyttig om dette nå er at hvis jeg går tilbake 339 00:13:53,340 --> 00:13:57,430 å konstruere 0 og ferdig med dette gjennomføring, som jeg skrev 340 00:13:57,430 --> 00:14:02,080 på forhånd her, legg merke til at alle av den uunngåelige messi at 341 00:14:02,080 --> 00:14:05,490 var i ferd med å starte skjer som jeg har lagt telefonnumre og Twitters og alle 342 00:14:05,490 --> 00:14:07,370 disse andre tingene til en student definisjon, 343 00:14:07,370 --> 00:14:11,810 nå er det konsist pakket opp som bare en rekke studenter. 344 00:14:11,810 --> 00:14:15,500 >> Og hver av disse studentene nå har flere ting inne i den. 345 00:14:15,500 --> 00:14:16,930 Slik at bare etterlater ett spørsmål. 346 00:14:16,930 --> 00:14:19,700 Hvordan får du på navnet, og huset, og ID, 347 00:14:19,700 --> 00:14:21,640 og det som ellers er innsiden av student? 348 00:14:21,640 --> 00:14:22,930 Super enkelt, også. 349 00:14:22,930 --> 00:14:25,730 Nye syntaksen, men en enkel idé. 350 00:14:25,730 --> 00:14:29,239 >> Du bare indeksen inn i array, som vi gjorde i forrige uke og denne. 351 00:14:29,239 --> 00:14:31,030 Og hva er klart nytt stykke av syntaks? 352 00:14:31,030 --> 00:14:32,590 353 00:14:32,590 --> 00:14:35,880 Just., Som betyr "gå på innsiden av struktur og få felt som heter 354 00:14:35,880 --> 00:14:39,030 navn, få felt kalt huset, få felt kalt student. " 355 00:14:39,030 --> 00:14:41,940 >> Så i P sette tre, hvis du er jobber fortsatt med det, 356 00:14:41,940 --> 00:14:44,020 og de fleste folk fortsatt er, innser at når du 357 00:14:44,020 --> 00:14:46,130 begynne å bruke ting som g rects og g ovaler 358 00:14:46,130 --> 00:14:50,201 og andre ting som ikke synes å kommer fra Uke null, ett eller to, 359 00:14:50,201 --> 00:14:52,950 skjønner at det er fordi Stanford erklærte noen nye datatyper. 360 00:14:52,950 --> 00:14:56,160 >> Og ja, det er akkurat hva vi vil gjøre, også, i P Set Fire, når 361 00:14:56,160 --> 00:14:59,880 vi begynner å forholde seg til ting som bilder, bitmaps og mer. 362 00:14:59,880 --> 00:15:02,882 Så det er bare en teaser og en mental modell for hva som skal komme. 363 00:15:02,882 --> 00:15:04,590 Nå, utsatte jeg litt i morges. 364 00:15:04,590 --> 00:15:09,560 Jeg var litt spent på å se hva Microsoft tapet faktisk 365 00:15:09,560 --> 00:15:10,310 ser ut i dag. 366 00:15:10,310 --> 00:15:15,200 Og det viser seg noen i 2006 faktisk gikk til nesten nøyaktig 367 00:15:15,200 --> 00:15:19,210 samme sted for å fotografere i virkeligheten det ser ut som at disse dager. 368 00:15:19,210 --> 00:15:21,380 Feltet er nå litt overgrodd. 369 00:15:21,380 --> 00:15:24,850 >> Så snakker nå om bilder la oss få tilbake Daven her 370 00:15:24,850 --> 00:15:26,890 på skjermen og Nicholas, og bare minne deg 371 00:15:26,890 --> 00:15:30,540 at hvis du ønsker å bli med oss ​​til lunsj denne fredagen, leder til vår vanlige URL 372 00:15:30,540 --> 00:15:31,440 her. 373 00:15:31,440 --> 00:15:33,530 >> Så der fikk vi la ut på mandag? 374 00:15:33,530 --> 00:15:35,140 Vi introduserte dette problemet, ikke sant? 375 00:15:35,140 --> 00:15:37,610 Dette var tilsynelatende en korrekt gjennomføring av swap, 376 00:15:37,610 --> 00:15:40,460 der du tar to ints, en som heter en, en som heter b, 377 00:15:40,460 --> 00:15:44,130 bytte dem, akkurat som Laura gjorde her på scenen med melk og vann, 378 00:15:44,130 --> 00:15:46,820 ved hjelp av en midlertidig variabel, eller en tom kopp, 379 00:15:46,820 --> 00:15:50,540 slik at vi kunne sette bi en og en i b uten å gjøre et rot av ting. 380 00:15:50,540 --> 00:15:51,560 Vi brukte en variabel. 381 00:15:51,560 --> 00:15:52,870 Det kalles temp. 382 00:15:52,870 --> 00:15:55,520 >> Men hva som var den grunnleggende Problemet med denne koden på mandag? 383 00:15:55,520 --> 00:15:57,700 384 00:15:57,700 --> 00:15:58,870 Hva var problemet her? 385 00:15:58,870 --> 00:16:00,106 386 00:16:00,106 --> 00:16:00,605 Yeah. 387 00:16:00,605 --> 00:16:01,970 >> PUBLIKUM: Det tar opp mer plass. 388 00:16:01,970 --> 00:16:04,719 >> DAVID J. MALAN: Tar opp mer plass, fordi jeg bruker en variabel, 389 00:16:04,719 --> 00:16:05,400 og det er OK. 390 00:16:05,400 --> 00:16:07,300 Det er sant, men jeg er kommer til å si det er OK. 391 00:16:07,300 --> 00:16:10,030 Det er bare 32 biter i grand ordningen med ting, så ikke en stor avtale. 392 00:16:10,030 --> 00:16:10,655 Andre tanker? 393 00:16:10,655 --> 00:16:12,572 PUBLIKUM: Den bytter bare variablene lokalt. 394 00:16:12,572 --> 00:16:13,571 DAVID J. MALAN: Nettopp. 395 00:16:13,571 --> 00:16:15,090 Den bytter bare variablene lokalt. 396 00:16:15,090 --> 00:16:18,173 Fordi hver gang du kaller en function-- da jeg hadde skuffene fra Annenberg 397 00:16:18,173 --> 00:16:19,840 siste gang, har du hoved på bunnen. 398 00:16:19,840 --> 00:16:23,560 Så snart du kaller en funksjon som heter swap, betyr swap ikke få x og y, 399 00:16:23,560 --> 00:16:24,400 de opprinnelige verdiene. 400 00:16:24,400 --> 00:16:26,392 Hva gjør swap get, vi hevder? 401 00:16:26,392 --> 00:16:27,100 Målgruppe: kopier. 402 00:16:27,100 --> 00:16:28,090 DAVID J. MALAN: Så kopier av dem. 403 00:16:28,090 --> 00:16:31,120 Så det blir en og to, hvis du husker eksempelet fra forrige gang, 404 00:16:31,120 --> 00:16:34,730 men en kopi av en og to som er vellykket byttet. 405 00:16:34,730 --> 00:16:38,550 Men dessverre til slutt, disse verdier er fremdeles det samme. 406 00:16:38,550 --> 00:16:41,880 Så vi kan se dette med vår ny venn, forhåpentligvis GDB, 407 00:16:41,880 --> 00:16:45,180 at du eller TFS og Ca-er har blitt veilede deg mot som følger. 408 00:16:45,180 --> 00:16:51,210 >> Så ingen swap tilbakekalling ser like-- la oss åpne opp dette-- ser slik ut. 409 00:16:51,210 --> 00:16:54,160 Vi initialisert til en x, y til to. 410 00:16:54,160 --> 00:16:55,620 Hadde en haug med print f-tallet. 411 00:16:55,620 --> 00:16:58,080 Men så, på ringetasten her var å bytte, som 412 00:16:58,080 --> 00:17:00,260 er nøyaktig den koden vi nettopp så et øyeblikk siden. 413 00:17:00,260 --> 00:17:03,180 Som er riktig ved første øyekast, men funksjonelt, 414 00:17:03,180 --> 00:17:06,800 dette programmet ikke fungerer, fordi det gjør ikke permanent bytte x og y. 415 00:17:06,800 --> 00:17:10,190 >> Så la oss se dette, en rask varm opp her med GDB, et ./noswap. 416 00:17:10,190 --> 00:17:11,867 417 00:17:11,867 --> 00:17:15,200 En haug med overveldende informasjon som Jeg skal bli kvitt med kontroll L for nå. 418 00:17:15,200 --> 00:17:17,516 Og nå, jeg kommer til å gå videre og kjøre den. 419 00:17:17,516 --> 00:17:19,349 Og dessverre, at var ikke så nyttig. 420 00:17:19,349 --> 00:17:22,355 Det sprang i programmet innsiden av denne program kalt GDB, en debugger, 421 00:17:22,355 --> 00:17:23,730 men det gjorde ikke la meg rote rundt. 422 00:17:23,730 --> 00:17:26,229 >> Så hvordan kan jeg faktisk pause kjøring inne dette programmet? 423 00:17:26,229 --> 00:17:27,410 424 00:17:27,410 --> 00:17:28,329 Så bryte. 425 00:17:28,329 --> 00:17:32,340 Og jeg kunne bryte på noen linjenummer, en, 10, 15. 426 00:17:32,340 --> 00:17:35,530 Men jeg kan også bryte symbolsk ved å si pause hoved. 427 00:17:35,530 --> 00:17:38,980 Og det kommer til å sette en pause punkt, tilsynelatende på linje 16 i hoved. 428 00:17:38,980 --> 00:17:40,050 Og hvor er linje 16? 429 00:17:40,050 --> 00:17:42,960 La oss gå opp til koden og gå opp til noswap. 430 00:17:42,960 --> 00:17:46,930 Og ja, er linje 16 den Aller først i programmet. 431 00:17:46,930 --> 00:17:52,130 >> Så nå, hvis jeg går videre og type kjøre denne gangen, Enter, det stanset. 432 00:17:52,130 --> 00:17:53,080 Så la oss rote rundt. 433 00:17:53,080 --> 00:17:55,716 Skriv ut x-- hvorfor er x null? 434 00:17:55,716 --> 00:17:56,705 435 00:17:56,705 --> 00:17:57,830 Og ignorere dollartegn. 436 00:17:57,830 --> 00:17:59,725 Det er bare for avansert bruk av programmet. 437 00:17:59,725 --> 00:18:00,780 438 00:18:00,780 --> 00:18:03,140 Hvorfor er x null i øyeblikket? 439 00:18:03,140 --> 00:18:03,640 Yeah. 440 00:18:03,640 --> 00:18:07,061 >> PUBLIKUM: Det pauset rett før linje 16, faktisk ikke på linje 16. 441 00:18:07,061 --> 00:18:08,060 DAVID J. MALAN: Nettopp. 442 00:18:08,060 --> 00:18:11,630 GDB, som standard, har satt på pause kjøring like før linje 16. 443 00:18:11,630 --> 00:18:14,820 Derfor har det ikke utført, som betyr x er av noen ukjent verdi. 444 00:18:14,820 --> 00:18:17,150 Og vi hadde flaks at det er noe rent som null. 445 00:18:17,150 --> 00:18:20,310 Så nå hvis jeg skriver neste, nå er det utført 16. 446 00:18:20,310 --> 00:18:22,000 Den venter for meg å utføre 17. 447 00:18:22,000 --> 00:18:23,400 La meg gå videre og print x. 448 00:18:23,400 --> 00:18:24,094 Det er en. 449 00:18:24,094 --> 00:18:25,260 La meg gå videre og print y. 450 00:18:25,260 --> 00:18:26,176 Hva bør jeg se nå? 451 00:18:26,176 --> 00:18:27,660 452 00:18:27,660 --> 00:18:28,560 >> PUBLIKUM: [uhørbart] 453 00:18:28,560 --> 00:18:29,165 >> DAVID J. MALAN: En litt høyere. 454 00:18:29,165 --> 00:18:30,040 >> PUBLIKUM: [uhørbart] 455 00:18:30,040 --> 00:18:30,537 456 00:18:30,537 --> 00:18:32,120 DAVID J. MALAN: Ikke helt en konsensus. 457 00:18:32,120 --> 00:18:34,760 Så ja, vi ser noen søppel verdi. 458 00:18:34,760 --> 00:18:37,862 Nå er y 134514064 der. 459 00:18:37,862 --> 00:18:39,320 Vel, det er bare noen søppel verdi. 460 00:18:39,320 --> 00:18:41,350 Min programmet bruker RAM for ulike formål. 461 00:18:41,350 --> 00:18:42,350 Det er andre funksjoner. 462 00:18:42,350 --> 00:18:44,040 Andre mennesker skrev inni datamaskinen min. 463 00:18:44,040 --> 00:18:46,789 Så de bitene har blitt brukt for andre verdier, og det jeg ser 464 00:18:46,789 --> 00:18:49,470 er restene av noen før bruken av dette minnet. 465 00:18:49,470 --> 00:18:53,350 >> Så ingen big deal, fordi så snart mens jeg skriver neste og deretter skrive y, 466 00:18:53,350 --> 00:18:55,640 det er initialisert til verdien som jeg vil. 467 00:18:55,640 --> 00:18:57,400 Så nå, la oss gå videre litt raskere. 468 00:18:57,400 --> 00:18:58,540 N for neste. 469 00:18:58,540 --> 00:18:59,570 La oss gjøre det igjen. 470 00:18:59,570 --> 00:19:00,530 La oss gjøre det igjen. 471 00:19:00,530 --> 00:19:02,404 Men jeg ønsker ikke å treffe det her, fordi hvis jeg 472 00:19:02,404 --> 00:19:05,110 ønsker å se hva som skjer på innsiden swap, hva er kommandoen? 473 00:19:05,110 --> 00:19:05,520 >> PUBLIKUM: trinn. 474 00:19:05,520 --> 00:19:06,436 >> DAVID J. MALAN: trinn. 475 00:19:06,436 --> 00:19:09,800 Så dette trinn meg inn i en funksjon, i stedet for over den. 476 00:19:09,800 --> 00:19:12,270 Og nå, er det litt kryptisk ærlig, men dette er bare 477 00:19:12,270 --> 00:19:14,581 forteller meg at jeg er på linje 33 nå. 478 00:19:14,581 --> 00:19:15,580 Og la oss gjøre dette igjen. 479 00:19:15,580 --> 00:19:16,080 Skriv ut temp. 480 00:19:16,080 --> 00:19:17,129 481 00:19:17,129 --> 00:19:20,170 Søppel verdi, negative denne periode men det er bare fortsatt en søppel verdi. 482 00:19:20,170 --> 00:19:22,810 Så la oss gjøre neste, print temp. 483 00:19:22,810 --> 00:19:27,130 Det er initialisert til 1, som var verdien av x, aka en. 484 00:19:27,130 --> 00:19:29,110 >> Nå, hvor er vår en og X kommer fra? 485 00:19:29,110 --> 00:19:32,510 Vel, varsel main, vi kalt disse verdiene x og y. 486 00:19:32,510 --> 00:19:34,740 Vi passerte dem til å bytte som følger. 487 00:19:34,740 --> 00:19:37,010 X kom først, komma y. 488 00:19:37,010 --> 00:19:40,020 Og så, kan swap kalle dem x og y. 489 00:19:40,020 --> 00:19:42,630 Men for klarhet, er det ringer dem a og b. 490 00:19:42,630 --> 00:19:45,970 Men a og b skal nå være kopier av x og y, henholdsvis. 491 00:19:45,970 --> 00:19:50,660 >> Så hvis jeg går tilbake til GDB, temp er nå en og en er nå ett. 492 00:19:50,660 --> 00:19:56,130 Men hvis jeg gjør neste, og nå gjør print en, har en allerede flyttet over. 493 00:19:56,130 --> 00:20:00,030 Melken ble helt over i den tidligere appelsinjuice er glass, eller vice versa. 494 00:20:00,030 --> 00:20:04,750 >> Og hvis jeg gjør det neste gang, og nå hvis jeg skriver ut som en mental helse sjekk, 495 00:20:04,750 --> 00:20:07,687 et er fortsatt to, men b er nå ett. 496 00:20:07,687 --> 00:20:08,770 Ærlig talt, det er fortsatt der. 497 00:20:08,770 --> 00:20:10,670 Jeg bryr meg ikke hva temp er. 498 00:20:10,670 --> 00:20:16,850 Men så snart jeg nå skriver, la oss si, fortsette å gå tilbake, nå er jeg på slutten 499 00:20:16,850 --> 00:20:17,480 programmet. 500 00:20:17,480 --> 00:20:20,730 Og dessverre, er x fremdeles en og y er fremdeles to. 501 00:20:20,730 --> 00:20:22,272 >> Så hva var nytten av GDB det? 502 00:20:22,272 --> 00:20:23,980 Det hjalp ikke meg fikse problemet per se, 503 00:20:23,980 --> 00:20:26,265 men det forhåpentligvis hjelpe meg forstå det ved å realisere 504 00:20:26,265 --> 00:20:30,000 at ja, er min logikk rett, men koden min er ikke slutt å ha 505 00:20:30,000 --> 00:20:31,450 en permanent virkning. 506 00:20:31,450 --> 00:20:34,570 Så det er et problem vi er skal nå løse i dag. 507 00:20:34,570 --> 00:20:37,870 >> Men la oss komme dit ved hjelp av dette. 508 00:20:37,870 --> 00:20:39,230 String er en løgn. 509 00:20:39,230 --> 00:20:41,860 Det også, ikke en datatype som eksisterer i C. Det er 510 00:20:41,860 --> 00:20:44,750 vært et synonym for noen tid til noe annet, 511 00:20:44,750 --> 00:20:47,300 og vi kan avsløre at som følger. 512 00:20:47,300 --> 00:20:53,282 >> La meg gå videre og åpne opp et program som kalles sammenlign-0. 513 00:20:53,282 --> 00:20:56,240 Og i stedet for å skrive dette ut, vi vil begynne å gå gjennom koden 514 00:20:56,240 --> 00:20:58,040 Jeg skrev allerede, men det er bare noen få linjer. 515 00:20:58,040 --> 00:20:59,570 Så dette er sammenlign-0. 516 00:20:59,570 --> 00:21:02,380 Og det første jeg gjør er å få en tekstlinje. 517 00:21:02,380 --> 00:21:05,610 >> Men legg merke til hva jeg er gjør for første gang. 518 00:21:05,610 --> 00:21:07,910 Hva er annerledes tydelig om linje 21? 519 00:21:07,910 --> 00:21:10,020 520 00:21:10,020 --> 00:21:11,402 Egentlig, vent litt. 521 00:21:11,402 --> 00:21:12,110 Dette er kopi to. 522 00:21:12,110 --> 00:21:13,568 Det er ikke en gang den riktige program. 523 00:21:13,568 --> 00:21:14,780 Greit, spoiler alert. 524 00:21:14,780 --> 00:21:16,890 Greit, så never mind det. 525 00:21:16,890 --> 00:21:18,520 Det er svaret på et fremtidig spørsmål. 526 00:21:18,520 --> 00:21:21,450 >> Her er sammenlign-0, og jeg er om å få en tekstlinje. 527 00:21:21,450 --> 00:21:22,435 Program er mye enklere. 528 00:21:22,435 --> 00:21:23,560 Så dette er grei. 529 00:21:23,560 --> 00:21:28,070 Dette er som Week One, uke to ting i øyeblikket. string s = GetString. 530 00:21:28,070 --> 00:21:29,700 Nå sier jeg det igjen her nede. 531 00:21:29,700 --> 00:21:31,830 string t = GetString. 532 00:21:31,830 --> 00:21:35,300 Og så, den siste tingen i dette program, som navnet antyder, 533 00:21:35,300 --> 00:21:37,090 er jeg kommer til å prøve å sammenligne dem. 534 00:21:37,090 --> 00:21:40,709 >> Så hvis s, den første strengen, tilsvarer = t, da er jeg 535 00:21:40,709 --> 00:21:42,250 kommer til å si at du skriver det samme. 536 00:21:42,250 --> 00:21:44,291 Else, kommer jeg til å si du skriver forskjellige ting. 537 00:21:44,291 --> 00:21:45,880 Så la oss kompilere og kjøre dette programmet. 538 00:21:45,880 --> 00:21:48,481 Så gjør sammenligne null. 539 00:21:48,481 --> 00:21:48,980 Ser bra ut. 540 00:21:48,980 --> 00:21:50,490 Ingen kompileringsfeil. 541 00:21:50,490 --> 00:21:52,386 >> La meg gå videre nå og skriv ./compare-0. 542 00:21:52,386 --> 00:21:55,230 543 00:21:55,230 --> 00:21:59,220 La meg gå videre og si noe : Daven og noe: Rob. 544 00:21:59,220 --> 00:22:00,450 Og jeg skriver forskjellige ting. 545 00:22:00,450 --> 00:22:01,250 Så langt, så bra. 546 00:22:01,250 --> 00:22:02,680 Programmet ser ut til å være korrekt. 547 00:22:02,680 --> 00:22:03,880 >> Men la oss kjøre den på nytt. 548 00:22:03,880 --> 00:22:05,800 Si noe: Gabe. 549 00:22:05,800 --> 00:22:07,140 Si noe: Gabe. 550 00:22:07,140 --> 00:22:08,520 551 00:22:08,520 --> 00:22:09,020 Greit. 552 00:22:09,020 --> 00:22:10,851 Kanskje jeg treffer mellomromstasten eller noe funky. 553 00:22:10,851 --> 00:22:11,600 La oss gjøre det igjen. 554 00:22:11,600 --> 00:22:13,020 Så 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 Forskjellige ting. 559 00:22:17,330 --> 00:22:19,430 Så hva er det som skjer? 560 00:22:19,430 --> 00:22:23,200 >> Så vi har disse to linjer med kode, GetString å bli kalt to ganger. 561 00:22:23,200 --> 00:22:25,760 Og så er jeg rett og slett prøver å sammenligne s og t. 562 00:22:25,760 --> 00:22:28,370 Men det som virkelig da er det som skjer? 563 00:22:28,370 --> 00:22:31,180 Vel, min håndskrift er i ferd med å slakter dette eksempelet noe. 564 00:22:31,180 --> 00:22:34,630 Og la oss faktisk kaste Dette opp over her, så vel. 565 00:22:34,630 --> 00:22:37,390 566 00:22:37,390 --> 00:22:45,712 >> Så vi har en linje som string s = GetString. 567 00:22:45,712 --> 00:22:48,295 Så det er bare den første interessant linje fra det programmet. 568 00:22:48,295 --> 00:22:49,920 569 00:22:49,920 --> 00:22:52,974 Men hva hele denne tiden har vært skjer under panseret? 570 00:22:52,974 --> 00:22:55,890 Vel, på venstre side er streng, som er en form for variabel, 571 00:22:55,890 --> 00:22:56,785 og det heter s. 572 00:22:56,785 --> 00:23:00,019 Så jeg vet at dette er å bruke minnet, eller RAM, i min datamaskin eller annen måte. 573 00:23:00,019 --> 00:23:02,060 Så jeg kommer til abstrakt tegne det som en firkant. 574 00:23:02,060 --> 00:23:04,820 32 bits, det viser seg, men mer om det i fremtiden. 575 00:23:04,820 --> 00:23:06,410 Og da, hva er det som skjer her borte? 576 00:23:06,410 --> 00:23:08,700 >> Vel, GetString åpenbart får en streng fra brukeren. 577 00:23:08,700 --> 00:23:11,360 Og GetString fikk Zamyla eller Gabe eller Daven. 578 00:23:11,360 --> 00:23:14,640 Så la oss velge den første av disse, som var Daven. 579 00:23:14,640 --> 00:23:19,174 Så effektivt, hva GetString fikk meg i det første tilfelle var D-a-v-e-n. 580 00:23:19,174 --> 00:23:22,690 581 00:23:22,690 --> 00:23:25,045 Og så, hva annet gjorde det gir meg i hemmelighet? 582 00:23:25,045 --> 00:23:25,920 PUBLIKUM: [uhørbart] 583 00:23:25,920 --> 00:23:28,720 DAVID J. MALAN: Yeah, den / 0 eller null karakter. 584 00:23:28,720 --> 00:23:30,550 Så det effektivt ga meg en streng. 585 00:23:30,550 --> 00:23:34,550 Men vi allerede vet fra tidligere ser at en streng er bare en matrise 586 00:23:34,550 --> 00:23:37,895 tegn, og det er oppsagt av denne spesielle sentinel karakter, / 0. 587 00:23:37,895 --> 00:23:39,220 588 00:23:39,220 --> 00:23:42,310 >> Men hvis dette er sant og dette er en firkant, 589 00:23:42,310 --> 00:23:44,160 dette er helt klart en mye større rektangel. 590 00:23:44,160 --> 00:23:46,830 Og ja, dette er, Jeg hevder, bare 32 bits. 591 00:23:46,830 --> 00:23:49,500 Og dette er helt klart mer enn 32 biter, fordi dette er trolig 592 00:23:49,500 --> 00:23:51,583 åtte pluss åtte pluss åtte pluss åtte pluss åtte, 593 00:23:51,583 --> 00:23:53,320 nettopp på grunn av byte i ASCII. 594 00:23:53,320 --> 00:23:57,030 Hvordan pokker skal vi passe Daven inn i denne lille boksen her? 595 00:23:57,030 --> 00:23:59,880 >> Vel, hva er GetString faktisk gjør? 596 00:23:59,880 --> 00:24:03,680 Vel, her representerer dette rutenettet min datamaskinens minne eller RAM. 597 00:24:03,680 --> 00:24:07,564 Så la oss vilkårlig si at hvis hver av disse representerer en byte, 598 00:24:07,564 --> 00:24:09,730 så kan vi tenke på hver byte som å ha en adresse, 599 00:24:09,730 --> 00:24:13,830 som 33 Oxford Street, eller 34 Oxford Street, eller 35 Oxford Street. 600 00:24:13,830 --> 00:24:16,700 >> Så akkurat som boliger har adresser og bygninger har adresser, 601 00:24:16,700 --> 00:24:19,810 så gjør individuelle byte av minne har adresser eller tall 602 00:24:19,810 --> 00:24:21,042 som unikt identifiserer disse. 603 00:24:21,042 --> 00:24:22,000 Nå er dette vilkårlig. 604 00:24:22,000 --> 00:24:25,370 Men for å holde det enkelt, jeg kommer til å bruke heksadesimale bare ved konvensjonen, 605 00:24:25,370 --> 00:24:28,200 men 0x betyr ingenting annet enn "dette er heksadesimal." 606 00:24:28,200 --> 00:24:31,030 og jeg kommer til å hevde at "D" ender opp på Byte One i minnet. 607 00:24:31,030 --> 00:24:34,210 >> Jeg har ingenting annet som skjer i minne, så Daven fikk det første stedet 608 00:24:34,210 --> 00:24:35,509 på Byte One. 609 00:24:35,509 --> 00:24:36,800 Dette, da, kommer til å være 0x2. 610 00:24:36,800 --> 00:24:37,831 611 00:24:37,831 --> 00:24:38,705 Dette kommer til 0x3. 612 00:24:38,705 --> 00:24:39,840 613 00:24:39,840 --> 00:24:41,800 Dette kommer til å være 0x4. 614 00:24:41,800 --> 00:24:43,025 Dette kommer til 0x5. 615 00:24:43,025 --> 00:24:44,025 Dette kommer til å være 0x6. 616 00:24:44,025 --> 00:24:45,560 617 00:24:45,560 --> 00:24:48,290 >> Men når du begynner å tenke om hva maskinen er dette gjort 618 00:24:48,290 --> 00:24:50,710 under panseret, du kan begynne å antyde 619 00:24:50,710 --> 00:24:54,960 hvordan du, for noen år siden, ville har implementert C selv. 620 00:24:54,960 --> 00:24:58,360 Hva er GetString trolig returning-- fordi det 621 00:24:58,360 --> 00:25:00,946 føles som det ikke er retur Daven, per se, 622 00:25:00,946 --> 00:25:03,320 fordi han sikkert ikke kommer å passe på denne lille box-- 623 00:25:03,320 --> 00:25:05,090 så hva er GetString trolig tilbake? 624 00:25:05,090 --> 00:25:07,958 625 00:25:07,958 --> 00:25:08,920 >> PUBLIKUM: [uhørbart] 626 00:25:08,920 --> 00:25:10,540 >> DAVID J. MALAN: Plasseringen av Daven. 627 00:25:10,540 --> 00:25:12,770 Og det har gjort dette helt siden uke One. 628 00:25:12,770 --> 00:25:16,150 Hva GetString er virkelig retur ikke er en streng, per se. 629 00:25:16,150 --> 00:25:17,780 Det er en av de små hvite løgner. 630 00:25:17,780 --> 00:25:22,520 Det returnerer adressen til string i minnet, den unike adressen. 631 00:25:22,520 --> 00:25:24,820 Daven bor ved 33 Oxford Street. 632 00:25:24,820 --> 00:25:29,310 Men mer konsist, Gavin lever på 0x1, Adresse Number One. 633 00:25:29,310 --> 00:25:32,280 >> Så hva blir satt i denne lille boksen da, for å være klar, 634 00:25:32,280 --> 00:25:35,930 er bare adressen til denne strengen. 635 00:25:35,930 --> 00:25:38,110 Så hele denne tiden, denne har pågått. 636 00:25:38,110 --> 00:25:41,650 Men hva dette antyder nå er at hvis alle s har 637 00:25:41,650 --> 00:25:44,710 er et tall på innsiden av det som finnes i å stoppe deg, programmerer, 638 00:25:44,710 --> 00:25:47,970 fra å sette et tall i eventuell variabel og bare hoppe 639 00:25:47,970 --> 00:25:49,080 til at mengde minne? 640 00:25:49,080 --> 00:25:51,320 Og ja, vi får se det er en trussel neste gang. 641 00:25:51,320 --> 00:25:53,500 >> Men for nå, føles dette utilstrekkelig. 642 00:25:53,500 --> 00:25:55,630 Hvis jeg sier, få meg en streng, gir du meg Daven. 643 00:25:55,630 --> 00:25:57,230 Men du trenger ikke egentlig gi meg Daven. 644 00:25:57,230 --> 00:25:59,310 Alt du gi meg er Daven adresse. 645 00:25:59,310 --> 00:26:04,310 Hvordan kan jeg da vite sikkert hvor Daven begynner og ends-- 646 00:26:04,310 --> 00:26:07,140 historien begynner å bli weird-- hvor Daven begynner og slutter, 647 00:26:07,140 --> 00:26:10,435 og deretter, i det neste strengen i minnet starter? 648 00:26:10,435 --> 00:26:11,520 649 00:26:11,520 --> 00:26:13,620 >> Vel, hvis du overlate meg i begynnelsen av Daven, 650 00:26:13,620 --> 00:26:17,230 hovedsak, hvordan vet jeg der på slutten av navnet hans er? 651 00:26:17,230 --> 00:26:20,550 Den spesielle null karakter, som er desto viktigere nå 652 00:26:20,550 --> 00:26:23,040 hvis strenger under den panseret er bare identifisert 653 00:26:23,040 --> 00:26:25,820 entydig med deres plassering i minnet. 654 00:26:25,820 --> 00:26:28,130 Så hele denne tiden, det er hva som har skjedd. 655 00:26:28,130 --> 00:26:32,470 >> Så når vi ser nå på koden her, forklarer 656 00:26:32,470 --> 00:26:35,790 hvis du ville feilen i linje 26. 657 00:26:35,790 --> 00:26:39,560 Hvorfor er Zamyla og Zamyla annerledes? 658 00:26:39,560 --> 00:26:41,330 Hvorfor er Gabe og Gabe annerledes? 659 00:26:41,330 --> 00:26:42,154 Ja, i ryggen. 660 00:26:42,154 --> 00:26:43,390 >> PUBLIKUM: De har forskjellige adresser. 661 00:26:43,390 --> 00:26:45,931 >> DAVID J. MALAN: Rett og slett fordi de har forskjellige adresser. 662 00:26:45,931 --> 00:26:48,820 Fordi når du ringer GetString igjen, som jeg skal gjøre raskt her, 663 00:26:48,820 --> 00:26:52,870 hvis dette er den andre linjen, streng t, som jeg gjorde i det programmet, 664 00:26:52,870 --> 00:26:55,030 lik en annen samtale til GetString. 665 00:26:55,030 --> 00:26:56,370 666 00:26:56,370 --> 00:26:58,670 Neste gang jeg kaller GetString, jeg kommer 667 00:26:58,670 --> 00:27:00,190 å få en annen del av minnet. 668 00:27:00,190 --> 00:27:02,220 >> GetString er tillatt å spørre drifts 669 00:27:02,220 --> 00:27:03,800 system for mer og mer minne. 670 00:27:03,800 --> 00:27:07,894 Det kommer ikke til å gjenbruke samme seks bytes hver eneste gang. 671 00:27:07,894 --> 00:27:09,810 Det kommer til å få en ny blings av minne, som 672 00:27:09,810 --> 00:27:12,780 betyr t kommer til å få en annen verdi over her. 673 00:27:12,780 --> 00:27:15,380 >> Så når jeg gjør s lik = t, du er ikke sammenligne 674 00:27:15,380 --> 00:27:17,880 D mot dette og en mot dette og V mot dette. 675 00:27:17,880 --> 00:27:19,588 Du sammenligner dette mot dette, som 676 00:27:19,588 --> 00:27:24,020 ærlig er ganske useful-- useless-- er ganske ubrukelig, fordi som virkelig 677 00:27:24,020 --> 00:27:25,830 bryr seg der strengene er i minnet? 678 00:27:25,830 --> 00:27:26,850 >> Og ja, det har vi ikke. 679 00:27:26,850 --> 00:27:28,980 Og vi kommer til å starte særlig omsorg. 680 00:27:28,980 --> 00:27:34,180 Bare i den grad at feil kan oppstå og sikkerhetstrusler kan oppstå vilje 681 00:27:34,180 --> 00:27:36,100 vi faktisk begynne å bry seg om dette. 682 00:27:36,100 --> 00:27:37,230 Så la oss løse dette problemet. 683 00:27:37,230 --> 00:27:39,650 Slår ut, du fikse det super enkelt. 684 00:27:39,650 --> 00:27:42,600 >> Og la oss faktisk, før jeg avslører at igjen, hva ville 685 00:27:42,600 --> 00:27:47,170 du gjør hvis du er i en CS50 klasse, og du måtte implementere 686 00:27:47,170 --> 00:27:48,600 en sammenligning mot to strenger. 687 00:27:48,600 --> 00:27:51,440 Du kan tydelig ikke bare bruke s tilsvarer = t. 688 00:27:51,440 --> 00:27:54,090 Men bare logisk, hvordan vil du sammenligne denne strengen 689 00:27:54,090 --> 00:27:56,370 mot denne strengen ved hjelp av C-kode? 690 00:27:56,370 --> 00:27:56,880 Yeah. 691 00:27:56,880 --> 00:27:58,780 >> PUBLIKUM: Bare gjør det for loop [uhørbart] 692 00:27:58,780 --> 00:28:00,670 693 00:28:00,670 --> 00:28:01,670 DAVID J. MALAN: Perfect. 694 00:28:01,670 --> 00:28:02,900 PUBLIKUM: [uhørbart] 695 00:28:02,900 --> 00:28:03,310 DAVID J. MALAN: Yeah. 696 00:28:03,310 --> 00:28:05,390 Bare bruk en for løkke eller en mens loop eller hva. 697 00:28:05,390 --> 00:28:08,710 Men bare gjelder den grunnleggende ideen om at hvis dette er en del av minnet eller en matrise 698 00:28:08,710 --> 00:28:11,590 og dette er, iterere over begge samtidig. 699 00:28:11,590 --> 00:28:12,960 Og bare sammenligne bokstaver. 700 00:28:12,960 --> 00:28:14,260 >> Og du har til å være en litt forsiktig, fordi du 701 00:28:14,260 --> 00:28:16,247 ønsker ikke en finger å gå forbi den andre 702 00:28:16,247 --> 00:28:18,080 fordi en streng er lengre enn den andre. 703 00:28:18,080 --> 00:28:21,380 Så du kommer til å ønske å se etter denne spesielle verdi ved utgangen, null. 704 00:28:21,380 --> 00:28:24,017 Men det virkelig er, i den slutten, så enkelt er det. 705 00:28:24,017 --> 00:28:26,100 Og ærlig talt, trenger vi ikke å gjenoppfinne hjulet. 706 00:28:26,100 --> 00:28:27,960 Her er versjon to. 707 00:28:27,960 --> 00:28:32,910 Og hva jeg skal si her er at stedet for å sammenligne s tilsvarer = t, 708 00:28:32,910 --> 00:28:38,964 Jeg i stedet kommer til å si, hvis strengen sammenligning av s komma t lik = 0. 709 00:28:38,964 --> 00:28:40,130 Nå, hva er streng sammenligne? 710 00:28:40,130 --> 00:28:43,046 >> Det viser seg, det er en funksjon som kommer med C, hvis formål i livet 711 00:28:43,046 --> 00:28:44,650 er å sammenligne to strenger. 712 00:28:44,650 --> 00:28:48,300 Og rør sammenligne, hvis vi leser sin man-side eller dokumentasjon eller CS50 713 00:28:48,300 --> 00:28:50,630 referanse, vil det bare fortelle deg at oppsikt 714 00:28:50,630 --> 00:28:55,730 sammenligne avkastning enten en negativ nummer eller et positivt tall eller null, 715 00:28:55,730 --> 00:28:57,660 hvor null betyr at de er like. 716 00:28:57,660 --> 00:28:58,570 >> Så bare gjetninger. 717 00:28:58,570 --> 00:29:00,390 Hva kan det bety hvis røre sammenligningen avkastning 718 00:29:00,390 --> 00:29:02,110 negativ verdi eller positiv verdi? 719 00:29:02,110 --> 00:29:02,785 720 00:29:02,785 --> 00:29:04,285 PUBLIKUM: Større enn eller mindre enn. 721 00:29:04,285 --> 00:29:05,570 DAVID J. MALAN: Yeah, større enn eller mindre enn. 722 00:29:05,570 --> 00:29:08,640 Så hvis du ønsker å sortere en hel haug med strenger i en dictionary-- 723 00:29:08,640 --> 00:29:12,975 som vi vil til slutt ned road-- perfekt funksjon for å bruke potensielt, 724 00:29:12,975 --> 00:29:15,850 fordi det kommer til å gjøre det sammenligning av strenger for deg, og fortelle 725 00:29:15,850 --> 00:29:20,060 du gjør en kommer før b, eller gjør b komme før en alfabetisk. 726 00:29:20,060 --> 00:29:21,490 Vi kan gjøre akkurat det. 727 00:29:21,490 --> 00:29:23,620 >> Og legg merke til jeg gjorde en annen ting i dette eksemplet. 728 00:29:23,620 --> 00:29:26,870 Hva annet har endret seg høyere opp i denne hovedfunksjon? 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 Og dette er at andre hvit løgn. 732 00:29:31,150 --> 00:29:33,750 Hele denne tiden, når du har vært å skrive streng, 733 00:29:33,750 --> 00:29:38,350 vi har vært hemmelig omskriving strengen som char * slik at klang faktisk 734 00:29:38,350 --> 00:29:39,270 forstår deg. 735 00:29:39,270 --> 00:29:42,450 >> Med andre ord, i CS50.h og som vi vil til slutt se, 736 00:29:42,450 --> 00:29:45,950 vi gjort et synonym kalt string det er det samme som char *. 737 00:29:45,950 --> 00:29:49,910 Og for nå, vet bare at *, I denne sammenheng, i det minste 738 00:29:49,910 --> 00:29:51,286 betyr den adressen. 739 00:29:51,286 --> 00:29:52,210 >> Adressen til hva? 740 00:29:52,210 --> 00:29:56,390 Vel, det faktum at jeg sa char *, og ikke int * eller flyte *, 741 00:29:56,390 --> 00:30:00,820 betyr at char * er adressen til en røye. 742 00:30:00,820 --> 00:30:06,770 Så denne lille boksen her, aka streng, er virkelig av typen char *, 743 00:30:06,770 --> 00:30:10,490 som er rett og slett en fancy måte å si: i denne boksen vil gå en adresse. 744 00:30:10,490 --> 00:30:12,430 Og hva betyr denne adressen refererer til? 745 00:30:12,430 --> 00:30:13,780 Angivelig, en røye. 746 00:30:13,780 --> 00:30:16,410 >> Men vi kunne absolutt har int * og andre ting. 747 00:30:16,410 --> 00:30:20,790 Men for nå, er char * virkelig den mest enkel og ett av interesse. 748 00:30:20,790 --> 00:30:23,310 Så dette problemet kommer å stige, selv om, på nytt. 749 00:30:23,310 --> 00:30:24,830 >> Anta at jeg åpner opp dette programmet. 750 00:30:24,830 --> 00:30:27,670 La oss se om vi nå kan forutsi Hva er galt med denne koden. 751 00:30:27,670 --> 00:30:31,140 Så i dette programmet, kopi-0, jeg er kommer til å gå videre og igjen kaller 752 00:30:31,140 --> 00:30:34,190 GetString og lagre verdien i s. 753 00:30:34,190 --> 00:30:38,800 >> Og så, hvorfor gjør jeg dette, bare som en påminnelse fra uker tidligere? 754 00:30:38,800 --> 00:30:40,960 Vi gjorde si at GetString noen ganger returnerer null. 755 00:30:40,960 --> 00:30:42,793 Hva betyr det hvis GetString returnerer null? 756 00:30:42,793 --> 00:30:45,040 757 00:30:45,040 --> 00:30:46,034 Noe gikk galt. 758 00:30:46,034 --> 00:30:48,950 Det betyr sannsynligvis strengen er for stor, datamaskinens minnekapasitet. 759 00:30:48,950 --> 00:30:51,724 Det skjer super, super, super sjelden, men det kan skje. 760 00:30:51,724 --> 00:30:53,890 Vi vil se etter den, og det er alt vi gjør. 761 00:30:53,890 --> 00:30:57,910 >> Fordi vi får se nå, hvis du ikke gjør det begynne å sjekke habitually for ting 762 00:30:57,910 --> 00:31:00,870 som null, kan du faktisk begynne å gå 763 00:31:00,870 --> 00:31:03,106 til adresser i minnet som er ugyldige. 764 00:31:03,106 --> 00:31:05,980 Og du kommer til å begynne å indusere flere og flere segmenteringsfeil. 765 00:31:05,980 --> 00:31:08,360 Eller i en Mac eller en PC, bare forårsaker en datamaskin til å henge 766 00:31:08,360 --> 00:31:10,340 eller et program for å fryse, potensielt. 767 00:31:10,340 --> 00:31:14,930 >> Så nå, jeg hevder i kopi-0.c, at jeg jeg kommer til å kopiere disse strengene ved hjelp 768 00:31:14,930 --> 00:31:15,685 av linje 28. 769 00:31:15,685 --> 00:31:16,850 770 00:31:16,850 --> 00:31:18,750 Og så, jeg kommer i krav nederst 771 00:31:18,750 --> 00:31:21,430 her at jeg kommer å endre en av dem. 772 00:31:21,430 --> 00:31:22,330 >> Så merke dette. 773 00:31:22,330 --> 00:31:24,370 Jeg ringer vår gamle venn strlen. 774 00:31:24,370 --> 00:31:28,960 Og bare forklare på engelsk hva denne linjen 34 gjør? 775 00:31:28,960 --> 00:31:32,480 Hva gjør t brakett 0 representerer til venstre. 776 00:31:32,480 --> 00:31:32,980 Yeah. 777 00:31:32,980 --> 00:31:34,339 >> PUBLIKUM: Det første tegnet av t? 778 00:31:34,339 --> 00:31:35,880 DAVID J. MALAN: Først tegnet av t. 779 00:31:35,880 --> 00:31:36,379 Det er det. 780 00:31:36,379 --> 00:31:40,024 Første tegnet av t, jeg vil ha å tildele store bokstaver versjon 781 00:31:40,024 --> 00:31:41,190 av det første tegn i t. 782 00:31:41,190 --> 00:31:43,200 Så dette er å utnytte den første bokstaven. 783 00:31:43,200 --> 00:31:46,340 Og så, det aller siste jeg gjør i dette programmet er jeg hevder her er 784 00:31:46,340 --> 00:31:50,340 den opprinnelige, s, og her er kopien, t. 785 00:31:50,340 --> 00:31:54,610 >> Men basert på historien vi bare fortalte om hva strenger egentlig er, 786 00:31:54,610 --> 00:31:57,520 det som er ledningen 28 virkelig gjør, og hva som er 787 00:31:57,520 --> 00:31:59,405 den resulterende bug går å være på skjermen? 788 00:31:59,405 --> 00:32:01,300 789 00:32:01,300 --> 00:32:03,500 >> Så først, det første spørsmålet, 28. 790 00:32:03,500 --> 00:32:09,040 Hva er streng t = s egentlig gjør? 791 00:32:09,040 --> 00:32:16,430 Hvis vi har på venstre hånd side her streng t = s; 792 00:32:16,430 --> 00:32:19,400 som gir meg en boks her og en boks her. 793 00:32:19,400 --> 00:32:25,530 Og anta denne adressen er 0x, la oss si, 50 denne gangen, vilkårlig. 794 00:32:25,530 --> 00:32:28,847 Hva gjør strengen t = s gjøre under panseret? 795 00:32:28,847 --> 00:32:30,340 >> PUBLIKUM: [uhørbart] 796 00:32:30,340 --> 00:32:34,100 >> DAVID J. MALAN: Den lagrer minne adresse der, så 0x50 går der. 797 00:32:34,100 --> 00:32:37,980 Så hvis nå, går jeg til den første karakter i t og store bokstaver det, 798 00:32:37,980 --> 00:32:39,535 hva skal jeg effektivt gjør til s? 799 00:32:39,535 --> 00:32:41,300 800 00:32:41,300 --> 00:32:43,450 Jeg er virkelig å gjøre det samme, ikke sant? 801 00:32:43,450 --> 00:32:47,680 Fordi hvis Adresse 0x50-- og rettferdig, jeg har ikke mye plass på bordet her, 802 00:32:47,680 --> 00:32:51,750 men antar at dette er 0x50 her nede, et sted i datamaskinens minne. 803 00:32:51,750 --> 00:32:55,825 >> Og jeg har, for eksempel, gabe med små bokstaver her, som dette. 804 00:32:55,825 --> 00:32:57,120 805 00:32:57,120 --> 00:33:01,980 Og jeg har sagt t brakett 0 blir balanseført. 806 00:33:01,980 --> 00:33:04,860 Vel, er t brakett 0 den første bokstaven i t. 807 00:33:04,860 --> 00:33:07,840 Så lite g kommer til å blitt stor G. Men problemet 808 00:33:07,840 --> 00:33:09,410 er, hva s peker også? 809 00:33:09,410 --> 00:33:10,300 >> PUBLIKUM: Det samme. 810 00:33:10,300 --> 00:33:11,841 >> DAVID J. MALAN: Den samme ting. 811 00:33:11,841 --> 00:33:16,342 Så en enkel forklaring kanskje selv om syntaksen er litt rart. 812 00:33:16,342 --> 00:33:17,050 Så la oss gjøre dette. 813 00:33:17,050 --> 00:33:20,210 Lage kopi-0 og deretter ./copy-0. 814 00:33:20,210 --> 00:33:21,820 815 00:33:21,820 --> 00:33:24,110 Si noe: Gabe. 816 00:33:24,110 --> 00:33:26,760 Og dessverre både dem har nå blitt aktivert, 817 00:33:26,760 --> 00:33:29,500 men for at underliggende Grunnen til at vi er rett og slett 818 00:33:29,500 --> 00:33:32,350 nå arbeider med adresser. 819 00:33:32,350 --> 00:33:36,470 >> Så hvordan skal vi begynne å address-- no pun intended-- 820 00:33:36,470 --> 00:33:39,270 hvordan skal vi begynne å ta opp dette problemet? 821 00:33:39,270 --> 00:33:44,400 Vel, i copy1.c, ting går å få litt mer komplisert. 822 00:33:44,400 --> 00:33:49,310 Men jeg vil hevde en konseptuelt enkel løsning. 823 00:33:49,310 --> 00:33:50,852 >> Så vanskelig å få ved første øyekast. 824 00:33:50,852 --> 00:33:53,560 Ikke til å bli enkelt for den første gang du skriver det ut, kanskje, 825 00:33:53,560 --> 00:33:57,440 men hvis problemet er at bare gjør t = s bare 826 00:33:57,440 --> 00:33:59,694 kopier adressen, hva, igjen hvis jeg kan plukke på deg, 827 00:33:59,694 --> 00:34:02,110 kommer til å være løsningen for faktisk å kopiere en streng? 828 00:34:02,110 --> 00:34:04,906 829 00:34:04,906 --> 00:34:06,770 >> PUBLIKUM: Vi vil trolig bruke en løkke igjen. 830 00:34:06,770 --> 00:34:06,890 >> DAVID J. MALAN: Yeah. 831 00:34:06,890 --> 00:34:08,390 Så vi kommer til å trenge en løkke igjen. 832 00:34:08,390 --> 00:34:11,800 Og fordi hvis vi ønsker å kopiere en streng s inn i en annen streng, 833 00:34:11,800 --> 00:34:14,120 vi sannsynligvis vil gjøre det tegn for tegn. 834 00:34:14,120 --> 00:34:17,199 Men problemet er, dersom Dette er opprinnelig s, 835 00:34:17,199 --> 00:34:22,159 nå må vi begynne å eksplisitt tildele minne for t. 836 00:34:22,159 --> 00:34:24,320 >> Med andre ord, la oss tegne dette en siste gang. 837 00:34:24,320 --> 00:34:28,659 Hvis dette er strengen s = GetString. 838 00:34:28,659 --> 00:34:30,956 839 00:34:30,956 --> 00:34:32,455 Og la oss sette dette opp her, også. 840 00:34:32,455 --> 00:34:36,639 841 00:34:36,639 --> 00:34:37,420 Dette er GetString. 842 00:34:37,420 --> 00:34:39,070 843 00:34:39,070 --> 00:34:43,860 Og så, på bildet for noe sånn kommer til å være som før, 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 Det ser litt noe sånt som dette. 847 00:34:48,960 --> 00:34:53,650 Og s derfor kaller vi dette 0x50, og som kommer til å være 51, 52. 848 00:34:53,650 --> 00:34:54,409 >> Så dette er 0x50. 849 00:34:54,409 --> 00:34:55,679 850 00:34:55,679 --> 00:34:59,690 Og så gjør jeg streng t. 851 00:34:59,690 --> 00:35:02,450 I minnet, det er bare kommer til å gi meg et lite torg som dette. 852 00:35:02,450 --> 00:35:04,080 Så hva er viktig skritt nå? 853 00:35:04,080 --> 00:35:09,870 Hvis jeg ønsker å kopiere s til t, hva blank trenger vi å fylle ut her? 854 00:35:09,870 --> 00:35:12,050 Eller hva trenger vi å gjøre på et høyt nivå? 855 00:35:12,050 --> 00:35:14,101 856 00:35:14,101 --> 00:35:14,600 Yeah? 857 00:35:14,600 --> 00:35:16,200 858 00:35:16,200 --> 00:35:17,020 Noen? 859 00:35:17,020 --> 00:35:17,690 Yeah. 860 00:35:17,690 --> 00:35:19,214 >> PUBLIKUM: Vi må [uhørbart]. 861 00:35:19,214 --> 00:35:21,380 DAVID J. MALAN: Ja, vi må fylle ut dette stå tomt. 862 00:35:21,380 --> 00:35:24,340 Jeg kan ikke kopiere og deretter kapitalisere Gabe navn 863 00:35:24,340 --> 00:35:28,120 før jeg spør operativsystemet for en annen del av minne 864 00:35:28,120 --> 00:35:30,640 som er minst like stor som den originale. 865 00:35:30,640 --> 00:35:32,130 Så det etterlater oss med et spørsmål. 866 00:35:32,130 --> 00:35:36,080 >> Hvordan kan jeg be operativsystemet ikke bare for en enkel liten pointer-- 867 00:35:36,080 --> 00:35:38,530 da dette er kalt en adresse, en pointer-- ikke 868 00:35:38,530 --> 00:35:40,980 for en enkel liten boks som dette kalles en streng? 869 00:35:40,980 --> 00:35:44,200 Hvordan spør jeg drifts system for en stor del av minnet? 870 00:35:44,200 --> 00:35:48,430 Så langt har jeg bare fått den tilbake indirekte ved å ringe GetString. 871 00:35:48,430 --> 00:35:50,740 Så hvordan er GetString selv får sin hukommelse? 872 00:35:50,740 --> 00:35:53,430 >> Vel, det viser seg at det er denne annen funksjon her 873 00:35:53,430 --> 00:35:55,160 at vi nå skal begynne å bruke. 874 00:35:55,160 --> 00:35:59,780 Nå ser på denne måten mer kryptisk than-- og jeg er den eneste som kan se it-- 875 00:35:59,780 --> 00:36:03,150 denne linjen ser måte mer kryptisk så bør det ved første øyekast. 876 00:36:03,150 --> 00:36:04,650 Men la oss erte den fra hverandre. 877 00:36:04,650 --> 00:36:07,950 >> På venstre side, jeg har char * t. 878 00:36:07,950 --> 00:36:13,280 Så i engelsk, la oss begynne å formulere fullstendige setninger i teknisk sjargong. 879 00:36:13,280 --> 00:36:19,757 Så dette er tildeling av en variabel av type char * t ut. 880 00:36:19,757 --> 00:36:21,090 Nå, hva betyr det egentlig? 881 00:36:21,090 --> 00:36:23,881 >> Vel, det betyr, hva skal jeg å sette i denne variabel kalt t? 882 00:36:23,881 --> 00:36:24,780 883 00:36:24,780 --> 00:36:26,402 Adressen til en røye. 884 00:36:26,402 --> 00:36:28,360 Så det er bare enklere, mer fornuftig måte 885 00:36:28,360 --> 00:36:29,930 beskrive venstre side. 886 00:36:29,930 --> 00:36:32,890 Så det skaper denne boksen her bare. 887 00:36:32,890 --> 00:36:34,760 Så høyre side, formodentlig, kommer 888 00:36:34,760 --> 00:36:37,170 å bevilge at større mengde minne hvordan? 889 00:36:37,170 --> 00:36:38,340 Så la oss erte dette fra hverandre. 890 00:36:38,340 --> 00:36:41,131 >> Det er overveldende ved første øyekast, men hva er det som skjer her inne? 891 00:36:41,131 --> 00:36:43,740 Først, det er malloc, som er tydeligvis vår nye venn, 892 00:36:43,740 --> 00:36:45,450 "Minne fordele." 893 00:36:45,450 --> 00:36:49,560 Så dette er argumentet blir vedtatt inn i det, så det er en ganske stor argument. 894 00:36:49,560 --> 00:36:50,970 Så la oss erte dette fra hverandre. 895 00:36:50,970 --> 00:36:53,410 >> StrLen av s, selvfølgelig, representerer the-- 896 00:36:53,410 --> 00:36:54,142 897 00:36:54,142 --> 00:36:55,600 PUBLIKUM: Antallet tegn. 898 00:36:55,600 --> 00:36:56,710 DAVID J. MALAN: Bare antall tegn i s. 899 00:36:56,710 --> 00:36:59,040 Så lengden s, den opprinnelige streng. 900 00:36:59,040 --> 00:37:00,350 Så G-a-b-e. 901 00:37:00,350 --> 00:37:02,320 Så det er trolig fire i dette tilfellet. 902 00:37:02,320 --> 00:37:05,485 Hvorfor gjør jeg en etter ringer strlen av s? 903 00:37:05,485 --> 00:37:06,360 PUBLIKUM: [uhørbart] 904 00:37:06,360 --> 00:37:07,590 DAVID J. MALAN: For at spesielle null karakter. 905 00:37:07,590 --> 00:37:11,260 Hvis du spør meg hva som er lengden på Gabe navn, skal jeg si fire. 906 00:37:11,260 --> 00:37:14,480 Under panseret, skjønt, må jeg at femte byte for null karakter. 907 00:37:14,480 --> 00:37:16,100 Så det er derfor jeg gjør det en. 908 00:37:16,100 --> 00:37:21,730 >> Nå bare i tilfelle du kjører denne program på en annen enn datamaskinen, sier, 909 00:37:21,730 --> 00:37:24,610 den CS50 apparatet, der størrelsen på en char 910 00:37:24,610 --> 00:37:26,350 kan være annerledes fra min egen computer-- 911 00:37:26,350 --> 00:37:30,590 viser seg at jeg kan kalle dette operatør sizeof, bare spør datamaskinen, 912 00:37:30,590 --> 00:37:32,870 det som er på størrelse med en char på denne datamaskinen? 913 00:37:32,870 --> 00:37:37,400 >> Og ved å multiplisere fem i dette eksempel ved størrelsen av en char, som 914 00:37:37,400 --> 00:37:40,440 på de fleste datamaskiner vil bare være ett, malloc 915 00:37:40,440 --> 00:37:44,830 kommer til å bevilge for meg denne store blings av minne over her til høyre. 916 00:37:44,830 --> 00:37:47,140 Og det kommer til å return-- det er en function-- slik at det er 917 00:37:47,140 --> 00:37:48,265 kommer til å vende tilbake til meg hva? 918 00:37:48,265 --> 00:37:50,914 919 00:37:50,914 --> 00:37:51,830 PUBLIKUM: Adressen? 920 00:37:51,830 --> 00:37:53,709 DAVID J. MALAN: Adressen til hva? 921 00:37:53,709 --> 00:37:55,250 PUBLIKUM: Av minnet det tildelt? 922 00:37:55,250 --> 00:37:56,450 DAVID J. MALAN: Av de minne den tildelt. 923 00:37:56,450 --> 00:37:59,189 Så jeg har ingen anelse om, ærlig, hvor dette kommer til å ende opp. 924 00:37:59,189 --> 00:38:01,480 Jeg kommer til å foreslå at det kommer til å ende opp på 0x88. 925 00:38:01,480 --> 00:38:02,770 926 00:38:02,770 --> 00:38:06,009 Helt vilkårlig, men et annet sted enn 0x50, 927 00:38:06,009 --> 00:38:08,800 fordi operativsystemet, hva Windows og Mac OS gjøre for meg, er 928 00:38:08,800 --> 00:38:11,230 sørge for at det er å gi meg ulike biter av RAM. 929 00:38:11,230 --> 00:38:14,210 >> Så dette er verdien der dette blings av minne kan ende opp. 930 00:38:14,210 --> 00:38:16,060 Så dette er hva som ender opp i her, 0x88. 931 00:38:16,060 --> 00:38:17,480 932 00:38:17,480 --> 00:38:21,570 Så nå klart, kan jeg forstå at dette ikke er den samme som denne, 933 00:38:21,570 --> 00:38:23,960 fordi de er å peke på forskjellige biter av minne. 934 00:38:23,960 --> 00:38:29,980 Så hvis jeg nå faktisk ønsker å kopiere dette i, la oss gjøre den foreslåtte løsningen. 935 00:38:29,980 --> 00:38:36,870 >> La oss bare gå, skape en for løkke, og gjøre t brakett jeg får s brakett jeg. 936 00:38:36,870 --> 00:38:39,760 Fordi nå kan jeg bruke denne matrisen-lignende notasjon, 937 00:38:39,760 --> 00:38:43,390 fordi selv om malloc svært generically tildeler meg minne, 938 00:38:43,390 --> 00:38:45,290 minnet er bare sammenhengende bytes. 939 00:38:45,290 --> 00:38:47,240 Byte, byte, byte, rygg mot rygg mot rygg. 940 00:38:47,240 --> 00:38:50,030 >> Jeg kan sikkert som programmerer behandle det som en matrise, som 941 00:38:50,030 --> 00:38:55,090 betyr at jeg kan bruke denne til slutt kjent notasjon av bare noen hakeparenteser. 942 00:38:55,090 --> 00:38:56,462 943 00:38:56,462 --> 00:39:00,020 >> Så la meg pause der, fordi Dette er mye alt på en gang, selv 944 00:39:00,020 --> 00:39:03,530 selv om den grunnleggende ideen å gjenerobre er at strengen, hele denne tiden, 945 00:39:03,530 --> 00:39:05,550 er ikke en ny datatype per se. 946 00:39:05,550 --> 00:39:10,150 Det er bare en såkalt pekeren, adressen til en karakter, 947 00:39:10,150 --> 00:39:12,650 som bare betyr at det er et tall at ved menneskelig konvensjonen 948 00:39:12,650 --> 00:39:15,350 vi har en tendens til å skrive så 0x noe. 949 00:39:15,350 --> 00:39:18,590 >> Men det er bare et tall, som 33 Oxford Street, 950 00:39:18,590 --> 00:39:20,530 som skjer for å være den CS bygningens adresse. 951 00:39:20,530 --> 00:39:22,000 952 00:39:22,000 --> 00:39:23,545 Eventuelle spørsmål om disse detaljene? 953 00:39:23,545 --> 00:39:24,790 954 00:39:24,790 --> 00:39:25,289 Yeah? 955 00:39:25,289 --> 00:39:28,530 >> PUBLIKUM: Hvorfor gjør vi sjekke for t lik null? 956 00:39:28,530 --> 00:39:30,740 >> DAVID J. MALAN: Hvorfor gjør vi se etter t lik null? 957 00:39:30,740 --> 00:39:33,250 Hvis vi leser documentation-- stor question-- for malloc, 958 00:39:33,250 --> 00:39:37,020 det kommer til å si i fine print, noen ganger malloc kan returnere null, 959 00:39:37,020 --> 00:39:38,080 akkurat som GetString. 960 00:39:38,080 --> 00:39:41,820 Og ja, GetString returnerer null hvis, i sin tur, malloc returnerer null, 961 00:39:41,820 --> 00:39:43,130 fordi GetString bruker malloc. 962 00:39:43,130 --> 00:39:46,400 >> Og det kan skje hvis OS, Mac OS, Windows, uansett, er rett og slett 963 00:39:46,400 --> 00:39:48,130 tom for minne for deg. 964 00:39:48,130 --> 00:39:49,820 Så det er hva som skjedde der. 965 00:39:49,820 --> 00:39:52,910 >> Og la meg avsløre en annen ting som kanskje bare blåse hodet 966 00:39:52,910 --> 00:39:55,100 eller helt være for langt over linjen. 967 00:39:55,100 --> 00:39:59,770 Men la meg dra opp samme for loop for kopiering, 968 00:39:59,770 --> 00:40:05,480 som for et øyeblikk siden, husker var dette. t brakett jeg får s brakett jeg. 969 00:40:05,480 --> 00:40:06,740 >> Fin og brukervennlig. 970 00:40:06,740 --> 00:40:09,330 Føles som Uke to igjen. 971 00:40:09,330 --> 00:40:14,920 Men denne versjonen faktisk kan være omskrevet som dette, som ser kryptisk. 972 00:40:14,920 --> 00:40:18,280 Det er en teknikk som kalles pekeren aritmetikk, adresse aritmetikk. 973 00:40:18,280 --> 00:40:19,600 Men hvorfor virker dette? 974 00:40:19,600 --> 00:40:22,220 >> Nå annoyingly Forfatterne av C valgte å bruke 975 00:40:22,220 --> 00:40:25,070 symbolet * for ulike formål. 976 00:40:25,070 --> 00:40:29,020 Vi har sett det brukt en gang allerede, char *, som betyr "gi meg en variabel 977 00:40:29,020 --> 00:40:31,210 som kommer til å inneholde adressen til en røye. " 978 00:40:31,210 --> 00:40:33,990 Så char * i den sammenheng betyr "gi meg en variabel." 979 00:40:33,990 --> 00:40:40,050 >> Dessverre, hvis du bruker * uten et ord foran det, som røye, 980 00:40:40,050 --> 00:40:41,905 det kalles nå dereferanseoperator. 981 00:40:41,905 --> 00:40:43,530 Og vi vil se mer av dette før lenge. 982 00:40:43,530 --> 00:40:44,930 Men det betyr bare "gå dit." 983 00:40:44,930 --> 00:40:49,070 Det er som å si, hvis noen ga meg på et stykke papir "33 Oxford Street," 984 00:40:49,070 --> 00:40:53,830 hvis jeg gjør "* 33 Oxford Street", som betyr "Gå ned veien til CS bygningen." 985 00:40:53,830 --> 00:40:57,220 >> Så * betyr bare gå dit hvis det er ingen ord foran den. 986 00:40:57,220 --> 00:40:59,100 Så hva er t, for å være klar? 987 00:40:59,100 --> 00:41:03,250 t er adressen til den del av minne som ble gitt tilbake til meg. 988 00:41:03,250 --> 00:41:06,650 s er adressen til det, for å være klar, i eksempelet vi har diskutert, 989 00:41:06,650 --> 00:41:07,500 av små bokstaver Gabe? 990 00:41:07,500 --> 00:41:08,990 991 00:41:08,990 --> 00:41:10,005 s er adressen of-- 992 00:41:10,005 --> 00:41:11,585 993 00:41:11,585 --> 00:41:12,460 PUBLIKUM: Strengen. 994 00:41:12,460 --> 00:41:14,126 DAVID J. MALAN: Of Gabe opprinnelige navn. 995 00:41:14,126 --> 00:41:16,660 Så det er adressen til denne del av minnet. 996 00:41:16,660 --> 00:41:22,220 Så hvis jeg sier t + jeg-- i, varsel, er bare vår gamle venn. 997 00:41:22,220 --> 00:41:24,770 Det er bare en indeksvariabel som er itera fra null på opp 998 00:41:24,770 --> 00:41:26,960 til lengden av strengen s. 999 00:41:26,960 --> 00:41:30,367 Så det kommer til å bli null, så en, så to, så tre, så fire. 1000 00:41:30,367 --> 00:41:33,200 Så la oss sette sammen disse nye Scratch-lignende puslespill brikker, om du vil, 1001 00:41:33,200 --> 00:41:36,140 Selv om igjen, syntaksen er langt mer uforståelige enn Scratch. 1002 00:41:36,140 --> 00:41:39,522 Så t er en adresse + Jeg kommer til å gi meg 1003 00:41:39,522 --> 00:41:42,480 et tall, fordi disse er alle tall som vi har vært tegning som hex. 1004 00:41:42,480 --> 00:41:43,560 Men de er bare tall. 1005 00:41:43,560 --> 00:41:49,960 >> Så hvis adressen t vi sa var 0x88, hva er 0x88 pluss null. 1006 00:41:49,960 --> 00:41:51,564 1007 00:41:51,564 --> 00:41:53,980 Selv om du ikke er komfortabel med hex ennå, ta en gjetning. 1008 00:41:53,980 --> 00:41:54,410 >> PUBLIKUM: The original. 1009 00:41:54,410 --> 00:41:55,850 >> DAVID J. MALAN: Still 0x88. 1010 00:41:55,850 --> 00:41:58,910 Så hva betyr * 0x88 mener? 1011 00:41:58,910 --> 00:42:02,670 Det betyr: "gå dit", som betyr effektivt, "sette fingeren her." 1012 00:42:02,670 --> 00:42:06,930 Og nå på høyre side av dette uttrykket, * og deretter i parentesar, 1013 00:42:06,930 --> 00:42:11,586 s + i betyr s, som er ta opp her av den lille g. 1014 00:42:11,586 --> 00:42:16,220 s + 0 er, selvfølgelig, s, uansett s er. 1015 00:42:16,220 --> 00:42:21,230 >> Så nå er det * s, som akkurat som * 33 Oxford Street betyr gå til adressen 1016 00:42:21,230 --> 00:42:22,010 s. 1017 00:42:22,010 --> 00:42:24,170 Så her er denne finger, høyre hånd. 1018 00:42:24,170 --> 00:42:26,050 Så hva skal jeg kopiere inn i hva? 1019 00:42:26,050 --> 00:42:30,260 Saken til høyre, som er Gabe, liten g her, inn her. 1020 00:42:30,260 --> 00:42:32,750 >> Og slik at effekten av det første iterasjon av loopen, 1021 00:42:32,750 --> 00:42:36,200 som du foreslo, selv om det ser ut gal mer komplisert enn noe 1022 00:42:36,200 --> 00:42:42,110 vi har sett før, er bare å si gå her og kopiere det tegnet her. 1023 00:42:42,110 --> 00:42:44,700 Det er å gi deg et kart til begge steder. 1024 00:42:44,700 --> 00:42:46,130 >> Og vi vil se langt mer av dette. 1025 00:42:46,130 --> 00:42:50,600 Men for nå, er håpet bare for å introdusere noen av disse grunnleggende ideer. 1026 00:42:50,600 --> 00:42:53,550 Og ja, la oss se på en siste program her, 1027 00:42:53,550 --> 00:42:57,480 og deretter lovet claymation, som vil gjøre alt i orden. 1028 00:42:57,480 --> 00:42:57,980 Greit. 1029 00:42:57,980 --> 00:43:01,680 Så la meg åpne opp-- der vi går. 1030 00:43:01,680 --> 00:43:02,850 1031 00:43:02,850 --> 00:43:05,440 Så la meg- vi vil komme tilbake til dette bildet før lenge. 1032 00:43:05,440 --> 00:43:08,360 La meg åpne opp denne siste eksempel her. 1033 00:43:08,360 --> 00:43:09,440 1034 00:43:09,440 --> 00:43:12,710 >> Så her er en super, super program som oppnår 1035 00:43:12,710 --> 00:43:15,050 ingenting i livet som gjør det følgende. 1036 00:43:15,050 --> 00:43:18,740 Det erklærer første to variabler, x og y, som ikke er tall denne periode 1037 00:43:18,740 --> 00:43:19,240 per se. 1038 00:43:19,240 --> 00:43:20,448 De er ikke heltall, per se. 1039 00:43:20,448 --> 00:43:22,899 De er tilsynelatende int *. 1040 00:43:22,899 --> 00:43:25,690 Så bare noen, hva betyr det Hvis datatype, variabelen, 1041 00:43:25,690 --> 00:43:26,860 er av typen int * stjerne? 1042 00:43:26,860 --> 00:43:30,240 Det er adressen til en int. 1043 00:43:30,240 --> 00:43:31,990 >> Så jeg har ingen anelse om hvor det er ennå. 1044 00:43:31,990 --> 00:43:35,150 Det betyr bare "satt, til slutt, adressen for en int her. " 1045 00:43:35,150 --> 00:43:38,340 0x50, 0x88, uansett hvor det er i minne, er en adresse du kommer dit. 1046 00:43:38,340 --> 00:43:40,200 Og det er hva y er kommer til å være, så vel. 1047 00:43:40,200 --> 00:43:44,920 >> Hvis jeg nå si x = malloc (sizeof (int)), dette er en fancy måte å si: 1048 00:43:44,920 --> 00:43:49,000 hei operativsystem, via malloc, gi meg nok minne for størrelsen 1049 00:43:49,000 --> 00:43:52,370 av en int, som sannsynligvis kommer til å være 32 bits eller fire byte. 1050 00:43:52,370 --> 00:43:53,680 >> Så hva gjør returnere malloc? 1051 00:43:53,680 --> 00:43:55,250 Malloc returnerer en adresse. 1052 00:43:55,250 --> 00:43:57,020 Så hva kommer til å bli lagret i x? 1053 00:43:57,020 --> 00:44:00,600 Adressen til den del av minne, de fire byte, som malloc 1054 00:44:00,600 --> 00:44:03,360 nettopp funnet for meg ved å spørre operativsystemet. 1055 00:44:03,360 --> 00:44:08,240 >> Nå i mellomtiden, linje fire her, * x = 42. 1056 00:44:08,240 --> 00:44:09,990 Bare for å være klar, hva som skjer der nede? 1057 00:44:09,990 --> 00:44:11,530 På venstre side, * x. 1058 00:44:11,530 --> 00:44:13,610 det er som * 33 Oxford Street. 1059 00:44:13,610 --> 00:44:15,523 Så * x betyr hva? 1060 00:44:15,523 --> 00:44:16,450 >> PUBLIKUM: Gå til. 1061 00:44:16,450 --> 00:44:17,908 >> DAVID J. MALAN: Gå til denne adressen. 1062 00:44:17,908 --> 00:44:20,466 Uansett hvor som del av minnet er, gå til det. 1063 00:44:20,466 --> 00:44:21,979 Og sette det der, tydeligvis? 1064 00:44:21,979 --> 00:44:22,520 PUBLIKUM: 42. 1065 00:44:22,520 --> 00:44:23,580 DAVID J. MALAN: 42. 1066 00:44:23,580 --> 00:44:25,650 Greit, * y, samme idé. 1067 00:44:25,650 --> 00:44:26,860 Gå til adressen i y. 1068 00:44:26,860 --> 00:44:31,740 Sett nummer 13 der, men hva er y for øyeblikket? 1069 00:44:31,740 --> 00:44:33,172 1070 00:44:33,172 --> 00:44:34,630 PUBLIKUM: Det er ingen minne for y. 1071 00:44:34,630 --> 00:44:35,710 DAVID J. MALAN: Det er ingen hukommelse for y. 1072 00:44:35,710 --> 00:44:38,215 Så hva gjør y trolig inneholde, som vi har sagt? 1073 00:44:38,215 --> 00:44:38,520 >> PUBLIKUM: Garbage. 1074 00:44:38,520 --> 00:44:39,480 >> DAVID J. MALAN: Noen søppel verdi. 1075 00:44:39,480 --> 00:44:41,320 Nå er søppel verdi fortsatt et tall. 1076 00:44:41,320 --> 00:44:43,160 Det kan fortsatt bli tatt for en adresse. 1077 00:44:43,160 --> 00:44:45,160 Det er som om noen skriblet noe ned, 1078 00:44:45,160 --> 00:44:48,002 og jeg feiltolket det som menings noen bygning nedover gaten. 1079 00:44:48,002 --> 00:44:50,460 Og hvis du bare prøve å gå inn i noen bygning du ikke eier, 1080 00:44:50,460 --> 00:44:53,710 eller noen del av minne du har ikke vært gitt, kan dårlige ting skje. 1081 00:44:53,710 --> 00:44:57,740 Datamaskin kan krasje, eller en annen ubestemt atferd kan skje. 1082 00:44:57,740 --> 00:45:01,310 >> Så introen, da, for å Binky er dette. 1083 00:45:01,310 --> 00:45:04,290 Jeg husker fortsatt, 20 noen odde år senere, 1084 00:45:04,290 --> 00:45:07,200 hvor jeg var da jeg endelig forstått pekere. 1085 00:45:07,200 --> 00:45:09,520 >> Som er å si, hvis du forlate her i tre minutter 1086 00:45:09,520 --> 00:45:12,170 og jeg tror ikke forstå pekere, innser 1087 00:45:12,170 --> 00:45:14,410 Jeg har husket for 20 år for noen sprø grunn 1088 00:45:14,410 --> 00:45:17,140 når og hvorfor det endelig senket i, sitter med min undervisning 1089 00:45:17,140 --> 00:45:19,501 stipendiat, Nishat Mehta i iden av Eliot Dining Hall. 1090 00:45:19,501 --> 00:45:21,250 Nå har jeg husket dette fordi dette var 1091 00:45:21,250 --> 00:45:23,920 ett av temaene jeg, i Spesielt slet med. 1092 00:45:23,920 --> 00:45:26,470 Og så, det endelig klikket, som jeg tør si en rekke emner 1093 00:45:26,470 --> 00:45:27,460 slutt vil. 1094 00:45:27,460 --> 00:45:32,590 Og nå, for å gjøre det føler hele lykkeligere og enda mer overbevisende, 1095 00:45:32,590 --> 00:45:35,360 la oss ta en siste titt i vår siste tre minutter her på Binky, 1096 00:45:35,360 --> 00:45:37,675 fra vår venn, Nick Parlante fra Stanford. 1097 00:45:37,675 --> 00:45:38,910 1098 00:45:38,910 --> 00:45:41,580 >> [VIDEOAVSPILLING] 1099 00:45:41,580 --> 00:45:42,750 >> -Hei, Binky. 1100 00:45:42,750 --> 00:45:43,500 Våkn opp! 1101 00:45:43,500 --> 00:45:45,960 Det er tid for pekeren moro. 1102 00:45:45,960 --> 00:45:47,012 >> Hva er det? 1103 00:45:47,012 --> 00:45:48,723 Lær om pekere? 1104 00:45:48,723 --> 00:45:50,580 Oh, goody! 1105 00:45:50,580 --> 00:45:53,563 >> -Vel, For å komme i gang, tror jeg vi er kommer til å trenge et par pekere. 1106 00:45:53,563 --> 00:45:54,390 >> -OK. 1107 00:45:54,390 --> 00:45:57,930 Denne koden tildeler to pekere, som kan vise til heltall. 1108 00:45:57,930 --> 00:45:58,430 -OK. 1109 00:45:58,430 --> 00:46:02,140 Vel, jeg ser de to pekere, men de ikke synes å være å peke på noe. 1110 00:46:02,140 --> 00:46:02,980 >> -Riktig. 1111 00:46:02,980 --> 00:46:05,100 Utgangspunktet, pekere ikke peke på noe. 1112 00:46:05,100 --> 00:46:08,030 De tingene de peker til er kalt pointees, og sette dem opp sin 1113 00:46:08,030 --> 00:46:09,370 et separat trinn. 1114 00:46:09,370 --> 00:46:10,220 >> Åh, høyre, høyre. 1115 00:46:10,220 --> 00:46:10,950 Jeg visste det. 1116 00:46:10,950 --> 00:46:12,385 De pointees er separate. 1117 00:46:12,385 --> 00:46:14,315 Er, så hvordan fordele du en 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 Vel, tildeler denne koden en ny heltall pointee, 1121 00:46:18,970 --> 00:46:20,950 og denne delen sett x å peke på det. 1122 00:46:20,950 --> 00:46:22,050 1123 00:46:22,050 --> 00:46:23,230 >> -Hei, Ser det bedre. 1124 00:46:23,230 --> 00:46:25,060 Så gjør det gjør noe. 1125 00:46:25,060 --> 00:46:25,990 >> -OK. 1126 00:46:25,990 --> 00:46:30,455 Jeg skal deferanseoperasjon pekeren x til lagre nummeret 42 i sin pointee. 1127 00:46:30,455 --> 00:46:32,830 For dette trikset, jeg trenger min Magic Wand of dereferencing. 1128 00:46:32,830 --> 00:46:34,130 1129 00:46:34,130 --> 00:46:36,080 >> -Din Magic Wand of dereferencing? 1130 00:46:36,080 --> 00:46:37,357 1131 00:46:37,357 --> 00:46:38,190 At-- det er flott. 1132 00:46:38,190 --> 00:46:39,340 1133 00:46:39,340 --> 00:46:41,080 >> -Dette er hva koden ser ut. 1134 00:46:41,080 --> 00:46:44,110 Jeg skal bare sette opp nummeret, og [POP] 1135 00:46:44,110 --> 00:46:44,700 >> -Hei, Se. 1136 00:46:44,700 --> 00:46:46,140 Der går det. 1137 00:46:46,140 --> 00:46:50,980 >> -Så gjør en deferanseoperasjon på x følger pilen for å få tilgang til sin pointee. 1138 00:46:50,980 --> 00:46:53,160 I dette tilfellet, en butikk 42 i der. 1139 00:46:53,160 --> 00:46:57,710 Hey prøve å bruke den til å lagre nummeret 13 gjennom den annen peker, y. 1140 00:46:57,710 --> 00:46:58,760 >> -OK. 1141 00:46:58,760 --> 00:47:03,270 Jeg vil bare gå over her til y, og få nummer 13 satt opp. 1142 00:47:03,270 --> 00:47:07,930 Og så, ta Wand av Dereferencing og bare [BUZZ] 1143 00:47:07,930 --> 00:47:08,960 >> Åh! 1144 00:47:08,960 --> 00:47:09,500 >> Åh, hei! 1145 00:47:09,500 --> 00:47:11,090 Det fungerte ikke. 1146 00:47:11,090 --> 00:47:15,630 Si, Binky, tror jeg ikke dereferencing y er en god idé, fordi du vet, 1147 00:47:15,630 --> 00:47:17,850 sette opp pointee er et separat trinn. 1148 00:47:17,850 --> 00:47:20,450 Og jeg tror ikke vi noen gang gjorde det. 1149 00:47:20,450 --> 00:47:21,480 >> -good Punkt. 1150 00:47:21,480 --> 00:47:21,980 -Ja. 1151 00:47:21,980 --> 00:47:25,680 Vi bevilget pekeren y, men vi aldri sett den til å peke på en pointee. 1152 00:47:25,680 --> 00:47:27,190 1153 00:47:27,190 --> 00:47:28,616 >> -Veldig Observant. 1154 00:47:28,616 --> 00:47:30,240 -Hei, Du ser bra der, Binky. 1155 00:47:30,240 --> 00:47:33,400 Kan du fikse det slik at y poeng til samme pointee som x? 1156 00:47:33,400 --> 00:47:34,000 >> -Klart. 1157 00:47:34,000 --> 00:47:36,780 Jeg skal bruke min Magic Wand av Pointer Oppdraget. 1158 00:47:36,780 --> 00:47:38,740 >> -Er Det kommer til å være et problem som før? 1159 00:47:38,740 --> 00:47:39,240 Nei. 1160 00:47:39,240 --> 00:47:40,660 Dette betyr ikke berøre pointees. 1161 00:47:40,660 --> 00:47:44,450 Det endrer bare en peker til peke på det samme som en annen. 1162 00:47:44,450 --> 00:47:45,450 >> Åh, ser jeg. 1163 00:47:45,450 --> 00:47:48,200 Nå y peker til samme sted som x. 1164 00:47:48,200 --> 00:47:48,910 Så vent. 1165 00:47:48,910 --> 00:47:49,950 Nå, er y løst. 1166 00:47:49,950 --> 00:47:51,120 Den har en pointee. 1167 00:47:51,120 --> 00:47:54,510 Så du kan prøve Wand av Dereferencing igjen for å sende 13 over. 1168 00:47:54,510 --> 00:47:56,510 >> -Uh, OK. 1169 00:47:56,510 --> 00:47:58,160 Her går det. [POP] 1170 00:47:58,160 --> 00:47:59,340 >> -Hei, Se på det. 1171 00:47:59,340 --> 00:48:00,750 Nå dereferencing fungerer på y. 1172 00:48:00,750 --> 00:48:04,991 Og fordi pekere deler at en pointee, de begge se 13. 1173 00:48:04,991 --> 00:48:05,490 -Ja. 1174 00:48:05,490 --> 00:48:06,870 Deling, uansett. 1175 00:48:06,870 --> 00:48:08,820 Så skal vi bytte plass nå? 1176 00:48:08,820 --> 00:48:09,440 >> Oh, se. 1177 00:48:09,440 --> 00:48:10,830 Vi har ikke mer tid. 1178 00:48:10,830 --> 00:48:11,570 >> -But-- 1179 00:48:11,570 --> 00:48:13,530 >> Bare husk de tre pekeren regler. 1180 00:48:13,530 --> 00:48:16,560 Number One, den grunnleggende struktur er at du har en peker, 1181 00:48:16,560 --> 00:48:18,680 og den peker over til en pointee. 1182 00:48:18,680 --> 00:48:20,640 Men pekeren og pointee er separate, 1183 00:48:20,640 --> 00:48:22,610 og vanlig feil er å sette opp en peker, 1184 00:48:22,610 --> 00:48:25,000 men å glemme å gi den en pointee. 1185 00:48:25,000 --> 00:48:28,170 >> Nummer to, peker dereferencing starter ved pekeren 1186 00:48:28,170 --> 00:48:31,050 og følger sin pekeren over å få tilgang til sin pointee. 1187 00:48:31,050 --> 00:48:33,400 Som vi alle vet, dette fungerer bare hvis det er 1188 00:48:33,400 --> 00:48:36,270 en pointee, hvilken type kommer tilbake til regel nummer én. 1189 00:48:36,270 --> 00:48:39,000 >> Nummer tre, peker Oppdraget tar ett pekeren 1190 00:48:39,000 --> 00:48:42,320 og endrer det til å peke på samme pointee som en annen pekeren. 1191 00:48:42,320 --> 00:48:44,160 Så etter oppdraget, de to pekere 1192 00:48:44,160 --> 00:48:45,910 vil peke til samme pointee. 1193 00:48:45,910 --> 00:48:47,990 Noen ganger er det som kalles deling. 1194 00:48:47,990 --> 00:48:49,740 Og det er alt som skal til, egentlig. 1195 00:48:49,740 --> 00:48:50,277 Bye-bye nå. 1196 00:48:50,277 --> 00:48:51,110 [END VIDEOAVSPILLING] 1197 00:48:51,110 --> 00:48:52,568 DAVID J. MALAN: Det er det for CS50. 1198 00:48:52,568 --> 00:48:55,110 Vi vil se deg neste uke. 1199 00:48:55,110 --> 00:48:56,064