1 00:00:00,000 --> 00:00:03,395 >> [Muziek] 2 00:00:03,395 --> 00:00:11,031 3 00:00:11,031 --> 00:00:13,280 DAVID J. MALAN: Dit is hetzelfde als een eerstejaars seminar vandaag. 4 00:00:13,280 --> 00:00:14,060 OK. 5 00:00:14,060 --> 00:00:15,024 Dus zeer regenachtige buiten. 6 00:00:15,024 --> 00:00:17,690 Dit heeft de neiging te gebeuren op woensdag, maar des gelegenheid 7 00:00:17,690 --> 00:00:18,700 voor vragen vandaag. 8 00:00:18,700 --> 00:00:22,210 Dus laten we beginnen eigenlijk af met de film in slechts een moment. 9 00:00:22,210 --> 00:00:24,560 Maar we zullen groots beginnen zoals altijd. 10 00:00:24,560 --> 00:00:28,000 >> Dit is CS50, en dit het einde van week 4. 11 00:00:28,000 --> 00:00:30,820 Dus als je ooit hebt bekeken Tv of een film, waarin 12 00:00:30,820 --> 00:00:34,690 is er een aantal computer experts en de politie of de FBI, of een agentschap 13 00:00:34,690 --> 00:00:36,930 probeert om bepaalde vangen tegenstander, nou ja, je hebt 14 00:00:36,930 --> 00:00:40,850 waarschijnlijk gehoord van de uitdrukking "verbeteren," waarbij dat technicus een of andere manier 15 00:00:40,850 --> 00:00:44,750 magisch zoomt in oneindig ver naar de criminelen zien 16 00:00:44,750 --> 00:00:48,640 identiteit of het kenteken zelfs in de glinstering van een spiegel 17 00:00:48,640 --> 00:00:50,390 of de glinstering van het oog van iemand. 18 00:00:50,390 --> 00:00:55,196 Dus inderdaad, laten we eens een kijkje nemen op een paar van zulke scènes van Hollywood. 19 00:00:55,196 --> 00:00:55,862 [VIDEO AFSPELEN] 20 00:00:55,862 --> 00:00:59,243 -OK, Nu laten we een goede blik op je. 21 00:00:59,243 --> 00:01:06,488 22 00:01:06,488 --> 00:01:07,415 >> -Hou vast. 23 00:01:07,415 --> 00:01:08,267 Lopen dat terug. 24 00:01:08,267 --> 00:01:09,121 >> -Even wachten. 25 00:01:09,121 --> 00:01:11,300 Ga rechts. 26 00:01:11,300 --> 00:01:12,209 >> -Er, Bevriezen dat. 27 00:01:12,209 --> 00:01:12,750 -Volledig scherm. 28 00:01:12,750 --> 00:01:13,558 -OK, Bevriezen dat. 29 00:01:13,558 --> 00:01:14,820 -Tighten Op dat, wil je? 30 00:01:14,820 --> 00:01:16,530 -Vector In op die man door het achterwiel. 31 00:01:16,530 --> 00:01:19,400 -zoom In hier op deze plek. 32 00:01:19,400 --> 00:01:22,846 -Met De juiste apparatuur, het beeld kan worden uitgebreid en geslepen. 33 00:01:22,846 --> 00:01:24,065 -Wat is dat? 34 00:01:24,065 --> 00:01:25,600 -Het Is een verbetering programma. 35 00:01:25,600 --> 00:01:26,860 Kun je duidelijk dat je geen? 36 00:01:26,860 --> 00:01:27,890 Ik weet het niet. 37 00:01:27,890 --> 00:01:29,050 Laten we verbeteren het. 38 00:01:29,050 --> 00:01:31,575 >> -Verbeter Sectie A6. 39 00:01:31,575 --> 00:01:33,642 >> -Ik Verbeterde het detail, en-- Ik denk dat er 40 00:01:33,642 --> 00:01:35,433 genoeg te verbeteren, laat het aan mijn scherm. 41 00:01:35,433 --> 00:01:37,080 -Ik Versterkt de reflectie in haar ogen. 42 00:01:37,080 --> 00:01:38,830 >> -Laten We dit doorlopen video toebehoren. 43 00:01:38,830 --> 00:01:40,100 -Edgar, Kunt u dit verbeteren? 44 00:01:40,100 --> 00:01:41,875 >> -Hou vol. 45 00:01:41,875 --> 00:01:44,010 >> -Ik Heb gewerkt aan deze reflectie. 46 00:01:44,010 --> 00:01:44,995 >> Reflectie -Someone's. 47 00:01:44,995 --> 00:01:45,495 -Reflectie. 48 00:01:45,495 --> 00:01:47,399 -Er Is een weerspiegeling van de man gezicht. 49 00:01:47,399 --> 00:01:48,065 -De Reflectie. 50 00:01:48,065 --> 00:01:48,981 -Er Is een reflectie. 51 00:01:48,981 --> 00:01:50,600 -zoom In op de spiegel. 52 00:01:50,600 --> 00:01:52,712 -U Kunt een reflectie zien. 53 00:01:52,712 --> 00:01:54,350 -Kan U het beeld verbeteren van hier? 54 00:01:54,350 --> 00:01:55,370 -Kan Je hem hier te verbeteren? 55 00:01:55,370 --> 00:01:56,210 -Kan Je het te verbeteren? 56 00:01:56,210 --> 00:01:56,900 Kun je het verbeteren? 57 00:01:56,900 --> 00:01:57,870 >> -Kan We dit verbeteren? 58 00:01:57,870 --> 00:01:58,717 >> -Kan Je het te verbeteren? 59 00:01:58,717 --> 00:02:00,050 Wacht even een tweede, zal ik verbeteren. 60 00:02:00,050 --> 00:02:00,924 -zoom Via de deur. 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 -Intrekken. 64 00:02:03,490 --> 00:02:03,990 -Meer. 65 00:02:03,990 --> 00:02:04,690 -Wacht, Stoppen. 66 00:02:04,690 --> 00:02:05,190 -Stop. 67 00:02:05,190 --> 00:02:05,970 -PAUSE Het. 68 00:02:05,970 --> 00:02:09,460 -Draai Ons 75 graden om de verticale, alstublieft. 69 00:02:09,460 --> 00:02:10,962 -Stop. 70 00:02:10,962 --> 00:02:14,040 Ga terug naar de kant de deur weer. 71 00:02:14,040 --> 00:02:15,860 >> -Got Een afbeelding enhancer die kan bitmap? 72 00:02:15,860 --> 00:02:18,776 >> Hé, misschien kunnen we het Pradeep gebruiken Sen methode om te zien in de ramen. 73 00:02:18,776 --> 00:02:20,372 -Deze Software is state of the art. 74 00:02:20,372 --> 00:02:21,845 >> -De Eigenwaarde is uitgeschakeld. 75 00:02:21,845 --> 00:02:24,300 >> -Met De juiste combinatie van algorithm-- 76 00:02:24,300 --> 00:02:26,755 >> -Hij's Genomen eliminatie algoritmen naar het volgende niveau, 77 00:02:26,755 --> 00:02:28,730 en ik kan ze gebruiken om verbeteren deze foto. 78 00:02:28,730 --> 00:02:31,286 >> -Lock Op en vergroten de z-as. 79 00:02:31,286 --> 00:02:32,560 >> -Verbeteren. 80 00:02:32,560 --> 00:02:33,100 >> -Verbeteren. 81 00:02:33,100 --> 00:02:33,600 >> -Verbeteren. 82 00:02:33,600 --> 00:02:34,960 -Freeze En te versterken. 83 00:02:34,960 --> 00:02:37,180 >> [END AFSPELEN] 84 00:02:37,180 --> 00:02:41,160 >> DAVID J. MALAN: Oke, dus al die eigenlijk woorden. 85 00:02:41,160 --> 00:02:44,450 Ze zijn gewoon aaneengeregen in een dat is niet echt verstandig. 86 00:02:44,450 --> 00:02:48,400 En, in feite, CS50 en cursussen als het heeft de neiging om veel tv en films ruïneren 87 00:02:48,400 --> 00:02:48,900 voor jou. 88 00:02:48,900 --> 00:02:52,330 Want als die computer experts zijn dreunen voorwaarden en zeggen 89 00:02:52,330 --> 00:02:56,860 mooie dingen zoals eigenvectoren en de z-as, 90 00:02:56,860 --> 00:02:59,572 en een willekeurig aantal andere eigenlijk meer technische termen, 91 00:02:59,572 --> 00:03:02,030 ze zijn eigenlijk gewoon rijgen woorden samen al te vaak. 92 00:03:02,030 --> 00:03:05,020 Is dat een van onze hoop is dat als een neveneffect van het volgen van cursussen 93 00:03:05,020 --> 00:03:08,245 als dit, zal meer mensen in de wereld daadwerkelijk in staat zijn om te wegen 94 00:03:08,245 --> 00:03:12,040 en gewoon ooit zo iets van invloed op de kwaliteit en nauwkeurigheid van die films? 95 00:03:12,040 --> 00:03:14,350 >> In feite, laten we eens een kijkje nemen op de werkelijkheid. 96 00:03:14,350 --> 00:03:18,070 Dus hier is het personeel foto van Mary, een van ons onderwijs fellows. 97 00:03:18,070 --> 00:03:20,050 En stel dat ze is verdacht van iets. 98 00:03:20,050 --> 00:03:23,730 En toch, er is een sprankje een stukje van bewijs in haar ogen, 99 00:03:23,730 --> 00:03:25,480 of in de reflectie van haar bril. 100 00:03:25,480 --> 00:03:30,760 Nou, als we precies doen zoals de films stellen, waarbij we inzoomen en "verbeteren", 101 00:03:30,760 --> 00:03:34,080 dit is hoeveel informatie is in Maria's gezicht 102 00:03:34,080 --> 00:03:36,795 wanneer u een beeld vast te leggen met die originele resolutie. 103 00:03:36,795 --> 00:03:39,120 >> En, in feite, kunt u deze stippen te zien. 104 00:03:39,120 --> 00:03:41,900 En deze zijn wat zijn genaamd pixels, P-I-X-E-L-S, 105 00:03:41,900 --> 00:03:45,740 dat is gewoon een plein doorgaans dat is een punt dat een beeld componeert. 106 00:03:45,740 --> 00:03:49,200 En terug in de dag, en eigenlijk zelfs vandaag met een aantal van de huidige LED TVs 107 00:03:49,200 --> 00:03:51,950 of lcd-tv's, als je hebt één in uw kamer of thuis, 108 00:03:51,950 --> 00:03:55,100 Als je omhoog gaat super dicht bij, en vooral als het een wat oudere tv, 109 00:03:55,100 --> 00:03:58,760 kunt u waarschijnlijk ook zien dat deze punten en dat is wat samen een beeld. 110 00:03:58,760 --> 00:04:00,980 >> En er is niet meer informatie dan dit. 111 00:04:00,980 --> 00:04:05,400 We hebben "verbeteren", in de zin smoothing dingen over en soort 112 00:04:05,400 --> 00:04:09,040 inferring soort, een soort van wat kleur moet naast Mary's oog 113 00:04:09,040 --> 00:04:10,910 zodat het eigenlijk niet zo korrelig. 114 00:04:10,910 --> 00:04:14,510 Maar als ik blijf inzoomen, er is de bad guy in haar ogen. 115 00:04:14,510 --> 00:04:16,600 Als dat is alles wat de informatie hebben we. 116 00:04:16,600 --> 00:04:18,920 Je kunt niet maken informatie uit het niets. 117 00:04:18,920 --> 00:04:20,790 Er is maar een eindige aantal bits zijn. 118 00:04:20,790 --> 00:04:22,873 >> Dus in Probleem Set 4, waarbij heb je een kans 119 00:04:22,873 --> 00:04:24,580 om te spelen met dit soort wereld. 120 00:04:24,580 --> 00:04:27,610 In Probleem Set 4, zult u ontdekken de wereld van graphics, en forensisch onderzoek, 121 00:04:27,610 --> 00:04:30,870 en eigenlijk code schrijven die herstelt verloren beelden. 122 00:04:30,870 --> 00:04:33,510 U zult code te schrijven dat manipuleert bestaande beelden 123 00:04:33,510 --> 00:04:36,120 en uiteindelijk begrijpen wat gebeurt onder de motorkap. 124 00:04:36,120 --> 00:04:38,540 >> En, zo blijkt, is het eigenlijk niet zo ingewikkeld. 125 00:04:38,540 --> 00:04:41,320 Bijvoorbeeld, als we wilden vertegenwoordigen een smiley, waar 126 00:04:41,320 --> 00:04:44,160 met deze zwarte pixels, of deze zwarte stippen, 127 00:04:44,160 --> 00:04:47,230 goed, we konden gewoon vertegenwoordigen als ze echt een bitmap. 128 00:04:47,230 --> 00:04:50,040 En als je ooit gehoord dat uitdrukking bitmap, misschien 129 00:04:50,040 --> 00:04:52,330 het begint nu een maken beetje meer zin vandaag. 130 00:04:52,330 --> 00:04:53,580 >> We weten al wat een beetje is. 131 00:04:53,580 --> 00:04:54,160 Het is 0 of 1. 132 00:04:54,160 --> 00:04:56,201 En een kaart is gewoon iets zoals een stuk papier 133 00:04:56,201 --> 00:04:59,180 dat geeft u een routebeschrijving en heeft misschien een raster van x- en y-coördinaten. 134 00:04:59,180 --> 00:05:00,540 Dus hier is een bitmap. 135 00:05:00,540 --> 00:05:03,680 Het is een kaart van beetjes waarbij een 1 blijkbaar 136 00:05:03,680 --> 00:05:07,857 gaat naar een witte pixel vertegenwoordigen, en een 0 gaat om een ​​zwarte pixel vertegenwoordigen. 137 00:05:07,857 --> 00:05:09,440 Maar we kunnen zeker te spiegelen rond. 138 00:05:09,440 --> 00:05:11,648 Het maakt eigenlijk niet uit, zodat Zolang we consistent. 139 00:05:11,648 --> 00:05:15,570 En hier is hoe in binary-- binnen van het geheugen van een computer, of zelfs in 140 00:05:15,570 --> 00:05:18,160 van een bestand op uw harde drive-- kan je opslaan 141 00:05:18,160 --> 00:05:20,240 de eenvoudigste smiley afbeeldingen. 142 00:05:20,240 --> 00:05:23,990 Maar wat zijn wij, natuurlijk, ontbreekt in dit beeld? 143 00:05:23,990 --> 00:05:24,610 Kleur, toch? 144 00:05:24,610 --> 00:05:28,220 Het is een voor de hand liggende volgende stap of enhancement om dit te verbeteren met kleur. 145 00:05:28,220 --> 00:05:32,230 Dus helaas met slechts een enkele bit, 0 of 1, we kunnen kleuren vertegenwoordigen. 146 00:05:32,230 --> 00:05:36,100 Dat kan rood of blauw zijn, of zwart of wit, of groen of roze, 147 00:05:36,100 --> 00:05:37,420 of paren kleuren. 148 00:05:37,420 --> 00:05:40,860 Maar omwille van de eenvoud, zullen we gewoon aannemen zwart en wit. 149 00:05:40,860 --> 00:05:45,930 >> Dus wat logisch hebben we nodig als we willen implementeren kleur in een afbeelding? 150 00:05:45,930 --> 00:05:49,080 Wat moeten we doen? 151 00:05:49,080 --> 00:05:51,900 Net als de beperkende factor is dat met een beetje kunt u alleen 152 00:05:51,900 --> 00:05:55,977 vertegenwoordigen twee staten, 0 of 1, wit of zwart, wat wil je doen? 153 00:05:55,977 --> 00:05:56,810 Publiek: Meer gegevens. 154 00:05:56,810 --> 00:05:58,813 DAVID J. MALAN: meer bits, ja meer data, meer bits. 155 00:05:58,813 --> 00:06:01,440 En inderdaad, dat is precies hoe kleurenbeelden zijn vertegenwoordigd. 156 00:06:01,440 --> 00:06:05,120 In plaats van gebruik maken van een enkel bit, een 0 of 1 voor elke pixel, elke stip, 157 00:06:05,120 --> 00:06:06,170 je gewoon gebruik maken van meerdere. 158 00:06:06,170 --> 00:06:09,660 Misschien gebruik 8, misschien, meer in het algemeen Gebruik 24, en inderdaad, in Probleem Set 159 00:06:09,660 --> 00:06:13,300 4, zul je spelen met een bestand formaat dat 24 bits gebruikt doorgaans. 160 00:06:13,300 --> 00:06:15,430 >> Maar de meeste van jullie waarschijnlijk vertrouwd met JPEG. 161 00:06:15,430 --> 00:06:17,460 Als je ooit hebt genomen een foto op je telefoon, 162 00:06:17,460 --> 00:06:20,360 of geüpload of iets gezien op Facebook of Flickr, een aantal 163 00:06:20,360 --> 00:06:24,882 van foto-gebaseerde websites, je hebt waarschijnlijk een JPEG-afbeelding gezien. 164 00:06:24,882 --> 00:06:27,840 En het blijkt, dit is het bestand indeling we gaan gebruiken in Pset 4, 165 00:06:27,840 --> 00:06:30,340 waarbij je gaat moeten afbeeldingen herstellen 166 00:06:30,340 --> 00:06:35,160 dat ik per ongeluk heb verwijderd uit een bedorven geheugenkaart in de camera, 167 00:06:35,160 --> 00:06:35,800 als je wil. 168 00:06:35,800 --> 00:06:38,490 >> En het blijkt dat hoewel JPEG is vrij sophisticated-- 169 00:06:38,490 --> 00:06:40,906 het is veel meer geavanceerde dan de zwarte en witte stippen 170 00:06:40,906 --> 00:06:44,480 zagen we een ogenblik geleden, omdat er eigenlijk mooie algoritmen die 171 00:06:44,480 --> 00:06:47,410 worden gebruikt om een ​​JPEG comprimeren, zodat dat je een heel mooi kan hebben, 172 00:06:47,410 --> 00:06:49,832 beeldkwaliteit, maar met behulp van relatief weinig bits. 173 00:06:49,832 --> 00:06:51,790 En we zullen terug te komen compressie voor lang. 174 00:06:51,790 --> 00:06:56,280 Het blijkt dat de eerste drie bytes in een JPEG image-- 175 00:06:56,280 --> 00:07:02,750 het maakt niet uit wat je een foto hebt genomen van-- de waarden 255, 216, 255. 176 00:07:02,750 --> 00:07:05,990 >> Met andere woorden, als je gewoon zien dat patroon van bits, 177 00:07:05,990 --> 00:07:09,180 hier voorgesteld als drie bytes, of 24 bits in totaal, 178 00:07:09,180 --> 00:07:13,810 met een hoge waarschijnlijkheid kunt u afleiden dat u op zoek bent naar het op deze eerste drie 179 00:07:13,810 --> 00:07:15,230 bytes van een JPEG. 180 00:07:15,230 --> 00:07:18,040 En dit is wat bekend zoals de ondertekening van een JPEG. 181 00:07:18,040 --> 00:07:20,540 Veel bestandsformaten daar hebben de neiging om te beginnen 182 00:07:20,540 --> 00:07:23,735 bepaalde patronen van 0s en 1s, zodat Windows en Mac OS en iOS, 183 00:07:23,735 --> 00:07:28,272 en Android weten wat voor soort bestand dat ze zijn, naast de zogenoemde file 184 00:07:28,272 --> 00:07:29,730 extensie die een groot aantal bestanden te hebben. 185 00:07:29,730 --> 00:07:32,590 Als u hebt .jpg, dat is een andere aanwijzing voor de computer. 186 00:07:32,590 --> 00:07:35,310 >> Dus laten we nu eens kijken naar deze een beetje meer technisch. 187 00:07:35,310 --> 00:07:37,390 We weten dat de decimale systeem is 0 tot 9. 188 00:07:37,390 --> 00:07:38,740 We weten binaire is 0 en 1. 189 00:07:38,740 --> 00:07:41,842 En als je terugdenkt aan Pset 0, we hadden jullie worstelen met, 190 00:07:41,842 --> 00:07:43,800 voor een klein beetje, iets genaamd hexadecimale, 191 00:07:43,800 --> 00:07:47,320 waar je 16 cijfers, in plaats van 10 of in plaats van 2. 192 00:07:47,320 --> 00:07:50,405 En die cijfers, volgens afspraak, zijn 0 tot en met 9 en vervolgens een 193 00:07:50,405 --> 00:07:55,040 tot en met f, waarbij f staat voor wat decimaal getal, net als een snelle geestelijke gezondheid 194 00:07:55,040 --> 00:07:56,640 controleren? 195 00:07:56,640 --> 00:07:57,610 Dus, 15. 196 00:07:57,610 --> 00:08:01,390 En een must 10 vertegenwoordigen, gewoon door aard van de bestelling die ik heb gegeven. 197 00:08:01,390 --> 00:08:04,350 Het is gewoon een willekeurige overeenkomst, maar het is vrij standaard. 198 00:08:04,350 --> 00:08:06,870 >> Dus als we kijken naar dit patroon drie bytes-- laten 199 00:08:06,870 --> 00:08:09,620 gewoon beginnen te kijken naar het in een wijze die in overeenstemming met de manier waarop 200 00:08:09,620 --> 00:08:12,450 informatici algemeen naar te kijken en na te denken over files. 201 00:08:12,450 --> 00:08:15,580 U kunt zeker nadenken over bestanden in 0s en 1s en decimale, 202 00:08:15,580 --> 00:08:19,340 maar in werkelijkheid, zijn we geneigd om binaire gebruiken of meer kenmerkend hexadecimal-- 203 00:08:19,340 --> 00:08:20,760 terug van Pset 0. 204 00:08:20,760 --> 00:08:25,857 Dus laat me voorstellen dat 255, 216, en 255 zijn deze patronen van 0s en 1s. 205 00:08:25,857 --> 00:08:28,440 En u kunt dit controleren als u willen de wiskunde te doen van week 0. 206 00:08:28,440 --> 00:08:30,810 Maar voor nu, gewoon aannemen dat dit inderdaad juist. 207 00:08:30,810 --> 00:08:33,850 Ik heb net herschreven drie cijfers nummers drie binaire waarden. 208 00:08:33,850 --> 00:08:36,100 Nu wat ik ga doen is voeg wat witte ruimte, 209 00:08:36,100 --> 00:08:37,266 gewoon omwille van de leesbaarheid's. 210 00:08:37,266 --> 00:08:39,940 En bericht, ik ga gewoon dingen uit elkaar. 211 00:08:39,940 --> 00:08:43,090 Dus voor, na, voor, na. 212 00:08:43,090 --> 00:08:46,180 Ik ben niets interessants meer te doen dan alleen het verspreiden van dingen uit, zodat 213 00:08:46,180 --> 00:08:50,380 die aankondiging elke set van acht bits nu twee sets van vier bits. 214 00:08:50,380 --> 00:08:54,920 Dit is nuttig omdat hexadecimaal bijzonder mode 215 00:08:54,920 --> 00:09:00,930 omdat elke hexadecimale cijfers 0 tot en met f, of meer specifiek 0 tot 15, 216 00:09:00,930 --> 00:09:03,430 kan worden vertegenwoordigd precies vier bits. 217 00:09:03,430 --> 00:09:07,960 Met andere woorden, in hexadecimale als je willen vertegenwoordigen een 0, het is gewoon 0000, 218 00:09:07,960 --> 00:09:08,780 vier nullen. 219 00:09:08,780 --> 00:09:13,997 En als je wilt om 15 te vertegenwoordigen, Het is 1111, die vier bits. 220 00:09:13,997 --> 00:09:16,080 En als je de wiskunde, als dit degene plaats, 221 00:09:16,080 --> 00:09:18,210 dit is de 16s plaats, dat gaat u-- geven 222 00:09:18,210 --> 00:09:19,960 eerder dat gaat to-- sorry, in binaire, 223 00:09:19,960 --> 00:09:23,660 dat gaat je 15 geven, die plaats, tweeën plaats, handen en voeten en achten plaats. 224 00:09:23,660 --> 00:09:26,821 Dus laat me voorstellen dat dat set van vier bits aan de linkerkant 225 00:09:26,821 --> 00:09:28,070 is wat we gaan f noemen. 226 00:09:28,070 --> 00:09:30,110 Het is het grootste aantal u kan vertegenwoordigen met vier bits. 227 00:09:30,110 --> 00:09:33,300 En we weten al van hexadecimaal, f de grootste digit hexadecimale. 228 00:09:33,300 --> 00:09:36,020 We hebben nog een f daar aankwam, twee meer daar. 229 00:09:36,020 --> 00:09:38,980 En voor nu, neem dan gewoon op vertrouwen dat ik de wiskunde recht hebben gedaan 230 00:09:38,980 --> 00:09:41,890 en dat de linkerhelft van die bits, 1101, 231 00:09:41,890 --> 00:09:43,980 is hetzelfde als d hexadecimaal. 232 00:09:43,980 --> 00:09:46,490 En de rechterhand, 1000, is slechts 8. 233 00:09:46,490 --> 00:09:48,140 >> En dat men gemakkelijk te zien, toch? 234 00:09:48,140 --> 00:09:51,670 De 8 represents-- recht is onder die achten plaats. 235 00:09:51,670 --> 00:09:56,040 Dus hebben we een in de kolom achten en niets in de handen en voeten, tweeën of degenen. 236 00:09:56,040 --> 00:09:59,830 Dus nu meer conventioneel, mensen de neiging om hexadecimale cijfers als dit schrijven, 237 00:09:59,830 --> 00:10:03,000 je gewoon squish ze samen, en dan moet je ze met de prefix 0x. 238 00:10:03,000 --> 00:10:05,920 Het betekent niets anders dan een visuele aanwijzing voor een human-- 239 00:10:05,920 --> 00:10:10,350 hier komt een hexadecimale value-- omdat het kan niet anders duidelijk zijn. 240 00:10:10,350 --> 00:10:13,629 >> Dat wil zeggen, uiteindelijk, dat het patroon van nullen en enen, 241 00:10:13,629 --> 00:10:16,170 of het patroon van hexadecimale cijfers equivalent dat je 242 00:10:16,170 --> 00:10:18,990 gaan om te beginnen op zoek naar in Probleem Set 4 is dit-- 243 00:10:18,990 --> 00:10:22,120 En het probleem Set 4 spec zal lopen u door dit in meer detail-- 244 00:10:22,120 --> 00:10:25,344 maar realiseren als een soort geheimzinnige als Dit ziet er misschien op het eerste gezicht, 245 00:10:25,344 --> 00:10:27,010 je gaat om te beginnen met het zien van deze veel. 246 00:10:27,010 --> 00:10:30,320 En inderdaad, zelfs in GDB, de debugger we op maandag geïntroduceerd 247 00:10:30,320 --> 00:10:35,440 en Dan introduceert in Pset 3, gaat vaak laten zien hexadecimale waarden 248 00:10:35,440 --> 00:10:39,910 alleen maar omdat ze de neiging om meer te zijn conventionele dan decimaal of binaire 249 00:10:39,910 --> 00:10:41,157 in de wereld van computers. 250 00:10:41,157 --> 00:10:42,490 Laten we dit in de juiste context. 251 00:10:42,490 --> 00:10:48,040 Velen van u misschien dit onthouden foto hier, die van wat kwam? 252 00:10:48,040 --> 00:10:51,240 Vista, dus zelfs eerder dan dat Windows XP deed dit debuut. 253 00:10:51,240 --> 00:10:52,620 Dus dit is een prachtig landschap. 254 00:10:52,620 --> 00:10:55,940 En in feite, als je rond te snuffelen online-- Ik denk dat het een Wikipedia-artikel, 255 00:10:55,940 --> 00:11:00,110 waarin iemand ging erg verbazingwekkend uit vonden deze locatie in de wereld opgezet 256 00:11:00,110 --> 00:11:02,240 diens camera precies de juiste plek-- 257 00:11:02,240 --> 00:11:06,510 en dit vandaag de dag ziet er like-- maar het is precies dezelfde instelling. 258 00:11:06,510 --> 00:11:10,060 Dit beeld is echter in een bestand formaat genaamd bitmap, b-m-p. 259 00:11:10,060 --> 00:11:12,910 En we gaan naar een super nemen snelle blik op wat dat betekent. 260 00:11:12,910 --> 00:11:17,770 >> Maar bitmap is gewoon een andere manier van die beelden nog steeds met behulp van pixels 261 00:11:17,770 --> 00:11:19,580 in 0s en 1s, uiteindelijk. 262 00:11:19,580 --> 00:11:23,282 Maar op snelle blik, het heeft een meer interessante handtekening 263 00:11:23,282 --> 00:11:24,490 aan het begin van het bestand. 264 00:11:24,490 --> 00:11:26,670 Het is niet alleen drie bytes, in plaats van er 265 00:11:26,670 --> 00:11:30,770 een heleboel patronen bytes die vooraf bepaalde betekenis. 266 00:11:30,770 --> 00:11:34,490 Bijvoorbeeld, ergens in de eerste paar bytes van een bitmapafbeelding 267 00:11:34,490 --> 00:11:37,440 zal de grootte van de te beeld, de breedte van het beeld, 268 00:11:37,440 --> 00:11:40,390 de hoogte van de afbeelding, zodat bruikbare metadata, als je wil. 269 00:11:40,390 --> 00:11:43,940 Nuttige informatie die Photoshop of een grafisch programma dat u gebruikt 270 00:11:43,940 --> 00:11:45,180 eigenlijk zou kunnen schelen. 271 00:11:45,180 --> 00:11:47,170 >> Dus meer hierover in Probleem Set 4, maar dit 272 00:11:47,170 --> 00:11:49,220 alleen zeggen dat aan het einde van de dag 273 00:11:49,220 --> 00:11:52,390 alle bestandsformaten die je hebt gebruikt voor years-- Microsoft Word-bestanden, 274 00:11:52,390 --> 00:11:55,820 Numbers-bestanden, Excel-bestanden, een aantal bestandsformaten 275 00:11:55,820 --> 00:11:57,770 dat sommigen hebben bekend bestandsextensie 276 00:11:57,770 --> 00:12:00,130 zijn slechts 0s en 1s onder de motorkap. 277 00:12:00,130 --> 00:12:02,970 En mensen hebben besloten wat de overeenkomsten zijn, 278 00:12:02,970 --> 00:12:08,340 welke patronen van 0s en 1s vertegenwoordigen een Word-bestand ten opzichte van een Excel-bestand, 279 00:12:08,340 --> 00:12:10,322 ten opzichte van een aantal andere bestandsformaten. 280 00:12:10,322 --> 00:12:12,780 Dus in Pset 4, zul je een hebt kans om te spelen met die. 281 00:12:12,780 --> 00:12:14,405 >> Maar wat betekent het om een ​​structuur te hebben. 282 00:12:14,405 --> 00:12:18,012 Dit is eigenlijk een mooie segue nu in C, die slechts een paar heeft 283 00:12:18,012 --> 00:12:20,220 van de extra functies die we hebben niet gekeken naar nog. 284 00:12:20,220 --> 00:12:24,230 Het is een vrij kleine taal en één van de leuke features over C is een structuur. 285 00:12:24,230 --> 00:12:27,300 Bijvoorbeeld, als je wilde represent-- laten 286 00:12:27,300 --> 00:12:33,690 zeggen dat je wilde een variabele hebben die vertegenwoordigt een student in een programma. 287 00:12:33,690 --> 00:12:37,330 Misschien dat je een cursus schrijven registratieprogramma, of de kern winkelen 288 00:12:37,330 --> 00:12:38,870 tool, of iets dergelijks. 289 00:12:38,870 --> 00:12:42,922 Wat zijn stukjes data gerelateerde een student die te binnen schieten? 290 00:12:42,922 --> 00:12:44,880 Als een student vertegenwoordigd met welke waarden? 291 00:12:44,880 --> 00:12:45,732 Ja? 292 00:12:45,732 --> 00:12:46,940 Je hebt een naam als een student. 293 00:12:46,940 --> 00:12:48,900 Wat doet een typische student? 294 00:12:48,900 --> 00:12:49,320 >> PUBLIEK: [onverstaanbaar] 295 00:12:49,320 --> 00:12:50,200 >> DAVID J. MALAN: Dus, sorry. 296 00:12:50,200 --> 00:12:50,660 >> Publiek: Age. 297 00:12:50,660 --> 00:12:52,980 >> DAVID J. MALAN: Een leeftijd of verjaardag equivalent, yep. 298 00:12:52,980 --> 00:12:53,557 Wat anders? 299 00:12:53,557 --> 00:12:54,390 PUBLIEK: ID-nummer? 300 00:12:54,390 --> 00:12:57,460 DAVID J. MALAN: Dus een ID-nummer, misschien een telefoonnummer, misschien een slaapzaal, of huis, 301 00:12:57,460 --> 00:12:58,670 of hogeschool, of iets dergelijks. 302 00:12:58,670 --> 00:13:01,820 Elk aantal stukken data die u zou kunnen hebben in uw lijst met contacten 303 00:13:01,820 --> 00:13:03,890 is wat kan een student te definiëren. 304 00:13:03,890 --> 00:13:08,490 Dus als we wilden dit te doen, in de code, we kunnen iets simpels als dit te doen. 305 00:13:08,490 --> 00:13:15,670 We zouden een programma, zodat hebben heeft laten we zeggen, int main (void). 306 00:13:15,670 --> 00:13:18,920 En als ik wil een vertegenwoordigen student Ik zou kunnen hebben, bijvoorbeeld, 307 00:13:18,920 --> 00:13:24,330 een string genaamd naam voor die student, een string genaamd dorm voor die student, 308 00:13:24,330 --> 00:13:26,900 misschien een int opgeroepen ID voor die student. 309 00:13:26,900 --> 00:13:30,840 En omdat ik ben met behulp van touw, I nodig hebben om terug te gaan en zetten CS50.h. 310 00:13:30,840 --> 00:13:33,300 Misschien ga ik stdio.h nodig. 311 00:13:33,300 --> 00:13:38,190 Dus laat ik die preventief te doen en ik ben ga dit student.c roepen voor nu 312 00:13:38,190 --> 00:13:40,080 en bewaar deze. 313 00:13:40,080 --> 00:13:44,206 >> En nu kan ik iets doen deze variabelen. 314 00:13:44,206 --> 00:13:46,830 En we gaan gewoon te schrijven dat als een commentaar in pseudo-code, 315 00:13:46,830 --> 00:13:48,829 want het is niet interessant wat we doen voor nu. 316 00:13:48,829 --> 00:13:51,242 OK, dus dit is een programma dat een of andere manier slaat een student. 317 00:13:51,242 --> 00:13:53,450 Wat wil ik doen als ik wil twee studenten op te slaan? 318 00:13:53,450 --> 00:13:55,991 Dus mijn eerste instinct gaat allemaal goed, wacht eens even, 319 00:13:55,991 --> 00:14:01,920 als ik een andere student waarom ik niet gewoon doen tekenreeksnaam 2, touwtje dorm 2, 320 00:14:01,920 --> 00:14:04,190 int ID2. 321 00:14:04,190 --> 00:14:06,540 En we hebben weg gedaan op deze weg vóór 322 00:14:06,540 --> 00:14:10,890 en wat onze oplossing voor wat lijkt een soort van een hackish copy-paste te zijn 323 00:14:10,890 --> 00:14:11,555 werk hier? 324 00:14:11,555 --> 00:14:12,346 Publiek: Een array. 325 00:14:12,346 --> 00:14:13,830 DAVID J. MALAN: Ja, we kunnen een array. 326 00:14:13,830 --> 00:14:15,620 Rechts deze zeer snel wordt onhandelbaar. 327 00:14:15,620 --> 00:14:18,453 Je moet willekeurig soort start naamgeving al deze variabelen. 328 00:14:18,453 --> 00:14:22,190 En u, de mens, moeten blijven volgen dat OK naam2 overeenkomt 329 00:14:22,190 --> 00:14:25,060 met dorm2 overeen met ID2. 330 00:14:25,060 --> 00:14:26,200 Het wordt gewoon een puinhoop. 331 00:14:26,200 --> 00:14:29,350 Dus het is een stuk makkelijker, herinneren van een paar weken geleden, 332 00:14:29,350 --> 00:14:34,300 om gewoon te heet tekenreeksnamen en misschien geven ons drie van hen. 333 00:14:34,300 --> 00:14:36,940 En dan misschien hebben we touwtje slaapzalen en hebben 334 00:14:36,940 --> 00:14:41,900 drie ervan of met een constante, int ids en hebben drie van hen. 335 00:14:41,900 --> 00:14:45,250 Maar zelfs nu dit voelt een beetje slordig, rechts. 336 00:14:45,250 --> 00:14:49,440 We hebben het over studenten en toch Ik ben echt stil te staan ​​bij het lage niveau 337 00:14:49,440 --> 00:14:50,470 implementatie details. 338 00:14:50,470 --> 00:14:52,790 De student is een naam en een slaapzaal en ID. 339 00:14:52,790 --> 00:14:59,814 >> Waarom kan ik niet gewoon verklaren een variabele riep student en noemen het is. 340 00:14:59,814 --> 00:15:02,230 En als ik wil een andere student, waarom heb ik niet noem het t. 341 00:15:02,230 --> 00:15:05,260 Of als ik een hele hoop studenten, waarom doe ik gewoon niet 342 00:15:05,260 --> 00:15:09,740 zeggen dat ik een hele klas van studenten en het is drie. 343 00:15:09,740 --> 00:15:12,470 Met andere woorden, waarom kan ik niet komen met mijn eigen data type, de zogenaamde 344 00:15:12,470 --> 00:15:15,641 Studenten, binnen luidt een naam, een ID, is een slaapzaal, 345 00:15:15,641 --> 00:15:16,890 is een aantal andere gebieden. 346 00:15:16,890 --> 00:15:19,030 En het blijkt dat je kan precies dat doen. 347 00:15:19,030 --> 00:15:21,850 >> Dus C heeft deze functie genaamd structuur. 348 00:15:21,850 --> 00:15:24,700 Dat is een taal die functie stelt ons in staat om precies dit te doen. 349 00:15:24,700 --> 00:15:28,370 Ik ga om te gaan en open structs.h 350 00:15:28,370 --> 00:15:32,299 waar we heen gaan om het te zien volgende definitie van een student. 351 00:15:32,299 --> 00:15:35,215 Het blijkt - en dit is zelfs eenvoudiger dan die waarbij een ID 352 00:15:35,215 --> 00:15:36,080 een moment geleden. 353 00:15:36,080 --> 00:15:39,120 Als u wilt komen met uw zelfgemaakte data type, 354 00:15:39,120 --> 00:15:42,750 en naast int en char en zweven en al deze anderen die bestaan, 355 00:15:42,750 --> 00:15:45,810 U kunt dit doen door letterlijk schrijven typedef struct, 356 00:15:45,810 --> 00:15:47,880 vervolgens een aantal accolades, de binnenkant van die u 357 00:15:47,880 --> 00:15:51,460 een lijst van de variabelen die u wilt associëren met deze nieuwe aangepaste gegevens 358 00:15:51,460 --> 00:15:55,670 typt zoals een naam en een slaapzaal, en dan na de accolades 359 00:15:55,670 --> 00:15:57,860 u een naam voor de nieuwe data type te geven. 360 00:15:57,860 --> 00:15:59,220 Dus, bijvoorbeeld, student. 361 00:15:59,220 --> 00:16:03,247 >> En wat is er leuk aan dit bedrijf is dat Als we kijken naar de bijbehorende code, 362 00:16:03,247 --> 00:16:05,080 de conventie, eerste van alles, is om dit te zetten 363 00:16:05,080 --> 00:16:08,230 in een bestand genaamd iets dot h, een header bestand, dat hebben we niet 364 00:16:08,230 --> 00:16:09,780 begonnen met ons te veel. 365 00:16:09,780 --> 00:16:12,120 Maar we gaan beginnen gebruik nu wel een beetje. 366 00:16:12,120 --> 00:16:18,650 En wat we kunnen doen met deze, uiteindelijk, in deze paar regels code 367 00:16:18,650 --> 00:16:22,130 is te verklaren dat precies datatype, een student. 368 00:16:22,130 --> 00:16:23,230 En laten we nu gebruiken. 369 00:16:23,230 --> 00:16:27,274 >> Ik ga nu in de een bestand genaamd structs1.c. 370 00:16:27,274 --> 00:16:29,440 En laten we een kijkje nemen op een Enkele kenmerken hier. 371 00:16:29,440 --> 00:16:32,250 Dus het spul hier is veelal bekende, en we zullen 372 00:16:32,250 --> 00:16:35,040 terug te komen op wat niet vertrouwd in slechts een moment. 373 00:16:35,040 --> 00:16:39,880 Dit is natuurlijk ook mijn eigen header-bestand, die nieuw is zo goed, 374 00:16:39,880 --> 00:16:42,580 behalve voor Pset 3, waar, recall, hebben we helpers.h. 375 00:16:42,580 --> 00:16:45,150 Dus je zou #include helpers.h herinneren. 376 00:16:45,150 --> 00:16:49,381 >> Waarom al gebruik ik citaten in plaats van haakjes? 377 00:16:49,381 --> 00:16:50,630 Wanneer moet ik kiezen tussen hen? 378 00:16:50,630 --> 00:16:52,310 Bijna altijd Ik lijk om haakjes te gebruiken. 379 00:16:52,310 --> 00:16:55,040 En dan, ineens op lijn zes Ik ben met behulp van dubbele aanhalingstekens. 380 00:16:55,040 --> 00:16:55,860 Waarom zou dat zijn? 381 00:16:55,860 --> 00:16:56,700 Ja? 382 00:16:56,700 --> 00:16:57,725 >> PUBLIEK: [onverstaanbaar] 383 00:16:57,725 --> 00:16:59,350 DAVID J. MALAN: Dat is een echte, wat? 384 00:16:59,350 --> 00:17:00,559 PUBLIEK: Dat is in uw IDE. 385 00:17:00,559 --> 00:17:02,475 DAVID J. MALAN: Ja, dat is in mijn werkelijke IDE. 386 00:17:02,475 --> 00:17:05,690 En laten we niet stilstaan ​​bij de IDE, omdat dat is gewoon een tool die ik gebruik. 387 00:17:05,690 --> 00:17:08,119 Dat is in mijn huidige directory, in het bijzonder. 388 00:17:08,119 --> 00:17:11,647 Dus structs.h is mijn eigen bestand niet in de IDE geïnstalleerd, 389 00:17:11,647 --> 00:17:14,480 in het besturingssysteem zelf, plaats het in mijn huidige directory. 390 00:17:14,480 --> 00:17:16,910 Zodat het verdrag is als je wilt om uw eigen header-bestand omvatten, 391 00:17:16,910 --> 00:17:18,200 je gewoon gebruik maken van dubbele aanhalingstekens. 392 00:17:18,200 --> 00:17:23,290 >> Wat hebben we dit ding noemen in lijn 8, in het algemeen? 393 00:17:23,290 --> 00:17:25,200 Dit is wat? 394 00:17:25,200 --> 00:17:28,220 #define iets. 395 00:17:28,220 --> 00:17:31,040 Dit vertegenwoordigt constanten, toch? 396 00:17:31,040 --> 00:17:33,140 Als u wilt een hebben waarde in het programma 397 00:17:33,140 --> 00:17:35,110 dat je een hele gebruiken paar keer, het is 398 00:17:35,110 --> 00:17:39,330 goede conventie om het uit factor, verklaren, met de hekje 399 00:17:39,330 --> 00:17:43,340 definiëren, dan, volgens afspraak, in alle hoofdletters word-- al is het niet 400 00:17:43,340 --> 00:17:45,320 strikt noodzakelijk, maar Het is de menselijke conventie 401 00:17:45,320 --> 00:17:47,210 constanten kapitaliseren zodat ze eruit springen 402 00:17:47,210 --> 00:17:50,380 naar je visually-- ruimte en dan is de waarde die u wilt zijn 403 00:17:50,380 --> 00:17:52,250 gelijkwaardig is aan de naam van die constant. 404 00:17:52,250 --> 00:17:56,110 Geen puntkomma, maar je gewoon volgen dat patroon er. 405 00:17:56,110 --> 00:17:57,770 >> Dus wat doe ik in deze eigenlijke code. 406 00:17:57,770 --> 00:18:00,660 Dus laten we een kijkje nemen op de belangrijkste programma hier. 407 00:18:00,660 --> 00:18:04,080 In lijn 12 omdat ik hebben opgenomen structs.h, 408 00:18:04,080 --> 00:18:06,492 Ik heb nu op magische wijze naar mijn beschikking over een nieuw type data. 409 00:18:06,492 --> 00:18:09,200 Ik heb niet alleen toegang hebben tot int, en char, en zweven, en strijkorkest, 410 00:18:09,200 --> 00:18:10,060 en blauw en anderen. 411 00:18:10,060 --> 00:18:12,470 Ik heb nu toegang tot een type student data. 412 00:18:12,470 --> 00:18:17,740 Dus in de lijn 12, ik ben het combineren van twee ideas-- men een aangepaste data type en twee, 413 00:18:17,740 --> 00:18:18,940 met behulp van een matrix. 414 00:18:18,940 --> 00:18:21,700 En dus in dit programma als Ik wil eigenlijk steunen 415 00:18:21,700 --> 00:18:24,320 drie verschillende studenten in mijn programma, ik 416 00:18:24,320 --> 00:18:30,480 kan alleen maar zeggen geef me een variabele genoemd studenten, die elk 417 00:18:30,480 --> 00:18:32,970 is van het type studenten die is mijn aangepaste data type. 418 00:18:32,970 --> 00:18:35,890 En in het bijzonder, geef me drie van die mijn array. 419 00:18:35,890 --> 00:18:37,750 >> Dus nu wat doen we in dit programma? 420 00:18:37,750 --> 00:18:40,670 Hier is gewoon een lus iteratie 0-3, want dat is 421 00:18:40,670 --> 00:18:42,110 wat de waarde van de studenten is. 422 00:18:42,110 --> 00:18:44,420 Ik ben gewoon vragen aan de gebruiker geef mij de naam van de student. 423 00:18:44,420 --> 00:18:48,090 En vervolgens in lijn 17, we hebben een meestal vertrouwde lijn. 424 00:18:48,090 --> 00:18:50,370 We hebben onze oude vriend GetString aan de rechterkant. 425 00:18:50,370 --> 00:18:52,345 En welk stuk van de syntaxis is blijkbaar nieuw, 426 00:18:52,345 --> 00:18:55,130 Als je nog nooit hebt geprogrammeerd in C voor, en heb nog nooit gebruik gemaakt van de structuren? 427 00:18:55,130 --> 00:18:55,510 Ja? 428 00:18:55,510 --> 00:18:56,417 >> Publiek: De .name. 429 00:18:56,417 --> 00:18:57,500 DAVID J. MALAN: De .name. 430 00:18:57,500 --> 00:19:01,220 Maar dit is niet te veel van een sprong, want nu studenten beugel i 431 00:19:01,220 --> 00:19:02,590 geeft u de i-de student. 432 00:19:02,590 --> 00:19:04,730 En als je wilt duiken binnenzijde van die structuur, 433 00:19:04,730 --> 00:19:09,490 je gewoon gebruik maken van een enkele periode en vervolgens de naam van de variabele in, 434 00:19:09,490 --> 00:19:11,900 of de woning binnen dat U wilt toegang tot krijgen. 435 00:19:11,900 --> 00:19:14,816 Op dezelfde manier dan, als ik vragen dan is de gebruiker, geef me de student slaapzaal, 436 00:19:14,816 --> 00:19:18,390 U kunt op dezelfde manier op te slaan, dat tekenreeks in de slaapzaal variabele binnen 437 00:19:18,390 --> 00:19:19,940 van die student structuur. 438 00:19:19,940 --> 00:19:21,410 >> En nu de dingen een beetje fantasie. 439 00:19:21,410 --> 00:19:24,420 En dit is gaan kijken op misschien wel een stuk vrij snel. 440 00:19:24,420 --> 00:19:27,970 Maar je zult zien veel meer in Pset 4, dus laten we gewoon blik op het nu. 441 00:19:27,970 --> 00:19:33,364 Het blijkt dat in de lijn 23 door middel van 38, wat denk je dat ik misschien aan het doen? 442 00:19:33,364 --> 00:19:35,530 Ik heb de opmerkingen verwijderd voor vandaag, maar de versie 443 00:19:35,530 --> 00:19:38,660 van de code online verwijzing heeft alle reacties. 444 00:19:38,660 --> 00:19:40,171 Wat heb ik lijken te doen? 445 00:19:40,171 --> 00:19:42,530 >> PUBLIEK: het bestand met alle opslaan de informatie die de gebruiker heeft ingevoerd. 446 00:19:42,530 --> 00:19:44,530 >> DAVID J. MALAN: Ja, precies, is een nieuwe manier 447 00:19:44,530 --> 00:19:46,370 dat zien we twee, Een ander kenmerk van C, 448 00:19:46,370 --> 00:19:48,700 waarbij ik mijn eigen bestanden kunt maken. 449 00:19:48,700 --> 00:19:51,580 Tot nu toe vrijwel elk programma je hebt geschreven staatloos is. 450 00:19:51,580 --> 00:19:53,334 Zodra het klaar is draait, dat is het. 451 00:19:53,334 --> 00:19:55,000 Er is geen geheugen of herinnering van het. 452 00:19:55,000 --> 00:19:56,110 Er is geen bestand opgeslagen. 453 00:19:56,110 --> 00:19:58,120 Maar als je wilt opslaan input die heeft 454 00:19:58,120 --> 00:20:02,100 gebeurd, zoals in een spel of een programma als dit, het blijkt dat we kunnen doen. 455 00:20:02,100 --> 00:20:04,360 En je zult dit meer zien in Pset 4 en in paragraaf. 456 00:20:04,360 --> 00:20:08,661 Maar deze lijn 23 in wezen creëert een bestand genaamd students.csv. 457 00:20:08,661 --> 00:20:10,160 En je zou eerder hebben gezien dit. 458 00:20:10,160 --> 00:20:14,250 Zelfs als je nog nooit CS eerder hebt gestudeerd, CSV is door komma's gescheiden variabelen. 459 00:20:14,250 --> 00:20:19,000 Het is als een zeer arme man versie van een Excel-bestand, 460 00:20:19,000 --> 00:20:22,270 wat betekent dat het kan worden geopend in Excel en in Apple Numbers, 461 00:20:22,270 --> 00:20:23,830 en heeft rijen en kolommen. 462 00:20:23,830 --> 00:20:26,485 Maar het is niet een eigen formaat als Microsoft of Apple. 463 00:20:26,485 --> 00:20:29,840 Het is gewoon komma scheiden van de waarden die we zullen zien in een moment. 464 00:20:29,840 --> 00:20:31,010 >> En gewoon een gok. 465 00:20:31,010 --> 00:20:33,480 In lijn 23, aan het Uiteindelijk mijn tweede argument 466 00:20:33,480 --> 00:20:37,700 deze nieuwe functie genaamd f geopend voor het bestand geopend is w. 467 00:20:37,700 --> 00:20:39,430 Wat zou w duiden? 468 00:20:39,430 --> 00:20:40,022 Ja? 469 00:20:40,022 --> 00:20:41,260 >> Publiek: Het laat je schrijven naar het bestand? 470 00:20:41,260 --> 00:20:42,630 >> DAVID J. MALAN: Het laat u schrijven naar het bestand. 471 00:20:42,630 --> 00:20:44,810 Dus er is een paar varianten dat we hier kunnen inpluggen. 472 00:20:44,810 --> 00:20:47,184 Maar als je gewoon wilt lezen het bestand, dat is kijken 473 00:20:47,184 --> 00:20:50,010 en lees het in het geheugen, je gewoon citaat unquote "r" te gebruiken. 474 00:20:50,010 --> 00:20:53,110 Als u wilt schrijven naar de bestand, citaat gebruik je unquote "w". 475 00:20:53,110 --> 00:20:55,190 Er is ook te voegen en een paar andere dingen 476 00:20:55,190 --> 00:20:57,356 als je wilt om bestaande bestanden te wijzigen. 477 00:20:57,356 --> 00:21:00,480 Nu gaan we blijven zien dit ding, dan zullen we terugkomen op lijn 24. 478 00:21:00,480 --> 00:21:02,640 NULL, zo blijkt, is een bijzondere waarde die 479 00:21:02,640 --> 00:21:06,070 kan worden teruggegeven door bepaalde functies als er iets wrong-- is gegaan 480 00:21:06,070 --> 00:21:08,490 als het bestand niet bestaat, als je uit het geheugen hebt draaien, 481 00:21:08,490 --> 00:21:09,620 of een bos van andere fouten. 482 00:21:09,620 --> 00:21:13,470 Maar voor nu, laten we aannemen dat deze is gewoon conventionele foutcontrole. 483 00:21:13,470 --> 00:21:17,090 Hier in lijn 26, ik ben itereren 0-3 over al mijn studenten. 484 00:21:17,090 --> 00:21:20,470 En dit is een soort van een soort van een nieuwe functie, fprintf, 485 00:21:20,470 --> 00:21:21,460 maar gewoon een gok. 486 00:21:21,460 --> 00:21:24,370 Als printf is gewoon druk een geformatteerde string 487 00:21:24,370 --> 00:21:26,507 wat betekent fprintf waarschijnlijk betekenen? 488 00:21:26,507 --> 00:21:27,590 PUBLIEK: afdrukken naar een bestand. 489 00:21:27,590 --> 00:21:29,290 DAVID J. MALAN: Druk een opgemaakte string naar een bestand. 490 00:21:29,290 --> 00:21:31,180 Dat is wat de extra f middel is bestand. 491 00:21:31,180 --> 00:21:36,420 En de nieuwe eerste argument moet worden de variabele die het bestand vertegenwoordigt. 492 00:21:36,420 --> 00:21:38,866 Dan hebben we gewoon een formaat touwtje net als printf. 493 00:21:38,866 --> 00:21:40,740 En hoewel dit syntax is nieuw, dit enkel 494 00:21:40,740 --> 00:21:44,610 betekent dat de stekker in de naam van de student, plug-in het studentenhuis, en dan 495 00:21:44,610 --> 00:21:47,160 met fclose, sluit het bestand. 496 00:21:47,160 --> 00:21:49,730 En dan lastly-- dit is nieuw en we zullen hierop terugkomen 497 00:21:49,730 --> 00:21:53,240 voordat long-- Ik vrijmaken de student redenen 498 00:21:53,240 --> 00:21:54,860 dat gebeurde boven daar. 499 00:21:54,860 --> 00:21:56,820 Maar we zullen terugkomen die vóór long-- 500 00:21:56,820 --> 00:21:59,820 dat is vanwege de manier waarop GetString is eigenlijk werkt onder de motorkap. 501 00:21:59,820 --> 00:22:01,280 >> Dus laten we eens een snelle blik hier. 502 00:22:01,280 --> 00:22:04,380 Als ik type ls in mijn directory, merken dat ik niet 503 00:22:04,380 --> 00:22:09,360 hebben een bestand genaamd students.csv, gewoon niet, bestaat niet. 504 00:22:09,360 --> 00:22:14,965 Dus als ik nu in dit programma samen te stellen, maken structs-1. / structuren-1, 505 00:22:14,965 --> 00:22:20,570 en ik ga om verder te gaan en type in Andi, die woont in Berkeley in Yale. 506 00:22:20,570 --> 00:22:26,350 We gaan Rob hebben die woont in Thayer deze dagen. 507 00:22:26,350 --> 00:22:33,760 En laten we komen met waar de is, denk ik, Maria is in Mather, 508 00:22:33,760 --> 00:22:35,100 als ik het goed heb onthouden. 509 00:22:35,100 --> 00:22:36,460 >> Zodat er niets lijkt te gebeuren. 510 00:22:36,460 --> 00:22:40,680 Maar als ik typ ls nu, er students.csv. 511 00:22:40,680 --> 00:22:43,080 Laten we verder gaan en geopend students.csv. 512 00:22:43,080 --> 00:22:46,050 Ook dit is een zeer lichtgewicht bestandsformaat. 513 00:22:46,050 --> 00:22:49,570 Maar ik heb gewoon nam een ​​conventie dat ik twee rijen en kolommen hier. 514 00:22:49,570 --> 00:22:52,020 De eerste kolom is mensen voornamen. 515 00:22:52,020 --> 00:22:55,740 De tweede kolom is de student dorm, of hogeschool, of huis, of wat. 516 00:22:55,740 --> 00:22:57,900 En nu heb ik het gered permanent in een bestand. 517 00:22:57,900 --> 00:22:59,280 >> Dus het is niet zo interessant. 518 00:22:59,280 --> 00:23:02,980 Maar dit is slechts een opstapje nu op de mogelijkheid om informatie voortduren 519 00:23:02,980 --> 00:23:04,040 permanent. 520 00:23:04,040 --> 00:23:08,340 Dus laten we zien nu wat meer we kunnen met deze en andere functies. 521 00:23:08,340 --> 00:23:10,729 Maar eerst nog vragen? 522 00:23:10,729 --> 00:23:12,145 Dat was een stuk, en dat was snel. 523 00:23:12,145 --> 00:23:16,131 Maar je zult een hoop te zien Meer in Pset 4, ook. 524 00:23:16,131 --> 00:23:16,630 Ja? 525 00:23:16,630 --> 00:23:19,360 >> PUBLIEK: Is er een manier om blijven toevoegen namen aan dat bestand? 526 00:23:19,360 --> 00:23:19,880 >> DAVID J. MALAN: Goede vraag. 527 00:23:19,880 --> 00:23:21,800 Is er een manier om verder te gaan toe te voegen namen aan dat bestand? 528 00:23:21,800 --> 00:23:22,340 Ja. 529 00:23:22,340 --> 00:23:24,630 En, in feite, als je uiteindelijk up opnieuw openen van het bestand, 530 00:23:24,630 --> 00:23:26,780 zou je citaat te gebruiken unquote "a" voor append, 531 00:23:26,780 --> 00:23:31,090 die zou gewoon een nieuwe lijn, een opnieuw en opnieuw, precies nieuwe lijn. 532 00:23:31,090 --> 00:23:32,010 Goede vraag. 533 00:23:32,010 --> 00:23:32,950 Overige vragen? 534 00:23:32,950 --> 00:23:33,450 Ja? 535 00:23:33,450 --> 00:23:35,580 Publiek: Als je liep de programma opnieuw op dit moment, 536 00:23:35,580 --> 00:23:38,000 zou het blijven toevoegen namen aan de bestand of zou het openen van een nieuw bestand? 537 00:23:38,000 --> 00:23:38,740 >> DAVID J. MALAN: Ah, goede vraag. 538 00:23:38,740 --> 00:23:41,448 Als je liep het programma weer recht Nu, misschien ingetypt nieuwe namen, 539 00:23:41,448 --> 00:23:44,820 zou het toe te voegen aan het bestand of het bestand overschrijven? 540 00:23:44,820 --> 00:23:47,420 De laatste, want ik ben niet gebruikt append mode. 541 00:23:47,420 --> 00:23:49,930 En omdat ik ben gewoon blindelings het openen van het bestand voor schrijven, 542 00:23:49,930 --> 00:23:51,310 het is gewoon gaat om het bestand te overschrijven. 543 00:23:51,310 --> 00:23:54,570 Dus ik zou wel moeten doen is te voegen, als ik wil eigenlijk een lange termijn 544 00:23:54,570 --> 00:23:55,350 database. 545 00:23:55,350 --> 00:23:58,220 >> Nu CSV is handig, eerlijk gezegd, zelfs voor alsof je writing-- 546 00:23:58,220 --> 00:24:00,100 en we zullen uiteindelijk dit zien later in het semester bij 547 00:24:00,100 --> 00:24:01,455 We gebruiken CSV voor andere doeleinden. 548 00:24:01,455 --> 00:24:04,920 Als u alle van de mensen op te slaan die hebben ingeschreven voor een bepaalde gebeurtenis, 549 00:24:04,920 --> 00:24:07,420 of aangemeld voor uw student groep, of iets dergelijks, 550 00:24:07,420 --> 00:24:10,330 bewaring in dergelijke van formaat is super handig. 551 00:24:10,330 --> 00:24:12,580 Omdat letterlijk, als ik waren om dit bestand te downloaden. 552 00:24:12,580 --> 00:24:14,540 Ik kon double-- en laten we eigenlijk dit proberen 553 00:24:14,540 --> 00:24:16,720 als ik Excel of Numbers hier. 554 00:24:16,720 --> 00:24:19,130 >> Ik ga klik met de rechtermuisknop of de controle op mijn dossier. 555 00:24:19,130 --> 00:24:20,020 Whoops. 556 00:24:20,020 --> 00:24:21,830 Klik rechts of control-klik op mijn dossier. 557 00:24:21,830 --> 00:24:24,960 Kom op, mijn muis niet mee. 558 00:24:24,960 --> 00:24:32,694 Download-- Ik ga Download hier alle bestanden zo 559 00:24:32,694 --> 00:24:33,860 zodat ik kan dit te grijpen. 560 00:24:33,860 --> 00:24:37,850 En laten we eens kijken of dit werkt students.csv-- eerst 561 00:24:37,850 --> 00:24:39,310 Ik heb geactiveerd. 562 00:24:39,310 --> 00:24:41,360 Nu willen ze mijn contacten te zien. 563 00:24:41,360 --> 00:24:44,310 Nu, ik moet registreren. 564 00:24:44,310 --> 00:24:47,620 Zien hoe gemakkelijk het is om CSV gebruiken? 565 00:24:47,620 --> 00:24:50,840 Ja, keep it up-to-date. 566 00:24:50,840 --> 00:24:52,375 OK, nu zijn we klaar voor klasse. 567 00:24:52,375 --> 00:24:58,750 568 00:24:58,750 --> 00:25:00,370 OK, oh, wat is nieuw? 569 00:25:00,370 --> 00:25:02,920 OK, in de buurt. 570 00:25:02,920 --> 00:25:04,750 Dat was magisch. 571 00:25:04,750 --> 00:25:07,280 Oké, nu moeten we werken. 572 00:25:07,280 --> 00:25:10,890 En nu, het vergeten wat bestand Ik oorspronkelijk geopend, 573 00:25:10,890 --> 00:25:13,090 maar wat er A-- we gaan. 574 00:25:13,090 --> 00:25:16,341 OK, dus nu hebben we een Excel-bestand. 575 00:25:16,341 --> 00:25:18,290 Dankjewel. 576 00:25:18,290 --> 00:25:20,764 >> OK, dus wat ik deed was het makkelijke gedeelte. 577 00:25:20,764 --> 00:25:23,930 Natuurlijk kon ik heb vooraf geïnstalleerde Excel of Numbers, of wat dan ook het programma. 578 00:25:23,930 --> 00:25:25,846 Maar dit is mooi, want nu kan ik manipuleren 579 00:25:25,846 --> 00:25:28,090 de gegevens in een standaardformaat. 580 00:25:28,090 --> 00:25:30,294 >> Dus laten we nu context schakelen naar waar we gebleven 581 00:25:30,294 --> 00:25:32,710 laatste keer die beginnen af te nemen zijwieltjes. 582 00:25:32,710 --> 00:25:34,543 Maar eerst, je deed het niet zie dit eerder lunch 583 00:25:34,543 --> 00:25:38,150 wordt weer gebeurt hier bij Brand en Ijs in Cambridge, Sitar in New Haven. 584 00:25:38,150 --> 00:25:43,150 Meld je aan op CS50s website ASAP CS50 om studenten en medewerkers meedoen. 585 00:25:43,150 --> 00:25:46,090 >> Dus namen we zijwieltjes off op maandag als follows-- 586 00:25:46,090 --> 00:25:49,120 snaar is verklaard in CS50s bibliotheek voor bepaalde tijd. 587 00:25:49,120 --> 00:25:52,650 En het is leuk, omdat het mogelijk maakt ons over variabelen te praten als 588 00:25:52,650 --> 00:25:54,660 volledige woorden en zinnen en meer. 589 00:25:54,660 --> 00:25:56,710 Maar het blijkt koord bestaat niet. 590 00:25:56,710 --> 00:26:00,200 Dat is gewoon een synoniem, of een alias, die we hebben gemaakt voor iets dat 591 00:26:00,200 --> 00:26:03,780 eigenlijk een beetje technisch heet een char *. 592 00:26:03,780 --> 00:26:07,900 >> En inderdaad, een voorbeeld zagen we een programma op maandag 593 00:26:07,900 --> 00:26:11,200 dat niet gedragen helemaal zoals we verwacht hadden. 594 00:26:11,200 --> 00:26:13,630 Dit was de file, vergelijk-0. 595 00:26:13,630 --> 00:26:17,910 En herinner me dat te vergelijken-0, indien Ik maandag het programma opnieuw te compileren 596 00:26:17,910 --> 00:26:22,670 en run vergelijken-0 en typ moeder in kleine letters, en mamma in kleine letters weer. 597 00:26:22,670 --> 00:26:25,320 Het programma stond erop dat ik typt verschillende dingen, 598 00:26:25,320 --> 00:26:29,210 hoewel moeder, alles in kleine letters, is identiek visueel. 599 00:26:29,210 --> 00:26:31,990 Dus wat was het korte antwoord waarom de computer denkt 600 00:26:31,990 --> 00:26:34,500 die twee strings zijn verschillend? 601 00:26:34,500 --> 00:26:35,250 Ja? 602 00:26:35,250 --> 00:26:36,534 >> PUBLIEK: [onverstaanbaar] 603 00:26:36,534 --> 00:26:37,450 DAVID J. MALAN: Recht. 604 00:26:37,450 --> 00:26:39,600 Dus, moeder, de eerste keer Ik typ het in, is dat 605 00:26:39,600 --> 00:26:42,710 ergens opgeslagen in mijn computer geheugen, maar op een andere locatie 606 00:26:42,710 --> 00:26:44,690 dan de tweede keer dat ik typ moeder. 607 00:26:44,690 --> 00:26:46,580 Nu is het zeker kan worden geoptimaliseerd. 608 00:26:46,580 --> 00:26:49,205 De computer kan slim zijn en realiseren van deze twee snaren, hey, 609 00:26:49,205 --> 00:26:49,954 ze zijn identiek. 610 00:26:49,954 --> 00:26:51,520 Laat me niet redundant opslaan. 611 00:26:51,520 --> 00:26:54,229 Maar computers doen dat niet optimalisatie tenzij je vertellen ze. 612 00:26:54,229 --> 00:26:56,061 Dus, standaard, ze zijn gewoon gaan eindigen 613 00:26:56,061 --> 00:26:57,670 op twee verschillende plaatsen in het geheugen. 614 00:26:57,670 --> 00:27:01,570 En zo meer duidelijk, toen zijn We vergeleken de twee snaren, 615 00:27:01,570 --> 00:27:03,950 de eerste heette s, de tweede heette 616 00:27:03,950 --> 00:27:08,530 t, wat er concreet was ik vergelijken hier op lijn 13? 617 00:27:08,530 --> 00:27:09,494 Ja. 618 00:27:09,494 --> 00:27:12,390 >> Publiek: Het is de plek in het geheugen de variabele wijzen. 619 00:27:12,390 --> 00:27:14,900 >> DAVID J. MALAN: Precies, ik was het vergelijken van de plaats in het geheugen 620 00:27:14,900 --> 00:27:16,300 dat deze variabelen wees. 621 00:27:16,300 --> 00:27:20,560 Dus het bijzonder, als moeder was byte nummer 1 en 2, en 3, 622 00:27:20,560 --> 00:27:24,020 en 4-- omdat herinner me de backslash 0 moet helemaal aan het einde. 623 00:27:24,020 --> 00:27:29,420 En de andere instantie van moeder, m-o-meter, werd op adres 10, 11, 12 en 13. 624 00:27:29,420 --> 00:27:33,100 Ik was het vergelijken van 1, dat adres, die locatie in het geheugen, 625 00:27:33,100 --> 00:27:35,160 tegen 10, die duidelijk niet hetzelfde. 626 00:27:35,160 --> 00:27:36,260 1 is 10. 627 00:27:36,260 --> 00:27:39,620 >> Dus dit is leuk in dat het is vrij eenvoudig. 628 00:27:39,620 --> 00:27:42,870 Maar het is problematisch voorzover kunnen we niet lijken te strings te vergelijken. 629 00:27:42,870 --> 00:27:44,930 Dus fundamentally-- en op dit lage niveau, 630 00:27:44,930 --> 00:27:47,300 als je wilde implementeren een programma ter vergelijking 631 00:27:47,300 --> 00:27:50,270 twee afzonderlijke woorden die de gebruiker heeft getypt in voor de kwaliteit, 632 00:27:50,270 --> 00:27:53,944 doen ze line-up voor char char, alleen in algemene termen, 633 00:27:53,944 --> 00:27:55,360 wat hebben we nodig om te doen, blijkbaar? 634 00:27:55,360 --> 00:27:57,940 Het is niet voldoende alleen om kijk naar die twee adressen. 635 00:27:57,940 --> 00:27:58,860 Wat moeten we doen? 636 00:27:58,860 --> 00:27:59,360 Ja? 637 00:27:59,360 --> 00:28:01,120 >> PUBLIEK: doorlopen de string [onverstaanbaar]. 638 00:28:01,120 --> 00:28:02,600 >> DAVID J. MALAN: Ja, laten we doorloopt de string. 639 00:28:02,600 --> 00:28:05,808 Laten we gebruik maken van een lus, een while-lus, of wat je het meest comfortabel met. 640 00:28:05,808 --> 00:28:08,840 En als we hebben twee snaren kreeg ergens in het geheugen, laten we eens kijken naar elk van de 641 00:28:08,840 --> 00:28:11,770 eerste teken, dan is elke seconde karakter dan de derde en vierde, 642 00:28:11,770 --> 00:28:15,206 en vijfde, tot we hit welke speciale sentinel waarde? 643 00:28:15,206 --> 00:28:16,080 PUBLIEK: [onverstaanbaar] 644 00:28:16,080 --> 00:28:18,800 DAVID J. MALAN: Ja, de backslash nul, waarna in beide tekenreeks 645 00:28:18,800 --> 00:28:20,100 We kunnen besluiten dat is het. 646 00:28:20,100 --> 00:28:21,970 Hebben we afgestemd elk personage? 647 00:28:21,970 --> 00:28:22,990 Zo niet, return false. 648 00:28:22,990 --> 00:28:24,770 Als dat zo is, return true. 649 00:28:24,770 --> 00:28:28,800 En dat is precies wat deze versie van het programma te vergelijken-1.c doet. 650 00:28:28,800 --> 00:28:31,677 Het is identiek aan wat we keek maandag behalve dat ik heb 651 00:28:31,677 --> 00:28:34,760 weggedaan van het woord string-- al dat heeft geen functionele impact-- alle 652 00:28:34,760 --> 00:28:37,450 Ik ben nu aan het doen is het verwijderen sommige visuele zijwieltjes, 653 00:28:37,450 --> 00:28:40,880 maar om duidelijk te zien dat s en t adressen. 654 00:28:40,880 --> 00:28:43,020 En dat is wat de ster, het sterretje, vertegenwoordigt 655 00:28:43,020 --> 00:28:46,690 is een adres, ook wel bekend meer technisch als een pointer. 656 00:28:46,690 --> 00:28:49,880 >> Dus toen ik verklaar s op lijn 9 en zeggen: char * s, 657 00:28:49,880 --> 00:28:52,160 dat betekent niet dat geef me een string. 658 00:28:52,160 --> 00:28:56,360 Dat betekent geef me een variabele waarvan doel in het leven is om een ​​adres op te slaan. 659 00:28:56,360 --> 00:29:00,400 Want ik ben op het punt om het te zetten adres van een string in. 660 00:29:00,400 --> 00:29:03,500 En inderdaad, GetString, worden duidelijk, niet een string terug. 661 00:29:03,500 --> 00:29:06,110 Het heeft geen moeder terug backslash nul per se. 662 00:29:06,110 --> 00:29:10,005 Wat doet getString specifiek en precies terug te keren? 663 00:29:10,005 --> 00:29:10,880 PUBLIEK: [onverstaanbaar] 664 00:29:10,880 --> 00:29:14,080 DAVID J. MALAN: Een adres, de het adres van het eerste teken 665 00:29:14,080 --> 00:29:16,070 in sommige touw het heeft gekregen. 666 00:29:16,070 --> 00:29:19,250 En nu we zien een speciale zoekwoord opnieuw. 667 00:29:19,250 --> 00:29:20,640 En ik zinspeelde eerder. 668 00:29:20,640 --> 00:29:23,620 Dit gaat goed conventie dat we opnieuw en opnieuw te zien nu. 669 00:29:23,620 --> 00:29:27,540 Ik controleer om ervoor te zorgen dat s is niet van nul en t is niet nul. 670 00:29:27,540 --> 00:29:30,100 Omdat op basis van mijn echt snelle melding eerder, 671 00:29:30,100 --> 00:29:35,510 wat zou kunnen betekenen als GetString terugkeert niet domicilie maar N-U-L-L, die weer, 672 00:29:35,510 --> 00:29:36,990 een aantal speciale waarde? 673 00:29:36,990 --> 00:29:37,890 >> Publiek: Fout. 674 00:29:37,890 --> 00:29:38,600 >> DAVID J. MALAN: Het is een fout. 675 00:29:38,600 --> 00:29:39,550 Er is iets fout gegaan. 676 00:29:39,550 --> 00:29:41,341 En wat doorgaans zou kunnen gebeuren, in het bijzonder 677 00:29:41,341 --> 00:29:45,162 met strings-- die mogelijk van onbekende lengte advance-- 678 00:29:45,162 --> 00:29:46,870 misschien wel de computers ' uit het geheugen, misschien 679 00:29:46,870 --> 00:29:49,280 u in zo'n getypt lang woord of zin 680 00:29:49,280 --> 00:29:51,880 of geplakt zo'n enorme essay er is gewoon niet genoeg geheugen. 681 00:29:51,880 --> 00:29:55,340 En dus GetString kan niet terugkeren het adres van de hele zaak, 682 00:29:55,340 --> 00:29:56,620 zodat het net terugkeert niets. 683 00:29:56,620 --> 00:30:00,580 En er staat een fout is gebeurd door terugzending van de speciale waarde NULL. 684 00:30:00,580 --> 00:30:02,890 Het is de nul-adres, om zo te zeggen. 685 00:30:02,890 --> 00:30:06,157 >> Nu blijkt C wordt geleverd met een functie die iteratie doet. 686 00:30:06,157 --> 00:30:09,240 We hoeven niet om dit te implementeren met een lus of een tijdje loop onszelf. 687 00:30:09,240 --> 00:30:11,150 We kunnen een functie te gebruiken, bondig genoemd, 688 00:30:11,150 --> 00:30:15,400 roer comp, of touwtje vergelijken, wiens doel in het leven is om precies dat te doen. 689 00:30:15,400 --> 00:30:19,990 Je geeft er twee pointers, twee adressen, en zal naar die adressen 690 00:30:19,990 --> 00:30:23,130 en vergelijk brief voor letter voor letter voor kwaliteit, 691 00:30:23,130 --> 00:30:26,610 stoppen alleen wanneer wat waar is? 692 00:30:26,610 --> 00:30:31,540 Wanneer intuïtief comping moet roer stop iteratie, alleen maar om duidelijk te zijn? 693 00:30:31,540 --> 00:30:35,400 Als het hits een backslash 0 in beide touwtje, op welk punt kan beslissen 694 00:30:35,400 --> 00:30:38,910 heeft alles afgestemd, of is er een discrepantie geweest? 695 00:30:38,910 --> 00:30:42,740 >> Dus, als we lopen dit nu en probeer onze kleine kapitalisatie spel, 696 00:30:42,740 --> 00:30:49,260 dus zorg vergelijken-1, ./compare-1 en typt moeder in kleine letters beide keren. 697 00:30:49,260 --> 00:30:50,560 Nu is het hetzelfde. 698 00:30:50,560 --> 00:30:54,080 En als ik het weer doen met kleine letters en dan misschien hoofdletters. 699 00:30:54,080 --> 00:30:56,720 Nu het inderdaad onderscheidt tussen hoofdletters en kleine letters. 700 00:30:56,720 --> 00:31:00,440 Dus niet zo moeilijk of magisch, maar het is nu uitleggen 701 00:31:00,440 --> 00:31:03,140 wat er onder de motorkap. 702 00:31:03,140 --> 00:31:07,640 >> Dus wat we nog meer kunnen halen van dit soort les? 703 00:31:07,640 --> 00:31:08,980 Dus laten we eens een kijkje op deze. 704 00:31:08,980 --> 00:31:15,380 Ik ga om te gaan en schrijven quick programma hier genaamd copy-0. 705 00:31:15,380 --> 00:31:21,594 En laten we nu verder gaan en eigenlijk laten we het doen dit-- met exemplaar-0, 706 00:31:21,594 --> 00:31:23,010 een kijkje nemen op wat ik hier heb. 707 00:31:23,010 --> 00:31:24,712 Ik voor het eerst de gebruiker te vertellen, iets zeggen. 708 00:31:24,712 --> 00:31:26,420 Dan krijg ik een string en ik opgeslagen in s. 709 00:31:26,420 --> 00:31:29,810 Dan kijk ik of s gelijk is gelijk aan NULL, gewoon terug 1. 710 00:31:29,810 --> 00:31:31,590 Dus dit is gewoon standaard foutcontrole. 711 00:31:31,590 --> 00:31:33,112 Niets interessants is gebeurd. 712 00:31:33,112 --> 00:31:36,320 En inderdaad, als we te ontdoen van de fout controleren, dit ziet eruit als week 1 code 713 00:31:36,320 --> 00:31:36,985 op dit moment. 714 00:31:36,985 --> 00:31:39,110 Maar ik ben begonnen om een ​​te krijgen beetje beter over. 715 00:31:39,110 --> 00:31:43,340 >> Nu in lijn 16, een week geleden, misschien zelfs een paar dagen of minuten geleden 716 00:31:43,340 --> 00:31:46,720 je zou zeggen dat lijn 16 is het creëren van een variabele met de naam t 717 00:31:46,720 --> 00:31:48,219 en kopiëren s in. 718 00:31:48,219 --> 00:31:50,010 En dat is een perfect redelijke afhaalmaaltijd. 719 00:31:50,010 --> 00:31:51,560 Maar zijn nu nauwkeuriger. 720 00:31:51,560 --> 00:31:54,190 Wat gebeurt er in de lijn 16? 721 00:31:54,190 --> 00:31:56,170 Wat wordt steeds gekopieerd van rechts naar links? 722 00:31:56,170 --> 00:31:56,669 Ja? 723 00:31:56,669 --> 00:31:58,490 PUBLIEK: Is t krijgt een adres van s? 724 00:31:58,490 --> 00:32:01,220 >> DAVID J. MALAN: Precies, t krijgt het adres van s. 725 00:32:01,220 --> 00:32:05,170 Dus om nu duidelijk zijn, als ik ga terug naar die eerdere voorbeeld 726 00:32:05,170 --> 00:32:08,520 en ik trekken uit wat ik in hebt getypt. 727 00:32:08,520 --> 00:32:11,640 En wat ik heb getypt in-- hier is s, en hier 728 00:32:11,640 --> 00:32:15,830 is wat ik heb ergens getypt in geheugen, moeder en vervolgens een backslash 729 00:32:15,830 --> 00:32:17,840 0 dat is toegevoegd voor mij. 730 00:32:17,840 --> 00:32:23,060 Wat ik opgeslagen in hier, herinneren, Dit is op plaats 1, 2, 3, 4, 731 00:32:23,060 --> 00:32:24,655 dit is wat er momenteel in s. 732 00:32:24,655 --> 00:32:29,220 Dus als op lijn 16, zeg ik geef mij een variabele genaamd t en opslag 733 00:32:29,220 --> 00:32:33,590 in de waarde van s, wat wordt hier opgeslagen zal niet mom 734 00:32:33,590 --> 00:32:35,480 maar alleen het getal 1. 735 00:32:35,480 --> 00:32:38,520 >> Dus als we kijken vooruit in dit programma Nu, wat gaat er gebeuren? 736 00:32:38,520 --> 00:32:40,690 Zo merken dat er deze functie je misschien 737 00:32:40,690 --> 00:32:44,410 hebben deze gebruikt enige tijd geleden voor Caesar, of Vigenere, of misschien helemaal niet. 738 00:32:44,410 --> 00:32:48,170 Ik eis mijn printf, ik ben gaan om te profiteren van de kopie t. 739 00:32:48,170 --> 00:32:51,616 Eerste in lijn 19, snel sanity controleren, strlen controleert de lengte van t. 740 00:32:51,616 --> 00:32:53,740 Omdat ik het niet wil probeer iets te kapitaliseren 741 00:32:53,740 --> 00:32:55,104 als er geen touw daar. 742 00:32:55,104 --> 00:32:57,520 Als de gebruiker gewoon op Enter, er is niets te kapitaliseren. 743 00:32:57,520 --> 00:33:01,100 Dus ik wil geen lijn 21 te doen. 744 00:33:01,100 --> 00:33:05,758 Dus lijn 21 is kapitaliseren welke letter, blijkbaar, in t? 745 00:33:05,758 --> 00:33:06,514 >> PUBLIEK: m? 746 00:33:06,514 --> 00:33:08,722 DAVID J. MALAN: Het ziet er alsof het kopiëren van welke? 747 00:33:08,722 --> 00:33:09,486 Publiek: m. 748 00:33:09,486 --> 00:33:10,450 DAVID J. MALAN: Uh, m. 749 00:33:10,450 --> 00:33:12,685 OK, dus de eerste m, want mede dat ik ben 750 00:33:12,685 --> 00:33:14,935 loopt naar ToUpper, waarbij als je nog nooit hebt gezien is het 751 00:33:14,935 --> 00:33:16,980 alleen een functie om profiteren als invoer. 752 00:33:16,980 --> 00:33:20,240 t beugel nul betekent geven me de nul karakter van t. 753 00:33:20,240 --> 00:33:22,550 En dus hoe gaat dit foto veranderen, om duidelijk te zijn? 754 00:33:22,550 --> 00:33:25,490 755 00:33:25,490 --> 00:33:29,160 Wat moet krijgen herschreven of gewijzigd met betrekking tot s en t en mamma 756 00:33:29,160 --> 00:33:30,097 backslash nul. 757 00:33:30,097 --> 00:33:31,470 >> PUBLIEK: [onverstaanbaar] 758 00:33:31,470 --> 00:33:34,030 >> DAVID J. MALAN: Ja, dus dit hier gewoon 759 00:33:34,030 --> 00:33:40,860 moet krijgen veranderd to-- fix dit-- moet krijgen veranderd in een hoofdletter m. 760 00:33:40,860 --> 00:33:44,330 Maar nu, kijk later in de programma, als ik uitprinten 761 00:33:44,330 --> 00:33:49,800 s en t als ik schoon hier, let op wat is gaat gebeuren afdrukken van s en t. 762 00:33:49,800 --> 00:33:54,310 Dus zorg copy-0, ./copy-0. 763 00:33:54,310 --> 00:33:57,140 Laat me ga je gang en typ in moeder in alle kleine letters. 764 00:33:57,140 --> 00:34:00,140 Let op zowel het origineel en de kopie zijn geactiveerd. 765 00:34:00,140 --> 00:34:00,850 Waarom? 766 00:34:00,850 --> 00:34:04,431 Nou, s en t zijn beide wijzen op, als je wil, het zelfde stuk van het geheugen. 767 00:34:04,431 --> 00:34:06,930 En eerlijk gezegd, dit wordt steeds echt uninteresting-- het feit 768 00:34:06,930 --> 00:34:09,150 dat we met behulp van het adres nul hier. 769 00:34:09,150 --> 00:34:11,719 Ik bedoel, heb ik niet echt schelen waarbij spul is in het geheugen. 770 00:34:11,719 --> 00:34:13,550 Sorry ik ben het wissen van een beetje te veel. 771 00:34:13,550 --> 00:34:15,674 Maar ik heb niet echt schelen waar dingen zijn in het geheugen. 772 00:34:15,674 --> 00:34:18,510 En ja, inderdaad wat programmeurs hebben de neiging te denken over 773 00:34:18,510 --> 00:34:21,080 is dat wanneer je praat over een adres, of een pointer, 774 00:34:21,080 --> 00:34:22,679 who cares waar het in het geheugen. 775 00:34:22,679 --> 00:34:24,989 Kan me niet schelen als het op byte één of een miljard. 776 00:34:24,989 --> 00:34:27,920 Ik zorg dat deze variabele effectief 777 00:34:27,920 --> 00:34:29,620 wijzend op dat stuk van het geheugen. 778 00:34:29,620 --> 00:34:33,350 En dus voortaan in plaats van kibbelen dan willekeurige geheugenadressen, laten we 779 00:34:33,350 --> 00:34:36,710 gewoon beginnen met pointers te trekken zo pointers als pijlen. 780 00:34:36,710 --> 00:34:39,340 Dus wat s en t werkelijk zijn, Volgens dit programma, 781 00:34:39,340 --> 00:34:42,130 vanwege de manier waarop ik heb gemaakt t, het is gewoon twee afzonderlijke variabelen 782 00:34:42,130 --> 00:34:43,840 die op hetzelfde stuk geheugen. 783 00:34:43,840 --> 00:34:45,215 En we niet schelen waar ze zijn. 784 00:34:45,215 --> 00:34:47,130 Dus we kunnen abstracte weg dat detail. 785 00:34:47,130 --> 00:34:48,780 >> Dus hoe kan ik dit oplossen? 786 00:34:48,780 --> 00:34:54,120 Als ik wil een versie van de kopie te schrijven programma dat feitelijk kopieert de tekenreeks 787 00:34:54,120 --> 00:34:56,840 en speelt alleen de exemplaar, maar intuïtief, 788 00:34:56,840 --> 00:34:59,766 wat heeft een te zijn ingrediënt onze oplossing? 789 00:34:59,766 --> 00:35:00,640 PUBLIEK: [onverstaanbaar] 790 00:35:00,640 --> 00:35:01,420 DAVID J. MALAN: We hebben een wat? 791 00:35:01,420 --> 00:35:01,820 PUBLIEK: Brok van het geheugen. 792 00:35:01,820 --> 00:35:03,280 DAVID J. MALAN: We moeten een ander deel van het geheugen, toch? 793 00:35:03,280 --> 00:35:05,360 We weten niet hoe doe het toch, per se. 794 00:35:05,360 --> 00:35:11,330 Maar ik soort moet dit zo gebeuren dat de oorspronkelijke moeder in kleine letters 795 00:35:11,330 --> 00:35:14,170 eindigt doordat extra stuk van het geheugen. 796 00:35:14,170 --> 00:35:19,770 En toen ik de kopie, I niet willen om dit exemplaar hier wijzigen. 797 00:35:19,770 --> 00:35:26,020 Ik plaats dat alleen in dit veranderen exemplaar, zodat het origineel ongewijzigd. 798 00:35:26,020 --> 00:35:27,980 >> Dus, laten we eens kijken hoe we dit kunnen doen. 799 00:35:27,980 --> 00:35:31,800 In copy-1, die al ontdaan van commentaar, 800 00:35:31,800 --> 00:35:33,250 maar online commentaar. 801 00:35:33,250 --> 00:35:36,710 We in plaats daarvan doen de following-- deze lijnen identiek zijn, krijg ik een string 802 00:35:36,710 --> 00:35:38,340 en noemen het is. 803 00:35:38,340 --> 00:35:43,500 Maar laten we nu eens kijken naar een van onze meest complex maar de laatste van de complexiteit 804 00:35:43,500 --> 00:35:47,340 voor een tijdje, lijn 16 doet precies dit. 805 00:35:47,340 --> 00:35:49,400 Dus als je comfortabel met de foto we gewoon drew-- 806 00:35:49,400 --> 00:35:51,790 geef me een nieuw stuk van het geheugen, kopieert alles erin, 807 00:35:51,790 --> 00:35:53,730 laten we eens kijken hoe we dat vertalen naar code. 808 00:35:53,730 --> 00:35:59,400 >> Dus lijn 16, aan de linkerkant, char * t geeft me dit vak hier. 809 00:35:59,400 --> 00:36:00,230 Dat is alles wat het doet. 810 00:36:00,230 --> 00:36:03,240 Aan de rechterkant, m alloc of malloc, 811 00:36:03,240 --> 00:36:06,480 is het toewijzen van geheugen, super luxe, een cryptische manier om gewoon te zeggen 812 00:36:06,480 --> 00:36:07,640 geef me een stuk van het geheugen. 813 00:36:07,640 --> 00:36:09,290 Hoeveel geheugen hebben we nodig? 814 00:36:09,290 --> 00:36:10,910 Nou, is een soort van een grote expressie. 815 00:36:10,910 --> 00:36:12,570 Maar laten we eens kijken wat hier staat. 816 00:36:12,570 --> 00:36:15,940 Dus dit is natuurlijk, is te geven mij de string lengte van s. 817 00:36:15,940 --> 00:36:19,094 Dus, moeder het zou wat zijn? 818 00:36:19,094 --> 00:36:21,010 Dus gewoon drie, toch? moeder is drie karakters. 819 00:36:21,010 --> 00:36:22,830 Je hoeft niet de telling van de backslash nul wanneer u 820 00:36:22,830 --> 00:36:25,960 spreken over de lengte van een string is het eigenlijk de menselijke zichtbare letters. 821 00:36:25,960 --> 00:36:28,020 Zo moeder, dus dit geeft me 3. 822 00:36:28,020 --> 00:36:31,170 Maar wacht eens even, ik ben nu het toevoegen van 1. 823 00:36:31,170 --> 00:36:34,861 Waarom moet ik eigenlijk wil toewijzen 4 bytes en niet slechts 3? 824 00:36:34,861 --> 00:36:35,360 Ja? 825 00:36:35,360 --> 00:36:36,910 >> Publiek: voor de sentinel waarde? 826 00:36:36,910 --> 00:36:38,951 >> DAVID J. MALAN: Precies, voor die sentinel waarde. 827 00:36:38,951 --> 00:36:40,840 Voor de backslash nul, Ik moet 4 bytes totaal. 828 00:36:40,840 --> 00:36:42,870 Dus ik moet de lengte van de snaar plus 1. 829 00:36:42,870 --> 00:36:45,400 En dan alleen voor een goede measure-- hoewel dit systeem, 830 00:36:45,400 --> 00:36:49,390 Het gaat altijd 1-- te zijn ik zeg vermenigvuldig dit door de grootte van een char. 831 00:36:49,390 --> 00:36:51,552 Blijkt sizeof is een operator in C die 832 00:36:51,552 --> 00:36:53,260 gewoon vertelt u de aantal bytes dat is 833 00:36:53,260 --> 00:36:54,700 die voor een bepaald type data. 834 00:36:54,700 --> 00:36:57,740 Het werkt niet voor arrays, typisch, soms ook. 835 00:36:57,740 --> 00:36:59,210 Maar in het algemene geval, niet. 836 00:36:59,210 --> 00:37:02,330 Maar het zal me vertellen hoeveel bytes een char is, wat blijkt is altijd 1. 837 00:37:02,330 --> 00:37:04,080 Dus dit is als vermenigvuldigen met 1. 838 00:37:04,080 --> 00:37:05,900 >> Zo super cryptische zoek regel code. 839 00:37:05,900 --> 00:37:09,320 Maar alles wat het doet is geeft me een stuk van het geheugen. 840 00:37:09,320 --> 00:37:13,590 Maar het lijkt te kopiëren iets in die geheugen? 841 00:37:13,590 --> 00:37:14,560 Nog niet. 842 00:37:14,560 --> 00:37:22,040 En wat doe ik op lijn 22, en 23, 24, 25, goed, ik gewoon doen. 843 00:37:22,040 --> 00:37:23,760 En dit is een soort van oude school spullen nu. 844 00:37:23,760 --> 00:37:26,010 Dit is als Pset 2, waarbij je bent gewoon bewegende dingen 845 00:37:26,010 --> 00:37:28,620 ongeveer in het geheugen, of liever strings. 846 00:37:28,620 --> 00:37:31,920 >> Dus ik ben itereren van 0 tot de lengte van de tekenreeks s. 847 00:37:31,920 --> 00:37:37,820 En ik ben het kopiëren van de i-de karakter in s in de ie karakter t. 848 00:37:37,820 --> 00:37:41,820 En omdat ik, de programmeur, maakte Zorg ervoor dat u precies zo veel bytes toe te wijzen 849 00:37:41,820 --> 00:37:44,600 als ik nodig heb, het is perfect één-op-één relatie. 850 00:37:44,600 --> 00:37:47,060 En kopieer ik mama in kleine letters naar de nieuwe. 851 00:37:47,060 --> 00:37:50,170 En dan tot slot, ik doe deze lijn. 852 00:37:50,170 --> 00:37:54,637 En dus het effect is alleen te profiteren hier de t. 853 00:37:54,637 --> 00:37:56,470 Dus veel te absorberen, maar als je gewoon overwegen 854 00:37:56,470 --> 00:37:58,220 wat er werkelijk aan de hand op onder de motorkap 855 00:37:58,220 --> 00:38:00,880 is gewoon het verplaatsen van deze bytes rond, alles 856 00:38:00,880 --> 00:38:06,617 is nodig om dit probleem op te lossen alleen maar om ons dit stuk van het geheugen te geven. 857 00:38:06,617 --> 00:38:08,450 Nu op het risico van overweldigend, laat me zien 858 00:38:08,450 --> 00:38:13,200 een ander voorbeeld dat is bijna identiek, behalve deze ene 859 00:38:13,200 --> 00:38:14,350 regel code. 860 00:38:14,350 --> 00:38:18,870 Dus dit is de hacker versie van dit programma, als je wil. 861 00:38:18,870 --> 00:38:21,050 Maar laten we gewoon destilleren het in wat er gaande is. 862 00:38:21,050 --> 00:38:28,920 Lijn 24 gebruikt om dit te t beugel i krijgt s beugel i. 863 00:38:28,920 --> 00:38:33,370 Nu, ik ben het veranderen van dit de veel cryptische ster t 864 00:38:33,370 --> 00:38:36,280 plus 1 gelijk ster s plus 1. 865 00:38:36,280 --> 00:38:38,702 >> Dus wat er gebeurt en waarom hebben we een ster karakter? 866 00:38:38,702 --> 00:38:41,410 We hebben de ster eerder gezien, en het wordt hier anders gebruikt. 867 00:38:41,410 --> 00:38:45,490 We eerder zagen char *, nu ik zie Een ster aan het begin, en dat is OK. 868 00:38:45,490 --> 00:38:48,190 Want het blijkt dat we kan soort afleiden net 869 00:38:48,190 --> 00:38:50,280 van die eerste principes wat er gaande is. 870 00:38:50,280 --> 00:38:53,860 Dus gewoon om duidelijk te zijn, wat is s? 871 00:38:53,860 --> 00:38:55,052 Vorige week was het een string. 872 00:38:55,052 --> 00:38:56,260 Dat niet meer voldoende. 873 00:38:56,260 --> 00:38:57,690 Wat is, in het bijzonder? 874 00:38:57,690 --> 00:38:58,590 >> PUBLIEK: [onverstaanbaar] 875 00:38:58,590 --> 00:38:59,881 >> DAVID J. MALAN: Het is een pointer. 876 00:38:59,881 --> 00:39:02,610 Het is het adres van de eerste teken dat we ingetypt. 877 00:39:02,610 --> 00:39:04,780 OK, wat is t? 878 00:39:04,780 --> 00:39:05,660 >> PUBLIEK: [onverstaanbaar] 879 00:39:05,660 --> 00:39:07,950 >> DAVID J. MALAN: De adres van de eerste byte 880 00:39:07,950 --> 00:39:10,490 in t, dat stuk van het geheugen toegewezen. 881 00:39:10,490 --> 00:39:14,720 Zo blijkt dat wanneer we itereren van 0 tot op de snaar 882 00:39:14,720 --> 00:39:17,424 length-- allereerst, i begint op 0, omdat 883 00:39:17,424 --> 00:39:18,840 van deze oude school lus ding. 884 00:39:18,840 --> 00:39:22,400 Dus alleen voor eenvoud, laten we veronderstellen dat de eerste regel van de code 885 00:39:22,400 --> 00:39:23,760 is eigenlijk gewoon dit, rechts. 886 00:39:23,760 --> 00:39:26,080 Wanneer i is nul, het toevoegen zero iets vermoedelijk 887 00:39:26,080 --> 00:39:27,540 is niet van plan om een ​​effect te hebben. 888 00:39:27,540 --> 00:39:28,560 >> Dus wat is dit woord? 889 00:39:28,560 --> 00:39:31,600 Het blijkt dat de ster operator in deze context 890 00:39:31,600 --> 00:39:33,700 is de dereference operator, dat is gewoon 891 00:39:33,700 --> 00:39:37,530 een mooie manier om te zeggen te gaan naar het volgende adres. 892 00:39:37,530 --> 00:39:42,080 Als s is het adres van de eerste personage in dit stuk van het geheugen, 893 00:39:42,080 --> 00:39:43,630 * s middelen gaan daar. 894 00:39:43,630 --> 00:39:45,630 En omdat we hebt getekend het beeld op deze manier, 895 00:39:45,630 --> 00:39:47,430 u kunt nemen de volgende mentaal model. 896 00:39:47,430 --> 00:39:51,030 Als dit s, en je zegt * s * s net zoiets als glijbanen en ladders, 897 00:39:51,030 --> 00:39:54,540 als je nog het spel uit de kindertijd, is als volgt dat de pijl en ga 898 00:39:54,540 --> 00:39:55,570 naar het adres. 899 00:39:55,570 --> 00:39:57,080 >> * t is hetzelfde. 900 00:39:57,080 --> 00:39:59,855 Dus begin hier, ga dan naar de brok. 901 00:39:59,855 --> 00:40:03,350 Ik kan het niet alleen doen op dit scherm op die manier. 902 00:40:03,350 --> 00:40:05,560 * t betekent om hier te gaan. 903 00:40:05,560 --> 00:40:08,830 En dan, de lus is gewoon zeggend bewegen hier dit karakter, 904 00:40:08,830 --> 00:40:11,330 bewegen hier dit karakter, bewegen hier dit karakter. 905 00:40:11,330 --> 00:40:12,890 Maar hoe doe ik dat incrementatie doen? 906 00:40:12,890 --> 00:40:15,430 Ik moet ongedaan maken wat ik net verwijderd. 907 00:40:15,430 --> 00:40:18,140 Dit is wat er over het algemeen genoemd pointer rekenkunde, die 908 00:40:18,140 --> 00:40:20,040 betekent math met adressen. 909 00:40:20,040 --> 00:40:22,460 >> Als, in deze lus, Ik blijf het verhogen i, 910 00:40:22,460 --> 00:40:26,880 en s een adres en t een adres, als ik gewoon blijven toevoegen 1, 911 00:40:26,880 --> 00:40:31,406 dat betekent gewoon blijven bewegen naar voren, en vooruit, en vooruit in het geheugen. 912 00:40:31,406 --> 00:40:34,030 Het is net als Oxford Street, de straat die het CS gebouw is op. 913 00:40:34,030 --> 00:40:36,490 De CS gebouw is op 33 Oxford Street. 914 00:40:36,490 --> 00:40:39,870 Dus als je om te doen 33 Oxford Street plus 1, 915 00:40:39,870 --> 00:40:42,870 dat brengt u naar 34 Oxford Straat, dan is 35 Oxford Street, 916 00:40:42,870 --> 00:40:46,380 dan 36 Oxford Street, wat die gebouwen eigenlijk zijn - indien ze bestaan. 917 00:40:46,380 --> 00:40:50,540 En ja, dat is alles wat we doen hier met pointer rekenkunde. 918 00:40:50,540 --> 00:40:53,820 >> Dus het is een super mysterieuze wijze expressie zelf. 919 00:40:53,820 --> 00:40:56,160 Maar dat gebeurt onder de motorkap 920 00:40:56,160 --> 00:40:59,330 is gewoon het volgen van deze adressen, zoals het volgen van een kaart, als je wil, 921 00:40:59,330 --> 00:41:02,692 of na pijlen als we hebben getekend op het scherm. 922 00:41:02,692 --> 00:41:04,910 OK, veel te verteren. 923 00:41:04,910 --> 00:41:10,410 Elke vraag over de syntaxis, concepten, pointers, malloc of dergelijke. 924 00:41:10,410 --> 00:41:11,480 Ja, dan eerst hier. 925 00:41:11,480 --> 00:41:13,755 >> Publiek: Dus waar dat zegt * t gelijk toupper * t, 926 00:41:13,755 --> 00:41:15,575 gaat dat kapitaliseren alle letters of gewoon-- 927 00:41:15,575 --> 00:41:17,283 >> DAVID J. MALAN: Ah, echt goede vraag. 928 00:41:17,283 --> 00:41:19,805 Dus in deze lijn hier, 31, gaat dit te kapitaliseren 929 00:41:19,805 --> 00:41:21,430 de eerste letter of alle letters. 930 00:41:21,430 --> 00:41:23,460 Dus laten beantwoorden door te gaan terug naar de eerste beginselen. 931 00:41:23,460 --> 00:41:26,168 En de eerste beginselen hier bedoel ik gewoon naar de fundamentele definities 932 00:41:26,168 --> 00:41:27,000 van wat er bij. 933 00:41:27,000 --> 00:41:29,770 Dus toupper is een functie dat inspeelt een char. 934 00:41:29,770 --> 00:41:30,530 Dat is alles. 935 00:41:30,530 --> 00:41:36,740 * t betekent naar de first-- naar het adres in t. 936 00:41:36,740 --> 00:41:40,350 Dus, op de foto, als dit het brok geheugen we toegewezen met malloc, 937 00:41:40,350 --> 00:41:43,310 en dit is t, * t betekent hier te gaan. 938 00:41:43,310 --> 00:41:46,710 >> Ondertussen, je voorbij die waarde, kleine letters m 939 00:41:46,710 --> 00:41:50,040 om toupper, je krijgt terug hoofdletter M, waar ga je het zetten? 940 00:41:50,040 --> 00:41:52,410 Je zet het op dezelfde locatie. 941 00:41:52,410 --> 00:41:55,540 En zo door die logica van die basisdefinities het is slechts 942 00:41:55,540 --> 00:41:58,792 kapitaliseren de eerste letter tenzij je herhalen met i of een 943 00:41:58,792 --> 00:42:02,000 lus of een tijdje loop, gaat het niet iets meer dan u te vragen doen. 944 00:42:02,000 --> 00:42:02,583 Goede vraag. 945 00:42:02,583 --> 00:42:03,237 Ja? 946 00:42:03,237 --> 00:42:05,369 >> Publiek: Waarom heb je gebruik maken van de dereference methode in plaats van 947 00:42:05,369 --> 00:42:05,979 de serie? 948 00:42:05,979 --> 00:42:07,395 >> DAVID J. MALAN: Ah, goede vraag. 949 00:42:07,395 --> 00:42:10,672 Waarom zou je het dereference gebruiken methode in plaats van de array methode? 950 00:42:10,672 --> 00:42:12,130 Geen bijzondere reden, om eerlijk te zijn. 951 00:42:12,130 --> 00:42:15,290 En inderdaad, deze soort voorbeeld, rechts, 952 00:42:15,290 --> 00:42:17,556 Ik ben gewoon ruzie maken van de programma ingewikkelder, 953 00:42:17,556 --> 00:42:19,680 meer ogen beglazing over, mensen bekijkt 954 00:42:19,680 --> 00:42:22,830 want dit ziet er super mysterieuze, maar ook al is het hetzelfde te doen. 955 00:42:22,830 --> 00:42:26,695 En dus, eerlijk gezegd, dit is een onnodig complexe oplossing visueel 956 00:42:26,695 --> 00:42:27,320 het probleem. 957 00:42:27,320 --> 00:42:29,580 >> Het is nog steeds een goed ontwerp, vijf van de vijf voor ontwerp, 958 00:42:29,580 --> 00:42:33,140 of het nu in de beugel notatie of de aanwijzer notatie. 959 00:42:33,140 --> 00:42:36,299 Maar-- vooral wanneer we krijgen later in de cursus in Pset 5 960 00:42:36,299 --> 00:42:39,340 als we implementeren dat woordenboek dat Ik heb het over een paar times-- 961 00:42:39,340 --> 00:42:42,300 we eigenlijk zorg over de lage geheugenadressen 962 00:42:42,300 --> 00:42:44,140 dat we echt begrijpen wat is er aan de hand. 963 00:42:44,140 --> 00:42:48,300 >> Maar voor nu, blijkt dat dit regel code hier vierkante haakjes 964 00:42:48,300 --> 00:42:49,900 niet echt bestaan. 965 00:42:49,900 --> 00:42:52,230 Ze zijn wat heet syntactische suiker, die 966 00:42:52,230 --> 00:42:58,390 is gewoon een vreemd koele manier om te zeggen de compiler zet vierkante haken zijn 967 00:42:58,390 --> 00:43:00,420 dat wiskundige uitdrukking. 968 00:43:00,420 --> 00:43:02,660 Dus het is een menselijke conventie kunnen gewoon schrijven 969 00:43:02,660 --> 00:43:04,220 deze zeer gebruiksvriendelijk haakjes. 970 00:43:04,220 --> 00:43:06,850 Maar wat de compiler, wapengekletter, is echt doet elk moment 971 00:43:06,850 --> 00:43:10,970 je schrijft wat gemarkeerd in lijn 24, onder de motorkap is het echt 972 00:43:10,970 --> 00:43:12,330 converteren naar deze. 973 00:43:12,330 --> 00:43:16,200 Het is gewoon prettiger als mens lezen en schrijven code zoals lijn 24. 974 00:43:16,200 --> 00:43:18,530 Maar uiteindelijk degenen zijwieltjes te komen off 975 00:43:18,530 --> 00:43:21,780 wanneer iemands eigen comfort wordt sterker. 976 00:43:21,780 --> 00:43:27,240 >> Oké, zo herinneren toen dat dit was het soort grootste probleem 977 00:43:27,240 --> 00:43:27,807 we tegenkwamen. 978 00:43:27,807 --> 00:43:30,640 En dat is wat leidde tot deze hele verdomde gesprek over pointers, 979 00:43:30,640 --> 00:43:32,340 en adressen en kopiëren dingen. 980 00:43:32,340 --> 00:43:35,410 Het was omdat we struikelde over dit stom, stom probleem, waarbij 981 00:43:35,410 --> 00:43:38,830 Ik geïmplementeerd logically-- met Lauren hier op de demo en het sinaasappelsap 982 00:43:38,830 --> 00:43:43,770 in de milk-- een perfect algoritmisch correcte werking 983 00:43:43,770 --> 00:43:47,010 voor swapping twee variabelen ' waarden, maar het ding 984 00:43:47,010 --> 00:43:50,550 had geen persistente, of permanent, effect op mijn code. 985 00:43:50,550 --> 00:43:51,820 >> En waarom was dat? 986 00:43:51,820 --> 00:43:54,650 In een notendop, waarom is dit uitvoering van de swap 987 00:43:54,650 --> 00:43:58,740 logisch correct, maar heeft geen invloed de variabelen die worden doorgegeven aan het, 988 00:43:58,740 --> 00:44:01,119 als x en y voor de belangrijkste? 989 00:44:01,119 --> 00:44:02,410 Wat was de kern van het probleem? 990 00:44:02,410 --> 00:44:02,909 Ja? 991 00:44:02,909 --> 00:44:05,532 Publiek: Omdat variabel gemaakt kopieën variabele in de pas 992 00:44:05,532 --> 00:44:06,240 door middel van de functie. 993 00:44:06,240 --> 00:44:09,060 >> DAVID J. MALAN: Precies, als je voorbij variabelen in een functie, of argumenten 994 00:44:09,060 --> 00:44:11,030 in een functie, ze zijn voorbij exemplaar, dat 995 00:44:11,030 --> 00:44:14,770 betekent dat je een identieke zoek patroon van bits voor x en y, 996 00:44:14,770 --> 00:44:15,955 riep hier en b. 997 00:44:15,955 --> 00:44:18,080 En je kunt niets doen je wilt met deze kopieën, 998 00:44:18,080 --> 00:44:20,657 maar ze gaan niet hebben Effect op de roeping functie. 999 00:44:20,657 --> 00:44:22,990 En, in feite, we trokken dat beeld op het scherm, recall 1000 00:44:22,990 --> 00:44:25,520 de vorige keer, waarbij als je echt na te denken over wat er 1001 00:44:25,520 --> 00:44:28,570 gaande onder de hood-- als dit is het geheugen van uw computer, 1002 00:44:28,570 --> 00:44:31,650 en hier beneden is het stuk van het geheugen wordt gebruikt voor de belangrijkste, 1003 00:44:31,650 --> 00:44:34,020 Dit is het brok het geheugen wordt gebruikt voor de swap, 1004 00:44:34,020 --> 00:44:37,090 en dus zelfs als hoofd heeft twee variabelen x en y, 1005 00:44:37,090 --> 00:44:41,840 swap zou hebben identieke zoek waarden, die beide 1 en 2, 1006 00:44:41,840 --> 00:44:44,520 maar ze zijn volledig verschillende delen van het geheugen. 1007 00:44:44,520 --> 00:44:46,130 >> We hebben een oplossing. 1008 00:44:46,130 --> 00:44:51,580 En eerlijk gezegd, lijkt het erop dat we nu een oplossing voor dit probleem, rechts. 1009 00:44:51,580 --> 00:44:55,760 Als we nu de mogelijkheid om dingen te manipuleren door middel van adressen 1010 00:44:55,760 --> 00:44:59,310 en een soort van glijbanen en ladders stijl, volg dan deze pijlen 1011 00:44:59,310 --> 00:45:02,820 en gaan waar we willen in het geheugen, konden we niet 1012 00:45:02,820 --> 00:45:06,220 dit probleem op te lossen het passeren van de belangrijkste om te ruilen 1013 00:45:06,220 --> 00:45:09,650 niet de waarden die we willen swap, maar intuïtief 1014 00:45:09,650 --> 00:45:11,630 Wat kunnen we passeren in plaats ruilen? 1015 00:45:11,630 --> 00:45:12,620 >> [Onderbreekt hem VOICES] 1016 00:45:12,620 --> 00:45:15,244 >> DAVID J. MALAN: Waarom doen we niet alleen doorgeven van de adressen, toch? 1017 00:45:15,244 --> 00:45:17,470 Waarom gaan we niet geven van een swap schatkaart, als je wil, 1018 00:45:17,470 --> 00:45:20,950 die leidt naar de actuele waarden x en y. 1019 00:45:20,950 --> 00:45:24,340 Laten we swap, eigenlijk veranderen deze oorspronkelijke bits, in plaats van 1020 00:45:24,340 --> 00:45:26,797 gewoon passeren exemplaren van de bits. 1021 00:45:26,797 --> 00:45:29,130 En ja, in feite, dat is wat naar de oplossing. 1022 00:45:29,130 --> 00:45:31,899 Deze versie is hier duidelijk slecht en gebrekkig. 1023 00:45:31,899 --> 00:45:35,190 En nu, op het eerste gezicht, het ziet er gewoon alsof we een stelletje sterren toegevoegd willekeurig 1024 00:45:35,190 --> 00:45:37,106 en onze vingers gekruist dat zou compileren. 1025 00:45:37,106 --> 00:45:38,460 Maar, zou het nu samen te stellen. 1026 00:45:38,460 --> 00:45:40,090 >> Maar laten we eens kijken wat deze dingen betekenen. 1027 00:45:40,090 --> 00:45:43,990 En, helaas, de auteurs van C kan een ander symbool gekozen hebben 1028 00:45:43,990 --> 00:45:46,380 om dit een beetje te maken duidelijker, maar de ster exploitant 1029 00:45:46,380 --> 00:45:48,610 heeft verschillende betekenis in twee verschillende contexten. 1030 00:45:48,610 --> 00:45:50,890 En we hebben gezien, maar laten we onderscheiden. 1031 00:45:50,890 --> 00:45:55,310 >> Dus op naar de top is er, toen ik a en b zijn veranderd 1032 00:45:55,310 --> 00:46:00,470 van zijn int in het bad versie naar de sterren, a en b int, 1033 00:46:00,470 --> 00:46:01,740 Voorheen werden integers. 1034 00:46:01,740 --> 00:46:05,752 Wat zijn a en b nu in het goede, groene versie? 1035 00:46:05,752 --> 00:46:06,900 Ze zijn adressen. 1036 00:46:06,900 --> 00:46:09,610 Adressen van wat, om duidelijk te zijn? 1037 00:46:09,610 --> 00:46:10,770 Adressen van gehele getallen. 1038 00:46:10,770 --> 00:46:12,520 Dus het feit dat ik ben zeggen int ster middelen 1039 00:46:12,520 --> 00:46:15,440 Dit is het adres van een geheel getal specifiek. 1040 00:46:15,440 --> 00:46:19,120 >> Dus nu het bericht in de lijnen van de code, iets anders is ook veranderd. 1041 00:46:19,120 --> 00:46:22,770 TMP gelijk blijft, omdat het is gewoon de tijdelijke integer, 1042 00:46:22,770 --> 00:46:24,110 geen geheugen magie daar. 1043 00:46:24,110 --> 00:46:26,370 Maar nu heeft een ster. 1044 00:46:26,370 --> 00:46:28,560 En in feite elke andere vermelding van a en b, 1045 00:46:28,560 --> 00:46:31,780 opmerken dat alles wat het veranderen van rood naar groen 1046 00:46:31,780 --> 00:46:34,209 is dat ik voorvoegsel deze variabelen met sterren. 1047 00:46:34,209 --> 00:46:35,750 Want ik wil niet a en b te kopiëren. 1048 00:46:35,750 --> 00:46:40,350 Want als ik gewoon kopiëren a en b en swap a en b, wat ben ik eigenlijk swapping? 1049 00:46:40,350 --> 00:46:43,760 Net adressen, ik wil ruilen wat er op die adressen. 1050 00:46:43,760 --> 00:46:44,860 Ik wil daar naar toe gaan. 1051 00:46:44,860 --> 00:46:48,000 En zo de ster exploitant binnenkant van mijn functie, 1052 00:46:48,000 --> 00:46:51,700 niet de binnenkant van de parameter lijst, betekent dat je naar die adressen 1053 00:46:51,700 --> 00:46:54,490 en eigenlijk veranderen deze waarden. 1054 00:46:54,490 --> 00:46:56,500 >> Dus wat doet de foto Nu lijken plaats. 1055 00:46:56,500 --> 00:47:03,250 Nou, als in plaats ik passeren in voor A en B niet 1 en 2-- 1056 00:47:03,250 --> 00:47:05,790 Ik echt nodig om toe te voegen een andere definitie hier. 1057 00:47:05,790 --> 00:47:09,030 Dus stel dat dit stuk van het geheugen is op locatie 10. 1058 00:47:09,030 --> 00:47:12,960 >> Dit is in plaats 11, maar dit is een beetje een vereenvoudiging, 1059 00:47:12,960 --> 00:47:18,900 Ik heb nu twee keuzes heb ik pas x en y of ik hun adressen doorgeven? 1060 00:47:18,900 --> 00:47:22,500 Als ik langs hun adressen als dit, ik heb net 1061 00:47:22,500 --> 00:47:25,390 Nu moeten implementeren swap per de groene code 1062 00:47:25,390 --> 00:47:29,080 zodat bij het zien van een en wanneer ziet b, is het niet gewoon kopiëren a en b 1063 00:47:29,080 --> 00:47:30,540 en verplaats de melk en jus d'orange. 1064 00:47:30,540 --> 00:47:32,664 De melk en jus d'orange metafoor breekt nu naar beneden, 1065 00:47:32,664 --> 00:47:35,060 want dat zijn cups van vloeibare en niet kaarten. 1066 00:47:35,060 --> 00:47:37,750 We in plaats daarvan moeten gaan aanpakken 10 en we 1067 00:47:37,750 --> 00:47:42,420 moeten gaan aan te pakken 11, en voer dat swapping logica. 1068 00:47:42,420 --> 00:47:45,580 >> Dus de logica is hetzelfde, maar we een iets andere manier nodig 1069 00:47:45,580 --> 00:47:47,160 van toegang tot deze variabelen. 1070 00:47:47,160 --> 00:47:52,400 En zo op het einde, wat de programma te kijken als dit is. 1071 00:47:52,400 --> 00:47:56,610 In swap.c letterlijk gekopieerd en plakte de groene versie. 1072 00:47:56,610 --> 00:47:58,450 Maar ik moet een verandering te maken. 1073 00:47:58,450 --> 00:48:00,180 Het is niet voldoende alleen om swap te veranderen. 1074 00:48:00,180 --> 00:48:03,830 Welke andere regel code moet ik veranderen? 1075 00:48:03,830 --> 00:48:04,330 Ja? 1076 00:48:04,330 --> 00:48:05,770 >> Publiek: Waar het neemt de argumenten. 1077 00:48:05,770 --> 00:48:07,603 >> DAVID J. MALAN: Waar het zijn argument. 1078 00:48:07,603 --> 00:48:09,985 Dus als ik scrollen tot de belangrijkste, ik kan niet zomaar passeren in x en y, 1079 00:48:09,985 --> 00:48:12,820 en, ik beloof, de laatste stuk van de nieuwe syntaxis vandaag. 1080 00:48:12,820 --> 00:48:17,200 Ik moet passeren niet x en y maar het adres van x en y. 1081 00:48:17,200 --> 00:48:20,400 En het blijkt, het symbool dat de auteurs van C kozen 1082 00:48:20,400 --> 00:48:23,860 is als je een ampersand hier te gebruiken, niet om verwarren met de bitsgewijze ampersand, 1083 00:48:23,860 --> 00:48:27,130 als je een ampersand gebruiken hier en een ampersand hier 1084 00:48:27,130 --> 00:48:29,570 Deze cijfers voor u, wat is het adres van x, 1085 00:48:29,570 --> 00:48:31,740 misschien is het 10, wat is het adres van y, misschien is het 1086 00:48:31,740 --> 00:48:35,400 11, en geeft deze in plaats daarvan. 1087 00:48:35,400 --> 00:48:37,210 >> Zo veel te absorberen alle tegelijk. 1088 00:48:37,210 --> 00:48:40,190 Maar laten we nu zien snel in onze resterende vier minuten 1089 00:48:40,190 --> 00:48:42,150 waar dingen mis kan gaan. 1090 00:48:42,150 --> 00:48:45,120 En als een terzijde, eigenlijk Ik nam deze foto, 1091 00:48:45,120 --> 00:48:46,920 TF nam deze foto een jaar of twee geleden. 1092 00:48:46,920 --> 00:48:49,190 Dus dit is de achterste hoek van Eliot eetzaal. 1093 00:48:49,190 --> 00:48:52,310 Pointers zijn misschien wel de moeilijkste onderwerp dat wij behandelen in CS50. 1094 00:48:52,310 --> 00:48:54,810 Dus als je je zorgen het soort helling is als misschien is het 1095 00:48:54,810 --> 00:48:56,770 meer van een hockeystick als dit, te realiseren 1096 00:48:56,770 --> 00:49:00,160 we zijn soort bijna een piek in termen van de conceptuele complexiteit. 1097 00:49:00,160 --> 00:49:02,300 >> En ik brengen dit foto, want ik zweer 1098 00:49:02,300 --> 00:49:05,920 aan god, in de herfst van 1996, toen ik CS50 met mijn collega-onderwijs, 1099 00:49:05,920 --> 00:49:09,620 Nishat Mehta, zat hij me in het hoek van de Eliot D. Hall tijdens de lunch, 1100 00:49:09,620 --> 00:49:12,330 of diner, of iets te proberen om me te helpen begrijpen pointers. 1101 00:49:12,330 --> 00:49:16,520 En dit is waar ik was weken na het werd in collegezaal toen introduceerde 1102 00:49:16,520 --> 00:49:18,170 Ik eindelijk begreep pointers. 1103 00:49:18,170 --> 00:49:20,590 En ik ben hoopvol gestemd dat deze zal veel eerder voor u klikt. 1104 00:49:20,590 --> 00:49:23,540 Maar beseffen dat dit absoluut onder de meer geavanceerde topics 1105 00:49:23,540 --> 00:49:24,420 we hebben gekeken. 1106 00:49:24,420 --> 00:49:25,819 Maar het is een van de krachtigste. 1107 00:49:25,819 --> 00:49:28,860 En als je het te krijgen, het is echt allemaal gewoon om uiteindelijk bij elkaar komen. 1108 00:49:28,860 --> 00:49:31,460 Dus wees gerust het niet moeten alle wastafel in vandaag. 1109 00:49:31,460 --> 00:49:32,980 >> Dus hier is het laatste programma we gaan kijken. 1110 00:49:32,980 --> 00:49:35,605 En we gaan eindigen met een snelle drie minuten van claymation 1111 00:49:35,605 --> 00:49:37,030 gemaakt door onze vriend, Nick Parlante. 1112 00:49:37,030 --> 00:49:41,440 Hier is een programma, dat op de bovenste twee lijnen verklaart een variabele x en y. 1113 00:49:41,440 --> 00:49:44,780 Die beide adressen van gehele getallen, AKA pointers. 1114 00:49:44,780 --> 00:49:48,125 Vervolgens hebben we wijzen genoeg geheugen om een ​​int slaan 1115 00:49:48,125 --> 00:49:51,344 en op te slaan het adres van die herinnering in x. 1116 00:49:51,344 --> 00:49:53,260 Dus, het is nog eenvoudiger dan het eerdere voorbeeld. 1117 00:49:53,260 --> 00:49:56,100 Geef me vier bytes van het geheugen, dat is de grootte van een int, 1118 00:49:56,100 --> 00:49:58,000 en zet dat adres in x. 1119 00:49:58,000 --> 00:50:01,070 Deze lijn betekent hier naar het adres in x 1120 00:50:01,070 --> 00:50:05,270 en zet de betekenis van leven, het getal 42 zijn. 1121 00:50:05,270 --> 00:50:07,710 Maar deze lijn mij zorgen baart. 1122 00:50:07,710 --> 00:50:12,620 Ster y betekent naar het adres in y, en zet de ongelukkige nummer 13 daar. 1123 00:50:12,620 --> 00:50:15,780 Waarom is het gevaarlijk, op dit punt in de story-- zij snel verteld 1124 00:50:15,780 --> 00:50:17,980 in onze tanende minuten hier-- waarom is het slecht 1125 00:50:17,980 --> 00:50:19,660 voor mij om te zeggen, ga dan naar het adres in y? 1126 00:50:19,660 --> 00:50:21,077 >> Publiek: Je hebt niet [onverstaanbaar]. 1127 00:50:21,077 --> 00:50:22,910 DAVID J. MALAN: Ik heb niet iets in y. 1128 00:50:22,910 --> 00:50:25,520 Dus wat is de waarde van y, op dit punt in het verhaal? 1129 00:50:25,520 --> 00:50:26,570 We hebben geen idee. 1130 00:50:26,570 --> 00:50:29,190 Het is een aantal vuilnis waarde en evenmin Binky weet. 1131 00:50:29,190 --> 00:50:32,532 Als we zouden eindigen op deze nota. 1132 00:50:32,532 --> 00:50:34,832 >> [VIDEO AFSPELEN] 1133 00:50:34,832 --> 00:50:36,500 >> Hé, Binky, wakker worden. 1134 00:50:36,500 --> 00:50:39,140 Het is tijd voor pointer plezier. 1135 00:50:39,140 --> 00:50:40,210 >> -Wat is dat? 1136 00:50:40,210 --> 00:50:41,690 Leren over pointers? 1137 00:50:41,690 --> 00:50:43,570 Oh, goody. 1138 00:50:43,570 --> 00:50:46,600 >> Nou, om te beginnen, ik denk dat we ga een paar tips nodig. 1139 00:50:46,600 --> 00:50:47,380 >> -OK. 1140 00:50:47,380 --> 00:50:51,120 Deze code kent twee pointers die kan wijzen op gehele getallen. 1141 00:50:51,120 --> 00:50:53,557 >> -OK, Nou ik zie het twee pointers, maar 1142 00:50:53,557 --> 00:50:55,140 lijken niet te wijzen op iets. 1143 00:50:55,140 --> 00:50:55,970 >> -Dat klopt. 1144 00:50:55,970 --> 00:50:58,100 Aanvankelijk pointers wijzen niet op iets. 1145 00:50:58,100 --> 00:51:00,950 De dingen die ze wijzen op zijn riep pointees en de oprichting ervan 1146 00:51:00,950 --> 00:51:02,330 een afzonderlijke stap. 1147 00:51:02,330 --> 00:51:03,210 >> Oh, rechts, rechts. 1148 00:51:03,210 --> 00:51:03,940 Ik wist dat. 1149 00:51:03,940 --> 00:51:05,730 De pointees zijn gescheiden. 1150 00:51:05,730 --> 00:51:08,310 Dus hoe kan je een pointee toe te wijzen? 1151 00:51:08,310 --> 00:51:11,960 >> -OK, Ook deze code toewijst een nieuw integer pointee, 1152 00:51:11,960 --> 00:51:15,050 en deze deelverzamelingen x te verwijzen. 1153 00:51:15,050 --> 00:51:16,240 >> Hé, dat ziet er beter uit. 1154 00:51:16,240 --> 00:51:17,743 Dus zorg dat hij iets doen. 1155 00:51:17,743 --> 00:51:23,580 >> -OK, Zal ik dereferentie de pointer x aan opslaan van het nummer 42 in zijn pointee. 1156 00:51:23,580 --> 00:51:27,130 Voor deze truc, ik heb mijn toverstaf van dereferentie. 1157 00:51:27,130 --> 00:51:30,200 >> -Uw Toverstaf van dereferentie? 1158 00:51:30,200 --> 00:51:32,310 Uh, dat, dat is geweldig. 1159 00:51:32,310 --> 00:51:34,270 >> -Dit Is wat de code eruit ziet. 1160 00:51:34,270 --> 00:51:35,970 Ik zal gewoon het opzetten van de nummer en-- 1161 00:51:35,970 --> 00:51:37,070 >> [POP SOUND] 1162 00:51:37,070 --> 00:51:39,140 >> Hé, kijk daar gaat het. 1163 00:51:39,140 --> 00:51:43,980 Dus, het doen van een dereferentie op x volgt de pijl om toegang te krijgen tot de pointee. 1164 00:51:43,980 --> 00:51:46,150 In dat geval bewaart 42 in. 1165 00:51:46,150 --> 00:51:50,700 Hey, probeer het te gebruiken om het nummer op te slaan 13 door de andere wijzer, y. 1166 00:51:50,700 --> 00:51:51,840 >> -OK. 1167 00:51:51,840 --> 00:51:56,270 Ik zal gewoon over te gaan hier naar y, en ontvang de nummer 13 set-up. 1168 00:51:56,270 --> 00:52:00,380 En neem vervolgens de staf van dereferentie en gewoon-- 1169 00:52:00,380 --> 00:52:01,646 >> [Zoemer] 1170 00:52:01,646 --> 00:52:04,080 >> Oh, hey, dat werkte niet. 1171 00:52:04,080 --> 00:52:06,470 Zeggen, uh, Binky, dat doe ik niet denk dereferentie 1172 00:52:06,470 --> 00:52:10,850 y is een goed idee, want het instellen de pointee een afzonderlijke stap. 1173 00:52:10,850 --> 00:52:12,480 En ik denk niet dat we ooit deden. 1174 00:52:12,480 --> 00:52:14,620 >> Hmm, goed punt. 1175 00:52:14,620 --> 00:52:19,810 >> Ja, we toegewezen de wijzer, y, maar we nooit zet deze om te wijzen op een pointee. 1176 00:52:19,810 --> 00:52:21,590 >> Hmm, zeer oplettend. 1177 00:52:21,590 --> 00:52:23,215 Hé, je ziet er goed uit daar, Binky. 1178 00:52:23,215 --> 00:52:26,390 Kunt u het probleem te verhelpen, zodat y punten dezelfde pointee als x. 1179 00:52:26,390 --> 00:52:29,290 >> Tuurlijk, ik gebruik mijn toverstaf van pointer opdracht. 1180 00:52:29,290 --> 00:52:31,970 >> Is dat gaat om een ​​te zijn probleem, zoals vroeger? 1181 00:52:31,970 --> 00:52:33,790 >> Nee, dit is niet de pointees raken. 1182 00:52:33,790 --> 00:52:35,840 Het verandert slechts een pointer om naar dezelfde thing-- 1183 00:52:35,840 --> 00:52:36,465 >> [Knallend geluid] 1184 00:52:36,465 --> 00:52:37,450 --as andere. 1185 00:52:37,450 --> 00:52:38,440 >> -Oh, ik begrijp het. 1186 00:52:38,440 --> 00:52:41,200 Nu y punten op dezelfde plaats als x. 1187 00:52:41,200 --> 00:52:42,950 Dus, wacht, nu y wordt bevestigd. 1188 00:52:42,950 --> 00:52:44,110 Het heeft een pointee. 1189 00:52:44,110 --> 00:52:47,779 Zodat u kunt proberen de staf van weer dereferentie aan de 13 sturen over. 1190 00:52:47,779 --> 00:52:51,110 >> Oh, ok, hier gaat. 1191 00:52:51,110 --> 00:52:52,330 >> Hé, kijk naar die. 1192 00:52:52,330 --> 00:52:53,570 Nu dereferentie werkt op y. 1193 00:52:53,570 --> 00:52:57,900 En omdat de wijzers delen dat men pointee ze allebei zien de 13. 1194 00:52:57,900 --> 00:52:59,952 >> Ja, het delen, uh, wat dan ook. 1195 00:52:59,952 --> 00:53:01,535 Dus, gaan we nu plaatsen schakelen? 1196 00:53:01,535 --> 00:53:03,730 >> Oh, kijken we uit de tijd. 1197 00:53:03,730 --> 00:53:04,660 >> -But-- 1198 00:53:04,660 --> 00:53:06,520 >> -Just Herinner me de drie wijzer regels. 1199 00:53:06,520 --> 00:53:09,550 Nummer 1, de basisstructuur is dat u een pointer, 1200 00:53:09,550 --> 00:53:11,630 en wijst naar een pointee. 1201 00:53:11,630 --> 00:53:13,740 Maar de aanwijzer en pointee zijn gescheiden. 1202 00:53:13,740 --> 00:53:15,620 En de gemeenschappelijke fout is het opzetten van een pointer 1203 00:53:15,620 --> 00:53:18,000 maar vergeten om het een pointee. 1204 00:53:18,000 --> 00:53:21,170 >> Nummer 2, pointer dereferentie vanaf de aanwijzer 1205 00:53:21,170 --> 00:53:24,020 en volgt de pijl boven om toegang te krijgen zijn pointee. 1206 00:53:24,020 --> 00:53:27,815 Zoals we allemaal weten, dit werkt alleen als er is een pointee, wat voor soort komt terug 1207 00:53:27,815 --> 00:53:29,260 om nummer 1 te regeren. 1208 00:53:29,260 --> 00:53:31,990 >> Nummer 3, wijzer opdracht duurt een pointer 1209 00:53:31,990 --> 00:53:35,330 en wijzigingen zij wijzen op de Hetzelfde pointee als een andere pointer. 1210 00:53:35,330 --> 00:53:37,150 Dus na de opdracht, de twee pointers 1211 00:53:37,150 --> 00:53:40,927 zal wijzen naar dezelfde pointee, soms is dat heet delen. 1212 00:53:40,927 --> 00:53:42,510 En dat is alles wat er is om het, echt. 1213 00:53:42,510 --> 00:53:43,130 Bye-bye nu. 1214 00:53:43,130 --> 00:53:43,475 >> [END AFSPELEN] 1215 00:53:43,475 --> 00:53:44,830 >> DAVID J. MALAN: Dat is het voor CS50. 1216 00:53:44,830 --> 00:53:46,246 Dankzij Professor Nick Parlante. 1217 00:53:46,246 --> 00:53:47,730 We zien je volgende week. 1218 00:53:47,730 --> 00:53:51,706 1219 00:53:51,706 --> 00:53:56,435 >> [Elektronische muziek] 1220 00:53:56,435 --> 00:57:22,775