1 00:00:00,000 --> 00:00:11,320 2 00:00:11,320 --> 00:00:13,260 >> DAVID MALAN: Hello, og velkommen tilbage til CS50. 3 00:00:13,260 --> 00:00:14,860 Så dette er slutningen af ​​ugen fire. 4 00:00:14,860 --> 00:00:16,680 Bare en meddelelse først. 5 00:00:16,680 --> 00:00:19,600 Så den såkaldte femte mandag er kommer op på mandag. 6 00:00:19,600 --> 00:00:22,800 Dette er mulighed for at skifte fra SAT / unsat på et brev klasse, eller fra 7 00:00:22,800 --> 00:00:24,130 bogstavkarakter SAT / unsat. 8 00:00:24,130 --> 00:00:27,130 Annoyingly, denne proces kræver en signatur, fordi du er nødt til at udfylde 9 00:00:27,130 --> 00:00:28,770 ud en af ​​disse lyserøde add / drop former. 10 00:00:28,770 --> 00:00:31,680 >> Fordi teknisk, SAT / unsat version og bogstavet klasse versionen 11 00:00:31,680 --> 00:00:33,320 har distinkte katalognumre. 12 00:00:33,320 --> 00:00:34,240 Men nogen big deal. 13 00:00:34,240 --> 00:00:36,620 Bare kom op til mig eller at røve eller Lauren på noget tidspunkt. 14 00:00:36,620 --> 00:00:39,550 Eller send os en mail, hvis du ikke har den slags papirarbejde du har brug for i dag, og vi 15 00:00:39,550 --> 00:00:43,410 vil være sikker på at hjælpe dig med at tage pleje af det før mandag. 16 00:00:43,410 --> 00:00:45,780 >> Okay, så i dag - 17 00:00:45,780 --> 00:00:47,630 faktisk, der er lidt af et ekko. 18 00:00:47,630 --> 00:00:51,070 Kan vi tone mig lidt ned? 19 00:00:51,070 --> 00:00:51,730 OK. 20 00:00:51,730 --> 00:00:54,850 Så i dag, introducerer vi et emne kendt som pointere. 21 00:00:54,850 --> 00:00:57,770 Og jeg vil indrømme, at dette er en af ​​de mere komplekse emner, som vi har tendens til at 22 00:00:57,770 --> 00:01:00,960 dække i denne klasse, eller virkelig nogen introduktionskursus, der bruger C. 23 00:01:00,960 --> 00:01:05,510 >> Men tage mit ord for det, især hvis dit sind føles lidt mere bøjet 24 00:01:05,510 --> 00:01:07,100 dag og i de kommende uger. 25 00:01:07,100 --> 00:01:10,340 Det er ikke repræsentativt for at du får værre på dette det betyder blot, 26 00:01:10,340 --> 00:01:13,360 Det er et særdeles sofistikeret emne at jeg lover, et par uger 27 00:01:13,360 --> 00:01:17,610 dermed vil synes alt for påfaldende ligetil i bakspejlet. 28 00:01:17,610 --> 00:01:18,720 >> Jeg husker stadig den dag i dag. 29 00:01:18,720 --> 00:01:22,190 Jeg sad i Elliott Dining Hall, sidder ved siden af ​​min TF Nishat Mehta, 30 00:01:22,190 --> 00:01:24,070 der var hjemmehørende i Elliott hus. 31 00:01:24,070 --> 00:01:26,340 Og en eller anden grund, er dette topic bare klikker. 32 00:01:26,340 --> 00:01:29,430 Hvilket vil sige, at jeg også kæmpet med det til en vis mængde tid, men jeg 33 00:01:29,430 --> 00:01:33,610 vil gøre mit bedste for at hjælpe med at undgå sådanne kæmper med et emne, der i sidste ende 34 00:01:33,610 --> 00:01:34,580 er ganske kraftfuld. 35 00:01:34,580 --> 00:01:37,350 >> Faktisk har vi et af de emner vil diskutere i de kommende uger, er, at 36 00:01:37,350 --> 00:01:41,130 af sikkerhed, og hvordan du kan faktisk udnytte maskinerne på måder 37 00:01:41,130 --> 00:01:42,320 der blev ikke beregnet. 38 00:01:42,320 --> 00:01:45,850 Og de udnyttelser er typisk resultatet af bugs, fejl, vi 39 00:01:45,850 --> 00:01:49,740 folk gør ved ikke at forstå nogle af den underliggende gennemførelse 40 00:01:49,740 --> 00:01:52,250 detaljer via hvilke programmer er lavet. 41 00:01:52,250 --> 00:01:55,410 >> Nu for at gøre dette synes alle de mere brugervenlig venlig, jeg troede, jeg ville spille en 10 42 00:01:55,410 --> 00:01:59,680 andet eksempel på en lille claymation figur ved navn Binky som blev bragt til 43 00:01:59,680 --> 00:02:03,020 livet af en ven af ​​vores på Stanford, professor Nick Parlante. 44 00:02:03,020 --> 00:02:06,753 Så tillad mig at give dig denne teaser af Binky her. 45 00:02:06,753 --> 00:02:09,520 >> [VIDEO AFSPIL] 46 00:02:09,520 --> 00:02:10,380 >> -Hej, Binky. 47 00:02:10,380 --> 00:02:11,050 Vågn op. 48 00:02:11,050 --> 00:02:13,610 Det er tid til pointer sjov. 49 00:02:13,610 --> 00:02:14,741 >> -Hvad er det? 50 00:02:14,741 --> 00:02:16,440 Lær om pointers? 51 00:02:16,440 --> 00:02:17,928 Åh, goodie. 52 00:02:17,928 --> 00:02:18,920 >> [END VIDEOAFSPILNING] 53 00:02:18,920 --> 00:02:20,670 >> DAVID MALAN: Det er Stanford datalogi. 54 00:02:20,670 --> 00:02:23,194 Så mere om det at komme. 55 00:02:23,194 --> 00:02:24,930 >> [Applaus] 56 00:02:24,930 --> 00:02:26,660 >> DAVID MALAN: Beklager, Nick. 57 00:02:26,660 --> 00:02:30,680 >> Så minde om, at sidste gang vi sluttede på dette virkelig spændende cliffhanger 58 00:02:30,680 --> 00:02:32,960 hvorved denne funktion bare ikke virkede. 59 00:02:32,960 --> 00:02:34,960 Mindst intuitivt, føltes det ligesom det bør fungere. 60 00:02:34,960 --> 00:02:37,600 Blot at bytte værdierne af to heltal. 61 00:02:37,600 --> 00:02:40,915 Men huske på, at når vi udskrives ud oprindelige værdier i hovedsagen, en og 62 00:02:40,915 --> 00:02:44,210 to, var de stadig én og to og ikke to og én. 63 00:02:44,210 --> 00:02:46,070 >> Så lad mig faktisk skifte over til apparatet. 64 00:02:46,070 --> 00:02:50,180 Og jeg skrev lidt op af skelet kode i avancere her, hvor jeg hævder, at x 65 00:02:50,180 --> 00:02:52,500 vil være 1, vil y være 2. 66 00:02:52,500 --> 00:02:54,810 Jeg så udskrive både deres værdier med print F. 67 00:02:54,810 --> 00:02:57,540 >> Jeg derefter hævder hernede, at vi kommer til at bytte dem. 68 00:02:57,540 --> 00:03:00,800 Jeg forlod et tomt sted her for os at udfylde i dag i bare et øjeblik. 69 00:03:00,800 --> 00:03:03,380 Så vil jeg hævde, at to variabler er blevet byttet. 70 00:03:03,380 --> 00:03:04,770 Så jeg har tænkt mig at udskrive dem ud igen. 71 00:03:04,770 --> 00:03:07,090 Og så forhåbentlig vil jeg kunne se henholdsvis 1, 2. 72 00:03:07,090 --> 00:03:07,380 2, 1. 73 00:03:07,380 --> 00:03:09,830 Det er den super simple mål lige nu. 74 00:03:09,830 --> 00:03:12,430 >> Så hvordan kan vi gå om at bytte to variabler? 75 00:03:12,430 --> 00:03:17,220 Tja, hvis jeg foreslår her, at disse kopper kan repræsentere hukommelsen i en computer. 76 00:03:17,220 --> 00:03:19,070 Dette er et par bid, dette er endnu et par bites. 77 00:03:19,070 --> 00:03:23,260 Kunne vi have en frivillig kommer på op og blande os nogle drikkevarer, hvis bekendt? 78 00:03:23,260 --> 00:03:23,920 Kom op. 79 00:03:23,920 --> 00:03:24,815 Hvad er dit navn? 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 Hvis du ikke har noget imod, er vi nødt til at sætte Google Glas på dig, så vi kan 84 00:03:29,180 --> 00:03:30,430 udødeliggøre dette. 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 Optag en video. 88 00:03:37,250 --> 00:03:43,103 Og OK, vi er gode til at gå med Jess her. 89 00:03:43,103 --> 00:03:43,810 Ok. 90 00:03:43,810 --> 00:03:45,120 Hyggeligt at møde dig. 91 00:03:45,120 --> 00:03:47,720 >> Så hvad jeg gerne vil du gør her - Hvis du kunne, ganske hurtigt - 92 00:03:47,720 --> 00:03:51,040 bare hælder os et halvt glas appelsin saft og et halvt glas mælk, 93 00:03:51,040 --> 00:03:55,710 repræsenterer effektivt tallene 1 i en kop og 2 i den anden kop. 94 00:03:55,710 --> 00:04:01,380 95 00:04:01,380 --> 00:04:02,630 >> Dette vil være godt optagelser. 96 00:04:02,630 --> 00:04:04,910 97 00:04:04,910 --> 00:04:05,860 >> JESS: Undskyld. 98 00:04:05,860 --> 00:04:06,330 >> DAVID MALAN: Nej, nej. 99 00:04:06,330 --> 00:04:08,703 Det er okay. 100 00:04:08,703 --> 00:04:10,120 Nice. 101 00:04:10,120 --> 00:04:12,950 Okay, så vi har fire bytes værd af appelsinjuice. 102 00:04:12,950 --> 00:04:14,460 Vi kaldte det værdien 1.. 103 00:04:14,460 --> 00:04:16,579 Nu yderligere fire bytes værd af mælk. 104 00:04:16,579 --> 00:04:18,519 Vil kalde det værdi 2.. 105 00:04:18,519 --> 00:04:20,440 Så x og y, hhv. 106 00:04:20,440 --> 00:04:23,450 >> Okay, så nu, hvis opgaven ved hånden - for dig, Jess, foran alle 107 00:04:23,450 --> 00:04:24,270 af dine klassekammerater - 108 00:04:24,270 --> 00:04:28,510 er at bytte værdierne af x og y sådan at vi ønsker appelsinjuice i 109 00:04:28,510 --> 00:04:32,070 anden kop og mælk i denne kop, hvordan kan du - før du rent faktisk gør 110 00:04:32,070 --> 00:04:34,020 det - gå om at gøre dette? 111 00:04:34,020 --> 00:04:35,220 >> OK, klog beslutning. 112 00:04:35,220 --> 00:04:36,340 Så du har brug for lidt mere hukommelse. 113 00:04:36,340 --> 00:04:38,190 Så lad os tildele en midlertidig kop, hvis du vil. 114 00:04:38,190 --> 00:04:40,540 Og nu videre til bytte x og y. 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 Så meget godt klaret. 118 00:04:54,420 --> 00:04:55,670 Tak så meget, Jess. 119 00:04:55,670 --> 00:04:59,520 120 00:04:59,520 --> 00:05:00,020 Vær så god. 121 00:05:00,020 --> 00:05:01,950 En lille souvenir. 122 00:05:01,950 --> 00:05:04,350 >> OK, så naturligvis, super simpel idé. 123 00:05:04,350 --> 00:05:07,500 Helt intuitivt, at vi har brug for lidt mere lagerplads - i denne form, 124 00:05:07,500 --> 00:05:09,750 en kop - hvis vi rent faktisk ønsker at bytte disse to variable. 125 00:05:09,750 --> 00:05:11,110 Så lad os gøre netop det. 126 00:05:11,110 --> 00:05:14,330 Heroppe i mellem, hvor jeg hævder jeg kommer til at gøre nogle swapping, jeg vil 127 00:05:14,330 --> 00:05:15,720 gå videre og erklære temp. 128 00:05:15,720 --> 00:05:17,980 Og jeg vil sætte det lig, siger, x. 129 00:05:17,980 --> 00:05:21,110 >> Så jeg har tænkt mig at ændre værdien af x ligesom Jess gjorde her med 130 00:05:21,110 --> 00:05:23,200 mælk og appelsinsaft at være lig med y. 131 00:05:23,200 --> 00:05:27,460 Og jeg har tænkt mig at skifte y at være lig ikke at x, fordi vi nu ville være 132 00:05:27,460 --> 00:05:29,530 fast i en cirkel, men snarere temp. 133 00:05:29,530 --> 00:05:33,170 Hvor jeg midlertidigt - eller når Jess midlertidigt sætte appelsinsaft 134 00:05:33,170 --> 00:05:35,460 før clobbering at kop med mælken. 135 00:05:35,460 --> 00:05:37,250 >> Så lad mig gå videre nu og gøre dette. 136 00:05:37,250 --> 00:05:39,210 Det hedder noswap.c. 137 00:05:39,210 --> 00:05:41,190 Og lad mig nu køre uden swap. 138 00:05:41,190 --> 00:05:43,910 Og ja, jeg se, om jeg udvide vindue en lille smule, at 139 00:05:43,910 --> 00:05:45,160 x er 1, y er 2. 140 00:05:45,160 --> 00:05:47,230 Og så x er 2, y er 1. 141 00:05:47,230 --> 00:05:51,910 >> Men huske på, at på mandag gjorde vi tingene lidt anderledes, hvorved jeg 142 00:05:51,910 --> 00:05:56,760 i stedet gennemført en hjælpefunktion, hvis du vil, var der faktisk ugyldige. 143 00:05:56,760 --> 00:05:58,010 Jeg kaldte det bytte. 144 00:05:58,010 --> 00:06:01,600 Jeg gav det to parametre, og jeg kaldte dem en, og jeg kaldte dem b. 145 00:06:01,600 --> 00:06:04,380 >> Helt ærligt, jeg kunne kalde dem x og y. 146 00:06:04,380 --> 00:06:06,040 Der er ikke noget at stoppe mig fra at gøre det. 147 00:06:06,040 --> 00:06:08,140 Men jeg vil hævde, det er så lidt tvetydig. 148 00:06:08,140 --> 00:06:11,910 Fordi tilbagekaldelse for mandag, som vi hævdede, at disse parametre var 149 00:06:11,910 --> 00:06:13,650 kopier af de værdier passerede i. 150 00:06:13,650 --> 00:06:15,640 Så det bare messer med din sind, tror jeg, hvis du bruger 151 00:06:15,640 --> 00:06:17,370 nøjagtig de samme variabler. 152 00:06:17,370 --> 00:06:20,150 >> Så jeg vil i stedet kalde dem en og b, bare for klarhed. 153 00:06:20,150 --> 00:06:21,840 Men vi kunne kalde dem mest noget, vi ønsker. 154 00:06:21,840 --> 00:06:26,280 Og jeg har tænkt mig at kopiere og indsætte effektivt denne kode deroppe fra 155 00:06:26,280 --> 00:06:27,170 ned i her. 156 00:06:27,170 --> 00:06:29,110 Fordi jeg har lige set, at det virker. 157 00:06:29,110 --> 00:06:30,790 Så det er i temmelig god figur. 158 00:06:30,790 --> 00:06:37,390 Og jeg vil ændre min x til en, min x til en, min y b og min y til b.. 159 00:06:37,390 --> 00:06:39,130 >> Så med andre ord,. Nøjagtig samme logik 160 00:06:39,130 --> 00:06:40,850 Den nøjagtige samme ting, som Jess gjorde. 161 00:06:40,850 --> 00:06:44,350 Og så en ting jeg nødt til at gøre op her, er naturligvis nu påberåbe sig denne 162 00:06:44,350 --> 00:06:45,990 funktion eller kalder denne funktion. 163 00:06:45,990 --> 00:06:50,430 Så jeg vil kalde denne funktion med to input, x og y, og hit Gem. 164 00:06:50,430 --> 00:06:52,300 >> Okay, så fundamentalt det samme. 165 00:06:52,300 --> 00:06:55,570 Faktisk har jeg nok gjort det program unødigt kompliceret ved 166 00:06:55,570 --> 00:07:00,820 skrive en funktion, der tager bare omkring seks linjer kode mens jeg 167 00:07:00,820 --> 00:07:02,970 tidligere havde gennemført dette på bare tre. 168 00:07:02,970 --> 00:07:06,230 >> Så lad mig gå videre nu og genskabe dette gør ingen swap. 169 00:07:06,230 --> 00:07:07,920 Okay, jeg skruet op her. 170 00:07:07,920 --> 00:07:11,290 Dette bør være en fejl, som du måske se mere almindeligt som din 171 00:07:11,290 --> 00:07:12,380 programmer får mere komplekse. 172 00:07:12,380 --> 00:07:13,470 Men der er en nem fix. 173 00:07:13,470 --> 00:07:15,650 Lad mig rulle tilbage op her. 174 00:07:15,650 --> 00:07:18,190 >> Og hvad er den første fejl jeg ser? 175 00:07:18,190 --> 00:07:19,520 Implicit erklæring. 176 00:07:19,520 --> 00:07:21,466 Hvad der typisk indikerer? 177 00:07:21,466 --> 00:07:22,830 Åh, jeg glemte prototypen. 178 00:07:22,830 --> 00:07:26,900 Jeg glemte at undervise compiler, swap vil eksistere, selvom han 179 00:07:26,900 --> 00:07:28,920 findes ikke i begyndelsen af programmet. 180 00:07:28,920 --> 00:07:35,780 Så jeg vil bare sige ugyldig swap, int, en int b, semikolon. 181 00:07:35,780 --> 00:07:37,280 >> Så jeg har ikke tænkt mig at reimplement det. 182 00:07:37,280 --> 00:07:39,140 Men nu det passer, hvad der er hernede. 183 00:07:39,140 --> 00:07:42,530 Og varsel, fraværet af et semikolon her, hvilket ikke er nødvendigt, når 184 00:07:42,530 --> 00:07:43,200 gennemførelse. 185 00:07:43,200 --> 00:07:46,010 >> Så lad mig genindspilning dette gør ingen swap. 186 00:07:46,010 --> 00:07:46,910 Meget bedre form. 187 00:07:46,910 --> 00:07:48,130 Kør ikke swap. 188 00:07:48,130 --> 00:07:48,740 Og helvede. 189 00:07:48,740 --> 00:07:51,650 Nu er vi tilbage, hvor vi var på mandag, hvor ting ikke bytte. 190 00:07:51,650 --> 00:07:55,410 >> Og hvad er den intuitive forklaring for, hvorfor dette er tilfældet? 191 00:07:55,410 --> 00:07:56,380 Ja? 192 00:07:56,380 --> 00:07:57,630 >> STUDENT: [uhørlig]. 193 00:07:57,630 --> 00:08:04,140 194 00:08:04,140 --> 00:08:05,230 >> DAVID MALAN: Præcis. 195 00:08:05,230 --> 00:08:07,330 Så a og b er kopier af x og y. 196 00:08:07,330 --> 00:08:10,680 Og i virkeligheden, når du har været kalde en funktion hidtil at 197 00:08:10,680 --> 00:08:12,540 passerer variabler som int'er - 198 00:08:12,540 --> 00:08:14,470 ligesom swap forventer her - 199 00:08:14,470 --> 00:08:16,270 du fyre har været forbi på kopier. 200 00:08:16,270 --> 00:08:19,150 >> Nu, betyder, at det tager lidt af tid, et split sekund, for 201 00:08:19,150 --> 00:08:23,270 computer til at kopiere bits fra ét variabel i bittene i en anden. 202 00:08:23,270 --> 00:08:24,610 Men det er ikke sådan en big deal. 203 00:08:24,610 --> 00:08:25,920 Men de er ikke desto mindre en kopi. 204 00:08:25,920 --> 00:08:30,020 >> Og så nu, i forbindelse med swap, Jeg er faktisk lykkedes 205 00:08:30,020 --> 00:08:31,180 ændre a og b. 206 00:08:31,180 --> 00:08:33,000 Faktisk, lad os gøre en hurtig tilregnelighed kontrollere. 207 00:08:33,000 --> 00:08:36,830 Print f a er% i, ny linje. 208 00:08:36,830 --> 00:08:38,770 Og lad os tilslutte et. 209 00:08:38,770 --> 00:08:41,830 Lad os nu gøre det samme med b. 210 00:08:41,830 --> 00:08:43,640 Og lad os gøre det samme her. 211 00:08:43,640 --> 00:08:47,260 >> Og nu, lad mig kopiere de samme linjer igen ved bunden af ​​funktionen 212 00:08:47,260 --> 00:08:51,250 efter mine tre linjer af interessante kunne have udført, og 213 00:08:51,250 --> 00:08:53,270 udskrive a og b igen. 214 00:08:53,270 --> 00:08:56,030 Så lad os nu gøre dette, gør ingen swap. 215 00:08:56,030 --> 00:08:58,430 Lad mig gøre terminalvinduet en bit højere, så vi kan se 216 00:08:58,430 --> 00:08:59,520 mere af det på én gang. 217 00:08:59,520 --> 00:09:00,860 >> Og køre uden swap. 218 00:09:00,860 --> 00:09:04,000 x er 1, y er 2. a er 1, b er 2. 219 00:09:04,000 --> 00:09:06,070 Og så en er 2, b er 1. 220 00:09:06,070 --> 00:09:09,390 Så det er i orden, ligesom Jess gjorde her inde i swap. 221 00:09:09,390 --> 00:09:13,090 Men selvfølgelig er det ikke har nogen effekt på de variable i main. 222 00:09:13,090 --> 00:09:15,360 >> Så vi oplevede et trick, hvorved vi kunne løse dette, right? 223 00:09:15,360 --> 00:09:19,560 Når du er konfronteret med dette scoping problem, du kunne bare punt og gøre x 224 00:09:19,560 --> 00:09:22,400 og y hvilken slags variabler i stedet? 225 00:09:22,400 --> 00:09:23,390 >> Du kan gøre dem globalt. 226 00:09:23,390 --> 00:09:27,560 Sæt dem på toppen af ​​filen som vi gjorde, selv i spillet på 15. 227 00:09:27,560 --> 00:09:28,890 Vi bruger en global variabel. 228 00:09:28,890 --> 00:09:32,420 Men i forbindelse med spillet en 15, det er rimeligt at have en global 229 00:09:32,420 --> 00:09:37,170 variabel repræsenterer bord, fordi helhed af 15.c er alle 230 00:09:37,170 --> 00:09:38,650 om at gennemføre det spil. 231 00:09:38,650 --> 00:09:41,470 Det er, hvad filen eksisterer for at gøre. 232 00:09:41,470 --> 00:09:44,170 >> Men i dette tilfælde her, jeg kalde en funktion swap. 233 00:09:44,170 --> 00:09:45,380 Jeg ønsker at bytte to variable. 234 00:09:45,380 --> 00:09:48,950 Og det skulle begynde at føle sig lige sjusket hvis opløsningen til alle vores 235 00:09:48,950 --> 00:09:51,300 problemer, når vi løber ind i anvendelsesområdet spørgsmål er at gøre det globalt. 236 00:09:51,300 --> 00:09:54,730 Fordi meget hurtigt vores program er kommer til at blive en ganske rod. 237 00:09:54,730 --> 00:09:57,760 Og det gjorde vi, at meget sparsomt som et resultat i 15.c. 238 00:09:57,760 --> 00:10:00,470 >> Men det viser sig at der er en bedre måde helt. 239 00:10:00,470 --> 00:10:05,600 Lad mig faktisk gå tilbage og slette print f s, bare for at forenkle denne kode. 240 00:10:05,600 --> 00:10:09,160 Og lad mig foreslå, at dette, ja, er dårlig. 241 00:10:09,160 --> 00:10:15,990 Men hvis jeg i stedet tilføje nogle asterisker og stjerner, kan jeg i stedet vende denne 242 00:10:15,990 --> 00:10:18,670 funktion i en, der er faktisk i drift. 243 00:10:18,670 --> 00:10:25,020 >> Så lad mig gå tilbage her og indrømme at sige asterisker er altid vanskeligt, 244 00:10:25,020 --> 00:10:26,170 så jeg vil sige stjerner. 245 00:10:26,170 --> 00:10:27,660 Jeg vil bare Fess op til. 246 00:10:27,660 --> 00:10:28,190 Ok. 247 00:10:28,190 --> 00:10:30,190 Og nu, hvad skal jeg at gøre i stedet? 248 00:10:30,190 --> 00:10:34,130 >> Så først og fremmest, vil jeg specificere at i stedet for at passere en int i 249 00:10:34,130 --> 00:10:37,980 swap-funktion, jeg er i stedet for at gå at sige int stjerne. 250 00:10:37,980 --> 00:10:39,170 Nu, hvad stjernen indikerer? 251 00:10:39,170 --> 00:10:41,970 Dette er, at begrebet pointer, Binky, den claymation karakter, var 252 00:10:41,970 --> 00:10:43,465 henvise til et øjeblik siden. 253 00:10:43,465 --> 00:10:47,610 >> Så hvis vi siger int stjerne, betydningen af det nu er, at en ikke vil være 254 00:10:47,610 --> 00:10:49,110 bestået ved sin værdi. 255 00:10:49,110 --> 00:10:50,350 Det er ikke til at blive kopieret i. 256 00:10:50,350 --> 00:10:54,700 Snarere, adressen på a er kommer til at være bestået i. 257 00:10:54,700 --> 00:10:57,840 >> Så minde om, at indersiden af ​​din computer er en hel bunke af hukommelse, ellers 258 00:10:57,840 --> 00:10:58,760 kendt som RAM. 259 00:10:58,760 --> 00:11:00,520 Og det RAM er bare en hel masse bytes. 260 00:11:00,520 --> 00:11:03,320 Så hvis din Mac eller din PC har to gigabyte, har du 2 261 00:11:03,320 --> 00:11:05,760 milliard bytes hukommelse. 262 00:11:05,760 --> 00:11:08,440 >> Lad os nu bare antage, at bare at holde tingene pæn og velordnet, vi 263 00:11:08,440 --> 00:11:09,450 tildele en adresse - 264 00:11:09,450 --> 00:11:10,170 et tal - 265 00:11:10,170 --> 00:11:12,270 til alle byte af RAM i din computer. 266 00:11:12,270 --> 00:11:15,410 Den allerførste byte af disse 2 milliarder er ved tallet nul. 267 00:11:15,410 --> 00:11:18,572 Det næste er byte nummer et, nummer to, hele vejen på op dot dot 268 00:11:18,572 --> 00:11:20,530 dot, til 2 mia groft. 269 00:11:20,530 --> 00:11:23,640 >> Så du kan antallet af bytes af hukommelse i din computer. 270 00:11:23,640 --> 00:11:26,460 Så lad os antage, at det er, hvad vi mener med en adresse. 271 00:11:26,460 --> 00:11:31,360 Så når jeg ser int stjerne a, hvad der foregår der skal videregives i swap nu er det 272 00:11:31,360 --> 00:11:32,830 adresse på. 273 00:11:32,830 --> 00:11:37,150 Ikke dens værdi, men uanset postale adresse er, så at sige - 274 00:11:37,150 --> 00:11:38,810 dens placering i RAM. 275 00:11:38,810 --> 00:11:41,250 >> Og tilsvarende for b, vil jeg at sige det samme. 276 00:11:41,250 --> 00:11:42,720 Int, stjerne, b.. 277 00:11:42,720 --> 00:11:46,350 Som en sidebemærkning teknisk stjernen kunne gå andre steder. 278 00:11:46,350 --> 00:11:50,140 Men vi vil standardisere på stjernen bliver lige ved siden af ​​datatype. 279 00:11:50,140 --> 00:11:54,080 >> Så swap signatur betyder nu, giv mig adressen på en int, og kald 280 00:11:54,080 --> 00:11:55,400 pågældende adresse a. 281 00:11:55,400 --> 00:11:58,690 Og giv mig en anden adresse for et int og kalder denne adresse b.. 282 00:11:58,690 --> 00:12:01,120 >> Men nu er min kode her har til at ændre. 283 00:12:01,120 --> 00:12:03,470 Fordi hvis jeg erklærer int temp - 284 00:12:03,470 --> 00:12:05,580 som stadig er af typen int - 285 00:12:05,580 --> 00:12:08,700 men jeg gemme i det, hvilken slags værdi? 286 00:12:08,700 --> 00:12:12,870 For at være klar, jeg sætte en a med koden som skrevet lige nu? 287 00:12:12,870 --> 00:12:14,360 >> Jeg sætte placering i en. 288 00:12:14,360 --> 00:12:16,500 Men jeg er ligeglad om placering nu, right? 289 00:12:16,500 --> 00:12:21,940 Temp eksisterer bare Jess 'tredje cup eksisterede, til hvilket formål? 290 00:12:21,940 --> 00:12:23,090 For at gemme en værdi. 291 00:12:23,090 --> 00:12:24,830 Mælk eller appelsinjuice. 292 00:12:24,830 --> 00:12:28,520 Ikke til rent faktisk at gemme adressen på enten af ​​disse ting, der føles 293 00:12:28,520 --> 00:12:31,200 lidt meningsløse i denne virkelige verdens sammenhæng alligevel. 294 00:12:31,200 --> 00:12:34,990 >> Så virkelig, hvad jeg ønsker at sætte i temp er ikke adressen på en, men 295 00:12:34,990 --> 00:12:36,180 indholdet af en. 296 00:12:36,180 --> 00:12:41,930 Så hvis en er en række ligesom 123, dette er 123. byte hukommelse, som en retfærdig 297 00:12:41,930 --> 00:12:45,090 sker for at være besætter, at værdien i en sker for at være besat. 298 00:12:45,090 --> 00:12:49,040 >> Hvis jeg ønsker at gå til denne adresse, Jeg behøver at sige stjerne en. 299 00:12:49,040 --> 00:12:52,610 Tilsvarende, hvis jeg skulle ændre, hvad der er på adressen a, jeg ændre 300 00:12:52,610 --> 00:12:53,570 dette for at starte en. 301 00:12:53,570 --> 00:12:58,185 Hvis jeg ønsker at gemme i, hvad der er på placering en med hvad der er på det sted 302 00:12:58,185 --> 00:13:02,180 på B,. stjernede b stjerne 303 00:13:02,180 --> 00:13:05,340 >> Så kort, selvom det ikke er helt synker i endnu - og jeg ville ikke forvente 304 00:13:05,340 --> 00:13:06,560 at det ville så hurtigt - 305 00:13:06,560 --> 00:13:11,100 indse, at alt hvad jeg gør, er at prefixing disse stjerner på mine variabler, 306 00:13:11,100 --> 00:13:13,350 talemåde ikke fat i værdier. 307 00:13:13,350 --> 00:13:14,520 Du må ikke ændre værdierne. 308 00:13:14,520 --> 00:13:17,600 Men snarere, gå til disse adresser og få værdi. 309 00:13:17,600 --> 00:13:21,430 Gå til denne adresse og forandring den værdi der. 310 00:13:21,430 --> 00:13:25,500 >> Så lad mig rulle tilbage op til toppen, bare for at fastsætte denne linje her, for at 311 00:13:25,500 --> 00:13:27,690 ændre prototypen at matche. 312 00:13:27,690 --> 00:13:30,280 Men jeg nu nødt til at gøre en anden ting. 313 00:13:30,280 --> 00:13:35,500 Intuitivt hvis jeg har skiftet de typer af argumenter, der swap forventer, 314 00:13:35,500 --> 00:13:37,245 hvad skal jeg ændre i min kode? 315 00:13:37,245 --> 00:13:39,750 316 00:13:39,750 --> 00:13:40,840 >> Når jeg kalder swap. 317 00:13:40,840 --> 00:13:43,340 Fordi lige nu, hvad er Jeg passerer at bytte endnu? 318 00:13:43,340 --> 00:13:47,450 Værdien x og værdien af ​​y, eller mælk og appelsinsaft. 319 00:13:47,450 --> 00:13:48,510 Men jeg ønsker ikke at gøre det. 320 00:13:48,510 --> 00:13:51,060 Jeg stedet vil passere, hvad? 321 00:13:51,060 --> 00:13:53,050 Placeringen af ​​x og placeringen af ​​y. 322 00:13:53,050 --> 00:13:55,300 Hvad er deres postadresser, så at sige. 323 00:13:55,300 --> 00:13:57,600 >> Så for at gøre det, er der et og-tegn. 324 00:13:57,600 --> 00:13:59,260 Ampersand slags lyder som adresse. 325 00:13:59,260 --> 00:14:03,240 så n, tegnet, adressen af x, og adressen på y. 326 00:14:03,240 --> 00:14:06,790 Så det er bevidst, at vi bruger ampersands når du kalder funktionen, 327 00:14:06,790 --> 00:14:10,230 og stjerner, når erklære, og når gennemførelse af funktionen. 328 00:14:10,230 --> 00:14:14,220 >> Og tænk bare på tegnet som adresse på brugeren, og stjerne som 329 00:14:14,220 --> 00:14:15,490 derned operatør - 330 00:14:15,490 --> 00:14:18,640 eller, mere korrekt, dereference operatør. 331 00:14:18,640 --> 00:14:23,480 Så det er en hel masse ord bare for at sige, at nu, forhåbentlig er swap går 332 00:14:23,480 --> 00:14:24,440 at være korrekt. 333 00:14:24,440 --> 00:14:26,550 >> Lad mig gå videre og gøre - 334 00:14:26,550 --> 00:14:30,940 lad os faktisk omdøbe filen, lest dette program stadig blive kaldt nogen swap. 335 00:14:30,940 --> 00:14:33,240 Jeg hævder, at vi vil kalde det swap.c nu. 336 00:14:33,240 --> 00:14:35,670 Så gør, bytte. 337 00:14:35,670 --> 00:14:37,520 Dot, skråstreg, bytte. 338 00:14:37,520 --> 00:14:40,210 >> Og nu ja, x er 1, y er 2.. 339 00:14:40,210 --> 00:14:44,040 Og derefter, x er 2, y er én. 340 00:14:44,040 --> 00:14:46,500 Jamen så lad os se om vi ikke kan gøre dette til en lidt forskelligt, hvad er 341 00:14:46,500 --> 00:14:47,180 foregår her. 342 00:14:47,180 --> 00:14:51,250 Først, lad mig zoome ind på vores tegning skærm her. 343 00:14:51,250 --> 00:14:54,160 Og lad mig foreslå et øjeblik - og når jeg trækker her, vil blive spejlet 344 00:14:54,160 --> 00:14:58,660 deroppe nu - lad mig foreslå, at her er en hel bunke af hukommelse eller 345 00:14:58,660 --> 00:15:00,540 RAM, inde i min computer. 346 00:15:00,540 --> 00:15:04,140 >> Og det vil være bid nummer, lad os sige, 1.. 347 00:15:04,140 --> 00:15:05,720 Dette vil være byte nummer 2. 348 00:15:05,720 --> 00:15:08,220 Og jeg vil gøre en hel masse mere, og derefter en flok dot dot prikker 349 00:15:08,220 --> 00:15:10,880 indikerer, at der er 2 milliarder af disse ting. 350 00:15:10,880 --> 00:15:13,520 4, 5, og så videre. 351 00:15:13,520 --> 00:15:17,055 >> Så er der de første fem bytes af min computers hukommelse. 352 00:15:17,055 --> 00:15:17,560 Okay? 353 00:15:17,560 --> 00:15:19,060 Meget få af 2 mia. 354 00:15:19,060 --> 00:15:21,120 Men nu vil jeg foreslå følgende. 355 00:15:21,120 --> 00:15:27,490 Jeg har tænkt mig at foreslå, at x kommer til at gemme nummeret 1, og y går 356 00:15:27,490 --> 00:15:29,690 at gemme nummeret 2.. 357 00:15:29,690 --> 00:15:35,000 Og lad mig gå videre nu, og repræsenterer disse værdier som følger. 358 00:15:35,000 --> 00:15:41,510 >> Lad os gøre det som følger. 359 00:15:41,510 --> 00:15:42,870 Giv mig bare et sekund. 360 00:15:42,870 --> 00:15:44,150 Et sekund. 361 00:15:44,150 --> 00:15:45,680 OK. 362 00:15:45,680 --> 00:15:47,560 Jeg ønsker at gøre dette til en lille - 363 00:15:47,560 --> 00:15:50,440 lad os gøre det igen. 364 00:15:50,440 --> 00:15:53,250 Ellers vil jeg og bruge samme numre, utilsigtet, 365 00:15:53,250 --> 00:15:54,230 flere gange. 366 00:15:54,230 --> 00:15:57,320 >> Så bare så vi har forskellige numre at tale om, så lad os kalde denne byte 367 00:15:57,320 --> 00:16:03,391 nummer 123, 124, 125, 126, og dot dot dot. 368 00:16:03,391 --> 00:16:08,400 Og lad mig hævder nu, at jeg har tænkt mig at sætte værdien 1 her, og værdien 2 369 00:16:08,400 --> 00:16:11,990 her, ellers kendt som x og y. 370 00:16:11,990 --> 00:16:15,300 Så er det bare så sker det, at dette er x, dette er y. 371 00:16:15,300 --> 00:16:18,180 >> Og blot ved nogle tilfældige chance, de computer, operativsystemet, 372 00:16:18,180 --> 00:16:21,890 sket at sætte x ved placering nummer 123. 373 00:16:21,890 --> 00:16:25,590 Og y endte på placering 124 - 374 00:16:25,590 --> 00:16:26,330 damn it. 375 00:16:26,330 --> 00:16:28,700 Jeg skulle have fastsat dette. 376 00:16:28,700 --> 00:16:34,040 Åh mand, jeg virkelig ønsker at gøre dette? 377 00:16:34,040 --> 00:16:37,340 Ja, jeg ønsker at løse dette og b. egentlig om denne dag. 378 00:16:37,340 --> 00:16:39,950 Beklager, ny på dette. 379 00:16:39,950 --> 00:16:45,020 >> 127, 131, og jeg ønskede ikke at være denne kompleks, men hvorfor gjorde jeg ændre 380 00:16:45,020 --> 00:16:46,340 tal der? 381 00:16:46,340 --> 00:16:48,360 Fordi jeg ønsker ints til faktisk være fire bytes. 382 00:16:48,360 --> 00:16:49,810 Så lad os være super anal om dette. 383 00:16:49,810 --> 00:16:53,800 Så hvis 1 sker for at blive behandlet 123, er 2 vil være på adresse 384 00:16:53,800 --> 00:16:55,730 127, fordi det er kun 4 byes væk. 385 00:16:55,730 --> 00:16:56,210 Det er alt. 386 00:16:56,210 --> 00:16:58,640 Og vi vil glemme alt om alle de andre adresser i verden. 387 00:16:58,640 --> 00:17:03,320 >> Så x er ved stedet 123, y er på placering 127.. 388 00:17:03,320 --> 00:17:05,770 Og nu, hvad gør jeg faktisk ønsker at gøre? 389 00:17:05,770 --> 00:17:10,099 Når jeg kalder swap nu, hvad er faktisk foregår? 390 00:17:10,099 --> 00:17:14,920 Tja, når jeg kalder swap, jeg passerer adressen af ​​x og adressen på y. 391 00:17:14,920 --> 00:17:18,540 Så for eksempel, hvis disse to stykker papir nu repræsenterer to 392 00:17:18,540 --> 00:17:23,510 argumenter a og b til at bytte, hvad er jeg vil skrive på den første af disse, 393 00:17:23,510 --> 00:17:27,720 som jeg har tænkt mig at kalde kalder en? 394 00:17:27,720 --> 00:17:30,610 >> Præcis, 123.. 395 00:17:30,610 --> 00:17:31,905 Så dette jeg hævder er en. 396 00:17:31,905 --> 00:17:32,955 Dette er parameteren en. 397 00:17:32,955 --> 00:17:35,856 Jeg sætte adressen på x derinde. 398 00:17:35,856 --> 00:17:38,152 >> Hvad er det? 399 00:17:38,152 --> 00:17:40,890 >> Hvad er det? 400 00:17:40,890 --> 00:17:41,190 >> Nej, nej. 401 00:17:41,190 --> 00:17:41,720 Det er OK. 402 00:17:41,720 --> 00:17:42,570 Stadig god, stadig god. 403 00:17:42,570 --> 00:17:43,530 Så dette er en. 404 00:17:43,530 --> 00:17:46,240 Og nu på det andet stykke papir, dette vil være b og hvad er jeg 405 00:17:46,240 --> 00:17:49,010 kommer til at skrive på dette stykke papir? 406 00:17:49,010 --> 00:17:50,080 127.. 407 00:17:50,080 --> 00:17:53,720 >> Så det eneste, der er ændret siden vores tidligere fortæller i denne historie er, 408 00:17:53,720 --> 00:17:58,590 snarere end bogstaveligt 1 og 2, er jeg vil passere i 123 og 127. 409 00:17:58,590 --> 00:18:02,130 Og jeg vil nu sætte disse ind af denne boks,? okay 410 00:18:02,130 --> 00:18:04,640 Så sorte boks udgør nu swap-funktion. 411 00:18:04,640 --> 00:18:07,230 >> I mellemtiden, lad os nu få nogen gennemføre swap-funktion. 412 00:18:07,230 --> 00:18:09,090 Ville nogen heroppe gerne frivilligt? 413 00:18:09,090 --> 00:18:09,560 Kom op. 414 00:18:09,560 --> 00:18:11,080 Hvad er dit navn? 415 00:18:11,080 --> 00:18:11,460 Charlie. 416 00:18:11,460 --> 00:18:12,080 Okay, Charlie. 417 00:18:12,080 --> 00:18:14,810 Kom op. 418 00:18:14,810 --> 00:18:17,310 >> Så Charlie kommer til at spille rolle i vores sorte boks. 419 00:18:17,310 --> 00:18:21,460 Og Charlie, hvad jeg vil gerne have dig til at gøre nu gennemføre swap på en sådan måde 420 00:18:21,460 --> 00:18:25,320 at i betragtning af disse to adresser, du var faktisk kommer 421 00:18:25,320 --> 00:18:26,330 at ændre værdierne. 422 00:18:26,330 --> 00:18:28,290 Og jeg vil hviske i øret hvordan du kører TV her. 423 00:18:28,290 --> 00:18:29,930 >> Så gå videre, og du er den sorte boks. 424 00:18:29,930 --> 00:18:30,920 Nå derinde. 425 00:18:30,920 --> 00:18:34,054 Hvilke værdier kan du se en, og hvilke værdier du se b? 426 00:18:34,054 --> 00:18:36,740 >> CHARLIE: a er 123 og b er 127.. 427 00:18:36,740 --> 00:18:37,530 >> DAVID MALAN: OK, nøjagtigt. 428 00:18:37,530 --> 00:18:38,940 Nu pause der for bare et øjeblik. 429 00:18:38,940 --> 00:18:41,680 Den første ting du skal gøre nu, i henhold til koden - hvilket 430 00:18:41,680 --> 00:18:43,220 Jeg vil nu trække op på skærmen - 431 00:18:43,220 --> 00:18:46,750 vil være at afsætte lidt smule hukommelse kaldet temp. 432 00:18:46,750 --> 00:18:48,850 Så jeg har tænkt mig at gå videre og give dig, at hukommelsen. 433 00:18:48,850 --> 00:18:52,210 >> Så dette vil være en tredje variabel at du har adgang til 434 00:18:52,210 --> 00:18:54,080 du kaldte temp. 435 00:18:54,080 --> 00:18:57,120 Og hvad vil du skrive på temp stykke papir? 436 00:18:57,120 --> 00:19:02,524 437 00:19:02,524 --> 00:19:03,470 >> CHARLIE: Pointers, right? 438 00:19:03,470 --> 00:19:04,790 >> DAVID MALAN: OK, godt ikke nødvendigvis pointere. 439 00:19:04,790 --> 00:19:07,230 Så den linje kode, som jeg har fremhævet på den højre side, 440 00:19:07,230 --> 00:19:07,900 lad os starte der. 441 00:19:07,900 --> 00:19:08,890 Det siger stjerne a. 442 00:19:08,890 --> 00:19:11,670 Så en i øjeblikket opbevaring det nummer 123. 443 00:19:11,670 --> 00:19:16,660 Og lige intuitivt, hvad gjorde stjerne 123 betyder? 444 00:19:16,660 --> 00:19:21,630 >> Men specifikt, hvis a er 123, stjerne a betyder hvad? 445 00:19:21,630 --> 00:19:22,560 Værdien af ​​en. 446 00:19:22,560 --> 00:19:24,580 Eller mere afslappet, derned. 447 00:19:24,580 --> 00:19:28,620 Så lad mig foreslå, at du holder en i din hånd, gå videre og behandle det 448 00:19:28,620 --> 00:19:29,430 som om det er et kort. 449 00:19:29,430 --> 00:19:32,940 Og gå dig over til computerens hukommelse og finde os, hvad der er 450 00:19:32,940 --> 00:19:36,520 ved placering 123.. 451 00:19:36,520 --> 00:19:37,720 Præcis. 452 00:19:37,720 --> 00:19:41,100 >> Så vi ser på placering 123 er hvad, naturligvis? 453 00:19:41,100 --> 00:19:44,240 OK, så hvad værdien nu er du vil sætte ind temp? 454 00:19:44,240 --> 00:19:44,750 Præcis. 455 00:19:44,750 --> 00:19:45,600 Så gå videre og gøre det. 456 00:19:45,600 --> 00:19:51,280 Og skriv nummer 1 på det stykke af papir, der aktuelt titlen temp. 457 00:19:51,280 --> 00:19:53,540 >> Og nu det næste skridt, at du kommer til at gennemføre 458 00:19:53,540 --> 00:19:54,310 kommer til at være hvad. 459 00:19:54,310 --> 00:19:57,820 Nå, på højre side af næste linje kode er stjernede b. b, for 460 00:19:57,820 --> 00:19:59,260 Selvfølgelig lagrer en adresse. 461 00:19:59,260 --> 00:20:02,270 Der omhandler 127.. 462 00:20:02,270 --> 00:20:06,620 Star B betyder, hvad, henkastet taler? 463 00:20:06,620 --> 00:20:08,700 >> Gå til denne placering. 464 00:20:08,700 --> 00:20:14,988 Så gå videre og finde os, hvad der er ved placering 127.. 465 00:20:14,988 --> 00:20:15,480 OK. 466 00:20:15,480 --> 00:20:19,170 Selvfølgelig, ved stedet 127 er stadig værdien 2. 467 00:20:19,170 --> 00:20:24,060 Så hvad vil du nu butik på hvad er det sted i en? 468 00:20:24,060 --> 00:20:26,860 Så stjerne et middel gå til den placering en. 469 00:20:26,860 --> 00:20:29,770 Hvad er placering en? 470 00:20:29,770 --> 00:20:30,430 >> Præcis. 471 00:20:30,430 --> 00:20:34,190 Så nu, hvis du ønsker at ændre hvad der er på det sted - 472 00:20:34,190 --> 00:20:36,470 Jeg vil gå videre og køre viskelæderet er her. 473 00:20:36,470 --> 00:20:37,760 Og nu sætte det tilbage på børsten. 474 00:20:37,760 --> 00:20:42,190 Hvilket nummer vil du skrive i den tomme kasse nu? 475 00:20:42,190 --> 00:20:42,850 >> Præcis. 476 00:20:42,850 --> 00:20:46,470 Så dette linje kode, for at være klar - lad mig pause hvad Charlie laver og 477 00:20:46,470 --> 00:20:51,730 påpege, hvad han netop gjort, er skrive ind i den boks i placering 123 478 00:20:51,730 --> 00:20:55,150 den værdi, der tidligere var på b.. 479 00:20:55,150 --> 00:20:59,140 Og så har vi nu implementeret faktisk denne anden linje kode. 480 00:20:59,140 --> 00:21:01,920 >> Nu desværre er der stadig en linie tilbage. 481 00:21:01,920 --> 00:21:04,900 Nu hvad der er i temp, bogstaveligt? 482 00:21:04,900 --> 00:21:06,200 Det er naturligvis nummer et. 483 00:21:06,200 --> 00:21:07,020 Det er ikke en adresse. 484 00:21:07,020 --> 00:21:09,380 Det er bare et nummer, en slags en variabel fra uge et. 485 00:21:09,380 --> 00:21:13,520 >> Og nu når du siger stjernede b, der betyder gå til den adresse, b, som er af 486 00:21:13,520 --> 00:21:15,090 kursus her. 487 00:21:15,090 --> 00:21:16,020 Så når du får der - 488 00:21:16,020 --> 00:21:18,320 Jeg vil gå videre og slette hvad der er faktisk der - og hvad er du 489 00:21:18,320 --> 00:21:20,820 vil skrive nu på placering 127.? 490 00:21:20,820 --> 00:21:22,010 >> CHARLIE: Temp, som er én. 491 00:21:22,010 --> 00:21:23,430 >> DAVID MALAN: Temp, som er én. 492 00:21:23,430 --> 00:21:25,670 Og hvad sker der med temp i sidste ende? 493 00:21:25,670 --> 00:21:26,600 Nå, vi ikke rigtig kender. 494 00:21:26,600 --> 00:21:27,420 Vi har ikke rigtig pleje. 495 00:21:27,420 --> 00:21:31,090 Helst vi har implementeret en funktion hidtil, eventuelle lokale variabler, du har 496 00:21:31,090 --> 00:21:31,890 er endog lokalt. 497 00:21:31,890 --> 00:21:33,060 Og de bare forsvinder. 498 00:21:33,060 --> 00:21:35,040 De er regenereret af operativsystemet systemet med tiden. 499 00:21:35,040 --> 00:21:39,800 >> Så det faktum, at temp stadig har værdien 1 er en slags fundamentalt 500 00:21:39,800 --> 00:21:41,150 uinteressant for os. 501 00:21:41,150 --> 00:21:43,100 Okay, så en runde af bifald hvis vi kunne for Charlie. 502 00:21:43,100 --> 00:21:46,400 Meget godt klaret. 503 00:21:46,400 --> 00:21:51,520 >> Okay, så hvad mere gør dette betyder, at vi kan gøre? 504 00:21:51,520 --> 00:21:54,400 Så det viser sig, at vi har været fortæller et par hvide løgne 505 00:21:54,400 --> 00:21:55,540 i temmelig lang tid. 506 00:21:55,540 --> 00:21:59,990 Faktisk viser det sig, at en streng, al den tid, er egentlig ikke en 507 00:21:59,990 --> 00:22:02,190 sekvens af tegn per se. 508 00:22:02,190 --> 00:22:03,980 Den slags er, at intuitivt. 509 00:22:03,980 --> 00:22:08,270 >> Men teknisk set, string er en datatype, som vi erklæret inde i 510 00:22:08,270 --> 00:22:12,170 Den CS50 biblioteket at forenkle verden for de første par uger af klassen. 511 00:22:12,170 --> 00:22:20,130 Hvad en streng virkelig er den adresse af en karakter eller andet sted i RAM. 512 00:22:20,130 --> 00:22:25,530 En streng er virkelig et nummer, som 123 eller 127, der sker for at afgrænse 513 00:22:25,530 --> 00:22:28,420 hvor en streng begynder i computerens hukommelse. 514 00:22:28,420 --> 00:22:31,870 >> Men det betyder ikke repræsenterer streng, per se, selv. 515 00:22:31,870 --> 00:22:33,460 Og vi kan se dette som følger. 516 00:22:33,460 --> 00:22:35,980 Lad mig gå videre og åbne op noget kode, der er blandt 517 00:22:35,980 --> 00:22:38,340 nutidens kildekode eksempler. 518 00:22:38,340 --> 00:22:42,225 Og jeg har tænkt mig at gå videre og åbne op, lad os sige, sammenligne-0.c. 519 00:22:42,225 --> 00:22:44,830 520 00:22:44,830 --> 00:22:48,790 Dette er en fejlbehæftet program, der går skal gennemføres som følger. 521 00:22:48,790 --> 00:22:49,040 >> First. 522 00:22:49,040 --> 00:22:50,420 Jeg har tænkt mig at sige noget. 523 00:22:50,420 --> 00:22:52,660 Så jeg har tænkt mig at gå videre og få en streng fra brugeren 524 00:22:52,660 --> 00:22:53,750 i det næste linje. 525 00:22:53,750 --> 00:22:55,370 Så jeg har tænkt mig at sige det igen. 526 00:22:55,370 --> 00:22:57,540 Så jeg har tænkt mig at få en anden streng fra brugeren. 527 00:22:57,540 --> 00:23:00,390 >> Og varsel, jeg viser en af ​​de strenge i en variabel kaldet s, og 528 00:23:00,390 --> 00:23:03,040 anden af ​​disse strenge i en variabel kaldet t.. 529 00:23:03,040 --> 00:23:07,480 Og nu vil jeg hævde, meget rimeligt, at hvis s er lig lig t, 530 00:23:07,480 --> 00:23:08,940 strengene er de samme. 531 00:23:08,940 --> 00:23:09,970 Du skriver det samme. 532 00:23:09,970 --> 00:23:11,830 Else, strengene er ikke det samme. 533 00:23:11,830 --> 00:23:15,440 >> Efter alt, hvis vi input to ints, to chars, to flåd, to doubler, kan enhver 534 00:23:15,440 --> 00:23:18,400 de datatyper, vi har talt om hidtil at sammenligne dem - 535 00:23:18,400 --> 00:23:22,070 husker vi gjort meget klart et stykke tid siden at du ikke gør dette, fordi en 536 00:23:22,070 --> 00:23:25,840 single lighedstegn er selvfølgelig opgaven operatør. 537 00:23:25,840 --> 00:23:26,820 Så det ville være en fejl. 538 00:23:26,820 --> 00:23:29,260 >> Vi bruger lige lighedstegnet, der faktisk sammenligner 539 00:23:29,260 --> 00:23:31,050 ting for reel ligestilling. 540 00:23:31,050 --> 00:23:32,275 Men jeg hævde dette er buggy. 541 00:23:32,275 --> 00:23:37,400 Hvis jeg gå videre og gøre sammenligne nul, og derefter gøre dot skråstreg sammenligne nul. 542 00:23:37,400 --> 00:23:39,700 Og jeg skriver i, lad os sige, hej. 543 00:23:39,700 --> 00:23:41,590 Og så lad os sige hej igen. 544 00:23:41,590 --> 00:23:46,040 Bogstaveligt talt det samme, computeren krav jeg har skrevet forskellige ting. 545 00:23:46,040 --> 00:23:47,640 >> Nu måske jeg bare skrevet forkert noget. 546 00:23:47,640 --> 00:23:49,910 Jeg vil skrive mit navn denne gang. 547 00:23:49,910 --> 00:23:52,580 Jeg mener, hej. 548 00:23:52,580 --> 00:23:54,770 Hello. 549 00:23:54,770 --> 00:23:57,360 Det er forskelligt hver eneste gang. 550 00:23:57,360 --> 00:23:58,430 >> Tja, hvorfor er det? 551 00:23:58,430 --> 00:24:00,140 Hvad der virkelig foregår under hætten? 552 00:24:00,140 --> 00:24:03,270 Nå, hvad der virkelig foregår under emhætten er den streng, så 553 00:24:03,270 --> 00:24:07,410 Jeg har skrevet i det første gang for eksempel er ordet hej, selvfølgelig. 554 00:24:07,410 --> 00:24:11,660 Men hvis vi repræsentere denne under hætten, minde om, at en 555 00:24:11,660 --> 00:24:13,470 streng er i et array. 556 00:24:13,470 --> 00:24:15,040 Og vi har sagt så meget i fortiden. 557 00:24:15,040 --> 00:24:20,200 >> Så hvis jeg trækker den opstilling som dette, er jeg kommer til at repræsentere noget helt 558 00:24:20,200 --> 00:24:23,030 svarer til, hvad vi gjorde for et øjeblik siden. 559 00:24:23,030 --> 00:24:25,390 Og der er faktisk noget specielt her, også. 560 00:24:25,390 --> 00:24:28,090 Hvad gjorde vi bestemme blev ved i slutningen af ​​hver streng? 561 00:24:28,090 --> 00:24:30,760 Ja, det backslash nul, hvilket er bare den måde at repræsentere, 562 00:24:30,760 --> 00:24:33,610 bogstaveligt, 00000000. 563 00:24:33,610 --> 00:24:35,680 Otte 0 bits i træk. 564 00:24:35,680 --> 00:24:37,610 >> Jeg ved det ikke, helt ærligt, hvad er efter dette. 565 00:24:37,610 --> 00:24:40,090 Det er bare en flok mere RAM inde i min computer. 566 00:24:40,090 --> 00:24:40,970 Men dette er et array. 567 00:24:40,970 --> 00:24:42,260 Vi talte om arrays før. 568 00:24:42,260 --> 00:24:45,010 Og vi typisk tale om arrays som værende placering nul, 569 00:24:45,010 --> 00:24:46,580 derefter en, så to. 570 00:24:46,580 --> 00:24:47,950 Men det er kun for nemheds skyld. 571 00:24:47,950 --> 00:24:49,380 Og det er helt relativ. 572 00:24:49,380 --> 00:24:53,010 >> Når du faktisk får hukommelse fra computeren, er det selvfølgelig noget 573 00:24:53,010 --> 00:24:55,450 2 milliarder nogle mærkelige bytes, potentielt. 574 00:24:55,450 --> 00:24:59,100 Så virkelig under hætten, al denne tid, ja. 575 00:24:59,100 --> 00:25:01,670 Dette kunne meget vel være beslag nul. 576 00:25:01,670 --> 00:25:04,780 Men hvis du graver endnu dybere under hætten, der er virkelig 577 00:25:04,780 --> 00:25:07,000 fat nummer 123. 578 00:25:07,000 --> 00:25:09,150 Dette er adressen 124. 579 00:25:09,150 --> 00:25:11,040 Dette er adressen 125. 580 00:25:11,040 --> 00:25:12,540 >> Og jeg ikke skrue op denne gang. 581 00:25:12,540 --> 00:25:15,840 Disse er nu en byte Bortset hvorfor? 582 00:25:15,840 --> 00:25:17,930 Hvor stor er en char? 583 00:25:17,930 --> 00:25:19,170 En char er blot én byte. 584 00:25:19,170 --> 00:25:20,570 En int er typisk fire bytes. 585 00:25:20,570 --> 00:25:24,850 Så det er derfor, jeg gjorde det 123 127, 131 og så videre. 586 00:25:24,850 --> 00:25:27,560 Nu kan jeg holde math enklere og bare gøre plus 1. 587 00:25:27,560 --> 00:25:30,510 Og det er nu, hvad der virkelig foregår på under hætten. 588 00:25:30,510 --> 00:25:37,760 >> Så når du erklærer noget som dette, string s, det er faktisk - 589 00:25:37,760 --> 00:25:39,170 viser det sig - 590 00:25:39,170 --> 00:25:41,190 char stjerne. 591 00:25:41,190 --> 00:25:44,640 Stjerne, betyder naturligvis adresse, alias pointer. 592 00:25:44,640 --> 00:25:46,200 Så det er adressen på noget. 593 00:25:46,200 --> 00:25:47,510 Hvad er den adressen? 594 00:25:47,510 --> 00:25:47,760 >> Well - 595 00:25:47,760 --> 00:25:51,680 Jeg er den eneste, der kan se meget vigtigt punkt jeg gør, eller tror 596 00:25:51,680 --> 00:25:52,560 Jeg gør. 597 00:25:52,560 --> 00:25:55,270 Så string - 598 00:25:55,270 --> 00:25:57,180 det sørgelige er jeg har en skærm lige der, hvor jeg 599 00:25:57,180 --> 00:25:58,100 kunne have set det. 600 00:25:58,100 --> 00:26:00,990 >> Okay, så string s er, hvad Jeg erklærede tidligere. 601 00:26:00,990 --> 00:26:04,600 Men det viser sig, takket være en lille magi i CS50 bibliotek, alt dette 602 00:26:04,600 --> 00:26:08,780 tidsstreng har bogstaveligt været char stjerne. 603 00:26:08,780 --> 00:26:11,310 Stjernen betyder igen pointer eller adresse. 604 00:26:11,310 --> 00:26:14,180 Det faktum, at det er flankerer Ordet char betyder, at det er den 605 00:26:14,180 --> 00:26:15,970 adresse af en karakter. 606 00:26:15,970 --> 00:26:23,100 >> Så hvis få strengen kaldes, og jeg skriver i H-E-L-L-O foreslå nu, hvad der er at få 607 00:26:23,100 --> 00:26:27,330 streng bogstaveligt været tilbage alle denne gang, selvom vi har snarere 608 00:26:27,330 --> 00:26:29,980 forsimplede verden? 609 00:26:29,980 --> 00:26:33,310 Hvad får strengen faktisk vende tilbage som dens returværdi? 610 00:26:33,310 --> 00:26:35,830 611 00:26:35,830 --> 00:26:38,720 >> 123 i dette tilfælde, for eksempel. 612 00:26:38,720 --> 00:26:42,630 Vi har tidligere sagt, at få strengen blot returnerer en streng, en sekvens af 613 00:26:42,630 --> 00:26:43,300 tegn. 614 00:26:43,300 --> 00:26:44,790 Men det er lidt af en hvid løgn. 615 00:26:44,790 --> 00:26:48,010 Den måde at få strengen virkelig fungerer under hætten er det får en 616 00:26:48,010 --> 00:26:48,930 streng fra brugeren. 617 00:26:48,930 --> 00:26:51,530 Det plops De tegn, han eller hun typer i hukommelsen. 618 00:26:51,530 --> 00:26:54,680 Det sætter en omvendt skråstreg nul i slutningen af disse sekvens af tegn. 619 00:26:54,680 --> 00:26:57,310 >> Men hvad betyder får strengen bogstaveligt tilbage? 620 00:26:57,310 --> 00:27:02,710 Det bogstaveligt returnerer adressen på den allerførste bytes i RAM, 621 00:27:02,710 --> 00:27:04,130 Det bruges til at styrke. 622 00:27:04,130 --> 00:27:07,500 Og det viser sig, at bare ved at returnere en enkelt adresse 623 00:27:07,500 --> 00:27:12,120 første tegn i strengen, der er tilstrækkelig til at finde sin helhed 624 00:27:12,120 --> 00:27:12,630 strengen. 625 00:27:12,630 --> 00:27:16,930 >> Med andre ord, få strengen ikke har at vende tilbage 123 og 124 og 125. 626 00:27:16,930 --> 00:27:19,950 Det behøver ikke at give mig en lang liste over alle de byte, 627 00:27:19,950 --> 00:27:20,740 min streng bruger. 628 00:27:20,740 --> 00:27:22,670 Fordi en, de er alle tilbage til tilbage. 629 00:27:22,670 --> 00:27:28,160 Og to, baseret på den første adresse, jeg kan regne ud, hvor strengen ender. 630 00:27:28,160 --> 00:27:29,910 Hvordan? 631 00:27:29,910 --> 00:27:33,490 >> Den særlige null karakter, bagstreg nul ved udgangen. 632 00:27:33,490 --> 00:27:35,430 Så med andre ord, hvis du passerer rundt - 633 00:27:35,430 --> 00:27:36,530 indersiden af ​​variabler - 634 00:27:36,530 --> 00:27:41,300 adressen på en char, og du påtager dig at der ved udgangen af ​​enhver streng, kan enhver 635 00:27:41,300 --> 00:27:45,040 sekvens af tegn som vi mennesker tænke på strenge, hvis man antager, at 636 00:27:45,040 --> 00:27:48,600 ved afslutningen af ​​en sådan streng er der en omvendt skråstreg nul, er du gyldne. 637 00:27:48,600 --> 00:27:52,430 Fordi du altid kan finde enden af ​​en snor. 638 00:27:52,430 --> 00:27:54,870 >> Nu hvad der virkelig så gå om i dette program? 639 00:27:54,870 --> 00:27:59,990 Hvorfor er dette program, sammenligne-0.c, buggy? 640 00:27:59,990 --> 00:28:01,690 Hvad der faktisk sammenlignes? 641 00:28:01,690 --> 00:28:02,420 Ja? 642 00:28:02,420 --> 00:28:05,000 >> STUDENT: [uhørlig]. 643 00:28:05,000 --> 00:28:05,730 >> DAVID MALAN: Præcis. 644 00:28:05,730 --> 00:28:08,350 Det sammenligne steder af strengene. 645 00:28:08,350 --> 00:28:12,420 Så hvis brugeren har indtastet hej gang, som jeg gjorde, kan hukommelsen ender 646 00:28:12,420 --> 00:28:13,430 ser ud som dette. 647 00:28:13,430 --> 00:28:18,210 Hvis brugeren derefter typer i Hej igen, men ved at kalde få strengen igen, er c 648 00:28:18,210 --> 00:28:21,800 ikke særlig smart, medmindre du underviser det at være klog ved at skrive kode. 649 00:28:21,800 --> 00:28:22,430 >> C - 650 00:28:22,430 --> 00:28:23,860 og computere mere generelt - 651 00:28:23,860 --> 00:28:27,370 hvis du skriver i ordet hej igen, du ved, hvad du vil få. 652 00:28:27,370 --> 00:28:31,480 Du vil bare få en anden matrix hukommelse, som, ja, der sker være 653 00:28:31,480 --> 00:28:35,510 lagring H-E-L-L-O og så videre. 654 00:28:35,510 --> 00:28:38,240 >> Det kommer til at se det samme på os mennesker, men denne adresse 655 00:28:38,240 --> 00:28:39,460 måske ikke være 123. 656 00:28:39,460 --> 00:28:42,470 Det kunne bare så ske, at operativsystem har nogle tilgængelige 657 00:28:42,470 --> 00:28:45,430 plads for eksempel ved placering - 658 00:28:45,430 --> 00:28:49,820 lad os sige noget vilkårligt, som dette er placering 200. 659 00:28:49,820 --> 00:28:51,620 Og det er placering 201.. 660 00:28:51,620 --> 00:28:53,060 Og det er placering 202.. 661 00:28:53,060 --> 00:28:55,730 Vi har ingen idé om, hvor det er vil være i hukommelsen. 662 00:28:55,730 --> 00:28:59,110 >> Men hvad det betyder er, at hvad der er skal oplagres i sidste ende i s? 663 00:28:59,110 --> 00:29:00,750 Det nummer 123. 664 00:29:00,750 --> 00:29:04,860 Hvad kommer til at blive gemt i t, i denne vilkårlige eksempel? 665 00:29:04,860 --> 00:29:06,300 Nummeret 200. 666 00:29:06,300 --> 00:29:11,410 Og alt det betyder så er naturligvis, 123 ikke er lig 200. 667 00:29:11,410 --> 00:29:14,940 Og så dette hvis betingelse aldrig evalueres til sand. 668 00:29:14,940 --> 00:29:18,430 Fordi get streng ved hjælp af forskellige bidder af hukommelsen hver gang. 669 00:29:18,430 --> 00:29:20,360 >> Nu kan vi se det igen i et andet eksempel. 670 00:29:20,360 --> 00:29:23,764 Lad mig gå videre og åbne op copy-0.c. 671 00:29:23,764 --> 00:29:28,770 Jeg hævder, at dette eksempel vil prøv - men undlader - at kopiere to strenge 672 00:29:28,770 --> 00:29:29,910 som følger. 673 00:29:29,910 --> 00:29:31,730 >> Jeg har tænkt mig at sige noget til brugeren. 674 00:29:31,730 --> 00:29:34,490 Jeg derefter gå til at få en snor og kalder det s. 675 00:29:34,490 --> 00:29:36,400 Og nu, jeg gør denne kontrol her. 676 00:29:36,400 --> 00:29:37,990 Vi nævnte dette et stykke tid tilbage. 677 00:29:37,990 --> 00:29:42,490 Men når måske få strengen tilbage null, anden særlig karakter, eller særlige 678 00:29:42,490 --> 00:29:45,050 symbol lad os sige. 679 00:29:45,050 --> 00:29:45,900 Hvis det er ud af hukommelsen. 680 00:29:45,900 --> 00:29:48,970 >> For eksempel, hvis brugeren er virkelig være vanskeligt og typer et afskyeligt 681 00:29:48,970 --> 00:29:51,220 Antallet af tegn på tastatur og hits Enter. 682 00:29:51,220 --> 00:29:54,580 Hvis dette antal tegn kan bare ikke passer i RAM uanset crazy 683 00:29:54,580 --> 00:29:57,820 Derfor godt få strengen måske meget godt returnere null. 684 00:29:57,820 --> 00:30:01,080 >> Eller hvis dit program i sig selv gør en masse andre ting, og der er bare 685 00:30:01,080 --> 00:30:03,790 ikke nok hukommelse til get streng at lykkes, kan det ende 686 00:30:03,790 --> 00:30:05,240 at returnere null. 687 00:30:05,240 --> 00:30:07,160 Men lad os være mere præcise om, hvad dette er. 688 00:30:07,160 --> 00:30:10,280 Hvad er s datatype egentlig? 689 00:30:10,280 --> 00:30:11,610 Char stjerne. 690 00:30:11,610 --> 00:30:14,560 >> Så det viser sig nu, kan vi skrælle bakke lag null. 691 00:30:14,560 --> 00:30:17,500 Slår ud, null er - ja, selvfølgelig et særligt symbol. 692 00:30:17,500 --> 00:30:19,190 Men hvad er det egentlig? 693 00:30:19,190 --> 00:30:25,220 Virkelig, null er bare et symbol, som vi mennesker bruger til at repræsentere nul så godt. 694 00:30:25,220 --> 00:30:29,010 >> Så forfatterne af C og computere mere generelt, besluttede år siden 695 00:30:29,010 --> 00:30:30,010 der, ved du hvad. 696 00:30:30,010 --> 00:30:34,850 Hvorfor vi ikke sikrer, at ingen brugere data er aldrig, aldrig, aldrig 697 00:30:34,850 --> 00:30:36,730 opbevaret ved bye nul? 698 00:30:36,730 --> 00:30:39,610 I virkeligheden, i selv min vilkårlig eksempel før, havde jeg ikke begynde nummereringen 699 00:30:39,610 --> 00:30:40,390 bytes nul. 700 00:30:40,390 --> 00:30:41,540 Jeg startede på en. 701 00:30:41,540 --> 00:30:44,950 Fordi jeg vidste, at mennesker i verden har besluttet at reservere nul 702 00:30:44,950 --> 00:30:47,970 byte i nogens RAM, som noget særligt. 703 00:30:47,970 --> 00:30:52,020 >> Årsagen er, når som helst du ønsker at signalere, at noget er gået galt 704 00:30:52,020 --> 00:30:55,960 med hensyn til adresser, returneres du null - ellers kendt som nul - 705 00:30:55,960 --> 00:30:59,410 og fordi du ved, at der ikke er nogen legit data på adressen nul, klart 706 00:30:59,410 --> 00:31:00,400 det betyder en fejl. 707 00:31:00,400 --> 00:31:04,080 Og det er derfor vi efter sædvane tjek for ugyldige og returnere noget 708 00:31:04,080 --> 00:31:06,260 som en i disse tilfælde. 709 00:31:06,260 --> 00:31:09,300 >> Så hvis vi rulle ned nu, det er bare derefter nogle fejlkontrol, just in case 710 00:31:09,300 --> 00:31:10,610 noget gik galt med [? kaution?] 711 00:31:10,610 --> 00:31:13,470 helt og afslutter programmet ved at returnere tidligt. 712 00:31:13,470 --> 00:31:19,030 Denne linje kunne nu blive omskrevet da dette betyder som hvad? 713 00:31:19,030 --> 00:31:23,155 På venstre side, giver mig en anden pointer til et tegn, og kalder det t. 714 00:31:23,155 --> 00:31:26,935 Hvad skal jeg gemme inde i t, baseret på denne ene linje kode? 715 00:31:26,935 --> 00:31:30,950 716 00:31:30,950 --> 00:31:32,170 >> Jeg gemmer et sted. 717 00:31:32,170 --> 00:31:34,742 Specifikt placering der var i sek. 718 00:31:34,742 --> 00:31:39,000 Så hvis brugeren har indtastet hej, og at første hej sker for at ende op 719 00:31:39,000 --> 00:31:42,567 her, og det nummer 123 er kommer tilbage fra at få 720 00:31:42,567 --> 00:31:43,810 snor og opbevares - 721 00:31:43,810 --> 00:31:44,780 som vi sagde tidligere - 722 00:31:44,780 --> 00:31:45,440 i sek. 723 00:31:45,440 --> 00:31:50,560 >> Når jeg erklærer nu en anden pointer til en char og kalder det t, hvad nummer er 724 00:31:50,560 --> 00:31:53,940 bogstaveligt kommer til at ende i t ifølge historien? 725 00:31:53,940 --> 00:31:55,420 Så 123. 726 00:31:55,420 --> 00:32:00,310 >> Så teknisk nu både s og t peger til den nøjagtige 727 00:32:00,310 --> 00:32:02,410 samme bidder af hukommelsen. 728 00:32:02,410 --> 00:32:06,140 Så mærke til, hvad jeg har tænkt mig at gøre nu for at bevise, at dette program er buggy. 729 00:32:06,140 --> 00:32:08,820 >> Først vil jeg hævde, med en print f, kapitalisering 730 00:32:08,820 --> 00:32:10,080 kopien af ​​strengen. 731 00:32:10,080 --> 00:32:11,660 Så jeg har tænkt mig at gøre lidt fejlkontrol. 732 00:32:11,660 --> 00:32:12,160 Jeg har tænkt mig at sørge for. 733 00:32:12,160 --> 00:32:16,710 Lad os sørge for, at strengen t er mindst større end nul i længden, 734 00:32:16,710 --> 00:32:19,190 så der er nogle tegn der faktisk udnytte. 735 00:32:19,190 --> 00:32:22,840 >> Og så skal du måske husker dette fra tidligere eksempler. 736 00:32:22,840 --> 00:32:25,630 2 øverste - som er i den ctype.h fil. 737 00:32:25,630 --> 00:32:30,800 T bracket nul giver mig nul tegn i strengen t.. 738 00:32:30,800 --> 00:32:34,360 Og 2 øverste i samme værdi, Selvfølgelig konverterer det til store bogstaver. 739 00:32:34,360 --> 00:32:38,230 >> Så intuitivt, det fremhævede linje kode er kapitalisere den første 740 00:32:38,230 --> 00:32:40,250 bogstav i t. 741 00:32:40,250 --> 00:32:44,485 Men det er ikke kapitalisering, intuitivt, det første bogstav i sek. 742 00:32:44,485 --> 00:32:48,130 Men hvis du tænker fremad, hvad er jeg til at se, når jeg kører dette program 743 00:32:48,130 --> 00:32:54,220 og printe både den oprindelige, s, og den såkaldte kopi, t? 744 00:32:54,220 --> 00:32:55,350 >> De er faktisk kommer til at være den samme. 745 00:32:55,350 --> 00:32:56,600 Og hvorfor er de kommer til at være det samme? 746 00:32:56,600 --> 00:32:58,970 747 00:32:58,970 --> 00:33:01,020 De er begge peger på nøjagtig det samme. 748 00:33:01,020 --> 00:33:01,610 Så lad os gøre dette. 749 00:33:01,610 --> 00:33:03,160 >> Gør kopi nul. 750 00:33:03,160 --> 00:33:04,070 Det kompilerer OK. 751 00:33:04,070 --> 00:33:06,500 Lad mig køre kopi nul. 752 00:33:06,500 --> 00:33:10,110 Lad mig skrive noget lignende Hej i små bogstaver og derefter trykke på Enter. 753 00:33:10,110 --> 00:33:16,520 Og det hævder, at både den oprindelige s og kopien rent faktisk er identiske. 754 00:33:16,520 --> 00:33:17,920 >> Så hvad der virkelig skete her? 755 00:33:17,920 --> 00:33:20,100 Lad mig gentegne dette billede bare at fortælle historien på en 756 00:33:20,100 --> 00:33:21,340 lidt anden måde. 757 00:33:21,340 --> 00:33:26,060 Hvad der virkelig foregår under hætte, når jeg erklærer noget lignende 758 00:33:26,060 --> 00:33:30,410 char starte s eller streng s, Jeg får en pegepind - 759 00:33:30,410 --> 00:33:33,090 hvilket sker for at være på fire bytes i CS50 apparat 760 00:33:33,090 --> 00:33:34,410 og i en masse computere. 761 00:33:34,410 --> 00:33:36,008 Og jeg har tænkt mig at kalde denne sek. 762 00:33:36,008 --> 00:33:39,810 Og det har i øjeblikket nogle ukendt værdi. 763 00:33:39,810 --> 00:33:43,900 >> Når du erklærer en variabel, med mindre du selv sætte en værdi der, som 764 00:33:43,900 --> 00:33:44,570 ved, hvad der er der. 765 00:33:44,570 --> 00:33:48,110 Det kunne være nogle tilfældige sekvens af bit fra den foregående udførelse. 766 00:33:48,110 --> 00:33:52,490 Så da jeg efter min linje kode får streng, og derefter gemme afkastet 767 00:33:52,490 --> 00:33:54,800 værdi i s får string eller anden måde - 768 00:33:54,800 --> 00:33:58,520 og vi vil i sidste ende skrælle hvordan får string værker, en eller anden måde allokerer en 769 00:33:58,520 --> 00:34:00,480 array, der formentlig ser lidt ligesom dette. 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 >> Lad os antage, at dette er adressen 123 bare første konsistens. 772 00:34:09,510 --> 00:34:13,000 Så får snor afkast i fremhævede linje der, det returnerer 773 00:34:13,000 --> 00:34:15,000 Antallet vi sagde, 123.. 774 00:34:15,000 --> 00:34:17,420 Så hvad der virkelig går inde i s her? 775 00:34:17,420 --> 00:34:26,590 >> Nå, hvad der virkelig går indersiden af ​​s er 123. 776 00:34:26,590 --> 00:34:29,250 Men helt ærligt, jeg får lidt forvirret af alle disse adresser, 777 00:34:29,250 --> 00:34:30,320 alle disse vilkårlige numre. 778 00:34:30,320 --> 00:34:32,290 123, 124 og 127. 779 00:34:32,290 --> 00:34:34,570 Så lad os faktisk forenkle verden en lille smule. 780 00:34:34,570 --> 00:34:38,800 >> Når vi taler om pointere, helt ærligt, at os mennesker, hvem dælen bekymrer hvor 781 00:34:38,800 --> 00:34:39,870 tingene er i hukommelsen? 782 00:34:39,870 --> 00:34:41,080 Det er helt vilkårlig. 783 00:34:41,080 --> 00:34:43,370 Det kommer til at afhænge af, hvordan meget RAM brugeren har. 784 00:34:43,370 --> 00:34:46,590 Det kommer til at afhænge af, hvornår på dagen du kører programmet, måske, og 785 00:34:46,590 --> 00:34:48,250 hvilken indgang brugeren giver dig. 786 00:34:48,250 --> 00:34:50,060 Vi dvæle ved ubetydelige detaljer. 787 00:34:50,060 --> 00:34:54,230 >> Så lad os abstrakte væk og sige, når du kører en linje kode som dette, 788 00:34:54,230 --> 00:34:57,320 char stjerne s får afkastet Værdien af ​​get streng. 789 00:34:57,320 --> 00:35:02,720 Hvorfor vi ikke i stedet blot tegne, hvad vi holde kalde en pegepind, som om det er 790 00:35:02,720 --> 00:35:04,140 peger på noget? 791 00:35:04,140 --> 00:35:07,000 Så jeg hævder nu, at s op der er en pegepind - 792 00:35:07,000 --> 00:35:08,480 under hætten, det er en adresse. 793 00:35:08,480 --> 00:35:11,330 Men det er bare at pege på den første byte i 794 00:35:11,330 --> 00:35:12,780 streng, der er blevet returneret. 795 00:35:12,780 --> 00:35:16,710 >> Hvis jeg nu tilbage til kode her, hvad der foregår på denne linje? 796 00:35:16,710 --> 00:35:20,020 Tja, i denne fremhævede linje nu Jeg erklære tilsyneladende en anden 797 00:35:20,020 --> 00:35:21,070 variabel kaldet t.. 798 00:35:21,070 --> 00:35:25,700 Men det er også en pointer, så jeg har tænkt mig at tegne den som i teorien, den nøjagtige 799 00:35:25,700 --> 00:35:26,710 samme størrelse kasse. 800 00:35:26,710 --> 00:35:28,160 Og jeg har tænkt mig at kalde det t. 801 00:35:28,160 --> 00:35:33,500 >> Og nu, hvis vi går tilbage til koden igen, når jeg gemmer s inde i t, 802 00:35:33,500 --> 00:35:36,920 hvad er jeg teknisk set sætte indersiden af ​​t? 803 00:35:36,920 --> 00:35:39,350 Nå teknisk dette var nummer 123. 804 00:35:39,350 --> 00:35:42,270 Så jeg virkelig skal skrive det nummer 123 der. 805 00:35:42,270 --> 00:35:43,900 Men lad os tage det højere niveau. 806 00:35:43,900 --> 00:35:48,090 t, hvis det er bare en pointer, intuitivt, er netop. 807 00:35:48,090 --> 00:35:49,800 Det er alt, der er at være gemt derinde. 808 00:35:49,800 --> 00:35:54,970 >> Så nu i de seneste interessante linjer kode, når jeg faktisk gå om 809 00:35:54,970 --> 00:36:00,680 kapitalisere nultegnet i t, hvad der foregår? 810 00:36:00,680 --> 00:36:06,310 Nå, er t beslag zero nu peger til hvilken karakter, formentlig? 811 00:36:06,310 --> 00:36:07,460 >> Det peger på h. 812 00:36:07,460 --> 00:36:08,870 Fordi t bracket zero - 813 00:36:08,870 --> 00:36:12,490 husker, er dette gamle syntaks. t beslag nul betyder bare hvis t er en streng, t 814 00:36:12,490 --> 00:36:15,590 beslag nul betyder at få nul karakter i denne styrke. 815 00:36:15,590 --> 00:36:18,650 Så hvad der virkelig betyder er at gå til dette array - 816 00:36:18,650 --> 00:36:21,520 og ja, dette kan være 123, dette kan være 124. 817 00:36:21,520 --> 00:36:22,790 Men det er alle relativ, huske. 818 00:36:22,790 --> 00:36:25,640 Når vi taler om et array, har vi den fordel at tale om 819 00:36:25,640 --> 00:36:27,000 relative indeks. 820 00:36:27,000 --> 00:36:31,120 >> Og så nu kan vi bare antage at t beslag nul er h. 821 00:36:31,120 --> 00:36:35,090 Så hvis jeg kalder 2 øverste på det, hvad det er virkelig gør, er at kapitalisere 822 00:36:35,090 --> 00:36:38,290 det lille h til store bogstaver H. Men selvfølgelig er det s? 823 00:36:38,290 --> 00:36:41,010 Det fører til den samme darn streng. 824 00:36:41,010 --> 00:36:44,200 >> Så dette er alt, der er foregået i denne kode hidtil. 825 00:36:44,200 --> 00:36:45,960 Så hvad er så konsekvenserne? 826 00:36:45,960 --> 00:36:48,300 Hvordan kan vi løse disse to problemer? 827 00:36:48,300 --> 00:36:50,870 Hvordan kan vi sammenligne med de faktiske strings? 828 00:36:50,870 --> 00:36:53,720 >> Nå intuitivt, hvordan ville du går om at sammenligne to 829 00:36:53,720 --> 00:36:55,090 strenge til reel ligestilling? 830 00:36:55,090 --> 00:36:58,920 831 00:36:58,920 --> 00:37:00,750 >> Hvad betyder det, hvis to strings er lige? 832 00:37:00,750 --> 00:37:04,330 Klart ikke at deres adresser er lig i hukommelsen, fordi det er en lav 833 00:37:04,330 --> 00:37:06,590 niveau gennemførelse detalje. 834 00:37:06,590 --> 00:37:08,360 Alle tegn er de samme. 835 00:37:08,360 --> 00:37:12,810 Så lad mig foreslå og lad mig præsentere i version en af ​​compare.c 836 00:37:12,810 --> 00:37:14,970 her, så sammenligne-1.c. 837 00:37:14,970 --> 00:37:19,590 >> Lad mig foreslå, at vi stadig får en pointer kaldet s, og butik i det 838 00:37:19,590 --> 00:37:20,610 returnere værdien af ​​get streng. 839 00:37:20,610 --> 00:37:21,750 Lad os gøre det samme med t. 840 00:37:21,750 --> 00:37:23,230 Så ingen af ​​koden er anderledes. 841 00:37:23,230 --> 00:37:25,420 Jeg har tænkt mig at tilføje en lille mere fejlkontrol nu. 842 00:37:25,420 --> 00:37:29,390 Så nu, at vi er en slags peeling tilbage dette lag i CS50 af, hvad en streng 843 00:37:29,390 --> 00:37:33,520 egentlig er, vi skal være mere anal om at sikre, at vi ikke misbruger 844 00:37:33,520 --> 00:37:35,330 ugyldige værdier som null. 845 00:37:35,330 --> 00:37:36,440 >> Så jeg bare at kontrollere. 846 00:37:36,440 --> 00:37:41,490 Hvis s ikke gør lige null og t ikke lige null, der betyder, at vi OK. 847 00:37:41,490 --> 00:37:44,460 Få strengen ikke skrue op få en af ​​disse strenge. 848 00:37:44,460 --> 00:37:51,270 Og du kan måske gætte nu, hvad betyder STR CMP formentlig gøre? 849 00:37:51,270 --> 00:37:52,000 String sammenligne. 850 00:37:52,000 --> 00:37:55,470 >> Så hvis du har programmet i java før, dette er ligesom lig metode i 851 00:37:55,470 --> 00:37:56,490 streng klasse. 852 00:37:56,490 --> 00:37:57,890 Men for dem af jer, der ikke har programmeret før, 853 00:37:57,890 --> 00:37:59,320 dette er blot en C-funktion. 854 00:37:59,320 --> 00:38:02,180 Det sker for at komme i en fil kaldet string.h. 855 00:38:02,180 --> 00:38:03,830 Det er, hvor det er erklæret. 856 00:38:03,830 --> 00:38:05,110 >> Og string sammenligne - 857 00:38:05,110 --> 00:38:07,530 Jeg faktisk glemmer dens brug, men pyt det. 858 00:38:07,530 --> 00:38:10,470 Husk på, at vi kan gøre mand, rør sammenligne. 859 00:38:10,470 --> 00:38:12,590 Og det kommer til at opdrage Linux programmører manual. 860 00:38:12,590 --> 00:38:14,060 Og det er helt ærligt, lidt kryptisk. 861 00:38:14,060 --> 00:38:15,270 Men jeg kan se her, at, jep. 862 00:38:15,270 --> 00:38:17,570 Jeg er nødt til at medtage string.h. 863 00:38:17,570 --> 00:38:20,590 >> Og det står her under beskrivelsen "den string Sammenligningsfunktion sammenligner 864 00:38:20,590 --> 00:38:24,560 De to strenge S1 og S2. "og S1 og S2 er tilsyneladende to 865 00:38:24,560 --> 00:38:26,120 argumenter gik i. 866 00:38:26,120 --> 00:38:28,650 Jeg kan ikke rigtig huske, hvad const er, men nu mærke til - 867 00:38:28,650 --> 00:38:31,480 og du har måske set det allerede, når har du bruge mand sider, hvis du 868 00:38:31,480 --> 00:38:32,390 har det hele - 869 00:38:32,390 --> 00:38:36,220 at char stjerne er bare synonym med snor. 870 00:38:36,220 --> 00:38:40,440 >> Så det sammenligner de to strygere, S1 og S2, og det returnerer et heltal mindre 871 00:38:40,440 --> 00:38:44,930 end eller lig med eller større end nul hvis S1 er fundet, henholdsvis at være 872 00:38:44,930 --> 00:38:47,450 mindre end eller matche eller være større end S2. 873 00:38:47,450 --> 00:38:51,220 Det er bare en meget kompleks måde at sige denne streng sammenligne afkastet 874 00:38:51,220 --> 00:38:55,760 nul, hvis to strenge er intuitivt identiske, tegn for 875 00:38:55,760 --> 00:38:57,120 tegn for tegn. 876 00:38:57,120 --> 00:38:59,970 >> Den returnerer et negativt tal, hvis s, alfabetisk, formodes 877 00:38:59,970 --> 00:39:01,010 at komme før t. 878 00:39:01,010 --> 00:39:05,300 Eller returnerer et positivt tal, hvis s formodes at komme efter t 879 00:39:05,300 --> 00:39:06,170 alfabetisk. 880 00:39:06,170 --> 00:39:08,360 Så med denne enkle funktion, kunne dig, for eksempel, sortere en 881 00:39:08,360 --> 00:39:09,770 hel masse ord? 882 00:39:09,770 --> 00:39:13,984 >> Så i denne nye version, vil jeg til at gå videre og gøre compare1. 883 00:39:13,984 --> 00:39:15,750 Dot skråstreg sammenligne en. 884 00:39:15,750 --> 00:39:18,030 Jeg skrive i Hej i alle små bogstaver. 885 00:39:18,030 --> 00:39:20,300 Jeg har tænkt mig at skrive i hej i små bogstaver igen. 886 00:39:20,300 --> 00:39:23,340 Og heldigvis nu indser Jeg har skrevet det samme. 887 00:39:23,340 --> 00:39:27,520 >> I mellemtiden, hvis jeg skriver i Hej i lavere sag og HELLO i versaler og 888 00:39:27,520 --> 00:39:29,710 sammenligne dem, jeg har skrevet forskellige ting. 889 00:39:29,710 --> 00:39:32,530 Fordi ikke kun er adresserne forskellige, men vi sammenligner 890 00:39:32,530 --> 00:39:35,350 forskellige karakterer igen og igen. 891 00:39:35,350 --> 00:39:37,320 >> Jamen så lad os gå og løse en andet problem nu. 892 00:39:37,320 --> 00:39:41,590 Lad mig åbne op udgave af en af eksemplar, som nu omhandler 893 00:39:41,590 --> 00:39:42,900 dette spørgsmål som følger. 894 00:39:42,900 --> 00:39:45,650 Og denne kommer til at se lidt mere kompliceret. 895 00:39:45,650 --> 00:39:49,320 Men hvis du tænker over, hvad problem, vi brug for at løse, forhåbentlig vil dette være 896 00:39:49,320 --> 00:39:51,870 klart på bare et øjeblik nu. 897 00:39:51,870 --> 00:39:57,280 >> Så dette første linje, char starte t, i lægmandssprog kunne nogen foreslå 898 00:39:57,280 --> 00:39:59,450 hvad denne linje her betyder? 899 00:39:59,450 --> 00:40:01,050 Char stjerne t, hvad er, at gøre? 900 00:40:01,050 --> 00:40:06,660 901 00:40:06,660 --> 00:40:07,210 >> Godt. 902 00:40:07,210 --> 00:40:09,500 Opret en pointer til nogle stedet i hukommelsen. 903 00:40:09,500 --> 00:40:10,930 Og lad mig finpudse det en lille smule. 904 00:40:10,930 --> 00:40:17,180 Erklær en variabel, der gemmer adresse nogle char i hukommelsen, bare 905 00:40:17,180 --> 00:40:18,480 at være lidt mere korrekt. 906 00:40:18,480 --> 00:40:21,210 >> OK, så nu er på højre side, har jeg aldrig set en af ​​disse funktioner 907 00:40:21,210 --> 00:40:22,660 før, malloc. 908 00:40:22,660 --> 00:40:26,980 Men hvad kunne det betyde? 909 00:40:26,980 --> 00:40:28,050 Tildeling af hukommelse. 910 00:40:28,050 --> 00:40:29,410 Allokering af hukommelse. 911 00:40:29,410 --> 00:40:33,050 >> Så det viser sig, indtil nu, har vi har ikke rigtig haft en effektiv måde 912 00:40:33,050 --> 00:40:36,210 beder operativsystemet, give mig nogle hukommelse. 913 00:40:36,210 --> 00:40:39,980 Snarere har vi nu en funktion kaldet malloc, der gør netop dette. 914 00:40:39,980 --> 00:40:42,960 Selv om dette er lidt af en distraktion lige nu, bemærke, at i 915 00:40:42,960 --> 00:40:46,200 mellem de to parenteser er bare at være et tal. 916 00:40:46,200 --> 00:40:48,510 Hvor jeg har indtastet den pågældende mærker kan være et tal. 917 00:40:48,510 --> 00:40:51,020 >> Og det tal betyder, giv mig 10 bytes. 918 00:40:51,020 --> 00:40:52,320 Giv mig 20 byte. 919 00:40:52,320 --> 00:40:53,820 Giv mig 100 bytes. 920 00:40:53,820 --> 00:40:56,500 Og malloc vil gøre sit bedste for at bede operativsystem - 921 00:40:56,500 --> 00:40:57,630 Linux, i dette tilfælde - 922 00:40:57,630 --> 00:40:59,630 hey, er deres 100 bytes RAM til rådighed? 923 00:40:59,630 --> 00:41:04,320 Hvis ja, returnere disse bytes til mig ved returnering hvis adresse af 924 00:41:04,320 --> 00:41:06,610 disse bytes, måske? 925 00:41:06,610 --> 00:41:07,610 Den allerførste. 926 00:41:07,610 --> 00:41:10,460 >> Så her også - og det er fremherskende i C, når du er 927 00:41:10,460 --> 00:41:11,680 beskæftiger sig med adresser? 928 00:41:11,680 --> 00:41:15,830 Du er næsten altid beskæftiger sig med første sådanne adresse, uanset hvor stor 929 00:41:15,830 --> 00:41:19,490 en luns af hukommelse, du bliver afleveres tilbage, så at sige. 930 00:41:19,490 --> 00:41:20,880 >> Så lad os dykke i her. 931 00:41:20,880 --> 00:41:23,940 Jeg forsøger at afsætte hvordan mange bytes, helt præcist? 932 00:41:23,940 --> 00:41:24,080 Well. 933 00:41:24,080 --> 00:41:26,090 String længde s - lad os gøre et konkret eksempel. 934 00:41:26,090 --> 00:41:30,700 Hvis s er hej, H-E-L-L-O, hvad er streng længde s, naturligvis? 935 00:41:30,700 --> 00:41:32,010 Så det er fem. 936 00:41:32,010 --> 00:41:34,590 Men jeg gør et plus 1 på det, hvorfor? 937 00:41:34,590 --> 00:41:37,700 Hvorfor skal jeg have seks bytes i stedet for fem? 938 00:41:37,700 --> 00:41:38,790 Den null-tegn. 939 00:41:38,790 --> 00:41:41,210 >> Jeg ønsker ikke at forlade off denne særlige null-tegn. 940 00:41:41,210 --> 00:41:45,160 Fordi hvis jeg lave en kopi af Hej og bare gøre H-E-L-L-O, men jeg kan ikke sætte 941 00:41:45,160 --> 00:41:50,160 at specialtegn, computeren måske ikke har, ved en tilfældighed, en omvendt skråstreg 942 00:41:50,160 --> 00:41:51,730 nul der for mig. 943 00:41:51,730 --> 00:41:55,570 Og så hvis jeg forsøger at finde ud af Længden af ​​kopien, kunne jeg tror, ​​at 944 00:41:55,570 --> 00:41:59,360 Det er 20 tegn lang, eller en million tegn, hvis jeg aldrig bare ske 945 00:41:59,360 --> 00:42:01,050 at ramme en backslash nul. 946 00:42:01,050 --> 00:42:05,780 >> Så vi har brug seks bytes til at gemme H-E-L-L-O, backslash nul. 947 00:42:05,780 --> 00:42:07,870 Og så er det bare at være super anal. 948 00:42:07,870 --> 00:42:10,700 Antag, at jeg glemmer, hvad størrelsen af ​​en char er. 949 00:42:10,700 --> 00:42:12,020 Vi holder siger det er én byte. 950 00:42:12,020 --> 00:42:12,860 Og det plejer at være. 951 00:42:12,860 --> 00:42:15,425 I teorien kunne det være noget anderledes, på en anden Mac eller en 952 00:42:15,425 --> 00:42:16,250 anden pc. 953 00:42:16,250 --> 00:42:19,650 >> Så det viser sig der er denne operatør kaldet sizeof at hvis du passerer det 954 00:42:19,650 --> 00:42:22,680 navnet på en datatype - ligesom char eller int eller float - 955 00:42:22,680 --> 00:42:26,930 det vil fortælle dig, dynamisk, hvor mange bytes en char tager op på dette 956 00:42:26,930 --> 00:42:28,090 særlig computer. 957 00:42:28,090 --> 00:42:31,360 >> Så dette er faktisk bare ligesom at sige gange 1 eller 958 00:42:31,360 --> 00:42:32,440 gange slet ingenting. 959 00:42:32,440 --> 00:42:36,340 Men jeg gør det bare for at være super anal, der bare i tilfælde af en char adskiller 960 00:42:36,340 --> 00:42:40,610 på din computer versus mine, på denne måde matematik vil altid tjekke. 961 00:42:40,610 --> 00:42:43,720 >> Endelig hernede jeg tjekke for null, som altid er god praksis - igen, 962 00:42:43,720 --> 00:42:44,920 helst vi har med pointere. 963 00:42:44,920 --> 00:42:47,520 Hvis malloc ikke var i stand til at give me seks byes - som er 964 00:42:47,520 --> 00:42:49,210 usandsynlig, men kun i tilfælde - 965 00:42:49,210 --> 00:42:50,730 returnere en med det samme. 966 00:42:50,730 --> 00:42:53,290 Og nu, gå videre og kopiere strengen som følger. 967 00:42:53,290 --> 00:42:57,240 Og det er velkendt syntaks, end i en anden rolle. 968 00:42:57,240 --> 00:43:01,210 >> Jeg har tænkt mig at gå videre og få snoren Længden af ​​s og opbevar det i n.. 969 00:43:01,210 --> 00:43:06,620 Jeg derefter gå til at gentage fra i lig nul til og med n, 970 00:43:06,620 --> 00:43:08,410 større end eller lig med. 971 00:43:08,410 --> 00:43:13,540 Så på hver iteration, satte jeg ed karakter si den i'te 972 00:43:13,540 --> 00:43:15,380 karakter af t. 973 00:43:15,380 --> 00:43:18,190 >> Så hvad der virkelig foregår nedenunder hætten her? 974 00:43:18,190 --> 00:43:22,140 Tja, hvis dette, for eksempel, er s - 975 00:43:22,140 --> 00:43:26,400 og jeg har indtastet ordet H-E-L-L-O og der er en backslash nul. 976 00:43:26,400 --> 00:43:29,020 Og igen, det er s peger her. 977 00:43:29,020 --> 00:43:30,830 Og her nu er t. 978 00:43:30,830 --> 00:43:34,860 >> Og det peger nu en kopi af hukommelse, right? 979 00:43:34,860 --> 00:43:37,340 Malloc har givet mig en hel luns af hukommelse. 980 00:43:37,340 --> 00:43:41,440 Jeg kender ikke oprindeligt, hvad der er i nogen af ​​disse placeringer. 981 00:43:41,440 --> 00:43:44,340 Så jeg har tænkt mig at tænke på disse som en hel masse spørgsmålstegn. 982 00:43:44,340 --> 00:43:50,190 >> Men så snart jeg begynder at looping fra nul på op gennem længden af ​​s, t 983 00:43:50,190 --> 00:43:52,790 beslag nul og t bracket 1 - 984 00:43:52,790 --> 00:43:55,080 og jeg vil sætte dette nu over hovedhøjde - 985 00:43:55,080 --> 00:44:04,190 t beslag nul og s beslag nul betyder at jeg har tænkt mig at kopiere 986 00:44:04,190 --> 00:44:09,875 iterativt t på her, E-L-L-O. Plus, fordi jeg gjorde plus 987 00:44:09,875 --> 00:44:12,370 1, backslash nul. 988 00:44:12,370 --> 00:44:19,060 >> Så nu i tilfælde af sammenligne-1.c, i sidste ende, hvis jeg udskrive 989 00:44:19,060 --> 00:44:24,760 kapitalisering af t, bør vi se, at s er uændret. 990 00:44:24,760 --> 00:44:26,090 Lad mig gå videre nu, og gøre dette. 991 00:44:26,090 --> 00:44:28,630 Så gør Copy1. 992 00:44:28,630 --> 00:44:30,860 Dot slash Kopi1. 993 00:44:30,860 --> 00:44:33,670 Jeg har tænkt mig at skrive i hallo, Enter. 994 00:44:33,670 --> 00:44:37,430 Og nu mærke til, kun kopien er aktiveret. 995 00:44:37,430 --> 00:44:40,890 Fordi jeg virkelig har to bidder af hukommelsen. 996 00:44:40,890 --> 00:44:44,390 >> Desværre, kan du gøre nogle ret dårlige og temmelig farlige ting her. 997 00:44:44,390 --> 00:44:49,290 Lad mig trække et eksempel her nu, der giver os et eksempel på et par 998 00:44:49,290 --> 00:44:51,540 forskellige linjer. 999 00:44:51,540 --> 00:44:56,040 Så bare intuitivt her den første linje kode er int stjerne x, erklære 1000 00:44:56,040 --> 00:44:57,340 en variabel kaldet x. 1001 00:44:57,340 --> 00:44:58,810 Og hvad er datatypen af denne variabel? 1002 00:44:58,810 --> 00:45:01,820 1003 00:45:01,820 --> 00:45:04,290 Hvad er datatypen for denne variabel? 1004 00:45:04,290 --> 00:45:06,980 Det var ikke cliffhanger. 1005 00:45:06,980 --> 00:45:08,350 >> Datatypen er int stjerne. 1006 00:45:08,350 --> 00:45:12,600 Så hvad betyder det? x vil gemme adressen på en int. 1007 00:45:12,600 --> 00:45:13,520 Simpelt er det. 1008 00:45:13,520 --> 00:45:16,220 Y vil gemme adressen på en int. 1009 00:45:16,220 --> 00:45:18,390 Hvad er den tredje linie kode gør der? 1010 00:45:18,390 --> 00:45:21,850 Det fordeling, hvor mange bytes, mest sandsynligt? 1011 00:45:21,850 --> 00:45:22,350 Four. 1012 00:45:22,350 --> 00:45:25,460 På grund af størrelsen af ​​en int er generelt fire, malloc af fire giver 1013 00:45:25,460 --> 00:45:29,950 mig tilbage adressen på en luns af hukommelse, den første hvis byte er 1014 00:45:29,950 --> 00:45:32,110 lagres nu i x. 1015 00:45:32,110 --> 00:45:34,410 >> Nu er vi er ved at flytte lidt hurtigt. 1016 00:45:34,410 --> 00:45:35,760 Stjerne x betyder hvad? 1017 00:45:35,760 --> 00:45:38,480 1018 00:45:38,480 --> 00:45:42,590 Det betyder at gå til denne adresse og sætte hvad nummer der? 1019 00:45:42,590 --> 00:45:43,870 Sæt nummer 42 der. 1020 00:45:43,870 --> 00:45:47,590 Stjerne y betyder at gå til hvad der er på y og sætte nummer 13 der. 1021 00:45:47,590 --> 00:45:48,600 >> Men vent et øjeblik. 1022 00:45:48,600 --> 00:45:51,640 Hvad der er i y i øjeblikket? 1023 00:45:51,640 --> 00:45:54,950 Hvilken adresse er y lagring? 1024 00:45:54,950 --> 00:45:55,770 Vi ved det ikke, vel? 1025 00:45:55,770 --> 00:45:59,230 Vi har aldrig engang bruge opgaven operatør involverer y. 1026 00:45:59,230 --> 00:46:03,370 Så y som angivet på den anden linje i kode er blot nogle skrald værdi, en stor 1027 00:46:03,370 --> 00:46:04,760 spørgsmålstegn så at sige. 1028 00:46:04,760 --> 00:46:07,230 Det kunne pege tilfældigt til noget i hukommelsen, hvilket 1029 00:46:07,230 --> 00:46:08,340 er generelt dårlig. 1030 00:46:08,340 --> 00:46:13,540 >> Så så snart vi ramte denne linje der, stjerne y lig 13, noget dårligt, 1031 00:46:13,540 --> 00:46:17,220 noget meget slemt er omkring at ske for Binky. 1032 00:46:17,220 --> 00:46:25,810 Så lad os se, hvad der kommer til at ende sker for Binky her i dette øjeblik 1033 00:46:25,810 --> 00:46:26,200 eller så se. 1034 00:46:26,200 --> 00:46:26,490 >> [VIDEO AFSPIL] 1035 00:46:26,490 --> 00:46:26,745 >> -Hej, Binky. 1036 00:46:26,745 --> 00:46:27,000 Vågn op. 1037 00:46:27,000 --> 00:46:29,296 Det er tid til pointer sjov. 1038 00:46:29,296 --> 00:46:30,680 >> -Hvad er det? 1039 00:46:30,680 --> 00:46:31,980 Lær om pointers? 1040 00:46:31,980 --> 00:46:34,010 Åh, goodie. 1041 00:46:34,010 --> 00:46:37,220 >> -Nå, for at komme i gang, jeg tror vi er vil få brug for et par pointers. 1042 00:46:37,220 --> 00:46:37,930 >> -OK. 1043 00:46:37,930 --> 00:46:41,650 Denne kode allokerer to pointere der kan pege på heltal. 1044 00:46:41,650 --> 00:46:43,760 >> -OK, godt, jeg ser de to pointere. 1045 00:46:43,760 --> 00:46:45,850 Men de synes ikke at være peger på noget. 1046 00:46:45,850 --> 00:46:46,490 >> -Det er rigtigt. 1047 00:46:46,490 --> 00:46:48,630 Oprindeligt pointers ikke pege på noget. 1048 00:46:48,630 --> 00:46:51,700 De ting, de peger på kaldes pointees, og indstille dem er en 1049 00:46:51,700 --> 00:46:52,850 separat trin. 1050 00:46:52,850 --> 00:46:53,740 >> -Oh, højre, højre. 1051 00:46:53,740 --> 00:46:54,500 Jeg vidste det. 1052 00:46:54,500 --> 00:46:56,270 De pointees er adskilt. 1053 00:46:56,270 --> 00:46:58,553 Så hvordan kan du allokere en pointee? 1054 00:46:58,553 --> 00:46:59,480 >> -OK. 1055 00:46:59,480 --> 00:47:03,707 Nå, denne kode tildeler en ny heltal pointee, og denne del sætter x 1056 00:47:03,707 --> 00:47:05,520 at pege på den. 1057 00:47:05,520 --> 00:47:06,760 >> -Hey, det ser bedre ud. 1058 00:47:06,760 --> 00:47:08,520 Så gør det gøre noget. 1059 00:47:08,520 --> 00:47:09,530 >> -OK. 1060 00:47:09,530 --> 00:47:14,110 Jeg vil dereference markøren x for at gemme nummeret 42 i sin pointee. 1061 00:47:14,110 --> 00:47:17,660 For dette trick, vil jeg brug for min magi tryllestav af dereference. 1062 00:47:17,660 --> 00:47:20,695 >> -Din tryllestav af dereferere? 1063 00:47:20,695 --> 00:47:22,632 Uh, det er fantastisk. 1064 00:47:22,632 --> 00:47:24,620 >> -Det er, hvad koden ser ud. 1065 00:47:24,620 --> 00:47:27,526 Jeg vil bare oprette nummeret, og - 1066 00:47:27,526 --> 00:47:28,250 >> -Hey, se. 1067 00:47:28,250 --> 00:47:29,680 Der det går. 1068 00:47:29,680 --> 00:47:34,520 Så gør en dereference på x følger pilen for at få adgang til dets pointee. 1069 00:47:34,520 --> 00:47:36,690 I dette tilfælde opbevares til 42 derinde. 1070 00:47:36,690 --> 00:47:40,890 Hey, prøv at bruge den til at gemme nummeret 13 gennem den anden pointer, y. 1071 00:47:40,890 --> 00:47:42,125 >> -OK. 1072 00:47:42,125 --> 00:47:46,810 Jeg vil bare gå over her y og får nummer 13 oprettet. 1073 00:47:46,810 --> 00:47:50,890 Og derefter tage staven af dereferere og bare - 1074 00:47:50,890 --> 00:47:52,430 whoa! 1075 00:47:52,430 --> 00:47:53,030 >> -Oh, hej. 1076 00:47:53,030 --> 00:47:54,610 Det fungerede ikke. 1077 00:47:54,610 --> 00:47:58,200 Sig Binky, tror jeg ikke det dereferere y er en god idé, 1078 00:47:58,200 --> 00:48:01,370 fordi oprettelsen af ​​pointee er et separat trin. 1079 00:48:01,370 --> 00:48:03,460 Og jeg tror ikke, vi nogensinde gjorde det. 1080 00:48:03,460 --> 00:48:03,810 >> -Hmm. 1081 00:48:03,810 --> 00:48:05,160 God pointe. 1082 00:48:05,160 --> 00:48:07,410 >> -Ja, vi tildelt markøren y. 1083 00:48:07,410 --> 00:48:10,045 Men vi har aldrig indstille den til pege på en pointee. 1084 00:48:10,045 --> 00:48:10,490 >> -Hmm. 1085 00:48:10,490 --> 00:48:12,170 Meget opmærksomme. 1086 00:48:12,170 --> 00:48:13,790 >> -Hey, du ser godt der, Binky. 1087 00:48:13,790 --> 00:48:16,920 Kan du ordne det, så y point til samme pointee som x? 1088 00:48:16,920 --> 00:48:17,810 >> -Sure. 1089 00:48:17,810 --> 00:48:20,300 Jeg vil bruge min tryllestav af pointer opgave. 1090 00:48:20,300 --> 00:48:22,240 >> -Er det vil være en problem som før? 1091 00:48:22,240 --> 00:48:22,665 >> -Nr. 1092 00:48:22,665 --> 00:48:24,300 Dette betyder ikke røre pointees. 1093 00:48:24,300 --> 00:48:27,880 Det bare ændrer én pointer til at pege til det samme som en anden. 1094 00:48:27,880 --> 00:48:28,970 >> -Åh, jeg ser. 1095 00:48:28,970 --> 00:48:31,730 Nu y peger på det samme sted som x. 1096 00:48:31,730 --> 00:48:32,450 Så vent. 1097 00:48:32,450 --> 00:48:33,490 Nu y er fast. 1098 00:48:33,490 --> 00:48:34,630 Det har en pointee. 1099 00:48:34,630 --> 00:48:36,520 Så du kan prøve staven af dereferere igen 1100 00:48:36,520 --> 00:48:39,200 at sende 13 over. 1101 00:48:39,200 --> 00:48:39,840 >> -OK. 1102 00:48:39,840 --> 00:48:41,570 Her går. 1103 00:48:41,570 --> 00:48:42,870 >> -Hey, se der. 1104 00:48:42,870 --> 00:48:44,320 Nu dereferere værker på y. 1105 00:48:44,320 --> 00:48:47,020 Og fordi pointers deler at én 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 Deling. 1109 00:48:49,670 --> 00:48:50,380 Uanset hvad. 1110 00:48:50,380 --> 00:48:52,290 Så skal vi skifte steder nu? 1111 00:48:52,290 --> 00:48:52,970 >> -Åh, se. 1112 00:48:52,970 --> 00:48:54,150 Vi har ikke mere tid. 1113 00:48:54,150 --> 00:48:55,200 >> -Men - 1114 00:48:55,200 --> 00:48:57,060 >> -Bare husk de tre pointer regler. 1115 00:48:57,060 --> 00:49:00,100 Nummer et, den grundlæggende struktur er, at du har en pointer. 1116 00:49:00,100 --> 00:49:02,170 Og den peger hen til en pointee. 1117 00:49:02,170 --> 00:49:04,160 Men markøren og pointee er adskilt. 1118 00:49:04,160 --> 00:49:06,460 Og almindelig fejl er at oprette en pegepind, men 1119 00:49:06,460 --> 00:49:08,540 glemmer at givet et pointee. 1120 00:49:08,540 --> 00:49:12,460 >> Nummer to, pointer dereference starter ved markøren og følger 1121 00:49:12,460 --> 00:49:14,570 pil for at få adgang sin pointee. 1122 00:49:14,570 --> 00:49:18,640 Som vi alle ved, virker kun, hvis der er en pointee, der kommer tilbage til 1123 00:49:18,640 --> 00:49:19,790 regel nummer et. 1124 00:49:19,790 --> 00:49:23,670 >> Nummer tre, pointer opgave tager én pointer og ændrer det til at pege på 1125 00:49:23,670 --> 00:49:25,850 samme pointee som en anden pointer. 1126 00:49:25,850 --> 00:49:27,840 Så efter opgaven, De to pointere vil 1127 00:49:27,840 --> 00:49:29,430 peger på samme pointee. 1128 00:49:29,430 --> 00:49:31,600 Nogle gange er hedder deling. 1129 00:49:31,600 --> 00:49:33,430 Og det er alt der er til det, virkelig. 1130 00:49:33,430 --> 00:49:33,840 Bye bye nu. 1131 00:49:33,840 --> 00:49:34,300 >> [END VIDEOAFSPILNING] 1132 00:49:34,300 --> 00:49:36,940 >> DAVID MALAN: So mere på pegepinde, mere på Binky næste uge. 1133 00:49:36,940 --> 00:49:38,190 Vi vil se dig på mandag. 1134 00:49:38,190 --> 00:49:42,187