1 00:00:00,000 --> 00:00:02,310 [Powered by Google Translate] [Week 4, Vervolg] 2 00:00:02,310 --> 00:00:04,240 [David J. Malan - Harvard University] 3 00:00:04,240 --> 00:00:07,290 [Dit is CS50. - CS50.TV] 4 00:00:07,290 --> 00:00:11,290 >> Dit is CS50, en dit is het einde van week 4. 5 00:00:11,290 --> 00:00:14,030 Dus goed nieuws en slecht nieuws. 6 00:00:14,030 --> 00:00:26,240 Geen lezing op maandag, geen enkel probleem stellen volgende week. [Studenten juichen] 7 00:00:26,240 --> 00:00:28,680 Je gaat niet leuk vinden waar dit naartoe gaat. 8 00:00:28,680 --> 00:00:31,590 Maar we hebben dit in plaats volgende week woensdag, 9 00:00:31,590 --> 00:00:37,740 en er is ook conform de syllabus 1 Vrijdag lezing volgende week vrijdag, zodat we op schema blijven. 10 00:00:37,740 --> 00:00:40,580 Maar alles wordt gefilmd zoals gewoonlijk, dus geen zorgen te maken. 11 00:00:40,580 --> 00:00:44,100 >> En met betrekking tot 0 quiz wat we zullen doen in de richting van het einde week 12 00:00:44,100 --> 00:00:47,140 wordt bericht op de homepage van de cursus cs50.net een uitleg 13 00:00:47,140 --> 00:00:50,160 van wat voor soort verwachtingen die u moet hebben als het gaat om de eerste quiz. 14 00:00:50,160 --> 00:00:55,100 In het algemeen zal het multiple choice, waar-onwaar, kort antwoord, korte codering problemen. 15 00:00:55,100 --> 00:00:57,360 Je gaat niet te verwachten tot het equivalent te implementeren 16 00:00:57,360 --> 00:01:00,030 van een probleem dat je zou zien op een PSET, waarvoor u een computer hebt 17 00:01:00,030 --> 00:01:03,240 en een debugger en dergelijke, maar er zullen kleine codering problemen. 18 00:01:03,240 --> 00:01:06,900 >> En inderdaad, de beste gids om een ​​gevoel van wat CS50 quizzen te krijgen zijn als 19 00:01:06,900 --> 00:01:09,180 is naar cs50.net, ga naar de Quizzen link, 20 00:01:09,180 --> 00:01:11,920 en zie je de afgelopen jaren ter waarde van quizzen. 21 00:01:11,920 --> 00:01:16,600 Gewoon beseffen dat het curriculum niet altijd hetzelfde geweest door de jaren heen. 22 00:01:16,600 --> 00:01:18,510 Soms voegen we, soms aftrekken, 23 00:01:18,510 --> 00:01:20,670 dus als je ziet wat onderwerp op een van die oude quizzen 24 00:01:20,670 --> 00:01:25,380 dat je geen idee wat het is het over hebben, het is of dat we bedekken 25 00:01:25,380 --> 00:01:27,210 of dat we niet te bedekken. 26 00:01:27,210 --> 00:01:31,110 Maar in de vorm van reviews, deze zondag, maandag en dinsdag 27 00:01:31,110 --> 00:01:34,770 alsmede een cursus-brede beoordeling sessie op zondagavond - 28 00:01:34,770 --> 00:01:37,500 tijd en locatie worden aangekondigd op de homepage van de cursus - 29 00:01:37,500 --> 00:01:40,120 hebben jullie allemaal de kans om samen met het onderwijs de cursus de medemens 30 00:01:40,120 --> 00:01:44,830 Het materiaal voor deze jaren, zowel in doorsnede en een volledige klasse 31 00:01:44,830 --> 00:01:48,400 en die zal worden gefilmd zoals gewoonlijk ook. 32 00:01:48,400 --> 00:01:53,380 >> Oke. Dus zonder verder oponthoud, een commentaar op pass / fail en voeg / drop. 33 00:01:53,380 --> 00:01:57,980 Je hebt misschien gezien mijn aantekeningen gisteravond, en dit is eigenlijk gewoon wat extra geruststelling 34 00:01:57,980 --> 00:02:01,250 dat als je onder die in het bijzonder minder comfortabel of ergens daar tussenin 35 00:02:01,250 --> 00:02:04,870 en je voelt je net een beetje in over uw hoofd, 36 00:02:04,870 --> 00:02:08,430 beseffen dat inderdaad heel normaal, en er is een ruime ondersteunende structuur op zijn plaats, 37 00:02:08,430 --> 00:02:13,530 waarvan kantooruren van plan waren op het verbeteren van de meer per e-mail mijn laatste nacht, 38 00:02:13,530 --> 00:02:16,520 en te beseffen dat een optie als pass / fail voor een klasse als deze 39 00:02:16,520 --> 00:02:21,540 echt is bedoeld als een mechanisme om de rand opstijgen van een cursus als deze, 40 00:02:21,540 --> 00:02:24,200 zodat weer als je de uitgaven die 10, 15, 20 uur 41 00:02:24,200 --> 00:02:28,160 gewoon proberen om wat PSET de slag te gaan en je weet dat je er 90-95% van de wijze waarop 42 00:02:28,160 --> 00:02:32,100 maar u niet kunt vinden wat verdomd insect, in een pass / fail-model dat is een soort van goed. 43 00:02:32,100 --> 00:02:36,230 >> Het idee is dat met dit mechanisme kunt u vervolgens gericht gaan op uw andere psets 44 00:02:36,230 --> 00:02:39,530 of slapen of wat het ook is dat je wilt scherpstellen. 45 00:02:39,530 --> 00:02:43,390 Dus beseffen dat je hebt tot deze komende dinsdag - technisch de 5e maandag, 46 00:02:43,390 --> 00:02:50,840 maar het is een vakantie, dus deze komende dinsdag - om te schakelen van goed / fout aan graded of vice versa. 47 00:02:50,840 --> 00:02:54,450 En als je echt op de afgrond en denken uit te vallen in totaal, 48 00:02:54,450 --> 00:02:56,440 gelieve me vangen na lezing of me een briefje te laten vallen. 49 00:02:56,440 --> 00:02:59,990 We willen graag op zijn minst chatten voordat je een bod adieu. 50 00:02:59,990 --> 00:03:03,470 Oke. Dus we begonnen met de opleiding wielen van de vorige keer. 51 00:03:03,470 --> 00:03:06,030 In het bijzonder hebben we ons gericht op string. 52 00:03:06,030 --> 00:03:09,740 String is iets dat aangegeven in de CS50 bibliotheek, 53 00:03:09,740 --> 00:03:14,340 in het bijzonder in dat bestand met de naam cs50.h die we beginnen te kijken naar deze en volgende week. 54 00:03:14,340 --> 00:03:17,250 Maar string is eigenlijk gewoon een vereenvoudiging van iets 55 00:03:17,250 --> 00:03:20,980 dat is een beetje meer arcanely omschreven als char *. 56 00:03:20,980 --> 00:03:24,090 Char we kennen. Het is gewoon een teken. 57 00:03:24,090 --> 00:03:28,010 Maar * vanaf maandag aangeduid wat? >> [Student] Een aanwijzer. 58 00:03:28,010 --> 00:03:31,290 Een pointer. En wat is een pointer? >> [Student] Een adres. 59 00:03:31,290 --> 00:03:33,420 >> Het is als een adres, een plaats in het geheugen. 60 00:03:33,420 --> 00:03:35,910 Wat is een adres of locatie of geheugen? 61 00:03:35,910 --> 00:03:40,290 Nogmaals, we hebben allemaal laptops met een optreden of 2 gigabyte aan RAM-geheugen het meest waarschijnlijk deze dagen, 62 00:03:40,290 --> 00:03:44,160 en dat betekent dat je een miljard of 2 miljard bytes waarde van het geheugen. 63 00:03:44,160 --> 00:03:46,240 En het maakt niet echt uit wat het fysiek eruit ziet, 64 00:03:46,240 --> 00:03:51,220 maar iets te geloven dat u alle kunt het nummer van de individuele bytes dat uw eigen laptop - 65 00:03:51,220 --> 00:03:54,580 dit is byte 0, byte 1 is, dit byte 2 miljard - 66 00:03:54,580 --> 00:03:56,100 en dat is precies wat een computer doet. 67 00:03:56,100 --> 00:04:00,030 Wanneer u ruimte toewijzen voor een teken, bijvoorbeeld, 68 00:04:00,030 --> 00:04:02,480 Het moet natuurlijk ergens wonen in het geheugen van uw computer, 69 00:04:02,480 --> 00:04:05,860 en misschien is het bij byte nummer 12345, 70 00:04:05,860 --> 00:04:08,470 en dat is ergens hier in het geheugen van uw computer. 71 00:04:08,470 --> 00:04:12,630 En het adres dan van dat karakter is 12345. 72 00:04:12,630 --> 00:04:16,140 >> Nu, in week 0 tot en met nu tot nu toe, hebben we niet echt iets kon schelen 73 00:04:16,140 --> 00:04:19,170 waar in het geheugen dingen worden opgeslagen, omdat we meestal gebruik van symbolen, 74 00:04:19,170 --> 00:04:22,540 variabelen en arrays om daadwerkelijk te krijgen op onze gegevens. 75 00:04:22,540 --> 00:04:24,950 Maar vanaf maandag en des te meer nu, je bent nu gaat hebben 76 00:04:24,950 --> 00:04:27,710 des te meer expressieve mogelijkheden met het schrijven van programma's 77 00:04:27,710 --> 00:04:31,330 om echt te manipuleren van een computer geheugen maar je ziet passen, 78 00:04:31,330 --> 00:04:33,720 voor zowel de goede doelen en slecht, 79 00:04:33,720 --> 00:04:39,620 bugs zijn een veel voorkomende resultaat op dit punt in het leren van dit spul. 80 00:04:39,620 --> 00:04:42,460 Maar wat betekent het eigenlijk om een ​​char * zijn? 81 00:04:42,460 --> 00:04:46,140 Laten we terug gaan naar - en we komen terug naar Binky zoals beloofd vandaag. 82 00:04:46,140 --> 00:04:48,670 Laten we naar een eenvoudig voorbeeld hier. 83 00:04:48,670 --> 00:04:53,060 Laat me slaan dit bestand als compare.c, en laat mij slechts enkele template code hier te komen 84 00:04:53,060 --> 00:05:00,490 zo zijn stdio.h, laat me ook mezelf geven omvatten cs50.h. Ik zal inzoomen daar. 85 00:05:00,490 --> 00:05:05,850 Laat ik beginnen met het schrijven belangrijkste int, main (void), en nu wil ik iets als dit te doen: 86 00:05:05,850 --> 00:05:13,520 printf ("Geef me een string:") en dan zal ik gebruik maken van string s wordt getString 87 00:05:13,520 --> 00:05:16,750 om een ​​string te krijgen van de gebruiker, dan ga ik aan de gebruiker voor een ander te vragen. 88 00:05:16,750 --> 00:05:21,870 ("Geef me nog een string:") en ik ga om hen te vragen via getString om dat te krijgen. 89 00:05:21,870 --> 00:05:27,020 Ik bel het t omdat t komt na s en s is een mooie naam voor een string als het is vrij generiek. 90 00:05:27,020 --> 00:05:30,030 Dus GetString, en nu ik wil gewoon een sanity check te doen en ik ga zeggen 91 00:05:30,030 --> 00:05:39,770 if (s == t) dan ga ik gewoon naar de gebruiker printf vertellen ("U getypt hetzelfde \ n"); 92 00:05:39,770 --> 00:05:45,520 anders ga ik het afdrukken van iets als ("Je typte iets anders! \ n") 93 00:05:45,520 --> 00:05:48,460 of wat dan ook het vonnis zal zijn. Dus zoiets. 94 00:05:48,460 --> 00:05:52,200 Dan zoals gewoonlijk, zal ik terug 0 die net betekende dat er niets ergs is gebeurd, 95 00:05:52,200 --> 00:05:54,400 en ik ga om verder te gaan en en compileren uitvoeren van dit programma. 96 00:05:54,400 --> 00:05:56,540 >> Maar op maandag liepen we dit programma, 97 00:05:56,540 --> 00:06:00,420 en eigenlijk werd verteld dat HELLO HELLO niet is en afscheid is geen vaarwel. 98 00:06:00,420 --> 00:06:03,140 Het gedrag dat we zagen was een beetje meer als dit. 99 00:06:03,140 --> 00:06:11,450 Laat me gaan in mijn source directory, zoom in hier, en laten we het doen maken vergelijken. 100 00:06:11,450 --> 00:06:14,570 Goed samengesteld. Laat me lopen te vergelijken. Geef me een string: HELLO. 101 00:06:14,570 --> 00:06:16,300 Geef me nog een string: HELLO. 102 00:06:16,300 --> 00:06:18,000 U hebt getypt iets anders! 103 00:06:18,000 --> 00:06:22,650 Nou, laat me proberen iets eenvoudiger als 50, 50. U hebt getypt iets anders! 104 00:06:22,650 --> 00:06:25,740 hi, hi. Dus duidelijk, is iets aan de hand hier. 105 00:06:25,740 --> 00:06:28,440 Maar wat was de verklaring voor waarom? 106 00:06:28,440 --> 00:06:33,850 Blijkbaar, lijn 12 is volledig disfunctioneel. 107 00:06:34,300 --> 00:06:39,430 Wat is het fundamentele probleem hier? Ja. >> [Student] Het is het vergelijken van de adressen. 108 00:06:39,430 --> 00:06:41,850 Ja, precies. Het is eigenlijk een vergelijking van de adressen 109 00:06:41,850 --> 00:06:44,580 waarin HELLO HELLO en worden opgeslagen. 110 00:06:44,580 --> 00:06:48,290 Het is niet het vergelijken van de letters HELLO opnieuw en opnieuw, 111 00:06:48,290 --> 00:06:52,370 want wat er echt gebeurd is, al die tijd hebben we gebruik gemaakt van GetString - 112 00:06:52,370 --> 00:06:56,130 Dit bord is weer onze computer het geheugen, 113 00:06:56,130 --> 00:07:00,100 en laten we zeggen dat ik noem GetString na waarbij een variabele s. 114 00:07:00,100 --> 00:07:01,930 Hoe ziet mijn geheugen eruit? 115 00:07:01,930 --> 00:07:07,070 Laten we zeggen dat willekeurig is er zo uitziet. Het is een vierkant. 116 00:07:07,070 --> 00:07:09,040 En vrijwel elke keer dat ik getekend heb een stukje van het geheugen op het scherm 117 00:07:09,040 --> 00:07:12,860 als het 32 ​​bits Ik heb al getekend pleinen als deze, omdat inderdaad in het apparaat, 118 00:07:12,860 --> 00:07:17,380 een pointer, een adres, is 32 bits. Het is hetzelfde als een int. 119 00:07:17,380 --> 00:07:19,420 Dat kan variëren op basis computersysteem. 120 00:07:19,420 --> 00:07:24,630 Degenen onder jullie die vaag bekend met het feit dat je Mac of pc is 64 bits, 121 00:07:24,630 --> 00:07:28,120 dat geeft eigenlijk dat uw computer is 64-bits pointers gebruikt, 122 00:07:28,120 --> 00:07:33,730 64-bit adressen, en een van de positieve kanten van die uw computers 123 00:07:33,730 --> 00:07:35,560 kunnen veel meer RAM dan weleer. 124 00:07:35,560 --> 00:07:39,240 Lang verhaal kort, terug in de dag dat computers alleen gebruikt 32 bits 125 00:07:39,240 --> 00:07:42,740 naar adressen vertegenwoordigen, het grootste aantal bytes dat u zou kunnen vertegenwoordigen 126 00:07:42,740 --> 00:07:46,280 in dat geval was wat als je 32 bits hebben? 127 00:07:46,280 --> 00:07:49,590 Dus 4 miljard, gelijk, want 2 op de 32 is 4 miljard. 128 00:07:49,590 --> 00:07:51,370 Dit aantal is terugkerende in de cursus. 129 00:07:51,370 --> 00:07:55,240 >> Dus als je alleen maar 32 bits, het hoogste aantal dat u kunt rekenen op ongeveer 4 miljard. 130 00:07:55,240 --> 00:07:58,750 Maar dat was een fundamentele beperking van computers tot een paar jaar geleden 131 00:07:58,750 --> 00:08:01,180 want als je alleen zo hoog tellen als 4 miljard, 132 00:08:01,180 --> 00:08:05,270 Het maakt niet uit of je koopt 8 gigabyte aan RAM-geheugen of zelfs 5 gigabyte aan RAM-geheugen; 133 00:08:05,270 --> 00:08:07,780 kun je niet tellen zo hoog, dus het was nutteloos. 134 00:08:07,780 --> 00:08:11,430 Je kon alleen toegang tot de eerste 3 of 4 gigabyte geheugen van uw computer. 135 00:08:11,430 --> 00:08:14,410 Dat is minder een probleem nu, en je kunt kopen MacBook Pro's en Dells 136 00:08:14,410 --> 00:08:17,680 met 8 gigabyte aan RAM-geheugen of zelfs meer van deze dagen. 137 00:08:17,680 --> 00:08:24,100 Maar als ik toewijzen gewoon in dit programma een pointer, een pointer genaamd s, 138 00:08:24,100 --> 00:08:28,370 Het kan er zo uitzien op het scherm, omdat we inderdaad moeten schillen terug deze laag. 139 00:08:28,370 --> 00:08:33,520 Ik blijf zeggen string, maar vanaf maandag, string is echt char *, 140 00:08:33,520 --> 00:08:35,590 het adres van wat karakter. 141 00:08:35,590 --> 00:08:39,280 Dus laten we opstijgen dat de opleiding wiel, ook al zullen we blijven gebruiken GetString voor nu. 142 00:08:39,280 --> 00:08:42,600 Dus ik heb verklaard s, en dit is een stuk van het geheugen, 32 bits. 143 00:08:42,600 --> 00:08:47,370 Wat zit er in hier in het geheugen standaard? >> [Onverstaanbaar student reactie] 144 00:08:47,370 --> 00:08:50,040 Wat is dat? >> [Student] Garbage. >> Garbage. Precies. 145 00:08:50,040 --> 00:08:54,610 Als je de programmeur geen waarde in een variabele, die weet wat het is? 146 00:08:54,610 --> 00:08:57,990 Soms heb je geluk te krijgen en het is 0, wat is een soort van een mooie, schone standaardwaarde, 147 00:08:57,990 --> 00:09:00,310 maar zoals we zagen maandag, soms is het complete onzin, 148 00:09:00,310 --> 00:09:04,130 een aantal echt grote positieve of negatieve getal dat vandaan kwam, waar? 149 00:09:05,350 --> 00:09:07,010 Ja. >> [Student] De functie voor. >> Ja. 150 00:09:07,010 --> 00:09:10,170 >> Vaak is de functie die werd aangeroepen voordat want vergeet niet, 151 00:09:10,170 --> 00:09:13,920 als je functies in het geheugen bellen, ze nemen meer en meer ruimte van beneden naar boven, 152 00:09:13,920 --> 00:09:17,040 en zodra de functie terugkeert, wordt dat geheugen hergebruikt 153 00:09:17,040 --> 00:09:20,890 door de volgende kerel die wordt aangeroepen, wordt die met behulp van uw zelfde stukje van het geheugen. 154 00:09:20,890 --> 00:09:23,450 En als je hebt links vuilnis er, eerdere waarden, 155 00:09:23,450 --> 00:09:28,190 wij zou kunnen verwarren s als het hebben van een waarde wanneer we echt hebben er niet om het even wat. 156 00:09:28,190 --> 00:09:30,960 Dus onze RAM op dit punt ziet er zo uit. 157 00:09:30,960 --> 00:09:36,030 Nu op de rechterkant van de lijn 7 we bellen GetString, 158 00:09:36,030 --> 00:09:40,150 die we al nu aan het doen voor weken, maar wat wordt getString eigenlijk aan het doen? 159 00:09:40,150 --> 00:09:43,350 GetString geschreven door de CS50 personeel is een beetje intelligent 160 00:09:43,350 --> 00:09:46,500 in dat zodra de gebruiker begint typen sleutels en hits Enter 161 00:09:46,500 --> 00:09:50,010 GetString cijfers hoeveel toetsaanslagen heeft de gebruiker hit, 162 00:09:50,010 --> 00:09:53,360 hoeveel tekens heb ik nodig om RAM-geheugen toe te wijzen voor. 163 00:09:53,360 --> 00:09:55,660 En waar dat het RAM vandaan komt, wie weet? 164 00:09:55,660 --> 00:09:58,930 Het is ergens in 2 van uw computer gigabyte of wat van het geheugen. 165 00:09:58,930 --> 00:10:05,200 Maar laten we aannemen dat de computer ruimte voor het woord HELLO gevonden hier. 166 00:10:05,200 --> 00:10:08,710 Het woord dat ik getypt was H-E-L-L-O. 167 00:10:08,710 --> 00:10:13,510 En als we deze tekenen als een reeks tekens, kunnen we trekken het zo. 168 00:10:13,510 --> 00:10:17,860 Maar ik moet 1 extra ding te doen. Wat hoort bij het einde van een string in C? 169 00:10:17,860 --> 00:10:20,710 De nul-karakter, die we schrijven als \ 0. 170 00:10:20,710 --> 00:10:23,980 Het is technisch gezien het getal 0, maar de backslash maakt het duidelijker 171 00:10:23,980 --> 00:10:28,150 dat dit letterlijk het getal 0 het gehele getal 0; 172 00:10:28,150 --> 00:10:32,440 het is bijvoorbeeld niet, quote-unquote 0 die u zou kunnen typen op het toetsenbord. 173 00:10:32,440 --> 00:10:33,940 Dus dit is HELLO. 174 00:10:33,940 --> 00:10:36,350 >> En wat hebben we gezegd op maandag dat een functie als GetString 175 00:10:36,350 --> 00:10:39,580 eigenlijk terug al deze weken? 176 00:10:39,580 --> 00:10:43,960 Het is niet terug te keren een string per se omdat dat niet echt een betekenis hebben 177 00:10:43,960 --> 00:10:47,710 omdat strings bestaan ​​niet. Ze zijn een soort van een verzinsel van de CS50 bibliotheek. 178 00:10:47,710 --> 00:10:51,300 Wat is echt een string, meer technisch? >> [Student] Het is het eerste teken. 179 00:10:51,300 --> 00:10:55,950 Precies. Het is simpelweg het adres van het eerste teken dat de gebruiker intikt: 180 00:10:55,950 --> 00:11:02,810 Dus als mijn woord HELLO het eindigt bij byte nummer 123 en vervolgens bij byte nummer 124, 181 00:11:02,810 --> 00:11:08,320 125, 126, enzovoort, als ik gewoon mijn nummer bytes van 0 op maximaal, 182 00:11:08,320 --> 00:11:12,650 wat echt GetString terugkeert is letterlijk het getal 123. 183 00:11:12,650 --> 00:11:19,270 Dus wat wordt gezet in s is het nummer 123, niet de letter H, niet het woord HELLO, 184 00:11:19,270 --> 00:11:23,130 gewoon het adres waar ik kan vinden van de eerste letter van HELLO. 185 00:11:23,130 --> 00:11:26,500 Maar dat lijkt niet genoeg. Ik vroeg je om een ​​string, geen karakter. 186 00:11:26,500 --> 00:11:32,970 Dus hoe kunnen we of de computer weet dat ELLO soort mee te gaan met de H? 187 00:11:35,760 --> 00:11:37,460 Wat is het soort overeenkomst die we hebben? Ja. 188 00:11:37,460 --> 00:11:40,100 [Student] Het blijft vertellen zelf wat meer tekens te zoeken. >> Precies. 189 00:11:40,100 --> 00:11:44,570 >> Er is een mens-computer conventie waarbij wanneer u te maken met strijkers, 190 00:11:44,570 --> 00:11:49,410 ook wel bekend nu als char sterren, hoeft u alleen maar om erachter te komen 191 00:11:49,410 --> 00:11:54,350 waar het einde van elke snaar in het leven is door eigenlijk gewoon itereren over het met een for-lus, 192 00:11:54,350 --> 00:11:57,820 een lus while, wat dan ook, zodat wanneer je het einde van de string 193 00:11:57,820 --> 00:12:02,160 nu kun je afleiden van dat, oh, het hele woord was HELLO. 194 00:12:02,160 --> 00:12:04,820 Degenen onder jullie met voorafgaande ervaring met programmeren zou kunnen weten in Java 195 00:12:04,820 --> 00:12:09,880 u kunt gewoon bellen. lengte en in andere talen kunt u de lengte of soortgelijke bellen. 196 00:12:09,880 --> 00:12:14,060 Dat komt omdat in veel talen, in het bijzonder wat de naam objectgeoriënteerde talen, 197 00:12:14,060 --> 00:12:18,580 de lengte van iets is een soort van ingekapseld binnenkant van het stuk van de gegevens zelf, 198 00:12:18,580 --> 00:12:24,000 graag we ingekapseld ID's en namen en huizen binnen van een student op maandag. 199 00:12:24,000 --> 00:12:28,700 Maar C is veel lager niveau. Er zijn geen objecten of klassen, als je hebt gehoord die termen voor. 200 00:12:28,700 --> 00:12:31,490 Alles wat je hebt is echt geheugenadressen. 201 00:12:31,490 --> 00:12:35,540 Dus dit is een soort van de ouderwetse manier te vertegenwoordigen interessante datastructuren. 202 00:12:35,540 --> 00:12:38,760 Je hebt een startwaarde, zoals het adres van het eerste teken 203 00:12:38,760 --> 00:12:42,340 en dan gewoon een aantal willekeurige conventie dat iedereen het eens volgen. 204 00:12:42,340 --> 00:12:46,420 Dus hoe is lengte van het touw uitgevoerd, hebben wij voor? 205 00:12:46,420 --> 00:12:51,360 Strlen, strlen, die nu een aantal van jullie hebben een paar keer gebruikt. Het is vrij simpel, toch? 206 00:12:51,360 --> 00:12:53,060 Het is net als 2 regels code. 207 00:12:53,060 --> 00:12:56,140 Het is vrij veel een for-lus van een soort, misschien met een extra lokale variabele. 208 00:12:56,140 --> 00:13:00,540 Maar strlen moet gewoon een pointer dan te nemen en op zoek naar \ 0 beginnen. 209 00:13:00,540 --> 00:13:05,190 >> En zodra hij vaststelt, kan het terug het totaal aantal stappen dat is genomen in de snaar. 210 00:13:05,190 --> 00:13:07,150 Dus we kunnen afleiden uit dit wat er op de volgende. 211 00:13:07,150 --> 00:13:11,850 Stel dan verklaar ik t zoals ik heb gedaan in de lijn 10. 212 00:13:11,850 --> 00:13:14,280 Dit is een vuilnis waarde. Wie weet in het begin? 213 00:13:14,280 --> 00:13:18,490 Maar aan de rechterkant van de lijn van 10 Ik bel getString weer. 214 00:13:18,490 --> 00:13:20,050 Wie weet waar dit eindigt? 215 00:13:20,050 --> 00:13:23,830 Laten we willekeurig zeggen dat het besturingssysteem ruimte voor het weg hier gevonden. 216 00:13:23,830 --> 00:13:28,610 Ik ben toevallig toevallig typen H-E-L-L-O weer, 217 00:13:28,610 --> 00:13:31,260 en dus kunnen we trekken het zelfde soort beeld. 218 00:13:31,260 --> 00:13:34,290 Maar het feit dat ik opnieuw getekend deze foto heb is een bewuste 219 00:13:34,290 --> 00:13:37,720 want dat is een ander HELLO dan deze. 220 00:13:37,720 --> 00:13:43,920 Hier kan de locatie 456, is 457, enzovoort. 221 00:13:43,920 --> 00:13:47,170 Dus wat wordt gezet waar het vraagteken ooit was? 222 00:13:47,170 --> 00:13:50,190 In dit geval 456. 223 00:13:50,190 --> 00:13:53,540 We plukken van deze nummers willekeurig, want echt na vandaag 224 00:13:53,540 --> 00:13:57,110 we gaan niet zo veel schelen wat het adres van alles is. 225 00:13:57,110 --> 00:14:02,690 Alles wat we zorg over is dat we kunnen achterhalen van het adres van een stukje van gegevens zoals HELLO. 226 00:14:02,690 --> 00:14:07,100 >> Dus echt wat de meeste mensen doen in de informatica als het over geheugenadressen 227 00:14:07,100 --> 00:14:10,210 en praten over pointers specifiek, 228 00:14:10,210 --> 00:14:14,220 in plaats van de moeite uitzoeken 123 - who cares waar dit spul eigenlijk is, 229 00:14:14,220 --> 00:14:17,440 we weten dat het op een bepaald numeriek adres - 230 00:14:17,440 --> 00:14:22,180 vereenvoudigen we de wereld en gewoon zeggen dat s wijst naar dat personage 231 00:14:22,180 --> 00:14:25,080 en t wijst naar dat personage. 232 00:14:25,080 --> 00:14:27,430 En het feit dat het een pijl is heel bewust 233 00:14:27,430 --> 00:14:31,610 omdat nu letterlijk s wijst naar H t en wijst naar de andere H 234 00:14:31,610 --> 00:14:34,720 omdat aan het einde van de dag, maakt het niet uit welke het adres, 235 00:14:34,720 --> 00:14:40,240 maar het maakt wel uit dat we de mogelijkheid om dat adres te drukken met een stuk code te hebben. 236 00:14:40,240 --> 00:14:42,730 We hebben niet echt gemanipuleerd deze adressen gewoon nog niet 237 00:14:42,730 --> 00:14:47,770 dus we zullen zien waar we kunnen tussenbeide komen en sorteren van dingen doen met pointers, 238 00:14:47,770 --> 00:14:52,030 maar voor nu in lijn 12 letterlijk welke waarden we vergelijken 239 00:14:52,030 --> 00:14:55,500 Volgens dit verhaal in de lijn 12? 240 00:14:56,570 --> 00:15:01,290 We zeggen is 123 gelijk gelijk aan 456? En dat is zeker niet het geval. 241 00:15:01,290 --> 00:15:05,320 En zelfs conceptueel, deze pointer is zeker niet hetzelfde als dit 242 00:15:05,320 --> 00:15:09,500 omdat je belde getString twee keer, en GetString niet proberen te zijn super slim, 243 00:15:09,500 --> 00:15:12,470 het niet proberen te realiseren, o, u HELLO getypt 5 minuten geleden; 244 00:15:12,470 --> 00:15:15,090 laat me je dezelfde pointer als ik je gaf voor, 245 00:15:15,090 --> 00:15:18,450 het kent gewoon een nieuwe brok van het geheugen elke keer dat u het noemen. 246 00:15:18,450 --> 00:15:20,350 >> Dus hoe kunnen we dit probleem oplossen? 247 00:15:20,350 --> 00:15:24,270 Als hoger niveau wil ik de snaren HELLO HELLO en vergelijken - 248 00:15:24,270 --> 00:15:28,680 Kan me niet schelen over de pointers - hoe ga ik over het beantwoorden van de vraag, 249 00:15:28,680 --> 00:15:31,980 heeft de gebruiker typt u het zelfde ding? Wat is nodig hier? Ja. 250 00:15:31,980 --> 00:15:35,200 [Student] Gebruik een functie. >> Ik kan een functie uit de doos. 251 00:15:35,200 --> 00:15:38,170 Ik kan een functie genaamd strcmp, s-t-r-c-m-p, 252 00:15:38,170 --> 00:15:41,190 alleen de verkorte versie van te zeggen snaar te vergelijken. 253 00:15:41,190 --> 00:15:45,070 En als we naar bijvoorbeeld Vergelijk 2, die tot handouts vandaag 254 00:15:45,070 --> 00:15:46,690 Ik doe precies dat. 255 00:15:46,690 --> 00:15:51,750 Ik bleef alles hetzelfde van lijn 1 naar beneden tot 26 of zo, 256 00:15:51,750 --> 00:15:54,360 en nu merk dit deel is net een klein beetje veranderd. 257 00:15:54,360 --> 00:15:57,690 Laten we negeren lijn 28 voor een moment en alleen richten op dit ene. 258 00:15:57,690 --> 00:16:00,410 Wat hebben we zeggen maandag dat str compare doet? 259 00:16:00,410 --> 00:16:05,200 Het behandelt het proces waarbij 2 pointers, s en t in dit geval 260 00:16:05,200 --> 00:16:08,480 soort van vrijwel zetten de vinger op die 2 letters, 261 00:16:08,480 --> 00:16:11,530 en wat het moet doen, is zoiets als een while-lus of een for-lus, 262 00:16:11,530 --> 00:16:16,050 en het zegt zijn deze hetzelfde? Als dat zo is, beweegt de vingers of de wijzers vooruit. 263 00:16:16,050 --> 00:16:17,970 Zijn deze hetzelfde, deze hetzelfde, deze dezelfde, 264 00:16:17,970 --> 00:16:22,710 deze dezelfde, deze hetzelfde? En ooh, ik ben aan het eind van de string op zowel s en t. 265 00:16:22,710 --> 00:16:26,780 Ik heb niet gevonden geen tegenstrijdigheden. Ja, deze snaren zijn hetzelfde. 266 00:16:26,780 --> 00:16:31,940 En wat betekent str vergelijken terugkeer als 2 strings hetzelfde zijn, blijkbaar? Zero. 267 00:16:31,940 --> 00:16:35,900 Dus 0 is goed in dit geval, want als het weer -1 of +1, 268 00:16:35,900 --> 00:16:40,560 dat betekent dat het gewoon toevallig komen voordat t alfabetisch of na t. 269 00:16:40,560 --> 00:16:43,760 En waarom zou dat nuttig zijn om een ​​functie die u vertelt welke snaar komt eerder hebben 270 00:16:43,760 --> 00:16:46,720 of na in een woordenboek? 271 00:16:46,720 --> 00:16:48,740 [Student] met zoeken. >> Zoeken en sorteren. 272 00:16:48,740 --> 00:16:51,730 >> Dus je kan dingen doen zoals binary search of bubble sort of samenvoegen sorteren 273 00:16:51,730 --> 00:16:53,230 waar je moet dingen vergelijken. 274 00:16:53,230 --> 00:16:56,420 Tot nu toe hebben we soort van snijden sommige bochten en alleen gesproken over het sorteren 275 00:16:56,420 --> 00:16:59,430 in het kader van de nummers, want het is leuk en makkelijk om te praten over, 276 00:16:59,430 --> 00:17:02,430 maar je kan zeker vergelijken strings, appel en banaan, 277 00:17:02,430 --> 00:17:05,349 want als appel bekend is komen voor bananen evenzo 278 00:17:05,349 --> 00:17:09,319 kunt u naar strings rond in het geheugen, net als Rob deed met merge sort in de video 279 00:17:09,319 --> 00:17:15,880 en we hebben hier op het podium met selectie sorteren, insertion sort, en bubble sort. 280 00:17:15,880 --> 00:17:18,710 Dus waar anders kunnen we dit? Laten we proberen dit. 281 00:17:18,710 --> 00:17:23,980 Laten we soort van vergeten dat les voor een ogenblik en probeer nu en kopieer 1.c het volgende doen. 282 00:17:23,980 --> 00:17:26,800 In lijn 21 Ik zeg print iets, 283 00:17:26,800 --> 00:17:28,520 dan ben ik het krijgen van een string van de gebruiker, 284 00:17:28,520 --> 00:17:30,690 dan ben ik het controleren van deze. 285 00:17:30,690 --> 00:17:33,620 We hebben niet echt gekregen in deze gewoonte nog niet, maar laten we nu dit te doen. 286 00:17:33,620 --> 00:17:40,990 Eigenlijk Laten schil terug deze laag. Dit is echt char *. Deze man is echt char *. 287 00:17:40,990 --> 00:17:45,690 Dus wat betekent het om te controleren of s == NULL? 288 00:17:45,690 --> 00:17:48,380 Het blijkt dat wanneer u belt een functie als GetString 289 00:17:48,380 --> 00:17:51,540 of meer in het algemeen gewoon vragen een computer om u wat geheugen, 290 00:17:51,540 --> 00:17:53,030 iets mis kan gaan. 291 00:17:53,030 --> 00:17:56,630 Je zou wel gek zijn en vraag de computer voor een terabyte aan geheugen 292 00:17:56,630 --> 00:18:01,780 door te vragen voor miljarden bytes van het geheugen dat gewoon niet bestaan ​​in de computer, 293 00:18:01,780 --> 00:18:05,130 maar GetString en andere functies nodig hebben of andere manier van schreeuwen tegen je 294 00:18:05,130 --> 00:18:06,820 als je gevraagd hebt te veel. 295 00:18:06,820 --> 00:18:10,450 En de manier waarop GetString dit doet is als u hebben gevraagd om meer geheugen 296 00:18:10,450 --> 00:18:14,250 dan er beschikbaar is in de computer, zelfs als dat is super, super lage waarschijnlijkheid 297 00:18:14,250 --> 00:18:17,730 omdat niemand van ons gaan een biljoen tekens te typen en vervolgens op Enter te raken, 298 00:18:17,730 --> 00:18:21,980 maar kleine kans maar het kan zijn, ik wil nog steeds om te controleren of het in het geval, 299 00:18:21,980 --> 00:18:26,120 en de speciale waarde die GetString, antwoord, en andere functies terug 300 00:18:26,120 --> 00:18:30,630 als er iets mis is gegaan is NULL in hoofdletters. 301 00:18:30,630 --> 00:18:36,520 >> En wat is NULL? NULL gewoon zo gebeurt te vertegenwoordigen een pointer. Het is het geheugen adres 0. 302 00:18:36,520 --> 00:18:40,800 De wereld besloten dat willekeurig, als dit mijn computer het geheugen - weet je wat? - 303 00:18:40,800 --> 00:18:46,260 we gaan slechts 1 byte van het geheugen elke computer te stelen, en dit is meetpunt 0. 304 00:18:46,260 --> 00:18:49,560 We gaan om het een bijnaam van NULL, en we gaan beloven 305 00:18:49,560 --> 00:18:52,660 dat zullen we nooit echt daar te zetten echte gegevens 306 00:18:52,660 --> 00:18:56,770 omdat we gewoon willekeurig behoefte aan een speciale waarde, 0, aka NULL, 307 00:18:56,770 --> 00:19:00,230 zodat wij schreeuwen tegen gebruikers als er iets misgaat. 308 00:19:00,230 --> 00:19:03,590 Anders zou je misschien niet weet is 0 betekent hier zet iets 309 00:19:03,590 --> 00:19:05,490 of betekent het iets mis gegaan? 310 00:19:05,490 --> 00:19:09,190 We moeten allemaal over eens dat NULL betekent niets was teruggekeerd, 311 00:19:09,190 --> 00:19:11,700 geen werkelijke adres was teruggekeerd. 312 00:19:11,700 --> 00:19:15,210 Nu, hier ben ik gewoon de aanneming van mijn menselijke conventie van I return 1 van de belangrijkste 313 00:19:15,210 --> 00:19:17,040 als er iets misgaat. 314 00:19:17,040 --> 00:19:20,650 Dat komt omdat de belangrijkste terugkeer van conventie is om terug te keren 0 als goed, 315 00:19:20,650 --> 00:19:22,990 1 of een andere waarde als de slechte. 316 00:19:22,990 --> 00:19:28,200 Maar GetString en elke functie die zich bezighoudt in het geheugen terug NULL als er iets ergs gaat. 317 00:19:28,200 --> 00:19:33,480 >> Oke. Dus helaas, lijn 27, super simpel het ook is, niet volledig te kopiëren de string. 318 00:19:33,480 --> 00:19:35,740 Waarom? We zien dit als volgt. 319 00:19:35,740 --> 00:19:40,120 Ik ben beweren in de lijn 27 tot en met het maken van een kopie van s en noemde het t. 320 00:19:40,120 --> 00:19:45,790 Dus ik ben niet de gebruiker vragen om 2 strings dit keer, ik zeg alleen dat de waarde in s 321 00:19:45,790 --> 00:19:47,870 moeten worden gebracht in t ook. 322 00:19:47,870 --> 00:19:52,890 Dus nu gewoon om te laten zien hoe gebroken is, in lijn 29 verder wat doe ik? 323 00:19:52,890 --> 00:19:56,980 Eerst Ik controleer of de lengte van t groter is dan 0. 324 00:19:56,980 --> 00:19:59,330 Er is een stukje tekst daar. De gebruiker heeft ingevoerd iets binnen 325 00:19:59,330 --> 00:20:03,410 Wat is lijn 32 doet, blijkbaar? 326 00:20:03,410 --> 00:20:08,910 [Onverstaanbaar student reactie] >> Klopt. U kunt soort afleiden uit wat ik zei dat het aan het doen is. 327 00:20:08,910 --> 00:20:13,200 Maar technisch gezien, is wat dit doet? t [0] staat voor wat? 328 00:20:13,200 --> 00:20:15,140 [Student] De nulde karakter. >> [Malan] De nulde karakter. 329 00:20:15,140 --> 00:20:19,620 Of, meer mensachtige, het eerste teken in t, wat dat ook is, H misschien in dit geval. 330 00:20:19,620 --> 00:20:24,990 En toupper doet wat het zegt. Het speelt in de nulde karakter van t en het verandert het. 331 00:20:24,990 --> 00:20:28,430 Dus dit betekent dat neemt de nulde karakter van t, maken het hoofdletters, 332 00:20:28,430 --> 00:20:30,320 en plaats deze weer in dezelfde locatie. 333 00:20:30,320 --> 00:20:35,540 Dus als ik typ hallo in kleine letters, dit moet de kleine letters h veranderen in een hoofdletter H. 334 00:20:35,540 --> 00:20:41,400 Maar het probleem is dat in de regels 35 en 36 wat ik ga doen is uit te printen voor ons s en t. 335 00:20:41,400 --> 00:20:43,120 En wat is jouw gevoel? 336 00:20:43,120 --> 00:20:47,250 Wat moet ik eigenlijk aan de hand om te zien of ik getypt in hallo in alle kleine letters? 337 00:20:47,250 --> 00:20:52,280 Wat gaat er om te drukken? >> [Onverstaanbaar student reactie] >> Wat is dat? 338 00:20:52,280 --> 00:20:58,360 [Student] Big H en de rest klein. >> De grote H en de rest klein voor die, s of t? 339 00:20:58,360 --> 00:21:03,170 [Student] Beide. >> Beide. Precies. Dus laten we eens kijken wat er aan de hand is. 340 00:21:03,170 --> 00:21:08,380 >> Laat me gaan, en slaat deze. Dit is kopie1, dus zorg kopie1. Oke. 341 00:21:08,380 --> 00:21:14,840 Zoomen Laat me ga je gang en lopen kopie1, Enter, Zeg iets: hello in kleine letters. 342 00:21:14,840 --> 00:21:19,570 Het geactiveerde de kopie, maar blijkbaar geactiveerd de oorspronkelijke als goed, 343 00:21:19,570 --> 00:21:22,070 want wat er nu gebeurt in dit verhaal? 344 00:21:22,070 --> 00:21:27,030 In lijn 27 Ik niet echt lijken te kopiëren van de string, 345 00:21:27,030 --> 00:21:30,450 maar zelfs al zou je intuïtief gehoopt dat het geval te zijn, 346 00:21:30,450 --> 00:21:33,680 Als u denkt over dit beeld, wat echt heb ik gedaan? 347 00:21:33,680 --> 00:21:35,410 Helft van het beeld hetzelfde. 348 00:21:35,410 --> 00:21:39,390 Dus laten we roll terug in de tijd, zodat t nog niet bestaat in het verhaal. 349 00:21:39,390 --> 00:21:43,160 S kan bestaan ​​in het verhaal, maar laten we kleine letters hallo deze tijd. 350 00:21:43,160 --> 00:21:46,710 Dus laat me vast wat ik eigenlijk getypt inch 351 00:21:46,710 --> 00:21:51,280 In dit geval hebben we hier h-e-l-l-o. 352 00:21:51,280 --> 00:21:58,050 We zullen het te tekenen als een reeks tekens, hier zet mijn scheidingslijnen en mijn \ 0. 353 00:21:58,050 --> 00:22:05,980 Dus dit is waar we zijn, zodra lijn 1 tot en met 24-ish, geven of te nemen, hebben uitgevoerd. 354 00:22:05,980 --> 00:22:07,800 Dit is het beeld van mijn geheugen. 355 00:22:07,800 --> 00:22:10,800 Als ik bij lijn 27, wat gebeurt er? 356 00:22:10,800 --> 00:22:14,730 Net als vroeger, krijg ik een pointer, die ik zal trekken dit plein. 357 00:22:14,730 --> 00:22:19,740 Het heet t. En wat is de waarde standaard? Wie weet? Sommige vuilnis waarde. 358 00:22:19,740 --> 00:22:22,060 >> Dus ik zal abstract dat weg als een vraagteken. 359 00:22:22,060 --> 00:22:27,670 En zodra de rechterzijde van lijn 27 wordt uitgevoerd, ben ik zet binnenkant van t? 360 00:22:27,670 --> 00:22:30,770 Hetzelfde wat in s. 361 00:22:30,770 --> 00:22:34,120 Dus als we een ogenblik te verwijderen deze abstractie van de pijl en wij zeggen, 362 00:22:34,120 --> 00:22:40,330 oh, dit is het geheugen belasting-adres 123, als je zegt t krijgt s, puntkomma, 363 00:22:40,330 --> 00:22:42,700 je letterlijk zetten 123 hier. 364 00:22:42,700 --> 00:22:45,200 Als we nu soort weer te vereenvoudigen onze wereld met foto's, 365 00:22:45,200 --> 00:22:48,750 wat je hebt echt gedaan is gewoon voegde een andere pijl op uw wereld 366 00:22:48,750 --> 00:22:52,910 dat is gericht van t tot exact dezelfde string. 367 00:22:52,910 --> 00:22:59,730 Dus toen in de lijn 31 en 32 ik eigenlijk gaan over het veranderen van t [0], 368 00:22:59,730 --> 00:23:05,580 wat is t [0] blijkbaar synoniem met nu? s [0] 369 00:23:05,580 --> 00:23:07,030 Dus dat is alles wat er gebeurt. 370 00:23:07,030 --> 00:23:09,900 En hoewel dit soort voelt een beetje laag niveau en geheimzinnige 371 00:23:09,900 --> 00:23:12,760 en dit soort voelt misschien intuïtief moet dit gewoon hebben gewerkt - 372 00:23:12,760 --> 00:23:15,410 Ik heb kopieën van de dingen voor en het is gewoon werkte - 373 00:23:15,410 --> 00:23:18,590 als je echt nadenken over wat een string is echt, het is een char *. 374 00:23:18,590 --> 00:23:21,700 Nou, wat is dat? Het is het adres van een aantal karakter. 375 00:23:21,700 --> 00:23:24,930 Dan misschien is het zinvoller dat wanneer je probeert om iets te doen 376 00:23:24,930 --> 00:23:29,220 super schijnbaar eenvoudige als dit, alles wat je doet is het kopiëren van een geheugenadres. 377 00:23:29,220 --> 00:23:32,530 U bent niet echt iets te doen met de string zelf. 378 00:23:32,530 --> 00:23:37,500 Dus zelfs als je geen idee hebt hoe je een oplossing voor dit probleem in de code, 379 00:23:37,500 --> 00:23:45,080 hoog niveau, conceptueel, wat we moeten doen om ervoor te zorgen ta gewaarmerkt afschrift van s, blijkbaar? 380 00:23:46,670 --> 00:23:48,820 Ja. >> [Student] Geef het een nieuwe locatie? >> Precies. 381 00:23:48,820 --> 00:23:50,800 >> Wij moeten t een gloednieuwe locatie. 382 00:23:50,800 --> 00:23:55,230 We moeten een of andere manier een wereld creëren waarin we een nieuwe brok van het geheugen, 383 00:23:55,230 --> 00:24:00,090 die alleen voor de duidelijkheid zal ik trek net onder deze, maar het is niet nodig om daar te zijn. 384 00:24:00,090 --> 00:24:04,880 Maar het moet even groot zijn, dus ik zal trekken deze verticale lijnen op dezelfde plaats. 385 00:24:04,880 --> 00:24:09,720 Het is prima als dit allemaal afval in eerste instantie. Wie weet wat er was? 386 00:24:09,720 --> 00:24:13,850 Maar stap 1 zal me moeten worden geven zoveel geheugen als ik nodig heb 387 00:24:13,850 --> 00:24:18,630 om een ​​kopie van hallo passen, dan erachter te komen hoe je de h hier te kopiëren, de e hier, 388 00:24:18,630 --> 00:24:20,390 de hier l enzovoort. 389 00:24:20,390 --> 00:24:24,880 Maar dit al moet je een beetje voor de hand liggend, zelfs als sommige van de details zijn nog abstract. 390 00:24:24,880 --> 00:24:28,690 Om deze string te kopiëren naar deze, het is gewoon een for-lus of een while-lus 391 00:24:28,690 --> 00:24:31,580 of iets waar je hebt des te meer vertrouwd. 392 00:24:31,580 --> 00:24:35,970 Dus laten we dit proberen. Laat me gaan in copy2.c. 393 00:24:35,970 --> 00:24:43,270 In copy2.c hebben we bijna hetzelfde programma met uitzondering van lijn 27. 394 00:24:43,270 --> 00:24:47,260 Het ziet er een beetje ingewikkeld, maar als we af te breken stuk voor stuk, 395 00:24:47,260 --> 00:24:48,950 de linkerkant is hetzelfde. 396 00:24:48,950 --> 00:24:52,790 Char * t schept dit ding in het geheugen, zij het met een vraagteken 397 00:24:52,790 --> 00:24:54,680 want we hebben geen idee wat er standaard. 398 00:24:54,680 --> 00:24:57,920 Aan de rechterkant hebben we nu de invoering van een nieuwe functie, malloc, 399 00:24:57,920 --> 00:25:00,640 voor geheugen toe te wijzen, geef mij het geheugen, 400 00:25:00,640 --> 00:25:06,900 en het duurt blijkbaar hoeveel argumenten, hoeveel dingen tussen haakjes? 401 00:25:09,660 --> 00:25:12,130 Ik hoorde murmureringen van 1 en 2, maar het is gewoon 1. 402 00:25:12,130 --> 00:25:15,320 Er is geen komma, wat betekent dat er slechts 1 ding tussen de haakjes. 403 00:25:15,320 --> 00:25:17,720 Ook al is er andere haakjes, laat me benadrukken 404 00:25:17,720 --> 00:25:21,460 wat er in de buitenste haakjes, en het is deze uitdrukking: 405 00:25:21,460 --> 00:25:25,880 (Strlen (s) + 1) * sizeof (char). 406 00:25:25,880 --> 00:25:29,190 Dus als we echt denken dat dit door middel van, is dit woord geef me de lengte van s. 407 00:25:29,190 --> 00:25:34,440 Waarom ben ik, hoewel, het toevoegen van 1 op de lengte? >> [Onverstaanbaar student reactie] 408 00:25:34,440 --> 00:25:40,200 Precies. We hebben ruimte nodig voor deze man bij de staart, het zesde teken dat er geen Engels betekenis heeft 409 00:25:40,200 --> 00:25:42,250 maar heeft wel speciale programmatische betekenis. 410 00:25:42,250 --> 00:25:46,800 >> Dus we moeten een + 1 voor dat, omdat strlen rendement van de menselijke verwachting van lengte, 411 00:25:46,800 --> 00:25:50,890 hallo of 5, is het niet geven u de extra nul karakter. 412 00:25:50,890 --> 00:25:52,980 Dus ik handmatig toe te voegen dit met + 1. 413 00:25:52,980 --> 00:25:56,060 En dan dit, * grootte van de (char), hebben we dit niet eerder gezien. 414 00:25:56,060 --> 00:25:57,480 Dit technisch functie. 415 00:25:57,480 --> 00:26:04,150 Het is een bijzonder sleutelwoord dat precies vertelt u wat de grootte is van een aantal data type op een computer 416 00:26:04,150 --> 00:26:06,980 want in werkelijkheid, sommige van ons hebben 32-bits computers. 417 00:26:06,980 --> 00:26:10,900 Ik heb een mooie oude computer thuis, en het alleen gebruik maakt van 32-bits te vertegenwoordigen pointers. 418 00:26:10,900 --> 00:26:13,900 En dus als ik dat deed grootte van een data type, is het misschien 32 bits. 419 00:26:13,900 --> 00:26:18,300 Maar als ik met behulp van mijn nieuwe, fraaie computer, zou ik terug te krijgen een waarde van 64 bits 420 00:26:18,300 --> 00:26:20,510 voor iets als een adres. 421 00:26:20,510 --> 00:26:25,400 Dus in dit geval gewoon tot super veilig, we gaan niet naar de harde code iets als - 422 00:26:25,400 --> 00:26:28,740 goed, wat is de grootte van een char op basis van wat we tot nu toe gezegd? 423 00:26:28,740 --> 00:26:34,450 We hebben vrij veel gezegd verbaal dat het 1 byte, en dat is vrij veel waar over de gehele linie. 424 00:26:34,450 --> 00:26:37,000 Maar nogmaals, veronderstellingen hebben de neiging om slecht te zijn. 425 00:26:37,000 --> 00:26:40,850 Ze leiden tot buggy software als iemand op uw software te gebruiken op manieren die je niet van plan was. 426 00:26:40,850 --> 00:26:44,750 Dus laten we abstracte dit weg en gewoon meer in het algemeen zeggen 427 00:26:44,750 --> 00:26:46,830 Ik heb dit vele delen van het geheugen 428 00:26:46,830 --> 00:26:50,210 en elk blok geheugen moet overeenkomen met de grootte van een karakter, 429 00:26:50,210 --> 00:26:54,870 die in feite gelijk aan 1 in dit geval, maar het is een generieke manier van schrijven. 430 00:26:54,870 --> 00:27:00,460 Dus als het woord hallo, hoeveel bytes malloc blijkbaar toe te wijzen voor hello? 431 00:27:00,460 --> 00:27:04,980 [Student] Zes. >> Zes. Precies zo veel als we vraagtekens op het scherm te hebben. 432 00:27:04,980 --> 00:27:07,800 En neem dan een gok nu op basis van uw kennis van GetString 433 00:27:07,800 --> 00:27:12,790 wat doet malloc waarschijnlijk terug? >> [Student] Een adres. 434 00:27:12,790 --> 00:27:17,020 Een adres van wat? Van de eerste deel van het geheugen. 435 00:27:17,020 --> 00:27:20,670 >> We hebben geen idee wat er is, omdat een andere functie 436 00:27:20,670 --> 00:27:23,010 kon worden gebruikt dit geheugen eerder. 437 00:27:23,010 --> 00:27:28,380 Maar malloc zoals GetString, geeft het adres van de eerste byte van het geheugen 438 00:27:28,380 --> 00:27:30,540 dat het gereserveerd voor u. 439 00:27:30,540 --> 00:27:38,380 Het is echter wat het niet doet in te vullen dit leeg met een backslash null karakter 440 00:27:38,380 --> 00:27:43,030 want het blijkt dat je kunt gebruiken malloc om iets toe te wijzen: ints, strings, arrays, 441 00:27:43,030 --> 00:27:45,700 drijvers, student structuren. 442 00:27:45,700 --> 00:27:47,750 U kunt gebruik maken van malloc volledig generiek. 443 00:27:47,750 --> 00:27:51,470 Het maakt niet uit of moet weten wat je geheugen toewijzen voor. 444 00:27:51,470 --> 00:27:55,810 Dus het zou voorbarig zijn om malloc om een ​​\ 0 zetten 445 00:27:55,810 --> 00:27:58,340 aan het einde van elk deel van het geheugen het geeft u 446 00:27:58,340 --> 00:28:02,620 omdat dit \ 0 ding is gewoon een conventie voor strijkers. 447 00:28:02,620 --> 00:28:06,310 Het is niet gebruikt voor ints, het niet wordt gebruikt voor praalwagens, het is niet gebruikt voor studenten. 448 00:28:06,310 --> 00:28:11,730 En dus is de gotcha met malloc is dat de last volledig op u de programmeur 449 00:28:11,730 --> 00:28:16,790 om te onthouden hoeveel bytes u toegewezen en niet om ooit een te gebruiken voor lus 450 00:28:16,790 --> 00:28:21,570 of een while loop en ga voorbij de grens van het stuk van het geheugen die je hebt gekregen. 451 00:28:21,570 --> 00:28:23,540 Anders gezegd, zodra je het geheugen toe te wijzen, 452 00:28:23,540 --> 00:28:28,510 je kunt niet het besturingssysteem vraagt, oh, door de manier, hoe groot van een stuk van het geheugen was dit? 453 00:28:28,510 --> 00:28:32,080 Het is helemaal aan jou om te onthouden als u die waarde. 454 00:28:32,080 --> 00:28:34,330 >> Dus laten we eens kijken hoe ik verder met dit geheugen te gebruiken. 455 00:28:34,330 --> 00:28:38,430 In lijn 28 en 29 waarom doe ik dit? 456 00:28:39,850 --> 00:28:42,260 Gewoon totaal sanity check. 457 00:28:42,260 --> 00:28:45,110 Gewoon voor het geval er iets mis ging, vraag ik om wat gekke hoeveelheid geheugen 458 00:28:45,110 --> 00:28:48,690 of ik heb zo veel dingen die op de computer dat er gewoon niet genoeg geheugen, 459 00:28:48,690 --> 00:28:51,780 zoiets, ik in ieder geval wilt controleren op null. 460 00:28:51,780 --> 00:28:55,260 In werkelijkheid zullen de meeste computers geeft je de illusie dat elk programma 461 00:28:55,260 --> 00:28:57,080 kan het geheel van uw RAM-geheugen te gebruiken, 462 00:28:57,080 --> 00:29:00,740 maar zelfs dan, als de gebruiker typt in sommige gekke lange reeks misschien omdat ze een slechterik 463 00:29:00,740 --> 00:29:03,440 en ze eigenlijk proberen om uw programma of hack crashen in het, 464 00:29:03,440 --> 00:29:07,300 u wilt in ieder geval controleer de return waarde van malloc en of het gelijk is aan null. 465 00:29:07,300 --> 00:29:11,630 En als dat zo is, laten we gewoon stoppen nu, want ik weet niet wat te doen in dat geval. 466 00:29:11,630 --> 00:29:13,950 Hoe kopieer ik de string? Er zijn een paar manieren om dit te doen. 467 00:29:13,950 --> 00:29:18,850 Er zijn str kopiëren van functies in C, maar het is super eenvoudig voor ons om dit te doen op de ouderwetse manier. 468 00:29:18,850 --> 00:29:23,110 >> Laat me eerst uit te zoeken wat de lengte van s is. 469 00:29:23,110 --> 00:29:26,930 Ik had dit in de lus, maar in plaats daarvan ik zet ze gewoon hier voor de duidelijkheid. 470 00:29:26,930 --> 00:29:30,610 Zo n slaat nu de lengte van de oorspronkelijke string, die blijkbaar 5. 471 00:29:30,610 --> 00:29:35,290 Dan in mijn for loop ik itereren van 0 op maximaal n, 472 00:29:35,290 --> 00:29:40,940 en elke iteratie Ik zet s [i] binnenzijde van t [i]. 473 00:29:40,940 --> 00:29:45,060 Dus dat is wat ik impliciet met mijn 2 vingers wijzend naar de snaren eerder. 474 00:29:45,060 --> 00:29:49,260 Omdat deze for loop als deze, ga ik te kopiëren h in hier, 475 00:29:49,260 --> 00:29:52,890 e in hier in l hier omdat dit s, is t. 476 00:29:52,890 --> 00:29:58,770 En dan tot slot, in lijn 35 waarom doe ik dit? 477 00:29:58,770 --> 00:30:03,770 Ik moet ervoor zorgen dat ik de string t einde. 478 00:30:03,770 --> 00:30:06,170 En ik deed het op deze manier te worden super expliciet. 479 00:30:06,170 --> 00:30:09,510 Maar stel, iemand, als je zou kunnen, een andere manier om dit te doen. 480 00:30:09,510 --> 00:30:13,930 Ik heb het niet echt nodig lijn 35. Er is een andere manier om dit te doen. 481 00:30:13,930 --> 00:30:18,880 Ja. >> [Onverstaanbaar student reactie] >> Zeg het luider. 482 00:30:18,880 --> 00:30:20,960 [Student] Minder dan of gelijk aan. >> Precies. 483 00:30:20,960 --> 00:30:24,450 We zeggen minder dan of gelijk aan n, die in het algemeen slecht was 484 00:30:24,450 --> 00:30:28,190 omdat bijna altijd wanneer wij gaan op naar een die gelijk is aan het ding we rekenen 485 00:30:28,190 --> 00:30:30,000 gaan we een stap te ver. 486 00:30:30,000 --> 00:30:32,170 Maar vergeet niet, we hebben hoeveel bytes toe te wijzen? 487 00:30:32,170 --> 00:30:37,210 We toegewezen strlen van s, dus 5 + 1 voor een totaal van 6. 488 00:30:37,210 --> 00:30:39,980 Dus in dit geval kunnen we iets doen als dit 489 00:30:39,980 --> 00:30:46,450 zodat we het kopiëren van niet alleen de gedag, maar ook de \ 0 helemaal aan het eind. 490 00:30:46,450 --> 00:30:49,860 Als alternatief kunnen we gebruik maken van een functie genaamd str kopiëren, strcpy, 491 00:30:49,860 --> 00:30:51,700 maar dat zou niet zo leuk. 492 00:30:51,700 --> 00:30:54,000 Maar dat is alles wat het doet onder de kap. 493 00:30:54,000 --> 00:30:56,050 Dan tot slot, doen we hetzelfde als voorheen. 494 00:30:56,050 --> 00:31:01,620 Ik kapitaliseren t en toen ik beweer dat de originele ziet er zo uit en de kopie er zo. 495 00:31:01,620 --> 00:31:08,570 Dus laten we nu proberen. Laat me gaan hier. Maak COPY2. We zoomen in en uit te voeren COPY2. 496 00:31:08,570 --> 00:31:13,840 Ik ga in hallo typen in kleine letters, en inderdaad ik kleine letters gedag te krijgen als het origineel 497 00:31:13,840 --> 00:31:16,930 maar het kapitaal Hallo voor de kopie. 498 00:31:16,930 --> 00:31:20,300 Maar ik ben niet alleen nog niet klaar. Ik moet een laatste ding doen hier. 499 00:31:20,300 --> 00:31:28,000 46 en 47 is duidelijk het vrijmaken van geheugen, maar wat betekent dat eigenlijk? 500 00:31:28,000 --> 00:31:33,250 Wat doe ik, denk je, door te bellen naar lijn 46 en lijn 47? 501 00:31:33,250 --> 00:31:38,900 Welk effect heeft dat? Ja. 502 00:31:38,900 --> 00:31:43,140 [Onverstaanbaar student reactie] >> Precies. 503 00:31:43,140 --> 00:31:46,380 >> U bent vertel het besturingssysteem, hey, bedankt voor dit geheugen. 504 00:31:46,380 --> 00:31:48,320 U kunt nu gebruik maken van het voor iemand anders. 505 00:31:48,320 --> 00:31:50,790 En hier is een perfect voorbeeld van vuilnis waarden. 506 00:31:50,790 --> 00:31:55,430 Ik heb net gebruikt dit geheugen op te schrijven het woord Hallo in 2 plaatsen, 507 00:31:55,430 --> 00:31:57,490 hier, hier, hier en hier. 508 00:31:57,490 --> 00:32:00,910 Dit is dus h-e-l-l-o-\ 0. 509 00:32:00,910 --> 00:32:06,960 Maar dan noem ik lijn 46 en lijn 47, en weet je wat er gebeurt op het gebied van de foto? 510 00:32:06,960 --> 00:32:10,010 Eigenlijk, wacht, de foto is de oude. 511 00:32:10,010 --> 00:32:12,550 Zodra we de kopie, is deze man eigenlijk wijst hier, 512 00:32:12,550 --> 00:32:16,110 dus laten we verwijderen van de nummers en slechts abstracte weer weg als onze pijlen. 513 00:32:16,110 --> 00:32:19,370 Wat gebeurt er in deze foto als ik bel gratis? 514 00:32:19,370 --> 00:32:22,750 [Onverstaanbaar student reactie] >> Zelfs niet. 515 00:32:22,750 --> 00:32:29,510 Als ik bel gratis s en t - soort van een strikvraag - dit beeld niet veranderen helemaal 516 00:32:29,510 --> 00:32:33,880 want bellen s en bellen t vertelt alleen het besturingssysteem, 517 00:32:33,880 --> 00:32:39,010 hey, kunt u weer gebruik maken van dit geheugen, maar het verandert niets aan deze op null 518 00:32:39,010 --> 00:32:41,840 of een speciaal teken, is het niet veranderen, 519 00:32:41,840 --> 00:32:47,350 Het verandert niets aan de h of de e of de l of de l of de o in een van beide plaats om iets anders. 520 00:32:47,350 --> 00:32:51,610 In termen van het beeld, zodra u gratis, verandert er niets noemen. 521 00:32:51,610 --> 00:32:56,570 En daarin ligt de oorsprong van vuilnis waarden, want als ik dan later in dit programma 522 00:32:56,570 --> 00:33:01,010 die vragen het besturingssysteem voor meer geheugen met GetString of malloc of iets dergelijks 523 00:33:01,010 --> 00:33:04,900 en het besturingssysteem zegt zeker, ik 12 bytes van het geheugen net bevrijd uit maximaal, 524 00:33:04,900 --> 00:33:08,080 gebruik maken van deze, wat ga je worden overhandigd? 525 00:33:08,080 --> 00:33:10,830 Je gaat worden ingeleverd een stuk van het geheugen dat we zouden in het algemeen trekken 526 00:33:10,830 --> 00:33:13,700 met vraagtekens, maar wat zijn die vraagtekens? 527 00:33:13,700 --> 00:33:17,000 Zij zich bevinden h-e-l-l-o, h-e-l-l-o. 528 00:33:17,000 --> 00:33:20,940 Dit zijn onze nieuwe vuilnis waarden zodra je vrij te maken dat het geheugen. 529 00:33:20,940 --> 00:33:22,750 >> Er is een echte wereld implicatie hier ook. 530 00:33:22,750 --> 00:33:24,720 Dit gebeurt te maken met RAM-geheugen, maar uw computers 531 00:33:24,720 --> 00:33:26,720 eigenlijk hetzelfde doen met schijf. 532 00:33:26,720 --> 00:33:30,620 We praten over dit in het bijzonder met het toekomstig probleem set die zich richt op forensisch onderzoek. 533 00:33:30,620 --> 00:33:36,170 Maar wat gebeurt er eigenlijk als je een aantal gevoelige financiële bestand op uw bureaublad 534 00:33:36,170 --> 00:33:39,600 of een schetsmatige JPEG en u sleept het in uw prullenbak, 535 00:33:39,600 --> 00:33:44,390 wat er gebeurt als je sleep deze naar de prullenbak of de prullenbak? 536 00:33:44,390 --> 00:33:47,240 Je wist wat ik het over had. [Gelach] 537 00:33:47,240 --> 00:33:52,370 Wat gebeurt er als je hebt gesleept dat bewijs in de prullenbak of prullenmand? 538 00:33:52,370 --> 00:33:55,920 [Onverstaanbaar student reactie] 539 00:33:55,920 --> 00:33:58,000 Nou ja, zo voorzichtig. Wat gebeurt er als je dat doet? 540 00:33:58,000 --> 00:34:01,030 Het korte antwoord is niets, toch? 541 00:34:01,030 --> 00:34:04,790 Sketchy of gevoelige bestanden nog gewoon zitten ergens op uw harde schijf. 542 00:34:04,790 --> 00:34:07,940 De meesten van ons op zijn minst hebben geleerd op de harde manier dat je nodig hebt om uw prullenbak legen 543 00:34:07,940 --> 00:34:10,429 of uw prullenbak om daadwerkelijk verwijderen van bestanden. 544 00:34:10,429 --> 00:34:13,440 En inderdaad, als je rechts klikt of Ctrl-klik op uw prullenbak 545 00:34:13,440 --> 00:34:15,580 of kies Bestand, Prullenbak legen of wat dan ook 546 00:34:15,580 --> 00:34:21,420 en je eigenlijk het legen van de prullenbak of prullenmand, wat er eigenlijk gebeurt er dan met deze foto? 547 00:34:22,810 --> 00:34:25,969 Meer niets. Zodat er niets gebeurt eigenlijk op de harde schijf. 548 00:34:25,969 --> 00:34:30,880 >> En als we gewoon tijdelijk afdwalen en schrijf - Ik zal gewoon gebruik maken van de achterkant van deze. 549 00:34:30,880 --> 00:34:34,639 Dus nu het verhaal verandert van RAM-geheugen, dat is waar programma's bestaan 550 00:34:34,639 --> 00:34:39,250 terwijl je draait ze, op de harde schijf, dat is waar ze zijn opgeslagen op lange termijn 551 00:34:39,250 --> 00:34:42,920 zelfs wanneer de stroom uitvalt, voor nu - en we zullen terugkeren naar dit in de toekomst - 552 00:34:42,920 --> 00:34:46,380 laten we gewoon doen alsof dit de harde schijf binnenkant van uw computer vertegenwoordigt 553 00:34:46,380 --> 00:34:50,110 want in de dag dat ze vroeger ronde schijven, net als diskettes. 554 00:34:50,110 --> 00:34:55,130 Dus als je een aantal gevoelige Excel-bestand, kan het maken van deze brok van het geheugen 555 00:34:55,130 --> 00:34:59,770 op schijf van uw computer, en ik ben gewoon tekenen dezelfde willekeurige 1s en 0s. 556 00:34:59,770 --> 00:35:03,970 Wanneer u het bestand als dat slepen naar uw prullenbak of prullenbak, 557 00:35:03,970 --> 00:35:07,750 letterlijk gebeurt er niets omdat Apple en Microsoft hebben net besloten 558 00:35:07,750 --> 00:35:10,450 de prullenbak en de prullenbak is eigenlijk gewoon een tijdelijke plaatsaanduiding. 559 00:35:10,450 --> 00:35:14,710 Misschien uiteindelijk de OS zal legen het voor u, maar meestal is het niets doet, 560 00:35:14,710 --> 00:35:17,090 in ieder geval totdat je echt weinig ruimte. 561 00:35:17,090 --> 00:35:20,870 >> Echter, als je naar lege prullenbak of lege prullenbak, 562 00:35:20,870 --> 00:35:23,460 op dezelfde wijze, gebeurt er niets om deze foto. 563 00:35:23,460 --> 00:35:28,590 Alles wat er gebeurt is elders op de computer, is er een soort van tafel. 564 00:35:28,590 --> 00:35:35,400 Het is een soort van als een klein spiekbriefje dat zegt dat, laten we zeggen, RESUME.DOC, 565 00:35:35,400 --> 00:35:40,920 zodat uw CV in een Microsoft Word-bestand dat wordt gebruikt om te wonen op de locatie 123 op de harde schijf, 566 00:35:40,920 --> 00:35:43,710 niet in het geheugen en niet in het RAM, maar op de harde schijf, 567 00:35:43,710 --> 00:35:49,050 en uw schetsmatige JPEG woont op 456, en uw Excel-bestand woont op 789 of waar dan ook. 568 00:35:49,050 --> 00:35:53,640 Wanneer u bestanden verwijdert door daadwerkelijk het legen van de prullenbak of de prullenbak, 569 00:35:53,640 --> 00:35:59,530 deze afbeelding verandert niet. De 0s en 1s op uw harde schijf niet overal te gaan. 570 00:35:59,530 --> 00:36:03,930 Maar deze tabel, deze kleine database van soorten, verandert wel. 571 00:36:03,930 --> 00:36:08,750 Bij het verwijderen van uw CV, het is alsof het bestand is verwijderd in zekere zin, 572 00:36:08,750 --> 00:36:12,790 maar alle computer doet is vergeten waar dat ding leeft op uw harde schijf. 573 00:36:12,790 --> 00:36:17,870 De 0s en 1s dat je CV of een van deze andere bestanden samen te stellen zijn nog steeds intact. 574 00:36:17,870 --> 00:36:21,960 >> Dus als je dit deed per ongeluk, er is nog steeds een niet-nul kans 575 00:36:21,960 --> 00:36:25,800 dat je kunt herstellen van uw gegevens met behulp van Norton Utilities of een commerciële software 576 00:36:25,800 --> 00:36:29,810 waarvan het doel in het leven is het vinden van 0s en 1s die soort wees zijn geworden, 577 00:36:29,810 --> 00:36:33,300 hier vergeten maar liet hier, zodat je terug kunt krijgen van uw gegevens. 578 00:36:33,300 --> 00:36:38,410 Of forensische onderzoekers bij de politie of FBI zou eigenlijk nemen een harde schijf 579 00:36:38,410 --> 00:36:42,550 en eigenlijk op zoek naar patronen van 0s en 1s die er uitzien als JPEG's, lijken Excel-bestanden, 580 00:36:42,550 --> 00:36:46,400 en herstellen ze op die manier, zelfs als de computer is ze daar vergeten. 581 00:36:46,400 --> 00:36:49,820 Dus de enige manier echt om gegevens te verwijderen, zoals we zullen bespreken in de toekomst, 582 00:36:49,820 --> 00:36:54,190 is te schrobben of vegen het bestand of de harde schijf door - 583 00:36:54,190 --> 00:36:56,540 Je kunt niet echt te ontdoen van de 0s en 1s 584 00:36:56,540 --> 00:36:59,440 want anders zou je beginnen met een gigabyte harde schijf 585 00:36:59,440 --> 00:37:02,380 en je zou eindigen met een megabyte harde schijf als je constant het verwijderen was, 586 00:37:02,380 --> 00:37:04,380 letterlijk, 0s en 1s. 587 00:37:04,380 --> 00:37:06,310 Dus wat zou je doen als je echt wilde je sporen uit te wissen 588 00:37:06,310 --> 00:37:10,510 en het fundamentele probleem is dat er nog steeds 0s en 1s op de schijf? 589 00:37:10,510 --> 00:37:14,930 Ik zie iemand gebarend dat je fysiek zou het apparaat breken. Dat zal werken. 590 00:37:14,930 --> 00:37:19,600 [Gelach] Maar als dat is een soort van een dure oplossing, wat zou het zijn meer redelijk? 591 00:37:19,600 --> 00:37:23,270 Ja. >> [Student] Overschrijven hen. >> Overschrijven ze met wat? >> [Student] Overige gegevens. 592 00:37:23,270 --> 00:37:29,070 Andere gegevens. U kunt uw schijf gewoon overschrijven met 0s of 1s of alle 0s, alle 1s. 593 00:37:29,070 --> 00:37:31,230 >> En dat is inderdaad wat sommige van de software doet. 594 00:37:31,230 --> 00:37:33,570 U kunt kopen software of zelfs gratis software, 595 00:37:33,570 --> 00:37:36,610 en zelfs ingebouwd in Mac OS deze dagen, minder in Windows, 596 00:37:36,610 --> 00:37:38,660 is de mogelijkheid om veilig te wissen. 597 00:37:38,660 --> 00:37:41,960 Eigenlijk, als je wilt draaien allemaal naar huis vandaag de dag als je een Mac hebt en doen dit, 598 00:37:41,960 --> 00:37:45,740 als je hebt een paar dingen in je prullenbak, kunt u Leeg prullenmand veilig, 599 00:37:45,740 --> 00:37:47,610 die doet precies dat. 600 00:37:47,610 --> 00:37:53,350 In plaats van alleen te wissen bestanden hier, is het niet wist de 0s en 1s hier, 601 00:37:53,350 --> 00:38:01,240 eerder verandert gewoon allemaal, bijvoorbeeld om 0s en dot, dot, dot. 602 00:38:01,240 --> 00:38:05,330 Dus een van uw toekomstige psets daadwerkelijk zijn om dat doel gegevens te herstellen - 603 00:38:05,330 --> 00:38:08,430 foto's die we hebben genomen van mensen, plaatsen en dingen op de campus 604 00:38:08,430 --> 00:38:12,810 waarvoor we maken een forensisch beeld van het geheugen van een digitale camera, 605 00:38:12,810 --> 00:38:17,120 dat is precies hetzelfde idee - en u zult moeten worden uitgedaagd om daadwerkelijk vinden 606 00:38:17,120 --> 00:38:20,160 de patronen die JPEG-bestanden vertegenwoordigen op uw harde schijf, 607 00:38:20,160 --> 00:38:23,610 net als dat oud-student van wie e-mail las ik een paar weken geleden deed 608 00:38:23,610 --> 00:38:25,860 naar zijn zus foto's te herstellen. 609 00:38:25,860 --> 00:38:30,300 Waarom gaan we niet hier nemen een 5-minuten pauze, en we zullen hergroeperen met meer geheugen. 610 00:38:33,030 --> 00:38:38,610 Dus hier is waar de dingen een beetje breinbrekende, maar dit is een zeer krachtige stap 611 00:38:38,610 --> 00:38:40,480 naar het begrijpen van dit des te meer. 612 00:38:40,480 --> 00:38:42,900 Hier is een programma genaamd pointers.c. 613 00:38:42,900 --> 00:38:45,430 Het is een van sample vandaag code. 614 00:38:45,430 --> 00:38:51,280 Merk op dat in de eerste paar regels, 19 tot en met 22, alles wat we aan het doen bent is zoiets als GetString 615 00:38:51,280 --> 00:38:54,460 en terug te keren van een adres, op te slaan in s. 616 00:38:54,460 --> 00:38:58,380 Voortaan voor PSET zelfs 3 als je wilt, maar PSET 4 en op 617 00:38:58,380 --> 00:39:01,030 waar u kunt beginnen met deze opleiding wielen van uzelf te maken, 618 00:39:01,030 --> 00:39:04,030 is er geen reden om te doen alsof dat strings meer bestaat. 619 00:39:04,030 --> 00:39:07,030 Het is zeker goed om gewoon beginnen met te zeggen char *. 620 00:39:07,030 --> 00:39:12,610 >> Even terzijde, in online referenties en in boeken kunt u vaak zien de ster naast de variabele. 621 00:39:12,610 --> 00:39:15,600 Je zou zelfs ruimte rond beide zijden van het. 622 00:39:15,600 --> 00:39:17,680 Al deze zijn functioneel correct. 623 00:39:17,680 --> 00:39:21,180 Voorlopig echter, zullen we standaardiseren op deze aanpak te maken super helder 624 00:39:21,180 --> 00:39:24,000 dat char * is hetzelfde als zeggen karakter pointer. 625 00:39:24,000 --> 00:39:25,680 Dat is het gegevenstype. 626 00:39:25,680 --> 00:39:28,730 En vervolgens de naam van de variabele s in dit geval. 627 00:39:28,730 --> 00:39:31,180 Dus we hebben gekregen een string en we hebben noemde het s. 628 00:39:31,180 --> 00:39:35,180 En dan hier beneden ziet dat ik eigenlijk een beetje bedrog doen. 629 00:39:35,180 --> 00:39:39,080 Dit is de zogenaamde pointers, dat is een soort van super eenvoudig. 630 00:39:39,080 --> 00:39:41,790 Het betekent gewoon toe te voegen en getallen aftrekken tot pointers. 631 00:39:41,790 --> 00:39:43,660 Maar dit werkt eigenlijk. 632 00:39:43,660 --> 00:39:49,170 Dit programma drukt blijkbaar de string s 1 karakter per regel zodanig dat het eindresultaat - 633 00:39:49,170 --> 00:39:54,920 Zodat we kunnen bederven waar dit gaat, zorg pointers, rennen pointers, laat me zoomen 634 00:39:54,920 --> 00:39:58,940 Laat me nu typ in iets als HELLO en op Enter drukt 635 00:39:58,940 --> 00:40:01,080 en het drukt een karakter per regel. 636 00:40:01,080 --> 00:40:04,730 Tot een tweede geleden, zouden we dit gedaan hebben met vierkante haken notatie. 637 00:40:04,730 --> 00:40:09,760 We zouden een for-lus en we zouden doen printf van s [i] en we zouden dat doen opnieuw en opnieuw en opnieuw 638 00:40:09,760 --> 00:40:11,950 een backslash n aan het eind van elke regel. 639 00:40:11,950 --> 00:40:16,800 Maar dit programma is anders. Dit programma wordt gebruikt, letterlijk, rekenen. 640 00:40:16,800 --> 00:40:18,860 Dus wat is hier aan de hand? 641 00:40:18,860 --> 00:40:24,720 Allereerst voordat deze lus nog uitgevoerd, wat, om duidelijk is eigenlijk s? 642 00:40:24,720 --> 00:40:27,270 S? >> [Student] Een adres. >> Een adres. 643 00:40:27,270 --> 00:40:32,980 >> En het is het adres van, bij hello, het eerste teken in dat woord, dat h. 644 00:40:32,980 --> 00:40:37,370 Dus s is in dit voorbeeld, het adres van h. 645 00:40:37,370 --> 00:40:41,850 Dus wat betekent het om het doen + i? 646 00:40:41,850 --> 00:40:46,280 Nou, ik begint bij 0 in deze for-lus. Dat hebben we gedaan vele malen. 647 00:40:46,280 --> 00:40:49,760 Ik zal gaan tot de lengte van de tekenreeks, blijkbaar. 648 00:40:49,760 --> 00:40:53,950 Dus op de eerste iteratie van deze lus, i is natuurlijk 0. 649 00:40:53,950 --> 00:41:01,740 Dus deze uitdrukking zegt s + i - in plaats van, s +0, dat is natuurlijk gewoon s. 650 00:41:01,740 --> 00:41:04,320 Dus wat is * s hier? 651 00:41:04,320 --> 00:41:08,530 Nu zijn we met behulp van de ster in een iets andere manier. 652 00:41:08,530 --> 00:41:13,080 Laat me gaan en zich te ontdoen van t omdat we uitgepraat over t en kopieën van s. 653 00:41:13,080 --> 00:41:15,540 Nu we willen gewoon een verhaal met s vertellen. 654 00:41:15,540 --> 00:41:20,090 En dus op dit moment, na type string, ziet onze wereld er heel leuk deed voor 655 00:41:20,090 --> 00:41:26,630 met alleen s opslaan van het adres van h en meer in het algemeen te wijzen op de string hello. 656 00:41:26,630 --> 00:41:33,170 Als ik nu doen een regel als * (s + i), laten we dit uit te proberen. 657 00:41:33,170 --> 00:41:40,140 Dus * (s + i). Laat me vereenvoudigen dit want dit is 0, dus dit is * (s +0). 658 00:41:40,140 --> 00:41:43,790 Nou, wacht eens even. Nog verder te vereenvoudigen. Dit is * (s). 659 00:41:43,790 --> 00:41:47,020 Nou, nu de haakjes zijn een beetje dom, dus laten we nu gewoon doen * s. 660 00:41:47,020 --> 00:41:50,540 Dus in de eerste iteratie van deze lus, die lijn die is gemarkeerd, 26, 661 00:41:50,540 --> 00:41:53,650 is vrij veel overeen met het afdrukken van dit. 662 00:41:53,650 --> 00:41:56,040 Wat is het gegevenstype van * s? 663 00:41:56,040 --> 00:42:00,770 In dit verband, omdat de ster toevallig naast de s zelf, 664 00:42:00,770 --> 00:42:04,930 maar meer in het bijzonder, omdat we niet langer verklaren s, 665 00:42:04,930 --> 00:42:09,730 we zijn niet een variabele meer het creëren, is er geen melding gemaakt van char * in lijn 26, 666 00:42:09,730 --> 00:42:14,280 Er is geen melding gemaakt van het trefwoord string, zijn we alleen met behulp van een variabele genaamd s, 667 00:42:14,280 --> 00:42:19,650 Het blijkt nu de ster heeft iets anders en toegegeven,, verwarrend betekenis. 668 00:42:19,650 --> 00:42:26,590 * S betekent hier naar het adres in s en print alles wat er is. 669 00:42:26,590 --> 00:42:33,750 Dus s hier is, * s is - soort van Chutes en Ladders, volg de pijl - hier. 670 00:42:33,750 --> 00:42:35,850 Dit is dus * s. 671 00:42:35,850 --> 00:42:39,060 >> Dus wat wordt afgedrukt op de eerste iteratie van die lus in de lijn 26? 672 00:42:39,060 --> 00:42:42,170 Print ik% c, dat is de standaard pagina voor een karakter, 673 00:42:42,170 --> 00:42:48,520 dan is een \ n voor een nieuwe lijn. * (S + i) waarbij i 0 is juist dit. 674 00:42:48,520 --> 00:42:53,670 Dus wat char plaats ik in voor% c? H. 675 00:42:53,670 --> 00:42:56,900 In de volgende iteratie van de lus - kun je waarschijnlijk zien waar dit naartoe gaat - 676 00:42:56,900 --> 00:43:01,350 de volgende iteratie i is natuurlijk 1, dat betekent dus s +1, 677 00:43:01,350 --> 00:43:05,580 en dan nu heb ik hoef de haakjes omdat nu de ster moet zeggen 678 00:43:05,580 --> 00:43:08,620 naar geheugenadres s +1. 679 00:43:08,620 --> 00:43:14,170 Wat is s? Laten we terug rollen in de tijd en zeggen dat deze pijl nu niet daadwerkelijk doet ons geen gunsten. 680 00:43:14,170 --> 00:43:18,450 Laten we meer in het bijzonder zeggen dat dit is het nummer 123 opslaan 681 00:43:18,450 --> 00:43:25,110 omdat de start van deze string hello, dit adres 123, is 124, enzovoort. 682 00:43:25,110 --> 00:43:30,550 Dus op de tweede iteratie als ik s +1 zeggen, dat is hetzelfde als zeggen 123 +1, 683 00:43:30,550 --> 00:43:35,340 ook wel bekend als 124, dus wat char wordt afgedrukt op de tweede iteratie? 684 00:43:35,340 --> 00:43:37,850 E op geheugenadres 124. 685 00:43:37,850 --> 00:43:44,440 Dan + weer, 125, 126, 127, en deze lus stopt gelukkig voordat we hier 686 00:43:44,440 --> 00:43:49,040 want ik ben met behulp van strlen om ervoor te zorgen dat ik niet telt te hoog. 687 00:43:49,040 --> 00:43:50,810 Dus ook dat is het. 688 00:43:50,810 --> 00:43:55,000 Nogmaals, dit is net alsof we hadden een week geleden gedaan. 689 00:43:55,000 --> 00:43:59,200 Ik schrijf het op de lijn hieronder ook al hebben we niet willen om beide te doen. 690 00:43:59,200 --> 00:44:02,500 Dit is identiek nu dit. 691 00:44:02,500 --> 00:44:08,310 >> Dus ook al is een string is, zoals we al noemde het al weken, en is echt een char *. 692 00:44:08,310 --> 00:44:13,270 Dus als we willen super anaal te zijn, het is echt een goede om te schrijven het specifieke karakter 693 00:44:13,270 --> 00:44:17,490 op de i-de locatie met behulp van deze numerieke adressen en deze ster operator, 694 00:44:17,490 --> 00:44:20,470 maar eerlijk gezegd, dit is gewoon zo veel schoner. Dus dit is niet slecht. 695 00:44:20,470 --> 00:44:26,720 Geen reden om te stoppen met het doen van lijn 27 hier, maar 26 is functioneel hetzelfde, 696 00:44:26,720 --> 00:44:31,570 en het is functioneel hetzelfde voor precies de redenen die we hebben tot nu toe besproken. 697 00:44:31,570 --> 00:44:33,650 En tot slot, 29 is gewoon goede praktijk. 698 00:44:33,650 --> 00:44:38,420 Bellen vrij van s betekent dat nu ben je terug te geven het geheugen dat GetString je gaf 699 00:44:38,420 --> 00:44:41,630 want nogmaals, zoals ik al zei maandag getString weken 700 00:44:41,630 --> 00:44:44,180 is de invoering van een bug in je code. 701 00:44:44,180 --> 00:44:46,490 Uw code voor weken heeft geheugenlekken 702 00:44:46,490 --> 00:44:49,970 waarbij u gevraagd GetString voor het geheugen, maar je hebt nooit het geven van het terug. 703 00:44:49,970 --> 00:44:53,410 En dat was bewust gekozen door ons pedagogisch 704 00:44:53,410 --> 00:44:55,880 want het is gewoon te veel na te denken over vroeg op. 705 00:44:55,880 --> 00:44:57,710 Maar nu moeten we meer symmetrie. 706 00:44:57,710 --> 00:45:00,830 Als u de computer om geheugen, zoals het geval is voor GetString, 707 00:45:00,830 --> 00:45:02,820 zoals het geval is blijkbaar voor malloc, 708 00:45:02,820 --> 00:45:07,970 moet u nu voor PSET 4 en volgende ook gratis een dergelijk geheugen. 709 00:45:07,970 --> 00:45:11,650 Let op dit is iets anders dan te zeggen int n. 710 00:45:11,650 --> 00:45:15,040 U hoeft niet om dit te bevrijden, omdat je niet gebeld GetString 711 00:45:15,040 --> 00:45:16,890 en je niet te bellen malloc. 712 00:45:16,890 --> 00:45:20,610 >> En zelfs als je wel GetInt zoals we zullen uiteindelijk zien, 713 00:45:20,610 --> 00:45:25,520 GetInt heeft geen geheugen toewijzen voor u, want je kunt eigenlijk pas rond integers 714 00:45:25,520 --> 00:45:29,430 en praalwagens en chars gewoon de manier waarop we hebben gedaan voor de week. 715 00:45:29,430 --> 00:45:33,960 Snaren, hoewel, zijn speciaal omdat ze echt zijn de aaneenschakeling van meerdere tekens. 716 00:45:33,960 --> 00:45:37,450 Dus ze zijn gewoon verschillend van chars en praalwagens en ints en dergelijke. 717 00:45:37,450 --> 00:45:39,980 Maar we zullen terug te komen op dat duurde niet lang. 718 00:45:39,980 --> 00:45:44,920 Hebt u vragen dan op dit begin van pointers? Ja. 719 00:45:44,920 --> 00:45:49,690 [Onverstaanbaar student vraag] 720 00:45:49,690 --> 00:45:51,440 Ah, goede vraag. 721 00:45:51,440 --> 00:45:55,790 Een van de weinige dingen die C eigenlijk voor je doet, wat handig is, 722 00:45:55,790 --> 00:46:00,110 is het cijfers uit voor wat de grootte is van het gegevenstype 723 00:46:00,110 --> 00:46:03,060 en dan doet dat soort vermenigvuldiging voor u. 724 00:46:03,060 --> 00:46:06,610 Dit is irrelevant bij tekens omdat bijna altijd een karakter is 1 byte, 725 00:46:06,610 --> 00:46:08,150 dus dit werkt gewoon. 726 00:46:08,150 --> 00:46:11,220 Maar ter wille van de discussie, als je daadwerkelijk afdrukt gehele getallen 727 00:46:11,220 --> 00:46:15,500 en je probeert af te drukken enkele waarde is dat wees naar een integer, 728 00:46:15,500 --> 00:46:20,720 je eveneens zou niet nodig om + 4 doen * i, alleen maar omdat een int is 4 bytes. 729 00:46:20,720 --> 00:46:25,780 Pointers betekent dat C en de compiler al dat wiskunde voor u doen. 730 00:46:25,780 --> 00:46:29,190 Alles wat je moet zorgen te maken over is het tellen in een soort van het menselijk verstand. Ja. 731 00:46:29,190 --> 00:46:35,200 [Student] Als je een string te verklaren in een for-lus, moet je later bevrijden? 732 00:46:35,200 --> 00:46:36,760 Goede vraag. 733 00:46:36,760 --> 00:46:41,390 >> Als u verklaarde een string binnenkant van de for-lus, heb je nodig om later bevrijden? 734 00:46:41,390 --> 00:46:47,520 U hoeft alleen maar op om geheugen vrij, wat je met GetString of met malloc. 735 00:46:47,520 --> 00:46:53,110 Dus als je gewoon iets wilt - laat me nu zet accolades zodat alle code betrekking heeft. 736 00:46:53,110 --> 00:46:58,580 Als je iets deed, zij het buggily, zoals dit, char * t = s, 737 00:46:58,580 --> 00:47:03,450 je hoeft niet om gratis t omdat t geen sprake was van enige vermelding van malloc of GetString. 738 00:47:03,450 --> 00:47:08,960 Als daarentegen je dit gedaan hebt, GetString, dan ja, zou je nodig hebt om gratis t. 739 00:47:08,960 --> 00:47:14,350 En in feite, je enige kans om dat te doen is nu binnen deze lus, voor hetzelfde probleem van reikwijdte 740 00:47:14,350 --> 00:47:16,060 dat we hebben besproken in het verleden. 741 00:47:16,060 --> 00:47:18,830 Anders zou je het toewijzen van geheugen, het toewijzen van geheugen, het toewijzen van geheugen, 742 00:47:18,830 --> 00:47:21,230 en aan het eind van het programma omdat je buiten die lus, 743 00:47:21,230 --> 00:47:24,240 t bestaat niet, maar je nooit verteld het besturingssysteem 744 00:47:24,240 --> 00:47:26,750 die je niet meer nodig dat het geheugen. 745 00:47:26,750 --> 00:47:30,430 En het duurde niet lang, want PSET 4 of 5 zullen we u voorzien van een programma genaamd Valgrind, 746 00:47:30,430 --> 00:47:34,160 die vergelijkbaar is in de geest van GDB in zoverre dat het iets heeft van een geheimzinnige interface, 747 00:47:34,160 --> 00:47:35,750 maar zijn doel in het leven is om u te helpen. 748 00:47:35,750 --> 00:47:39,380 En Valgrind is een programma dat zal in de toekomst zoeken in uw programma's 749 00:47:39,380 --> 00:47:42,550 op zoek naar geheugenlekken, zowel van GetString of malloc, 750 00:47:42,550 --> 00:47:47,800 die we zullen gaan gebruiken des te meer als we stoppen met het gebruik van de CS50 bibliotheek zo veel. 751 00:47:47,800 --> 00:47:53,030 We hebben eindelijk hebben nu soort van de woordenschat en de soort van mentale model in theorie 752 00:47:53,030 --> 00:47:55,170 waarmee deze gebroken programma op te lossen. 753 00:47:55,170 --> 00:47:59,410 >> Dus in deze gebroken programma, swap werkt binnen swap, 754 00:47:59,410 --> 00:48:05,280 maar het nooit echt gewerkt in de belangrijkste, omdat de belangrijkste aangenomen in x en y, recall, 755 00:48:05,280 --> 00:48:07,260 en die werden doorgegeven in door waarden, om zo te zeggen. 756 00:48:07,260 --> 00:48:09,330 Kopieën van hen werden gegeven om te wisselen. 757 00:48:09,330 --> 00:48:12,520 Tegen het einde van swap, had a en b inderdaad uitgewisseld, 758 00:48:12,520 --> 00:48:16,120 maar natuurlijk x en y, zoals we op maandag niet was. 759 00:48:16,120 --> 00:48:19,940 Dus ik hier stel in het groen dat dit eigenlijk hier de oplossing. 760 00:48:19,940 --> 00:48:22,640 En eigenlijk, laat me gaan mijn sterren alleen consistent te zijn 761 00:48:22,640 --> 00:48:24,440 hoewel, nogmaals, functioneel dit doet er niet toe. 762 00:48:24,440 --> 00:48:28,730 In de komende weken zullen we uitleggen wanneer en waarom het er wel toe doet. 763 00:48:28,730 --> 00:48:30,600 Dus in groene nu een oplossing. 764 00:48:30,600 --> 00:48:33,700 Eerlijk gezegd, het ziet er een stuk rommeliger, want ik heb al deze sterren. 765 00:48:33,700 --> 00:48:35,380 Ik wil erop wijzen een ding. 766 00:48:35,380 --> 00:48:40,040 De bovenste regel hier, waar het zegt int * a en int * b 767 00:48:40,040 --> 00:48:42,820 is fundamenteel hetzelfde te doen als altijd. 768 00:48:42,820 --> 00:48:47,070 Het is te verklaren 2 argumenten of parameters te wisselen, 769 00:48:47,070 --> 00:48:49,940 waarvan de eerste is een int pointer genaamd, 770 00:48:49,940 --> 00:48:53,100 waarvan de tweede is een int pointer b genoemd. 771 00:48:53,100 --> 00:48:55,770 Het enige dat nieuwe Op dit punt is het feit dat er daar een ster. 772 00:48:55,770 --> 00:48:59,340 >> Wat betekent dat? A is geen int, b is geen int. 773 00:48:59,340 --> 00:49:04,100 A is het adres van een int en b is het adres van een ander int. 774 00:49:04,100 --> 00:49:06,980 Hierna, dit is waar ik toegeven C verwarrend wordt. 775 00:49:06,980 --> 00:49:09,790 Nu zijn we met behulp van een ster, maar het heeft andere betekenis in deze context. 776 00:49:09,790 --> 00:49:13,150 Omdat we niet verklaren pointers als wij hier, 777 00:49:13,150 --> 00:49:15,500 hier zijn we dereferentie dingen. 778 00:49:15,500 --> 00:49:21,520 Dus technisch gezien, de ster in deze context van de eerste, tweede en derde lijn binnenkant van swap 779 00:49:21,520 --> 00:49:24,560 wordt de dereference operator, wat gewoon betekent er heen gaan. 780 00:49:24,560 --> 00:49:27,400 Dus net als mijn vinger volgde de pijl naar h, 781 00:49:27,400 --> 00:49:31,100 * Een middel naar dat adres en vind ik het int dat er. 782 00:49:31,100 --> 00:49:34,250 * B middelen naar het adres en geef me wat er staat. 783 00:49:34,250 --> 00:49:40,730 Dus laten we de foto opnieuw te tekenen van maandag nu met behulp van een stapel van frames, 784 00:49:40,730 --> 00:49:43,130 de bodem waarvan zal worden main, 785 00:49:43,130 --> 00:49:47,600 de bovenste waarvan er een zal worden swap, 786 00:49:47,600 --> 00:49:50,880 zodat onze wereld eruit ziet, net als maandag, op deze manier. 787 00:49:50,880 --> 00:49:53,620 Hier is een deel van het geheugen dat de belangrijkste gaat gebruiken. 788 00:49:53,620 --> 00:49:56,520 >> Recall van maandag dat het programma slechts 2 variabelen hadden, 789 00:49:56,520 --> 00:50:01,930 een zogenaamde x-en een zogenaamde y, en ik had de nummers 1 en 2 is er. 790 00:50:01,930 --> 00:50:06,580 Nu als ik roep ruilen zoals ik deed op maandag, 791 00:50:06,580 --> 00:50:11,000 voorheen toen ik de rode versie van dit programma gebruikt, die er zo uitziet, 792 00:50:11,000 --> 00:50:17,470 Ik heb 2 parameters, a en b, en wat hebben we schrijven hier en hier? 793 00:50:17,470 --> 00:50:21,160 Gewoon 1 en 2, letterlijk kopieert van x en y. 794 00:50:21,160 --> 00:50:23,070 Vandaag hebben we dat veranderen. 795 00:50:23,070 --> 00:50:28,510 Vandaag de dag in plaats van het doorgeven in ints a en b we gaan passeren in 2 adressen. 796 00:50:28,510 --> 00:50:34,290 Deze adressen toevallig wijzen op ints, maar die adressen worden niet ints zelf. 797 00:50:34,290 --> 00:50:37,330 Ze zijn adressen. Het is als een postadres in plaats daarvan. 798 00:50:37,330 --> 00:50:40,580 Dus nu moeten we gewoon mezelf een beetje meer detail op het scherm. 799 00:50:40,580 --> 00:50:43,250 Dit is mijn computer het geheugen, want het is al de hele dag. 800 00:50:43,250 --> 00:50:45,120 Nu moeten we een aantal willekeurige nummering. 801 00:50:45,120 --> 00:50:50,580 Dus laten we zeggen, gewoon bij toeval, dat dit geheugenadres 123, 124. 802 00:50:50,580 --> 00:50:55,660 Laten we zeggen dat dit is 125, dit is 126, enzovoort, maar dat is volkomen willekeurig. 803 00:50:55,660 --> 00:50:58,590 We hoeven alleen maar een paar nummeringsschema in mijn geheugen. 804 00:50:58,590 --> 00:51:04,030 Dus als ik nu eigenlijk pas in x en y, ik ga niet te passeren in x en y; 805 00:51:04,030 --> 00:51:08,400 Ik ga nu in het postadres, om zo te zeggen, van x en van y 806 00:51:08,400 --> 00:51:11,870 zodat wat wordt hier en bewaard is 1 en 2, 807 00:51:11,870 --> 00:51:16,030 maar als je mijn kleine tekst te bekijken, wordt wat er in hier en hier? 808 00:51:16,030 --> 00:51:23,340 [Onverstaanbaar student reactie] >> Precies. 123 wordt hier plaatsen en 124 wordt hier plaatsen. 809 00:51:23,340 --> 00:51:28,910 >> Nu, omdat ik de ster in deze allereerste regel weg hier boven, 810 00:51:28,910 --> 00:51:34,340 mijn programma weet alleen dat 123 en 124, ook al zijn ze natuurlijk zijn gehele getallen 811 00:51:34,340 --> 00:51:40,160 dat een mens zou kunnen opmerken, moeten ze worden geïnterpreteerd als adressen, numerieke adressen. 812 00:51:40,160 --> 00:51:43,250 Ze zijn niet in en van zichzelf ints, ze zijn adressen, 813 00:51:43,250 --> 00:51:46,120 en dat is omdat ik expliciet daar te zetten de sterren. 814 00:51:46,120 --> 00:51:51,360 Dus nu in mijn eerste, tweede en derde lijn van de werkelijke code wat hier gebeurt? 815 00:51:51,360 --> 00:51:53,380 Laten we de aandacht van de rest van de foto. 816 00:51:53,380 --> 00:51:56,980 Tmp is net als het was op maandag. Niets bijzonders aan tmp. 817 00:51:56,980 --> 00:52:03,060 Het is gewoon een lokale 32 bits variabele, en de binnenkant van dat ik blijkbaar het opslaan van de waarde van * een. 818 00:52:03,060 --> 00:52:08,580 Nu, als ik net zei tmp = a, wat zou ik hier plaatsen? >> [Student] 123. 819 00:52:08,580 --> 00:52:10,370 123. Maar dat is niet wat ik doe. 820 00:52:10,370 --> 00:52:13,670 Ik zeg tmp = * a. Star middelen er heen gaan. 821 00:52:13,670 --> 00:52:19,370 Dus hier is een, 123. Hoe ga ik daar? Doen alsof er een pijl. 822 00:52:19,370 --> 00:52:24,460 Nou, daar is het, 1. Dus wat wordt opgeslagen in tmp, blijkbaar? Slechts 1. 823 00:52:24,460 --> 00:52:29,620 Met andere woorden, tmp * a, * een middel naar het adres dat momenteel in een, 824 00:52:29,620 --> 00:52:31,320 die blijkbaar 123. 825 00:52:31,320 --> 00:52:33,910 >> Oke, hier zijn we dan op locatie 123, zie ik de nummer 1, 826 00:52:33,910 --> 00:52:35,670 dus ik ga naar de nummer 1 daar te stellen. 827 00:52:35,670 --> 00:52:39,020 Wat moet ik nu doen in lijn 2, * a = * b? 828 00:52:39,020 --> 00:52:44,570 Dit is een beetje meer betrokken want nu wat is een? Het is 123. 829 00:52:44,570 --> 00:52:50,220 Dus * een is waar? Precies waar ik vroeger was. Dus ga daar. Oke. 830 00:52:50,220 --> 00:52:53,420 Nu, ten slotte, en dan uiteindelijk deze zal beginnen te zin te maken, hopelijk, 831 00:52:53,420 --> 00:53:00,280 * B betekent wat er in b? 124. Dus ik moet er naartoe te gaan, dat is 2. 832 00:53:00,280 --> 00:53:03,430 Dus wat doe ik waar? 833 00:53:03,430 --> 00:53:10,100 2 gaat in hier omdat * b * gaat in een. Dus ik zal dat doen. 834 00:53:10,100 --> 00:53:13,120 En je kunt misschien al zien, dat we zo veel dichter 835 00:53:13,120 --> 00:53:17,710 aan het oplossen van deze dom, simpel probleem correct voor de eerste keer 836 00:53:17,710 --> 00:53:20,920 want nu hebben we nog een herinnering van wat x was, 837 00:53:20,920 --> 00:53:23,230 we hebben 2 exemplaren, weliswaar, van y, 838 00:53:23,230 --> 00:53:25,850 maar lijn 3 zegt nu * b. 839 00:53:25,850 --> 00:53:31,080 Dus hier is b. * B middelen er heen gaan. Dus waar is locatie 124? 840 00:53:31,080 --> 00:53:35,560 Het is blijkbaar hier. Dus wat moet ik hier zetten? Uiteraard tmp. 841 00:53:35,560 --> 00:53:39,600 Dus nu doe ik dit. Dus ik heb een hier en 2 hier. 842 00:53:39,600 --> 00:53:43,560 En nu, wat over dit alles, de 123, de 124, en de 1? 843 00:53:43,560 --> 00:53:47,910 Zodra swap rendement dit geheugen is zo goed als verloren 844 00:53:47,910 --> 00:53:51,070 want zodra swap terug, het besturingssysteem 845 00:53:51,070 --> 00:53:54,190 vrij dat geheugen weer in de toekomst. 846 00:53:54,190 --> 00:53:58,870 Enige grote geheugen onderaan deze zogenaamde stack stokken rond. 847 00:53:58,870 --> 00:54:01,470 >> En dus hebben we eindelijk nu een werkende versie. 848 00:54:01,470 --> 00:54:06,310 Laat me gaan in swap.c, en let op het volgende. 849 00:54:06,310 --> 00:54:11,280 Aan de bovenkant van het programma dat ik heb mijn prototype te zijn int * a en int * b. 850 00:54:11,280 --> 00:54:15,000 Dus het enige wat ik veranderd te gaan van rood, wat slecht was, naar groen, wat goed is, 851 00:54:15,000 --> 00:54:17,350 wordt voegde ik deze sterren vandaag. 852 00:54:17,350 --> 00:54:21,520 Maar dan hier in te wisselen zich moest ik kopiëren, plakken wat was net op de dia. 853 00:54:21,520 --> 00:54:24,140 Ik heb een ster hier, ster hier - dat overeenkomt met het prototype - 854 00:54:24,140 --> 00:54:27,930 en dan al deze dingen hebben nu sterren, behalve voor tmp 855 00:54:27,930 --> 00:54:30,680 omdat het gebruik van een tijdelijke variabele, er is niets nieuws. 856 00:54:30,680 --> 00:54:33,040 Ik moet alleen tijdelijke opslag voor een int. 857 00:54:33,040 --> 00:54:34,820 Dus we daar geen behoefte aan een ster. 858 00:54:34,820 --> 00:54:39,310 We hoeven alleen maar de ster, zodat we dit soort willekeurige grens te overschrijden 859 00:54:39,310 --> 00:54:42,900 tussen deze 2 frames in het geheugen van mijn computer. 860 00:54:42,900 --> 00:54:45,630 Maar een ding moet veranderen, en je zou een glimp hebben opgevangen het al. 861 00:54:45,630 --> 00:54:48,810 Welke andere lijn is natuurlijk nu anders? >> [Student] & x. 862 00:54:48,810 --> 00:54:53,270 >> Ja, dus 25 is de laatste regel van code die ik moet veranderen om dit te laten werken. 863 00:54:53,270 --> 00:54:58,360 Een week geleden en zelfs op maandag lijn 25 zag er als volgt, ruilen x en y, 864 00:54:58,360 --> 00:55:02,020 en dit was gewoon kapot, want als je zegt swap (x, y) 865 00:55:02,020 --> 00:55:05,660 je geeft exemplaren van x en y te ruilen, dan is het aan het doen is zijn ding, 866 00:55:05,660 --> 00:55:09,080 maar je bent nooit echt veranderen x en y zelf. 867 00:55:09,080 --> 00:55:12,880 Dus zelfs als je nog nooit hebt gezien dit karakter voor met de ampersand in de code, 868 00:55:12,880 --> 00:55:15,860 gewoon een gok. Wat doet het en-teken blijkbaar doen,? 869 00:55:15,860 --> 00:55:17,890 [Student] stelt zich op het adres. >> Neemt het adres. 870 00:55:17,890 --> 00:55:21,160 Dus de ampersand zegt geef me het adres van x. 871 00:55:21,160 --> 00:55:25,590 Wie weet waar het is? Het gebeurt te zijn 123. Kan me niet schelen. Geef me het adres van x. 872 00:55:25,590 --> 00:55:28,340 & Y betekent geef me het adres van y. 873 00:55:28,340 --> 00:55:34,450 En op dat punt het verhaal is geheel in overeenstemming met het beeld dat we trokken even geleden. 874 00:55:34,450 --> 00:55:38,310 >> Dus ik geef toe pointers, zeker voor mij toen ik voor het eerst begonnen met het leren van deze, 875 00:55:38,310 --> 00:55:40,570 waren zeker een van de moeilijkste dingen in mijn ogen rond te wikkelen. 876 00:55:40,570 --> 00:55:43,760 Maar te realiseren, vooral omdat we blijven spelen met dit soort dingen, 877 00:55:43,760 --> 00:55:48,030 als je af te breken om deze super eenvoudige soort van intellectueel oninteressante problemen 878 00:55:48,030 --> 00:55:52,270 van slechts bewegende nummers rond, het antwoord op een hoop verwarring met verwijzingen 879 00:55:52,270 --> 00:55:56,590 echt kan worden afgeleid uit deze zeer eenvoudige mechanica. 880 00:55:56,590 --> 00:55:59,070 Hier is een adres. Ga er met de ster. 881 00:55:59,070 --> 00:56:03,830 Of omgekeerd, hier is een ampersand. Zoek uit wat het adres eigenlijk is. 882 00:56:03,830 --> 00:56:06,270 Oke. 883 00:56:06,270 --> 00:56:09,000 Dus waar is dit allemaal herinnering vandaan? 884 00:56:09,000 --> 00:56:12,360 We hebben getekend dit beeld een paar keer, en ik blijf veelbelovende komen we terug om het te, 885 00:56:12,360 --> 00:56:14,920 maar hier is de vertegenwoordiging van het geheugen van uw computer 886 00:56:14,920 --> 00:56:17,420 dat is een beetje meer gemerkte dan onze krijtbord hier is. 887 00:56:17,420 --> 00:56:21,590 De tekst segment boven vertegenwoordigt wat met betrekking tot uw programma? 888 00:56:21,590 --> 00:56:26,090 [Onverstaanbaar student reactie] >> Sorry? Zeg het nog eens. 889 00:56:26,090 --> 00:56:28,660 [Student] Het eigenlijke programma. >> Het actuele programma. 890 00:56:28,660 --> 00:56:32,430 >> Dus de 0s en 1s die u hebt samengesteld na het schrijven van C-code en vervolgens draait Clang 891 00:56:32,430 --> 00:56:35,910 en het genereren van 0s en 1s eindigt omhoog krijgend er verscholen in het geheugen 892 00:56:35,910 --> 00:56:38,570 want als u dubbelklikt op een pictogram op uw Mac of PC 893 00:56:38,570 --> 00:56:43,010 of uitvoeren van een commando als mario op uw prompt, uw 0s en 1s van schijf 894 00:56:43,010 --> 00:56:45,700 raken in het geheugen geladen, zodat de computer kan manipuleren 895 00:56:45,700 --> 00:56:47,540 en uitvoeren sneller. 896 00:56:47,540 --> 00:56:50,880 Dus geïnitialiseerd gegevens en niet-geïnitialiseerde data, zullen we niet veel praten over die, 897 00:56:50,880 --> 00:56:52,420 maar dat zijn slechts globale variabelen. 898 00:56:52,420 --> 00:56:54,710 Geïnitialiseerd betekent globale variabelen dat je waarden gaf aan; 899 00:56:54,710 --> 00:56:59,300 geïnitialiseerde betekent globale variabelen die u nog niet over waarden geven. 900 00:56:59,300 --> 00:57:01,900 Dan is er nog deze omgevingsvariabelen die ik mijn hand helemaal zwaaien op, 901 00:57:01,900 --> 00:57:04,860 maar ze zijn er en dat slaat dingen als uw gebruikersnaam 902 00:57:04,860 --> 00:57:08,090 en andere soort van lager niveau details. 903 00:57:08,090 --> 00:57:12,880 Maar de sappigste stukjes van lay-out uw geheugen is dit ding heet de stack en de heap. 904 00:57:12,880 --> 00:57:17,470 De stapel weer, om duidelijk te zijn, is het geheugen dat wordt gebruikt wanneer functies worden genoemd, 905 00:57:17,470 --> 00:57:19,710 wanneer er lokale variabelen 906 00:57:19,710 --> 00:57:22,120 en wanneer er parameters worden doorgegeven rond. 907 00:57:22,120 --> 00:57:24,490 Dat alles gebeurt in de stapel. 908 00:57:24,490 --> 00:57:29,570 De hoop dat we nog niet over gesproken, maar neem een ​​gok die gebruik maakt van de heap. 909 00:57:31,120 --> 00:57:32,690 Gewoon een ander stuk van het geheugen. 910 00:57:32,690 --> 00:57:36,620 Het gebeurt hier worden getrokken aan de top, maar dat is een willekeurige picturale conventie. 911 00:57:36,620 --> 00:57:41,670 Wie heeft blijkbaar zijn met behulp van het geheugen van de hoop voor weken? 912 00:57:41,670 --> 00:57:44,830 Het is technisch gezien je maar indirect. >> [Student] GetString. 913 00:57:44,830 --> 00:57:47,950 GetString en malloc. Dus hier is het fundamentele verschil. 914 00:57:47,950 --> 00:57:51,300 >> Je weet wel voor de laatste paar weken, dat als u het geheugen gewoon een variabele te verklaren. 915 00:57:51,300 --> 00:57:54,560 Als u veel geheugen, een array declareren recht binnenkant van je functie. 916 00:57:54,560 --> 00:57:59,620 Maar het probleem dat we hebben gehouden met uitzicht is als je variabelen op lokaal binnenkant van functies, 917 00:57:59,620 --> 00:58:05,340 zodra de functie terugkeert, wat gebeurt er met het geheugen en die variabelen? 918 00:58:05,340 --> 00:58:09,620 Gewoon soort van het is niet meer van jou, toch? Het verdwijnt gewoon soort van conceptueel. 919 00:58:09,620 --> 00:58:13,950 Het is nog steeds fysiek aanwezig, natuurlijk, maar het is niet langer een recht van gebruik. 920 00:58:13,950 --> 00:58:17,160 Dit is natuurlijk een probleem als je wilt functies in het leven schrijven 921 00:58:17,160 --> 00:58:20,440 die daadwerkelijk geheugen toewijzen en geef het niet onmiddellijk terug. 922 00:58:20,440 --> 00:58:24,180 Case in point: GetString's doel in het leven is dat er geen idee van te voren 923 00:58:24,180 --> 00:58:26,390 hoe groot van een string Ik ga te typen op het toetsenbord, 924 00:58:26,390 --> 00:58:30,390 maar het moet in staat zijn om geheugen toe te wijzen aan David of hallo te houden 925 00:58:30,390 --> 00:58:32,860 of een hele essay dat de gebruiker zou kunnen hebben getypt inch 926 00:58:32,860 --> 00:58:35,280 Dus GetString is met behulp van malloc. 927 00:58:35,280 --> 00:58:38,910 Malloc moet dus worden met behulp van niet de stapel; 928 00:58:38,910 --> 00:58:40,770 in plaats daarvan is het gebruik van dit ding genaamd de heap. 929 00:58:40,770 --> 00:58:44,430 Er is niets anders aan het geheugen. Het is niet sneller of langzamer of iets dergelijks. 930 00:58:44,430 --> 00:58:46,570 Het is gewoon fysiek op een andere locatie. 931 00:58:46,570 --> 00:58:50,120 >> Maar de regel is dat het geheugen dat is toegewezen op de heap 932 00:58:50,120 --> 00:58:56,180 zal nooit worden genomen van u af totdat je belt - neem een ​​gok - gratis. 933 00:58:56,180 --> 00:59:00,510 Daarentegen zou de eventuele geheugen je vragen om op de stapel door gewoon te verklaren een array 934 00:59:00,510 --> 00:59:03,320 of waarbij een variabele zoals we hebben gedaan voor weken, 935 00:59:03,320 --> 00:59:05,640 dat standaard belandt op de stapel. 936 00:59:05,640 --> 00:59:09,550 En dat werkt geweldig 90% van de tijd, maar op die zeldzamer gelegenheden 937 00:59:09,550 --> 00:59:12,470 waar u wilt geheugen toe te wijzen en te houden rond, 938 00:59:12,470 --> 00:59:14,730 dan moet je een functie als malloc gebruikt. 939 00:59:14,730 --> 00:59:19,370 Of hebben we een functie zoals GetString, die op zijn beurt malloc. 940 00:59:19,370 --> 00:59:23,300 Laten we eens kijken waar dit zou kunnen breken en neem dan een kijkje op Binky. 941 00:59:23,300 --> 00:59:25,820 We komen terug naar dat in de toekomst. 942 00:59:25,820 --> 00:59:29,270 Hier is een super eenvoudig programma dat in de eerste 2 lijnen doet wat? 943 00:59:29,270 --> 00:59:33,460 In het Engels, wat deze eerste 2 regels code doen binnen van de belangrijkste? 944 00:59:33,460 --> 00:59:35,600 [Onverstaanbaar student reactie] 945 00:59:35,600 --> 00:59:37,880 Voorzichtig. Het maakt me niet het adres van x of y. 946 00:59:37,880 --> 00:59:41,840 [Student] Geeft verwijzingen naar ints. >> Goed. Geef me 2 pointers naar gehele getallen. 947 00:59:41,840 --> 00:59:45,130 Met andere woorden, geef me 2 delen van het geheugen dat ik blijf tekenen vandaag de dag, 948 00:59:45,130 --> 00:59:46,950 hoewel ik gewist het nu, als pleinen. 949 00:59:46,950 --> 00:59:50,000 Geef me 2 delen van het geheugen, een x genoemd, een naam y - 950 00:59:50,000 --> 00:59:54,320 eerder noemde ik ze s en t - en wat is het type van dat stuk van het geheugen? 951 00:59:54,320 --> 00:59:57,160 Het gaat om een ​​adres op te slaan. 952 00:59:57,160 --> 00:59:59,110 Het is van het type int *. 953 00:59:59,110 --> 01:00:01,630 >> Dus het adres van een int zal uiteindelijk wonen in x, 954 01:00:01,630 --> 01:00:03,860 het adres van een int uiteindelijk leven y, 955 01:00:03,860 --> 01:00:08,460 maar in eerste instantie, wat er in x en y? Wie weet? Garbage waarden. 956 01:00:08,460 --> 01:00:10,180 Het heeft niets te maken met pointers. 957 01:00:10,180 --> 01:00:12,720 Als we niet plaatsen daar iets, wie weet wat is er eigenlijk? 958 01:00:12,720 --> 01:00:18,950 Nu x. Wat gebeurt er hier? Dit is legit nu omdat x is een pointer. Het is een int *. 959 01:00:18,950 --> 01:00:21,870 Dus dat betekent dat ik kan zetten in x het adres van sommige brok van het geheugen. 960 01:00:21,870 --> 01:00:25,120 Wat doet malloc terug? Perfect, keert het terug adressen, 961 01:00:25,120 --> 01:00:28,510 het adres van de eerste byte in een heel blok geheugen. 962 01:00:28,510 --> 01:00:31,140 Hoeveel bytes deze schijnbaar verdeling bijvoorbeeld in het apparaat? 963 01:00:31,140 --> 01:00:33,510 Wat is de grootte van een int? 4. 964 01:00:33,510 --> 01:00:36,600 Als je terugdenkt aan week 1, het is niet super belangrijk om altijd onthouden dat, 965 01:00:36,600 --> 01:00:38,870 maar in dit geval is het nuttig te weten 4 bytes. 966 01:00:38,870 --> 01:00:41,770 Dit is dus de verdeling op de heap 4 bytes 967 01:00:41,770 --> 01:00:46,110 en het is terug te keren het adres van de eerste die mij willekeurig. 968 01:00:46,110 --> 01:00:47,700 Nu, wat is x aan het doen? 969 01:00:47,700 --> 01:00:52,200 A * x = 42 doet wat? 970 01:00:52,200 --> 01:00:57,150 Als op dit punt in het verhaal hebben we x, die ongeveer zo uitziet met een aantal vuilnis waarde, 971 01:00:57,150 --> 01:01:04,120 dit is nu y met een aantal vuilnis waarde, nu in regel 3 Ik heb 4 bytes toegewezen. 972 01:01:04,120 --> 01:01:06,950 Deze foto ziet er in wezen als volgt. 973 01:01:06,950 --> 01:01:12,010 Of meer specifiek, als dit is willekeurig adres 123, dit is wat ons verhaal nu eruit ziet. 974 01:01:12,010 --> 01:01:23,940 * X = 42 betekent nu wat? Dat betekent dat naar het adres 123 en zet de nummer 42 daar. 975 01:01:23,940 --> 01:01:26,220 Ik hoef niet om deze lijnen te trekken omdat we niet doen snaren. 976 01:01:26,220 --> 01:01:29,480 >> Ik had net geschreven als dit, en net voor de demonstratie ter wille, 977 01:01:29,480 --> 01:01:33,240 42 als een soort int neemt veel ruimte 4 bytes. 978 01:01:33,240 --> 01:01:35,960 Dus dat is wat er gebeurd is, maar er is een probleem nu. 979 01:01:35,960 --> 01:01:40,580 * Y = 13. Wat gaat er hier gebeuren? 980 01:01:40,580 --> 01:01:46,470 Het probleem is * y in onze vereenvoudigde wereld betekent gewoon naar het adres in y. 981 01:01:46,470 --> 01:01:48,590 Wat zit er in y? Het is wat vuilnis waarde. 982 01:01:48,590 --> 01:01:53,150 Dus laten we aannemen dat die troep waarde is 5551212, iets geks dergelijks. 983 01:01:53,150 --> 01:01:56,750 * Y middelen gaan naar 5551212 te pakken. 984 01:01:56,750 --> 01:02:00,450 Dat is hier graag over. Het niet bestaat bijvoorbeeld. 985 01:02:00,450 --> 01:02:05,310 Dus * y krijgt 13 betekent dat ik ben op zoek naar hier te trekken 13. Het bestaat niet. 986 01:02:05,310 --> 01:02:08,790 Ik heb meer dan het segment van het bord. Wat krijg ik? 987 01:02:08,790 --> 01:02:14,930 Dat cryptische boodschap segmentation fault omdat ik probeer te zetten in het geheugen 988 01:02:14,930 --> 01:02:19,470 een waarde als 13 op een plaats die niet bestaat. 989 01:02:19,470 --> 01:02:23,900 De rest van het programma kan oke, maar werken tot dat moment niet. 990 01:02:23,900 --> 01:02:25,350 Dus laten we proberen om dit verhaal te vertellen. 991 01:02:25,350 --> 01:02:27,830 We komen terug naar dat zodra we over gesproken hebben hex. 992 01:02:27,830 --> 01:02:30,290 Laten we terug gaan naar dit en sluiten met dit ding heet Binky, 993 01:02:30,290 --> 01:02:33,710 die recall is een Stanford professor om thuis te zitten spelen met claymation, 994 01:02:33,710 --> 01:02:36,380 om het verhaal van precies dat hetzelfde programma vertellen. 995 01:02:36,380 --> 01:02:40,580 Het is gewoon ongeveer 3 minuten lang. Hier hebben we Binky. 996 01:02:40,580 --> 01:02:45,030 [Mannelijke spreker op video] Hey Binky, wakker worden. Het is tijd voor pointer plezier. 997 01:02:45,030 --> 01:02:50,080 [Binky] Wat is dat? Meer informatie over pointers? Oh, goody! 998 01:02:50,080 --> 01:02:53,700 [Mannelijke spreker] Nou, om te beginnen, ik denk dat we gaan een paar pointers nodig hebben. 999 01:02:53,700 --> 01:02:57,890 >> [Binky] Oke. Deze code wijst 2 pointers die kunnen wijzen op gehele getallen. 1000 01:02:57,890 --> 01:03:02,220 [Mannelijke spreker] Oke. Nou, ik zie de 2 pointers, maar ze lijken niet te wijzen naar iets. 1001 01:03:02,220 --> 01:03:05,550 [Binky] Dat klopt. In eerste instantie denk pointers wijzen niet op iets. 1002 01:03:05,550 --> 01:03:09,270 De dingen die ze wijzen op heten pointees, en de inrichting daarvan is een aparte stap. 1003 01:03:09,270 --> 01:03:12,330 [Mannelijke spreker] Oh, rechts, rechts. Ik wist dat. De pointees zijn gescheiden. 1004 01:03:12,330 --> 01:03:15,630 Eh, dus hoe weet je kennen een pointee? 1005 01:03:15,630 --> 01:03:21,510 [Binky] Oke. Deze code wijst een nieuwe integer pointee, en dit deel stelt x daarnaar verwijzen. 1006 01:03:21,510 --> 01:03:23,500 [Mannelijke spreker] He, dat ziet er beter uit. 1007 01:03:23,500 --> 01:03:26,030 Dus maak er iets doen. >> [Binky] Oke. 1008 01:03:26,030 --> 01:03:30,300 Ik zal dereference de aanwijzer x om het nummer 42 te slaan in zijn pointee. 1009 01:03:30,300 --> 01:03:34,410 Voor deze truc heb ik nodig mijn toverstaf van dereferentie. 1010 01:03:34,410 --> 01:03:38,610 [Mannelijke spreker] Uw toverstaf van dereferentie? Dat is geweldig. 1011 01:03:38,610 --> 01:03:44,230 [Binky] Dit is wat de code eruit ziet. Ik zal gewoon het opzetten van de aantal en ... [Knallend geluid] 1012 01:03:44,230 --> 01:03:46,100 [Mannelijke spreker] kijken He, daar gaat. 1013 01:03:46,100 --> 01:03:50,990 Dus het doen van een dereference op x volgt de pijl om toegang te krijgen haar pointee, 1014 01:03:50,990 --> 01:03:53,230 in dit geval tot 42 slaan daar. 1015 01:03:53,230 --> 01:03:57,630 He, probeer dan met behulp van het aan de nummer 13 op te slaan door de andere wijzer, y. 1016 01:03:57,630 --> 01:04:03,250 [Binky] Oke. Ik zal gewoon hier gaan over naar y en krijg het nummer 13 opgericht 1017 01:04:03,250 --> 01:04:08,360 en neem de staf van dereferentie en gewoon ... [Zoemend geluid] Whoa! 1018 01:04:08,360 --> 01:04:10,980 [Mannelijke spreker] Oh hey, dat werkte niet. 1019 01:04:10,980 --> 01:04:14,870 >> Binky Zeg, ik denk niet dat dereferentie y is een goed idee 1020 01:04:14,870 --> 01:04:17,880 omdat het opzetten van de pointee is een aparte stap 1021 01:04:17,880 --> 01:04:19,850 en ik denk niet dat we ooit deden. 1022 01:04:19,850 --> 01:04:21,770 [Binky] Hmm, goed punt. 1023 01:04:21,770 --> 01:04:26,640 [Mannelijke spreker] Ja. We toegewezen de aanwijzer y maar we nooit stel deze te wijzen op een pointee. 1024 01:04:26,640 --> 01:04:28,780 [Binky] Hmm, zeer oplettend. 1025 01:04:28,780 --> 01:04:30,690 [Mannelijke spreker] He, je ziet er goed uit daar, Binky. 1026 01:04:30,690 --> 01:04:34,160 Kunt u dit oplossen dat y verwijst naar dezelfde pointee als x? >> [Binky] Tuurlijk. 1027 01:04:34,160 --> 01:04:37,100 Ik gebruik mijn toverstaf van pointer opdracht. 1028 01:04:37,100 --> 01:04:39,070 [Mannelijke spreker] Is dat gaat een probleem als voorheen zijn? 1029 01:04:39,070 --> 01:04:40,840 [Binky] Nee, dit is niet aan de pointees. 1030 01:04:40,840 --> 01:04:44,780 Het verandert slechts een pointer te wijzen op hetzelfde als een ander. [Knallend geluid] 1031 01:04:44,780 --> 01:04:48,570 [Mannelijke spreker] Oh, ik zie. Nu y wijst op dezelfde plaats als x. 1032 01:04:48,570 --> 01:04:51,140 Dus wacht. Nu y staat vast. Het heeft een pointee. 1033 01:04:51,140 --> 01:04:54,520 Dus je kunt proberen de staf van dereferentie weer naar de 13 over te sturen. 1034 01:04:54,520 --> 01:04:58,130 [Binky] Uh, oke. Hier gaat. [Knallend geluid] 1035 01:04:58,130 --> 01:05:01,250 [Mannelijke spreker] He, kijk daar eens. Nu dereferentie werken op y. 1036 01:05:01,250 --> 01:05:05,200 En omdat de wijzers van het delen van die ene pointee, ze beide zien de 13. 1037 01:05:05,200 --> 01:05:06,910 [Binky] Ja, het delen. Het zal wel. 1038 01:05:06,910 --> 01:05:08,880 >> Dus gaan we nu overschakelen plaatsen? 1039 01:05:08,880 --> 01:05:11,420 [Mannelijke spreker] Oh kijk, we hebben geen tijd meer. >> [Binky] Maar - 1040 01:05:11,420 --> 01:05:13,880 [Mannelijke spreker] Vergeet de 3 pointer regels. 1041 01:05:13,880 --> 01:05:18,630 Nummer 1, de basisstructuur is dat je een pointer hebben en het wijst naar een pointee. 1042 01:05:18,630 --> 01:05:23,120 Maar de aanwijzer en pointee zijn gescheiden, en de veel voorkomende fout is het opzetten van een pointer 1043 01:05:23,120 --> 01:05:25,680 maar om te vergeten om het een pointee. 1044 01:05:25,680 --> 01:05:29,580 Nummer 2, wijzer dereferentie begint bij de aanwijzer en volgt de pijl boven 1045 01:05:29,580 --> 01:05:31,060 zijn pointee openen. 1046 01:05:31,060 --> 01:05:34,340 Zoals we allemaal weten, dit werkt alleen als er een pointee, 1047 01:05:34,340 --> 01:05:36,460 wat voor soort komt terug naar regel nummer 1. 1048 01:05:36,460 --> 01:05:39,870 Nummer 3, wijzer opdracht neemt een pointer en verandert het 1049 01:05:39,870 --> 01:05:42,390 om naar dezelfde pointee als een pointer. 1050 01:05:42,390 --> 01:05:45,890 Dus na de opdracht, zal de 2 pointers naar dezelfde pointee. 1051 01:05:45,890 --> 01:05:47,800 Soms is dat heet delen. 1052 01:05:47,800 --> 01:05:50,910 >> En dat is alles wat er is het echt. Bye-bye nu. 1053 01:05:50,910 --> 01:05:55,840 Dit is Binky. Dit is CS50. We zien je volgende week. [Applaus] 1054 01:05:55,840 --> 01:05:59,000 >> [CS50.TV]