1 00:00:00,000 --> 00:00:11,320 2 00:00:11,320 --> 00:00:13,260 >> DAVID MALAN: Hallo, en welkom terug naar CS50. 3 00:00:13,260 --> 00:00:14,860 Dus dit is het einde van de week vier. 4 00:00:14,860 --> 00:00:16,680 Slechts een aankondiging eerste. 5 00:00:16,680 --> 00:00:19,600 Dus de zogenaamde vijfde maandag is er deze komende maandag. 6 00:00:19,600 --> 00:00:22,800 Dit is de mogelijkheid om te veranderen van SAT / unsat om een ​​letter of uit 7 00:00:22,800 --> 00:00:24,130 brievenrang SAT / unsat. 8 00:00:24,130 --> 00:00:27,130 Vervelend, dat proces vereist een handtekening, want u moet invullen 9 00:00:27,130 --> 00:00:28,770 uit een van die roze add / drop vormen. 10 00:00:28,770 --> 00:00:31,680 >> Omdat technisch gezien, de SAT / unsat versie en de brievenrang versie 11 00:00:31,680 --> 00:00:33,320 hebben verschillende catalogusnummers. 12 00:00:33,320 --> 00:00:34,240 Maar geen big deal. 13 00:00:34,240 --> 00:00:36,620 Kom gewoon naar me toe of naar Rob of naar Lauren op elk punt. 14 00:00:36,620 --> 00:00:39,550 Of mail ons als u niet het soort hebben papierwerk u vandaag nodig hebt, en wij 15 00:00:39,550 --> 00:00:43,410 zal zeker helpen u zorg dat vóór maandag. 16 00:00:43,410 --> 00:00:45,780 >> Oke, dus vandaag - 17 00:00:45,780 --> 00:00:47,630 Eigenlijk is er een beetje een echo. 18 00:00:47,630 --> 00:00:51,070 Kunnen we toon me een beetje? 19 00:00:51,070 --> 00:00:51,730 OK. 20 00:00:51,730 --> 00:00:54,850 Dus vandaag introduceren we een onderwerp bekend als pointers. 21 00:00:54,850 --> 00:00:57,770 En ik geef toe dat dit een van de meer complexe onderwerpen die we geneigd zijn te 22 00:00:57,770 --> 00:01:00,960 dekken in deze klasse, of eigenlijk elke inleidende cursus die C. gebruikt 23 00:01:00,960 --> 00:01:05,510 >> Maar neem mijn woord te geloven, vooral als je geest voelt een beetje meer gebogen 24 00:01:05,510 --> 00:01:07,100 vandaag en in de komende weken. 25 00:01:07,100 --> 00:01:10,340 Het is niet representatief van u krijgen slechter bij deze het betekent alleen dat 26 00:01:10,340 --> 00:01:13,360 het is een bijzonder verfijnde onderwerp dat beloof ik, een paar weken 27 00:01:13,360 --> 00:01:17,610 dus zal lijken al te opvallend eenvoudig achteraf. 28 00:01:17,610 --> 00:01:18,720 >> Ik herinner me nog aan deze dag. 29 00:01:18,720 --> 00:01:22,190 Ik zat in Elliott Dining Hall, zat naast mijn TF Nishat Mehta, 30 00:01:22,190 --> 00:01:24,070 die was een inwoner van Elliott huis. 31 00:01:24,070 --> 00:01:26,340 En om wat voor reden dan ook, dit onderwerp gewoon klikt. 32 00:01:26,340 --> 00:01:29,430 Dat wil zeggen dat ik ook worstelde met het voor een bepaalde hoeveelheid tijd, maar ik 33 00:01:29,430 --> 00:01:33,610 zal mijn best doen om te helpen voorkomen dat een dergelijke worstelen met een onderwerp dat uiteindelijk 34 00:01:33,610 --> 00:01:34,580 is vrij krachtig. 35 00:01:34,580 --> 00:01:37,350 >> In feite, een van de onderwerpen die we zullen bespreken in de komende weken is dat 36 00:01:37,350 --> 00:01:41,130 van veiligheid, en hoe kun je eigenlijk machines te exploiteren op een wijze 37 00:01:41,130 --> 00:01:42,320 die niet bedoeld waren. 38 00:01:42,320 --> 00:01:45,850 En die exploitaties zijn typisch het gevolg van bugs, fouten die we 39 00:01:45,850 --> 00:01:49,740 mensen maken door niet te begrijpen van een aantal van de onderliggende implementatie 40 00:01:49,740 --> 00:01:52,250 gegevens via welke programma's worden gemaakt. 41 00:01:52,250 --> 00:01:55,410 >> Nu om dit te maken lijken des te meer gebruikersvriendelijk vriendelijk, ik dacht dat ik speel een 10 42 00:01:55,410 --> 00:01:59,680 tweede voorbeeld van een kleine claymation figuur genaamd Binky die om werd gebracht 43 00:01:59,680 --> 00:02:03,020 het leven door een vriend van ons in Stanford, professor Nick Parlante. 44 00:02:03,020 --> 00:02:06,753 Dus laat ik u dit geven teaser van Binky hier. 45 00:02:06,753 --> 00:02:09,520 >> [VIDEO AFSPELEN] 46 00:02:09,520 --> 00:02:10,380 >> -He, Binky. 47 00:02:10,380 --> 00:02:11,050 Wakker worden. 48 00:02:11,050 --> 00:02:13,610 Het is tijd voor pointer lol. 49 00:02:13,610 --> 00:02:14,741 >> -Wat is dat? 50 00:02:14,741 --> 00:02:16,440 Meer informatie over pointers? 51 00:02:16,440 --> 00:02:17,928 Oh, goodie. 52 00:02:17,928 --> 00:02:18,920 >> [END VIDEO AFSPELEN] 53 00:02:18,920 --> 00:02:20,670 >> DAVID Malan: Dat is Stanford computer science. 54 00:02:20,670 --> 00:02:23,194 Dus meer op die te komen. 55 00:02:23,194 --> 00:02:24,930 >> [Applaus] 56 00:02:24,930 --> 00:02:26,660 >> DAVID MALAN: Sorry, Nick. 57 00:02:26,660 --> 00:02:30,680 >> Zo herinneren dat vorige keer dat we eindigden op dit is echt spannende cliffhanger 58 00:02:30,680 --> 00:02:32,960 waarbij deze functie gewoon niet werken. 59 00:02:32,960 --> 00:02:34,960 Tenminste intuïtief, het voelde zoals het zou moeten werken. 60 00:02:34,960 --> 00:02:37,600 Gewoon omwisselen van de waarden twee integers. 61 00:02:37,600 --> 00:02:40,915 Maar herinneren dat toen we uitgeprint de oorspronkelijke waarden in de belangrijkste, een en 62 00:02:40,915 --> 00:02:44,210 twee, waren ze nog een en twee en niet twee en een. 63 00:02:44,210 --> 00:02:46,070 >> Dus laat me eigenlijk schakelen naar het apparaat. 64 00:02:46,070 --> 00:02:50,180 En ik schreef een stukje van het skelet code in hier vooruit te gaan, waar ik beweren dat x 65 00:02:50,180 --> 00:02:52,500 zal zijn 1, zal y zijn 2. 66 00:02:52,500 --> 00:02:54,810 Ik vervolgens uitprinten allebei van hun waarden met print f. 67 00:02:54,810 --> 00:02:57,540 >> Ik eis dan hier beneden die we gaan om ze te verwisselen. 68 00:02:57,540 --> 00:03:00,800 Ik liet een lege plek hier voor ons om in vandaag invullen in slechts een moment. 69 00:03:00,800 --> 00:03:03,380 Dan, ga ik om te beweren dat de twee variabelen zijn verwisseld. 70 00:03:03,380 --> 00:03:04,770 Dan ga ik om af te drukken ze er weer. 71 00:03:04,770 --> 00:03:07,090 En dus hopelijk, zou ik zie 1, 2. 72 00:03:07,090 --> 00:03:07,380 2, 1. 73 00:03:07,380 --> 00:03:09,830 Dat is het super simpel doel nu. 74 00:03:09,830 --> 00:03:12,430 >> Dus hoe gaan we over het ruilen twee variabelen? 75 00:03:12,430 --> 00:03:17,220 Nou als ik hier stel voor dat deze bekers misschien in een computer geheugen vertegenwoordigen. 76 00:03:17,220 --> 00:03:19,070 Dit is een paar happen, dit is een ander paar happen. 77 00:03:19,070 --> 00:03:23,260 Konden we een vrijwilliger zijn gekomen op en Meng ons wat te drinken, als je bekend voor? 78 00:03:23,260 --> 00:03:23,920 Kom maar naar boven. 79 00:03:23,920 --> 00:03:24,815 Wat is je naam? 80 00:03:24,815 --> 00:03:25,260 >> JESS: Jess. 81 00:03:25,260 --> 00:03:25,690 >> DAVID Malan: Jess? 82 00:03:25,690 --> 00:03:26,540 Kom op, Jess. 83 00:03:26,540 --> 00:03:29,180 Als je het niet erg, we moeten het zetten Google Glass on you so we can 84 00:03:29,180 --> 00:03:30,430 onsterfelijk dit. 85 00:03:30,430 --> 00:03:32,800 86 00:03:32,800 --> 00:03:34,670 OK, glas. 87 00:03:34,670 --> 00:03:37,250 Een video opnemen. 88 00:03:37,250 --> 00:03:43,103 En OK, we zijn goed om te gaan met Jess hier. 89 00:03:43,103 --> 00:03:43,810 Oke. 90 00:03:43,810 --> 00:03:45,120 Leuk u te ontmoeten. 91 00:03:45,120 --> 00:03:47,720 >> Dus wat ik zou willen dat je hier te doen - als je kon, vrij snel - 92 00:03:47,720 --> 00:03:51,040 net giet ons een half glas jus sap en een half glas melk, 93 00:03:51,040 --> 00:03:55,710 die effectief de nummers 1 in een beker en 2 in de andere beker. 94 00:03:55,710 --> 00:04:01,380 95 00:04:01,380 --> 00:04:02,630 >> Dit gaat goed beeldmateriaal te zijn. 96 00:04:02,630 --> 00:04:04,910 97 00:04:04,910 --> 00:04:05,860 >> JESS: Sorry. 98 00:04:05,860 --> 00:04:06,330 >> DAVID MALAN: Nee, nee. 99 00:04:06,330 --> 00:04:08,703 Het is OK. 100 00:04:08,703 --> 00:04:10,120 Leuk. 101 00:04:10,120 --> 00:04:12,950 Oke, dus we hebben vier bytes ter waarde van sinaasappelsap. 102 00:04:12,950 --> 00:04:14,460 We zullen noemde het de waarde 1. 103 00:04:14,460 --> 00:04:16,579 Nu nog eens vier bytes met melk. 104 00:04:16,579 --> 00:04:18,519 Zal noemen het waarderen 2. 105 00:04:18,519 --> 00:04:20,440 Zodat x en y, respectievelijk. 106 00:04:20,440 --> 00:04:23,450 >> Oke, dus nu als de taak bij de hand - voor u, Jess, voor alle 107 00:04:23,450 --> 00:04:24,270 van je klasgenoten - 108 00:04:24,270 --> 00:04:28,510 is de waarden van x en y zodanig verwisselen dat we willen dat de jus d'orange in de 109 00:04:28,510 --> 00:04:32,070 andere beker en de melk in de beker, hoe zou u - voordat u daadwerkelijk doen 110 00:04:32,070 --> 00:04:34,020 het - dat doen? 111 00:04:34,020 --> 00:04:35,220 >> OK, wijs besluit. 112 00:04:35,220 --> 00:04:36,340 Dus je moet een beetje meer geheugen. 113 00:04:36,340 --> 00:04:38,190 Dus laten we wijzen een tijdelijk cup, als je wil. 114 00:04:38,190 --> 00:04:40,540 En nu verder met x-en y-swap. 115 00:04:40,540 --> 00:04:52,950 116 00:04:52,950 --> 00:04:53,530 >> Excellent. 117 00:04:53,530 --> 00:04:54,420 Dus heel goed gedaan. 118 00:04:54,420 --> 00:04:55,670 Dankuwel, Jess. 119 00:04:55,670 --> 00:04:59,520 120 00:04:59,520 --> 00:05:00,020 Alstublieft. 121 00:05:00,020 --> 00:05:01,950 Een beetje souvenir. 122 00:05:01,950 --> 00:05:04,350 >> OK, dus uiteraard, super simpel idee. 123 00:05:04,350 --> 00:05:07,500 Volkomen intuïtief dat we een beetje nodig meer opslagruimte - in deze vorm, 124 00:05:07,500 --> 00:05:09,750 een kop - als we eigenlijk willen swap deze twee variabelen. 125 00:05:09,750 --> 00:05:11,110 Dus laten we doen precies dat. 126 00:05:11,110 --> 00:05:14,330 Hier in tussen waar ik beweer ik ben gaat doen wat ruilen, ik zal 127 00:05:14,330 --> 00:05:15,720 ga je gang en verklaren temp. 128 00:05:15,720 --> 00:05:17,980 En ik stel deze gelijk is aan, zeg, x. 129 00:05:17,980 --> 00:05:21,110 >> Dan ga ik de waarde van de te wijzigen x net als Jess deed hier met de 130 00:05:21,110 --> 00:05:23,200 melk en jus d'orange zijn gelijk aan y. 131 00:05:23,200 --> 00:05:27,460 En ik ga y te veranderen gelijk te zijn om niet x, omdat we nu zouden zijn 132 00:05:27,460 --> 00:05:29,530 vast in een cirkel, maar temp. 133 00:05:29,530 --> 00:05:33,170 Waar ik tijdelijk - of waar Jess het sinaasappelsap tijdelijk gezet 134 00:05:33,170 --> 00:05:35,460 vóór beuken dat cup met de melk. 135 00:05:35,460 --> 00:05:37,250 >> Dus laat me nu ga je gang en maken dit. 136 00:05:37,250 --> 00:05:39,210 Het noswap.c heet. 137 00:05:39,210 --> 00:05:41,190 En nu laat ik geen swap draaien. 138 00:05:41,190 --> 00:05:43,910 En inderdaad zie ik, als ik het uitbreiden van de raam een ​​beetje, dat 139 00:05:43,910 --> 00:05:45,160 x is 1, y is 2. 140 00:05:45,160 --> 00:05:47,230 En dan x is 2, y is 1. 141 00:05:47,230 --> 00:05:51,910 >> Maar herinneren dat op maandag we deden dingen een beetje anders, waarbij ik 142 00:05:51,910 --> 00:05:56,760 plaats implementeerde een helper functie, als je wil, dat was eigenlijk nietig. 143 00:05:56,760 --> 00:05:58,010 Ik noemde het ruilen. 144 00:05:58,010 --> 00:06:01,600 Ik gaf het twee parameters, en ik riep ze een en ik riep hen b. 145 00:06:01,600 --> 00:06:04,380 >> Eerlijk gezegd, ik kon ze x-en y noemen. 146 00:06:04,380 --> 00:06:06,040 Er is niets te stoppen me uit dat te doen. 147 00:06:06,040 --> 00:06:08,140 Maar ik zou zeggen dat het dan een beetje dubbelzinnig. 148 00:06:08,140 --> 00:06:11,910 Omdat terugroepactie voor maandag dat we beweerde dat deze parameters waren 149 00:06:11,910 --> 00:06:13,650 kopieën van de waarden doorgegeven inch 150 00:06:13,650 --> 00:06:15,640 Dus het is alleen knoeit met uw gedachten, denk ik, als je gebruik maakt 151 00:06:15,640 --> 00:06:17,370 dezelfde variabelen. 152 00:06:17,370 --> 00:06:20,150 >> Dus ik zal hen een plaats te bellen en b, gewoon voor de duidelijkheid. 153 00:06:20,150 --> 00:06:21,840 Maar we konden hen het meest bellen wat we willen. 154 00:06:21,840 --> 00:06:26,280 En ik ga om te kopiëren en plakken effectief deze code van daarboven 155 00:06:26,280 --> 00:06:27,170 beneden in hier. 156 00:06:27,170 --> 00:06:29,110 Want ik zag gewoon dat het werkt. 157 00:06:29,110 --> 00:06:30,790 Dus dat is in vrij goede vorm. 158 00:06:30,790 --> 00:06:37,390 En ik zal mijn x veranderen in een, mijn x een, mijn y naar b en mijn y naar b. 159 00:06:37,390 --> 00:06:39,130 >> Dus met andere woorden, precies dezelfde logica. 160 00:06:39,130 --> 00:06:40,850 Precies hetzelfde dat Jess deed. 161 00:06:40,850 --> 00:06:44,350 En dan is het enige wat ik moet doen omhoog hier natuurlijk nu dit beroep 162 00:06:44,350 --> 00:06:45,990 functie, of bel deze functie. 163 00:06:45,990 --> 00:06:50,430 Dus ik zal deze functie met twee bellen ingangen, x en y, en hit Opslaan. 164 00:06:50,430 --> 00:06:52,300 >> Oke, zo fundamenteel hetzelfde. 165 00:06:52,300 --> 00:06:55,570 In feite heb ik waarschijnlijk maakte het programma onnodig complex door 166 00:06:55,570 --> 00:07:00,820 het schrijven van een functie die net is het nemen ongeveer zes regels code terwijl ik 167 00:07:00,820 --> 00:07:02,970 eerder had uitgevoerd dit in slechts drie. 168 00:07:02,970 --> 00:07:06,230 >> Dus laat me nu ga je gang en remake deze, maken geen swap. 169 00:07:06,230 --> 00:07:07,920 Oke, ik geschroefd hier boven. 170 00:07:07,920 --> 00:07:11,290 Dit moet een fout zijn dat je misschien zie steeds algemeen als uw 171 00:07:11,290 --> 00:07:12,380 programma's steeds complexer. 172 00:07:12,380 --> 00:07:13,470 Maar er is een makkelijke oplossing. 173 00:07:13,470 --> 00:07:15,650 Laat me terugbladeren hier. 174 00:07:15,650 --> 00:07:18,190 >> En wat is de eerste fout zie ik? 175 00:07:18,190 --> 00:07:19,520 Impliciete verklaring. 176 00:07:19,520 --> 00:07:21,466 Wat betekent dat er meestal op wijst? 177 00:07:21,466 --> 00:07:22,830 Oh, ik vergat het prototype. 178 00:07:22,830 --> 00:07:26,900 Ik vergat om de compiler te leren dat swap gaat bestaan, ook al is hij 179 00:07:26,900 --> 00:07:28,920 bestaat niet in het prille begin van het programma. 180 00:07:28,920 --> 00:07:35,780 Dus ik ga gewoon zeggen leegte, swap, int, een int b, puntkomma. 181 00:07:35,780 --> 00:07:37,280 >> Dus ik ben niet van plan om het te herimplementeren. 182 00:07:37,280 --> 00:07:39,140 Maar nu dit overeenkomt met wat is hier beneden. 183 00:07:39,140 --> 00:07:42,530 En merk op, het ontbreken van een puntkomma hier, die niet noodzakelijk wanneer 184 00:07:42,530 --> 00:07:43,200 uitvoering. 185 00:07:43,200 --> 00:07:46,010 >> Dus laat ik deze remake, maken geen swap. 186 00:07:46,010 --> 00:07:46,910 Een veel betere vorm. 187 00:07:46,910 --> 00:07:48,130 Lopen geen swap. 188 00:07:48,130 --> 00:07:48,740 En verdomme. 189 00:07:48,740 --> 00:07:51,650 Nu zijn we terug waar we waren op maandag, waar het ding niet ruilen. 190 00:07:51,650 --> 00:07:55,410 >> En wat is de intuïtieve verklaring voor waarom dit het geval is? 191 00:07:55,410 --> 00:07:56,380 Yeah? 192 00:07:56,380 --> 00:07:57,630 >> STUDENT: [onverstaanbaar]. 193 00:07:57,630 --> 00:08:04,140 194 00:08:04,140 --> 00:08:05,230 >> DAVID Malan: Precies. 195 00:08:05,230 --> 00:08:07,330 Dus a en b zijn kopieën van x en y. 196 00:08:07,330 --> 00:08:10,680 En in feite, elke keer dat je geweest bent het aanroepen van een functie die tot nu toe 197 00:08:10,680 --> 00:08:12,540 passeert variabelen zoals ints - 198 00:08:12,540 --> 00:08:14,470 net als swap wordt hier verwacht - 199 00:08:14,470 --> 00:08:16,270 jullie zijn passeren in kopieën. 200 00:08:16,270 --> 00:08:19,150 >> Nu, dat betekent dat het duurt een beetje van de tijd, een fractie van een seconde, voor de 201 00:08:19,150 --> 00:08:23,270 computer om de bits van de ene kopiëren variabele in de bits van een andere. 202 00:08:23,270 --> 00:08:24,610 Maar dat is niet zo'n groot probleem. 203 00:08:24,610 --> 00:08:25,920 Maar ze zijn toch een kopie. 204 00:08:25,920 --> 00:08:30,020 >> En dus nu, in het kader van de swap, Ik ben in feite succes 205 00:08:30,020 --> 00:08:31,180 veranderende a en b. 206 00:08:31,180 --> 00:08:33,000 Sterker nog, we doen een snelle sanity check. 207 00:08:33,000 --> 00:08:36,830 Print f een is% i, nieuwe lijn. 208 00:08:36,830 --> 00:08:38,770 En plug laten we in een. 209 00:08:38,770 --> 00:08:41,830 Laten we nu hetzelfde doen met b. 210 00:08:41,830 --> 00:08:43,640 En laten we hetzelfde doen hier. 211 00:08:43,640 --> 00:08:47,260 >> En nu, laat me diezelfde lijn kopiëren weer op de bodem van de functie 212 00:08:47,260 --> 00:08:51,250 na mijn drie lijnen van interessante konden uitgevoerd, en 213 00:08:51,250 --> 00:08:53,270 afdrukken a en b nog maar eens. 214 00:08:53,270 --> 00:08:56,030 Dus nu laten we deze, maken geen swap. 215 00:08:56,030 --> 00:08:58,430 Laat ik het terminalvenster een make beetje groter, zodat we kunnen zien 216 00:08:58,430 --> 00:08:59,520 meer ervan tegelijk. 217 00:08:59,520 --> 00:09:00,860 >> En lopen geen swap. 218 00:09:00,860 --> 00:09:04,000 x is 1, y is 2. a 1, b 2. 219 00:09:04,000 --> 00:09:06,070 En dan, een 2 is, b 1. 220 00:09:06,070 --> 00:09:09,390 Dus het werkt, net als Jess hier deed binnenkant van swap. 221 00:09:09,390 --> 00:09:13,090 Maar natuurlijk, het is die geen effect hebben de belangrijkste variabelen. 222 00:09:13,090 --> 00:09:15,360 >> Zo zagen we een truc waarbij wij zou dit op te lossen, toch? 223 00:09:15,360 --> 00:09:19,560 Wanneer je geconfronteerd wordt met deze scoping kwestie, kon je gewoon punter en maak x 224 00:09:19,560 --> 00:09:22,400 en y wat voor soort variabelen in plaats daarvan? 225 00:09:22,400 --> 00:09:23,390 >> Je kon ze wereldwijd te maken. 226 00:09:23,390 --> 00:09:27,560 Leg ze op de top van het bestand zoals wij deden, zelfs in het spel van 15. 227 00:09:27,560 --> 00:09:28,890 We gebruiken een globale variabele. 228 00:09:28,890 --> 00:09:32,420 Maar in de context van de spelers 15, is het redelijk om een ​​globaal hebben 229 00:09:32,420 --> 00:09:37,170 variabele die de raad van bestuur, omdat het geheel van 15.c is alles 230 00:09:37,170 --> 00:09:38,650 over de uitvoering van dat spel. 231 00:09:38,650 --> 00:09:41,470 Dat is wat het bestand bestaat te doen. 232 00:09:41,470 --> 00:09:44,170 >> Maar in dit geval hier, ik ben aanroepen van een functie swap. 233 00:09:44,170 --> 00:09:45,380 Ik wil twee variabelen verwisselen. 234 00:09:45,380 --> 00:09:48,950 En het moet gaan om gewoon slordig voelen Als de oplossing voor al onze 235 00:09:48,950 --> 00:09:51,300 problemen wanneer we tegenkomen scope kwesties is maken het mondiale. 236 00:09:51,300 --> 00:09:54,730 Omdat heel snel ons programma is gaat nogal een puinhoop geworden. 237 00:09:54,730 --> 00:09:57,760 En wij deden dat zeer spaarzaam als resultaat 15.c. 238 00:09:57,760 --> 00:10:00,470 >> Maar het blijkt dat er een betere manier helemaal. 239 00:10:00,470 --> 00:10:05,600 Laat me eigenlijk terug te gaan en verwijder de printen f's, alleen maar om deze code te vereenvoudigen. 240 00:10:05,600 --> 00:10:09,160 En laat me voorstellen dat Dit is inderdaad slecht. 241 00:10:09,160 --> 00:10:15,990 Maar als ik in plaats daarvan toe te voegen in een aantal sterretjes en sterren, ik kan in plaats van dit te zetten 242 00:10:15,990 --> 00:10:18,670 functie in een, dat is daadwerkelijk operationeel. 243 00:10:18,670 --> 00:10:25,020 >> Dus laat me terug te gaan hier en toegeven zeggen sterretjes is altijd moeilijk, 244 00:10:25,020 --> 00:10:26,170 dus ik zal sterren zeggen. 245 00:10:26,170 --> 00:10:27,660 Ik zal gewoon fess tot die ene. 246 00:10:27,660 --> 00:10:28,190 Oke. 247 00:10:28,190 --> 00:10:30,190 En nu, wat ga ik om in plaats daarvan doen? 248 00:10:30,190 --> 00:10:34,130 >> Dus in de eerste plaats, ik ga om aan te geven dat in plaats van het passeren van een int in 249 00:10:34,130 --> 00:10:37,980 de swap-functie, ik ben in plaats van gaan zeggen int ster. 250 00:10:37,980 --> 00:10:39,170 Nu, wat doet de ster aan te geven? 251 00:10:39,170 --> 00:10:41,970 Dit is dat idee van een pointer die Binky, de claymation karakter, was 252 00:10:41,970 --> 00:10:43,465 verwijst naar een moment geleden. 253 00:10:43,465 --> 00:10:47,610 >> Dus als we zeggen int ster, de betekenis van Dit nu is dat een is niet van plan te zijn 254 00:10:47,610 --> 00:10:49,110 doorgegeven door de waarde ervan. 255 00:10:49,110 --> 00:10:50,350 Het zal niet worden gekopieerd inch 256 00:10:50,350 --> 00:10:54,700 Integendeel, het adres van a zal worden doorgegeven inch 257 00:10:54,700 --> 00:10:57,840 >> Zo herinneren dat de binnenkant van uw computer is een hele hoop geheugen, anders 258 00:10:57,840 --> 00:10:58,760 bekend als RAM. 259 00:10:58,760 --> 00:11:00,520 En dat RAM is gewoon een heleboel bytes. 260 00:11:00,520 --> 00:11:03,320 Dus als je Mac of pc heeft twee gigabyte, je hebt 2 261 00:11:03,320 --> 00:11:05,760 miljard bytes van het geheugen. 262 00:11:05,760 --> 00:11:08,440 >> Nu laten we veronderstellen dat alleen maar om houden alles mooi en ordelijk, we 263 00:11:08,440 --> 00:11:09,450 toekennen van een adres - 264 00:11:09,450 --> 00:11:10,170 een aantal - 265 00:11:10,170 --> 00:11:12,270 om elke byte RAM-geheugen in uw computer. 266 00:11:12,270 --> 00:11:15,410 De eerste byte van de 2 miljard is door het getal nul. 267 00:11:15,410 --> 00:11:18,572 De volgende is byte nummer een, nummer twee, helemaal op maximaal, dot dot 268 00:11:18,572 --> 00:11:20,530 stip, tot ongeveer 2 miljard. 269 00:11:20,530 --> 00:11:23,640 >> Zo kunt u het nummer van de bytes van het geheugen in de computer. 270 00:11:23,640 --> 00:11:26,460 Dus laten we aannemen dat dat is wat we bedoelen met een adres. 271 00:11:26,460 --> 00:11:31,360 Dus als ik zie int ster een, wat is er worden doorgegeven aan swap nu is het 272 00:11:31,360 --> 00:11:32,830 adres van een. 273 00:11:32,830 --> 00:11:37,150 Niet zijn waarde, maar wat zijn post adres is, om zo te zeggen - 274 00:11:37,150 --> 00:11:38,810 zijn ligging in het RAM. 275 00:11:38,810 --> 00:11:41,250 >> En zo ook voor b, ik ga om hetzelfde zeggen. 276 00:11:41,250 --> 00:11:42,720 Int, ster, b. 277 00:11:42,720 --> 00:11:46,350 Even terzijde, technisch de ster zou kunnen gaan op andere locaties. 278 00:11:46,350 --> 00:11:50,140 Maar we zullen op de ster die standaardiseren direct naast het datatype. 279 00:11:50,140 --> 00:11:54,080 >> Dus swap handtekening betekent nu, geef mij het adres van een int, en de oproep 280 00:11:54,080 --> 00:11:55,400 dat adres een. 281 00:11:55,400 --> 00:11:58,690 En geef me nog een adres van een int en roepen dat adres b. 282 00:11:58,690 --> 00:12:01,120 >> Maar nu is mijn code hier moet veranderen. 283 00:12:01,120 --> 00:12:03,470 Want als ik verklaar int temp - 284 00:12:03,470 --> 00:12:05,580 die nog steeds van het type int - 285 00:12:05,580 --> 00:12:08,700 maar ik opslaan in het een, wat voor waarde? 286 00:12:08,700 --> 00:12:12,870 Om duidelijk te zijn, zet ik een een met de code zoals nu geschreven? 287 00:12:12,870 --> 00:12:14,360 >> Ik zet de locatie in een. 288 00:12:14,360 --> 00:12:16,500 Maar ik geef niet om de locatie nu, toch? 289 00:12:16,500 --> 00:12:21,940 Temp bestaat net Jess 'derde beker bestond, voor welk doel? 290 00:12:21,940 --> 00:12:23,090 Om een ​​waarde op te slaan. 291 00:12:23,090 --> 00:12:24,830 Melk of jus d'orange. 292 00:12:24,830 --> 00:12:28,520 Niet om daadwerkelijk het adres van slaan een van die dingen, die voelt een 293 00:12:28,520 --> 00:12:31,200 beetje onzinnig in deze real wereld context toch. 294 00:12:31,200 --> 00:12:34,990 >> Dus echt, wat ik wilt zetten in temp is het adres van een, maar de 295 00:12:34,990 --> 00:12:36,180 inhoud van een. 296 00:12:36,180 --> 00:12:41,930 Als a een getal als 123, is de 123ste byte van het geheugen dat een rechtvaardige 297 00:12:41,930 --> 00:12:45,090 gebeurt te zijn bezettingsmacht, dat de waarde in een toevallig bezettingsmacht. 298 00:12:45,090 --> 00:12:49,040 >> Als ik wil naar dat adres, Ik moet zeggen een ster. 299 00:12:49,040 --> 00:12:52,610 Evenzo, als ik was om te veranderen wat is op het adres van een, ik verander 300 00:12:52,610 --> 00:12:53,570 dit om te beginnen een. 301 00:12:53,570 --> 00:12:58,185 Als ik wil opslaan in wat er op het locatie een met wat er op de locatie 302 00:12:58,185 --> 00:13:02,180 bij b, ster b ster. 303 00:13:02,180 --> 00:13:05,340 >> Dus in het kort, ook al is dit niet helemaal zinken in toch - en ik zou niet verwachten 304 00:13:05,340 --> 00:13:06,560 dat het zo snel zou doen - 305 00:13:06,560 --> 00:13:11,100 beseffen dat alles wat ik doe is prefixing deze sterren naar mijn variabelen, 306 00:13:11,100 --> 00:13:13,350 gezegde niet de waarden te grijpen. 307 00:13:13,350 --> 00:13:14,520 Niet met de waarden niet wijzigen. 308 00:13:14,520 --> 00:13:17,600 Maar eerder naar die adressen en krijgen de waarde. 309 00:13:17,600 --> 00:13:21,430 Ga naar dat adres en verandering de waarde daar. 310 00:13:21,430 --> 00:13:25,500 >> Dus nu laat ik terugbladeren naar de top, alleen maar om deze lijn vast hier, op 311 00:13:25,500 --> 00:13:27,690 verandert het prototype aan te passen. 312 00:13:27,690 --> 00:13:30,280 Maar ik moet nu een ding doen. 313 00:13:30,280 --> 00:13:35,500 Intuïtief, als ik het typen ben veranderd van argumenten die swap wordt verwacht, 314 00:13:35,500 --> 00:13:37,245 wat heb ik nodig om verandering in mijn code? 315 00:13:37,245 --> 00:13:39,750 316 00:13:39,750 --> 00:13:40,840 >> Als ik bel swap. 317 00:13:40,840 --> 00:13:43,340 Want nu, wat ben Ik passeren om nog ruilen? 318 00:13:43,340 --> 00:13:47,450 De waarde x en de waarde van y, of de melk en het sinaasappelsap. 319 00:13:47,450 --> 00:13:48,510 Maar ik wil niet om dat te doen. 320 00:13:48,510 --> 00:13:51,060 Ik plaats langs wilt op wat? 321 00:13:51,060 --> 00:13:53,050 De locatie van x en de locatie van y. 322 00:13:53,050 --> 00:13:55,300 Wat zijn hun postadressen, zo te zeggen. 323 00:13:55,300 --> 00:13:57,600 >> Dus om dat te doen, er is een ampersand. 324 00:13:57,600 --> 00:13:59,260 Ampersand soort klinkt als adres. 325 00:13:59,260 --> 00:14:03,240 zo n, ampersand, het adres van x, en het adres van y. 326 00:14:03,240 --> 00:14:06,790 Dus het is opzettelijke die we gebruiken ampersands bij het aanroepen van de functie, 327 00:14:06,790 --> 00:14:10,230 en sterren bij het declareren en wanneer de uitvoering van de functie. 328 00:14:10,230 --> 00:14:14,220 >> En denk maar aan ampersand als de adres van de exploitant, en de ster als de 329 00:14:14,220 --> 00:14:15,490 ga er exploitant - 330 00:14:15,490 --> 00:14:18,640 of, beter gezegd, de dereference operator. 331 00:14:18,640 --> 00:14:23,480 Dus dat is een heleboel woorden gewoon om zeggen dat nu, hopelijk, swap gaat 332 00:14:23,480 --> 00:14:24,440 juist te zijn. 333 00:14:24,440 --> 00:14:26,550 >> Laat me ga je gang en maak - 334 00:14:26,550 --> 00:14:30,940 laten we daadwerkelijk het bestand te hernoemen, opdat dit programma nog worden genoemd geen swap. 335 00:14:30,940 --> 00:14:33,240 Ik beweer dat we het nu swap.c zullen noemen. 336 00:14:33,240 --> 00:14:35,670 Dus zorg, swap. 337 00:14:35,670 --> 00:14:37,520 Punt, slash, swap. 338 00:14:37,520 --> 00:14:40,210 >> En nu inderdaad, x is 1, y is 2. 339 00:14:40,210 --> 00:14:44,040 En dan, x is 2, y is een. 340 00:14:44,040 --> 00:14:46,500 Nou laten we eens kijken of we niet kunnen doen dit een beetje anders wat is 341 00:14:46,500 --> 00:14:47,180 hier aan de hand. 342 00:14:47,180 --> 00:14:51,250 Ten eerste wil ik inzoomen op onze tekenen hier scherm. 343 00:14:51,250 --> 00:14:54,160 En laat me voorstellen voor een moment - en wanneer ik trek hier wordt gespiegeld 344 00:14:54,160 --> 00:14:58,660 daar nu - laat me voorstellen dat hier is een hele hoop van het geheugen, of 345 00:14:58,660 --> 00:15:00,540 RAM, binnenkant van mijn computer. 346 00:15:00,540 --> 00:15:04,140 >> En dit zal bijten getal, laten we zeggen, 1. 347 00:15:04,140 --> 00:15:05,720 Dit getal 2 bytes zijn. 348 00:15:05,720 --> 00:15:08,220 En ik zal een hele hoop meer doen, en dan is een bos van dot dot stippen aan 349 00:15:08,220 --> 00:15:10,880 geven aan dat er 2 miljard van deze dingen. 350 00:15:10,880 --> 00:15:13,520 4, 5, enzovoort. 351 00:15:13,520 --> 00:15:17,055 >> Zo zijn er de eerste vijf bytes van het geheugen van mijn computer. 352 00:15:17,055 --> 00:15:17,560 Oke? 353 00:15:17,560 --> 00:15:19,060 Zeer weinig van 2 miljard euro. 354 00:15:19,060 --> 00:15:21,120 Maar nu ga ik voorstellen de volgende. 355 00:15:21,120 --> 00:15:27,490 Ik ga om te stellen dat x gaat Sla het nummer 1, en y gaat 356 00:15:27,490 --> 00:15:29,690 het getal 2 slaan. 357 00:15:29,690 --> 00:15:35,000 En laat me nu ga je gang en vertegenwoordigt deze waarden als volgt. 358 00:15:35,000 --> 00:15:41,510 >> Laten we dit als volgt doen. 359 00:15:41,510 --> 00:15:42,870 Geef mij maar een seconde. 360 00:15:42,870 --> 00:15:44,150 Een seconde. 361 00:15:44,150 --> 00:15:45,680 OK. 362 00:15:45,680 --> 00:15:47,560 Ik wil dit een beetje te maken - 363 00:15:47,560 --> 00:15:50,440 laten we dit opnieuw doen. 364 00:15:50,440 --> 00:15:53,250 Anders ga ik naar en het gebruik van de dezelfde nummers, onbedoeld, 365 00:15:53,250 --> 00:15:54,230 meerdere keren. 366 00:15:54,230 --> 00:15:57,320 >> Dus gewoon dus we hebben verschillende nummers om te praten over, laten we noemen dit byte 367 00:15:57,320 --> 00:16:03,391 nummer 123, 124, 125, 126, en dot dot dot. 368 00:16:03,391 --> 00:16:08,400 En laat me beweren nu dat ik ga zet de waarde 1 hier, en de waarde 2 369 00:16:08,400 --> 00:16:11,990 hier, ook wel bekend als x en y. 370 00:16:11,990 --> 00:16:15,300 Dus is het gewoon zo gebeurt het dat is x, y is. 371 00:16:15,300 --> 00:16:18,180 >> En alleen door enkele willekeurige toeval, de computer, het besturingssysteem, 372 00:16:18,180 --> 00:16:21,890 toevallig x zetten op locatie nummer 123. 373 00:16:21,890 --> 00:16:25,590 En y eindigde op plaats 124 - 374 00:16:25,590 --> 00:16:26,330 damn it. 375 00:16:26,330 --> 00:16:28,700 Ik zou dit hebben bevestigd. 376 00:16:28,700 --> 00:16:34,040 Oh man, ik wil dit echt doen? 377 00:16:34,040 --> 00:16:37,340 Ja, ik wil dit en lossen b goede over dit vandaag. 378 00:16:37,340 --> 00:16:39,950 Sorry, is nieuw voor mij. 379 00:16:39,950 --> 00:16:45,020 >> 127, 131, en ik wilde niet om dit te complex, maar waarom heb ik de 380 00:16:45,020 --> 00:16:46,340 nummers er? 381 00:16:46,340 --> 00:16:48,360 Want ik wil de ints naar eigenlijk vier bytes. 382 00:16:48,360 --> 00:16:49,810 Dus laten we super anaal over dit. 383 00:16:49,810 --> 00:16:53,800 Zodat als 1 gebeurt te worden aangepakt 123, wordt de 2 zal worden op adres 384 00:16:53,800 --> 00:16:55,730 127 omdat het gewoon 4 byes afstand. 385 00:16:55,730 --> 00:16:56,210 Dat is alles. 386 00:16:56,210 --> 00:16:58,640 En we vergeten al het andere adressen in de wereld. 387 00:16:58,640 --> 00:17:03,320 >> Dus x is op locatie 123, y is op locatie 127. 388 00:17:03,320 --> 00:17:05,770 En nu, wat doe ik eigenlijk willen doen? 389 00:17:05,770 --> 00:17:10,099 Als ik bel swap nu, wat is eigenlijk aan de hand? 390 00:17:10,099 --> 00:17:14,920 Nou, als ik roep swap, ik ben passeren in het adres van x en het adres van y. 391 00:17:14,920 --> 00:17:18,540 Dus bijvoorbeeld als deze twee stukken van papier vertegenwoordigen nu de twee 392 00:17:18,540 --> 00:17:23,510 argumenten a en b te verwisselen, wat ben ik ga schrijven op de eerste van deze, 393 00:17:23,510 --> 00:17:27,720 die ik ga bellen naar verwijzen als een? 394 00:17:27,720 --> 00:17:30,610 >> Precies, 123. 395 00:17:30,610 --> 00:17:31,905 Dus dit ik beweer is een. 396 00:17:31,905 --> 00:17:32,955 Dit is een parameter. 397 00:17:32,955 --> 00:17:35,856 Ik zet het adres van x in. 398 00:17:35,856 --> 00:17:38,152 >> Wat is dat? 399 00:17:38,152 --> 00:17:40,890 >> Wat is dat? 400 00:17:40,890 --> 00:17:41,190 >> Nee, nee. 401 00:17:41,190 --> 00:17:41,720 Dat is OK. 402 00:17:41,720 --> 00:17:42,570 Nog steeds goed, nog steeds goed. 403 00:17:42,570 --> 00:17:43,530 Dus dit is een. 404 00:17:43,530 --> 00:17:46,240 En nu op het tweede stuk papier, dit gaat worden b, en wat ben ik 405 00:17:46,240 --> 00:17:49,010 zal worden schrijven op dit stuk papier? 406 00:17:49,010 --> 00:17:50,080 127. 407 00:17:50,080 --> 00:17:53,720 >> Dus het enige dat is veranderd sinds onze vorige vertellen van dit verhaal is, 408 00:17:53,720 --> 00:17:58,590 in plaats van letterlijk 1 en 2, ik ben gaat pas in 123 en 127. 409 00:17:58,590 --> 00:18:02,130 En ik ga nu deze binnen zetten van dit vak, oke? 410 00:18:02,130 --> 00:18:04,640 Zodat de zwarte doos vertegenwoordigt nu de swap-functie. 411 00:18:04,640 --> 00:18:07,230 >> Ondertussen, laten we nu iemand uitvoering van de swap-functie. 412 00:18:07,230 --> 00:18:09,090 Zou iemand hier als vrijwilliger? 413 00:18:09,090 --> 00:18:09,560 Kom maar naar boven. 414 00:18:09,560 --> 00:18:11,080 Wat is je naam? 415 00:18:11,080 --> 00:18:11,460 Charlie. 416 00:18:11,460 --> 00:18:12,080 Oke, Charlie. 417 00:18:12,080 --> 00:18:14,810 Kom maar naar boven. 418 00:18:14,810 --> 00:18:17,310 >> Dus Charlie gaat spelen de rol van onze zwarte doos. 419 00:18:17,310 --> 00:18:21,460 En Charlie, wat ik zou willen dat je doet Nu wordt uitvoering swap zodanig 420 00:18:21,460 --> 00:18:25,320 dat, gezien deze twee adressen, je daadwerkelijk gaat 421 00:18:25,320 --> 00:18:26,330 om de waarden te veranderen. 422 00:18:26,330 --> 00:18:28,290 En ik zal in je oor fluisteren hoe je de tv hier draaien. 423 00:18:28,290 --> 00:18:29,930 >> Dus ga je gang, en jij bent de zwarte doos. 424 00:18:29,930 --> 00:18:30,920 Bereiken daar. 425 00:18:30,920 --> 00:18:34,054 Welke waarden zie je voor een, en welke waarden zie je voor b? 426 00:18:34,054 --> 00:18:36,740 >> CHARLIE: een is 123 en b is 127. 427 00:18:36,740 --> 00:18:37,530 >> DAVID MALAN: OK, precies. 428 00:18:37,530 --> 00:18:38,940 Nu pauzeren er voor slechts een moment. 429 00:18:38,940 --> 00:18:41,680 Het eerste wat je gaat nu doen, volgens de code - die 430 00:18:41,680 --> 00:18:43,220 Ik trek nu op het scherm - 431 00:18:43,220 --> 00:18:46,750 gaat worden om een ​​beetje toe te wijzen beetje geheugen genaamd temp. 432 00:18:46,750 --> 00:18:48,850 Dus ik ga om verder te gaan en geef je dat geheugen. 433 00:18:48,850 --> 00:18:52,210 >> Dus dit gaat om een ​​derde variabele u toegankelijk zijn 434 00:18:52,210 --> 00:18:54,080 je temp genoemd. 435 00:18:54,080 --> 00:18:57,120 En wat ga je schrijven op de temp stuk papier? 436 00:18:57,120 --> 00:19:02,524 437 00:19:02,524 --> 00:19:03,470 >> CHARLIE: Pointers, toch? 438 00:19:03,470 --> 00:19:04,790 >> DAVID MALAN: OK, ook niet se pointers. 439 00:19:04,790 --> 00:19:07,230 Dus de regel code die ik heb gemarkeerd op de rechterkant, 440 00:19:07,230 --> 00:19:07,900 laten we daar beginnen. 441 00:19:07,900 --> 00:19:08,890 Het zegt ster een. 442 00:19:08,890 --> 00:19:11,670 Dus een wordt momenteel het opslaan het nummer 123. 443 00:19:11,670 --> 00:19:16,660 En gewoon intuïtief, wat leverde ster 123 betekenen? 444 00:19:16,660 --> 00:19:21,630 >> Maar specifiek, als a 123, ster een betekent wat? 445 00:19:21,630 --> 00:19:22,560 De waarde van een. 446 00:19:22,560 --> 00:19:24,580 Of meer terloops, ga daar. 447 00:19:24,580 --> 00:19:28,620 Dus laat me voorstellen dat, met de een in je hand, ga je gang en te behandelen die 448 00:19:28,620 --> 00:19:29,430 alsof het een map. 449 00:19:29,430 --> 00:19:32,940 En loop je over aan de computer geheugen, en vind ons wat is 450 00:19:32,940 --> 00:19:36,520 op plaats 123. 451 00:19:36,520 --> 00:19:37,720 Precies. 452 00:19:37,720 --> 00:19:41,100 >> Zo zien we op plaats 123 wat natuurlijk? 453 00:19:41,100 --> 00:19:44,240 OK, dus wat waarde nu bent u in te gaan op temp te zetten? 454 00:19:44,240 --> 00:19:44,750 Precies. 455 00:19:44,750 --> 00:19:45,600 Dus ga je gang en dat doen. 456 00:19:45,600 --> 00:19:51,280 En schrijf het nummer 1 op het stuk van papier dat momenteel is getiteld temp. 457 00:19:51,280 --> 00:19:53,540 >> En nu is de volgende stap dat je gaat implementeren 458 00:19:53,540 --> 00:19:54,310 gaat worden wat. 459 00:19:54,310 --> 00:19:57,820 Nou, aan de rechterkant van de volgende regel code is ster b. b, van 460 00:19:57,820 --> 00:19:59,260 Natuurlijk, slaat een adres. 461 00:19:59,260 --> 00:20:02,270 Deze richt 127. 462 00:20:02,270 --> 00:20:06,620 Star b betekent wat, terloops spreken? 463 00:20:06,620 --> 00:20:08,700 >> Ga naar die locatie. 464 00:20:08,700 --> 00:20:14,988 Dus ga je gang en vind ons wat er op plaats 127. 465 00:20:14,988 --> 00:20:15,480 OK. 466 00:20:15,480 --> 00:20:19,170 Natuurlijk, op locatie 127, blijft de waarde 2. 467 00:20:19,170 --> 00:20:24,060 Dus wat ga je nu heen te slaan bij wat er ook in de locatie in een? 468 00:20:24,060 --> 00:20:26,860 Dus ster een middel naar de locatie van een. 469 00:20:26,860 --> 00:20:29,770 Wat is de locatie een? 470 00:20:29,770 --> 00:20:30,430 >> Precies. 471 00:20:30,430 --> 00:20:34,190 Dus nu, als je wilt veranderen wat er op die locatie - 472 00:20:34,190 --> 00:20:36,470 Ik zal doorgaan en lopen de gum zijn hier. 473 00:20:36,470 --> 00:20:37,760 En nu zet het terug op de borstel. 474 00:20:37,760 --> 00:20:42,190 Welk nummer je gaat schrijven in die lege doos nu? 475 00:20:42,190 --> 00:20:42,850 >> Precies. 476 00:20:42,850 --> 00:20:46,470 Dus deze regel code, om duidelijk te zijn - laat me pauze wat Charlie's doet en 477 00:20:46,470 --> 00:20:51,730 hier op te wijzen, wat hij net gedaan is schrijven in dat vak op locatie 123 478 00:20:51,730 --> 00:20:55,150 de waarde die eerder was bij b. 479 00:20:55,150 --> 00:20:59,140 En dus hebben we nu inderdaad geïmplementeerd deze tweede regel code. 480 00:20:59,140 --> 00:21:01,920 >> Nu helaas, er is nog een regel overgebleven. 481 00:21:01,920 --> 00:21:04,900 Wat is nu in temp, letterlijk? 482 00:21:04,900 --> 00:21:06,200 Het is natuurlijk de nummer een. 483 00:21:06,200 --> 00:21:07,020 Dat is niet een adres. 484 00:21:07,020 --> 00:21:09,380 Het is gewoon een aantal, soort een variabele uit een week. 485 00:21:09,380 --> 00:21:13,520 >> En nu als je zegt ster b, dat betekent naar dit adres b, die van 486 00:21:13,520 --> 00:21:15,090 Natuurlijk hier. 487 00:21:15,090 --> 00:21:16,020 Dus zodra je er bent - 488 00:21:16,020 --> 00:21:18,320 Ik zal doorgaan en wist wat er eigenlijk daar - en wat zijn je 489 00:21:18,320 --> 00:21:20,820 ga nu schrijven op locatie 127? 490 00:21:20,820 --> 00:21:22,010 >> CHARLIE: Temp, dat is een. 491 00:21:22,010 --> 00:21:23,430 >> DAVID MALAN: Temp, dat is een. 492 00:21:23,430 --> 00:21:25,670 En wat gebeurt er met temp op het einde? 493 00:21:25,670 --> 00:21:26,600 Nou, we weten niet echt. 494 00:21:26,600 --> 00:21:27,420 We hebben niet echt schelen. 495 00:21:27,420 --> 00:21:31,090 Elke keer dat we een functie geïmplementeerd tot nu toe, alle lokale variabelen je hebt 496 00:21:31,090 --> 00:21:31,890 zijn inderdaad lokaal. 497 00:21:31,890 --> 00:21:33,060 En ze gewoon verdwijnen. 498 00:21:33,060 --> 00:21:35,040 Ze worden teruggewonnen door het besturingssysteem systeem uiteindelijk. 499 00:21:35,040 --> 00:21:39,800 >> Het feit dat de temperatuur nog waarde 1 is een soort van fundamenteel 500 00:21:39,800 --> 00:21:41,150 oninteressant voor ons. 501 00:21:41,150 --> 00:21:43,100 Oke, dus een applaus als we konden voor Charlie. 502 00:21:43,100 --> 00:21:46,400 Zeer goed gedaan. 503 00:21:46,400 --> 00:21:51,520 >> Oke, dus wat meer doet Hiermee bedoelen we kunnen doen? 504 00:21:51,520 --> 00:21:54,400 Dus het blijkt dat we geweest zijn vertellen van een paar witte leugens 505 00:21:54,400 --> 00:21:55,540 al geruime tijd. 506 00:21:55,540 --> 00:21:59,990 Sterker nog, het blijkt dat een string, al die tijd, is niet echt een 507 00:21:59,990 --> 00:22:02,190 reeks tekens per se. 508 00:22:02,190 --> 00:22:03,980 Het soort is die intuïtief. 509 00:22:03,980 --> 00:22:08,270 >> Maar technisch gezien, string is een datatype dat we binnen van de gedeclareerde 510 00:22:08,270 --> 00:22:12,170 de CS50 bibliotheek om de wereld te vereenvoudigen voor de eerste paar weken van de klas. 511 00:22:12,170 --> 00:22:20,130 Wat een string is echt is het adres van een personage ergens in RAM. 512 00:22:20,130 --> 00:22:25,530 Een string is echt een getal, zoals 123 of 127, dat gebeurt te bakenen 513 00:22:25,530 --> 00:22:28,420 wanneer een tekenreeks begint geheugen van uw computer. 514 00:22:28,420 --> 00:22:31,870 >> Maar het vertegenwoordigt niet de koord, per se, zelf. 515 00:22:31,870 --> 00:22:33,460 En we kunnen dit als volgt zien. 516 00:22:33,460 --> 00:22:35,980 Laat me ga je gang en open een code die is onder 517 00:22:35,980 --> 00:22:38,340 vandaag broncode voorbeelden. 518 00:22:38,340 --> 00:22:42,225 En ik ga om verder te gaan en open up, laten we zeggen, vergelijk-0.c. 519 00:22:42,225 --> 00:22:44,830 520 00:22:44,830 --> 00:22:48,790 Dit is een buggy programma dat gaat worden uitgevoerd als volgt. 521 00:22:48,790 --> 00:22:49,040 >> Eerste. 522 00:22:49,040 --> 00:22:50,420 Ik ga iets zeggen. 523 00:22:50,420 --> 00:22:52,660 Dan ga ik verder te gaan en krijgen een string van de gebruiker 524 00:22:52,660 --> 00:22:53,750 in die volgende regel. 525 00:22:53,750 --> 00:22:55,370 Dan ga ik het nog eens zeggen. 526 00:22:55,370 --> 00:22:57,540 Dan ga ik naar een andere krijgen koord van de gebruiker. 527 00:22:57,540 --> 00:23:00,390 >> En merk op, Ik laat een van de strings in een variabele genaamd s, en 528 00:23:00,390 --> 00:23:03,040 andere van deze strings in een variabele met de naam t. 529 00:23:03,040 --> 00:23:07,480 En nu ga ik te beweren, zeer redelijk, dat als s gelijk evenaart t, 530 00:23:07,480 --> 00:23:08,940 de snaren zijn hetzelfde. 531 00:23:08,940 --> 00:23:09,970 U typt het zelfde ding. 532 00:23:09,970 --> 00:23:11,830 Else, de snaren zijn niet hetzelfde. 533 00:23:11,830 --> 00:23:15,440 >> Immers, als we ingang twee ints, twee chars, twee drijvers, twee doubles, een van 534 00:23:15,440 --> 00:23:18,400 de soorten gegevens die we hebben gesproken over tot nu toe te vergelijken - 535 00:23:18,400 --> 00:23:22,070 herinneren we heel duidelijk een tijdje geleden gemaakt dat je dit niet doet, omdat een 536 00:23:22,070 --> 00:23:25,840 isgelijkteken is natuurlijk de opdracht operator. 537 00:23:25,840 --> 00:23:26,820 Zodat een fout zou zijn. 538 00:23:26,820 --> 00:23:29,260 >> Wij gebruiken het gelijke gelijk-teken, die inderdaad vergelijkt 539 00:23:29,260 --> 00:23:31,050 dingen voor echte gelijkheid. 540 00:23:31,050 --> 00:23:32,275 Maar ik beweren dit is buggy. 541 00:23:32,275 --> 00:23:37,400 Als ik ga je gang en maak vergelijken nul, en dan denk dot slash vergelijken nul. 542 00:23:37,400 --> 00:23:39,700 En ik typ in, laten we zeggen, hallo. 543 00:23:39,700 --> 00:23:41,590 En dan laten we weer gedag zeggen. 544 00:23:41,590 --> 00:23:46,040 Letterlijk het zelfde ding, de computer aanspraken Ik verschillende dingen getypt. 545 00:23:46,040 --> 00:23:47,640 >> Nu misschien heb ik gewoon verkeerd getypt iets. 546 00:23:47,640 --> 00:23:49,910 Ik zal mijn naam typen dit keer. 547 00:23:49,910 --> 00:23:52,580 Ik bedoel, hallo. 548 00:23:52,580 --> 00:23:54,770 Hallo. 549 00:23:54,770 --> 00:23:57,360 Het is elke keer weer anders. 550 00:23:57,360 --> 00:23:58,430 >> Nou, waarom is dat? 551 00:23:58,430 --> 00:24:00,140 Wat is er werkelijk aan de hand onder de motorkap? 552 00:24:00,140 --> 00:24:03,270 Nou, wat er werkelijk aan de hand eronder de kap is de string dan 553 00:24:03,270 --> 00:24:07,410 Ik typte in die eerste keer bijvoorbeeld is het woord hello, natuurlijk. 554 00:24:07,410 --> 00:24:11,660 Maar als wij vertegenwoordigen deze eronder de motorkap, herinneren dat een 555 00:24:11,660 --> 00:24:13,470 string in een array. 556 00:24:13,470 --> 00:24:15,040 En we hebben zo veel gezegd in het verleden. 557 00:24:15,040 --> 00:24:20,200 >> Dus als ik trek die array als dit, ik ben ga iets heel vertegenwoordigen 558 00:24:20,200 --> 00:24:23,030 vergelijkbaar met wat we zojuist deden. 559 00:24:23,030 --> 00:24:25,390 En er is eigenlijk iets hier speciaal, ook. 560 00:24:25,390 --> 00:24:28,090 Wat hebben we te bepalen werd bij het einde van elke snaar? 561 00:24:28,090 --> 00:24:30,760 Ja, dit backslash nul, dat is alleen de manier vertegenwoordigen, 562 00:24:30,760 --> 00:24:33,610 letterlijk, 00000000. 563 00:24:33,610 --> 00:24:35,680 0 acht bits in een rij. 564 00:24:35,680 --> 00:24:37,610 >> Ik weet het niet, eerlijk gezegd, wat er na deze. 565 00:24:37,610 --> 00:24:40,090 Dat is gewoon een stelletje meer RAM binnenkant van mijn computer. 566 00:24:40,090 --> 00:24:40,970 Maar dit is een array. 567 00:24:40,970 --> 00:24:42,260 We spraken over arrays vóór. 568 00:24:42,260 --> 00:24:45,010 En we meestal praten over arrays als locatie nul, 569 00:24:45,010 --> 00:24:46,580 dan een, dan twee. 570 00:24:46,580 --> 00:24:47,950 Maar dat is alleen voor het gemak. 571 00:24:47,950 --> 00:24:49,380 En dat is heel relatief. 572 00:24:49,380 --> 00:24:53,010 >> Wanneer u daadwerkelijk krijgt geheugen uit de computer, het is natuurlijk een 573 00:24:53,010 --> 00:24:55,450 2 miljard een aantal vreemde bytes, potentieel. 574 00:24:55,450 --> 00:24:59,100 Dus echt onder de motorkap, al die tijd, ja. 575 00:24:59,100 --> 00:25:01,670 Dit zou heel goed beugel nul. 576 00:25:01,670 --> 00:25:04,780 Maar als je graaft nog dieper eronder de motorkap, dat is echt 577 00:25:04,780 --> 00:25:07,000 aanpakken nummer 123. 578 00:25:07,000 --> 00:25:09,150 Dit is adres 124. 579 00:25:09,150 --> 00:25:11,040 Dit is adres 125. 580 00:25:11,040 --> 00:25:12,540 >> En ik heb niet verpest dit moment. 581 00:25:12,540 --> 00:25:15,840 Deze zijn nu een bytes afgezien om welke reden? 582 00:25:15,840 --> 00:25:17,930 Hoe groot is een char? 583 00:25:17,930 --> 00:25:19,170 Een char is slechts een byte. 584 00:25:19,170 --> 00:25:20,570 Een int is typisch vier bytes. 585 00:25:20,570 --> 00:25:24,850 Dus dat is waarom ik maakte het 123, 127, 131 enzovoorts. 586 00:25:24,850 --> 00:25:27,560 Nu kan ik de wiskunde eenvoudiger te houden en gewoon doen plus 1. 587 00:25:27,560 --> 00:25:30,510 En dit is nu wat er werkelijk aan de hand op onder de motorkap. 588 00:25:30,510 --> 00:25:37,760 >> Dus als je iets als dit te verklaren, tekenreeks s, dit is eigenlijk - 589 00:25:37,760 --> 00:25:39,170 het blijkt - 590 00:25:39,170 --> 00:25:41,190 char ster. 591 00:25:41,190 --> 00:25:44,640 Star, betekent natuurlijk adres, aka wijzer. 592 00:25:44,640 --> 00:25:46,200 Dus het is het adres van iets. 593 00:25:46,200 --> 00:25:47,510 Wat is daarin het adres van? 594 00:25:47,510 --> 00:25:47,760 >> Well - 595 00:25:47,760 --> 00:25:51,680 Ik ben de enige die het kan zien belangrijk punt dat ik wil maken, of denken 596 00:25:51,680 --> 00:25:52,560 Ik ben het maken. 597 00:25:52,560 --> 00:25:55,270 Dus touwtje - 598 00:25:55,270 --> 00:25:57,180 het trieste is ik heb een monitor precies daar waar ik 599 00:25:57,180 --> 00:25:58,100 zou hebben gezien dat. 600 00:25:58,100 --> 00:26:00,990 >> Oke, dus tekenreeks s is wat Ik verklaarde eerder. 601 00:26:00,990 --> 00:26:04,600 Maar het blijkt, dankzij een beetje magie in de CS50 bibliotheek deze, alle 602 00:26:04,600 --> 00:26:08,780 tijd snaar heeft letterlijk geweest char ster. 603 00:26:08,780 --> 00:26:11,310 De ster betekent weer pointer of adres. 604 00:26:11,310 --> 00:26:14,180 Het feit dat het aan weerszijden van de woord char betekent dat het de 605 00:26:14,180 --> 00:26:15,970 adres van een personage. 606 00:26:15,970 --> 00:26:23,100 >> Dus als krijg string wordt genoemd, en ik typ in H-E-L-L-O, stellen nu wat er te krijgen 607 00:26:23,100 --> 00:26:27,330 tekenreeks letterlijk terug al deze tijd, ook al hebben we liever 608 00:26:27,330 --> 00:26:29,980 ongenuanceerd de wereld? 609 00:26:29,980 --> 00:26:33,310 Wat doet krijgt snaar daadwerkelijk terugkeren als de return waarde? 610 00:26:33,310 --> 00:26:35,830 611 00:26:35,830 --> 00:26:38,720 >> 123 in dit geval, bijvoorbeeld. 612 00:26:38,720 --> 00:26:42,630 We hebben al eerder gezegd dat krijgen snaar simpelweg geeft een string, een opeenvolging van 613 00:26:42,630 --> 00:26:43,300 tekens. 614 00:26:43,300 --> 00:26:44,790 Maar dat is een beetje een leugentje om bestwil. 615 00:26:44,790 --> 00:26:48,010 De weg snaar echt werkt onder de motorkap is het krijgt een 616 00:26:48,010 --> 00:26:48,930 koord van de gebruiker. 617 00:26:48,930 --> 00:26:51,530 Het ploft de tekens die hij of zij vormen in het geheugen. 618 00:26:51,530 --> 00:26:54,680 Het zet een backslash nul aan het eind van die reeks tekens. 619 00:26:54,680 --> 00:26:57,310 >> Maar wat is dan krijgt touwtje letterlijk terug? 620 00:26:57,310 --> 00:27:02,710 Het geeft letterlijk het adres van de eerste bytes in de RAM 621 00:27:02,710 --> 00:27:04,130 het gebruikt voor die kracht. 622 00:27:04,130 --> 00:27:07,500 En het blijkt dat alleen door terug te keren een adres van de 623 00:27:07,500 --> 00:27:12,120 eerste teken in de reeks, dat is voldoende voor het vinden van het geheel van 624 00:27:12,120 --> 00:27:12,630 de string. 625 00:27:12,630 --> 00:27:16,930 >> Met andere woorden, krijgt koord geen tot 123, 124 en 125 terug. 626 00:27:16,930 --> 00:27:19,950 Het hoeft niet om me een lange lijst van alle van de bytes die 627 00:27:19,950 --> 00:27:20,740 mijn string wordt gebruikt. 628 00:27:20,740 --> 00:27:22,670 Want een, ze zijn allemaal terug naar terug. 629 00:27:22,670 --> 00:27:28,160 En twee, gebaseerd op het eerste adres, I kunnen achterhalen waar de string eindigt. 630 00:27:28,160 --> 00:27:29,910 Hoe? 631 00:27:29,910 --> 00:27:33,490 >> De speciale null karakter, de backslash nul eind. 632 00:27:33,490 --> 00:27:35,430 Dus met andere woorden, indien u passeert rond - 633 00:27:35,430 --> 00:27:36,530 binnenkant van variabelen - 634 00:27:36,530 --> 00:27:41,300 het adres van een char, en je ervan uitgaan dat aan het eind van elke snaar, elke 635 00:27:41,300 --> 00:27:45,040 opeenvolging van karakters als wij mensen denken van strijkers, als je ervan uitgaat dat 636 00:27:45,040 --> 00:27:48,600 aan het einde van een koord er een backslash nul, je bent goud. 637 00:27:48,600 --> 00:27:52,430 Omdat je altijd kunt vinden het einde van een koord. 638 00:27:52,430 --> 00:27:54,870 >> Nu wat er echt dan gaan in dit programma? 639 00:27:54,870 --> 00:27:59,990 Waarom is dit programma, vergelijk-0.c, buggy? 640 00:27:59,990 --> 00:28:01,690 Wat er daadwerkelijk wordt vergeleken? 641 00:28:01,690 --> 00:28:02,420 Yeah? 642 00:28:02,420 --> 00:28:05,000 >> STUDENT: [onverstaanbaar]. 643 00:28:05,000 --> 00:28:05,730 >> DAVID Malan: Precies. 644 00:28:05,730 --> 00:28:08,350 Het vergelijken van de locaties van de snaren. 645 00:28:08,350 --> 00:28:12,420 Dus als de gebruiker hello keer in heeft getypt, zoals ik deed, zou het geheugen eindigen 646 00:28:12,420 --> 00:28:13,430 zoek als dit. 647 00:28:13,430 --> 00:28:18,210 Als de gebruiker vervolgens typen in hallo weer, maar door te bellen krijg touwtje weer, c is 648 00:28:18,210 --> 00:28:21,800 niet bijzonder slim, tenzij je leren het slim te zijn door het schrijven van code. 649 00:28:21,800 --> 00:28:22,430 >> C - 650 00:28:22,430 --> 00:28:23,860 en computers algemeen - 651 00:28:23,860 --> 00:28:27,370 als je hello opnieuw intypen van het woord, je weet wat je gaat krijgen. 652 00:28:27,370 --> 00:28:31,480 Je bent gewoon gaat om een ​​tweede reeks te krijgen van het geheugen dat, ja, gebeurt wel 653 00:28:31,480 --> 00:28:35,510 opslaan H-E-L-L-O enzovoort. 654 00:28:35,510 --> 00:28:38,240 >> Het gaat om het zelfde te kijken ons mensen, maar dit adres 655 00:28:38,240 --> 00:28:39,460 misschien niet 123. 656 00:28:39,460 --> 00:28:42,470 Het zou net zo toevallig dat de besturingssysteem heeft enkele beschikbaar 657 00:28:42,470 --> 00:28:45,430 ruimte voor bijvoorbeeld op locatie - 658 00:28:45,430 --> 00:28:49,820 laten we iets willekeurige zeggen, als deze is locatie 200. 659 00:28:49,820 --> 00:28:51,620 En dit is locatie 201. 660 00:28:51,620 --> 00:28:53,060 En dit is locatie 202. 661 00:28:53,060 --> 00:28:55,730 We hebben geen idee waar dat is gaat worden in het geheugen. 662 00:28:55,730 --> 00:28:59,110 >> Maar wat dit betekent is dat wat is zal uiteindelijk worden opgeslagen s? 663 00:28:59,110 --> 00:29:00,750 Het nummer 123. 664 00:29:00,750 --> 00:29:04,860 Wat er gaat worden opgeslagen in t, In dit voorbeeld willekeurige? 665 00:29:04,860 --> 00:29:06,300 Het nummer 200. 666 00:29:06,300 --> 00:29:11,410 En dat alles betekent dan is natuurlijk, 123 is niet gelijk aan 200. 667 00:29:11,410 --> 00:29:14,940 En dus dit als voorwaarde nooit de waarde true. 668 00:29:14,940 --> 00:29:18,430 Omdat get string wordt met behulp van verschillende delen van het geheugen elke keer. 669 00:29:18,430 --> 00:29:20,360 >> Nu kunnen we dit weer zien in een ander voorbeeld. 670 00:29:20,360 --> 00:29:23,764 Laat me ga je gang en open up copy-0.c. 671 00:29:23,764 --> 00:29:28,770 Ik eis dat dit voorbeeld gaat proberen - maar niet in slagen - om twee strings kopiëren 672 00:29:28,770 --> 00:29:29,910 als volgt. 673 00:29:29,910 --> 00:29:31,730 >> Ik ga iets zeggen de gebruiker. 674 00:29:31,730 --> 00:29:34,490 Ik ben dan zal het krijgen string en noemen het s. 675 00:29:34,490 --> 00:29:36,400 En nu, ik doe deze controle hier. 676 00:29:36,400 --> 00:29:37,990 We vermelden dit een tijdje terug. 677 00:29:37,990 --> 00:29:42,490 Maar wanneer zou touwtje return null krijgen, een ander speciaal teken, of speciale 678 00:29:42,490 --> 00:29:45,050 symbool laten we zeggen. 679 00:29:45,050 --> 00:29:45,900 Als het uit het geheugen. 680 00:29:45,900 --> 00:29:48,970 >> Bijvoorbeeld, als de gebruiker echt zijn moeilijk en types een gruwelijke 681 00:29:48,970 --> 00:29:51,220 aantal tekens in de toetsenbord en klappen op Enter. 682 00:29:51,220 --> 00:29:54,580 Als dat aantal tekens kan het gewoon niet in het RAM passen om wat voor gek 683 00:29:54,580 --> 00:29:57,820 reden, word goed touwtje zou heel goed terug null. 684 00:29:57,820 --> 00:30:01,080 >> Of als uw programma zelf doet veel van andere dingen en er is gewoon 685 00:30:01,080 --> 00:30:03,790 niet genoeg geheugen voor get snaar om te slagen, zou het eindigen 686 00:30:03,790 --> 00:30:05,240 up terug null. 687 00:30:05,240 --> 00:30:07,160 Maar laten we preciezer wat dit is. 688 00:30:07,160 --> 00:30:10,280 Wat is de s-speler datatype echt? 689 00:30:10,280 --> 00:30:11,610 Char ster. 690 00:30:11,610 --> 00:30:14,560 >> Dus het blijkt nu kunnen we schil terug de laag van nul. 691 00:30:14,560 --> 00:30:17,500 Blijkt, null is - ja, uiteraard een speciaal symbool. 692 00:30:17,500 --> 00:30:19,190 Maar wat is het eigenlijk? 693 00:30:19,190 --> 00:30:25,220 Echt, null is gewoon een symbool dat we mensen gebruiken nulpositie, vertegenwoordigen. 694 00:30:25,220 --> 00:30:29,010 >> Dus de auteurs van C, en computers meer algemeen, besloten jaren geleden 695 00:30:29,010 --> 00:30:30,010 dat, weet je wat. 696 00:30:30,010 --> 00:30:34,850 Waarom gaan we niet garanderen dat er geen gebruiker data is ooit, ooit, ooit 697 00:30:34,850 --> 00:30:36,730 opgeslagen bij bye nul? 698 00:30:36,730 --> 00:30:39,610 In feite, zelfs in mijn willekeurige voorbeeld voor, ik niet beginnen nummeren van de 699 00:30:39,610 --> 00:30:40,390 bytes op nul. 700 00:30:40,390 --> 00:30:41,540 Ik ben begonnen bij een. 701 00:30:41,540 --> 00:30:44,950 Omdat ik wist dat de mensen in de wereld hebben besloten de nul te behouden 702 00:30:44,950 --> 00:30:47,970 byte in ieders geheugen als iets bijzonders. 703 00:30:47,970 --> 00:30:52,020 >> De reden hiervoor is, wanneer je maar wilt signaal dat er iets mis is gegaan 704 00:30:52,020 --> 00:30:55,960 met betrekking tot adressen, keert u terug null - ook wel bekend als nul - 705 00:30:55,960 --> 00:30:59,410 en omdat je weet dat er geen legit gegevens op adres nul, duidelijk 706 00:30:59,410 --> 00:31:00,400 dat betekent een fout. 707 00:31:00,400 --> 00:31:04,080 En dat is waarom we, volgens afspraak, controleer voor null en terugkeer iets 708 00:31:04,080 --> 00:31:06,260 zoals men in die gevallen. 709 00:31:06,260 --> 00:31:09,300 >> Dus als we nu naar beneden scrollen, dit is gewoon dan komen er foutcontrole, voor het geval 710 00:31:09,300 --> 00:31:10,610 ging er iets mis met [? borgtocht?] 711 00:31:10,610 --> 00:31:13,470 helemaal en sluit het programma door terug te keren vroeg. 712 00:31:13,470 --> 00:31:19,030 Deze lijn kon nu worden herschreven als dit, wat betekent wat? 713 00:31:19,030 --> 00:31:23,155 Aan de linkerkant, geef me nog een pointer naar een karakter, en noem het t. 714 00:31:23,155 --> 00:31:26,935 Wat ben ik het opslaan binnenkant van t, gebaseerd op deze ene regel code? 715 00:31:26,935 --> 00:31:30,950 716 00:31:30,950 --> 00:31:32,170 >> Ik ben het opslaan van een locatie. 717 00:31:32,170 --> 00:31:34,742 Specifiek de locatie dat in s. 718 00:31:34,742 --> 00:31:39,000 Dus als de gebruiker in hello heeft getypt, en die eerste hello toevallig belanden 719 00:31:39,000 --> 00:31:42,567 hier, dan is het getal 123 is gaan om terug te komen van krijgen 720 00:31:42,567 --> 00:31:43,810 rijgen en worden opgeslagen - 721 00:31:43,810 --> 00:31:44,780 zoals we al eerder zeiden - 722 00:31:44,780 --> 00:31:45,440 in s. 723 00:31:45,440 --> 00:31:50,560 >> Als ik nu verklaar andere pointer naar een char en noem het t, welk nummer is 724 00:31:50,560 --> 00:31:53,940 letterlijk gaan om te eindigen in t volgens het verhaal? 725 00:31:53,940 --> 00:31:55,420 So 123. 726 00:31:55,420 --> 00:32:00,310 >> Dus technisch gezien nu zowel s en t Er wordt naar de exacte 727 00:32:00,310 --> 00:32:02,410 dezelfde delen van het geheugen. 728 00:32:02,410 --> 00:32:06,140 Dus let op wat ik nu ga doen om bewijzen dat dit programma is buggy. 729 00:32:06,140 --> 00:32:08,820 >> Eerst ga ik te beweren, met een print f, kapitaliseren 730 00:32:08,820 --> 00:32:10,080 de kopie van de string. 731 00:32:10,080 --> 00:32:11,660 Dan ga ik een beetje te doen foutcontrole. 732 00:32:11,660 --> 00:32:12,160 Ik ga er zeker. 733 00:32:12,160 --> 00:32:16,710 Laten we ervoor zorgen dat de string t is op althans groter dan nul in lengte, 734 00:32:16,710 --> 00:32:19,190 dus er is wat karakter er om daadwerkelijk te kapitaliseren. 735 00:32:19,190 --> 00:32:22,840 >> En dan kun je misschien dit herinneren uit eerdere voorbeelden. 736 00:32:22,840 --> 00:32:25,630 2 boven - en dat is in het ctype.h bestand. 737 00:32:25,630 --> 00:32:30,800 T beugel nul geeft mij de nul karakter van de string t. 738 00:32:30,800 --> 00:32:34,360 En 2 bovenste van diezelfde waarde, van Natuurlijk, zet deze om naar hoofdletters. 739 00:32:34,360 --> 00:32:38,230 >> Zo intuïtief, deze gemarkeerde lijn van de code wordt kapitaliseren de eerste 740 00:32:38,230 --> 00:32:40,250 brief in t. 741 00:32:40,250 --> 00:32:44,485 Maar het is niet kapitaliseren, intuïtief, de eerste letter in s. 742 00:32:44,485 --> 00:32:48,130 Maar als je vooruit te denken, wat ben ik over om te zien wanneer ik dit programma uit te voeren 743 00:32:48,130 --> 00:32:54,220 en print zowel de oorspronkelijke, s, en de zogenaamde exemplaar, t? 744 00:32:54,220 --> 00:32:55,350 >> Ze daadwerkelijk gaat hetzelfde te zijn. 745 00:32:55,350 --> 00:32:56,600 En waarom gaan ze hetzelfde zijn? 746 00:32:56,600 --> 00:32:58,970 747 00:32:58,970 --> 00:33:01,020 Ze zijn beiden wijzen op precies hetzelfde. 748 00:33:01,020 --> 00:33:01,610 Dus laten we dit doen. 749 00:33:01,610 --> 00:33:03,160 >> Maak kopie nul. 750 00:33:03,160 --> 00:33:04,070 Het compileert OK. 751 00:33:04,070 --> 00:33:06,500 Laat me copy nul draaien. 752 00:33:06,500 --> 00:33:10,110 Laat me iets als hallo intypen alle kleine letters vervolgens op Enter. 753 00:33:10,110 --> 00:33:16,520 En het stelt dat zowel de oorspronkelijke s en de kopie inderdaad identiek. 754 00:33:16,520 --> 00:33:17,920 >> Dus wat er werkelijk hier gebeurd? 755 00:33:17,920 --> 00:33:20,100 Laat ik deze foto net hertekenen om het verhaal te vertellen in een 756 00:33:20,100 --> 00:33:21,340 iets andere manier. 757 00:33:21,340 --> 00:33:26,060 Wat er echt gaande is onder de kap als ik iets verklaren als 758 00:33:26,060 --> 00:33:30,410 char start s, of touwtje s, Ik krijg een pointer - 759 00:33:30,410 --> 00:33:33,090 die toevallig vier bytes in het CS50 apparaat 760 00:33:33,090 --> 00:33:34,410 en in veel computers. 761 00:33:34,410 --> 00:33:36,008 En ik ga dit s bellen. 762 00:33:36,008 --> 00:33:39,810 En dit heeft momenteel een onbekende waarde. 763 00:33:39,810 --> 00:33:43,900 >> Wanneer u een variabele declareert, tenzij u jezelf een waarde daar, die 764 00:33:43,900 --> 00:33:44,570 weet wat er staat. 765 00:33:44,570 --> 00:33:48,110 Het kan enkele willekeurige reeks zijn bits van de vorige uitvoering. 766 00:33:48,110 --> 00:33:52,490 Dus toen ik, in mijn regel code krijg touwtje, en dan slaan de terugkeer 767 00:33:52,490 --> 00:33:54,800 waarde in s krijgen touwtje of andere manier - 768 00:33:54,800 --> 00:33:58,520 en we zullen uiteindelijk schil terug hoe krijgen snaar werken, of andere manier wijst een 769 00:33:58,520 --> 00:34:00,480 array die waarschijnlijk lijkt een beetje als dit. 770 00:34:00,480 --> 00:34:05,390 H-E-L-L-O, backslash nul. 771 00:34:05,390 --> 00:34:09,510 >> Laten we veronderstellen dat dit adres 123 gewoon eerst consistentie. 772 00:34:09,510 --> 00:34:13,000 Dus maak je touwtje rendement, in de gemarkeerde lijn daar, keert de 773 00:34:13,000 --> 00:34:15,000 nummer zeiden we, 123. 774 00:34:15,000 --> 00:34:17,420 Dus wat er werkelijk gaat binnenkant van s hier? 775 00:34:17,420 --> 00:34:26,590 >> Nou, wat er echt gaat binnenkant van s 123. 776 00:34:26,590 --> 00:34:29,250 Maar eerlijk gezegd, ik word een beetje verward door al deze adressen, 777 00:34:29,250 --> 00:34:30,320 al deze willekeurige getallen. 778 00:34:30,320 --> 00:34:32,290 123, 124, 127. 779 00:34:32,290 --> 00:34:34,570 Dus laten we daadwerkelijk vereenvoudigen de wereld een klein beetje. 780 00:34:34,570 --> 00:34:38,800 >> Als we praten over pointers, eerlijk gezegd, om ons mensen, die de heck cares waar 781 00:34:38,800 --> 00:34:39,870 dingen zijn in het geheugen? 782 00:34:39,870 --> 00:34:41,080 Dat is volkomen willekeurig. 783 00:34:41,080 --> 00:34:43,370 Het zal afhangen van hoe hoeveel RAM-geheugen heeft de gebruiker. 784 00:34:43,370 --> 00:34:46,590 Het gaat over afhangen wanneer zij op de dag u het programma uitvoert, misschien, en 785 00:34:46,590 --> 00:34:48,250 wat de inbreng van de gebruiker geeft. 786 00:34:48,250 --> 00:34:50,060 We zijn woning aan onbelangrijke details. 787 00:34:50,060 --> 00:34:54,230 >> Dus laten we abstracte weg en zeggen dat, wanneer u een regel code uitvoeren als dit, 788 00:34:54,230 --> 00:34:57,320 char ster s krijgt de terugkeer waarde van get string. 789 00:34:57,320 --> 00:35:02,720 Waarom gaan we niet in plaats daarvan alleen tekenen wat we blijven roepen een pointer alsof het 790 00:35:02,720 --> 00:35:04,140 wijst op iets? 791 00:35:04,140 --> 00:35:07,000 Dus ik beweren nu dat s up Er is een pointer - 792 00:35:07,000 --> 00:35:08,480 onder de motorkap is het een adres. 793 00:35:08,480 --> 00:35:11,330 Maar het is gewoon te wijzen op de eerste byte in de 794 00:35:11,330 --> 00:35:12,780 tekenreeks die is teruggekeerd. 795 00:35:12,780 --> 00:35:16,710 >> Als ik hier nu terug naar de code, wat er gaande is op deze lijn? 796 00:35:16,710 --> 00:35:20,020 Nou, in dit gemarkeerde lijn nu, Ik ben blijkbaar een ander verklarend 797 00:35:20,020 --> 00:35:21,070 variabele genaamd t. 798 00:35:21,070 --> 00:35:25,700 Maar het is ook een pointer, dus ik ga te tekenen als, in theorie, de exacte 799 00:35:25,700 --> 00:35:26,710 hetzelfde formaat doos. 800 00:35:26,710 --> 00:35:28,160 En ik ga het t bellen. 801 00:35:28,160 --> 00:35:33,500 >> En nu als we terug gaan naar de code opnieuw, toen ik opslaan s binnenkant van t, 802 00:35:33,500 --> 00:35:36,920 wat ben ik technisch waardoor de binnenkant van t? 803 00:35:36,920 --> 00:35:39,350 Nou technisch gezien, dit was het nummer 123. 804 00:35:39,350 --> 00:35:42,270 Dus echt ik moet schrijven het nummer 123 daar. 805 00:35:42,270 --> 00:35:43,900 Maar laten we het hogere niveau. 806 00:35:43,900 --> 00:35:48,090 t, als het is gewoon een pointer, intuïtief, is enkel dat. 807 00:35:48,090 --> 00:35:49,800 Dat is alles wat het zijn opgeslagen in daar. 808 00:35:49,800 --> 00:35:54,970 >> Dus nu in de laatste interessante lijnen van de code, toen ik eigenlijk gaan over 809 00:35:54,970 --> 00:36:00,680 kapitaliseren de nulteken in t, wat er gaande is? 810 00:36:00,680 --> 00:36:06,310 Nou ja, is t beugel nul nu wijzen wat karakter, vermoedelijk? 811 00:36:06,310 --> 00:36:07,460 >> Het wijzend naar h. 812 00:36:07,460 --> 00:36:08,870 Omdat t bracket nul - 813 00:36:08,870 --> 00:36:12,490 herinneren, dit is oude syntax. t bracket nul betekent alleen als t is een string, t 814 00:36:12,490 --> 00:36:15,590 beugel nul betekent dat je de nul karakter die kracht. 815 00:36:15,590 --> 00:36:18,650 Dus wat dat werkelijk betekent wordt naar deze array - 816 00:36:18,650 --> 00:36:21,520 en ja, dit zou kunnen zijn 123, dit misschien 124. 817 00:36:21,520 --> 00:36:22,790 Maar het is allemaal relatief, herinneren. 818 00:36:22,790 --> 00:36:25,640 Wanneer het over een serie, hebben we het voordeel van praten over 819 00:36:25,640 --> 00:36:27,000 relevante indices. 820 00:36:27,000 --> 00:36:31,120 >> En dus nu kunnen we gewoon aannemen dat t beugel nul is h. 821 00:36:31,120 --> 00:36:35,090 Dus als ik bel 2 boven op het, wat dat is eigenlijk doet is kapitaliseren 822 00:36:35,090 --> 00:36:38,290 de kleine letter h te hoofdletters H. Maar natuurlijk, wat is s? 823 00:36:38,290 --> 00:36:41,010 Het is die naar dezelfde darn string. 824 00:36:41,010 --> 00:36:44,200 >> Dus dit is alles wat er is gebeurd in deze code tot nu toe. 825 00:36:44,200 --> 00:36:45,960 Dus wat is dan de implicatie? 826 00:36:45,960 --> 00:36:48,300 Hoe gaan we deze twee problemen op te lossen? 827 00:36:48,300 --> 00:36:50,870 Hoe gaan we vergelijken met de werkelijke touwtjes? 828 00:36:50,870 --> 00:36:53,720 >> Nou intuïtief, hoe zou je gaat over het vergelijken van twee 829 00:36:53,720 --> 00:36:55,090 snaren voor echte gelijkheid? 830 00:36:55,090 --> 00:36:58,920 831 00:36:58,920 --> 00:37:00,750 >> Wat betekent het als er twee strings zijn gelijk? 832 00:37:00,750 --> 00:37:04,330 Duidelijk niet dat hun adressen zijn gelijk in het geheugen, want dat is een lage 833 00:37:04,330 --> 00:37:06,590 level implementatie detail. 834 00:37:06,590 --> 00:37:08,360 Alle letters zijn hetzelfde. 835 00:37:08,360 --> 00:37:12,810 Dus laat me voorstellen, en laat me even in versie een van compare.c 836 00:37:12,810 --> 00:37:14,970 hier, dus vergelijk-1.c. 837 00:37:14,970 --> 00:37:19,590 >> Laat ik stel voor dat we krijgen nog een pointer genaamd s, en op te slaan in het de 838 00:37:19,590 --> 00:37:20,610 retourneren waarde van get string. 839 00:37:20,610 --> 00:37:21,750 Laten we hetzelfde doen met t. 840 00:37:21,750 --> 00:37:23,230 Zodat geen van de code is anders. 841 00:37:23,230 --> 00:37:25,420 Ik ga een beetje toe te voegen meer fout nu controleren. 842 00:37:25,420 --> 00:37:29,390 Dus nu dat we soort peeling terug Deze lagen in CS50 van wat een string 843 00:37:29,390 --> 00:37:33,520 eigenlijk is, moeten we meer anaal over het maken van zorgen dat we geen misbruik 844 00:37:33,520 --> 00:37:35,330 ongeldige waarden als null. 845 00:37:35,330 --> 00:37:36,440 >> Dus ik ga gewoon om te controleren. 846 00:37:36,440 --> 00:37:41,490 Als s is niet gelijk aan nul en t werkt niet gelijke null, dat betekent dat we op OK. 847 00:37:41,490 --> 00:37:44,460 Ontvang touwtje niet verknallen krijgen een van deze snaren. 848 00:37:44,460 --> 00:37:51,270 En je kunt misschien wel raden nu, wat doet STR CMP vermoedelijk doen? 849 00:37:51,270 --> 00:37:52,000 String vergelijken. 850 00:37:52,000 --> 00:37:55,470 >> Dus als je het programma in java heb vóór, dit is als de methode gelijk aan de 851 00:37:55,470 --> 00:37:56,490 klasse String. 852 00:37:56,490 --> 00:37:57,890 Maar voor degenen onder u die niet hebt geprogrammeerd voor, 853 00:37:57,890 --> 00:37:59,320 dit is gewoon een c-functie. 854 00:37:59,320 --> 00:38:02,180 Het gebeurt te komen in een bestand genaamd string.h. 855 00:38:02,180 --> 00:38:03,830 Dat is waar het wordt gedeclareerd. 856 00:38:03,830 --> 00:38:05,110 >> En string vergelijken - 857 00:38:05,110 --> 00:38:07,530 Ik heb eigenlijk vergeten het gebruik ervan, maar nooit erg. 858 00:38:07,530 --> 00:38:10,470 Bedenk dat we kunnen doen man, roer vergelijken. 859 00:38:10,470 --> 00:38:12,590 En dit gaat om het Linux programmeurs handleiding. 860 00:38:12,590 --> 00:38:14,060 En het is, eerlijk gezegd, een beetje cryptisch. 861 00:38:14,060 --> 00:38:15,270 Maar ik kan hier zien dat, yep. 862 00:38:15,270 --> 00:38:17,570 Ik moet string.h omvatten. 863 00:38:17,570 --> 00:38:20,590 >> En er staat hier onder omschrijving, "de string vergelijker functie vergelijkt 864 00:38:20,590 --> 00:38:24,560 de twee snaren S1 en S2. "En S1 en S2 zijn blijkbaar de twee 865 00:38:24,560 --> 00:38:26,120 argumenten doorgegeven inch 866 00:38:26,120 --> 00:38:28,650 Ik heb niet echt herinneren wat const, maar nu merken - 867 00:38:28,650 --> 00:38:31,480 en misschien heb je al gezien dit bij heb je gebruik maken van de man-pagina's als u 868 00:38:31,480 --> 00:38:32,390 hebben het allemaal - 869 00:38:32,390 --> 00:38:36,220 dat char ster is gewoon synoniem met een touwtje. 870 00:38:36,220 --> 00:38:40,440 >> Dus het vergelijkt de twee snaren, S1 en S2 en een integer retourneert minder 871 00:38:40,440 --> 00:38:44,930 dan of gelijk aan of groter dan nul als S1 wordt gevonden, respectievelijk te 872 00:38:44,930 --> 00:38:47,450 minder dan, of de wedstrijd, of groter dan S2. 873 00:38:47,450 --> 00:38:51,220 Dat is gewoon een zeer complexe manier om te zeggen die string rendementen vergelijken 874 00:38:51,220 --> 00:38:55,760 nul als twee tekenreeksen zijn intuïtief identiek karakter voor 875 00:38:55,760 --> 00:38:57,120 karakter voor karakter. 876 00:38:57,120 --> 00:38:59,970 >> Het geeft een negatief getal als s, alfabetisch, wordt verondersteld 877 00:38:59,970 --> 00:39:01,010 te komen voordat t. 878 00:39:01,010 --> 00:39:05,300 Of geeft een positief getal als s verondersteld na t komen 879 00:39:05,300 --> 00:39:06,170 alfabetisch. 880 00:39:06,170 --> 00:39:08,360 Dus met deze eenvoudige functie, kon u, bijvoorbeeld, sorteren een 881 00:39:08,360 --> 00:39:09,770 heleboel woorden? 882 00:39:09,770 --> 00:39:13,984 >> Dus in deze nieuwe versie, ik ga om verder te gaan en maak compare1. 883 00:39:13,984 --> 00:39:15,750 Dot slash vergelijken een. 884 00:39:15,750 --> 00:39:18,030 Ik typ in hello in alle kleine letters. 885 00:39:18,030 --> 00:39:20,300 Ik ga om te typen in hello in alle kleine letters weer. 886 00:39:20,300 --> 00:39:23,340 En gelukkig nu realiseert Ik typte het zelfde ding. 887 00:39:23,340 --> 00:39:27,520 >> Ondertussen, als ik typ in hello in lagere zaak en HELLO in hoofdletters en 888 00:39:27,520 --> 00:39:29,710 vergelijk ze, ik typte verschillende dingen. 889 00:39:29,710 --> 00:39:32,530 Omdat niet alleen de adressen verschillend, maar we vergelijken 890 00:39:32,530 --> 00:39:35,350 verschillende karakters opnieuw en opnieuw. 891 00:39:35,350 --> 00:39:37,320 >> Nou laten we gaan en vast te stellen een ander probleem nu. 892 00:39:37,320 --> 00:39:41,590 Laat me open versie een van exemplaar, dat nu gericht 893 00:39:41,590 --> 00:39:42,900 dit probleem als volgt. 894 00:39:42,900 --> 00:39:45,650 En deze gaat kijken een beetje ingewikkelder. 895 00:39:45,650 --> 00:39:49,320 Maar als je nadenkt over welk probleem we moeten oplossen, hopelijk zal dit worden 896 00:39:49,320 --> 00:39:51,870 duidelijk in slechts een moment nu. 897 00:39:51,870 --> 00:39:57,280 >> Dus deze eerste lijn, char start t, in lekentaal kan iemand voorstellen 898 00:39:57,280 --> 00:39:59,450 Wat deze lijn hier betekent? 899 00:39:59,450 --> 00:40:01,050 Char ster t, wat is dat nou? 900 00:40:01,050 --> 00:40:06,660 901 00:40:06,660 --> 00:40:07,210 >> Goed. 902 00:40:07,210 --> 00:40:09,500 Maak een pointer naar een aantal plek in het geheugen. 903 00:40:09,500 --> 00:40:10,930 En laat me verfijnen het een beetje. 904 00:40:10,930 --> 00:40:17,180 Verklaren een variabele die zal slaan de adres van enkele char in het geheugen, net 905 00:40:17,180 --> 00:40:18,480 om een ​​beetje meer gepast. 906 00:40:18,480 --> 00:40:21,210 >> OK, dus nu aan de rechterkant, ik heb nooit een van deze functies gezien 907 00:40:21,210 --> 00:40:22,660 vóór, malloc. 908 00:40:22,660 --> 00:40:26,980 Maar wat zou dat betekenen? 909 00:40:26,980 --> 00:40:28,050 Toewijzing van het geheugen. 910 00:40:28,050 --> 00:40:29,410 Geheugen toewijzing. 911 00:40:29,410 --> 00:40:33,050 >> Zo blijkt, tot nu toe, we nog niet echt had een krachtige manier van 912 00:40:33,050 --> 00:40:36,210 vraagt ​​het besturingssysteem, geef me wat geheugen. 913 00:40:36,210 --> 00:40:39,980 Integendeel, we hebben nu een functie genaamd malloc dat precies dat doet. 914 00:40:39,980 --> 00:40:42,960 Ook al is dit een beetje een afleiding nu, merken dat in 915 00:40:42,960 --> 00:40:46,200 tussen twee haakjes gewoon gaan om een ​​nummer te zijn. 916 00:40:46,200 --> 00:40:48,510 Waar ik in kwestie hebt getypt markeringen kan een nummer zijn. 917 00:40:48,510 --> 00:40:51,020 >> En dat nummer betekent, geef me 10 bytes. 918 00:40:51,020 --> 00:40:52,320 Geef me 20 bytes. 919 00:40:52,320 --> 00:40:53,820 Geef me 100 bytes. 920 00:40:53,820 --> 00:40:56,500 En malloc zal haar best doen om vraagt ​​het besturingssysteem - 921 00:40:56,500 --> 00:40:57,630 Linux, in dit geval - 922 00:40:57,630 --> 00:40:59,630 hey, zijn hun 100 bytes RAM-geheugen beschikbaar is? 923 00:40:59,630 --> 00:41:04,320 Als dat zo is, terug die bytes aan mij door terugkerende waarvan het adres van 924 00:41:04,320 --> 00:41:06,610 die bytes, misschien? 925 00:41:06,610 --> 00:41:07,610 De allereerste. 926 00:41:07,610 --> 00:41:10,460 >> Dus hier ook - en dit is overheersend in C, elke keer dat je 927 00:41:10,460 --> 00:41:11,680 omgaan met adressen? 928 00:41:11,680 --> 00:41:15,830 Je bent bijna altijd te maken met de eerst zoals adres, ongeacht hoe groot 929 00:41:15,830 --> 00:41:19,490 een stuk van het geheugen u wordt teruggegeven, zo te zeggen. 930 00:41:19,490 --> 00:41:20,880 >> Dus laten we duiken in hier. 931 00:41:20,880 --> 00:41:23,940 Ik probeer te wijzen hoe veel bytes, precies? 932 00:41:23,940 --> 00:41:24,080 Well. 933 00:41:24,080 --> 00:41:26,090 String lengte van s - laten we doe een concreet voorbeeld. 934 00:41:26,090 --> 00:41:30,700 Als s hello, H-E-L-L-O, wat is het snaarlengte van s, natuurlijk? 935 00:41:30,700 --> 00:41:32,010 Dus het is vijf. 936 00:41:32,010 --> 00:41:34,590 Maar ik ben bezig met een plus 1 op dat, waarom? 937 00:41:34,590 --> 00:41:37,700 Waarom wil ik zes bytes in plaats van vijf? 938 00:41:37,700 --> 00:41:38,790 De nul-karakter. 939 00:41:38,790 --> 00:41:41,210 >> Ik wil niet te vertrekken uit deze speciale null karakter. 940 00:41:41,210 --> 00:41:45,160 Want als ik een kopie maken van Hallo en gewoon doen H-E-L-L-O, maar ik doe er niet 941 00:41:45,160 --> 00:41:50,160 dat bijzondere karakter, de computer misschien niet, bij toeval, een backslash 942 00:41:50,160 --> 00:41:51,730 nul er voor mij. 943 00:41:51,730 --> 00:41:55,570 En dus als ik probeer te achterhalen van de lengte van de kopie, zou ik denk dat 944 00:41:55,570 --> 00:41:59,360 het is 20 karakters lang zijn, of een miljoen tekens lang zijn als ik gewoon nooit gebeuren 945 00:41:59,360 --> 00:42:01,050 een backslash nul geraakt. 946 00:42:01,050 --> 00:42:05,780 >> Dus moeten we zes bytes op te slaan H-E-L-L-O, backslash nul. 947 00:42:05,780 --> 00:42:07,870 En dan is dit gewoon tot super anaal te zijn. 948 00:42:07,870 --> 00:42:10,700 Stel dat ik vergeten wat de grootte van een char. 949 00:42:10,700 --> 00:42:12,020 We blijven zeggen het is een byte. 950 00:42:12,020 --> 00:42:12,860 En is het meestal. 951 00:42:12,860 --> 00:42:15,425 In theorie zou het iets zijn anders, op een andere Mac of 952 00:42:15,425 --> 00:42:16,250 verschillende PC. 953 00:42:16,250 --> 00:42:19,650 >> Zo blijkt er deze operator riep sizeof dat als je het het passeren 954 00:42:19,650 --> 00:42:22,680 naam van een data type - zoals char of int of float - 955 00:42:22,680 --> 00:42:26,930 het zal u vertellen, dynamisch, hoeveel bytes een char neemt op dit 956 00:42:26,930 --> 00:42:28,090 specifieke computer. 957 00:42:28,090 --> 00:42:31,360 >> Dus dit is in feite gewoon als zeggen tijden 1 of 958 00:42:31,360 --> 00:42:32,440 keer helemaal niets. 959 00:42:32,440 --> 00:42:36,340 Maar ik doe het alleen maar om super anaal te zijn, dat voor het geval dat een char verschilt 960 00:42:36,340 --> 00:42:40,610 op uw computer versus mijne, op deze manier de wiskunde gaat altijd uit te checken. 961 00:42:40,610 --> 00:42:43,720 >> Tot slot, hier beneden kijk ik voor null, dat is altijd een goede gewoonte - weer, 962 00:42:43,720 --> 00:42:44,920 elke keer dat we met pointers. 963 00:42:44,920 --> 00:42:47,520 Als malloc was niet in staat om te geven me zes byes - dat is 964 00:42:47,520 --> 00:42:49,210 onwaarschijnlijk, maar voor het geval - 965 00:42:49,210 --> 00:42:50,730 onmiddellijk terug een. 966 00:42:50,730 --> 00:42:53,290 En nu, ga je gang en kopieer str als volgt. 967 00:42:53,290 --> 00:42:57,240 En dit is bekend syntax, zij het in een andere rol. 968 00:42:57,240 --> 00:43:01,210 >> Ik ga om te gaan en krijgen de string lengte van s en opslaan in n. 969 00:43:01,210 --> 00:43:06,620 Ik ben dan ga herhalen van i gelijk nul tot en met n, 970 00:43:06,620 --> 00:43:08,410 groter dan of gelijk aan. 971 00:43:08,410 --> 00:43:13,540 Zodat op elke iteratie, zet ik de ide karakter van s in de i 972 00:43:13,540 --> 00:43:15,380 karakter van de t. 973 00:43:15,380 --> 00:43:18,190 >> Dus wat er werkelijk aan de hand eronder de kap hier? 974 00:43:18,190 --> 00:43:22,140 Goed als dit bijvoorbeeld is s - 975 00:43:22,140 --> 00:43:26,400 en ik heb in het woord H-E-L-L-O getypt en er is een backslash nul. 976 00:43:26,400 --> 00:43:29,020 En nogmaals, dit is s hier wijzen. 977 00:43:29,020 --> 00:43:30,830 En nu hier is t. 978 00:43:30,830 --> 00:43:34,860 >> En dit is nu wijst naar een kopie van het geheugen, toch? 979 00:43:34,860 --> 00:43:37,340 Malloc heeft me een hele gegeven stuk van het geheugen. 980 00:43:37,340 --> 00:43:41,440 Ik weet niet in eerste instantie wat in een van deze locaties. 981 00:43:41,440 --> 00:43:44,340 Dus ik ga denken van deze als een hele hoop vraagtekens. 982 00:43:44,340 --> 00:43:50,190 >> Maar zodra ik begin looping van nul op omhoog door de lengte van s, t 983 00:43:50,190 --> 00:43:52,790 beugel nul en t beugel 1 - 984 00:43:52,790 --> 00:43:55,080 en ik zal dit nu gezet de overhead - 985 00:43:55,080 --> 00:44:04,190 t beugel nul en s beugel nul betekenen dat ik ga te kopiëren 986 00:44:04,190 --> 00:44:09,875 iteratief h in hier, E-L-L-O. Plus, want ik heb de plus 987 00:44:09,875 --> 00:44:12,370 1, backslash nul. 988 00:44:12,370 --> 00:44:19,060 >> Dus nu bij vergelijk-1.c, in het einde, als ik afdruk van de 989 00:44:19,060 --> 00:44:24,760 kapitalisatie van t, we moeten zien dat s is ongewijzigd. 990 00:44:24,760 --> 00:44:26,090 Laat me nu ga je gang en doe dit. 991 00:44:26,090 --> 00:44:28,630 Dus zorg copy1. 992 00:44:28,630 --> 00:44:30,860 Dot slash copy1. 993 00:44:30,860 --> 00:44:33,670 Ik ga om te typen in hello, Enter. 994 00:44:33,670 --> 00:44:37,430 En let nu op, alleen de kopie is geactiveerd. 995 00:44:37,430 --> 00:44:40,890 Omdat ik echt heb twee delen van het geheugen. 996 00:44:40,890 --> 00:44:44,390 >> Helaas, kunt u een aantal mooie doen slecht en behoorlijk gevaarlijk dingen hier. 997 00:44:44,390 --> 00:44:49,290 Laat ik trek een voorbeeld hier nu, dat geeft ons een voorbeeld van een paar 998 00:44:49,290 --> 00:44:51,540 verschillende lijnen. 999 00:44:51,540 --> 00:44:56,040 Dus gewoon intuïtief hier, de eerste lijn van de code, int ster x, is te verklaren 1000 00:44:56,040 --> 00:44:57,340 een variabele genaamd x. 1001 00:44:57,340 --> 00:44:58,810 En wat is het datatype van die variabele? 1002 00:44:58,810 --> 00:45:01,820 1003 00:45:01,820 --> 00:45:04,290 Wat is het gegevenstype van de variabele? 1004 00:45:04,290 --> 00:45:06,980 Dat was niet de cliffhanger. 1005 00:45:06,980 --> 00:45:08,350 >> De data type is int ster. 1006 00:45:08,350 --> 00:45:12,600 Dus wat betekent dat? x zal slaan het adres van een int. 1007 00:45:12,600 --> 00:45:13,520 Zo simpel is dat. 1008 00:45:13,520 --> 00:45:16,220 Y gaat het slaan adres van een int. 1009 00:45:16,220 --> 00:45:18,390 Wat is de derde regel van code daar aan het doen? 1010 00:45:18,390 --> 00:45:21,850 Het toewijzen van hoeveel bytes, waarschijnlijk? 1011 00:45:21,850 --> 00:45:22,350 Four. 1012 00:45:22,350 --> 00:45:25,460 Vanwege de grootte van een int is meestal vier, malloc van vier geeft 1013 00:45:25,460 --> 00:45:29,950 me terug het adres van een brok van geheugen, de eerste waarvan bytes 1014 00:45:29,950 --> 00:45:32,110 nu opgeslagen in x. 1015 00:45:32,110 --> 00:45:34,410 >> Nu we gaan een beetje snel. 1016 00:45:34,410 --> 00:45:35,760 Star x betekent wat? 1017 00:45:35,760 --> 00:45:38,480 1018 00:45:38,480 --> 00:45:42,590 Het betekent naar dat adres en zet welk nummer er? 1019 00:45:42,590 --> 00:45:43,870 Zet het nummer 42 daar. 1020 00:45:43,870 --> 00:45:47,590 Star y betekent naar wat er op y en zet het nummer 13 daar. 1021 00:45:47,590 --> 00:45:48,600 >> Maar wacht eens even. 1022 00:45:48,600 --> 00:45:51,640 Wat is in y op dit moment? 1023 00:45:51,640 --> 00:45:54,950 Wat adres is y het opslaan? 1024 00:45:54,950 --> 00:45:55,770 We weten niet, toch? 1025 00:45:55,770 --> 00:45:59,230 We hebben nog nooit een keer gebruik maken van de opdracht operator waarbij y. 1026 00:45:59,230 --> 00:46:03,370 Dus y die zijn aangegeven op de tweede regel van code is slechts enkele vuilnis waarde, een grote 1027 00:46:03,370 --> 00:46:04,760 vraagteken zo te zeggen. 1028 00:46:04,760 --> 00:46:07,230 Het kan willekeurig wijzen iets geheugen die 1029 00:46:07,230 --> 00:46:08,340 het algemeen slecht. 1030 00:46:08,340 --> 00:46:13,540 >> Dus zodra we raken die lijn daar, ster y is gelijk aan 13, iets slechts, 1031 00:46:13,540 --> 00:46:17,220 iets wat heel slecht is over gebeuren om Binky. 1032 00:46:17,220 --> 00:46:25,810 Dus laten we eens kijken wat er gaat uiteindelijk gebeurt hier Binky in deze minuut 1033 00:46:25,810 --> 00:46:26,200 of zo kijken. 1034 00:46:26,200 --> 00:46:26,490 >> [VIDEO AFSPELEN] 1035 00:46:26,490 --> 00:46:26,745 >> -He, Binky. 1036 00:46:26,745 --> 00:46:27,000 Wakker worden. 1037 00:46:27,000 --> 00:46:29,296 Het is tijd voor pointer lol. 1038 00:46:29,296 --> 00:46:30,680 >> -Wat is dat? 1039 00:46:30,680 --> 00:46:31,980 Meer informatie over pointers? 1040 00:46:31,980 --> 00:46:34,010 Oh, goodie. 1041 00:46:34,010 --> 00:46:37,220 >> -Nou, om te beginnen, ik denk dat we ga een paar pointers nodig. 1042 00:46:37,220 --> 00:46:37,930 >> -OK. 1043 00:46:37,930 --> 00:46:41,650 Deze code kent twee wijzers die kunnen wijzen op gehele getallen. 1044 00:46:41,650 --> 00:46:43,760 >> -OK, nou, ik zie de twee pointers. 1045 00:46:43,760 --> 00:46:45,850 Maar ze lijken niet te zijn wijzend naar iets. 1046 00:46:45,850 --> 00:46:46,490 >> -Dat klopt. 1047 00:46:46,490 --> 00:46:48,630 Aanvankelijk pointers niet wijzen naar iets. 1048 00:46:48,630 --> 00:46:51,700 De dingen die ze wijzen op zijn geroepen pointees, en de inrichting daarvan is een 1049 00:46:51,700 --> 00:46:52,850 afzonderlijke stap. 1050 00:46:52,850 --> 00:46:53,740 >> -Oh, rechts, rechts. 1051 00:46:53,740 --> 00:46:54,500 Ik wist dat. 1052 00:46:54,500 --> 00:46:56,270 De pointees zijn gescheiden. 1053 00:46:56,270 --> 00:46:58,553 Dus hoe kan je een pointee toewijzen? 1054 00:46:58,553 --> 00:46:59,480 >> -OK. 1055 00:46:59,480 --> 00:47:03,707 Nou, deze code wijst een nieuwe integers pointee, en dit deel stelt x 1056 00:47:03,707 --> 00:47:05,520 om te wijzen op het. 1057 00:47:05,520 --> 00:47:06,760 >> -He, dat ziet er beter uit. 1058 00:47:06,760 --> 00:47:08,520 Dus maak er iets aan te doen. 1059 00:47:08,520 --> 00:47:09,530 >> -OK. 1060 00:47:09,530 --> 00:47:14,110 Ik zal dereferentie de aanwijzer x op te slaan het nummer 42 in zijn pointee. 1061 00:47:14,110 --> 00:47:17,660 Voor deze truc, zal ik mijn magic nodig toverstok van dereferentie. 1062 00:47:17,660 --> 00:47:20,695 >> -Uw toverstaf van dereferentie? 1063 00:47:20,695 --> 00:47:22,632 Uh, dat is geweldig. 1064 00:47:22,632 --> 00:47:24,620 >> -Dit is wat de code eruit ziet. 1065 00:47:24,620 --> 00:47:27,526 Ik zal gewoon het opzetten van het nummer, en - 1066 00:47:27,526 --> 00:47:28,250 >> -He, kijk. 1067 00:47:28,250 --> 00:47:29,680 Daar gaat. 1068 00:47:29,680 --> 00:47:34,520 Daarbij een dereferentie op x volgt de pijl voor toegang tot haar pointee. 1069 00:47:34,520 --> 00:47:36,690 In dat geval bewaart 42 in. 1070 00:47:36,690 --> 00:47:40,890 Hey, probeer dan om het nummer op te slaan 13 via een andere aanwijzer, y. 1071 00:47:40,890 --> 00:47:42,125 >> -OK. 1072 00:47:42,125 --> 00:47:46,810 Ik ga gewoon hier naar y en krijgt het nummer 13 ingesteld. 1073 00:47:46,810 --> 00:47:50,890 En neem vervolgens de staf van dereferentie en net - 1074 00:47:50,890 --> 00:47:52,430 whoa! 1075 00:47:52,430 --> 00:47:53,030 >> -Oh, hey. 1076 00:47:53,030 --> 00:47:54,610 Dat werkte niet. 1077 00:47:54,610 --> 00:47:58,200 Zeggen, Binky, ik denk niet dat de dereferentie y is een goed idee, 1078 00:47:58,200 --> 00:48:01,370 omdat het opzetten van de pointee is een afzonderlijke stap. 1079 00:48:01,370 --> 00:48:03,460 En ik denk niet dat we ooit deden. 1080 00:48:03,460 --> 00:48:03,810 >> -Hmm. 1081 00:48:03,810 --> 00:48:05,160 Goed punt. 1082 00:48:05,160 --> 00:48:07,410 >> -Ja, toegewezen we de aanwijzer y. 1083 00:48:07,410 --> 00:48:10,045 Maar we hebben nooit instellen op wijzen op een pointee. 1084 00:48:10,045 --> 00:48:10,490 >> -Hmm. 1085 00:48:10,490 --> 00:48:12,170 Zeer oplettend. 1086 00:48:12,170 --> 00:48:13,790 >> -Hey, u op zoek bent goed daar, Binky. 1087 00:48:13,790 --> 00:48:16,920 Je kunt het vast, zodat y punten op dezelfde pointee als x? 1088 00:48:16,920 --> 00:48:17,810 >> -Sure. 1089 00:48:17,810 --> 00:48:20,300 Ik zal mijn toverstaf van gebruik pointer opdracht. 1090 00:48:20,300 --> 00:48:22,240 >> -Is dat gaat worden een probleem als voorheen? 1091 00:48:22,240 --> 00:48:22,665 >> -Nee. 1092 00:48:22,665 --> 00:48:24,300 Dit is niet de pointees raken. 1093 00:48:24,300 --> 00:48:27,880 Het verandert slechts een pointer punt op hetzelfde neer als een ander. 1094 00:48:27,880 --> 00:48:28,970 >> -Oh, zie ik. 1095 00:48:28,970 --> 00:48:31,730 Nu y wijst naar dezelfde plaats als x. 1096 00:48:31,730 --> 00:48:32,450 Dus wacht. 1097 00:48:32,450 --> 00:48:33,490 Nu y is bevestigd. 1098 00:48:33,490 --> 00:48:34,630 Het heeft een pointee. 1099 00:48:34,630 --> 00:48:36,520 Dus u kunt de staf proberen van opnieuw dereferentie 1100 00:48:36,520 --> 00:48:39,200 om de 13 sturen over. 1101 00:48:39,200 --> 00:48:39,840 >> -OK. 1102 00:48:39,840 --> 00:48:41,570 Hier gaat. 1103 00:48:41,570 --> 00:48:42,870 >> -He, kijk daar eens. 1104 00:48:42,870 --> 00:48:44,320 Nu dereferentie werkt op y. 1105 00:48:44,320 --> 00:48:47,020 En omdat de wijzers zijn het delen van dat pointee zij 1106 00:48:47,020 --> 00:48:48,585 zowel zie de 13. 1107 00:48:48,585 --> 00:48:49,040 >> -Ja. 1108 00:48:49,040 --> 00:48:49,670 Delen. 1109 00:48:49,670 --> 00:48:50,380 Whatever. 1110 00:48:50,380 --> 00:48:52,290 Dus gaan we switch plaatsen nu? 1111 00:48:52,290 --> 00:48:52,970 >> -Oh, kijk. 1112 00:48:52,970 --> 00:48:54,150 We hebben geen tijd meer. 1113 00:48:54,150 --> 00:48:55,200 >> -Maar - 1114 00:48:55,200 --> 00:48:57,060 >> -Vergeet de drie pointer regels. 1115 00:48:57,060 --> 00:49:00,100 Nummer een, de basisstructuur is dat je een pointer. 1116 00:49:00,100 --> 00:49:02,170 En het wijst op een pointee. 1117 00:49:02,170 --> 00:49:04,160 Maar de aanwijzer en pointee zijn gescheiden. 1118 00:49:04,160 --> 00:49:06,460 En de veel voorkomende fout is te het opzetten van een pointer, maar om 1119 00:49:06,460 --> 00:49:08,540 vergeten om gegeven een pointee. 1120 00:49:08,540 --> 00:49:12,460 >> Nummer twee, wijzer dereferentie start op de aanwijzer en volgt haar 1121 00:49:12,460 --> 00:49:14,570 pijl om, zodat de pointee. 1122 00:49:14,570 --> 00:49:18,640 Zoals we allemaal weten, dit werkt alleen als er is een pointee, die terug komt naar 1123 00:49:18,640 --> 00:49:19,790 regel nummer een. 1124 00:49:19,790 --> 00:49:23,670 >> Nummer drie, wijzer opdracht neemt een wijzer en veranderingen die het te wijzen op 1125 00:49:23,670 --> 00:49:25,850 dezelfde pointee als een aanwijzer. 1126 00:49:25,850 --> 00:49:27,840 Dus na de opdracht, de twee wijzers zullen 1127 00:49:27,840 --> 00:49:29,430 naar dezelfde pointee. 1128 00:49:29,430 --> 00:49:31,600 Soms is dat heet delen. 1129 00:49:31,600 --> 00:49:33,430 En dat is alles wat er is, echt. 1130 00:49:33,430 --> 00:49:33,840 Bye bye nu. 1131 00:49:33,840 --> 00:49:34,300 >> [END VIDEO AFSPELEN] 1132 00:49:34,300 --> 00:49:36,940 >> DAVID Malan: Dus meer op pointers, meer op Binky volgende week. 1133 00:49:36,940 --> 00:49:38,190 We zien je op maandag. 1134 00:49:38,190 --> 00:49:42,187