1 00:00:00,000 --> 00:00:03,395 >> [Musik spiller] 2 00:00:03,395 --> 00:00:11,031 3 00:00:11,031 --> 00:00:13,280 DAVID J. MALAN: Dette er ligesom en freshman seminar i dag. 4 00:00:13,280 --> 00:00:14,060 OK. 5 00:00:14,060 --> 00:00:15,024 Så meget regnfulde ud. 6 00:00:15,024 --> 00:00:17,690 Denne tendens til at ske om onsdagen, men så meget desto mere mulighed 7 00:00:17,690 --> 00:00:18,700 for spørgsmål i dag. 8 00:00:18,700 --> 00:00:22,210 Så lad os starte faktisk med filmen på bare et øjeblik. 9 00:00:22,210 --> 00:00:24,560 Men vi starter prægtigt som altid. 10 00:00:24,560 --> 00:00:28,000 >> Dette er CS50, og dette er slutningen af ​​ugen 4. 11 00:00:28,000 --> 00:00:30,820 Så hvis du nogensinde har set TV eller en film, hvori 12 00:00:30,820 --> 00:00:34,690 der er nogle computer eksperter og politiet, eller FBI, eller nogle agentur 13 00:00:34,690 --> 00:00:36,930 forsøger at fange nogle modstander, ja, du har 14 00:00:36,930 --> 00:00:40,850 sikkert hørt udtrykket "forbedre" hvorved der tekniker eller anden måde 15 00:00:40,850 --> 00:00:44,750 magisk zoomer i uendeligt langt for at se de kriminelle 16 00:00:44,750 --> 00:00:48,640 identitet eller nummerpladen i selv de glitre af et spejl 17 00:00:48,640 --> 00:00:50,390 eller glimt af en persons øjne. 18 00:00:50,390 --> 00:00:55,196 Så ja, lad os tage et kig på et par sådanne scener fra Hollywood. 19 00:00:55,196 --> 00:00:55,862 [VIDEO PLAYBACK] 20 00:00:55,862 --> 00:00:59,243 -OK, Lad os nu få et godt kig på dig. 21 00:00:59,243 --> 00:01:06,488 22 00:01:06,488 --> 00:01:07,415 >> -Hold det. 23 00:01:07,415 --> 00:01:08,267 Kør det tilbage. 24 00:01:08,267 --> 00:01:09,121 >> -Vent et minut. 25 00:01:09,121 --> 00:01:11,300 Gå til højre. 26 00:01:11,300 --> 00:01:12,209 >> -Der, Fryse det. 27 00:01:12,209 --> 00:01:12,750 -Fuld skærm. 28 00:01:12,750 --> 00:01:13,558 -OK, Fryse det. 29 00:01:13,558 --> 00:01:14,820 Stramme op op på dette, vil du? 30 00:01:14,820 --> 00:01:16,530 -Vector Ind på at fyr af baghjulet. 31 00:01:16,530 --> 00:01:19,400 -Zoom I lige her på dette sted. 32 00:01:19,400 --> 00:01:22,846 -Med Det rigtige udstyr, billedet kan blive udvidet og skærpet. 33 00:01:22,846 --> 00:01:24,065 -Hvad 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 at op nogen? 36 00:01:26,860 --> 00:01:27,890 -Jeg ved ikke. 37 00:01:27,890 --> 00:01:29,050 Lad os styrke det. 38 00:01:29,050 --> 00:01:31,575 >> -Enhance Afsnit A6. 39 00:01:31,575 --> 00:01:33,642 >> -I Forbedret detaljen, og-- Jeg tror, ​​der er 40 00:01:33,642 --> 00:01:35,433 nok til at forbedre, frigive den til min skærm. 41 00:01:35,433 --> 00:01:37,080 -Jeg Forbedret refleksion i hendes øjne. 42 00:01:37,080 --> 00:01:38,830 >> -Lad Os køre dette gennem video ekstraudstyr. 43 00:01:38,830 --> 00:01:40,100 -Edgar, Kan du forbedre dette? 44 00:01:40,100 --> 00:01:41,875 >> -Hæng i. 45 00:01:41,875 --> 00:01:44,010 >> -Jeg Har arbejdet på denne refleksion. 46 00:01:44,010 --> 00:01:44,995 >> -Someone Refleksion. 47 00:01:44,995 --> 00:01:45,495 -Reflection. 48 00:01:45,495 --> 00:01:47,399 -Der Er en afspejling af mandens ansigt. 49 00:01:47,399 --> 00:01:48,065 -Den Refleksion. 50 00:01:48,065 --> 00:01:48,981 -Der Er en refleksion. 51 00:01:48,981 --> 00:01:50,600 -Zoom Ind på spejlet. 52 00:01:50,600 --> 00:01:52,712 -Du Kan se en refleksion. 53 00:01:52,712 --> 00:01:54,350 -Kan Du styrke billedet herfra? 54 00:01:54,350 --> 00:01:55,370 -Kan Du øge ham lige 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 styrke denne? 58 00:01:57,870 --> 00:01:58,717 >> -Kan Du forbedre det? 59 00:01:58,717 --> 00:02:00,050 -Hold på en anden, vil jeg forbedre. 60 00:02:00,050 --> 00:02:00,924 -Zoom I på døren. 61 00:02:00,924 --> 00:02:01,700 -Times 10. 62 00:02:01,700 --> 00:02:02,586 -Zoom. 63 00:02:02,586 --> 00:02:03,490 -Flytte ind. 64 00:02:03,490 --> 00:02:03,990 -Mere. 65 00:02:03,990 --> 00:02:04,690 -Wait, Stop. 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 Os 75 grader omkring den lodrette, tak. 69 00:02:09,460 --> 00:02:10,962 -Stop. 70 00:02:10,962 --> 00:02:14,040 Gå tilbage til den del om døren, igen. 71 00:02:14,040 --> 00:02:15,860 >> -Got Et billede forstærker, der kan bitmap? 72 00:02:15,860 --> 00:02:18,776 >> -Hey, Måske vi kan bruge Pradeep Sen metode til at se ind i vinduerne. 73 00:02:18,776 --> 00:02:20,372 -Denne Software er state of the art. 74 00:02:20,372 --> 00:02:21,845 >> -Den Egenværdi er slukket. 75 00:02:21,845 --> 00:02:24,300 >> -Med Højre kombination af algorithm-- 76 00:02:24,300 --> 00:02:26,755 >> -Han Er taget elimination algoritmer til det næste niveau, 77 00:02:26,755 --> 00:02:28,730 og jeg kan bruge dem til at forbedre dette fotografi. 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 styrke. 83 00:02:34,960 --> 00:02:37,180 >> [END AFSPIL] 84 00:02:37,180 --> 00:02:41,160 >> DAVID J. MALAN: Okay, så alle disse er faktisk ord. 85 00:02:41,160 --> 00:02:44,450 De er bare hængte sammen i en måde, der er faktisk ikke fornuftigt. 86 00:02:44,450 --> 00:02:48,400 Og i virkeligheden, CS50 og kurser som det har tendens til at ødelægge en masse tv og film 87 00:02:48,400 --> 00:02:48,900 for dig. 88 00:02:48,900 --> 00:02:52,330 Fordi når disse edb-eksperter er raslende off vilkår og siger 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 et antal andre faktisk mere tekniske termer, 91 00:02:59,572 --> 00:03:02,030 de er virkelig bare snor ord sammen alt for ofte. 92 00:03:02,030 --> 00:03:05,020 Er det en af ​​vores forhåbninger er, som en bivirkning af at tage kurser 93 00:03:05,020 --> 00:03:08,245 som denne, mere vil folk i verden faktisk være i stand til at veje i 94 00:03:08,245 --> 00:03:12,040 og bare nogensinde så lidt indflydelse på kvaliteten og nøjagtigheden af ​​disse film? 95 00:03:12,040 --> 00:03:14,350 >> Faktisk, lad os tage et kig på virkeligheden. 96 00:03:14,350 --> 00:03:18,070 Så her er personale foto af Mary, en af ​​vores undervisning stipendiater. 97 00:03:18,070 --> 00:03:20,050 Og vel er hun mistænkt for noget. 98 00:03:20,050 --> 00:03:23,730 Og alligevel er der et glimt af nogle stykke bevismateriale i øjet, 99 00:03:23,730 --> 00:03:25,480 eller refleksion af hendes briller. 100 00:03:25,480 --> 00:03:30,760 Tja, hvis vi gør præcis som filmene foreslå, hvor vi zoome og "styrke", 101 00:03:30,760 --> 00:03:34,080 dette er, hvor meget information er i Marys ansigt 102 00:03:34,080 --> 00:03:36,795 når du tager et billede med den oprindelige opløsning. 103 00:03:36,795 --> 00:03:39,120 >> Og i virkeligheden, kan du se disse prikker. 104 00:03:39,120 --> 00:03:41,900 Og disse er hvad er kaldes pixel, P-I-X-E-L-S, 105 00:03:41,900 --> 00:03:45,740 som er lige en firkant typisk der er en prik, der komponerer et billede. 106 00:03:45,740 --> 00:03:49,200 Og tilbage i dag, og faktisk endnu i dag med nogle af nutidens LED-TV 107 00:03:49,200 --> 00:03:51,950 eller LCD-tv, hvis du har fået en i dit værelse eller derhjemme, 108 00:03:51,950 --> 00:03:55,100 hvis du går op super tæt på det, og især hvis det er en lidt ældre TV, 109 00:03:55,100 --> 00:03:58,760 kan du sikkert selv se disse prikker og det er hvad komponere et billede. 110 00:03:58,760 --> 00:04:00,980 >> Og der er ikke mere information end dette. 111 00:04:00,980 --> 00:04:05,400 Vi kunne "forbedre", i den forstand, udjævning over tingene og sortering af 112 00:04:05,400 --> 00:04:09,040 udlede slags, hvad slags farve skal være ved siden af ​​Marys øjne 113 00:04:09,040 --> 00:04:10,910 så det er faktisk ikke så pixeleret. 114 00:04:10,910 --> 00:04:14,510 Men hvis jeg bliver ved at zoome ind, der er den dårlige fyr i hendes øje. 115 00:04:14,510 --> 00:04:16,600 Ligesom det er alle de oplysninger, vi har. 116 00:04:16,600 --> 00:04:18,920 Du kan ikke oprette oplysninger ud af ingenting. 117 00:04:18,920 --> 00:04:20,790 Der er kun en begrænset antallet af bits der. 118 00:04:20,790 --> 00:04:22,873 >> Så i Problem Set 4, hvor du har en mulighed 119 00:04:22,873 --> 00:04:24,580 at lege med dette slags verden. 120 00:04:24,580 --> 00:04:27,610 I Problem Set 4, vil du udforske verden af ​​grafik og retsvidenskab, 121 00:04:27,610 --> 00:04:30,870 og faktisk skrive kode der genvinder tabt billeder. 122 00:04:30,870 --> 00:04:33,510 Du vil skrive kode, der manipulerer eksisterende billeder 123 00:04:33,510 --> 00:04:36,120 og i sidste ende forstå, hvad der er foregår under kølerhjelmen. 124 00:04:36,120 --> 00:04:38,540 >> Og det viser sig, det er faktisk ikke alt, kompliceret. 125 00:04:38,540 --> 00:04:41,320 For eksempel, hvis vi ønskede at repræsenterer et smilende ansigt, hvor 126 00:04:41,320 --> 00:04:44,160 med disse sorte pixels, eller disse sorte prikker, 127 00:04:44,160 --> 00:04:47,230 godt, vi kunne simpelthen repræsentere dem som i sandhed en bitmap. 128 00:04:47,230 --> 00:04:50,040 Og hvis du nogensinde havde hørt, at ekspression bitmap, måske 129 00:04:50,040 --> 00:04:52,330 det nu begynder at foretage en lidt mere mening i dag. 130 00:04:52,330 --> 00:04:53,580 >> Vi ved allerede, hvad en bit 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 kort er bare noget som et stykke papir 133 00:04:56,201 --> 00:04:59,180 der giver dig retninger og har måske et gitter af x- og y-koordinater. 134 00:04:59,180 --> 00:05:00,540 Så her er en bitmap. 135 00:05:00,540 --> 00:05:03,680 Det er et kort over bits hvorved en 1 tilsyneladende 136 00:05:03,680 --> 00:05:07,857 kommer til at udgøre en hvid pixel og en 0 vil repræsentere en sort pixel. 137 00:05:07,857 --> 00:05:09,440 Men vi kunne helt sikkert vende det rundt. 138 00:05:09,440 --> 00:05:11,648 Det er faktisk ligegyldigt, så længe vi er konsekvente. 139 00:05:11,648 --> 00:05:15,570 Og her er, hvordan man i binary-- inde af en computers hukommelse, eller endda inde 140 00:05:15,570 --> 00:05:18,160 af en fil på din harddisk drive-- kunne du gemme 141 00:05:18,160 --> 00:05:20,240 den enkleste af smiley ansigtsbilleder. 142 00:05:20,240 --> 00:05:23,990 Men hvad skal vi naturligvis mangler i dette billede? 143 00:05:23,990 --> 00:05:24,610 Farve, ikke? 144 00:05:24,610 --> 00:05:28,220 Det er et oplagt næste skridt eller enhancement at forbedre denne med farve. 145 00:05:28,220 --> 00:05:32,230 Så desværre med blot et enkelt bit, 0 eller 1, kunne vi repræsentere farve. 146 00:05:32,230 --> 00:05:36,100 Det kunne være rød eller blå, eller sort eller hvid, eller grøn, eller pink, 147 00:05:36,100 --> 00:05:37,420 eller eventuelle par af farver. 148 00:05:37,420 --> 00:05:40,860 Men for nemheds skyld, vi får bare antage sort og hvid. 149 00:05:40,860 --> 00:05:45,930 >> Så hvad logisk har vi brug for, hvis vi ønsker at gennemføre farve i et billede? 150 00:05:45,930 --> 00:05:49,080 Hvad skal vi gøre? 151 00:05:49,080 --> 00:05:51,900 Ligesom hvis den begrænsende faktor her er, at man lidt med du kan kun 152 00:05:51,900 --> 00:05:55,977 repræsenterer to stater, 0 eller 1, hvid eller sort, hvad vil du gøre? 153 00:05:55,977 --> 00:05:56,810 Publikum: Flere oplysninger. 154 00:05:56,810 --> 00:05:58,813 DAVID J. MALAN: Flere bits, yeah flere data, flere bits. 155 00:05:58,813 --> 00:06:01,440 Og, ja, det er præcis, hvordan farvebilleder er repræsenteret. 156 00:06:01,440 --> 00:06:05,120 I stedet for at bruge en enkelt bit, et 0 eller 1 for hver pixel, hver prik, 157 00:06:05,120 --> 00:06:06,170 du bare bruge flere. 158 00:06:06,170 --> 00:06:09,660 Måske bruge 8, måske, mere almindeligt bruge 24, og ja, i Problem Set 159 00:06:09,660 --> 00:06:13,300 4, vil du spille med en fil format, der bruger 24 bit typisk. 160 00:06:13,300 --> 00:06:15,430 >> Men de fleste af jer er formentlig fortrolig med JPEG. 161 00:06:15,430 --> 00:06:17,460 Hvis du nogensinde har taget et foto på din telefon, 162 00:06:17,460 --> 00:06:20,360 eller uploades eller set noget på Facebook eller Flickr, et vilkårligt antal 163 00:06:20,360 --> 00:06:24,882 af foto-baserede hjemmesider, du har sandsynligvis set et JPEG-billede før. 164 00:06:24,882 --> 00:06:27,840 Og det viser sig, det er filen format vi vil bruge i pset 4, 165 00:06:27,840 --> 00:06:30,340 hvorved du kommer til at nødt til at gendanne billeder 166 00:06:30,340 --> 00:06:35,160 at jeg ved et uheld har slettet fra en beskadiget hukommelseskort 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 sig, at selv om JPEG er temmelig sophisticated-- 169 00:06:38,490 --> 00:06:40,906 det er meget mere sofistikeret end de sorte og hvide prikker 170 00:06:40,906 --> 00:06:44,480 vi så et øjeblik siden, fordi der er faktisk fancy algoritmer, 171 00:06:44,480 --> 00:06:47,410 anvendes til at komprimere en JPEG, så at du kan have en virkelig rart, 172 00:06:47,410 --> 00:06:49,832 kvalitet billede, men ved hjælp af relativt få bit. 173 00:06:49,832 --> 00:06:51,790 Og vi vil komme tilbage til komprimering inden længe. 174 00:06:51,790 --> 00:06:56,280 Det viser sig, at den første tre bytes i et JPEG image-- 175 00:06:56,280 --> 00:07:02,750 uanset hvad du har taget et fotografi of-- er værdierne 255, 216, 255. 176 00:07:02,750 --> 00:07:05,990 >> Med andre ord, hvis du bare se mønster af bits, 177 00:07:05,990 --> 00:07:09,180 her repræsenteret som tre byte eller 24 bit i alt, 178 00:07:09,180 --> 00:07:13,810 med stor sandsynlighed kan udlede, at du kigger på det på denne første tre 179 00:07:13,810 --> 00:07:15,230 bytes af en JPEG. 180 00:07:15,230 --> 00:07:18,040 Og det er hvad der er kendt som undertegnelsen af ​​en JPEG. 181 00:07:18,040 --> 00:07:20,540 En masse af filformater derude en tendens til at starte 182 00:07:20,540 --> 00:07:23,735 med visse mønstre af 0'er og 1-taller, så Windows og Mac OS, og iOS, 183 00:07:23,735 --> 00:07:28,272 og Android ved, hvilken slags fil, de er, i tillæg til den såkaldte fil 184 00:07:28,272 --> 00:07:29,730 udvidelse, der en masse filer har. 185 00:07:29,730 --> 00:07:32,590 Hvis du har .jpg, det er endnu et fingerpeg til computeren. 186 00:07:32,590 --> 00:07:35,310 >> Så lad os nu se på dette lidt mere teknisk. 187 00:07:35,310 --> 00:07:37,390 Vi kender decimal Systemet er 0 til 9. 188 00:07:37,390 --> 00:07:38,740 Vi ved binære er 0 og 1. 189 00:07:38,740 --> 00:07:41,842 Og hvis du tænker tilbage på pset 0, vi havde du kæmper med, 190 00:07:41,842 --> 00:07:43,800 for en lille smule, noget kaldet hexadecimal, 191 00:07:43,800 --> 00:07:47,320 hvor du har 16 cifre, i stedet for 10 eller i stedet for 2. 192 00:07:47,320 --> 00:07:50,405 Og disse tal, efter sædvane, er 0 til 9 og derefter en 193 00:07:50,405 --> 00:07:55,040 gennem f, hvor f repræsenterer det decimaltal, ligesom en hurtig fornuft 194 00:07:55,040 --> 00:07:56,640 tjek? 195 00:07:56,640 --> 00:07:57,610 Så 15. 196 00:07:57,610 --> 00:08:01,390 Og en skal repræsentere 10, blot ved karakteren af ​​den bestilling, som jeg har givet. 197 00:08:01,390 --> 00:08:04,350 Det er bare en vilkårlig konvention, men det er helt standard. 198 00:08:04,350 --> 00:08:06,870 >> Så hvis vi ser på dette mønster af tre bytes-- lad os 199 00:08:06,870 --> 00:08:09,620 bare begynde at se på det i overensstemmelse med, hvordan 200 00:08:09,620 --> 00:08:12,450 dataloger generelt se på og tænke over filer. 201 00:08:12,450 --> 00:08:15,580 Du kan helt sikkert tænke over filer i 0'erne, og 1-taller og decimal, 202 00:08:15,580 --> 00:08:19,340 men i virkeligheden, er vi tilbøjelige til at bruge binær eller mere typisk hexadecimal-- 203 00:08:19,340 --> 00:08:20,760 tilbage fra pset 0. 204 00:08:20,760 --> 00:08:25,857 Så lad mig foreslå, at 255, 216, og 255 er netop disse mønstre af 0'er og 1-taller. 205 00:08:25,857 --> 00:08:28,440 Og du kan tjekke dette, hvis du ønsker at gøre det math fra uge 0. 206 00:08:28,440 --> 00:08:30,810 Men, for nu, bare antage at dette faktisk er korrekt. 207 00:08:30,810 --> 00:08:33,850 Jeg har lige omskrevet tre decimal numre som tre binære værdier. 208 00:08:33,850 --> 00:08:36,100 Nu, hvad jeg har tænkt mig at gøre, er blot tilføje nogle hvide rum, 209 00:08:36,100 --> 00:08:37,266 bare for læsbarheden skyld. 210 00:08:37,266 --> 00:08:39,940 Og varsel, jeg bare at flytte tingene fra hinanden. 211 00:08:39,940 --> 00:08:43,090 Så før, efter, før, efter. 212 00:08:43,090 --> 00:08:46,180 Jeg gør intet interessant andre end blot at sprede tingene ud, så 213 00:08:46,180 --> 00:08:50,380 meddelelsen hvert sæt af otte bits er nu to sæt af fire bits. 214 00:08:50,380 --> 00:08:54,920 Dette er nyttigt, fordi hexadecimal er særlig mode 215 00:08:54,920 --> 00:09:00,930 fordi hver hexadecimalt ciffer 0 til f, eller mere specifikt fra 0 til 15, 216 00:09:00,930 --> 00:09:03,430 kan repræsenteres med præcis fire bits. 217 00:09:03,430 --> 00:09:07,960 Med andre ord, i hexadecimal hvis du ønsker at repræsentere 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 at repræsentere 15, det er 1111, hvilket er fire bit. 220 00:09:13,997 --> 00:09:16,080 Og hvis du gør det math, hvis dette er dem sted, 221 00:09:16,080 --> 00:09:18,210 dette er 16s sted, der kommer til at give du-- 222 00:09:18,210 --> 00:09:19,960 snarere, at der foregår at-- undskyld, i binær, 223 00:09:19,960 --> 00:09:23,660 der kommer til at give dig 15, dem sted, Toere sted, fours og ottere sted. 224 00:09:23,660 --> 00:09:26,821 Så lad mig foreslå, at der sæt af fire bit til venstre 225 00:09:26,821 --> 00:09:28,070 er, hvad vi vil kalde f. 226 00:09:28,070 --> 00:09:30,110 Det er det største antal, du kan repræsentere med fire bits. 227 00:09:30,110 --> 00:09:33,300 Og vi allerede kender fra hexadecimal, f er den største ciffer i hexadecimal. 228 00:09:33,300 --> 00:09:36,020 Vi har fået en anden f der, to mere derovre. 229 00:09:36,020 --> 00:09:38,980 Og for nu, bare tage på tro at jeg har gjort det math ret 230 00:09:38,980 --> 00:09:41,890 og at den venstre halvdel af disse bits, 1101, 231 00:09:41,890 --> 00:09:43,980 er det samme som d i hexadecimal. 232 00:09:43,980 --> 00:09:46,490 Og højre, 1000, er kun 8. 233 00:09:46,490 --> 00:09:48,140 >> Og at ens let at se, ikke? 234 00:09:48,140 --> 00:09:51,670 Den 8 represents-- er rigtigt nedenunder, ottere sted. 235 00:09:51,670 --> 00:09:56,040 Så vi har en i ottere kolonnen og intet i fours, toere eller dem. 236 00:09:56,040 --> 00:09:59,830 Så nu mere konventionelt, mennesker har en tendens til at skrive hexadecimale cifre som denne, 237 00:09:59,830 --> 00:10:03,000 du bare klemme dem sammen, og du derefter præfiks dem med 0x. 238 00:10:03,000 --> 00:10:05,920 Det betyder intet andet end en visuel fingerpeg til en human-- 239 00:10:05,920 --> 00:10:10,350 her kommer en hexadecimal value-- fordi det måske ikke ellers være indlysende. 240 00:10:10,350 --> 00:10:13,629 >> Hvilket vil sige, i sidste ende, at mønstret af nuller og ettaller, 241 00:10:13,629 --> 00:10:16,170 eller mønstret af hexadecimale cifre tilsvarende, at du er 242 00:10:16,170 --> 00:10:18,990 kommer til at begynde at lede efter i Problem Set 4 er denne-- 243 00:10:18,990 --> 00:10:22,120 Og problemet Set 4 spec vil gå dig gennem denne mere detail-- 244 00:10:22,120 --> 00:10:25,344 men indse som en slags mystisk som dette ser måske ved første øjekast, 245 00:10:25,344 --> 00:10:27,010 du vil begynde at se det en masse. 246 00:10:27,010 --> 00:10:30,320 Og faktisk selv i GDB, den debugger vi indført på mandag 247 00:10:30,320 --> 00:10:35,440 og Dan introducerer i pset 3, går til ofte vise dig hexadecimale værdier 248 00:10:35,440 --> 00:10:39,910 bare fordi de har tendens til at være mere konventionel end decimal eller binær 249 00:10:39,910 --> 00:10:41,157 i verden af ​​computere. 250 00:10:41,157 --> 00:10:42,490 Lad os nu sætte dette ind i en sammenhæng. 251 00:10:42,490 --> 00:10:48,040 Mange af jer måske huske dette billede her, som kom fra hvad? 252 00:10:48,040 --> 00:10:51,240 Vista, så selv tidligere end at Windows XP gjorde dette debut. 253 00:10:51,240 --> 00:10:52,620 Så dette er et smukt landskab. 254 00:10:52,620 --> 00:10:55,940 Og i virkeligheden, hvis du stikke rundt online-- Jeg synes det er en Wikipedia-artikel, 255 00:10:55,940 --> 00:11:00,110 hvor en person meget forbavsende gik ud fandt denne sted i verden oprettet 256 00:11:00,110 --> 00:11:02,240 hans eller hendes kamera i netop den rigtige sted-- 257 00:11:02,240 --> 00:11:06,510 og det i dag ser like-- men Det er præcis den samme indstilling. 258 00:11:06,510 --> 00:11:10,060 Dette billede er dog, i en fil format kaldet bitmap, b-m-s. 259 00:11:10,060 --> 00:11:12,910 Og vi kommer til at tage en super hurtigt blik på, hvad det betyder. 260 00:11:12,910 --> 00:11:17,770 >> Men bitmap er bare en anden måde at repræsenterer billeder stadig bruger pixel 261 00:11:17,770 --> 00:11:19,580 i 0'er og 1-taller, i sidste ende. 262 00:11:19,580 --> 00:11:23,282 Men på hurtigt blik, har det en mere interessant signatur 263 00:11:23,282 --> 00:11:24,490 ved begyndelsen af ​​filen. 264 00:11:24,490 --> 00:11:26,670 Det er ikke kun tre bytes, snarere er der 265 00:11:26,670 --> 00:11:30,770 en hel masse mønstre af bytes der har forudbestemt mening. 266 00:11:30,770 --> 00:11:34,490 For eksempel, et sted i første par bytes af en bitmap billede 267 00:11:34,490 --> 00:11:37,440 bliver størrelsen af billede, bredden af ​​billedet, 268 00:11:37,440 --> 00:11:40,390 højden af ​​billedet, så nyttige metadata, hvis du vil. 269 00:11:40,390 --> 00:11:43,940 Nyttige oplysninger, som Photoshop eller noget grafik programmerer du bruger 270 00:11:43,940 --> 00:11:45,180 kan faktisk bekymrer sig om. 271 00:11:45,180 --> 00:11:47,170 >> Så mere om dette i Problem Set 4, men dette 272 00:11:47,170 --> 00:11:49,220 er kun at sige, at ved slutningen af ​​dagen 273 00:11:49,220 --> 00:11:52,390 alle de filformater du har brugt for years-- Microsoft Word-filer, 274 00:11:52,390 --> 00:11:55,820 Numbers filer, Excel-filer, vilkårligt antal filformater 275 00:11:55,820 --> 00:11:57,770 at kunne have en vis kendt filtype 276 00:11:57,770 --> 00:12:00,130 er blot 0'er og 1'ere nedenunder hætten. 277 00:12:00,130 --> 00:12:02,970 Og mennesker har besluttet hvad konventionerne er, 278 00:12:02,970 --> 00:12:08,340 hvilke mønstre af 0'er og 1'ere repræsenterer en Word-fil versus en Excel-fil, 279 00:12:08,340 --> 00:12:10,322 versus en række andre filformater. 280 00:12:10,322 --> 00:12:12,780 Så i pset 4, vil du have en mulighed for at spille med. 281 00:12:12,780 --> 00:12:14,405 >> Men det mener, hvad gør for at have en struct. 282 00:12:14,405 --> 00:12:18,012 Dette er faktisk en dejlig segue nu i C, som kun har et par 283 00:12:18,012 --> 00:12:20,220 af ekstra funktioner, Vi har ikke set på endnu. 284 00:12:20,220 --> 00:12:24,230 Det er en temmelig lille sprog, og en af de gode funktioner om C er en struct. 285 00:12:24,230 --> 00:12:27,300 For eksempel, hvis du ønskede at represent-- lad os 286 00:12:27,300 --> 00:12:33,690 sige, at du ønskede at have en variabel, repræsenterer en studerende i nogle program. 287 00:12:33,690 --> 00:12:37,330 Måske var du skrive et kursus registrering program eller kerne shopping 288 00:12:37,330 --> 00:12:38,870 værktøj, eller noget lignende. 289 00:12:38,870 --> 00:12:42,922 Hvad er stykker af data vedrørende til en studerende, der kommer til at tænke på? 290 00:12:42,922 --> 00:12:44,880 Ligesom en studerende er repræsenteret med hvilke værdier? 291 00:12:44,880 --> 00:12:45,732 Ja? 292 00:12:45,732 --> 00:12:46,940 Du har et navn som studerende. 293 00:12:46,940 --> 00:12:48,900 Hvad betyder en typisk elev have? 294 00:12:48,900 --> 00:12:49,320 >> PUBLIKUM: [uhørligt] 295 00:12:49,320 --> 00:12:50,200 >> DAVID J. MALAN: Så, undskyld. 296 00:12:50,200 --> 00:12:50,660 >> PUBLIKUM: Alder. 297 00:12:50,660 --> 00:12:52,980 >> DAVID J. MALAN: En alder eller fødselsdag ækvivalent, jep. 298 00:12:52,980 --> 00:12:53,557 Hvad ellers? 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, måske et telefonnummer, måske en sovesal, eller hus, 301 00:12:57,460 --> 00:12:58,670 eller college, eller noget lignende. 302 00:12:58,670 --> 00:13:01,820 Ethvert antal stykker af data, du måtte have på din kontaktliste 303 00:13:01,820 --> 00:13:03,890 er det måske definere en elev. 304 00:13:03,890 --> 00:13:08,490 Så hvis vi ønskede at gøre dette, i kode, vi kan gøre noget simpelt som dette. 305 00:13:08,490 --> 00:13:15,670 Vi har måske et program, så har lad os sige, int main (void). 306 00:13:15,670 --> 00:13:18,920 Og hvis jeg ønsker at repræsentere en studerende jeg måtte have, for eksempel, 307 00:13:18,920 --> 00:13:24,330 en streng kaldet navn for denne elev, en streng kaldet sovesal for den studerende, 308 00:13:24,330 --> 00:13:26,900 måske en int kaldes ID for at elev. 309 00:13:26,900 --> 00:13:30,840 Og fordi jeg bruger streng, jeg nødt til at gå tilbage og sætte CS50.h. 310 00:13:30,840 --> 00:13:33,300 Måske jeg vil få brug for stdio.h. 311 00:13:33,300 --> 00:13:38,190 Så lad mig forebyggende gøre dem, og jeg er kommer til at kalde denne student.c for nu 312 00:13:38,190 --> 00:13:40,080 og gemme denne. 313 00:13:40,080 --> 00:13:44,206 >> Og nu kan jeg gøre noget med disse variabler. 314 00:13:44,206 --> 00:13:46,830 Og vi bare at skrive at som en kommentar i pseudokode, 315 00:13:46,830 --> 00:13:48,829 fordi det ikke er interessant hvad vi gør nu. 316 00:13:48,829 --> 00:13:51,242 OK, så dette er et program, en eller anden måde gemmer en studerende. 317 00:13:51,242 --> 00:13:53,450 Hvad ønsker jeg at gøre, hvis jeg ønsker at gemme to studerende? 318 00:13:53,450 --> 00:13:55,991 Så min første indskydelse går at være i orden, vent et minut, 319 00:13:55,991 --> 00:14:01,920 hvis jeg har en anden studerende, hvorfor ikke jeg bare gøre strengnavn 2, snor kollegieværelse 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 gået ad denne vej, før 322 00:14:06,540 --> 00:14:10,890 og hvad var vores løsning på, hvad der synes at være slags en hackish copy paste 323 00:14:10,890 --> 00:14:11,555 job her? 324 00:14:11,555 --> 00:14:12,346 PUBLIKUM: Et array. 325 00:14:12,346 --> 00:14:13,830 DAVID J. MALAN: Ja, vi kunne bruge et array. 326 00:14:13,830 --> 00:14:15,620 Lige denne meget hurtigt bliver uhåndterlig. 327 00:14:15,620 --> 00:14:18,453 Du er nødt til at sortere på vilkårligt begynde at navngive alle disse variabler. 328 00:14:18,453 --> 00:14:22,190 Og du, mennesket, nødt til at holde spore, at OK NAME2 svarer 329 00:14:22,190 --> 00:14:25,060 med dorm2 svarer til ID2. 330 00:14:25,060 --> 00:14:26,200 Det bare bliver noget rod. 331 00:14:26,200 --> 00:14:29,350 Så det er meget nemmere, huske fra et par uger siden, 332 00:14:29,350 --> 00:14:34,300 til bare at skulle kaldes strengnavne og måske give os tre af dem. 333 00:14:34,300 --> 00:14:36,940 Og så måske har vi string sovesale og har 334 00:14:36,940 --> 00:14:41,900 tre af disse, eller med en konstant, int ids og har tre af dem. 335 00:14:41,900 --> 00:14:45,250 Men selv nu det føles lidt sjusket, højre. 336 00:14:45,250 --> 00:14:49,440 Vi taler om studerende og endnu Jeg er virkelig dvæle ved det lave niveau 337 00:14:49,440 --> 00:14:50,470 detaljer gennemførelsen. 338 00:14:50,470 --> 00:14:52,790 Den studerende er et navn og et kollegieværelse og id. 339 00:14:52,790 --> 00:14:59,814 >> Hvorfor kan jeg ikke bare erklære en variabel kaldet studerende og kalder det s. 340 00:14:59,814 --> 00:15:02,230 Og hvis jeg vil have en anden studerende, hvorfor jeg ikke bare kalde det t. 341 00:15:02,230 --> 00:15:05,260 Eller hvis jeg vil have en hel masse af studerende, hvorfor jeg ikke bare 342 00:15:05,260 --> 00:15:09,740 siger jeg har en hel klasse af studerende, og det er tre af dem. 343 00:15:09,740 --> 00:15:12,470 Med andre ord kan hvorfor ikke jeg kommer op med min egen datatype, kaldet 344 00:15:12,470 --> 00:15:15,641 Studerende, inden i hvilken er et navn, er et id, er et kollegieværelse, 345 00:15:15,641 --> 00:15:16,890 er en række andre områder. 346 00:15:16,890 --> 00:15:19,030 Og det viser sig du kan gøre netop dette. 347 00:15:19,030 --> 00:15:21,850 >> Så C har denne funktion, der hedder struct. 348 00:15:21,850 --> 00:15:24,700 Det er et sprog, funktion, giver os mulighed for at gøre netop dette. 349 00:15:24,700 --> 00:15:28,370 Jeg har tænkt mig at gå videre og åbne op structs.h 350 00:15:28,370 --> 00:15:32,299 hvor vi kommer til at se Følgende definition af en studerende. 351 00:15:32,299 --> 00:15:35,215 Det viser sig - og denne ene er endda enklere end den involverer et id 352 00:15:35,215 --> 00:15:36,080 for et øjeblik siden. 353 00:15:36,080 --> 00:15:39,120 Hvis du ønsker at komme med din hjemmelavede datatype, 354 00:15:39,120 --> 00:15:42,750 og foruden int og char og flyde og alle disse andre, der findes, 355 00:15:42,750 --> 00:15:45,810 du kan gøre det ved bogstaveligt skrive typedef struct, 356 00:15:45,810 --> 00:15:47,880 derefter nogle krøllede parenteser, inden i hvilken man 357 00:15:47,880 --> 00:15:51,460 liste over de variabler, du ønsker at associere med denne nye skik data 358 00:15:51,460 --> 00:15:55,670 skriv gerne et navn og en sovesal, og derefter efter de krøllede parenteser 359 00:15:55,670 --> 00:15:57,860 du giver et navn til den nye datatype. 360 00:15:57,860 --> 00:15:59,220 Så for eksempel, elev. 361 00:15:59,220 --> 00:16:03,247 >> Og hvad er nice om dette nu er, at hvis vi ser på den tilsvarende kode, 362 00:16:03,247 --> 00:16:05,080 konventionen, først af alt, er at sætte dette 363 00:16:05,080 --> 00:16:08,230 i en fil kaldet noget dot h, en header fil, som vi ikke har 364 00:16:08,230 --> 00:16:09,780 begyndte at bruge os selv for meget. 365 00:16:09,780 --> 00:16:12,120 Men vi kommer til at starte ved hjælp af ganske lidt nu. 366 00:16:12,120 --> 00:16:18,650 Og hvad vi kan gøre med dette, i sidste ende, i disse få linjer kode 367 00:16:18,650 --> 00:16:22,130 er erklærer præcis det datatype, en studerende. 368 00:16:22,130 --> 00:16:23,230 Og lad os nu bruge den. 369 00:16:23,230 --> 00:16:27,274 >> Jeg har tænkt mig at nu gå ind i en fil kaldet structs1.c. 370 00:16:27,274 --> 00:16:29,440 Og lad os tage et kig på en få karakteristika her. 371 00:16:29,440 --> 00:16:32,250 Så den ting op her er meste velkendt, og vi vil 372 00:16:32,250 --> 00:16:35,040 komme tilbage til hvad der ikke er kender i bare et øjeblik. 373 00:16:35,040 --> 00:16:39,880 Det er naturligvis også min egen header-fil, som er nyt så godt, 374 00:16:39,880 --> 00:16:42,580 bortset pset 3, hvor tilbagekaldelse, har vi helpers.h. 375 00:16:42,580 --> 00:16:45,150 Så du kan huske # include helpers.h. 376 00:16:45,150 --> 00:16:49,381 >> Hvorfor dog bruger jeg citater i stedet for vinklede beslag? 377 00:16:49,381 --> 00:16:50,630 Hvornår skal jeg vælge mellem dem? 378 00:16:50,630 --> 00:16:52,310 Næsten altid jeg synes at bruge vinklede parenteser. 379 00:16:52,310 --> 00:16:55,040 Og så lige pludselig på line seks Jeg bruger dobbelte 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 Ja? 382 00:16:56,700 --> 00:16:57,725 >> PUBLIKUM: [uhørligt] 383 00:16:57,725 --> 00:16:59,350 DAVID J. MALAN: Det er en faktisk, hvad? 384 00:16:59,350 --> 00:17:00,559 PUBLIKUM: Det er i din IDE. 385 00:17:00,559 --> 00:17:02,475 DAVID J. MALAN: Ja, det er i min egentlige IDE. 386 00:17:02,475 --> 00:17:05,690 Og lad os ikke dvæle ved IDE, fordi det er bare et værktøj, som jeg bruger. 387 00:17:05,690 --> 00:17:08,119 Det er i min nuværende bibliotek, specifikt. 388 00:17:08,119 --> 00:17:11,647 Så structs.h er min egen fil ikke installeret i IDE, 389 00:17:11,647 --> 00:17:14,480 i selve operativsystemet, snarere er det i min nuværende mappe. 390 00:17:14,480 --> 00:17:16,910 Så konventionen er, hvis du vil at inkludere din egen header fil, 391 00:17:16,910 --> 00:17:18,200 du bare bruge dobbelte anførselstegn. 392 00:17:18,200 --> 00:17:23,290 >> Hvad skal vi kalde denne ting i linje 8, generelt? 393 00:17:23,290 --> 00:17:25,200 Dette er, hvad? 394 00:17:25,200 --> 00:17:28,220 #define noget. 395 00:17:28,220 --> 00:17:31,040 Dette repræsenterer konstanter, ikke? 396 00:17:31,040 --> 00:17:33,140 Hvis du ønsker at have en værdi i dit program 397 00:17:33,140 --> 00:17:35,110 at du bruger en hel masse gange, er det 398 00:17:35,110 --> 00:17:39,330 god konvention til faktor det ud, erklære den, med hash symbolet 399 00:17:39,330 --> 00:17:43,340 definere, så efter sædvane i alle store bogstaver word-- selvom det ikke er 400 00:17:43,340 --> 00:17:45,320 strengt nødvendigt, men det er menneskeligt konvention 401 00:17:45,320 --> 00:17:47,210 at kapitalisere konstanter så de springe ud 402 00:17:47,210 --> 00:17:50,380 på dig visually-- plads og derefter den værdi, du ønsker at være 403 00:17:50,380 --> 00:17:52,250 svarende til det konstante navn. 404 00:17:52,250 --> 00:17:56,110 Ingen semikolon, men du blot følge dette mønster der. 405 00:17:56,110 --> 00:17:57,770 >> Så hvad gør jeg i denne konkrete kode. 406 00:17:57,770 --> 00:18:00,660 Så lad os tage et kig på hovedprogrammet her. 407 00:18:00,660 --> 00:18:04,080 På linje 12, fordi jeg har inkluderet structs.h, 408 00:18:04,080 --> 00:18:06,492 Jeg har nu magisk på min rådighed en ny datatype. 409 00:18:06,492 --> 00:18:09,200 Jeg har ikke bare har adgang til int, og fjeldørred, og flyde, og snor, 410 00:18:09,200 --> 00:18:10,060 og blå og andre. 411 00:18:10,060 --> 00:18:12,470 Jeg har nu adgang til en studerende datatype. 412 00:18:12,470 --> 00:18:17,740 Så i linje 12, jeg kombinere to ideas-- én en brugerdefineret datatype og to, 413 00:18:17,740 --> 00:18:18,940 ved hjælp af et array. 414 00:18:18,940 --> 00:18:21,700 Og så i dette program, hvis Jeg ønsker at faktisk støtte 415 00:18:21,700 --> 00:18:24,320 tre forskellige elever i mit program, jeg 416 00:18:24,320 --> 00:18:30,480 kan blot sige give mig en variabel kaldet studerende, der hver især 417 00:18:30,480 --> 00:18:32,970 er af typen studerende, som er min brugerdefinerede datatype. 418 00:18:32,970 --> 00:18:35,890 Og, specielt, giv mig tre af dem i min array. 419 00:18:35,890 --> 00:18:37,750 >> Så nu, hvad gør vi i dette program? 420 00:18:37,750 --> 00:18:40,670 Her er bare en for-løkke iteration fra 0 til 3, fordi det er 421 00:18:40,670 --> 00:18:42,110 hvad værdien af ​​elever er. 422 00:18:42,110 --> 00:18:44,420 Jeg er bare at spørge brugeren give mig den studerendes navn. 423 00:18:44,420 --> 00:18:48,090 Og derefter i linje 17, vi har en hovedsagelig velkendte linje. 424 00:18:48,090 --> 00:18:50,370 Vi har vores gamle ven GetString til højre. 425 00:18:50,370 --> 00:18:52,345 Og hvad stykke syntaks er tilsyneladende nye, 426 00:18:52,345 --> 00:18:55,130 hvis du aldrig har programmeret i C før, og har aldrig brugt structs? 427 00:18:55,130 --> 00:18:55,510 Ja? 428 00:18:55,510 --> 00:18:56,417 >> PUBLIKUM: Den .name. 429 00:18:56,417 --> 00:18:57,500 DAVID J. MALAN: Den .name. 430 00:18:57,500 --> 00:19:01,220 Men det er ikke for meget af et spring, fordi nu studerende beslag jeg 431 00:19:01,220 --> 00:19:02,590 giver dig i'te elev. 432 00:19:02,590 --> 00:19:04,730 Og hvis du ønsker at dykke indersiden af ​​denne struktur, 433 00:19:04,730 --> 00:19:09,490 du bare bruge en enkelt periode og derefter navnet på variablen inde, 434 00:19:09,490 --> 00:19:11,900 eller ejendommen indeni, du ønsker at få adgang til. 435 00:19:11,900 --> 00:19:14,816 Ligeledes da, hvis jeg så bede bruger, giv mig den studerendes kollegieværelse, 436 00:19:14,816 --> 00:19:18,390 du kan ligeledes gemme det streng i kollegiet variabel inde 437 00:19:18,390 --> 00:19:19,940 af at de studerendes struktur. 438 00:19:19,940 --> 00:19:21,410 >> Og nu tingene bliver lidt fancy. 439 00:19:21,410 --> 00:19:24,420 Og det kommer til at se ved måske en masse ganske snart. 440 00:19:24,420 --> 00:19:27,970 Men du vil se det langt mere i pset 4, så lad os bare blik på det nu. 441 00:19:27,970 --> 00:19:33,364 Det viser sig, at i linie 23 gennem 38, hvad tror du jeg måske gør? 442 00:19:33,364 --> 00:19:35,530 Jeg har fjernet kommentarerne for i dag, men den version 443 00:19:35,530 --> 00:19:38,660 af koden online henvisningen har alle kommentarer. 444 00:19:38,660 --> 00:19:40,171 Hvad skal jeg synes at gøre? 445 00:19:40,171 --> 00:19:42,530 >> PUBLIKUM: Gemmer filen med alle de oplysninger, som brugeren har indtastet. 446 00:19:42,530 --> 00:19:44,530 >> DAVID J. MALAN: Ja, præcis, det er en ny måde 447 00:19:44,530 --> 00:19:46,370 at vi ser to, en anden funktion i C, 448 00:19:46,370 --> 00:19:48,700 hvorved jeg kan lave mine egne filer. 449 00:19:48,700 --> 00:19:51,580 Hidtil, næsten hver program du har skrevet, er statsløs. 450 00:19:51,580 --> 00:19:53,334 Så snart det er gjort kører, det er det. 451 00:19:53,334 --> 00:19:55,000 Der er ingen hukommelse eller erindring om det. 452 00:19:55,000 --> 00:19:56,110 Der er ingen fil gemt. 453 00:19:56,110 --> 00:19:58,120 Men hvis du ønsker at gemme input, der har 454 00:19:58,120 --> 00:20:02,100 skete, ligesom i et spil eller et program som dette, viser det sig, at vi kan gøre det. 455 00:20:02,100 --> 00:20:04,360 Og du vil se denne mere i pset 4 og i afsnit. 456 00:20:04,360 --> 00:20:08,661 Men denne linje 23 i det væsentlige opretter en fil kaldet students.csv. 457 00:20:08,661 --> 00:20:10,160 Og du måske har set det før. 458 00:20:10,160 --> 00:20:14,250 Selv hvis du aldrig har studeret CS før, CSV er kommaseparerede variabler. 459 00:20:14,250 --> 00:20:19,000 Det er ligesom en meget dårlig mands version af en Excel-fil, 460 00:20:19,000 --> 00:20:22,270 hvilket betyder, at det kunne åbnes i Excel og i Apple Numbers, 461 00:20:22,270 --> 00:20:23,830 og det har rækker og kolonner. 462 00:20:23,830 --> 00:20:26,485 Men det er ikke en proprietær format som Microsoft eller Apples. 463 00:20:26,485 --> 00:20:29,840 Det er bare kommaer adskiller værdier, som vi vil se i et øjeblik. 464 00:20:29,840 --> 00:20:31,010 >> Og bare tage et gæt. 465 00:20:31,010 --> 00:20:33,480 I linie 23 i det ende, min andet argument 466 00:20:33,480 --> 00:20:37,700 til denne nye funktion kaldet f åben for fil åben er w. 467 00:20:37,700 --> 00:20:39,430 Hvad kan w betegne? 468 00:20:39,430 --> 00:20:40,022 Ja? 469 00:20:40,022 --> 00:20:41,260 >> PUBLIKUM: Det kan du skrive til filen? 470 00:20:41,260 --> 00:20:42,630 >> DAVID J. MALAN: Den lader du skriver til filen. 471 00:20:42,630 --> 00:20:44,810 Så der er et par varianter at vi kan tilslutte her. 472 00:20:44,810 --> 00:20:47,184 Men hvis du blot ønsker at læse filen, der er at se på det 473 00:20:47,184 --> 00:20:50,010 og læse det i hukommelsen, du bare bruge quote citat slut "r". 474 00:20:50,010 --> 00:20:53,110 Hvis du ønsker at skrive til fil, du bruger citat citat slut "w". 475 00:20:53,110 --> 00:20:55,190 Der er også tilføje og et par andre ting 476 00:20:55,190 --> 00:20:57,356 Hvis du ønsker at ændre eksisterende filer. 477 00:20:57,356 --> 00:21:00,480 Nu vil vi holde se denne ting, så vi vil komme tilbage til linje 24. 478 00:21:00,480 --> 00:21:02,640 NULL, viser det sig, er en særlig værdi, 479 00:21:02,640 --> 00:21:06,070 kan returneres ved visse funktioner hvis noget er gået wrong-- 480 00:21:06,070 --> 00:21:08,490 hvis filen ikke findes, hvis du har kørt ud af hukommelsen, 481 00:21:08,490 --> 00:21:09,620 eller en masse andre fejl. 482 00:21:09,620 --> 00:21:13,470 Men for nu, lad os bare antage, at dette er bare almindelig fejlkontrol. 483 00:21:13,470 --> 00:21:17,090 Her på linje 26, jeg iteration fra 0 til 3 i løbet af alle mine elever. 484 00:21:17,090 --> 00:21:20,470 Og det er sådan slags af en ny funktion, fprintf, 485 00:21:20,470 --> 00:21:21,460 men bare tage et gæt. 486 00:21:21,460 --> 00:21:24,370 Hvis printf er bare print en formateret streng, 487 00:21:24,370 --> 00:21:26,507 hvad betyder fprintf formentlig betyde? 488 00:21:26,507 --> 00:21:27,590 PUBLIKUM: Udskriv til en fil. 489 00:21:27,590 --> 00:21:29,290 DAVID J. MALAN: Udskriv en formateret streng til en fil. 490 00:21:29,290 --> 00:21:31,180 Det er, hvad den ekstra f middel er fil. 491 00:21:31,180 --> 00:21:36,420 Og den nye første argument skal være den variabel, der repræsenterer din fil. 492 00:21:36,420 --> 00:21:38,866 Så vi bare have et format snor ligesom printf. 493 00:21:38,866 --> 00:21:40,740 Og selv om dette syntaks er nyt, det bare 494 00:21:40,740 --> 00:21:44,610 betyder stik i den studerendes navn, plug-in den studerende kollegieværelse, og derefter 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 nyt og vi vil komme tilbage til dette 497 00:21:49,730 --> 00:21:53,240 før long-- jeg frigøre den studerende til grunde 498 00:21:53,240 --> 00:21:54,860 der skete op over der. 499 00:21:54,860 --> 00:21:56,820 Men vi vil komme tilbage til at før long-- 500 00:21:56,820 --> 00:21:59,820 det er på grund af, hvordan getString er faktisk arbejder under kølerhjelmen. 501 00:21:59,820 --> 00:22:01,280 >> Så lad os tage et hurtigt kig her. 502 00:22:01,280 --> 00:22:04,380 Hvis jeg skriver ls i min mappe, bemærke, at jeg ikke 503 00:22:04,380 --> 00:22:09,360 har en fil kaldet students.csv, bare ikke, findes ikke. 504 00:22:09,360 --> 00:22:14,965 Så hvis jeg nu kompilere dette program, gøre structs-1,. / structs-1, 505 00:22:14,965 --> 00:22:20,570 og jeg har tænkt mig at gå videre og skrive Andi, der bor i Berkeley på Yale. 506 00:22:20,570 --> 00:22:26,350 Vi bliver nødt til Rob, som bor i Thayer disse dage. 507 00:22:26,350 --> 00:22:33,760 Og lad os komme op med, hvor er, tror jeg, Maria er i Mather, 508 00:22:33,760 --> 00:22:35,100 hvis jeg har husket rigtigt. 509 00:22:35,100 --> 00:22:36,460 >> Så intet synes at ske. 510 00:22:36,460 --> 00:22:40,680 Men hvis jeg skriver ls nu der er students.csv. 511 00:22:40,680 --> 00:22:43,080 Lad os gå videre og åbne students.csv. 512 00:22:43,080 --> 00:22:46,050 Dette er igen en meget letvægts filformat. 513 00:22:46,050 --> 00:22:49,570 Men jeg har simpelthen vedtaget en konvention at jeg har to rækker og kolonner her. 514 00:22:49,570 --> 00:22:52,020 Den første søjle er folks fornavne. 515 00:22:52,020 --> 00:22:55,740 Den anden kolonne er den studerendes kollegieværelse, eller college, eller hus, eller whatnot. 516 00:22:55,740 --> 00:22:57,900 Og nu har jeg gemt denne permanent i en fil. 517 00:22:57,900 --> 00:22:59,280 >> Så det er ikke alt, interessant. 518 00:22:59,280 --> 00:23:02,980 Men dette er blot et springbræt nu at være i stand til at fortsætte information 519 00:23:02,980 --> 00:23:04,040 permanent. 520 00:23:04,040 --> 00:23:08,340 Så lad os nu se, hvad mere vi kan gøre med disse og andre funktioner. 521 00:23:08,340 --> 00:23:10,729 Men først, eventuelle spørgsmål? 522 00:23:10,729 --> 00:23:12,145 Det var en masse, og det var hurtig. 523 00:23:12,145 --> 00:23:16,131 Men du vil se en masse mere pset 4, samt. 524 00:23:16,131 --> 00:23:16,630 Ja? 525 00:23:16,630 --> 00:23:19,360 >> PUBLIKUM: Er der en måde at fortsætte med at tilføje navne til denne fil? 526 00:23:19,360 --> 00:23:19,880 >> DAVID J. MALAN: Godt spørgsmål. 527 00:23:19,880 --> 00:23:21,800 Er der en måde at fortsætte tilføjer navne til denne fil? 528 00:23:21,800 --> 00:23:22,340 Ja. 529 00:23:22,340 --> 00:23:24,630 Og i virkeligheden, hvis du ender up genåbne filen, 530 00:23:24,630 --> 00:23:26,780 du ville bruge quote citat slut "a" for append, 531 00:23:26,780 --> 00:23:31,090 som netop ville tilføje en ny linje, en nye linje igen og igen, nøjagtigt. 532 00:23:31,090 --> 00:23:32,010 Godt spørgsmål. 533 00:23:32,010 --> 00:23:32,950 Andre spørgsmål? 534 00:23:32,950 --> 00:23:33,450 Ja? 535 00:23:33,450 --> 00:23:35,580 PUBLIKUM: Hvis du kørte program igen lige nu, 536 00:23:35,580 --> 00:23:38,000 ville det holde tilføje navne til fil eller ville det åbne en ny fil? 537 00:23:38,000 --> 00:23:38,740 >> DAVID J. MALAN: Ah, godt spørgsmål. 538 00:23:38,740 --> 00:23:41,448 Hvis du kørte programmet igen til højre nu, måske skrevet i nye navne, 539 00:23:41,448 --> 00:23:44,820 ville det tilføje til filen eller overskrive filen? 540 00:23:44,820 --> 00:23:47,420 Sidstnævnte, fordi jeg er ikke bruger append mode. 541 00:23:47,420 --> 00:23:49,930 Og fordi jeg er bare blindt åbne filen til skrivning, 542 00:23:49,930 --> 00:23:51,310 det bare at gå at overskrive filen. 543 00:23:51,310 --> 00:23:54,570 Så jeg vil faktisk skal gøre er tilføje, hvis jeg vil faktisk have en langsigtet 544 00:23:54,570 --> 00:23:55,350 database. 545 00:23:55,350 --> 00:23:58,220 >> Nu CSV er nyttig, helt ærligt, selv for ligesom hvis du er writing-- 546 00:23:58,220 --> 00:24:00,100 og vi vil i sidste ende se denne senere i semestret, når 547 00:24:00,100 --> 00:24:01,455 vi bruger CSV-filer må til andre formål. 548 00:24:01,455 --> 00:24:04,920 Hvis du ønsker at gemme alle de mennesker der har registreret for nogle begivenhed, 549 00:24:04,920 --> 00:24:07,420 eller tilmeldt dit studiekort gruppe eller noget lignende, 550 00:24:07,420 --> 00:24:10,330 lagring af dataene i denne form format er super praktisk. 551 00:24:10,330 --> 00:24:12,580 Fordi bogstaveligt, hvis jeg var at downloade denne fil. 552 00:24:12,580 --> 00:24:14,540 Jeg kunne double-- og lad os faktisk prøve denne 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 har tænkt mig at højreklikke eller kontrol på Denne fil. 555 00:24:19,130 --> 00:24:20,020 Hovsa. 556 00:24:20,020 --> 00:24:21,830 Højreklik eller kontrol på Denne fil. 557 00:24:21,830 --> 00:24:24,960 Kom nu, er min mus ikke samarbejder. 558 00:24:24,960 --> 00:24:32,694 Download-- jeg har tænkt mig at hente alle filerne her, så 559 00:24:32,694 --> 00:24:33,860 bare så jeg kan få fat i denne. 560 00:24:33,860 --> 00:24:37,850 Og lad os se om det virker students.csv-- første gang 561 00:24:37,850 --> 00:24:39,310 Jeg har aktiveret. 562 00:24:39,310 --> 00:24:41,360 Nu ønsker de at se mine kontakter. 563 00:24:41,360 --> 00:24:44,310 Nu behøver jeg at registrere. 564 00:24:44,310 --> 00:24:47,620 Se, hvor nemt det er at bruge CSV-filer må? 565 00:24:47,620 --> 00:24:50,840 Ja, holde det ajour. 566 00:24:50,840 --> 00:24:52,375 OK, nu er vi klar til klassen. 567 00:24:52,375 --> 00:24:58,750 568 00:24:58,750 --> 00:25:00,370 OK, åh, hvad er nyt? 569 00:25:00,370 --> 00:25:02,920 OK, tæt på. 570 00:25:02,920 --> 00:25:04,750 Det var magisk. 571 00:25:04,750 --> 00:25:07,280 OK, nu er vi nødt til at opdatere. 572 00:25:07,280 --> 00:25:10,890 Og nu, det glemte, hvad fil Jeg oprindeligt åbnet, 573 00:25:10,890 --> 00:25:13,090 men hvad en-- der vi gå. 574 00:25:13,090 --> 00:25:16,341 OK, så nu har vi en Excel-fil. 575 00:25:16,341 --> 00:25:18,290 Tak. 576 00:25:18,290 --> 00:25:20,764 >> OK, så hvad jeg gjorde, var den nemme del. 577 00:25:20,764 --> 00:25:23,930 Selvfølgelig kunne jeg have pre-installeret Excel eller Numbers, eller hvad programmet. 578 00:25:23,930 --> 00:25:25,846 Men det er rart, fordi nu kan jeg manipulere 579 00:25:25,846 --> 00:25:28,090 data i et standardformat. 580 00:25:28,090 --> 00:25:30,294 >> Så lad os nu kontekst skifte til hvor vi slap 581 00:25:30,294 --> 00:25:32,710 sidste gang, der var at starte at tage ud støttehjul. 582 00:25:32,710 --> 00:25:34,543 Men først, du ikke gjorde se denne tidligere frokost 583 00:25:34,543 --> 00:25:38,150 igen sker her på brand og Is i Cambridge, Sitar i New Haven. 584 00:25:38,150 --> 00:25:43,150 Tilmeld dig på CS50s hjemmeside ASAP at slutte sig til CS50 studerende og ansatte. 585 00:25:43,150 --> 00:25:46,090 >> Så vi tog uddannelse hjul off på mandag som follows-- 586 00:25:46,090 --> 00:25:49,120 strengen er blevet erklæret i CS50s bibliotek i nogen tid. 587 00:25:49,120 --> 00:25:52,650 Og det er rart, fordi det giver os til at tale om variabler som værende 588 00:25:52,650 --> 00:25:54,660 komplette ord og sætninger og meget mere. 589 00:25:54,660 --> 00:25:56,710 Men det viser sig streng findes ikke. 590 00:25:56,710 --> 00:26:00,200 Det er bare et synonym eller et alias, at vi har skabt for noget, 591 00:26:00,200 --> 00:26:03,780 faktisk er lidt mere teknisk kaldes en char *. 592 00:26:03,780 --> 00:26:07,900 >> Og ja, vi så et eksempel af et program på mandag 593 00:26:07,900 --> 00:26:11,200 der ikke opfører sig helt som vi forventede. 594 00:26:11,200 --> 00:26:13,630 Det var den fil, sammenligne-0. 595 00:26:13,630 --> 00:26:17,910 Og huske, at sammenligne-0, hvis Jeg kompilere mandagens program 596 00:26:17,910 --> 00:26:22,670 og køre sammenligne-0 og skriv mor i små bogstaver, og mor med små bogstaver igen. 597 00:26:22,670 --> 00:26:25,320 Programmet insisterede jeg skrive forskellige ting, 598 00:26:25,320 --> 00:26:29,210 selv om mor, alle i små bogstaver, er identisk visuelt. 599 00:26:29,210 --> 00:26:31,990 Så hvad var det korte svar for hvorfor computeren mener 600 00:26:31,990 --> 00:26:34,500 disse to strenge er forskellige? 601 00:26:34,500 --> 00:26:35,250 Ja? 602 00:26:35,250 --> 00:26:36,534 >> PUBLIKUM: [uhørligt] 603 00:26:36,534 --> 00:26:37,450 DAVID J. MALAN: Right. 604 00:26:37,450 --> 00:26:39,600 Så mor, første gang Jeg skriver det i, er ved at blive 605 00:26:39,600 --> 00:26:42,710 gemt et eller andet sted i min computers hukommelse, men i en anden placering 606 00:26:42,710 --> 00:26:44,690 end anden gang, jeg skriver i mor. 607 00:26:44,690 --> 00:26:46,580 Nu er det helt sikkert kunne optimeres. 608 00:26:46,580 --> 00:26:49,205 Computeren kan være smart og realisere disse to strenge, hey, 609 00:26:49,205 --> 00:26:49,954 de er identiske. 610 00:26:49,954 --> 00:26:51,520 Lad mig ikke redundant gemme det. 611 00:26:51,520 --> 00:26:54,229 Men computere ikke gøre det optimering, medmindre du fortælle dem til. 612 00:26:54,229 --> 00:26:56,061 Så som standard, de er bare kommer til at ende 613 00:26:56,061 --> 00:26:57,670 i to forskellige steder i hukommelsen. 614 00:26:57,670 --> 00:27:01,570 Og således være mere klar, når sammenlignede vi to strenge, 615 00:27:01,570 --> 00:27:03,950 de første blev kaldt s, den anden blev kaldt 616 00:27:03,950 --> 00:27:08,530 t, hvad der specifikt var jeg sammenligning her på linie 13? 617 00:27:08,530 --> 00:27:09,494 Ja. 618 00:27:09,494 --> 00:27:12,390 >> PUBLIKUM: Det er det sted i hukommelsen at den variable vil pege på. 619 00:27:12,390 --> 00:27:14,900 >> DAVID J. MALAN: Præcis, var jeg sammenligning af sted i hukommelsen 620 00:27:14,900 --> 00:27:16,300 at disse variabler pegede på. 621 00:27:16,300 --> 00:27:20,560 Så specielt 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 skal være hele vejen i slutningen. 623 00:27:24,020 --> 00:27:29,420 Og den anden forekomst af mor, m-o-meter, var på adressen 10, 11, 12 og 13. 624 00:27:29,420 --> 00:27:33,100 Jeg sammenligner 1, den pågældende adresse, denne placering i hukommelsen, 625 00:27:33,100 --> 00:27:35,160 mod 10, som er naturligvis 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 rart i, at det er ret ligetil. 628 00:27:39,620 --> 00:27:42,870 Men det er problematisk, for så vidt Vi kan ikke synes at sammenligne strenge. 629 00:27:42,870 --> 00:27:44,930 Så fundamentally-- og på dette lave niveau, 630 00:27:44,930 --> 00:27:47,300 hvis du ønsker at implementere et program for at sammenligne 631 00:27:47,300 --> 00:27:50,270 to separate ord, at bruger har indtastet for kvalitet, 632 00:27:50,270 --> 00:27:53,944 gør de linje op char for char, bare i generelle vendinger, 633 00:27:53,944 --> 00:27:55,360 hvad skal vi gøre, tilsyneladende? 634 00:27:55,360 --> 00:27:57,940 Det er ikke nok bare at se på de to adresser. 635 00:27:57,940 --> 00:27:58,860 Hvad skal vi gøre? 636 00:27:58,860 --> 00:27:59,360 Ja? 637 00:27:59,360 --> 00:28:01,120 >> PUBLIKUM: gentage gennem strengen [uhørligt]. 638 00:28:01,120 --> 00:28:02,600 >> DAVID J. MALAN: Ja, lad os gentage gennem strengen. 639 00:28:02,600 --> 00:28:05,808 Lad os bruge en for-løkke, en while-løkke, eller uanset hvad du er mest komfortabel med. 640 00:28:05,808 --> 00:28:08,840 Og hvis vi har to strenge eller andet sted i hukommelsen, lad os se på hver s 641 00:28:08,840 --> 00:28:11,770 første tegn, så hver anden karakter, så tredje og fjerde 642 00:28:11,770 --> 00:28:15,206 og femte, indtil vi ramt hvilke særlige sentinel værdi? 643 00:28:15,206 --> 00:28:16,080 PUBLIKUM: [uhørligt] 644 00:28:16,080 --> 00:28:18,800 DAVID J. MALAN: Ja, det backslash nul, på hvilket tidspunkt i enten string 645 00:28:18,800 --> 00:28:20,100 vi kan beslutte det er det. 646 00:28:20,100 --> 00:28:21,970 Har vi matchede hvert enkelt tegn? 647 00:28:21,970 --> 00:28:22,990 Hvis ikke, return false. 648 00:28:22,990 --> 00:28:24,770 Hvis ja, returnere sandt. 649 00:28:24,770 --> 00:28:28,800 Og så det er præcis, hvad denne version af programmet sammenligne-1.c gør. 650 00:28:28,800 --> 00:28:31,677 Den er identisk med det, vi så på mandag, bortset fra at jeg har 651 00:28:31,677 --> 00:28:34,760 fået slippe af ordet string-- selv der ikke har nogen funktionel impact-- alle 652 00:28:34,760 --> 00:28:37,450 Jeg gør nu fjerner nogle visuelle uddannelse hjul, 653 00:28:37,450 --> 00:28:40,880 men at se klart, at s og t er adresser. 654 00:28:40,880 --> 00:28:43,020 Og det er, hvad stjernen, asterisken, repræsenterer 655 00:28:43,020 --> 00:28:46,690 er en adresse, også kendt mere teknisk som en pegepind. 656 00:28:46,690 --> 00:28:49,880 >> Så når jeg erklærer s på linje 9 og sige char * s, 657 00:28:49,880 --> 00:28:52,160 det betyder ikke give mig en streng. 658 00:28:52,160 --> 00:28:56,360 Det betyder at give mig en variabel, hvis formål i livet er at gemme en adresse. 659 00:28:56,360 --> 00:29:00,400 Fordi jeg er ved at sætte adresse af en streng ind i det. 660 00:29:00,400 --> 00:29:03,500 Og ja, getString, at være klar, ikke vender tilbage en streng. 661 00:29:03,500 --> 00:29:06,110 Det behøver ikke returnere mor backslash nul, per se. 662 00:29:06,110 --> 00:29:10,005 Hvad betyder getString specifikt og præcist tilbage? 663 00:29:10,005 --> 00:29:10,880 PUBLIKUM: [uhørligt] 664 00:29:10,880 --> 00:29:14,080 DAVID J. MALAN: En adresse, den adresse for det første tegn 665 00:29:14,080 --> 00:29:16,070 i nogle streng har fået. 666 00:29:16,070 --> 00:29:19,250 Og så nu ser vi en særlig søgeord igen. 667 00:29:19,250 --> 00:29:20,640 Og jeg hentydet til dette tidligere. 668 00:29:20,640 --> 00:29:23,620 Dette vil være god konvention at vi vil se igen og igen nu. 669 00:29:23,620 --> 00:29:27,540 Jeg kontrol for at sikre, at s er ikke nul og t er ikke null. 670 00:29:27,540 --> 00:29:30,100 Fordi baseret på min virkelig hurtig omtale tidligere, 671 00:29:30,100 --> 00:29:35,510 hvad der kunne betyde, hvis getString ikke returnerer en adresse, men N-U-L-L, som igen, 672 00:29:35,510 --> 00:29:36,990 nogle særlige værdi? 673 00:29:36,990 --> 00:29:37,890 >> PUBLIKUM: Fejl. 674 00:29:37,890 --> 00:29:38,600 >> DAVID J. MALAN: Det er en fejl. 675 00:29:38,600 --> 00:29:39,550 Noget gik galt. 676 00:29:39,550 --> 00:29:41,341 Og hvad der typisk kan ske, især 677 00:29:41,341 --> 00:29:45,162 med strings-- som kan være af ukendt længde i advance-- 678 00:29:45,162 --> 00:29:46,870 måske computerne ' tør for hukommelse, måske 679 00:29:46,870 --> 00:29:49,280 du har skrevet i sådan en lange ord eller sætning 680 00:29:49,280 --> 00:29:51,880 eller indsat sådan en stor essay der er bare ikke nok hukommelse. 681 00:29:51,880 --> 00:29:55,340 Og så getString kan ikke vende tilbage adressen på det hele, 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 siger der er sket en fejl ved at returnere den specielle NULL værdi. 684 00:30:00,580 --> 00:30:02,890 Det er nul adresse, så at sige. 685 00:30:02,890 --> 00:30:06,157 >> Nu viser det sig, C leveres med en funktion, der gør, at iteration. 686 00:30:06,157 --> 00:30:09,240 Vi behøver ikke at gennemføre dette med en for-løkke eller en while-løkke os selv. 687 00:30:09,240 --> 00:30:11,150 Vi kan bruge en funktion, kaldet kortfattet, 688 00:30:11,150 --> 00:30:15,400 røre comp eller en snor sammenligne, hvis formål i livet er at gøre netop dette. 689 00:30:15,400 --> 00:30:19,990 Du giver det to pointere, to adresser, og det vil gå til disse adresser 690 00:30:19,990 --> 00:30:23,130 og derefter sammenligne brev til brev til brev til kvalitet, 691 00:30:23,130 --> 00:30:26,610 stopper kun når hvad der er sandt? 692 00:30:26,610 --> 00:30:31,540 Når intuitivt bør røre comp stoppe iteration, bare for at være klar? 693 00:30:31,540 --> 00:30:35,400 Når den rammer en omvendt skråstreg 0 i enten streng, på hvilket tidspunkt det kan bestemme 694 00:30:35,400 --> 00:30:38,910 har alt matches, eller har der været en uoverensstemmelse? 695 00:30:38,910 --> 00:30:42,740 >> Så hvis vi kører det nu, og prøv vores lille kapitalisering spil, 696 00:30:42,740 --> 00:30:49,260 så gør sammenligne-1, ./compare-1, og skriv mor med små bogstaver begge gange. 697 00:30:49,260 --> 00:30:50,560 Nu er det de samme ting. 698 00:30:50,560 --> 00:30:54,080 Og hvis jeg gør det igen med små bogstaver, og så måske store bogstaver. 699 00:30:54,080 --> 00:30:56,720 Nu er det faktisk skelner mellem store og små bogstaver. 700 00:30:56,720 --> 00:31:00,440 Så ikke alt det hårde eller magisk, men det gør nu forklare 701 00:31:00,440 --> 00:31:03,140 hvad der foregår under kølerhjelmen. 702 00:31:03,140 --> 00:31:07,640 >> Så hvad mere kan vi udtrække fra denne form for lektion? 703 00:31:07,640 --> 00:31:08,980 Så lad os tage et kig på denne. 704 00:31:08,980 --> 00:31:15,380 Jeg har tænkt mig at gå videre og skrive en hurtig program her kaldes kopi-0. 705 00:31:15,380 --> 00:31:21,594 Og lad os nu gå videre og faktisk lad os gøre denne-- med kopi-0, 706 00:31:21,594 --> 00:31:23,010 tage et kig på, hvad jeg har fået her. 707 00:31:23,010 --> 00:31:24,712 Jeg først fortælle brugeren, sige noget. 708 00:31:24,712 --> 00:31:26,420 Så får jeg en streng og jeg gemt det i s. 709 00:31:26,420 --> 00:31:29,810 Så jeg kontrollere, hvis s er lig lig NULL, bare returnere 1. 710 00:31:29,810 --> 00:31:31,590 Så dette er bare standard fejlkontrol. 711 00:31:31,590 --> 00:31:33,112 Intet interessant er sket. 712 00:31:33,112 --> 00:31:36,320 Og i virkeligheden, hvis vi slippe af fejlen kontrol, dette ligner uge 1 kode 713 00:31:36,320 --> 00:31:36,985 i øjeblikket. 714 00:31:36,985 --> 00:31:39,110 Men jeg er begyndt at få en lidt bedre om. 715 00:31:39,110 --> 00:31:43,340 >> Nu på linje 16, for en uge siden, måske endnu et par dage eller minutter siden, 716 00:31:43,340 --> 00:31:46,720 du kan sige linje 16 er at skabe en variabel kaldet t 717 00:31:46,720 --> 00:31:48,219 og kopiering s ind i det. 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 mere præcis nu. 720 00:31:51,560 --> 00:31:54,190 Hvad sker der i linje 16? 721 00:31:54,190 --> 00:31:56,170 Hvad der blive kopieret fra højre mod venstre? 722 00:31:56,170 --> 00:31:56,669 Ja? 723 00:31:56,669 --> 00:31:58,490 PUBLIKUM: Er t få en adresse på s? 724 00:31:58,490 --> 00:32:01,220 >> DAVID J. MALAN: Præcis, t bliver adressen på s. 725 00:32:01,220 --> 00:32:05,170 Så for at være klar nu, hvis jeg går tilbage til tidligere eksempel 726 00:32:05,170 --> 00:32:08,520 og jeg trækker ud, jeg har skrevet i. 727 00:32:08,520 --> 00:32:11,640 Og hvad jeg har skrevet in-- her er s, og her 728 00:32:11,640 --> 00:32:15,830 er, hvad jeg har skrevet i et sted i hukommelse, mor og derefter en omvendt skråstreg 729 00:32:15,830 --> 00:32:17,840 0, der er tilføjet for mig. 730 00:32:17,840 --> 00:32:23,060 Hvad jeg gemt i her, husker, dette er ved stedet 1, 2, 3, 4, 731 00:32:23,060 --> 00:32:24,655 dette er, hvad der er i øjeblikket i s. 732 00:32:24,655 --> 00:32:29,220 Så hvis i linje 16, siger jeg give mig anden variabel kaldet t og opbevare 733 00:32:29,220 --> 00:32:33,590 ind på værdien af ​​s, hvad bliver gemt her vil ikke mor 734 00:32:33,590 --> 00:32:35,480 men snarere blot nummer 1. 735 00:32:35,480 --> 00:32:38,520 >> Så hvis vi ser fremad i dette program nu, hvad der kommer til at ske? 736 00:32:38,520 --> 00:32:40,690 Så bemærke, at der er denne funktion du måske 737 00:32:40,690 --> 00:32:44,410 har brugt denne for nogen tid siden til Cæsar, eller Vigenere, eller måske slet ikke. 738 00:32:44,410 --> 00:32:48,170 Jeg hævder med min printf, jeg er kommer til at udnytte kopien t. 739 00:32:48,170 --> 00:32:51,616 Først på linje 19, hurtig tilregnelighed kontrollere, StrLen kontrol længden af ​​t. 740 00:32:51,616 --> 00:32:53,740 Fordi jeg ønsker ikke at forsøge at udnytte noget 741 00:32:53,740 --> 00:32:55,104 hvis der ikke er nogen streng der. 742 00:32:55,104 --> 00:32:57,520 Hvis brugeren bare trykke Enter, der er ikke noget at udnytte. 743 00:32:57,520 --> 00:33:01,100 Så jeg ønsker ikke at gøre linje 21. 744 00:33:01,100 --> 00:33:05,758 Så linie 21 er kapitalisere hvilket bogstav, tilsyneladende 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 ligesom 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: Øh, m. 749 00:33:10,450 --> 00:33:12,685 OK, så det første m, fordi varsel, at jeg er 750 00:33:12,685 --> 00:33:14,935 passerer til toupper, som hvis du aldrig har set det, det er 751 00:33:14,935 --> 00:33:16,980 blot en funktion til kapitalisere som sit input. 752 00:33:16,980 --> 00:33:20,240 t beslag nul betyder at give mig nultegnet t. 753 00:33:20,240 --> 00:33:22,550 Og så hvordan gør dette billede forandring, for at være klar? 754 00:33:22,550 --> 00:33:25,490 755 00:33:25,490 --> 00:33:29,160 Hvad skal få omskrevet eller ændret med hensyn til S og T og mor 756 00:33:29,160 --> 00:33:30,097 backslash nul. 757 00:33:30,097 --> 00:33:31,470 >> PUBLIKUM: [uhørligt] 758 00:33:31,470 --> 00:33:34,030 >> DAVID J. MALAN: Ja, så denne ene her blot 759 00:33:34,030 --> 00:33:40,860 behov for at få ændret at-- ordne denne-- har brug for at få ændret til en kapital m. 760 00:33:40,860 --> 00:33:44,330 Men nu, se senere i program, hvis jeg udskrive 761 00:33:44,330 --> 00:33:49,800 s og t, som jeg rengøre her, se hvad der er kommer til at ske udskrive s og t. 762 00:33:49,800 --> 00:33:54,310 Så gør copy-0, ./copy-0. 763 00:33:54,310 --> 00:33:57,140 Lad mig gå videre og skrive i mor i små bogstaver. 764 00:33:57,140 --> 00:34:00,140 Læg mærke både den oprindelige og kopien er aktiveret. 765 00:34:00,140 --> 00:34:00,850 Hvorfor? 766 00:34:00,850 --> 00:34:04,431 Nå, s og t er begge peger på, hvis du vil, det samme luns af hukommelse. 767 00:34:04,431 --> 00:34:06,930 Og helt ærligt, det er at få virkelig uninteresting-- den kendsgerning 768 00:34:06,930 --> 00:34:09,150 at vi bruger adresse nul her. 769 00:34:09,150 --> 00:34:11,719 Jeg mener, jeg ikke rigtig pleje hvor ting er i hukommelsen. 770 00:34:11,719 --> 00:34:13,550 Undskyld jeg slette lidt for meget. 771 00:34:13,550 --> 00:34:15,674 Men jeg kan ikke rigtig pleje hvor tingene er i hukommelsen. 772 00:34:15,674 --> 00:34:18,510 Og så, ja hvad programmører har tendens til at tænke over 773 00:34:18,510 --> 00:34:21,080 er, at når man taler om en adresse eller en pegepind, 774 00:34:21,080 --> 00:34:22,679 Hvem bekymrer sig om, hvor det er i hukommelsen. 775 00:34:22,679 --> 00:34:24,989 Jeg er ligeglad, om det er på byte en eller en milliard. 776 00:34:24,989 --> 00:34:27,920 Jeg bare passe, at dette variabel er effektivt 777 00:34:27,920 --> 00:34:29,620 peger på, at bid af hukommelse. 778 00:34:29,620 --> 00:34:33,350 Og så, nu, i stedet brokker i løbet af vilkårlige hukommelse adresser, lad os 779 00:34:33,350 --> 00:34:36,710 bare begynde at tegne pointers som pejlemærker, som pile. 780 00:34:36,710 --> 00:34:39,340 Så hvad s og t virkelig er, ifølge dette program, 781 00:34:39,340 --> 00:34:42,130 på grund af hvordan jeg skabte t, Det er blot to separate variabler 782 00:34:42,130 --> 00:34:43,840 peger på den samme klump hukommelse. 783 00:34:43,840 --> 00:34:45,215 Og vi er ligeglade hvor de er. 784 00:34:45,215 --> 00:34:47,130 Så vi kan abstrakt væk, detaljer. 785 00:34:47,130 --> 00:34:48,780 >> Så hvordan kan jeg løse dette? 786 00:34:48,780 --> 00:34:54,120 Hvis jeg vil skrive en version af kopien program, der faktisk kopierer snor 787 00:34:54,120 --> 00:34:56,840 og akkumulerer kun kopiere, lige intuitivt, 788 00:34:56,840 --> 00:34:59,766 hvad der er nødt til at være en ingrediens til vores løsning? 789 00:34:59,766 --> 00:35:00,640 PUBLIKUM: [uhørligt] 790 00:35:00,640 --> 00:35:01,420 DAVID J. MALAN: Vi har brug for en hvad? 791 00:35:01,420 --> 00:35:01,820 PUBLIKUM: Chunk hukommelse. 792 00:35:01,820 --> 00:35:03,280 DAVID J. MALAN: Vi har brug for anden luns af hukommelse, right? 793 00:35:03,280 --> 00:35:05,360 Vi ved ikke, hvordan man gør det endnu, nødvendigvis. 794 00:35:05,360 --> 00:35:11,330 Men jeg slags brug for dette til at ske så at den oprindelige mor med små bogstaver 795 00:35:11,330 --> 00:35:14,170 ender i den ekstra bid af hukommelse. 796 00:35:14,170 --> 00:35:19,770 Og så når jeg ændre det eksemplar, jeg ønsker ikke at ændre denne kopi her. 797 00:35:19,770 --> 00:35:26,020 Jeg stedet ønsker at ændre kun dette kopi således at den oprindelige er uændret. 798 00:35:26,020 --> 00:35:27,980 >> Så lad os se, hvordan vi kan gøre dette. 799 00:35:27,980 --> 00:35:31,800 I copy-1, som allerede har blevet frataget kommentar, 800 00:35:31,800 --> 00:35:33,250 men kommenteres online. 801 00:35:33,250 --> 00:35:36,710 Vi i stedet gøre det following-- disse linjer er identiske, få mig en streng 802 00:35:36,710 --> 00:35:38,340 og kalder det s. 803 00:35:38,340 --> 00:35:43,500 Men lad os nu se på et af vores mest komplekse, men den sidste af kompleksiteten 804 00:35:43,500 --> 00:35:47,340 for en stund, linje 16 gør præcis dette. 805 00:35:47,340 --> 00:35:49,400 Så hvis din comfy med den billede, vi bare drew-- 806 00:35:49,400 --> 00:35:51,790 give mig en ny luns af hukommelse, kopiere alt i det, 807 00:35:51,790 --> 00:35:53,730 lad os se, hvordan vi oversætter det til kode. 808 00:35:53,730 --> 00:35:59,400 >> Så linje 16, på venstre side, char * t giver mig denne boks herovre. 809 00:35:59,400 --> 00:36:00,230 Det er alt, den gør. 810 00:36:00,230 --> 00:36:03,240 På højre side, m Alloc, eller malloc, 811 00:36:03,240 --> 00:36:06,480 er hukommelse tildeling, super fancy, en kryptisk måde bare at sige 812 00:36:06,480 --> 00:36:07,640 give mig en luns af hukommelse. 813 00:36:07,640 --> 00:36:09,290 Hvor meget hukommelse har vi brug for? 814 00:36:09,290 --> 00:36:10,910 Tja, er lidt af en stor udtryk. 815 00:36:10,910 --> 00:36:12,570 Men lad os se, hvad der står her. 816 00:36:12,570 --> 00:36:15,940 Så dette er naturligvis, er at give mig strengen længde s. 817 00:36:15,940 --> 00:36:19,094 Så mor det bør være hvad? 818 00:36:19,094 --> 00:36:21,010 Så bare tre, ikke? mor er tre tegn. 819 00:36:21,010 --> 00:36:22,830 Du behøver ikke tælle backslash nul, når du 820 00:36:22,830 --> 00:36:25,960 taler om længden af ​​en streng, det er faktisk den humane synlige bogstaver. 821 00:36:25,960 --> 00:36:28,020 Så mor, så det giver mig 3. 822 00:36:28,020 --> 00:36:31,170 Men vent et øjeblik, jeg nu tilsætte 1. 823 00:36:31,170 --> 00:36:34,861 Hvorfor har jeg rent faktisk ønsker at afsætte 4 byte og ikke kun 3? 824 00:36:34,861 --> 00:36:35,360 Ja? 825 00:36:35,360 --> 00:36:36,910 >> PUBLIKUM: For sentinel værdi? 826 00:36:36,910 --> 00:36:38,951 >> DAVID J. MALAN: Præcis, for at sentinel værdi. 827 00:36:38,951 --> 00:36:40,840 For omvendt skråstreg nul, Jeg har brug for 4 byte alt. 828 00:36:40,840 --> 00:36:42,870 Så jeg har brug for længden af strengen plus 1. 829 00:36:42,870 --> 00:36:45,400 Og så bare for god measure-- selvom på dette system, 830 00:36:45,400 --> 00:36:49,390 det altid vil være 1-- jeg siger multipliceres af størrelsen af ​​en char. 831 00:36:49,390 --> 00:36:51,552 Slår ud sizeof er en operatør i C, der 832 00:36:51,552 --> 00:36:53,260 bare fortæller dig antal bytes, der er 833 00:36:53,260 --> 00:36:54,700 der kræves til en bestemt type data. 834 00:36:54,700 --> 00:36:57,740 Det virker ikke til arrays, typisk, nogle gange er det ikke. 835 00:36:57,740 --> 00:36:59,210 Men i det generelle tilfælde, no. 836 00:36:59,210 --> 00:37:02,330 Men det vil fortælle mig, hvor mange bytes en char er, som viser sig altid 1. 837 00:37:02,330 --> 00:37:04,080 Så det er ligesom at gange med 1. 838 00:37:04,080 --> 00:37:05,900 >> Så super kryptisk leder linje kode. 839 00:37:05,900 --> 00:37:09,320 Men alt det gør, er giver mig en luns af hukommelse. 840 00:37:09,320 --> 00:37:13,590 Men det synes at være at kopiere noget i denne hukommelse? 841 00:37:13,590 --> 00:37:14,560 Ikke endnu. 842 00:37:14,560 --> 00:37:22,040 Og så hvad gør jeg på linje 22, og 23, 24, 25, ja, jeg simpelthen gøre dette. 843 00:37:22,040 --> 00:37:23,760 Og det er en slags gamle skole ting nu. 844 00:37:23,760 --> 00:37:26,010 Dette er ligesom pset 2, hvor du bare flytte tingene 845 00:37:26,010 --> 00:37:28,620 rundt i hukommelsen, eller snarere i strenge. 846 00:37:28,620 --> 00:37:31,920 >> Så jeg iteration fra 0 til længden af ​​strengen s. 847 00:37:31,920 --> 00:37:37,820 Og jeg kopiere den i'te karakter i s i den i'te tegn i t. 848 00:37:37,820 --> 00:37:41,820 Og fordi jeg, programmøren, lavet Sørg for at afsætte præcis som mange bytes 849 00:37:41,820 --> 00:37:44,600 som jeg har brug for, det er perfekt en-til-en-forhold. 850 00:37:44,600 --> 00:37:47,060 Og jeg kopiere mor i små bogstaver til den nye. 851 00:37:47,060 --> 00:37:50,170 Og så endelig, jeg gør denne linje. 852 00:37:50,170 --> 00:37:54,637 Og så effekten er kun at udnytte denne t her. 853 00:37:54,637 --> 00:37:56,470 Så en masse til at absorbere, men hvis du bare overveje 854 00:37:56,470 --> 00:37:58,220 hvad der virkelig foregår på under kølerhjelmen 855 00:37:58,220 --> 00:38:00,880 er bare at flytte disse bytes rundt, alt, 856 00:38:00,880 --> 00:38:06,617 er nødvendig for at løse dette problem er bare for at give os denne luns af hukommelse. 857 00:38:06,617 --> 00:38:08,450 Nu med risiko for overvældende, lad mig vise 858 00:38:08,450 --> 00:38:13,200 et andet eksempel, som er næsten identiske, bortset fra denne ene 859 00:38:13,200 --> 00:38:14,350 linje kode. 860 00:38:14,350 --> 00:38:18,870 Så dette er hacker-version af dette program, hvis du vil. 861 00:38:18,870 --> 00:38:21,050 Men lad os bare destillere det ind i, hvad der foregår. 862 00:38:21,050 --> 00:38:28,920 Linje 24 bruges til at være denne t beslag i får s beslag i. 863 00:38:28,920 --> 00:38:33,370 Nu, jeg ændre dette til den langt mere kryptiske stjerne t 864 00:38:33,370 --> 00:38:36,280 plus 1 er lig med stjerne s plus 1. 865 00:38:36,280 --> 00:38:38,702 >> Så hvad der sker, og hvorfor har vi en stjerne karakter? 866 00:38:38,702 --> 00:38:41,410 Vi har set stjernen før, og det bliver brugt forskelligt her. 867 00:38:41,410 --> 00:38:45,490 Vi har tidligere set char *, nu jeg ser En stjerne i starten, og det er OK. 868 00:38:45,490 --> 00:38:48,190 Fordi det viser sig, at vi kan slags udlede lige 869 00:38:48,190 --> 00:38:50,280 fra de første principper, hvad der foregår. 870 00:38:50,280 --> 00:38:53,860 Så bare for at være klar, hvad er s? 871 00:38:53,860 --> 00:38:55,052 I sidste uge var det en streng. 872 00:38:55,052 --> 00:38:56,260 Det er ikke tilstrækkeligt længere. 873 00:38:56,260 --> 00:38:57,690 Hvad er s, specifikt? 874 00:38:57,690 --> 00:38:58,590 >> PUBLIKUM: [uhørligt] 875 00:38:58,590 --> 00:38:59,881 >> DAVID J. MALAN: Det er en pointer. 876 00:38:59,881 --> 00:39:02,610 Det er adressen på første tegn, vi har skrevet i. 877 00:39:02,610 --> 00:39:04,780 OK, hvad er t? 878 00:39:04,780 --> 00:39:05,660 >> PUBLIKUM: [uhørligt] 879 00:39:05,660 --> 00:39:07,950 >> DAVID J. MALAN: Den adressen på den første byte 880 00:39:07,950 --> 00:39:10,490 i t, at luns af hukommelse omfordelt. 881 00:39:10,490 --> 00:39:14,720 Så det viser sig, at når vi gentage fra 0 på op til strengen 882 00:39:14,720 --> 00:39:17,424 length-- først og fremmest, jeg starter ved 0, fordi 883 00:39:17,424 --> 00:39:18,840 af denne gamle skole for loop ting. 884 00:39:18,840 --> 00:39:22,400 Så bare for enkelhed, lad os antager, at den første linje kode 885 00:39:22,400 --> 00:39:23,760 er egentlig bare det, højre. 886 00:39:23,760 --> 00:39:26,080 Hvis jeg er nul, tilføjer nul til noget formodentlig 887 00:39:26,080 --> 00:39:27,540 kommer ikke til at have en effekt. 888 00:39:27,540 --> 00:39:28,560 >> Så hvad er denne ordsprog? 889 00:39:28,560 --> 00:39:31,600 Det viser sig, at stjernen operatør i denne sammenhæng 890 00:39:31,600 --> 00:39:33,700 er dereference operatør, som er lige 891 00:39:33,700 --> 00:39:37,530 en fancy måde at sige gå til følgende adresse. 892 00:39:37,530 --> 00:39:42,080 Så hvis r er adressen på den første karakter i denne klump hukommelse, 893 00:39:42,080 --> 00:39:43,630 * s midler gå der. 894 00:39:43,630 --> 00:39:45,630 Og fordi vi har tegnet billedet på denne måde, 895 00:39:45,630 --> 00:39:47,430 du kan vedtage Følgende mental model. 896 00:39:47,430 --> 00:39:51,030 Hvis dette er s, og du siger * s, * s lidt ligesom slisker og stiger, 897 00:39:51,030 --> 00:39:54,540 hvis du kan huske spillet fra barndommen, er som følger, 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 det samme. 900 00:39:57,080 --> 00:39:59,855 Så start her, gå til sin luns. 901 00:39:59,855 --> 00:40:03,350 Jeg kan ikke bare trække på denne skærm på den måde. 902 00:40:03,350 --> 00:40:05,560 * t betyder at gå her. 903 00:40:05,560 --> 00:40:08,830 Og så, for-løkken er lige siger 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 gør jeg det optælling? 906 00:40:12,890 --> 00:40:15,430 Jeg har brug for at fortryde, hvad jeg lige slettet. 907 00:40:15,430 --> 00:40:18,140 Dette er, hvad der generelt kaldes pointer aritmetik, som 908 00:40:18,140 --> 00:40:20,040 betyder matematik med adresser. 909 00:40:20,040 --> 00:40:22,460 >> Hvis de i denne for-løkke, Jeg bliver ved forøgelse i, 910 00:40:22,460 --> 00:40:26,880 og s er en adresse og t er et adresse, hvis jeg bare holde tilføje 1, 911 00:40:26,880 --> 00:40:31,406 det betyder bare at bevæge os fremad, og frem, og sender i hukommelsen. 912 00:40:31,406 --> 00:40:34,030 Det er ligesom Oxford Street, gade, CS bygningen er på. 913 00:40:34,030 --> 00:40:36,490 CS bygninger er på 33 Oxford Street. 914 00:40:36,490 --> 00:40:39,870 Så hvis du skulle gøre 33 Oxford Street plus 1, 915 00:40:39,870 --> 00:40:42,870 der bringer dig til 34 Oxford Street, derefter 35 Oxford Street, 916 00:40:42,870 --> 00:40:46,380 derefter 36 Oxford Street, uanset de bygninger faktisk er - hvis de findes. 917 00:40:46,380 --> 00:40:50,540 Og ja, det er alt, vi gør her med pointer aritmetik. 918 00:40:50,540 --> 00:40:53,820 >> Så det er en super mystiske måde at udtrykke os selv. 919 00:40:53,820 --> 00:40:56,160 Men alt det der sker under kølerhjelmen 920 00:40:56,160 --> 00:40:59,330 er bare at følge disse adresser, ligesom efter et kort, hvis du vil, 921 00:40:59,330 --> 00:41:02,692 eller efter pile som Vi har tegnet på skærmen. 922 00:41:02,692 --> 00:41:04,910 OK, til en masse fordøje. 923 00:41:04,910 --> 00:41:10,410 Ethvert spørgsmål om syntaks, koncepter, pegepinde, malloc eller lignende. 924 00:41:10,410 --> 00:41:11,480 Ja, herovre først. 925 00:41:11,480 --> 00:41:13,755 >> PUBLIKUM: Så hvor der siger * t lig toupper * t, 926 00:41:13,755 --> 00:41:15,575 er, at han er at udnytte alle breve eller bare-- 927 00:41:15,575 --> 00:41:17,283 >> DAVID J. MALAN: Ah, rigtig godt spørgsmål. 928 00:41:17,283 --> 00:41:19,805 Så i denne linje her, 31, dette vil kapitalisere 929 00:41:19,805 --> 00:41:21,430 det første bogstav eller alle bogstaverne. 930 00:41:21,430 --> 00:41:23,460 Så lad os besvare dette ved at gå tilbage til første principper. 931 00:41:23,460 --> 00:41:26,168 Og første principper her mener jeg bare gå til de grundlæggende definitioner 932 00:41:26,168 --> 00:41:27,000 af hvad der er involveret. 933 00:41:27,000 --> 00:41:29,770 Så toupper er en funktion der udnytter en char. 934 00:41:29,770 --> 00:41:30,530 Det er alt. 935 00:41:30,530 --> 00:41:36,740 * t betyder gå til first-- gå til adressen i t. 936 00:41:36,740 --> 00:41:40,350 Så i billedet, hvis dette er den luns hukommelse vi tildelt med malloc, 937 00:41:40,350 --> 00:41:43,310 og det er t, * t betyder gå her. 938 00:41:43,310 --> 00:41:46,710 >> I mellemtiden er du passerer denne værdi, små bogstaver m 939 00:41:46,710 --> 00:41:50,040 til toupper, du får tilbage hovedstaden M, hvor er du sætte det? 940 00:41:50,040 --> 00:41:52,410 Du lægger det på den samme placering. 941 00:41:52,410 --> 00:41:55,540 Og det ved denne logik af disse grundlæggende definitioner det er kun 942 00:41:55,540 --> 00:41:58,792 kapitalisere det første bogstav medmindre du gentage med I eller en 943 00:41:58,792 --> 00:42:02,000 for-løkke eller en while-løkke, er det ikke kommer at gøre noget mere end du spørger det. 944 00:42:02,000 --> 00:42:02,583 Godt spørgsmål. 945 00:42:02,583 --> 00:42:03,237 Ja? 946 00:42:03,237 --> 00:42:05,369 >> PUBLIKUM: Hvorfor har du bruger dereference metode snarere end 947 00:42:05,369 --> 00:42:05,979 array? 948 00:42:05,979 --> 00:42:07,395 >> DAVID J. MALAN: Ah, godt spørgsmål. 949 00:42:07,395 --> 00:42:10,672 Hvorfor ville du bruge dereference metode i stedet for array metode? 950 00:42:10,672 --> 00:42:12,130 Ingen særlig grund, for at være ærlig. 951 00:42:12,130 --> 00:42:15,290 Og i virkeligheden, for det form for eksempel til højre, 952 00:42:15,290 --> 00:42:17,556 Jeg er bare argumenterer gøre programmet mere kompliceret, 953 00:42:17,556 --> 00:42:19,680 flere øjne ruder i, folk tjekker 954 00:42:19,680 --> 00:42:22,830 fordi det ser super mystiske, men selvom det er at gøre det samme. 955 00:42:22,830 --> 00:42:26,695 Og så, helt ærligt, det er en unødigt 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 stadig godt design, fem ud af fem for design, 958 00:42:29,580 --> 00:42:33,140 uanset om det er i holderen notation eller markøren notation. 959 00:42:33,140 --> 00:42:36,299 Men-- især når vi får senere i kurset i pset 5 960 00:42:36,299 --> 00:42:39,340 når vi gennemføre denne ordbog, Jeg har nævnt et par gange-- 961 00:42:39,340 --> 00:42:42,300 Vi vil faktisk bekymrer sig om lavt niveau lageradresser 962 00:42:42,300 --> 00:42:44,140 at vi virkelig forstår hvad sker der. 963 00:42:44,140 --> 00:42:48,300 >> Men, for nu viser det sig, at denne linje kode her firkantede parenteser 964 00:42:48,300 --> 00:42:49,900 ikke rigtig eksisterer. 965 00:42:49,900 --> 00:42:52,230 De er, hvad der kaldes syntaktisk sukker, som 966 00:42:52,230 --> 00:42:58,390 er blot en underligt cool måde at sige det compiler konverterer firkantede parenteser til at være 967 00:42:58,390 --> 00:43:00,420 at matematisk udtryk. 968 00:43:00,420 --> 00:43:02,660 Så det er en menneskelig konvention at være i stand til bare at skrive 969 00:43:02,660 --> 00:43:04,220 disse meget brugervenlige beslag. 970 00:43:04,220 --> 00:43:06,850 Men hvad compileren, klang, er virkelig gør enhver tid 971 00:43:06,850 --> 00:43:10,970 du skriver, hvad der er fremhævet i overensstemmelse 24, under emhætten er det virkelig 972 00:43:10,970 --> 00:43:12,330 konvertere den til dette. 973 00:43:12,330 --> 00:43:16,200 Det er bare mere behagelig som et menneske at læse og skrive kode som linje 24. 974 00:43:16,200 --> 00:43:18,530 Men i sidste ende dem, uddannelse hjul også komme ud 975 00:43:18,530 --> 00:43:21,780 når ens egen komfort bliver stærkere. 976 00:43:21,780 --> 00:43:27,240 >> Okay, så huske dengang, at dette var slags største problem 977 00:43:27,240 --> 00:43:27,807 vi løb ind. 978 00:43:27,807 --> 00:43:30,640 Og det er, hvad udløste hele denne pokkers samtale om pointere, 979 00:43:30,640 --> 00:43:32,340 og adresser og kopiering ting. 980 00:43:32,340 --> 00:43:35,410 Det var fordi vi sikkerhedsafbryderen over denne dumme, dumme problem, hvorved 981 00:43:35,410 --> 00:43:38,830 Jeg implementeret logically-- med Lauren heroppe på demoen og appelsinjuice 982 00:43:38,830 --> 00:43:43,770 i milk-- en helt algoritmisk korrekt funktion 983 00:43:43,770 --> 00:43:47,010 til at bytte to variabler ' værdier, men den skid 984 00:43:47,010 --> 00:43:50,550 ikke har nogen vedvarende eller permanente, 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 en nøddeskal, hvorfor er dette implementering af swap 987 00:43:54,650 --> 00:43:58,740 logisk korrekt, men har ingen indvirkning om de variabler, der er gået til det, 988 00:43:58,740 --> 00:44:01,119 ligesom x og y til main? 989 00:44:01,119 --> 00:44:02,410 Hvad var kernen i problemet? 990 00:44:02,410 --> 00:44:02,909 Ja? 991 00:44:02,909 --> 00:44:05,532 PUBLIKUM: Fordi variabel lavet kopier af variabel i passet 992 00:44:05,532 --> 00:44:06,240 gennem funktion. 993 00:44:06,240 --> 00:44:09,060 >> DAVID J. MALAN: Præcis, når du passerer variabler i en funktion, eller argumenter 994 00:44:09,060 --> 00:44:11,030 ind i en funktion, de er bestået af kopi, som 995 00:44:11,030 --> 00:44:14,770 betyder, at du får et identisk leder mønster af bits til både x og y, 996 00:44:14,770 --> 00:44:15,955 kaldes her a og b. 997 00:44:15,955 --> 00:44:18,080 Og du kan gøre noget du vil med disse kopier, 998 00:44:18,080 --> 00:44:20,657 men de kommer til at have nogen virkning på den kaldende funktion. 999 00:44:20,657 --> 00:44:22,990 Og i virkeligheden, vi trak at billede på skærmen, tilbagekaldelse 1000 00:44:22,990 --> 00:44:25,520 sidste gang, hvor hvis du virkelig tænke over, hvad der er 1001 00:44:25,520 --> 00:44:28,570 foregår under hood-- hvis dette er din computers hukommelse, 1002 00:44:28,570 --> 00:44:31,650 og hernede er luns af hukommelse, der bruges til main, 1003 00:44:31,650 --> 00:44:34,020 dette er chunk hukommelse, der bruges til swap, 1004 00:44:34,020 --> 00:44:37,090 og så selvom main har to variabler, x og y, 1005 00:44:37,090 --> 00:44:41,840 swap kan have identiske leder værdier, som begge er 1 og 2, 1006 00:44:41,840 --> 00:44:44,520 men de er helt forskellige bidder af hukommelsen. 1007 00:44:44,520 --> 00:44:46,130 >> Så vi har brug for en løsning på dette. 1008 00:44:46,130 --> 00:44:51,580 Og helt ærligt, ville det ud til, at vi nu har en løsning på dette problem, højre. 1009 00:44:51,580 --> 00:44:55,760 Hvis vi nu har mulighed for at manipulere ting ved hjælp af adresser 1010 00:44:55,760 --> 00:44:59,310 og, en slags sliske og stiger stil, skal du følge disse pile 1011 00:44:59,310 --> 00:45:02,820 og gå overalt vi ønsker i hukommelsen, kunne vi ikke 1012 00:45:02,820 --> 00:45:06,220 løse dette problem ved passerer fra vigtigste at bytte 1013 00:45:06,220 --> 00:45:09,650 ikke de værdier, vi ønsker at swap, men bare intuitivt 1014 00:45:09,650 --> 00:45:11,630 hvad kunne vi passerer at bytte i stedet? 1015 00:45:11,630 --> 00:45:12,620 >> [Indskyde VOICES] 1016 00:45:12,620 --> 00:45:15,244 >> DAVID J. MALAN: Hvorfor vi ikke bare passere det adresserne, ikke? 1017 00:45:15,244 --> 00:45:17,470 Hvorfor har vi ikke give swap en skattekort, hvis du vil, 1018 00:45:17,470 --> 00:45:20,950 der fører det til faktiske værdier x og y. 1019 00:45:20,950 --> 00:45:24,340 Lad os bytte, rent faktisk at ændre disse oprindelige bits, snarere end 1020 00:45:24,340 --> 00:45:26,797 blot passerer kopier af bits. 1021 00:45:26,797 --> 00:45:29,130 Og så, i virkeligheden, det er hvad er kommer til at være løsningen. 1022 00:45:29,130 --> 00:45:31,899 Denne version her er klart dårlig og mangelfuld. 1023 00:45:31,899 --> 00:45:35,190 Og nu, ved første øjekast, det bare ser ligesom vi tilføjet en masse stjerner tilfældigt 1024 00:45:35,190 --> 00:45:37,106 og krydsede vores fingre at det ville kompilere. 1025 00:45:37,106 --> 00:45:38,460 Men, ville det nu kompilere. 1026 00:45:38,460 --> 00:45:40,090 >> Men lad os se, hvad disse ting betyder. 1027 00:45:40,090 --> 00:45:43,990 Og desværre forfattere C kunne have valgt et andet symbol 1028 00:45:43,990 --> 00:45:46,380 at gøre dette til en lille klarere, men stjernen operatør 1029 00:45:46,380 --> 00:45:48,610 har forskellig betydning i to forskellige sammenhænge. 1030 00:45:48,610 --> 00:45:50,890 Og vi har set begge, men lad os skelne. 1031 00:45:50,890 --> 00:45:55,310 >> Så op på toppen er der, når jeg har skiftet a og b 1032 00:45:55,310 --> 00:46:00,470 fra at være int s i dårlige version for at int stjerner, a og b, 1033 00:46:00,470 --> 00:46:01,740 Tidligere blev heltal. 1034 00:46:01,740 --> 00:46:05,752 Hvad er a og b nu det gode, grønne version? 1035 00:46:05,752 --> 00:46:06,900 De er adresser. 1036 00:46:06,900 --> 00:46:09,610 Adresser på hvad, for at være klar? 1037 00:46:09,610 --> 00:46:10,770 Adresser på heltal. 1038 00:46:10,770 --> 00:46:12,520 Så det faktum, at jeg er siger int stjerne midler 1039 00:46:12,520 --> 00:46:15,440 dette er adressen på et heltal, specifikt. 1040 00:46:15,440 --> 00:46:19,120 >> Så nu meddelelse i de linjer kode, noget andet har også ændret sig. 1041 00:46:19,120 --> 00:46:22,770 tmp forbliver den samme, fordi det er bare den midlertidige heltal, 1042 00:46:22,770 --> 00:46:24,110 ingen hukommelse magi der. 1043 00:46:24,110 --> 00:46:26,370 Men en nu brug for en stjerne. 1044 00:46:26,370 --> 00:46:28,560 Og i virkeligheden, hver anden omtale af a og b, 1045 00:46:28,560 --> 00:46:31,780 bemærke, at alle, der er skifter fra rødt til grønt 1046 00:46:31,780 --> 00:46:34,209 er, at jeg forudfastsætte disse variable med stjerner. 1047 00:46:34,209 --> 00:46:35,750 Fordi jeg ikke ønsker at kopiere a og b. 1048 00:46:35,750 --> 00:46:40,350 For hvis jeg bare kopiere a og b og swap a og b, hvad er det jeg faktisk at bytte? 1049 00:46:40,350 --> 00:46:43,760 Bare adresser, jeg ønsker at bytte hvad der er på disse adresser. 1050 00:46:43,760 --> 00:46:44,860 Jeg ønsker at gå der. 1051 00:46:44,860 --> 00:46:48,000 Og så stjernen operatør inde i min funktion, 1052 00:46:48,000 --> 00:46:51,700 ikke inde i parameter listen, betyder du går til disse adresser 1053 00:46:51,700 --> 00:46:54,490 og faktisk ændre disse værdier. 1054 00:46:54,490 --> 00:46:56,500 >> Så hvad betyder billedet nu se ud som i stedet. 1055 00:46:56,500 --> 00:47:03,250 Tja, hvis i stedet jeg passerer i for A og B ikke 1 og 2-- 1056 00:47:03,250 --> 00:47:05,790 Jeg faktisk nødt til at tilføje én anden definition her. 1057 00:47:05,790 --> 00:47:09,030 Så antage, at denne luns hukommelse er ved placeringen 10. 1058 00:47:09,030 --> 00:47:12,960 >> Dette er ved stedet 11, men dette er lidt af en forenkling, 1059 00:47:12,960 --> 00:47:18,900 Jeg har nu to valg gør jeg passerer x og y eller skal jeg videregive deres adresser? 1060 00:47:18,900 --> 00:47:22,500 Hvis jeg videregive deres adresser som dette, jeg lige 1061 00:47:22,500 --> 00:47:25,390 nu nødt til at gennemføre swap pr den grønne kode 1062 00:47:25,390 --> 00:47:29,080 således at når den ser en og når det ser derfor b, betyder det ikke bare kopiere a og b 1063 00:47:29,080 --> 00:47:30,540 og flyt mælk og appelsinjuice. 1064 00:47:30,540 --> 00:47:32,664 Mælk og appelsinjuice metafor bryder nu ned, 1065 00:47:32,664 --> 00:47:35,060 fordi de er kopper af flydende og ikke kort. 1066 00:47:35,060 --> 00:47:37,750 Vi har i stedet brug for at gå at behandle 10 og vi 1067 00:47:37,750 --> 00:47:42,420 nødt til at gå til adressen 11, og derefter udføre at swapping logik. 1068 00:47:42,420 --> 00:47:45,580 >> Så logikken er den samme, men vi har brug for en lidt anden måde 1069 00:47:45,580 --> 00:47:47,160 af brug af disse variabler. 1070 00:47:47,160 --> 00:47:52,400 Og så i sidste ende, hvad det Programmet har til at ligne er det. 1071 00:47:52,400 --> 00:47:56,610 I swap.c bogstaveligt kopieret og indsættes den grønne version. 1072 00:47:56,610 --> 00:47:58,450 Men jeg har brug for at lave en ændring. 1073 00:47:58,450 --> 00:48:00,180 Det er ikke nok bare at ændre swap. 1074 00:48:00,180 --> 00:48:03,830 Hvilke andre linje kode skal jeg ændre? 1075 00:48:03,830 --> 00:48:04,330 Ja? 1076 00:48:04,330 --> 00:48:05,770 >> PUBLIKUM: Hvor det tager argumenterne. 1077 00:48:05,770 --> 00:48:07,603 >> DAVID J. MALAN: Hvor det tager sin opfattelse. 1078 00:48:07,603 --> 00:48:09,985 Så hvis jeg rulle op til main, jeg kan ikke bare passere i x og y, 1079 00:48:09,985 --> 00:48:12,820 og, lover jeg, den sidste stykke ny syntaks dag. 1080 00:48:12,820 --> 00:48:17,200 Jeg har brug for at passere i ikke x og y men adressen af ​​x og y. 1081 00:48:17,200 --> 00:48:20,400 Og det viser sig, symbolet at forfatterne af C valgte 1082 00:48:20,400 --> 00:48:23,860 er, hvis du bruger et og-tegn her, for ikke at forveksles med bitvis tegnet, 1083 00:48:23,860 --> 00:48:27,130 hvis du bruger et og-tegn her og et og-tegn her, 1084 00:48:27,130 --> 00:48:29,570 dette tal ud for dig, hvad er adressen på x, 1085 00:48:29,570 --> 00:48:31,740 måske er det 10, hvad er adresse y, måske er det 1086 00:48:31,740 --> 00:48:35,400 11, og passerer dem i stedet. 1087 00:48:35,400 --> 00:48:37,210 >> Så meget at absorbere alle på én gang. 1088 00:48:37,210 --> 00:48:40,190 Men lad os nu se hurtigt i vores resterende fire minutter 1089 00:48:40,190 --> 00:48:42,150 hvor tingene kan gå galt. 1090 00:48:42,150 --> 00:48:45,120 Og som en sidebemærkning, faktisk Jeg tog dette billede, 1091 00:48:45,120 --> 00:48:46,920 TF tog dette billede for et år eller to siden. 1092 00:48:46,920 --> 00:48:49,190 Så dette er tilbage hjørne af Eliot Dining Hall. 1093 00:48:49,190 --> 00:48:52,310 Pointere er måske den sværeste emne, som vi dækker i CS50. 1094 00:48:52,310 --> 00:48:54,810 Så hvis du bekymre dig den slags af hældningen er som måske er det 1095 00:48:54,810 --> 00:48:56,770 mere af en hockeystav som dette, indser 1096 00:48:56,770 --> 00:49:00,160 vi slags nærmer sig et højdepunkt i form af den konceptuelle kompleksitet. 1097 00:49:00,160 --> 00:49:02,300 >> Og jeg opdrage dette foto, fordi jeg sværger 1098 00:49:02,300 --> 00:49:05,920 til Gud, i efteråret 1996, hvor jeg tog CS50 med min undervisning kolleger, 1099 00:49:05,920 --> 00:49:09,620 Nishat Mehta, han sad mig i hjørne af Eliot D. Hall frokosten, 1100 00:49:09,620 --> 00:49:12,330 eller middag, eller noget at prøve til at hjælpe mig med at forstå pointere. 1101 00:49:12,330 --> 00:49:16,520 Og det er her, jeg var uger efter den blev indført i foredrag, når 1102 00:49:16,520 --> 00:49:18,170 Jeg endelig forstod pointere. 1103 00:49:18,170 --> 00:49:20,590 Og jeg er håbefuld, at dette vil klikke langt hurtigere for dig. 1104 00:49:20,590 --> 00:49:23,540 Men indse dette absolut blandt de mere sofistikerede emner 1105 00:49:23,540 --> 00:49:24,420 Vi har kigget på. 1106 00:49:24,420 --> 00:49:25,819 Men det er blandt de mest magtfulde. 1107 00:49:25,819 --> 00:49:28,860 Og når du får det, det er virkelig alt bare gå til endelig komme sammen. 1108 00:49:28,860 --> 00:49:31,460 Så forvisset det ikke har brug for at alle vask i dag. 1109 00:49:31,460 --> 00:49:32,980 >> Så her er det sidste program vi kommer til at se på. 1110 00:49:32,980 --> 00:49:35,605 Og vi kommer til at ende med en hurtig tre minutter af claymation 1111 00:49:35,605 --> 00:49:37,030 lavet af vores ven, Nick Parlante. 1112 00:49:37,030 --> 00:49:41,440 Her er et program, der 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 af heltal, alias pointere. 1114 00:49:44,780 --> 00:49:48,125 Vi derefter allokere nok hukommelse til at gemme en int 1115 00:49:48,125 --> 00:49:51,344 og gemme adressen af denne hukommelse i x. 1116 00:49:51,344 --> 00:49:53,260 Så det er endnu nemmere end eksemplet før. 1117 00:49:53,260 --> 00:49:56,100 Giv mig fire bytes hukommelse, der er på størrelse med en int, 1118 00:49:56,100 --> 00:49:58,000 og sætte denne adresse i x. 1119 00:49:58,000 --> 00:50:01,070 Denne linje betyder her gå til adressen i x 1120 00:50:01,070 --> 00:50:05,270 og sætte betydningen af liv, nummer 42 der. 1121 00:50:05,270 --> 00:50:07,710 Men denne linje bekymrer mig. 1122 00:50:07,710 --> 00:50:12,620 Stjerne y betyder gå til adressen i y, og sætte den uheldige nummer 13 der. 1123 00:50:12,620 --> 00:50:15,780 Hvorfor er det farligt, på dette tidspunkt i story-- omend hurtigt at vide 1124 00:50:15,780 --> 00:50:17,980 i vore svindende minutter her-- hvorfor er det dårligt 1125 00:50:17,980 --> 00:50:19,660 for mig at sige, gå til adressen i y? 1126 00:50:19,660 --> 00:50:21,077 >> PUBLIKUM: Du har ikke [uhørligt]. 1127 00:50:21,077 --> 00:50:22,910 DAVID J. MALAN: Jeg har ikke sætte noget i y. 1128 00:50:22,910 --> 00:50:25,520 Så hvad er værdien af ​​y, på dette tidspunkt i historien? 1129 00:50:25,520 --> 00:50:26,570 Vi har ingen idé. 1130 00:50:26,570 --> 00:50:29,190 Det er nogle skrald værdi og heller ikke Binky kender. 1131 00:50:29,190 --> 00:50:32,532 Hvis vi kunne ende på denne note. 1132 00:50:32,532 --> 00:50:34,832 >> [VIDEO PLAYBACK] 1133 00:50:34,832 --> 00:50:36,500 >> -Hey, Binky, vågne op. 1134 00:50:36,500 --> 00:50:39,140 Det er tid til pointer sjov. 1135 00:50:39,140 --> 00:50:40,210 >> -Hvad er det? 1136 00:50:40,210 --> 00:50:41,690 Lær om pointers? 1137 00:50:41,690 --> 00:50:43,570 Åh, goody. 1138 00:50:43,570 --> 00:50:46,600 >> Tja, komme i gang, jeg tror vi er vil få brug for et par pointers. 1139 00:50:46,600 --> 00:50:47,380 >> -OK. 1140 00:50:47,380 --> 00:50:51,120 Denne kode tildeler to pejlemærker der kan pege på heltal. 1141 00:50:51,120 --> 00:50:53,557 >> -OK, Godt jeg ser to pointere, men de 1142 00:50:53,557 --> 00:50:55,140 synes ikke at pege på noget. 1143 00:50:55,140 --> 00:50:55,970 >> -Det er rigtigt. 1144 00:50:55,970 --> 00:50:58,100 Oprindeligt pointere ikke pege på noget. 1145 00:50:58,100 --> 00:51:00,950 De ting, de peger på er kaldet pointees og indstille dem 1146 00:51:00,950 --> 00:51:02,330 er et separat trin. 1147 00:51:02,330 --> 00:51:03,210 >> -OH, Højre, højre. 1148 00:51:03,210 --> 00:51:03,940 Jeg vidste, at. 1149 00:51:03,940 --> 00:51:05,730 De pointees er adskilt. 1150 00:51:05,730 --> 00:51:08,310 Så hvordan kan du tildele en pointee? 1151 00:51:08,310 --> 00:51:11,960 >> -OK, Godt denne kode allokerer en ny heltal pointee, 1152 00:51:11,960 --> 00:51:15,050 og denne del sæt x til at pege på den. 1153 00:51:15,050 --> 00:51:16,240 >> Hey, der ser bedre. 1154 00:51:16,240 --> 00:51:17,743 Så gør det gøre noget. 1155 00:51:17,743 --> 00:51:23,580 >> -OK, Jeg vil dereference markøren X til gemme nummeret 42 i sin pointee. 1156 00:51:23,580 --> 00:51:27,130 Til dette trick, vil jeg har brug for min tryllestav af dereferere. 1157 00:51:27,130 --> 00:51:30,200 >> -Din Tryllestav af dereferere? 1158 00:51:30,200 --> 00:51:32,310 Uh, det, det er fantastisk. 1159 00:51:32,310 --> 00:51:34,270 >> -Det Er hvad koden ser ud. 1160 00:51:34,270 --> 00:51:35,970 Jeg vil bare oprette nummeret og-- 1161 00:51:35,970 --> 00:51:37,070 >> [POP SOUND] 1162 00:51:37,070 --> 00:51:39,140 >> -Hey, Ser der det går. 1163 00:51:39,140 --> 00:51:43,980 Så gør en dereference på x følger på pilen for at få adgang til sin pointee. 1164 00:51:43,980 --> 00:51:46,150 I dette tilfælde, for at lagre 42 derinde. 1165 00:51:46,150 --> 00:51:50,700 Hey, prøve at bruge den til at gemme nummeret 13 gennem den anden pointer, 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 oprettet. 1168 00:51:56,270 --> 00:52:00,380 Og derefter tage staven af dereferere og bare-- 1169 00:52:00,380 --> 00:52:01,646 >> [BUZZER SOUND] 1170 00:52:01,646 --> 00:52:04,080 >> -OH, Hey, der fungerede. 1171 00:52:04,080 --> 00:52:06,470 Sige, øh, Binky, det gør jeg ikke tror dereferere 1172 00:52:06,470 --> 00:52:10,850 y er en god idé, fordi indstillingen op pointee er et separat trin. 1173 00:52:10,850 --> 00:52:12,480 Og jeg tror ikke, vi nogensinde gjorde det. 1174 00:52:12,480 --> 00:52:14,620 >> -Hmm, God pointe. 1175 00:52:14,620 --> 00:52:19,810 >> -Ja, Vi tildelt markøren, y, men vi satte det aldrig til at pege på en pointee. 1176 00:52:19,810 --> 00:52:21,590 >> -Hmm, Meget opmærksomme. 1177 00:52:21,590 --> 00:52:23,215 -Hey, Du søger god der, Binky. 1178 00:52:23,215 --> 00:52:26,390 Kan du lave det, så y punkter til samme pointee som x. 1179 00:52:26,390 --> 00:52:29,290 >> -Sure, Jeg bruge min tryllestav af pointer opgave. 1180 00:52:29,290 --> 00:52:31,970 >> -er Der vil være en problem, som før? 1181 00:52:31,970 --> 00:52:33,790 >> -Nej, Betyder det ikke røre pointees. 1182 00:52:33,790 --> 00:52:35,840 Det ændrer blot én pointer til at pege på den samme thing-- 1183 00:52:35,840 --> 00:52:36,465 >> [Poppende lyd] 1184 00:52:36,465 --> 00:52:37,450 --as anden. 1185 00:52:37,450 --> 00:52:38,440 >> -Ah, javel. 1186 00:52:38,440 --> 00:52:41,200 Nu y peger på det samme sted som x. 1187 00:52:41,200 --> 00:52:42,950 Så vent, nu y er fast. 1188 00:52:42,950 --> 00:52:44,110 Det har en pointee. 1189 00:52:44,110 --> 00:52:47,779 Så du kan prøve staven af dereferere igen for at sende 13 i. 1190 00:52:47,779 --> 00:52:51,110 >> -OH, OK, her går. 1191 00:52:51,110 --> 00:52:52,330 >> -Hey, Se på det. 1192 00:52:52,330 --> 00:52:53,570 Nu dereferere værker på y. 1193 00:52:53,570 --> 00:52:57,900 Og fordi de pejlemærker deler at en pointee, de begge ser 13. 1194 00:52:57,900 --> 00:52:59,952 >> -Ja, Deling, øh, uanset hvad. 1195 00:52:59,952 --> 00:53:01,535 Så vi kommer til at skifte steder nu? 1196 00:53:01,535 --> 00:53:03,730 >> -OH, Ser vi er ude af tid. 1197 00:53:03,730 --> 00:53:04,660 >> -But-- 1198 00:53:04,660 --> 00:53:06,520 >> -Just Huske de tre pointer regler. 1199 00:53:06,520 --> 00:53:09,550 Nummer 1, grundstrukturen er, at du har en pegepind, 1200 00:53:09,550 --> 00:53:11,630 og den peger til et pointee. 1201 00:53:11,630 --> 00:53:13,740 Men markøren og pointee er adskilt. 1202 00:53:13,740 --> 00:53:15,620 Og den fælles fejl er at oprette en pointer 1203 00:53:15,620 --> 00:53:18,000 men at glemme at give det en pointee. 1204 00:53:18,000 --> 00:53:21,170 >> Nummer 2, pointer dereferere starter ved markøren 1205 00:53:21,170 --> 00:53:24,020 og følger sin pilen hen over at få adgang til sin pointee. 1206 00:53:24,020 --> 00:53:27,815 Som vi alle ved, det virker kun, hvis der er en pointee, hvilken slags kommer tilbage 1207 00:53:27,815 --> 00:53:29,260 at herske nummer 1. 1208 00:53:29,260 --> 00:53:31,990 >> Nummer 3, pointer Opgaven tager en pointer 1209 00:53:31,990 --> 00:53:35,330 og ændrer det til at pege på den samme pointee som en anden pointer. 1210 00:53:35,330 --> 00:53:37,150 Så efter opgaven, de to pointere 1211 00:53:37,150 --> 00:53:40,927 vil pege på den samme pointee, undertiden som kaldes deling. 1212 00:53:40,927 --> 00:53:42,510 Og det er alt der er til det, virkelig. 1213 00:53:42,510 --> 00:53:43,130 Bye-bye nu. 1214 00:53:43,130 --> 00:53:43,475 >> [END AFSPIL] 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 Takket være professor Nick Parlante. 1217 00:53:46,246 --> 00:53:47,730 Vi vil se dig i næste uge. 1218 00:53:47,730 --> 00:53:51,706 1219 00:53:51,706 --> 00:53:56,435 >> [ELEKTRONISK musik spiller] 1220 00:53:56,435 --> 00:57:22,775