1 00:00:00,000 --> 00:00:01,110 >> [MUSIK SPELA] 2 00:00:01,110 --> 00:00:10,567 3 00:00:10,567 --> 00:00:11,650 DAVID J. MALAN: Okej. 4 00:00:11,650 --> 00:00:15,610 Detta är CS50, och detta är slutet på vecka fyra. 5 00:00:15,610 --> 00:00:19,420 Och ett av ämnena i dag är det av digital kriminalteknik, 6 00:00:19,420 --> 00:00:20,989 konsten att återvinna information. 7 00:00:20,989 --> 00:00:22,780 Och faktiskt, även om du är mitt 8 00:00:22,780 --> 00:00:25,070 just nu om fred på tre och Breakout, nästa vecka, 9 00:00:25,070 --> 00:00:27,880 Man kommer att fokusera på just detta område. 10 00:00:27,880 --> 00:00:30,686 >> Så en av de coolaste jobb jag någonsin hade var tillbaka i forskarskolan, 11 00:00:30,686 --> 00:00:33,560 när jag arbetade för den lokala Middlesex County District Attorney: s 12 00:00:33,560 --> 00:00:34,950 kontor, gör kriminalteknik fungerar. 13 00:00:34,950 --> 00:00:37,450 Så i huvudsak, Massachusetts Statliga polisen, ibland, 14 00:00:37,450 --> 00:00:40,100 när du arbetar med ärenden skulle ta in saker som hårddiskar 15 00:00:40,100 --> 00:00:42,185 och disketter och minneskort och liknande. 16 00:00:42,185 --> 00:00:44,060 Och de skulle lämna dem till mig och min mentor, 17 00:00:44,060 --> 00:00:48,070 och vårt mål var att hitta bevis, om det fanns någon på dessa medier. 18 00:00:48,070 --> 00:00:50,700 Nu kanske du har sett glimtar i denna värld av kriminalteknik 19 00:00:50,700 --> 00:00:53,000 i media, tv och film. 20 00:00:53,000 --> 00:00:55,730 Men det jobb jag hade, och daresay den världen, 21 00:00:55,730 --> 00:00:57,550 inte riktigt som du skulle se den. 22 00:00:57,550 --> 00:01:00,794 Låt oss ta en titt på vad Du har säkert sett. 23 00:01:00,794 --> 00:01:01,460 [VIDEOAVSPELNING] 24 00:01:01,460 --> 00:01:02,930 -OK. 25 00:01:02,930 --> 00:01:05,380 Nu, låt oss få en bra titt på dig. 26 00:01:05,380 --> 00:01:06,850 >> [MUSIK SPELA] 27 00:01:06,850 --> 00:01:12,260 28 00:01:12,260 --> 00:01:12,932 >> -Vänta Den. 29 00:01:12,932 --> 00:01:13,657 Kör det tillbaka. 30 00:01:13,657 --> 00:01:14,733 >> -Vänta. 31 00:01:14,733 --> 00:01:15,233 Gå höger. 32 00:01:15,233 --> 00:01:16,371 33 00:01:16,371 --> 00:01:16,870 -Där. 34 00:01:16,870 --> 00:01:17,369 Frysa det. 35 00:01:17,369 --> 00:01:17,930 -Full Skärmen. 36 00:01:17,930 --> 00:01:18,376 >> -OK. 37 00:01:18,376 --> 00:01:18,875 Frysa det. 38 00:01:18,875 --> 00:01:20,160 -Tighten Upp på det, kommer du? 39 00:01:20,160 --> 00:01:22,126 >> -Vector In på att killen av bakhjulet. 40 00:01:22,126 --> 00:01:24,435 >> -ZOOM In just här på denna plats. 41 00:01:24,435 --> 00:01:28,580 >> -Med Rätt utrustning, det Bilden kan förstoras och skärpas. 42 00:01:28,580 --> 00:01:29,330 >> Vad är det? 43 00:01:29,330 --> 00:01:30,780 >> -Det Är ett Enhancement Program. 44 00:01:30,780 --> 00:01:32,170 >> Kan du klart att upp någon? 45 00:01:32,170 --> 00:01:33,070 >> Jag vet inte. 46 00:01:33,070 --> 00:01:34,150 Låt oss förbättra den. 47 00:01:34,150 --> 00:01:35,440 >> -Enhance Avsnitt A6. 48 00:01:35,440 --> 00:01:36,570 49 00:01:36,570 --> 00:01:38,562 Jag förbättrade detaljerna, och-- 50 00:01:38,562 --> 00:01:40,020 Jag tror att det finns tillräckligt för att förstärka. 51 00:01:40,020 --> 00:01:40,976 Släpp det till min skärm. 52 00:01:40,976 --> 00:01:42,559 >> Jag förbättrade reflektionen i ögat. 53 00:01:42,559 --> 00:01:44,322 -Låt Drivs detta genom videoförbättring. 54 00:01:44,322 --> 00:01:45,210 >> -Edgar Kan du förbättra detta? 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 >> -Jag Har arbetat med detta reflektion. 58 00:01:49,458 --> 00:01:50,402 >> -Det Finns någons reflektion. 59 00:01:50,402 --> 00:01:50,902 >> -Reflection. 60 00:01:50,902 --> 00:01:52,870 -Det Finns en återspegling av mannens ansikte. 61 00:01:52,870 --> 00:01:53,694 >> -The Reflektion! 62 00:01:53,694 --> 00:01:54,610 -Det Är en reflektion. 63 00:01:54,610 --> 00:01:55,880 -ZOOM I på spegeln. 64 00:01:55,880 --> 00:01:57,860 Du kan se en reflektion. 65 00:01:57,860 --> 00:01:59,630 >> Kan du förbättra bilden härifrån? 66 00:01:59,630 --> 00:02:00,377 67 00:02:00,377 --> 00:02:01,210 Kan du förbättra den? 68 00:02:01,210 --> 00:02:02,190 Kan du förbättra den? 69 00:02:02,190 --> 00:02:03,066 -Kan Vi förstärka denna? 70 00:02:03,066 --> 00:02:03,898 Kan du förbättra den? 71 00:02:03,898 --> 00:02:04,740 -Vänta En sekund. 72 00:02:04,740 --> 00:02:05,281 Jag ska öka. 73 00:02:05,281 --> 00:02:06,470 -ZOOM I på dörren. 74 00:02:06,470 --> 00:02:06,970 -Tider 10. 75 00:02:06,970 --> 00:02:08,009 -ZOOM. 76 00:02:08,009 --> 00:02:08,509 -Flytta I. 77 00:02:08,509 --> 00:02:09,340 -Mer. 78 00:02:09,340 --> 00:02:10,094 Vänta, sluta. 79 00:02:10,094 --> 00:02:10,750 Stopp. 80 00:02:10,750 --> 00:02:11,250 -Pause Den. 81 00:02:11,250 --> 00:02:13,542 -Rotate Oss 75 grader runt den vertikala, tack. 82 00:02:13,542 --> 00:02:14,750 83 00:02:14,750 --> 00:02:16,127 >> Stopp. 84 00:02:16,127 --> 00:02:19,330 Gå tillbaka till den del om dörren igen. 85 00:02:19,330 --> 00:02:21,420 >> -Har En bildförstärkare som kan bitmapp? 86 00:02:21,420 --> 00:02:24,420 >> -Kanske Vi kan använda Pradeep Singh metod för att se in i fönstren. 87 00:02:24,420 --> 00:02:25,902 >> -Den Programvara är state of the art. 88 00:02:25,902 --> 00:02:26,866 >> -The Egenvärde är av. 89 00:02:26,866 --> 00:02:29,758 >> -Med Höger kombination av algorithms-- 90 00:02:29,758 --> 00:02:32,168 >> -Han Taken belysning algoritmer till nästa nivå, 91 00:02:32,168 --> 00:02:34,110 och jag kan använda dem för att förstärka detta fotografi. 92 00:02:34,110 --> 00:02:36,840 >> -Lock På och förstora den z-axeln. 93 00:02:36,840 --> 00:02:37,351 >> -Enhance. 94 00:02:37,351 --> 00:02:37,850 Förbättra. 95 00:02:37,850 --> 00:02:38,720 -Enhance. 96 00:02:38,720 --> 00:02:40,070 -Freeze Och förbättra. 97 00:02:40,070 --> 00:02:43,420 [END VIDEOAVSPELNING] 98 00:02:43,420 --> 00:02:45,830 DAVID J. MALAN: Så de är alla ord, men de var inte 99 00:02:45,830 --> 00:02:47,870 används i meningar på rätt sätt. 100 00:02:47,870 --> 00:02:52,370 Och faktiskt i framtiden, helst snälla, hör du någon säga ordet, 101 00:02:52,370 --> 00:02:54,250 "Öka", skrocka bara lite. 102 00:02:54,250 --> 00:02:57,190 Därför att när du försöker förbättra, till exempel, är det vad som händer. 103 00:02:57,190 --> 00:02:58,580 >> Så här är en underbar bild. 104 00:02:58,580 --> 00:02:59,720 Detta är CS50 egen Daven. 105 00:02:59,720 --> 00:03:03,740 Och anta att vi ville fokusera på glimten i ögat, 106 00:03:03,740 --> 00:03:05,870 eller reflektion av skurk som var klart 107 00:03:05,870 --> 00:03:07,820 fångas av övervakningskamera. 108 00:03:07,820 --> 00:03:10,330 Detta är vad som händer när du zoomar in på en bild som 109 00:03:10,330 --> 00:03:14,060 har endast ett ändligt antal bitar som är förknippade med den. 110 00:03:14,060 --> 00:03:15,420 >> Det är vad du skulle få. 111 00:03:15,420 --> 00:03:19,190 Och faktiskt, i Daven öga är men fyra, kanske sex pixlar 112 00:03:19,190 --> 00:03:22,110 att komponera exakt vad var glimmande där. 113 00:03:22,110 --> 00:03:25,890 Så Problem Set Fyra i slutändan kommer att ha du utforska denna värld, i synnerhet 114 00:03:25,890 --> 00:03:28,090 som på grund av något vi kallar fil I / O, där 115 00:03:28,090 --> 00:03:31,000 i / o är bara ett finare sätt att säger ingång och utgång. 116 00:03:31,000 --> 00:03:34,280 >> Så hittills samtliga interaktioner Vi har haft med en dator 117 00:03:34,280 --> 00:03:36,770 har i stort sett med tangentbordet och skärmen, 118 00:03:36,770 --> 00:03:40,770 men inte så mycket med hårddisken, eller spara filer utöver de som du 119 00:03:40,770 --> 00:03:41,620 själv skriver. 120 00:03:41,620 --> 00:03:44,570 Dina program hittills har inte att skapa och spara, 121 00:03:44,570 --> 00:03:46,270 och uppdatera sina egna filer. 122 00:03:46,270 --> 00:03:47,150 >> Tja, vad är en fil? 123 00:03:47,150 --> 00:03:48,105 Tja, ungefär som en JPEG. 124 00:03:48,105 --> 00:03:50,520 Detta är en bild som du kanske har eller ladda upp till Facebook, 125 00:03:50,520 --> 00:03:51,690 eller se någonstans på webben. 126 00:03:51,690 --> 00:03:54,460 I själva verket, det fotot vi bara Sågen av Daven var en JPEG. 127 00:03:54,460 --> 00:03:57,570 Och vad som är intressant om filer som JPEG-bilder 128 00:03:57,570 --> 00:04:02,170 är att de kan identifieras, typiskt, genom vissa mönster av bitar. 129 00:04:02,170 --> 00:04:05,200 >> Med andra ord, vad är det som skiljer en JPEG från en GIF 130 00:04:05,200 --> 00:04:08,109 från en PING från ett Word dokument från en Excel-fil? 131 00:04:08,109 --> 00:04:09,900 Tja, det är bara annorlunda mönster av bitar. 132 00:04:09,900 --> 00:04:12,820 Och dessa olika mönster är vanligtvis i början av dessa filer. 133 00:04:12,820 --> 00:04:18,200 >> Så att när datorn öppnar ett Word doc eller när en dator öppnar en JPEG, 134 00:04:18,200 --> 00:04:20,940 det ser typiskt vid första flera bitar i filen. 135 00:04:20,940 --> 00:04:24,059 Och om den känner igen ett mönster, den säger, åh, det här är en bild. 136 00:04:24,059 --> 00:04:25,850 Låt mig visa det till användaren som grafik. 137 00:04:25,850 --> 00:04:27,870 Eller, åh, det här ser ut som ett Word-dokument. 138 00:04:27,870 --> 00:04:30,480 Låt mig visa det för användaren som en uppsats. 139 00:04:30,480 --> 00:04:33,020 >> Så till exempel JPEG, visar det sig, är 140 00:04:33,020 --> 00:04:35,460 ganska sofistikerad under huven. 141 00:04:35,460 --> 00:04:40,140 Men de tre första byte i mest varje JPEG börja med dessa tre nummer. 142 00:04:40,140 --> 00:04:44,680 Så byte noll, ett och två är i mest varje JPEG, 255, sedan antalet 143 00:04:44,680 --> 00:04:46,675 216, sedan antalet 255. 144 00:04:46,675 --> 00:04:48,990 >> Och vad kommer du att kunna att börja göra nästa vecka 145 00:04:48,990 --> 00:04:52,920 faktiskt peta nedanför huven på filer som JPEG-bilder 146 00:04:52,920 --> 00:04:57,210 och liksom bitmapp-filer, och ser vad alltid funnits där så länge 147 00:04:57,210 --> 00:04:58,650 som ni har varit med hjälp av en dator. 148 00:04:58,650 --> 00:05:01,860 >> Men vad är det inte normalt skriven som decimaltal som denna. 149 00:05:01,860 --> 00:05:04,620 Datavetare inte tenderar att tala i decimal. 150 00:05:04,620 --> 00:05:06,139 De inte riktigt tala i binärt. 151 00:05:06,139 --> 00:05:07,930 Typiskt, när vi vill att uttrycka siffror, 152 00:05:07,930 --> 00:05:10,710 vi faktiskt använder hexadecimal, som ni kanske minns 153 00:05:10,710 --> 00:05:13,027 från, säg, Problem Set En, som utmanade 154 00:05:13,027 --> 00:05:14,610 dig att tänka på ett annat system. 155 00:05:14,610 --> 00:05:17,170 >> Vi, naturligtvis, känner med decimal, noll till nio. 156 00:05:17,170 --> 00:05:18,215 Vi pratade om binärt. 157 00:05:18,215 --> 00:05:20,710 Och vi har egentligen inte att använda det mycket här 158 00:05:20,710 --> 00:05:22,470 på ut, eftersom datorer kommer att använda den. 159 00:05:22,470 --> 00:05:24,900 Men programmerare kommer mycket Ofta, men inte alltid, 160 00:05:24,900 --> 00:05:29,360 använder hexadecimal, som just innebär du har 16 bokstäver i ditt alfabet, 161 00:05:29,360 --> 00:05:31,330 i motsats till två eller 10. 162 00:05:31,330 --> 00:05:34,530 >> Så hur du räknar till högre än nio 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, bara genom konventionen. 164 00:05:41,120 --> 00:05:43,540 Men vad är nyckeln är att varje av dessa är en enda symbol. 165 00:05:43,540 --> 00:05:44,340 Det finns ingen 10. 166 00:05:44,340 --> 00:05:48,400 Det finns ingen 11, per se, eftersom varje av dina siffror, precis som i decimal 167 00:05:48,400 --> 00:05:51,940 och precis som i binär, bör bara vara en enda karaktär, enligt konvention. 168 00:05:51,940 --> 00:05:55,280 >> Så att då är alfabetet vi har till vårt förfogande för hexadecimal. 169 00:05:55,280 --> 00:05:58,600 Så vad gör en JPEG se ut om du skulle skriva ut dem första tre 170 00:05:58,600 --> 00:06:01,980 bytes inte som decimala men, exempelvis som hexadecimal? 171 00:06:01,980 --> 00:06:03,640 Och varför är hex ens allt det användbart? 172 00:06:03,640 --> 00:06:05,290 >> Tja, en snabb titt på ett exempel. 173 00:06:05,290 --> 00:06:09,030 Så om jag skriver ut de bitar som representera dessa decimal numbers-- 174 00:06:09,030 --> 00:06:12,450 detta kan vara lite rostig nu från ett par veckor tillbaka, 175 00:06:12,450 --> 00:06:14,820 men vänster en och rätta är ganska lätt. 176 00:06:14,820 --> 00:06:17,990 255 var det största antalet som vi kunde representera med åtta bitar. 177 00:06:17,990 --> 00:06:18,820 Det var alla ettor. 178 00:06:18,820 --> 00:06:21,320 Så det enda som är milt intressant är den i mitten. 179 00:06:21,320 --> 00:06:24,700 Och om du typ av gör ut math, kommer du dra slutsatsen att, ja, 180 00:06:24,700 --> 00:06:27,949 att mönstret av en och nollor representerar 216. 181 00:06:27,949 --> 00:06:30,240 Så låt oss bara föreskrivas för nu att dessa är korrekta. 182 00:06:30,240 --> 00:06:31,730 Men varför är detta intressant? 183 00:06:31,730 --> 00:06:33,970 >> Tja, ett byte, naturligtvis, är åtta bitar. 184 00:06:33,970 --> 00:06:38,980 Och det visar sig att om du tror av en byte som två bitar av fyra bitar, 185 00:06:38,980 --> 00:06:39,500 så här. 186 00:06:39,500 --> 00:06:41,000 Låt mig bara lägga till lite utrymme. 187 00:06:41,000 --> 00:06:42,550 Så innan, efter. 188 00:06:42,550 --> 00:06:46,520 Jag har precis lagt till några blank för visualisering skull här. 189 00:06:46,520 --> 00:06:51,840 Hur kan vi nu står i, säg, hexadecimal varje quad bitar, 190 00:06:51,840 --> 00:06:52,880 varje uppsättning av fyra bitar? 191 00:06:52,880 --> 00:06:56,420 >> Så till exempel, på den vänstra Nu har vi 1111 i binär. 192 00:06:56,420 --> 00:07:00,420 Vad är det numret i decimal, om du gör ut matten? 193 00:07:00,420 --> 00:07:03,780 Du har de plats, tvåor platsen, de fyra rum, och åttor platsen. 194 00:07:03,780 --> 00:07:04,341 >> PUBLIKEN: 15. 195 00:07:04,341 --> 00:07:05,340 DAVID J. MALAN: Det är 15. 196 00:07:05,340 --> 00:07:08,340 Så om vi gör åtta plus fyra plus två plus ett, får vi 15. 197 00:07:08,340 --> 00:07:11,790 Så jag skulle kunna skriva ner 15 nedan 1111, men hela poängen här 198 00:07:11,790 --> 00:07:13,190 är hexadecimal, inte decimal. 199 00:07:13,190 --> 00:07:17,310 Så istället för att skriva ner 15, 1-5, Jag kommer att skriva det i hex, 200 00:07:17,310 --> 00:07:22,311 som om du tänker tillbaka, om du har noll till f, det som 15 kommer att bli? 201 00:07:22,311 --> 00:07:22,810 PUBLIKEN: f. 202 00:07:22,810 --> 00:07:24,434 DAVID J. MALAN: Så det visar sig att det är f. 203 00:07:24,434 --> 00:07:29,140 Och du kan arbeta ut det genom att säga, Tja, om en är 10, så OK, f 15. 204 00:07:29,140 --> 00:07:33,250 Så ja, kan vi skriva denna samma uppsättning nummer som f f. 205 00:07:33,250 --> 00:07:35,750 Och om vi gör lite matte, vi dra slutsatsen att det är d. 206 00:07:35,750 --> 00:07:38,650 Åtta är ganska lätt, eftersom vi har en i åttor plats. 207 00:07:38,650 --> 00:07:40,620 Och sedan har vi ett par mer f f-talet. 208 00:07:40,620 --> 00:07:44,669 >> Så vad människor tenderar att göra av konvention när de använder hexadecimal är de bara 209 00:07:44,669 --> 00:07:47,710 skriver detta lite mer kortfattat, bli av de flesta som blank. 210 00:07:47,710 --> 00:07:50,890 Och bara för att vara super klart för läsare att detta är hexadecimal, 211 00:07:50,890 --> 00:07:54,670 den enkla konventionen bland människa är du skriver noll 212 00:07:54,670 --> 00:07:58,000 x, som inte har någon annan betydelse än en visuell identifierare, 213 00:07:58,000 --> 00:07:59,590 här kommer en hex nummer. 214 00:07:59,590 --> 00:08:04,210 >> Och sedan sätta dig de två siffrorna, f f i detta fall, då d en, sedan f f. 215 00:08:04,210 --> 00:08:06,700 Så lång historia kort, hexadecimalt bara tenderar 216 00:08:06,700 --> 00:08:11,990 för att vara användbar, eftersom var och en av dess siffror, noll genom f, perfekt linjer 217 00:08:11,990 --> 00:08:13,880 upp med ett mönster av fyra bitar. 218 00:08:13,880 --> 00:08:18,080 >> Så om du har två hexadecimala siffror, noll till F, och om igen, 219 00:08:18,080 --> 00:08:20,256 som ger dig perfekt åtta bitar eller en byte. 220 00:08:20,256 --> 00:08:22,380 Så det är därför den tenderar att vara konventionellt användbara. 221 00:08:22,380 --> 00:08:24,990 Det finns ingen intellektuell innehåll verkligen utöver det, 222 00:08:24,990 --> 00:08:27,010 annat än dess faktiska användbarhet. 223 00:08:27,010 --> 00:08:29,310 >> Nu JPEG är inte den enda filformat för grafik. 224 00:08:29,310 --> 00:08:33,230 Du kanske kommer ihåg att det finns filer så här i världen, 225 00:08:33,230 --> 00:08:34,830 åtminstone från ett par år tillbaka. 226 00:08:34,830 --> 00:08:37,580 >> Så detta var faktiskt installeras i Windows XP 227 00:08:37,580 --> 00:08:39,960 på miljontals datorer världen runt. 228 00:08:39,960 --> 00:08:43,000 Och detta var en bitmapp-fil, BMP. 229 00:08:43,000 --> 00:08:47,690 Och en bitmap-fil, som du ser bredvid vecka, betyder bara ett mönster av prickar, 230 00:08:47,690 --> 00:08:51,710 bildpunkter som de kallas, En karta i bitar, verkligen. 231 00:08:51,710 --> 00:08:55,160 >> Så vad är intressant, dock, om det här filformatet BMP är 232 00:08:55,160 --> 00:08:58,590 att under huven, det har mer än bara tre bytes 233 00:08:58,590 --> 00:09:01,020 att komponera sin header, så att tala, de första bites. 234 00:09:01,020 --> 00:09:03,330 Det ser faktiskt lite komplicerat vid första anblicken. 235 00:09:03,330 --> 00:09:04,704 Och du kommer att se detta i P set. 236 00:09:04,704 --> 00:09:06,810 Och få något särskilt ur detta nu 237 00:09:06,810 --> 00:09:10,720 är inte så viktigt, eftersom bara det faktum att i början av varje bitmap 238 00:09:10,720 --> 00:09:13,823 fil, ett grafiskt format, det finns en massa siffror. 239 00:09:13,823 --> 00:09:14,980 240 00:09:14,980 --> 00:09:16,720 >> Nu Microsoft, författare till detta format, 241 00:09:16,720 --> 00:09:18,820 tenderar att kalla dem saker inte Ints och tecken 242 00:09:18,820 --> 00:09:22,259 och flyter utan ord och d ord och längtar och bytes. 243 00:09:22,259 --> 00:09:23,800 Så de är bara olika datatyper. 244 00:09:23,800 --> 00:09:25,170 De är olika namn för samma sak. 245 00:09:25,170 --> 00:09:26,740 Men du kommer att se att i P Set Four. 246 00:09:26,740 --> 00:09:31,450 >> Men detta är bara för att säga att om en människa dubbelklickar vissa .BMP fil på hans 247 00:09:31,450 --> 00:09:35,015 eller hennes hårddisk, och ett fönster öppnas upp att visa honom eller henne den bilden, 248 00:09:35,015 --> 00:09:38,500 som hände eftersom operativsystemet systemet förmodligen märkte inte bara 249 00:09:38,500 --> 00:09:41,460 den BMP filändelsen i filnamnet, 250 00:09:41,460 --> 00:09:45,010 men också det faktum att det finns en del konvention till mönstret av bitar 251 00:09:45,010 --> 00:09:47,490 i början av denna bitmap-fil. 252 00:09:47,490 --> 00:09:50,270 >> Men låt oss nu fokusera på sådan komplicerad fil, 253 00:09:50,270 --> 00:09:52,120 utan i stället på något sånt här. 254 00:09:52,120 --> 00:09:55,190 Antag här i GEdit jag bara början 255 00:09:55,190 --> 00:09:57,070 av ett program som är ganska enkelt. 256 00:09:57,070 --> 00:09:58,860 Jag har lite ingår upp överst. 257 00:09:58,860 --> 00:10:02,120 Nu har jag # include "structs.h" men Jag ska återkomma till detta strax. 258 00:10:02,120 --> 00:10:03,974 Men detta är användbart för nu. 259 00:10:03,974 --> 00:10:05,890 Så det här är ett program som kommer att genomföra 260 00:10:05,890 --> 00:10:07,335 som registrar databas. 261 00:10:07,335 --> 00:10:09,710 Så en databas av studenter, och varje elev i världen 262 00:10:09,710 --> 00:10:13,190 har ett namn och ett hus och troligen några andra saker, men vi ska hålla det enkelt. 263 00:10:13,190 --> 00:10:15,140 Varje student har ett namn och ett hus. 264 00:10:15,140 --> 00:10:17,700 >> Så om jag ville skriva en program vars syfte i livet 265 00:10:17,700 --> 00:10:19,860 var bara att iterera från noll på upp till tre, 266 00:10:19,860 --> 00:10:22,070 om det finns tre elever vid Harvard University. 267 00:10:22,070 --> 00:10:25,350 Och jag vill bara få hjälp GetString, varje elevs namn och hus, 268 00:10:25,350 --> 00:10:26,600 och sedan bara skriva dem ut. 269 00:10:26,600 --> 00:10:28,630 >> Detta är ungefär som vecka Ett, Vecka två saker nu, 270 00:10:28,630 --> 00:10:30,810 där jag vill bara ha en för loop eller något liknande. 271 00:10:30,810 --> 00:10:34,500 Och jag vill ringa GetString några gånger och sedan skriva ut f några gånger. 272 00:10:34,500 --> 00:10:37,340 Så hur kan jag göra detta, dock, när både ett namn och ett hus 273 00:10:37,340 --> 00:10:39,070 är involverade för varje elev? 274 00:10:39,070 --> 00:10:42,830 >> Så min första instinkt kanske vara att göra något liknande. 275 00:10:42,830 --> 00:10:49,620 Jag skulle först säga, ja, ge mig, säga en array med strängar som kallas namn. 276 00:10:49,620 --> 00:10:51,530 Och jag vill inte ha en hårdkoda tre här. 277 00:10:51,530 --> 00:10:53,064 Vad vill jag sätta dit? 278 00:10:53,064 --> 00:10:55,730 Så att eleverna, eftersom det är bara en konstant deklareras vid toppen, 279 00:10:55,730 --> 00:10:57,860 bara så jag inte behöver hårdkoda tre på flera ställen. 280 00:10:57,860 --> 00:11:00,859 På så sätt kan jag ändra det ett ställe, och det påverkar en förändring överallt. 281 00:11:00,859 --> 00:11:04,470 Och då kanske jag gör sträng inrymmer STUDENTER. 282 00:11:04,470 --> 00:11:10,250 >> Och nu kan jag göra något liknande for (int i = 0; i 00:11:14,390 Så jag skriver snabbt, men det är förmodligen bekant syntax nu. 284 00:11:14,390 --> 00:11:17,030 >> Och nu, detta var nyare. 285 00:11:17,030 --> 00:11:22,890 Om jag vill sätta i det i: te studentens namn, jag tror att jag gör det här. 286 00:11:22,890 --> 00:11:26,480 Och sedan, inte namn men husen bracket jag. 287 00:11:26,480 --> 00:11:29,930 Jag gör detta, GetString, och låt mig gå tillbaka och rätta till denna linje. 288 00:11:29,930 --> 00:11:30,430 Överens? 289 00:11:30,430 --> 00:11:31,200 Håller inte med? 290 00:11:31,200 --> 00:11:32,366 Det är inte mycket användarvänligt. 291 00:11:32,366 --> 00:11:33,890 Jag har inte berättat för användaren vad som ska göras. 292 00:11:33,890 --> 00:11:36,520 >> Men nu, om jag också ville senare, låt oss 293 00:11:36,520 --> 00:11:40,060 säg, skriva ut dessa saker out-- så TODO senare. 294 00:11:40,060 --> 00:11:42,330 Jag kommer att göra mer med detta-- detta utan tvekan säga 295 00:11:42,330 --> 00:11:45,970 ett korrekt genomförande av få namn och hus, tre 296 00:11:45,970 --> 00:11:48,870 av dem totala antalet av varje, från en användare. 297 00:11:48,870 --> 00:11:51,280 >> Men det är inte mycket bra design, eller hur? 298 00:11:51,280 --> 00:11:55,220 Vad händer om en elev har inte bara ett namn och ett hus, utan även ett ID-nummer, 299 00:11:55,220 --> 00:11:57,770 och ett telefonnummer, och en e-postadress, 300 00:11:57,770 --> 00:12:00,280 och kanske en hemsida, och kanske en Twitter handtag, 301 00:12:00,280 --> 00:12:03,730 och ett antal andra detaljer associerad med en student eller en person, 302 00:12:03,730 --> 00:12:04,610 mer allmänt. 303 00:12:04,610 --> 00:12:07,720 Hur skulle vi börja lägga funktionalitet till det här programmet? 304 00:12:07,720 --> 00:12:14,080 >> Tja, jag känner mig som det enklaste sättet kanske vara att göra något liknande, låt oss säga, 305 00:12:14,080 --> 00:12:16,490 int ids STUDENTER. 306 00:12:16,490 --> 00:12:18,380 Så jag kan lägga alla deras ID där. 307 00:12:18,380 --> 00:12:22,240 Och sedan, efter något som telefonnummer, 308 00:12:22,240 --> 00:12:24,400 Jag är inte säker på hur man representerar det riktigt än. 309 00:12:24,400 --> 00:12:30,280 Så låt oss gå vidare och bara samtal detta twitters STUDENTER, vilket 310 00:12:30,280 --> 00:12:33,550 är lite konstigt, men-- och ett gäng mer områden. 311 00:12:33,550 --> 00:12:36,360 >> Jag har börjat att effektivt kopiera och klistra in här. 312 00:12:36,360 --> 00:12:39,416 Och detta kommer att växa ganska otymplig ganska snabbt, eller hur? 313 00:12:39,416 --> 00:12:42,290 Skulle det inte vara trevligt om det fanns i världen en datastruktur känd 314 00:12:42,290 --> 00:12:45,600 inte som en int eller en sträng, men något högre nivå, en abstraktion, så 315 00:12:45,600 --> 00:12:47,570 att tala, känd som student? 316 00:12:47,570 --> 00:12:50,220 C kom inte med inbyggd funktionalitet för studenter, 317 00:12:50,220 --> 00:12:52,260 men vad händer om jag ville ge det en sådan? 318 00:12:52,260 --> 00:12:55,640 >> Tja, det visar sig, jag ska öppna en fil som heter structs.h här, 319 00:12:55,640 --> 00:12:57,090 och du kan göra just det. 320 00:12:57,090 --> 00:12:58,290 Och vi kommer att börja göra det nu. 321 00:12:58,290 --> 00:13:01,490 Och under huven på P Set Tre, du har redan gjort detta nu. 322 00:13:01,490 --> 00:13:05,920 Det finns inget sådant som en g rect eller en g oval i programspråket C. 323 00:13:05,920 --> 00:13:10,570 >> Folks vid Stanford genomfört de datatyper med hjälp av denna metod här, 324 00:13:10,570 --> 00:13:13,900 förklara sina egna nya uppgifter typer med ett nytt sökord 325 00:13:13,900 --> 00:13:16,744 kallas struct och en annan en som heter typedef. 326 00:13:16,744 --> 00:13:19,660 Och faktiskt, även om syntaxen ser lite annorlunda saker 327 00:13:19,660 --> 00:13:23,550 vi har sett tidigare, principen, det är super enkelt. 328 00:13:23,550 --> 00:13:25,297 >> Det betyder bara "definiera en typ." 329 00:13:25,297 --> 00:13:27,255 Det kommer att bli en struktur och en struktur 330 00:13:27,255 --> 00:13:29,400 är precis som en container för flera saker. 331 00:13:29,400 --> 00:13:31,780 Och den strukturen kommer att ha en sträng som heter namn, 332 00:13:31,780 --> 00:13:33,210 och en sträng som kallas hus. 333 00:13:33,210 --> 00:13:37,520 Och låt oss kalla, bara för bekvämlighet, denna hela datastrukturen student. 334 00:13:37,520 --> 00:13:40,320 >> Så fort du kommer till semikolonet, har du nu 335 00:13:40,320 --> 00:13:43,280 skapat en egen uppgifter typ kallas studenten 336 00:13:43,280 --> 00:13:46,420 som nu står vid sidan av int, och flyta, och röding, och snöre, 337 00:13:46,420 --> 00:13:50,270 och g rekt, och g oval, och valfritt antal av annat folk har uppfunnit. 338 00:13:50,270 --> 00:13:53,340 >> Så vad är nyttigt om det här nu är att om jag går tillbaka 339 00:13:53,340 --> 00:13:57,430 att struct 0 och avsluta detta genomförande, som jag skrev 340 00:13:57,430 --> 00:14:02,080 i förväg här, märker att alla av den oundvikliga messiness att 341 00:14:02,080 --> 00:14:05,490 var på väg att börja hända som jag lagt telefonnummer och kvittrar och allt 342 00:14:05,490 --> 00:14:07,370 dessa andra saker till en elevs definition, 343 00:14:07,370 --> 00:14:11,810 nu är det kortfattat insvept som bara en samling av elever. 344 00:14:11,810 --> 00:14:15,500 >> Och var och en av de studenter nu har flera saker i den. 345 00:14:15,500 --> 00:14:16,930 Så att bara lämnar en fråga. 346 00:14:16,930 --> 00:14:19,700 Hur får man vid namn, och huset, och ID, 347 00:14:19,700 --> 00:14:21,640 och allt annat är insidan av studenten? 348 00:14:21,640 --> 00:14:22,930 Super enkelt, liksom. 349 00:14:22,930 --> 00:14:25,730 Ny syntax, men en enkel idé. 350 00:14:25,730 --> 00:14:29,239 >> Du kan helt enkelt index i gruppen, som vi gjorde förra veckan och det här. 351 00:14:29,239 --> 00:14:31,030 Och vad är klart ny bit av syntax? 352 00:14:31,030 --> 00:14:32,590 353 00:14:32,590 --> 00:14:35,880 Bara., Som betyder "gå in i struktur och få fältet kallas 354 00:14:35,880 --> 00:14:39,030 namn, får fältet kallas huset, få fältet kallas student. " 355 00:14:39,030 --> 00:14:41,940 >> Så i P Set tre, om du är arbetar fortfarande på det, 356 00:14:41,940 --> 00:14:44,020 och de flesta människor fortfarande är, inse att du 357 00:14:44,020 --> 00:14:46,130 börja använda saker som g rättar och G ovaler 358 00:14:46,130 --> 00:14:50,201 och annat som inte verkar kommer från vecka noll, ett eller två, 359 00:14:50,201 --> 00:14:52,950 inser att det är för att Stanford förklarade några nya datatyper. 360 00:14:52,950 --> 00:14:56,160 >> Och faktiskt, det är precis vad vi ska gör, liksom, i P Set Four, då 361 00:14:56,160 --> 00:14:59,880 vi börjar ta itu med saker och ting som bilder, bitmappar och mer. 362 00:14:59,880 --> 00:15:02,882 Så det är bara en teaser och en mental modell för vad som komma skall. 363 00:15:02,882 --> 00:15:04,590 Nu procrastinated jag lite i morse. 364 00:15:04,590 --> 00:15:09,560 Jag var lite nyfiken på vad Microsoft tapeten faktiskt 365 00:15:09,560 --> 00:15:10,310 ser ut idag. 366 00:15:10,310 --> 00:15:15,200 Och det visar sig att någon under 2006 faktiskt gick till nästan exakt 367 00:15:15,200 --> 00:15:19,210 samma plats för att fotografera i verkligheten vad som ser ut som att dessa dagar. 368 00:15:19,210 --> 00:15:21,380 Fältet är nu lite övervuxen. 369 00:15:21,380 --> 00:15:24,850 >> Så talar nu av bilder, Låt oss föra tillbaka Daven hit 370 00:15:24,850 --> 00:15:26,890 på skärmen och Nicholas, och bara påminna dig 371 00:15:26,890 --> 00:15:30,540 att om du vill gå med oss ​​för lunch denna fredag, chef till vår vanliga webbadress 372 00:15:30,540 --> 00:15:31,440 här. 373 00:15:31,440 --> 00:15:33,530 >> Så där gjorde vi lämnar ut på måndag? 374 00:15:33,530 --> 00:15:35,140 Vi införde det här problemet, eller hur? 375 00:15:35,140 --> 00:15:37,610 Det var till synes en korrekt genomförande av swap, 376 00:15:37,610 --> 00:15:40,460 där du tar två Ints, man kallas, som kallas B, 377 00:15:40,460 --> 00:15:44,130 byta dem, precis som Laura gjorde här på scen med mjölken och vattnet, 378 00:15:44,130 --> 00:15:46,820 genom att använda en temporär variabel, eller en tom kopp, 379 00:15:46,820 --> 00:15:50,540 så att vi kunde sätta b på en och en i b utan att göra en enda röra av saker. 380 00:15:50,540 --> 00:15:51,560 Vi använde en variabel. 381 00:15:51,560 --> 00:15:52,870 Det kallas temp. 382 00:15:52,870 --> 00:15:55,520 >> Men vad var det grundläggande Problemet med denna kod på måndag? 383 00:15:55,520 --> 00:15:57,700 384 00:15:57,700 --> 00:15:58,870 Vad var problemet här? 385 00:15:58,870 --> 00:16:00,106 386 00:16:00,106 --> 00:16:00,605 Yeah. 387 00:16:00,605 --> 00:16:01,970 >> PUBLIK: Det tar mer plats. 388 00:16:01,970 --> 00:16:04,719 >> DAVID J. MALAN: Tar mer utrymme, eftersom jag använder en variabel, 389 00:16:04,719 --> 00:16:05,400 och det är OK. 390 00:16:05,400 --> 00:16:07,300 Det är sant, men jag är kommer att säga det är OK. 391 00:16:07,300 --> 00:16:10,030 Det är bara 32 bitar i den stora tingens ordning, så inte en stor sak. 392 00:16:10,030 --> 00:16:10,655 Andra tankar? 393 00:16:10,655 --> 00:16:12,572 PUBLIK: Det byter bara variablerna lokalt. 394 00:16:12,572 --> 00:16:13,571 DAVID J. MALAN: Exakt. 395 00:16:13,571 --> 00:16:15,090 Den byter bara variablerna lokalt. 396 00:16:15,090 --> 00:16:18,173 Eftersom varje gång du ringer ett function-- när jag hade magasinen från Annenberg 397 00:16:18,173 --> 00:16:19,840 förra gången, har du huvud på botten. 398 00:16:19,840 --> 00:16:23,560 Så fort du kallar en funktion som kallas swap innebär swap inte x och y, 399 00:16:23,560 --> 00:16:24,400 de ursprungliga värdena. 400 00:16:24,400 --> 00:16:26,392 Vad swap get, vi påstår? 401 00:16:26,392 --> 00:16:27,100 Publik: Kopior. 402 00:16:27,100 --> 00:16:28,090 DAVID J. MALAN: Så kopior av dem. 403 00:16:28,090 --> 00:16:31,120 Så det blir ett och två, om du minns exemplet från förra gången, 404 00:16:31,120 --> 00:16:34,730 men en kopia av en och två som framgångsrikt bytt. 405 00:16:34,730 --> 00:16:38,550 Men tyvärr i slutändan, dessa värden är fortfarande samma. 406 00:16:38,550 --> 00:16:41,880 Så vi kan se det med våra nya vän, förhoppningsvis GDB, 407 00:16:41,880 --> 00:16:45,180 att du eller TF och Ca oss ha varit vägledande dig mot enligt följande. 408 00:16:45,180 --> 00:16:51,210 >> Så ingen swap minns ser like-- låt oss öppna upp detta-- ser ut så här. 409 00:16:51,210 --> 00:16:54,160 Vi initierade x till en, y till två. 410 00:16:54,160 --> 00:16:55,620 Hade en massa utskrifts f-talet. 411 00:16:55,620 --> 00:16:58,080 Men sedan, samtalsknappen här var att byta, vilket 412 00:16:58,080 --> 00:17:00,260 är precis den kod som vi såg bara en stund sedan. 413 00:17:00,260 --> 00:17:03,180 Vilket är korrekt vid första anblicken, men funktionellt, 414 00:17:03,180 --> 00:17:06,800 Programmet fungerar inte, eftersom den inte permanent byta x och y. 415 00:17:06,800 --> 00:17:10,190 >> Så låt oss se detta, en snabb varm upp här med GDB, en ./noswap. 416 00:17:10,190 --> 00:17:11,867 417 00:17:11,867 --> 00:17:15,200 Ett gäng överväldigande information som Jag ska bli av med kontroll L för nu. 418 00:17:15,200 --> 00:17:17,516 Och nu ska jag gå vidare och köra den. 419 00:17:17,516 --> 00:17:19,349 Och tyvärr, det var inte så användbart. 420 00:17:19,349 --> 00:17:22,355 Det körde programmet insidan av denna program som heter GDB, en debugger, 421 00:17:22,355 --> 00:17:23,730 men det gjorde inte låta mig rota runt. 422 00:17:23,730 --> 00:17:26,229 >> Så hur kan jag faktiskt pausa exekvering inne här programmet? 423 00:17:26,229 --> 00:17:27,410 424 00:17:27,410 --> 00:17:28,329 Så sönder. 425 00:17:28,329 --> 00:17:32,340 Och jag kunde bryta på någon radnummer, en, 10, 15. 426 00:17:32,340 --> 00:17:35,530 Men jag kan också bryta symbol genom att säga break. 427 00:17:35,530 --> 00:17:38,980 Och det kommer att ställa in en paus punkt, som synes på rad 16 i huvud. 428 00:17:38,980 --> 00:17:40,050 Och var är linje 16? 429 00:17:40,050 --> 00:17:42,960 Låt oss gå upp till koden och gå upp till noswap. 430 00:17:42,960 --> 00:17:46,930 Och faktiskt är linje 16 den allra första i programmet. 431 00:17:46,930 --> 00:17:52,130 >> Så nu, om jag går vidare och typ köra den här gången, Enter, pausade den. 432 00:17:52,130 --> 00:17:53,080 Så låt oss rota runt. 433 00:17:53,080 --> 00:17:55,716 Skriv x-- varför är x noll? 434 00:17:55,716 --> 00:17:56,705 435 00:17:56,705 --> 00:17:57,830 Och ignorera dollartecken. 436 00:17:57,830 --> 00:17:59,725 Det är bara för snyggare användning av programmet. 437 00:17:59,725 --> 00:18:00,780 438 00:18:00,780 --> 00:18:03,140 Varför är x noll just nu? 439 00:18:03,140 --> 00:18:03,640 Yeah. 440 00:18:03,640 --> 00:18:07,061 >> PUBLIK: Det pausade precis innan linje 16, i själva verket inte på ledningen 16. 441 00:18:07,061 --> 00:18:08,060 DAVID J. MALAN: Exakt. 442 00:18:08,060 --> 00:18:11,630 GDB, som standard, har pausat utförande precis innan linjen 16. 443 00:18:11,630 --> 00:18:14,820 Så det har inte utföras och vilka betyder x är av något okänt värde. 444 00:18:14,820 --> 00:18:17,150 Och vi hade tur att det är något rent som noll. 445 00:18:17,150 --> 00:18:20,310 Så nu om jag skriver nästa, nu det exekveras 16. 446 00:18:20,310 --> 00:18:22,000 Det väntar på mig att köra 17. 447 00:18:22,000 --> 00:18:23,400 Låt mig gå vidare och skriva ut x. 448 00:18:23,400 --> 00:18:24,094 Det är en. 449 00:18:24,094 --> 00:18:25,260 Låt mig gå vidare och skriva ut y. 450 00:18:25,260 --> 00:18:26,176 Vad ska jag nu? 451 00:18:26,176 --> 00:18:27,660 452 00:18:27,660 --> 00:18:28,560 >> PUBLIK: [ohörbart] 453 00:18:28,560 --> 00:18:29,165 >> DAVID J. MALAN: Lite högre. 454 00:18:29,165 --> 00:18:30,040 >> PUBLIK: [ohörbart] 455 00:18:30,040 --> 00:18:30,537 456 00:18:30,537 --> 00:18:32,120 DAVID J. MALAN: Inte riktigt samförstånd. 457 00:18:32,120 --> 00:18:34,760 Så ja, vi ser några sopor värde. 458 00:18:34,760 --> 00:18:37,862 Nu, y är 134514064 där. 459 00:18:37,862 --> 00:18:39,320 Tja, det är bara några sopor värde. 460 00:18:39,320 --> 00:18:41,350 Mitt program använder RAM för olika ändamål. 461 00:18:41,350 --> 00:18:42,350 Det finns andra funktioner. 462 00:18:42,350 --> 00:18:44,040 Andra människor skrev i min dator. 463 00:18:44,040 --> 00:18:46,789 Så dessa bitar har använts för andra värden, och vad jag ser 464 00:18:46,789 --> 00:18:49,470 är resterna av en del före användning av detta minne. 465 00:18:49,470 --> 00:18:53,350 >> Så ingen big deal, för så fort när jag skriver nästa och sedan skriva ut y, 466 00:18:53,350 --> 00:18:55,640 det initieras till det värde som jag vill ha. 467 00:18:55,640 --> 00:18:57,400 Så nu, låt oss gå vidare lite snabbare. 468 00:18:57,400 --> 00:18:58,540 N för nästa. 469 00:18:58,540 --> 00:18:59,570 Låt oss göra det igen. 470 00:18:59,570 --> 00:19:00,530 Låt oss göra det igen. 471 00:19:00,530 --> 00:19:02,404 Men jag vill inte träffa det här, för om jag 472 00:19:02,404 --> 00:19:05,110 vill se vad som händer inuti av swap, vad är kommandot? 473 00:19:05,110 --> 00:19:05,520 >> PUBLIKEN: steg. 474 00:19:05,520 --> 00:19:06,436 >> DAVID J. MALAN: steg. 475 00:19:06,436 --> 00:19:09,800 Så detta steg mig till en funktion, snarare än över den. 476 00:19:09,800 --> 00:19:12,270 Och nu, det är lite kryptiskt ärligt, men detta är bara 477 00:19:12,270 --> 00:19:14,581 säger jag är i linje 33 nu. 478 00:19:14,581 --> 00:19:15,580 Och låt oss göra detta igen. 479 00:19:15,580 --> 00:19:16,080 Tryck temp. 480 00:19:16,080 --> 00:19:17,129 481 00:19:17,129 --> 00:19:20,170 Garbage värde, negativt den här gången, men det är bara ännu en soptunna värde. 482 00:19:20,170 --> 00:19:22,810 Så låt oss göra härnäst, skriv ut temp. 483 00:19:22,810 --> 00:19:27,130 Det initieras till 1, vilket var värdet av x, aka en. 484 00:19:27,130 --> 00:19:29,110 >> Nu, var är vår A och X kommer från? 485 00:19:29,110 --> 00:19:32,510 Tja, varsel viktigaste, vi kallas dessa värden x och y. 486 00:19:32,510 --> 00:19:34,740 Vi passerade dem sedan att byta enligt följande. 487 00:19:34,740 --> 00:19:37,010 X kom först, kommatecken y. 488 00:19:37,010 --> 00:19:40,020 Och då kunde swap kalla dem x och y. 489 00:19:40,020 --> 00:19:42,630 Men för tydlighetens skull, det är kalla dem a och b. 490 00:19:42,630 --> 00:19:45,970 Men a och b ska nu bli kopior av x och y, respektive. 491 00:19:45,970 --> 00:19:50,660 >> Så om jag går tillbaka till GDB, temp är nu ett och ett är nu en. 492 00:19:50,660 --> 00:19:56,130 Men om jag gör nästa och nu gör print a, har en redan flyttats över. 493 00:19:56,130 --> 00:20:00,030 Har hällt Mjölken till fd apelsinjuice glas, eller vice versa. 494 00:20:00,030 --> 00:20:04,750 >> Och om jag gör nästa gång, och nu Om jag skriver ut som en sanity check, 495 00:20:04,750 --> 00:20:07,687 a är fortfarande två, men b är nu en. 496 00:20:07,687 --> 00:20:08,770 Ärligt talat, det är fortfarande där. 497 00:20:08,770 --> 00:20:10,670 Jag bryr mig inte vad temp är. 498 00:20:10,670 --> 00:20:16,850 Men så fort jag nu skriver, låt oss säga, fortsätta att gå tillbaka, nu är jag i slutet 499 00:20:16,850 --> 00:20:17,480 programmet. 500 00:20:17,480 --> 00:20:20,730 Och tyvärr, är x fortfarande ett och y är fortfarande två. 501 00:20:20,730 --> 00:20:22,272 >> Så vad var nyttan av GDB där? 502 00:20:22,272 --> 00:20:23,980 Det hjälpte inte mig att fixa problemet i sig, 503 00:20:23,980 --> 00:20:26,265 men förhoppningsvis hjälpa mig förstå det genom att inse 504 00:20:26,265 --> 00:20:30,000 att ja, min logik rätt, men min kod är inte senare få 505 00:20:30,000 --> 00:20:31,450 en permanent effekt. 506 00:20:31,450 --> 00:20:34,570 Så det är ett problem vi är ska nu lösa idag. 507 00:20:34,570 --> 00:20:37,870 >> Men låt oss komma dit med hjälp av detta. 508 00:20:37,870 --> 00:20:39,230 String är en lögn. 509 00:20:39,230 --> 00:20:41,860 Det också, inte en datatyp som existerar i C. Det är 510 00:20:41,860 --> 00:20:44,750 varit en synonym för vissa tid för något annat, 511 00:20:44,750 --> 00:20:47,300 och vi kan avslöja att såsom följer. 512 00:20:47,300 --> 00:20:53,282 >> Låt mig gå vidare och öppna upp ett program som kallas jämför-0. 513 00:20:53,282 --> 00:20:56,240 Och i stället för att skriva det här ett ut, vi börjar gå igenom koden 514 00:20:56,240 --> 00:20:58,040 Jag skrev redan, men det är bara några få rader. 515 00:20:58,040 --> 00:20:59,570 Så detta är jämför-0. 516 00:20:59,570 --> 00:21:02,380 Och det första jag gör är att få en textrad. 517 00:21:02,380 --> 00:21:05,610 >> Men lägg märke till vad jag är gör för första gången. 518 00:21:05,610 --> 00:21:07,910 Vad är annorlunda helt klart om linjen 21? 519 00:21:07,910 --> 00:21:10,020 520 00:21:10,020 --> 00:21:11,402 Faktiskt, vänta lite. 521 00:21:11,402 --> 00:21:12,110 Det här är kopia två. 522 00:21:12,110 --> 00:21:13,568 Det är inte ens rätt program. 523 00:21:13,568 --> 00:21:14,780 Okej, spoiler alert. 524 00:21:14,780 --> 00:21:16,890 Okej, så strunt i det. 525 00:21:16,890 --> 00:21:18,520 Det är svaret på en framtida fråga. 526 00:21:18,520 --> 00:21:21,450 >> Här är jämför-0, och jag är på väg att få en textrad. 527 00:21:21,450 --> 00:21:22,435 Programmets mycket enklare. 528 00:21:22,435 --> 00:21:23,560 Så detta är enkel. 529 00:21:23,560 --> 00:21:28,070 Detta är som vecka ett, Vecka två saker tillfället. string s = GetString. 530 00:21:28,070 --> 00:21:29,700 Nu, jag säger det igen här nere. 531 00:21:29,700 --> 00:21:31,830 string t = GetString. 532 00:21:31,830 --> 00:21:35,300 Och sedan, det sista i denna Programmet, som namnet antyder, 533 00:21:35,300 --> 00:21:37,090 är jag ska försöka jämföra dem. 534 00:21:37,090 --> 00:21:40,709 >> Så om s, den första strängen, lika = t, så jag är 535 00:21:40,709 --> 00:21:42,250 kommer att säga att du skriver samma sak. 536 00:21:42,250 --> 00:21:44,291 Annars kommer jag att säga du skriver olika saker. 537 00:21:44,291 --> 00:21:45,880 Så låt oss kompilera och köra programmet. 538 00:21:45,880 --> 00:21:48,481 Så gör jämför noll. 539 00:21:48,481 --> 00:21:48,980 Ser bra ut. 540 00:21:48,980 --> 00:21:50,490 Inga kompileringsfel. 541 00:21:50,490 --> 00:21:52,386 >> Låt mig gå vidare nu och skriv ./compare-0. 542 00:21:52,386 --> 00:21:55,230 543 00:21:55,230 --> 00:21:59,220 Låt mig gå vidare och säga något : Daven och något: Rob. 544 00:21:59,220 --> 00:22:00,450 Och jag skriver olika saker. 545 00:22:00,450 --> 00:22:01,250 Så långt är allt väl. 546 00:22:01,250 --> 00:22:02,680 Programmet verkar vara korrekt. 547 00:22:02,680 --> 00:22:03,880 >> Men låt oss köra den igen. 548 00:22:03,880 --> 00:22:05,800 Säg något: Gabe. 549 00:22:05,800 --> 00:22:07,140 Säg något: Gabe. 550 00:22:07,140 --> 00:22:08,520 551 00:22:08,520 --> 00:22:09,020 Okej. 552 00:22:09,020 --> 00:22:10,851 Kanske slog mellanslag eller något funky. 553 00:22:10,851 --> 00:22:11,600 Låt oss göra 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 Olika saker. 559 00:22:17,330 --> 00:22:19,430 Så vad är det som händer? 560 00:22:19,430 --> 00:22:23,200 >> Så vi har dessa två linjer i kod, GetString kallas två gånger. 561 00:22:23,200 --> 00:22:25,760 Och då är jag helt enkelt försöker jämföra s och t. 562 00:22:25,760 --> 00:22:28,370 Men det som verkligen då som händer? 563 00:22:28,370 --> 00:22:31,180 Tja, min handstil är på väg att slakta detta exempel något. 564 00:22:31,180 --> 00:22:34,630 Och låt oss faktiskt kasta upp detta här, liksom. 565 00:22:34,630 --> 00:22:37,390 566 00:22:37,390 --> 00:22:45,712 >> Så vi har en rad som string s = GetString. 567 00:22:45,712 --> 00:22:48,295 Så det är helt enkelt den första intressant linje från det programmet. 568 00:22:48,295 --> 00:22:49,920 569 00:22:49,920 --> 00:22:52,974 Men vad hela denna tid har varit händer under huven? 570 00:22:52,974 --> 00:22:55,890 Jo, på vänster sida är sträng, som är någon typ av variabel, 571 00:22:55,890 --> 00:22:56,785 och det kallas är. 572 00:22:56,785 --> 00:23:00,019 Så jag vet att detta är att använda minnet, eller RAM i min dator på något sätt. 573 00:23:00,019 --> 00:23:02,060 Så jag ska abstrakt rita det som en kvadrat. 574 00:23:02,060 --> 00:23:04,820 32 bitar, visar det sig, men mer om det i framtiden. 575 00:23:04,820 --> 00:23:06,410 Och sedan, är det som händer här? 576 00:23:06,410 --> 00:23:08,700 >> Tja, uppenbarligen getString blir en sträng från användaren. 577 00:23:08,700 --> 00:23:11,360 Och GetString fick Zamyla eller Gabe eller Daven. 578 00:23:11,360 --> 00:23:14,640 Så låt oss välja det första av dem, som var Daven. 579 00:23:14,640 --> 00:23:19,174 Så effektivt, fick vad GetString mig i det första fallet var D-a-v-e-n. 580 00:23:19,174 --> 00:23:22,690 581 00:23:22,690 --> 00:23:25,045 Och sedan, vad gjorde Det ger mig i hemlighet? 582 00:23:25,045 --> 00:23:25,920 PUBLIK: [ohörbart] 583 00:23:25,920 --> 00:23:28,720 DAVID J. MALAN: Ja, på / 0 eller null karaktär. 584 00:23:28,720 --> 00:23:30,550 Så det effektivt gav mig en sträng. 585 00:23:30,550 --> 00:23:34,550 Men vi vet redan från tidigare ser att en sträng är bara en array 586 00:23:34,550 --> 00:23:37,895 tecken, och det sägs upp av denna speciella sentinel karaktär / 0. 587 00:23:37,895 --> 00:23:39,220 588 00:23:39,220 --> 00:23:42,310 >> Men om detta är sant och detta är en kvadrat, 589 00:23:42,310 --> 00:23:44,160 Detta är helt klart en mycket större rektangel. 590 00:23:44,160 --> 00:23:46,830 Och faktiskt, det här, Jag hävdar, endast 32 bitar. 591 00:23:46,830 --> 00:23:49,500 Och det är klart mer än 32 bitar, eftersom detta är förmodligen 592 00:23:49,500 --> 00:23:51,583 åtta plus åtta plus åtta plus åtta plus åtta, 593 00:23:51,583 --> 00:23:53,320 bara på grund av byte i ASCII. 594 00:23:53,320 --> 00:23:57,030 Hur sjutton ska vi passa Daven in i denna lilla ruta här? 595 00:23:57,030 --> 00:23:59,880 >> Nå, vad GetString egentligen gör? 596 00:23:59,880 --> 00:24:03,680 Tja, här är detta galler datorns minne eller RAM. 597 00:24:03,680 --> 00:24:07,564 Så låt oss godtyckligt säga att om var och en av dessa representerar en byte, 598 00:24:07,564 --> 00:24:09,730 då kan vi tänka på varje byte som har en adress, 599 00:24:09,730 --> 00:24:13,830 som 33 Oxford Street, eller 34 Oxford Street, eller 35 Oxford Street. 600 00:24:13,830 --> 00:24:16,700 >> Så precis som hem har adresser och byggnader har adresserna, 601 00:24:16,700 --> 00:24:19,810 så gör enskilda byte av minne har adresser eller nummer 602 00:24:19,810 --> 00:24:21,042 som unikt identifierar dem. 603 00:24:21,042 --> 00:24:22,000 Nu är det godtyckligt. 604 00:24:22,000 --> 00:24:25,370 Men för att hålla det enkelt, jag ska använder hexadecimal bara genom konventionen, 605 00:24:25,370 --> 00:24:28,200 men 0x betyder ingenting annat än "det här är hexadecimal." 606 00:24:28,200 --> 00:24:31,030 och jag kommer att hävda att "D" hamnar på byte One i minnet. 607 00:24:31,030 --> 00:24:34,210 >> Jag har inget annat händer i minne, så Daven fick första plats 608 00:24:34,210 --> 00:24:35,509 vid byte One. 609 00:24:35,509 --> 00:24:36,800 Detta är alltså kommer att vara 0x2. 610 00:24:36,800 --> 00:24:37,831 611 00:24:37,831 --> 00:24:38,705 Det här kommer att 0x3. 612 00:24:38,705 --> 00:24:39,840 613 00:24:39,840 --> 00:24:41,800 Detta kommer att vara 0x4. 614 00:24:41,800 --> 00:24:43,025 Det här kommer att 0x5. 615 00:24:43,025 --> 00:24:44,025 Detta kommer att vara 0x6. 616 00:24:44,025 --> 00:24:45,560 617 00:24:45,560 --> 00:24:48,290 >> Men när du börjar tänka om vad datorns görandet 618 00:24:48,290 --> 00:24:50,710 under huven, du kan börja att sluta 619 00:24:50,710 --> 00:24:54,960 hur ni, för några år sedan, skulle har genomfört C själv. 620 00:24:54,960 --> 00:24:58,360 Vad är GetString förmodligen returning-- eftersom det 621 00:24:58,360 --> 00:25:00,946 känns som det inte är vänder Daven, per se, 622 00:25:00,946 --> 00:25:03,320 för att han säkert inte kommer att passa in i denna lilla box-- 623 00:25:03,320 --> 00:25:05,090 så vad är GetString förmodligen återvänder? 624 00:25:05,090 --> 00:25:07,958 625 00:25:07,958 --> 00:25:08,920 >> PUBLIK: [ohörbart] 626 00:25:08,920 --> 00:25:10,540 >> DAVID J. MALAN: Placeringen av Daven. 627 00:25:10,540 --> 00:25:12,770 Och det har varit att göra detta ända sedan Vecka One. 628 00:25:12,770 --> 00:25:16,150 Vad GetString är verkligen vänder inte är en sträng, per se. 629 00:25:16,150 --> 00:25:17,780 Det är en av de små vita lögner. 630 00:25:17,780 --> 00:25:22,520 Det är att returnera adressen för sträng i minnet, den unika adressen. 631 00:25:22,520 --> 00:25:24,820 Daven bor på 33 Oxford Street. 632 00:25:24,820 --> 00:25:29,310 Men mer koncist, Gavin lever på 0x1, Adress Number One. 633 00:25:29,310 --> 00:25:32,280 >> Så vad får sätta in detta liten låda då, att vara tydlig, 634 00:25:32,280 --> 00:25:35,930 är bara adressen till den strängen. 635 00:25:35,930 --> 00:25:38,110 Så hela den här tiden, det här har pågått. 636 00:25:38,110 --> 00:25:41,650 Men vad detta antyder nu är att om alla s har 637 00:25:41,650 --> 00:25:44,710 är ett tal inne i det, som är att stoppa dig, programmerare, 638 00:25:44,710 --> 00:25:47,970 från att sätta någon siffra i eventuell rörlig och bara hoppa 639 00:25:47,970 --> 00:25:49,080 till den del av minnet? 640 00:25:49,080 --> 00:25:51,320 Och faktiskt, vi får se det är ett hot nästa gång. 641 00:25:51,320 --> 00:25:53,500 >> Men för tillfället känns det inte tillräckligt. 642 00:25:53,500 --> 00:25:55,630 Om jag säger, ge mig ett sträng, du ger mig Daven. 643 00:25:55,630 --> 00:25:57,230 Men du vet inte riktigt ge mig Daven. 644 00:25:57,230 --> 00:25:59,310 Allt du ger mig är Daven adress. 645 00:25:59,310 --> 00:26:04,310 Hur vet jag då säkert där Daven börjar och ends-- 646 00:26:04,310 --> 00:26:07,140 berättelsen börjar bli weird-- där Daven börjar och slutar, 647 00:26:07,140 --> 00:26:10,435 och sedan, nästa sträng i minnet börjar? 648 00:26:10,435 --> 00:26:11,520 649 00:26:11,520 --> 00:26:13,620 >> Tja, om du lämna mig i början av Daven, 650 00:26:13,620 --> 00:26:17,230 huvudsak, hur vet jag där i slutet av hans namn är? 651 00:26:17,230 --> 00:26:20,550 Denna särskilda null karaktär, som är desto viktigare nu 652 00:26:20,550 --> 00:26:23,040 Om strängarna på undersidan av huven helt enkelt identifieras 653 00:26:23,040 --> 00:26:25,820 unikt genom sitt läge i minnet. 654 00:26:25,820 --> 00:26:28,130 Så hela den här tiden, det är vad som har pågått. 655 00:26:28,130 --> 00:26:32,470 >> Så när vi tittar nu på koden här, förklarar 656 00:26:32,470 --> 00:26:35,790 Om du skulle buggen i linje 26. 657 00:26:35,790 --> 00:26:39,560 Varför är Zamyla och Zamyla annorlunda? 658 00:26:39,560 --> 00:26:41,330 Varför är Gabe och Gabe annorlunda? 659 00:26:41,330 --> 00:26:42,154 Ja, i ryggen. 660 00:26:42,154 --> 00:26:43,390 >> Publik: De har olika adresser. 661 00:26:43,390 --> 00:26:45,931 >> DAVID J. MALAN: Helt enkelt därför att de har olika adresser. 662 00:26:45,931 --> 00:26:48,820 För när du ringer GetString igen, vilket jag ska göra snart här, 663 00:26:48,820 --> 00:26:52,870 om detta är den andra raden, sträng t, som jag gjorde i det programmet, 664 00:26:52,870 --> 00:26:55,030 lika annat samtal till GetString. 665 00:26:55,030 --> 00:26:56,370 666 00:26:56,370 --> 00:26:58,670 Nästa gång jag ringer GetString, jag ska 667 00:26:58,670 --> 00:27:00,190 att få en annan bit av minnet. 668 00:27:00,190 --> 00:27:02,220 >> GetString tillåts att fråga den operativa 669 00:27:02,220 --> 00:27:03,800 systemet för mer och mer minne. 670 00:27:03,800 --> 00:27:07,894 Det kommer inte att återanvända samma sex bytes varje gång. 671 00:27:07,894 --> 00:27:09,810 Det kommer att få en ny bit av minnet, vilket 672 00:27:09,810 --> 00:27:12,780 innebär t kommer att få något annat värde här. 673 00:27:12,780 --> 00:27:15,380 >> Så när jag gör er lika = t, du är inte att jämföra 674 00:27:15,380 --> 00:27:17,880 D mot detta och A mot detta och V mot detta. 675 00:27:17,880 --> 00:27:19,588 Du jämför det här mot detta, vilket 676 00:27:19,588 --> 00:27:24,020 sagt är ganska useful-- useless-- är ganska meningslöst, eftersom som verkligen 677 00:27:24,020 --> 00:27:25,830 bryr sig om strängarna är i minnet? 678 00:27:25,830 --> 00:27:26,850 >> Och faktiskt, det har vi inte. 679 00:27:26,850 --> 00:27:28,980 Och vi kommer inte att börja särskilt omtänksam. 680 00:27:28,980 --> 00:27:34,180 Endast i den mån fel kan uppstå och säkerhetshot kan uppstå vilja 681 00:27:34,180 --> 00:27:36,100 vi faktiskt börjar bry sig om detta. 682 00:27:36,100 --> 00:27:37,230 Så låt oss fixa detta problem. 683 00:27:37,230 --> 00:27:39,650 Det visade sig, att du fixa det super enkelt. 684 00:27:39,650 --> 00:27:42,600 >> Och låt oss faktiskt, innan jag avslöjar det igen, vad skulle 685 00:27:42,600 --> 00:27:47,170 du göra om i ett CS50 klass, och du var tvungen att genomföra 686 00:27:47,170 --> 00:27:48,600 en jämförelse mot två strängar. 687 00:27:48,600 --> 00:27:51,440 Du tydligt kan inte bara använda er lika = t. 688 00:27:51,440 --> 00:27:54,090 Men bara logiskt, hur skulle du jämföra den här strängen 689 00:27:54,090 --> 00:27:56,370 mot denna sträng med C-kod? 690 00:27:56,370 --> 00:27:56,880 Yeah. 691 00:27:56,880 --> 00:27:58,780 >> PUBLIK: Bara gör det för återkoppling [ohörbart] 692 00:27:58,780 --> 00:28:00,670 693 00:28:00,670 --> 00:28:01,670 DAVID J. MALAN: Perfect. 694 00:28:01,670 --> 00:28:02,900 PUBLIK: [ohörbart] 695 00:28:02,900 --> 00:28:03,310 DAVID J. MALAN: Ja. 696 00:28:03,310 --> 00:28:05,390 Bara använda en for-loop eller ett while-slinga eller något annat. 697 00:28:05,390 --> 00:28:08,710 Men bara att tillämpa den grundläggande tanken att om Detta är en bit av minne eller en matris 698 00:28:08,710 --> 00:28:11,590 och detta är, iterera över båda på samma gång. 699 00:28:11,590 --> 00:28:12,960 Och bara jämföra bokstäverna. 700 00:28:12,960 --> 00:28:14,260 >> Och du måste vara en lite försiktig, eftersom du 701 00:28:14,260 --> 00:28:16,247 vill inte ha ett finger att gå förbi den andra 702 00:28:16,247 --> 00:28:18,080 eftersom en sträng är längre än den andra. 703 00:28:18,080 --> 00:28:21,380 Så du kommer att vilja kontrollera detta särskilt värde i slutet, null. 704 00:28:21,380 --> 00:28:24,017 Men det är verkligen, i slut, så enkelt är det. 705 00:28:24,017 --> 00:28:26,100 Och ärligt talat, behöver vi inte uppfinna det hjulet. 706 00:28:26,100 --> 00:28:27,960 Här är version två. 707 00:28:27,960 --> 00:28:32,910 Och vad jag ska säga här är att stället för att jämföra er lika = t, 708 00:28:32,910 --> 00:28:38,964 Jag stället ska säga, om sträng jämförelse av s kommatecken t är lika med = 0. 709 00:28:38,964 --> 00:28:40,130 Nu, vad sträng jämföra? 710 00:28:40,130 --> 00:28:43,046 >> Det visar sig, det är en funktion som kommer med C, vars syfte i livet 711 00:28:43,046 --> 00:28:44,650 är att jämföra två strängar. 712 00:28:44,650 --> 00:28:48,300 Och rör jämföra, om vi läser det man-sidan eller dokumentation eller CS50 713 00:28:48,300 --> 00:28:50,630 referens, kommer det helt enkelt säga att uppståndelse 714 00:28:50,630 --> 00:28:55,730 jämföra avkastningen antingen en negativ nummer eller ett positivt tal eller noll, 715 00:28:55,730 --> 00:28:57,660 där noll betyder att de är lika. 716 00:28:57,660 --> 00:28:58,570 >> Så bara gissningar. 717 00:28:58,570 --> 00:29:00,390 Vad kan det betyda om omröras jämför avkastning 718 00:29:00,390 --> 00:29:02,110 negativt värde eller positivt värde? 719 00:29:02,110 --> 00:29:02,785 720 00:29:02,785 --> 00:29:04,285 Publik: Större än eller mindre än. 721 00:29:04,285 --> 00:29:05,570 DAVID J. MALAN: Ja, större än eller mindre än. 722 00:29:05,570 --> 00:29:08,640 Så om du vill sortera en hel gäng strängar i en dictionary-- 723 00:29:08,640 --> 00:29:12,975 som vi kommer så småningom ner road-- perfekt funktion att använda potentiellt, 724 00:29:12,975 --> 00:29:15,850 eftersom det kommer att göra det jämförelse av strängar för dig, och berätta 725 00:29:15,850 --> 00:29:20,060 du gör ett kommer före b, eller gör b kommer före ett alfabetiskt. 726 00:29:20,060 --> 00:29:21,490 Vi kan göra just det. 727 00:29:21,490 --> 00:29:23,620 >> Och märker att jag gjorde en annan sak i det här exemplet. 728 00:29:23,620 --> 00:29:26,870 Vad har förändrats högre upp i denna huvudfunktion? 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 Och detta är den andra vit lögn. 732 00:29:31,150 --> 00:29:33,750 Hela denna tid, när du har skrivit sträng, 733 00:29:33,750 --> 00:29:38,350 Vi har i hemlighet skriva sträng som char * så att klang faktiskt 734 00:29:38,350 --> 00:29:39,270 förstår dig. 735 00:29:39,270 --> 00:29:42,450 >> Med andra ord, i CS50.h och som vi så småningom får se, 736 00:29:42,450 --> 00:29:45,950 Vi gjorde en synonym heter sträng det är samma sak som char *. 737 00:29:45,950 --> 00:29:49,910 Och nu, vet bara att den *, I detta sammanhang åtminstone 738 00:29:49,910 --> 00:29:51,286 betyder adressen. 739 00:29:51,286 --> 00:29:52,210 >> Adressen till vad? 740 00:29:52,210 --> 00:29:56,390 Jo, det faktum att jag sa char *, och inte int * eller flyta *, 741 00:29:56,390 --> 00:30:00,820 innebär att char * är adressen till en röding. 742 00:30:00,820 --> 00:30:06,770 Så denna lilla ruta här, aka sträng, är verkligen av typen char *, 743 00:30:06,770 --> 00:30:10,490 som helt enkelt är ett finare sätt att säga, i den här rutan kommer att gå en adress. 744 00:30:10,490 --> 00:30:12,430 Och vad betyder den adressen hänvisar till? 745 00:30:12,430 --> 00:30:13,780 Tydligen en röding. 746 00:30:13,780 --> 00:30:16,410 >> Men vi kunde absolut har int * och andra saker. 747 00:30:16,410 --> 00:30:20,790 Men för tillfället är char * verkligen den mest okomplicerad och en av intresse. 748 00:30:20,790 --> 00:30:23,310 Så detta problem går att stiga, men, återigen. 749 00:30:23,310 --> 00:30:24,830 >> Anta att jag öppnar programmet. 750 00:30:24,830 --> 00:30:27,670 Låt oss se om nu kan vi förutsäga Vad är fel med denna kod. 751 00:30:27,670 --> 00:30:31,140 Så i det här programmet, kopiera-0, jag är kommer att gå vidare och åter ringa 752 00:30:31,140 --> 00:30:34,190 GetString och lagra värdet i er. 753 00:30:34,190 --> 00:30:38,800 >> Och sedan, varför gör jag detta, precis som en påminnelse från veckor tidigare? 754 00:30:38,800 --> 00:30:40,960 Vi gjorde säga att GetString ibland returnerar null. 755 00:30:40,960 --> 00:30:42,793 Vad betyder det om GetString returnerar null? 756 00:30:42,793 --> 00:30:45,040 757 00:30:45,040 --> 00:30:46,034 Något gick fel. 758 00:30:46,034 --> 00:30:48,950 Det betyder förmodligen strängen är för stora, datorns ur minnet. 759 00:30:48,950 --> 00:30:51,724 Det händer super, super, super sällan, men det kan hända. 760 00:30:51,724 --> 00:30:53,890 Vi vill kontrollera om det, och det är allt vi gör. 761 00:30:53,890 --> 00:30:57,910 >> Eftersom vi får se nu, om du inte börja kontrollera vanliga saker 762 00:30:57,910 --> 00:31:00,870 som null, kanske du faktiskt börjar gå 763 00:31:00,870 --> 00:31:03,106 till adresser i minnet som är ogiltiga. 764 00:31:03,106 --> 00:31:05,980 Och du kommer att börja att framkalla fler och fler segmenteringsfel. 765 00:31:05,980 --> 00:31:08,360 Eller i en Mac eller en PC, precis att bringa en dator att hänga 766 00:31:08,360 --> 00:31:10,340 eller ett program för att frysa, potentiellt. 767 00:31:10,340 --> 00:31:14,930 >> Så nu, jag hävdar i kopierings 0.c, att jag tänker kopiera dessa strängar genom 768 00:31:14,930 --> 00:31:15,685 i linje 28. 769 00:31:15,685 --> 00:31:16,850 770 00:31:16,850 --> 00:31:18,750 Och då kommer jag krav på botten 771 00:31:18,750 --> 00:31:21,430 här att jag ska att byta en av dem. 772 00:31:21,430 --> 00:31:22,330 >> Så märker detta. 773 00:31:22,330 --> 00:31:24,370 Jag ringer vår gamle vän strlen. 774 00:31:24,370 --> 00:31:28,960 Och bara förklara på engelska vad denna linje 34 gör? 775 00:31:28,960 --> 00:31:32,480 Vad t fäste 0 representerar till vänster. 776 00:31:32,480 --> 00:31:32,980 Yeah. 777 00:31:32,980 --> 00:31:34,339 >> PUBLIK: Första karaktär t? 778 00:31:34,339 --> 00:31:35,880 DAVID J. MALAN: Första tecknet på t. 779 00:31:35,880 --> 00:31:36,379 Det är allt. 780 00:31:36,379 --> 00:31:40,024 Första tecknet på t, jag vill ha att tilldela versaler version 781 00:31:40,024 --> 00:31:41,190 för det första tecknet i t. 782 00:31:41,190 --> 00:31:43,200 Så detta är kapitalisera den första bokstaven. 783 00:31:43,200 --> 00:31:46,340 Och sedan, det allra sista jag gör i detta program är att jag påstår här är 784 00:31:46,340 --> 00:31:50,340 originalet, s, och här är kopian, t. 785 00:31:50,340 --> 00:31:54,610 >> Men baserat på berättelsen vi bara berättade om vilka strängar egentligen är, 786 00:31:54,610 --> 00:31:57,520 vad som är linje 28 egentligen gör, och vad som är 787 00:31:57,520 --> 00:31:59,405 den erhållna bug gå att vara på skärmen? 788 00:31:59,405 --> 00:32:01,300 789 00:32:01,300 --> 00:32:03,500 >> Så först, den första frågan, 28. 790 00:32:03,500 --> 00:32:09,040 Vad string t = s egentligen gör? 791 00:32:09,040 --> 00:32:16,430 Om vi ​​har på den vänstra sida här string t = s; 792 00:32:16,430 --> 00:32:19,400 det ger mig en låda här och en låda här. 793 00:32:19,400 --> 00:32:25,530 Och anta denna adress är 0x, låt oss säga, 50 den här gången, godtyckligt. 794 00:32:25,530 --> 00:32:28,847 Vad string t = s gör under huven? 795 00:32:28,847 --> 00:32:30,340 >> PUBLIK: [ohörbart] 796 00:32:30,340 --> 00:32:34,100 >> DAVID J. MALAN: Den lagrar minnet adress där, så 0x50 går där. 797 00:32:34,100 --> 00:32:37,980 Så om nu, jag går till den första karaktär i t och versaler den, 798 00:32:37,980 --> 00:32:39,535 vad ska jag göra på ett effektivt sätt att s? 799 00:32:39,535 --> 00:32:41,300 800 00:32:41,300 --> 00:32:43,450 Jag är verkligen gör samma sak, eller hur? 801 00:32:43,450 --> 00:32:47,680 För om Adress 0x50-- och bara jag har inte mycket utrymme på bordet här, 802 00:32:47,680 --> 00:32:51,750 men antar att det är 0x50 här nere, någonstans i datorns minne. 803 00:32:51,750 --> 00:32:55,825 >> Och jag har, till exempel, Gabe i gemener här, som den här. 804 00:32:55,825 --> 00:32:57,120 805 00:32:57,120 --> 00:33:01,980 Och jag har sagt t fäste 0 blir aktiverade. 806 00:33:01,980 --> 00:33:04,860 Tja, t fäste 0 den första bokstaven i t. 807 00:33:04,860 --> 00:33:07,840 Så lite g ska blivit big G. Men problemet 808 00:33:07,840 --> 00:33:09,410 är, vad betyder s också peka på? 809 00:33:09,410 --> 00:33:10,300 >> Publik: Samma. 810 00:33:10,300 --> 00:33:11,841 >> DAVID J. MALAN: Samma exakta sak. 811 00:33:11,841 --> 00:33:16,342 Så en enkel förklaring kanske, även om syntaxen är lite konstigt. 812 00:33:16,342 --> 00:33:17,050 Så låt oss göra det här. 813 00:33:17,050 --> 00:33:20,210 Gör copy-0 och sedan ./copy-0. 814 00:33:20,210 --> 00:33:21,820 815 00:33:21,820 --> 00:33:24,110 Säg något: Gabe. 816 00:33:24,110 --> 00:33:26,760 Och tyvärr, båda dem har nu aktiverats, 817 00:33:26,760 --> 00:33:29,500 men för det underliggande Anledningen till att vi är helt enkelt 818 00:33:29,500 --> 00:33:32,350 Nu behandlar adresser. 819 00:33:32,350 --> 00:33:36,470 >> Så hur ska vi börja address-- no pun intended-- 820 00:33:36,470 --> 00:33:39,270 hur börjar vi ta itu med detta problem? 821 00:33:39,270 --> 00:33:44,400 Tja, i copy1.c, går det för att få lite mer komplicerat. 822 00:33:44,400 --> 00:33:49,310 Men jag skulle göra anspråk på en konceptuellt enkel lösning. 823 00:33:49,310 --> 00:33:50,852 >> Så svårt att få vid första anblicken. 824 00:33:50,852 --> 00:33:53,560 Kommer inte att bli lätt för den första gång du skriver ut det, kanske, 825 00:33:53,560 --> 00:33:57,440 men om problemet är att helt enkelt göra t = s bara 826 00:33:57,440 --> 00:33:59,694 kopierar adressen, vad, igen om jag kan plocka på dig, 827 00:33:59,694 --> 00:34:02,110 kommer att vara lösningen för att faktiskt kopiera en sträng? 828 00:34:02,110 --> 00:34:04,906 829 00:34:04,906 --> 00:34:06,770 >> PUBLIK: Vi kommer förmodligen använda en loop 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 att behöva en slinga igen. 832 00:34:08,390 --> 00:34:11,800 Och för om vi vill kopiera en sträng s in i en annan sträng, 833 00:34:11,800 --> 00:34:14,120 vi förmodligen vill göra det tecken för tecken. 834 00:34:14,120 --> 00:34:17,199 Men problemet är, om detta är ursprungligen s, 835 00:34:17,199 --> 00:34:22,159 Nu måste vi explicit starta allokera minne för t. 836 00:34:22,159 --> 00:34:24,320 >> Med andra ord, låt oss rita ut en sista gång. 837 00:34:24,320 --> 00:34:28,659 Om detta är sträng s = GetString. 838 00:34:28,659 --> 00:34:30,956 839 00:34:30,956 --> 00:34:32,455 Och låt oss sätta upp detta här, liksom. 840 00:34:32,455 --> 00:34:36,639 841 00:34:36,639 --> 00:34:37,420 Detta är GetString. 842 00:34:37,420 --> 00:34:39,070 843 00:34:39,070 --> 00:34:43,860 Och sedan, bilden för något så där kommer att bli som förut, 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 lite ut så här. 847 00:34:48,960 --> 00:34:53,650 Och s Därför kallar vi det 0x50, och det kommer att bli 51, 52. 848 00:34:53,650 --> 00:34:54,409 >> Så det här är 0x50. 849 00:34:54,409 --> 00:34:55,679 850 00:34:55,679 --> 00:34:59,690 Och sedan, jag sträng ton. 851 00:34:59,690 --> 00:35:02,450 Till minne, är det bara att ge mig ett litet torg som denna. 852 00:35:02,450 --> 00:35:04,080 Så vad är nyckeln steget nu? 853 00:35:04,080 --> 00:35:09,870 Om jag vill kopiera s in t, vad tom behöver vi för att fylla i här? 854 00:35:09,870 --> 00:35:12,050 Eller vad behöver vi gör på en hög nivå? 855 00:35:12,050 --> 00:35:14,101 856 00:35:14,101 --> 00:35:14,600 Yeah? 857 00:35:14,600 --> 00:35:16,200 858 00:35:16,200 --> 00:35:17,020 Någon? 859 00:35:17,020 --> 00:35:17,690 Yeah. 860 00:35:17,690 --> 00:35:19,214 >> PUBLIK: Vi måste [ohörbart]. 861 00:35:19,214 --> 00:35:21,380 DAVID J. MALAN: Ja, vi behöver fylla i det här ämnet. 862 00:35:21,380 --> 00:35:24,340 Jag kan inte kopiera och sedan kapitalisera Gabe namn 863 00:35:24,340 --> 00:35:28,120 tills jag ber operativsystemet för en annan bit av minnet 864 00:35:28,120 --> 00:35:30,640 som är minst lika stor som originalet. 865 00:35:30,640 --> 00:35:32,130 Så det lämnar oss med en fråga. 866 00:35:32,130 --> 00:35:36,080 >> Hur får jag be operativsystemet inte bara för en enkel liten pointer-- 867 00:35:36,080 --> 00:35:38,530 som det kallas, en adress, ett pointer-- inte 868 00:35:38,530 --> 00:35:40,980 för en enkel liten låda som detta kallas ett snöre? 869 00:35:40,980 --> 00:35:44,200 Hur får jag be operativsystemet system för en stor bit av minnet? 870 00:35:44,200 --> 00:35:48,430 Hittills har jag bara fått det tillbaka indirekt genom att ringa GetString. 871 00:35:48,430 --> 00:35:50,740 Så hur är GetString även få sitt minne? 872 00:35:50,740 --> 00:35:53,430 >> Tja, det visar sig att det finns denna andra funktion här 873 00:35:53,430 --> 00:35:55,160 att vi nu ska börja använda. 874 00:35:55,160 --> 00:35:59,780 Nu ser det mycket mer kryptiska than-- och jag är den enda som kan se den-- 875 00:35:59,780 --> 00:36:03,150 denna linje ser mycket mer kryptisk då det ska vid första anblicken. 876 00:36:03,150 --> 00:36:04,650 Men låt oss retas isär. 877 00:36:04,650 --> 00:36:07,950 >> På den vänstra sidan, jag har char * t. 878 00:36:07,950 --> 00:36:13,280 Så i engelska, låt oss börja att formulera ordentliga meningar i teknisk jargong. 879 00:36:13,280 --> 00:36:19,757 Så detta avsätter en variabel av typen char * kallas t. 880 00:36:19,757 --> 00:36:21,090 Nu, vad betyder det egentligen? 881 00:36:21,090 --> 00:36:23,881 >> Jo, det betyder, vad ska jag att sätta in denna variabel kallas t? 882 00:36:23,881 --> 00:36:24,780 883 00:36:24,780 --> 00:36:26,402 En adress för en röding. 884 00:36:26,402 --> 00:36:28,360 Så det är bara enklare, rimligare sätt 885 00:36:28,360 --> 00:36:29,930 att beskriva den vänstra sidan. 886 00:36:29,930 --> 00:36:32,890 Så det skapar rutan här bara. 887 00:36:32,890 --> 00:36:34,760 Så den högra sidan, förmodligen, kommer 888 00:36:34,760 --> 00:36:37,170 att fördela det större bit av minnet hur? 889 00:36:37,170 --> 00:36:38,340 Så låt oss retas här isär. 890 00:36:38,340 --> 00:36:41,131 >> Den överväldigande vid första anblicken, men vad som händer här inne? 891 00:36:41,131 --> 00:36:43,740 Först är det malloc, vilket är tydligen vår nya vän, 892 00:36:43,740 --> 00:36:45,450 "Minne fördela." 893 00:36:45,450 --> 00:36:49,560 Så detta är det argument som passerat in i den, så det är ett ganska stort argument. 894 00:36:49,560 --> 00:36:50,970 Så låt oss retas här isär. 895 00:36:50,970 --> 00:36:53,410 >> strlen av ar, naturligtvis, representerar i-- 896 00:36:53,410 --> 00:36:54,142 897 00:36:54,142 --> 00:36:55,600 Publik: Antalet tecken. 898 00:36:55,600 --> 00:36:56,710 DAVID J. MALAN: Bara antalet tecken i er. 899 00:36:56,710 --> 00:36:59,040 Så längden s, den ursprungliga strängen. 900 00:36:59,040 --> 00:37:00,350 Så G-a-b-e. 901 00:37:00,350 --> 00:37:02,320 Så det är nog fyra i det här fallet. 902 00:37:02,320 --> 00:37:05,485 Varför gör jag en efter ringa strlen av s? 903 00:37:05,485 --> 00:37:06,360 PUBLIK: [ohörbart] 904 00:37:06,360 --> 00:37:07,590 David J. MALAN: För att speciell nolltecken. 905 00:37:07,590 --> 00:37:11,260 Om du frågar mig vad är längden på Gabes namn, ska jag säga fyra. 906 00:37:11,260 --> 00:37:14,480 Under huven, men, jag behöver det femte byte för null karaktär. 907 00:37:14,480 --> 00:37:16,100 Så det är därför jag gör en. 908 00:37:16,100 --> 00:37:21,730 >> Nu i fall du kör det här program på en annan än dator, säger, 909 00:37:21,730 --> 00:37:24,610 den CS50 apparaten, där storleken på en röding 910 00:37:24,610 --> 00:37:26,350 kan vara olika från min egen computer-- 911 00:37:26,350 --> 00:37:30,590 visar sig att jag kan kalla detta operatörs sizeof, fråga bara datorn, 912 00:37:30,590 --> 00:37:32,870 vad som är storleken på en char på den här datorn? 913 00:37:32,870 --> 00:37:37,400 >> Och genom att multiplicera fem i detta exempel av storleken på en röding, som 914 00:37:37,400 --> 00:37:40,440 på de flesta datorer kommer bara vara en, malloc 915 00:37:40,440 --> 00:37:44,830 kommer att fördela för mig den här stora bit av minnet över här till höger. 916 00:37:44,830 --> 00:37:47,140 Och det kommer att return-- det är en function-- så det är 917 00:37:47,140 --> 00:37:48,265 kommer att återvända till mig vad? 918 00:37:48,265 --> 00:37:50,914 919 00:37:50,914 --> 00:37:51,830 PUBLIK: Adressen? 920 00:37:51,830 --> 00:37:53,709 DAVID J. MALAN: Adressen till vad? 921 00:37:53,709 --> 00:37:55,250 PUBLIK: Av minnet det fördelas? 922 00:37:55,250 --> 00:37:56,450 DAVID J. MALAN: Av minnet är tilldelade. 923 00:37:56,450 --> 00:37:59,189 Så jag har ingen aning, ärligt talat, när detta kommer att sluta. 924 00:37:59,189 --> 00:38:01,480 Jag kommer att föreslå att det kommer att hamna på 0x88. 925 00:38:01,480 --> 00:38:02,770 926 00:38:02,770 --> 00:38:06,009 Helt godtyckligt, men andra än 0x50 någonstans, 927 00:38:06,009 --> 00:38:08,800 eftersom operativsystemet, vad Windows och Mac OS gör för mig, är 928 00:38:08,800 --> 00:38:11,230 se till att det ger mig olika bitar av RAM. 929 00:38:11,230 --> 00:38:14,210 >> Så detta är värdet där denna bit av minnet kan hamna. 930 00:38:14,210 --> 00:38:16,060 Så det här är vad som hamnar här, 0x88. 931 00:38:16,060 --> 00:38:17,480 932 00:38:17,480 --> 00:38:21,570 Så nu klart, jag kan förstå att detta inte är samma som det, 933 00:38:21,570 --> 00:38:23,960 eftersom de är riktade mot olika bitar av minnet. 934 00:38:23,960 --> 00:38:29,980 Så om jag nu verkligen vill kopiera i, låt oss göra din föreslagna lösning. 935 00:38:29,980 --> 00:38:36,870 >> Låt oss bara gå, skapa en for-loop, och gör t fäste jag blir s fäste i. 936 00:38:36,870 --> 00:38:39,760 För nu kan jag använda denna matris-liknande notation, 937 00:38:39,760 --> 00:38:43,390 för även om malloc mycket generiskt allokerar mig minne, 938 00:38:43,390 --> 00:38:45,290 minnet är bara angränsande bitgrupper. 939 00:38:45,290 --> 00:38:47,240 Byte, byte, byte, rygg mot rygg mot rygg. 940 00:38:47,240 --> 00:38:50,030 >> Jag kan säkert som programmerare behandla det som en array, vilket 941 00:38:50,030 --> 00:38:55,090 betyder att jag kan använda det här till slut bekant notation av bara några hakparenteser. 942 00:38:55,090 --> 00:38:56,462 943 00:38:56,462 --> 00:39:00,020 >> Så låt mig göra en paus där, eftersom detta är ett mycket allt på en gång, till och med 944 00:39:00,020 --> 00:39:03,530 men den grundläggande idén att sammanfatta är att strängen, hela tiden, 945 00:39:03,530 --> 00:39:05,550 är inte en ny datatyp per se. 946 00:39:05,550 --> 00:39:10,150 Det är bara en så kallad pekare, en adress för ett tecken, 947 00:39:10,150 --> 00:39:12,650 vilket bara betyder att det är ett nummer att genom mänsklig konvention 948 00:39:12,650 --> 00:39:15,350 vi tenderar att skriva som 0x något. 949 00:39:15,350 --> 00:39:18,590 >> Men det är bara en siffra, som 33 Oxford Street, 950 00:39:18,590 --> 00:39:20,530 som råkar vara den CS byggnadens adress. 951 00:39:20,530 --> 00:39:22,000 952 00:39:22,000 --> 00:39:23,545 Eventuella frågor om dessa uppgifter? 953 00:39:23,545 --> 00:39:24,790 954 00:39:24,790 --> 00:39:25,289 Yeah? 955 00:39:25,289 --> 00:39:28,530 >> PUBLIK: Varför måste vi kolla för t lika med noll? 956 00:39:28,530 --> 00:39:30,740 >> DAVID J. MALAN: Varför måste vi kontrollera om t är lika med noll? 957 00:39:30,740 --> 00:39:33,250 Om vi ​​läser documentation-- stor question-- för malloc, 958 00:39:33,250 --> 00:39:37,020 det kommer att säga i finstilta, ibland malloc kan returnera null, 959 00:39:37,020 --> 00:39:38,080 precis som GetString. 960 00:39:38,080 --> 00:39:41,820 Och faktiskt, återvänder GetString null om det i sin tur returnerar malloc null, 961 00:39:41,820 --> 00:39:43,130 eftersom GetString använder malloc. 962 00:39:43,130 --> 00:39:46,400 >> Och som skulle kunna hända om OS Mac OS, Windows, vad som helst, är helt enkelt 963 00:39:46,400 --> 00:39:48,130 slut på minne för dig. 964 00:39:48,130 --> 00:39:49,820 Så det är vad som hände där. 965 00:39:49,820 --> 00:39:52,910 >> Och låt mig avslöja en annan sak som kanske bara blåsa dig 966 00:39:52,910 --> 00:39:55,100 eller helt vara alltför långt över linjen. 967 00:39:55,100 --> 00:39:59,770 Men låt mig dra upp samma för slinga för kopiering, 968 00:39:59,770 --> 00:40:05,480 som nyss var återkallande detta. t fäste jag blir s fäste i. 969 00:40:05,480 --> 00:40:06,740 >> Trevligt och användarvänliga. 970 00:40:06,740 --> 00:40:09,330 Känns som Vecka två igen. 971 00:40:09,330 --> 00:40:14,920 Men denna version kan faktiskt vara skrivas om som detta, som ser kryptisk. 972 00:40:14,920 --> 00:40:18,280 Det är en teknik som kallas pekare aritmetik, adress aritmetik. 973 00:40:18,280 --> 00:40:19,600 Men varför fungerar det? 974 00:40:19,600 --> 00:40:22,220 >> Nu irriterande, den författarna C beslutat att använda 975 00:40:22,220 --> 00:40:25,070 symbolen * för olika ändamål. 976 00:40:25,070 --> 00:40:29,020 Vi har sett det användas en gång redan, char *, som betyder "ge mig en variabel 977 00:40:29,020 --> 00:40:31,210 som kommer att innehålla adressen till en röding. " 978 00:40:31,210 --> 00:40:33,990 Så char * i det sammanhanget betyder "ge mig en variabel." 979 00:40:33,990 --> 00:40:40,050 >> Tyvärr, om du använder * utan ett ord på framsidan av det, som röding, 980 00:40:40,050 --> 00:40:41,905 det nu kallas dereference operatör. 981 00:40:41,905 --> 00:40:43,530 Och vi får se mer av detta inom kort. 982 00:40:43,530 --> 00:40:44,930 Men det betyder bara "gå dit." 983 00:40:44,930 --> 00:40:49,070 Det är som att säga, om någon gav mig på ett papper "33 Oxford Street," 984 00:40:49,070 --> 00:40:53,830 om jag gör "* 33 Oxford Street," det betyder "Gå vägen till CS byggnaden." 985 00:40:53,830 --> 00:40:57,220 >> Så * betyder bara åka dit om det finns inget ord framför den. 986 00:40:57,220 --> 00:40:59,100 Så vad är t, att vara tydlig? 987 00:40:59,100 --> 00:41:03,250 t är adressen för den bit av minne som gavs tillbaka till mig. 988 00:41:03,250 --> 00:41:06,650 s är adressen till vilken, för att vara tydlig, i exemplet som vi har diskuterat, 989 00:41:06,650 --> 00:41:07,500 av gemener gabe? 990 00:41:07,500 --> 00:41:08,990 991 00:41:08,990 --> 00:41:10,005 s är den adress of-- 992 00:41:10,005 --> 00:41:11,585 993 00:41:11,585 --> 00:41:12,460 AUDIENCE: Strängen. 994 00:41:12,460 --> 00:41:14,126 DAVID J. MALAN: Av Gabe ursprungliga namn. 995 00:41:14,126 --> 00:41:16,660 Så det är adressen till denna bit av minnet. 996 00:41:16,660 --> 00:41:22,220 Så om jag säger t + Jag-- i, varsel, är bara vår gamla vän. 997 00:41:22,220 --> 00:41:24,770 Det är bara en indexvariabel som är iteration från noll om upp 998 00:41:24,770 --> 00:41:26,960 till längden på strängen ar. 999 00:41:26,960 --> 00:41:30,367 Så det kommer att bli noll, då man, sedan två, sedan tre, sedan fyra. 1000 00:41:30,367 --> 00:41:33,200 Så låt oss sätta ihop dessa nya Scratch-liknande pusselbitar, om ni så vill, 1001 00:41:33,200 --> 00:41:36,140 trots att, återigen, syntaxen är mycket mer svårbegripliga än Scratch. 1002 00:41:36,140 --> 00:41:39,522 Så t är en adress + Jag kommer att ge mig 1003 00:41:39,522 --> 00:41:42,480 ett nummer, eftersom dessa är alla siffror som vi har teckning som hex. 1004 00:41:42,480 --> 00:41:43,560 Men de är bara siffror. 1005 00:41:43,560 --> 00:41:49,960 >> Så om adressen t vi sagt var 0x88, vad är 0x88 plus noll. 1006 00:41:49,960 --> 00:41:51,564 1007 00:41:51,564 --> 00:41:53,980 Även om du inte är bekväm med hex ännu, ta en gissning. 1008 00:41:53,980 --> 00:41:54,410 >> PUBLIK: Det ursprungliga. 1009 00:41:54,410 --> 00:41:55,850 >> DAVID J. MALAN: Fortfarande 0x88. 1010 00:41:55,850 --> 00:41:58,910 Så vad betyder * 0x88 detta? 1011 00:41:58,910 --> 00:42:02,670 Det betyder, "gå dit", vilket innebär effektivt, "sätta fingret här." 1012 00:42:02,670 --> 00:42:06,930 Och nu på höger sida av detta uttryck, * och sedan i parens, 1013 00:42:06,930 --> 00:42:11,586 s + i betyder s, vilket är den adressera upp här i den lilla g. 1014 00:42:11,586 --> 00:42:16,220 s + 0 är, naturligtvis, s, oavsett s är. 1015 00:42:16,220 --> 00:42:21,230 >> Så nu är det * s, vilket precis som * 33 Oxford Street betyder gå till adressen 1016 00:42:21,230 --> 00:42:22,010 ar. 1017 00:42:22,010 --> 00:42:24,170 Så här är det finger, höger hand. 1018 00:42:24,170 --> 00:42:26,050 Så vad ska jag kopiera i vad? 1019 00:42:26,050 --> 00:42:30,260 Grejen till höger, vilket är gabe, lilla g här, in på här. 1020 00:42:30,260 --> 00:42:32,750 >> Och så effekten av detta första iteration av slingan, 1021 00:42:32,750 --> 00:42:36,200 som ni föreslog, även om det ser galen mer komplicerat än vad som helst 1022 00:42:36,200 --> 00:42:42,110 vi har sett tidigare, är helt enkelt att säga gå hit och kopiera tecknet här. 1023 00:42:42,110 --> 00:42:44,700 Det ger dig en karta till båda platserna. 1024 00:42:44,700 --> 00:42:46,130 >> Och vi får se mycket mer av det här. 1025 00:42:46,130 --> 00:42:50,600 Men för tillfället är hoppet bara för att introducera några av dessa grundläggande idéer. 1026 00:42:50,600 --> 00:42:53,550 Och faktiskt, låt oss titta på en sista program här, 1027 00:42:53,550 --> 00:42:57,480 och sedan den utlovade claymation, vilket kommer att göra allt bra. 1028 00:42:57,480 --> 00:42:57,980 Okej. 1029 00:42:57,980 --> 00:43:01,680 Så låt mig öppna up-- där vi går. 1030 00:43:01,680 --> 00:43:02,850 1031 00:43:02,850 --> 00:43:05,440 Så låt mig-- vi ska återkomma till den här bilden snart. 1032 00:43:05,440 --> 00:43:08,360 Låt mig öppna upp denna sista exemplet här. 1033 00:43:08,360 --> 00:43:09,440 1034 00:43:09,440 --> 00:43:12,710 >> Så här är en super, super program som åstadkommer 1035 00:43:12,710 --> 00:43:15,050 ingenting i livet som gör följande. 1036 00:43:15,050 --> 00:43:18,740 Den förklarar först två variabler, x och y, som inte är siffror den här gången, 1037 00:43:18,740 --> 00:43:19,240 per se. 1038 00:43:19,240 --> 00:43:20,448 De är inte heltal, per se. 1039 00:43:20,448 --> 00:43:22,899 De är tydligen int *. 1040 00:43:22,899 --> 00:43:25,690 Så vem som helst, vad betyder det om din datatyp, din variabel, 1041 00:43:25,690 --> 00:43:26,860 är av typen int * stjärna? 1042 00:43:26,860 --> 00:43:30,240 Det är adressen till en int. 1043 00:43:30,240 --> 00:43:31,990 >> Så jag har ingen aning om var det är än. 1044 00:43:31,990 --> 00:43:35,150 Det betyder bara "sätta, så småningom, adressen till en int här. " 1045 00:43:35,150 --> 00:43:38,340 0x50, 0x88, oavsett var det är i minne, är en adress kommer det. 1046 00:43:38,340 --> 00:43:40,200 Och det är vad y är kommer att bli, liksom. 1047 00:43:40,200 --> 00:43:44,920 >> Om jag nu säger x = malloc (sizeof (int)), Detta är ett finare sätt att säga, 1048 00:43:44,920 --> 00:43:49,000 hey operativsystem, via malloc, ge mig tillräckligt med minne för storleken 1049 00:43:49,000 --> 00:43:52,370 av en int, vilket förmodligen kommer att vara 32 bitar eller fyra byte. 1050 00:43:52,370 --> 00:43:53,680 >> Så vad betyder malloc tillbaka? 1051 00:43:53,680 --> 00:43:55,250 Malloc returnerar en adress. 1052 00:43:55,250 --> 00:43:57,020 Så vad som kommer att få lagras i x? 1053 00:43:57,020 --> 00:44:00,600 Adressen till bit av minne, de fyra byte, malloc som 1054 00:44:00,600 --> 00:44:03,360 just hittat för mig genom att fråga operativsystemet. 1055 00:44:03,360 --> 00:44:08,240 >> Nu under tiden, linje fyra här, * x = 42. 1056 00:44:08,240 --> 00:44:09,990 Bara för att vara tydlig, vad som händer där nere? 1057 00:44:09,990 --> 00:44:11,530 På vänster sida, * x. 1058 00:44:11,530 --> 00:44:13,610 det är som * 33 Oxford Street. 1059 00:44:13,610 --> 00:44:15,523 Så * x betyder vad? 1060 00:44:15,523 --> 00:44:16,450 >> PUBLIK: Gå till. 1061 00:44:16,450 --> 00:44:17,908 >> DAVID J. MALAN: Gå till den adressen. 1062 00:44:17,908 --> 00:44:20,466 Varhelst denna bit av minnet är, gå till det. 1063 00:44:20,466 --> 00:44:21,979 Och sätta vad där, självklart? 1064 00:44:21,979 --> 00:44:22,520 Publik: 42. 1065 00:44:22,520 --> 00:44:23,580 David J. MALAN: 42. 1066 00:44:23,580 --> 00:44:25,650 Okej, * y, samma idé. 1067 00:44:25,650 --> 00:44:26,860 Gå till adressen i y. 1068 00:44:26,860 --> 00:44:31,740 Sätt nummer 13 där, men vad är y just nu? 1069 00:44:31,740 --> 00:44:33,172 1070 00:44:33,172 --> 00:44:34,630 PUBLIK: Det finns inget minne för y. 1071 00:44:34,630 --> 00:44:35,710 David J. MALAN: Det är inget minne för y. 1072 00:44:35,710 --> 00:44:38,215 Så vad gör y förmodligen innehåller, som vi har sagt? 1073 00:44:38,215 --> 00:44:38,520 >> PUBLIKEN: sopor. 1074 00:44:38,520 --> 00:44:39,480 >> DAVID J. MALAN: Vissa sopor värde. 1075 00:44:39,480 --> 00:44:41,320 Nu är skräp värde fortfarande ett antal. 1076 00:44:41,320 --> 00:44:43,160 Det kan fortfarande misstas för en adress. 1077 00:44:43,160 --> 00:44:45,160 Det är som om någon klottrat något nedåt, 1078 00:44:45,160 --> 00:44:48,002 och jag misstolkat det på så sätt vissa byggnad på gatan. 1079 00:44:48,002 --> 00:44:50,460 Och om du bara försöka att gå in vissa byggnad som du inte äger, 1080 00:44:50,460 --> 00:44:53,710 eller någon bit av minne du har inte varit given, kan dåliga saker hända. 1081 00:44:53,710 --> 00:44:57,740 Dator kan krascha, eller någon annan obestämd beteende kan hända. 1082 00:44:57,740 --> 00:45:01,310 >> Så introt då att Binky är här. 1083 00:45:01,310 --> 00:45:04,290 Jag minns fortfarande, 20 några udda år senare, 1084 00:45:04,290 --> 00:45:07,200 där jag var när jag äntligen förstod pekare. 1085 00:45:07,200 --> 00:45:09,520 >> Vilket betyder att om du lämna här på tre minuter 1086 00:45:09,520 --> 00:45:12,170 och tror att jag inte förstå pekare, inser 1087 00:45:12,170 --> 00:45:14,410 Jag har ihågkommen för 20 år för någon galen anledning 1088 00:45:14,410 --> 00:45:17,140 när och varför det äntligen sjunkit i, sitter med min undervisning 1089 00:45:17,140 --> 00:45:19,501 karl, Nishat Mehta i baksidan av Eliot Dining Hall. 1090 00:45:19,501 --> 00:45:21,250 Nu har jag mindes detta eftersom detta var 1091 00:45:21,250 --> 00:45:23,920 ett av de ämnen jag, i Särskilt kämpade med. 1092 00:45:23,920 --> 00:45:26,470 Och sedan, det äntligen klickade, som jag vågar säga en massa ämnen 1093 00:45:26,470 --> 00:45:27,460 så småningom kommer. 1094 00:45:27,460 --> 00:45:32,590 Och nu, för att göra det känner alla gladare och desto mer övertygande, 1095 00:45:32,590 --> 00:45:35,360 låt oss ta en sista titt i vår sista tre minuter här på Binky, 1096 00:45:35,360 --> 00:45:37,675 från vår vän, Nick Parlante från Stanford. 1097 00:45:37,675 --> 00:45:38,910 1098 00:45:38,910 --> 00:45:41,580 >> [VIDEOAVSPELNING] 1099 00:45:41,580 --> 00:45:42,750 >> Hej, Binky. 1100 00:45:42,750 --> 00:45:43,500 Vakna! 1101 00:45:43,500 --> 00:45:45,960 Det är dags för pekaren kul. 1102 00:45:45,960 --> 00:45:47,012 >> Vad är det? 1103 00:45:47,012 --> 00:45:48,723 Lär dig mer om pekare? 1104 00:45:48,723 --> 00:45:50,580 Åh, goody! 1105 00:45:50,580 --> 00:45:53,563 >> -Tja, För att komma igång, jag antar att vi är kommer att behöva ett par pekare. 1106 00:45:53,563 --> 00:45:54,390 >> -OK. 1107 00:45:54,390 --> 00:45:57,930 Denna kod tilldelar två pekare, vilket kan peka på heltal. 1108 00:45:57,930 --> 00:45:58,430 -OK. 1109 00:45:58,430 --> 00:46:02,140 Tja, jag ser de två pekare, men de verkar inte vara riktad till något. 1110 00:46:02,140 --> 00:46:02,980 >> -Det Är rätt. 1111 00:46:02,980 --> 00:46:05,100 Inledningsvis, pekare tyder inte på någonting. 1112 00:46:05,100 --> 00:46:08,030 De saker de pekar på kallas pointees, och ställa upp dem för 1113 00:46:08,030 --> 00:46:09,370 ett separat steg. 1114 00:46:09,370 --> 00:46:10,220 >> -Oh, Höger, höger. 1115 00:46:10,220 --> 00:46:10,950 Jag visste det. 1116 00:46:10,950 --> 00:46:12,385 De pointees är separata. 1117 00:46:12,385 --> 00:46:14,315 Er, så hur ska du tilldela 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 Tja, allokerar denna kod ett nytt heltal pointee, 1121 00:46:18,970 --> 00:46:20,950 och Denna del innehåller x att peka på den. 1122 00:46:20,950 --> 00:46:22,050 1123 00:46:22,050 --> 00:46:23,230 >> Hej, ser det bättre. 1124 00:46:23,230 --> 00:46:25,060 Så gör det gör något. 1125 00:46:25,060 --> 00:46:25,990 >> -OK. 1126 00:46:25,990 --> 00:46:30,455 Jag ska avreferera pekaren x till lagra numret 42 i sin pointee. 1127 00:46:30,455 --> 00:46:32,830 För detta trick, jag behöver min Trollstaven i dereferencing. 1128 00:46:32,830 --> 00:46:34,130 1129 00:46:34,130 --> 00:46:36,080 >> -Din Trollstaven för Namnåtergång? 1130 00:46:36,080 --> 00:46:37,357 1131 00:46:37,357 --> 00:46:38,190 Det-- det är bra. 1132 00:46:38,190 --> 00:46:39,340 1133 00:46:39,340 --> 00:46:41,080 >> Det här är vad koden ser ut. 1134 00:46:41,080 --> 00:46:44,110 Jag ska bara ställa in numret och [POP] 1135 00:46:44,110 --> 00:46:44,700 >> Hej, titta. 1136 00:46:44,700 --> 00:46:46,140 Där det går. 1137 00:46:46,140 --> 00:46:50,980 >> -Så Gör en dereference på x följer pilen för att komma åt dess pointee. 1138 00:46:50,980 --> 00:46:53,160 I detta fall är en butik 42 därinne. 1139 00:46:53,160 --> 00:46:57,710 Hej prova att använda den för att lagra numret 13 genom den andra pekaren, y. 1140 00:46:57,710 --> 00:46:58,760 >> -OK. 1141 00:46:58,760 --> 00:47:03,270 Jag ska bara gå hit till y, och få nummer 13 inrättas. 1142 00:47:03,270 --> 00:47:07,930 Och sedan, ta Wand av Namnåtergång och bara [BUZZ] 1143 00:47:07,930 --> 00:47:08,960 >> -Oh! 1144 00:47:08,960 --> 00:47:09,500 >> -Oh, Hey! 1145 00:47:09,500 --> 00:47:11,090 Det fungerade inte. 1146 00:47:11,090 --> 00:47:15,630 Säg, Binky, jag tror inte dereferencing y är en bra idé, eftersom du vet, 1147 00:47:15,630 --> 00:47:17,850 inrättande av pointee är ett separat steg. 1148 00:47:17,850 --> 00:47:20,450 Och jag tror inte att vi någonsin gjorde det. 1149 00:47:20,450 --> 00:47:21,480 >> -Bra Punkt. 1150 00:47:21,480 --> 00:47:21,980 Ja. 1151 00:47:21,980 --> 00:47:25,680 Vi tilldelade pekaren y, men vi aldrig ställa in den att peka på en pointee. 1152 00:47:25,680 --> 00:47:27,190 1153 00:47:27,190 --> 00:47:28,616 >> -Väldigt Observant. 1154 00:47:28,616 --> 00:47:30,240 Hej, du ser bra ut där, Binky. 1155 00:47:30,240 --> 00:47:33,400 Kan du fixa det så att y punkter till samma pointee som x? 1156 00:47:33,400 --> 00:47:34,000 >> Visst. 1157 00:47:34,000 --> 00:47:36,780 Jag använder min Trollstav av Pointer Uppdrag. 1158 00:47:36,780 --> 00:47:38,740 >> -Är Det kommer att bli ett problem som förut? 1159 00:47:38,740 --> 00:47:39,240 Nej. 1160 00:47:39,240 --> 00:47:40,660 Detta berör inte de pointees. 1161 00:47:40,660 --> 00:47:44,450 Det förändrar bara en pekare till pekar på samma sak som en annan. 1162 00:47:44,450 --> 00:47:45,450 >> -Oh, Ser jag. 1163 00:47:45,450 --> 00:47:48,200 Nu y pekar på samma plats som x. 1164 00:47:48,200 --> 00:47:48,910 Så vänta. 1165 00:47:48,910 --> 00:47:49,950 Nu är y fixerad. 1166 00:47:49,950 --> 00:47:51,120 Den har en pointee. 1167 00:47:51,120 --> 00:47:54,510 Så du kan prova Wand av Namnåtergång igen för att skicka den 13 över. 1168 00:47:54,510 --> 00:47:56,510 >> -Uh, OK. 1169 00:47:56,510 --> 00:47:58,160 Här går. [POP] 1170 00:47:58,160 --> 00:47:59,340 >> Hej, titta på det. 1171 00:47:59,340 --> 00:48:00,750 Nu dereferencing arbeten på y. 1172 00:48:00,750 --> 00:48:04,991 Och eftersom pekarna delar att en pointee, de båda ser 13. 1173 00:48:04,991 --> 00:48:05,490 Ja. 1174 00:48:05,490 --> 00:48:06,870 Att dela, vad som helst. 1175 00:48:06,870 --> 00:48:08,820 Så ska vi byta plats nu? 1176 00:48:08,820 --> 00:48:09,440 >> Åh, titta. 1177 00:48:09,440 --> 00:48:10,830 Vi är för sent. 1178 00:48:10,830 --> 00:48:11,570 >> -But-- 1179 00:48:11,570 --> 00:48:13,530 >> -Bara Ihåg de tre pekarreglerna. 1180 00:48:13,530 --> 00:48:16,560 Number One, den grundläggande strukturen är att du har en pekare, 1181 00:48:16,560 --> 00:48:18,680 och det pekar över till ett pointee. 1182 00:48:18,680 --> 00:48:20,640 Men pekaren och pointee är separata, 1183 00:48:20,640 --> 00:48:22,610 och vanligt fel är att inrätta en pekare, 1184 00:48:22,610 --> 00:48:25,000 utan att glömma att ge det en pointee. 1185 00:48:25,000 --> 00:48:28,170 >> Number Two, pekare dereferencing börjar vid pekaren 1186 00:48:28,170 --> 00:48:31,050 och följer dess pilen över för att komma åt dess pointee. 1187 00:48:31,050 --> 00:48:33,400 Som vi alla vet, det här fungerar bara om det finns 1188 00:48:33,400 --> 00:48:36,270 en pointee, vilken typ av kommer tillbaka till regel nummer ett. 1189 00:48:36,270 --> 00:48:39,000 >> Number Three, pekare Uppdraget tar en pekare 1190 00:48:39,000 --> 00:48:42,320 och ändrar den till att peka på samma pointee som en annan pekare. 1191 00:48:42,320 --> 00:48:44,160 Så efter överlåtelsen, de två pekarna 1192 00:48:44,160 --> 00:48:45,910 kommer att peka på samma pointee. 1193 00:48:45,910 --> 00:48:47,990 Ibland är det som kallas delning. 1194 00:48:47,990 --> 00:48:49,740 Och det är allt som finns till den, verkligen. 1195 00:48:49,740 --> 00:48:50,277 Bye-bye nu. 1196 00:48:50,277 --> 00:48:51,110 [END VIDEOAVSPELNING] 1197 00:48:51,110 --> 00:48:52,568 DAVID J. MALAN: Det är det för CS50. 1198 00:48:52,568 --> 00:48:55,110 Vi ses nästa vecka. 1199 00:48:55,110 --> 00:48:56,064