1 00:00:00,000 --> 00:00:06,030 >> [Glazbom] 2 00:00:06,030 --> 00:00:08,390 >> Doug LLOYD: pointeri, ovdje smo. 3 00:00:08,390 --> 00:00:11,080 To je vjerojatno će biti najteža tema 4 00:00:11,080 --> 00:00:12,840 da govorimo o u CS50. 5 00:00:12,840 --> 00:00:15,060 A ako ste pročitali ništa o pokazivače 6 00:00:15,060 --> 00:00:19,080 prije nego što bi moglo biti malo zastrašujuće ide u ovaj video. 7 00:00:19,080 --> 00:00:21,260 Istina je da upućuje ne dopuštaju vam mogućnost 8 00:00:21,260 --> 00:00:23,740 da možda zeznuti prilično loše kada ste 9 00:00:23,740 --> 00:00:27,450 rad s varijablama, i podataka, i uzrokuje vaš program za sudar. 10 00:00:27,450 --> 00:00:30,490 Ali oni su zapravo jako korisni a oni nam doista sjajan način omogućuju 11 00:00:30,490 --> 00:00:33,340 proći podatke natrag i naprijed između funkcija, 12 00:00:33,340 --> 00:00:35,490 da smo na neki drugi način ne može učiniti. 13 00:00:35,490 --> 00:00:37,750 >> I tako ono što mi stvarno želim učiniti ovdje je vlak 14 00:00:37,750 --> 00:00:41,060 da imaju dobar pokazivač discipline, pa koje mogu učinkovito koristiti naputke 15 00:00:41,060 --> 00:00:43,850 kako bi svoje programe koji puno bolje. 16 00:00:43,850 --> 00:00:48,220 Kao što sam rekao naputke daju nam drugačije način da prođe podataka između funkcija. 17 00:00:48,220 --> 00:00:50,270 Sada, ako se sjećate iz ranije videa, kada 18 00:00:50,270 --> 00:00:53,720 smo razgovarali o varijabla opseg, što sam spomenuo 19 00:00:53,720 --> 00:01:00,610 da su svi podaci koje prolazimo između funkcije u C donosi vrijednost. 20 00:01:00,610 --> 00:01:03,070 A ja ne mogu imati koristi koje pojam, ono što sam mislio tamo 21 00:01:03,070 --> 00:01:07,170 je da smo prolazeći kopije podataka. 22 00:01:07,170 --> 00:01:12,252 Kada prolazimo varijablu na funkciju, nismo zapravo prolazi varijablu 23 00:01:12,252 --> 00:01:13,210 na funkciju, zar ne? 24 00:01:13,210 --> 00:01:17,670 Mi prolazi kopiju da su podaci u funkciji. 25 00:01:17,670 --> 00:01:20,760 Funkcija čini ono što hoće a izračunava neku vrijednost, 26 00:01:20,760 --> 00:01:23,180 a možda mi koristimo tu vrijednost kada ga vraća. 27 00:01:23,180 --> 00:01:26,700 >> Tu je jedna iznimka ovo pravilo prolazi vrijednosti, 28 00:01:26,700 --> 00:01:31,210 a mi ćemo se vratiti na ono koje je malo kasnije u ovom videu. 29 00:01:31,210 --> 00:01:34,880 Ako koristimo pokazivače umjesto korištenja varijabli, 30 00:01:34,880 --> 00:01:38,180 ili umjesto korištenja varijable sami ili kopije varijabli, 31 00:01:38,180 --> 00:01:43,790 sada možemo proći varijable oko između funkcije u jedan drugačiji način. 32 00:01:43,790 --> 00:01:46,550 To znači da, ako ćemo napraviti promjena u jednoj funkciji, 33 00:01:46,550 --> 00:01:49,827 ta promjena zapravo će potrajati učinak na različite funkcije. 34 00:01:49,827 --> 00:01:52,160 Opet, to je nešto što nismo mogli učiniti ranije, 35 00:01:52,160 --> 00:01:56,979 a ako ste ikad pokušali mijenjati vrijednost dviju varijabli u funkciji, 36 00:01:56,979 --> 00:01:59,270 ste primijetili ovaj problem vrsta puzanje gore, zar ne? 37 00:01:59,270 --> 00:02:04,340 >> Ako želimo mijenjati X i Y, i tako ćemo proći ih na funkciju zove swap, 38 00:02:04,340 --> 00:02:08,680 unutar funkcije swap varijable napraviti razmjenu vrijednosti. 39 00:02:08,680 --> 00:02:12,600 Jedan postaje dva, dva postaje jedan, ali mi zapravo ne 40 00:02:12,600 --> 00:02:16,890 promijeniti ništa u izvorniku funkcija, u pozivatelja. 41 00:02:16,890 --> 00:02:19,550 Budući da ne možemo, mi smo samo rad s kopijama njima. 42 00:02:19,550 --> 00:02:24,760 S pokazivače ipak, možemo zapravo prolaze X i Y u funkciji. 43 00:02:24,760 --> 00:02:26,960 To je funkcija može učiniti nešto s njima. 44 00:02:26,960 --> 00:02:29,250 A oni varijable vrijednosti zapravo može promijeniti. 45 00:02:29,250 --> 00:02:33,710 Dakle, to je dosta promjena u naša sposobnost za rad s podacima. 46 00:02:33,710 --> 00:02:36,100 >> Prije nego što zaronite u pokazivače, mislim da je vrijedno 47 00:02:36,100 --> 00:02:38,580 uzimanje nekoliko minuta da povratak na osnove ovdje. 48 00:02:38,580 --> 00:02:41,000 A imaju pogled na tome memoriju računala radovi 49 00:02:41,000 --> 00:02:45,340 jer su te dvije teme idu zapravo biti prilično povezani. 50 00:02:45,340 --> 00:02:48,480 Kao što vjerojatno znate, na vašem računalnom sustavu 51 00:02:48,480 --> 00:02:51,310 imate hard disk ili možda SSD disk, 52 00:02:51,310 --> 00:02:54,430 neka vrsta mjesta za pohranu datoteka. 53 00:02:54,430 --> 00:02:57,950 To je obično negdje u susjedstvu 250 gigabajta 54 00:02:57,950 --> 00:02:59,810 da možda par terabajta sada. 55 00:02:59,810 --> 00:03:02,270 I to je mjesto gdje svi tvoj Datoteke u konačnici živjeti, 56 00:03:02,270 --> 00:03:04,870 čak i kada je računalo pričepiti off, možete ga ponovno uključite 57 00:03:04,870 --> 00:03:09,190 i naći ćete vaše datoteke su tu opet kad ponovno pokrenuti sustav. 58 00:03:09,190 --> 00:03:14,820 No, diskovi, poput tvrdog diska, HDD ili SSD disk, SSD, 59 00:03:14,820 --> 00:03:16,050 samo prostor za pohranu. 60 00:03:16,050 --> 00:03:20,400 >> Mi zapravo ne može ništa učiniti s podatak da je u tvrdom disku, 61 00:03:20,400 --> 00:03:22,080 ili u statičkom disku. 62 00:03:22,080 --> 00:03:24,950 Kako bi zapravo promijenili Podaci ili kretati, 63 00:03:24,950 --> 00:03:28,800 moramo ga premjestiti na RAM, memorija s izravnim pristupom. 64 00:03:28,800 --> 00:03:31,170 Sada RAM-a, imate mnogo manje u vaše računalo. 65 00:03:31,170 --> 00:03:34,185 Vi svibanj imati negdje u susjedstvu 512 megabajta 66 00:03:34,185 --> 00:03:38,850 Ako imate starije računalo, da možda dva, četiri, osam, 16, 67 00:03:38,850 --> 00:03:41,820 možda čak i malo više gigabajta RAM-a. 68 00:03:41,820 --> 00:03:46,390 Dakle, to je puno manji, ali to je gdje su svi hlapljivih podataka postoji. 69 00:03:46,390 --> 00:03:48,270 To je mjesto gdje možemo promijeniti stvari. 70 00:03:48,270 --> 00:03:53,350 No, kad smo okrenuti naše računalo isključeno, sve podatke u RAM-a je uništeno. 71 00:03:53,350 --> 00:03:57,150 >> Dakle, to je razlog zašto moramo imati tvrdi disk za više trajno mjesto njega, 72 00:03:57,150 --> 00:03:59,720 tako da exists- to bi biti jako loše ako svaki put smo 73 00:03:59,720 --> 00:04:03,310 Okrenuo naše računalo isključeno, svaki file u našem sustavu je izbrisan. 74 00:04:03,310 --> 00:04:05,600 Dakle, radimo u RAM. 75 00:04:05,600 --> 00:04:09,210 I svaki put kad govorimo o memorije, prilično mnogo, u CS50, 76 00:04:09,210 --> 00:04:15,080 govorimo o RAM, a ne tvrdi disk. 77 00:04:15,080 --> 00:04:18,657 >> Dakle, kad smo premjestiti stvari u memoriju, zauzima određenu količinu prostora. 78 00:04:18,657 --> 00:04:20,740 Sve vrste podataka koje smo radili s 79 00:04:20,740 --> 00:04:23,480 zauzimaju različita količine prostora u RAM. 80 00:04:23,480 --> 00:04:27,600 Dakle, svaki put ste stvorili cijeli broj promjenjive, četiri bajta memorije 81 00:04:27,600 --> 00:04:30,750 su izdvojena u RAM pa vas može raditi s tim cijeli broj. 82 00:04:30,750 --> 00:04:34,260 Možete proglasiti cijeli broj, to promijeniti, dodijeliti 83 00:04:34,260 --> 00:04:36,700 na vrijednost 10 povisuje jednim, tako dalje i tako dalje. 84 00:04:36,700 --> 00:04:39,440 Sve što treba da se desi u RAM-a, a vi dobiti četiri bajta 85 00:04:39,440 --> 00:04:42,550 raditi za svakoga broj koji ste stvorili. 86 00:04:42,550 --> 00:04:45,410 >> Svaka ti lik stvoriti dobiva jedan bajt. 87 00:04:45,410 --> 00:04:48,160 To je samo koliko prostora je potrebno pohraniti znaka. 88 00:04:48,160 --> 00:04:51,310 Svaki float, pravi broj, dobiva četiri bajta 89 00:04:51,310 --> 00:04:53,390 osim ako je bračni precizni pomičnim zarezom 90 00:04:53,390 --> 00:04:56,510 broj, koji Vam omogućuje ima preciznije ili više brojeva 91 00:04:56,510 --> 00:04:59,300 nakon decimalne točke bez gubitka preciznosti, 92 00:04:59,300 --> 00:05:01,820 koji zauzimaju osam bajtova memorije. 93 00:05:01,820 --> 00:05:06,730 Duge žudi, stvarno velika cijeli brojevi, Također zauzimaju osam bajtova memorije. 94 00:05:06,730 --> 00:05:09,000 Koliko bajta memorije Ne žice zauzimaju? 95 00:05:09,000 --> 00:05:12,990 Pa neka je staviti iglu u tom pitanju za sada, ali ćemo se vratiti na njega. 96 00:05:12,990 --> 00:05:17,350 >> Dakle, natrag na ovu ideju sjećanja kao veliki niz stanica byte veličine. 97 00:05:17,350 --> 00:05:20,871 To je stvarno sve to, to je Samo veliki niz stanica, 98 00:05:20,871 --> 00:05:23,370 baš kao i bilo koji drugi niz koji ste upoznati sa i vidjeti, 99 00:05:23,370 --> 00:05:26,430 osim svaki element je širok jedan bajt. 100 00:05:26,430 --> 00:05:30,030 I baš kao niz, svaki element ima adresu. 101 00:05:30,030 --> 00:05:32,120 Svaki element niza ima indeks, i tako ćemo 102 00:05:32,120 --> 00:05:36,302 Možete koristiti taj indeks za napraviti tzv izravnim pristupom na nizu. 103 00:05:36,302 --> 00:05:38,510 Mi ne moramo početi na početak niza, 104 00:05:38,510 --> 00:05:40,569 ponoviti kroz svaku pojedini element istih, 105 00:05:40,569 --> 00:05:41,860 pronaći ono što tražite. 106 00:05:41,860 --> 00:05:45,790 Mi samo možemo reći, ja želim doći do 15. Element ili 100. elementa. 107 00:05:45,790 --> 00:05:49,930 A ti samo može proći u tom broju i dobiti vrijednost koju tražite. 108 00:05:49,930 --> 00:05:54,460 >> Slično svako mjesto u memoriji ima adresu. 109 00:05:54,460 --> 00:05:57,320 Dakle, vaša memorijska možda izgledati nešto poput ovoga. 110 00:05:57,320 --> 00:06:01,420 Evo vrlo mali komad memorije, ovaj je 20 bajta memorije. 111 00:06:01,420 --> 00:06:04,060 Prvih 20 bajtova, jer moje obraća tamo na dnu 112 00:06:04,060 --> 00:06:08,890 su 0, 1, 2, 3, i tako na sve na putu do 19. 113 00:06:08,890 --> 00:06:13,190 A kad kažem varijable i kad počnem raditi s njima, 114 00:06:13,190 --> 00:06:15,470 sustav će se postaviti na stranu neki prostor za mene 115 00:06:15,470 --> 00:06:17,595 u ovoj memoriji raditi sa svojim varijablama. 116 00:06:17,595 --> 00:06:21,610 Dakle, mogao bih reći, char c jednak kapital H. A što će se dogoditi? 117 00:06:21,610 --> 00:06:23,880 Pa sustav će odvojeno za mene jedan bajt. 118 00:06:23,880 --> 00:06:27,870 U ovom slučaju to je izabrao byte broj četiri, bajt na adresi četiri, 119 00:06:27,870 --> 00:06:31,310 i to će pohraniti Pismo kapital H tamo za mene. 120 00:06:31,310 --> 00:06:34,350 Ako sam tada rekao brzinu int Granica jednak 65, to je 121 00:06:34,350 --> 00:06:36,806 će izdvojiti četiri bajta memorije za mene. 122 00:06:36,806 --> 00:06:39,180 I to će tretirati one četiri bajta kao cjelinu 123 00:06:39,180 --> 00:06:41,305 jer ono što radimo s je cijeli broj ovdje. 124 00:06:41,305 --> 00:06:44,350 I to će se pohraniti 65 tamo. 125 00:06:44,350 --> 00:06:47,000 >> Sada već sam vrsta govorim vam malo laži, 126 00:06:47,000 --> 00:06:50,150 pravo, jer znamo da Računala rade u binarnom. 127 00:06:50,150 --> 00:06:53,100 Oni ne razumiju nužno ono kapital H 128 00:06:53,100 --> 00:06:57,110 ili što je 65, što je samo razumiju binarni, nula i jedinica. 129 00:06:57,110 --> 00:06:59,000 I tako zapravo ono smo pohranjivanje tamo 130 00:06:59,000 --> 00:07:03,450 Nije slovo H, a broj 65, nego binarni prikazi 131 00:07:03,450 --> 00:07:06,980 istih, što izgleda Malo nešto ovako. 132 00:07:06,980 --> 00:07:10,360 A posebno u kontekst cjelobrojna varijabla, 133 00:07:10,360 --> 00:07:13,559 to ne ide samo pljuvati u, to ne ide da ga tretiraju kao jedan četiri 134 00:07:13,559 --> 00:07:15,350 bajt komad nužno, to je zapravo događa 135 00:07:15,350 --> 00:07:19,570 da ga tretiraju kao četiri jedan byte komadima, što bi moglo izgledati nešto poput ovoga. 136 00:07:19,570 --> 00:07:22,424 Pa čak i to nije u potpunosti točan, 137 00:07:22,424 --> 00:07:24,840 zbog nečega što se zove endianness, koje nismo 138 00:07:24,840 --> 00:07:26,965 će ući sada, ali ako ste znatiželjni o, 139 00:07:26,965 --> 00:07:29,030 možete pročitati na malo i velika endianness. 140 00:07:29,030 --> 00:07:31,640 No, zbog ovog argumenta, zbog ovog videa, 141 00:07:31,640 --> 00:07:34,860 neka je samo pretpostaviti da je u Činjenica kako je broj 65 bi 142 00:07:34,860 --> 00:07:36,970 biti zastupljeni u memorije na svakom sustavu, 143 00:07:36,970 --> 00:07:38,850 iako to nije posve točno. 144 00:07:38,850 --> 00:07:41,700 >> Ali neka je zapravo samo dobiti osloboditi od svih binarnom cijelosti, 145 00:07:41,700 --> 00:07:44,460 i samo misliti o kao H i 65, to je puno lakše 146 00:07:44,460 --> 00:07:47,900 razmišljati o tome kao da kao ljudsko biće. 147 00:07:47,900 --> 00:07:51,420 U redu, možda tako da se također čini Malo slučajnim koji I've- moj sustav 148 00:07:51,420 --> 00:07:55,130 nije mi dati bajtova 5, 6, 7, i 8 pohraniti cijeli broj. 149 00:07:55,130 --> 00:07:58,580 Postoji razlog za to, previše, što nećemo ući odmah, ali dovoljan 150 00:07:58,580 --> 00:08:00,496 je reći da ono što je Računalo se radi ovdje 151 00:08:00,496 --> 00:08:02,810 Vjerojatno je dobar potez na svom dijelu. 152 00:08:02,810 --> 00:08:06,020 Da ne daj mi memoriju koja je nužno natrag na leđa. 153 00:08:06,020 --> 00:08:10,490 Iako će to učiniti sada ako želim dobiti još jedan niz, 154 00:08:10,490 --> 00:08:13,080 zove prezime, a ja želim staviti Lloyd tamo. 155 00:08:13,080 --> 00:08:18,360 Idem morati stati jedan lik, svako pismo koje je 156 00:08:18,360 --> 00:08:21,330 će zahtijevati jedan lik, jedan bajt memorije. 157 00:08:21,330 --> 00:08:26,230 Dakle, ako sam mogao staviti Lloyd u moju lepezu ovako ja sam prilično dobar to ići, zar ne? 158 00:08:26,230 --> 00:08:28,870 Što nedostaje? 159 00:08:28,870 --> 00:08:31,840 >> Zapamtite da je svaki niz radimo s u C završava s obrnute kose crte nula, 160 00:08:31,840 --> 00:08:33,339 i ne možemo izostaviti da je ovdje bilo. 161 00:08:33,339 --> 00:08:36,090 Moramo izdvojiti jedan bajt memorije držati to tako da 162 00:08:36,090 --> 00:08:39,130 znam kad je završio naš niz. 163 00:08:39,130 --> 00:08:41,049 Dakle, opet ovaj aranžman Puta stvari 164 00:08:41,049 --> 00:08:42,799 pojavljuju se u memoriji moći biti malo slučajan, 165 00:08:42,799 --> 00:08:44,870 ali zapravo je, kako većina sustavi su dizajnirani. 166 00:08:44,870 --> 00:08:48,330 Da ih se postroje na multiplama četiri, iz razloga ponovno 167 00:08:48,330 --> 00:08:50,080 da mi ne trebaju ući odmah. 168 00:08:50,080 --> 00:08:53,060 No to, kako je dovoljno reći da je Nakon tih triju linija koda, 169 00:08:53,060 --> 00:08:54,810 to je ono što memorije može izgledati. 170 00:08:54,810 --> 00:08:58,930 Ako trebam memorijskih mjesta 4, 8 i 12 držati svoje podatke, 171 00:08:58,930 --> 00:09:01,100 to je ono što mi je memorija može izgledati. 172 00:09:01,100 --> 00:09:04,062 >> I samo biti osobito pedantan ovdje, kad 173 00:09:04,062 --> 00:09:06,020 govorimo o memoriji Adrese obično 174 00:09:06,020 --> 00:09:08,390 učiniti pomoću heksadecimalni zapisima. 175 00:09:08,390 --> 00:09:12,030 Pa zašto ne bismo pretvoriti sve te od decimalnog do heksadecimalni zapis 176 00:09:12,030 --> 00:09:15,010 Samo zato što je općenito kako smo se odnose na memoriju. 177 00:09:15,010 --> 00:09:17,880 Dakle, umjesto da bude 0 do 19, što imamo nula 178 00:09:17,880 --> 00:09:20,340 x nula kroz nula x1 tri. 179 00:09:20,340 --> 00:09:23,790 Oni su 20 bajta memorije koje smo su ili gledamo na ovoj slici 180 00:09:23,790 --> 00:09:25,540 upravo ovdje. 181 00:09:25,540 --> 00:09:29,310 >> Dakle, sve to se, rekao je, neka je korak dalje od sjećanja na trenutak 182 00:09:29,310 --> 00:09:30,490 i natrag upućuje. 183 00:09:30,490 --> 00:09:32,420 Ovdje je najvažniji stvar za zapamtiti 184 00:09:32,420 --> 00:09:34,070 kao što smo početi raditi s pokazivača. 185 00:09:34,070 --> 00:09:36,314 Pokazivač ništa više od adrese. 186 00:09:36,314 --> 00:09:38,230 Ja ću ga opet, jer kažu to je to važno, 187 00:09:38,230 --> 00:09:42,730 pokazivač ništa više od adrese. 188 00:09:42,730 --> 00:09:47,760 Upućuje se obraća mjestima u memoriji gdje se varijable žive. 189 00:09:47,760 --> 00:09:52,590 Znajući da ona postaje nadamo se malo lakše raditi s njima. 190 00:09:52,590 --> 00:09:54,550 Još jedna stvar koju volim učiniti je da se vrsta 191 00:09:54,550 --> 00:09:58,510 dijagrama vizualno predstavlja ono što je događa s različitih linija koda. 192 00:09:58,510 --> 00:10:00,660 A mi ćemo to učiniti par puta u pokazivača, 193 00:10:00,660 --> 00:10:03,354 a kad govorimo o dinamičnom dodjela memorije, kao dobro. 194 00:10:03,354 --> 00:10:06,020 Zato mislim da su ovi dijagrami može biti osobito korisno. 195 00:10:06,020 --> 00:10:09,540 >> Dakle, ako ja kažem npr int k u mom kodu, što se događa? 196 00:10:09,540 --> 00:10:12,524 Pa što u osnovi se događa je Dobivam memorije izdvojiti za mene, 197 00:10:12,524 --> 00:10:14,690 ali ja čak ne vole razmišljam o tome kao da sam 198 00:10:14,690 --> 00:10:16,300 vole razmišljati o tome kao okvir. 199 00:10:16,300 --> 00:10:20,090 Imam kutiju i to je boje zelena jer sam 200 00:10:20,090 --> 00:10:21,750 može staviti cijelim brojevima u zelenim kutijama. 201 00:10:21,750 --> 00:10:23,666 Ako je to bio znak da može imati plavu kutiju. 202 00:10:23,666 --> 00:10:27,290 Ali ja uvijek kažem, ako sam stvara kutija koja se može održati prirodna broja 203 00:10:27,290 --> 00:10:28,950 ta kutija je zelene boje. 204 00:10:28,950 --> 00:10:33,020 I ja se stalni marker i pišem k na strani njega. 205 00:10:33,020 --> 00:10:37,590 Dakle, imam kutiju zove k, u koje mogu staviti integers. 206 00:10:37,590 --> 00:10:41,070 Dakle, kad kažem int k, to je što se događa u mojoj glavi. 207 00:10:41,070 --> 00:10:43,140 Ako kažem k jednako pet, što ja radim? 208 00:10:43,140 --> 00:10:45,110 Pa, ja sam stavljajući pet u kutiji, zar ne. 209 00:10:45,110 --> 00:10:48,670 To je prilično jednostavan, ako Kažem int k, stvoriti okvir zove k. 210 00:10:48,670 --> 00:10:52,040 Ako kažem k jednak 5, stavi pet u okvir. 211 00:10:52,040 --> 00:10:53,865 Nadam se da nije previše skok. 212 00:10:53,865 --> 00:10:55,990 Evo gdje se stvari ići Malo zanimljiva ipak. 213 00:10:55,990 --> 00:11:02,590 Ako kažem int * PK, pa čak i ako ja ne Znaš što to znači nužno, 214 00:11:02,590 --> 00:11:06,150 jasno je dobio nešto učiniti s cjelobrojnim. 215 00:11:06,150 --> 00:11:08,211 Tako ću u boji ovaj okvir zeleno-ish, 216 00:11:08,211 --> 00:11:10,210 Znam da ima nešto učiniti s cijeli broj, 217 00:11:10,210 --> 00:11:13,400 ali to nije sama cijeli broj, zato što je int zvijezda. 218 00:11:13,400 --> 00:11:15,390 Ima nešto malo drugačije o tome. 219 00:11:15,390 --> 00:11:17,620 Dakle, cijeli je uključen, ali inače je 220 00:11:17,620 --> 00:11:19,830 ne previše različit od ono što smo razgovarali o tome. 221 00:11:19,830 --> 00:11:24,240 To je okvir, njegova je dobio oznaku, to nosi oznaku PK, 222 00:11:24,240 --> 00:11:27,280 i to je sposoban za držanje int zvijezde, sve što oni jesu. 223 00:11:27,280 --> 00:11:29,894 Oni imaju neke veze s integers, jasno. 224 00:11:29,894 --> 00:11:31,060 Evo zadnji redak ipak. 225 00:11:31,060 --> 00:11:37,650 Ako kažem PK = & K, stoj, što se upravo dogodilo, zar ne? 226 00:11:37,650 --> 00:11:41,820 Dakle, ovaj slučajni broj, naizgled slučajni broj, dobiva bačen u kutiju tamo. 227 00:11:41,820 --> 00:11:44,930 Sve što je, je pk dobiva adresu k. 228 00:11:44,930 --> 00:11:52,867 Tako sam zabada gdje je k živi u memoriji, njegovu adresu, adresu njegove bajtova. 229 00:11:52,867 --> 00:11:55,200 Sve što radim je ja govorim da je vrijednost što ću 230 00:11:55,200 --> 00:11:59,430 staviti u moje kutije zove PK. 231 00:11:59,430 --> 00:12:02,080 A budući da su te stvari naputke, a zbog izgleda 232 00:12:02,080 --> 00:12:04,955 na žici kao nula x osam nula c sedam četiri i osam 233 00:12:04,955 --> 00:12:07,790 dva nula je vjerojatno nije vrlo značajna. 234 00:12:07,790 --> 00:12:12,390 Kad mi općenito vizualizirati naputke, mi zapravo učiniti što upućuje. 235 00:12:12,390 --> 00:12:17,000 Pk nam daje podatke moramo pronaći k u memoriji. 236 00:12:17,000 --> 00:12:19,120 Tako je u osnovi pk ima strelicu u njega. 237 00:12:19,120 --> 00:12:21,670 I ako živimo duljinu te strelice, zamislite 238 00:12:21,670 --> 00:12:25,280 to je nešto što može hodati na, ako prošetati duž strelice, 239 00:12:25,280 --> 00:12:29,490 na samom vrhu tog strelice smo naći će mjesto u memoriji 240 00:12:29,490 --> 00:12:31,390 gdje je k živi. 241 00:12:31,390 --> 00:12:34,360 A to je jako važno jer jednom znamo gdje je k živi, 242 00:12:34,360 --> 00:12:37,870 možemo početi raditi s podacima unutar tog memorije položaja. 243 00:12:37,870 --> 00:12:40,780 Iako smo dobili na Teeny malo ispred sebe, za sada. 244 00:12:40,780 --> 00:12:42,240 >> Dakle, ono što je pokazivač? 245 00:12:42,240 --> 00:12:45,590 Pokazivač je predmet čije podatke vrijednost je memorija adresa. 246 00:12:45,590 --> 00:12:49,740 To je to nula x osam nula stuff događa, da je sjećanje adresu. 247 00:12:49,740 --> 00:12:52,060 To je mjesto u memoriji. 248 00:12:52,060 --> 00:12:55,080 A tip pokazivač opisuje vrstu 249 00:12:55,080 --> 00:12:56,930 podataka ćete naći na da memorija adresa. 250 00:12:56,930 --> 00:12:58,810 Tako da je dio pravu int zvijezda. 251 00:12:58,810 --> 00:13:03,690 Ako pratim tu strelicu, to je će me dovesti do mjesta. 252 00:13:03,690 --> 00:13:06,980 A to mjesto, što sam naći će tamo u mom primjeru, 253 00:13:06,980 --> 00:13:08,240 je zelene boje kutija. 254 00:13:08,240 --> 00:13:12,650 To je cijeli broj, to je ono što naći ako odem na tu adresu. 255 00:13:12,650 --> 00:13:14,830 Vrsta podataka od pokazivač opisuje što 256 00:13:14,830 --> 00:13:17,936 naći ćete na toj memorijske adrese. 257 00:13:17,936 --> 00:13:19,560 Dakle ovdje je stvarno super stvar ipak. 258 00:13:19,560 --> 00:13:25,090 Upućuje nam omogućiti da prođe varijable među funkcijama. 259 00:13:25,090 --> 00:13:28,520 A zapravo prolaze varijable i ne prođe kopije njih. 260 00:13:28,520 --> 00:13:32,879 Jer ako znamo točno gdje u memoriju naći varijablu, 261 00:13:32,879 --> 00:13:35,670 ne trebamo napraviti kopiju to, možemo samo ići na to mjesto 262 00:13:35,670 --> 00:13:37,844 i raditi s tom varijablom. 263 00:13:37,844 --> 00:13:40,260 Dakle, u biti upućuje vrsta od napravite konfiguracija 264 00:13:40,260 --> 00:13:42,360 mnogo više kao u stvarnom svijetu, zar ne. 265 00:13:42,360 --> 00:13:44,640 >> Dakle ovdje je analogija. 266 00:13:44,640 --> 00:13:48,080 Recimo da imam bilježnicu, pravo, a to je puna nota. 267 00:13:48,080 --> 00:13:50,230 I ja bih da ga ažurirati. 268 00:13:50,230 --> 00:13:53,960 Vi ste funkcija koja ažuriranja bilješke, u pravu. 269 00:13:53,960 --> 00:13:56,390 Na putu smo bili raditi do sada, što 270 00:13:56,390 --> 00:14:02,370 dogodi se da ćete uzeti moju bilježnicu, vi ćete ići u dućan kopiranja, 271 00:14:02,370 --> 00:14:06,410 ćete napraviti Xerox kopiju svaka stranica u bilježnici. 272 00:14:06,410 --> 00:14:09,790 Vi ćete ostaviti moju bilježnicu natrag na mom stolu kada završite, 273 00:14:09,790 --> 00:14:14,600 ćete ići i precrtati stvari u mom prijenosnik koji su zastarjeli ili u krivu, 274 00:14:14,600 --> 00:14:19,280 a onda ćete proći natrag mi snop Xerox stranica 275 00:14:19,280 --> 00:14:22,850 to je replika moje bilježnice sa promjene koje ste napravili za njega. 276 00:14:22,850 --> 00:14:27,040 I u tom trenutku, to je do mene kao funkcija poziv, kao pozivatelja, 277 00:14:27,040 --> 00:14:30,582 odlučiti da se vaše bilješke i integrirati ih natrag u moju bilježnicu. 278 00:14:30,582 --> 00:14:32,540 Dakle, postoji mnogo koraka uključena ovdje, u redu. 279 00:14:32,540 --> 00:14:34,850 Kao ne bi bilo bolje ako sam samo reći, hej, možete li 280 00:14:34,850 --> 00:14:38,370 ažurirati svoju bilježnicu za mi, ruku ti moju bilježnicu, 281 00:14:38,370 --> 00:14:40,440 i uzeti stvari i doslovce ih precrtati 282 00:14:40,440 --> 00:14:42,810 i ažurirati svoje bilješke u moju bilježnicu. 283 00:14:42,810 --> 00:14:45,140 I onda mi dati moju bilježnicu natrag. 284 00:14:45,140 --> 00:14:47,320 To je vrsta ono upućuje nam omogućiti da radimo, 285 00:14:47,320 --> 00:14:51,320 oni čine ovo okruženje puno više kao način djelujemo u stvarnosti. 286 00:14:51,320 --> 00:14:54,640 >> U redu, tako da je ono što pokazivač se, razgovarajmo 287 00:14:54,640 --> 00:14:58,040 o tome naputke radi u C, a kako možemo početi raditi s njima. 288 00:14:58,040 --> 00:15:02,550 Dakle, tu je vrlo jednostavan pokazivač u C zove nulta pokazivač. 289 00:15:02,550 --> 00:15:04,830 U null pokazivač ukazuje na ništa. 290 00:15:04,830 --> 00:15:08,310 To je vjerojatno izgleda kao da je zapravo vrlo korisna stvar, 291 00:15:08,310 --> 00:15:10,500 ali kao što ćemo vidjeti Malo kasnije, činjenica 292 00:15:10,500 --> 00:15:15,410 da je ovaj null pointer postoji zapravo stvarno može doći u ruci. 293 00:15:15,410 --> 00:15:19,090 I kad god stvoriti pokazivač, te ne postavite vrijednost immediately- 294 00:15:19,090 --> 00:15:21,060 primjer postavljanja njegova vrijednost odmah 295 00:15:21,060 --> 00:15:25,401 biti će par slajdova natrag gdje sam rekao PK jednak & K, 296 00:15:25,401 --> 00:15:28,740 PK dobiva adresu K-a, kao što je vidjet ćemo što to znači, 297 00:15:28,740 --> 00:15:32,990 vidjet ćemo kako se kod koji shortly- Ako ne postavite vrijednost na nešto 298 00:15:32,990 --> 00:15:35,380 smisla odmah uvijek biste trebali 299 00:15:35,380 --> 00:15:37,480 postavite pokazivač ukazati na nulu. 300 00:15:37,480 --> 00:15:40,260 Trebali biste ga postaviti ukazati na ništa. 301 00:15:40,260 --> 00:15:43,614 >> To je vrlo različit od samo ostavljajući vrijednosti kao što je to 302 00:15:43,614 --> 00:15:45,530 a zatim progla pokazivač i samo uz pretpostavku 303 00:15:45,530 --> 00:15:48,042 to je nula, jer to je rijetko istina. 304 00:15:48,042 --> 00:15:50,000 Dakle, uvijek biste trebali postaviti vrijednost pokazivač 305 00:15:50,000 --> 00:15:55,690 na null ako ne postavite vrijednost nešto smisleno odmah. 306 00:15:55,690 --> 00:15:59,090 Možete provjeriti je li vrijednost pokazivač u null pomoću operatora jednakosti 307 00:15:59,090 --> 00:16:05,450 (==), Baš kao što usporediti bilo koji cijeli broj vrijednosti ili karakter vrijednosti koriste (==) 308 00:16:05,450 --> 00:16:06,320 kao. 309 00:16:06,320 --> 00:16:10,994 To je posebna vrsta konstante Vrijednost koju možete koristiti za testiranje. 310 00:16:10,994 --> 00:16:13,160 Tako da je vrlo jednostavan pokazivač, nul pokazivač. 311 00:16:13,160 --> 00:16:15,320 Drugi način za stvaranje pointer je izdvojiti 312 00:16:15,320 --> 00:16:18,240 adresa varijable ste već stvorili, 313 00:16:18,240 --> 00:16:22,330 i radite to pomoću & ekstrakciju adresa operatera. 314 00:16:22,330 --> 00:16:26,720 Što smo već ranije vidjeli u prvom dijagramu primjer sam pokazao. 315 00:16:26,720 --> 00:16:31,450 Dakle, ako je x varijabla koje smo već stvorio tipa integer, 316 00:16:31,450 --> 00:16:35,110 tada & x pointer na cijeli broj. 317 00:16:35,110 --> 00:16:39,810 & x pi- sjećam, i ide za izdvajanje adresu stvar na desnoj strani. 318 00:16:39,810 --> 00:16:45,350 A budući pokazivač je samo adresa, nego & x pointer na cijeli broj 319 00:16:45,350 --> 00:16:48,560 čija je vrijednost u kojoj je u memoriju x životima. 320 00:16:48,560 --> 00:16:50,460 To je X-pošte. 321 00:16:50,460 --> 00:16:53,296 Tako i x je adresa x. 322 00:16:53,296 --> 00:16:55,670 Uzmimo ovaj jedan korak dalje i povezati s nečim 323 00:16:55,670 --> 00:16:58,380 Sam aludirao u prethodnom videu. 324 00:16:58,380 --> 00:17:06,730 Ako ARR je niz parovima, a zatim & arr uglata zagrada i je pokazivač 325 00:17:06,730 --> 00:17:08,109 za dvostruko. 326 00:17:08,109 --> 00:17:08,970 U REDU. 327 00:17:08,970 --> 00:17:12,160 ARR uglata zagrada i, ako ARR je niz parovima, 328 00:17:12,160 --> 00:17:19,069 onda ARR uglata zagrada i je i-th element tog niza, 329 00:17:19,069 --> 00:17:29,270 i & ARR uglata zagrada i gdje je u memorije i-th element ARR postoji. 330 00:17:29,270 --> 00:17:31,790 >> Dakle, što je implikacija ovdje? 331 00:17:31,790 --> 00:17:34,570 Polja Ime, implikacija ovog cijelu stvar, 332 00:17:34,570 --> 00:17:39,290 da je ime dobio je niz zapravo sama pokazivač. 333 00:17:39,290 --> 00:17:41,170 Vi ste radili s pokazivače duž 334 00:17:41,170 --> 00:17:45,290 svaki put kad ste koristili niz. 335 00:17:45,290 --> 00:17:49,090 Sjeti se iz primjera na varijablu opsegu, 336 00:17:49,090 --> 00:17:53,420 pri kraju videa sam predstaviti primjer gdje imamo funkciju 337 00:17:53,420 --> 00:17:56,890 nazvao skup int a funkcija zove skup polje. 338 00:17:56,890 --> 00:18:00,490 I vaš izazov kako bi se utvrdilo da li ili ne, ili što 339 00:18:00,490 --> 00:18:03,220 vrijednosti koje smo ispisati kraj funkcije, 340 00:18:03,220 --> 00:18:05,960 na kraju glavnog programa. 341 00:18:05,960 --> 00:18:08,740 >> Ako se sjećate iz tog primjera ili ako ste gledali video, 342 00:18:08,740 --> 00:18:13,080 znate da kad vas-poziv na Skup int učinkovito ne radi ništa. 343 00:18:13,080 --> 00:18:16,390 Ali poziv postaviti niz radi. 344 00:18:16,390 --> 00:18:19,280 I ja sam nekako premazani više zašto kako je to bio slučaj u to vrijeme. 345 00:18:19,280 --> 00:18:22,363 Samo sam rekao, i to je niz, što je posebna, znate, postoji razlog. 346 00:18:22,363 --> 00:18:25,020 Razlog tome je što je niz Ime je zapravo samo pokazivač, 347 00:18:25,020 --> 00:18:28,740 i tu je ta posebna uglata zagrada sintaksa da 348 00:18:28,740 --> 00:18:30,510 bi stvari puno ljepše raditi. 349 00:18:30,510 --> 00:18:34,410 I oni čine ideju o pokazivač puno manje zastrašujuće, 350 00:18:34,410 --> 00:18:36,800 i to je razlog zašto oni su vrsta od predstavili na taj način. 351 00:18:36,800 --> 00:18:38,600 Ali stvarno polja su samo naputke. 352 00:18:38,600 --> 00:18:41,580 I zato, kada smo napravio promjenu u nizu, 353 00:18:41,580 --> 00:18:44,880 kad smo prošli niz kao parametar u funkciji ili kao argument 354 00:18:44,880 --> 00:18:50,110 u funkciju, sadržaj polja zapravo promijenilo u oba pozivani 355 00:18:50,110 --> 00:18:51,160 a pozivatelja. 356 00:18:51,160 --> 00:18:55,846 Što je za svaku drugu vrstu varijabla smo vidjeli nije bio slučaj. 357 00:18:55,846 --> 00:18:58,970 Dakle, to je samo nešto što treba imati na smeta kada radite s pokazivača, 358 00:18:58,970 --> 00:19:01,610 je da je ime od Niz zapravo pokazivač 359 00:19:01,610 --> 00:19:04,750 na prvi element tog polja. 360 00:19:04,750 --> 00:19:08,930 >> U redu, tako da sada imamo sve ove činjenice, idemo dalje, u pravu. 361 00:19:08,930 --> 00:19:11,370 Zašto mi je stalo gdje se nešto živi. 362 00:19:11,370 --> 00:19:14,120 Pa kao što sam rekao, to je prilično korisno je znati gdje se nešto živi 363 00:19:14,120 --> 00:19:17,240 tako da možete ići tamo i to promijeniti. 364 00:19:17,240 --> 00:19:19,390 Radite s njim i zapravo imaju stvar koja vas 365 00:19:19,390 --> 00:19:23,710 želite učiniti s tim promjenjivim stupiti na snagu, a ne stupaju na snagu na nekoj kopiji njega. 366 00:19:23,710 --> 00:19:26,150 To se zove dereferencing. 367 00:19:26,150 --> 00:19:28,690 Idemo na reference i mijenjamo vrijednost tamo. 368 00:19:28,690 --> 00:19:32,660 Dakle, ako imamo pokazivač i to se zove kom, a to ukazuje na karakter, 369 00:19:32,660 --> 00:19:40,610 onda možemo reći * kom i * kom je naziv što ćemo naći ako ćemo ići 370 00:19:40,610 --> 00:19:42,910 na adresu pc. 371 00:19:42,910 --> 00:19:47,860 Ono što ćete naći je karakter i * kom je kako smo se odnose na podatke na koje 372 00:19:47,860 --> 00:19:48,880 položaj. 373 00:19:48,880 --> 00:19:54,150 Tako bismo mogli reći nešto poput * kom = D ili nešto slično, 374 00:19:54,150 --> 00:19:59,280 a to znači da sve što bio na memorijsku adresu računala, 375 00:19:59,280 --> 00:20:07,040 ono lik je prethodno tamo je sada D, ako kažemo * PC = D. 376 00:20:07,040 --> 00:20:10,090 >> Dakle, ovdje mi ići opet s neki čudan C stvari, u pravu. 377 00:20:10,090 --> 00:20:14,560 Tako smo vidjeli ranije * kao nekako dio vrsti podataka, 378 00:20:14,560 --> 00:20:17,160 a sada je koristi u malo drugačiji kontekst 379 00:20:17,160 --> 00:20:19,605 pristup podacima na mjestu. 380 00:20:19,605 --> 00:20:22,480 Znam da je malo konfuzno i to je zapravo dio ove cjeline 381 00:20:22,480 --> 00:20:25,740 Kao, zašto upućuje imati ovu mitologiju oko njih kao da složen, 382 00:20:25,740 --> 00:20:28,250 je vrsta problema sintakse, iskreno. 383 00:20:28,250 --> 00:20:31,810 Ali * se koristi u oba konteksta, i kao dio imena tipa, 384 00:20:31,810 --> 00:20:34,100 pa ćemo vidjeti malo kasnije nešto drugo, previše. 385 00:20:34,100 --> 00:20:36,490 A sada je dereference operatora. 386 00:20:36,490 --> 00:20:38,760 Tako to ide u referenci, To pristupa podacima 387 00:20:38,760 --> 00:20:43,000 na mjestu pokazivača, i omogućuje vam da ga manipulirati po volji. 388 00:20:43,000 --> 00:20:45,900 >> Sada je to vrlo slično posjetite svog susjeda, zar ne. 389 00:20:45,900 --> 00:20:48,710 Ako znate što je vaš susjed živi, ​​ti si 390 00:20:48,710 --> 00:20:50,730 ne visi sa svojim susjedom. 391 00:20:50,730 --> 00:20:53,510 Znate li slučajno znaju gdje žive, 392 00:20:53,510 --> 00:20:56,870 ali to ne znači da je Vrlina ima to znanje 393 00:20:56,870 --> 00:20:59,170 vi ste u interakciji s njima. 394 00:20:59,170 --> 00:21:01,920 Ako želite komunicirati s njima, morate ići na njihove kuće, 395 00:21:01,920 --> 00:21:03,760 morate ići na kojoj žive. 396 00:21:03,760 --> 00:21:07,440 A nakon što učiniti, onda možete komunicirati 397 00:21:07,440 --> 00:21:09,420 s njima baš kao što bi željeli. 398 00:21:09,420 --> 00:21:12,730 A isto tako s varijablama, morate ići na njihovu adresu 399 00:21:12,730 --> 00:21:15,320 Ako ih želite komunicirati, ne možete samo znate adresu. 400 00:21:15,320 --> 00:21:21,495 A način idete na adresu se koristiti *, operator dereference. 401 00:21:21,495 --> 00:21:23,620 Što mislite događa ako ćemo pokušati dereference 402 00:21:23,620 --> 00:21:25,260 pokazivač čija vrijednost je null? 403 00:21:25,260 --> 00:21:28,470 Sjetite se da je null pokazivač ukazuje na ništa. 404 00:21:28,470 --> 00:21:34,110 Dakle, ako ste probati i dereference ništa ili otići na adresu ništa, 405 00:21:34,110 --> 00:21:36,800 Što mislite se događa? 406 00:21:36,800 --> 00:21:39,630 Pa, ako ste pogodili segmentacija kvara, ti bi biti u pravu. 407 00:21:39,630 --> 00:21:41,390 Ako probati i dereference null pointer, 408 00:21:41,390 --> 00:21:43,140 ste pretrpjeli segmentaciju kvara. Ali čekajte, 409 00:21:43,140 --> 00:21:45,820 nije vam kažem, da je ako ne ide 410 00:21:45,820 --> 00:21:49,220 postaviti svoju vrijednost svoje pokazivač na nešto smisleno, 411 00:21:49,220 --> 00:21:51,000 trebate postaviti na nulu? 412 00:21:51,000 --> 00:21:55,290 Ja sam i zapravo segmentacija greška je vrsta dobrog ponašanja. 413 00:21:55,290 --> 00:21:58,680 >> Jeste li ikada proglasio varijablu i Ne dodjeljuje svoju vrijednost odmah? 414 00:21:58,680 --> 00:22:02,680 Dakle, samo reći int x; vi ne zapravo dodijeliti bilo 415 00:22:02,680 --> 00:22:05,340 a onda kasnije u kodu, vam ispisati vrijednost x, 416 00:22:05,340 --> 00:22:07,650 što još uvijek ne ga dodijeljena ništa. 417 00:22:07,650 --> 00:22:10,370 Često ćete dobiti nula, ali ponekad 418 00:22:10,370 --> 00:22:15,000 možda dobiti neki slučajni broj, a nemate pojma gdje je došao iz. 419 00:22:15,000 --> 00:22:16,750 Isto mogu stvari dogoditi s pokazivače. 420 00:22:16,750 --> 00:22:20,110 Kada proglasiti pokazivač int * pk npr 421 00:22:20,110 --> 00:22:23,490 a vi to ne dodijeliti vrijednost, Možete dobiti četiri bajta za pamćenje. 422 00:22:23,490 --> 00:22:25,950 Bez obzira na četiri bajta Memorija sustav može 423 00:22:25,950 --> 00:22:28,970 Smatraju da su neke smislene vrijednosti. 424 00:22:28,970 --> 00:22:31,760 A tu je moglo biti nešto već postoji da su 425 00:22:31,760 --> 00:22:34,190 više nije potreban netko drugi funkcija, tako da samo 426 00:22:34,190 --> 00:22:35,900 god podaci bio tamo. 427 00:22:35,900 --> 00:22:40,570 >> Što ako ste pokušali učiniti dereference Neki adresu koju don't- bilo 428 00:22:40,570 --> 00:22:43,410 Već bajtova i informacije u postoji, to je sada u vašem pokazivač. 429 00:22:43,410 --> 00:22:47,470 Ako probati i dereference tom pokazivač, možda se petljaju s nekim memorije 430 00:22:47,470 --> 00:22:49,390 da ne namjerava igrati s njom sve. 431 00:22:49,390 --> 00:22:51,639 A u stvari si mogao učiniti nešto stvarno poražavajući, 432 00:22:51,639 --> 00:22:54,880 kao i slomiti drugi program, ili break drugu funkciju, 433 00:22:54,880 --> 00:22:58,289 ili učiniti nešto da zlonamjerni ne namjerava učiniti na sve. 434 00:22:58,289 --> 00:23:00,080 I tako to je razlog zašto je zapravo dobra ideja 435 00:23:00,080 --> 00:23:04,030 postaviti svoje pokazivače na nulu, ako vas nemojte ih postavite na nešto smisleno. 436 00:23:04,030 --> 00:23:06,760 To je vjerojatno bolje Na kraj dana za vaš program 437 00:23:06,760 --> 00:23:09,840 sudar onda za to učiniti Nešto što vijci gore 438 00:23:09,840 --> 00:23:12,400 drugi program ili drugi funkcija. 439 00:23:12,400 --> 00:23:15,207 To ponašanje je vjerojatno i manje idealnim ne samo pad. 440 00:23:15,207 --> 00:23:17,040 I tako to je razlog zašto je zapravo dobra navika 441 00:23:17,040 --> 00:23:20,920 ući postaviti svoje pokazivače na nulu, ako ih ne postavite 442 00:23:20,920 --> 00:23:24,540 na smislene vrijednosti Odmah, vrijednost da znate 443 00:23:24,540 --> 00:23:27,260 i da sigurno može i dereference. 444 00:23:27,260 --> 00:23:32,240 >> Tako ćemo se vratiti sada i pogledati u ukupnom sintaksu situacije. 445 00:23:32,240 --> 00:23:37,400 Ako kažem int * p ;, što sam upravo učinio? 446 00:23:37,400 --> 00:23:38,530 Ono što sam učinio je to. 447 00:23:38,530 --> 00:23:43,290 Znam vrijednost p je adresa jer sve upućuje samo 448 00:23:43,290 --> 00:23:44,660 adrese. 449 00:23:44,660 --> 00:23:47,750 Mogu dereference p Uporaba *. 450 00:23:47,750 --> 00:23:51,250 U tom kontekstu, ovdje, na samom Top podsjetiti * dio je tipa. 451 00:23:51,250 --> 00:23:53,510 Int * je tip podataka. 452 00:23:53,510 --> 00:23:56,150 Ali ja mogu dereference p pomoću operatora *, 453 00:23:56,150 --> 00:24:01,897 a ako sam to učiniti, ako odem na tu adresu, što ću naći na toj adresi? 454 00:24:01,897 --> 00:24:02,855 Ja ću naći cijeli broj. 455 00:24:02,855 --> 00:24:05,910 Dakle, int * p osnovi govoreći: p adresa. 456 00:24:05,910 --> 00:24:09,500 Ja mogu dereference p a ako Ja, ja ću naći cijeli broj 457 00:24:09,500 --> 00:24:11,920 u tom memorijskom mjestu. 458 00:24:11,920 --> 00:24:14,260 >> U redu, tako sam rekao da je bio još jedan smeta što sa zvijezdama 459 00:24:14,260 --> 00:24:17,060 i ovdje gdje da smeta što je sa zvijezdama. 460 00:24:17,060 --> 00:24:21,640 Jeste li ikad pokušali proglasiti više varijabli istog tipa 461 00:24:21,640 --> 00:24:24,409 na istoj liniji koda? 462 00:24:24,409 --> 00:24:27,700 Tako je za sekundu, pretvarati da je linija, kod sam zapravo tamo u zelenom 463 00:24:27,700 --> 00:24:29,366 ne postoji, a to samo govori int x, y, z ;. 464 00:24:29,366 --> 00:24:31,634 465 00:24:31,634 --> 00:24:34,550 Što bi to značilo je zapravo stvoriti tri cjelobrojne varijable za vas, 466 00:24:34,550 --> 00:24:36,930 jedan se zove x, jedan se zove y, a jedna se zove z. 467 00:24:36,930 --> 00:24:41,510 To je način da to učinite bez moraju podijeliti na tri linije. 468 00:24:41,510 --> 00:24:43,890 >> Evo gdje zvijezde doći opet neugodno iako, 469 00:24:43,890 --> 00:24:49,200 jer * je zapravo dio oba imena tipa i dio 470 00:24:49,200 --> 00:24:50,320 varijabilne imena. 471 00:24:50,320 --> 00:24:56,430 I tako, ako kažem int * px, py, pz, što sam zapravo dobili je pokazivač na cijeli broj 472 00:24:56,430 --> 00:25:01,650 zove px i dva prirodna broja, py i pz. 473 00:25:01,650 --> 00:25:04,950 A to vjerojatno nije ono što želimo, to nije dobro. 474 00:25:04,950 --> 00:25:09,290 >> Dakle, ako želim stvoriti više pokazivače na istoj liniji, iste vrste, 475 00:25:09,290 --> 00:25:12,140 i zvijezde, što zapravo treba učiniti je reći int * godišnje, * pb, * kom. 476 00:25:12,140 --> 00:25:17,330 477 00:25:17,330 --> 00:25:20,300 Sada nakon što je upravo rekao da a sada ti ovo govorim, 478 00:25:20,300 --> 00:25:22,170 vjerojatno nikad neće to učiniti. 479 00:25:22,170 --> 00:25:25,170 I to je vjerojatno dobra stvar iskreno, jer možda slučajno 480 00:25:25,170 --> 00:25:26,544 izostavi zvijezda, tako nešto. 481 00:25:26,544 --> 00:25:29,290 To je vjerojatno najbolje da možda proglasiti naputke o pojedinim linijama, 482 00:25:29,290 --> 00:25:31,373 ali to je samo još jedan od onih dosadnih sintakse 483 00:25:31,373 --> 00:25:35,310 stvari sa zvijezdama koje čine upućuje tako teško raditi. 484 00:25:35,310 --> 00:25:39,480 Budući da je samo ovaj sintaktička nered morate raditi putem. 485 00:25:39,480 --> 00:25:41,600 Sa praksi to radi stvarno postati druga priroda. 486 00:25:41,600 --> 00:25:45,410 Ja još uvijek griješe s njim dalje Nakon programiranja za 10 godina, 487 00:25:45,410 --> 00:25:49,630 pa nemojte se ljutiti ako se nešto dogodi vama, to je prilično uobičajeno iskreno. 488 00:25:49,630 --> 00:25:52,850 To je zapravo vrsta mana od sintakse. 489 00:25:52,850 --> 00:25:54,900 >> U redu pa sam vrsta obećao da bi ponovno 490 00:25:54,900 --> 00:25:59,370 pojam koliko je velika je niz. 491 00:25:59,370 --> 00:26:02,750 Pa ako sam vam rekao da je string, mi smo zapravo vrsta 492 00:26:02,750 --> 00:26:04,140 lagao da vas cijelo vrijeme. 493 00:26:04,140 --> 00:26:06,181 Nema tip podataka naziva string, i zapravo sam 494 00:26:06,181 --> 00:26:09,730 spomenuo u jednom od naših Najraniji video prilozi na tipove podataka, 495 00:26:09,730 --> 00:26:13,820 da je niz je vrsta podataka koji je stvoren za vas u CS50.h. 496 00:26:13,820 --> 00:26:17,050 Morate #include CS50.h kako bi ga koristiti. 497 00:26:17,050 --> 00:26:19,250 >> Pa string je zapravo samo alias za nešto 498 00:26:19,250 --> 00:26:23,600 zove char *, A pokazivač na karakter. 499 00:26:23,600 --> 00:26:26,010 Pa naputke, podsjetimo, samo bavi. 500 00:26:26,010 --> 00:26:28,780 Dakle, što je veličina u bajtovima u nizu? 501 00:26:28,780 --> 00:26:29,796 Pa to je četiri ili osam. 502 00:26:29,796 --> 00:26:32,170 A razlog kažem četiri ili osam je zbog toga zapravo 503 00:26:32,170 --> 00:26:36,730 ovisi o sustavu, Ako koristite CS50 IDE, char * je veličina char 504 00:26:36,730 --> 00:26:39,340 * Je osam, to je 64-bitni sustav. 505 00:26:39,340 --> 00:26:43,850 Svaka adresa u memoriji je 64 bita dugo. 506 00:26:43,850 --> 00:26:48,270 Ako koristite CS50 aparata ili pomoću bilo kojeg 32-bitni stroj, 507 00:26:48,270 --> 00:26:51,640 a vi ste čuli da je pojam 32-bitni stroj, što je 32-bitni stroj? 508 00:26:51,640 --> 00:26:56,090 Pa to samo znači da je svaki adresa u memoriji je 32 bita dugo. 509 00:26:56,090 --> 00:26:59,140 I tako 32 bita je četiri bajta. 510 00:26:59,140 --> 00:27:02,710 Tako char * je četiri ili osam bajtova ovisno o vašem sustavu. 511 00:27:02,710 --> 00:27:06,100 I doista bilo vrste podataka, a pokazivač na bilo podataka 512 00:27:06,100 --> 00:27:12,030 upisati, jer sve upućuje samo adrese, četiri ili osam bajtova. 513 00:27:12,030 --> 00:27:14,030 Tako ćemo ponovno ovu dijagram i neka je zaključiti 514 00:27:14,030 --> 00:27:18,130 ovaj video s malo vježbe ovdje. 515 00:27:18,130 --> 00:27:21,600 Dakle ovdje je dijagram smo stali s na samom početku videa. 516 00:27:21,600 --> 00:27:23,110 Dakle, ono što se događa sada, ako ja kažem * PK = 35? 517 00:27:23,110 --> 00:27:26,370 518 00:27:26,370 --> 00:27:30,530 Dakle, što to znači kad kažem, * PK = 35? 519 00:27:30,530 --> 00:27:32,420 Uzmite trenutak. 520 00:27:32,420 --> 00:27:34,990 * pk. 521 00:27:34,990 --> 00:27:39,890 U kontekstu ovdje, * je dereference operatora. 522 00:27:39,890 --> 00:27:42,110 Dakle, kada je dereference Operater koristi, 523 00:27:42,110 --> 00:27:48,520 idemo na adresu ukazao na PK, a mijenjamo ono što smo pronašli. 524 00:27:48,520 --> 00:27:55,270 Dakle * PK = 35 učinkovito to čini na slici. 525 00:27:55,270 --> 00:27:58,110 Dakle, to je u osnovi sintaktički identična da su, rekao je k = 35. 526 00:27:58,110 --> 00:28:00,740 527 00:28:00,740 --> 00:28:01,930 >> Još jedan. 528 00:28:01,930 --> 00:28:05,510 Ako kažem int m, ja stvaram nova varijabla zove m. 529 00:28:05,510 --> 00:28:08,260 Novi okvir, to je zelena kutija, jer to će držati cijeli broj, 530 00:28:08,260 --> 00:28:09,840 i to s oznakom m. 531 00:28:09,840 --> 00:28:14,960 Ako kažem m = 4, stavio sam broj u taj okvir. 532 00:28:14,960 --> 00:28:20,290 Ako recimo PK = & m, kako se ovo dijagram promjene? 533 00:28:20,290 --> 00:28:28,760 PK = & m, sjećate li se što je & Operater radi ili se zove? 534 00:28:28,760 --> 00:28:34,430 Sjeti se da & neko ime varijable je adresa u ime varijable. 535 00:28:34,430 --> 00:28:38,740 Dakle, ono što si rekao je PK dobiva adresu m. 536 00:28:38,740 --> 00:28:42,010 I tako učinkovito što dogodi Dijagram je da pk više ne bodove 537 00:28:42,010 --> 00:28:46,420 za k, ali ukazuje na m. 538 00:28:46,420 --> 00:28:48,470 >> Opet pokazivače su vrlo lukav raditi 539 00:28:48,470 --> 00:28:50,620 i oni uzeti puno praksu, ali zbog 540 00:28:50,620 --> 00:28:54,150 njihove sposobnosti da vam omogućiti proći podataka između funkcija 541 00:28:54,150 --> 00:28:56,945 a zapravo su oni promjene stupaju na snagu, 542 00:28:56,945 --> 00:28:58,820 uzimajući glavu oko je doista važno. 543 00:28:58,820 --> 00:29:02,590 Vjerojatno je najsloženiji Tema smo razgovarali u CS50, 544 00:29:02,590 --> 00:29:05,910 ali vrijednost te da je dobiti od korištenja upućuje 545 00:29:05,910 --> 00:29:09,200 daleko premašuje komplikacija koji dolaze iz njih učiti. 546 00:29:09,200 --> 00:29:12,690 Dakle, želim vam najbolje sreća učenje o pokazivače. 547 00:29:12,690 --> 00:29:15,760 Ja sam Doug Lloyd, ovo je CS50. 548 00:29:15,760 --> 00:29:17,447