1 00:00:00,000 --> 00:00:01,110 >> [Musik spiller] 2 00:00:01,110 --> 00:00:10,567 3 00:00:10,567 --> 00:00:11,650 David J. MALAN: Okay. 4 00:00:11,650 --> 00:00:15,610 Dette er CS50, og dette er i slutningen af ​​uge fire. 5 00:00:15,610 --> 00:00:19,420 Og et af de emner i dag er, at digitale retsvidenskab, 6 00:00:19,420 --> 00:00:20,989 kunsten at inddrive oplysninger. 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 lige nu Freds på Three og Breakout, i næste uge, 9 00:00:25,070 --> 00:00:27,880 vil fokus være på netop dette domæne. 10 00:00:27,880 --> 00:00:30,686 >> Så en af ​​de fedeste job, jeg nogensinde havde var tilbage i graduate skole, 11 00:00:30,686 --> 00:00:33,560 da jeg arbejdede for den lokale Middlesex County District Attorney 12 00:00:33,560 --> 00:00:34,950 kontor, laver retsvidenskab virker. 13 00:00:34,950 --> 00:00:37,450 Så det væsentlige, Massachusetts Statspolitiet lejlighedsvis 14 00:00:37,450 --> 00:00:40,100 ved arbejde på sager ville bringe i ting som harddiske 15 00:00:40,100 --> 00:00:42,185 og disketter og hukommelseskort og lignende. 16 00:00:42,185 --> 00:00:44,060 Og de ville udlevere dem til mig og min mentor, 17 00:00:44,060 --> 00:00:48,070 og vores mål var at finde beviser, hvis der var nogen, om disse medier. 18 00:00:48,070 --> 00:00:50,700 Nu har du måske set glimt af denne verden af ​​retsvidenskab 19 00:00:50,700 --> 00:00:53,000 i medierne, tv og film. 20 00:00:53,000 --> 00:00:55,730 Men jobbet havde jeg, og daresay denne 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 Lad os tage et kig på, hvad Du har sikkert set. 23 00:01:00,794 --> 00:01:01,460 [VIDEOAFSPILNING] 24 00:01:01,460 --> 00:01:02,930 -OK. 25 00:01:02,930 --> 00:01:05,380 Lad os nu få et godt kig på dig. 26 00:01:05,380 --> 00:01:06,850 >> [Musik spiller] 27 00:01:06,850 --> 00:01:12,260 28 00:01:12,260 --> 00:01:12,932 >> -Hold Det. 29 00:01:12,932 --> 00:01:13,657 Kør den tilbage. 30 00:01:13,657 --> 00:01:14,733 >> -Vent Et minut. 31 00:01:14,733 --> 00:01:15,233 Gå til højre. 32 00:01:15,233 --> 00:01:16,371 33 00:01:16,371 --> 00:01:16,870 -Der. 34 00:01:16,870 --> 00:01:17,369 Frys det. 35 00:01:17,369 --> 00:01:17,930 -Fuld Skærmen. 36 00:01:17,930 --> 00:01:18,376 >> -OK. 37 00:01:18,376 --> 00:01:18,875 Frys det. 38 00:01:18,875 --> 00:01:20,160 Stramme op op på dette, vil du? 39 00:01:20,160 --> 00:01:22,126 >> -Vector Ind på at fyr ved baghjulet. 40 00:01:22,126 --> 00:01:24,435 >> -Zoom I lige her på dette sted. 41 00:01:24,435 --> 00:01:28,580 >> -Med Det rigtige udstyr, den Billedet kan forstørres og slibes. 42 00:01:28,580 --> 00:01:29,330 >> Hvad 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 op nogen? 45 00:01:32,170 --> 00:01:33,070 >> Jeg ved det ikke. 46 00:01:33,070 --> 00:01:34,150 Lad os forbedre det. 47 00:01:34,150 --> 00:01:35,440 >> -Enhance Afsnit A6. 48 00:01:35,440 --> 00:01:36,570 49 00:01:36,570 --> 00:01:38,562 Jeg forbedrede detaljer, og-- 50 00:01:38,562 --> 00:01:40,020 Jeg tror, ​​der er nok til at forbedre. 51 00:01:40,020 --> 00:01:40,976 Slip det til min skærm. 52 00:01:40,976 --> 00:01:42,559 >> Jeg forbedret refleksion i hendes øjne. 53 00:01:42,559 --> 00:01:44,322 Lad os køre dette gennem video ekstraudstyr. 54 00:01:44,322 --> 00:01:45,210 >> -Edgar, Kan du forbedre dette? 55 00:01:45,210 --> 00:01:45,710 >> -Hang På. 56 00:01:45,710 --> 00:01:47,570 57 00:01:47,570 --> 00:01:49,458 >> -Jeg Har arbejdet på denne refleksion. 58 00:01:49,458 --> 00:01:50,402 >> -Der Er nogens refleksion. 59 00:01:50,402 --> 00:01:50,902 >> -Reflection. 60 00:01:50,902 --> 00:01:52,870 -Der Er en afspejling af mandens ansigt. 61 00:01:52,870 --> 00:01:53,694 >> -Den Refleksion! 62 00:01:53,694 --> 00:01:54,610 -Der Er en refleksion. 63 00:01:54,610 --> 00:01:55,880 -Zoom Ind på spejlet. 64 00:01:55,880 --> 00:01:57,860 Du kan se en refleksion. 65 00:01:57,860 --> 00:01:59,630 >> Kan du forbedre billedet fra her? 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 lige et sekund. 72 00:02:04,740 --> 00:02:05,281 Jeg vil forbedre. 73 00:02:05,281 --> 00:02:06,470 -Zoom I på døren. 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 -Flyt I. 77 00:02:08,509 --> 00:02:09,340 -Mere. 78 00:02:09,340 --> 00:02:10,094 Vent, stop. 79 00:02:10,094 --> 00:02:10,750 Hold op. 80 00:02:10,750 --> 00:02:11,250 -Pause Det. 81 00:02:11,250 --> 00:02:13,542 -Rotate Os 75 grader rundt om den lodrette, tak. 82 00:02:13,542 --> 00:02:14,750 83 00:02:14,750 --> 00:02:16,127 >> Hold op. 84 00:02:16,127 --> 00:02:19,330 Gå tilbage til den del om døren igen. 85 00:02:19,330 --> 00:02:21,420 >> -Har Et billede forstærker, der kan bitmap? 86 00:02:21,420 --> 00:02:24,420 >> Måske kan vi bruge Pradeep Singh metode til at se ind i vinduerne. 87 00:02:24,420 --> 00:02:25,902 >> -Den Software er state of the art. 88 00:02:25,902 --> 00:02:26,866 >> -Den Egenværdi er slukket. 89 00:02:26,866 --> 00:02:29,758 >> -Med Højre kombination af algorithms-- 90 00:02:29,758 --> 00:02:32,168 >> Han er taget belysning algoritmer til det næste niveau, 91 00:02:32,168 --> 00:02:34,110 og jeg kan bruge dem til forbedre dette fotografi. 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 forbedre. 97 00:02:40,070 --> 00:02:43,420 [END VIDEO PLAYBACK] 98 00:02:43,420 --> 00:02:45,830 David J. MALAN: Så dem er alle ord, men de var ikke 99 00:02:45,830 --> 00:02:47,870 anvendes i sætninger korrekt. 100 00:02:47,870 --> 00:02:52,370 Og faktisk i fremtiden, når som helst, venligst, du hører nogen sige ordet, 101 00:02:52,370 --> 00:02:54,250 "Forbedre", klukle bare en lille smule. 102 00:02:54,250 --> 00:02:57,190 Fordi når du forsøger at forbedre, for eksempel, det er hvad der sker. 103 00:02:57,190 --> 00:02:58,580 >> Så her er en smuk foto. 104 00:02:58,580 --> 00:02:59,720 Dette er CS50 egen Daven. 105 00:02:59,720 --> 00:03:03,740 Og formoder, at vi ønskede at fokusere på det glimt i øjet, 106 00:03:03,740 --> 00:03:05,870 eller refleksion af skurken, der var klart 107 00:03:05,870 --> 00:03:07,820 fanget af den sikkerhed kamera. 108 00:03:07,820 --> 00:03:10,330 Dette er, hvad der sker, når du zoomer ind på et billede, 109 00:03:10,330 --> 00:03:14,060 har kun et begrænset antal af bits, der er forbundet med det. 110 00:03:14,060 --> 00:03:15,420 >> Det er, hvad du ville få. 111 00:03:15,420 --> 00:03:19,190 Og ja, i Daven øje er men fire, måske seks pixels 112 00:03:19,190 --> 00:03:22,110 at komponere præcis hvad var glimtende der. 113 00:03:22,110 --> 00:03:25,890 Så Problem opstillet fire i sidste ende vil have du udforske denne verden, især 114 00:03:25,890 --> 00:03:28,090 af arten af ​​noget vi kalder fil I / O, hvor 115 00:03:28,090 --> 00:03:31,000 I / O er bare en fancy måde siger input og output. 116 00:03:31,000 --> 00:03:34,280 >> Så hidtil alle interaktioner vi har haft med en computer 117 00:03:34,280 --> 00:03:36,770 har været stort set med din tastatur og skærm, 118 00:03:36,770 --> 00:03:40,770 men ikke så meget med harddisken eller gemme filer ud over dem, du 119 00:03:40,770 --> 00:03:41,620 selv skrive. 120 00:03:41,620 --> 00:03:44,570 Dine programmer hidtil har ikke været at skabe og gemme, 121 00:03:44,570 --> 00:03:46,270 og ajourføring af deres egne filer. 122 00:03:46,270 --> 00:03:47,150 >> Nå, hvad er en fil? 123 00:03:47,150 --> 00:03:48,105 Nå, noget som en JPEG. 124 00:03:48,105 --> 00:03:50,520 Dette er et billede, som du måske har eller uploade til Facebook, 125 00:03:50,520 --> 00:03:51,690 eller se overalt på nettet. 126 00:03:51,690 --> 00:03:54,460 Ja, det foto vi bare sav af Daven var en JPEG. 127 00:03:54,460 --> 00:03:57,570 Og hvad er interessant om filer som JPEG 128 00:03:57,570 --> 00:04:02,170 er, at de kan identificeres, typisk ved visse bitmønstre. 129 00:04:02,170 --> 00:04:05,200 >> Med andre ord, hvad er det, adskiller 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 Tja, det er bare anderledes bitmønstre. 132 00:04:09,900 --> 00:04:12,820 Og de forskellige mønstre er normalt ved starten af ​​disse filer. 133 00:04:12,820 --> 00:04:18,200 >> Så når computeren åbner et Word doc, eller når en computer åbner en JPEG, 134 00:04:18,200 --> 00:04:20,940 det ser typisk på første adskillige bits i filen. 135 00:04:20,940 --> 00:04:24,059 Og hvis det genkender et mønster, det siger, åh, det er et billede. 136 00:04:24,059 --> 00:04:25,850 Lad mig vise det til brugeren som en grafik. 137 00:04:25,850 --> 00:04:27,870 Eller, åh, det ligner et Word dok. 138 00:04:27,870 --> 00:04:30,480 Lad mig vise det til brugeren som et essay. 139 00:04:30,480 --> 00:04:33,020 >> Så for eksempel, JPEG, det viser sig, er 140 00:04:33,020 --> 00:04:35,460 temmelig sofistikeret under hætten. 141 00:04:35,460 --> 00:04:40,140 Men de første tre bytes i de fleste hver JPEG starte med disse tre numre. 142 00:04:40,140 --> 00:04:44,680 Så byte nul, en og to er i mest hver JPEG, 255, så antallet 143 00:04:44,680 --> 00:04:46,675 216, så antallet 255. 144 00:04:46,675 --> 00:04:48,990 >> Og hvad du vil være i stand at begynde at gøre i næste uge 145 00:04:48,990 --> 00:04:52,920 er faktisk stikke nedenunder hætten af ​​filer som JPEG 146 00:04:52,920 --> 00:04:57,210 og ligesom bitmap-filer, og se hvad der altid har været der så længe 147 00:04:57,210 --> 00:04:58,650 som du har brugt en computer. 148 00:04:58,650 --> 00:05:01,860 >> Men hvad er der er ikke typisk skrives som decimaltal som denne. 149 00:05:01,860 --> 00:05:04,620 Dataloger ikke tendens til at tale i decimal. 150 00:05:04,620 --> 00:05:06,139 De har ikke rigtig tale i binær. 151 00:05:06,139 --> 00:05:07,930 Typisk, når vi ønsker at udtrykke tal 152 00:05:07,930 --> 00:05:10,710 vi rent faktisk bruger hexadecimal, som du måske husker 153 00:05:10,710 --> 00:05:13,027 fra, siger, Problem Sæt En, der udfordrede 154 00:05:13,027 --> 00:05:14,610 du til at tænke på et andet system. 155 00:05:14,610 --> 00:05:17,170 >> Vi naturligvis er bekendt med decimal, nul til ni. 156 00:05:17,170 --> 00:05:18,215 Vi talte om binær. 157 00:05:18,215 --> 00:05:20,710 Og vi har ikke rigtig har at bruge så meget her 158 00:05:20,710 --> 00:05:22,470 på ud, fordi computere vil bruge den. 159 00:05:22,470 --> 00:05:24,900 Men programmører vil meget ofte, men ikke altid, 160 00:05:24,900 --> 00:05:29,360 bruge hexadecimal, som netop betyder du har 16 bogstaver i dit alfabet, 161 00:05:29,360 --> 00:05:31,330 i modsætning til to eller 10. 162 00:05:31,330 --> 00:05:34,530 >> Så hvordan kan du tælle til højere end ni i hexadecimal? 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, blot ved konvention. 164 00:05:41,120 --> 00:05:43,540 Men hvad er afgørende er, at hver af disse er et enkelt symbol. 165 00:05:43,540 --> 00:05:44,340 Der er ingen 10. 166 00:05:44,340 --> 00:05:48,400 Der er ingen 11, i sig selv, fordi hver af dine cifre, ligesom i decimal 167 00:05:48,400 --> 00:05:51,940 og ligesom i binær, bør kun være et enkelt tegn, efter sædvane. 168 00:05:51,940 --> 00:05:55,280 >> Så da er alfabetet vi til rådighed til hexadecimal. 169 00:05:55,280 --> 00:05:58,600 Så hvad gør en JPEG se ud, hvis du skulle skrive ud de første tre 170 00:05:58,600 --> 00:06:01,980 bytes ikke som decimal, men for eksempel som hexadecimal? 171 00:06:01,980 --> 00:06:03,640 Og hvorfor er hex selv alt det nyttigt? 172 00:06:03,640 --> 00:06:05,290 >> Tja, et hurtigt kig på et eksempel. 173 00:06:05,290 --> 00:06:09,030 Så hvis jeg skriver de bits, der repræsentere disse decimal numbers-- 174 00:06:09,030 --> 00:06:12,450 dette kan være lidt rusten nu fra et par uger tilbage, 175 00:06:12,450 --> 00:06:14,820 men den venstre og rigtige er temmelig let. 176 00:06:14,820 --> 00:06:17,990 255 var det største antal, vi kunne repræsentere med otte bits. 177 00:06:17,990 --> 00:06:18,820 Det var alle dem. 178 00:06:18,820 --> 00:06:21,320 Så den eneste, der er mildt interessant er den midterste. 179 00:06:21,320 --> 00:06:24,700 Og hvis du slags gøre ud matematik, vil du udlede, at, ja, 180 00:06:24,700 --> 00:06:27,949 dette mønster af en og nuller repræsenterer 216. 181 00:06:27,949 --> 00:06:30,240 Så lad os bare lægger for nu, at de er korrekte. 182 00:06:30,240 --> 00:06:31,730 Men hvorfor er det interessant? 183 00:06:31,730 --> 00:06:33,970 >> Tja, en byte, selvfølgelig, er otte bits. 184 00:06:33,970 --> 00:06:38,980 Og det viser sig, at hvis du tror af en byte som to stykker af fire bit, 185 00:06:38,980 --> 00:06:39,500 som denne. 186 00:06:39,500 --> 00:06:41,000 Lad mig lige tilføje noget plads. 187 00:06:41,000 --> 00:06:42,550 Så før, efter. 188 00:06:42,550 --> 00:06:46,520 Jeg har lige tilføjet nogle hvide rum til visualisering skyld her. 189 00:06:46,520 --> 00:06:51,840 Hvordan kan vi nu repræsenterer i, siger, hexadecimal hver quad af bits, 190 00:06:51,840 --> 00:06:52,880 hvert sæt af fire bit? 191 00:06:52,880 --> 00:06:56,420 >> Så for eksempel til venstre nu har vi 1111 i binær. 192 00:06:56,420 --> 00:07:00,420 Hvad er det tal i decimal, hvis du gør ud af matematik? 193 00:07:00,420 --> 00:07:03,780 Du har dem sted, det toere sted, det Fours sted, og ottere 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 gør otte plus fire plus to plus en, får vi 15. 197 00:07:08,340 --> 00:07:11,790 Så jeg kunne skrive ned 15 nedenfor 1111, men hele pointen her 198 00:07:11,790 --> 00:07:13,190 er hexadecimal, ikke decimal. 199 00:07:13,190 --> 00:07:17,310 Så i stedet for at skrive ned 15, 1-5, Jeg har tænkt mig at skrive, at i hex, 200 00:07:17,310 --> 00:07:22,311 som hvis du tænker tilbage, hvis du har nul gennem f, hvad der 15 kommer til at være? 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 sig det er f. 203 00:07:24,434 --> 00:07:29,140 Og du kan arbejde ud af ved at sige, Tja, hvis en er 10, så OK, f er 15. 204 00:07:29,140 --> 00:07:33,250 Så ja, vi kunne omskrive dette samme sæt af numre som f f. 205 00:07:33,250 --> 00:07:35,750 Og så hvis vi gør en smule matematik, vil vi udlede, at det er d. 206 00:07:35,750 --> 00:07:38,650 Otte er temmelig let, fordi vi har en i ottendedele sted. 207 00:07:38,650 --> 00:07:40,620 Og så har vi et par mere F F er. 208 00:07:40,620 --> 00:07:44,669 >> Så hvad mennesker har tendens til at gøre med konvention når de bruger hexadecimal er de bare 209 00:07:44,669 --> 00:07:47,710 skrive det lidt mere kortfattet, slippe af med de fleste af denne hvide rum. 210 00:07:47,710 --> 00:07:50,890 Og bare for at være super klar til læsere, at dette er hexadecimal, 211 00:07:50,890 --> 00:07:54,670 den simple konvention blandt mennesker er du skriver nul 212 00:07:54,670 --> 00:07:58,000 x, som ikke har nogen anden betydning end en visuel identifikation af, 213 00:07:58,000 --> 00:07:59,590 her kommer en hex nummer. 214 00:07:59,590 --> 00:08:04,210 >> Og så, du sætter de to cifre, f f i denne sag, så d et, så F F. 215 00:08:04,210 --> 00:08:06,700 Så lang historie kort, hexadecimal bare en tendens 216 00:08:06,700 --> 00:08:11,990 være nyttigt, fordi hver af dets cifre, nul gennem f receptioenen linjer 217 00:08:11,990 --> 00:08:13,880 med et mønster af fire bit. 218 00:08:13,880 --> 00:08:18,080 >> Så hvis du har to hexadecimale cifre, nul gennem F, igen og igen, 219 00:08:18,080 --> 00:08:20,256 der giver dig perfekt otte bits eller en byte. 220 00:08:20,256 --> 00:08:22,380 Så det er derfor, det har en tendens til være konventionelt nyttig. 221 00:08:22,380 --> 00:08:24,990 Der er ingen intellektuel indholdet virkelig ud over det, 222 00:08:24,990 --> 00:08:27,010 andet end den faktiske nytte. 223 00:08:27,010 --> 00:08:29,310 >> Nu JPEG er ikke den eneste filformater til grafik. 224 00:08:29,310 --> 00:08:33,230 Du husker muligvis, at der er filer som dette i verden, 225 00:08:33,230 --> 00:08:34,830 i det mindste fra et par år tilbage. 226 00:08:34,830 --> 00:08:37,580 >> Så det var faktisk installeret i Windows XP 227 00:08:37,580 --> 00:08:39,960 på millioner af pc'er i hele verden. 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 næste uge, betyder bare et mønster af prikker, 230 00:08:47,690 --> 00:08:51,710 pixel som de kaldes, et kort på bits, virkelig. 231 00:08:51,710 --> 00:08:55,160 >> Så hvad er interessant, selv om, om dette filformat, BMP, er 232 00:08:55,160 --> 00:08:58,590 at under kølerhjelmen, det har mere end blot tre bytes 233 00:08:58,590 --> 00:09:01,020 at sammensætte sin header så til at tale, de første par bites. 234 00:09:01,020 --> 00:09:03,330 Det faktisk ser lidt kompliceret ved første øjekast. 235 00:09:03,330 --> 00:09:04,704 Og du vil se dette i P sæt. 236 00:09:04,704 --> 00:09:06,810 Og få noget særligt ud af det nu 237 00:09:06,810 --> 00:09:10,720 er ikke så vigtig, som bare det faktum, at der ved begyndelsen af ​​hvert bitmap 238 00:09:10,720 --> 00:09:13,823 fil, en grafisk format, der er en hel masse tal. 239 00:09:13,823 --> 00:09:14,980 240 00:09:14,980 --> 00:09:16,720 >> Nu Microsoft, Forfatteren af ​​dette format, 241 00:09:16,720 --> 00:09:18,820 tendens til at kalde de tingene ikke int'er og tegn 242 00:09:18,820 --> 00:09:22,259 og flåd, men ord og d ord og længes og bytes. 243 00:09:22,259 --> 00:09:23,800 Så de er bare forskellige datatyper. 244 00:09:23,800 --> 00:09:25,170 De er forskellige navne for den samme ting. 245 00:09:25,170 --> 00:09:26,740 Men du vil se, at i P Angiv Four. 246 00:09:26,740 --> 00:09:31,450 >> Men dette er kun at sige, at hvis et menneske dobbelt-klikker nogle .BMP sagsakter om hans 247 00:09:31,450 --> 00:09:35,015 eller hendes harddisk, og et vindue åbnes op vise ham eller hende, at billedet 248 00:09:35,015 --> 00:09:38,500 der skete, fordi operativsystemet systemet formentlig bemærket ikke kun 249 00:09:38,500 --> 00:09:41,460 .bmp filtypenavnet i filnavnet, 250 00:09:41,460 --> 00:09:45,010 men også det faktum, at der er nogle konvention til mønster af bits 251 00:09:45,010 --> 00:09:47,490 i begyndelsen denne bitmap-fil. 252 00:09:47,490 --> 00:09:50,270 >> Men lad os nu fokusere på sådan en kompliceret fil, 253 00:09:50,270 --> 00:09:52,120 men i stedet på noget som dette. 254 00:09:52,120 --> 00:09:55,190 Antag her i gedit, jeg bare have begyndelsen 255 00:09:55,190 --> 00:09:57,070 af et program, der er ret simpelt. 256 00:09:57,070 --> 00:09:58,860 Jeg har fået nogle omfatter op toppen. 257 00:09:58,860 --> 00:10:02,120 Nu har jeg # include "structs.h", men Jeg vil vende tilbage til om et øjeblik. 258 00:10:02,120 --> 00:10:03,974 Men dette er nyttigt for nu. 259 00:10:03,974 --> 00:10:05,890 Så dette er et program det kommer til at gennemføre 260 00:10:05,890 --> 00:10:07,335 ligesom registratoren database. 261 00:10:07,335 --> 00:10:09,710 Så en database over studerende, og alle studerende i verden 262 00:10:09,710 --> 00:10:13,190 har et navn og et hus og sandsynligvis nogle andre ting, men vi vil holde det simpelt. 263 00:10:13,190 --> 00:10:15,140 Hver elev har et navn og et hus. 264 00:10:15,140 --> 00:10:17,700 >> Så hvis jeg ønskede at skrive en program, hvis formål i livet 265 00:10:17,700 --> 00:10:19,860 var bare for at skifte fra nul på op til tre, 266 00:10:19,860 --> 00:10:22,070 hvis der er tre studerende ved Harvard University. 267 00:10:22,070 --> 00:10:25,350 Og jeg ønsker blot at få hjælp getString, den enkelte studerendes navn og hus, 268 00:10:25,350 --> 00:10:26,600 og så bare printe dem ud. 269 00:10:26,600 --> 00:10:28,630 >> Det er lidt ligesom uge En, Uge to ting nu, 270 00:10:28,630 --> 00:10:30,810 hvor jeg bare vil have en til sløjfe eller noget lignende. 271 00:10:30,810 --> 00:10:34,500 Og jeg vil ringe til getString et par gange, og derefter udskrive f et par gange. 272 00:10:34,500 --> 00:10:37,340 Så hvordan kan jeg gøre dette, selv om, når både et navn og et hus 273 00:10:37,340 --> 00:10:39,070 er involveret til hver elev? 274 00:10:39,070 --> 00:10:42,830 >> Så min første indskydelse måske være at gøre noget som dette. 275 00:10:42,830 --> 00:10:49,620 Jeg kunne først sige, ja, giv mig, sige, en vifte af strenge kaldet navne. 276 00:10:49,620 --> 00:10:51,530 Og jeg vil ikke have en papirkopi tre her. 277 00:10:51,530 --> 00:10:53,064 Hvad ønsker jeg at sætte der? 278 00:10:53,064 --> 00:10:55,730 Så de studerende, fordi det er bare en konstant erklæret i toppen, 279 00:10:55,730 --> 00:10:57,860 bare så jeg ikke behøver at hardcode tre flere steder. 280 00:10:57,860 --> 00:11:00,859 På denne måde kan jeg ændre det ét sted, og det påvirker en ændring overalt. 281 00:11:00,859 --> 00:11:04,470 Og så kan jeg gøre streng huser studerende. 282 00:11:04,470 --> 00:11:10,250 >> Og nu, kan jeg gøre noget lignende for (int i = 0; i 00:11:14,390 Så jeg skriver hurtigt, men det er formentlig bekendt syntaks nu. 284 00:11:14,390 --> 00:11:17,030 >> Og nu, dette var mere for nylig. 285 00:11:17,030 --> 00:11:22,890 Hvis jeg ønsker at sætte i det i'te elevens navn, jeg tror, ​​jeg gør det. 286 00:11:22,890 --> 00:11:26,480 Og så ikke navne men huse beslag jeg. 287 00:11:26,480 --> 00:11:29,930 Jeg gør dette, getString, og lad mig gå tilbage og rette denne linje. 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 meget brugervenligt. 291 00:11:32,366 --> 00:11:33,890 Jeg har ikke fortalt brugeren, hvad de skal gøre. 292 00:11:33,890 --> 00:11:36,520 >> Men nu, hvis jeg også ville senere, lad os 293 00:11:36,520 --> 00:11:40,060 siger, udskrive disse ting out-- så TODO senere. 294 00:11:40,060 --> 00:11:42,330 Jeg har tænkt mig at gøre mere med denne-- dette velsagtens sige 295 00:11:42,330 --> 00:11:45,970 en korrekt gennemførelse af få navne og huse, tre 296 00:11:45,970 --> 00:11:48,870 af dem samlede antal af hver, fra en bruger. 297 00:11:48,870 --> 00:11:51,280 >> Men det er ikke meget godt design, ikke? 298 00:11:51,280 --> 00:11:55,220 Hvad hvis en studerende 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-mailadresse, 300 00:11:57,770 --> 00:12:00,280 og måske en hjemmeside, og måske en Twitter håndtag, 301 00:12:00,280 --> 00:12:03,730 og et antal andre detaljer forbundet med en studerende eller en person, 302 00:12:03,730 --> 00:12:04,610 mere generelt. 303 00:12:04,610 --> 00:12:07,720 Hvordan ville vi begynde at tilføje funktionalitet til dette program? 304 00:12:07,720 --> 00:12:14,080 >> Tja, jeg har lyst til den enkleste måde måske være at gøre noget lignende, lad os sige, 305 00:12:14,080 --> 00:12:16,490 int IDS studerende. 306 00:12:16,490 --> 00:12:18,380 Så jeg kan lægge alle deres id'er derinde. 307 00:12:18,380 --> 00:12:22,240 Og så, for noget ligesom telefonnumre, 308 00:12:22,240 --> 00:12:24,400 Jeg er ikke sikker på hvordan man repræsentere det bare endnu. 309 00:12:24,400 --> 00:12:30,280 Så lad os gå videre og bare kald dette twitters studerende, som 310 00:12:30,280 --> 00:12:33,550 er en smule mærkeligt, men-- og en masse flere felter. 311 00:12:33,550 --> 00:12:36,360 >> Jeg er begyndt at effektivt kopiere og indsætte her. 312 00:12:36,360 --> 00:12:39,416 Og det kommer til at vokse temmelig uhåndterlig temmelig hurtigt, ikke? 313 00:12:39,416 --> 00:12:42,290 Ville det ikke være rart, hvis der var i verden en datastruktur kendt 314 00:12:42,290 --> 00:12:45,600 ikke som en int eller en streng, men noget højere niveau, en abstraktion, så 315 00:12:45,600 --> 00:12:47,570 til at tale, kendt som en elev? 316 00:12:47,570 --> 00:12:50,220 C kom ikke med indbygget funktionalitet til studerende, 317 00:12:50,220 --> 00:12:52,260 men hvad hvis jeg ønskede at give det sådan? 318 00:12:52,260 --> 00:12:55,640 >> Tja, det viser sig, jeg har tænkt mig at åbne en fil kaldet structs.h her, 319 00:12:55,640 --> 00:12:57,090 og du kan gøre netop dette. 320 00:12:57,090 --> 00:12:58,290 Og vi vil begynde at gøre det nu. 321 00:12:58,290 --> 00:13:01,490 Og under kølerhjelmen af ​​P indstille tre, du allerede har gjort det nu. 322 00:13:01,490 --> 00:13:05,920 Der er ikke sådan noget som en g rect eller en g oval programmeringssproget C. 323 00:13:05,920 --> 00:13:10,570 >> Folk på Stanford gennemført dem datatyper ved hjælp af denne fremgangsmåde her, 324 00:13:10,570 --> 00:13:13,900 erklære deres egen nye data typer ved brug et nyt søgeord 325 00:13:13,900 --> 00:13:16,744 kaldet struct og en anden en kaldet typedef. 326 00:13:16,744 --> 00:13:19,660 Og faktisk, selvom syntaksen ser lidt anderledes ting 327 00:13:19,660 --> 00:13:23,550 vi har set før, i princip, det er super simpelt. 328 00:13:23,550 --> 00:13:25,297 >> Det betyder blot "definerer en type." 329 00:13:25,297 --> 00:13:27,255 Det kommer til at være en struktur og en struktur 330 00:13:27,255 --> 00:13:29,400 er ligesom en container for flere ting. 331 00:13:29,400 --> 00:13:31,780 Og denne struktur vil at have en streng kaldet navn, 332 00:13:31,780 --> 00:13:33,210 og en streng kaldet hus. 333 00:13:33,210 --> 00:13:37,520 Og lad os kalde, blot for nemheds skyld, hele denne datastruktur elev. 334 00:13:37,520 --> 00:13:40,320 >> Så det øjeblik du kommer til semikolon, har du nu 335 00:13:40,320 --> 00:13:43,280 oprettet din egen data type, der kaldes elev 336 00:13:43,280 --> 00:13:46,420 at nu står sammen med int, og flyde, og fjeldørred, og snor, 337 00:13:46,420 --> 00:13:50,270 og g rekt, og g ovale, og et antal af andre ting, folk har opfundet. 338 00:13:50,270 --> 00:13:53,340 >> Så hvad er nyttigt om dette nu er, at hvis jeg går tilbage 339 00:13:53,340 --> 00:13:57,430 at struct 0 og afslutte dette implementering, som jeg skrev 340 00:13:57,430 --> 00:14:02,080 i forvejen her bemærke, at alle af den uundgåelige messiness at 341 00:14:02,080 --> 00:14:05,490 var ved at starte sker som jeg har tilføjet telefonnumre og kvidrer, og alle 342 00:14:05,490 --> 00:14:07,370 disse andre ting til en elevs definition 343 00:14:07,370 --> 00:14:11,810 nu er det kortfattet indsvøbt som blot en vifte af studerende. 344 00:14:11,810 --> 00:14:15,500 >> Og hver af de studerende nu har flere ting inde i den. 345 00:14:15,500 --> 00:14:16,930 Så bare efterlader et spørgsmål. 346 00:14:16,930 --> 00:14:19,700 Hvordan får du ved navn, og huset, og id'et, 347 00:14:19,700 --> 00:14:21,640 og hvad der ellers er indersiden af ​​studerende? 348 00:14:21,640 --> 00:14:22,930 Super simpelt, så godt. 349 00:14:22,930 --> 00:14:25,730 Ny syntaks, men en simpel idé. 350 00:14:25,730 --> 00:14:29,239 >> Du skal blot indeks i array, som vi gjorde i sidste uge, og dette. 351 00:14:29,239 --> 00:14:31,030 Og hvad er klart nyt stykke syntaks? 352 00:14:31,030 --> 00:14:32,590 353 00:14:32,590 --> 00:14:35,880 Just., Som betyder "gå ind i struktur og få det felt, der kaldes 354 00:14:35,880 --> 00:14:39,030 navn, få det felt, der kaldes huset, få felt, der kaldes elev. " 355 00:14:39,030 --> 00:14:41,940 >> Så i P indstille tre, hvis du er arbejder stadig på det, 356 00:14:41,940 --> 00:14:44,020 og de fleste folk stadig er, indse, at når du 357 00:14:44,020 --> 00:14:46,130 begynde at bruge ting som g rects og G ovaler 358 00:14:46,130 --> 00:14:50,201 og andre ting, der ikke synes at kommer fra uge nul, en eller to, 359 00:14:50,201 --> 00:14:52,950 indse, at det er fordi Stanford erklæret nogle nye datatyper. 360 00:14:52,950 --> 00:14:56,160 >> Og ja, det er præcis, hvad vi vil gøre, så godt, i P Angiv Four, når 361 00:14:56,160 --> 00:14:59,880 vi begynder at beskæftige sig med ting såsom billeder, bitmaps og meget mere. 362 00:14:59,880 --> 00:15:02,882 Så det er bare en teaser og en mental model for, hvad der skal komme. 363 00:15:02,882 --> 00:15:04,590 Nu jeg tøvet lidt her til morgen. 364 00:15:04,590 --> 00:15:09,560 Jeg var slags nysgerrig efter at se, hvad Microsoft tapet faktisk 365 00:15:09,560 --> 00:15:10,310 ligner dag. 366 00:15:10,310 --> 00:15:15,200 Og det viser sig nogen i 2006 faktisk gik til næsten nøjagtigt 367 00:15:15,200 --> 00:15:19,210 det samme sted at fotografere i virkeligheden hvad ligner det i disse dage. 368 00:15:19,210 --> 00:15:21,380 Feltet er nu lidt tilgroet. 369 00:15:21,380 --> 00:15:24,850 >> Så taler nu billeder, lad os bringe tilbage Daven her 370 00:15:24,850 --> 00:15:26,890 på skærmen og Nicholas, og bare minde dig 371 00:15:26,890 --> 00:15:30,540 at hvis du gerne vil slutte sig til os til frokost denne fredag, leder til vores sædvanlige webadresse 372 00:15:30,540 --> 00:15:31,440 her. 373 00:15:31,440 --> 00:15:33,530 >> Så hvor vi forlade off på mandag? 374 00:15:33,530 --> 00:15:35,140 Vi introducerede dette problem, ikke? 375 00:15:35,140 --> 00:15:37,610 Dette var tilsyneladende en korrekt gennemførelse af swap, 376 00:15:37,610 --> 00:15:40,460 hvor du tager to int'er, en kaldes en, der hedder B, 377 00:15:40,460 --> 00:15:44,130 bytte dem, ligesom Laura gjorde her på scenen med mælk og vand, 378 00:15:44,130 --> 00:15:46,820 ved hjælp af en midlertidig variabel eller en tom kop, 379 00:15:46,820 --> 00:15:50,540 så vi kunne sætte bi en og en i B uden at gøre et rod af ting. 380 00:15:50,540 --> 00:15:51,560 Vi brugte en variabel. 381 00:15:51,560 --> 00:15:52,870 Det hedder temp. 382 00:15:52,870 --> 00:15:55,520 >> Men hvad var det grundlæggende Problemet med denne kode på mandag? 383 00:15:55,520 --> 00:15:57,700 384 00:15:57,700 --> 00:15:58,870 Hvad var problemet her? 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 >> PUBLIKUM: Det tager mere plads. 388 00:16:01,970 --> 00:16:04,719 >> David J. MALAN: Fylder mere rum, fordi jeg bruger 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 sandt, men jeg er vil sige det er OK. 391 00:16:07,300 --> 00:16:10,030 Det er kun 32 bits i grand arrangement med ting, så ikke en big deal. 392 00:16:10,030 --> 00:16:10,655 Andre tanker? 393 00:16:10,655 --> 00:16:12,572 Publikum: Den har kun swaps variabler lokalt. 394 00:16:12,572 --> 00:16:13,571 David J. MALAN: Præcis. 395 00:16:13,571 --> 00:16:15,090 Der byttes kun de variable lokalt. 396 00:16:15,090 --> 00:16:18,173 Fordi hver gang du kalder en function-- når jeg havde bakkerne fra Annenberg 397 00:16:18,173 --> 00:16:19,840 sidste gang, du har main på bunden. 398 00:16:19,840 --> 00:16:23,560 Så snart du kalder en funktion kaldet swap, er swap ikke får x og y, 399 00:16:23,560 --> 00:16:24,400 de oprindelige værdier. 400 00:16:24,400 --> 00:16:26,392 Hvad betyder swap get, vi påstår? 401 00:16:26,392 --> 00:16:27,100 Publikum: Kopier. 402 00:16:27,100 --> 00:16:28,090 David J. MALAN: Så kopier af dem. 403 00:16:28,090 --> 00:16:31,120 Så det bliver et og to, hvis du huske eksemplet fra sidste gang, 404 00:16:31,120 --> 00:16:34,730 men en kopi af en og to der med succes byttes. 405 00:16:34,730 --> 00:16:38,550 Men desværre i sidste ende, disse værdier er stadig de samme. 406 00:16:38,550 --> 00:16:41,880 Så vi kan se det med vores ny ven, forhåbentlig GDB, 407 00:16:41,880 --> 00:16:45,180 at du eller TFS og Ca s har været at vejlede dig i retning som følger. 408 00:16:45,180 --> 00:16:51,210 >> Så ingen swap tilbagekaldelse ser like-- lad os åbne op denne-- ligner dette. 409 00:16:51,210 --> 00:16:54,160 Vi initialiseret x til en, å til to. 410 00:16:54,160 --> 00:16:55,620 Havde en flok print F'er. 411 00:16:55,620 --> 00:16:58,080 Men så, opkaldstasten her var at bytte, som 412 00:16:58,080 --> 00:17:00,260 er præcis den kode, vi har lige set et øjeblik siden. 413 00:17:00,260 --> 00:17:03,180 Hvilket er korrekte på første øjekast, men funktionelt 414 00:17:03,180 --> 00:17:06,800 dette program ikke virker, fordi det ikke permanent bytte x og y. 415 00:17:06,800 --> 00:17:10,190 >> Så lad os se det, en hurtig varm heroppe med GDB, en ./noswap. 416 00:17:10,190 --> 00:17:11,867 417 00:17:11,867 --> 00:17:15,200 En flok af overvældende informationer, Jeg vil slippe af med Kontrol L for nu. 418 00:17:15,200 --> 00:17:17,516 Og nu, jeg har tænkt mig at gå videre og køre den. 419 00:17:17,516 --> 00:17:19,349 Og desværre, at var ikke så nyttig. 420 00:17:19,349 --> 00:17:22,355 Det løb programmet indersiden af ​​denne program kaldet GDB, en debugger, 421 00:17:22,355 --> 00:17:23,730 men det gjorde ikke lade mig stikke rundt. 422 00:17:23,730 --> 00:17:26,229 >> Så hvordan kan jeg faktisk holde pause udførelse indenfor dette program? 423 00:17:26,229 --> 00:17:27,410 424 00:17:27,410 --> 00:17:28,329 Så knække. 425 00:17:28,329 --> 00:17:32,340 Og jeg kunne bryde på enhver linienummer, en, 10, 15. 426 00:17:32,340 --> 00:17:35,530 Men jeg kan også bryde symbolsk ved at sige pause vigtigste. 427 00:17:35,530 --> 00:17:38,980 Og det kommer til at sætte en pause punkt, tilsyneladende på linje 16 i main. 428 00:17:38,980 --> 00:17:40,050 Og hvor er linje 16? 429 00:17:40,050 --> 00:17:42,960 Lad os gå op til koden og gå op til noswap. 430 00:17:42,960 --> 00:17:46,930 Og faktisk, linie 16 er den allerførste i programmet. 431 00:17:46,930 --> 00:17:52,130 >> Så nu, hvis jeg gå videre og type køre denne gang, Enter, det standsede. 432 00:17:52,130 --> 00:17:53,080 Så lad os stikke rundt. 433 00:17:53,080 --> 00:17:55,716 Udskriv x-- hvorfor er x nul? 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 avanceret brug af programmet. 437 00:17:59,725 --> 00:18:00,780 438 00:18:00,780 --> 00:18:03,140 Hvorfor er x nul i øjeblikket? 439 00:18:03,140 --> 00:18:03,640 Ja. 440 00:18:03,640 --> 00:18:07,061 >> PUBLIKUM: Det standsede lige før linie 16, faktisk ikke på linie 16. 441 00:18:07,061 --> 00:18:08,060 David J. MALAN: Præcis. 442 00:18:08,060 --> 00:18:11,630 GDB som standard er sat på pause udførelse lige før linie 16. 443 00:18:11,630 --> 00:18:14,820 Så det har ikke udført, betyder x er af en ukendt værdi. 444 00:18:14,820 --> 00:18:17,150 Og vi fik heldig, at det er noget rent lignende nul. 445 00:18:17,150 --> 00:18:20,310 Så nu, hvis jeg skriver næste, nu udføres 16. 446 00:18:20,310 --> 00:18:22,000 Det venter på mig at udføre 17. 447 00:18:22,000 --> 00:18:23,400 Lad mig gå videre og udskrive x. 448 00:18:23,400 --> 00:18:24,094 Det er en. 449 00:18:24,094 --> 00:18:25,260 Lad mig gå videre og udskrive y. 450 00:18:25,260 --> 00:18:26,176 Hvad skal jeg se nu? 451 00:18:26,176 --> 00:18:27,660 452 00:18:27,660 --> 00:18:28,560 >> Publikum: [uhørligt] 453 00:18:28,560 --> 00:18:29,165 >> David J. MALAN: Lidt højere. 454 00:18:29,165 --> 00:18:30,040 >> Publikum: [uhørligt] 455 00:18:30,040 --> 00:18:30,537 456 00:18:30,537 --> 00:18:32,120 David J. MALAN: Ikke helt enighed. 457 00:18:32,120 --> 00:18:34,760 Så ja, vi ser nogle skrald værdi. 458 00:18:34,760 --> 00:18:37,862 , Y er nu 134514064 der. 459 00:18:37,862 --> 00:18:39,320 Tja, det er bare nogle skrald værdi. 460 00:18:39,320 --> 00:18:41,350 Mit program bruger RAM til forskellige formål. 461 00:18:41,350 --> 00:18:42,350 Der er andre funktioner. 462 00:18:42,350 --> 00:18:44,040 Andre mennesker skrev inde i min computer. 463 00:18:44,040 --> 00:18:46,789 Så disse bit er blevet anvendt til andre værdier, og hvad jeg ser 464 00:18:46,789 --> 00:18:49,470 er resterne af nogle tidligere brug af denne hukommelse. 465 00:18:49,470 --> 00:18:53,350 >> Så nogen big deal, fordi så snart mens jeg skriver næste og derefter udskrive y, 466 00:18:53,350 --> 00:18:55,640 det er initialiseret til den værdi, som jeg ønsker. 467 00:18:55,640 --> 00:18:57,400 Så nu, lad os gå videre lidt hurtigere. 468 00:18:57,400 --> 00:18:58,540 N for næste. 469 00:18:58,540 --> 00:18:59,570 Lad os gøre det igen. 470 00:18:59,570 --> 00:19:00,530 Lad os gøre det igen. 471 00:19:00,530 --> 00:19:02,404 Men jeg ønsker ikke at ramme det her, fordi hvis jeg 472 00:19:02,404 --> 00:19:05,110 ønsker at se, hvad der foregår inde swap, hvad er kommandoen? 473 00:19:05,110 --> 00:19:05,520 >> Publikum: trin. 474 00:19:05,520 --> 00:19:06,436 >> David J. MALAN: trin. 475 00:19:06,436 --> 00:19:09,800 Så dette trin mig ind i en funktion, snarere end over den. 476 00:19:09,800 --> 00:19:12,270 Og nu, det er lidt kryptisk ærligt, men det er bare 477 00:19:12,270 --> 00:19:14,581 fortæller mig, jeg er på linje 33 nu. 478 00:19:14,581 --> 00:19:15,580 Og lad os gøre det igen. 479 00:19:15,580 --> 00:19:16,080 Udskriv temp. 480 00:19:16,080 --> 00:19:17,129 481 00:19:17,129 --> 00:19:20,170 Garbage værdi negativ på dette tidspunkt, men det er bare stadig en skraldespand værdi. 482 00:19:20,170 --> 00:19:22,810 Så lad os gøre næste, print temp. 483 00:19:22,810 --> 00:19:27,130 Det er initialiseret til 1, som var værdien af ​​x, alias en. 484 00:19:27,130 --> 00:19:29,110 >> Nu, hvor er vores et og X kommer fra? 485 00:19:29,110 --> 00:19:32,510 Nå, meddelelse i main, vi kaldte disse værdier x og y. 486 00:19:32,510 --> 00:19:34,740 Vi derefter passeret dem at 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å kunne bytte kalde dem x og y. 489 00:19:40,020 --> 00:19:42,630 Men for klarhed, er det kalde dem a og b. 490 00:19:42,630 --> 00:19:45,970 Men a og b skal nu være kopier af x og y, hhv. 491 00:19:45,970 --> 00:19:50,660 >> Så hvis jeg gå tilbage til GDB, temp er nu en og en er nu én. 492 00:19:50,660 --> 00:19:56,130 Men hvis jeg gøre næste, og nu gør print en har en allerede gået over. 493 00:19:56,130 --> 00:20:00,030 Mælken er blevet hældt ind i det tidligere appelsinjuice glas, eller omvendt. 494 00:20:00,030 --> 00:20:04,750 >> Og hvis jeg gøre næste gang, og nu hvis jeg udskrive som en tilregnelighed check, 495 00:20:04,750 --> 00:20:07,687 a er stadig to, men b er nu en. 496 00:20:07,687 --> 00:20:08,770 Helt ærligt, det er der stadig. 497 00:20:08,770 --> 00:20:10,670 Jeg er ligeglad med hvad temp er. 498 00:20:10,670 --> 00:20:16,850 Men så snart jeg nu skriver, lad os sige, fortsætte med at gå tilbage, nu er jeg i slutningen 499 00:20:16,850 --> 00:20:17,480 programmet. 500 00:20:17,480 --> 00:20:20,730 Og desværre er x stadig en og y er stadig to. 501 00:20:20,730 --> 00:20:22,272 >> Så hvad var nytten af ​​GDB der? 502 00:20:22,272 --> 00:20:23,980 Det hjalp mig ikke fastsætte problemet sig selv, 503 00:20:23,980 --> 00:20:26,265 men det forhåbentlig hjælpe mig forstå det ved at realisere 504 00:20:26,265 --> 00:20:30,000 at ja, min logik er ret, men min kode er i sidste ende ikke at have 505 00:20:30,000 --> 00:20:31,450 en permanent indvirkning. 506 00:20:31,450 --> 00:20:34,570 Så det er et problem, vi er vil nu løse dag. 507 00:20:34,570 --> 00:20:37,870 >> Men lad os komme der ved hjælp af 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 der findes i C. Det er 510 00:20:41,860 --> 00:20:44,750 været et synonym for nogle tid til noget andet, 511 00:20:44,750 --> 00:20:47,300 og vi kan afsløre, at som følger. 512 00:20:47,300 --> 00:20:53,282 >> Lad mig gå videre og åbne op et program kaldet sammenligne-0. 513 00:20:53,282 --> 00:20:56,240 Og i stedet for at skrive denne ene ud, vi vil begynde at gå gennem koden 514 00:20:56,240 --> 00:20:58,040 Jeg skrev allerede, men det er kun et par linjer. 515 00:20:58,040 --> 00:20:59,570 Så dette er sammenligne-0. 516 00:20:59,570 --> 00:21:02,380 Og den første ting jeg gør er at få en tekstlinje. 517 00:21:02,380 --> 00:21:05,610 >> Men bemærk, hvad jeg gør for første gang. 518 00:21:05,610 --> 00:21:07,910 Hvad er anderledes klart om linje 21? 519 00:21:07,910 --> 00:21:10,020 520 00:21:10,020 --> 00:21:11,402 Faktisk, vent et øjeblik. 521 00:21:11,402 --> 00:21:12,110 Dette er eksemplar to. 522 00:21:12,110 --> 00:21:13,568 Det er ikke engang det rigtige program. 523 00:21:13,568 --> 00:21:14,780 Okay, spoiler alarm. 524 00:21:14,780 --> 00:21:16,890 Okay, så pyt det. 525 00:21:16,890 --> 00:21:18,520 Det er svaret på en fremtidig spørgsmål. 526 00:21:18,520 --> 00:21:21,450 >> Her er sammenligne-0, og jeg er ved at få en tekstlinje. 527 00:21:21,450 --> 00:21:22,435 Programmets meget enklere. 528 00:21:22,435 --> 00:21:23,560 Så dette er ligetil. 529 00:21:23,560 --> 00:21:28,070 Det er ligesom uge One, Uge to ting i øjeblikket. string s = getString. 530 00:21:28,070 --> 00:21:29,700 Nu siger jeg det igen hernede. 531 00:21:29,700 --> 00:21:31,830 streng t = getString. 532 00:21:31,830 --> 00:21:35,300 Og så den sidste ting i denne program, som navnet antyder, 533 00:21:35,300 --> 00:21:37,090 er jeg har tænkt mig at prøve at sammenligne dem. 534 00:21:37,090 --> 00:21:40,709 >> Så hvis r den første streng, lig = t, så er jeg 535 00:21:40,709 --> 00:21:42,250 vil sige, at du skriver det samme. 536 00:21:42,250 --> 00:21:44,291 Else, vil jeg sige du skriver forskellige ting. 537 00:21:44,291 --> 00:21:45,880 Så lad os kompilere og køre dette program. 538 00:21:45,880 --> 00:21:48,481 Så gør sammenligne nul. 539 00:21:48,481 --> 00:21:48,980 Ser godt ud. 540 00:21:48,980 --> 00:21:50,490 Ingen kompilering fejl. 541 00:21:50,490 --> 00:21:52,386 >> Lad mig gå videre nu og skriv ./compare-0. 542 00:21:52,386 --> 00:21:55,230 543 00:21:55,230 --> 00:21:59,220 Lad mig gå videre og sige noget : Daven og noget: Rob. 544 00:21:59,220 --> 00:22:00,450 Og jeg skriver forskellige ting. 545 00:22:00,450 --> 00:22:01,250 Så langt, så godt. 546 00:22:01,250 --> 00:22:02,680 Programmet, synes at være korrekt. 547 00:22:02,680 --> 00:22:03,880 >> Men lad os køre det igen. 548 00:22:03,880 --> 00:22:05,800 Sig noget: Gabe. 549 00:22:05,800 --> 00:22:07,140 Sig noget: Gabe. 550 00:22:07,140 --> 00:22:08,520 551 00:22:08,520 --> 00:22:09,020 Okay. 552 00:22:09,020 --> 00:22:10,851 Måske ramte jeg mellemrumstasten eller noget funky. 553 00:22:10,851 --> 00:22:11,600 Lad os gøre det igen. 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 Forskellige ting. 559 00:22:17,330 --> 00:22:19,430 Så hvad sker der? 560 00:22:19,430 --> 00:22:23,200 >> Så vi har disse to linjer af kode getString bliver kaldt to gange. 561 00:22:23,200 --> 00:22:25,760 Og så er jeg simpelthen forsøger at sammenligne s og t. 562 00:22:25,760 --> 00:22:28,370 Men hvad der virkelig så sker der? 563 00:22:28,370 --> 00:22:31,180 Nå, min håndskrift er ved at slagte dette eksempel noget. 564 00:22:31,180 --> 00:22:34,630 Og lad os faktisk smide dette op herovre, så godt. 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 simpelthen den første interessant linje fra det pågældende program. 568 00:22:48,295 --> 00:22:49,920 569 00:22:49,920 --> 00:22:52,974 Men hvad i al denne tid har været foregår under kølerhjelmen? 570 00:22:52,974 --> 00:22:55,890 Nå, på venstre side er streng, der er en vis form for variabel, 571 00:22:55,890 --> 00:22:56,785 og det hedder sek. 572 00:22:56,785 --> 00:23:00,019 Så jeg ved, at dette er ved hjælp af hukommelsen, eller RAM i min computer eller anden måde. 573 00:23:00,019 --> 00:23:02,060 Så jeg har tænkt mig at abstrakt tegne det som en firkant. 574 00:23:02,060 --> 00:23:04,820 32 bit, viser det sig, men mere om det i fremtiden. 575 00:23:04,820 --> 00:23:06,410 Og så, hvad sker der her? 576 00:23:06,410 --> 00:23:08,700 >> Nå, getString tydeligvis får en streng fra brugeren. 577 00:23:08,700 --> 00:23:11,360 Og getString fik Zamyla eller Gabe eller Daven. 578 00:23:11,360 --> 00:23:14,640 Så lad os vælge den første af dem, der var Daven. 579 00:23:14,640 --> 00:23:19,174 Så effektivt, hvad getString fik mig i den første sag 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å, hvad der ellers gjorde det giver mig hemmeligt? 582 00:23:25,045 --> 00:23:25,920 Publikum: [uhørligt] 583 00:23:25,920 --> 00:23:28,720 David J. MALAN: Ja, den / 0 eller null-tegn. 584 00:23:28,720 --> 00:23:30,550 Så det faktisk gav mig en streng. 585 00:23:30,550 --> 00:23:34,550 Men vi allerede kender fra tidligere ser, at en streng er blot et array 586 00:23:34,550 --> 00:23:37,895 tegn, og det opsiges af denne særlige 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 sandt og dette er en firkant, 589 00:23:42,310 --> 00:23:44,160 dette er helt klart en meget større rektangel. 590 00:23:44,160 --> 00:23:46,830 Og ja, det er, Jeg hævder, kun 32 bit. 591 00:23:46,830 --> 00:23:49,500 Og det er klart mere end 32 bits, fordi det er sandsynligvis 592 00:23:49,500 --> 00:23:51,583 otte plus otte plus otte plus otte plus otte, 593 00:23:51,583 --> 00:23:53,320 bare på grund af bytes i ASCII. 594 00:23:53,320 --> 00:23:57,030 Hvordan dælen skal vi passe Daven ind i denne lille boks her? 595 00:23:57,030 --> 00:23:59,880 >> Nå, hvad getString faktisk gør? 596 00:23:59,880 --> 00:24:03,680 Nå, dette net her repræsenterer min computers hukommelse eller RAM. 597 00:24:03,680 --> 00:24:07,564 Så lad os vilkårligt sige, at hvis hver af disse repræsenterer en byte, 598 00:24:07,564 --> 00:24:09,730 så kan vi tænke på hver byte som havende en adresse, 599 00:24:09,730 --> 00:24:13,830 ligesom 33 Oxford Street, eller 34 Oxford Street, eller 35 Oxford Street. 600 00:24:13,830 --> 00:24:16,700 >> Så ligesom boliger har adresser og bygninger har adresser, 601 00:24:16,700 --> 00:24:19,810 så gør individuelle bytes hukommelse har adresser eller numre 602 00:24:19,810 --> 00:24:21,042 der entydigt identificere dem. 603 00:24:21,042 --> 00:24:22,000 Nu, dette er vilkårlig. 604 00:24:22,000 --> 00:24:25,370 Men for at holde det enkelt, jeg har tænkt mig at bruge hexadecimal blot ved konvention, 605 00:24:25,370 --> 00:24:28,200 men 0x betyder intet andet end "dette er hexadecimal." 606 00:24:28,200 --> 00:24:31,030 og jeg har tænkt mig at hævde, at "D" ender på Byte En i hukommelsen. 607 00:24:31,030 --> 00:24:34,210 >> Jeg fik intet andet der foregår i hukommelse, så Daven fik den første plet 608 00:24:34,210 --> 00:24:35,509 ved Byte One. 609 00:24:35,509 --> 00:24:36,800 Dette, så bliver 0x2. 610 00:24:36,800 --> 00:24:37,831 611 00:24:37,831 --> 00:24:38,705 Dette vil 0x3. 612 00:24:38,705 --> 00:24:39,840 613 00:24:39,840 --> 00:24:41,800 Dette vil være 0x4. 614 00:24:41,800 --> 00:24:43,025 Dette vil 0x5. 615 00:24:43,025 --> 00:24:44,025 Dette vil 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 begynder at tænke om, hvad computerens værk 618 00:24:48,290 --> 00:24:50,710 under kølerhjelmen, du kan begynde at udlede 619 00:24:50,710 --> 00:24:54,960 hvordan du, for nogle år siden, ville har gennemført C selv. 620 00:24:54,960 --> 00:24:58,360 Hvad er getString sandsynligvis returning-- fordi det 621 00:24:58,360 --> 00:25:00,946 føles ligesom det er ikke returnering Daven per se 622 00:25:00,946 --> 00:25:03,320 fordi han er sikkert ikke går at passe ind i denne lille box-- 623 00:25:03,320 --> 00:25:05,090 så hvad er getString sandsynligvis vende tilbage? 624 00:25:05,090 --> 00:25:07,958 625 00:25:07,958 --> 00:25:08,920 >> Publikum: [uhørligt] 626 00:25:08,920 --> 00:25:10,540 >> David J. MALAN: Placeringen af ​​Daven. 627 00:25:10,540 --> 00:25:12,770 Og det har gjort det siden Uge One. 628 00:25:12,770 --> 00:25:16,150 Hvad getString er virkelig returnering er ikke en streng, per se. 629 00:25:16,150 --> 00:25:17,780 Det er en af ​​de små hvide løgne. 630 00:25:17,780 --> 00:25:22,520 Det returnere adressen på den streng i hukommelsen, den unikke adresse. 631 00:25:22,520 --> 00:25:24,820 Daven lever på 33 Oxford Street. 632 00:25:24,820 --> 00:25:29,310 Men mere kortfattet, Gavin lever på 0x1, Address Number One. 633 00:25:29,310 --> 00:25:32,280 >> Så hvad bliver sat i dette lille boks så, at være klar, 634 00:25:32,280 --> 00:25:35,930 er bare adressen på denne streng. 635 00:25:35,930 --> 00:25:38,110 Så al den tid, dette har stået på. 636 00:25:38,110 --> 00:25:41,650 Men hvad det antyder nu er, at hvis alle S har 637 00:25:41,650 --> 00:25:44,710 er et tal inde i det, der er at stoppe dig, programmør, 638 00:25:44,710 --> 00:25:47,970 fra at lægge et vilkårligt antal i enhver variabel og bare hoppe 639 00:25:47,970 --> 00:25:49,080 til at luns af hukommelse? 640 00:25:49,080 --> 00:25:51,320 Og ja, vil vi se det er en trussel næste gang. 641 00:25:51,320 --> 00:25:53,500 >> Men for nu, det føles utilstrækkeligt. 642 00:25:53,500 --> 00:25:55,630 Hvis jeg siger, få mig en streng, du giver mig Daven. 643 00:25:55,630 --> 00:25:57,230 Men du behøver ikke rigtig give mig Daven. 644 00:25:57,230 --> 00:25:59,310 Alt hvad du giver mig, er Daven adresse. 645 00:25:59,310 --> 00:26:04,310 Hvordan kan jeg så vide med sikkerhed hvor Daven begynder og ends-- 646 00:26:04,310 --> 00:26:07,140 historien er ved at blive weird-- hvor Daven begynder og slutter, 647 00:26:07,140 --> 00:26:10,435 og derefter den næste streng i hukommelsen starter? 648 00:26:10,435 --> 00:26:11,520 649 00:26:11,520 --> 00:26:13,620 >> Tja, hvis du afleverer mig i begyndelsen af ​​Daven, 650 00:26:13,620 --> 00:26:17,230 væsentlige, hvordan kan jeg vide hvor afslutningen af ​​hans navn er? 651 00:26:17,230 --> 00:26:20,550 Denne særlige null-tegn, som er så meget desto vigtigere nu 652 00:26:20,550 --> 00:26:23,040 hvis strenge nedenunder hætte simpelthen identificeres 653 00:26:23,040 --> 00:26:25,820 unikt ved deres placering i hukommelsen. 654 00:26:25,820 --> 00:26:28,130 Så al den tid, der er hvad der er foregået på. 655 00:26:28,130 --> 00:26:32,470 >> Så når vi ser nu på koden her forklare 656 00:26:32,470 --> 00:26:35,790 hvis du ville fejlen i linje 26. 657 00:26:35,790 --> 00:26:39,560 Hvorfor er Zamyla og Zamyla anderledes? 658 00:26:39,560 --> 00:26:41,330 Hvorfor er Gabe og Gabe anderledes? 659 00:26:41,330 --> 00:26:42,154 Ja, i ryggen. 660 00:26:42,154 --> 00:26:43,390 >> AUDIENCE: De har forskellige adresser. 661 00:26:43,390 --> 00:26:45,931 >> David J. MALAN: Simpelthen fordi de har forskellige adresser. 662 00:26:45,931 --> 00:26:48,820 Fordi når du ringer getString igen, som jeg vil gøre hurtigt her, 663 00:26:48,820 --> 00:26:52,870 hvis dette er den anden linje, streng t, som jeg gjorde i dette program, 664 00:26:52,870 --> 00:26:55,030 lig et andet opkald til getString. 665 00:26:55,030 --> 00:26:56,370 666 00:26:56,370 --> 00:26:58,670 Næste gang jeg kalder GetString, jeg har tænkt mig 667 00:26:58,670 --> 00:27:00,190 at få en anden luns af hukommelse. 668 00:27:00,190 --> 00:27:02,220 >> GetString er tilladt at spørge operativsystemet 669 00:27:02,220 --> 00:27:03,800 system for mere og mere hukommelse. 670 00:27:03,800 --> 00:27:07,894 Det kommer ikke til at genbruge den samme seks bytes hver eneste gang. 671 00:27:07,894 --> 00:27:09,810 Det kommer til at få en ny bid af hukommelse, som 672 00:27:09,810 --> 00:27:12,780 betyder t kommer til at få en anden værdi herovre. 673 00:27:12,780 --> 00:27:15,380 >> Så når jeg gør s lig = t, du er ikke at sammenligne 674 00:27:15,380 --> 00:27:17,880 D mod dette og en imod dette og V imod dette. 675 00:27:17,880 --> 00:27:19,588 Du sammenligner dette imod dette, som 676 00:27:19,588 --> 00:27:24,020 helt ærligt er temmelig useful-- useless-- er temmelig ubrugelig, fordi der virkelig 677 00:27:24,020 --> 00:27:25,830 bekymrer hvor strengene er i hukommelsen? 678 00:27:25,830 --> 00:27:26,850 >> Og faktisk har vi ikke. 679 00:27:26,850 --> 00:27:28,980 Og vi kommer ikke til at starte særligt omsorgsfulde. 680 00:27:28,980 --> 00:27:34,180 Kun i det omfang, at fejl kan opstå og sikkerhedstrusler kan opstå vilje 681 00:27:34,180 --> 00:27:36,100 vi faktisk begynde at bekymre sig om dette. 682 00:27:36,100 --> 00:27:37,230 Så lad os løse dette problem. 683 00:27:37,230 --> 00:27:39,650 Slår ud, du ordne det super enkelt. 684 00:27:39,650 --> 00:27:42,600 >> Og lad os faktisk, før jeg afslører, at igen, hvad ville 685 00:27:42,600 --> 00:27:47,170 du gøre, hvis i en CS50 klasse, og du havde at implementere 686 00:27:47,170 --> 00:27:48,600 en sammenligning med to strenge. 687 00:27:48,600 --> 00:27:51,440 Du tydeligt kan ikke bare bruge s lig = t. 688 00:27:51,440 --> 00:27:54,090 Men bare logisk, hvordan vil du sammenligne denne streng 689 00:27:54,090 --> 00:27:56,370 mod denne streng ved hjælp af C-kode? 690 00:27:56,370 --> 00:27:56,880 Ja. 691 00:27:56,880 --> 00:27:58,780 >> Publikum: Bare gør det for-løkke [uhørligt] 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ørligt] 695 00:28:02,900 --> 00:28:03,310 David J. MALAN: Ja. 696 00:28:03,310 --> 00:28:05,390 Bare bruge en for-løkke eller en mens løkke eller hvad. 697 00:28:05,390 --> 00:28:08,710 Men bare anvende den grundlæggende idé, at hvis dette er et stykke af hukommelse eller et array 698 00:28:08,710 --> 00:28:11,590 og dette er, gentage over begge dele på samme tid. 699 00:28:11,590 --> 00:28:12,960 Og bare sammenligne bogstaver. 700 00:28:12,960 --> 00:28:14,260 >> Og du har fået til at være en lidt forsigtig, fordi du 701 00:28:14,260 --> 00:28:16,247 ønsker ikke en finger at snyde den anden 702 00:28:16,247 --> 00:28:18,080 fordi en streng er længere end den anden. 703 00:28:18,080 --> 00:28:21,380 Så du lyst til at kontrollere, om denne særlige værdi ultimo, null. 704 00:28:21,380 --> 00:28:24,017 Men det er virkelig, i den ende, så simpelt er det. 705 00:28:24,017 --> 00:28:26,100 Og helt ærligt, har vi ikke brug at genopfinde at hjulet. 706 00:28:26,100 --> 00:28:27,960 Her er Version Two. 707 00:28:27,960 --> 00:28:32,910 Og hvad jeg har tænkt mig at sige her, er, at stedet for at sammenligne s lig = t, 708 00:28:32,910 --> 00:28:38,964 Jeg stedet kommer til at sige, at hvis strengen sammenligning af filtre komma t er lig med = 0. 709 00:28:38,964 --> 00:28:40,130 Nu, hvad der er streng sammenligne? 710 00:28:40,130 --> 00:28:43,046 >> Det viser sig, det er en funktion, der kommer med C, hvis formål i livet 711 00:28:43,046 --> 00:28:44,650 er at sammenligne to strenge. 712 00:28:44,650 --> 00:28:48,300 Og rør sammenligne, hvis vi læser dens man side eller dokumentation eller CS50 713 00:28:48,300 --> 00:28:50,630 henvisning, vil det bare fortælle dig, at røre 714 00:28:50,630 --> 00:28:55,730 sammenligne udbyttet enten en negativ nummer eller et positivt tal eller nul, 715 00:28:55,730 --> 00:28:57,660 hvor nul betyder, at de er lige. 716 00:28:57,660 --> 00:28:58,570 >> Så bare formodninger. 717 00:28:58,570 --> 00:29:00,390 Hvad kan det betyde, hvis røre sammenligne afkast 718 00:29:00,390 --> 00:29:02,110 negativ værdi eller positiv værdi? 719 00:29:02,110 --> 00:29:02,785 720 00:29:02,785 --> 00:29:04,285 PUBLIKUM: Større end eller mindre end. 721 00:29:04,285 --> 00:29:05,570 David J. MALAN: Ja, større eller mindre end. 722 00:29:05,570 --> 00:29:08,640 Så hvis du ønsker at sortere en hel bundt af strenge i et dictionary-- 723 00:29:08,640 --> 00:29:12,975 som vi vil i sidste ende ned road-- perfekt funktion til at bruge potentielt 724 00:29:12,975 --> 00:29:15,850 fordi det kommer til at gøre det sammenligning af strenge for dig, og fortælle 725 00:29:15,850 --> 00:29:20,060 du gør en kommer før b, eller gør b kommer før en alfabetisk. 726 00:29:20,060 --> 00:29:21,490 Vi kan gøre netop det. 727 00:29:21,490 --> 00:29:23,620 >> Og bemærk, jeg gjorde en anden ting i dette eksempel. 728 00:29:23,620 --> 00:29:26,870 Hvad har ændret sig højere op i denne hovedfunktion? 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 hvide løgn. 732 00:29:31,150 --> 00:29:33,750 Alt dette tidspunkt, når du har blevet skriftligt streng, 733 00:29:33,750 --> 00:29:38,350 vi har været hemmeligt omskrivning streng som char * så klang faktisk 734 00:29:38,350 --> 00:29:39,270 forstår dig. 735 00:29:39,270 --> 00:29:42,450 >> Med andre ord, i CS50.h og da vi til sidst vil se, 736 00:29:42,450 --> 00:29:45,950 vi gjort et synonym kaldet streng det er det samme som char *. 737 00:29:45,950 --> 00:29:49,910 Og for nu, kun at vide *, I denne forbindelse, i det mindste 738 00:29:49,910 --> 00:29:51,286 betyder adressen. 739 00:29:51,286 --> 00:29:52,210 >> Adressen på hvad? 740 00:29:52,210 --> 00:29:56,390 Nå, det faktum, at jeg sagde char *, og ikke int * eller flyde * 741 00:29:56,390 --> 00:30:00,820 betyder, at char * er adressen på en char. 742 00:30:00,820 --> 00:30:06,770 Så denne lille boks her, alias streng, er virkelig af typen char *, 743 00:30:06,770 --> 00:30:10,490 der er simpelthen en fancy måde at sige, i denne boks vil gå en adresse. 744 00:30:10,490 --> 00:30:12,430 Og hvad betyder denne adresse refererer til? 745 00:30:12,430 --> 00:30:13,780 Tilsyneladende en char. 746 00:30:13,780 --> 00:30:16,410 >> Men vi kunne absolut har int * og andre ting. 747 00:30:16,410 --> 00:30:20,790 Men for nu, char * er virkelig den mest ligetil og en af ​​interesse. 748 00:30:20,790 --> 00:30:23,310 Så dette problem går at stige, selv om igen. 749 00:30:23,310 --> 00:30:24,830 >> Antag jeg åbner dette program. 750 00:30:24,830 --> 00:30:27,670 Lad os se, om vi nu kan forudsige hvad er der galt med denne kode. 751 00:30:27,670 --> 00:30:31,140 Så i dette program, kopi-0, er jeg kommer til at gå videre og igen kalder 752 00:30:31,140 --> 00:30:34,190 GetString og gemme værdien i sek. 753 00:30:34,190 --> 00:30:38,800 >> Og så, hvorfor jeg gør det, blot som en påmindelse fra uger tidligere? 754 00:30:38,800 --> 00:30:40,960 Vi sagde, at getString undertiden returnerer null. 755 00:30:40,960 --> 00:30:42,793 Hvad betyder det, hvis GetString returnerer null? 756 00:30:42,793 --> 00:30:45,040 757 00:30:45,040 --> 00:30:46,034 Noget gik galt. 758 00:30:46,034 --> 00:30:48,950 Det betyder formentlig strengen er for store, computerens hukommelse. 759 00:30:48,950 --> 00:30:51,724 Det sker super, super, super sjældent, men det kunne ske. 760 00:30:51,724 --> 00:30:53,890 Vi ønsker at tjekke for det, og det er alt, vi laver. 761 00:30:53,890 --> 00:30:57,910 >> Fordi vi vil se nu, hvis du ikke gør begynde at kontrollere sædvanligt for ting 762 00:30:57,910 --> 00:31:00,870 Ligesom null, kan du faktisk begynder at gå 763 00:31:00,870 --> 00:31:03,106 til adresser i hukommelsen, der er ugyldige. 764 00:31:03,106 --> 00:31:05,980 Og du kommer til at begynde at inducere flere og flere segmentfejl. 765 00:31:05,980 --> 00:31:08,360 Eller i en Mac eller en PC, bare forårsager en computer til at hænge 766 00:31:08,360 --> 00:31:10,340 eller et program til at fryse, potentielt. 767 00:31:10,340 --> 00:31:14,930 >> Så nu, jeg hævder i kopi-0.c, at jeg jeg kommer til at kopiere disse strenge ved hjælp 768 00:31:14,930 --> 00:31:15,685 af linje 28. 769 00:31:15,685 --> 00:31:16,850 770 00:31:16,850 --> 00:31:18,750 Og så jeg har tænkt mig krav nederst 771 00:31:18,750 --> 00:31:21,430 her, at jeg har tænkt mig at ændre en af ​​dem. 772 00:31:21,430 --> 00:31:22,330 >> Så bemærke dette. 773 00:31:22,330 --> 00:31:24,370 Jeg ringer vores gamle ven strlen. 774 00:31:24,370 --> 00:31:28,960 Og bare forklare på engelsk hvad denne linje 34 gør? 775 00:31:28,960 --> 00:31:32,480 Hvad betyder t beslag 0 repræsentere til venstre. 776 00:31:32,480 --> 00:31:32,980 Ja. 777 00:31:32,980 --> 00:31:34,339 >> Publikum: Første karakter t? 778 00:31:34,339 --> 00:31:35,880 David J. MALAN: Første karakter t. 779 00:31:35,880 --> 00:31:36,379 Det er det. 780 00:31:36,379 --> 00:31:40,024 Første karakter t, jeg vil at tildele det store udgave 781 00:31:40,024 --> 00:31:41,190 for det første tegn i t. 782 00:31:41,190 --> 00:31:43,200 Så dette er kapitalisere det første bogstav. 783 00:31:43,200 --> 00:31:46,340 Og så den allersidste ting jeg gør i dette program er jeg påstår her er 784 00:31:46,340 --> 00:31:50,340 originalen, s, og her er kopien, t. 785 00:31:50,340 --> 00:31:54,610 >> Men baseret på historien, vi bare fortalte om, hvad strenge virkelig er, 786 00:31:54,610 --> 00:31:57,520 hvad er linje 28 virkelig gør, og hvad der er 787 00:31:57,520 --> 00:31:59,405 den resulterende fejl går at være på skærmen? 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ørgsmål 28. 790 00:32:03,500 --> 00:32:09,040 Hvad der er streng t = s virkelig gø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 der giver mig en kasse her og en kasse her. 793 00:32:19,400 --> 00:32:25,530 Og formoder denne adresse er 0x, lad os sige, 50 denne gang, vilkårligt. 794 00:32:25,530 --> 00:32:28,847 Hvad betyder streng t = s gøre under kølerhjelmen? 795 00:32:28,847 --> 00:32:30,340 >> Publikum: [uhørligt] 796 00:32:30,340 --> 00:32:34,100 >> David J. MALAN: Den gemmer hukommelsen tage fat der, så 0x50 går der. 797 00:32:34,100 --> 00:32:37,980 Så hvis nu jeg går til den første tegn i t og store bogstaver det, 798 00:32:37,980 --> 00:32:39,535 hvad jeg reelt gør for at s? 799 00:32:39,535 --> 00:32:41,300 800 00:32:41,300 --> 00:32:43,450 Jeg er virkelig at gøre det samme, ikke? 801 00:32:43,450 --> 00:32:47,680 Fordi hvis Adresse 0x50-- og bare, jeg har ikke meget plads på tavlen her, 802 00:32:47,680 --> 00:32:51,750 men antager, at det er 0x50 hernede, et eller andet sted i min computers hukommelse. 803 00:32:51,750 --> 00:32:55,825 >> Og jeg har for eksempel Gabe med små bogstaver her, som denne. 804 00:32:55,825 --> 00:32:57,120 805 00:32:57,120 --> 00:33:01,980 Og jeg har sagt t beslag 0 bliver kapitaliseret. 806 00:33:01,980 --> 00:33:04,860 Nå, t beslag 0 er det første bogstav i t. 807 00:33:04,860 --> 00:33:07,840 Så lidt g vil bliver store G. Men problemet 808 00:33:07,840 --> 00:33:09,410 er, hvad betyder s også pege på? 809 00:33:09,410 --> 00:33:10,300 >> PUBLIKUM: Det samme. 810 00:33:10,300 --> 00:33:11,841 >> David J. MALAN: Det samme nøjagtige ting. 811 00:33:11,841 --> 00:33:16,342 Så en simpel forklaring måske selvom syntaksen er lidt underligt. 812 00:33:16,342 --> 00:33:17,050 Så lad os gøre dette. 813 00:33:17,050 --> 00:33:20,210 Lav kopi-0 og derefter ./copy-0. 814 00:33:20,210 --> 00:33:21,820 815 00:33:21,820 --> 00:33:24,110 Sig noget: Gabe. 816 00:33:24,110 --> 00:33:26,760 Og desværre, både af dem er nu blevet aktiveret, 817 00:33:26,760 --> 00:33:29,500 men for det underliggende grunden til, at vi er simpelthen 818 00:33:29,500 --> 00:33:32,350 behandler nu adresser. 819 00:33:32,350 --> 00:33:36,470 >> Så hvordan kan vi begynde at address-- ingen ordspil intended-- 820 00:33:36,470 --> 00:33:39,270 hvordan kan vi begynde at tage fat dette særlige problem? 821 00:33:39,270 --> 00:33:44,400 Tja, i copy1.c, går det at få lidt mere kompliceret. 822 00:33:44,400 --> 00:33:49,310 Men jeg vil hævde en konceptuelt enkel løsning. 823 00:33:49,310 --> 00:33:50,852 >> Så svært at få ved første øjekast. 824 00:33:50,852 --> 00:33:53,560 Ikke vil være let for den første gang du skriver det ud, måske, 825 00:33:53,560 --> 00:33:57,440 men hvis problemet er, at blot at gøre t = s bare 826 00:33:57,440 --> 00:33:59,694 kopier adressen, hvad igen, hvis jeg kan samle på dig, 827 00:33:59,694 --> 00:34:02,110 kommer til at være løsningen for rent faktisk at kopiere en streng? 828 00:34:02,110 --> 00:34:04,906 829 00:34:04,906 --> 00:34:06,770 >> PUBLIKUM: Vi vil sandsynligvis anvende en løkke igen. 830 00:34:06,770 --> 00:34:06,890 >> David J. MALAN: Ja. 831 00:34:06,890 --> 00:34:08,390 Så vi kommer til at bruge en løkke igen. 832 00:34:08,390 --> 00:34:11,800 Og fordi hvis vi ønsker at kopiere en streng er i en anden streng, 833 00:34:11,800 --> 00:34:14,120 vi sandsynligvis ønsker at gøre det tegn for tegn. 834 00:34:14,120 --> 00:34:17,199 Men problemet er, hvis dette er oprindeligt s, 835 00:34:17,199 --> 00:34:22,159 Nu er vi nødt til at starte eksplicit allokering af hukommelse for t. 836 00:34:22,159 --> 00:34:24,320 >> Med andre ord, lad os gentegne dette en sidste gang. 837 00:34:24,320 --> 00:34:28,659 Hvis dette er streng s = getString. 838 00:34:28,659 --> 00:34:30,956 839 00:34:30,956 --> 00:34:32,455 Og lad os sætte dette op her, så godt. 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å billedet for noget ligesom det vil 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 lidt noget som dette. 847 00:34:48,960 --> 00:34:53,650 Og s derfor, vi kalder det 0x50, og det kommer til at 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å gør jeg streng t. 851 00:34:59,690 --> 00:35:02,450 I hukommelsen, er det bare at gå til give mig en lille firkant som denne. 852 00:35:02,450 --> 00:35:04,080 Så hvad er den afgørende skridt nu? 853 00:35:04,080 --> 00:35:09,870 Hvis jeg ønsker at kopiere s mod t, hvad blank behøver vi at udfylde her? 854 00:35:09,870 --> 00:35:12,050 Eller hvad skal vi gøre på et højt niveau? 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 Nogen? 859 00:35:17,020 --> 00:35:17,690 Ja. 860 00:35:17,690 --> 00:35:19,214 >> PUBLIKUM: Vi er nødt til [uhørligt]. 861 00:35:19,214 --> 00:35:21,380 David J. MALAN: Ja, vi nødvendigt at udfylde dette felt tomt. 862 00:35:21,380 --> 00:35:24,340 Jeg kan ikke kopiere, og derefter kapitalisere Gabe navn 863 00:35:24,340 --> 00:35:28,120 indtil jeg spørger operativsystemet et andet stykke af hukommelse 864 00:35:28,120 --> 00:35:30,640 der er mindst lige så stor som originalen. 865 00:35:30,640 --> 00:35:32,130 Så det efterlader os med et spørgsmål. 866 00:35:32,130 --> 00:35:36,080 >> Hvordan kan jeg bede operativsystemet ikke bare for en enkelt lille pointer-- 867 00:35:36,080 --> 00:35:38,530 som det kaldes, en adresse, en pointer-- ikke 868 00:35:38,530 --> 00:35:40,980 for en simpel lille boks som dette kaldes en streng? 869 00:35:40,980 --> 00:35:44,200 Hvordan kan jeg bede operativsystemet system til en stor luns af hukommelse? 870 00:35:44,200 --> 00:35:48,430 Hidtil har jeg kun fået det tilbage indirekte ved at ringe getString. 871 00:35:48,430 --> 00:35:50,740 Så hvordan er getString selv at få sin hukommelse? 872 00:35:50,740 --> 00:35:53,430 >> Tja, det viser sig, at der er denne anden funktion her 873 00:35:53,430 --> 00:35:55,160 at vi nu vil begynde at bruge. 874 00:35:55,160 --> 00:35:59,780 Nu, dette ser langt mere kryptiske than-- og jeg er den eneste der kan se det-- 875 00:35:59,780 --> 00:36:03,150 denne linje ser langt mere kryptiske så bør det ved første øjekast. 876 00:36:03,150 --> 00:36:04,650 Men lad os drille det fra hinanden. 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, så lad os begynde at formulere ordentlige sætninger i teknisk jargon. 879 00:36:13,280 --> 00:36:19,757 Så dette er at tildele en variabel af typen char * kaldet t. 880 00:36:19,757 --> 00:36:21,090 Nu, hvad betyder det egentlig? 881 00:36:21,090 --> 00:36:23,881 >> Tja, det betyder, hvad skal jeg at sætte i denne variabel kaldet t? 882 00:36:23,881 --> 00:36:24,780 883 00:36:24,780 --> 00:36:26,402 En adresse på en char. 884 00:36:26,402 --> 00:36:28,360 Så det er bare enklere, mere rimelig måde 885 00:36:28,360 --> 00:36:29,930 beskrive den venstre side. 886 00:36:29,930 --> 00:36:32,890 Så det skaber denne boks her alene. 887 00:36:32,890 --> 00:36:34,760 Så den højre side, formodentlig vil 888 00:36:34,760 --> 00:36:37,170 at tildele at større luns af hukommelse hvordan? 889 00:36:37,170 --> 00:36:38,340 Så lad os drille det fra hinanden. 890 00:36:38,340 --> 00:36:41,131 >> Det overvældende ved første øjekast, men hvad der foregår inde i her? 891 00:36:41,131 --> 00:36:43,740 Først er der malloc, som er tilsyneladende vores nye ven, 892 00:36:43,740 --> 00:36:45,450 "Memory tildele". 893 00:36:45,450 --> 00:36:49,560 Så dette er argumentet væltes ind i det, så det er en temmelig stor argument. 894 00:36:49,560 --> 00:36:50,970 Så lad os drille det fra hinanden. 895 00:36:50,970 --> 00:36:53,410 >> strlen af ​​s, repræsenterer naturligvis det-- 896 00:36:53,410 --> 00:36:54,142 897 00:36:54,142 --> 00:36:55,600 PUBLIKUM: Antallet af tegn. 898 00:36:55,600 --> 00:36:56,710 David J. MALAN: Bare antal tegn i sek. 899 00:36:56,710 --> 00:36:59,040 Så længde er den oprindelige streng. 900 00:36:59,040 --> 00:37:00,350 So G-a-b-e. 901 00:37:00,350 --> 00:37:02,320 Så det er sandsynligvis fire i dette tilfælde. 902 00:37:02,320 --> 00:37:05,485 Hvorfor laver jeg en efter ringer strlen af ​​s? 903 00:37:05,485 --> 00:37:06,360 Publikum: [uhørligt] 904 00:37:06,360 --> 00:37:07,590 David J. MALAN: For det særlig null-tegn. 905 00:37:07,590 --> 00:37:11,260 Hvis du spørger mig, hvad er længden af Gabe navn, jeg vil sige fire. 906 00:37:11,260 --> 00:37:14,480 Under kølerhjelmen, selvom, jeg har brug for at femte byte for null-tegn. 907 00:37:14,480 --> 00:37:16,100 Så det er derfor jeg gør +1. 908 00:37:16,100 --> 00:37:21,730 >> Nu bare i tilfælde du kører dette program på en anden end computer, siger, 909 00:37:21,730 --> 00:37:24,610 det CS50 apparat, hvor størrelsen af ​​en char 910 00:37:24,610 --> 00:37:26,350 kan være anderledes fra min egen computer-- 911 00:37:26,350 --> 00:37:30,590 viser sig, at jeg kan kalde dette operatør sizeof, bare spørge computeren, 912 00:37:30,590 --> 00:37:32,870 hvad der er på størrelse med en char på denne computer? 913 00:37:32,870 --> 00:37:37,400 >> Og ved at multiplicere fem i dette eksempel af størrelsen af ​​et tegn, som 914 00:37:37,400 --> 00:37:40,440 på de fleste computere vil bare være én, malloc 915 00:37:40,440 --> 00:37:44,830 vil tildele for mig denne store luns af hukommelse herovre til højre. 916 00:37:44,830 --> 00:37:47,140 Og det kommer til at return-- det er en function-- så det er 917 00:37:47,140 --> 00:37:48,265 vil vende tilbage til mig hvad? 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 på hvad? 921 00:37:53,709 --> 00:37:55,250 Publikum: Af hukommelse det fordelt? 922 00:37:55,250 --> 00:37:56,450 David J. MALAN: Af de hukommelse det fordelt. 923 00:37:56,450 --> 00:37:59,189 Så jeg har ingen idé om, helt ærligt, hvor det kommer til at ende op. 924 00:37:59,189 --> 00:38:01,480 Jeg har tænkt mig at foreslå, at det kommer til at ende 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 andet sted end 0x50, 927 00:38:06,009 --> 00:38:08,800 fordi operativsystemet, hvad Windows og Mac OS gøre for mig, er 928 00:38:08,800 --> 00:38:11,230 sørg for, at det er at give mig forskellige bidder af RAM. 929 00:38:11,230 --> 00:38:14,210 >> Så dette er den værdi, hvor dette luns af hukommelse kan ende. 930 00:38:14,210 --> 00:38:16,060 Så dette er hvad ender i her, 0x88. 931 00:38:16,060 --> 00:38:17,480 932 00:38:17,480 --> 00:38:21,570 Så nu tydeligt, kan jeg forstå at dette ikke er det samme som det, 933 00:38:21,570 --> 00:38:23,960 fordi de peger på forskellige bidder af hukommelsen. 934 00:38:23,960 --> 00:38:29,980 Så hvis jeg nu faktisk ønsker at kopiere denne i, lad os gøre din foreslåede løsning. 935 00:38:29,980 --> 00:38:36,870 >> Lad os bare gå, skabe en for-løkke, og gøre t beslag jeg får s beslag jeg. 936 00:38:36,870 --> 00:38:39,760 Fordi nu kan jeg bruge dette array-lignende notation 937 00:38:39,760 --> 00:38:43,390 fordi selvom malloc meget generisk allokerer mig hukommelse, 938 00:38:43,390 --> 00:38:45,290 hukommelsen er kun tilgrænsende byte. 939 00:38:45,290 --> 00:38:47,240 Byte, byte, byte, ryg mod ryg mod ryg. 940 00:38:47,240 --> 00:38:50,030 >> Jeg kan helt sikkert som en programmør behandle det som en matrix, som 941 00:38:50,030 --> 00:38:55,090 betyder, at jeg kan bruge dette til sidst kender notation af blot nogle firkantede parenteser. 942 00:38:55,090 --> 00:38:56,462 943 00:38:56,462 --> 00:39:00,020 >> Så lad mig pause der, fordi dette er en masse på én gang, selv 944 00:39:00,020 --> 00:39:03,530 selvom den grundlæggende idé at opsummere er denne streng, al denne tid, 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åkaldt pointer, en adresse på en karakter, 947 00:39:10,150 --> 00:39:12,650 hvilket blot betyder, at det er et nummer at ved menneskelig konvention 948 00:39:12,650 --> 00:39:15,350 vi har en tendens til at skrive som 0x noget. 949 00:39:15,350 --> 00:39:18,590 >> Men det er bare et nummer, ligesom 33 Oxford Street, 950 00:39:18,590 --> 00:39:20,530 der sker for at 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ørgsmål omkring disse detaljer? 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 >> PUBLIKUM: Hvorfor skal vi kontrollere for t svarende til null? 956 00:39:28,530 --> 00:39:30,740 >> David J. MALAN: Hvorfor gør vi tjek for t svarende til null? 957 00:39:30,740 --> 00:39:33,250 Hvis vi læser documentation-- stor question-- til malloc, 958 00:39:33,250 --> 00:39:37,020 det vil sige i småt, undertiden malloc kunne returnere null, 959 00:39:37,020 --> 00:39:38,080 ligesom getString. 960 00:39:38,080 --> 00:39:41,820 Og ja, getString returnerer null hvis gengæld malloc returnerer null, 961 00:39:41,820 --> 00:39:43,130 fordi getString bruger malloc. 962 00:39:43,130 --> 00:39:46,400 >> Og det kan ske, hvis OS, Mac OS, Windows, uanset hvad, er simpelthen 963 00:39:46,400 --> 00:39:48,130 ud af hukommelse for dig. 964 00:39:48,130 --> 00:39:49,820 Så det er hvad der skete. 965 00:39:49,820 --> 00:39:52,910 >> Og lad mig afsløre en anden ting der kan bare blæse din hjerne 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 lad mig trække op samme for-løkke til kopiering, 968 00:39:59,770 --> 00:40:05,480 som for et øjeblik siden, husker var dette. t beslag jeg får s beslag jeg. 969 00:40:05,480 --> 00:40:06,740 >> Nice og brugervenligt. 970 00:40:06,740 --> 00:40:09,330 Føles Uge to igen. 971 00:40:09,330 --> 00:40:14,920 Men denne version kan faktisk være omskrives til dette, som ser kryptisk. 972 00:40:14,920 --> 00:40:18,280 Det er en teknik kaldet pointer aritmetik, adresse aritmetik. 973 00:40:18,280 --> 00:40:19,600 Men hvorfor gør dette arbejde? 974 00:40:19,600 --> 00:40:22,220 >> Nu irriterende, den forfattere C besluttet at anvende 975 00:40:22,220 --> 00:40:25,070 symbolet * til forskellige formål. 976 00:40:25,070 --> 00:40:29,020 Vi har set det brugt én gang allerede, char *, som betyder "giv mig en variabel 977 00:40:29,020 --> 00:40:31,210 der kommer til at indeholde adressen på en char. " 978 00:40:31,210 --> 00:40:33,990 Så char * i denne sammenhæng betyder "giv mig en variabel." 979 00:40:33,990 --> 00:40:40,050 >> Desværre, hvis du bruger * uden et ord foran det, ligesom char, 980 00:40:40,050 --> 00:40:41,905 det nu kaldes dereference operatør. 981 00:40:41,905 --> 00:40:43,530 Og vi vil se mere af denne inden længe. 982 00:40:43,530 --> 00:40:44,930 Men det betyder bare "derned." 983 00:40:44,930 --> 00:40:49,070 Det er ligesom at sige, hvis nogen rakte mig på et stykke papir "33 Oxford Street," 984 00:40:49,070 --> 00:40:53,830 hvis jeg gør "* 33 Oxford Street," det betyder "Gå ned vejen til CS bygningen." 985 00:40:53,830 --> 00:40:57,220 >> Så * bare betyder gå der, hvis der er ingen ord i det foran. 986 00:40:57,220 --> 00:40:59,100 Så hvad er t, for at være klar? 987 00:40:59,100 --> 00:41:03,250 t er adressen på chunk hukommelse, der blev givet tilbage til mig. 988 00:41:03,250 --> 00:41:06,650 s er adressen på det, for at være klar, i det eksempel, vi har diskuteret, 989 00:41:06,650 --> 00:41:07,500 af små bogstaver gabe? 990 00:41:07,500 --> 00:41:08,990 991 00:41:08,990 --> 00:41:10,005 s er adressen af-- 992 00:41:10,005 --> 00:41:11,585 993 00:41:11,585 --> 00:41:12,460 PUBLIKUM: Den streng. 994 00:41:12,460 --> 00:41:14,126 David J. MALAN: Af Gabe oprindelige navn. 995 00:41:14,126 --> 00:41:16,660 Så det er adressen på denne luns af hukommelse. 996 00:41:16,660 --> 00:41:22,220 Så hvis jeg siger t + Jeg-- i, varsel, er bare vores gamle ven. 997 00:41:22,220 --> 00:41:24,770 Det er bare et indeks variabel der er iteration fra nul på op 998 00:41:24,770 --> 00:41:26,960 til længden af ​​strengen s. 999 00:41:26,960 --> 00:41:30,367 Så det kommer til at være nul, så en, derefter to, så tre, så fire. 1000 00:41:30,367 --> 00:41:33,200 Så lad os samle disse nye Scratch-lignende puslespilsbrikker, hvis du vil, 1001 00:41:33,200 --> 00:41:36,140 selv om igen, syntaks er langt mere mystisk end Scratch. 1002 00:41:36,140 --> 00:41:39,522 Så t er en adresse + Jeg kommer til at give mig 1003 00:41:39,522 --> 00:41:42,480 et nummer, fordi disse er alle numre, som vi har været tegning som Hex. 1004 00:41:42,480 --> 00:41:43,560 Men de er bare tal. 1005 00:41:43,560 --> 00:41:49,960 >> Så hvis adressen på t vi sagde var 0x88, hvad er 0x88 plus nul. 1006 00:41:49,960 --> 00:41:51,564 1007 00:41:51,564 --> 00:41:53,980 Selv hvis du ikke er komfortabel med Hex endnu, tage et gæt. 1008 00:41:53,980 --> 00:41:54,410 >> PUBLIKUM: Den originale. 1009 00:41:54,410 --> 00:41:55,850 >> David J. MALAN: Stadig 0x88. 1010 00:41:55,850 --> 00:41:58,910 Så hvad betyder * 0x88 betyde? 1011 00:41:58,910 --> 00:42:02,670 Det betyder, "derned", hvilket betyder, effektivt, "sætte fingeren her." 1012 00:42:02,670 --> 00:42:06,930 Og nu på højre side af dette udtryk, * og derefter i Parens, 1013 00:42:06,930 --> 00:42:11,586 s + I betyder s, som er løse op her i den lille g. 1014 00:42:11,586 --> 00:42:16,220 r + 0 er naturligvis, s, uanset s er. 1015 00:42:16,220 --> 00:42:21,230 >> Så nu, det er * s, der ligesom * 33 Oxford Street betyder gå til adressen 1016 00:42:21,230 --> 00:42:22,010 sek. 1017 00:42:22,010 --> 00:42:24,170 Så her er denne finger, højre hånd. 1018 00:42:24,170 --> 00:42:26,050 Så hvad skal jeg til at kopiere ind i hvad? 1019 00:42:26,050 --> 00:42:30,260 De ting til højre, som er Gabe, lille g her, ind på her. 1020 00:42:30,260 --> 00:42:32,750 >> Og så effekten af ​​at første iteration af løkken, 1021 00:42:32,750 --> 00:42:36,200 som De foreslog, selvom det ser skøre mere kompliceret end noget 1022 00:42:36,200 --> 00:42:42,110 vi har set før, er blot at sige gå her og kopiere tegnet her. 1023 00:42:42,110 --> 00:42:44,700 Det er at give dig et kort til begge steder. 1024 00:42:44,700 --> 00:42:46,130 >> Og vi vil se langt mere af dette. 1025 00:42:46,130 --> 00:42:50,600 Men for nu, er håbet bare at indføre nogle af disse grundlæggende ideer. 1026 00:42:50,600 --> 00:42:53,550 Og ja, lad os se på en endelige program her, 1027 00:42:53,550 --> 00:42:57,480 og derefter lovede claymation, som vil gøre alt i orden. 1028 00:42:57,480 --> 00:42:57,980 Okay. 1029 00:42:57,980 --> 00:43:01,680 Så lad mig åbne up-- der vi gå. 1030 00:43:01,680 --> 00:43:02,850 1031 00:43:02,850 --> 00:43:05,440 Så lad mig-- vi vil komme tilbage til dette billede inden længe. 1032 00:43:05,440 --> 00:43:08,360 Lad mig åbne op denne sidste 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, der udretter 1035 00:43:12,710 --> 00:43:15,050 intet i livet, der gør følgende. 1036 00:43:15,050 --> 00:43:18,740 Det første erklærer to variabler, x og y, som ikke er tal denne gang, 1037 00:43:18,740 --> 00:43:19,240 per se. 1038 00:43:19,240 --> 00:43:20,448 De er ikke heltal, per se. 1039 00:43:20,448 --> 00:43:22,899 De er tilsyneladende int *. 1040 00:43:22,899 --> 00:43:25,690 Så bare nogen, hvad betyder det hvis din datatype, variablen, 1041 00:43:25,690 --> 00:43:26,860 er af typen int * stjerne? 1042 00:43:26,860 --> 00:43:30,240 Det er adressen på en int. 1043 00:43:30,240 --> 00:43:31,990 >> Så jeg har ingen idé om, hvor det er endnu. 1044 00:43:31,990 --> 00:43:35,150 Det betyder bare "sat i sidste ende, adressen på en int her. " 1045 00:43:35,150 --> 00:43:38,340 0x50, 0x88, hvor det er i hukommelse, en adresse vil der. 1046 00:43:38,340 --> 00:43:40,200 Og det er, hvad y er vil være, så godt. 1047 00:43:40,200 --> 00:43:44,920 >> Hvis jeg nu siger x = malloc (sizeof (int)), dette er en fancy måde at sige, 1048 00:43:44,920 --> 00:43:49,000 hey operativsystem via malloc, give mig nok hukommelse til størrelsen 1049 00:43:49,000 --> 00:43:52,370 af en int, hvilket formentlig kommer til at være 32 bit eller fire byte. 1050 00:43:52,370 --> 00:43:53,680 >> Så hvad betyder malloc tilbage? 1051 00:43:53,680 --> 00:43:55,250 Malloc returnerer en adresse. 1052 00:43:55,250 --> 00:43:57,020 Så hvad der kommer til at få gemt i x? 1053 00:43:57,020 --> 00:44:00,600 Adressen på chunk hukommelse, de fire bytes, at allokere 1054 00:44:00,600 --> 00:44:03,360 bare fundet til mig ved at spørge operativsystemet. 1055 00:44:03,360 --> 00:44:08,240 >> Nu mellemtiden, linie fire her, er * x = 42. 1056 00:44:08,240 --> 00:44:09,990 Bare for at være klar, hvad der foregår dernede? 1057 00:44:09,990 --> 00:44:11,530 På venstre side, * x. 1058 00:44:11,530 --> 00:44:13,610 det er ligesom * 33 Oxford Street. 1059 00:44:13,610 --> 00:44:15,523 Så * x betyder hvad? 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 adresse. 1062 00:44:17,908 --> 00:44:20,466 Hvor denne luns af hukommelse er, gå til den. 1063 00:44:20,466 --> 00:44:21,979 Og lægge, hvad der, naturligvis? 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 Okay, * 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 Sæt nummer 13 der, men hvad er y i øjeblikket? 1069 00:44:31,740 --> 00:44:33,172 1070 00:44:33,172 --> 00:44:34,630 PUBLIKUM: Der er ingen hukommelse for y. 1071 00:44:34,630 --> 00:44:35,710 David J. MALAN: Der er ingen hukommelse for y. 1072 00:44:35,710 --> 00:44:38,215 Så hvad gør y sandsynligvis indeholder, 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: Nogle skrald værdi. 1075 00:44:39,480 --> 00:44:41,320 Nu skrald værdi er stadig et tal. 1076 00:44:41,320 --> 00:44:43,160 Det kan stadig være forveksles med en adresse. 1077 00:44:43,160 --> 00:44:45,160 Det er som om nogen intim noget ned, 1078 00:44:45,160 --> 00:44:48,002 og jeg misfortolket det således, nogle bygning ned på gaden. 1079 00:44:48,002 --> 00:44:50,460 Og hvis du bare forsøger at gå ind i nogle bygning, du ikke ejer, 1080 00:44:50,460 --> 00:44:53,710 eller nogle luns af hukommelse, du ikke har været givet, måske dårlige ting ske. 1081 00:44:53,710 --> 00:44:57,740 Computer kan gå ned, eller en anden ubestemt adfærd kunne ske. 1082 00:44:57,740 --> 00:45:01,310 >> Så intro, så til Binky er dette. 1083 00:45:01,310 --> 00:45:04,290 Jeg husker stadig, 20 nogle ulige år senere, 1084 00:45:04,290 --> 00:45:07,200 hvor jeg var, da jeg endelig forstod pointere. 1085 00:45:07,200 --> 00:45:09,520 >> Hvilket vil sige, hvis du forlader her på tre minutter 1086 00:45:09,520 --> 00:45:12,170 og tror, ​​at jeg ikke forstå pegepinde, indser 1087 00:45:12,170 --> 00:45:14,410 Jeg har husket for 20 år for nogle vanvittige grund 1088 00:45:14,410 --> 00:45:17,140 hvornår og hvorfor det endelig sunket i, sidde med min undervisning 1089 00:45:17,140 --> 00:45:19,501 fyr, Nishat Mehta i bagsiden af ​​Eliot Dining Hall. 1090 00:45:19,501 --> 00:45:21,250 Nu har jeg husket dette fordi det var 1091 00:45:21,250 --> 00:45:23,920 et af de emner, jeg, i især kæmpet med. 1092 00:45:23,920 --> 00:45:26,470 Og så er det endelig klikkede, ligesom jeg tør sige en masse emner 1093 00:45:26,470 --> 00:45:27,460 til sidst vil. 1094 00:45:27,460 --> 00:45:32,590 Og nu, for at gøre det føle alle de gladere og desto mere overbevisende, 1095 00:45:32,590 --> 00:45:35,360 lad os tage et sidste kig i vores sidste tre minutter her på Binky, 1096 00:45:35,360 --> 00:45:37,675 fra vores ven, Nick Parlante fra Stanford. 1097 00:45:37,675 --> 00:45:38,910 1098 00:45:38,910 --> 00:45:41,580 >> [VIDEOAFSPILNING] 1099 00:45:41,580 --> 00:45:42,750 >> Hey, Binky. 1100 00:45:42,750 --> 00:45:43,500 Vågn op! 1101 00:45:43,500 --> 00:45:45,960 Det er tid til pointer sjov. 1102 00:45:45,960 --> 00:45:47,012 >> Hvad er det? 1103 00:45:47,012 --> 00:45:48,723 Lær om pointers? 1104 00:45:48,723 --> 00:45:50,580 Åh, goody! 1105 00:45:50,580 --> 00:45:53,563 >> Tja, komme i gang, jeg tror vi er vil få brug for et par pointers. 1106 00:45:53,563 --> 00:45:54,390 >> -OK. 1107 00:45:54,390 --> 00:45:57,930 Denne kode tildeler to pegepinde, der kan pege på heltal. 1108 00:45:57,930 --> 00:45:58,430 -OK. 1109 00:45:58,430 --> 00:46:02,140 Tja, jeg se de to pegepinde, men de synes ikke at være at pege på noget som helst. 1110 00:46:02,140 --> 00:46:02,980 >> Det er rigtigt. 1111 00:46:02,980 --> 00:46:05,100 Oprindeligt pointers peger ikke på noget. 1112 00:46:05,100 --> 00:46:08,030 De ting, de peger på kaldes pointees, og sætte dem op s 1113 00:46:08,030 --> 00:46:09,370 et separat trin. 1114 00:46:09,370 --> 00:46:10,220 >> Åh, højre, højre. 1115 00:46:10,220 --> 00:46:10,950 Jeg vidste det. 1116 00:46:10,950 --> 00:46:12,385 De pointees er adskilt. 1117 00:46:12,385 --> 00:46:14,315 Er, så hvordan kan du tildele 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 Nå, denne kode allokerer en ny heltal pointee, 1121 00:46:18,970 --> 00:46:20,950 og denne del er x til at pege på den. 1122 00:46:20,950 --> 00:46:22,050 1123 00:46:22,050 --> 00:46:23,230 >> Hey, det ser bedre ud. 1124 00:46:23,230 --> 00:46:25,060 Så gør det gøre noget. 1125 00:46:25,060 --> 00:46:25,990 >> -OK. 1126 00:46:25,990 --> 00:46:30,455 Jeg vil dereference markøren x til gemme nummeret 42 i sin pointee. 1127 00:46:30,455 --> 00:46:32,830 Til dette trick, vil jeg brug for min Magic Wand af dereferere. 1128 00:46:32,830 --> 00:46:34,130 1129 00:46:34,130 --> 00:46:36,080 >> -Din Magic Wand af dereferere? 1130 00:46:36,080 --> 00:46:37,357 1131 00:46:37,357 --> 00:46:38,190 At-- det er fantastisk. 1132 00:46:38,190 --> 00:46:39,340 1133 00:46:39,340 --> 00:46:41,080 >> Det her er hvad koden ser ud. 1134 00:46:41,080 --> 00:46:44,110 Jeg vil bare sat op til nummeret, og [POP] 1135 00:46:44,110 --> 00:46:44,700 >> Hey, se. 1136 00:46:44,700 --> 00:46:46,140 Der det går. 1137 00:46:46,140 --> 00:46:50,980 >> -Så Laver en dereference på x følger pilen for at få adgang til dens pointee. 1138 00:46:50,980 --> 00:46:53,160 I dette tilfælde, en butik 42 der. 1139 00:46:53,160 --> 00:46:57,710 Hey du prøve at bruge det til at gemme nummeret 13 gennem den anden pointer, 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 sæt op. 1142 00:47:03,270 --> 00:47:07,930 Og så tage den Wand af Dereferere og bare [BUZZ] 1143 00:47:07,930 --> 00:47:08,960 >> Åh! 1144 00:47:08,960 --> 00:47:09,500 >> Åh, hej! 1145 00:47:09,500 --> 00:47:11,090 Det virkede ikke. 1146 00:47:11,090 --> 00:47:15,630 Sige, Binky, tror jeg ikke dereferere y er en god idé, fordi du ved, 1147 00:47:15,630 --> 00:47:17,850 opsætning af pointee er et separat trin. 1148 00:47:17,850 --> 00:47:20,450 Og jeg tror ikke, vi nogensinde gjorde det. 1149 00:47:20,450 --> 00:47:21,480 >> Godt punkt. 1150 00:47:21,480 --> 00:47:21,980 Ja. 1151 00:47:21,980 --> 00:47:25,680 Vi tildelte markøren y, men vi aldrig sat den til at pege på en pointee. 1152 00:47:25,680 --> 00:47:27,190 1153 00:47:27,190 --> 00:47:28,616 >> -Meget Observant. 1154 00:47:28,616 --> 00:47:30,240 Hey, du ser godt ud der, Binky. 1155 00:47:30,240 --> 00:47:33,400 Kan du lave det, så y punkter til samme pointee som x? 1156 00:47:33,400 --> 00:47:34,000 >> -Selvfølgelig. 1157 00:47:34,000 --> 00:47:36,780 Jeg vil bruge min Magic Wand af Pointer Overdragelse. 1158 00:47:36,780 --> 00:47:38,740 >> -Er Det vil være et problem som før? 1159 00:47:38,740 --> 00:47:39,240 Nej. 1160 00:47:39,240 --> 00:47:40,660 Dette betyder ikke røre pointees. 1161 00:47:40,660 --> 00:47:44,450 Det ændrer bare en pointer til peger på det samme som en anden. 1162 00:47:44,450 --> 00:47:45,450 >> Åh, jeg ser. 1163 00:47:45,450 --> 00:47:48,200 Nu y peger på det samme sted som x. 1164 00:47:48,200 --> 00:47:48,910 Så vent. 1165 00:47:48,910 --> 00:47:49,950 Nu er y fast. 1166 00:47:49,950 --> 00:47:51,120 Det har en pointee. 1167 00:47:51,120 --> 00:47:54,510 Så du kan prøve Wand af Dereferere igen for at sende 13 over. 1168 00:47:54,510 --> 00:47:56,510 >> Æh, OK. 1169 00:47:56,510 --> 00:47:58,160 Her går det. [POP] 1170 00:47:58,160 --> 00:47:59,340 >> Hey, se der. 1171 00:47:59,340 --> 00:48:00,750 Nu dereferere værker på y. 1172 00:48:00,750 --> 00:48:04,991 Og fordi pointerne deler at en pointee de begge ser 13. 1173 00:48:04,991 --> 00:48:05,490 Ja. 1174 00:48:05,490 --> 00:48:06,870 Deling, uanset hvad. 1175 00:48:06,870 --> 00:48:08,820 Så skal vi til at skifte steder nu? 1176 00:48:08,820 --> 00:48:09,440 >> Åh, se. 1177 00:48:09,440 --> 00:48:10,830 Vi har ikke mere tid. 1178 00:48:10,830 --> 00:48:11,570 >> -But-- 1179 00:48:11,570 --> 00:48:13,530 >> Bare huske de tre pointer regler. 1180 00:48:13,530 --> 00:48:16,560 Number One, den grundlæggende struktur er, at du har en pegepind, 1181 00:48:16,560 --> 00:48:18,680 og den peger hen til en pointee. 1182 00:48:18,680 --> 00:48:20,640 Men markøren og pointee er adskilte, 1183 00:48:20,640 --> 00:48:22,610 og den fælles fejl er at oprette en pegepind, 1184 00:48:22,610 --> 00:48:25,000 men at glemme at give det en pointee. 1185 00:48:25,000 --> 00:48:28,170 >> Number Two, pegepind dereferere starter ved markøren 1186 00:48:28,170 --> 00:48:31,050 og følger sin pilen hen over at få adgang til sin pointee. 1187 00:48:31,050 --> 00:48:33,400 Som vi alle ved, er dette virker kun, hvis der er 1188 00:48:33,400 --> 00:48:36,270 en pointee, hvilken form for kommer tilbage til Regel nummer et. 1189 00:48:36,270 --> 00:48:39,000 >> Nummer tre, pegepind Opgaven har en pointer 1190 00:48:39,000 --> 00:48:42,320 og ændrer det til at pege på samme pointee som en anden pointer. 1191 00:48:42,320 --> 00:48:44,160 Så efter opgaven, de to pointere 1192 00:48:44,160 --> 00:48:45,910 vil pege på samme pointee. 1193 00:48:45,910 --> 00:48:47,990 Nogle gange, er der kaldte deling. 1194 00:48:47,990 --> 00:48:49,740 Og det er alt der er til det, virkelig. 1195 00:48:49,740 --> 00:48:50,277 Farvel nu. 1196 00:48:50,277 --> 00:48:51,110 [END VIDEO PLAYBACK] 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 dig i næste uge. 1199 00:48:55,110 --> 00:48:56,064