1 00:00:00,000 --> 00:00:03,395 >> [MUSIC SPILLE] 2 00:00:03,395 --> 00:00:11,031 3 00:00:11,031 --> 00:00:13,280 DAVID J. MALAN: Dette er som en førsteårsstudent seminar i dag. 4 00:00:13,280 --> 00:00:14,060 OK. 5 00:00:14,060 --> 00:00:15,024 Så veldig regnfull ut. 6 00:00:15,024 --> 00:00:17,690 Dette har en tendens til å skje på onsdager, men desto mer mulighet 7 00:00:17,690 --> 00:00:18,700 for spørsmål i dag. 8 00:00:18,700 --> 00:00:22,210 Så la oss begynne faktisk med filmen i bare et øyeblikk. 9 00:00:22,210 --> 00:00:24,560 Men vi begynner grandly som alltid. 10 00:00:24,560 --> 00:00:28,000 >> Dette er CS50, og denne er i slutten av uke 4. 11 00:00:28,000 --> 00:00:30,820 Så hvis du noen gang har sett TV eller en film, hvor 12 00:00:30,820 --> 00:00:34,690 det er noen dataeksperter og politiet eller FBI, eller noen byrå 13 00:00:34,690 --> 00:00:36,930 prøver å fange noen motstander, vel, har du 14 00:00:36,930 --> 00:00:40,850 sikkert hørt uttrykket "forbedre" der som tekniker eller annen måte 15 00:00:40,850 --> 00:00:44,750 zoomer magisk i uendelig mye til å se de kriminelle 16 00:00:44,750 --> 00:00:48,640 identitet eller registreringsnummeret i og med shimmer et speil 17 00:00:48,640 --> 00:00:50,390 eller glimt av noens øyne. 18 00:00:50,390 --> 00:00:55,196 Så ja, la oss ta en titt på noen få slike scener fra Hollywood. 19 00:00:55,196 --> 00:00:55,862 [VIDEO PLAYBACK] 20 00:00:55,862 --> 00:00:59,243 -OK, Nå la oss få en god titt på deg. 21 00:00:59,243 --> 00:01:06,488 22 00:01:06,488 --> 00:01:07,415 >> -Hold den. 23 00:01:07,415 --> 00:01:08,267 Kjør det tilbake. 24 00:01:08,267 --> 00:01:09,121 >> -Vent et minutt. 25 00:01:09,121 --> 00:01:11,300 Gå til høyre. 26 00:01:11,300 --> 00:01:12,209 >> -Det, Fryse det. 27 00:01:12,209 --> 00:01:12,750 -Full skjerm. 28 00:01:12,750 --> 00:01:13,558 -OK, Fryse det. 29 00:01:13,558 --> 00:01:14,820 -Tighten Opp på det, vil du? 30 00:01:14,820 --> 00:01:16,530 -Vector Inn på det fyr ved bakhjulet. 31 00:01:16,530 --> 00:01:19,400 Zoome inn her på dette stedet. 32 00:01:19,400 --> 00:01:22,846 -Med Riktig utstyr, bildet kan bli utvidet og skjerpet. 33 00:01:22,846 --> 00:01:24,065 -Hva er det? 34 00:01:24,065 --> 00:01:25,600 -Det Er en forbedring program. 35 00:01:25,600 --> 00:01:26,860 -Kan Du klare det opp noe? 36 00:01:26,860 --> 00:01:27,890 -Jeg Vet ikke. 37 00:01:27,890 --> 00:01:29,050 La oss forbedre det. 38 00:01:29,050 --> 00:01:31,575 >> -Enhance Delen A6. 39 00:01:31,575 --> 00:01:33,642 >> -Jeg Forbedret detalj, og-- Jeg tror det er 40 00:01:33,642 --> 00:01:35,433 nok til å forbedre, slipper den til skjermen min. 41 00:01:35,433 --> 00:01:37,080 -Jeg Forbedret refleksjonen i øyet. 42 00:01:37,080 --> 00:01:38,830 >> -La Oss kjøre dette gjennom video ekstrautstyr. 43 00:01:38,830 --> 00:01:40,100 -Edgar, Kan du forbedre dette? 44 00:01:40,100 --> 00:01:41,875 >> -Vent litt. 45 00:01:41,875 --> 00:01:44,010 >> -Jeg Har jobbet med denne refleksjonen. 46 00:01:44,010 --> 00:01:44,995 >> -noen Refleksjon. 47 00:01:44,995 --> 00:01:45,495 Lysreflekterende. 48 00:01:45,495 --> 00:01:47,399 -Det Er en refleksjon av mannens ansikt. 49 00:01:47,399 --> 00:01:48,065 -Den Refleksjon. 50 00:01:48,065 --> 00:01:48,981 -Det Er en refleksjon. 51 00:01:48,981 --> 00:01:50,600 Zoome inn på speilet. 52 00:01:50,600 --> 00:01:52,712 -Du Kan se en refleksjon. 53 00:01:52,712 --> 00:01:54,350 -Kan Du forbedre bildet herfra? 54 00:01:54,350 --> 00:01:55,370 -Kan Du forbedre ham akkurat her? 55 00:01:55,370 --> 00:01:56,210 -Kan Du forbedre det? 56 00:01:56,210 --> 00:01:56,900 Kan du forbedre det? 57 00:01:56,900 --> 00:01:57,870 >> -Kan Vi forbedre dette? 58 00:01:57,870 --> 00:01:58,717 >> -Kan Du forbedre det? 59 00:01:58,717 --> 00:02:00,050 -Hold På et sekund, jeg vil forbedre. 60 00:02:00,050 --> 00:02:00,924 Zoome inn på døren. 61 00:02:00,924 --> 00:02:01,700 -Times 10. 62 00:02:01,700 --> 00:02:02,586 Zoome. 63 00:02:02,586 --> 00:02:03,490 -Flytte inn. 64 00:02:03,490 --> 00:02:03,990 -Mer. 65 00:02:03,990 --> 00:02:04,690 -Wait, Stopp. 66 00:02:04,690 --> 00:02:05,190 Stop. 67 00:02:05,190 --> 00:02:05,970 -Pause Det. 68 00:02:05,970 --> 00:02:09,460 -Rotate Oss 75 grader rundt den vertikale, takk. 69 00:02:09,460 --> 00:02:10,962 Stop. 70 00:02:10,962 --> 00:02:14,040 Gå tilbake til den delen om døren igjen. 71 00:02:14,040 --> 00:02:15,860 >> -Fikk Et bilde enhancer som kan bitmap? 72 00:02:15,860 --> 00:02:18,776 >> -Hei, Kanskje vi kan bruke Pradeep Sen metode for å se inn vinduene. 73 00:02:18,776 --> 00:02:20,372 -Dette Programvare er state of the art. 74 00:02:20,372 --> 00:02:21,845 >> -The Egenverdi er av. 75 00:02:21,845 --> 00:02:24,300 >> -Med Den rette Kombinasjonen av algorithm-- 76 00:02:24,300 --> 00:02:26,755 >> -Han Er tatt eliminering algoritmer til det neste nivå, 77 00:02:26,755 --> 00:02:28,730 og jeg kan bruke dem til forbedre dette fotografiet. 78 00:02:28,730 --> 00:02:31,286 >> -Lock På og forstørre z-aksen. 79 00:02:31,286 --> 00:02:32,560 >> -Enhance. 80 00:02:32,560 --> 00:02:33,100 >> -Enhance. 81 00:02:33,100 --> 00:02:33,600 >> -Enhance. 82 00:02:33,600 --> 00:02:34,960 -Freeze Og forbedre. 83 00:02:34,960 --> 00:02:37,180 >> [END PLAYBACK] 84 00:02:37,180 --> 00:02:41,160 >> DAVID J. MALAN: Greit, så alle av dem er faktisk ord. 85 00:02:41,160 --> 00:02:44,450 De er bare satt sammen i en måten det er faktisk ikke fornuftig. 86 00:02:44,450 --> 00:02:48,400 Og faktisk, CS50 og kurs som det tendens til å ødelegge mye av TV og filmer 87 00:02:48,400 --> 00:02:48,900 for deg. 88 00:02:48,900 --> 00:02:52,330 Fordi når disse dataeksperter er lire av vilkår og si 89 00:02:52,330 --> 00:02:56,860 fancy ting som egenvektorer, og z-aksen, 90 00:02:56,860 --> 00:02:59,572 og hvilket som helst antall annen faktisk mer tekniske termer, 91 00:02:59,572 --> 00:03:02,030 de er egentlig bare strenger ord sammen alt for ofte. 92 00:03:02,030 --> 00:03:05,020 Er at en av våre håp er at, som en bivirkning av å ta kurs 93 00:03:05,020 --> 00:03:08,245 som dette, vil flere mennesker i verden faktisk være i stand til å veie inn 94 00:03:08,245 --> 00:03:12,040 og bare aldri så litt påvirke kvaliteten og nøyaktigheten av disse filmene? 95 00:03:12,040 --> 00:03:14,350 >> Faktisk, la oss ta en titt på virkeligheten. 96 00:03:14,350 --> 00:03:18,070 Så her er de ansatte bilde Mary, en av våre undervisnings medmennesker. 97 00:03:18,070 --> 00:03:20,050 Og antar hun er mistenkt for noe. 98 00:03:20,050 --> 00:03:23,730 Og likevel, det er et glimt av noen del av bevis i øyet, 99 00:03:23,730 --> 00:03:25,480 eller ved refleksjon av hennes briller. 100 00:03:25,480 --> 00:03:30,760 Vel, hvis vi gjør akkurat som filmene foreslår, hvor vi zoome og "styrke", 101 00:03:30,760 --> 00:03:34,080 dette er hvor mye informasjon er i Marias ansikt 102 00:03:34,080 --> 00:03:36,795 når du tar et bilde med det opprinnelige oppløsningen. 103 00:03:36,795 --> 00:03:39,120 >> Og, faktisk, kan du se disse prikkene. 104 00:03:39,120 --> 00:03:41,900 Og dette er hva er kalt piksler, P-I-X-E-L-S, 105 00:03:41,900 --> 00:03:45,740 som er bare en firkantet typisk som er en prikk som komponerer et bilde. 106 00:03:45,740 --> 00:03:49,200 Og tilbake i dag, og faktisk enda i dag med noen av dagens LED-TVer 107 00:03:49,200 --> 00:03:51,950 eller LCD TV-er, hvis du har en i rommet ditt eller hjemme, 108 00:03:51,950 --> 00:03:55,100 hvis du går opp super nær den, og spesielt hvis det er en litt eldre TV, 109 00:03:55,100 --> 00:03:58,760 du kan sikkert også se disse prikkene og det er det å komponere et bilde. 110 00:03:58,760 --> 00:04:00,980 >> Og det er ikke mer Informasjon om enn dette. 111 00:04:00,980 --> 00:04:05,400 Vi kunne "styrke", i den forstand glatting tingene om og liksom 112 00:04:05,400 --> 00:04:09,040 dedusere slags, liksom hva Fargen skal være ved siden av Mary øye 113 00:04:09,040 --> 00:04:10,910 slik at det er faktisk ikke så kornete. 114 00:04:10,910 --> 00:04:14,510 Men hvis jeg fortsetter å zoome inn, er det er skurken i hennes øyne. 115 00:04:14,510 --> 00:04:16,600 Sånn er alle informasjonen vi har. 116 00:04:16,600 --> 00:04:18,920 Du kan ikke opprette informasjon ut av ingenting. 117 00:04:18,920 --> 00:04:20,790 Det er bare en begrenset antall bits der. 118 00:04:20,790 --> 00:04:22,873 >> Så i Problem Set 4, hvor du har en mulighet 119 00:04:22,873 --> 00:04:24,580 å spille med denne slags verden. 120 00:04:24,580 --> 00:04:27,610 I Problem Set fire, vil du utforske verden av grafikk og dataanalyse, 121 00:04:27,610 --> 00:04:30,870 og faktisk skrive kode som gjenoppretter tapte bilder. 122 00:04:30,870 --> 00:04:33,510 Du skal skrive kode som manipulerer eksisterende bilder 123 00:04:33,510 --> 00:04:36,120 og til slutt forstår hva som er skjer under panseret. 124 00:04:36,120 --> 00:04:38,540 >> Og, viser det seg, det er faktisk ikke så komplisert. 125 00:04:38,540 --> 00:04:41,320 For eksempel, hvis vi ønsket å representerer et smilefjes der 126 00:04:41,320 --> 00:04:44,160 med disse sorte piksler, eller disse sorte prikker, 127 00:04:44,160 --> 00:04:47,230 vel, vi kan bare representere dem som virkelig et bitmap. 128 00:04:47,230 --> 00:04:50,040 Og hvis du noen gang hadde hørt at uttrykk bitmap, kanskje 129 00:04:50,040 --> 00:04:52,330 det nå begynner å lage en litt mer fornuftig i dag. 130 00:04:52,330 --> 00:04:53,580 >> Vi vet allerede hva litt er. 131 00:04:53,580 --> 00:04:54,160 Det er 0 eller 1. 132 00:04:54,160 --> 00:04:56,201 Og et kart er bare noe som et stykke papir 133 00:04:56,201 --> 00:04:59,180 som gir deg retninger og har kanskje et rutenett av x- og y-koordinater. 134 00:04:59,180 --> 00:05:00,540 Så her er et bitmap. 135 00:05:00,540 --> 00:05:03,680 Det er et kart over biter der en en tilsynelatende 136 00:05:03,680 --> 00:05:07,857 kommer til å representere en hvit piksel, og en 0 kommer til å representere en svart piksel. 137 00:05:07,857 --> 00:05:09,440 Men vi kan sikkert snu det rundt. 138 00:05:09,440 --> 00:05:11,648 Det spiller egentlig ingen rolle så lenge vi er konsekvente. 139 00:05:11,648 --> 00:05:15,570 Og her er hvordan, i binary-- inne av datamaskinens minne, eller inne 140 00:05:15,570 --> 00:05:18,160 av en fil på hard drive-- kan du lagre 141 00:05:18,160 --> 00:05:20,240 den enkleste av smiley face bilder. 142 00:05:20,240 --> 00:05:23,990 Men hva er vi, selvfølgelig, mangler i dette bildet? 143 00:05:23,990 --> 00:05:24,610 Farge, ikke sant? 144 00:05:24,610 --> 00:05:28,220 Det er en åpenbar neste trinn eller ekstrautstyr for å forbedre denne med farge. 145 00:05:28,220 --> 00:05:32,230 Så dessverre med bare en enkelt bit, 0 eller 1, kan vi representere farge. 146 00:05:32,230 --> 00:05:36,100 Det kan være rød eller blå, eller svart eller hvit, eller grønn, eller rosa, 147 00:05:36,100 --> 00:05:37,420 eller andre par av farger. 148 00:05:37,420 --> 00:05:40,860 Men for enkelhets skyld, vil vi bare anta svart og hvitt. 149 00:05:40,860 --> 00:05:45,930 >> Så hva logisk trenger vi hvis vi ønsker å implementere farge i et bilde? 150 00:05:45,930 --> 00:05:49,080 Hva har vi å gjøre? 151 00:05:49,080 --> 00:05:51,900 Som hvis den begrensende faktor her er at med en bit du kan bare 152 00:05:51,900 --> 00:05:55,977 representerer to tilstander, 0 eller 1, hvit eller svart, hva ønsker du å gjøre? 153 00:05:55,977 --> 00:05:56,810 Målgruppe: Mer data. 154 00:05:56,810 --> 00:05:58,813 DAVID J. MALAN: Flere biter, Yeah mer data, flere biter. 155 00:05:58,813 --> 00:06:01,440 Og, ja, det er akkurat hvordan fargebilder er representert. 156 00:06:01,440 --> 00:06:05,120 I stedet for å bruke en enkelt bit, en 0 eller 1 for hver piksel, hver prikk, 157 00:06:05,120 --> 00:06:06,170 du bare bruke flere. 158 00:06:06,170 --> 00:06:09,660 Kanskje bruke åtte, kanskje, oftere bruke 24, og faktisk i oppgavesettet 159 00:06:09,660 --> 00:06:13,300 4, vil du spille med en fil format som bruker 24 bits typisk. 160 00:06:13,300 --> 00:06:15,430 >> Men de fleste av dere er sikkert kjent med JPEG. 161 00:06:15,430 --> 00:06:17,460 Hvis du noensinne har tatt et bilde på telefonen, 162 00:06:17,460 --> 00:06:20,360 eller lastes opp eller sett noe på Facebook eller Flickr, et tall 163 00:06:20,360 --> 00:06:24,882 av fotobaserte nettsteder, har du sikkert sett et JPEG-bilde før. 164 00:06:24,882 --> 00:06:27,840 Og det viser seg, dette er filen format vi kommer til å bruke i PSet 4, 165 00:06:27,840 --> 00:06:30,340 hvor du kommer til å må gjenopprette bilder 166 00:06:30,340 --> 00:06:35,160 som jeg har slettet ved et uhell fra en ødelagte minnekort i kameraet, 167 00:06:35,160 --> 00:06:35,800 Hvis du vil. 168 00:06:35,800 --> 00:06:38,490 >> Og det viser seg at selv om JPEG er ganske sophisticated-- 169 00:06:38,490 --> 00:06:40,906 det er mye mer sofistikert enn de svarte og hvite prikker 170 00:06:40,906 --> 00:06:44,480 vi så en stund siden, fordi det er faktisk fancy algoritmer som 171 00:06:44,480 --> 00:06:47,410 brukes til å komprimere en JPEG, så at du kan ha en veldig fin, 172 00:06:47,410 --> 00:06:49,832 bildekvalitet, men bruker relativt få biter. 173 00:06:49,832 --> 00:06:51,790 Og vi vil komme tilbake til komprimering før lenge. 174 00:06:51,790 --> 00:06:56,280 Det viser seg at den første tre bytes i en JPEG image-- 175 00:06:56,280 --> 00:07:02,750 uansett hva du har tatt et bilde of-- er verdiene 255, 216, 255. 176 00:07:02,750 --> 00:07:05,990 >> Med andre ord, hvis man bare se at mønster av biter, 177 00:07:05,990 --> 00:07:09,180 her representert som tre byte, eller 24 biter totalt, 178 00:07:09,180 --> 00:07:13,810 med høy sannsynlighet kan du antyde at du ser på det på denne tre første 179 00:07:13,810 --> 00:07:15,230 byte av en JPEG. 180 00:07:15,230 --> 00:07:18,040 Og dette er hva som er kjent som signaturen til en JPEG. 181 00:07:18,040 --> 00:07:20,540 Mye av filformater der ute har en tendens til å starte 182 00:07:20,540 --> 00:07:23,735 med visse mønstre av 0'er og 1'ere, slik at Windows og Mac OS, og iOS, 183 00:07:23,735 --> 00:07:28,272 og Android vet hva slags fil de er, i tillegg til den såkalte file 184 00:07:28,272 --> 00:07:29,730 utvidelse som mange filer har. 185 00:07:29,730 --> 00:07:32,590 Hvis du har .jpg, det er en annen ledetråd til datamaskinen. 186 00:07:32,590 --> 00:07:35,310 >> Så la oss nå se på dette litt mer teknisk. 187 00:07:35,310 --> 00:07:37,390 Vi kjenner desimal Systemet er 0 til 9. 188 00:07:37,390 --> 00:07:38,740 Vi vet er binær 0 og en. 189 00:07:38,740 --> 00:07:41,842 Og hvis du tenker tilbake til PSet 0, hadde vi du kjempe med, 190 00:07:41,842 --> 00:07:43,800 for en liten bit, noe kalt heksadesimal, 191 00:07:43,800 --> 00:07:47,320 der du har 16 siffer, i stedet for 10 eller i stedet for to. 192 00:07:47,320 --> 00:07:50,405 Og disse tallene, etter konvensjonen, er 0 til 9 og deretter en 193 00:07:50,405 --> 00:07:55,040 gjennom f, hvor f representerer det desimaltall, akkurat som en rask sunn fornuft 194 00:07:55,040 --> 00:07:56,640 sjekk? 195 00:07:56,640 --> 00:07:57,610 Så, 15. 196 00:07:57,610 --> 00:08:01,390 Og en må representere 10, bare ved natur bestilling som jeg har gitt. 197 00:08:01,390 --> 00:08:04,350 Det er bare en vilkårlig konvensjon, men det er ganske standard. 198 00:08:04,350 --> 00:08:06,870 >> Så hvis vi ser på dette mønsteret tre bytes-- la oss 199 00:08:06,870 --> 00:08:09,620 bare begynne å se på det i en måte som er forenlig med hvordan 200 00:08:09,620 --> 00:08:12,450 dataforskere generelt se på og tenke på filer. 201 00:08:12,450 --> 00:08:15,580 Du kan sikkert tenke på filer i 0s og 1s, og desimal, 202 00:08:15,580 --> 00:08:19,340 men i virkeligheten, vi pleier å bruke binær eller mer typisk hexadecimal-- 203 00:08:19,340 --> 00:08:20,760 tilbake fra PSet 0. 204 00:08:20,760 --> 00:08:25,857 Så la meg foreslå at 255, 216, og 255 er nettopp disse mønstrene av 0'er og 1'ere. 205 00:08:25,857 --> 00:08:28,440 Og du kan sjekke dette hvis du ønsker å gjøre regnestykket fra uke 0. 206 00:08:28,440 --> 00:08:30,810 Men for nå, bare anta at dette er faktisk riktig. 207 00:08:30,810 --> 00:08:33,850 Jeg har nettopp omskrevet tre desimaler tall som tre binære verdier. 208 00:08:33,850 --> 00:08:36,100 Nå hva jeg skal gjøre er bare legge litt tomrom, 209 00:08:36,100 --> 00:08:37,266 bare for lesbarhet skyld. 210 00:08:37,266 --> 00:08:39,940 Og legg merke til, jeg skal bare å flytte ting fra hverandre. 211 00:08:39,940 --> 00:08:43,090 Så før, etter, før, etter. 212 00:08:43,090 --> 00:08:46,180 Jeg gjør ikke noe interessant andre enn bare å spre ting ut så 213 00:08:46,180 --> 00:08:50,380 at innkalling hvert sett av åtte bits er nå to sett av fire bits. 214 00:08:50,380 --> 00:08:54,920 Dette er nyttig fordi heksadesimal er spesielt fasjonable 215 00:08:54,920 --> 00:09:00,930 fordi hver heksadesimalt siffer fra 0 til f, eller mer spesifikt fra 0 til 15, 216 00:09:00,930 --> 00:09:03,430 kan representeres med nøyaktig fire biter. 217 00:09:03,430 --> 00:09:07,960 Med andre ord, i heksadesimale hvis du ønsker å representere en 0, det er bare 0000, 218 00:09:07,960 --> 00:09:08,780 fire nuller. 219 00:09:08,780 --> 00:09:13,997 Og hvis du ønsker å representere 15, Det er 1111, noe som er fire bits. 220 00:09:13,997 --> 00:09:16,080 Og hvis du gjør regnestykket, hvis dette er de sted, 221 00:09:16,080 --> 00:09:18,210 Dette er 16s sted, som kommer til å gi you-- 222 00:09:18,210 --> 00:09:19,960 snarere som kommer to-- sorry, i binær, 223 00:09:19,960 --> 00:09:23,660 som kommer til å gi deg 15, som sted, Toere sted, firere og åttere sted. 224 00:09:23,660 --> 00:09:26,821 Så la meg foreslå at det sett med fire biter til venstre 225 00:09:26,821 --> 00:09:28,070 er hva vi skal kalle f. 226 00:09:28,070 --> 00:09:30,110 Det er det største tallet du kan representere med fire biter. 227 00:09:30,110 --> 00:09:33,300 Og vi allerede kjenner fra heksadesimale, f er den største siffer i heksadesimale. 228 00:09:33,300 --> 00:09:36,020 Vi har fått en annen f der, to mer enn det. 229 00:09:36,020 --> 00:09:38,980 Og for nå, bare ta på tro at jeg har gjort regnestykket riktig 230 00:09:38,980 --> 00:09:41,890 og at den venstre halvdelen av disse bitene, 1101, 231 00:09:41,890 --> 00:09:43,980 er det samme som d i heksadesimal. 232 00:09:43,980 --> 00:09:46,490 Og høyre hånd, 1000, er bare åtte. 233 00:09:46,490 --> 00:09:48,140 >> Og at man er lett å se, ikke sant? 234 00:09:48,140 --> 00:09:51,670 Den 8 represents-- er riktig under som åttere sted. 235 00:09:51,670 --> 00:09:56,040 Så vi har en i åttere kolonne og ingenting i firere, toere eller de. 236 00:09:56,040 --> 00:09:59,830 Så nå mer konvensjonelt, mennesker har en tendens å skrive heksadesimalsifre som dette, 237 00:09:59,830 --> 00:10:03,000 du bare squish dem sammen, og deretter du prefiks dem med 0x. 238 00:10:03,000 --> 00:10:05,920 Det betyr ingenting annet enn en visuell ledetråd til en human-- 239 00:10:05,920 --> 00:10:10,350 her kommer en heksadesimale value-- fordi det ellers kanskje ikke ville være opplagt. 240 00:10:10,350 --> 00:10:13,629 >> Som er å si, til slutt, at mønsteret av nuller og enere, 241 00:10:13,629 --> 00:10:16,170 eller mønsteret av heksadesimale Sifrene equivalently at du er 242 00:10:16,170 --> 00:10:18,990 kommer til å begynne å lete etter i oppgave Set fire er dette-- 243 00:10:18,990 --> 00:10:22,120 Og problemet Set fire spec vil gå deg gjennom dette i mer detail-- 244 00:10:22,120 --> 00:10:25,344 men innser som slags uforståelige som Dette kan se ut ved første øyekast, 245 00:10:25,344 --> 00:10:27,010 du kommer til å begynne å se dette mye. 246 00:10:27,010 --> 00:10:30,320 Og i virkeligheten, selv i GDB, den debugger vi introdusert på mandag 247 00:10:30,320 --> 00:10:35,440 og Dan introduserer i PSet tre, kommer å ofte vise deg heksadesimale verdier 248 00:10:35,440 --> 00:10:39,910 bare fordi de har en tendens til å være mer konvensjonell enn desimal eller binær 249 00:10:39,910 --> 00:10:41,157 i verden av datamaskiner. 250 00:10:41,157 --> 00:10:42,490 Nå la oss sette dette i sammenheng. 251 00:10:42,490 --> 00:10:48,040 Mange av dere husker kanskje dette bildet her, som kom fra hva? 252 00:10:48,040 --> 00:10:51,240 Vista, så selv tidligere enn at Windows XP gjorde dette debut. 253 00:10:51,240 --> 00:10:52,620 Så dette er et vakkert landskap. 254 00:10:52,620 --> 00:10:55,940 Og faktisk, hvis du rote rundt online-- Jeg tror det er en Wikipedia-artikkel, 255 00:10:55,940 --> 00:11:00,110 hvor noen veldig utrolig gikk ut fant dette stedet i verden å sette opp 256 00:11:00,110 --> 00:11:02,240 hans eller hennes kamera nøyaktig riktig sted-- 257 00:11:02,240 --> 00:11:06,510 og dette i dag ser like-- men det er nøyaktig den samme innstillingen. 258 00:11:06,510 --> 00:11:10,060 Dette bildet, men er i en fil format kalt bitmap, b-m-p. 259 00:11:10,060 --> 00:11:12,910 Og vi kommer til å ta en super raskt blikk på hva det betyr. 260 00:11:12,910 --> 00:11:17,770 >> Men bitmap er bare en annen måte å representerer bildene fortsatt bruker piksler 261 00:11:17,770 --> 00:11:19,580 i 0'er og 1'ere, til slutt. 262 00:11:19,580 --> 00:11:23,282 Men på raskt blikk, har det en mer interessant signatur 263 00:11:23,282 --> 00:11:24,490 ved begynnelsen av filen. 264 00:11:24,490 --> 00:11:26,670 Det er ikke bare tre bytes, snarere er det 265 00:11:26,670 --> 00:11:30,770 en hel haug med mønstre av bytes som har bestemt mening. 266 00:11:30,770 --> 00:11:34,490 For eksempel, et sted i første byte med et bitmap bilde 267 00:11:34,490 --> 00:11:37,440 kommer til å være på størrelse med den bilde, bredden av bildet, 268 00:11:37,440 --> 00:11:40,390 høyden av bildet, så nyttige metadata, hvis du vil. 269 00:11:40,390 --> 00:11:43,940 Nyttig informasjon som Photoshop eller grafikk program du bruker 270 00:11:43,940 --> 00:11:45,180 kan faktisk bryr seg om. 271 00:11:45,180 --> 00:11:47,170 >> Så mer om dette i Problem Set fire, men dette 272 00:11:47,170 --> 00:11:49,220 er bare å si at på slutten av dagen 273 00:11:49,220 --> 00:11:52,390 alle filformatene du har brukt for years-- Microsoft Word-filer, 274 00:11:52,390 --> 00:11:55,820 Tall filer, Excel-filer, en rekke filformater 275 00:11:55,820 --> 00:11:57,770 som kanskje har noen kjent filtype 276 00:11:57,770 --> 00:12:00,130 er bare 0'er og 1'ere under panseret. 277 00:12:00,130 --> 00:12:02,970 Og mennesker har bestemt seg hva konvensjonene er, 278 00:12:02,970 --> 00:12:08,340 hva mønstre av 0'er og 1'ere representerer en Word-fil kontra en Excel-fil, 279 00:12:08,340 --> 00:12:10,322 versus en rekke andre filformater. 280 00:12:10,322 --> 00:12:12,780 Så i PSet 4, vil du ha en muligheten til å spille med det. 281 00:12:12,780 --> 00:12:14,405 >> Men hva betyr det å ha en struct. 282 00:12:14,405 --> 00:12:18,012 Dette er faktisk en fin naturlig overgang nå til C, som bare har et par 283 00:12:18,012 --> 00:12:20,220 ekstra funksjoner som vi har ikke sett på ennå. 284 00:12:20,220 --> 00:12:24,230 Det er en ganske lite språk, og en av de fine funksjoner om C er en struct. 285 00:12:24,230 --> 00:12:27,300 For eksempel, hvis du ønsket å represent-- la oss 286 00:12:27,300 --> 00:12:33,690 si at du ønsket å ha en variabel som representerer en student i noen program. 287 00:12:33,690 --> 00:12:37,330 Kanskje du skulle skrive et kurs registrering program, eller kjernehandle 288 00:12:37,330 --> 00:12:38,870 verktøyet, eller noe sånt. 289 00:12:38,870 --> 00:12:42,922 Hva er biter av data relatert til en student som kommer til tankene? 290 00:12:42,922 --> 00:12:44,880 Som en student er representert med hvilke verdier? 291 00:12:44,880 --> 00:12:45,732 Yeah? 292 00:12:45,732 --> 00:12:46,940 Du har et navn som en student. 293 00:12:46,940 --> 00:12:48,900 Hva andre gjør en typisk student ha? 294 00:12:48,900 --> 00:12:49,320 >> PUBLIKUM: [uhørbart] 295 00:12:49,320 --> 00:12:50,200 >> DAVID J. MALAN: Så, beklager. 296 00:12:50,200 --> 00:12:50,660 >> PUBLIKUM: Age. 297 00:12:50,660 --> 00:12:52,980 >> DAVID J. MALAN: En alder eller bursdag equivalently, Jepp. 298 00:12:52,980 --> 00:12:53,557 Hva annet? 299 00:12:53,557 --> 00:12:54,390 PUBLIKUM: ID-nummer? 300 00:12:54,390 --> 00:12:57,460 DAVID J. MALAN: Så et ID-nummer, kanskje et telefonnummer, kanskje en sovesal, eller hus, 301 00:12:57,460 --> 00:12:58,670 eller høyskole, eller noe sånt. 302 00:12:58,670 --> 00:13:01,820 Ethvert antall biter av data som du kan ha i kontaktlisten 303 00:13:01,820 --> 00:13:03,890 er hva som kan definere en student. 304 00:13:03,890 --> 00:13:08,490 Så hvis vi ønsket å gjøre dette, i kode, vi kan gjøre noe enkelt som dette. 305 00:13:08,490 --> 00:13:15,670 Vi kan ha et program slik at har la oss si, int main (void). 306 00:13:15,670 --> 00:13:18,920 Og hvis jeg ønsker å representere en student jeg kanskje har, for eksempel, 307 00:13:18,920 --> 00:13:24,330 en streng som heter navn som student, en streng kalt dorm for at student, 308 00:13:24,330 --> 00:13:26,900 kanskje en int kalt ID for at studenten. 309 00:13:26,900 --> 00:13:30,840 Og fordi jeg bruker string, jeg trenger å gå tilbake og sette opp CS50.h. 310 00:13:30,840 --> 00:13:33,300 Kanskje jeg kommer til å trenge stdio.h. 311 00:13:33,300 --> 00:13:38,190 Så la meg preemptively gjør de, og jeg er kommer til å kalle dette student.c for nå 312 00:13:38,190 --> 00:13:40,080 og lagre dette. 313 00:13:40,080 --> 00:13:44,206 >> Og nå kan jeg gjøre noe med disse variablene. 314 00:13:44,206 --> 00:13:46,830 Og vi skal bare skrive det som en kommentar i pseudo-kode, 315 00:13:46,830 --> 00:13:48,829 fordi det ikke er interessant hva vi gjør for nå. 316 00:13:48,829 --> 00:13:51,242 OK, slik at dette er et program som liksom lagrer en student. 317 00:13:51,242 --> 00:13:53,450 Hva ønsker jeg å gjøre hvis jeg ønsker å lagre to studenter? 318 00:13:53,450 --> 00:13:55,991 Så mitt første instinkt kommer å være all right, vent litt, 319 00:13:55,991 --> 00:14:01,920 hvis jeg har en annen student hvorfor ikke jeg bare gjøre string navn 2, string dorm 2, 320 00:14:01,920 --> 00:14:04,190 int ID2. 321 00:14:04,190 --> 00:14:06,540 Og vi har gjort borte ned denne veien før 322 00:14:06,540 --> 00:14:10,890 og hva som var vår løsning på hva som virker å være en slags hackish kopiere lime 323 00:14:10,890 --> 00:14:11,555 jobb her? 324 00:14:11,555 --> 00:14:12,346 PUBLIKUM: En rekke. 325 00:14:12,346 --> 00:14:13,830 DAVID J. MALAN: Ja, vi kunne bruke en matrise. 326 00:14:13,830 --> 00:14:15,620 Høyre dette svært raskt blir uhåndterlig. 327 00:14:15,620 --> 00:14:18,453 Du må sortere av vilkårlig begynne å navngi alle disse variablene. 328 00:14:18,453 --> 00:14:22,190 Og du som menneske, må holde spor som OK NAME2 tilsvarer 329 00:14:22,190 --> 00:14:25,060 med Dorm2 korresponderer med ID2. 330 00:14:25,060 --> 00:14:26,200 Det blir bare et rot. 331 00:14:26,200 --> 00:14:29,350 Så det er mye enklere, husker fra et par uker siden, 332 00:14:29,350 --> 00:14:34,300 å bare måtte kalles strengnavn og kanskje gi oss tre av disse. 333 00:14:34,300 --> 00:14:36,940 Og så kanskje vi har string sovesaler og har 334 00:14:36,940 --> 00:14:41,900 tre av disse, eller med en konstant, int IDer og har tre av dem. 335 00:14:41,900 --> 00:14:45,250 Men selv nå dette føles litt slurvete, ikke sant. 336 00:14:45,250 --> 00:14:49,440 Vi snakker om studenter og ennå Jeg er virkelig bolig på lavt nivå 337 00:14:49,440 --> 00:14:50,470 gjennomføring detaljer. 338 00:14:50,470 --> 00:14:52,790 Studenten er et navn og en sovesal og ID. 339 00:14:52,790 --> 00:14:59,814 >> Hvorfor kan jeg ikke bare erklære en variabel kalt student og kalle det s. 340 00:14:59,814 --> 00:15:02,230 Og hvis jeg vil ha en annen student, hvorfor ikke jeg bare kalle det t. 341 00:15:02,230 --> 00:15:05,260 Eller hvis jeg vil ha en hel haug av studenter, hvorfor gjør jeg ikke bare 342 00:15:05,260 --> 00:15:09,740 si at jeg har en hel klasse av studenter, og det er tre av dem. 343 00:15:09,740 --> 00:15:12,470 Med andre ord, hvorfor kan ikke jeg komme opp med min egen datatype, kalt 344 00:15:12,470 --> 00:15:15,641 Studenter, innsiden av noe som er et navn, er en ID, er en dorm, 345 00:15:15,641 --> 00:15:16,890 er en rekke andre felter. 346 00:15:16,890 --> 00:15:19,030 Og det viser seg at du kan gjøre akkurat det. 347 00:15:19,030 --> 00:15:21,850 >> Så C har denne funksjonen kalles struct. 348 00:15:21,850 --> 00:15:24,700 Det er et språk funksjon som tillater oss å gjøre akkurat dette. 349 00:15:24,700 --> 00:15:28,370 Jeg kommer til å gå videre og åpne opp structs.h 350 00:15:28,370 --> 00:15:32,299 hvor vi kommer til å se følgende definisjon av en student. 351 00:15:32,299 --> 00:15:35,215 Det viser seg - og dette er enda enklere enn den som involverer en ID 352 00:15:35,215 --> 00:15:36,080 et øyeblikk siden. 353 00:15:36,080 --> 00:15:39,120 Hvis du ønsker å komme opp med din hjemmelagde datatype, 354 00:15:39,120 --> 00:15:42,750 og i tillegg til int og røye og flyte og alle disse andre som eksisterer, 355 00:15:42,750 --> 00:15:45,810 du kan gjøre det ved å bokstavelig talt skriver typedef struct, 356 00:15:45,810 --> 00:15:47,880 deretter noen klammeparentes, innsiden av som du 357 00:15:47,880 --> 00:15:51,460 liste de variablene du vil forbinder med denne nye skikken data 358 00:15:51,460 --> 00:15:55,670 skriver ut et navn og en sovesal, og deretter etter klammeparentes 359 00:15:55,670 --> 00:15:57,860 du gi et navn til den nye datatype. 360 00:15:57,860 --> 00:15:59,220 Så, for eksempel, student. 361 00:15:59,220 --> 00:16:03,247 >> Og hva er fint om dette nå er at hvis vi ser på den tilsvarende koden, 362 00:16:03,247 --> 00:16:05,080 konvensjonen, første av alt, er å sette dette 363 00:16:05,080 --> 00:16:08,230 i en fil som heter noe dot h, en header fil, som vi ikke har 364 00:16:08,230 --> 00:16:09,780 begynte å bruke oss selv for mye. 365 00:16:09,780 --> 00:16:12,120 Men vi kommer til å starte bruker ganske mye nå. 366 00:16:12,120 --> 00:16:18,650 Og hva vi kan gjøre med dette, til slutt, i disse få linjer med kode 367 00:16:18,650 --> 00:16:22,130 er erklære akkurat det datatype, en student. 368 00:16:22,130 --> 00:16:23,230 Og nå kan vi bruke den. 369 00:16:23,230 --> 00:16:27,274 >> Jeg skal nå gå inn en fil som heter structs1.c. 370 00:16:27,274 --> 00:16:29,440 Og la oss ta en titt på en noen kjennetegn her. 371 00:16:29,440 --> 00:16:32,250 Så ting her oppe er stort sett kjent, og vi vil 372 00:16:32,250 --> 00:16:35,040 komme tilbake til hva som ikke er kjent i bare et øyeblikk. 373 00:16:35,040 --> 00:16:39,880 Dette er selvfølgelig inkludert min egen header fil, som er ny i tillegg, 374 00:16:39,880 --> 00:16:42,580 bortsett PSet tre der, husker, har vi helpers.h. 375 00:16:42,580 --> 00:16:45,150 Så du kanskje husker # include helpers.h. 376 00:16:45,150 --> 00:16:49,381 >> Hvorfor selv bruker jeg sitater i stedet for vinklede brak? 377 00:16:49,381 --> 00:16:50,630 Da velger jeg mellom dem? 378 00:16:50,630 --> 00:16:52,310 Nesten alltid synes jeg å bruke vinklede parentes. 379 00:16:52,310 --> 00:16:55,040 Og så, plutselig på seks Jeg bruker anførselstegn. 380 00:16:55,040 --> 00:16:55,860 Hvorfor kan det være? 381 00:16:55,860 --> 00:16:56,700 Yeah? 382 00:16:56,700 --> 00:16:57,725 >> PUBLIKUM: [uhørbart] 383 00:16:57,725 --> 00:16:59,350 DAVID J. MALAN: Det er en faktisk, hva? 384 00:16:59,350 --> 00:17:00,559 PUBLIKUM: Det er i IDE. 385 00:17:00,559 --> 00:17:02,475 DAVID J. MALAN: Ja, det er i min faktiske IDE. 386 00:17:02,475 --> 00:17:05,690 Og la oss ikke dvele ved IDE, fordi det er bare et verktøy som jeg bruker. 387 00:17:05,690 --> 00:17:08,119 Det er i min nåværende katalog, spesielt. 388 00:17:08,119 --> 00:17:11,647 Så structs.h er min egen fil ikke installert i IDE, 389 00:17:11,647 --> 00:17:14,480 i selve operativsystemet, snarere er det i min nåværende katalog. 390 00:17:14,480 --> 00:17:16,910 Så konvensjonen er hvis du vil å inkludere din egen header fil, 391 00:17:16,910 --> 00:17:18,200 du bare bruke anførselstegn. 392 00:17:18,200 --> 00:17:23,290 >> Hva kaller vi denne tingen i linje 8, generelt sett? 393 00:17:23,290 --> 00:17:25,200 Dette er hva? 394 00:17:25,200 --> 00:17:28,220 #define noe. 395 00:17:28,220 --> 00:17:31,040 Dette representerer konstanter, ikke sant? 396 00:17:31,040 --> 00:17:33,140 Hvis du ønsker å ha en verdi i programmet 397 00:17:33,140 --> 00:17:35,110 at du bruker en hel haug med ganger, er det 398 00:17:35,110 --> 00:17:39,330 god konvensjon å faktor det ut, erklære den, med hash symbol 399 00:17:39,330 --> 00:17:43,340 definere, da, etter konvensjonen, i alt store bokstaver word-- om det ikke 400 00:17:43,340 --> 00:17:45,320 strengt nødvendig, men det er menneskelig konvensjonen 401 00:17:45,320 --> 00:17:47,210 å kapital konstanter slik at de hopper ut 402 00:17:47,210 --> 00:17:50,380 på deg visually-- plass og da verdien du ønsker å være 403 00:17:50,380 --> 00:17:52,250 tilsvarende som konstant navn. 404 00:17:52,250 --> 00:17:56,110 Ingen semikolon, men du bare følger det mønsteret der. 405 00:17:56,110 --> 00:17:57,770 >> Så hva skal jeg gjøre i dette selve koden. 406 00:17:57,770 --> 00:18:00,660 Så la oss ta en titt på hovedprogrammet her. 407 00:18:00,660 --> 00:18:04,080 I linje 12 fordi jeg har tatt structs.h, 408 00:18:04,080 --> 00:18:06,492 Jeg har nå magisk på min disposisjon en ny datatype. 409 00:18:06,492 --> 00:18:09,200 Jeg har ikke bare har tilgang til int, og røye, og dupp, og streng, 410 00:18:09,200 --> 00:18:10,060 og blått og andre. 411 00:18:10,060 --> 00:18:12,470 Jeg har nå tilgang til en student datatype. 412 00:18:12,470 --> 00:18:17,740 Så i linje 12, jeg kombinere to ideas-- man en tilpasset datatype og to, 413 00:18:17,740 --> 00:18:18,940 ved hjelp av en matrise. 414 00:18:18,940 --> 00:18:21,700 Og så i dette programmet hvis Jeg vil faktisk støtte 415 00:18:21,700 --> 00:18:24,320 tre forskjellige studenter i mitt program, jeg 416 00:18:24,320 --> 00:18:30,480 kan bare si gi meg en variabel kalt studenter, som hver 417 00:18:30,480 --> 00:18:32,970 er av typen studenter, som er min egendefinert datatype. 418 00:18:32,970 --> 00:18:35,890 Og spesielt gi meg tre av dem i min array. 419 00:18:35,890 --> 00:18:37,750 >> Så nå hva skal vi gjøre i dette programmet? 420 00:18:37,750 --> 00:18:40,670 Her er bare en for loop itera fra 0 til 3, fordi det er 421 00:18:40,670 --> 00:18:42,110 hva verdien av studentene er. 422 00:18:42,110 --> 00:18:44,420 Jeg er bare å spørre brukeren gi meg studentens navn. 423 00:18:44,420 --> 00:18:48,090 Og så i linje 17, vi har en stort sett kjent linje. 424 00:18:48,090 --> 00:18:50,370 Vi har vår gamle venn GetString til høyre. 425 00:18:50,370 --> 00:18:52,345 Og hva stykke syntaks er tydeligvis ny, 426 00:18:52,345 --> 00:18:55,130 Hvis du aldri har programmert i C før, og har aldri brukt structs? 427 00:18:55,130 --> 00:18:55,510 Yeah? 428 00:18:55,510 --> 00:18:56,417 >> PUBLIKUM: The .name. 429 00:18:56,417 --> 00:18:57,500 DAVID J. MALAN: The .name. 430 00:18:57,500 --> 00:19:01,220 Men dette er ikke for mye av et sprang, fordi nå studentene brakett jeg 431 00:19:01,220 --> 00:19:02,590 gir deg den i-te student. 432 00:19:02,590 --> 00:19:04,730 Og hvis du ønsker å dykke innsiden av denne strukturen, 433 00:19:04,730 --> 00:19:09,490 du bare bruke en enkelt periode og så navnet på den variable innsiden, 434 00:19:09,490 --> 00:19:11,900 eller eiendommen innsiden som du ønsker å få tilgang til. 435 00:19:11,900 --> 00:19:14,816 Tilsvar da, hvis jeg da be den bruker, gi meg studentens dorm, 436 00:19:14,816 --> 00:19:18,390 du kan tilsvarende lagre som strengen i dorm variable inne 437 00:19:18,390 --> 00:19:19,940 av at studenten struktur. 438 00:19:19,940 --> 00:19:21,410 >> Og nå ting blir litt fancy. 439 00:19:21,410 --> 00:19:24,420 Og dette kommer til å se på kanskje mye ganske snart. 440 00:19:24,420 --> 00:19:27,970 Men du vil se dette langt mer i PSet 4, så la oss bare blikk på det nå. 441 00:19:27,970 --> 00:19:33,364 Det viser seg at i linje 23 gjennom 38, hva tror du jeg kanskje gjør? 442 00:19:33,364 --> 00:19:35,530 Jeg har fjernet kommentarene for i dag, men den versjonen 443 00:19:35,530 --> 00:19:38,660 av koden online for referanse har alle kommentarer. 444 00:19:38,660 --> 00:19:40,171 Hva gjør jeg synes å være å gjøre? 445 00:19:40,171 --> 00:19:42,530 >> PUBLIKUM: Lagre filen med alle den informasjon som brukeren har angitt. 446 00:19:42,530 --> 00:19:44,530 >> DAVID J. MALAN: Ja, nøyaktig, er det en ny vei 447 00:19:44,530 --> 00:19:46,370 at vi ser to, en annen funksjon i C, 448 00:19:46,370 --> 00:19:48,700 der jeg kan lage mine egne filer. 449 00:19:48,700 --> 00:19:51,580 Så langt, nesten hvert program du har skrevet er statsløs. 450 00:19:51,580 --> 00:19:53,334 Så snart den er ferdig å kjøre, det er det. 451 00:19:53,334 --> 00:19:55,000 Det er ingen hukommelse eller erindring om det. 452 00:19:55,000 --> 00:19:56,110 Det finnes ingen fil lagres. 453 00:19:56,110 --> 00:19:58,120 Men hvis du ønsker å lagre innspill som har 454 00:19:58,120 --> 00:20:02,100 skjedde, som i et spill eller et program som dette, viser det seg at vi kan gjøre det. 455 00:20:02,100 --> 00:20:04,360 Og du vil se dette mer i PSet 4 og i kapittel. 456 00:20:04,360 --> 00:20:08,661 Men denne linjen 23 essensielt oppretter en fil som heter students.csv. 457 00:20:08,661 --> 00:20:10,160 Og du kanskje har sett dette før. 458 00:20:10,160 --> 00:20:14,250 Selv om du aldri har studert CS før, CSV er kommaseparert variabler. 459 00:20:14,250 --> 00:20:19,000 Det er som en svært fattig mann versjon av en Excel-fil, 460 00:20:19,000 --> 00:20:22,270 noe som betyr at det kan åpnes i Excel og Apple Numbers, 461 00:20:22,270 --> 00:20:23,830 og det har rader og kolonner. 462 00:20:23,830 --> 00:20:26,485 Men det er ikke en proprietær format som Microsoft eller Apple. 463 00:20:26,485 --> 00:20:29,840 Det er bare komma skille verdier som vi vil se i et øyeblikk. 464 00:20:29,840 --> 00:20:31,010 >> Og bare ta en gjetning. 465 00:20:31,010 --> 00:20:33,480 I tråd 23, i det slutt, mitt andre argument 466 00:20:33,480 --> 00:20:37,700 til den nye funksjonen kalles f åpen for fil åpen er w. 467 00:20:37,700 --> 00:20:39,430 Hva kan w betegne? 468 00:20:39,430 --> 00:20:40,022 Yeah? 469 00:20:40,022 --> 00:20:41,260 >> PUBLIKUM: Det lar deg skrive til filen? 470 00:20:41,260 --> 00:20:42,630 >> DAVID J. MALAN: Det lar du skrive til filen. 471 00:20:42,630 --> 00:20:44,810 Så det er et par varianter at vi kan plugge inn her. 472 00:20:44,810 --> 00:20:47,184 Men hvis du bare vil lese filen, er at ser på det 473 00:20:47,184 --> 00:20:50,010 og lese den inn i minnet, du bare bruke quote unquote "r". 474 00:20:50,010 --> 00:20:53,110 Hvis du ønsker å skrive til fil, bruker du quote unquote "w". 475 00:20:53,110 --> 00:20:55,190 Det er også føye og et par andre ting 476 00:20:55,190 --> 00:20:57,356 Hvis du ønsker å endre eksisterende filer. 477 00:20:57,356 --> 00:21:00,480 Nå kommer vi til å fortsette å se dette ting, så får vi komme tilbake til linje 24. 478 00:21:00,480 --> 00:21:02,640 NULL, det viser seg, er en spesiell verdi som 479 00:21:02,640 --> 00:21:06,070 kan returneres ved visse funksjoner hvis noe har gått wrong-- 480 00:21:06,070 --> 00:21:08,490 hvis filen ikke eksisterer, hvis du har kjørt ut av minnet, 481 00:21:08,490 --> 00:21:09,620 eller en haug med andre feil. 482 00:21:09,620 --> 00:21:13,470 Men for nå, la oss bare anta at dette er bare vanlig feilsjekking. 483 00:21:13,470 --> 00:21:17,090 Her i linje 26, jeg gjentar fra 0 til 3 i løpet av alle mine studenter. 484 00:21:17,090 --> 00:21:20,470 Og dette er slags sort av en ny funksjon, fprintf, 485 00:21:20,470 --> 00:21:21,460 men bare ta en gjetning. 486 00:21:21,460 --> 00:21:24,370 Hvis printf er bare print en formatert streng, 487 00:21:24,370 --> 00:21:26,507 hva betyr fprintf trolig bety? 488 00:21:26,507 --> 00:21:27,590 PUBLIKUM: Skriv ut til en fil. 489 00:21:27,590 --> 00:21:29,290 DAVID J. MALAN: Print et formatert streng til en fil. 490 00:21:29,290 --> 00:21:31,180 Det er det ekstra f midler er fil. 491 00:21:31,180 --> 00:21:36,420 Og den nye første argumentet må være variabelen som representerer filen. 492 00:21:36,420 --> 00:21:38,866 Så vi må bare et format strengen akkurat som printf. 493 00:21:38,866 --> 00:21:40,740 Og selv om denne syntaks er ny, dette er bare 494 00:21:40,740 --> 00:21:44,610 betyr plugge i studentens navn, plug-in student dorm, og deretter 495 00:21:44,610 --> 00:21:47,160 med fclose, lukke filen. 496 00:21:47,160 --> 00:21:49,730 Og så lastly-- dette er nytt og vi vil komme tilbake til dette 497 00:21:49,730 --> 00:21:53,240 før long-- Jeg frigjør studenten grunner 498 00:21:53,240 --> 00:21:54,860 som skjedde opp over det. 499 00:21:54,860 --> 00:21:56,820 Men vi vil komme tilbake til at før long-- 500 00:21:56,820 --> 00:21:59,820 det er på grunn av hvordan GetString er faktisk jobber under panseret. 501 00:21:59,820 --> 00:22:01,280 >> Så la oss ta en rask titt her. 502 00:22:01,280 --> 00:22:04,380 Hvis jeg skriver ls i katalogen min, Legg merke til at jeg ikke 503 00:22:04,380 --> 00:22:09,360 har en fil som heter students.csv, bare ikke der, ikke eksisterer. 504 00:22:09,360 --> 00:22:14,965 Så hvis jeg nå kompilere dette programmet, gjøre structs-1,. / structs-1, 505 00:22:14,965 --> 00:22:20,570 og jeg kommer til å gå videre og skriv inn Andi, som bor i Berkeley ved Yale. 506 00:22:20,570 --> 00:22:26,350 Vi kommer til å ha Rob som bor i Thayer i disse dager. 507 00:22:26,350 --> 00:22:33,760 Og la oss komme opp med hvor er, tror jeg, er Maria i Mather, 508 00:22:33,760 --> 00:22:35,100 hvis jeg har husket riktig. 509 00:22:35,100 --> 00:22:36,460 >> Så ingenting ser ut til å skje. 510 00:22:36,460 --> 00:22:40,680 Men hvis jeg skriver ls nå, det er students.csv. 511 00:22:40,680 --> 00:22:43,080 La oss gå videre og åpne students.csv. 512 00:22:43,080 --> 00:22:46,050 Dette er igjen en meget lett filformat. 513 00:22:46,050 --> 00:22:49,570 Men jeg har bare vedtatt en konvensjon at jeg har to rader og kolonner her. 514 00:22:49,570 --> 00:22:52,020 Den første kolonnen er folks fornavn. 515 00:22:52,020 --> 00:22:55,740 Den andre kolonnen er studentens dorm, eller høyskole, eller hus, eller whatnot. 516 00:22:55,740 --> 00:22:57,900 Og nå har jeg lagret denne permanent i en fil. 517 00:22:57,900 --> 00:22:59,280 >> Så det er ikke alle som interessant. 518 00:22:59,280 --> 00:23:02,980 Men dette er bare et springbrett nå å være i stand til å vedvare informasjon 519 00:23:02,980 --> 00:23:04,040 permanent. 520 00:23:04,040 --> 00:23:08,340 Så la oss se nå hva mer vi kan gjøre med disse og andre funksjoner. 521 00:23:08,340 --> 00:23:10,729 Men først noen spørsmål? 522 00:23:10,729 --> 00:23:12,145 Det var mye, og det ble raskt. 523 00:23:12,145 --> 00:23:16,131 Men du vil se mye mer i PSet 4, så vel. 524 00:23:16,131 --> 00:23:16,630 Yeah? 525 00:23:16,630 --> 00:23:19,360 >> PUBLIKUM: Er det en måte å fortsette å legge til navn til denne filen? 526 00:23:19,360 --> 00:23:19,880 >> DAVID J. MALAN: Godt spørsmål. 527 00:23:19,880 --> 00:23:21,800 Er det en måte å fortsette legge navn til denne filen? 528 00:23:21,800 --> 00:23:22,340 Ja. 529 00:23:22,340 --> 00:23:24,630 Og, faktisk, hvis du ender opp re-åpne filen, 530 00:23:24,630 --> 00:23:26,780 du ville bruke quote unquote "a" for append, 531 00:23:26,780 --> 00:23:31,090 som ville bare legge til en ny linje, en ny linje igjen og igjen, akkurat. 532 00:23:31,090 --> 00:23:32,010 Godt spørsmål. 533 00:23:32,010 --> 00:23:32,950 Andre spørsmål? 534 00:23:32,950 --> 00:23:33,450 Yeah? 535 00:23:33,450 --> 00:23:35,580 PUBLIKUM: Hvis du kjørte programmet på nytt akkurat nå, 536 00:23:35,580 --> 00:23:38,000 ville det holde å legge navn til fil eller ville det åpne opp en ny fil? 537 00:23:38,000 --> 00:23:38,740 >> DAVID J. MALAN: Ah, godt spørsmål. 538 00:23:38,740 --> 00:23:41,448 Hvis du kjørte programmet igjen rett nå, kanskje skrevet i nye navn, 539 00:23:41,448 --> 00:23:44,820 vil det legge til filen eller overskrive filen? 540 00:23:44,820 --> 00:23:47,420 Sistnevnte, fordi jeg er ikke bruker tilføyningsmodus. 541 00:23:47,420 --> 00:23:49,930 Og fordi jeg er bare blindt åpne filen for skriving, 542 00:23:49,930 --> 00:23:51,310 det bare kommer til å overskrive filen. 543 00:23:51,310 --> 00:23:54,570 Så jeg ville faktisk trenger å gjøre er å legge til, hvis jeg vil faktisk ha en langsiktig 544 00:23:54,570 --> 00:23:55,350 database. 545 00:23:55,350 --> 00:23:58,220 >> Nå CSV er nyttig, ærlig, selv for som om du er writing-- 546 00:23:58,220 --> 00:24:00,100 og vi vil etter hvert se dette senere i semesteret når 547 00:24:00,100 --> 00:24:01,455 vi bruker CSVs til andre formål. 548 00:24:01,455 --> 00:24:04,920 Hvis du vil lagre alle mennesker som har registrert seg for noen hendelse, 549 00:24:04,920 --> 00:24:07,420 eller registrerte deg for student gruppe, eller noe sånt, 550 00:24:07,420 --> 00:24:10,330 lagring av data i et slikt av formatet er super praktisk. 551 00:24:10,330 --> 00:24:12,580 Fordi bokstavelig talt, hvis jeg var å laste ned denne filen. 552 00:24:12,580 --> 00:24:14,540 Jeg kunne double-- og la oss faktisk prøve dette 553 00:24:14,540 --> 00:24:16,720 hvis jeg har Excel eller Numbers på her. 554 00:24:16,720 --> 00:24:19,130 >> Jeg kommer til å høyreklikke eller kontroll-klikk filen min. 555 00:24:19,130 --> 00:24:20,020 Uff da. 556 00:24:20,020 --> 00:24:21,830 Høyreklikk eller Kontroll-klikk filen min. 557 00:24:21,830 --> 00:24:24,960 Kom igjen, er min mus ikke samarbeider. 558 00:24:24,960 --> 00:24:32,694 Download-- Jeg kommer til å laste ned alle filene her så 559 00:24:32,694 --> 00:24:33,860 bare så jeg kan ta denne. 560 00:24:33,860 --> 00:24:37,850 Og la oss se om dette fungerer students.csv-- første gang 561 00:24:37,850 --> 00:24:39,310 Jeg har aktivert. 562 00:24:39,310 --> 00:24:41,360 Nå ønsker de å se mine kontakter. 563 00:24:41,360 --> 00:24:44,310 Nå trenger jeg å registrere. 564 00:24:44,310 --> 00:24:47,620 Se hvor enkelt det er å bruke CSVs? 565 00:24:47,620 --> 00:24:50,840 Ja, holde det oppdatert. 566 00:24:50,840 --> 00:24:52,375 OK, nå er vi klar for klassen. 567 00:24:52,375 --> 00:24:58,750 568 00:24:58,750 --> 00:25:00,370 OK, oh, hva er nytt? 569 00:25:00,370 --> 00:25:02,920 OK, i nærheten. 570 00:25:02,920 --> 00:25:04,750 Det var magisk. 571 00:25:04,750 --> 00:25:07,280 OK, nå må vi oppdatere. 572 00:25:07,280 --> 00:25:10,890 Og nå, det glemte hva fil jeg opprinnelig åpnet, 573 00:25:10,890 --> 00:25:13,090 men hva a-- der vi går. 574 00:25:13,090 --> 00:25:16,341 OK, så nå har vi en Excel-fil. 575 00:25:16,341 --> 00:25:18,290 Takk. 576 00:25:18,290 --> 00:25:20,764 >> OK, så det jeg gjorde var den enkle delen. 577 00:25:20,764 --> 00:25:23,930 Selvfølgelig kunne jeg ha forhåndsinstallert Excel, eller Numbers, eller hva programmet. 578 00:25:23,930 --> 00:25:25,846 Men dette er hyggelig, fordi Nå kan jeg manipulere 579 00:25:25,846 --> 00:25:28,090 dataene i et standard format. 580 00:25:28,090 --> 00:25:30,294 >> Så nå la oss kontekst bytte til der vi slapp 581 00:25:30,294 --> 00:25:32,710 forrige gang, som var å starte å ta av støttehjulene. 582 00:25:32,710 --> 00:25:34,543 Men først, det gjorde du ikke se dette tidligere lunsj 583 00:25:34,543 --> 00:25:38,150 er igjen skjer her på Brann og Is i Cambridge, Sitar i New Haven. 584 00:25:38,150 --> 00:25:43,150 Meld deg på CS50s nettstedet ASAP å bli med CS50 studenter og ansatte. 585 00:25:43,150 --> 00:25:46,090 >> Så vi tok trening hjul off på mandag som follows-- 586 00:25:46,090 --> 00:25:49,120 strengen har blitt erklært i CS50s bibliotek for en stund. 587 00:25:49,120 --> 00:25:52,650 Og det er fint, fordi det gir oss for å snakke om variabler som 588 00:25:52,650 --> 00:25:54,660 fullstendige ord og setninger og mer. 589 00:25:54,660 --> 00:25:56,710 Men det viser seg at strengen ikke eksisterer. 590 00:25:56,710 --> 00:26:00,200 Det er bare et synonym, eller et alias, at vi har skapt for noe som 591 00:26:00,200 --> 00:26:03,780 faktisk er litt mer teknisk kalles en char *. 592 00:26:03,780 --> 00:26:07,900 >> Og ja, vi så et eksempel av et program på mandag 593 00:26:07,900 --> 00:26:11,200 som ikke oppfører seg helt som vi forventet. 594 00:26:11,200 --> 00:26:13,630 Dette var den filen, sammenligne-0. 595 00:26:13,630 --> 00:26:17,910 Og minner om at sammenligne-0, hvis Jeg rekompilere mandagens program 596 00:26:17,910 --> 00:26:22,670 og kjøre sammenligne-0 og skriv inn mamma små bokstaver, og mamma med små bokstaver igjen. 597 00:26:22,670 --> 00:26:25,320 Programmet insisterte jeg skriv forskjellige ting, 598 00:26:25,320 --> 00:26:29,210 selv om mamma, alt i små bokstaver, er identisk visuelt. 599 00:26:29,210 --> 00:26:31,990 Så hva var det korte svaret for hvorfor datamaskinen mener 600 00:26:31,990 --> 00:26:34,500 disse to strenger er annerledes? 601 00:26:34,500 --> 00:26:35,250 Yeah? 602 00:26:35,250 --> 00:26:36,534 >> PUBLIKUM: [uhørbart] 603 00:26:36,534 --> 00:26:37,450 DAVID J. MALAN: Høyre. 604 00:26:37,450 --> 00:26:39,600 Så, mamma, første gang Jeg skriver det inn, blir 605 00:26:39,600 --> 00:26:42,710 lagret et sted i min datamaskin minne, men på et annet sted 606 00:26:42,710 --> 00:26:44,690 enn den andre gangen jeg skriver i mamma. 607 00:26:44,690 --> 00:26:46,580 Nå er det sikkert kunne optimaliseres. 608 00:26:46,580 --> 00:26:49,205 Datamaskinen kan være smart og realisere disse to strenger, hey, 609 00:26:49,205 --> 00:26:49,954 de er identiske. 610 00:26:49,954 --> 00:26:51,520 La meg ikke redundant lagre det. 611 00:26:51,520 --> 00:26:54,229 Men datamaskiner ikke gjør det optimalisering mindre du forteller dem til. 612 00:26:54,229 --> 00:26:56,061 Så, som standard, er de bare kommer til å ende opp 613 00:26:56,061 --> 00:26:57,670 på to forskjellige steder i minnet. 614 00:26:57,670 --> 00:27:01,570 Og så for å være mer tydelig, når vi sammenlignet de to strenger, 615 00:27:01,570 --> 00:27:03,950 Den første ble kalt s, den andre ble kalt 616 00:27:03,950 --> 00:27:08,530 t, hva som konkret var jeg sammenligne her på linje 13? 617 00:27:08,530 --> 00:27:09,494 Yeah. 618 00:27:09,494 --> 00:27:12,390 >> PUBLIKUM: Det er stedet i minnet at variabelen vil peke på. 619 00:27:12,390 --> 00:27:14,900 >> DAVID J. MALAN: Akkurat, var jeg sammenligning av plassen i minnet 620 00:27:14,900 --> 00:27:16,300 at disse variablene peker til. 621 00:27:16,300 --> 00:27:20,560 Så spesielt hvis mor var på byte nummer 1 og 2, og 3, 622 00:27:20,560 --> 00:27:24,020 og 4-- fordi huske backslash 0 må være helt på slutten. 623 00:27:24,020 --> 00:27:29,420 Og den andre forekomst av mamma, m-o-meter, var på adresse 10, 11, 12, og 13. 624 00:27:29,420 --> 00:27:33,100 Jeg var sammenligne en, som adresse, det sted i minnet, 625 00:27:33,100 --> 00:27:35,160 mot 10, som er åpenbart ikke den samme. 626 00:27:35,160 --> 00:27:36,260 1 er ikke 10. 627 00:27:36,260 --> 00:27:39,620 >> Så dette er fint i at det er ganske grei. 628 00:27:39,620 --> 00:27:42,870 Men det er problematisk i den utstrekning vi kan ikke synes å sammenligne strenger. 629 00:27:42,870 --> 00:27:44,930 Så fundamentally-- og på dette lave nivå, 630 00:27:44,930 --> 00:27:47,300 hvis du ønsket å implementere et program for å sammenligne 631 00:27:47,300 --> 00:27:50,270 to separate ord at brukeren har tastet inn for kvalitet, 632 00:27:50,270 --> 00:27:53,944 gjøre de stiller seg opp char for røye, bare i generelle vendinger, 633 00:27:53,944 --> 00:27:55,360 Hva trenger vi å gjøre, tydeligvis? 634 00:27:55,360 --> 00:27:57,940 Det er ikke tilstrekkelig bare å se på disse to adressene. 635 00:27:57,940 --> 00:27:58,860 Hva trenger vi å gjøre? 636 00:27:58,860 --> 00:27:59,360 Yeah? 637 00:27:59,360 --> 00:28:01,120 >> PUBLIKUM: Reagere gjennom strengen [uhørbart]. 638 00:28:01,120 --> 00:28:02,600 >> DAVID J. MALAN: Ja, la oss iterere gjennom strengen. 639 00:28:02,600 --> 00:28:05,808 La oss bruke en for loop, en stund loop, eller uansett hva du er mest komfortabel med. 640 00:28:05,808 --> 00:28:08,840 Og hvis vi har to strenger sted i minnet, la oss se på hver sin 641 00:28:08,840 --> 00:28:11,770 første tegnet, så hver er andre karakter, deretter tredje og fjerde, 642 00:28:11,770 --> 00:28:15,206 og femte, før vi treffer hvilke spesielle sentinel verdi? 643 00:28:15,206 --> 00:28:16,080 PUBLIKUM: [uhørbart] 644 00:28:16,080 --> 00:28:18,800 DAVID J. MALAN: Ja, backslash null, ved hvilket punkt i hver streng 645 00:28:18,800 --> 00:28:20,100 vi kan avgjøre det er det. 646 00:28:20,100 --> 00:28:21,970 Har vi matchet hver eneste karakter? 647 00:28:21,970 --> 00:28:22,990 Hvis ikke, returnerer false. 648 00:28:22,990 --> 00:28:24,770 I så fall returnere true. 649 00:28:24,770 --> 00:28:28,800 Og så det er akkurat hva denne versjonen av programmet sammenligne-1.c gjør. 650 00:28:28,800 --> 00:28:31,677 Det er identisk med det vi så på mandag, bortsett fra at jeg har 651 00:28:31,677 --> 00:28:34,760 blitt kvitt ordet string-- skjønt som ikke har noen funksjonell impact-- alle 652 00:28:34,760 --> 00:28:37,450 Jeg gjør nå er å fjerne noen visuelle trening hjul, 653 00:28:37,450 --> 00:28:40,880 men for å se klart at s og t er adresser. 654 00:28:40,880 --> 00:28:43,020 Og det er det stjernen, stjernen, representerer 655 00:28:43,020 --> 00:28:46,690 er en adresse, ellers kjent mer teknisk som en peker. 656 00:28:46,690 --> 00:28:49,880 >> Så når jeg erklærer s på linje 9 og si char * s, 657 00:28:49,880 --> 00:28:52,160 det betyr ikke gi meg en streng. 658 00:28:52,160 --> 00:28:56,360 Det betyr gi meg en variabel med hensikt i livet er å lagre en adresse. 659 00:28:56,360 --> 00:29:00,400 Fordi jeg er i ferd med å sette adressen til en streng inn i den. 660 00:29:00,400 --> 00:29:03,500 Og ja, GetString, for å være klart, ikke returnerer en streng. 661 00:29:03,500 --> 00:29:06,110 Det går ikke tilbake mamma backslash null, per se. 662 00:29:06,110 --> 00:29:10,005 Hva gjør GetString spesifikt og presist tilbake? 663 00:29:10,005 --> 00:29:10,880 PUBLIKUM: [uhørbart] 664 00:29:10,880 --> 00:29:14,080 DAVID J. MALAN: En adresse, Adressen til det første tegnet 665 00:29:14,080 --> 00:29:16,070 i noen streng det har fått. 666 00:29:16,070 --> 00:29:19,250 Og så nå ser vi en spesiell søkeord igjen. 667 00:29:19,250 --> 00:29:20,640 Og, antydet jeg til dette tidligere. 668 00:29:20,640 --> 00:29:23,620 Dette kommer til å bli bra konvensjonen at vi vil se igjen og igjen nå. 669 00:29:23,620 --> 00:29:27,540 Jeg sjekker for å sørge for at s er ikke null, og t er ikke null. 670 00:29:27,540 --> 00:29:30,100 Fordi basert på min virkelig rask omtale tidligere, 671 00:29:30,100 --> 00:29:35,510 hva kan bety hvis GetString returnerer ikke en adresse, men N-U-L-L, som er igjen, 672 00:29:35,510 --> 00:29:36,990 noen spesiell verdi? 673 00:29:36,990 --> 00:29:37,890 >> PUBLIKUM: Feil. 674 00:29:37,890 --> 00:29:38,600 >> DAVID J. MALAN: Det er en feil. 675 00:29:38,600 --> 00:29:39,550 Noe gikk galt. 676 00:29:39,550 --> 00:29:41,341 Og hva typisk kan skje, spesielt 677 00:29:41,341 --> 00:29:45,162 med strings-- som kan være av ukjent lengde i advance-- 678 00:29:45,162 --> 00:29:46,870 kanskje datamaskinene ' ut av minnet, kanskje 679 00:29:46,870 --> 00:29:49,280 du skrev på en slik lange ord eller en setning 680 00:29:49,280 --> 00:29:51,880 eller limt inn et så stort essay det er bare ikke nok minne. 681 00:29:51,880 --> 00:29:55,340 Og så GetString ikke kan gå tilbake adressen til hele greia, 682 00:29:55,340 --> 00:29:56,620 så det bare returnerer ingenting. 683 00:29:56,620 --> 00:30:00,580 Og det sier en feil som har skjedd ved å returnere den spesielle NULL verdi. 684 00:30:00,580 --> 00:30:02,890 Det er null adresse, så å si. 685 00:30:02,890 --> 00:30:06,157 >> Nå viser det seg C kommer med en funksjon som gjør at iterasjon. 686 00:30:06,157 --> 00:30:09,240 Vi trenger ikke å gjennomføre dette med en for løkke eller en stund loop oss selv. 687 00:30:09,240 --> 00:30:11,150 Vi kan bruke en funksjon, kalt konsist, 688 00:30:11,150 --> 00:30:15,400 røre comp, eller streng sammenligne, hvis hensikt i livet er å gjøre akkurat det. 689 00:30:15,400 --> 00:30:19,990 Du gir den to pekere, to adresser, og det vil gå til disse adressene 690 00:30:19,990 --> 00:30:23,130 og deretter sammenligne brev for bokstav for bokstav for kvalitet, 691 00:30:23,130 --> 00:30:26,610 stopper bare når det er sant? 692 00:30:26,610 --> 00:30:31,540 Når intuitivt skulle røre komp slutter itera, bare for å være klar? 693 00:30:31,540 --> 00:30:35,400 Når den treffer en backslash 0 i enten streng, ved hvilket punkt det kan bestemme 694 00:30:35,400 --> 00:30:38,910 har alt matchet, eller har det vært en uoverensstemmelse? 695 00:30:38,910 --> 00:30:42,740 >> Så, hvis vi kjører dette nå og prøver vår lille kapitalisering spill, 696 00:30:42,740 --> 00:30:49,260 så sørg sammenligne-en, ./compare-1, og skriver mamma med små bokstaver begge ganger. 697 00:30:49,260 --> 00:30:50,560 Nå er det det samme. 698 00:30:50,560 --> 00:30:54,080 Og hvis jeg gjør det igjen med små bokstaver og deretter kanskje store bokstaver. 699 00:30:54,080 --> 00:30:56,720 Nå er det faktisk skiller mellom store og små bokstaver. 700 00:30:56,720 --> 00:31:00,440 Så det er ikke alt som er vanskelig eller magisk, men det gjør nå forklare 701 00:31:00,440 --> 00:31:03,140 hva som skjer under panseret. 702 00:31:03,140 --> 00:31:07,640 >> Så hva mer kan vi trekke ut fra denne type lekse? 703 00:31:07,640 --> 00:31:08,980 Så la oss ta en titt på dette. 704 00:31:08,980 --> 00:31:15,380 Jeg kommer til å gå videre og skrive en rask program her kalt kopi 0. 705 00:31:15,380 --> 00:31:21,594 Og nå la oss gå videre og faktisk la oss gjøre dette-- med kopi-0, 706 00:31:21,594 --> 00:31:23,010 ta en titt på hva jeg har her. 707 00:31:23,010 --> 00:31:24,712 Jeg først fortelle brukeren, si noe. 708 00:31:24,712 --> 00:31:26,420 Så får jeg en streng og jeg lagret den i s. 709 00:31:26,420 --> 00:31:29,810 Så sjekker jeg om s er lik lik NULL, bare returnere en. 710 00:31:29,810 --> 00:31:31,590 Så dette er bare standard feilsjekking. 711 00:31:31,590 --> 00:31:33,112 Noe interessant som har skjedd. 712 00:31:33,112 --> 00:31:36,320 Og faktisk, hvis vi blir kvitt feilen sjekker, dette ser ut som uke en kode 713 00:31:36,320 --> 00:31:36,985 for øyeblikket. 714 00:31:36,985 --> 00:31:39,110 Men jeg har begynt å få en litt bedre om det. 715 00:31:39,110 --> 00:31:43,340 >> Nå i linje 16, en uke siden, kanskje enda et par dager eller minutter siden, 716 00:31:43,340 --> 00:31:46,720 du kan si linje 16 er å skape en variabel kalt t 717 00:31:46,720 --> 00:31:48,219 og kopiering er inn i den. 718 00:31:48,219 --> 00:31:50,010 Og det er en helt rimelig takeaway. 719 00:31:50,010 --> 00:31:51,560 Men være mer presis nå. 720 00:31:51,560 --> 00:31:54,190 Hva skjer i tråd 16? 721 00:31:54,190 --> 00:31:56,170 Hva er å bli kopiert fra høyre til venstre? 722 00:31:56,170 --> 00:31:56,669 Yeah? 723 00:31:56,669 --> 00:31:58,490 PUBLIKUM: Er t få en adresse av s? 724 00:31:58,490 --> 00:32:01,220 >> DAVID J. MALAN: Akkurat, t blir adressen til s. 725 00:32:01,220 --> 00:32:05,170 Så for å være klart nå, hvis jeg går tilbake til det tidligere eksempel 726 00:32:05,170 --> 00:32:08,520 og jeg trekker ut det jeg har skrevet i. 727 00:32:08,520 --> 00:32:11,640 Og det jeg har skrevet in-- her er s, og her 728 00:32:11,640 --> 00:32:15,830 er det jeg har skrevet i et sted i minne, mor og deretter en backslash 729 00:32:15,830 --> 00:32:17,840 0 som er lagt for meg. 730 00:32:17,840 --> 00:32:23,060 Hva jeg lagret her, husker, dette er i posisjon 1, 2, 3, 4, 731 00:32:23,060 --> 00:32:24,655 Dette er hva som er i dag i s. 732 00:32:24,655 --> 00:32:29,220 Så hvis du er på linje 16, sier jeg gi meg en annen variabel kalt t og butikk 733 00:32:29,220 --> 00:32:33,590 i at verdien av s, hva blir lagret her vil ikke mamma 734 00:32:33,590 --> 00:32:35,480 men heller bare nummer en. 735 00:32:35,480 --> 00:32:38,520 >> Så hvis vi ser fremover i dette programmet nå, hva kommer til å skje? 736 00:32:38,520 --> 00:32:40,690 Så merker at det er denne funksjonen du kanskje 737 00:32:40,690 --> 00:32:44,410 har brukt dette for en tid siden for Caesar, eller Vigenère, eller kanskje ikke i det hele tatt. 738 00:32:44,410 --> 00:32:48,170 Jeg hevder med min printf, jeg er kommer til å kapitalisere kopien t. 739 00:32:48,170 --> 00:32:51,616 Først i linje 19, rask tilregnelighet sjekker, StrLen kontrollerer lengden av t. 740 00:32:51,616 --> 00:32:53,740 Fordi jeg ønsker ikke å prøver å kapitalisere noe 741 00:32:53,740 --> 00:32:55,104 Hvis det er ingen streng der. 742 00:32:55,104 --> 00:32:57,520 Hvis brukeren bare trykke Enter, det er ingenting å kapitalisere. 743 00:32:57,520 --> 00:33:01,100 Så jeg ønsker ikke å gjøre linje 21. 744 00:33:01,100 --> 00:33:05,758 Så linje 21 er å utnytte som brev, tilsynelatende, i t? 745 00:33:05,758 --> 00:33:06,514 >> PUBLIKUM: m? 746 00:33:06,514 --> 00:33:08,722 DAVID J. MALAN: Det ser ut som det er kopiering hvilken? 747 00:33:08,722 --> 00:33:09,486 PUBLIKUM: m. 748 00:33:09,486 --> 00:33:10,450 DAVID J. MALAN: Uh, m. 749 00:33:10,450 --> 00:33:12,685 OK, så den første m, fordi merke til at jeg er 750 00:33:12,685 --> 00:33:14,935 passerer til toupper, som Hvis du aldri har sett det det er 751 00:33:14,935 --> 00:33:16,980 bare for en funksjon for å kapitalisere som sin inngang. 752 00:33:16,980 --> 00:33:20,240 t brakett null betyr gi meg null karakter t. 753 00:33:20,240 --> 00:33:22,550 Og så hvordan dette Bildet endring, for å være klar? 754 00:33:22,550 --> 00:33:25,490 755 00:33:25,490 --> 00:33:29,160 Hva som må bli omskrevet eller endret med hensyn til s og t og mamma 756 00:33:29,160 --> 00:33:30,097 backslash null. 757 00:33:30,097 --> 00:33:31,470 >> PUBLIKUM: [uhørbart] 758 00:33:31,470 --> 00:33:34,030 >> DAVID J. MALAN: Ja, så dette her rett og slett 759 00:33:34,030 --> 00:33:40,860 behov for å få endret to-- fikse dette-- trenger å få endret til en kapital m. 760 00:33:40,860 --> 00:33:44,330 Men nå, se senere i program, hvis jeg skrive ut 761 00:33:44,330 --> 00:33:49,800 s og t som jeg rydde her, se på hva som er kommer til å skje skrive ut s og t. 762 00:33:49,800 --> 00:33:54,310 Så gjør copy-0, ./copy-0. 763 00:33:54,310 --> 00:33:57,140 La meg gå videre og skriv i mamma i små bokstaver. 764 00:33:57,140 --> 00:34:00,140 Legg merke til både den opprinnelige og kopien er aktivert. 765 00:34:00,140 --> 00:34:00,850 Hvorfor? 766 00:34:00,850 --> 00:34:04,431 Vel, s og t er begge peker til, om du vil, samme mengde minne. 767 00:34:04,431 --> 00:34:06,930 Og ærlig talt, dette er å få virkelig uninteresting-- det faktum 768 00:34:06,930 --> 00:34:09,150 at vi bruker adresse null her. 769 00:34:09,150 --> 00:34:11,719 Jeg mener, jeg egentlig ikke bryr seg hvor ting er i minnet. 770 00:34:11,719 --> 00:34:13,550 Sorry jeg slette litt for mye. 771 00:34:13,550 --> 00:34:15,674 Men jeg egentlig ikke bryr seg hvor ting er i minnet. 772 00:34:15,674 --> 00:34:18,510 Og så, ja hva programmerere har en tendens til å tenke på 773 00:34:18,510 --> 00:34:21,080 er at når du snakker om en adresse, eller en peker, 774 00:34:21,080 --> 00:34:22,679 hvem bryr seg hvor det er i minnet. 775 00:34:22,679 --> 00:34:24,989 Jeg bryr meg ikke om det er på byte en eller én milliard. 776 00:34:24,989 --> 00:34:27,920 Jeg bare bryr seg om at dette variabelen er effektivt 777 00:34:27,920 --> 00:34:29,620 peker på at mengde minne. 778 00:34:29,620 --> 00:34:33,350 Og så, fra nå av, i stedet for uenighet i løpet av vilkårlige minneadresser, la oss 779 00:34:33,350 --> 00:34:36,710 bare begynne å tegne pekere som pekere, som piler. 780 00:34:36,710 --> 00:34:39,340 Så hva s og t egentlig er, i henhold til dette program, 781 00:34:39,340 --> 00:34:42,130 på grunn av hvordan jeg laget t, det er bare to separate variabler 782 00:34:42,130 --> 00:34:43,840 peker på den samme mengde minne. 783 00:34:43,840 --> 00:34:45,215 Og vi ikke bryr seg hvor de er. 784 00:34:45,215 --> 00:34:47,130 Så vi kan abstrakt bort at detalj. 785 00:34:47,130 --> 00:34:48,780 >> Så hvordan løser jeg dette? 786 00:34:48,780 --> 00:34:54,120 Hvis jeg ønsker å skrive en versjon av kopien Program som faktisk kopierer streng 787 00:34:54,120 --> 00:34:56,840 og kapitaliserer bare kopi, bare intuitivt, 788 00:34:56,840 --> 00:34:59,766 hva må være en ingrediens til vår løsning? 789 00:34:59,766 --> 00:35:00,640 PUBLIKUM: [uhørbart] 790 00:35:00,640 --> 00:35:01,420 DAVID J. MALAN: Vi trenger en hva? 791 00:35:01,420 --> 00:35:01,820 PUBLIKUM: Chunk minne. 792 00:35:01,820 --> 00:35:03,280 DAVID J. MALAN: Vi trenger en annen del av minne, ikke sant? 793 00:35:03,280 --> 00:35:05,360 Vi vet ikke hvordan de skal gjøre det ennå, nødvendigvis. 794 00:35:05,360 --> 00:35:11,330 Men jeg slags trenger dette skal skje så at den opprinnelige mor med små bokstaver 795 00:35:11,330 --> 00:35:14,170 ender opp i at ekstra mengde minne. 796 00:35:14,170 --> 00:35:19,770 Og så når jeg endre kopien, jeg ønsker ikke å endre denne kopien her. 797 00:35:19,770 --> 00:35:26,020 Jeg i stedet bare vil endre denne kopien slik at originalen er uendret. 798 00:35:26,020 --> 00:35:27,980 >> Så, la oss se hvordan vi kan gjøre dette. 799 00:35:27,980 --> 00:35:31,800 I copy-1, som allerede har blitt strippet for kommentar, 800 00:35:31,800 --> 00:35:33,250 men er kommentert online. 801 00:35:33,250 --> 00:35:36,710 Vi i stedet gjøre following-- disse linjene er identiske, få meg en streng 802 00:35:36,710 --> 00:35:38,340 og kaller det s. 803 00:35:38,340 --> 00:35:43,500 Men la oss nå se på en av våre mest kompleks, men den siste av kompleksiteten 804 00:35:43,500 --> 00:35:47,340 for en stund, gjør linje 16 akkurat dette. 805 00:35:47,340 --> 00:35:49,400 Så hvis din comfy med Bildet vi bare drew-- 806 00:35:49,400 --> 00:35:51,790 gi meg en ny del av minnet, kopiere alt inn i det, 807 00:35:51,790 --> 00:35:53,730 La oss se hvordan vi oversette det til koden. 808 00:35:53,730 --> 00:35:59,400 >> Så linje 16, på venstre side, char * t gir meg denne boksen over her. 809 00:35:59,400 --> 00:36:00,230 Det er alt den gjør. 810 00:36:00,230 --> 00:36:03,240 På høyre side, m Alloc, eller malloc, 811 00:36:03,240 --> 00:36:06,480 er minnetildeling, super fancy, en kryptisk måte å bare si 812 00:36:06,480 --> 00:36:07,640 gi meg en blings av minne. 813 00:36:07,640 --> 00:36:09,290 Hvor mye minne trenger vi? 814 00:36:09,290 --> 00:36:10,910 Vel, er slag av en stor uttrykk. 815 00:36:10,910 --> 00:36:12,570 Men la oss se hva det står her. 816 00:36:12,570 --> 00:36:15,940 Så dette, selvfølgelig, er å gi meg strengen lengde s. 817 00:36:15,940 --> 00:36:19,094 Så, mamma det bør være hva? 818 00:36:19,094 --> 00:36:21,010 Så bare tre, ikke sant? Moren er tre tegn. 819 00:36:21,010 --> 00:36:22,830 Du trenger ikke telle backslash null når du 820 00:36:22,830 --> 00:36:25,960 snakk om lengden av en streng er det faktisk den menneskelige synlige bokstaver. 821 00:36:25,960 --> 00:36:28,020 Så mamma, så dette gir meg tre. 822 00:36:28,020 --> 00:36:31,170 Men vent litt, jeg nå å legge en. 823 00:36:31,170 --> 00:36:34,861 Hvorfor må jeg faktisk ønsker å bevilge 4 byte og ikke bare tre? 824 00:36:34,861 --> 00:36:35,360 Yeah? 825 00:36:35,360 --> 00:36:36,910 >> PUBLIKUM: For sentinel verdi? 826 00:36:36,910 --> 00:36:38,951 >> DAVID J. MALAN: Akkurat, for at sentinel verdi. 827 00:36:38,951 --> 00:36:40,840 For backslash null, Jeg trenger 4 byte totalt. 828 00:36:40,840 --> 00:36:42,870 Så jeg trenger lengden av strengen, pluss en. 829 00:36:42,870 --> 00:36:45,400 Og så bare for god measure-- selv om på dette systemet, 830 00:36:45,400 --> 00:36:49,390 det er alltid kommer til å være 1-- jeg sier multiplisere dette med størrelsen på en char. 831 00:36:49,390 --> 00:36:51,552 Det viser seg at sizeof er operatør i C som 832 00:36:51,552 --> 00:36:53,260 bare forteller deg antall byte som er 833 00:36:53,260 --> 00:36:54,700 som kreves for en bestemt datatype. 834 00:36:54,700 --> 00:36:57,740 Det fungerer ikke for arrays, typisk, noen ganger det gjør. 835 00:36:57,740 --> 00:36:59,210 Men i det generelle tilfelle, no. 836 00:36:59,210 --> 00:37:02,330 Men det vil fortelle meg hvor mange byte en røye er, som viser seg er alltid en. 837 00:37:02,330 --> 00:37:04,080 Så dette er som å multiplisere med en. 838 00:37:04,080 --> 00:37:05,900 >> Så super kryptiske jakt linje med kode. 839 00:37:05,900 --> 00:37:09,320 Men alt den gjør er gir meg en blings av minne. 840 00:37:09,320 --> 00:37:13,590 Men synes det å være å kopiere noe inn som minne? 841 00:37:13,590 --> 00:37:14,560 Ikke enda. 842 00:37:14,560 --> 00:37:22,040 Og så hva gjør jeg på linje 22, og 23, 24, 25, vel, jeg bare gjør dette. 843 00:37:22,040 --> 00:37:23,760 Og dette er liksom old school stuff nå. 844 00:37:23,760 --> 00:37:26,010 Dette er som PSet 2, der du bare flytte ting 845 00:37:26,010 --> 00:37:28,620 rundt i minnet, eller snarere i strenger. 846 00:37:28,620 --> 00:37:31,920 >> Så jeg gjentar fra 0 til lengden av strengen s. 847 00:37:31,920 --> 00:37:37,820 Og jeg kopierer den i-te karakter i s inn i i-te karakter i t. 848 00:37:37,820 --> 00:37:41,820 Og fordi jeg, programmerer, gjort Pass på å fordele nøyaktig like mange bytes 849 00:37:41,820 --> 00:37:44,600 som jeg trenger, er det perfekt en-til-en forhold. 850 00:37:44,600 --> 00:37:47,060 Og jeg kopiere mamma små bokstaver til den nye. 851 00:37:47,060 --> 00:37:50,170 Og så til slutt, jeg gjør denne linjen. 852 00:37:50,170 --> 00:37:54,637 Og så effekten er bare å utnytte denne t her. 853 00:37:54,637 --> 00:37:56,470 Så mye til å absorbere, men hvis du bare vurdere 854 00:37:56,470 --> 00:37:58,220 hva som egentlig skjer på under panseret 855 00:37:58,220 --> 00:38:00,880 er bare å flytte disse bytes rundt, alt 856 00:38:00,880 --> 00:38:06,617 er nødvendig for å løse dette problemet er bare for å gi oss denne del av minnet. 857 00:38:06,617 --> 00:38:08,450 Nå i fare for å overveldende, la meg vise 858 00:38:08,450 --> 00:38:13,200 ett annet eksempel som er nesten identiske, bortsett fra denne ene 859 00:38:13,200 --> 00:38:14,350 linje med kode. 860 00:38:14,350 --> 00:38:18,870 Så dette er hacker versjon av dette programmet, hvis du vil. 861 00:38:18,870 --> 00:38:21,050 Men la oss bare destillere det inn i hva som skjer. 862 00:38:21,050 --> 00:38:28,920 Linje 24 brukes til å bli: T braketten jeg får s brakett i. 863 00:38:28,920 --> 00:38:33,370 Nå, jeg endre dette til den mye mer kryptiske stjerne t 864 00:38:33,370 --> 00:38:36,280 pluss en er lik stjerne s pluss 1. 865 00:38:36,280 --> 00:38:38,702 >> Så hva som skjer og hvorfor har vi en stjerne karakter? 866 00:38:38,702 --> 00:38:41,410 Vi har sett stjernen før, og det blir brukt annerledes her. 867 00:38:41,410 --> 00:38:45,490 Vi tidligere så char *, nå jeg ser En stjerne i begynnelsen, og det er OK. 868 00:38:45,490 --> 00:38:48,190 Fordi det viser seg at vi kan slags antyde bare 869 00:38:48,190 --> 00:38:50,280 fra de første prinsippene hva som skjer. 870 00:38:50,280 --> 00:38:53,860 Så bare for å være klar, hva er s? 871 00:38:53,860 --> 00:38:55,052 I forrige uke var det en streng. 872 00:38:55,052 --> 00:38:56,260 Som ikke nok lenger. 873 00:38:56,260 --> 00:38:57,690 Hva er s, spesielt? 874 00:38:57,690 --> 00:38:58,590 >> PUBLIKUM: [uhørbart] 875 00:38:58,590 --> 00:38:59,881 >> DAVID J. MALAN: Det er en peker. 876 00:38:59,881 --> 00:39:02,610 Det er adressen til første tegnet vi skrevet i. 877 00:39:02,610 --> 00:39:04,780 OK, hva er t? 878 00:39:04,780 --> 00:39:05,660 >> PUBLIKUM: [uhørbart] 879 00:39:05,660 --> 00:39:07,950 >> DAVID J. MALAN: The adressen til den første byte 880 00:39:07,950 --> 00:39:10,490 i t, som del av minnet omfordelt. 881 00:39:10,490 --> 00:39:14,720 Så det viser seg at når vi veksle fra 0 på opp til strengen 882 00:39:14,720 --> 00:39:17,424 length-- først av alt, jeg starter på 0, fordi 883 00:39:17,424 --> 00:39:18,840 av denne gamle skolen for loop ting. 884 00:39:18,840 --> 00:39:22,400 Så bare for enkelhet, la oss anta at den første linjen i kode 885 00:39:22,400 --> 00:39:23,760 er egentlig bare dette, ikke sant. 886 00:39:23,760 --> 00:39:26,080 Hvis jeg er null, og legger til null til noe formodentlig 887 00:39:26,080 --> 00:39:27,540 ikke kommer til å ha en effekt. 888 00:39:27,540 --> 00:39:28,560 >> Så hva er dette ord? 889 00:39:28,560 --> 00:39:31,600 Det viser seg at stjernen Operatøren i denne sammenheng 890 00:39:31,600 --> 00:39:33,700 er dereferanse operatør, som er like 891 00:39:33,700 --> 00:39:37,530 en fancy måte å si gå til følgende adresse. 892 00:39:37,530 --> 00:39:42,080 Så hvis s er adressen til den første karakter i denne del av minnet, 893 00:39:42,080 --> 00:39:43,630 * s betyr gå dit. 894 00:39:43,630 --> 00:39:45,630 Og fordi vi har trukket bildet på denne måten 895 00:39:45,630 --> 00:39:47,430 du kan adoptere Følgende mental modell. 896 00:39:47,430 --> 00:39:51,030 Hvis dette er s, og du sier * s, * s typen som renner og stiger, 897 00:39:51,030 --> 00:39:54,540 hvis du husker kampen fra barndommen, er som følge at pilen og gå 898 00:39:54,540 --> 00:39:55,570 til adressen. 899 00:39:55,570 --> 00:39:57,080 >> * t er den samme. 900 00:39:57,080 --> 00:39:59,855 Så starter her, gå til sin del. 901 00:39:59,855 --> 00:40:03,350 Jeg kan ikke bare trekke på denne skjermen på den måten. 902 00:40:03,350 --> 00:40:05,560 * t betyr å gå her. 903 00:40:05,560 --> 00:40:08,830 Og så, er bare for loop sier flytte denne karakter her, 904 00:40:08,830 --> 00:40:11,330 flytte denne karakter her, flytte denne karakter her. 905 00:40:11,330 --> 00:40:12,890 Men hvordan gjør jeg det incrementation? 906 00:40:12,890 --> 00:40:15,430 Jeg trenger å angre det jeg nettopp slettet. 907 00:40:15,430 --> 00:40:18,140 Dette er det som vanligvis kalles pekeren aritmetikk, som 908 00:40:18,140 --> 00:40:20,040 betyr matematikk med adresser. 909 00:40:20,040 --> 00:40:22,460 >> Dersom det i denne for sløyfen, Jeg fortsetter å økes i, 910 00:40:22,460 --> 00:40:26,880 og s er en adresse og t er en adresse, hvis jeg bare fortsette å legge en, 911 00:40:26,880 --> 00:40:31,406 det betyr bare holde fremover, og fremover, og fremover i minnet. 912 00:40:31,406 --> 00:40:34,030 Det er som Oxford Street, den gaten som CS bygningen er på. 913 00:40:34,030 --> 00:40:36,490 CS bygningene er på 33 Oxford Street. 914 00:40:36,490 --> 00:40:39,870 Så hvis du skulle gjøre 33 Oxford Street pluss 1, 915 00:40:39,870 --> 00:40:42,870 som bringer deg til 34 Oxford Gaten, deretter 35 Oxford Street, 916 00:40:42,870 --> 00:40:46,380 deretter 36 Oxford Street, uansett hva de bygningene faktisk er - hvis de finnes. 917 00:40:46,380 --> 00:40:50,540 Og så, det er alt vi gjør her med pekeren aritmetikk. 918 00:40:50,540 --> 00:40:53,820 >> Så det er en super uforståelige måte uttrykke oss selv. 919 00:40:53,820 --> 00:40:56,160 Men alt som skjer under panseret 920 00:40:56,160 --> 00:40:59,330 er bare å følge disse adressene, som følge et kart, om du vil, 921 00:40:59,330 --> 00:41:02,692 eller etter piler som vi har tegnet på skjermen. 922 00:41:02,692 --> 00:41:04,910 OK, til en masse fordøye. 923 00:41:04,910 --> 00:41:10,410 Eventuelle spørsmål om syntaks, konsepter, pekere, malloc, eller lignende. 924 00:41:10,410 --> 00:41:11,480 Ja, over her først. 925 00:41:11,480 --> 00:41:13,755 >> PUBLIKUM: Så hvor som sier * t tilsvarer toupper * t, 926 00:41:13,755 --> 00:41:15,575 kommer det til å kapital alle bokstavene eller just-- 927 00:41:15,575 --> 00:41:17,283 >> DAVID J. MALAN: Ah, veldig godt spørsmål. 928 00:41:17,283 --> 00:41:19,805 Så i denne linjen her, 31, dette kommer til å kapitalisere 929 00:41:19,805 --> 00:41:21,430 den første bokstaven eller alle bokstavene. 930 00:41:21,430 --> 00:41:23,460 Så la oss svare på det ved å gå tilbake til første prinsipper. 931 00:41:23,460 --> 00:41:26,168 Og første prinsippene her jeg mener bare gå til de grunnleggende definisjoner 932 00:41:26,168 --> 00:41:27,000 av hva som er involvert. 933 00:41:27,000 --> 00:41:29,770 Så toupper er en funksjon som kapitaliserer en char. 934 00:41:29,770 --> 00:41:30,530 Det er alt. 935 00:41:30,530 --> 00:41:36,740 * t betyr gå til first-- gå til adressen i t. 936 00:41:36,740 --> 00:41:40,350 Så, i bildet, hvis dette er blings minne vi tildelt med malloc, 937 00:41:40,350 --> 00:41:43,310 og dette er t, * t betyr gå her. 938 00:41:43,310 --> 00:41:46,710 >> I mellomtiden, du passerer denne verdien, små bokstaver m 939 00:41:46,710 --> 00:41:50,040 til toupper, du får tilbake kapital M, hvor er du setter den? 940 00:41:50,040 --> 00:41:52,410 Du setter den i den samme sted. 941 00:41:52,410 --> 00:41:55,540 Og så ved at logikken i de grunnleggende definisjoner det er bare 942 00:41:55,540 --> 00:41:58,792 utnytte den første bokstaven med mindre du reagere med jeg eller en 943 00:41:58,792 --> 00:42:02,000 for loop eller en stund loop, er det ikke kommer å gjøre noe mer enn du ber om det. 944 00:42:02,000 --> 00:42:02,583 Godt spørsmål. 945 00:42:02,583 --> 00:42:03,237 Yeah? 946 00:42:03,237 --> 00:42:05,369 >> PUBLIKUM: Hvorfor gjorde du bruke deferanseoperasjon metoden heller enn 947 00:42:05,369 --> 00:42:05,979 rekken? 948 00:42:05,979 --> 00:42:07,395 >> DAVID J. MALAN: Ah, godt spørsmål. 949 00:42:07,395 --> 00:42:10,672 Hvorfor vil du bruke dereferanse metoden i stedet for matrisen metoden? 950 00:42:10,672 --> 00:42:12,130 Ingen spesiell grunn, for å være ærlig. 951 00:42:12,130 --> 00:42:15,290 Og, faktisk, for denne form av et eksempel, til høyre, 952 00:42:15,290 --> 00:42:17,556 Jeg bare kranglet gjøre program mer komplisert, 953 00:42:17,556 --> 00:42:19,680 flere øyne er glass over, folk sjekker ut 954 00:42:19,680 --> 00:42:22,830 fordi dette ser super uforståelige, men selv om det gjør det samme. 955 00:42:22,830 --> 00:42:26,695 Og så, ærlig, er dette en unødvendig visuelt kompleks løsning 956 00:42:26,695 --> 00:42:27,320 på problemet. 957 00:42:27,320 --> 00:42:29,580 >> Det er fortsatt god design, fem av fem for design, 958 00:42:29,580 --> 00:42:33,140 enten det er i braketten notasjon eller pekeren notasjon. 959 00:42:33,140 --> 00:42:36,299 Men-- spesielt når vi får senere i kurset i PSet 5 960 00:42:36,299 --> 00:42:39,340 når vi implementerer det ordbok som Jeg har nevnt et par times-- 961 00:42:39,340 --> 00:42:42,300 vi vil faktisk bryr seg om lavt nivå minneadresser 962 00:42:42,300 --> 00:42:44,140 at vi virkelig forstår hva er det som skjer. 963 00:42:44,140 --> 00:42:48,300 >> Men, for nå, viser det seg at dette kodelinje her hakeparenteser 964 00:42:48,300 --> 00:42:49,900 vet egentlig ikke eksisterer. 965 00:42:49,900 --> 00:42:52,230 De er det som kalles syntaktisk sukker, som 966 00:42:52,230 --> 00:42:58,390 er bare en nifs kul måte å si det kompilatoren konverterer hakeparenteser til å være 967 00:42:58,390 --> 00:43:00,420 som matematisk uttrykk. 968 00:43:00,420 --> 00:43:02,660 Så det er en menneskelig konvensjonen å være i stand til å bare skrive 969 00:43:02,660 --> 00:43:04,220 disse svært brukervennlige parentes. 970 00:43:04,220 --> 00:43:06,850 Men hva kompilatoren, klang, er virkelig gjør helst 971 00:43:06,850 --> 00:43:10,970 du skrive hva som fremhevet i tråd 24, det er virkelig under panseret 972 00:43:10,970 --> 00:43:12,330 å konvertere det til denne. 973 00:43:12,330 --> 00:43:16,200 Det er bare mer behagelige som et menneske å lese og skrive kode som linje 24. 974 00:43:16,200 --> 00:43:18,530 Men til slutt de trening hjul også komme av 975 00:43:18,530 --> 00:43:21,780 når ens egen komfort blir sterkere. 976 00:43:21,780 --> 00:43:27,240 >> Greit, så husker da at dette var slags største problemet 977 00:43:27,240 --> 00:43:27,807 vi kjørte inn. 978 00:43:27,807 --> 00:43:30,640 Og det er det som utløste hele denne jævla samtale om pekere, 979 00:43:30,640 --> 00:43:32,340 og adresser, og kopiering av ting. 980 00:43:32,340 --> 00:43:35,410 Det var fordi vi snubler over dette dum, dum sak, der 981 00:43:35,410 --> 00:43:38,830 Jeg implementert logically-- med Lauren her oppe på demo og appelsinjuice 982 00:43:38,830 --> 00:43:43,770 i milk-- en perfekt algoritmisk riktig funksjon 983 00:43:43,770 --> 00:43:47,010 for å bytte to variabler ' verdier, men den jævla ting 984 00:43:47,010 --> 00:43:50,550 har ikke noe vedvarende, eller permanent, effekt på min kode. 985 00:43:50,550 --> 00:43:51,820 >> Og hvorfor var det? 986 00:43:51,820 --> 00:43:54,650 I et nøtteskall, hvorfor er dette implementering av swap 987 00:43:54,650 --> 00:43:58,740 logisk korrekt, men har ingen innvirkning på de variablene som sendes til det, 988 00:43:58,740 --> 00:44:01,119 som x og y for main? 989 00:44:01,119 --> 00:44:02,410 Hva var hovedinnholdet i saken? 990 00:44:02,410 --> 00:44:02,909 Yeah? 991 00:44:02,909 --> 00:44:05,532 PUBLIKUM: Fordi variable laget kopier av variable i pass 992 00:44:05,532 --> 00:44:06,240 gjennom funksjon. 993 00:44:06,240 --> 00:44:09,060 >> DAVID J. MALAN: Akkurat, når du passerer variablene i en funksjon, eller argumenter 994 00:44:09,060 --> 00:44:11,030 inn i en funksjon, de er vedtatt av kopi, som 995 00:44:11,030 --> 00:44:14,770 betyr at du får en identisk jakt mønster av biter for både x og y, 996 00:44:14,770 --> 00:44:15,955 heter her a og b. 997 00:44:15,955 --> 00:44:18,080 Og du kan gjøre noe du vil med disse eksemplarene, 998 00:44:18,080 --> 00:44:20,657 men de kommer til å ha noen effekt på kall funksjonen. 999 00:44:20,657 --> 00:44:22,990 Og, faktisk, vi trakk det bilde på skjermen, tilbakekalling 1000 00:44:22,990 --> 00:44:25,520 siste gang, der hvis du virkelig tenke på hva som er 1001 00:44:25,520 --> 00:44:28,570 skjer under hood-- hvis Dette er datamaskinens minne, 1002 00:44:28,570 --> 00:44:31,650 og her nede er den del av minne som brukes for main, 1003 00:44:31,650 --> 00:44:34,020 Dette er den mengde minne som brukes for swap, 1004 00:44:34,020 --> 00:44:37,090 og så selv om hoved har to variabler, x og y, 1005 00:44:37,090 --> 00:44:41,840 swap kan ha identisk ute verdier, som begge er 1 og 2, 1006 00:44:41,840 --> 00:44:44,520 men de er helt forskjellige biter av minne. 1007 00:44:44,520 --> 00:44:46,130 >> Så vi trenger en løsning på dette. 1008 00:44:46,130 --> 00:44:51,580 Og ærlig talt, ville det virke som vi nå har en løsning på dette problem, til høyre. 1009 00:44:51,580 --> 00:44:55,760 Hvis vi nå har evnen til å manipulere ting ved hjelp av adresser 1010 00:44:55,760 --> 00:44:59,310 og, liksom renner og stiger stil, følg disse pilene 1011 00:44:59,310 --> 00:45:02,820 og gå hvor som helst vi ønsker i minne, kunne ikke vi 1012 00:45:02,820 --> 00:45:06,220 løse dette problemet ved å går fra hoved å bytte 1013 00:45:06,220 --> 00:45:09,650 ikke de verdiene vi ønsker å swap, men bare intuitivt 1014 00:45:09,650 --> 00:45:11,630 hva kan vi passere å bytte i stedet? 1015 00:45:11,630 --> 00:45:12,620 >> [Interposing VOICES] 1016 00:45:12,620 --> 00:45:15,244 >> DAVID J. MALAN: Hvorfor gjør vi ikke bare passerer den adressene, ikke sant? 1017 00:45:15,244 --> 00:45:17,470 Hvorfor kan ikke vi gi swap en skattekart, om du vil, 1018 00:45:17,470 --> 00:45:20,950 som fører den til faktiske verdier x og y. 1019 00:45:20,950 --> 00:45:24,340 La oss swap, faktisk endre de opprinnelige biter, i stedet for 1020 00:45:24,340 --> 00:45:26,797 bare passerer kopier av biter. 1021 00:45:26,797 --> 00:45:29,130 Og så, faktisk, det er hva som er kommer til å være løsningen. 1022 00:45:29,130 --> 00:45:31,899 Denne versjonen her er klart dårlig og feil. 1023 00:45:31,899 --> 00:45:35,190 Og nå, ved første øyekast, det bare ser som vi har lagt en haug med stjerner tilfeldig 1024 00:45:35,190 --> 00:45:37,106 og krysset fingrene at det ville kompilere. 1025 00:45:37,106 --> 00:45:38,460 Men, ville det nå kompilere. 1026 00:45:38,460 --> 00:45:40,090 >> Men la oss se hva dette skal bety. 1027 00:45:40,090 --> 00:45:43,990 Og, dessverre, forfatterne av C kunne ha valgt et annet symbol 1028 00:45:43,990 --> 00:45:46,380 for å gjøre dette litt klarere, men stjernen operatør 1029 00:45:46,380 --> 00:45:48,610 har annen betydning i to ulike sammenhenger. 1030 00:45:48,610 --> 00:45:50,890 Og vi har sett begge, men la oss skille. 1031 00:45:50,890 --> 00:45:55,310 >> Så opp på toppen der, når jeg har forandret a og b 1032 00:45:55,310 --> 00:46:00,470 fra å være int er i dårlig versjon til int stjerner, a og b, 1033 00:46:00,470 --> 00:46:01,740 tidligere, var heltall. 1034 00:46:01,740 --> 00:46:05,752 Hva er a og b nå i den gode, grønne versjonen? 1035 00:46:05,752 --> 00:46:06,900 De er adresser. 1036 00:46:06,900 --> 00:46:09,610 Adresser til hva, for å være klar? 1037 00:46:09,610 --> 00:46:10,770 Adresser til heltall. 1038 00:46:10,770 --> 00:46:12,520 Så det faktum at jeg er sier int stjerners hjelp 1039 00:46:12,520 --> 00:46:15,440 Dette er adressen til et helt tall, spesielt. 1040 00:46:15,440 --> 00:46:19,120 >> Så nå merke i linjer med kode, noe annet har endret seg også. 1041 00:46:19,120 --> 00:46:22,770 tmp forblir den samme, fordi det er bare midlertidig heltall, 1042 00:46:22,770 --> 00:46:24,110 ingen minne magi der. 1043 00:46:24,110 --> 00:46:26,370 Men en trenger nå en stjerne. 1044 00:46:26,370 --> 00:46:28,560 Og, faktisk enhver annen omtale av a og b, 1045 00:46:28,560 --> 00:46:31,780 Legg merke til at alt som er endre fra rødt til grønt 1046 00:46:31,780 --> 00:46:34,209 er at jeg prefixing disse variablene med stjerner. 1047 00:46:34,209 --> 00:46:35,750 Fordi jeg ikke ønsker å kopiere en og b. 1048 00:46:35,750 --> 00:46:40,350 Fordi hvis jeg bare kopiere en og b og swap a og b, hva jeg faktisk å bytte? 1049 00:46:40,350 --> 00:46:43,760 Bare adresser, jeg ønsker å bytte hva som står på disse adressene. 1050 00:46:43,760 --> 00:46:44,860 Jeg ønsker å gå dit. 1051 00:46:44,860 --> 00:46:48,000 Og så stjernen operatør innsiden av min funksjon, 1052 00:46:48,000 --> 00:46:51,700 ikke på innsiden av parameterlisten betyr at du går til disse adressene 1053 00:46:51,700 --> 00:46:54,490 og faktisk endre disse verdiene. 1054 00:46:54,490 --> 00:46:56,500 >> Så hva gjør bildet nå ser ut i stedet. 1055 00:46:56,500 --> 00:47:03,250 Vel, hvis stedet jeg passert in for a og b ikke en og 2-- 1056 00:47:03,250 --> 00:47:05,790 Jeg faktisk trenger å legge en annen definisjon her. 1057 00:47:05,790 --> 00:47:09,030 Så antar at dette blings minne er på stedet 10. 1058 00:47:09,030 --> 00:47:12,960 >> Dette er på stedet 11, men denne er litt av en forenkling, 1059 00:47:12,960 --> 00:47:18,900 Jeg har nå to valg har jeg passerer x og y eller må jeg sende sine adresser? 1060 00:47:18,900 --> 00:47:22,500 Hvis jeg passerer deres adresser som dette, jeg bare 1061 00:47:22,500 --> 00:47:25,390 nå må implementere swap per den grønne koden 1062 00:47:25,390 --> 00:47:29,080 slik at når den ser en, og når det Sees b, betyr det ikke bare kopiere en og b 1063 00:47:29,080 --> 00:47:30,540 og flytte melk og appelsinjuice. 1064 00:47:30,540 --> 00:47:32,664 Melk og appelsinjuice metafor bryter nå ned, 1065 00:47:32,664 --> 00:47:35,060 fordi de er kopper av flytende og ikke-kart. 1066 00:47:35,060 --> 00:47:37,750 Vi trenger i stedet for å gå å ta opp 10, og vi 1067 00:47:37,750 --> 00:47:42,420 trenger å gå for å løse 11, og deretter utføre det bytte logikk. 1068 00:47:42,420 --> 00:47:45,580 >> Så logikken er den samme, men vi trenger en litt annen måte 1069 00:47:45,580 --> 00:47:47,160 av tilgang til disse variablene. 1070 00:47:47,160 --> 00:47:52,400 Og så til slutt, hva Programmet har til å se ut som dette er. 1071 00:47:52,400 --> 00:47:56,610 I swap.c bokstavelig kopiert og limt den grønne versjonen. 1072 00:47:56,610 --> 00:47:58,450 Men jeg trenger å gjøre en endring. 1073 00:47:58,450 --> 00:48:00,180 Det er ikke tilstrekkelig bare å endre swap. 1074 00:48:00,180 --> 00:48:03,830 Hvilke andre kodelinje må jeg endre? 1075 00:48:03,830 --> 00:48:04,330 Yeah? 1076 00:48:04,330 --> 00:48:05,770 >> PUBLIKUM: Hvor det tar argumentene. 1077 00:48:05,770 --> 00:48:07,603 >> DAVID J. MALAN: Hvor det tar sin argumentasjon. 1078 00:48:07,603 --> 00:48:09,985 Så hvis jeg blar opp til hoved, jeg kan ikke bare passere i x og y, 1079 00:48:09,985 --> 00:48:12,820 og, jeg lover, den siste stykke ny syntaks i dag. 1080 00:48:12,820 --> 00:48:17,200 Jeg trenger å passere i ikke x og y men adressen av x og y. 1081 00:48:17,200 --> 00:48:20,400 Og det viser seg, symbolet at forfatterne av C valgte 1082 00:48:20,400 --> 00:48:23,860 er hvis du bruker en tegnet her, for ikke å forveksles med bitvis ampersand, 1083 00:48:23,860 --> 00:48:27,130 hvis du bruker et ampersand her og en ampersand her, 1084 00:48:27,130 --> 00:48:29,570 Dette tallene ut for deg, hva er adressen til x, 1085 00:48:29,570 --> 00:48:31,740 kanskje det er 10, hva er Adressen y, kanskje det er 1086 00:48:31,740 --> 00:48:35,400 11, og passerer de i stedet. 1087 00:48:35,400 --> 00:48:37,210 >> Så mye til å absorbere alt på en gang. 1088 00:48:37,210 --> 00:48:40,190 Men la oss se nå raskt i våre resterende fire minutter 1089 00:48:40,190 --> 00:48:42,150 hvor ting kan gå galt. 1090 00:48:42,150 --> 00:48:45,120 Og som en digresjon, faktisk Jeg tok dette bildet, 1091 00:48:45,120 --> 00:48:46,920 TF tok dette bildet et år eller to siden. 1092 00:48:46,920 --> 00:48:49,190 Så dette er bak hjørnet av Eliot Dining Hall. 1093 00:48:49,190 --> 00:48:52,310 Pekere er kanskje den vanskeligste tema som vi dekker i CS50. 1094 00:48:52,310 --> 00:48:54,810 Så hvis du bekymre sorterings av skråningen er som kanskje det er 1095 00:48:54,810 --> 00:48:56,770 mer av en hockeykølle som dette, innser 1096 00:48:56,770 --> 00:49:00,160 vi er slags nærmer seg en topp i gjelder det konseptuelle kompleksitet. 1097 00:49:00,160 --> 00:49:02,300 >> Og jeg tar opp dette bilde, fordi jeg sverger 1098 00:49:02,300 --> 00:49:05,920 til Gud, i høst 1996, da jeg tok CS50 med min undervisning stipendiat, 1099 00:49:05,920 --> 00:49:09,620 Nishat Mehta, satte han meg ned i hjørne av Eliot D. Hall over lunsj, 1100 00:49:09,620 --> 00:49:12,330 eller middag, eller noe å prøve å hjelpe meg å forstå pekere. 1101 00:49:12,330 --> 00:49:16,520 Og det er her jeg var uker etter den ble introdusert i forelesningen når 1102 00:49:16,520 --> 00:49:18,170 Jeg endelig forstått pekere. 1103 00:49:18,170 --> 00:49:20,590 Og jeg er håpefull at dette vil klikke langt raskere for deg. 1104 00:49:20,590 --> 00:49:23,540 Men innser dette absolutt blant de mer avanserte emner 1105 00:49:23,540 --> 00:49:24,420 vi har sett på. 1106 00:49:24,420 --> 00:49:25,819 Men det er blant de kraftigste. 1107 00:49:25,819 --> 00:49:28,860 Og når du får det, det er egentlig alt bare kommer til å endelig komme sammen. 1108 00:49:28,860 --> 00:49:31,460 Så trygg på det gjør ikke må all vask i dag. 1109 00:49:31,460 --> 00:49:32,980 >> Så her er det siste programmet vi kommer til å se på. 1110 00:49:32,980 --> 00:49:35,605 Og vi kommer til å ende med en raske tre minutter av claymation 1111 00:49:35,605 --> 00:49:37,030 laget av vår venn, Nick Parlante. 1112 00:49:37,030 --> 00:49:41,440 Her er et program, som på de to øverste linjer erklærer en variabel x og y. 1113 00:49:41,440 --> 00:49:44,780 Som begge er adresser av heltall, AKA pekere. 1114 00:49:44,780 --> 00:49:48,125 Vi bevilger nok minne til å lagre en int 1115 00:49:48,125 --> 00:49:51,344 og lagre adressen av at minnet i x. 1116 00:49:51,344 --> 00:49:53,260 Så, er det enda enklere enn eksempelet før. 1117 00:49:53,260 --> 00:49:56,100 Gi meg fire byte minne, som er på størrelse med en int, 1118 00:49:56,100 --> 00:49:58,000 og sette den adressen i x. 1119 00:49:58,000 --> 00:50:01,070 Denne linjen betyr her gå til adressen i x 1120 00:50:01,070 --> 00:50:05,270 og sette betydningen av livet, nummer 42 der. 1121 00:50:05,270 --> 00:50:07,710 Men denne linjen bekymrer meg. 1122 00:50:07,710 --> 00:50:12,620 Stjerners y betyr gå til adressen i y, og sette uheldig nummer 13 der. 1123 00:50:12,620 --> 00:50:15,780 Hvorfor er det farlig, på dette punktet i story-- riktignok raskt fortalt 1124 00:50:15,780 --> 00:50:17,980 i våre avtagende minutter her-- hvorfor er det dårlig 1125 00:50:17,980 --> 00:50:19,660 for meg å si, gå til adressen i y? 1126 00:50:19,660 --> 00:50:21,077 >> PUBLIKUM: Du har ikke [uhørbart]. 1127 00:50:21,077 --> 00:50:22,910 DAVID J. MALAN: Jeg har ikke sette noe i y. 1128 00:50:22,910 --> 00:50:25,520 Så hva er verdien av y, på dette punktet i historien? 1129 00:50:25,520 --> 00:50:26,570 Vi har ingen anelse. 1130 00:50:26,570 --> 00:50:29,190 Det er noen søppel verdi og heller ikke Binky vite. 1131 00:50:29,190 --> 00:50:32,532 Hvis vi kan ende på dette notatet. 1132 00:50:32,532 --> 00:50:34,832 >> [VIDEO PLAYBACK] 1133 00:50:34,832 --> 00:50:36,500 >> -Hei, Binky, våkn opp. 1134 00:50:36,500 --> 00:50:39,140 Det er tid for pekeren moro. 1135 00:50:39,140 --> 00:50:40,210 >> -Hva er det? 1136 00:50:40,210 --> 00:50:41,690 Lær om pekere? 1137 00:50:41,690 --> 00:50:43,570 Oh, goody. 1138 00:50:43,570 --> 00:50:46,600 >> -Vel, For å komme i gang, tror jeg vi er kommer til å trenge et par tips. 1139 00:50:46,600 --> 00:50:47,380 >> -OK. 1140 00:50:47,380 --> 00:50:51,120 Denne koden tildeler to pekere som kan vise til heltall. 1141 00:50:51,120 --> 00:50:53,557 >> -OK, Vel jeg se to pekere, men de 1142 00:50:53,557 --> 00:50:55,140 ikke synes å være å peke på noe. 1143 00:50:55,140 --> 00:50:55,970 >> -Det er riktig. 1144 00:50:55,970 --> 00:50:58,100 Opprinnelige pekere ikke peke på noe. 1145 00:50:58,100 --> 00:51:00,950 De tingene de peker på er kalt pointees og sette dem opp 1146 00:51:00,950 --> 00:51:02,330 er et separat trinn. 1147 00:51:02,330 --> 00:51:03,210 >> -Å, Høyre, høyre. 1148 00:51:03,210 --> 00:51:03,940 Jeg visste det. 1149 00:51:03,940 --> 00:51:05,730 De pointees er atskilt. 1150 00:51:05,730 --> 00:51:08,310 Så hvordan bevilge du en pointee? 1151 00:51:08,310 --> 00:51:11,960 >> -OK, Vel dette kode allokerer et nytt heltall pointee, 1152 00:51:11,960 --> 00:51:15,050 og denne delen sett x å peke på det. 1153 00:51:15,050 --> 00:51:16,240 >> -Hei, Ser det bedre. 1154 00:51:16,240 --> 00:51:17,743 Så gjør det ikke noe. 1155 00:51:17,743 --> 00:51:23,580 >> -OK, Vil jeg dereference pekeren x til lagre nummeret 42 i sin pointee. 1156 00:51:23,580 --> 00:51:27,130 For dette trikset, jeg trenger min tryllestav av dereferencing. 1157 00:51:27,130 --> 00:51:30,200 >> -Din Tryllestav av dereferencing? 1158 00:51:30,200 --> 00:51:32,310 Uh,, det er så stor. 1159 00:51:32,310 --> 00:51:34,270 >> -Dette Er hva koden ser ut. 1160 00:51:34,270 --> 00:51:35,970 Jeg skal bare sette opp antall og-- 1161 00:51:35,970 --> 00:51:37,070 >> [POP SOUND] 1162 00:51:37,070 --> 00:51:39,140 >> -Hei, Se der det går. 1163 00:51:39,140 --> 00:51:43,980 Så, gjør en deferanseoperasjon på x følger pilen for å få tilgang til sin pointee. 1164 00:51:43,980 --> 00:51:46,150 I dette tilfellet, for å lagre 42 i der. 1165 00:51:46,150 --> 00:51:50,700 Hei, prøve å bruke den til å lagre nummeret 13 gjennom den andre markøren, y. 1166 00:51:50,700 --> 00:51:51,840 >> -OK. 1167 00:51:51,840 --> 00:51:56,270 Jeg vil bare gå over her til y, og få nummer 13 satt opp. 1168 00:51:56,270 --> 00:52:00,380 Og deretter ta wand av dereferencing og just-- 1169 00:52:00,380 --> 00:52:01,646 >> [Alarmlyd] 1170 00:52:01,646 --> 00:52:04,080 >> -Å, Hei det ikke fungerte. 1171 00:52:04,080 --> 00:52:06,470 Si, eh, Binky, gjør jeg ikke tror dereferencing 1172 00:52:06,470 --> 00:52:10,850 y er en god idé, fordi innstillingen opp pointee er et separat trinn. 1173 00:52:10,850 --> 00:52:12,480 Og jeg tror ikke vi noen gang gjorde det. 1174 00:52:12,480 --> 00:52:14,620 >> -hmm, Godt poeng. 1175 00:52:14,620 --> 00:52:19,810 >> -Ja, Bevilget vi pekeren, y, men vi aldri sett den til å peke på en pointee. 1176 00:52:19,810 --> 00:52:21,590 >> -hmm, Veldig observant. 1177 00:52:21,590 --> 00:52:23,215 -Hei, Du ser bra der, Binky. 1178 00:52:23,215 --> 00:52:26,390 Kan du fikse det slik at y-punkter til samme pointee som x. 1179 00:52:26,390 --> 00:52:29,290 >> -Sure, Jeg bruker min tryllestav av pekeren oppdrag. 1180 00:52:29,290 --> 00:52:31,970 >> -Er Det kommer til å bli en Problemet, som før? 1181 00:52:31,970 --> 00:52:33,790 >> -Nei, Dette betyr ikke berøre pointees. 1182 00:52:33,790 --> 00:52:35,840 Det endrer bare én pekeren å peke på den samme thing-- 1183 00:52:35,840 --> 00:52:36,465 >> [Hvesing] 1184 00:52:36,465 --> 00:52:37,450 --as annen. 1185 00:52:37,450 --> 00:52:38,440 >> -Oh jeg skjønner. 1186 00:52:38,440 --> 00:52:41,200 Nå y peker på samme sted som x. 1187 00:52:41,200 --> 00:52:42,950 Så, vent, nå y er 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 prøve staven av dereferencing igjen for å sende 13 over. 1190 00:52:47,779 --> 00:52:51,110 >> -Å, OK, her går. 1191 00:52:51,110 --> 00:52:52,330 >> -Hei, Se på det. 1192 00:52:52,330 --> 00:52:53,570 Nå dereferencing fungerer på y. 1193 00:52:53,570 --> 00:52:57,900 Og fordi de pekere deler at man pointee, de begge se 13. 1194 00:52:57,900 --> 00:52:59,952 >> -Ja, Deling, uh, uansett. 1195 00:52:59,952 --> 00:53:01,535 Så, skal vi bytte plass nå? 1196 00:53:01,535 --> 00:53:03,730 >> -Å, Ser vi ikke mer tid. 1197 00:53:03,730 --> 00:53:04,660 >> -But-- 1198 00:53:04,660 --> 00:53:06,520 >> -Bare Husk de tre pekeren regler. 1199 00:53:06,520 --> 00:53:09,550 Nummer 1, den grunnleggende struktur er at du har en peker, 1200 00:53:09,550 --> 00:53:11,630 og den peker over til en pointee. 1201 00:53:11,630 --> 00:53:13,740 Men pekeren og pointee er atskilt. 1202 00:53:13,740 --> 00:53:15,620 Og den vanligste feilen er å sette opp en peker 1203 00:53:15,620 --> 00:53:18,000 men å glemme å gi den en pointee. 1204 00:53:18,000 --> 00:53:21,170 >> Nummer to, peker dereferencing starter på pekeren 1205 00:53:21,170 --> 00:53:24,020 og følger sin pil løpet å få tilgang til sin pointee. 1206 00:53:24,020 --> 00:53:27,815 Som vi alle vet, dette fungerer bare hvis det er en pointee, hvilken type får tilbake 1207 00:53:27,815 --> 00:53:29,260 til regel nummer en. 1208 00:53:29,260 --> 00:53:31,990 >> Nummer 3, peker Oppdraget tar ett pekeren 1209 00:53:31,990 --> 00:53:35,330 og endrer det til å peke på samme pointee som en annen pekeren. 1210 00:53:35,330 --> 00:53:37,150 Så etter oppdraget, de to pekere 1211 00:53:37,150 --> 00:53:40,927 vil peke på samme pointee, noen ganger som kalles deling. 1212 00:53:40,927 --> 00:53:42,510 Og det er alt som skal til, egentlig. 1213 00:53:42,510 --> 00:53:43,130 Bye-bye nå. 1214 00:53:43,130 --> 00:53:43,475 >> [END PLAYBACK] 1215 00:53:43,475 --> 00:53:44,830 >> DAVID J. MALAN: Det er det for CS50. 1216 00:53:44,830 --> 00:53:46,246 Takk til professor Nick Parlante. 1217 00:53:46,246 --> 00:53:47,730 Vi sees neste uke. 1218 00:53:47,730 --> 00:53:51,706 1219 00:53:51,706 --> 00:53:56,435 >> [Elektronisk musikk SPILLE] 1220 00:53:56,435 --> 00:57:22,775