1 00:00:00,000 --> 00:00:11,320 2 00:00:11,320 --> 00:00:13,260 >> DAVID MALAN: Hej, och välkommen tillbaka till CS50. 3 00:00:13,260 --> 00:00:14,860 Så detta är slutet på vecka fyra. 4 00:00:14,860 --> 00:00:16,680 Bara ett meddelande först. 5 00:00:16,680 --> 00:00:19,600 Så den så kallade femte måndag är kommer upp denna kommande måndag. 6 00:00:19,600 --> 00:00:22,800 Detta är den möjlighet att byta från SAT / UNSAT till ett brev klass, eller från 7 00:00:22,800 --> 00:00:24,130 brev klass SAT / UNSAT. 8 00:00:24,130 --> 00:00:27,130 Irriterande, gör att processen kräver en signatur, eftersom du måste fylla 9 00:00:27,130 --> 00:00:28,770 ut en av dessa rosa add / drop former. 10 00:00:28,770 --> 00:00:31,680 >> Eftersom tekniskt, SAT / UNSAT version och brev klass version 11 00:00:31,680 --> 00:00:33,320 har distinkt katalognummer. 12 00:00:33,320 --> 00:00:34,240 Men ingen big deal. 13 00:00:34,240 --> 00:00:36,620 Bara komma upp till mig eller till Rob eller till Lauren som helst. 14 00:00:36,620 --> 00:00:39,550 Eller maila oss om du inte har den sortens pappersarbete du behöver idag, och vi 15 00:00:39,550 --> 00:00:43,410 kommer säkert att hjälpa dig att ta hand om det innan måndag. 16 00:00:43,410 --> 00:00:45,780 >> Okej, så idag - 17 00:00:45,780 --> 00:00:47,630 faktiskt, det är lite av ett eko. 18 00:00:47,630 --> 00:00:51,070 Kan vi tona ner mig lite? 19 00:00:51,070 --> 00:00:51,730 OK. 20 00:00:51,730 --> 00:00:54,850 Så idag introducerar vi ett ämne kallas pekare. 21 00:00:54,850 --> 00:00:57,770 Och jag ska erkänna att detta är en av de mer komplexa ämnen som vi tenderar att 22 00:00:57,770 --> 00:01:00,960 täcka i denna klass, eller egentligen någon introduktionskurs som använder C. 23 00:01:00,960 --> 00:01:05,510 >> Men ta mitt ord för det, särskilt Om ditt sinne känns lite mer böjd 24 00:01:05,510 --> 00:01:07,100 idag och i de kommande veckorna. 25 00:01:07,100 --> 00:01:10,340 Det är inte representativ för att du får värre på detta det betyder bara att 26 00:01:10,340 --> 00:01:13,360 det är en särskilt sofistikerad ämne jag lovar, några veckor 27 00:01:13,360 --> 00:01:17,610 därmed kommer att verka alltför påfallande okomplicerad i efterhand. 28 00:01:17,610 --> 00:01:18,720 >> Jag minns fortfarande till denna dag. 29 00:01:18,720 --> 00:01:22,190 Jag satt i Elliott Dining Hall, sitter bredvid min TF Nishat Mehta, 30 00:01:22,190 --> 00:01:24,070 som var bosatt i Elliott huset. 31 00:01:24,070 --> 00:01:26,340 Och av någon anledning, detta ämne klickar bara. 32 00:01:26,340 --> 00:01:29,430 Vilket är att säga att även jag kämpade med den för en viss tid, men jag 33 00:01:29,430 --> 00:01:33,610 kommer att göra mitt bästa för att hjälpa till att undvika en sådan kämpar med ett ämne som i slutändan 34 00:01:33,610 --> 00:01:34,580 är ganska kraftfull. 35 00:01:34,580 --> 00:01:37,350 >> I själva verket ett av de ämnen som vi kommer att diskutera i de kommande veckorna är att 36 00:01:37,350 --> 00:01:41,130 av säkerhet, och hur du kan faktiskt utnyttja maskinerna på sätt 37 00:01:41,130 --> 00:01:42,320 som inte var avsedda. 38 00:01:42,320 --> 00:01:45,850 Och dessa exploateringar är typiskt resultatet av buggar, misstag som vi 39 00:01:45,850 --> 00:01:49,740 människor gör genom att inte förstå några av den underliggande genomförandet 40 00:01:49,740 --> 00:01:52,250 information via vilka program görs. 41 00:01:52,250 --> 00:01:55,410 >> Nu för att göra detta verkar allt mer användarvänliga vänlig, trodde jag att jag skulle spela en 10 42 00:01:55,410 --> 00:01:59,680 andra förhandsvisning av en liten claymation Figuren heter Binky som fördes till 43 00:01:59,680 --> 00:02:03,020 livet av en vän till oss på Stanford, professor Nick Parlante. 44 00:02:03,020 --> 00:02:06,753 Så låt mig ge dig det här teaser av Binky här. 45 00:02:06,753 --> 00:02:09,520 >> [VIDEO SPELA] 46 00:02:09,520 --> 00:02:10,380 >> -Hej, Binky. 47 00:02:10,380 --> 00:02:11,050 Vakna. 48 00:02:11,050 --> 00:02:13,610 Det är dags för pekaren kul. 49 00:02:13,610 --> 00:02:14,741 >> -Vad är det? 50 00:02:14,741 --> 00:02:16,440 Läs om pekare? 51 00:02:16,440 --> 00:02:17,928 Åh, goodie. 52 00:02:17,928 --> 00:02:18,920 >> [END VIDEOAVSPELNING] 53 00:02:18,920 --> 00:02:20,670 >> DAVID MALAN: Det är Stanford datavetenskap. 54 00:02:20,670 --> 00:02:23,194 Så mer om detta framöver. 55 00:02:23,194 --> 00:02:24,930 >> [Applåder] 56 00:02:24,930 --> 00:02:26,660 >> DAVID MALAN: Tyvärr, Nick. 57 00:02:26,660 --> 00:02:30,680 >> Så minns att förra gången vi slutade på detta verkligen spännande cliffhanger 58 00:02:30,680 --> 00:02:32,960 varigenom denna funktion bara fungerade inte. 59 00:02:32,960 --> 00:02:34,960 Åtminstone intuitivt, det kändes som det borde fungera. 60 00:02:34,960 --> 00:02:37,600 Enkelt att byta ut värdena av två heltal. 61 00:02:37,600 --> 00:02:40,915 Men minns att när vi skrev ut ursprungliga värdena i huvud, en och 62 00:02:40,915 --> 00:02:44,210 två, var de fortfarande en och två och inte två och en. 63 00:02:44,210 --> 00:02:46,070 >> Så låt mig faktiskt byta över till apparaten. 64 00:02:46,070 --> 00:02:50,180 Och jag skrev upp lite av skelett kod i avancera här, där jag hävdar att x 65 00:02:50,180 --> 00:02:52,500 kommer att vara ett, kommer y vara 2. 66 00:02:52,500 --> 00:02:54,810 Jag skriver ut sedan ut båda sina värden med tryck f. 67 00:02:54,810 --> 00:02:57,540 >> Jag hävdar då här nere att vi kommer att byta dem. 68 00:02:57,540 --> 00:03:00,800 Jag lämnade en tom plats här för oss att fyll i dag på bara ett ögonblick. 69 00:03:00,800 --> 00:03:03,380 Sedan kommer jag att hävda att två variabler har bytts. 70 00:03:03,380 --> 00:03:04,770 Sedan kommer jag att skriva ut ut dem igen. 71 00:03:04,770 --> 00:03:07,090 Och så förhoppningsvis ska jag se 1, 2. 72 00:03:07,090 --> 00:03:07,380 2, 1. 73 00:03:07,380 --> 00:03:09,830 Det är super enkelt Målet just nu. 74 00:03:09,830 --> 00:03:12,430 >> Så hur går vi om att byta två variabler? 75 00:03:12,430 --> 00:03:17,220 Tja, om jag föreslår här att dessa koppar kan representera minne i en dator. 76 00:03:17,220 --> 00:03:19,070 Detta är några tuggor, detta är ytterligare några tuggor. 77 00:03:19,070 --> 00:03:23,260 Kan vi ha en volontär Kom upp och blanda oss några drinkar, om bekant? 78 00:03:23,260 --> 00:03:23,920 Kom upp. 79 00:03:23,920 --> 00:03:24,815 Vad är ditt namn? 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 upp, Jess. 83 00:03:26,540 --> 00:03:29,180 Om du inte gör något, måste vi sätta Google Glass på dig så att vi kan 84 00:03:29,180 --> 00:03:30,430 föreviga detta. 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 Spela in en video. 88 00:03:37,250 --> 00:03:43,103 Och OK, är vi bra att gå med Jess hit. 89 00:03:43,103 --> 00:03:43,810 Okej. 90 00:03:43,810 --> 00:03:45,120 Trevligt att träffas. 91 00:03:45,120 --> 00:03:47,720 >> Så vad jag vill att du gör här - om du kunde, ganska snabbt - 92 00:03:47,720 --> 00:03:51,040 bara häller oss ett halvt glas apelsin juice och ett halvt glas mjölk, 93 00:03:51,040 --> 00:03:55,710 företräder effektivt siffrorna 1 i en kopp och två i den andra koppen. 94 00:03:55,710 --> 00:04:01,380 95 00:04:01,380 --> 00:04:02,630 >> Detta kommer att bli bra film. 96 00:04:02,630 --> 00:04:04,910 97 00:04:04,910 --> 00:04:05,860 >> JESS: Förlåt. 98 00:04:05,860 --> 00:04:06,330 >> DAVID MALAN: Nej, nej. 99 00:04:06,330 --> 00:04:08,703 Det är OK. 100 00:04:08,703 --> 00:04:10,120 Trevligt. 101 00:04:10,120 --> 00:04:12,950 Okej, så vi har fyra bytes värt apelsinjuice. 102 00:04:12,950 --> 00:04:14,460 Vi kallade det värdet 1. 103 00:04:14,460 --> 00:04:16,579 Nu ytterligare fyra bytes värde av mjölk. 104 00:04:16,579 --> 00:04:18,519 Kommer att kalla det värde 2. 105 00:04:18,519 --> 00:04:20,440 Så x och y, respektive. 106 00:04:20,440 --> 00:04:23,450 >> Okej, så nu om uppgiften - för dig, Jess, framför allt 107 00:04:23,450 --> 00:04:24,270 av dina klasskamrater - 108 00:04:24,270 --> 00:04:28,510 är att byta värden på x och y sådana att vi vill ha apelsinjuice i 109 00:04:28,510 --> 00:04:32,070 andra kopp och mjölk i denna cup, hur kanske du - innan du faktiskt gör 110 00:04:32,070 --> 00:04:34,020 det - gå om att göra detta? 111 00:04:34,020 --> 00:04:35,220 >> OK, klokt beslut. 112 00:04:35,220 --> 00:04:36,340 Så du behöver lite mer minne. 113 00:04:36,340 --> 00:04:38,190 Så låt oss fördela en tillfällig cup, om ni så vill. 114 00:04:38,190 --> 00:04:40,540 Och nu fortsätter att byta x och y. 115 00:04:40,540 --> 00:04:52,950 116 00:04:52,950 --> 00:04:53,530 >> Utmärkt. 117 00:04:53,530 --> 00:04:54,420 Så mycket bra gjort. 118 00:04:54,420 --> 00:04:55,670 Tack så mycket, Jess. 119 00:04:55,670 --> 00:04:59,520 120 00:04:59,520 --> 00:05:00,020 Varsågod. 121 00:05:00,020 --> 00:05:01,950 En liten souvenir. 122 00:05:01,950 --> 00:05:04,350 >> OK, så självklart, super enkel idé. 123 00:05:04,350 --> 00:05:07,500 Helt intuitivt att vi behöver lite mer lagringsutrymme - i denna form, 124 00:05:07,500 --> 00:05:09,750 en kopp - om vi verkligen vill byta dessa två variabler. 125 00:05:09,750 --> 00:05:11,110 Så låt oss göra precis det. 126 00:05:11,110 --> 00:05:14,330 Här uppe i mellan där jag hävdar jag kommer att göra något byte, jag ska 127 00:05:14,330 --> 00:05:15,720 gå vidare och förklara temp. 128 00:05:15,720 --> 00:05:17,980 Och jag ska sätta den lika med, säg, x. 129 00:05:17,980 --> 00:05:21,110 >> Sedan kommer jag att ändra värdet på x precis som Jess gjorde här med 130 00:05:21,110 --> 00:05:23,200 mjölk och apelsinjuice vara lika med y. 131 00:05:23,200 --> 00:05:27,460 Och jag kommer att ändra y vara lika att inte x, eftersom vi nu skulle vara 132 00:05:27,460 --> 00:05:29,530 fastnat i en cirkel, utan snarare temp. 133 00:05:29,530 --> 00:05:33,170 Där jag tillfälligt - eller när Jess tillfälligt sätta apelsinjuice 134 00:05:33,170 --> 00:05:35,460 innan dunkardags att kopp med mjölken. 135 00:05:35,460 --> 00:05:37,250 >> Så låt mig gå vidare nu och göra detta. 136 00:05:37,250 --> 00:05:39,210 Det kallas noswap.c. 137 00:05:39,210 --> 00:05:41,190 Och låt mig nu köra utan swap. 138 00:05:41,190 --> 00:05:43,910 Och ja, jag ser, om jag expandera fönstret lite, som 139 00:05:43,910 --> 00:05:45,160 x är 1, y är 2. 140 00:05:45,160 --> 00:05:47,230 Och då x är 2, y är 1. 141 00:05:47,230 --> 00:05:51,910 >> Men minns att på måndag vi gjorde saker lite annorlunda där jag 142 00:05:51,910 --> 00:05:56,760 istället genomfört en hjälpare funktion, om du vill, var som faktiskt ogiltigt. 143 00:05:56,760 --> 00:05:58,010 Jag kallade det byta. 144 00:05:58,010 --> 00:06:01,600 Jag gav det två parametrar, och jag ringde dem en och jag kallade dem b.. 145 00:06:01,600 --> 00:06:04,380 >> Ärligt talat, skulle jag kalla dem x och y. 146 00:06:04,380 --> 00:06:06,040 Det finns ingenting som hindrar mig från att göra det. 147 00:06:06,040 --> 00:06:08,140 Men jag skulle vilja hävda att det är då lite tvetydig. 148 00:06:08,140 --> 00:06:11,910 Eftersom återkallelse för måndag som vi hävdade att dessa parametrar var 149 00:06:11,910 --> 00:06:13,650 kopior av de värden som gått i. 150 00:06:13,650 --> 00:06:15,640 Så det bud bara med din sinne, tror jag, om du använder 151 00:06:15,640 --> 00:06:17,370 exakt samma variabler. 152 00:06:17,370 --> 00:06:20,150 >> Så jag ska istället kalla dem en och b, bara för tydlighetens skull. 153 00:06:20,150 --> 00:06:21,840 Men vi kan kalla dem mest vad vi vill. 154 00:06:21,840 --> 00:06:26,280 Och jag kommer att kopiera och klistra in effektivt denna kod från uppe 155 00:06:26,280 --> 00:06:27,170 ner i här. 156 00:06:27,170 --> 00:06:29,110 Eftersom jag såg bara att det fungerar. 157 00:06:29,110 --> 00:06:30,790 Så det är i ganska bra form. 158 00:06:30,790 --> 00:06:37,390 Och jag ska ändra min x till en, mitt x till en, min y till b och min y till b.. 159 00:06:37,390 --> 00:06:39,130 >> Så med andra ord, exakt samma logik. 160 00:06:39,130 --> 00:06:40,850 Exakt samma sak som Jess gjorde. 161 00:06:40,850 --> 00:06:44,350 Och så en sak som jag måste göra upp här, är naturligtvis åberopa nu detta 162 00:06:44,350 --> 00:06:45,990 funktion, eller ring denna funktion. 163 00:06:45,990 --> 00:06:50,430 Så jag kommer att kalla denna funktion med två ingångar, x och y, och hit Spara. 164 00:06:50,430 --> 00:06:52,300 >> Okej, så fundamentalt samma sak. 165 00:06:52,300 --> 00:06:55,570 I själva verket har jag förmodligen gjort programmet onödigt komplicerad genom 166 00:06:55,570 --> 00:07:00,820 skriva en funktion som bara tar cirka sex rader kod medan jag 167 00:07:00,820 --> 00:07:02,970 tidigare hade genomfört detta på bara tre. 168 00:07:02,970 --> 00:07:06,230 >> Så låt mig gå vidare nu och remake detta, gör ingen swap. 169 00:07:06,230 --> 00:07:07,920 Okej, skruvade jag upp här. 170 00:07:07,920 --> 00:07:11,290 Detta borde vara ett fel som du kanske se alltmer vanligt som din 171 00:07:11,290 --> 00:07:12,380 program blir allt mer komplexa. 172 00:07:12,380 --> 00:07:13,470 Men det finns en enkel fix. 173 00:07:13,470 --> 00:07:15,650 Låt mig rulla tillbaka upp hit. 174 00:07:15,650 --> 00:07:18,190 >> Och vad är det första felet jag ser? 175 00:07:18,190 --> 00:07:19,520 Implicit deklaration. 176 00:07:19,520 --> 00:07:21,466 Vad indikerar det typiskt? 177 00:07:21,466 --> 00:07:22,830 Åh, glömde jag prototypen. 178 00:07:22,830 --> 00:07:26,900 Jag glömde att lära kompilator som swap kommer att existera även om han 179 00:07:26,900 --> 00:07:28,920 finns inte i början av programmet. 180 00:07:28,920 --> 00:07:35,780 Så jag ska bara säga ogiltig, swap, int, en int b, semikolon. 181 00:07:35,780 --> 00:07:37,280 >> Så jag tänker inte reimplement det. 182 00:07:37,280 --> 00:07:39,140 Men nu det matchar vad är här nere. 183 00:07:39,140 --> 00:07:42,530 Och lägg märke till avsaknaden av ett semikolon här, vilket inte är nödvändigt när 184 00:07:42,530 --> 00:07:43,200 genomförande. 185 00:07:43,200 --> 00:07:46,010 >> Så låt mig göra om detta, gör ingen swap. 186 00:07:46,010 --> 00:07:46,910 Mycket bättre form. 187 00:07:46,910 --> 00:07:48,130 Kör ingen swap. 188 00:07:48,130 --> 00:07:48,740 Och damn it. 189 00:07:48,740 --> 00:07:51,650 Nu är vi tillbaka där vi var på måndagen, där saken inte byta. 190 00:07:51,650 --> 00:07:55,410 >> Och vad är den intuitiva förklaringen för varför detta är fallet? 191 00:07:55,410 --> 00:07:56,380 Yeah? 192 00:07:56,380 --> 00:07:57,630 >> STUDENT: [OHÖRBAR]. 193 00:07:57,630 --> 00:08:04,140 194 00:08:04,140 --> 00:08:05,230 >> DAVID MALAN: Exakt. 195 00:08:05,230 --> 00:08:07,330 Så a och b är kopior av x och y. 196 00:08:07,330 --> 00:08:10,680 Och faktiskt, när du har varit anropa en funktion så långt att 197 00:08:10,680 --> 00:08:12,540 passerar variabler som ints - 198 00:08:12,540 --> 00:08:14,470 precis som swap väntar här - 199 00:08:14,470 --> 00:08:16,270 ni har passerat i kopiorna. 200 00:08:16,270 --> 00:08:19,150 >> Nu som innebär att det tar lite av tiden, en bråkdels sekund, för 201 00:08:19,150 --> 00:08:23,270 dator för att kopiera bitar från en variabel i bitarna i en annan. 202 00:08:23,270 --> 00:08:24,610 Men det är inte en så stor sak. 203 00:08:24,610 --> 00:08:25,920 Men de är ändå en kopia. 204 00:08:25,920 --> 00:08:30,020 >> Och så nu, inom ramen för swap, Jag är faktiskt framgångsrikt 205 00:08:30,020 --> 00:08:31,180 ändrar a och b. 206 00:08:31,180 --> 00:08:33,000 I själva verket, låt oss göra en snabb sanity check. 207 00:08:33,000 --> 00:08:36,830 Skriv f a är% i, ny rad. 208 00:08:36,830 --> 00:08:38,770 Och låt oss koppla in en. 209 00:08:38,770 --> 00:08:41,830 Nu ska vi göra samma sak med b.. 210 00:08:41,830 --> 00:08:43,640 Och låt oss göra samma sak här. 211 00:08:43,640 --> 00:08:47,260 >> Och nu, låt mig kopiera samma linjer igen vid botten av funktionen 212 00:08:47,260 --> 00:08:51,250 efter mina tre rader av intressant skulle ha utförts, och 213 00:08:51,250 --> 00:08:53,270 skriva ut a och b ännu en gång. 214 00:08:53,270 --> 00:08:56,030 Så nu ska vi göra det här, gör ingen swap. 215 00:08:56,030 --> 00:08:58,430 Låt mig göra terminalfönstret en lite längre, så att vi kan se 216 00:08:58,430 --> 00:08:59,520 mer av det på en gång. 217 00:08:59,520 --> 00:09:00,860 >> Och kör ingen swap. 218 00:09:00,860 --> 00:09:04,000 x är 1, y är 2. a är 1, b är 2. 219 00:09:04,000 --> 00:09:06,070 Och sedan, är en 2, b är 1. 220 00:09:06,070 --> 00:09:09,390 Så det fungerar, precis som Jess gjorde här inne för swap. 221 00:09:09,390 --> 00:09:13,090 Men naturligtvis, det har ingen effekt på variablerna i main. 222 00:09:13,090 --> 00:09:15,360 >> Så såg vi ett trick där vi kunde fixa det här, eller hur? 223 00:09:15,360 --> 00:09:19,560 När du står inför denna avgränsning fråga, kan du bara punt och göra x 224 00:09:19,560 --> 00:09:22,400 och y vilken typ av variabler i stället? 225 00:09:22,400 --> 00:09:23,390 >> Du kan göra dem globalt. 226 00:09:23,390 --> 00:09:27,560 Sätt dem i toppen av filen som vi gjorde, även i omgång 15. 227 00:09:27,560 --> 00:09:28,890 Vi använder en global variabel. 228 00:09:28,890 --> 00:09:32,420 Men inom ramen för spelet en 15, det är rimligt att ha en global 229 00:09:32,420 --> 00:09:37,170 variabel som representerar styrelsen, eftersom helheten av 15.c är alla 230 00:09:37,170 --> 00:09:38,650 om genomförandet av det spelet. 231 00:09:38,650 --> 00:09:41,470 Det är vad filen finns att göra. 232 00:09:41,470 --> 00:09:44,170 >> Men i det här fallet, är jag anropa en funktion swap. 233 00:09:44,170 --> 00:09:45,380 Jag vill byta två variabler. 234 00:09:45,380 --> 00:09:48,950 Och den bör börja känna bara slarviga Om lösningen på alla våra 235 00:09:48,950 --> 00:09:51,300 problem när vi kör in i omfattning frågor är att göra det globalt. 236 00:09:51,300 --> 00:09:54,730 Eftersom mycket snabbt vårt program är kommer att bli ganska rörigt. 237 00:09:54,730 --> 00:09:57,760 Och vi gjorde det mycket sparsamt som ett resultat i 15.c. 238 00:09:57,760 --> 00:10:00,470 >> Men det visar sig att det finns en bättre sätt helt och hållet. 239 00:10:00,470 --> 00:10:05,600 Låt mig faktiskt gå tillbaka och radera ut f: s, bara för att förenkla koden. 240 00:10:05,600 --> 00:10:09,160 Och låt mig föreslå att detta verkligen är dåligt. 241 00:10:09,160 --> 00:10:15,990 Men om jag lägger istället in några asterisker och stjärnor, kan jag vända istället detta 242 00:10:15,990 --> 00:10:18,670 funktion till en som är faktiskt operativt. 243 00:10:18,670 --> 00:10:25,020 >> Så låt mig gå tillbaka hit och erkänna att säga asterisker är alltid svårt, 244 00:10:25,020 --> 00:10:26,170 så jag ska säga stjärnor. 245 00:10:26,170 --> 00:10:27,660 Jag ska bara fess upp till den. 246 00:10:27,660 --> 00:10:28,190 Okej. 247 00:10:28,190 --> 00:10:30,190 Och nu, vad ska jag att göra istället? 248 00:10:30,190 --> 00:10:34,130 >> Så först av allt, jag kommer att ange att i stället för att passera en int in 249 00:10:34,130 --> 00:10:37,980 swap-funktion, jag är istället att gå att säga int stjärna. 250 00:10:37,980 --> 00:10:39,170 Nu, vad stjärnan indikerar? 251 00:10:39,170 --> 00:10:41,970 Detta är att föreställningen om en pekare som Binky, den claymation karaktär var 252 00:10:41,970 --> 00:10:43,465 hänvisa till för en stund sedan. 253 00:10:43,465 --> 00:10:47,610 >> Så om vi säger int stjärna, innebörden av detta nu är att en inte kommer att vara 254 00:10:47,610 --> 00:10:49,110 passeras i med sitt värde. 255 00:10:49,110 --> 00:10:50,350 Det kommer inte att kopieras i. 256 00:10:50,350 --> 00:10:54,700 Snarare är adressen till en kommer att föras in 257 00:10:54,700 --> 00:10:57,840 >> Så minns att insidan av din dator är en hel massa minne, annars 258 00:10:57,840 --> 00:10:58,760 känd som RAM. 259 00:10:58,760 --> 00:11:00,520 Och att RAM är bara en massa byte. 260 00:11:00,520 --> 00:11:03,320 Så om din Mac eller din PC har två gigabyte, har du 2 261 00:11:03,320 --> 00:11:05,760 miljard byte minne. 262 00:11:05,760 --> 00:11:08,440 >> Nu ska vi bara anta att bara för att hålla saker trevligt och välordnat, vi 263 00:11:08,440 --> 00:11:09,450 tilldela en adress - 264 00:11:09,450 --> 00:11:10,170 ett nummer - 265 00:11:10,170 --> 00:11:12,270 till varje byte RAM i din dator. 266 00:11:12,270 --> 00:11:15,410 Den allra första byten av dessa två miljarder med siffran noll. 267 00:11:15,410 --> 00:11:18,572 Nästa gång det är byte nummer ett, nummer två, hela vägen vidare upp, dot dot 268 00:11:18,572 --> 00:11:20,530 prick, till cirka 2 miljarder kronor. 269 00:11:20,530 --> 00:11:23,640 >> Så du kan antalet bytes minne i din dator. 270 00:11:23,640 --> 00:11:26,460 Så låt oss anta att det är vad vi menar med en adress. 271 00:11:26,460 --> 00:11:31,360 Så när jag ser int stjärna en, vad som händer att föras in i swap nu är det 272 00:11:31,360 --> 00:11:32,830 adressen för en. 273 00:11:32,830 --> 00:11:37,150 Inte dess värde, men oavsett postal adress är, så att säga - 274 00:11:37,150 --> 00:11:38,810 dess plats i RAM. 275 00:11:38,810 --> 00:11:41,250 >> Och på samma sätt för b, jag kommer att säga samma sak. 276 00:11:41,250 --> 00:11:42,720 Int, stjärna, b.. 277 00:11:42,720 --> 00:11:46,350 Som en parentes, tekniskt stjärnan kunde gå på andra ställen. 278 00:11:46,350 --> 00:11:50,140 Men vi ska standardisera på stjärnan är intill datatypen. 279 00:11:50,140 --> 00:11:54,080 >> Så byta signatur nu betyder, ge mig adressen till en int, och samtal 280 00:11:54,080 --> 00:11:55,400 som adress en. 281 00:11:55,400 --> 00:11:58,690 Och ge mig en annan adress för en int och kallar den adressen b.. 282 00:11:58,690 --> 00:12:01,120 >> Men nu min kod här måste förändras. 283 00:12:01,120 --> 00:12:03,470 För om jag förklarar int temp - 284 00:12:03,470 --> 00:12:05,580 som fortfarande är av typen int - 285 00:12:05,580 --> 00:12:08,700 men jag lagra i det, vilken typ av värde? 286 00:12:08,700 --> 00:12:12,870 För att vara tydlig, jag sätter ett a med Koden som skrivits just nu? 287 00:12:12,870 --> 00:12:14,360 >> Jag sätter på plats i en. 288 00:12:14,360 --> 00:12:16,500 Men jag bryr mig inte om platsen nu, eller hur? 289 00:12:16,500 --> 00:12:21,940 Temp existerar bara Jess 'tredje cup funnits, i vilket syfte? 290 00:12:21,940 --> 00:12:23,090 För att lagra ett värde. 291 00:12:23,090 --> 00:12:24,830 Mjölk eller apelsinjuice. 292 00:12:24,830 --> 00:12:28,520 Inte att faktiskt lagra adress någon av dessa saker, känns som en 293 00:12:28,520 --> 00:12:31,200 lite meningslösa i denna verkliga globala sammanhang ändå. 294 00:12:31,200 --> 00:12:34,990 >> Så egentligen, vad jag vill sätta i temp är inte adressen till en, men den 295 00:12:34,990 --> 00:12:36,180 innehållet i ett. 296 00:12:36,180 --> 00:12:41,930 Så om en är ett tal som 123, är detta den 123: e byte av minne som en bara 297 00:12:41,930 --> 00:12:45,090 råkar vara ockuperar, att värdet i en råkar vara ockuperar. 298 00:12:45,090 --> 00:12:49,040 >> Om jag vill gå till den adressen, Jag måste säga stjärna en. 299 00:12:49,040 --> 00:12:52,610 Likaså om jag skulle ändra vad på adressen a, byter jag 300 00:12:52,610 --> 00:12:53,570 detta att starta en. 301 00:12:53,570 --> 00:12:58,185 Om jag vill spara i vad som finns på plats en med vad som finns på platsen 302 00:12:58,185 --> 00:13:02,180 vid b, stjärna B stjärna. 303 00:13:02,180 --> 00:13:05,340 >> Så kort sagt, även om detta inte är helt sjunka in ännu - och jag skulle inte förvänta sig 304 00:13:05,340 --> 00:13:06,560 att det skulle så snabbt - 305 00:13:06,560 --> 00:13:11,100 inser att allt jag gör är prefix dessa stjärnor till mina variabler, 306 00:13:11,100 --> 00:13:13,350 säger inte tag värdena. 307 00:13:13,350 --> 00:13:14,520 Ändra inte värdena. 308 00:13:14,520 --> 00:13:17,600 Utan snarare, går till de adresser och få värdet. 309 00:13:17,600 --> 00:13:21,430 Gå till den adressen och förändring värdet där. 310 00:13:21,430 --> 00:13:25,500 >> Så nu låt mig rulla tillbaka upp till toppen, bara för att fixa denna linje här, till 311 00:13:25,500 --> 00:13:27,690 ändra prototypen för att matcha. 312 00:13:27,690 --> 00:13:30,280 Men jag måste nu göra en annan sak. 313 00:13:30,280 --> 00:13:35,500 Intuitivt, om jag har ändrat de typer argument som swap väntar, 314 00:13:35,500 --> 00:13:37,245 vad mer behöver jag ändra i min kod? 315 00:13:37,245 --> 00:13:39,750 316 00:13:39,750 --> 00:13:40,840 >> När jag pendling. 317 00:13:40,840 --> 00:13:43,340 Eftersom just nu, vilken förmiddag Jag går att byta ändå? 318 00:13:43,340 --> 00:13:47,450 Värdet x och värdet på y, eller mjölk och apelsinjuice. 319 00:13:47,450 --> 00:13:48,510 Men jag vill inte göra det. 320 00:13:48,510 --> 00:13:51,060 Jag vill i stället för att passera i vad? 321 00:13:51,060 --> 00:13:53,050 Placeringen av x och platsen för y. 322 00:13:53,050 --> 00:13:55,300 Vilka är deras postadresser, så att säga. 323 00:13:55,300 --> 00:13:57,600 >> Så för att göra det, det finns ett &-tecken. 324 00:13:57,600 --> 00:13:59,260 Ampersand slags låter som adress. 325 00:13:59,260 --> 00:14:03,240 så N, et tecken, adress av x, och adressen y.. 326 00:14:03,240 --> 00:14:06,790 Så det är avsiktligt att vi använder et-tecken vid anrop av funktioner, 327 00:14:06,790 --> 00:14:10,230 och stjärnor när du deklarerar och när genomföra funktionen. 328 00:14:10,230 --> 00:14:14,220 >> Och tänk bara på et-tecken som adress, och stjärnan som 329 00:14:14,220 --> 00:14:15,490 gå dit operatör - 330 00:14:15,490 --> 00:14:18,640 eller, mer korrekt, den dereference operatör. 331 00:14:18,640 --> 00:14:23,480 Så det är en hel del ord bara för att säga att nu, förhoppningsvis, är swap går 332 00:14:23,480 --> 00:14:24,440 vara korrekt. 333 00:14:24,440 --> 00:14:26,550 >> Låt mig gå vidare och göra - 334 00:14:26,550 --> 00:14:30,940 låt oss faktiskt byta namn på filen, lest detta program fortfarande kallas ingen swap. 335 00:14:30,940 --> 00:14:33,240 Jag hävdar att vi ska kalla det swap.c nu. 336 00:14:33,240 --> 00:14:35,670 Så gör, byta. 337 00:14:35,670 --> 00:14:37,520 Dot, snedstreck, byta. 338 00:14:37,520 --> 00:14:40,210 >> Och nu faktiskt, är x 1, y 2. 339 00:14:40,210 --> 00:14:44,040 Och sedan, är x 2, y är ett. 340 00:14:44,040 --> 00:14:46,500 Nåväl låt oss se om vi inte kan göra detta en lite annorlunda om vad som är 341 00:14:46,500 --> 00:14:47,180 pågår här. 342 00:14:47,180 --> 00:14:51,250 Låt mig först zooma in på vår ritning skärm här. 343 00:14:51,250 --> 00:14:54,160 Och låt mig föreslå ett ögonblick - och när jag drar här kommer att speglas 344 00:14:54,160 --> 00:14:58,660 uppe nu - Låt mig föreslå att Här finns en massa minne, eller 345 00:14:58,660 --> 00:15:00,540 RAM, insidan av min dator. 346 00:15:00,540 --> 00:15:04,140 >> Och detta kommer att bli bite nummer, låt oss säga, 1. 347 00:15:04,140 --> 00:15:05,720 Detta kommer att bli byte nummer 2. 348 00:15:05,720 --> 00:15:08,220 Och jag kommer att göra en hel massa mer, och då ett gäng dot dot punkter till 349 00:15:08,220 --> 00:15:10,880 tyder på att det finns 2 miljarder av dessa saker. 350 00:15:10,880 --> 00:15:13,520 4, 5, och så vidare. 351 00:15:13,520 --> 00:15:17,055 >> Så det är de första fem bytes av datorns minne. 352 00:15:17,055 --> 00:15:17,560 Okej? 353 00:15:17,560 --> 00:15:19,060 Mycket få av 2 miljarder. 354 00:15:19,060 --> 00:15:21,120 Men nu ska jag föreslå följande. 355 00:15:21,120 --> 00:15:27,490 Jag kommer att föreslå att x ska lagra numret 1, och y går 356 00:15:27,490 --> 00:15:29,690 att lagra numret 2. 357 00:15:29,690 --> 00:15:35,000 Och låt mig gå vidare nu och representerar dessa värden enligt följande. 358 00:15:35,000 --> 00:15:41,510 >> Låt oss göra detta på följande sätt. 359 00:15:41,510 --> 00:15:42,870 Ge mig bara en sekund. 360 00:15:42,870 --> 00:15:44,150 En sekund. 361 00:15:44,150 --> 00:15:45,680 OK. 362 00:15:45,680 --> 00:15:47,560 Jag vill göra detta lite - 363 00:15:47,560 --> 00:15:50,440 låt oss göra det igen. 364 00:15:50,440 --> 00:15:53,250 Annars kommer jag till och använda Samma siffror, oavsiktligt, 365 00:15:53,250 --> 00:15:54,230 flera gånger. 366 00:15:54,230 --> 00:15:57,320 >> Så bara så att vi har olika antal att prata om, låt oss kalla detta byte 367 00:15:57,320 --> 00:16:03,391 nummer 123, 124, 125, 126, och dot dot dot. 368 00:16:03,391 --> 00:16:08,400 Och låt mig nu hävdar att jag ska sätta värdet 1 här, och värdet 2 369 00:16:08,400 --> 00:16:11,990 här, annars känd som x och y. 370 00:16:11,990 --> 00:16:15,300 Så det råkar vara så att detta är x, detta är y. 371 00:16:15,300 --> 00:16:18,180 >> Och bara genom några slumpen, den dator, operativsystem, 372 00:16:18,180 --> 00:16:21,890 råkade sätta x på plats nummer 123. 373 00:16:21,890 --> 00:16:25,590 Och y hamnade på plats 124 - 374 00:16:25,590 --> 00:16:26,330 fan det. 375 00:16:26,330 --> 00:16:28,700 Jag borde ha fixat detta. 376 00:16:28,700 --> 00:16:34,040 Oh man, jag vill verkligen göra det här? 377 00:16:34,040 --> 00:16:37,340 Ja, jag vill fixa detta och b riktigt om detta idag. 378 00:16:37,340 --> 00:16:39,950 Tyvärr, ny på detta. 379 00:16:39,950 --> 00:16:45,020 >> 127, 131, och jag ville inte vara här komplex, men varför jag ändrar 380 00:16:45,020 --> 00:16:46,340 siffror där? 381 00:16:46,340 --> 00:16:48,360 Eftersom jag vill att ints till faktiskt vara fyra bytes. 382 00:16:48,360 --> 00:16:49,810 Så låt oss vara super anal om detta. 383 00:16:49,810 --> 00:16:53,800 Så att om en råkar åtgärdas 123 är 2 kommer att vara på adress 384 00:16:53,800 --> 00:16:55,730 127 eftersom det är bara 4 byes bort. 385 00:16:55,730 --> 00:16:56,210 Det är allt. 386 00:16:56,210 --> 00:16:58,640 Och vi ska glömma alla de andra adresser i världen. 387 00:16:58,640 --> 00:17:03,320 >> Så x är vid plats 123, y är vid plats 127. 388 00:17:03,320 --> 00:17:05,770 Och nu, vad gör jag egentligen vill göra? 389 00:17:05,770 --> 00:17:10,099 När jag ringer swap nu, vad egentligen som händer? 390 00:17:10,099 --> 00:17:14,920 Jo, när jag ringer swap, jag går i adressen för x och adressen till y. 391 00:17:14,920 --> 00:17:18,540 Så till exempel, om dessa två bitar av papper nu representerar två 392 00:17:18,540 --> 00:17:23,510 argument a och b för att byta, vad är jag kommer att skriva på den första av dessa, 393 00:17:23,510 --> 00:17:27,720 som jag kommer att kalla kallar en? 394 00:17:27,720 --> 00:17:30,610 >> Exakt, 123. 395 00:17:30,610 --> 00:17:31,905 Så här jag hävdar är en. 396 00:17:31,905 --> 00:17:32,955 Detta är parametern ett. 397 00:17:32,955 --> 00:17:35,856 Jag sätter adressen till x där. 398 00:17:35,856 --> 00:17:38,152 >> Vad är det? 399 00:17:38,152 --> 00:17:40,890 >> Vad är det? 400 00:17:40,890 --> 00:17:41,190 >> Nej, nej. 401 00:17:41,190 --> 00:17:41,720 Det är OK. 402 00:17:41,720 --> 00:17:42,570 Fortfarande bra, fortfarande bra. 403 00:17:42,570 --> 00:17:43,530 Så det här är ett. 404 00:17:43,530 --> 00:17:46,240 Och nu på andra papper, detta kommer att bli b, och vad är jag 405 00:17:46,240 --> 00:17:49,010 kommer att skriva på detta papper? 406 00:17:49,010 --> 00:17:50,080 127. 407 00:17:50,080 --> 00:17:53,720 >> Så det enda som har förändrats sedan vår tidigare träffande i denna historia är, 408 00:17:53,720 --> 00:17:58,590 snarare än bokstavligen 1 och 2, är jag kommer att passera i 123 och 127. 409 00:17:58,590 --> 00:18:02,130 Och jag kommer nu att sätta dessa insida av denna box, okej? 410 00:18:02,130 --> 00:18:04,640 Så att svarta lådan står nu swap-funktion. 411 00:18:04,640 --> 00:18:07,230 >> Under tiden, låt oss nu ha någon implementera swap-funktionen. 412 00:18:07,230 --> 00:18:09,090 Skulle någon här uppe vilja volontär? 413 00:18:09,090 --> 00:18:09,560 Kom upp. 414 00:18:09,560 --> 00:18:11,080 Vad är ditt namn? 415 00:18:11,080 --> 00:18:11,460 Charlie. 416 00:18:11,460 --> 00:18:12,080 Okej, Charlie. 417 00:18:12,080 --> 00:18:14,810 Kom upp. 418 00:18:14,810 --> 00:18:17,310 >> Så Charlie kommer att spela rollen av vår svarta låda. 419 00:18:17,310 --> 00:18:21,460 Och Charlie, vad jag vill att du ska göra nu genomföra swap på ett sådant sätt 420 00:18:21,460 --> 00:18:25,320 att, med tanke på dessa två adresser, du faktiskt gå 421 00:18:25,320 --> 00:18:26,330 att ändra värdena. 422 00:18:26,330 --> 00:18:28,290 Och jag ska viska i ditt öra hur du kör TV här. 423 00:18:28,290 --> 00:18:29,930 >> Så sätt igång, och du är den svarta lådan. 424 00:18:29,930 --> 00:18:30,920 Nå in där. 425 00:18:30,920 --> 00:18:34,054 Vilka värden ser du för en, och vilka värden ser du för b? 426 00:18:34,054 --> 00:18:36,740 >> CHARLIE: a är 123 och b är 127. 427 00:18:36,740 --> 00:18:37,530 >> DAVID MALAN: OK, exakt. 428 00:18:37,530 --> 00:18:38,940 Nu paus där för bara ett ögonblick. 429 00:18:38,940 --> 00:18:41,680 Det första du ska göra nu, enligt koden - som 430 00:18:41,680 --> 00:18:43,220 Jag ska nu dra upp på skärmen - 431 00:18:43,220 --> 00:18:46,750 kommer att vara att avsätta lite bit av minnet som kallas temp. 432 00:18:46,750 --> 00:18:48,850 Så jag kommer att gå vidare och ge dig det minnet. 433 00:18:48,850 --> 00:18:52,210 >> Så detta kommer att bli en tredje variabel att du har tillgång till 434 00:18:52,210 --> 00:18:54,080 du ringde temp. 435 00:18:54,080 --> 00:18:57,120 Och vad ska du skriva på temp papper? 436 00:18:57,120 --> 00:19:02,524 437 00:19:02,524 --> 00:19:03,470 >> CHARLIE: pekare, eller hur? 438 00:19:03,470 --> 00:19:04,790 >> DAVID MALAN: OK, ja inte nödvändigtvis pekare. 439 00:19:04,790 --> 00:19:07,230 Så kodrad som jag har markerat på höger sida, 440 00:19:07,230 --> 00:19:07,900 Låt oss börja där. 441 00:19:07,900 --> 00:19:08,890 Det säger stjärnan en. 442 00:19:08,890 --> 00:19:11,670 Så en just nu lagrar numret 123. 443 00:19:11,670 --> 00:19:16,660 Och bara intuitivt, vad gjorde stjärna 123 detta? 444 00:19:16,660 --> 00:19:21,630 >> Men specifikt, om a är 123, betyder stjärnan en vad? 445 00:19:21,630 --> 00:19:22,560 Värdet av en. 446 00:19:22,560 --> 00:19:24,580 Eller mer nonchalant, gå dit. 447 00:19:24,580 --> 00:19:28,620 Så låt mig föreslå att du håller en i din hand, gå vidare och behandla det 448 00:19:28,620 --> 00:19:29,430 som om det är en karta. 449 00:19:29,430 --> 00:19:32,940 Och gå själv över till datorns minne, och hitta oss vad som är 450 00:19:32,940 --> 00:19:36,520 vid stället 123. 451 00:19:36,520 --> 00:19:37,720 Exakt. 452 00:19:37,720 --> 00:19:41,100 >> Så vi ser på plats 123 är vad, naturligtvis? 453 00:19:41,100 --> 00:19:44,240 OK, så vad värdet nu är du kommer att tas i temp? 454 00:19:44,240 --> 00:19:44,750 Exakt. 455 00:19:44,750 --> 00:19:45,600 Så gå vidare och göra det. 456 00:19:45,600 --> 00:19:51,280 Och skriv numret 1 om bit papper som för närvarande är titeln temp. 457 00:19:51,280 --> 00:19:53,540 >> Och nu är nästa steg att du kommer att genomföra 458 00:19:53,540 --> 00:19:54,310 kommer att bli vad. 459 00:19:54,310 --> 00:19:57,820 Tja, på höger sida av nästa kodrad är stjärnan b.. b, av 460 00:19:57,820 --> 00:19:59,260 Naturligtvis lagrar en adress. 461 00:19:59,260 --> 00:20:02,270 Det tar 127. 462 00:20:02,270 --> 00:20:06,620 Star B betyder vad, nonchalant sett? 463 00:20:06,620 --> 00:20:08,700 >> Gå till den platsen. 464 00:20:08,700 --> 00:20:14,988 Så gå vidare och hitta oss vad vid stället 127. 465 00:20:14,988 --> 00:20:15,480 OK. 466 00:20:15,480 --> 00:20:19,170 Naturligtvis, vid stället 127, är fortfarande värdet 2. 467 00:20:19,170 --> 00:20:24,060 Så vad ska du nu förvara vid vad är den plats i en? 468 00:20:24,060 --> 00:20:26,860 Så stjärniga ett medel gå till platsen en. 469 00:20:26,860 --> 00:20:29,770 Vad är läget ett? 470 00:20:29,770 --> 00:20:30,430 >> Exakt. 471 00:20:30,430 --> 00:20:34,190 Så nu, om du vill ändra vad är på den platsen - 472 00:20:34,190 --> 00:20:36,470 Jag ska gå vidare och köra radergummit är här. 473 00:20:36,470 --> 00:20:37,760 Och nu lägger tillbaka på borsten. 474 00:20:37,760 --> 00:20:42,190 Vilket nummer ska du skriva i den tomma rutan nu? 475 00:20:42,190 --> 00:20:42,850 >> Exakt. 476 00:20:42,850 --> 00:20:46,470 Så här kodraden, att vara tydlig - låt mig paus vad Charlies gör och 477 00:20:46,470 --> 00:20:51,730 påpeka, vad han just gjort är skriv in den rutan på plats 123 478 00:20:51,730 --> 00:20:55,150 det värde som tidigare fanns på B. 479 00:20:55,150 --> 00:20:59,140 Och så har vi nu genomfört faktiskt denna andra kodrad. 480 00:20:59,140 --> 00:21:01,920 >> Nu tyvärr, det finns fortfarande en rad kvar. 481 00:21:01,920 --> 00:21:04,900 Nu vad är i temp, bokstavligen? 482 00:21:04,900 --> 00:21:06,200 Det är naturligtvis nummer ett. 483 00:21:06,200 --> 00:21:07,020 Det är inte en adress. 484 00:21:07,020 --> 00:21:09,380 Det är bara ett nummer, typ av en variabel från vecka ett. 485 00:21:09,380 --> 00:21:13,520 >> Och nu när du säger stjärnan B, som innebär gå till adressen b, är vilken av 486 00:21:13,520 --> 00:21:15,090 kurs här. 487 00:21:15,090 --> 00:21:16,020 Så när du dit - 488 00:21:16,020 --> 00:21:18,320 Jag ska gå vidare och radera vad är egentligen det - och vad är du 489 00:21:18,320 --> 00:21:20,820 ska skriva nu på plats 127? 490 00:21:20,820 --> 00:21:22,010 >> CHARLIE: Temp, som är ett. 491 00:21:22,010 --> 00:21:23,430 >> DAVID MALAN: Temp, som är ett. 492 00:21:23,430 --> 00:21:25,670 Och vad händer med temp i slutet? 493 00:21:25,670 --> 00:21:26,600 Tja, vet vi inte riktigt vet. 494 00:21:26,600 --> 00:21:27,420 Vi bryr mig egentligen inte. 495 00:21:27,420 --> 00:21:31,090 Varje gång vi har implementerat en funktion hittills, några lokala variabler du har 496 00:21:31,090 --> 00:21:31,890 är verkligen lokal. 497 00:21:31,890 --> 00:21:33,060 Och de försvinner bara. 498 00:21:33,060 --> 00:21:35,040 De är återtas av operativsystemet systemet så småningom. 499 00:21:35,040 --> 00:21:39,800 >> Så det faktum att temp fortfarande har värdet 1 är slags fundamentalt 500 00:21:39,800 --> 00:21:41,150 ointressant för oss. 501 00:21:41,150 --> 00:21:43,100 Okej, så en applåd om vi kunde för Charlie. 502 00:21:43,100 --> 00:21:46,400 Mycket bra gjort. 503 00:21:46,400 --> 00:21:51,520 >> Okej, så vad mer gör Detta betyder att vi kan göra? 504 00:21:51,520 --> 00:21:54,400 Så visar det sig att vi har varit berätta några vita lögner 505 00:21:54,400 --> 00:21:55,540 under ganska lång tid. 506 00:21:55,540 --> 00:21:59,990 I själva verket visar det sig att en sträng, all denna tid, är egentligen inte en 507 00:21:59,990 --> 00:22:02,190 sekvens av tecken i sig. 508 00:22:02,190 --> 00:22:03,980 Det slags är det intuitivt. 509 00:22:03,980 --> 00:22:08,270 >> Men tekniskt sett är sträng en datatyp som vi deklarerade inuti 510 00:22:08,270 --> 00:22:12,170 den CS50 biblioteket för att förenkla världen under de första veckorna av klass. 511 00:22:12,170 --> 00:22:20,130 Vilken sträng egentligen är adressen av en karaktär någonstans i RAM. 512 00:22:20,130 --> 00:22:25,530 En sträng är verkligen ett nummer, som 123 eller 127, det händer att avgränsa 513 00:22:25,530 --> 00:22:28,420 där en sträng börjar i datorns minne. 514 00:22:28,420 --> 00:22:31,870 >> Men om den inte motsvarar den string, per se,. självt 515 00:22:31,870 --> 00:22:33,460 Och vi kan se detta på följande sätt. 516 00:22:33,460 --> 00:22:35,980 Låt mig gå vidare och öppna upp del kod som finns bland 517 00:22:35,980 --> 00:22:38,340 dagens källkod exempel. 518 00:22:38,340 --> 00:22:42,225 Och jag ska gå vidare och öppna upp, låt oss säga, jämför-0.c. 519 00:22:42,225 --> 00:22:44,830 520 00:22:44,830 --> 00:22:48,790 Detta är en buggy program som kommer skall genomföras enligt följande. 521 00:22:48,790 --> 00:22:49,040 >> First. 522 00:22:49,040 --> 00:22:50,420 Jag ska säga något. 523 00:22:50,420 --> 00:22:52,660 Sedan kommer jag att gå vidare och få en sträng från användaren 524 00:22:52,660 --> 00:22:53,750 i det nästa rad. 525 00:22:53,750 --> 00:22:55,370 Sedan kommer jag att säga det igen. 526 00:22:55,370 --> 00:22:57,540 Sedan kommer jag att få en annan strängen från användaren. 527 00:22:57,540 --> 00:23:00,390 >> Och varsel, visar jag en av de strängar i en variabel som heter s, och 528 00:23:00,390 --> 00:23:03,040 en annan av dessa strängar i en variabel som heter t. 529 00:23:03,040 --> 00:23:07,480 Och nu ska jag hävda, mycket rimligt, att om s är lika med lika t, 530 00:23:07,480 --> 00:23:08,940 strängarna är desamma. 531 00:23:08,940 --> 00:23:09,970 Du skriver samma sak. 532 00:23:09,970 --> 00:23:11,830 Else, strängarna är inte samma sak. 533 00:23:11,830 --> 00:23:15,440 >> Trots allt, om vi ingången två ints, två tecken, två flottar, två dubbelrum, några av 534 00:23:15,440 --> 00:23:18,400 de datatyper som vi har pratat om hittills för att jämföra dem - 535 00:23:18,400 --> 00:23:22,070 minns att vi gjorde mycket klart för ett tag sedan att du inte gör detta, eftersom en 536 00:23:22,070 --> 00:23:25,840 enda likhetstecknet är naturligtvis tilldelningsoperatorn. 537 00:23:25,840 --> 00:23:26,820 Så det skulle vara en bugg. 538 00:23:26,820 --> 00:23:29,260 >> Vi använder lika likhetstecknet, som faktiskt jämför 539 00:23:29,260 --> 00:23:31,050 saker för verklig jämställdhet. 540 00:23:31,050 --> 00:23:32,275 Men jag hävdar att detta är buggig. 541 00:23:32,275 --> 00:23:37,400 Om jag går vidare och gör jämföra noll, och gör sedan jämföra dot slash noll. 542 00:23:37,400 --> 00:23:39,700 Och jag skriver i, låt oss säga, hej. 543 00:23:39,700 --> 00:23:41,590 Och låt oss säga hej igen. 544 00:23:41,590 --> 00:23:46,040 Bokstavligen samma sak, datorn påstår att jag skrivit olika saker. 545 00:23:46,040 --> 00:23:47,640 >> Nu kanske jag stavat fel bara något. 546 00:23:47,640 --> 00:23:49,910 Jag kommer att skriva mitt namn den här gången. 547 00:23:49,910 --> 00:23:52,580 Jag menar, hallå. 548 00:23:52,580 --> 00:23:54,770 Hej. 549 00:23:54,770 --> 00:23:57,360 Det är olika varje gång. 550 00:23:57,360 --> 00:23:58,430 >> Tja, varför är det? 551 00:23:58,430 --> 00:24:00,140 Vad som verkligen händer under huven? 552 00:24:00,140 --> 00:24:03,270 Tja, vad är det egentligen som pågår under huven är strängen sedan 553 00:24:03,270 --> 00:24:07,410 Jag skrev i den första gången till exempel är ordet hej, förstås. 554 00:24:07,410 --> 00:24:11,660 Men om vi företräder här nedanför huven, minns att en 555 00:24:11,660 --> 00:24:13,470 Strängen är i en array. 556 00:24:13,470 --> 00:24:15,040 Och vi har sagt så mycket i det förflutna. 557 00:24:15,040 --> 00:24:20,200 >> Så om jag drar den arrayen så här, jag kommer att representera något helt 558 00:24:20,200 --> 00:24:23,030 liknar vad vi gjorde för en stund sedan. 559 00:24:23,030 --> 00:24:25,390 Och det är faktiskt något speciellt här, också. 560 00:24:25,390 --> 00:24:28,090 Vad gjorde vi bestämmer var på I slutet av varje sträng? 561 00:24:28,090 --> 00:24:30,760 Ja, denna backslash noll, vilket är bara sätt att representera, 562 00:24:30,760 --> 00:24:33,610 bokstavligen, 00000000. 563 00:24:33,610 --> 00:24:35,680 Åtta 0 bitar i rad. 564 00:24:35,680 --> 00:24:37,610 >> Jag vet inte, ärligt talat, Vad är det efter detta. 565 00:24:37,610 --> 00:24:40,090 Det är bara en massa mer RAM-minne insidan av min dator. 566 00:24:40,090 --> 00:24:40,970 Men detta är en array. 567 00:24:40,970 --> 00:24:42,260 Vi pratade om matriser innan. 568 00:24:42,260 --> 00:24:45,010 Och vi talar vanligen om arrayer som läge noll, 569 00:24:45,010 --> 00:24:46,580 sedan en, sedan två. 570 00:24:46,580 --> 00:24:47,950 Men det är bara för bekvämlighet. 571 00:24:47,950 --> 00:24:49,380 Och det är helt släkting. 572 00:24:49,380 --> 00:24:53,010 >> När du faktiskt få minnet från datorn, det är naturligtvis något 573 00:24:53,010 --> 00:24:55,450 2 miljard några udda byte, potentiellt. 574 00:24:55,450 --> 00:24:59,100 Så egentligen under huven, all denna tid, ja. 575 00:24:59,100 --> 00:25:01,670 Detta kan mycket väl vara fästet noll. 576 00:25:01,670 --> 00:25:04,780 Men om du gräver ännu djupare under huven, det är verkligen 577 00:25:04,780 --> 00:25:07,000 itu med nummer 123. 578 00:25:07,000 --> 00:25:09,150 Detta är adressen 124. 579 00:25:09,150 --> 00:25:11,040 Detta är adressen 125. 580 00:25:11,040 --> 00:25:12,540 >> Och jag inte skruva upp den här gången. 581 00:25:12,540 --> 00:25:15,840 Dessa är nu ett byte isär för vilken anledning? 582 00:25:15,840 --> 00:25:17,930 Hur stor är en char? 583 00:25:17,930 --> 00:25:19,170 En röding är bara ett byte. 584 00:25:19,170 --> 00:25:20,570 En int är vanligtvis fyra bytes. 585 00:25:20,570 --> 00:25:24,850 Så det är därför jag gjorde det 123, 127, 131 och så vidare. 586 00:25:24,850 --> 00:25:27,560 Nu kan jag hålla matten enklare och bara göra plus 1. 587 00:25:27,560 --> 00:25:30,510 Och det är nu vad som verkligen händer på under huven. 588 00:25:30,510 --> 00:25:37,760 >> Så när du deklarerar något som detta, string s, är detta faktiskt - 589 00:25:37,760 --> 00:25:39,170 visar det sig - 590 00:25:39,170 --> 00:25:41,190 röding stjärna. 591 00:25:41,190 --> 00:25:44,640 Star, innebär naturligtvis adress, aka pekare. 592 00:25:44,640 --> 00:25:46,200 Så det är adressen till något. 593 00:25:46,200 --> 00:25:47,510 Vad är det för adress? 594 00:25:47,510 --> 00:25:47,760 >> Well - 595 00:25:47,760 --> 00:25:51,680 Jag är den enda som kan se mycket viktig punkt jag gör, eller tror 596 00:25:51,680 --> 00:25:52,560 Jag gör. 597 00:25:52,560 --> 00:25:55,270 Så string - 598 00:25:55,270 --> 00:25:57,180 det tråkiga är att jag har en bildskärm precis där jag 599 00:25:57,180 --> 00:25:58,100 kunde ha sett det. 600 00:25:58,100 --> 00:26:00,990 >> Okej, så string s är vad Jag förklarade tidigare. 601 00:26:00,990 --> 00:26:04,600 Men det visar sig, tack vare ett litet magi i CS50 biblioteket, allt detta 602 00:26:04,600 --> 00:26:08,780 tidssträng har bokstavligen varit röding stjärna. 603 00:26:08,780 --> 00:26:11,310 Stjärnan innebär återigen pekare eller adress. 604 00:26:11,310 --> 00:26:14,180 Det faktum att det är flankerar Ordet röding betyder att det är den 605 00:26:14,180 --> 00:26:15,970 adress för ett tecken. 606 00:26:15,970 --> 00:26:23,100 >> Så om få strängen kallas, och jag skriver i H-E-L-L-O, föreslår nu vad som får 607 00:26:23,100 --> 00:26:27,330 string bokstavligen varit återvänder alla den här gången, även om vi har ganska 608 00:26:27,330 --> 00:26:29,980 förenklad världen? 609 00:26:29,980 --> 00:26:33,310 Vad får strängen faktiskt återvända som dess returvärde? 610 00:26:33,310 --> 00:26:35,830 611 00:26:35,830 --> 00:26:38,720 >> 123 i detta fall, till exempel. 612 00:26:38,720 --> 00:26:42,630 Vi har tidigare sagt att få strängen helt enkelt returnerar en sträng, en sekvens av 613 00:26:42,630 --> 00:26:43,300 tecken. 614 00:26:43,300 --> 00:26:44,790 Men det är lite av en vit lögn. 615 00:26:44,790 --> 00:26:48,010 Sättet att få strängen verkligen fungerar under huven är det blir en 616 00:26:48,010 --> 00:26:48,930 strängen från användaren. 617 00:26:48,930 --> 00:26:51,530 Det plops de tecken som han eller hon skriver i minnet. 618 00:26:51,530 --> 00:26:54,680 Det sätter en backslash noll vid slutet av dem sekvens av tecken. 619 00:26:54,680 --> 00:26:57,310 >> Men vad blir sträng bokstavligen tillbaka? 620 00:26:57,310 --> 00:27:02,710 Den returnerar bokstavligen adressen till allra första byte i RAM som 621 00:27:02,710 --> 00:27:04,130 Det används för att styrka. 622 00:27:04,130 --> 00:27:07,500 Och det visar sig att bara genom att returnera en enda adress för 623 00:27:07,500 --> 00:27:12,120 första tecknet i strängen, är att tillräcklig för att hitta helheten av 624 00:27:12,120 --> 00:27:12,630 strängen. 625 00:27:12,630 --> 00:27:16,930 >> Med andra ord får strängen inte har att återvända 123 och 124 och 125. 626 00:27:16,930 --> 00:27:19,950 Det behöver inte ge mig en lång förteckning över alla byte som 627 00:27:19,950 --> 00:27:20,740 min sträng använder. 628 00:27:20,740 --> 00:27:22,670 Eftersom en, de är alla rygg mot rygg. 629 00:27:22,670 --> 00:27:28,160 Och två, baserad på den första adressen, jag kan räkna ut var strängen slutar. 630 00:27:28,160 --> 00:27:29,910 Hur? 631 00:27:29,910 --> 00:27:33,490 >> Den speciella null karaktär, Omvänt snedstreck noll i slutet. 632 00:27:33,490 --> 00:27:35,430 Så med andra ord, om du passerar runt - 633 00:27:35,430 --> 00:27:36,530 insidan av variabler - 634 00:27:36,530 --> 00:27:41,300 adressen till en röding, och du tar att i slutet av varje sträng, varje 635 00:27:41,300 --> 00:27:45,040 sekvens av tecken som vi människor tänker på strängar, om man antar att 636 00:27:45,040 --> 00:27:48,600 i slutet av en sådan sträng finns ett omvänt snedstreck nolla, du är gyllene. 637 00:27:48,600 --> 00:27:52,430 Eftersom du kan alltid hitta i slutet av en sträng. 638 00:27:52,430 --> 00:27:54,870 >> Nu vad som egentligen sedan gå på i det här programmet? 639 00:27:54,870 --> 00:27:59,990 Varför är det här programmet, jämför-0.c, buggy? 640 00:27:59,990 --> 00:28:01,690 Vad som faktiskt jämförs? 641 00:28:01,690 --> 00:28:02,420 Yeah? 642 00:28:02,420 --> 00:28:05,000 >> STUDENT: [OHÖRBAR]. 643 00:28:05,000 --> 00:28:05,730 >> DAVID MALAN: Exakt. 644 00:28:05,730 --> 00:28:08,350 Det är att jämföra platser av strängarna. 645 00:28:08,350 --> 00:28:12,420 Så om användaren har skrivit in hello gång, som jag gjorde, kanske minne hamna 646 00:28:12,420 --> 00:28:13,430 ser ut så här. 647 00:28:13,430 --> 00:28:18,210 Om användaren sedan slag i Hej igen, men genom att ringa får strängen igen, är c 648 00:28:18,210 --> 00:28:21,800 inte särskilt smart om du undervisar det att vara smart genom att skriva kod. 649 00:28:21,800 --> 00:28:22,430 >> C - 650 00:28:22,430 --> 00:28:23,860 och datorer i allmänhet - 651 00:28:23,860 --> 00:28:27,370 Om du skriver in ordet Hej igen, du vet vad du kommer att få. 652 00:28:27,370 --> 00:28:31,480 Du kommer bara att få en andra uppsättning minne som, ja, råkar vara 653 00:28:31,480 --> 00:28:35,510 lagring av H-E-L-L-O och så vidare. 654 00:28:35,510 --> 00:28:38,240 >> Det kommer att se likadant till oss människor, men denna adress 655 00:28:38,240 --> 00:28:39,460 kanske inte är 123. 656 00:28:39,460 --> 00:28:42,470 Det kanske bara så hända att operativsystem har några tillgängliga 657 00:28:42,470 --> 00:28:45,430 utrymme till exempel på plats - 658 00:28:45,430 --> 00:28:49,820 låt oss säga något godtyckligt, som detta är platsen 200. 659 00:28:49,820 --> 00:28:51,620 Och detta är platsen 201. 660 00:28:51,620 --> 00:28:53,060 Och detta är platsen 202. 661 00:28:53,060 --> 00:28:55,730 Vi har ingen aning om var det är kommer att vara i minnet. 662 00:28:55,730 --> 00:28:59,110 >> Men vad det betyder är att det är kommer att lagras slutligen i s? 663 00:28:59,110 --> 00:29:00,750 Antalet 123. 664 00:29:00,750 --> 00:29:04,860 Vad kommer att lagras i t, i denna godtyckliga exempel? 665 00:29:04,860 --> 00:29:06,300 Numret 200. 666 00:29:06,300 --> 00:29:11,410 Och allt det betyder då är självklart, 123 inte är lika 200. 667 00:29:11,410 --> 00:29:14,940 Och så här om villkoret aldrig utvärderas till true. 668 00:29:14,940 --> 00:29:18,430 Eftersom hämta sträng använder olika bitar av minne varje gång. 669 00:29:18,430 --> 00:29:20,360 >> Nu kan vi se detta igen i ett annat exempel. 670 00:29:20,360 --> 00:29:23,764 Låt mig gå vidare och öppna upp copy-0.c. 671 00:29:23,764 --> 00:29:28,770 Jag hävdar att detta exempel kommer att prova - men misslyckas - att kopiera två strängar 672 00:29:28,770 --> 00:29:29,910 enligt följande. 673 00:29:29,910 --> 00:29:31,730 >> Jag ska säga något till användaren. 674 00:29:31,730 --> 00:29:34,490 Jag sedan kommer att få en string och kallar det är. 675 00:29:34,490 --> 00:29:36,400 Och nu, jag gör denna kontroll här. 676 00:29:36,400 --> 00:29:37,990 Vi nämnde detta för ett tag sedan. 677 00:29:37,990 --> 00:29:42,490 Men när kan få null string avkastning, annan speciell karaktär, eller särskilda 678 00:29:42,490 --> 00:29:45,050 symbol låt oss säga. 679 00:29:45,050 --> 00:29:45,900 Om det är slut på minne. 680 00:29:45,900 --> 00:29:48,970 >> Till exempel, om användaren är verkligen vara svårt och typ en avskyvärd 681 00:29:48,970 --> 00:29:51,220 antal tecken på tangentbord och träffar Enter. 682 00:29:51,220 --> 00:29:54,580 Om detta antal tecken kan bara inte passa i RAM för oavsett galen 683 00:29:54,580 --> 00:29:57,820 skäl, får väl sträng kanske mycket väl returnera null. 684 00:29:57,820 --> 00:30:01,080 >> Eller om ditt program i sig gör mycket andra saker och det finns bara 685 00:30:01,080 --> 00:30:03,790 inte tillräckligt med minne för hämta sträng att lyckas, kan det sluta 686 00:30:03,790 --> 00:30:05,240 up återvänder null. 687 00:30:05,240 --> 00:30:07,160 Men låt oss vara mer exakt vad detta är. 688 00:30:07,160 --> 00:30:10,280 Vad är s datatyp egentligen? 689 00:30:10,280 --> 00:30:11,610 Char stjärna. 690 00:30:11,610 --> 00:30:14,560 >> Så visar det sig nu att vi kan skala backa skiktet av null. 691 00:30:14,560 --> 00:30:17,500 Vänder ut, är null - ja, självklart en speciell symbol. 692 00:30:17,500 --> 00:30:19,190 Men vad är det egentligen? 693 00:30:19,190 --> 00:30:25,220 Egentligen är null bara en symbol som vi människor använder för att representera noll liksom. 694 00:30:25,220 --> 00:30:29,010 >> Så författarna av C, och datorer mer allmänt, bestämde år sedan 695 00:30:29,010 --> 00:30:30,010 det, vet du vad. 696 00:30:30,010 --> 00:30:34,850 Varför inte vi garantera att ingen användare uppgifter är någonsin, någonsin, någonsin 697 00:30:34,850 --> 00:30:36,730 förvaras vid bye noll? 698 00:30:36,730 --> 00:30:39,610 Faktum är att även i min godtyckliga exempel innan, det gjorde jag inte börja numreringen av 699 00:30:39,610 --> 00:30:40,390 byte vid noll. 700 00:30:40,390 --> 00:30:41,540 Jag började på en. 701 00:30:41,540 --> 00:30:44,950 Eftersom jag visste att människorna i världen har beslutat att reservera noll 702 00:30:44,950 --> 00:30:47,970 byte i någons RAM som något speciellt. 703 00:30:47,970 --> 00:30:52,020 >> Orsaken är, när du vill signalera att något har gått fel 704 00:30:52,020 --> 00:30:55,960 beträffande adresser, återvände du null - annars känd som noll - 705 00:30:55,960 --> 00:30:59,410 och eftersom du vet att det inte finns någon legit uppgifter vid adress noll, klart 706 00:30:59,410 --> 00:31:00,400 som innebär ett fel. 707 00:31:00,400 --> 00:31:04,080 Och det är därför vi, enligt konvention, kolla för null och retur något 708 00:31:04,080 --> 00:31:06,260 som en i dessa fall. 709 00:31:06,260 --> 00:31:09,300 >> Så om vi rulla ner nu, det är bara sedan några felkontroll, utifall 710 00:31:09,300 --> 00:31:10,610 något gick fel med [? borgen?] 711 00:31:10,610 --> 00:31:13,470 helt och hållet och avsluta programmet genom att returnera tidigt. 712 00:31:13,470 --> 00:31:19,030 Denna linje nu skulle kunna skrivas om eftersom detta, vilket betyder vad? 713 00:31:19,030 --> 00:31:23,155 På vänster sida, ge mig en annan pekare till en karaktär, och kalla det t. 714 00:31:23,155 --> 00:31:26,935 Vad jag lagra inuti t, baserad På denna kodrad? 715 00:31:26,935 --> 00:31:30,950 716 00:31:30,950 --> 00:31:32,170 >> Jag lagrar en plats. 717 00:31:32,170 --> 00:31:34,742 Specifikt platsen som var i er. 718 00:31:34,742 --> 00:31:39,000 Så om användaren har skrivit in hälsningar och som först inträffar hej hamna 719 00:31:39,000 --> 00:31:42,567 här, då antalet 123 är kommer att komma tillbaka från att få 720 00:31:42,567 --> 00:31:43,810 sträng och lagras - 721 00:31:43,810 --> 00:31:44,780 som vi sa tidigare - 722 00:31:44,780 --> 00:31:45,440 i ar. 723 00:31:45,440 --> 00:31:50,560 >> När jag förklarar nu en annan pekare till en röding och kalla det t, vilken siffra är 724 00:31:50,560 --> 00:31:53,940 bokstavligen kommer att hamna i t enligt berättelsen? 725 00:31:53,940 --> 00:31:55,420 Så 123. 726 00:31:55,420 --> 00:32:00,310 >> Så tekniskt nu både s och t pekar på den exakta 727 00:32:00,310 --> 00:32:02,410 samma bitar av minnet. 728 00:32:02,410 --> 00:32:06,140 Så märker vad jag ska göra nu bevisa att detta program är buggigt. 729 00:32:06,140 --> 00:32:08,820 >> Först kommer jag att hävda, med en utskrift f, kapitalisera 730 00:32:08,820 --> 00:32:10,080 kopian av strängen. 731 00:32:10,080 --> 00:32:11,660 Sedan kommer jag att göra lite felkontroll. 732 00:32:11,660 --> 00:32:12,160 Jag ska se till. 733 00:32:12,160 --> 00:32:16,710 Låt oss se till att strängen t är på åtminstone större än noll i längden, 734 00:32:16,710 --> 00:32:19,190 så det finns vissa tecken finns att faktiskt utnyttja. 735 00:32:19,190 --> 00:32:22,840 >> Och då kanske du minns detta från tidigare exempel. 736 00:32:22,840 --> 00:32:25,630 2 övre - vilket är i den ctype.h filen. 737 00:32:25,630 --> 00:32:30,800 T fäste noll ger mig noll tecknet i strängen t. 738 00:32:30,800 --> 00:32:34,360 Och 2 övre av samma värde, för Naturligtvis, omvandlar den till versaler. 739 00:32:34,360 --> 00:32:38,230 >> Så intuitivt, här raden är markerad av koden kapitalisera den första 740 00:32:38,230 --> 00:32:40,250 brev t. 741 00:32:40,250 --> 00:32:44,485 Men det är inte kapitalisera, intuitivt, den första bokstaven i er. 742 00:32:44,485 --> 00:32:48,130 Men om du tänker framåt, vad är jag om att se när jag kör det här programmet 743 00:32:48,130 --> 00:32:54,220 och skriva ut både den ursprungliga, s, och den så kallade kopiera, t? 744 00:32:54,220 --> 00:32:55,350 >> De är faktiskt kommer att vara densamma. 745 00:32:55,350 --> 00:32:56,600 Och varför ska de vara samma? 746 00:32:56,600 --> 00:32:58,970 747 00:32:58,970 --> 00:33:01,020 De är båda pekar på exakt samma sak. 748 00:33:01,020 --> 00:33:01,610 Så låt oss göra det här. 749 00:33:01,610 --> 00:33:03,160 >> Gör kopia noll. 750 00:33:03,160 --> 00:33:04,070 Den sammanställer OK. 751 00:33:04,070 --> 00:33:06,500 Låt mig köra kopia noll. 752 00:33:06,500 --> 00:33:10,110 Låt mig skriva något liknande hello i gemener slog sedan Enter. 753 00:33:10,110 --> 00:33:16,520 Och det hävdar att både den ursprungliga s och kopian verkligen är identiska. 754 00:33:16,520 --> 00:33:17,920 >> Så vad hände egentligen här? 755 00:33:17,920 --> 00:33:20,100 Låt mig rita den här bilden bara att berätta historien på ett 756 00:33:20,100 --> 00:33:21,340 något annorlunda sätt. 757 00:33:21,340 --> 00:33:26,060 Vad som verkligen händer under huva när jag förklarar något liknande 758 00:33:26,060 --> 00:33:30,410 röding start s, eller string s, Jag får en pekare - 759 00:33:30,410 --> 00:33:33,090 som råkar vara fyra bytes i CS50 apparaten 760 00:33:33,090 --> 00:33:34,410 och i många datorer. 761 00:33:34,410 --> 00:33:36,008 Och jag kommer att kalla denna s.. 762 00:33:36,008 --> 00:33:39,810 Och detta har för närvarande något okänt värde. 763 00:33:39,810 --> 00:33:43,900 >> När du deklarerar en variabel, såvida du själv sätta ett värde där, som 764 00:33:43,900 --> 00:33:44,570 vet vad som finns där. 765 00:33:44,570 --> 00:33:48,110 Det kan vara någon slumpmässig sekvens av bitar från tidigare utförande. 766 00:33:48,110 --> 00:33:52,490 Så när jag, i min kodrad gör få sträng, och sedan lagra avkastning 767 00:33:52,490 --> 00:33:54,800 värde i oss få strängen på något sätt - 768 00:33:54,800 --> 00:33:58,520 och vi kommer så småningom skal tillbaka hur får string verk, på något sätt allokerar en 769 00:33:58,520 --> 00:34:00,480 array som förmodligen ser lite såhär. 770 00:34:00,480 --> 00:34:05,390 H-E-L-L-O, omvänt snedstreck noll. 771 00:34:05,390 --> 00:34:09,510 >> Låt oss anta att detta är adressen 123 bara första konsistens. 772 00:34:09,510 --> 00:34:13,000 Så får sträng avkastning, i markerad linje där, returnerar den 773 00:34:13,000 --> 00:34:15,000 Antalet vi sa, 123. 774 00:34:15,000 --> 00:34:17,420 Så vad går egentligen inuti är här? 775 00:34:17,420 --> 00:34:26,590 >> Tja, vad som verkligen händer insidan av s är 123. 776 00:34:26,590 --> 00:34:29,250 Men ärligt talat, jag får lite förvirrad av alla dessa adresser, 777 00:34:29,250 --> 00:34:30,320 alla dessa godtyckliga nummer. 778 00:34:30,320 --> 00:34:32,290 123, 124, 127. 779 00:34:32,290 --> 00:34:34,570 Så låt oss faktiskt förenkla världen lite. 780 00:34:34,570 --> 00:34:38,800 >> När vi talar om pekare, ärligt talat, att oss människor, vem fan bryr sig om 781 00:34:38,800 --> 00:34:39,870 saker är i minnet? 782 00:34:39,870 --> 00:34:41,080 Det är helt godtyckligt. 783 00:34:41,080 --> 00:34:43,370 Det kommer att bero på hur mycket RAM-minne som användaren har. 784 00:34:43,370 --> 00:34:46,590 Det kommer att bero på när på dagen du kör programmet, kanske, och 785 00:34:46,590 --> 00:34:48,250 vilken ingång användaren ger. 786 00:34:48,250 --> 00:34:50,060 Vi bor på oviktiga detaljer. 787 00:34:50,060 --> 00:34:54,230 >> Så låt oss abstract bort och säga att, när du kör en kodrad som denna, 788 00:34:54,230 --> 00:34:57,320 röding stjärnan s får returen värde hämta sträng. 789 00:34:57,320 --> 00:35:02,720 Varför inte vi istället bara rita vad vi hålla ringer en fingervisning om det är 790 00:35:02,720 --> 00:35:04,140 pekar på något? 791 00:35:04,140 --> 00:35:07,000 Så jag hävdar nu att s upp det finns en pekare - 792 00:35:07,000 --> 00:35:08,480 under huven är det en adress. 793 00:35:08,480 --> 00:35:11,330 Men det är bara att peka på den första bitgruppen i 794 00:35:11,330 --> 00:35:12,780 sträng som har återlämnats. 795 00:35:12,780 --> 00:35:16,710 >> Om jag återvänder nu till den koden här, vad som händer på den här linjen? 796 00:35:16,710 --> 00:35:20,020 Nåväl, i denna markerad linje nu, Jag förklarar tydligen en annan 797 00:35:20,020 --> 00:35:21,070 variabel som heter t. 798 00:35:21,070 --> 00:35:25,700 Men det är också en pekare, så jag kommer att rita den som, i teorin, det exakta 799 00:35:25,700 --> 00:35:26,710 samma storlek låda. 800 00:35:26,710 --> 00:35:28,160 Och jag kommer att kalla det t. 801 00:35:28,160 --> 00:35:33,500 >> Och nu när vi går tillbaka till koden igen, när jag lagrar s insidan av t, 802 00:35:33,500 --> 00:35:36,920 vad är jag tekniskt sätta inne i t? 803 00:35:36,920 --> 00:35:39,350 Nåväl tekniskt, detta var antalet 123. 804 00:35:39,350 --> 00:35:42,270 Så egentligen jag borde skriva numret 123 där. 805 00:35:42,270 --> 00:35:43,900 Men låt oss ta det högre nivå. 806 00:35:43,900 --> 00:35:48,090 t, om det bara är en pekare, intuitivt, är just det. 807 00:35:48,090 --> 00:35:49,800 Det är allt det är att vara lagras i det. 808 00:35:49,800 --> 00:35:54,970 >> Så nu under de senaste intressanta linjer av kod, när jag går faktiskt om 809 00:35:54,970 --> 00:36:00,680 kapitalisera nolltecknet it, vad händer? 810 00:36:00,680 --> 00:36:06,310 Tja, är t fäste noll pekar nu vad karaktär, förmodligen? 811 00:36:06,310 --> 00:36:07,460 >> Det pekar på h.. 812 00:36:07,460 --> 00:36:08,870 Eftersom t bracket noll - 813 00:36:08,870 --> 00:36:12,490 minns, är denna gamla syntax. t bracket noll betyder bara om t är en sträng, t 814 00:36:12,490 --> 00:36:15,590 fäste noll innebär att få noll karaktär i den styrkan. 815 00:36:15,590 --> 00:36:18,650 Så vad som verkligen betyder är att gå till denna array - 816 00:36:18,650 --> 00:36:21,520 och ja, det kan vara 123, detta kan vara 124. 817 00:36:21,520 --> 00:36:22,790 Men det är alla relativa, minns. 818 00:36:22,790 --> 00:36:25,640 När man talar om en array, har vi fördelen av att tala om 819 00:36:25,640 --> 00:36:27,000 relativa index. 820 00:36:27,000 --> 00:36:31,120 >> Och så nu kan vi bara anta som t fäste noll timmar. 821 00:36:31,120 --> 00:36:35,090 Så om jag kallar två övre på det, vad det är egentligen gör är att kapitalisera 822 00:36:35,090 --> 00:36:38,290 den gemena h till versaler H. Men naturligtvis, vad är er? 823 00:36:38,290 --> 00:36:41,010 Det är som pekar på samma darn strängen. 824 00:36:41,010 --> 00:36:44,200 >> Så detta är allt som har hänt i denna kod hittills. 825 00:36:44,200 --> 00:36:45,960 Så vad är då innebörden? 826 00:36:45,960 --> 00:36:48,300 Hur fixar vi dessa två problem? 827 00:36:48,300 --> 00:36:50,870 Hur jämför vi till faktiska strängar? 828 00:36:50,870 --> 00:36:53,720 >> Nå intuitivt, hur skulle du går om att jämföra två 829 00:36:53,720 --> 00:36:55,090 strängar för verklig jämställdhet? 830 00:36:55,090 --> 00:36:58,920 831 00:36:58,920 --> 00:37:00,750 >> Vad betyder det om två strängarna är lika? 832 00:37:00,750 --> 00:37:04,330 Uppenbarligen inte att deras adresser är lika i minnet, eftersom det är en låg 833 00:37:04,330 --> 00:37:06,590 nivå genomförande detalj. 834 00:37:06,590 --> 00:37:08,360 Alla tecken är densamma. 835 00:37:08,360 --> 00:37:12,810 Så låt mig föreslå, och låt mig presentera i version ett av compare.c 836 00:37:12,810 --> 00:37:14,970 här, så jämför-1.c. 837 00:37:14,970 --> 00:37:19,590 >> Låt mig föreslå att vi ändå får en pekare kallas s, och förvara i det 838 00:37:19,590 --> 00:37:20,610 returvärdet hämta sträng. 839 00:37:20,610 --> 00:37:21,750 Låt oss göra samma sak med t. 840 00:37:21,750 --> 00:37:23,230 Så ingen av koden är annorlunda. 841 00:37:23,230 --> 00:37:25,420 Jag kommer att lägga till lite mer felkontroll nu. 842 00:37:25,420 --> 00:37:29,390 Så nu när vi är typ av peeling tillbaka detta skikt i CS50 av vad en sträng 843 00:37:29,390 --> 00:37:33,520 egentligen är, måste vi vara mer anal om att se till att vi inte missbrukar 844 00:37:33,520 --> 00:37:35,330 ogiltiga värden som null. 845 00:37:35,330 --> 00:37:36,440 >> Så jag ska bara kolla. 846 00:37:36,440 --> 00:37:41,490 Om s inte är lika noll och t inte lika null, innebär att vi är OK. 847 00:37:41,490 --> 00:37:44,460 Få strängen inte skruva upp att få någon av dessa strängar. 848 00:37:44,460 --> 00:37:51,270 Och du kanske kan gissa nu, vad gör STR CMP förmodligen? 849 00:37:51,270 --> 00:37:52,000 String jämföra. 850 00:37:52,000 --> 00:37:55,470 >> Så om du har program i java innan, detta är som lika metoden i 851 00:37:55,470 --> 00:37:56,490 string klassen. 852 00:37:56,490 --> 00:37:57,890 Men för er som inte har programmeras innan, 853 00:37:57,890 --> 00:37:59,320 detta är bara en c-funktion. 854 00:37:59,320 --> 00:38:02,180 Det händer att komma i en fil som heter string.h. 855 00:38:02,180 --> 00:38:03,830 Det är där det deklareras. 856 00:38:03,830 --> 00:38:05,110 >> Och string jämför - 857 00:38:05,110 --> 00:38:07,530 Jag faktiskt glömmer dess användning, men strunt i det. 858 00:38:07,530 --> 00:38:10,470 Minns att vi kan göra människa, rör jämföra. 859 00:38:10,470 --> 00:38:12,590 Och detta kommer att ta upp Linux programmerare manual. 860 00:38:12,590 --> 00:38:14,060 Och det är, ärligt talat, lite kryptiskt. 861 00:38:14,060 --> 00:38:15,270 Men jag kan se här att, yep. 862 00:38:15,270 --> 00:38:17,570 Jag måste inkludera string.h. 863 00:38:17,570 --> 00:38:20,590 >> Och det står här under beskrivningen "den string compare funktionen jämför 864 00:38:20,590 --> 00:38:24,560 de två strängarna S1 och S2. "Och S1 och S2 är tydligen de två 865 00:38:24,560 --> 00:38:26,120 argument som skickas på i. 866 00:38:26,120 --> 00:38:28,650 Jag minns inte riktigt vad konst är, men nu märker - 867 00:38:28,650 --> 00:38:31,480 och du kanske har sett detta redan när har du använd man-sidor om du 868 00:38:31,480 --> 00:38:32,390 har allt - 869 00:38:32,390 --> 00:38:36,220 att röding stjärna är bara synonymt med snöre. 870 00:38:36,220 --> 00:38:40,440 >> Så det jämför de två strängar, S1 och S2, och den returnerar ett heltal mindre 871 00:38:40,440 --> 00:38:44,930 än eller lika med eller större än noll om S1 hittas, respektive, för att vara 872 00:38:44,930 --> 00:38:47,450 mindre än, eller matcha, eller vara större än S2. 873 00:38:47,450 --> 00:38:51,220 Det är bara ett mycket komplext sätt att säga att strängen jämför avkastning 874 00:38:51,220 --> 00:38:55,760 noll om två strängar är intuitivt identiska, tecknet för 875 00:38:55,760 --> 00:38:57,120 tecken för tecken. 876 00:38:57,120 --> 00:38:59,970 >> Den returnerar ett negativt tal om s, alfabetiskt, är tänkt 877 00:38:59,970 --> 00:39:01,010 att komma före t. 878 00:39:01,010 --> 00:39:05,300 Eller returnerar ett positivt tal om s är tänkt att komma efter t 879 00:39:05,300 --> 00:39:06,170 alfabetiskt. 880 00:39:06,170 --> 00:39:08,360 Så med denna enkla funktion, kan du till exempel sortera en 881 00:39:08,360 --> 00:39:09,770 massa ord? 882 00:39:09,770 --> 00:39:13,984 >> Så i denna nya version, kommer jag att gå vidare och göra compare1. 883 00:39:13,984 --> 00:39:15,750 Dot snedstreck jämför en. 884 00:39:15,750 --> 00:39:18,030 Jag ska skriva in hello i alla gemener. 885 00:39:18,030 --> 00:39:20,300 Jag kommer att skriva in hello i gemener igen. 886 00:39:20,300 --> 00:39:23,340 Och tack och lov nu inser Jag har skrivit samma sak. 887 00:39:23,340 --> 00:39:27,520 >> Under tiden, om jag skriver in hello i lägre fallet och HEJ i versaler och 888 00:39:27,520 --> 00:39:29,710 jämföra dem, skrev jag olika saker. 889 00:39:29,710 --> 00:39:32,530 Eftersom inte bara är de adresser annorlunda, men vi jämför 890 00:39:32,530 --> 00:39:35,350 olika karaktärer och om igen. 891 00:39:35,350 --> 00:39:37,320 >> Nåväl låt oss gå och fixa en andra problem nu. 892 00:39:37,320 --> 00:39:41,590 Låt mig öppna upp version en av kopia, som nu behandlar 893 00:39:41,590 --> 00:39:42,900 denna fråga enligt följande. 894 00:39:42,900 --> 00:39:45,650 Och detta kommer att se ut lite mer komplex. 895 00:39:45,650 --> 00:39:49,320 Men om du tänker på vad problemet vi måste lösa, förhoppningsvis kommer detta att vara 896 00:39:49,320 --> 00:39:51,870 klart på bara ett ögonblick nu. 897 00:39:51,870 --> 00:39:57,280 >> Så denna första raden, röding start t, i lekmannaspråk kan någon föreslå 898 00:39:57,280 --> 00:39:59,450 vad denna linje här betyder? 899 00:39:59,450 --> 00:40:01,050 Char stjärnan t, vad är det som gör? 900 00:40:01,050 --> 00:40:06,660 901 00:40:06,660 --> 00:40:07,210 >> Bra. 902 00:40:07,210 --> 00:40:09,500 Skapa en pekare till några plats i minnet. 903 00:40:09,500 --> 00:40:10,930 Och låt mig förfina det lite. 904 00:40:10,930 --> 00:40:17,180 Deklarera en variabel som kommer att lagra den adress för vissa röding i minnet, bara 905 00:40:17,180 --> 00:40:18,480 att vara lite mer korrekt. 906 00:40:18,480 --> 00:40:21,210 >> OK, så nu på höger sida, har jag aldrig sett någon av dessa funktioner 907 00:40:21,210 --> 00:40:22,660 tidigare, malloc. 908 00:40:22,660 --> 00:40:26,980 Men vad kan det betyda? 909 00:40:26,980 --> 00:40:28,050 Tilldelning av minne. 910 00:40:28,050 --> 00:40:29,410 Memory allocation. 911 00:40:29,410 --> 00:40:33,050 >> Så visar det sig, fram tills nu, vi har inte riktigt haft ett kraftfullt sätt 912 00:40:33,050 --> 00:40:36,210 frågar operativsystemet, ge mig lite minne. 913 00:40:36,210 --> 00:40:39,980 Snarare har vi nu en funktion som kallas malloc som gör exakt det. 914 00:40:39,980 --> 00:40:42,960 Även om detta är lite av en distraktion just nu, märker att i 915 00:40:42,960 --> 00:40:46,200 mellan de två parentes är bara kommer att vara ett nummer. 916 00:40:46,200 --> 00:40:48,510 Där jag har skrivit i fråga märken kan vara ett tal. 917 00:40:48,510 --> 00:40:51,020 >> Och den siffran betyder, ge mig 10 bytes. 918 00:40:51,020 --> 00:40:52,320 Ge mig 20 bytes. 919 00:40:52,320 --> 00:40:53,820 Ge mig 100 byte. 920 00:40:53,820 --> 00:40:56,500 Och malloc kommer att göra sitt bästa för att be operativsystemet - 921 00:40:56,500 --> 00:40:57,630 Linux, i detta fall - 922 00:40:57,630 --> 00:40:59,630 hej, är deras 100 bytes RAM-minne? 923 00:40:59,630 --> 00:41:04,320 Om så, tillbaka dessa bytes till mig av återvänder vars adress av 924 00:41:04,320 --> 00:41:06,610 dessa bytes, kanske? 925 00:41:06,610 --> 00:41:07,610 Den allra första. 926 00:41:07,610 --> 00:41:10,460 >> Så här också - och detta är dominerande i C, helst du är 927 00:41:10,460 --> 00:41:11,680 hantera adresser? 928 00:41:11,680 --> 00:41:15,830 Du är nästan alltid att göra med första sådan adress, oavsett hur stor 929 00:41:15,830 --> 00:41:19,490 en bit av minnet du vara lämnas tillbaka, så att säga. 930 00:41:19,490 --> 00:41:20,880 >> Så låt oss dyka in här. 931 00:41:20,880 --> 00:41:23,940 Jag försöker att fördela hur många bytes, exakt? 932 00:41:23,940 --> 00:41:24,080 Well. 933 00:41:24,080 --> 00:41:26,090 Sträng längd s - låt oss göra ett konkret exempel. 934 00:41:26,090 --> 00:41:30,700 Om s är hej, H-E-L-L-O, vad är det sträng längd s, självklart? 935 00:41:30,700 --> 00:41:32,010 Så det är fem. 936 00:41:32,010 --> 00:41:34,590 Men jag gör ett plus 1 på det, varför? 937 00:41:34,590 --> 00:41:37,700 Varför vill jag sex bytes istället för fem? 938 00:41:37,700 --> 00:41:38,790 Den null karaktär. 939 00:41:38,790 --> 00:41:41,210 >> Jag vill inte lämna ut detta speciella null karaktär. 940 00:41:41,210 --> 00:41:45,160 För om jag gör en kopia av Hej och bara göra H-E-L-L-O, men jag inte sätta 941 00:41:45,160 --> 00:41:50,160 den speciella karaktär, datorn kanske inte har, av en slump, ett omvänt snedstreck 942 00:41:50,160 --> 00:41:51,730 noll där för mig. 943 00:41:51,730 --> 00:41:55,570 Och så om jag försöker räkna ut längd kopian, skulle jag tro att 944 00:41:55,570 --> 00:41:59,360 det är 20 tecken långt, eller en miljon tecken om jag bara aldrig hända 945 00:41:59,360 --> 00:42:01,050 att träffa en backslash noll. 946 00:42:01,050 --> 00:42:05,780 >> Så vi behöver sex byte för att lagra H-E-L-L-O, omvänt snedstreck noll. 947 00:42:05,780 --> 00:42:07,870 Och då är detta bara vara super anal. 948 00:42:07,870 --> 00:42:10,700 Antag att jag glömmer vad storleken på en röding är. 949 00:42:10,700 --> 00:42:12,020 Vi fortsätter att säga att det är en byte. 950 00:42:12,020 --> 00:42:12,860 Och det är oftast. 951 00:42:12,860 --> 00:42:15,425 I teorin kan det vara något annorlunda, på en annan Mac eller en 952 00:42:15,425 --> 00:42:16,250 annan dator. 953 00:42:16,250 --> 00:42:19,650 >> Så visar det sig att det är det här operatör kallas sizeof att om du klarar det 954 00:42:19,650 --> 00:42:22,680 namnet på en datatyp - som röding, eller int eller float - 955 00:42:22,680 --> 00:42:26,930 Det kommer att säga, dynamiskt, hur många bytes en röding tar upp detta 956 00:42:26,930 --> 00:42:28,090 viss dator. 957 00:42:28,090 --> 00:42:31,360 >> Så detta är ett effektivt sätt bara som att säga gånger 1 eller 958 00:42:31,360 --> 00:42:32,440 gånger ingenting alls. 959 00:42:32,440 --> 00:42:36,340 Men jag gör det bara för att vara super anal, att ifall en röding skiljer 960 00:42:36,340 --> 00:42:40,610 på din dator kontra mine, på detta sätt matten kommer alltid att kolla in. 961 00:42:40,610 --> 00:42:43,720 >> Slutligen, här nere jag kontrollera null, vilket alltid är bra metoder - igen, 962 00:42:43,720 --> 00:42:44,920 helst vi har att göra med pekare. 963 00:42:44,920 --> 00:42:47,520 Om malloc inte kunde ge me sex avsked - vilket är 964 00:42:47,520 --> 00:42:49,210 osannolikt, men bara i fallet - 965 00:42:49,210 --> 00:42:50,730 återvända en omedelbart. 966 00:42:50,730 --> 00:42:53,290 Och nu, gå vidare och kopiera strängen enligt följande. 967 00:42:53,290 --> 00:42:57,240 Och detta är välbekant syntax, om än i en annan roll. 968 00:42:57,240 --> 00:43:01,210 >> Jag ska gå vidare och få strängen längd av s och lagra den i n. 969 00:43:01,210 --> 00:43:06,620 Jag sedan kommer att iterera från i lika noll till och med n, 970 00:43:06,620 --> 00:43:08,410 större än eller lika med. 971 00:43:08,410 --> 00:43:13,540 Så att det på varje iteration, ställde jag te karaktär är i: te 972 00:43:13,540 --> 00:43:15,380 karaktär t. 973 00:43:15,380 --> 00:43:18,190 >> Så vad som verkligen händer under huven här? 974 00:43:18,190 --> 00:43:22,140 Även om detta, till exempel, är s - 975 00:43:22,140 --> 00:43:26,400 och jag har skrivit in ordet H-E-L-L-O och det finns ett omvänt snedstreck noll. 976 00:43:26,400 --> 00:43:29,020 Och återigen, detta s pekar här. 977 00:43:29,020 --> 00:43:30,830 Och här nu är t. 978 00:43:30,830 --> 00:43:34,860 >> Och detta pekar nu en kopia av minne, eller hur? 979 00:43:34,860 --> 00:43:37,340 Malloc har gett mig en hel bit av minnet. 980 00:43:37,340 --> 00:43:41,440 Jag vet inte från början vad som är i någon av dessa platser. 981 00:43:41,440 --> 00:43:44,340 Så jag kommer att tänka på dessa som en hel massa frågetecken. 982 00:43:44,340 --> 00:43:50,190 >> Men så fort jag börjar kretsa från noll vidare upp genom längden på s, t 983 00:43:50,190 --> 00:43:52,790 fäste noll och t bracket 1 - 984 00:43:52,790 --> 00:43:55,080 och jag ska sätta detta nu på overhead - 985 00:43:55,080 --> 00:44:04,190 t fäste noll och s fäste noll betyder att jag kommer att kopiera 986 00:44:04,190 --> 00:44:09,875 iterativt h in här, E-L-L-O. Plus, eftersom jag gjorde det plus 987 00:44:09,875 --> 00:44:12,370 1, omvänt snedstreck noll. 988 00:44:12,370 --> 00:44:19,060 >> Så nu i fallet med jämför-1 c, i slutändan, om jag skriver ut 989 00:44:19,060 --> 00:44:24,760 aktivering av T, ska vi se till att s är oförändrat. 990 00:44:24,760 --> 00:44:26,090 Låt mig gå vidare nu och göra detta. 991 00:44:26,090 --> 00:44:28,630 Så gör copy1. 992 00:44:28,630 --> 00:44:30,860 Dot snedstreck copy1. 993 00:44:30,860 --> 00:44:33,670 Jag kommer att skriva in hello, Enter. 994 00:44:33,670 --> 00:44:37,430 Och nu märker, bara kopian har aktiverats. 995 00:44:37,430 --> 00:44:40,890 Eftersom jag har verkligen två bitar av minnet. 996 00:44:40,890 --> 00:44:44,390 >> Tyvärr, kan du göra några ganska dåliga och ganska farliga saker här. 997 00:44:44,390 --> 00:44:49,290 Låt mig dra upp ett exempel här nu, som ger oss ett exempel på ett fåtal 998 00:44:49,290 --> 00:44:51,540 olika linjer. 999 00:44:51,540 --> 00:44:56,040 Så bara intuitivt här, den första raden av koden, är int stjärnan x, förklara 1000 00:44:56,040 --> 00:44:57,340 en variabel som heter x. 1001 00:44:57,340 --> 00:44:58,810 Och vad är datatypen av denna variabel? 1002 00:44:58,810 --> 00:45:01,820 1003 00:45:01,820 --> 00:45:04,290 Vad är datatypen för den variabeln? 1004 00:45:04,290 --> 00:45:06,980 Det var inte cliffhanger. 1005 00:45:06,980 --> 00:45:08,350 >> Datatypen är int stjärna. 1006 00:45:08,350 --> 00:45:12,600 Så vad betyder det? x kommer lagra adressen till en int. 1007 00:45:12,600 --> 00:45:13,520 Så enkelt är det. 1008 00:45:13,520 --> 00:45:16,220 Y kommer att lagra adressen till en int. 1009 00:45:16,220 --> 00:45:18,390 Vad är den tredje raden av koden gör det? 1010 00:45:18,390 --> 00:45:21,850 Det fördela hur många byte, mest troligt? 1011 00:45:21,850 --> 00:45:22,350 Fyra. 1012 00:45:22,350 --> 00:45:25,460 På grund av storleken på en int är generellt fyra, ger malloc av fyra 1013 00:45:25,460 --> 00:45:29,950 mig tillbaka adressen till en bit av minne, är den första i vars byte 1014 00:45:29,950 --> 00:45:32,110 lagras nu i x. 1015 00:45:32,110 --> 00:45:34,410 >> Nu ska vi flytta lite snabbt. 1016 00:45:34,410 --> 00:45:35,760 Star x betyder vad? 1017 00:45:35,760 --> 00:45:38,480 1018 00:45:38,480 --> 00:45:42,590 Det innebär att gå till denna adress och sätta vad numret dit? 1019 00:45:42,590 --> 00:45:43,870 Sätt nummer 42 där. 1020 00:45:43,870 --> 00:45:47,590 Star y betyder att gå till vad som finns på y och uppskattar antalet 13 där. 1021 00:45:47,590 --> 00:45:48,600 >> Men vänta en minut. 1022 00:45:48,600 --> 00:45:51,640 Vad är y just nu? 1023 00:45:51,640 --> 00:45:54,950 Vilken adress är y lagring? 1024 00:45:54,950 --> 00:45:55,770 Vi vet inte, eller hur? 1025 00:45:55,770 --> 00:45:59,230 Vi har aldrig en gång använd uppdraget operatör involverar y. 1026 00:45:59,230 --> 00:46:03,370 Så y deklarerade på den andra raden i koden är bara några sopor värde, en stor 1027 00:46:03,370 --> 00:46:04,760 frågetecken så att säga. 1028 00:46:04,760 --> 00:46:07,230 Det skulle kunna peka slumpvis till något i minnet, vilket 1029 00:46:07,230 --> 00:46:08,340 är generellt dåliga. 1030 00:46:08,340 --> 00:46:13,540 >> Så snart som vi slår den linjen där, stjärniga y är lika med 13, något dåligt, 1031 00:46:13,540 --> 00:46:17,220 något mycket hemskt är på väg att hända med Binky. 1032 00:46:17,220 --> 00:46:25,810 Så låt oss se vad som kommer att hamna händer Binky här i denna minut 1033 00:46:25,810 --> 00:46:26,200 eller så leta. 1034 00:46:26,200 --> 00:46:26,490 >> [VIDEO SPELA] 1035 00:46:26,490 --> 00:46:26,745 >> -Hej, Binky. 1036 00:46:26,745 --> 00:46:27,000 Vakna. 1037 00:46:27,000 --> 00:46:29,296 Det är dags för pekaren kul. 1038 00:46:29,296 --> 00:46:30,680 >> -Vad är det? 1039 00:46:30,680 --> 00:46:31,980 Läs om pekare? 1040 00:46:31,980 --> 00:46:34,010 Åh, goodie. 1041 00:46:34,010 --> 00:46:37,220 >> -Jo, för att komma igång, jag antar att vi är kommer att behöva ett par pekare. 1042 00:46:37,220 --> 00:46:37,930 >> -OK. 1043 00:46:37,930 --> 00:46:41,650 Denna kod tilldelar två pekare vilket kan peka till heltal. 1044 00:46:41,650 --> 00:46:43,760 >> -OK, bra, ser jag de två pekare. 1045 00:46:43,760 --> 00:46:45,850 Men de verkar inte vara pekar på någonting. 1046 00:46:45,850 --> 00:46:46,490 >> -Det stämmer. 1047 00:46:46,490 --> 00:46:48,630 Inledningsvis pekare inte peka på någonting. 1048 00:46:48,630 --> 00:46:51,700 De saker de pekar på kallas pointees, och bygga upp dem är en 1049 00:46:51,700 --> 00:46:52,850 separat steg. 1050 00:46:52,850 --> 00:46:53,740 >> -Åh, höger, höger. 1051 00:46:53,740 --> 00:46:54,500 Jag visste det. 1052 00:46:54,500 --> 00:46:56,270 De pointees är separata. 1053 00:46:56,270 --> 00:46:58,553 Så hur tilldela dig en pointee? 1054 00:46:58,553 --> 00:46:59,480 >> -OK. 1055 00:46:59,480 --> 00:47:03,707 Nåväl, tilldelar denna kod nytt heltal pointee, och denna del beskrivs x 1056 00:47:03,707 --> 00:47:05,520 att peka på den. 1057 00:47:05,520 --> 00:47:06,760 >> -Hej, ser det bättre. 1058 00:47:06,760 --> 00:47:08,520 Så gör det gör något. 1059 00:47:08,520 --> 00:47:09,530 >> -OK. 1060 00:47:09,530 --> 00:47:14,110 Jag ska avreferera pekaren x för att lagra numret 42 i sin pointee. 1061 00:47:14,110 --> 00:47:17,660 För detta trick, jag behöver min magi wand av dereferencing. 1062 00:47:17,660 --> 00:47:20,695 >> -Din trollstav av dereferencing? 1063 00:47:20,695 --> 00:47:22,632 Eh, det är bra. 1064 00:47:22,632 --> 00:47:24,620 >> -Det här är vad koden ser ut. 1065 00:47:24,620 --> 00:47:27,526 Jag ska bara ställa in antalet, och - 1066 00:47:27,526 --> 00:47:28,250 >> -Hej, titta. 1067 00:47:28,250 --> 00:47:29,680 Där det går. 1068 00:47:29,680 --> 00:47:34,520 Så gör en dereference på x följer pilen för att komma åt dess pointee. 1069 00:47:34,520 --> 00:47:36,690 I detta fall, för att lagra 42 i där. 1070 00:47:36,690 --> 00:47:40,890 Hej, prova att använda den för att lagra numret 13 genom den andra pekaren, y. 1071 00:47:40,890 --> 00:47:42,125 >> -OK. 1072 00:47:42,125 --> 00:47:46,810 Jag ska bara gå hit till y och få nummer 13 inrättas. 1073 00:47:46,810 --> 00:47:50,890 Och sedan ta trollspö dereferencing och just - 1074 00:47:50,890 --> 00:47:52,430 whoa! 1075 00:47:52,430 --> 00:47:53,030 >> -Åh, hej. 1076 00:47:53,030 --> 00:47:54,610 Det fungerade inte. 1077 00:47:54,610 --> 00:47:58,200 Säg, Binky, jag tror inte det dereferencing y är en bra idé, 1078 00:47:58,200 --> 00:48:01,370 eftersom att inrätta pointee är ett separat steg. 1079 00:48:01,370 --> 00:48:03,460 Och jag tror inte att vi någonsin gjorde det. 1080 00:48:03,460 --> 00:48:03,810 >> -Hmm. 1081 00:48:03,810 --> 00:48:05,160 Bra poäng. 1082 00:48:05,160 --> 00:48:07,410 >> -Yeah, fördelade vi pekaren y. 1083 00:48:07,410 --> 00:48:10,045 Men vi satt aldrig till peka på en pointee. 1084 00:48:10,045 --> 00:48:10,490 >> -Hmm. 1085 00:48:10,490 --> 00:48:12,170 Mycket observant. 1086 00:48:12,170 --> 00:48:13,790 >> -Hej, du letar bra där, Binky. 1087 00:48:13,790 --> 00:48:16,920 Kan du fixa det så att y poäng till samma pointee som x? 1088 00:48:16,920 --> 00:48:17,810 >> -Visst. 1089 00:48:17,810 --> 00:48:20,300 Jag ska använda min magiska trollspö pekare uppdrag. 1090 00:48:20,300 --> 00:48:22,240 >> -Kommer det att bli en problem som förut? 1091 00:48:22,240 --> 00:48:22,665 >> -Nej. 1092 00:48:22,665 --> 00:48:24,300 Detta berör inte pointees. 1093 00:48:24,300 --> 00:48:27,880 Det förändrar bara en pekare att peka till samma sak som en annan. 1094 00:48:27,880 --> 00:48:28,970 >> -Åh, ser jag. 1095 00:48:28,970 --> 00:48:31,730 Nu y pekar på samma plats som x. 1096 00:48:31,730 --> 00:48:32,450 Så vänta. 1097 00:48:32,450 --> 00:48:33,490 Nu y är fast. 1098 00:48:33,490 --> 00:48:34,630 Den har en pointee. 1099 00:48:34,630 --> 00:48:36,520 Så du kan prova staven av dereferencing igen 1100 00:48:36,520 --> 00:48:39,200 att skicka 13 över. 1101 00:48:39,200 --> 00:48:39,840 >> -OK. 1102 00:48:39,840 --> 00:48:41,570 Här går. 1103 00:48:41,570 --> 00:48:42,870 >> -Hej, titta på det. 1104 00:48:42,870 --> 00:48:44,320 Nu dereferencing fungerar på y. 1105 00:48:44,320 --> 00:48:47,020 Och eftersom pekarna delar att en pointee, de 1106 00:48:47,020 --> 00:48:48,585 både se 13. 1107 00:48:48,585 --> 00:48:49,040 >> -Ja. 1108 00:48:49,040 --> 00:48:49,670 Delning. 1109 00:48:49,670 --> 00:48:50,380 Oavsett. 1110 00:48:50,380 --> 00:48:52,290 Så ska vi byta platser nu? 1111 00:48:52,290 --> 00:48:52,970 >> -Åh, titta. 1112 00:48:52,970 --> 00:48:54,150 Vi är ute i tid. 1113 00:48:54,150 --> 00:48:55,200 >> -Men - 1114 00:48:55,200 --> 00:48:57,060 >> -Kom bara ihåg de tre pointer regler. 1115 00:48:57,060 --> 00:49:00,100 Nummer ett, den grundläggande strukturen är att du har en pekare. 1116 00:49:00,100 --> 00:49:02,170 Och det pekar över till en pointee. 1117 00:49:02,170 --> 00:49:04,160 Men pekaren och pointee är separata. 1118 00:49:04,160 --> 00:49:06,460 Och det vanligt fel är att inrätta en pekare, men för att 1119 00:49:06,460 --> 00:49:08,540 glömmer att ges en pointee. 1120 00:49:08,540 --> 00:49:12,460 >> Nummer två, börjar pekaren dereferencing vid pekaren och följer dess 1121 00:49:12,460 --> 00:49:14,570 pil ned för att komma sin pointee. 1122 00:49:14,570 --> 00:49:18,640 Som vi alla vet, detta fungerar endast om det är en pointee, som kommer tillbaka till 1123 00:49:18,640 --> 00:49:19,790 regel nummer ett. 1124 00:49:19,790 --> 00:49:23,670 >> Nummer tre, tar pekaren uppdrag en pekare och förändringar det att peka på 1125 00:49:23,670 --> 00:49:25,850 samma pointee som en annan pekare. 1126 00:49:25,850 --> 00:49:27,840 Så efter överlåtelsen, de två pekare kommer 1127 00:49:27,840 --> 00:49:29,430 peka på samma pointee. 1128 00:49:29,430 --> 00:49:31,600 Ibland kallas delning. 1129 00:49:31,600 --> 00:49:33,430 Och det är allt som finns till den, egentligen. 1130 00:49:33,430 --> 00:49:33,840 Bye bye nu. 1131 00:49:33,840 --> 00:49:34,300 >> [END VIDEOAVSPELNING] 1132 00:49:34,300 --> 00:49:36,940 >> DAVID MALAN: Så mer om pekare, mer om Binky nästa vecka. 1133 00:49:36,940 --> 00:49:38,190 Vi ses på måndag. 1134 00:49:38,190 --> 00:49:42,187