1 00:00:00,000 --> 00:00:03,395 >> [MUSIK SPELA] 2 00:00:03,395 --> 00:00:11,031 3 00:00:11,031 --> 00:00:13,280 David J. MALAN: Detta är som en förstaårselev seminarium i dag. 4 00:00:13,280 --> 00:00:14,060 OK. 5 00:00:14,060 --> 00:00:15,024 Så mycket regniga ut. 6 00:00:15,024 --> 00:00:17,690 Detta tenderar att ske på onsdagar, men desto mer möjligheter 7 00:00:17,690 --> 00:00:18,700 för frågor i dag. 8 00:00:18,700 --> 00:00:22,210 Så låt oss börja faktiskt med filmen på bara ett ögonblick. 9 00:00:22,210 --> 00:00:24,560 Men vi börjar storslaget som alltid. 10 00:00:24,560 --> 00:00:28,000 >> Detta är CS50, och detta är slutet av vecka 4. 11 00:00:28,000 --> 00:00:30,820 Så om du någonsin har sett TV eller se en film, där 12 00:00:30,820 --> 00:00:34,690 det finns vissa dataexperter och polisen eller FBI, eller någon byrå 13 00:00:34,690 --> 00:00:36,930 försöker fånga några motståndare, ja, du har 14 00:00:36,930 --> 00:00:40,850 säkert hört uttrycket "förbättra" varvid att teknikern på något sätt 15 00:00:40,850 --> 00:00:44,750 magiskt zoomar in oändligt långt för att se brottslingar 16 00:00:44,750 --> 00:00:48,640 identitet eller registreringsnumret även i de skimmer av en spegel 17 00:00:48,640 --> 00:00:50,390 eller glimt av någons ögon. 18 00:00:50,390 --> 00:00:55,196 Så ja, låt oss ta en titt på några sådana scener från Hollywood. 19 00:00:55,196 --> 00:00:55,862 [VIDEOAVSPELNING] 20 00:00:55,862 --> 00:00:59,243 -Okej, Nu ska vi få en ordentlig titt på dig. 21 00:00:59,243 --> 00:01:06,488 22 00:01:06,488 --> 00:01:07,415 >> -Stopp. 23 00:01:07,415 --> 00:01:08,267 Kör det tillbaka. 24 00:01:08,267 --> 00:01:09,121 >> -Vänta En minut. 25 00:01:09,121 --> 00:01:11,300 Gå höger. 26 00:01:11,300 --> 00:01:12,209 >> -Det, Frysa det. 27 00:01:12,209 --> 00:01:12,750 -Fullskärm. 28 00:01:12,750 --> 00:01:13,558 -Okej, Frysa det. 29 00:01:13,558 --> 00:01:14,820 -Tighten Upp på det, kommer du? 30 00:01:14,820 --> 00:01:16,530 -Vector In på den killen av bakhjulet. 31 00:01:16,530 --> 00:01:19,400 -ZOOM In här på denna plats. 32 00:01:19,400 --> 00:01:22,846 -Med Rätt utrustning, bilden kan förstoras och skärpas. 33 00:01:22,846 --> 00:01:24,065 -Vad är det? 34 00:01:24,065 --> 00:01:25,600 -Det Är en förbättring program. 35 00:01:25,600 --> 00:01:26,860 -Kan Du klart att upp någon? 36 00:01:26,860 --> 00:01:27,890 -Jag Vet inte. 37 00:01:27,890 --> 00:01:29,050 Låt oss förbättra den. 38 00:01:29,050 --> 00:01:31,575 >> -Förbättra Avsnitt A6. 39 00:01:31,575 --> 00:01:33,642 >> -Jag Förbättrade detalj, och-- Jag tror att det finns 40 00:01:33,642 --> 00:01:35,433 tillräckligt för att förbättra, Släpp det till min skärm. 41 00:01:35,433 --> 00:01:37,080 -Jag Förbättrade reflektion i hennes ögon. 42 00:01:37,080 --> 00:01:38,830 >> -Vi Kör detta genom videoförbättring. 43 00:01:38,830 --> 00:01:40,100 -Edgar, Kan du förbättra detta? 44 00:01:40,100 --> 00:01:41,875 >> -Vänta. 45 00:01:41,875 --> 00:01:44,010 >> -Jag Har arbetat med denna reflektion. 46 00:01:44,010 --> 00:01:44,995 >> -Någon Reflektion. 47 00:01:44,995 --> 00:01:45,495 -Reflection. 48 00:01:45,495 --> 00:01:47,399 -Det Finns en återspegling av mannens ansikte. 49 00:01:47,399 --> 00:01:48,065 -Den Reflektion. 50 00:01:48,065 --> 00:01:48,981 -Det Finns en reflektion. 51 00:01:48,981 --> 00:01:50,600 -ZOOM I på spegeln. 52 00:01:50,600 --> 00:01:52,712 -Du Kan se en reflektion. 53 00:01:52,712 --> 00:01:54,350 -Kan Du förbättra bilden härifrån? 54 00:01:54,350 --> 00:01:55,370 -Kan Du förbättra honom just här? 55 00:01:55,370 --> 00:01:56,210 -Kan Du förbättra den? 56 00:01:56,210 --> 00:01:56,900 Kan du förbättra den? 57 00:01:56,900 --> 00:01:57,870 >> -Kan Vi förstärka denna? 58 00:01:57,870 --> 00:01:58,717 >> -Kan Du förbättra den? 59 00:01:58,717 --> 00:02:00,050 -Hold På en sekund, jag förbättra. 60 00:02:00,050 --> 00:02:00,924 -ZOOM I på dörren. 61 00:02:00,924 --> 00:02:01,700 -Tider 10. 62 00:02:01,700 --> 00:02:02,586 -ZOOM. 63 00:02:02,586 --> 00:02:03,490 -Flytta in. 64 00:02:03,490 --> 00:02:03,990 -mer. 65 00:02:03,990 --> 00:02:04,690 -Vänta, Sluta. 66 00:02:04,690 --> 00:02:05,190 -Sluta. 67 00:02:05,190 --> 00:02:05,970 -Pause Den. 68 00:02:05,970 --> 00:02:09,460 -Rotate Oss 75 grader runt den vertikala, tack. 69 00:02:09,460 --> 00:02:10,962 -Sluta. 70 00:02:10,962 --> 00:02:14,040 Gå tillbaka till den del om dörren, igen. 71 00:02:14,040 --> 00:02:15,860 >> -Got En bildförstärkare som kan bitmapp? 72 00:02:15,860 --> 00:02:18,776 >> -Hej, Kanske vi kan använda Pradeep Sen metod för att se in i fönstren. 73 00:02:18,776 --> 00:02:20,372 -detta Programvara är state of the art. 74 00:02:20,372 --> 00:02:21,845 >> -Den Egenvärde är avstängd. 75 00:02:21,845 --> 00:02:24,300 >> -Med Höger kombination av algorithm-- 76 00:02:24,300 --> 00:02:26,755 >> -Han Är tagen eliminering algoritmer till nästa nivå, 77 00:02:26,755 --> 00:02:28,730 och jag kan använda dem för att förstärka denna fotograferar. 78 00:02:28,730 --> 00:02:31,286 >> -Lock På och förstora z-axeln. 79 00:02:31,286 --> 00:02:32,560 >> -Förbättra. 80 00:02:32,560 --> 00:02:33,100 >> -Förbättra. 81 00:02:33,100 --> 00:02:33,600 >> -Förbättra. 82 00:02:33,600 --> 00:02:34,960 -Freeze Och förbättra. 83 00:02:34,960 --> 00:02:37,180 >> [END SPELA] 84 00:02:37,180 --> 00:02:41,160 >> DAVID J. MALAN: Okej, så alla av dem är faktiskt ord. 85 00:02:41,160 --> 00:02:44,450 De är bara uppträdda tillsammans i en sätt som är egentligen inte klokt. 86 00:02:44,450 --> 00:02:48,400 Och i själva verket, CS50 och kurser som det tenderar att förstöra en hel del TV och filmer 87 00:02:48,400 --> 00:02:48,900 för dig. 88 00:02:48,900 --> 00:02:52,330 För när de dataexperter är rabbla villkor och säger 89 00:02:52,330 --> 00:02:56,860 tjusiga saker som egenvektorer och z-axeln, 90 00:02:56,860 --> 00:02:59,572 och vilket som helst antal andra faktiskt mer tekniska termer, 91 00:02:59,572 --> 00:03:02,030 de är egentligen bara strängarna ord tillsammans alltför ofta. 92 00:03:02,030 --> 00:03:05,020 Är det en av våra förhoppningar är att som en bieffekt av att ta kurser 93 00:03:05,020 --> 00:03:08,245 gillar det här, fler kommer människor i värld faktiskt kunna väga in 94 00:03:08,245 --> 00:03:12,040 och bara någonsin så lite påverka kvalitet och noggrannhet av dessa filmer? 95 00:03:12,040 --> 00:03:14,350 >> I själva verket, låt oss ta en titt på verkligheten. 96 00:03:14,350 --> 00:03:18,070 Så här är personalen foto Maria, en av våra undervisnings medmänniskor. 97 00:03:18,070 --> 00:03:20,050 Och antar att hon är misstänkt för något. 98 00:03:20,050 --> 00:03:23,730 Och ändå finns det en strimma av några bevis i hennes ögon, 99 00:03:23,730 --> 00:03:25,480 eller i en återspegling av hennes glasögon. 100 00:03:25,480 --> 00:03:30,760 Tja, om vi gör precis som filmerna föreslå, där vi in ​​och "förbättra", 101 00:03:30,760 --> 00:03:34,080 detta är hur mycket information är i Marias ansikte 102 00:03:34,080 --> 00:03:36,795 När du tar en bild med den ursprungliga upplösningen. 103 00:03:36,795 --> 00:03:39,120 >> Och i själva verket kan du se dessa punkter. 104 00:03:39,120 --> 00:03:41,900 Och dessa är vad som kallade pixlar, p-i-X-E-L-S, 105 00:03:41,900 --> 00:03:45,740 vilket är bara en kvadrat typiskt det är en punkt som komponerar en bild. 106 00:03:45,740 --> 00:03:49,200 Och tillbaka i dag, och faktiskt även idag med några av dagens LED-TV 107 00:03:49,200 --> 00:03:51,950 eller LCD-TV, om du har en i ditt rum eller hemma, 108 00:03:51,950 --> 00:03:55,100 om du går upp super nära till den, och speciellt om det är en något äldre TV, 109 00:03:55,100 --> 00:03:58,760 kan du förmodligen även se dessa punkter och det är vad komponera en bild. 110 00:03:58,760 --> 00:04:00,980 >> Och det finns ingen mer information än detta. 111 00:04:00,980 --> 00:04:05,400 Vi kunde "öka", i betydelsen utjämning saker om och typ av 112 00:04:05,400 --> 00:04:09,040 frånhändas typ av, typ av vad Färgen ska vara intill Maria öga 113 00:04:09,040 --> 00:04:10,910 så att det är faktiskt inte så pixelated. 114 00:04:10,910 --> 00:04:14,510 Men om jag fortsätter zoomar in, det är den dåliga killen i hennes ögon. 115 00:04:14,510 --> 00:04:16,600 Som det är alla Information har vi. 116 00:04:16,600 --> 00:04:18,920 Du kan inte skapa uppgifter ur ingenting. 117 00:04:18,920 --> 00:04:20,790 Det finns bara en begränsad antal bitar där. 118 00:04:20,790 --> 00:04:22,873 >> Så i Problem Set 4, där du har en möjlighet 119 00:04:22,873 --> 00:04:24,580 att spela med den här typen av världen. 120 00:04:24,580 --> 00:04:27,610 I Problem Set 4, kommer du utforska värld av grafik, och kriminalteknik, 121 00:04:27,610 --> 00:04:30,870 och faktiskt skriva kod som återvinner förlorade bilder. 122 00:04:30,870 --> 00:04:33,510 Du kommer att skriva kod som manipulerar befintliga bilder 123 00:04:33,510 --> 00:04:36,120 och slutligen förstå vad som är pågår under huven. 124 00:04:36,120 --> 00:04:38,540 >> Och visar det sig, det är faktiskt inte så komplicerat. 125 00:04:38,540 --> 00:04:41,320 Till exempel, om vi ville representerar en smiley där 126 00:04:41,320 --> 00:04:44,160 med dessa svarta pixlar, eller dessa svarta prickar, 127 00:04:44,160 --> 00:04:47,230 Tja, vi kan helt enkelt representera dem som verkligen en bitmapp. 128 00:04:47,230 --> 00:04:50,040 Och om du hade någonsin hört att uttrycks bitmapp, kanske 129 00:04:50,040 --> 00:04:52,330 det börjar nu för att göra en lite mer meningsfullt i dag. 130 00:04:52,330 --> 00:04:53,580 >> Vi vet redan vad lite är. 131 00:04:53,580 --> 00:04:54,160 Det är 0 eller 1. 132 00:04:54,160 --> 00:04:56,201 Och en karta är bara något som ett papper 133 00:04:56,201 --> 00:04:59,180 som ger dig riktningar och har kanske ett rutnät av x- och y-koordinater. 134 00:04:59,180 --> 00:05:00,540 Så här är en bitmapp. 135 00:05:00,540 --> 00:05:03,680 Det är en karta över bitar varigenom en 1 är uppenbarligen 136 00:05:03,680 --> 00:05:07,857 kommer att representera en vit pixel, och en 0 kommer att representera en svart pixel. 137 00:05:07,857 --> 00:05:09,440 Men vi kan säkert vända runt. 138 00:05:09,440 --> 00:05:11,648 Det spelar egentligen ingen roll så länge vi är konsekventa. 139 00:05:11,648 --> 00:05:15,570 Och här är hur man i binary-- inne av en dators minne, eller till och med inne 140 00:05:15,570 --> 00:05:18,160 av en fil på din hårddisk drive-- kan du spara 141 00:05:18,160 --> 00:05:20,240 den enklaste av smiley ansiktsbilder. 142 00:05:20,240 --> 00:05:23,990 Men vad är vi, naturligtvis, saknas i den här bilden? 143 00:05:23,990 --> 00:05:24,610 Färg, eller hur? 144 00:05:24,610 --> 00:05:28,220 Det är ett självklart nästa steg eller förstärkning för att förbättra detta med färg. 145 00:05:28,220 --> 00:05:32,230 Så tyvärr med bara en enda bit, 0 eller 1, kan vi representerar färg. 146 00:05:32,230 --> 00:05:36,100 Det kan vara röd eller blå, eller svart, eller vit eller grön, eller rosa, 147 00:05:36,100 --> 00:05:37,420 eller några par av färger. 148 00:05:37,420 --> 00:05:40,860 Men för enkelhets skull kommer vi bara antar svart och vitt. 149 00:05:40,860 --> 00:05:45,930 >> Så vad logiskt behöver vi om vi vill implementera färg i en bild? 150 00:05:45,930 --> 00:05:49,080 Vad har vi att göra? 151 00:05:49,080 --> 00:05:51,900 Som om den begränsande faktorn här är att med en bit du bara kan 152 00:05:51,900 --> 00:05:55,977 representerar två stater, 0 eller 1, vit eller svart, vad vill du göra? 153 00:05:55,977 --> 00:05:56,810 Målgrupp: Mer data. 154 00:05:56,810 --> 00:05:58,813 DAVID J. MALAN: Fler bitar, Yeah mer data, fler bitar. 155 00:05:58,813 --> 00:06:01,440 Och, ja, det är exakt hur färgbilder är representerade. 156 00:06:01,440 --> 00:06:05,120 Hellre än att använda en enda bit, en 0 eller 1 för varje pixel, varvid varje prick, 157 00:06:05,120 --> 00:06:06,170 du bara använda flera. 158 00:06:06,170 --> 00:06:09,660 Kanske använder 8, kanske, mer vanligt använder 24, och faktiskt, i Problem Set 159 00:06:09,660 --> 00:06:13,300 4, kommer du att spela med en fil format som använder 24 bitar typiskt. 160 00:06:13,300 --> 00:06:15,430 >> Men de flesta av er är förmodligen bekant med JPEG. 161 00:06:15,430 --> 00:06:17,460 Om du någonsin har tagit ett foto på din telefon, 162 00:06:17,460 --> 00:06:20,360 eller laddas upp eller sett något på Facebook eller Flickr, vilket som helst antal 163 00:06:20,360 --> 00:06:24,882 fotobaserade webbplatser, du har förmodligen sett en JPEG-bild innan. 164 00:06:24,882 --> 00:06:27,840 Och det visar sig, detta är filen format vi kommer att använda i PSET 4, 165 00:06:27,840 --> 00:06:30,340 där du kommer att måste återskapa bilder 166 00:06:30,340 --> 00:06:35,160 att jag av misstag har raderat från en skadade minneskort i kameran, 167 00:06:35,160 --> 00:06:35,800 om du vill. 168 00:06:35,800 --> 00:06:38,490 >> Och det visar sig att även om JPEG är ganska sophisticated-- 169 00:06:38,490 --> 00:06:40,906 det är mycket mer sofistikerade än de svarta och vita prickar 170 00:06:40,906 --> 00:06:44,480 vi såg för en stund sedan, eftersom det finns faktiskt snygga algoritmer som 171 00:06:44,480 --> 00:06:47,410 används för att komprimera en JPEG, så att du kan ha en riktigt trevlig, 172 00:06:47,410 --> 00:06:49,832 bildkvalitet men med användning av relativt få bitar. 173 00:06:49,832 --> 00:06:51,790 Och vi ska återkomma till kompression snart. 174 00:06:51,790 --> 00:06:56,280 Det visar sig att den första tre byte i en JPEG image-- 175 00:06:56,280 --> 00:07:02,750 oavsett vad du har tagit ett fotografi of-- är värdena 255, 216, 255. 176 00:07:02,750 --> 00:07:05,990 >> Med andra ord, om du bara se att mönstret av bitar, 177 00:07:05,990 --> 00:07:09,180 representerad här som tre byte, eller 24 bitar totalt, 178 00:07:09,180 --> 00:07:13,810 med stor sannolikhet kan du dra slutsatsen att du tittar på den här första tre 179 00:07:13,810 --> 00:07:15,230 bytes av en JPEG. 180 00:07:15,230 --> 00:07:18,040 Och detta är vad som är känt som undertecknandet av en JPEG. 181 00:07:18,040 --> 00:07:20,540 En hel del filformat ute tenderar att starta 182 00:07:20,540 --> 00:07:23,735 med vissa mönster av 0 och 1, så att Windows och Mac OS och IOS, 183 00:07:23,735 --> 00:07:28,272 och Android vet vilken typ av fil de är, förutom den så kallade fil 184 00:07:28,272 --> 00:07:29,730 tillägg som en hel del filer har. 185 00:07:29,730 --> 00:07:32,590 Om du har .jpg, det är en ledtråd till datorn. 186 00:07:32,590 --> 00:07:35,310 >> Så låt oss nu titta på detta lite mer tekniskt. 187 00:07:35,310 --> 00:07:37,390 Vi vet decimal Systemet är 0 till 9. 188 00:07:37,390 --> 00:07:38,740 Vi vet binärt är 0 och 1. 189 00:07:38,740 --> 00:07:41,842 Och om du tänker tillbaka på PSET 0, hade vi att du brottas med, 190 00:07:41,842 --> 00:07:43,800 för lite, något kallas hexadecimala, 191 00:07:43,800 --> 00:07:47,320 där du har 16 siffror, i stället för 10 eller i stället för två. 192 00:07:47,320 --> 00:07:50,405 Och dessa siffror, enligt konvention, är 0 till 9 och sedan en 193 00:07:50,405 --> 00:07:55,040 till f, där f representerar vad decimaltal, precis som en snabb sanity 194 00:07:55,040 --> 00:07:56,640 kolla? 195 00:07:56,640 --> 00:07:57,610 Så, 15. 196 00:07:57,610 --> 00:08:01,390 Och en måste representera 10, bara genom att typ av beställning som jag har gett. 197 00:08:01,390 --> 00:08:04,350 Det är bara en godtycklig konvention, men det är ganska standard. 198 00:08:04,350 --> 00:08:06,870 >> Så om vi ser på detta mönster av tre bytes-- låt oss 199 00:08:06,870 --> 00:08:09,620 bara börja att titta på det i ett sätt som är förenligt med hur 200 00:08:09,620 --> 00:08:12,450 datavetare allmänhet titta på och tänka på filer. 201 00:08:12,450 --> 00:08:15,580 Du kan säkert tänka filer i 0s och 1s och decimal, 202 00:08:15,580 --> 00:08:19,340 men i verkligheten, tenderar vi att använda binär eller mer typiskt hexadecimal-- 203 00:08:19,340 --> 00:08:20,760 tillbaka från PSET 0. 204 00:08:20,760 --> 00:08:25,857 Så låt mig föreslå att 255, 216 och 255 är just dessa mönster av 0 och 1. 205 00:08:25,857 --> 00:08:28,440 Och du kan kontrollera detta om du vill göra matten från vecka 0. 206 00:08:28,440 --> 00:08:30,810 Men för nu, bara anta att detta verkligen är korrekt. 207 00:08:30,810 --> 00:08:33,850 Jag har just skrivit om tre decimal nummer som tre binära värden. 208 00:08:33,850 --> 00:08:36,100 Nu vad jag ska göra är att bara lägga till lite vitt utrymme, 209 00:08:36,100 --> 00:08:37,266 bara för läsbarhet skull. 210 00:08:37,266 --> 00:08:39,940 Och varsel, jag bara gå att flytta isär saker. 211 00:08:39,940 --> 00:08:43,090 Så före, efter, före, efter. 212 00:08:43,090 --> 00:08:46,180 Jag gör inget intressant andra än bara utspridning saker så 213 00:08:46,180 --> 00:08:50,380 att kallelse varje uppsättning av åtta bitar är nu två uppsättningar av fyra bitar. 214 00:08:50,380 --> 00:08:54,920 Detta är användbart eftersom hexadecimalt är särskilt modet 215 00:08:54,920 --> 00:09:00,930 eftersom varje hexadecimal siffra 0 till f, eller mer specifikt 0 genom 15, 216 00:09:00,930 --> 00:09:03,430 kan representeras med exakt fyra bitar. 217 00:09:03,430 --> 00:09:07,960 Med andra ord, i hexadecimal om du vill representera en 0, det är bara 0000, 218 00:09:07,960 --> 00:09:08,780 fyra nollor. 219 00:09:08,780 --> 00:09:13,997 Och om du vill representera 15, det är 1111, vilket är fyra bitar. 220 00:09:13,997 --> 00:09:16,080 Och om du gör matten, om detta är ettor plats, 221 00:09:16,080 --> 00:09:18,210 detta är den 16s plats, som kommer att ge du-- 222 00:09:18,210 --> 00:09:19,960 snarare som kommer att-- ledsen, i binär, 223 00:09:19,960 --> 00:09:23,660 det kommer att ge dig 15, som plats, Twos plats, fyror och åttor plats. 224 00:09:23,660 --> 00:09:26,821 Så låt mig föreslå att det uppsättning av fyra bitar till vänster 225 00:09:26,821 --> 00:09:28,070 är vad vi kommer att kalla f. 226 00:09:28,070 --> 00:09:30,110 Det är det största antalet du kan representera med fyra bitar. 227 00:09:30,110 --> 00:09:33,300 Och vi vet redan från hexadecimal, f är den största siffran i hexadecimalt. 228 00:09:33,300 --> 00:09:36,020 Vi har en annan f där, ytterligare två borta. 229 00:09:36,020 --> 00:09:38,980 Och nu, bara ta på tro att jag har gjort matten rätt 230 00:09:38,980 --> 00:09:41,890 och att den vänstra halv av dessa bitar, 1101, 231 00:09:41,890 --> 00:09:43,980 är samma sak som d i hexadecimal. 232 00:09:43,980 --> 00:09:46,490 Och den högra, 1000, ligger bara 8. 233 00:09:46,490 --> 00:09:48,140 >> Och att man är lätt att se, eller hur? 234 00:09:48,140 --> 00:09:51,670 Den 8 represents-- är rätt därunder åttor plats. 235 00:09:51,670 --> 00:09:56,040 Så vi har ett i åttor kolumnen och ingenting i fours, tvåor och ettor. 236 00:09:56,040 --> 00:09:59,830 Så nu mer konventionellt, människor tenderar att skriva hexadecimala siffror som denna, 237 00:09:59,830 --> 00:10:03,000 man bara trycka ihop dem tillsammans, och sedan prefix dem med 0x. 238 00:10:03,000 --> 00:10:05,920 Det betyder inget annat än en visuell ledtråd till en human-- 239 00:10:05,920 --> 00:10:10,350 Här kommer en hexadecimal value-- eftersom det kanske inte annars vara uppenbart. 240 00:10:10,350 --> 00:10:13,629 >> Vilket betyder att i slutändan, att mönstret av ettor och nollor, 241 00:10:13,629 --> 00:10:16,170 eller mönstret för hexadecimal Siffrorna ekvivalent att du är 242 00:10:16,170 --> 00:10:18,990 kommer att börja leta efter i Problem Set 4 är this-- 243 00:10:18,990 --> 00:10:22,120 och problemet Set 4 spec kommer att gå dig igenom detta mer detail-- 244 00:10:22,120 --> 00:10:25,344 men inser som en slags svårbegripliga som Detta kan se ut vid första anblicken, 245 00:10:25,344 --> 00:10:27,010 du kommer att börja se detta en hel del. 246 00:10:27,010 --> 00:10:30,320 Och faktiskt, även i GDB, den debugger vi infört på måndag 247 00:10:30,320 --> 00:10:35,440 och Dan införs i PSET 3, går att ofta visa dig hexadecimalvärden 248 00:10:35,440 --> 00:10:39,910 bara för att de tenderar att vara mer konventionell än decimal eller binärt 249 00:10:39,910 --> 00:10:41,157 i världen av datorer. 250 00:10:41,157 --> 00:10:42,490 Nu ska vi sätta detta i sitt sammanhang. 251 00:10:42,490 --> 00:10:48,040 Många av er kanske kommer ihåg detta bild här, som kom från vad? 252 00:10:48,040 --> 00:10:51,240 Vista, så ännu tidigare än det gjorde Windows XP denna debut. 253 00:10:51,240 --> 00:10:52,620 Så det här är ett vackert landskap. 254 00:10:52,620 --> 00:10:55,940 Och i själva verket om du rota runt online-- Jag tycker det är en Wikipedia-artikel, 255 00:10:55,940 --> 00:11:00,110 där någon väldigt otroligt gick ut tyckte att det här platsen i världen som inrättats 256 00:11:00,110 --> 00:11:02,240 hans eller hennes kamera i exakt rätt plats-- 257 00:11:02,240 --> 00:11:06,510 och detta i dag ser like-- men Det är exakt samma inställning. 258 00:11:06,510 --> 00:11:10,060 Den här bilden är dock i en fil format som kallas bitmapp, b-m-p. 259 00:11:10,060 --> 00:11:12,910 Och vi kommer att ta en super snabbtitt på vad det betyder. 260 00:11:12,910 --> 00:11:17,770 >> Men bitmapp är bara ett annat sätt att företräder bilder fortfarande använder pixlar 261 00:11:17,770 --> 00:11:19,580 i 0 och 1, i slutändan. 262 00:11:19,580 --> 00:11:23,282 Men vid hastig blick, har det en mer intressant signatur 263 00:11:23,282 --> 00:11:24,490 i början av filen. 264 00:11:24,490 --> 00:11:26,670 Det är inte bara tre bitgrupper, snarare finns det 265 00:11:26,670 --> 00:11:30,770 en massa mönster av byte som har förutbestämda mening. 266 00:11:30,770 --> 00:11:34,490 Exempelvis någonstans i första byte i en bitmappsbild 267 00:11:34,490 --> 00:11:37,440 kommer att vara storleken på bild, bredden av bilden, 268 00:11:37,440 --> 00:11:40,390 höjden av bilden, så användbara metadata, om du kommer. 269 00:11:40,390 --> 00:11:43,940 Användbar information som Photoshop eller någon grafik programmerar du använder 270 00:11:43,940 --> 00:11:45,180 kan faktiskt bryr sig om. 271 00:11:45,180 --> 00:11:47,170 >> Så mer om detta i Problem Set 4, men detta 272 00:11:47,170 --> 00:11:49,220 är endast att säga att Vid slutet av dagen 273 00:11:49,220 --> 00:11:52,390 alla filformat du har använt för years-- Microsoft Word-filer, 274 00:11:52,390 --> 00:11:55,820 Numbers filer, Excel-filer, valfritt antal filformat 275 00:11:55,820 --> 00:11:57,770 som kan ha några känd filändelse 276 00:11:57,770 --> 00:12:00,130 är bara 0 och 1 under huven. 277 00:12:00,130 --> 00:12:02,970 Och människor har beslutat vad konventionerna, 278 00:12:02,970 --> 00:12:08,340 vilka mönster av 0 och 1 representerar en Word-fil jämfört med en Excel-fil, 279 00:12:08,340 --> 00:12:10,322 kontra ett antal andra filformat. 280 00:12:10,322 --> 00:12:12,780 Så PSET 4, har du en möjlighet att spela med det. 281 00:12:12,780 --> 00:12:14,405 >> Men vad betyder det att ha en struct. 282 00:12:14,405 --> 00:12:18,012 Detta är faktiskt ett trevligt SEGUE nu till C, som har endast ett par 283 00:12:18,012 --> 00:12:20,220 ytterligare funktioner som Vi har inte tittat på ännu. 284 00:12:20,220 --> 00:12:24,230 Det är en ganska liten språk och en av de trevliga funktioner om C är en struct. 285 00:12:24,230 --> 00:12:27,300 Till exempel, om du ville represent-- låt oss 286 00:12:27,300 --> 00:12:33,690 säga att du ville ha en variabel som representerar en student i något program. 287 00:12:33,690 --> 00:12:37,330 Kanske du skrev en kurs registreringsprogram, eller kärn shoppa 288 00:12:37,330 --> 00:12:38,870 verktyg, eller nåt sånt. 289 00:12:38,870 --> 00:12:42,922 Vad är bitar av uppgifter om till en student som kommer att tänka på? 290 00:12:42,922 --> 00:12:44,880 Som en student är representerad med vilka värden? 291 00:12:44,880 --> 00:12:45,732 Yeah? 292 00:12:45,732 --> 00:12:46,940 Du har ett namn som student. 293 00:12:46,940 --> 00:12:48,900 Vad betyder en typisk studenten? 294 00:12:48,900 --> 00:12:49,320 >> PUBLIK: [OHÖRBAR] 295 00:12:49,320 --> 00:12:50,200 >> DAVID J. MALAN: Så, tyvärr. 296 00:12:50,200 --> 00:12:50,660 >> PUBLIK: Age. 297 00:12:50,660 --> 00:12:52,980 >> DAVID J. MALAN: En ålder eller födelsedag ekvivalent, yep. 298 00:12:52,980 --> 00:12:53,557 Vad annars? 299 00:12:53,557 --> 00:12:54,390 PUBLIK: ID-nummer? 300 00:12:54,390 --> 00:12:57,460 DAVID J. MALAN: Så ett ID-nummer, kanske ett telefonnummer, kanske en sovsal eller hus, 301 00:12:57,460 --> 00:12:58,670 eller högskola, eller nåt sånt. 302 00:12:58,670 --> 00:13:01,820 Vilket som helst antal datadelar som du kan ha i din kontaktlista 303 00:13:01,820 --> 00:13:03,890 är vad som kan definiera en student. 304 00:13:03,890 --> 00:13:08,490 Så om vi ville göra detta i koden, vi kan göra något enkelt som här. 305 00:13:08,490 --> 00:13:15,670 Vi kanske har ett program så att har låt oss säga, int main (void). 306 00:13:15,670 --> 00:13:18,920 Och om jag vill representera en elev Jag kanske har, till exempel, 307 00:13:18,920 --> 00:13:24,330 en sträng som kallas namn för den studerande, en sträng som kallas sovsal för den studerande, 308 00:13:24,330 --> 00:13:26,900 kanske en int kallas ID för den studerande. 309 00:13:26,900 --> 00:13:30,840 Och eftersom jag använder sträng, jag behöver gå tillbaka och sätta upp CS50.h. 310 00:13:30,840 --> 00:13:33,300 Kanske jag kommer att behöva stdio.h. 311 00:13:33,300 --> 00:13:38,190 Så låt mig i förebyggande syfte göra dem och jag är kommer att kalla detta student.c nu 312 00:13:38,190 --> 00:13:40,080 och spara denna. 313 00:13:40,080 --> 00:13:44,206 >> Och nu kan jag göra något med dessa variabler. 314 00:13:44,206 --> 00:13:46,830 Och vi ska bara skriva det som en kommentar i pseudokod, 315 00:13:46,830 --> 00:13:48,829 eftersom det inte är intressant vad vi gör nu. 316 00:13:48,829 --> 00:13:51,242 OK, så det här är ett program som på något sätt lagrar en student. 317 00:13:51,242 --> 00:13:53,450 Vad vill jag göra om jag vill lagra två studenter? 318 00:13:53,450 --> 00:13:55,991 Så min första instinkt går att vara okej, vänta en minut, 319 00:13:55,991 --> 00:14:01,920 om jag har en annan student gör varför inte jag bara göra string name 2, sträng sovsal 2, 320 00:14:01,920 --> 00:14:04,190 int ID2. 321 00:14:04,190 --> 00:14:06,540 Och vi har gjort borta denna väg innan 322 00:14:06,540 --> 00:14:10,890 och vad som var vår lösning till vad som verkar att vara lite av en hackish kopiera klistra 323 00:14:10,890 --> 00:14:11,555 jobb här? 324 00:14:11,555 --> 00:14:12,346 Publik: En array. 325 00:14:12,346 --> 00:14:13,830 DAVID J. MALAN: Ja, vi skulle kunna använda en array. 326 00:14:13,830 --> 00:14:15,620 Höger detta mycket snabbt blir ohanterlig. 327 00:14:15,620 --> 00:14:18,453 Du måste sortera godtyckligt börja namnge alla dessa variabler. 328 00:14:18,453 --> 00:14:22,190 Och du som människa, måste hålla spåra att OK NAME2 motsvarar 329 00:14:22,190 --> 00:14:25,060 med dorm2 motsvarar ID2. 330 00:14:25,060 --> 00:14:26,200 Det blir bara en enda röra. 331 00:14:26,200 --> 00:14:29,350 Så det är mycket enklare, minns från ett par veckor sedan, 332 00:14:29,350 --> 00:14:34,300 att bara behöva kallas strängnamn och kanske ge oss tre av dessa. 333 00:14:34,300 --> 00:14:36,940 Och då kanske vi har sträng sovsalar och har 334 00:14:36,940 --> 00:14:41,900 tre av dessa, eller med en konstant, int ids och har tre av dem. 335 00:14:41,900 --> 00:14:45,250 Men även nu det känns lite slarvigt, höger. 336 00:14:45,250 --> 00:14:49,440 Vi pratar om studenter och ändå Jag är verkligen bostad på den låga nivån 337 00:14:49,440 --> 00:14:50,470 genomförandet detaljer. 338 00:14:50,470 --> 00:14:52,790 Studenten är ett namn och en sovsal och ID. 339 00:14:52,790 --> 00:14:59,814 >> Varför kan jag inte förklara bara en variabel kallas student och kallar det är. 340 00:14:59,814 --> 00:15:02,230 Och om jag vill ha en annan student, varför inte jag bara kalla det t. 341 00:15:02,230 --> 00:15:05,260 Eller om jag vill ha en hel drös av studenter, varför inte jag bara 342 00:15:05,260 --> 00:15:09,740 säga att jag har en hel klass av studenter, och det är tre av dem. 343 00:15:09,740 --> 00:15:12,470 Med andra ord, varför kan jag inte komma med min egen datatyp, som kallas 344 00:15:12,470 --> 00:15:15,641 Studenter, insida som är ett namn, är ett ID, är en sovsal, 345 00:15:15,641 --> 00:15:16,890 är ett antal andra områden. 346 00:15:16,890 --> 00:15:19,030 Och det visar sig att du kan göra just det. 347 00:15:19,030 --> 00:15:21,850 >> Så C har denna funktion som kallas struct. 348 00:15:21,850 --> 00:15:24,700 Det är ett språk funktion som tillåter oss att göra just detta. 349 00:15:24,700 --> 00:15:28,370 Jag kommer att gå vidare och öppna upp structs.h 350 00:15:28,370 --> 00:15:32,299 där vi kommer att se Följande definition av en student. 351 00:15:32,299 --> 00:15:35,215 Det visar sig - och detta är ännu enklare än den som inbegriper ett ID 352 00:15:35,215 --> 00:15:36,080 en stund sedan. 353 00:15:36,080 --> 00:15:39,120 Om du vill komma med din hemgjorda datatyp, 354 00:15:39,120 --> 00:15:42,750 och dessutom till int, och röding och flyter och alla dessa andra som finns, 355 00:15:42,750 --> 00:15:45,810 kan du göra det genom att bokstavligen skriver typedef struct, 356 00:15:45,810 --> 00:15:47,880 sedan några klammerparenteser, inuti vilken man 357 00:15:47,880 --> 00:15:51,460 lista de variabler som du vill associera med detta nya anpassade uppgifter 358 00:15:51,460 --> 00:15:55,670 skriver som ett namn och en sovsal, och sedan efter klammerparenteserna 359 00:15:55,670 --> 00:15:57,860 du ange ett namn för den nya datatypen. 360 00:15:57,860 --> 00:15:59,220 Så, till exempel, student. 361 00:15:59,220 --> 00:16:03,247 >> Och vad är trevligt om detta nu är att Om vi ​​tittar på motsvarande kod, 362 00:16:03,247 --> 00:16:05,080 konventionen först av allt, är att sätta detta 363 00:16:05,080 --> 00:16:08,230 i en fil som heter något dot h, en header-fil, som vi inte har 364 00:16:08,230 --> 00:16:09,780 började använda oss alltför mycket. 365 00:16:09,780 --> 00:16:12,120 Men vi kommer att börja med hjälp av en hel del nu. 366 00:16:12,120 --> 00:16:18,650 Och vad vi kan göra med detta, slutligen, i dessa få rader kod 367 00:16:18,650 --> 00:16:22,130 är förklara exakt som datatyp, en student. 368 00:16:22,130 --> 00:16:23,230 Och nu ska vi använda den. 369 00:16:23,230 --> 00:16:27,274 >> Jag ska nu gå in en fil som heter structs1.c. 370 00:16:27,274 --> 00:16:29,440 Och låt oss ta en titt på en Några egenskaper här. 371 00:16:29,440 --> 00:16:32,250 Så grejer här är mestadels bekant, och vi ska 372 00:16:32,250 --> 00:16:35,040 komma tillbaka till vad som inte är bekant på bara ett ögonblick. 373 00:16:35,040 --> 00:16:39,880 Detta är naturligtvis inklusive mitt eget header-fil, som är ny liksom, 374 00:16:39,880 --> 00:16:42,580 utom för PSET 3 där, minns, har vi helpers.h. 375 00:16:42,580 --> 00:16:45,150 Så du kanske kommer ihåg #include helpers.h. 376 00:16:45,150 --> 00:16:49,381 >> Varför om jag använder citat i stället för vinklade konsoler? 377 00:16:49,381 --> 00:16:50,630 När väljer jag mellan dem? 378 00:16:50,630 --> 00:16:52,310 Nästan alltid jag verkar att använda vinklade fästen. 379 00:16:52,310 --> 00:16:55,040 Och sedan, helt plötsligt på line sex Jag använder dubbla citattecken. 380 00:16:55,040 --> 00:16:55,860 Varför skulle det vara? 381 00:16:55,860 --> 00:16:56,700 Yeah? 382 00:16:56,700 --> 00:16:57,725 >> PUBLIK: [OHÖRBAR] 383 00:16:57,725 --> 00:16:59,350 DAVID J. MALAN: Det är en faktisk, vad? 384 00:16:59,350 --> 00:17:00,559 PUBLIK: Det är i IDE. 385 00:17:00,559 --> 00:17:02,475 DAVID J. MALAN: Ja, det är i min faktiska IDE. 386 00:17:02,475 --> 00:17:05,690 Och låt oss inte uppehålla mig vid IDE, eftersom det är bara ett verktyg som jag använder. 387 00:17:05,690 --> 00:17:08,119 Det är i min nuvarande katalog, specifikt. 388 00:17:08,119 --> 00:17:11,647 Så structs.h är min egen fil inte installerat i IDE, 389 00:17:11,647 --> 00:17:14,480 i själva operativsystemet, utan det är i min nuvarande katalog. 390 00:17:14,480 --> 00:17:16,910 Så konventionen är om du vill att inkludera din egen headerfil, 391 00:17:16,910 --> 00:17:18,200 du bara använda dubbla citattecken. 392 00:17:18,200 --> 00:17:23,290 >> Vad kallar vi den här saken i linje 8, generellt sett? 393 00:17:23,290 --> 00:17:25,200 Det här är vad? 394 00:17:25,200 --> 00:17:28,220 #define något. 395 00:17:28,220 --> 00:17:31,040 Detta representerar konstanter, eller hur? 396 00:17:31,040 --> 00:17:33,140 Om du vill ha en värde i ditt program 397 00:17:33,140 --> 00:17:35,110 att du använder en hel gäng gånger, det är 398 00:17:35,110 --> 00:17:39,330 bra konvention faktor ut, förklara den, med hash symbol 399 00:17:39,330 --> 00:17:43,340 definiera, då, enligt konvention, i alla versaler word-- om det inte 400 00:17:43,340 --> 00:17:45,320 absolut nödvändigt, men Det är mänskligt konvention 401 00:17:45,320 --> 00:17:47,210 att kapitalisera konstanter så att de hoppar ut 402 00:17:47,210 --> 00:17:50,380 på dig visually-- utrymme och då det värde du vill vara 403 00:17:50,380 --> 00:17:52,250 likvärdig med den som konstant namn. 404 00:17:52,250 --> 00:17:56,110 Ingen semikolon, men du helt enkelt följer detta mönster där. 405 00:17:56,110 --> 00:17:57,770 >> Så vad jag gör i denna faktiska koden. 406 00:17:57,770 --> 00:18:00,660 Så låt oss ta en titt på huvudprogrammet här. 407 00:18:00,660 --> 00:18:04,080 I linje 12 eftersom jag har inkluderat structs.h, 408 00:18:04,080 --> 00:18:06,492 Jag har nu magiskt på mitt förfogande en ny datatyp. 409 00:18:06,492 --> 00:18:09,200 Jag vill inte bara ha tillgång till int, och röding, och flyta, och snöre, 410 00:18:09,200 --> 00:18:10,060 och blått och andra. 411 00:18:10,060 --> 00:18:12,470 Jag har nu tillgång till en typ elev data. 412 00:18:12,470 --> 00:18:17,740 Så i linje 12, jag kombinera två ideas-- en en egen datatyp och två, 413 00:18:17,740 --> 00:18:18,940 med användning av en matris. 414 00:18:18,940 --> 00:18:21,700 Och så i detta program om Jag vill faktiskt stödja 415 00:18:21,700 --> 00:18:24,320 tre olika elever i mitt program, jag 416 00:18:24,320 --> 00:18:30,480 kan helt enkelt säga ge mig en variabel kallas studenter, som var och en 417 00:18:30,480 --> 00:18:32,970 är av typ studenter, som är min typ anpassad uppgifter. 418 00:18:32,970 --> 00:18:35,890 Och särskilt ge mig tre av de i mitt arrayen. 419 00:18:35,890 --> 00:18:37,750 >> Så nu vad gör vi i det här programmet? 420 00:18:37,750 --> 00:18:40,670 Här är bara en for-loop iteration 0-3, eftersom det är 421 00:18:40,670 --> 00:18:42,110 vad värdet av studenter är. 422 00:18:42,110 --> 00:18:44,420 Jag är bara att användaren tillfrågas ge mig studentens namn. 423 00:18:44,420 --> 00:18:48,090 Och sedan i linje 17, vi har en mestadels bekant linje. 424 00:18:48,090 --> 00:18:50,370 Vi har vår gamle vän GetString till höger. 425 00:18:50,370 --> 00:18:52,345 Och vad bit av syntax är uppenbarligen nya, 426 00:18:52,345 --> 00:18:55,130 Om du aldrig har programmerat i C innan, och har aldrig använt structs? 427 00:18:55,130 --> 00:18:55,510 Yeah? 428 00:18:55,510 --> 00:18:56,417 >> Publik: Den .name. 429 00:18:56,417 --> 00:18:57,500 David J. MALAN: Den .name. 430 00:18:57,500 --> 00:19:01,220 Men det är inte för mycket av ett språng, för nu eleverna fästet i 431 00:19:01,220 --> 00:19:02,590 ger dig den i: te student. 432 00:19:02,590 --> 00:19:04,730 Och om du vill dyka insidan av denna struktur, 433 00:19:04,730 --> 00:19:09,490 du bara använda en enda period och sedan namnet på variabeln inuti, 434 00:19:09,490 --> 00:19:11,900 eller egendom inuti som du vill få tillgång till. 435 00:19:11,900 --> 00:19:14,816 På samma sätt då, om jag då uppmana användaren, ge mig studentens studentrummet, 436 00:19:14,816 --> 00:19:18,390 kan på liknande sätt lagra den sträng i sovsal variabel inuti 437 00:19:18,390 --> 00:19:19,940 av detta elev struktur. 438 00:19:19,940 --> 00:19:21,410 >> Och nu det blir lite finare. 439 00:19:21,410 --> 00:19:24,420 Och detta kommer att se på kanske en hel del ganska snart. 440 00:19:24,420 --> 00:19:27,970 Men du ser så här långt mer i PSET 4, så låt oss bara blick på det nu. 441 00:19:27,970 --> 00:19:33,364 Det visar sig att i linje 23 genom 38, vad tror du att jag kanske gör? 442 00:19:33,364 --> 00:19:35,530 Jag har tagit bort kommentarer för idag, men version 443 00:19:35,530 --> 00:19:38,660 av koden online referensen har alla kommentarer. 444 00:19:38,660 --> 00:19:40,171 Vad gör jag verkar göra? 445 00:19:40,171 --> 00:19:42,530 >> PUBLIK: Spara filen med alla den information som användaren angett. 446 00:19:42,530 --> 00:19:44,530 >> DAVID J. MALAN: Ja, exakt, är detta ett nytt sätt 447 00:19:44,530 --> 00:19:46,370 att vi ser två, annat särdrag hos C, 448 00:19:46,370 --> 00:19:48,700 där jag kan skapa mina egna filer. 449 00:19:48,700 --> 00:19:51,580 Hittills, nästan alla program du har skrivit är statslös. 450 00:19:51,580 --> 00:19:53,334 Så snart det är gjort kör, det är det. 451 00:19:53,334 --> 00:19:55,000 Det finns inget minne eller minne av det. 452 00:19:55,000 --> 00:19:56,110 Det finns ingen fil sparas. 453 00:19:56,110 --> 00:19:58,120 Men om du vill spara ingång som har 454 00:19:58,120 --> 00:20:02,100 hände, som i ett spel eller ett program så här, visar det sig att vi kan göra det. 455 00:20:02,100 --> 00:20:04,360 Och du ser detta mer i PSET 4 och i avsnitt. 456 00:20:04,360 --> 00:20:08,661 Men denna linje 23 i huvudsak skapar en fil som heter students.csv. 457 00:20:08,661 --> 00:20:10,160 Och du kanske har sett det här förut. 458 00:20:10,160 --> 00:20:14,250 Även om du aldrig har studerat CS tidigare, CSV är kommaseparerade variabler. 459 00:20:14,250 --> 00:20:19,000 Det är som en mycket fattig mans version av en Excel-fil, 460 00:20:19,000 --> 00:20:22,270 vilket innebär att den kan öppnas i Excel och i Apples Numbers, 461 00:20:22,270 --> 00:20:23,830 och det har rader och kolumner. 462 00:20:23,830 --> 00:20:26,485 Men det är inte en patentskyddad format som Microsoft eller Apple. 463 00:20:26,485 --> 00:20:29,840 Det är bara kommatecken separerar värden som vi ser i ett ögonblick. 464 00:20:29,840 --> 00:20:31,010 >> Och bara ta en gissning. 465 00:20:31,010 --> 00:20:33,480 I linje 23, vid mycket ände, mitt andra argumentet 466 00:20:33,480 --> 00:20:37,700 till denna nya funktion kallas f öppen för filen öppen är w. 467 00:20:37,700 --> 00:20:39,430 Vad kan w betecknar? 468 00:20:39,430 --> 00:20:40,022 Yeah? 469 00:20:40,022 --> 00:20:41,260 >> PUBLIK: Det låter dig skriva till filen? 470 00:20:41,260 --> 00:20:42,630 >> DAVID J. MALAN: Det låter du skriver till filen. 471 00:20:42,630 --> 00:20:44,810 Så det finns ett par varianter att vi kan koppla in här. 472 00:20:44,810 --> 00:20:47,184 Men om du bara vill läsa filen är att titta på det 473 00:20:47,184 --> 00:20:50,010 och läsa den i minnet, du bara använda citat unquote "r". 474 00:20:50,010 --> 00:20:53,110 Om du vill skriva till fil, använder du citerar unquote "w". 475 00:20:53,110 --> 00:20:55,190 Det är också bifoga och ett par andra saker 476 00:20:55,190 --> 00:20:57,356 Om du vill ändra befintliga filer. 477 00:20:57,356 --> 00:21:00,480 Nu ska vi fortsätta att se detta sak, då vi ska komma tillbaka till linje 24. 478 00:21:00,480 --> 00:21:02,640 NULL, visar det sig, är ett speciellt värde som 479 00:21:02,640 --> 00:21:06,070 kan returneras av vissa funktioner Om något har gått wrong-- 480 00:21:06,070 --> 00:21:08,490 Om filen inte finns, om du har slut på minne, 481 00:21:08,490 --> 00:21:09,620 eller en massa andra fel. 482 00:21:09,620 --> 00:21:13,470 Men nu, låt oss bara anta att detta är bara konventionell felkontroll. 483 00:21:13,470 --> 00:21:17,090 Här i linje 26, jag iterera 0-3 över alla mina elever. 484 00:21:17,090 --> 00:21:20,470 Och detta är typ av sort av en ny funktion, fprintf, 485 00:21:20,470 --> 00:21:21,460 men bara ta en gissning. 486 00:21:21,460 --> 00:21:24,370 Om printf är bara print en formaterad sträng, 487 00:21:24,370 --> 00:21:26,507 vad betyder fprintf förmodligen innebära? 488 00:21:26,507 --> 00:21:27,590 PUBLIK: Skriv ut till en fil. 489 00:21:27,590 --> 00:21:29,290 DAVID J. MALAN: Skriva ut en formaterad sträng till en fil. 490 00:21:29,290 --> 00:21:31,180 Det är vad den ytterligare f organ är fil. 491 00:21:31,180 --> 00:21:36,420 Och den nya första argumentet måste vara variabeln som representerar din fil. 492 00:21:36,420 --> 00:21:38,866 Då har vi bara ett format sträng precis som printf. 493 00:21:38,866 --> 00:21:40,740 Och även om detta Syntaxen är nytt, detta bara 494 00:21:40,740 --> 00:21:44,610 betyder koppla in elevens namn, plug-in för studenthem, och sedan 495 00:21:44,610 --> 00:21:47,160 med fclose stänger du filen. 496 00:21:47,160 --> 00:21:49,730 Och sedan lastly-- detta är nytt och vi ska återkomma till detta 497 00:21:49,730 --> 00:21:53,240 innan long-- jag frigöra studenten skäl 498 00:21:53,240 --> 00:21:54,860 som hände upp ovan finns. 499 00:21:54,860 --> 00:21:56,820 Men vi kommer tillbaka till att innan long-- 500 00:21:56,820 --> 00:21:59,820 det är på grund av hur getString är faktiskt arbetar under huven. 501 00:21:59,820 --> 00:22:01,280 >> Så låt oss ta en snabb titt här. 502 00:22:01,280 --> 00:22:04,380 Om jag skriver ls i min katalog, märker att jag inte 503 00:22:04,380 --> 00:22:09,360 har en fil som heter students.csv, bara inte där, inte existerar. 504 00:22:09,360 --> 00:22:14,965 Så om jag nu sammanställa det här programmet, göra structs-1,. / structs-1, 505 00:22:14,965 --> 00:22:20,570 och jag kommer att gå vidare och skriva in Andi, som bor i Berkeley vid Yale. 506 00:22:20,570 --> 00:22:26,350 Vi kommer att ha Rob som bor i Thayer dessa dagar. 507 00:22:26,350 --> 00:22:33,760 Och låt oss komma med där är, tror jag, är Maria i Mather, 508 00:22:33,760 --> 00:22:35,100 om jag har mindes rätt. 509 00:22:35,100 --> 00:22:36,460 >> Så ingenting verkar hända. 510 00:22:36,460 --> 00:22:40,680 Men om jag skriver ls nu, det finns students.csv. 511 00:22:40,680 --> 00:22:43,080 Låt oss gå vidare och öppna students.csv. 512 00:22:43,080 --> 00:22:46,050 Detta är återigen en mycket lätt filformat. 513 00:22:46,050 --> 00:22:49,570 Men jag har bara antagit en konvention att jag har två rader och kolumner här. 514 00:22:49,570 --> 00:22:52,020 Den första kolumnen är folks förnamn. 515 00:22:52,020 --> 00:22:55,740 Den andra kolumnen är studentens sovsal, eller högskola, eller hus, eller allt. 516 00:22:55,740 --> 00:22:57,900 Och nu har jag sparat detta permanent i en fil. 517 00:22:57,900 --> 00:22:59,280 >> Så det är inte så intressant. 518 00:22:59,280 --> 00:23:02,980 Men detta är bara en språngbräda nu att kunna kvarstå uppgifter 519 00:23:02,980 --> 00:23:04,040 permanent. 520 00:23:04,040 --> 00:23:08,340 Så låt oss nu se vad mer vi kan göra med dessa och andra funktioner. 521 00:23:08,340 --> 00:23:10,729 Men först, några frågor? 522 00:23:10,729 --> 00:23:12,145 Det var en hel del, och det var snabb. 523 00:23:12,145 --> 00:23:16,131 Men du kommer att se en hel del mer PSET 4, liksom. 524 00:23:16,131 --> 00:23:16,630 Yeah? 525 00:23:16,630 --> 00:23:19,360 >> PUBLIK: Finns det något sätt att fortsätta att lägga namn till den filen? 526 00:23:19,360 --> 00:23:19,880 >> DAVID J. MALAN: Bra fråga. 527 00:23:19,880 --> 00:23:21,800 Finns det ett sätt att fortsätta lägga till namn till den filen? 528 00:23:21,800 --> 00:23:22,340 Ja. 529 00:23:22,340 --> 00:23:24,630 Och, faktiskt, om du avslutar up återuppta ärendet, 530 00:23:24,630 --> 00:23:26,780 du skulle använda citat unquote "a" för append, 531 00:23:26,780 --> 00:23:31,090 som bara skulle lägga till en ny rad, en ny linje om och om igen, exakt. 532 00:23:31,090 --> 00:23:32,010 Bra fråga. 533 00:23:32,010 --> 00:23:32,950 Övriga frågor? 534 00:23:32,950 --> 00:23:33,450 Yeah? 535 00:23:33,450 --> 00:23:35,580 PUBLIK: Om du körde program igen just nu, 536 00:23:35,580 --> 00:23:38,000 skulle det fortsätta att lägga namn till fil eller skulle det öppna upp en ny fil? 537 00:23:38,000 --> 00:23:38,740 >> DAVID J. MALAN: Ah, bra fråga. 538 00:23:38,740 --> 00:23:41,448 Om du körde programmet igen rätt nu, kanske skrev i nya namn, 539 00:23:41,448 --> 00:23:44,820 skulle man lägga till filen eller skriva över filen? 540 00:23:44,820 --> 00:23:47,420 Den senare, eftersom jag är inte använder bifogningsläge. 541 00:23:47,420 --> 00:23:49,930 Och eftersom jag är bara blint öppna filen för skrivning, 542 00:23:49,930 --> 00:23:51,310 det bara kommer att skriva över filen. 543 00:23:51,310 --> 00:23:54,570 Så jag skulle verkligen behöver göra är att lägga till, om jag vill faktiskt ha en långsiktig 544 00:23:54,570 --> 00:23:55,350 databas. 545 00:23:55,350 --> 00:23:58,220 >> Nu CSV är användbar, uppriktigt sagt, även för som om du är writing-- 546 00:23:58,220 --> 00:24:00,100 och vi kommer så småningom se denna senare i den termin då 547 00:24:00,100 --> 00:24:01,455 Vi använder CSVs för andra ändamål. 548 00:24:01,455 --> 00:24:04,920 Om du vill lagra alla människor som har anmält sig till någon händelse, 549 00:24:04,920 --> 00:24:07,420 eller registrerat dig för din student grupp, eller nåt sånt, 550 00:24:07,420 --> 00:24:10,330 lagring av data i denna typ av format är super bekvämt. 551 00:24:10,330 --> 00:24:12,580 Eftersom bokstavligen, om jag skulle ladda ned den här filen. 552 00:24:12,580 --> 00:24:14,540 Jag kunde double-- och låt oss faktiskt prova detta 553 00:24:14,540 --> 00:24:16,720 om jag har Excel eller Numbers här. 554 00:24:16,720 --> 00:24:19,130 >> Jag kommer att högerklicka eller kontrollklicka min fil. 555 00:24:19,130 --> 00:24:20,020 Hoppsan. 556 00:24:20,020 --> 00:24:21,830 Högerklicka eller kontrollklicka min fil. 557 00:24:21,830 --> 00:24:24,960 Kom igen, är min mus inte samarbetar. 558 00:24:24,960 --> 00:24:32,694 Download-- jag ska ladda ner alla filer här så 559 00:24:32,694 --> 00:24:33,860 bara så att jag kan ta det här. 560 00:24:33,860 --> 00:24:37,850 Och låt oss se om det fungerar students.csv-- första gången 561 00:24:37,850 --> 00:24:39,310 Jag har aktiverat. 562 00:24:39,310 --> 00:24:41,360 Nu vill de se mina kontakter. 563 00:24:41,360 --> 00:24:44,310 Nu måste jag registrera. 564 00:24:44,310 --> 00:24:47,620 Se hur enkelt det är att använda CSVs? 565 00:24:47,620 --> 00:24:50,840 Ja, hålla den aktuell. 566 00:24:50,840 --> 00:24:52,375 OK, nu är vi redo för klass. 567 00:24:52,375 --> 00:24:58,750 568 00:24:58,750 --> 00:25:00,370 OK, åh, vad är nytt? 569 00:25:00,370 --> 00:25:02,920 OK, nära. 570 00:25:02,920 --> 00:25:04,750 Det var magisk. 571 00:25:04,750 --> 00:25:07,280 OK, nu måste vi uppdatera. 572 00:25:07,280 --> 00:25:10,890 Och nu, glömde det vad fil Jag ursprungligen öppnades, 573 00:25:10,890 --> 00:25:13,090 men vad A-- där vi går. 574 00:25:13,090 --> 00:25:16,341 OK, så nu har vi en Excel-fil. 575 00:25:16,341 --> 00:25:18,290 Tack. 576 00:25:18,290 --> 00:25:20,764 >> OK, så vad jag gjorde var den enkla biten. 577 00:25:20,764 --> 00:25:23,930 Naturligtvis kunde jag ha förinstallerat Excel eller Numbers, eller vad programmet. 578 00:25:23,930 --> 00:25:25,846 Men det är trevligt, eftersom Nu kan jag manipulera 579 00:25:25,846 --> 00:25:28,090 data i ett standardformat. 580 00:25:28,090 --> 00:25:30,294 >> Så nu ska vi sammanhang byta till där vi slutade 581 00:25:30,294 --> 00:25:32,710 förra gången, vilket var att starta att ta av stödhjul. 582 00:25:32,710 --> 00:25:34,543 Men först, det gjorde du inte se denna tidigare lunch 583 00:25:34,543 --> 00:25:38,150 återigen händer här på Fire och Is i Cambridge, Sitar i New Haven. 584 00:25:38,150 --> 00:25:43,150 Registrera dig på CS50s webbplats ASAP att gå CS50 studenter och personal. 585 00:25:43,150 --> 00:25:46,090 >> Så vi tog utbildning hjul rabatt på måndagen som follows-- 586 00:25:46,090 --> 00:25:49,120 sträng har försatts i CS50s bibliotek för en tid. 587 00:25:49,120 --> 00:25:52,650 Och det är trevligt, eftersom det tillåter oss att tala om variabler som 588 00:25:52,650 --> 00:25:54,660 fullständiga ord och meningar och mer. 589 00:25:54,660 --> 00:25:56,710 Men det visar sig sträng existerar inte. 590 00:25:56,710 --> 00:26:00,200 Det är bara en synonym, eller ett alias, att vi har skapat för något som 591 00:26:00,200 --> 00:26:03,780 faktiskt är lite mer tekniskt kallas en char *. 592 00:26:03,780 --> 00:26:07,900 >> Och faktiskt, såg vi ett exempel av ett program på måndag 593 00:26:07,900 --> 00:26:11,200 som inte beter sig helt som vi förväntade oss. 594 00:26:11,200 --> 00:26:13,630 Detta var filen jämföra-0. 595 00:26:13,630 --> 00:26:17,910 Och minns att jämföra-0, om Jag kompilera måndagens program 596 00:26:17,910 --> 00:26:22,670 och kör jämför-0 och skriv in mamma i gemener, och mamma i gemener igen. 597 00:26:22,670 --> 00:26:25,320 Programmet insisterade jag skriver olika saker, 598 00:26:25,320 --> 00:26:29,210 även om mamma, allt i gemener, är identisk visuellt. 599 00:26:29,210 --> 00:26:31,990 Så vad var det korta svaret till varför datorn tänker 600 00:26:31,990 --> 00:26:34,500 dessa två strängar är olika? 601 00:26:34,500 --> 00:26:35,250 Yeah? 602 00:26:35,250 --> 00:26:36,534 >> PUBLIK: [OHÖRBAR] 603 00:26:36,534 --> 00:26:37,450 DAVID J. MALAN: Rätt. 604 00:26:37,450 --> 00:26:39,600 Så, mamma, för första gången Jag skriver det är att vara 605 00:26:39,600 --> 00:26:42,710 lagras någonstans i datorns minne men i en annan plats 606 00:26:42,710 --> 00:26:44,690 än andra gången jag skriver i mamma. 607 00:26:44,690 --> 00:26:46,580 Nu säkert det skulle kunna optimeras. 608 00:26:46,580 --> 00:26:49,205 Datorn kan vara smart och förverkliga dessa två strängar, hej, 609 00:26:49,205 --> 00:26:49,954 de är identiska. 610 00:26:49,954 --> 00:26:51,520 Låt mig inte redundant lagra den. 611 00:26:51,520 --> 00:26:54,229 Men datorer inte gör det optimering om du berätta för dem att. 612 00:26:54,229 --> 00:26:56,061 Så som standard, de är bara kommer att hamna 613 00:26:56,061 --> 00:26:57,670 på två olika platser i minnet. 614 00:26:57,670 --> 00:27:01,570 Och så för att vara mer tydlig, när jämförde vi två strängar, 615 00:27:01,570 --> 00:27:03,950 de första kallades s, den andra kallades 616 00:27:03,950 --> 00:27:08,530 t, vad som specifikt var jag jämförelse här på rad 13? 617 00:27:08,530 --> 00:27:09,494 Yeah. 618 00:27:09,494 --> 00:27:12,390 >> PUBLIK: Det är den plats i minnet att variabeln kommer att peka på. 619 00:27:12,390 --> 00:27:14,900 >> DAVID J. MALAN: Just det, var jag jämföra den plats i minnet 620 00:27:14,900 --> 00:27:16,300 att dessa variabler pekade. 621 00:27:16,300 --> 00:27:20,560 Så specifikt, om mamma var på byte nummer 1, och 2 och 3, 622 00:27:20,560 --> 00:27:24,020 och 4-- eftersom ihåg backslash 0 måste vara hela vägen i slutet. 623 00:27:24,020 --> 00:27:29,420 Och den andra instans av mamma, m-o-meter, var vid adress 10, 11, 12, och 13. 624 00:27:29,420 --> 00:27:33,100 Jag jämförde 1, den adressen, den platsen i minnet, 625 00:27:33,100 --> 00:27:35,160 mot 10, som är uppenbarligen inte samma sak. 626 00:27:35,160 --> 00:27:36,260 1 är inte 10. 627 00:27:36,260 --> 00:27:39,620 >> Så det här är trevligt att Det är ganska enkelt. 628 00:27:39,620 --> 00:27:42,870 Men det är problematiskt mån vi verkar inte kunna jämföra strängar. 629 00:27:42,870 --> 00:27:44,930 Så fundamentally-- och på denna låga nivå, 630 00:27:44,930 --> 00:27:47,300 om du ville genomföra ett program för att jämföra 631 00:27:47,300 --> 00:27:50,270 två separata ord som användaren har skrivit in för kvalitet, 632 00:27:50,270 --> 00:27:53,944 gör de rada upp röding för röding, bara i allmänna termer, 633 00:27:53,944 --> 00:27:55,360 Vad behöver vi göra, tydligen? 634 00:27:55,360 --> 00:27:57,940 Det är inte tillräckligt att bara titta på dessa två adresser. 635 00:27:57,940 --> 00:27:58,860 Vad behöver vi göra? 636 00:27:58,860 --> 00:27:59,360 Yeah? 637 00:27:59,360 --> 00:28:01,120 >> PUBLIK: iterera igenom strängen [OHÖRBAR]. 638 00:28:01,120 --> 00:28:02,600 >> DAVID J. MALAN: Ja, låt oss iterera igenom strängen. 639 00:28:02,600 --> 00:28:05,808 Låt oss använda en for-loop, en while-slinga, eller vad du är mest bekväm med. 640 00:28:05,808 --> 00:28:08,840 Och om vi har två strängar någonstans i minnet, låt oss titta på varje s 641 00:28:08,840 --> 00:28:11,770 första bokstaven och varje är andra karaktär, då tredje och fjärde, 642 00:28:11,770 --> 00:28:15,206 och femte, tills vi hit vilka särskilda sentinel värde? 643 00:28:15,206 --> 00:28:16,080 PUBLIK: [OHÖRBAR] 644 00:28:16,080 --> 00:28:18,800 DAVID J. MALAN: Ja, det omvända snedstrecket noll, vid vilken punkt i endera strängen 645 00:28:18,800 --> 00:28:20,100 Vi kan besluta att det är. 646 00:28:20,100 --> 00:28:21,970 Har vi matchade varenda karaktär? 647 00:28:21,970 --> 00:28:22,990 Om inte, returnera false. 648 00:28:22,990 --> 00:28:24,770 Om så är fallet, return true. 649 00:28:24,770 --> 00:28:28,800 Och så det är precis vad den här versionen av programmet jämföra-1.c gör. 650 00:28:28,800 --> 00:28:31,677 Den är identisk med vad vi tittat på måndag, förutom att jag har 651 00:28:31,677 --> 00:28:34,760 blivit av ordet string-- men som inte har någon fungerande impact-- alla 652 00:28:34,760 --> 00:28:37,450 Jag gör nu är att ta bort vissa visuella stödhjul, 653 00:28:37,450 --> 00:28:40,880 men att se tydligt att s och t är adresser. 654 00:28:40,880 --> 00:28:43,020 Och det är vad stjärnan, asterisken representerar 655 00:28:43,020 --> 00:28:46,690 är en adress, annars känd mer tekniskt som en pekare. 656 00:28:46,690 --> 00:28:49,880 >> Så när jag försäkrar er om linje 9 och säga char * s, 657 00:28:49,880 --> 00:28:52,160 det betyder inte att ge mig en sträng. 658 00:28:52,160 --> 00:28:56,360 Det innebär att ge mig en variabel vars syfte i livet är att lagra en adress. 659 00:28:56,360 --> 00:29:00,400 Eftersom jag är på väg att sätta adressen för en sträng i den. 660 00:29:00,400 --> 00:29:03,500 Och faktiskt, getString, att vara klart, inte returnerar en sträng. 661 00:29:03,500 --> 00:29:06,110 Det går inte tillbaka mamma omvänt snedstreck noll, i och för sig. 662 00:29:06,110 --> 00:29:10,005 Vad betyder getString specifikt och exakt tillbaka? 663 00:29:10,005 --> 00:29:10,880 PUBLIK: [OHÖRBAR] 664 00:29:10,880 --> 00:29:14,080 David J. MALAN: En adress, den adressen för det första tecknet 665 00:29:14,080 --> 00:29:16,070 i vissa strängen har fått. 666 00:29:16,070 --> 00:29:19,250 Och så nu ser vi en speciell sökord igen. 667 00:29:19,250 --> 00:29:20,640 Och hänvisade jag till detta tidigare. 668 00:29:20,640 --> 00:29:23,620 Detta kommer att vara bra konvention att vi får se om och om igen nu. 669 00:29:23,620 --> 00:29:27,540 Jag kollar att se till att s inte är noll och t är inte noll. 670 00:29:27,540 --> 00:29:30,100 Eftersom de baseras på min verkligen snabbt nämna tidigare, 671 00:29:30,100 --> 00:29:35,510 vad kan innebära om getString återvänder inte en adress men N-U-L-L, som är återigen, 672 00:29:35,510 --> 00:29:36,990 några speciella värde? 673 00:29:36,990 --> 00:29:37,890 >> PUBLIK: Fel. 674 00:29:37,890 --> 00:29:38,600 >> DAVID J. MALAN: Det är ett fel. 675 00:29:38,600 --> 00:29:39,550 Något gick snett. 676 00:29:39,550 --> 00:29:41,341 Och vad typiskt kan hända, särskilt 677 00:29:41,341 --> 00:29:45,162 med strings-- som kan vara av okänd längd i advance-- 678 00:29:45,162 --> 00:29:46,870 kanske datorerna " slut på minne, kanske 679 00:29:46,870 --> 00:29:49,280 du skrev på ett sådant långa ord eller en mening 680 00:29:49,280 --> 00:29:51,880 eller klistras sådan enorm uppsats det finns bara inte tillräckligt med minne. 681 00:29:51,880 --> 00:29:55,340 Och så getString kan inte återvända adressen till det hela, 682 00:29:55,340 --> 00:29:56,620 så det bara returnerar ingenting. 683 00:29:56,620 --> 00:30:00,580 Och det står ett fel har hänt genom att returnera den speciella NULL värde. 684 00:30:00,580 --> 00:30:02,890 Det är noll adress, så att säga. 685 00:30:02,890 --> 00:30:06,157 >> Nu visar det sig C levereras med en funktion som gör det iteration. 686 00:30:06,157 --> 00:30:09,240 Vi behöver inte genomföra detta med en for-loop eller en while-slinga själva. 687 00:30:09,240 --> 00:30:11,150 Vi kan använda en funktion, kallas kortfattat, 688 00:30:11,150 --> 00:30:15,400 rör comp, eller sträng jämföra, vars syfte i livet är att göra just detta. 689 00:30:15,400 --> 00:30:19,990 Du ger det två pekare, två adresser, och det kommer att gå till dessa adresser 690 00:30:19,990 --> 00:30:23,130 och sedan jämföra bokstav för bokstav för bokstav för kvalitet, 691 00:30:23,130 --> 00:30:26,610 stannar bara när det som är sant? 692 00:30:26,610 --> 00:30:31,540 När intuitivt Rör om komp stopp iteration, bara för att vara klart? 693 00:30:31,540 --> 00:30:35,400 När den träffar ett omvänt snedstreck 0 i antingen sträng, vid vilken punkt det kan bestämma 694 00:30:35,400 --> 00:30:38,910 har allt matchas, eller har det skett en avvikelse? 695 00:30:38,910 --> 00:30:42,740 >> Så, om vi kör detta nu och prova vår lilla kapitalisering spel, 696 00:30:42,740 --> 00:30:49,260 så att jämföra-1, ./compare-1, och skriver mamma med gemener båda gångerna. 697 00:30:49,260 --> 00:30:50,560 Nu är det samma sak. 698 00:30:50,560 --> 00:30:54,080 Och om jag gör det igen med gemener och sedan kanske versaler. 699 00:30:54,080 --> 00:30:56,720 Nu är det verkligen skiljer mellan övre och gemener. 700 00:30:56,720 --> 00:31:00,440 Så inte så svårt eller magiska, men det gör nu förklarar 701 00:31:00,440 --> 00:31:03,140 vad som händer under huven. 702 00:31:03,140 --> 00:31:07,640 >> Så vad mer kan vi utvinna från denna typ av lektion? 703 00:31:07,640 --> 00:31:08,980 Så låt oss ta en titt på detta. 704 00:31:08,980 --> 00:31:15,380 Jag kommer att gå vidare och skriva en snabb program här kallad copy-0. 705 00:31:15,380 --> 00:31:21,594 Och nu ska vi gå vidare och faktiskt låt oss göra this-- med kopia-0, 706 00:31:21,594 --> 00:31:23,010 ta en titt på vad jag har här. 707 00:31:23,010 --> 00:31:24,712 Jag först tala om för användaren, säga något. 708 00:31:24,712 --> 00:31:26,420 Då får jag en sträng och jag lagras det i s. 709 00:31:26,420 --> 00:31:29,810 Sedan kollar jag om s är lika med är lika med noll, bara tillbaka en. 710 00:31:29,810 --> 00:31:31,590 Så det här är bara vanlig felkontroll. 711 00:31:31,590 --> 00:31:33,112 Inget intressant har hänt. 712 00:31:33,112 --> 00:31:36,320 Och faktiskt, om vi blir av felet kontroll, ser detta som vecka 1 kod 713 00:31:36,320 --> 00:31:36,985 just nu. 714 00:31:36,985 --> 00:31:39,110 Men jag har börjat få en lite bättre om det. 715 00:31:39,110 --> 00:31:43,340 >> Nu i linje 16, för en vecka sedan, kanske även ett par dagar eller minuter sedan, 716 00:31:43,340 --> 00:31:46,720 du kan säga linje 16 är skapa en variabel som heter t 717 00:31:46,720 --> 00:31:48,219 och kopiering s in i den. 718 00:31:48,219 --> 00:31:50,010 Och det är en perfekt rimlig takeaway. 719 00:31:50,010 --> 00:31:51,560 Men vara mer exakt nu. 720 00:31:51,560 --> 00:31:54,190 Vad händer i linje 16? 721 00:31:54,190 --> 00:31:56,170 Vad är att få kopieras från höger till vänster? 722 00:31:56,170 --> 00:31:56,669 Yeah? 723 00:31:56,669 --> 00:31:58,490 PUBLIK: Är t få en adress till s? 724 00:31:58,490 --> 00:32:01,220 >> DAVID J. MALAN: Exakt, t blir adressen till s. 725 00:32:01,220 --> 00:32:05,170 Så för att vara tydlig nu, om jag går tillbaka till det tidigare exempel 726 00:32:05,170 --> 00:32:08,520 och jag dra ut det jag har skrivit in. 727 00:32:08,520 --> 00:32:11,640 Och vad jag har skrivit in-- här är s, och här 728 00:32:11,640 --> 00:32:15,830 är vad jag har skrivit i någonstans i minne, mamma och sedan ett omvänt snedstreck 729 00:32:15,830 --> 00:32:17,840 0 som är till för mig. 730 00:32:17,840 --> 00:32:23,060 Vad jag lagras här, minns, detta är på plats 1, 2, 3, 4, 731 00:32:23,060 --> 00:32:24,655 Detta är vad som för närvarande i s. 732 00:32:24,655 --> 00:32:29,220 Så om på rad 16, säger jag ge mig en annan variabel som kallas t och lagra 733 00:32:29,220 --> 00:32:33,590 in på värdet på s, vad får lagras här kommer inte mamma 734 00:32:33,590 --> 00:32:35,480 utan snarare bara antalet 1. 735 00:32:35,480 --> 00:32:38,520 >> Så om vi blickar framåt i detta program nu, vad som kommer att hända? 736 00:32:38,520 --> 00:32:40,690 Så märker att det finns denna funktion kan du kanske 737 00:32:40,690 --> 00:32:44,410 har använt detta för en tid sedan för Caesar, eller Vigenère, eller kanske inte alls. 738 00:32:44,410 --> 00:32:48,170 Jag hävdar med min printf, jag kommer att kapitalisera kopierings t. 739 00:32:48,170 --> 00:32:51,616 Först i raden 19, snabb sanity kontrollera, strlen kontrollerar längden på t. 740 00:32:51,616 --> 00:32:53,740 Eftersom jag inte vill försöka kapitalisera något 741 00:32:53,740 --> 00:32:55,104 om det inte finns någon sträng där. 742 00:32:55,104 --> 00:32:57,520 Om användaren bara trycka Enter, det finns inget att kapitalisera. 743 00:32:57,520 --> 00:33:01,100 Så jag vill inte göra linjen 21. 744 00:33:01,100 --> 00:33:05,758 Så linje 21 kapitalisera vilken bokstav, tydligen, i t? 745 00:33:05,758 --> 00:33:06,514 >> PUBLIK: m? 746 00:33:06,514 --> 00:33:08,722 DAVID J. MALAN: Det ser som det är kopiering som ett? 747 00:33:08,722 --> 00:33:09,486 PUBLIK: m. 748 00:33:09,486 --> 00:33:10,450 DAVID J. MALAN: Öh, m. 749 00:33:10,450 --> 00:33:12,685 OK, så den första m, eftersom märker att jag är 750 00:33:12,685 --> 00:33:14,935 passerar till TOUPPER, vilket Om du aldrig har sett det är det 751 00:33:14,935 --> 00:33:16,980 bara en funktion för att kapitalisera som sin insignal. 752 00:33:16,980 --> 00:33:20,240 t bygel noll innebär ge mig noll karaktär t. 753 00:33:20,240 --> 00:33:22,550 Och så hur gör detta bild förändring, att vara tydlig? 754 00:33:22,550 --> 00:33:25,490 755 00:33:25,490 --> 00:33:29,160 Vad behöver få skrivas om eller ändras med avseende på s och t och mamma 756 00:33:29,160 --> 00:33:30,097 snedstreck noll. 757 00:33:30,097 --> 00:33:31,470 >> PUBLIK: [OHÖRBAR] 758 00:33:31,470 --> 00:33:34,030 >> DAVID J. MALAN: Ja, så här här bara 759 00:33:34,030 --> 00:33:40,860 måste få ändrats att-- fixa this-- behöver få ändras till en kapital m. 760 00:33:40,860 --> 00:33:44,330 Men nu ser senare i program, om jag skriver ut 761 00:33:44,330 --> 00:33:49,800 s och t som jag städa här, titta på vad som är kommer att hända skriva ut s och t. 762 00:33:49,800 --> 00:33:54,310 Så gör copy-0, ./copy-0. 763 00:33:54,310 --> 00:33:57,140 Låt mig gå vidare och skriva i mamma i alla gemener. 764 00:33:57,140 --> 00:34:00,140 Lägg märke till både den ursprungliga och kopian har aktiverats. 765 00:34:00,140 --> 00:34:00,850 Varför? 766 00:34:00,850 --> 00:34:04,431 Tja, s och t båda pekar på, om ni så vill, samma bit av minnet. 767 00:34:04,431 --> 00:34:06,930 Och ärligt talat, det här är att få verkligen uninteresting-- det faktum 768 00:34:06,930 --> 00:34:09,150 att vi använder adress noll här. 769 00:34:09,150 --> 00:34:11,719 Jag menar, jag vet inte riktigt bryr där grejer är i minnet. 770 00:34:11,719 --> 00:34:13,550 Ledsen jag radera lite för mycket. 771 00:34:13,550 --> 00:34:15,674 Men jag bryr mig egentligen inte där saker är i minnet. 772 00:34:15,674 --> 00:34:18,510 Och så, ja vad programmerare tenderar att tänka på 773 00:34:18,510 --> 00:34:21,080 är att när man talar om en adress, eller en pekare, 774 00:34:21,080 --> 00:34:22,679 vem bryr sig om det är i minnet. 775 00:34:22,679 --> 00:34:24,989 Jag bryr mig inte om det är på byte av en eller en miljard. 776 00:34:24,989 --> 00:34:27,920 Jag bryr bara att detta variabel är effektivt 777 00:34:27,920 --> 00:34:29,620 pekar på att bit av minnet. 778 00:34:29,620 --> 00:34:33,350 Och så, hädanefter, snarare än käbbla över godtyckliga minnesadresser, låt oss 779 00:34:33,350 --> 00:34:36,710 bara börja dra pekare som pekare, som pilar. 780 00:34:36,710 --> 00:34:39,340 Så vad s och t verkligen är, enligt detta program, 781 00:34:39,340 --> 00:34:42,130 på grund av hur jag skapade t, Det är bara två separata variabler 782 00:34:42,130 --> 00:34:43,840 pekar på samma bit av minne. 783 00:34:43,840 --> 00:34:45,215 Och vi bryr oss inte var de är. 784 00:34:45,215 --> 00:34:47,130 Så vi kan abstrakt bort den detaljen. 785 00:34:47,130 --> 00:34:48,780 >> Så hur kan jag fixa det? 786 00:34:48,780 --> 00:34:54,120 Om jag vill skriva en version av kopian program som faktiskt kopierar sträng 787 00:34:54,120 --> 00:34:56,840 och aktiverar endast kopiera, bara intuitivt, 788 00:34:56,840 --> 00:34:59,766 vad måste vara en ingrediens till vår lösning? 789 00:34:59,766 --> 00:35:00,640 PUBLIK: [OHÖRBAR] 790 00:35:00,640 --> 00:35:01,420 DAVID J. MALAN: Vi behöver en vad? 791 00:35:01,420 --> 00:35:01,820 PUBLIK: Chunk minne. 792 00:35:01,820 --> 00:35:03,280 DAVID J. MALAN: Vi behöver en annan bit av minnet, eller hur? 793 00:35:03,280 --> 00:35:05,360 Vi vet inte hur man gör det ännu, nödvändigtvis. 794 00:35:05,360 --> 00:35:11,330 Men jag slags vill att detta ska ske så att den ursprungliga mamma i gemener 795 00:35:11,330 --> 00:35:14,170 hamnar i den extra bit av minnet. 796 00:35:14,170 --> 00:35:19,770 Och sen när jag byter kopian, jag vill inte ändra detta exemplar här. 797 00:35:19,770 --> 00:35:26,020 Jag stället bara vill ändra detta kopia så att originalet är oförändrad. 798 00:35:26,020 --> 00:35:27,980 >> Så, låt oss se hur vi kan göra detta. 799 00:35:27,980 --> 00:35:31,800 I copy-1, som redan har tagits kommentar 800 00:35:31,800 --> 00:35:33,250 men kommenteras på nätet. 801 00:35:33,250 --> 00:35:36,710 Vi istället göra following-- dessa linjer är identiska, få mig en sträng 802 00:35:36,710 --> 00:35:38,340 och kallar det är. 803 00:35:38,340 --> 00:35:43,500 Men nu ska vi titta på ett av våra mest komplex men den sista av komplexiteten 804 00:35:43,500 --> 00:35:47,340 ett tag, gör linje 16 just detta. 805 00:35:47,340 --> 00:35:49,400 Så om din bekväma med bild vi drew-- bara 806 00:35:49,400 --> 00:35:51,790 ge mig en ny bit av minnet, kopiera allt i det, 807 00:35:51,790 --> 00:35:53,730 Låt oss se hur vi översätter det till kod. 808 00:35:53,730 --> 00:35:59,400 >> Så linje 16, på vänster sida, char * t ger mig denna ruta hit. 809 00:35:59,400 --> 00:36:00,230 Det är allt den gör. 810 00:36:00,230 --> 00:36:03,240 På höger sida, m alloc eller malloc, 811 00:36:03,240 --> 00:36:06,480 är minnesallokering, super snygga, en kryptisk sätt att bara säga 812 00:36:06,480 --> 00:36:07,640 ge mig en bit av minne. 813 00:36:07,640 --> 00:36:09,290 Hur mycket minne behöver vi? 814 00:36:09,290 --> 00:36:10,910 Tja, är lite av en stor uttryck. 815 00:36:10,910 --> 00:36:12,570 Men låt oss se vad det står här. 816 00:36:12,570 --> 00:36:15,940 Så det här är naturligtvis är att ge mig stränglängd s. 817 00:36:15,940 --> 00:36:19,094 Så, mamma det borde vara vad? 818 00:36:19,094 --> 00:36:21,010 Så bara tre, eller hur? mamma är tre tecken. 819 00:36:21,010 --> 00:36:22,830 Du behöver inte räkna omvänt snedstreck noll när du 820 00:36:22,830 --> 00:36:25,960 tala om längden av en sträng är det faktiskt de mänskliga synliga bokstäver. 821 00:36:25,960 --> 00:36:28,020 Så mamma, så det här ger mig tre. 822 00:36:28,020 --> 00:36:31,170 Men vänta en minut, jag nu lägga till en. 823 00:36:31,170 --> 00:36:34,861 Varför jag verkligen vill fördela 4 byte och inte bara tre? 824 00:36:34,861 --> 00:36:35,360 Yeah? 825 00:36:35,360 --> 00:36:36,910 >> PUBLIK: För sentinel värdet? 826 00:36:36,910 --> 00:36:38,951 >> DAVID J. MALAN: Exakt, för att sentinel värde. 827 00:36:38,951 --> 00:36:40,840 För det omvända snedstrecket noll, Jag behöver 4 byte totalt. 828 00:36:40,840 --> 00:36:42,870 Så jag behöver längden av strängen plus ett. 829 00:36:42,870 --> 00:36:45,400 Och sedan bara för bra measure-- trots att på detta system, 830 00:36:45,400 --> 00:36:49,390 det kommer alltid att vara 1-- jag säger multiplicera med storleken på en röding. 831 00:36:49,390 --> 00:36:51,552 Det visade sig att sizeof är en operatör i C som 832 00:36:51,552 --> 00:36:53,260 bara berättar dig Antalet byte som är 833 00:36:53,260 --> 00:36:54,700 krävs för en viss datatyp. 834 00:36:54,700 --> 00:36:57,740 Det fungerar inte för matriser, typiskt, ibland den gör. 835 00:36:57,740 --> 00:36:59,210 Men i det allmänna fallet, nr. 836 00:36:59,210 --> 00:37:02,330 Men det kommer att tala om för mig hur många byte en röding är, som visar sig är alltid en. 837 00:37:02,330 --> 00:37:04,080 Så det här är som att multiplicera med 1. 838 00:37:04,080 --> 00:37:05,900 >> Så super kryptiska ser kodrad. 839 00:37:05,900 --> 00:37:09,320 Men allt den gör är ger mig en bit av minne. 840 00:37:09,320 --> 00:37:13,590 Men det verkar vara kopiering någonting i detta minne? 841 00:37:13,590 --> 00:37:14,560 Inte än. 842 00:37:14,560 --> 00:37:22,040 Och så vad gör jag på rad 22, och 23, 24, 25, ja, jag helt enkelt göra det. 843 00:37:22,040 --> 00:37:23,760 Och detta är typ av old school grejer nu. 844 00:37:23,760 --> 00:37:26,010 Detta är som PSET 2, där du bara ska flytta saker 845 00:37:26,010 --> 00:37:28,620 runt i minnet, eller snarare i strängar. 846 00:37:28,620 --> 00:37:31,920 >> Så jag iterera från 0 till längden av strängen s. 847 00:37:31,920 --> 00:37:37,820 Och jag kopierar den i: te karaktär is i den i: te karaktär i t. 848 00:37:37,820 --> 00:37:41,820 Och eftersom jag, programmeraren, gjort Var noga med att allokera exakt så många bytes 849 00:37:41,820 --> 00:37:44,600 som jag behöver, det är perfekt ett-till-ett förhållande. 850 00:37:44,600 --> 00:37:47,060 Och jag kopiera mamma i gemener till den nya. 851 00:37:47,060 --> 00:37:50,170 Och sedan slutligen gör jag den här raden. 852 00:37:50,170 --> 00:37:54,637 Och så effekten är endast att kapitalisera denna t här. 853 00:37:54,637 --> 00:37:56,470 Så mycket att absorbera, men Om du bara betrakta 854 00:37:56,470 --> 00:37:58,220 vad som verkligen händer på under huven 855 00:37:58,220 --> 00:38:00,880 är bara flytta dessa byte runt, alla som 856 00:38:00,880 --> 00:38:06,617 behövs för att lösa detta problem är bara för att ge oss denna del av minnet. 857 00:38:06,617 --> 00:38:08,450 Nu med risk för överväldigande, låt mig visa 858 00:38:08,450 --> 00:38:13,200 ett annat exempel som är nästan identiska, med undantag för detta 859 00:38:13,200 --> 00:38:14,350 kodrad. 860 00:38:14,350 --> 00:38:18,870 Så det här är hacker version av detta program, om man så vill. 861 00:38:18,870 --> 00:38:21,050 Men låt oss bara destillera det i vad som händer. 862 00:38:21,050 --> 00:38:28,920 Linje 24 brukade vara denna t fäste i får s fäste i. 863 00:38:28,920 --> 00:38:33,370 Nu, jag ändra detta till mycket mer kryptiska stjärna t 864 00:38:33,370 --> 00:38:36,280 plus en lika stjärna s plus ett. 865 00:38:36,280 --> 00:38:38,702 >> Så vad som händer och varför har vi en stjärna karaktär? 866 00:38:38,702 --> 00:38:41,410 Vi har sett stjärnan tidigare, och den används på olika sätt här. 867 00:38:41,410 --> 00:38:45,490 Vi såg tidigare char *, nu jag ser en stjärna i början, och det är OK. 868 00:38:45,490 --> 00:38:48,190 Eftersom det visar sig vi kan typ av sluta bara 869 00:38:48,190 --> 00:38:50,280 från de första principer vad som händer. 870 00:38:50,280 --> 00:38:53,860 Så bara för att vara tydlig, vad är er? 871 00:38:53,860 --> 00:38:55,052 Förra veckan var det en sträng. 872 00:38:55,052 --> 00:38:56,260 Det räcker inte längre. 873 00:38:56,260 --> 00:38:57,690 Vad är s, speciellt? 874 00:38:57,690 --> 00:38:58,590 >> PUBLIK: [OHÖRBAR] 875 00:38:58,590 --> 00:38:59,881 >> DAVID J. MALAN: Det är en pekare. 876 00:38:59,881 --> 00:39:02,610 Det är adressen för första tecknet vi skrev in. 877 00:39:02,610 --> 00:39:04,780 OK, vad är t? 878 00:39:04,780 --> 00:39:05,660 >> PUBLIK: [OHÖRBAR] 879 00:39:05,660 --> 00:39:07,950 >> David J. MALAN: Den adressen för den första bitgruppen 880 00:39:07,950 --> 00:39:10,490 it, att bit av minne omfördelas. 881 00:39:10,490 --> 00:39:14,720 Så visar det sig att när vi upprepa från 0 på upp till strängen 882 00:39:14,720 --> 00:39:17,424 length-- först av allt, jag börjar vid 0, eftersom 883 00:39:17,424 --> 00:39:18,840 i denna gamla skola för loop sak. 884 00:39:18,840 --> 00:39:22,400 Så bara för enkelhetens skull, låt oss anta att den första raden kod 885 00:39:22,400 --> 00:39:23,760 är egentligen bara detta, rätt. 886 00:39:23,760 --> 00:39:26,080 Om jag är noll, lägga till noll till något förmodligen 887 00:39:26,080 --> 00:39:27,540 kommer inte att ha någon effekt. 888 00:39:27,540 --> 00:39:28,560 >> Så vad är detta talesätt? 889 00:39:28,560 --> 00:39:31,600 Det visar sig att stjärnan operatör i detta sammanhang 890 00:39:31,600 --> 00:39:33,700 är dereference operatör, vilket är bara 891 00:39:33,700 --> 00:39:37,530 ett fint sätt att säga gå till följande adress. 892 00:39:37,530 --> 00:39:42,080 Så om s är adressen till den första karaktär i denna bit av minne, 893 00:39:42,080 --> 00:39:43,630 * s organ dit. 894 00:39:43,630 --> 00:39:45,630 Och eftersom vi har ritat bilden på detta sätt, 895 00:39:45,630 --> 00:39:47,430 Du kan anta efter mental modell. 896 00:39:47,430 --> 00:39:51,030 Om detta är er, och ni säger * s * s ungefär som rännor och stegar, 897 00:39:51,030 --> 00:39:54,540 om du kommer ihåg matchen från barndomen, är som följer den pilen och gå 898 00:39:54,540 --> 00:39:55,570 till den adress. 899 00:39:55,570 --> 00:39:57,080 >> * t är samma sak. 900 00:39:57,080 --> 00:39:59,855 Så börja här, gå till sin bit. 901 00:39:59,855 --> 00:40:03,350 Jag kan inte bara dra nytta av den här skärmen på det sättet. 902 00:40:03,350 --> 00:40:05,560 * t innebär att gå hit. 903 00:40:05,560 --> 00:40:08,830 Och då är det för loop bara säger flytta denna karaktär här, 904 00:40:08,830 --> 00:40:11,330 flytta denna karaktär här, flytta denna karaktär här. 905 00:40:11,330 --> 00:40:12,890 Men hur gör jag det inkrementering? 906 00:40:12,890 --> 00:40:15,430 Jag behöver ångra vad jag bort bara. 907 00:40:15,430 --> 00:40:18,140 Detta är vad som brukar kallas pekare aritmetik, som 908 00:40:18,140 --> 00:40:20,040 betyder matte med adresser. 909 00:40:20,040 --> 00:40:22,460 >> Om det i detta för en slinga, Jag fortsätter uppräkning i, 910 00:40:22,460 --> 00:40:26,880 och s är en adress och t är ett adress, om jag håller bara lägga 1 911 00:40:26,880 --> 00:40:31,406 det betyder bara fortsätta framåt, och framåt, och framåt i minnet. 912 00:40:31,406 --> 00:40:34,030 Det är som Oxford Street, gata som CS byggnaden är på. 913 00:40:34,030 --> 00:40:36,490 CS byggnader på 33 Oxford Street. 914 00:40:36,490 --> 00:40:39,870 Så om du skulle göra 33 Oxford Street plus ett, 915 00:40:39,870 --> 00:40:42,870 som tar dig till 34 Oxford Street, sedan 35 Oxford Street, 916 00:40:42,870 --> 00:40:46,380 då 36 Oxford Street, oavsett de byggnader faktiskt är - om de finns. 917 00:40:46,380 --> 00:40:50,540 Och så, det är allt vi gör här med pekare aritmetik. 918 00:40:50,540 --> 00:40:53,820 >> Så det är en super mystiska sätt att uttrycka oss själva. 919 00:40:53,820 --> 00:40:56,160 Men allt som händer under huven 920 00:40:56,160 --> 00:40:59,330 bara följa dessa adresser, gilla att följa en karta, om ni så vill, 921 00:40:59,330 --> 00:41:02,692 eller följande pilar som Vi har ritat på skärmen. 922 00:41:02,692 --> 00:41:04,910 OK, mycket att smälta. 923 00:41:04,910 --> 00:41:10,410 Varje fråga om syntax, begrepp, pekare, malloc, eller liknande. 924 00:41:10,410 --> 00:41:11,480 Ja, här borta först. 925 00:41:11,480 --> 00:41:13,755 >> PUBLIK: Så var det säger * t lika TOUPPER * t, 926 00:41:13,755 --> 00:41:15,575 är att gå att kapitalisera alla bokstäver eller bara-- 927 00:41:15,575 --> 00:41:17,283 >> DAVID J. MALAN: Ah, riktigt bra fråga. 928 00:41:17,283 --> 00:41:19,805 Så i denna linje här, 31, Detta kommer att kapitalisera 929 00:41:19,805 --> 00:41:21,430 den första bokstaven eller alla bokstäver. 930 00:41:21,430 --> 00:41:23,460 Så låt oss svara på det genom att gå tillbaka till första principer. 931 00:41:23,460 --> 00:41:26,168 Och första principer här menar jag bara att gå till de grundläggande definitionerna 932 00:41:26,168 --> 00:41:27,000 av vad det innebär. 933 00:41:27,000 --> 00:41:29,770 Så TOUPPER är en funktion som aktiverar en röding. 934 00:41:29,770 --> 00:41:30,530 Det var allt. 935 00:41:30,530 --> 00:41:36,740 * t betyder gå till first-- gå till adressen i t. 936 00:41:36,740 --> 00:41:40,350 Så, på bilden, om detta är en stor bit minne vi tilldelades med malloc, 937 00:41:40,350 --> 00:41:43,310 och detta är t * t betyder gå hit. 938 00:41:43,310 --> 00:41:46,710 >> Under tiden, du passerar detta värde, gemener m 939 00:41:46,710 --> 00:41:50,040 till TOUPPER, du får tillbaka huvudstad M, där du lägger det? 940 00:41:50,040 --> 00:41:52,410 Du lägger den i samma läge. 941 00:41:52,410 --> 00:41:55,540 Och detta genom att logiken i de grundläggande definitioner det är bara 942 00:41:55,540 --> 00:41:58,792 kapitalisera den första bokstaven om du inte upprepa med i eller 943 00:41:58,792 --> 00:42:02,000 för slinga eller en while-slinga, det kommer inte att göra något mer än du ber den. 944 00:42:02,000 --> 00:42:02,583 Bra fråga. 945 00:42:02,583 --> 00:42:03,237 Yeah? 946 00:42:03,237 --> 00:42:05,369 >> PUBLIK: Varför du använder dereference metod snarare än 947 00:42:05,369 --> 00:42:05,979 arrayen? 948 00:42:05,979 --> 00:42:07,395 >> DAVID J. MALAN: Ah, bra fråga. 949 00:42:07,395 --> 00:42:10,672 Varför skulle du använda dereference metod i stället för arrayen metoden? 950 00:42:10,672 --> 00:42:12,130 Ingen särskild anledning, att vara ärlig. 951 00:42:12,130 --> 00:42:15,290 Och, faktiskt, för detta typ av exempel rätt, 952 00:42:15,290 --> 00:42:17,556 Jag bara argumentera att göra programmet mer komplicerat, 953 00:42:17,556 --> 00:42:19,680 fler ögon inglasning över, folk bläddrar i 954 00:42:19,680 --> 00:42:22,830 eftersom det ser super svårbegriplig, men även om det gör samma sak. 955 00:42:22,830 --> 00:42:26,695 Och så, uppriktigt sagt, är detta en onödigt visuellt komplex lösning 956 00:42:26,695 --> 00:42:27,320 på problemet. 957 00:42:27,320 --> 00:42:29,580 >> Det är fortfarande god design, fem av fem för design, 958 00:42:29,580 --> 00:42:33,140 oavsett om det är i hållaren notation eller pekaren notation. 959 00:42:33,140 --> 00:42:36,299 Men-- särskilt när vi får senare i kursen Pset 5 960 00:42:36,299 --> 00:42:39,340 när vi genomföra denna ordbok som Jag har nämnt ett par times-- 961 00:42:39,340 --> 00:42:42,300 vi faktiskt bryr sig om lågnivå minnesadresser 962 00:42:42,300 --> 00:42:44,140 att vi verkligen förstår vad händer. 963 00:42:44,140 --> 00:42:48,300 >> Men nu visar det sig att detta kodrad här hakparenteser 964 00:42:48,300 --> 00:42:49,900 inte verkligen existerar. 965 00:42:49,900 --> 00:42:52,230 De är vad som kallas syntaktisk socker, som 966 00:42:52,230 --> 00:42:58,390 är bara en metallbit coolt sätt att säga kompilator omvandlar hakparenteser vara 967 00:42:58,390 --> 00:43:00,420 som matematiskt uttryck. 968 00:43:00,420 --> 00:43:02,660 Så det är en mänsklig konvention att kunna bara skriva 969 00:43:02,660 --> 00:43:04,220 Dessa mycket användarvänliga konsoler. 970 00:43:04,220 --> 00:43:06,850 Men vad kompilator, klang, verkligen gör helst 971 00:43:06,850 --> 00:43:10,970 du skriver vad som lyfts fram i linje 24, under huven är det verkligen 972 00:43:10,970 --> 00:43:12,330 omvandla den till detta. 973 00:43:12,330 --> 00:43:16,200 Det är bara mer angenäm som en människa att läsa och skriva kod som linje 24. 974 00:43:16,200 --> 00:43:18,530 Men så småningom de stödhjul lossnar också 975 00:43:18,530 --> 00:43:21,780 när ens egen bekvämlighet blir starkare. 976 00:43:21,780 --> 00:43:27,240 >> Okej, så minns då att detta var den sortens största problemet 977 00:43:27,240 --> 00:43:27,807 Vi sprang in. 978 00:43:27,807 --> 00:43:30,640 Och det är vad utlöste hela denna jävla samtal om pekare, 979 00:43:30,640 --> 00:43:32,340 och adresser, och kopiatorer saker. 980 00:43:32,340 --> 00:43:35,410 Det var därför vi trippade över denna dumma, dumma frågan, varvid 981 00:43:35,410 --> 00:43:38,830 Jag genomfört logically-- med Lauren upp här på demo och apelsinjuicen 982 00:43:38,830 --> 00:43:43,770 i milk-- en perfekt algoritmiskt korrekt funktion 983 00:43:43,770 --> 00:43:47,010 för pumpning två variabler värden, men den jävla sak 984 00:43:47,010 --> 00:43:50,550 inte har någon ihållande, eller permanent, effekt på min kod. 985 00:43:50,550 --> 00:43:51,820 >> Och varför var det? 986 00:43:51,820 --> 00:43:54,650 I ett nötskal, varför är detta genomförande av växlings 987 00:43:54,650 --> 00:43:58,740 logiskt korrekt, men har ingen inverkan på de variabler som skickas till den, 988 00:43:58,740 --> 00:44:01,119 som x- och y för main? 989 00:44:01,119 --> 00:44:02,410 Vad var kontentan av problemet? 990 00:44:02,410 --> 00:44:02,909 Yeah? 991 00:44:02,909 --> 00:44:05,532 PUBLIK: Eftersom variabel gjort kopior av variabel i passet 992 00:44:05,532 --> 00:44:06,240 genom funktion. 993 00:44:06,240 --> 00:44:09,060 >> DAVID J. MALAN: Just det, när du passerar variabler till en funktion, eller argument 994 00:44:09,060 --> 00:44:11,030 till en funktion, de är passerade genom att kopiera, vilket 995 00:44:11,030 --> 00:44:14,770 innebär att du får en identisk ser mönster av bitar för både x och y, 996 00:44:14,770 --> 00:44:15,955 kallas här a och b. 997 00:44:15,955 --> 00:44:18,080 Och du kan göra något du vill med dessa kopior, 998 00:44:18,080 --> 00:44:20,657 men de kommer att ha någon effekt på anropsfunktionen. 999 00:44:20,657 --> 00:44:22,990 Och i själva verket, drog vi att bild på skärmen, återkallelse 1000 00:44:22,990 --> 00:44:25,520 förra gången, där om du verkligen tänka på vad som är 1001 00:44:25,520 --> 00:44:28,570 pågår under hood-- om Detta är datorns minne, 1002 00:44:28,570 --> 00:44:31,650 och här nere är en stor bit av minne som används för main, 1003 00:44:31,650 --> 00:44:34,020 detta är den del av minne som används för swap, 1004 00:44:34,020 --> 00:44:37,090 och så även om huvud har två variabler, x och y, 1005 00:44:37,090 --> 00:44:41,840 swap kan ha identiska ser värden, som båda är ett och två, 1006 00:44:41,840 --> 00:44:44,520 men de är helt olika bitar av minnet. 1007 00:44:44,520 --> 00:44:46,130 >> Så vi behöver en lösning på detta. 1008 00:44:46,130 --> 00:44:51,580 Och ärligt talat, verkar det som vi nu har en lösning på detta problem, höger. 1009 00:44:51,580 --> 00:44:55,760 Om vi ​​nu har möjlighet att manipulera saker i form av adresser 1010 00:44:55,760 --> 00:44:59,310 och, typ av rännor och stegar stil, följ pilarna 1011 00:44:59,310 --> 00:45:02,820 och gå någonstans vi vill i minnet, kunde inte vi 1012 00:45:02,820 --> 00:45:06,220 lösa detta problem genom övergång från huvud att byta 1013 00:45:06,220 --> 00:45:09,650 inte de värden vi vill swap, men bara intuitivt 1014 00:45:09,650 --> 00:45:11,630 vad kan vi gå att byta i stället? 1015 00:45:11,630 --> 00:45:12,620 >> [Inplacering UTTRYCKER] 1016 00:45:12,620 --> 00:45:15,244 >> DAVID J. MALAN: Varför inte vi bara passera den adresser, eller hur? 1017 00:45:15,244 --> 00:45:17,470 Varför vi inte ge swap en skattkarta, om ni så vill, 1018 00:45:17,470 --> 00:45:20,950 som leder den till faktiska värdena x och y. 1019 00:45:20,950 --> 00:45:24,340 Låt oss swap, faktiskt ändra de ursprungliga bitar, snarare än 1020 00:45:24,340 --> 00:45:26,797 bara passerar kopior av bitarna. 1021 00:45:26,797 --> 00:45:29,130 Och så, i själva verket, det är vad är kommer att vara lösningen. 1022 00:45:29,130 --> 00:45:31,899 Denna version här är klart dåligt och bristfällig. 1023 00:45:31,899 --> 00:45:35,190 Och nu, vid första anblicken, bara ser det som vi lagt till en massa stjärnor slumpmässigt 1024 00:45:35,190 --> 00:45:37,106 och korsade fingrarna att det skulle kompilera. 1025 00:45:37,106 --> 00:45:38,460 Men, skulle det nu kompilera. 1026 00:45:38,460 --> 00:45:40,090 >> Men låt oss se vad detta betyder. 1027 00:45:40,090 --> 00:45:43,990 Och, tyvärr, författarna C kunde ha valt en annan symbol 1028 00:45:43,990 --> 00:45:46,380 att göra det lite tydligare, men stjärnan operatören 1029 00:45:46,380 --> 00:45:48,610 har olika innebörd i två olika sammanhang. 1030 00:45:48,610 --> 00:45:50,890 Och vi har sett både, men låt oss urskilja. 1031 00:45:50,890 --> 00:45:55,310 >> Så upp på toppen finns, när jag har bytt a och b 1032 00:45:55,310 --> 00:46:00,470 från att vara int si dåliga version till int stjärnor, a och b, 1033 00:46:00,470 --> 00:46:01,740 tidigare var heltal. 1034 00:46:01,740 --> 00:46:05,752 Vilka är a och b nu i det goda, gröna versionen? 1035 00:46:05,752 --> 00:46:06,900 De är adresser. 1036 00:46:06,900 --> 00:46:09,610 Adresser till vad, att vara tydlig? 1037 00:46:09,610 --> 00:46:10,770 Adresser till heltal. 1038 00:46:10,770 --> 00:46:12,520 Så det faktum att jag är säga int stjärna organ 1039 00:46:12,520 --> 00:46:15,440 detta är adressen till ett heltal, specifikt. 1040 00:46:15,440 --> 00:46:19,120 >> Så nu märker i rader kod, något annat har förändrats också. 1041 00:46:19,120 --> 00:46:22,770 tmp förblir densamma, eftersom det är bara tillfälligt heltal 1042 00:46:22,770 --> 00:46:24,110 inget minne magi där. 1043 00:46:24,110 --> 00:46:26,370 Men nu behöver en stjärna. 1044 00:46:26,370 --> 00:46:28,560 Och, faktiskt, varje andra omnämnandet av a och b, 1045 00:46:28,560 --> 00:46:31,780 märker att allt som är byte från rött till grönt 1046 00:46:31,780 --> 00:46:34,209 är att jag prefix dessa variabler med stjärnor. 1047 00:46:34,209 --> 00:46:35,750 Eftersom jag inte vill kopiera a och b. 1048 00:46:35,750 --> 00:46:40,350 För om jag bara kopiera a och b och swap a och b, vad ska jag egentligen byta? 1049 00:46:40,350 --> 00:46:43,760 Bara adresser, jag vill byta vad som står på dessa adresser. 1050 00:46:43,760 --> 00:46:44,860 Jag vill åka dit. 1051 00:46:44,860 --> 00:46:48,000 Och så stjärnan operatören insidan av min funktion, 1052 00:46:48,000 --> 00:46:51,700 inte inne av parameterlistan, innebär att du går till dessa adresser 1053 00:46:51,700 --> 00:46:54,490 och faktiskt ändra dessa värden. 1054 00:46:54,490 --> 00:46:56,500 >> Så vad gör bilden nu ser ut som i stället. 1055 00:46:56,500 --> 00:47:03,250 Tja, om istället jag passerar in a och b inte ett och 2-- 1056 00:47:03,250 --> 00:47:05,790 Jag behöver faktiskt lägga en andra definitionen här. 1057 00:47:05,790 --> 00:47:09,030 Så antar att denna bit minne är på plats 10. 1058 00:47:09,030 --> 00:47:12,960 >> Detta är på plats 11, men detta är lite av en förenkling, 1059 00:47:12,960 --> 00:47:18,900 Jag har nu två val att göra jag passerar x och y eller som jag passerar deras adresser? 1060 00:47:18,900 --> 00:47:22,500 Om jag passerar deras adresser så här, jag bara 1061 00:47:22,500 --> 00:47:25,390 Nu behöver för att genomföra swap per den gröna koden 1062 00:47:25,390 --> 00:47:29,080 så att när den ser ett och när den ser B, att det inte bara kopiera a och b 1063 00:47:29,080 --> 00:47:30,540 och flytta mjölk och apelsinjuice. 1064 00:47:30,540 --> 00:47:32,664 Den mjölk och apelsinjuice metafor bryter nu ner, 1065 00:47:32,664 --> 00:47:35,060 eftersom de är koppar flytande och inte kartor. 1066 00:47:35,060 --> 00:47:37,750 Vi behöver i stället för att gå att ta itu med 10 och vi 1067 00:47:37,750 --> 00:47:42,420 behöver gå till adress 11, och utför sedan att byta logik. 1068 00:47:42,420 --> 00:47:45,580 >> Så logiken är densamma, men vi behöver ett något annorlunda sätt 1069 00:47:45,580 --> 00:47:47,160 att få tillgång till dessa variabler. 1070 00:47:47,160 --> 00:47:52,400 Och så i slutändan, vad Programmet har att se ut är det. 1071 00:47:52,400 --> 00:47:56,610 I swap.c rally kopieras och klistrat in gröna versionen. 1072 00:47:56,610 --> 00:47:58,450 Men jag måste göra en förändring. 1073 00:47:58,450 --> 00:48:00,180 Det är inte tillräckligt att bara ändra swap. 1074 00:48:00,180 --> 00:48:03,830 Vilka andra kodrad måste jag ändra? 1075 00:48:03,830 --> 00:48:04,330 Yeah? 1076 00:48:04,330 --> 00:48:05,770 >> PUBLIK: Om det tar argumenten. 1077 00:48:05,770 --> 00:48:07,603 >> DAVID J. MALAN: Var Det tar sin argumentation. 1078 00:48:07,603 --> 00:48:09,985 Så om jag bläddra upp till huvud jag kan inte bara passera i x och y, 1079 00:48:09,985 --> 00:48:12,820 och jag lovar, det sista bit av ny syntax idag. 1080 00:48:12,820 --> 00:48:17,200 Jag behöver skicka in inte x och y men adressen av x och y. 1081 00:48:17,200 --> 00:48:20,400 Och det visar sig, symbolen att författarna till C valde 1082 00:48:20,400 --> 00:48:23,860 är om du använder ett et-tecken här, inte förväxlas med bitvis et-tecken, 1083 00:48:23,860 --> 00:48:27,130 om du använder ett et-tecken här och ett et-tecken här, 1084 00:48:27,130 --> 00:48:29,570 Detta listar ut för dig, vad är adressen för x, 1085 00:48:29,570 --> 00:48:31,740 kanske är det 10, vad är det adress y, kanske är det 1086 00:48:31,740 --> 00:48:35,400 11, och passerar de i stället. 1087 00:48:35,400 --> 00:48:37,210 >> Så mycket att absorbera allt på en gång. 1088 00:48:37,210 --> 00:48:40,190 Men låt oss se nu snabbt våra återstående fyra minuter 1089 00:48:40,190 --> 00:48:42,150 där saker och ting kan gå snett. 1090 00:48:42,150 --> 00:48:45,120 Och som en sidoreplik, faktiskt Jag tog den här bilden, 1091 00:48:45,120 --> 00:48:46,920 TF tog den här bilden ett eller två år sedan. 1092 00:48:46,920 --> 00:48:49,190 Så det här är det bakre hörnet av Eliot Dining Hall. 1093 00:48:49,190 --> 00:48:52,310 Pekare är kanske det svåraste ämne som vi täcker i CS50. 1094 00:48:52,310 --> 00:48:54,810 Så om du oroa sort lutning är som kanske är det 1095 00:48:54,810 --> 00:48:56,770 mer av en hockeyklubba så här, inser 1096 00:48:56,770 --> 00:49:00,160 vi typ av närmar sig en topp i när det gäller den begreppsmässiga komplexitet. 1097 00:49:00,160 --> 00:49:02,300 >> Och jag tar upp detta foto, eftersom jag svär 1098 00:49:02,300 --> 00:49:05,920 gud, hösten 1996, när jag tog CS50 med min undervisning karl, 1099 00:49:05,920 --> 00:49:09,620 Nishat Mehta, satte han sig mig i hörnet av Eliot D. Hall under lunchen, 1100 00:49:09,620 --> 00:49:12,330 eller middag, eller något att prova att hjälpa mig att förstå pekare. 1101 00:49:12,330 --> 00:49:16,520 Och det är där jag var veckor efter det infördes föreläsning när 1102 00:49:16,520 --> 00:49:18,170 Jag förstod äntligen pekare. 1103 00:49:18,170 --> 00:49:20,590 Och jag är hoppfull om att detta klickar långt tidigare för dig. 1104 00:49:20,590 --> 00:49:23,540 Men inser att detta absolut bland de mer sofistikerade ämnen 1105 00:49:23,540 --> 00:49:24,420 Vi har tittat på. 1106 00:49:24,420 --> 00:49:25,819 Men det är bland de mest kraftfulla. 1107 00:49:25,819 --> 00:49:28,860 Och när du får det, det är verkligen allt bara att äntligen komma samman. 1108 00:49:28,860 --> 00:49:31,460 Så lita på att det inte måste alla handfat i dag. 1109 00:49:31,460 --> 00:49:32,980 >> Så här är det sista programmet vi kommer att titta på. 1110 00:49:32,980 --> 00:49:35,605 Och vi kommer att sluta med en snabba tre minuter claymation 1111 00:49:35,605 --> 00:49:37,030 gjord av vår vän, Nick Parlante. 1112 00:49:37,030 --> 00:49:41,440 Här är ett program, som på de två översta linjer deklarerar en variabel x och y. 1113 00:49:41,440 --> 00:49:44,780 Som båda är adresser av heltal, AKA pekare. 1114 00:49:44,780 --> 00:49:48,125 Vi sedan allokera tillräckligt minne för att lagra en int 1115 00:49:48,125 --> 00:49:51,344 och lagra adressen i nämnda minne i x. 1116 00:49:51,344 --> 00:49:53,260 Så, är det ännu enklare än exemplet tidigare. 1117 00:49:53,260 --> 00:49:56,100 Ge mig fyra byte minne, det är storleken på en int, 1118 00:49:56,100 --> 00:49:58,000 och satte den adressen i x. 1119 00:49:58,000 --> 00:50:01,070 Denna linje betyder här gå till adressen i x 1120 00:50:01,070 --> 00:50:05,270 och sätta innebörden av liv, antalet 42 där. 1121 00:50:05,270 --> 00:50:07,710 Men denna linje oroar mig. 1122 00:50:07,710 --> 00:50:12,620 Star y betyder gå till adressen i y, och satte otursnummer 13 där. 1123 00:50:12,620 --> 00:50:15,780 Varför är det farligt, vid denna tidpunkt i story-- om än snabbt berättade 1124 00:50:15,780 --> 00:50:17,980 i våra avtagande minuter här-- varför är det dåligt 1125 00:50:17,980 --> 00:50:19,660 för mig att säga, gå till adressen i y? 1126 00:50:19,660 --> 00:50:21,077 >> PUBLIK: inte Du har [OHÖRBAR]. 1127 00:50:21,077 --> 00:50:22,910 DAVID J. MALAN: Jag har inte sätta något i y. 1128 00:50:22,910 --> 00:50:25,520 Så vad är värdet av y, vid denna tidpunkt i historien? 1129 00:50:25,520 --> 00:50:26,570 Vi har ingen aning. 1130 00:50:26,570 --> 00:50:29,190 Det är en del skräp värde och inte heller Binky vet. 1131 00:50:29,190 --> 00:50:32,532 Om vi ​​kunde sluta på denna anmärkning. 1132 00:50:32,532 --> 00:50:34,832 >> [VIDEOAVSPELNING] 1133 00:50:34,832 --> 00:50:36,500 >> -Hej, Binky, vakna. 1134 00:50:36,500 --> 00:50:39,140 Det är dags för pekaren kul. 1135 00:50:39,140 --> 00:50:40,210 >> -Vad är det? 1136 00:50:40,210 --> 00:50:41,690 Lär dig mer om pekare? 1137 00:50:41,690 --> 00:50:43,570 Åh, karamell. 1138 00:50:43,570 --> 00:50:46,600 >> -Ja, För att komma igång, jag antar att vi är kommer att behöva ett par pekare. 1139 00:50:46,600 --> 00:50:47,380 >> -OK. 1140 00:50:47,380 --> 00:50:51,120 Denna kod tilldelar två pekare vilket kan peka på heltal. 1141 00:50:51,120 --> 00:50:53,557 >> -Okej, Och jag ser två pekare, men de 1142 00:50:53,557 --> 00:50:55,140 verkar inte vara pekar på någonting. 1143 00:50:55,140 --> 00:50:55,970 >> -Det är rätt. 1144 00:50:55,970 --> 00:50:58,100 Initialt pekare inte peka på någonting. 1145 00:50:58,100 --> 00:51:00,950 De saker som de pekar på är kallas pointees och bygga upp dem 1146 00:51:00,950 --> 00:51:02,330 är ett separat steg. 1147 00:51:02,330 --> 00:51:03,210 >> -Oh, Höger, höger. 1148 00:51:03,210 --> 00:51:03,940 Jag visste att. 1149 00:51:03,940 --> 00:51:05,730 De pointees är separata. 1150 00:51:05,730 --> 00:51:08,310 Så hur kan du tilldela en pointee? 1151 00:51:08,310 --> 00:51:11,960 >> -Ok, Väl detta kod allokerar ett nytt heltal pointee, 1152 00:51:11,960 --> 00:51:15,050 och denna del uppsättningar x att peka på det. 1153 00:51:15,050 --> 00:51:16,240 >> -Hej, Ser det bättre. 1154 00:51:16,240 --> 00:51:17,743 Så gör det att göra något. 1155 00:51:17,743 --> 00:51:23,580 >> -Okej, Jag avreferera pekaren x lagra numret 42 i sin pointee. 1156 00:51:23,580 --> 00:51:27,130 För detta trick, jag behöver min trollspö av Återgång. 1157 00:51:27,130 --> 00:51:30,200 >> -Din Trollspö av Återgång? 1158 00:51:30,200 --> 00:51:32,310 Eh, det är så bra. 1159 00:51:32,310 --> 00:51:34,270 >> Det här är vad koden ser ut. 1160 00:51:34,270 --> 00:51:35,970 Jag ska bara ställa upp antalet och-- 1161 00:51:35,970 --> 00:51:37,070 >> [POP SOUND] 1162 00:51:37,070 --> 00:51:39,140 >> -Hej, Titta där det går. 1163 00:51:39,140 --> 00:51:43,980 Så, gör en dereference på x följer pilen för att komma åt dess pointee. 1164 00:51:43,980 --> 00:51:46,150 I detta fall, för att lagra 42 där inne. 1165 00:51:46,150 --> 00:51:50,700 Hej, prova att använda den för att lagra numret 13 genom den andra pekaren, y. 1166 00:51:50,700 --> 00:51:51,840 >> -OK. 1167 00:51:51,840 --> 00:51:56,270 Jag ska bara gå hit till y, och få nummer 13 inrättas. 1168 00:51:56,270 --> 00:52:00,380 Och sedan ta trollspö Namnåtergång och bara-- 1169 00:52:00,380 --> 00:52:01,646 >> [Summerton] 1170 00:52:01,646 --> 00:52:04,080 >> -Oh, Hej som inte fungerade. 1171 00:52:04,080 --> 00:52:06,470 Säg, eh, Binky, det gör jag inte tror Återgång 1172 00:52:06,470 --> 00:52:10,850 y är en bra idé, eftersom inställning upp pointee är ett separat steg. 1173 00:52:10,850 --> 00:52:12,480 Och jag tror inte att vi någonsin gjorde det. 1174 00:52:12,480 --> 00:52:14,620 >> -Hmm, Bra poäng. 1175 00:52:14,620 --> 00:52:19,810 >> -Ja, Vi tilldelas pekaren, y, men vi aldrig satt det att peka på en pointee. 1176 00:52:19,810 --> 00:52:21,590 >> -Hmm, Mycket observant. 1177 00:52:21,590 --> 00:52:23,215 -Hej, Du ser bra ut där, Binky. 1178 00:52:23,215 --> 00:52:26,390 Kan du fixa det så att y poäng till samma pointee som x. 1179 00:52:26,390 --> 00:52:29,290 >> -Visst, Jag använder min trollstav av pekartilldelning. 1180 00:52:29,290 --> 00:52:31,970 >> -Är Det kommer att bli en problem, som förut? 1181 00:52:31,970 --> 00:52:33,790 >> -Nej, Detta inte vidrör pointees. 1182 00:52:33,790 --> 00:52:35,840 Det förändrar bara en pekare att peka på samma thing-- 1183 00:52:35,840 --> 00:52:36,465 >> [Knäppande ljud] 1184 00:52:36,465 --> 00:52:37,450 --as annan. 1185 00:52:37,450 --> 00:52:38,440 >> -Jag förstår. 1186 00:52:38,440 --> 00:52:41,200 Nu y pekar på samma plats som x. 1187 00:52:41,200 --> 00:52:42,950 Så, vänta, nu y är fast. 1188 00:52:42,950 --> 00:52:44,110 Den har en pointee. 1189 00:52:44,110 --> 00:52:47,779 Så du kan prova trollspö Namnåtergång igen för att skicka den 13 över. 1190 00:52:47,779 --> 00:52:51,110 >> -Oh, OK, här går. 1191 00:52:51,110 --> 00:52:52,330 >> -Hej, Titta på det. 1192 00:52:52,330 --> 00:52:53,570 Nu Namnåtergång fungerar på y. 1193 00:52:53,570 --> 00:52:57,900 Och eftersom pekarna delar att en pointee, de båda se 13. 1194 00:52:57,900 --> 00:52:59,952 >> -Ja, Dela, eh, vad som helst. 1195 00:52:59,952 --> 00:53:01,535 Så vi kommer att byta plats nu? 1196 00:53:01,535 --> 00:53:03,730 >> -Oh, Vi ser är för sent. 1197 00:53:03,730 --> 00:53:04,660 >> -But-- 1198 00:53:04,660 --> 00:53:06,520 >> -Bara Ihåg de tre pekar reglerna. 1199 00:53:06,520 --> 00:53:09,550 Nummer 1, den grundläggande strukturen är att du har en pekare, 1200 00:53:09,550 --> 00:53:11,630 och det pekar upp till ett pointee. 1201 00:53:11,630 --> 00:53:13,740 Men pekaren och pointee är separata. 1202 00:53:13,740 --> 00:53:15,620 Och vanligt fel är att inrätta en pekare 1203 00:53:15,620 --> 00:53:18,000 men att glömma att ge den en pointee. 1204 00:53:18,000 --> 00:53:21,170 >> Nummer 2, pekare Återgång börjar vid pekaren 1205 00:53:21,170 --> 00:53:24,020 och följer sin pil över att få tillgång till sin pointee. 1206 00:53:24,020 --> 00:53:27,815 Som vi alla vet, detta fungerar bara om det är en pointee, vilken typ av får tillbaka 1207 00:53:27,815 --> 00:53:29,260 att regel nummer ett. 1208 00:53:29,260 --> 00:53:31,990 >> Nummer 3, pekare Uppdraget tar en pekare 1209 00:53:31,990 --> 00:53:35,330 och ändrar det att peka på samma pointee som en annan pekare. 1210 00:53:35,330 --> 00:53:37,150 Så efter överlåtelsen, de två pekarna 1211 00:53:37,150 --> 00:53:40,927 kommer att peka på samma pointee, ibland som kallas delning. 1212 00:53:40,927 --> 00:53:42,510 Och det är allt som finns att det, verkligen. 1213 00:53:42,510 --> 00:53:43,130 Bye-bye nu. 1214 00:53:43,130 --> 00:53:43,475 >> [END SPELA] 1215 00:53:43,475 --> 00:53:44,830 >> DAVID J. MALAN: Det är det för CS50. 1216 00:53:44,830 --> 00:53:46,246 Tack vare professor Nick Parlante. 1217 00:53:46,246 --> 00:53:47,730 Vi ses nästa vecka. 1218 00:53:47,730 --> 00:53:51,706 1219 00:53:51,706 --> 00:53:56,435 >> [ELEKTRONISK MUSIK SPELA] 1220 00:53:56,435 --> 00:57:22,775