1 00:00:00,000 --> 00:00:11,320 2 00:00:11,320 --> 00:00:13,260 >> DAVID MALAN: Hei, og velkommen tilbake til CS50. 3 00:00:13,260 --> 00:00:14,860 Så dette er slutten av uke fire. 4 00:00:14,860 --> 00:00:16,680 Bare en kunngjøring først. 5 00:00:16,680 --> 00:00:19,600 Så den såkalte femte mandag er kommer opp førstkommende mandag. 6 00:00:19,600 --> 00:00:22,800 Dette er muligheten til å endre fra SAT / unsat til en bokstavkarakter, eller fra 7 00:00:22,800 --> 00:00:24,130 bokstavkarakter SAT / unsat. 8 00:00:24,130 --> 00:00:27,130 Grammatikken, gjør at prosessen krever en signatur, fordi du må fylle 9 00:00:27,130 --> 00:00:28,770 ut en av de rosa add / dråpe former. 10 00:00:28,770 --> 00:00:31,680 >> Fordi teknisk, SAT / unsat versjonen og bokstavkarakter versjon 11 00:00:31,680 --> 00:00:33,320 har forskjellige katalognummer. 12 00:00:33,320 --> 00:00:34,240 Men ingen big deal. 13 00:00:34,240 --> 00:00:36,620 Bare komme opp til meg eller til Rob eller til Lauren på noe punkt. 14 00:00:36,620 --> 00:00:39,550 Eller send oss ​​hvis du ikke har den type papirarbeid må du i dag, og vi 15 00:00:39,550 --> 00:00:43,410 vil være sikker på å hjelpe deg å ta vare på det før mandag. 16 00:00:43,410 --> 00:00:45,780 >> Greit, så i dag - 17 00:00:45,780 --> 00:00:47,630 faktisk, det er litt av et ekko. 18 00:00:47,630 --> 00:00:51,070 Kan vi tone meg ned litt? 19 00:00:51,070 --> 00:00:51,730 OK. 20 00:00:51,730 --> 00:00:54,850 Så i dag introduserer vi et emne kjent som pekere. 21 00:00:54,850 --> 00:00:57,770 Og jeg skal innrømme at dette er en av de mer komplekse temaer som vi pleier å 22 00:00:57,770 --> 00:01:00,960 dekke i denne klassen, eller egentlig noen introduksjonskurs som bruker C. 23 00:01:00,960 --> 00:01:05,510 >> Men ta mitt ord for det, særlig hvis ditt sinn føles litt mer bøyd 24 00:01:05,510 --> 00:01:07,100 i dag og i ukene som kommer. 25 00:01:07,100 --> 00:01:10,340 Det er ikke representativt for at du får noe verre på dette det betyr bare at 26 00:01:10,340 --> 00:01:13,360 det er en spesielt sofistikert emne som jeg lover, noen uker 27 00:01:13,360 --> 00:01:17,610 dermed vil virke altfor påfallende grei i ettertid. 28 00:01:17,610 --> 00:01:18,720 >> Jeg husker fortsatt den dag i dag. 29 00:01:18,720 --> 00:01:22,190 Jeg ble sittende i Elliott Dining Hall, sitter ved siden av 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 Og en eller annen grunn, denne Temaet klikker bare. 32 00:01:26,340 --> 00:01:29,430 Som er å si at jeg også slet med det i noen tid, men jeg 33 00:01:29,430 --> 00:01:33,610 vil gjøre mitt beste for å bidra til å unngå slike sliter med et tema som til slutt 34 00:01:33,610 --> 00:01:34,580 er ganske kraftig. 35 00:01:34,580 --> 00:01:37,350 >> Faktisk et av temaene vi skal diskutere i ukene som kommer, er at 36 00:01:37,350 --> 00:01:41,130 av sikkerhet, og hvordan du faktisk kan utnytte maskiner på måter 37 00:01:41,130 --> 00:01:42,320 som ikke var tiltenkt. 38 00:01:42,320 --> 00:01:45,850 Og disse exploitations er typisk et resultat av feil, feil som vi 39 00:01:45,850 --> 00:01:49,740 folk gjør ved å ikke forstå noen på det underliggende gjennomføring 40 00:01:49,740 --> 00:01:52,250 detaljer via hvilke programmer er gjort. 41 00:01:52,250 --> 00:01:55,410 >> Nå for å gjøre dette synes hele mer brukervennlig vennlig, jeg trodde jeg skulle spille en 10 42 00:01:55,410 --> 00:01:59,680 sekunders forhåndsvisning av en liten claymation Figuren heter Binky som ble brakt til 43 00:01:59,680 --> 00:02:03,020 livet av en venn av oss ved Stanford, professor Nick Parlante. 44 00:02:03,020 --> 00:02:06,753 Så la meg gi deg dette teaser av Binky her. 45 00:02:06,753 --> 00:02:09,520 >> [VIDEOAVSPILLING] 46 00:02:09,520 --> 00:02:10,380 >> -Hei, Binky. 47 00:02:10,380 --> 00:02:11,050 Våkn opp. 48 00:02:11,050 --> 00:02:13,610 Det er tid for pekeren moro. 49 00:02:13,610 --> 00:02:14,741 >> -Hva er det? 50 00:02:14,741 --> 00:02:16,440 Lær om pekere? 51 00:02:16,440 --> 00:02:17,928 Oh, goodie. 52 00:02:17,928 --> 00:02:18,920 >> [END VIDEOAVSPILLING] 53 00:02:18,920 --> 00:02:20,670 >> DAVID MALAN: Det er Stanford informatikk. 54 00:02:20,670 --> 00:02:23,194 Så mer på det som kommer. 55 00:02:23,194 --> 00:02:24,930 >> [APPLAUSE] 56 00:02:24,930 --> 00:02:26,660 >> DAVID MALAN: Beklager, Nick. 57 00:02:26,660 --> 00:02:30,680 >> Så husker at forrige gang vi endte på dette virkelig spennende cliffhanger 58 00:02:30,680 --> 00:02:32,960 der denne funksjonen bare fungerte ikke. 59 00:02:32,960 --> 00:02:34,960 Minst intuitivt, det føltes som det skal fungere. 60 00:02:34,960 --> 00:02:37,600 Bare bytte verdiene av to heltall. 61 00:02:37,600 --> 00:02:40,915 Men husker at når vi skrevet ut opprinnelige verdiene i hovedsak ett og 62 00:02:40,915 --> 00:02:44,210 to, var de fremdeles en og to og to, og ikke en. 63 00:02:44,210 --> 00:02:46,070 >> Så la meg faktisk slå over til apparatet. 64 00:02:46,070 --> 00:02:50,180 Og jeg skrev opp litt av skjelett-kode i avansere her, hvor jeg hevder at x 65 00:02:50,180 --> 00:02:52,500 vil være en, vil y være to. 66 00:02:52,500 --> 00:02:54,810 Jeg deretter skrive ut både av deres verdier med print f. 67 00:02:54,810 --> 00:02:57,540 >> Jeg så hevder her nede at vi kommer til å bytte dem. 68 00:02:57,540 --> 00:03:00,800 Jeg forlot en blank flekk her for oss å fylle ut i dag på bare et øyeblikk. 69 00:03:00,800 --> 00:03:03,380 Deretter kommer jeg til å hevde at to variabler er blitt byttet. 70 00:03:03,380 --> 00:03:04,770 Så jeg kommer til å skrive ut dem ut igjen. 71 00:03:04,770 --> 00:03:07,090 Og så forhåpentligvis, skal jeg se 1, 2. 72 00:03:07,090 --> 00:03:07,380 2, 1. 73 00:03:07,380 --> 00:03:09,830 Det er super enkelt Målet akkurat nå. 74 00:03:09,830 --> 00:03:12,430 >> Så hvordan går vi om å bytte to variabler? 75 00:03:12,430 --> 00:03:17,220 Vel, hvis jeg foreslår her er at disse koppene kan representere minne i en datamaskin. 76 00:03:17,220 --> 00:03:19,070 Dette er noen få biter, dette er enda et par biter. 77 00:03:19,070 --> 00:03:23,260 Kunne vi ha en frivillig komme fram og blande oss noen drinker, hvis det kjent ut? 78 00:03:23,260 --> 00:03:23,920 Kom opp. 79 00:03:23,920 --> 00:03:24,815 Hva heter du? 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 opp, Jess. 83 00:03:26,540 --> 00:03:29,180 Hvis du ikke har noe imot, må vi sette Google Glass på deg så vi kan 84 00:03:29,180 --> 00:03:30,430 forevige dette. 85 00:03:30,430 --> 00:03:32,800 86 00:03:32,800 --> 00:03:34,670 OK, glass. 87 00:03:34,670 --> 00:03:37,250 Spill inn en video. 88 00:03:37,250 --> 00:03:43,103 Og OK, vi er godt å gå med Jess her. 89 00:03:43,103 --> 00:03:43,810 OK. 90 00:03:43,810 --> 00:03:45,120 Hyggelig å treffe deg. 91 00:03:45,120 --> 00:03:47,720 >> Så det jeg ønsker dere gjør her - hvis du kunne, ganske raskt - 92 00:03:47,720 --> 00:03:51,040 bare øser oss et halvt glass appelsin juice og et halvt glass melk, 93 00:03:51,040 --> 00:03:55,710 representerer effektivt tallene 1 i en kopp og 2 i den annen kopp. 94 00:03:55,710 --> 00:04:01,380 95 00:04:01,380 --> 00:04:02,630 >> Dette kommer til å bli bra opptakene. 96 00:04:02,630 --> 00:04:04,910 97 00:04:04,910 --> 00:04:05,860 >> JESS: Beklager. 98 00:04:05,860 --> 00:04:06,330 >> DAVID MALAN: Nei, nei. 99 00:04:06,330 --> 00:04:08,703 Det er OK. 100 00:04:08,703 --> 00:04:10,120 Nice. 101 00:04:10,120 --> 00:04:12,950 Ok, så vi har fire bytes verdt av appelsinjuice. 102 00:04:12,950 --> 00:04:14,460 Vi kalte det verdien 1. 103 00:04:14,460 --> 00:04:16,579 Nå ytterligere fire bytes verdt av melk. 104 00:04:16,579 --> 00:04:18,519 Vil kalle det verdsetter to. 105 00:04:18,519 --> 00:04:20,440 Slik at x og y, henholdsvis. 106 00:04:20,440 --> 00:04:23,450 >> Ok, så nå hvis oppgaven - for deg, Jess, foran alle 107 00:04:23,450 --> 00:04:24,270 av dine klassekamerater - 108 00:04:24,270 --> 00:04:28,510 er å bytte de verdiene av x og y slik at vi vil at appelsinjuice i 109 00:04:28,510 --> 00:04:32,070 andre kopp og melk i denne koppen, hvordan kanskje du - før du faktisk gjør 110 00:04:32,070 --> 00:04:34,020 det - gå om du gjør dette? 111 00:04:34,020 --> 00:04:35,220 >> OK, klok beslutning. 112 00:04:35,220 --> 00:04:36,340 Så du trenger litt mer minne. 113 00:04:36,340 --> 00:04:38,190 Så la oss sette av en midlertidig cup, hvis du vil. 114 00:04:38,190 --> 00:04:40,540 Og nå fortsette å bytte x og y. 115 00:04:40,540 --> 00:04:52,950 116 00:04:52,950 --> 00:04:53,530 >> Utmerket. 117 00:04:53,530 --> 00:04:54,420 Så veldig godt gjort. 118 00:04:54,420 --> 00:04:55,670 Takk så mye, 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 liten souvenir. 122 00:05:01,950 --> 00:05:04,350 >> OK, så åpenbart, super enkel idé. 123 00:05:04,350 --> 00:05:07,500 Helt intuitivt at vi trenger litt mer lagringsplass - i dette skjemaet, 124 00:05:07,500 --> 00:05:09,750 en cup - hvis vi faktisk ønsker å bytte disse to variablene. 125 00:05:09,750 --> 00:05:11,110 Så la oss gjøre akkurat det. 126 00:05:11,110 --> 00:05:14,330 Her oppe i mellom der jeg hevder jeg er kommer til å gjøre noen bytter, vil jeg 127 00:05:14,330 --> 00:05:15,720 gå foran og erklære temp. 128 00:05:15,720 --> 00:05:17,980 Og jeg skal sette den lik, si, x. 129 00:05:17,980 --> 00:05:21,110 >> Så jeg kommer til å endre verdien av x akkurat som Jess gjorde her med 130 00:05:21,110 --> 00:05:23,200 melk og appelsinjuice å være lik y. 131 00:05:23,200 --> 00:05:27,460 Og jeg kommer til å endre y å være lik å ikke x, fordi nå ville vi være 132 00:05:27,460 --> 00:05:29,530 fast i en sirkel, men heller temp. 133 00:05:29,530 --> 00:05:33,170 Der jeg midlertidig - eller hvor Jess midlertidig sette appelsinjuice 134 00:05:33,170 --> 00:05:35,460 før clobbering at kopp med melken. 135 00:05:35,460 --> 00:05:37,250 >> Så la meg gå videre nå og gjøre dette. 136 00:05:37,250 --> 00:05:39,210 Det kalles noswap.c. 137 00:05:39,210 --> 00:05:41,190 Og nå la meg kjøre uten swap. 138 00:05:41,190 --> 00:05:43,910 Og ja jeg skjønner, hvis jeg utvide vinduet litt, 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 da x er 2, y er 1.. 141 00:05:47,230 --> 00:05:51,910 >> Men husker at på mandag gjorde vi ting litt annerledes der jeg 142 00:05:51,910 --> 00:05:56,760 i stedet implementert en hjelper funksjon, om du vil, var at faktisk ugyldig. 143 00:05:56,760 --> 00:05:58,010 Jeg kalte det bytte. 144 00:05:58,010 --> 00:06:01,600 Jeg ga det to parametre, og jeg ringte dem en og jeg ringte dem b. 145 00:06:01,600 --> 00:06:04,380 >> Oppriktig, jeg kunne kalle dem x og y. 146 00:06:04,380 --> 00:06:06,040 Det er ingenting som hindrer meg fra å gjøre det. 147 00:06:06,040 --> 00:06:08,140 Men jeg vil hevde det er så litt tvetydig. 148 00:06:08,140 --> 00:06:11,910 Fordi tilbakekalling for mandag som vi hevdet at disse parametrene var 149 00:06:11,910 --> 00:06:13,650 kopier av verdiene gått i. 150 00:06:13,650 --> 00:06:15,640 Slik at det bare søl med din tankene, tror jeg, hvis du bruker 151 00:06:15,640 --> 00:06:17,370 nøyaktig de samme variablene. 152 00:06:17,370 --> 00:06:20,150 >> Så jeg vil i stedet kaller dem en og b, bare for klarhet. 153 00:06:20,150 --> 00:06:21,840 Men vi kan kalle dem mest noe vi ønsker. 154 00:06:21,840 --> 00:06:26,280 Og jeg kommer til å kopiere og lime effektivt denne koden fra der oppe 155 00:06:26,280 --> 00:06:27,170 ned i her. 156 00:06:27,170 --> 00:06:29,110 Fordi jeg bare så at det fungerer. 157 00:06:29,110 --> 00:06:30,790 Så det er i ganske god form. 158 00:06:30,790 --> 00:06:37,390 Og jeg vil endre min x til a, x min til en, min y til b og min y til b. 159 00:06:37,390 --> 00:06:39,130 >> Så med andre ord, nøyaktig samme logikk. 160 00:06:39,130 --> 00:06:40,850 Akkurat det samme som Jess gjorde. 161 00:06:40,850 --> 00:06:44,350 Og så er det én ting jeg har å gjøre opp her selvsagt er påkalle nå denne 162 00:06:44,350 --> 00:06:45,990 funksjon, eller kalle denne funksjonen. 163 00:06:45,990 --> 00:06:50,430 Så jeg vil kalle denne funksjonen med to innganger, x og y, og trykk Lagre. 164 00:06:50,430 --> 00:06:52,300 >> Greit, så fundamentalt det samme. 165 00:06:52,300 --> 00:06:55,570 Faktisk har jeg trolig gjort programmet unødvendig komplisert ved 166 00:06:55,570 --> 00:07:00,820 skrive en funksjon som bare tar noen seks linjer med kode, mens jeg 167 00:07:00,820 --> 00:07:02,970 tidligere hadde gjennomført dette i bare tre. 168 00:07:02,970 --> 00:07:06,230 >> Så la meg gå videre nå og remake dette, gjør ingen swap. 169 00:07:06,230 --> 00:07:07,920 All right, skrudd jeg opp her. 170 00:07:07,920 --> 00:07:11,290 Dette bør være en feil som du kanskje se stadig mer vanlig som din 171 00:07:11,290 --> 00:07:12,380 programmer blir mer komplekse. 172 00:07:12,380 --> 00:07:13,470 Men det er lett å fikse. 173 00:07:13,470 --> 00:07:15,650 La meg bla tilbake her. 174 00:07:15,650 --> 00:07:18,190 >> Og hva er den første feilen jeg ser? 175 00:07:18,190 --> 00:07:19,520 Implisitt erklæringen. 176 00:07:19,520 --> 00:07:21,466 Hva som vanligvis indikerer? 177 00:07:21,466 --> 00:07:22,830 Oh, jeg glemte prototypen. 178 00:07:22,830 --> 00:07:26,900 Jeg glemte å undervise kompilator som swap kommer til å eksistere selv om han 179 00:07:26,900 --> 00:07:28,920 ikke eksisterer helt i begynnelsen av programmet. 180 00:07:28,920 --> 00:07:35,780 Så jeg skal bare si tomrom, swap, int, en int b, semikolon. 181 00:07:35,780 --> 00:07:37,280 >> Så jeg kommer ikke til å reimplement det. 182 00:07:37,280 --> 00:07:39,140 Men nå det stemmer med det er her nede. 183 00:07:39,140 --> 00:07:42,530 Og legg merke til, fravær av et semikolon her, er der ikke nødvendig når 184 00:07:42,530 --> 00:07:43,200 implementere. 185 00:07:43,200 --> 00:07:46,010 >> Så la meg remake dette, gjør ingen swap. 186 00:07:46,010 --> 00:07:46,910 Mye bedre form. 187 00:07:46,910 --> 00:07:48,130 Kjør ingen swap. 188 00:07:48,130 --> 00:07:48,740 Og faen. 189 00:07:48,740 --> 00:07:51,650 Nå er vi tilbake der vi var på mandag, hvor ting ikke bytte. 190 00:07:51,650 --> 00:07:55,410 >> Og hva er den intuitive forklaring for hvorfor dette er tilfelle? 191 00:07:55,410 --> 00:07:56,380 Yeah? 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: Nettopp. 195 00:08:05,230 --> 00:08:07,330 Så a og b er kopier av x og y. 196 00:08:07,330 --> 00:08:10,680 Og faktisk, hver gang du har vært kalle en funksjon så langt at 197 00:08:10,680 --> 00:08:12,540 passerer variabler som ints - 198 00:08:12,540 --> 00:08:14,470 akkurat som swap venter her - 199 00:08:14,470 --> 00:08:16,270 dere har vært passerer på kopier. 200 00:08:16,270 --> 00:08:19,150 >> Nå som betyr at det tar litt av tid, en brøkdel av et sekund, for 201 00:08:19,150 --> 00:08:23,270 PC for å kopiere biter fra ett variabel inn i biter av en annen. 202 00:08:23,270 --> 00:08:24,610 Men det er ikke så big deal. 203 00:08:24,610 --> 00:08:25,920 Men de er likevel en kopi. 204 00:08:25,920 --> 00:08:30,020 >> Og så nå, i sammenheng med swap, Jeg er faktisk vellykket 205 00:08:30,020 --> 00:08:31,180 endring a og b. 206 00:08:31,180 --> 00:08:33,000 Faktisk, la oss gjøre en rask tilregnelighet sjekk. 207 00:08:33,000 --> 00:08:36,830 Skriv ut f en er% i, ny linje. 208 00:08:36,830 --> 00:08:38,770 Og la oss koble til en. 209 00:08:38,770 --> 00:08:41,830 Nå la oss gjøre det samme med b. 210 00:08:41,830 --> 00:08:43,640 Og la oss gjøre det samme her. 211 00:08:43,640 --> 00:08:47,260 >> Og nå, la meg kopiere de samme linjene igjen på bunnen av funksjonen 212 00:08:47,260 --> 00:08:51,250 etter tre mine linjer med interessant kunne ha utført, og 213 00:08:51,250 --> 00:08:53,270 skrive ut a og b ennå igjen. 214 00:08:53,270 --> 00:08:56,030 Så nå la oss gjøre dette, gjør ingen swap. 215 00:08:56,030 --> 00:08:58,430 La meg gjøre terminalvinduet en litt høyere, slik at vi kan se 216 00:08:58,430 --> 00:08:59,520 mer av det på en gang. 217 00:08:59,520 --> 00:09:00,860 >> Og kjøre uten 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å, er en 2, er b en. 220 00:09:06,070 --> 00:09:09,390 Så det virker, akkurat som Jess gjorde her inne i swap. 221 00:09:09,390 --> 00:09:13,090 Men selvfølgelig, det har ingen effekt på variablene i main. 222 00:09:13,090 --> 00:09:15,360 >> Så vi så et triks der vi kunne fikse dette, ikke sant? 223 00:09:15,360 --> 00:09:19,560 Når du står overfor denne scoping problemet, du kan bare punt og gjøre x 224 00:09:19,560 --> 00:09:22,400 og y hvilke variabler i stedet? 225 00:09:22,400 --> 00:09:23,390 >> Du kan gjøre dem globale. 226 00:09:23,390 --> 00:09:27,560 Sett dem på toppen av filen som vi gjorde, selv i spillet 15 år. 227 00:09:27,560 --> 00:09:28,890 Vi bruker en global variabel. 228 00:09:28,890 --> 00:09:32,420 Men i forbindelse med et spill 15, det er fornuftig å ha en global 229 00:09:32,420 --> 00:09:37,170 variabel som representerer styret, fordi helheten av 15.c er alt 230 00:09:37,170 --> 00:09:38,650 om å implementere det spillet. 231 00:09:38,650 --> 00:09:41,470 Det er hva filen finnes å gjøre. 232 00:09:41,470 --> 00:09:44,170 >> Men i dette tilfellet her, er jeg å kalle en funksjon swap. 233 00:09:44,170 --> 00:09:45,380 Jeg ønsker å bytte to variabler. 234 00:09:45,380 --> 00:09:48,950 Og det bør begynne å føle seg like slurvete hvis løsningen til alle vår 235 00:09:48,950 --> 00:09:51,300 problemer når vi kjører inn i omfang problemene er at det globale. 236 00:09:51,300 --> 00:09:54,730 Fordi svært raskt vårt program er kommer til å bli ganske rotete. 237 00:09:54,730 --> 00:09:57,760 Og vi gjorde det svært sparsomt som et resultat i 15.c. 238 00:09:57,760 --> 00:10:00,470 >> Men det viser seg at det er en bedre måte helt. 239 00:10:00,470 --> 00:10:05,600 La meg faktisk gå tilbake og slette skrive ut f-tallet, bare for å forenkle denne koden. 240 00:10:05,600 --> 00:10:09,160 Og la meg foreslå at dette faktisk er dårlig. 241 00:10:09,160 --> 00:10:15,990 Men hvis jeg i stedet legge inn noen stjernene og stjerner, kan jeg i stedet slå denne 242 00:10:15,990 --> 00:10:18,670 Funksjonen til en som er faktisk drift. 243 00:10:18,670 --> 00:10:25,020 >> Så la meg gå tilbake hit og innrømme å si stjernene er alltid vanskelig, 244 00:10:25,020 --> 00:10:26,170 så jeg vil si stjerner. 245 00:10:26,170 --> 00:10:27,660 Jeg vil bare fess opp til den. 246 00:10:27,660 --> 00:10:28,190 OK. 247 00:10:28,190 --> 00:10:30,190 Og nå, hva jeg skal å gjøre i stedet? 248 00:10:30,190 --> 00:10:34,130 >> Så først av alt, jeg kommer til å spesifisere at i stedet for å bestå en int inn 249 00:10:34,130 --> 00:10:37,980 swap-funksjonen, er jeg i stedet av kommer til å si int stjerne. 250 00:10:37,980 --> 00:10:39,170 Nå, hva stjernen indikerer? 251 00:10:39,170 --> 00:10:41,970 Dette er at tanken om en peker som Binky, den claymation karakter, var 252 00:10:41,970 --> 00:10:43,465 henviser til et øyeblikk siden. 253 00:10:43,465 --> 00:10:47,610 >> Så hvis vi sier int stjerne, betydningen av dette nå er at en ikke kommer til å være 254 00:10:47,610 --> 00:10:49,110 vedtatt i av sin verdi. 255 00:10:49,110 --> 00:10:50,350 Det kommer ikke til å bli kopiert i. 256 00:10:50,350 --> 00:10:54,700 Snarere er adressen til en kommer til å bli gått i. 257 00:10:54,700 --> 00:10:57,840 >> Så husker at innsiden av maskinen din er en hel haug med minne, ellers 258 00:10:57,840 --> 00:10:58,760 kjent som RAM. 259 00:10:58,760 --> 00:11:00,520 Og at RAM er bare en hel haug med bytes. 260 00:11:00,520 --> 00:11:03,320 Så hvis din Mac eller PC-en to gigabyte, har du to 261 00:11:03,320 --> 00:11:05,760 milliard byte minne. 262 00:11:05,760 --> 00:11:08,440 >> Nå la oss bare anta at bare for å holde ting rent og ryddig, vi 263 00:11:08,440 --> 00:11:09,450 tildele en adresse - 264 00:11:09,450 --> 00:11:10,170 et tall - 265 00:11:10,170 --> 00:11:12,270 til hver byte RAM i datamaskinen. 266 00:11:12,270 --> 00:11:15,410 Den aller første byte av de to milliarder er av tallet null. 267 00:11:15,410 --> 00:11:18,572 Den neste er byte nummer en, antallet to, hele veien opp, dot dot 268 00:11:18,572 --> 00:11:20,530 dot, om lag 2 milliarder. 269 00:11:20,530 --> 00:11:23,640 >> Slik at du kan antall byte minnet i maskinen din. 270 00:11:23,640 --> 00:11:26,460 Så la oss anta at det er det vi mener med en adresse. 271 00:11:26,460 --> 00:11:31,360 Så når jeg ser int stjerners en, hva som skjer skal sendes inn swap nå er 272 00:11:31,360 --> 00:11:32,830 adressen til en. 273 00:11:32,830 --> 00:11:37,150 Ikke dens verdi, men uansett postvesenet Adressen er, så å si - 274 00:11:37,150 --> 00:11:38,810 sin plassering i RAM. 275 00:11:38,810 --> 00:11:41,250 >> Og tilsvarende for b, jeg skal for å si 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 side, teknisk stjernen kunne gå andre steder. 278 00:11:46,350 --> 00:11:50,140 Men vi vil standardisere på stjernen blir rett ved siden av datatype. 279 00:11:50,140 --> 00:11:54,080 >> Så bytte signatur betyr nå, gi meg adressen til en int, og samtalen 280 00:11:54,080 --> 00:11:55,400 den adressen en. 281 00:11:55,400 --> 00:11:58,690 Og gi meg en annen adresse for en int og kaller den adressen b. 282 00:11:58,690 --> 00:12:01,120 >> Men nå er min kode her må endres. 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 fremdeles er av typen int - 285 00:12:05,580 --> 00:12:08,700 men jeg lagre i det, hva slags verdi? 286 00:12:08,700 --> 00:12:12,870 For å være klar, jeg setter en en med koden som er skrevet på akkurat nå? 287 00:12:12,870 --> 00:12:14,360 >> Jeg setter plasseringen i en. 288 00:12:14,360 --> 00:12:16,500 Men jeg bryr meg ikke om plassering nå, ikke sant? 289 00:12:16,500 --> 00:12:21,940 Temp finnes bare Jess 'tredje cup eksistert, hva er formålet? 290 00:12:21,940 --> 00:12:23,090 For å lagre en verdi. 291 00:12:23,090 --> 00:12:24,830 Melk eller appelsinjuice. 292 00:12:24,830 --> 00:12:28,520 Ikke å faktisk lagre adressen noen av disse tingene, føles som en 293 00:12:28,520 --> 00:12:31,200 lite nonsens i denne virkelige verdenssammenheng uansett. 294 00:12:31,200 --> 00:12:34,990 >> Så egentlig, hva jeg ønsker å sette i temp er ikke adressen til en, men 295 00:12:34,990 --> 00:12:36,180 innholdet i en. 296 00:12:36,180 --> 00:12:41,930 Så hvis a er et tall som 123, er denne det 123. byte minne at en rettferdig 297 00:12:41,930 --> 00:12:45,090 skjer for å være opptar, at verdien i en skjer for å være opptar. 298 00:12:45,090 --> 00:12:49,040 >> Hvis jeg ønsker å gå til den adressen, Jeg må si stjerners en. 299 00:12:49,040 --> 00:12:52,610 Tilsvarende, hvis jeg skulle endre hva som er på adressen en, endrer jeg 300 00:12:52,610 --> 00:12:53,570 dette for å starte en. 301 00:12:53,570 --> 00:12:58,185 Hvis jeg ønsker å lagre på hva som står på den Beliggenheten en med hva som er på stedet 302 00:12:58,185 --> 00:13:02,180 på b, star b stjerne. 303 00:13:02,180 --> 00:13:05,340 >> Så kort sagt, selv om dette ikke er helt synke inn enda - og jeg ville ikke forvente 304 00:13:05,340 --> 00:13:06,560 at det ville så fort - 305 00:13:06,560 --> 00:13:11,100 innse at alt jeg gjør er prefixing disse stjernene til mine variabler, 306 00:13:11,100 --> 00:13:13,350 ordtaket ikke hente verdiene. 307 00:13:13,350 --> 00:13:14,520 Ikke endre verdiene. 308 00:13:14,520 --> 00:13:17,600 Men heller gå til disse adressene og få verdien. 309 00:13:17,600 --> 00:13:21,430 Gå til denne adressen og endring verdien der. 310 00:13:21,430 --> 00:13:25,500 >> Så nå la meg bla tilbake til toppen, bare å fikse denne linjen her, til 311 00:13:25,500 --> 00:13:27,690 endre prototype å matche. 312 00:13:27,690 --> 00:13:30,280 Men jeg nå trenger å gjøre en annen ting. 313 00:13:30,280 --> 00:13:35,500 Intuitivt, hvis jeg har endret typer argumenter som swap venter, 314 00:13:35,500 --> 00:13:37,245 hva annet trenger jeg å endre i koden min? 315 00:13:37,245 --> 00:13:39,750 316 00:13:39,750 --> 00:13:40,840 >> Når jeg kaller swap. 317 00:13:40,840 --> 00:13:43,340 Fordi akkurat nå, hva er Jeg passerer å bytte likevel? 318 00:13:43,340 --> 00:13:47,450 Verdien x og verdien av y, eller melk og appelsinjuice. 319 00:13:47,450 --> 00:13:48,510 Men jeg ønsker ikke å gjøre det. 320 00:13:48,510 --> 00:13:51,060 Jeg i stedet ønsker å passere på hva? 321 00:13:51,060 --> 00:13:53,050 Plasseringen av x og plasseringen av y. 322 00:13:53,050 --> 00:13:55,300 Hva er deres postadresser, så å si. 323 00:13:55,300 --> 00:13:57,600 >> Så for å gjøre det, det er en ampersand. 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 av x, og adressen til y. 326 00:14:03,240 --> 00:14:06,790 Så det er bevisst at vi bruker -tegn når man ringer til funksjonen, 327 00:14:06,790 --> 00:14:10,230 og stjerner når erklære og når gjennomføring av funksjonen. 328 00:14:10,230 --> 00:14:14,220 >> Og bare tenk på ampersand som adressen til operatør, og stjerne 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 riktig, dereference operatør. 331 00:14:18,640 --> 00:14:23,480 Så det er en hel masse ord bare for å si at nå, forhåpentligvis, er swap kommer 332 00:14:23,480 --> 00:14:24,440 å være korrekt. 333 00:14:24,440 --> 00:14:26,550 >> La meg gå videre og gjøre - 334 00:14:26,550 --> 00:14:30,940 la oss faktisk endre navn på filen, lest dette programmet fortsatt bli kalt ingen swap. 335 00:14:30,940 --> 00:14:33,240 Jeg hevder at vi kaller det swap.c nå. 336 00:14:33,240 --> 00:14:35,670 Så gjør, bytte. 337 00:14:35,670 --> 00:14:37,520 Dot, slash, bytte. 338 00:14:37,520 --> 00:14:40,210 >> Og nå faktisk, x er 1, y er 2. 339 00:14:40,210 --> 00:14:44,040 Og deretter, x er 2, y er en. 340 00:14:44,040 --> 00:14:46,500 Vel la oss se om vi ikke kan gjøre dette til en litt annerledes på hva som er 341 00:14:46,500 --> 00:14:47,180 skjer her. 342 00:14:47,180 --> 00:14:51,250 Først, la meg zoome inn på vår tegning skjermen her. 343 00:14:51,250 --> 00:14:54,160 Og la meg foreslå et øyeblikk - og når jeg tegner her vil speilvendes 344 00:14:54,160 --> 00:14:58,660 der oppe nå - la meg foreslå at her er en hel haug med minne, eller 345 00:14:58,660 --> 00:15:00,540 RAM, innsiden av datamaskinen min. 346 00:15:00,540 --> 00:15:04,140 >> Og dette vil være bit nummer, la oss si, en. 347 00:15:04,140 --> 00:15:05,720 Dette vil være byte nummer to. 348 00:15:05,720 --> 00:15:08,220 Og jeg skal gjøre en hel haug mer, og deretter en haug med dot dot prikker 349 00:15:08,220 --> 00:15:10,880 tyder på at det er 2 milliarder av disse tingene. 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 det de første fem bytes av datamaskinens minne. 352 00:15:17,055 --> 00:15:17,560 Greit? 353 00:15:17,560 --> 00:15:19,060 Svært få ut av 2 milliarder kroner. 354 00:15:19,060 --> 00:15:21,120 Men nå skal jeg til å foreslå følgende. 355 00:15:21,120 --> 00:15:27,490 Jeg kommer til å foreslå at x kommer til å lagre tallet 1, og Y er tenkt 356 00:15:27,490 --> 00:15:29,690 for å lagre nummeret to. 357 00:15:29,690 --> 00:15:35,000 Og la meg gå videre nå, og representerer disse verdiene som følger. 358 00:15:35,000 --> 00:15:41,510 >> La oss gjøre dette som følger. 359 00:15:41,510 --> 00:15:42,870 Gi meg bare ett sekund. 360 00:15:42,870 --> 00:15:44,150 Ett sekund. 361 00:15:44,150 --> 00:15:45,680 OK. 362 00:15:45,680 --> 00:15:47,560 Jeg ønsker å gjøre dette litt - 363 00:15:47,560 --> 00:15:50,440 la oss gjøre dette igjen. 364 00:15:50,440 --> 00:15:53,250 Ellers skal jeg til og bruker samme tallene, utilsiktet, 365 00:15:53,250 --> 00:15:54,230 flere ganger. 366 00:15:54,230 --> 00:15:57,320 >> Så bare så vi har forskjellig antall å snakke om, la oss kalle dette 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 la meg hevder nå at jeg kommer til å sette verdien 1 her, og verdien 2 369 00:16:08,400 --> 00:16:11,990 her, også kjent som x og y. 370 00:16:11,990 --> 00:16:15,300 Så det bare skjer, slik at dette er x, y er dette. 371 00:16:15,300 --> 00:16:18,180 >> Og bare ved noen tilfeldige, den datamaskinen, operativsystemet, 372 00:16:18,180 --> 00:16:21,890 skjedd å sette x på stedet nummer 123. 373 00:16:21,890 --> 00:16:25,590 Og y endte opp på plassering 124 - 374 00:16:25,590 --> 00:16:26,330 faen. 375 00:16:26,330 --> 00:16:28,700 Jeg burde ha fikset dette. 376 00:16:28,700 --> 00:16:34,040 Oh man, jeg virkelig ønsker å gjøre dette? 377 00:16:34,040 --> 00:16:37,340 Ja, jeg ønsker å fikse dette og b skikkelig om dette i dag. 378 00:16:37,340 --> 00:16:39,950 Sorry, ny på dette. 379 00:16:39,950 --> 00:16:45,020 >> 127, 131, og jeg ønsket ikke å være dette kompleks, men hvorfor gjorde jeg endre 380 00:16:45,020 --> 00:16:46,340 tall der? 381 00:16:46,340 --> 00:16:48,360 Fordi jeg vil at ints til faktisk være fire byte. 382 00:16:48,360 --> 00:16:49,810 Så la oss være super anal om dette. 383 00:16:49,810 --> 00:16:53,800 Slik at hvis en tilfeldigvis rettes 123, er to kommer til å være i det adresse 384 00:16:53,800 --> 00:16:55,730 127 fordi det er bare 4 byes unna. 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 alle andre adresser i verden. 387 00:16:58,640 --> 00:17:03,320 >> Så x er på stedet 123, y er på stedet 127. 388 00:17:03,320 --> 00:17:05,770 Og nå, hva gjør jeg faktisk ønsker å gjøre? 389 00:17:05,770 --> 00:17:10,099 Når jeg kaller swap nå, hva faktisk skjer? 390 00:17:10,099 --> 00:17:14,920 Vel, når jeg kaller swap, jeg har bestått i adressen til x og adressen til y. 391 00:17:14,920 --> 00:17:18,540 Så for eksempel, hvis disse to stykker av papir nå representerer to 392 00:17:18,540 --> 00:17:23,510 argumenter a og b for å bytte, hva er jeg kommer til å skrive på den første av disse, 393 00:17:23,510 --> 00:17:27,720 som jeg kommer til å kalle refererer til som en? 394 00:17:27,720 --> 00:17:30,610 >> Akkurat, 123. 395 00:17:30,610 --> 00:17:31,905 Så dette jeg hevder 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 legger inn adressen x der inne. 398 00:17:35,856 --> 00:17:38,152 >> Hva er det? 399 00:17:38,152 --> 00:17:40,890 >> Hva er det? 400 00:17:40,890 --> 00:17:41,190 >> Nei, nei. 401 00:17:41,190 --> 00:17:41,720 Det er OK. 402 00:17:41,720 --> 00:17:42,570 Fortsatt god, fortsatt god. 403 00:17:42,570 --> 00:17:43,530 Dette er altså en. 404 00:17:43,530 --> 00:17:46,240 Og nå på den andre arket, dette kommer til å være b, og hva er jeg 405 00:17:46,240 --> 00:17:49,010 kommer til å 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 som har forandret seg siden vår forrige telling i denne historien er, 408 00:17:53,720 --> 00:17:58,590 heller enn bokstavelig 1 og 2, er jeg kommer til å passere i 123 og 127. 409 00:17:58,590 --> 00:18:02,130 Og jeg nå kommer til å sette disse inne av denne boksen, ok? 410 00:18:02,130 --> 00:18:04,640 Slik at svarte boksen representerer nå swap-funksjon. 411 00:18:04,640 --> 00:18:07,230 >> I mellomtiden, la oss nå ha noen gjennomføre swap-funksjon. 412 00:18:07,230 --> 00:18:09,090 Ville noen opp her liker å jobbe frivillig? 413 00:18:09,090 --> 00:18:09,560 Kom opp. 414 00:18:09,560 --> 00:18:11,080 Hva heter du? 415 00:18:11,080 --> 00:18:11,460 Charlie. 416 00:18:11,460 --> 00:18:12,080 Greit, Charlie. 417 00:18:12,080 --> 00:18:14,810 Kom opp. 418 00:18:14,810 --> 00:18:17,310 >> Så Charlie kommer til å spille rollen som vår black box. 419 00:18:17,310 --> 00:18:21,460 Og Charlie, hva jeg vil at du skal gjøre nå er å gjennomføre swap på en slik måte 420 00:18:21,460 --> 00:18:25,320 at, gitt de to adressene, du var faktisk kommer 421 00:18:25,320 --> 00:18:26,330 å endre verdiene. 422 00:18:26,330 --> 00:18:28,290 Og jeg skal hviske i øret hvordan å kjøre TV her. 423 00:18:28,290 --> 00:18:29,930 >> Så gå videre, og du er den svarte boksen. 424 00:18:29,930 --> 00:18:30,920 Nå i det. 425 00:18:30,920 --> 00:18:34,054 Hvilke verdier ser du for en, og hvilke verdier ser du for b? 426 00:18:34,054 --> 00:18:36,740 >> CHARLIE: en er 123 og b er 127. 427 00:18:36,740 --> 00:18:37,530 >> DAVID MALAN: OK, akkurat. 428 00:18:37,530 --> 00:18:38,940 Nå stopper det for bare et øyeblikk. 429 00:18:38,940 --> 00:18:41,680 Det første du skal gjøre nå, i henhold til koden - hvilken 430 00:18:41,680 --> 00:18:43,220 Jeg skal nå dra opp på skjermen - 431 00:18:43,220 --> 00:18:46,750 kommer til å være å allokere litt litt minne kalt temp. 432 00:18:46,750 --> 00:18:48,850 Så jeg kommer til å gå videre og gi deg som minne. 433 00:18:48,850 --> 00:18:52,210 >> Så dette kommer til å være en tredje variabel at du har tilgang til 434 00:18:52,210 --> 00:18:54,080 du ringte temp. 435 00:18:54,080 --> 00:18:57,120 Og hva har du tenkt å skrive på temp stykke papir? 436 00:18:57,120 --> 00:19:02,524 437 00:19:02,524 --> 00:19:03,470 >> CHARLIE: Pekere, ikke sant? 438 00:19:03,470 --> 00:19:04,790 >> DAVID MALAN: OK, vel ikke nødvendigvis pekere. 439 00:19:04,790 --> 00:19:07,230 Så linjen med kode som jeg har markert på høyre side, 440 00:19:07,230 --> 00:19:07,900 la oss starte der. 441 00:19:07,900 --> 00:19:08,890 Det sier stjerners en. 442 00:19:08,890 --> 00:19:11,670 Så en er i ferd med å lagre nummer 123. 443 00:19:11,670 --> 00:19:16,660 Og akkurat intuitivt, hva gjorde stjerners 123 betyr? 444 00:19:16,660 --> 00:19:21,630 >> Men spesielt, hvis en er 123, betyr stjerne en hva? 445 00:19:21,630 --> 00:19:22,560 Verdien av en. 446 00:19:22,560 --> 00:19:24,580 Eller mer uformelt, gå dit. 447 00:19:24,580 --> 00:19:28,620 Så la meg foreslå at du holder en i hånden din, gå videre og behandle som 448 00:19:28,620 --> 00:19:29,430 som om det er et kart. 449 00:19:29,430 --> 00:19:32,940 Og gå selv over til datamaskinens hukommelse, og finne oss hva som er 450 00:19:32,940 --> 00:19:36,520 på plassering 123. 451 00:19:36,520 --> 00:19:37,720 Nettopp. 452 00:19:37,720 --> 00:19:41,100 >> Så vi ser på plassering 123 er det åpenbart? 453 00:19:41,100 --> 00:19:44,240 OK, så hva verdien nå er du kommer til å sette inn temp? 454 00:19:44,240 --> 00:19:44,750 Nettopp. 455 00:19:44,750 --> 00:19:45,600 Så gå videre og gjøre det. 456 00:19:45,600 --> 00:19:51,280 Og skrive tallet 1 på stykke papir som er i dag med tittelen temp. 457 00:19:51,280 --> 00:19:53,540 >> Og nå det neste trinnet som du kommer til å implementere 458 00:19:53,540 --> 00:19:54,310 kommer til å være det. 459 00:19:54,310 --> 00:19:57,820 Vel, på høyre side av neste linje av koden er stjerne b. b, av 460 00:19:57,820 --> 00:19:59,260 Selvfølgelig lagrer en adresse. 461 00:19:59,260 --> 00:20:02,270 Som tar 127. 462 00:20:02,270 --> 00:20:06,620 Stjerners b betyr hva, casually snakker? 463 00:20:06,620 --> 00:20:08,700 >> Gå til denne plasseringen. 464 00:20:08,700 --> 00:20:14,988 Så gå videre og finne oss hva som er på plassering 127. 465 00:20:14,988 --> 00:20:15,480 OK. 466 00:20:15,480 --> 00:20:19,170 Naturligvis, ved plassering 127, er fortsatt verdien 2. 467 00:20:19,170 --> 00:20:24,060 Så hva skal du nå butikken på det som er det stedet i en? 468 00:20:24,060 --> 00:20:26,860 Så stjerne en del gå til plasseringen en. 469 00:20:26,860 --> 00:20:29,770 Hva er plasseringen en? 470 00:20:29,770 --> 00:20:30,430 >> Nettopp. 471 00:20:30,430 --> 00:20:34,190 Så nå, hvis du vil endre hva som står på det stedet - 472 00:20:34,190 --> 00:20:36,470 Jeg skal gå videre og kjøre viskelæret er her. 473 00:20:36,470 --> 00:20:37,760 Og nå sette den tilbake på børsten. 474 00:20:37,760 --> 00:20:42,190 Hvilket nummer skal du skrive i den tomme boksen nå? 475 00:20:42,190 --> 00:20:42,850 >> Nettopp. 476 00:20:42,850 --> 00:20:46,470 Så denne linjen med kode, for å være klar - la meg pause hva Charlies gjør og 477 00:20:46,470 --> 00:20:51,730 påpeke her, hva han nettopp har gjort er skrive inn den boksen på stedet 123 478 00:20:51,730 --> 00:20:55,150 verdien som tidligere var på b. 479 00:20:55,150 --> 00:20:59,140 Og så har vi nå implementert faktisk denne andre linje med kode. 480 00:20:59,140 --> 00:21:01,920 >> Nå dessverre, det er fortsatt en linje som gjenstår. 481 00:21:01,920 --> 00:21:04,900 Nå hva er i temp, bokstavelig talt? 482 00:21:04,900 --> 00:21:06,200 Det er åpenbart nummer én. 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 tall, liksom en variabel fra uke én. 485 00:21:09,380 --> 00:21:13,520 >> Og nå når du sier stjerners b, som betyr gå til adressen B, er av hvilken 486 00:21:13,520 --> 00:21:15,090 kurs her. 487 00:21:15,090 --> 00:21:16,020 Så når du kommer dit - 488 00:21:16,020 --> 00:21:18,320 Jeg skal gå foran og slette det som faktisk der - og hva er du 489 00:21:18,320 --> 00:21:20,820 kommer til å skrive nå på plassering 127? 490 00:21:20,820 --> 00:21:22,010 >> CHARLIE: Temp, som er en. 491 00:21:22,010 --> 00:21:23,430 >> DAVID MALAN: Temp, som er en. 492 00:21:23,430 --> 00:21:25,670 Og hva skjer med temp til slutt? 493 00:21:25,670 --> 00:21:26,600 Vel, vi egentlig ikke vet. 494 00:21:26,600 --> 00:21:27,420 Vi vet egentlig ikke bryr seg. 495 00:21:27,420 --> 00:21:31,090 Hver gang vi har implementert en funksjon så langt, alle lokale variabler du har 496 00:21:31,090 --> 00:21:31,890 er faktisk lokale. 497 00:21:31,890 --> 00:21:33,060 Og de bare forsvinner. 498 00:21:33,060 --> 00:21:35,040 De er gjenerobret av drift systemet etter hvert. 499 00:21:35,040 --> 00:21:39,800 >> Så det faktum at temp fremdeles har de Verdien 1 er liksom fundamentalt 500 00:21:39,800 --> 00:21:41,150 uinteressant for oss. 501 00:21:41,150 --> 00:21:43,100 Ok, så en runde med applaus hvis vi kunne for Charlie. 502 00:21:43,100 --> 00:21:46,400 Veldig godt gjort. 503 00:21:46,400 --> 00:21:51,520 >> Greit, så hva mer tid dette mener vi kan gjøre? 504 00:21:51,520 --> 00:21:54,400 Så det viser seg at vi har vært fortelle noen hvite løgner 505 00:21:54,400 --> 00:21:55,540 for en stund. 506 00:21:55,540 --> 00:21:59,990 Faktisk viser det seg at en streng, hele denne tiden, er egentlig ikke en 507 00:21:59,990 --> 00:22:02,190 tegnsekvens per se. 508 00:22:02,190 --> 00:22:03,980 Den slags er det intuitivt. 509 00:22:03,980 --> 00:22:08,270 >> Men teknisk sett er streng en datatype som vi erklært innsiden av 510 00:22:08,270 --> 00:22:12,170 den CS50 biblioteket for å forenkle verden for de første ukene av klassen. 511 00:22:12,170 --> 00:22:20,130 Hva en streng egentlig er er adressen av en karakter eller annet sted i RAM. 512 00:22:20,130 --> 00:22:25,530 En streng er egentlig et tall, som 123 eller 127, som skjer for å avgrense 513 00:22:25,530 --> 00:22:28,420 hvor en streng begynner i datamaskinens minne. 514 00:22:28,420 --> 00:22:31,870 >> Men det ikke representerer den 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 La meg gå videre og åpne opp noen kode som er blant 517 00:22:35,980 --> 00:22:38,340 dagens kildekode eksempler. 518 00:22:38,340 --> 00:22:42,225 Og jeg kommer til å gå foran og åpne opp, la oss si, sammenligne-0.c. 519 00:22:42,225 --> 00:22:44,830 520 00:22:44,830 --> 00:22:48,790 Dette er en buggy program som kommer skal gjennomføres på følgende måte. 521 00:22:48,790 --> 00:22:49,040 >> Først. 522 00:22:49,040 --> 00:22:50,420 Jeg kommer til å si noe. 523 00:22:50,420 --> 00:22:52,660 Så jeg kommer til å gå videre og få en streng fra brukeren 524 00:22:52,660 --> 00:22:53,750 i det neste linje. 525 00:22:53,750 --> 00:22:55,370 Så jeg kommer til å si det igjen. 526 00:22:55,370 --> 00:22:57,540 Så jeg kommer til å få en annen strengen fra brukeren. 527 00:22:57,540 --> 00:23:00,390 >> Og legg merke til, viser jeg en av de strenger i en variabel kalt s, og 528 00:23:00,390 --> 00:23:03,040 en annen av disse strengene i en variabel kalt t. 529 00:23:03,040 --> 00:23:07,480 Og nå skal jeg til å kreve, veldig rimelighet, at hvis s er lik lik 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 >> Tross alt, hvis vi innspill to ints, to tegn, to flyter, to dobbeltrom, noen av 534 00:23:15,440 --> 00:23:18,400 datatypene vi har snakket om så langt å sammenligne dem - 535 00:23:18,400 --> 00:23:22,070 husker vi gjort veldig klart for en stund siden at du ikke gjør dette, fordi en 536 00:23:22,070 --> 00:23:25,840 enkelt likhetstegn er selvfølgelig tilordningsoperatoren. 537 00:23:25,840 --> 00:23:26,820 Så det ville være en feil. 538 00:23:26,820 --> 00:23:29,260 >> Vi bruker lik likhetstegnet, som sammenligner faktisk 539 00:23:29,260 --> 00:23:31,050 ting for ekte likestilling. 540 00:23:31,050 --> 00:23:32,275 Men jeg hevder dette er buggy. 541 00:23:32,275 --> 00:23:37,400 Hvis jeg går videre og gjøre sammenligne null, og deretter sammenligne dot slash gjør null. 542 00:23:37,400 --> 00:23:39,700 Og jeg skriver i, la oss si, hallo. 543 00:23:39,700 --> 00:23:41,590 Og så la oss si hei igjen. 544 00:23:41,590 --> 00:23:46,040 Bokstavelig talt det samme, datamaskinen hevder jeg skrev forskjellige ting. 545 00:23:46,040 --> 00:23:47,640 >> Nå kanskje jeg bare skrevet feil noe. 546 00:23:47,640 --> 00:23:49,910 Jeg skal skrive navnet mitt denne gangen. 547 00:23:49,910 --> 00:23:52,580 Jeg mener, hallo. 548 00:23:52,580 --> 00:23:54,770 Hei. 549 00:23:54,770 --> 00:23:57,360 Det er forskjellig hver eneste gang. 550 00:23:57,360 --> 00:23:58,430 >> Vel, hvorfor er det? 551 00:23:58,430 --> 00:24:00,140 Hva som egentlig skjer under panseret? 552 00:24:00,140 --> 00:24:03,270 Vel, hva er det egentlig som skjer under panseret er strengen da 553 00:24:03,270 --> 00:24:07,410 Jeg skrev i det første gang for eksempel er ordet hallo, selvfølgelig. 554 00:24:07,410 --> 00:24:11,660 Men hvis vi representerer dette under panseret, husker at en 555 00:24:11,660 --> 00:24:13,470 strengen er i en matrise. 556 00:24:13,470 --> 00:24:15,040 Og vi har sagt så mye i det siste. 557 00:24:15,040 --> 00:24:20,200 >> Så hvis jeg trekke denne matrisen som dette, er jeg kommer til å representere noe helt 558 00:24:20,200 --> 00:24:23,030 ligner på det vi gjorde for et øyeblikk siden. 559 00:24:23,030 --> 00:24:25,390 Og det er faktisk noe spesielt her, også. 560 00:24:25,390 --> 00:24:28,090 Hva gjorde vi fastslå ble på På slutten av hver streng? 561 00:24:28,090 --> 00:24:30,760 Ja, dette skråstrek null, som er bare måte å representere, 562 00:24:30,760 --> 00:24:33,610 bokstavelig talt, 00000000. 563 00:24:33,610 --> 00:24:35,680 Åtte 0 bits i rekke. 564 00:24:35,680 --> 00:24:37,610 >> Jeg vet ikke, ærlig, hva er etter dette. 565 00:24:37,610 --> 00:24:40,090 Det er bare en haug mer RAM innsiden av datamaskinen min. 566 00:24:40,090 --> 00:24:40,970 Men dette er en matrise. 567 00:24:40,970 --> 00:24:42,260 Vi snakket om arrays før. 568 00:24:42,260 --> 00:24:45,010 Og vi vanligvis snakker om arrays som plassering null, 569 00:24:45,010 --> 00:24:46,580 så en, så to. 570 00:24:46,580 --> 00:24:47,950 Men det er bare for bekvemmelighet. 571 00:24:47,950 --> 00:24:49,380 Og det er helt slektning. 572 00:24:49,380 --> 00:24:53,010 >> Når du faktisk får minne fra datamaskinen, er det selvfølgelig noen 573 00:24:53,010 --> 00:24:55,450 2 milliarder noen merkelige bytes, potensielt. 574 00:24:55,450 --> 00:24:59,100 Så egentlig under panseret, hele denne tiden, ja. 575 00:24:59,100 --> 00:25:01,670 Dette kan meget vel være brakett null. 576 00:25:01,670 --> 00:25:04,780 Men hvis du graver enda dypere under panseret, det er virkelig 577 00:25:04,780 --> 00:25:07,000 adressere 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 har ikke skru opp denne gangen. 581 00:25:12,540 --> 00:25:15,840 Dette er nå en byte hverandre for hvilken grunn? 582 00:25:15,840 --> 00:25:17,930 Hvor stor er en røye? 583 00:25:17,930 --> 00:25:19,170 En røye er bare én byte. 584 00:25:19,170 --> 00:25:20,570 En int er vanligvis fire byte. 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 Nå kan jeg holde regnestykket enklere og bare gjøre pluss en. 587 00:25:27,560 --> 00:25:30,510 Og dette er nå hva som virkelig foregår på under panseret. 588 00:25:30,510 --> 00:25:37,760 >> Så når du erklærer noe sånt som dette, string s, dette er faktisk - 589 00:25:37,760 --> 00:25:39,170 det viser seg - 590 00:25:39,170 --> 00:25:41,190 røye stjerne. 591 00:25:41,190 --> 00:25:44,640 Star, selvfølgelig, betyr adresse, aka pekeren. 592 00:25:44,640 --> 00:25:46,200 Så det er adressen til noe. 593 00:25:46,200 --> 00:25:47,510 Hva er det adressen? 594 00:25:47,510 --> 00:25:47,760 >> Vel - 595 00:25:47,760 --> 00:25:51,680 Jeg er den eneste som kan se veldig viktig poeng jeg gjør, eller tror 596 00:25:51,680 --> 00:25:52,560 Jeg gjør. 597 00:25:52,560 --> 00:25:55,270 Så string - 598 00:25:55,270 --> 00:25:57,180 den triste ting er at jeg har en skjerm akkurat der hvor jeg 599 00:25:57,180 --> 00:25:58,100 kunne ha sett det. 600 00:25:58,100 --> 00:26:00,990 >> Greit, så streng s er hva Jeg erklærte tidligere. 601 00:26:00,990 --> 00:26:04,600 Men det viser seg, takket være en liten magi i CS50 bibliotek, alt dette 602 00:26:04,600 --> 00:26:08,780 tid strengen har bokstavelig talt vært røye stjerne. 603 00:26:08,780 --> 00:26:11,310 Stjernen betyr igjen pekeren eller adresse. 604 00:26:11,310 --> 00:26:14,180 Det faktum at det er flankerer Ordet røye betyr at det er den 605 00:26:14,180 --> 00:26:15,970 adressen til en karakter. 606 00:26:15,970 --> 00:26:23,100 >> Så hvis få strengen kalles, og jeg skriver i H-E-L-L-O, foreslår nå hva som har få 607 00:26:23,100 --> 00:26:27,330 string bokstavelig talt vært tilbake alle denne gangen, selv om vi har heller 608 00:26:27,330 --> 00:26:29,980 unyansert verden? 609 00:26:29,980 --> 00:26:33,310 Hva får streng faktisk returnere som sin returverdi? 610 00:26:33,310 --> 00:26:35,830 611 00:26:35,830 --> 00:26:38,720 >> 123 i dette tilfellet, for eksempel. 612 00:26:38,720 --> 00:26:42,630 Vi har tidligere sagt at få strengen bare returnerer en streng, en sekvens av 613 00:26:42,630 --> 00:26:43,300 tegn. 614 00:26:43,300 --> 00:26:44,790 Men det er litt av en hvit løgn. 615 00:26:44,790 --> 00:26:48,010 Underveis får streng virkelig fungerer under panseret er det blir en 616 00:26:48,010 --> 00:26:48,930 strengen fra brukeren. 617 00:26:48,930 --> 00:26:51,530 Det plops tegnene som han eller hun typer i minnet. 618 00:26:51,530 --> 00:26:54,680 Det setter en skråstrek null ved utgangen av de som sekvens av tegn. 619 00:26:54,680 --> 00:26:57,310 >> Men hva får streng bokstavelig talt tilbake? 620 00:26:57,310 --> 00:27:02,710 Den returnerer bokstavelig adressen til aller første byte i RAM som 621 00:27:02,710 --> 00:27:04,130 det brukt for denne styrken. 622 00:27:04,130 --> 00:27:07,500 Og det viser seg at bare ved å returnere en enkelt adresse 623 00:27:07,500 --> 00:27:12,120 første tegnet i strengen, er at tilstrekkelig for å finne helheten av 624 00:27:12,120 --> 00:27:12,630 strengen. 625 00:27:12,630 --> 00:27:16,930 >> Med andre ord får strengen ikke har å returnere 123 og 124 og 125.. 626 00:27:16,930 --> 00:27:19,950 Det trenger ikke å gi meg en lang liste over alle byte som 627 00:27:19,950 --> 00:27:20,740 min string bruker. 628 00:27:20,740 --> 00:27:22,670 Fordi en, er de alle tilbake til. 629 00:27:22,670 --> 00:27:28,160 Og to, basert på den første adresse, jeg kan finne ut hvor strengen slutter. 630 00:27:28,160 --> 00:27:29,910 Hvordan? 631 00:27:29,910 --> 00:27:33,490 >> Den spesielle null karakter, Backslash null ved utgangen. 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 innsiden av variabler - 634 00:27:36,530 --> 00:27:41,300 adressen til en røye, og du påtar at ved slutten av enhver streng, noe 635 00:27:41,300 --> 00:27:45,040 sekvens av tegn som vi mennesker tenke på strenger, hvis du antar at 636 00:27:45,040 --> 00:27:48,600 på slutten av en slik streng det er en skråstrek null, du er gull. 637 00:27:48,600 --> 00:27:52,430 Fordi du kan alltid finne i enden av en streng. 638 00:27:52,430 --> 00:27:54,870 >> Nå hva er egentlig så kommer på i dette programmet? 639 00:27:54,870 --> 00:27:59,990 Hvorfor er dette programmet, sammenligne-0.c, buggy? 640 00:27:59,990 --> 00:28:01,690 Hva som faktisk blir sammenlignet? 641 00:28:01,690 --> 00:28:02,420 Yeah? 642 00:28:02,420 --> 00:28:05,000 >> STUDENT: [uhørlig]. 643 00:28:05,000 --> 00:28:05,730 >> DAVID MALAN: Nettopp. 644 00:28:05,730 --> 00:28:08,350 Det er å sammenligne steder av strengene. 645 00:28:08,350 --> 00:28:12,420 Så hvis brukeren har skrevet inn hallo en gang, som jeg gjorde, kan minne ende opp 646 00:28:12,420 --> 00:28:13,430 ser ut som dette. 647 00:28:13,430 --> 00:28:18,210 Hvis brukeren deretter typer i Hello again, men ved å ringe får strengen igjen, er c 648 00:28:18,210 --> 00:28:21,800 ikke spesielt flink med mindre du lære det å være smart ved å skrive kode. 649 00:28:21,800 --> 00:28:22,430 >> C - 650 00:28:22,430 --> 00:28:23,860 og datamaskiner mer generelt - 651 00:28:23,860 --> 00:28:27,370 Hvis du skriver inn ordet hei igjen, du vet hva du kommer til å få. 652 00:28:27,370 --> 00:28:31,480 Du er bare nødt til å få en ny matrise minne at, ja, det skjer være 653 00:28:31,480 --> 00:28:35,510 lagring av H-E-L-L-O og så videre. 654 00:28:35,510 --> 00:28:38,240 >> Det kommer til å se det samme til oss mennesker, men denne adressen 655 00:28:38,240 --> 00:28:39,460 kanskje ikke 123. 656 00:28:39,460 --> 00:28:42,470 Det kan bare skje slik at operativsystem har noen tilgjengelig 657 00:28:42,470 --> 00:28:45,430 plass for eksempel ved plassering - 658 00:28:45,430 --> 00:28:49,820 la oss si noe vilkårlig, som dette er stedet 200. 659 00:28:49,820 --> 00:28:51,620 Og dette er stedet 201. 660 00:28:51,620 --> 00:28:53,060 Og dette er stedet 202. 661 00:28:53,060 --> 00:28:55,730 Vi har ingen anelse om hvor det er kommer til å være i minnet. 662 00:28:55,730 --> 00:28:59,110 >> Men hva dette betyr, er at det som er skal lagres til slutt i s? 663 00:28:59,110 --> 00:29:00,750 Tallet 123. 664 00:29:00,750 --> 00:29:04,860 Hva kommer til å bli lagret i t, i dette vilkårlig eksempel? 665 00:29:04,860 --> 00:29:06,300 Tallet 200. 666 00:29:06,300 --> 00:29:11,410 Og alt som betyr da er åpenbart, 123 er ikke lik 200. 667 00:29:11,410 --> 00:29:14,940 Og så dette hvis tilstanden aldri evalueres til sant. 668 00:29:14,940 --> 00:29:18,430 Fordi get streng bruker forskjellig biter av minnet hver gang. 669 00:29:18,430 --> 00:29:20,360 >> Nå kan vi se dette igjen I et annet eksempel. 670 00:29:20,360 --> 00:29:23,764 La meg gå videre og åpne opp kopi-0.c. 671 00:29:23,764 --> 00:29:28,770 Jeg hevder at dette eksemplet skal prøve - men mislykkes - til å kopiere to strenger 672 00:29:28,770 --> 00:29:29,910 som følger. 673 00:29:29,910 --> 00:29:31,730 >> Jeg kommer til å si noe til brukeren. 674 00:29:31,730 --> 00:29:34,490 Jeg deretter kommer til å få en string og kaller det s. 675 00:29:34,490 --> 00:29:36,400 Og nå, jeg gjør denne sjekken her. 676 00:29:36,400 --> 00:29:37,990 Vi nevnte dette for en stund tilbake. 677 00:29:37,990 --> 00:29:42,490 Men da kan få streng retur null, en annen spesiell karakter, eller spesielle 678 00:29:42,490 --> 00:29:45,050 symbol la oss si. 679 00:29:45,050 --> 00:29:45,900 Hvis det er for lite minne. 680 00:29:45,900 --> 00:29:48,970 >> For eksempel, dersom brukeren er virkelig være vanskelig og typer en fryktelig 681 00:29:48,970 --> 00:29:51,220 antall tegn på tastatur og treff Enter. 682 00:29:51,220 --> 00:29:54,580 Hvis det antall tegn kan bare ikke plass i RAM uansett gal 683 00:29:54,580 --> 00:29:57,820 Derfor godt få streng kan godt returnere null. 684 00:29:57,820 --> 00:30:01,080 >> Eller hvis programmet selv gjør mye av andre ting, og det er bare 685 00:30:01,080 --> 00:30:03,790 ikke nok minne for get string å lykkes, kan det ende 686 00:30:03,790 --> 00:30:05,240 opp med å returnere null. 687 00:30:05,240 --> 00:30:07,160 Men la oss være mer presis om hva dette er. 688 00:30:07,160 --> 00:30:10,280 Hva 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 seg nå vi kan skrelle rygge lag av null. 691 00:30:14,560 --> 00:30:17,500 Slår ut, er null - Ja, selvsagt et spesielt symbol. 692 00:30:17,500 --> 00:30:19,190 Men hva er det egentlig? 693 00:30:19,190 --> 00:30:25,220 Virkelig, er null bare et symbol på at vi mennesker bruk til å representere null i tillegg. 694 00:30:25,220 --> 00:30:29,010 >> Så forfatterne av C og datamaskiner mer generelt, bestemte år siden 695 00:30:29,010 --> 00:30:30,010 det, vet du hva. 696 00:30:30,010 --> 00:30:34,850 Hvorfor kan ikke vi sikre at ingen brukere data er aldri, aldri, noensinne 697 00:30:34,850 --> 00:30:36,730 oppbevares ved bye null? 698 00:30:36,730 --> 00:30:39,610 Faktisk, selv i min vilkårlig eksemplet før, jeg visste ikke starte nummereringen på 699 00:30:39,610 --> 00:30:40,390 bytes på null. 700 00:30:40,390 --> 00:30:41,540 Jeg begynte på en. 701 00:30:41,540 --> 00:30:44,950 Fordi jeg visste at folk i verden har besluttet å reservere null 702 00:30:44,950 --> 00:30:47,970 byte i noens RAM som noe spesielt. 703 00:30:47,970 --> 00:30:52,020 >> Årsaken er, når du vil signalisere at noe har gått galt 704 00:30:52,020 --> 00:30:55,960 med hensyn til adresser, returnerte deg null - også kjent som null - 705 00:30:55,960 --> 00:30:59,410 og fordi du vet at det er ingen legit data på adressen null, tydelig 706 00:30:59,410 --> 00:31:00,400 det betyr en feil. 707 00:31:00,400 --> 00:31:04,080 Og det er derfor vi, etter konvensjonen, sjekk for null og retur noe 708 00:31:04,080 --> 00:31:06,260 som en i disse tilfellene. 709 00:31:06,260 --> 00:31:09,300 >> Så hvis vi bla nedover nå, dette er bare deretter noen feil merke, bare i tilfelle 710 00:31:09,300 --> 00:31:10,610 noe gikk galt med [? kausjon?] 711 00:31:10,610 --> 00:31:13,470 helt og avslutte programmet ved å returnere tidlig. 712 00:31:13,470 --> 00:31:19,030 Denne linjen nå kunne bli omskrevet som dette, noe som betyr at det? 713 00:31:19,030 --> 00:31:23,155 På venstre side, gi meg en annen pekeren til et tegn, og kaller det t. 714 00:31:23,155 --> 00:31:26,935 Hva skal jeg lagre innsiden av t, basert på dette en linje med kode? 715 00:31:26,935 --> 00:31:30,950 716 00:31:30,950 --> 00:31:32,170 >> Jeg lagrer et sted. 717 00:31:32,170 --> 00:31:34,742 Nærmere bestemt plasseringen som var i s. 718 00:31:34,742 --> 00:31:39,000 Så hvis brukeren har skrevet inn hei, og det første som skjer hei til ende opp 719 00:31:39,000 --> 00:31:42,567 her og deretter nummeret 123 er kommer til å komme tilbake fra å få 720 00:31:42,567 --> 00:31:43,810 streng og lagres - 721 00:31:43,810 --> 00:31:44,780 som vi sa tidligere - 722 00:31:44,780 --> 00:31:45,440 i s. 723 00:31:45,440 --> 00:31:50,560 >> Når jeg nå erklærer en annen pekeren til en røye og kaller det t, hvilket nummer er 724 00:31:50,560 --> 00:31:53,940 bokstavelig talt kommer til å ende opp i t henhold til historien? 725 00:31:53,940 --> 00:31:55,420 Så 123. 726 00:31:55,420 --> 00:32:00,310 >> Så teknisk nå både s og t peker til den eksakte 727 00:32:00,310 --> 00:32:02,410 samme biter av minnet. 728 00:32:02,410 --> 00:32:06,140 Så merke til hva jeg skal gjøre nå for å bevise at dette programmet er buggy. 729 00:32:06,140 --> 00:32:08,820 >> Først skal jeg påstå, med en print f, utnytte 730 00:32:08,820 --> 00:32:10,080 kopien av strengen. 731 00:32:10,080 --> 00:32:11,660 Så jeg kommer til å gjøre litt feilsjekking. 732 00:32:11,660 --> 00:32:12,160 Jeg kommer til å være sikker. 733 00:32:12,160 --> 00:32:16,710 La oss sørge for at strengen t er på minste er større enn null i lengde, 734 00:32:16,710 --> 00:32:19,190 så det er noen tegn der å faktisk utnytte. 735 00:32:19,190 --> 00:32:22,840 >> Og så kan du huske dette fra tidligere eksempler. 736 00:32:22,840 --> 00:32:25,630 2 øvre - som er i den ctype.h filen. 737 00:32:25,630 --> 00:32:30,800 T brakett null gir meg null tegnet i strengen t. 738 00:32:30,800 --> 00:32:34,360 Og to øverste av samme verdi, for Selvfølgelig konverterer den til store bokstaver. 739 00:32:34,360 --> 00:32:38,230 >> Så intuitivt, dette markerte linjen av koden er å utnytte den første 740 00:32:38,230 --> 00:32:40,250 brev it. 741 00:32:40,250 --> 00:32:44,485 Men det er ikke utnytte, intuitivt, den første bokstaven i s. 742 00:32:44,485 --> 00:32:48,130 Men hvis du tenker fremover, hva er jeg i ferd med å se når jeg kjører dette programmet 743 00:32:48,130 --> 00:32:54,220 og skrive ut både den opprinnelige, s, og den såkalte kopi, t? 744 00:32:54,220 --> 00:32:55,350 >> De er faktisk kommer til å være den samme. 745 00:32:55,350 --> 00:32:56,600 Og hvorfor de kommer til å være den samme? 746 00:32:56,600 --> 00:32:58,970 747 00:32:58,970 --> 00:33:01,020 De er begge peker til akkurat det samme. 748 00:33:01,020 --> 00:33:01,610 Så la oss gjøre dette. 749 00:33:01,610 --> 00:33:03,160 >> Lage kopi null. 750 00:33:03,160 --> 00:33:04,070 Det kompilerer OK. 751 00:33:04,070 --> 00:33:06,500 La meg kjøre kopi null. 752 00:33:06,500 --> 00:33:10,110 La meg skrive noe sånt hei på små bokstaver trykk Enter. 753 00:33:10,110 --> 00:33:16,520 Og det hevder at både den opprinnelige s og kopien er faktisk identisk. 754 00:33:16,520 --> 00:33:17,920 >> Så hva skjedde egentlig her? 755 00:33:17,920 --> 00:33:20,100 La meg tegne dette bildet bare å fortelle historien på en 756 00:33:20,100 --> 00:33:21,340 litt annen måte. 757 00:33:21,340 --> 00:33:26,060 Hva som egentlig skjer under hette når jeg erklærer noe sånt 758 00:33:26,060 --> 00:33:30,410 røye start s, eller streng s, Jeg får en peker - 759 00:33:30,410 --> 00:33:33,090 som skjer for å være fire byte i CS50 apparatet 760 00:33:33,090 --> 00:33:34,410 og i en rekke datamaskiner. 761 00:33:34,410 --> 00:33:36,008 Og jeg kommer til å kalle dette s. 762 00:33:36,008 --> 00:33:39,810 Og dette har i dag noen ukjent verdi. 763 00:33:39,810 --> 00:33:43,900 >> Når du deklarerer en variabel, med mindre du selv sette en verdi der, som 764 00:33:43,900 --> 00:33:44,570 vet hva som er der. 765 00:33:44,570 --> 00:33:48,110 Det kan være noen tilfeldig sekvens av biter fra forrige utførelsen. 766 00:33:48,110 --> 00:33:52,490 Så når jeg, i min linje av koden får strengen, og deretter lagre retur 767 00:33:52,490 --> 00:33:54,800 verdi i s får streng eller annen måte - 768 00:33:54,800 --> 00:33:58,520 og vi vil til slutt skallet tilbake hvordan får string fungerer, tildeler en eller annen måte en 769 00:33:58,520 --> 00:34:00,480 array som sannsynligvis ser litt som dette. 770 00:34:00,480 --> 00:34:05,390 H-E-L-L-O, null skråstrek. 771 00:34:05,390 --> 00:34:09,510 >> La oss anta at dette er adressen 123 bare første konsistens. 772 00:34:09,510 --> 00:34:13,000 Så får streng avkastning, i markerte linjen der, returnerer den 773 00:34:13,000 --> 00:34:15,000 nummer vi sa, 123. 774 00:34:15,000 --> 00:34:17,420 Så hva går egentlig innsiden av s her? 775 00:34:17,420 --> 00:34:26,590 >> Vel, hva går egentlig innsiden av s er 123. 776 00:34:26,590 --> 00:34:29,250 Men ærlig talt, jeg får litt forvirret av alle disse adressene, 777 00:34:29,250 --> 00:34:30,320 alle disse vilkårlige tall. 778 00:34:30,320 --> 00:34:32,290 123, 124, 127.. 779 00:34:32,290 --> 00:34:34,570 Så la oss faktisk forenkle verden litt. 780 00:34:34,570 --> 00:34:38,800 >> Når vi snakker om pekere, ærlig, til oss mennesker, hvem pokker bryr seg hvor 781 00:34:38,800 --> 00:34:39,870 ting er i minnet? 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 å avhenge av hvordan mye RAM brukeren har. 784 00:34:43,370 --> 00:34:46,590 Det kommer til å avhenge av når på dagen du kjører programmet, kanskje, og 785 00:34:46,590 --> 00:34:48,250 hva innspill brukeren gir deg. 786 00:34:48,250 --> 00:34:50,060 Vi er dvele ved uviktige detaljer. 787 00:34:50,060 --> 00:34:54,230 >> Så la oss abstrakt bort og si at, når du kjører en linje med kode som dette, 788 00:34:54,230 --> 00:34:57,320 røye stjerners s blir avkastningen Verdien av get streng. 789 00:34:57,320 --> 00:35:02,720 Hvorfor kan ikke vi i stedet bare tegne hva vi holde ringer en peker som om det er 790 00:35:02,720 --> 00:35:04,140 peker på noe? 791 00:35:04,140 --> 00:35:07,000 Så jeg hevder nå at s opp det er en peker - 792 00:35:07,000 --> 00:35:08,480 under panseret er det en adresse. 793 00:35:08,480 --> 00:35:11,330 Men det er bare å peke på første byte i 794 00:35:11,330 --> 00:35:12,780 strengen som er blitt returnert. 795 00:35:12,780 --> 00:35:16,710 >> Hvis jeg nå tilbake til koden her, hva som skjer på denne linjen? 796 00:35:16,710 --> 00:35:20,020 Vel, i dette markerte linjen nå, Jeg erklære tydeligvis en annen 797 00:35:20,020 --> 00:35:21,070 variabel kalt t. 798 00:35:21,070 --> 00:35:25,700 Men det er også en peker, så jeg kommer å trekke det som, i teorien, er den nøyaktige 799 00:35:25,700 --> 00:35:26,710 samme størrelse boks. 800 00:35:26,710 --> 00:35:28,160 Og jeg kommer til å kalle det t. 801 00:35:28,160 --> 00:35:33,500 >> Og nå går vi tilbake til koden på nytt, når jeg lagrer s innsiden av t, 802 00:35:33,500 --> 00:35:36,920 hva er jeg teknisk sette innsiden av t? 803 00:35:36,920 --> 00:35:39,350 Vel teknisk sett, dette var antallet 123.. 804 00:35:39,350 --> 00:35:42,270 Så egentlig jeg burde skrive nummer 123 der. 805 00:35:42,270 --> 00:35:43,900 Men la oss ta det høyere nivå. 806 00:35:43,900 --> 00:35:48,090 t, om det er bare en peker, intuitivt, er nettopp det. 807 00:35:48,090 --> 00:35:49,800 Det er alt det er å være lagret der. 808 00:35:49,800 --> 00:35:54,970 >> Så nå i de siste interessante linjer av koden, når jeg faktisk gå om 809 00:35:54,970 --> 00:36:00,680 utnytte null karakter i t, hva skjer? 810 00:36:00,680 --> 00:36:06,310 Vel, t brakett null nå peker i hvilken karakter, formodentlig? 811 00:36:06,310 --> 00:36:07,460 >> Den peker til h. 812 00:36:07,460 --> 00:36:08,870 Fordi t brakett null - 813 00:36:08,870 --> 00:36:12,490 husker, er dette gamle syntaks. t brakett null betyr bare hvis t er en streng, t 814 00:36:12,490 --> 00:36:15,590 brakett null betyr å få null karakter i denne styrken. 815 00:36:15,590 --> 00:36:18,650 Så hva som virkelig betyr er å gå til denne 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 forhold, huske. 818 00:36:22,790 --> 00:36:25,640 Når du snakker om en matrise, har vi fordelen av å snakke om 819 00:36:25,640 --> 00:36:27,000 relative indekser. 820 00:36:27,000 --> 00:36:31,120 >> Og så nå kan vi bare anta at t brakett null er h. 821 00:36:31,120 --> 00:36:35,090 Så hvis jeg kaller to øverste på det, hva som er egentlig gjør er å utnytte 822 00:36:35,090 --> 00:36:38,290 små bokstaver h til store bokstaver H. Men selvfølgelig, det er s? 823 00:36:38,290 --> 00:36:41,010 Den peker til den samme darn streng. 824 00:36:41,010 --> 00:36:44,200 >> Så dette er alt som har skjedd i denne koden så langt. 825 00:36:44,200 --> 00:36:45,960 Så hva er da konsekvensen? 826 00:36:45,960 --> 00:36:48,300 Hvordan løser vi disse to problemene? 827 00:36:48,300 --> 00:36:50,870 Hvordan sammenligner vi til faktiske strenger? 828 00:36:50,870 --> 00:36:53,720 >> Vel intuitivt, hvordan ville du går om å sammenligne to 829 00:36:53,720 --> 00:36:55,090 strenger for ekte likestilling? 830 00:36:55,090 --> 00:36:58,920 831 00:36:58,920 --> 00:37:00,750 >> Hva betyr det hvis to strenger er like? 832 00:37:00,750 --> 00:37:04,330 Åpenbart ikke at deres adresser er lik i minnet, fordi det er en lav 833 00:37:04,330 --> 00:37:06,590 nivå implementering detaljer. 834 00:37:06,590 --> 00:37:08,360 Alle karakterene er de samme. 835 00:37:08,360 --> 00:37:12,810 Så la meg foreslå, og la meg introdusere i en versjon av 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 >> La meg foreslå at vi fortsatt får en pekeren kalt s, og butikk i det 838 00:37:19,590 --> 00:37:20,610 returnere verdien av get streng. 839 00:37:20,610 --> 00:37:21,750 La oss gjøre det samme med t. 840 00:37:21,750 --> 00:37:23,230 Så ingen av koden er forskjellig. 841 00:37:23,230 --> 00:37:25,420 Jeg kommer til å legge litt mer feilsjekking nå. 842 00:37:25,420 --> 00:37:29,390 Så nå som vi er liksom peeling tilbake dette lag i CS50 av hva en streng 843 00:37:29,390 --> 00:37:33,520 faktisk er, må vi være mer anal om å gjøre at vi ikke misbruker 844 00:37:33,520 --> 00:37:35,330 ugyldige verdier som null. 845 00:37:35,330 --> 00:37:36,440 >> Så jeg skal bare sjekke. 846 00:37:36,440 --> 00:37:41,490 Hvis s er ikke lik null og t ikke lik null, betyr at vi er OK. 847 00:37:41,490 --> 00:37:44,460 Får streng ikke skru opp med å få noen av disse strenger. 848 00:37:44,460 --> 00:37:51,270 Og du kan kanskje gjette nå, hva ikke STR CMP antagelig gjø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 program i java før, dette er som tilsvarer metoden i 851 00:37:55,470 --> 00:37:56,490 string klassen. 852 00:37:56,490 --> 00:37:57,890 Men for de av dere som ikke har programmert før, 853 00:37:57,890 --> 00:37:59,320 dette er bare en c-funksjon. 854 00:37:59,320 --> 00:38:02,180 Det skjer for å komme i en fil som heter string.h. 855 00:38:02,180 --> 00:38:03,830 Det er der den er deklarert. 856 00:38:03,830 --> 00:38:05,110 >> Og streng sammenligne - 857 00:38:05,110 --> 00:38:07,530 Jeg glemmer faktisk at bruken, men aldri tankene som. 858 00:38:07,530 --> 00:38:10,470 Husker at vi kan gjøre mann, rør sammenligne. 859 00:38:10,470 --> 00:38:12,590 Og dette kommer til å få opp Linux programmerere manuell. 860 00:38:12,590 --> 00:38:14,060 Og det er, ærlig, litt kryptisk. 861 00:38:14,060 --> 00:38:15,270 Men jeg ser her at, ja. 862 00:38:15,270 --> 00:38:17,570 Jeg må inkludere string.h. 863 00:38:17,570 --> 00:38:20,590 >> Og det står her i henhold til beskrivelse, "the string Sammenligningsfunksjon sammenligner 864 00:38:20,590 --> 00:38:24,560 de to strengene S1 og S2. "Og S1 og S2 er tilsynelatende de to 865 00:38:24,560 --> 00:38:26,120 argumenter gått i. 866 00:38:26,120 --> 00:38:28,650 Jeg vet egentlig ikke huske hva konst er, men nå merker - 867 00:38:28,650 --> 00:38:31,480 og du har kanskje sett dette allerede når du har bruker man-sidene hvis du 868 00:38:31,480 --> 00:38:32,390 få alt - 869 00:38:32,390 --> 00:38:36,220 at røye stjernen er bare synonymt med hyssing. 870 00:38:36,220 --> 00:38:40,440 >> Så det sammenligner de to strenger, S1 og S2, og den returnerer et heltall mindre 871 00:38:40,440 --> 00:38:44,930 enn eller lik eller større enn null hvis S1 blir funnet, henholdsvis, for å være 872 00:38:44,930 --> 00:38:47,450 mindre enn, eller like, eller være større enn S2. 873 00:38:47,450 --> 00:38:51,220 Det er bare en veldig kompleks måte å si strengen sammenligne avkastning 874 00:38:51,220 --> 00:38:55,760 null hvis to strenger er intuitivt identiske, tegnet 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 tall hvis s, alfabetisk, er ment 877 00:38:59,970 --> 00:39:01,010 å komme før t. 878 00:39:01,010 --> 00:39:05,300 Eller returnerer et positivt tall hvis s er ment å komme etter t 879 00:39:05,300 --> 00:39:06,170 alfabetisk. 880 00:39:06,170 --> 00:39:08,360 Så med denne enkle funksjonen, kan du for eksempel sortere en 881 00:39:08,360 --> 00:39:09,770 hel haug med ord? 882 00:39:09,770 --> 00:39:13,984 >> Så i denne nye versjonen, kommer jeg til å gå videre og gjøre compare1. 883 00:39:13,984 --> 00:39:15,750 Dot slash sammenligne en. 884 00:39:15,750 --> 00:39:18,030 Jeg skal skrive hei på alle små bokstaver. 885 00:39:18,030 --> 00:39:20,300 Jeg kommer til å skrive hei i små bokstaver igjen. 886 00:39:20,300 --> 00:39:23,340 Og heldigvis nå det innser Jeg skrev det samme. 887 00:39:23,340 --> 00:39:27,520 >> I mellomtiden, hvis jeg skriver i Hallo i nedre saken og HELLO stor bokstav og 888 00:39:27,520 --> 00:39:29,710 sammenligne dem, skrev jeg forskjellige ting. 889 00:39:29,710 --> 00:39:32,530 Fordi ikke bare er adressene forskjellige, men vi sammenligner 890 00:39:32,530 --> 00:39:35,350 forskjellige tegn igjen og igjen. 891 00:39:35,350 --> 00:39:37,320 >> Vel la oss gå og fikse en andre problemet nå. 892 00:39:37,320 --> 00:39:41,590 La meg åpne opp en versjon av kopi, som nå adresserer 893 00:39:41,590 --> 00:39:42,900 dette problemet følger. 894 00:39:42,900 --> 00:39:45,650 Og dette kommer til å se litt mer komplisert. 895 00:39:45,650 --> 00:39:49,320 Men hvis du tenker på hva problemet vi trenger for å løse, forhåpentligvis vil dette være 896 00:39:49,320 --> 00:39:51,870 klart i løpet av et øyeblikk nå. 897 00:39:51,870 --> 00:39:57,280 >> Så denne første linjen, røye start t, i lekmann vilkår kan noen foreslå 898 00:39:57,280 --> 00:39:59,450 hva denne linjen her betyr? 899 00:39:59,450 --> 00:40:01,050 Char stjerners t, hva er det du gjø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 Lage en peker til noen plass i minnet. 903 00:40:09,500 --> 00:40:10,930 Og la meg avgrense det litt. 904 00:40:10,930 --> 00:40:17,180 Deklarere en variabel som vil lagre Adressen noen char i minnet, men bare 905 00:40:17,180 --> 00:40:18,480 å være litt mer riktig. 906 00:40:18,480 --> 00:40:21,210 >> OK, så nå på høyre side, har jeg aldri sett én av disse funksjonene 907 00:40:21,210 --> 00:40:22,660 før, malloc. 908 00:40:22,660 --> 00:40:26,980 Men hva kan det bety? 909 00:40:26,980 --> 00:40:28,050 Tildeling av minne. 910 00:40:28,050 --> 00:40:29,410 Minnetildelingen. 911 00:40:29,410 --> 00:40:33,050 >> Så det viser seg, frem til nå, vi har egentlig ikke hatt en effektiv måte 912 00:40:33,050 --> 00:40:36,210 spør operativsystemet, gi meg noe minne. 913 00:40:36,210 --> 00:40:39,980 Snarere har vi nå en funksjon som heter malloc som gjør akkurat det. 914 00:40:39,980 --> 00:40:42,960 Selv om dette er litt av en distraksjon akkurat nå, merker at i 915 00:40:42,960 --> 00:40:46,200 mellom de to parenteser bare kommer til å være ett nummer. 916 00:40:46,200 --> 00:40:48,510 Der jeg har skrevet i spørsmålet merker kan være et tall. 917 00:40:48,510 --> 00:40:51,020 >> Og at antallet betyr, gi meg 10 bytes. 918 00:40:51,020 --> 00:40:52,320 Gi meg 20 bytes. 919 00:40:52,320 --> 00:40:53,820 Gi meg 100 bytes. 920 00:40:53,820 --> 00:40:56,500 Og malloc vil gjøre sitt beste for å spør operativsystemet - 921 00:40:56,500 --> 00:40:57,630 Linux, i dette tilfellet - 922 00:40:57,630 --> 00:40:59,630 hei, er deres 100 bytes RAM tilgjengelig? 923 00:40:59,630 --> 00:41:04,320 I så fall returnere disse byte til meg av returnere adressen til hvilken av 924 00:41:04,320 --> 00:41:06,610 disse bytes, kanskje? 925 00:41:06,610 --> 00:41:07,610 Den aller første. 926 00:41:07,610 --> 00:41:10,460 >> Så her også - og dette er dominerende i C, helst du er 927 00:41:10,460 --> 00:41:11,680 arbeider med adresser? 928 00:41:11,680 --> 00:41:15,830 Du er nesten alltid arbeider med først slik adresse, uansett hvor stor 929 00:41:15,830 --> 00:41:19,490 en del av minnet du blir leveres tilbake, så å si. 930 00:41:19,490 --> 00:41:20,880 >> Så la oss dykke inn her. 931 00:41:20,880 --> 00:41:23,940 Jeg prøver å fordele hvordan mange bytes, egentlig? 932 00:41:23,940 --> 00:41:24,080 Vel. 933 00:41:24,080 --> 00:41:26,090 String lengden på s - la oss gjøre et konkret eksempel. 934 00:41:26,090 --> 00:41:30,700 Hvis s er hallo, H-E-L-L-O, hva er hyssinglengde på s, selvsagt? 935 00:41:30,700 --> 00:41:32,010 Så det er fem. 936 00:41:32,010 --> 00:41:34,590 Men jeg gjør et pluss en på det, hvorfor? 937 00:41:34,590 --> 00:41:37,700 Hvorfor ønsker jeg 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 å forlate av dette spesiell null tegn. 940 00:41:41,210 --> 00:41:45,160 Fordi hvis jeg lager en kopi av Hei og bare gjøre H-E-L-L-O, men jeg legger ikke 941 00:41:45,160 --> 00:41:50,160 den spesielle karakter, datamaskinen kanskje ikke har, ved en tilfeldighet, en skråstrek 942 00:41:50,160 --> 00:41:51,730 null der for meg. 943 00:41:51,730 --> 00:41:55,570 Og så hvis jeg prøver å finne ut av lengden på kopien, kan jeg tenke at 944 00:41:55,570 --> 00:41:59,360 det er 20 tegn, eller en million tegn hvis jeg bare aldri skje 945 00:41:59,360 --> 00:42:01,050 å treffe en omvendt skråstrek null. 946 00:42:01,050 --> 00:42:05,780 >> Så vi trenger seks bytes til å lagre H-E-L-L-O, null skråstrek. 947 00:42:05,780 --> 00:42:07,870 Og så dette er bare å være super anal. 948 00:42:07,870 --> 00:42:10,700 Anta at jeg glemmer hva på størrelse med en røye er. 949 00:42:10,700 --> 00:42:12,020 Vi holder å si det én byte. 950 00:42:12,020 --> 00:42:12,860 Og det er vanligvis. 951 00:42:12,860 --> 00:42:15,425 I teorien kan det være noe forskjellige, på en annen Mac eller en 952 00:42:15,425 --> 00:42:16,250 annen PC. 953 00:42:16,250 --> 00:42:19,650 >> Så det viser seg at det er denne operatøren kalt sizeof at hvis du passerer den 954 00:42:19,650 --> 00:42:22,680 navnet på en datatype - som røye, eller int eller float - 955 00:42:22,680 --> 00:42:26,930 den vil fortelle deg, dynamisk, hvor mange byte en røye tar opp dette 956 00:42:26,930 --> 00:42:28,090 bestemt datamaskin. 957 00:42:28,090 --> 00:42:31,360 >> Så dette er effektivt bare som å si ganger en eller 958 00:42:31,360 --> 00:42:32,440 ganger ingenting i det hele tatt. 959 00:42:32,440 --> 00:42:36,340 Men jeg gjør det bare for å være super anal, at bare i tilfelle en røye skiller seg 960 00:42:36,340 --> 00:42:40,610 på datamaskinen versus mine, på denne måten regnestykket er alltid kommer til å sjekke ut. 961 00:42:40,610 --> 00:42:43,720 >> Til slutt, her nede jeg sjekke for null, som alltid er god praksis - igjen, 962 00:42:43,720 --> 00:42:44,920 helst vi har med pekere. 963 00:42:44,920 --> 00:42:47,520 Hvis malloc var ikke i stand til å gi me seks byes - som er 964 00:42:47,520 --> 00:42:49,210 usannsynlig, men bare i tilfelle - 965 00:42:49,210 --> 00:42:50,730 tilbake en gang. 966 00:42:50,730 --> 00:42:53,290 Og nå, gå videre og kopiere strengen som følger. 967 00:42:53,290 --> 00:42:57,240 Og dette er kjent syntaks, om enn i en annen rolle. 968 00:42:57,240 --> 00:43:01,210 >> Jeg kommer til å gå videre og få strengen lengden på s og lagre den i n. 969 00:43:01,210 --> 00:43:06,620 Jeg deretter skal iterere fra i lik null opp til og med n, 970 00:43:06,620 --> 00:43:08,410 større enn eller lik. 971 00:43:08,410 --> 00:43:13,540 Slik at på hver iterasjon, satte jeg ed karakter av s i den i-te 972 00:43:13,540 --> 00:43:15,380 karakter av t. 973 00:43:15,380 --> 00:43:18,190 >> Så hva som egentlig skjer under panseret her? 974 00:43:18,190 --> 00:43:22,140 Vel hvis dette for eksempel er s - 975 00:43:22,140 --> 00:43:26,400 og jeg har skrevet i ordet H-E-L-L-O og det er en omvendt skråstrek null. 976 00:43:26,400 --> 00:43:29,020 Og igjen, dette er s peker her. 977 00:43:29,020 --> 00:43:30,830 Og her er nå t. 978 00:43:30,830 --> 00:43:34,860 >> Og dette peker nå til en kopi av minne, ikke sant? 979 00:43:34,860 --> 00:43:37,340 Malloc har gitt meg en hel del av minnet. 980 00:43:37,340 --> 00:43:41,440 Jeg vet ikke i utgangspunktet hva som er i noen av disse stedene. 981 00:43:41,440 --> 00:43:44,340 Så jeg kommer til å tenke på disse som en hel haug med spørsmålstegn. 982 00:43:44,340 --> 00:43:50,190 >> Men så snart jeg starter looping fra null på opp gjennom lengden av S, T 983 00:43:50,190 --> 00:43:52,790 brakett null og t trinn 1 - 984 00:43:52,790 --> 00:43:55,080 og jeg skal sette dette nå på overhead - 985 00:43:55,080 --> 00:44:04,190 t brakett null og s brakett null betyr at jeg kommer til å bli kopiert 986 00:44:04,190 --> 00:44:09,875 iterativt t på her, E-L-L-O. Plus, fordi jeg gjorde pluss 987 00:44:09,875 --> 00:44:12,370 1, null backslash. 988 00:44:12,370 --> 00:44:19,060 >> Så nå når det gjelder sammenligne-1.c, til slutt, hvis jeg skrive ut 989 00:44:19,060 --> 00:44:24,760 kapitalisering av t, bør vi se at s er uendret. 990 00:44:24,760 --> 00:44:26,090 La meg gå videre nå og gjøre dette. 991 00:44:26,090 --> 00:44:28,630 Så gjør Kopi1. 992 00:44:28,630 --> 00:44:30,860 Dot slash Kopi1. 993 00:44:30,860 --> 00:44:33,670 Jeg kommer til å skrive hallo, Enter. 994 00:44:33,670 --> 00:44:37,430 Og nå legger merke til, bare kopien er balanseført. 995 00:44:37,430 --> 00:44:40,890 Fordi jeg virkelig har to biter av minnet. 996 00:44:40,890 --> 00:44:44,390 >> Dessverre kan du gjøre noen ganske dårlige og ganske farlig ting her. 997 00:44:44,390 --> 00:44:49,290 La meg trekke opp et eksempel her nå, som gir oss et eksempel på et par 998 00:44:49,290 --> 00:44:51,540 forskjellige linjer. 999 00:44:51,540 --> 00:44:56,040 Så bare intuitivt her, den første linjen av koden, er int stjerne x, erklærte 1000 00:44:56,040 --> 00:44:57,340 en variabel kalt x. 1001 00:44:57,340 --> 00:44:58,810 Og hva er datatype av denne variabelen? 1002 00:44:58,810 --> 00:45:01,820 1003 00:45:01,820 --> 00:45:04,290 Hva er data type som 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å hva betyr det? x vil lagre adressen til en int. 1007 00:45:12,600 --> 00:45:13,520 Enkelt som det. 1008 00:45:13,520 --> 00:45:16,220 Y kommer til å lagre adressen til en int. 1009 00:45:16,220 --> 00:45:18,390 Hva er den tredje linjen av koden gjør det? 1010 00:45:18,390 --> 00:45:21,850 Det er tildeling av hvor mange bytes, mest sannsynlig? 1011 00:45:21,850 --> 00:45:22,350 Fire. 1012 00:45:22,350 --> 00:45:25,460 På grunn av størrelsen på en int er vanligvis fire, gir malloc av fire 1013 00:45:25,460 --> 00:45:29,950 meg tilbake adressen til en del av hukommelse, er den første av hvis byte 1014 00:45:29,950 --> 00:45:32,110 lagres nå i x. 1015 00:45:32,110 --> 00:45:34,410 >> Nå beveger vi oss litt raskt. 1016 00:45:34,410 --> 00:45:35,760 Stjerners x betyr hva? 1017 00:45:35,760 --> 00:45:38,480 1018 00:45:38,480 --> 00:45:42,590 Det betyr gå til den adressen og sette hvilket nummer det? 1019 00:45:42,590 --> 00:45:43,870 Sett nummer 42 der. 1020 00:45:43,870 --> 00:45:47,590 Stjerners y betyr gå til hva som står på y og sette nummer 13 der. 1021 00:45:47,590 --> 00:45:48,600 >> Men vent litt. 1022 00:45:48,600 --> 00:45:51,640 Hva er i y for øyeblikket? 1023 00:45:51,640 --> 00:45:54,950 Hvilken adresse er y lagring? 1024 00:45:54,950 --> 00:45:55,770 Vi vet ikke, ikke sant? 1025 00:45:55,770 --> 00:45:59,230 Vi har aldri en gang bruke oppdraget operatør involverer y. 1026 00:45:59,230 --> 00:46:03,370 Så y som erklærte på den andre linjen på Koden er bare noen søppel verdi, en stor 1027 00:46:03,370 --> 00:46:04,760 spørsmålstegn så å si. 1028 00:46:04,760 --> 00:46:07,230 Det kan peke tilfeldig til noe i minne, som 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 treffer den linjen der, stjerners y er lik 13, noe dårlig, 1031 00:46:13,540 --> 00:46:17,220 noe veldig dårlig er i ferd å skje med Binky. 1032 00:46:17,220 --> 00:46:25,810 Så la oss se hva som kommer til å ende opp skjer med Binky her i dette øyeblikk 1033 00:46:25,810 --> 00:46:26,200 eller så ser. 1034 00:46:26,200 --> 00:46:26,490 >> [VIDEOAVSPILLING] 1035 00:46:26,490 --> 00:46:26,745 >> -Hei, Binky. 1036 00:46:26,745 --> 00:46:27,000 Våkn opp. 1037 00:46:27,000 --> 00:46:29,296 Det er tid for pekeren moro. 1038 00:46:29,296 --> 00:46:30,680 >> -Hva er det? 1039 00:46:30,680 --> 00:46:31,980 Lær om pekere? 1040 00:46:31,980 --> 00:46:34,010 Oh, goodie. 1041 00:46:34,010 --> 00:46:37,220 >> -Vel, for å komme i gang, tror jeg vi er kommer til å trenge et par pekere. 1042 00:46:37,220 --> 00:46:37,930 >> -OK. 1043 00:46:37,930 --> 00:46:41,650 Denne koden tildeler to pekere som kan vise til heltall. 1044 00:46:41,650 --> 00:46:43,760 >> -OK, vel, jeg ser de to pekere. 1045 00:46:43,760 --> 00:46:45,850 Men de synes ikke å være peke på noe. 1046 00:46:45,850 --> 00:46:46,490 >> -Det er riktig. 1047 00:46:46,490 --> 00:46:48,630 I utgangspunktet pekere ikke peke på noe. 1048 00:46:48,630 --> 00:46:51,700 De tingene de peker til er kalt pointees, og sette dem opp er en 1049 00:46:51,700 --> 00:46:52,850 separat trinn. 1050 00:46:52,850 --> 00:46:53,740 >> -Oh, høyre, høyre. 1051 00:46:53,740 --> 00:46:54,500 Jeg visste det. 1052 00:46:54,500 --> 00:46:56,270 De pointees er atskilt. 1053 00:46:56,270 --> 00:46:58,553 Så hvordan du øremerke en pointee? 1054 00:46:58,553 --> 00:46:59,480 >> -OK. 1055 00:46:59,480 --> 00:47:03,707 Vel, tildeler denne koden ny heltall pointee, og denne delen setter x 1056 00:47:03,707 --> 00:47:05,520 å peke på det. 1057 00:47:05,520 --> 00:47:06,760 >> -Hei, ser at bedre. 1058 00:47:06,760 --> 00:47:08,520 Så gjør det ikke noe. 1059 00:47:08,520 --> 00:47:09,530 >> -OK. 1060 00:47:09,530 --> 00:47:14,110 Jeg skal dereference pekeren x for å lagre nummer 42 i pointee sin. 1061 00:47:14,110 --> 00:47:17,660 For dette trikset, jeg trenger min magi tryllestav av dereferencing. 1062 00:47:17,660 --> 00:47:20,695 >> -Din tryllestav av dereferencing? 1063 00:47:20,695 --> 00:47:22,632 Uh, det er flott. 1064 00:47:22,632 --> 00:47:24,620 >> -Dette er hva koden ser ut. 1065 00:47:24,620 --> 00:47:27,526 Jeg skal bare sette opp nummeret, og - 1066 00:47:27,526 --> 00:47:28,250 >> -Hei, se. 1067 00:47:28,250 --> 00:47:29,680 Det det går. 1068 00:47:29,680 --> 00:47:34,520 Så gjør en dereference på x følger pilen for å få tilgang til pointee. 1069 00:47:34,520 --> 00:47:36,690 I dette tilfellet, for å lagre 42 i der. 1070 00:47:36,690 --> 00:47:40,890 Hei, prøv å bruke den til å lagre nummeret 13 gjennom den andre pekeren, y. 1071 00:47:40,890 --> 00:47:42,125 >> -OK. 1072 00:47:42,125 --> 00:47:46,810 Jeg skal bare gå over her til y og får nummer 13 satt opp. 1073 00:47:46,810 --> 00:47:50,890 Og deretter ta staven av dereferencing og bare - 1074 00:47:50,890 --> 00:47:52,430 Jøss! 1075 00:47:52,430 --> 00:47:53,030 >> -Oh, hey. 1076 00:47:53,030 --> 00:47:54,610 Som ikke fungerte. 1077 00:47:54,610 --> 00:47:58,200 Si, Binky, jeg tror ikke det dereferencing y er en god idé, 1078 00:47:58,200 --> 00:48:01,370 fordi sette opp pointee er et separat trinn. 1079 00:48:01,370 --> 00:48:03,460 Og jeg tror ikke vi noen gang gjorde det. 1080 00:48:03,460 --> 00:48:03,810 >> -Hmm. 1081 00:48:03,810 --> 00:48:05,160 Godt poeng. 1082 00:48:05,160 --> 00:48:07,410 >> -Ja, bevilget vi pekeren y. 1083 00:48:07,410 --> 00:48:10,045 Men vi har aldri sett den til peke på en pointee. 1084 00:48:10,045 --> 00:48:10,490 >> -Hmm. 1085 00:48:10,490 --> 00:48:12,170 Veldig observant. 1086 00:48:12,170 --> 00:48:13,790 >> -Hei, du ser bra der, Binky. 1087 00:48:13,790 --> 00:48:16,920 Kan du fikse det slik at y poeng til den samme pointee som X? 1088 00:48:16,920 --> 00:48:17,810 >> -Jada. 1089 00:48:17,810 --> 00:48:20,300 Jeg skal bruke min tryllestav av pekeren oppdrag. 1090 00:48:20,300 --> 00:48:22,240 >> -Er det kommer til å bli en problem som før? 1091 00:48:22,240 --> 00:48:22,665 >> -Nei. 1092 00:48:22,665 --> 00:48:24,300 Dette berører ikke de pointees. 1093 00:48:24,300 --> 00:48:27,880 Det endrer bare én pekeren å peke til det samme som et annet. 1094 00:48:27,880 --> 00:48:28,970 >> -Oh, ser jeg. 1095 00:48:28,970 --> 00:48:31,730 Nå y peker til samme sted som x. 1096 00:48:31,730 --> 00:48:32,450 Så vent. 1097 00:48:32,450 --> 00:48:33,490 Nå y er 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 prøve tryllestaven av dereferencing igjen 1100 00:48:36,520 --> 00:48:39,200 å sende den 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 >> -Hei, se på det. 1104 00:48:42,870 --> 00:48:44,320 Nå dereferencing fungerer på y. 1105 00:48:44,320 --> 00:48:47,020 Og fordi pekere deler at 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 Deling. 1109 00:48:49,670 --> 00:48:50,380 Uansett. 1110 00:48:50,380 --> 00:48:52,290 Så skal vi bytter plass nå? 1111 00:48:52,290 --> 00:48:52,970 >> -Å, se. 1112 00:48:52,970 --> 00:48:54,150 Vi har ikke mer tid. 1113 00:48:54,150 --> 00:48:55,200 >> -Men - 1114 00:48:55,200 --> 00:48:57,060 >> -Bare husk de tre pekeren regler. 1115 00:48:57,060 --> 00:49:00,100 Nummer en, den grunnleggende struktur er at du har en peker. 1116 00:49:00,100 --> 00:49:02,170 Og den peker over til en pointee. 1117 00:49:02,170 --> 00:49:04,160 Men pekeren og pointee er separate. 1118 00:49:04,160 --> 00:49:06,460 Og den vanligste feilen er å sette opp en peker, men til 1119 00:49:06,460 --> 00:49:08,540 glem å gitt en pointee. 1120 00:49:08,540 --> 00:49:12,460 >> Nummer to, begynner pekeren dereferencing på pekeren og følger sin 1121 00:49:12,460 --> 00:49:14,570 pilen over for å få tilgang til pointee. 1122 00:49:14,570 --> 00:49:18,640 Som vi alle vet, dette fungerer bare hvis det er en pointee, som kommer tilbake til 1123 00:49:18,640 --> 00:49:19,790 regel nummer én. 1124 00:49:19,790 --> 00:49:23,670 >> Nummer tre, tar pekeren oppdrag én pekeren og endringer det å peke på 1125 00:49:23,670 --> 00:49:25,850 samme pointee som en annen pekeren. 1126 00:49:25,850 --> 00:49:27,840 Så etter oppdraget, de to pekere vil 1127 00:49:27,840 --> 00:49:29,430 peke på den samme pointee. 1128 00:49:29,430 --> 00:49:31,600 Noen ganger som heter deling. 1129 00:49:31,600 --> 00:49:33,430 Og det er alt som skal til, egentlig. 1130 00:49:33,430 --> 00:49:33,840 Bye bye nå. 1131 00:49:33,840 --> 00:49:34,300 >> [END VIDEOAVSPILLING] 1132 00:49:34,300 --> 00:49:36,940 >> DAVID MALAN: Så mer på pekere, mer på Binky neste uke. 1133 00:49:36,940 --> 00:49:38,190 Vi ser deg på mandag. 1134 00:49:38,190 --> 00:49:42,187