1 00:00:00,000 --> 00:00:06,030 >> [Prehrávanie hudby] 2 00:00:06,030 --> 00:00:08,390 >> DOUG LLOYD: Ukazovatele, sme tu. 3 00:00:08,390 --> 00:00:11,080 To sa pravdepodobne bude najťažšie téma 4 00:00:11,080 --> 00:00:12,840 že hovoríme o v CS50. 5 00:00:12,840 --> 00:00:15,060 A ak ste dočítali nič o ukazovatele 6 00:00:15,060 --> 00:00:19,080 než by ste mohli byť trochu zastrašujúce ísť do tohto videa. 7 00:00:19,080 --> 00:00:21,260 Je pravda, že ukazovatele Myslíte si, aby schopnosť 8 00:00:21,260 --> 00:00:23,740 aby snáď mhouřit dosť zle, keď ste 9 00:00:23,740 --> 00:00:27,450 práca s premennými a dát, a spôsobuje váš program k havárii. 10 00:00:27,450 --> 00:00:30,490 Ale sú naozaj veľmi užitočné a oni nám to naozaj skvelý spôsob, ako umožniť 11 00:00:30,490 --> 00:00:33,340 odovzdať dáta späť a prepínať medzi funkciami, 12 00:00:33,340 --> 00:00:35,490 že sme schopní robiť inak. 13 00:00:35,490 --> 00:00:37,750 >> A tak to, čo naozaj chcete urobiť, je tu vlak 14 00:00:37,750 --> 00:00:41,060 budete mať dobrý ukazovateľ disciplínu, tak že môžete efektívne využívať ukazovatele 15 00:00:41,060 --> 00:00:43,850 aby sa vaše programy, ktoré oveľa lepšie. 16 00:00:43,850 --> 00:00:48,220 Ako som už povedal ukazovatele nám iný spôsob, ako odovzdať dáta medzi funkciami. 17 00:00:48,220 --> 00:00:50,270 Teraz, ak si spomínate z skoršie video, keď 18 00:00:50,270 --> 00:00:53,720 sme hovorili o variabilný priestor, som sa zmienil, 19 00:00:53,720 --> 00:01:00,610 že všetky údaje, ktoré sme prejsť medzi Funkcie v C je odovzdaný podľa hodnoty. 20 00:01:00,610 --> 00:01:03,070 A ja nemusí mať používal to Termín, čo som tam chcel 21 00:01:03,070 --> 00:01:07,170 bolo to, že sme okolo kópie dát. 22 00:01:07,170 --> 00:01:12,252 Keď sme sa odovzdať premennú do funkcie, nie sme v skutočnosti predkladanie ukazovateľa 23 00:01:12,252 --> 00:01:13,210 do funkcie, že jo? 24 00:01:13,210 --> 00:01:17,670 Sme odovzdaním kópie že dáta na funkciu. 25 00:01:17,670 --> 00:01:20,760 Táto funkcia robí to, čo bude a vypočítava nejakú hodnotu, 26 00:01:20,760 --> 00:01:23,180 a možno použijeme túto hodnotu keď to dáva ju späť. 27 00:01:23,180 --> 00:01:26,700 >> Tam bola jedna výnimka toto pravidlo odovzdávanie hodnotou, 28 00:01:26,700 --> 00:01:31,210 a my sa vrátime k tomu, čo, že je o niečo neskôr v tomto videu. 29 00:01:31,210 --> 00:01:34,880 Ak budeme používať ukazovatele miesto použitie premenných, 30 00:01:34,880 --> 00:01:38,180 alebo namiesto použitia premenných samy alebo kópie premenných, 31 00:01:38,180 --> 00:01:43,790 teraz môžeme prejsť okolo premenné medzi funkcie v inak. 32 00:01:43,790 --> 00:01:46,550 To znamená, že ak urobíme zmena v jednej funkcii, 33 00:01:46,550 --> 00:01:49,827 že zmena bude skutočne trvať vplyv v inej funkcii. 34 00:01:49,827 --> 00:01:52,160 Opäť platí, že to je niečo, sme nemohli urobiť skôr, 35 00:01:52,160 --> 00:01:56,979 a ak ste niekedy skúšali swap Hodnota dvoch premenných vo funkcii, 36 00:01:56,979 --> 00:01:59,270 ste si všimli tento problém nejako zakrádajú, že jo? 37 00:01:59,270 --> 00:02:04,340 >> Ak chceme vymeniť X a Y a my odovzdať ich do funkciu nazvanú swapu, 38 00:02:04,340 --> 00:02:08,680 vnútri funkcie swap premenné robiť výmennej hodnoty. 39 00:02:08,680 --> 00:02:12,600 Jedna sa stáva dvoch, dvoch sa stane jednu, ale nie v skutočnosti 40 00:02:12,600 --> 00:02:16,890 čokoľvek meniť v origináli funkcie, v volajúceho. 41 00:02:16,890 --> 00:02:19,550 Vzhľadom k tomu, nemôžeme, sme len práce s ich kópie. 42 00:02:19,550 --> 00:02:24,760 S ukazovateľmi ale môžeme skutočne prejsť X a Y do funkcie. 43 00:02:24,760 --> 00:02:26,960 Táto funkcia môže robiť čo s nimi. 44 00:02:26,960 --> 00:02:29,250 A tieto premenné hodnoty môže skutočne zmeniť. 45 00:02:29,250 --> 00:02:33,710 Tak to je celkom zmena naša schopnosť pracovať s dátami. 46 00:02:33,710 --> 00:02:36,100 >> Než sme sa ponoriť do ukazovatele, myslím, že to stojí za to 47 00:02:36,100 --> 00:02:38,580 pričom niekoľko minút, aby sa vrátiť k základom tu. 48 00:02:38,580 --> 00:02:41,000 A majú sa pozrieť, ako pamäť počítača práce 49 00:02:41,000 --> 00:02:45,340 pretože tieto dva predmety idú k vlastne byť celkom vzájomne prepojené. 50 00:02:45,340 --> 00:02:48,480 Ako asi viete, v systéme počítača 51 00:02:48,480 --> 00:02:51,310 máte pevný disk alebo snáď solid state drive, 52 00:02:51,310 --> 00:02:54,430 akési miesto uloženia súboru. 53 00:02:54,430 --> 00:02:57,950 Je to zvyčajne niekde v susedstve 250 gigabajtov 54 00:02:57,950 --> 00:02:59,810 sa možno pár terabajtov teraz. 55 00:02:59,810 --> 00:03:02,270 A to je miesto, kde všetky vaše Súbory nakoniec žiť, 56 00:03:02,270 --> 00:03:04,870 aj keď je počítač vypnutý off, môžete ho znovu zapnite 57 00:03:04,870 --> 00:03:09,190 a zistíte, vaše súbory sú tam opäť po reštarte systému. 58 00:03:09,190 --> 00:03:14,820 Ale disky, ako je pevný disk, HDD alebo SSD, SSD, 59 00:03:14,820 --> 00:03:16,050 sú proste úložný priestor. 60 00:03:16,050 --> 00:03:20,400 >> Nemôžeme vlastne robiť nič s dáta, ktoré sú v pevnom disku, 61 00:03:20,400 --> 00:03:22,080 alebo v SSD. 62 00:03:22,080 --> 00:03:24,950 Pre skutočné zmene údaje alebo ju presunúť okolo, 63 00:03:24,950 --> 00:03:28,800 musíme ju presunúť do RAM, pamäť s priamym prístupom. 64 00:03:28,800 --> 00:03:31,170 Teraz RAM, máte veľa menej vo vašom počítači. 65 00:03:31,170 --> 00:03:34,185 Môžete mať niekde v susedstve 512 megabajtov 66 00:03:34,185 --> 00:03:38,850 ak máte staršie počítač, na možno dva, štyri, osem, 16, 67 00:03:38,850 --> 00:03:41,820 možno dokonca aj trochu viac, GB pamäte RAM. 68 00:03:41,820 --> 00:03:46,390 Tak to je oveľa menšie, ale to je kde všetky prchavých dát existuje. 69 00:03:46,390 --> 00:03:48,270 To je miesto, kde môžeme veci zmeniť. 70 00:03:48,270 --> 00:03:53,350 Ale keď sme zase náš počítač vypnúť, všetky dáta v pamäti RAM je zničená. 71 00:03:53,350 --> 00:03:57,150 >> Takže to je dôvod, prečo musíme mať pevný disk Pre viac trvalé umiestnenie toho, 72 00:03:57,150 --> 00:03:59,720 tak, že by to exists- byť naozaj zlé, ak zakaždým, keď 73 00:03:59,720 --> 00:04:03,310 obrátil náš počítač vypnúť, každý súbor v našom systéme bola zničená. 74 00:04:03,310 --> 00:04:05,600 Tak sme prácu vnútri pamäte RAM. 75 00:04:05,600 --> 00:04:09,210 A zakaždým, keď hovoríme o pamäť, do značnej miery, v CS50, 76 00:04:09,210 --> 00:04:15,080 hovoríme o pamäti RAM, nie na pevnom disku. 77 00:04:15,080 --> 00:04:18,657 >> Takže keď sme sa presunúť veci do pamäti, zaberie určitý priestor. 78 00:04:18,657 --> 00:04:20,740 Všetky typy dát, ktoré sme pracovali s 79 00:04:20,740 --> 00:04:23,480 zaujímajú rôzne množstvo priestoru v pamäti RAM. 80 00:04:23,480 --> 00:04:27,600 Takže zakaždým, keď vytvoríte celé číslo variabilný, štyri bajtov pamäte 81 00:04:27,600 --> 00:04:30,750 sú vyčlenené v pamäti RAM, takže vás môže pracovať s týmto celé číslo. 82 00:04:30,750 --> 00:04:34,260 Môžete deklarovať celé číslo, zmeňte ho, priradiť 83 00:04:34,260 --> 00:04:36,700 na hodnotu 10 inkrementovanou jedným, tak ďalej a tak ďalej. 84 00:04:36,700 --> 00:04:39,440 Všetko, čo sa má stať v RAM, a dostanete štyri bajty 85 00:04:39,440 --> 00:04:42,550 pracovať s pre každú integer, ktoré vytvoríte. 86 00:04:42,550 --> 00:04:45,410 >> Každý znak vytvorenie dostane jeden bajt. 87 00:04:45,410 --> 00:04:48,160 To je len, koľko miesta je potrebné k uloženiu charakter. 88 00:04:48,160 --> 00:04:51,310 Každý plavák, skutočný číslo, dostane štyri byty 89 00:04:51,310 --> 00:04:53,390 ak je to double presnosť s plávajúcou desatinnou čiarkou 90 00:04:53,390 --> 00:04:56,510 číslo, ktoré vám umožnia majú presnejšie alebo číslic 91 00:04:56,510 --> 00:04:59,300 za desatinnou čiarkou bez straty presnosti, 92 00:04:59,300 --> 00:05:01,820 ktoré zaberajú osem bajtov pamäte. 93 00:05:01,820 --> 00:05:06,730 Dlhé túži, naozaj veľké celé čísla, tiež zaberajú osem bajtov pamäte. 94 00:05:06,730 --> 00:05:09,000 Koľko bajtov pamäte sa struny zaberajú? 95 00:05:09,000 --> 00:05:12,990 Tak poďme dať kolík v tejto otázke pre teraz, ale vrátime sa k tomu. 96 00:05:12,990 --> 00:05:17,350 >> Takže späť k tejto myšlienke pamäti ako veľké pole bajtov veľkosti buniek. 97 00:05:17,350 --> 00:05:20,871 To je naozaj všetko, čo je, je to len obrovská pole buniek, 98 00:05:20,871 --> 00:05:23,370 rovnako ako akékoľvek iné pole, ktoré ste oboznámení s, a vidieť, 99 00:05:23,370 --> 00:05:26,430 okrem každý prvok je jeden bajt široký. 100 00:05:26,430 --> 00:05:30,030 A rovnako ako pole, každý prvok má adresu. 101 00:05:30,030 --> 00:05:32,120 Každý prvok poľa má index a my 102 00:05:32,120 --> 00:05:36,302 Môžete použiť tento index na to tzv náhodný prístup na zoskupenie. 103 00:05:36,302 --> 00:05:38,510 Nemusíme začínať začiatok poľa, 104 00:05:38,510 --> 00:05:40,569 iterovat každý jediný prvok tejto zmluvy, 105 00:05:40,569 --> 00:05:41,860 nájsť to, čo hľadáme. 106 00:05:41,860 --> 00:05:45,790 Môžeme len povedať, chcem sa dostať do 15 prvok alebo 100. element. 107 00:05:45,790 --> 00:05:49,930 A môžete práve v ten číslo a získať hodnotu hľadáte. 108 00:05:49,930 --> 00:05:54,460 >> Podobne každé miesto V pamäti má adresu. 109 00:05:54,460 --> 00:05:57,320 Takže vaše pamäť by mohla vyzerať nejako takto. 110 00:05:57,320 --> 00:06:01,420 Tu je veľmi malý kus pamäť, to je 20 bajtov pamäte. 111 00:06:01,420 --> 00:06:04,060 Prvých 20 bytov, pretože my rieši tam dole 112 00:06:04,060 --> 00:06:08,890 sú 0, 1, 2, 3, a preto na celú cestu až do 19. 113 00:06:08,890 --> 00:06:13,190 A keď som deklarovať premenné a keď začnem pracovať s nimi, 114 00:06:13,190 --> 00:06:15,470 Systém bude nastavený stranou nejaký priestor pre mňa 115 00:06:15,470 --> 00:06:17,595 V tejto pamäti pracovať s mojimi premenných. 116 00:06:17,595 --> 00:06:21,610 A tak by som mohol povedať, char c rovná kapitál H. A čo sa bude diať? 117 00:06:21,610 --> 00:06:23,880 No systém bude vyčleniť pre mňa jeden bajt. 118 00:06:23,880 --> 00:06:27,870 V tomto prípade si vybral číslo bajtu štyri, byte na adrese štyri, 119 00:06:27,870 --> 00:06:31,310 a to bude ukladať písmeno H kapitál tam pre mňa. 120 00:06:31,310 --> 00:06:34,350 Ak by som potom povedal rýchlosť int Limit sa rovná 65, to je 121 00:06:34,350 --> 00:06:36,806 chystá vyčleniť štyri bajtov pamäte pre mňa. 122 00:06:36,806 --> 00:06:39,180 A to bude liečiť tých, štyri byty ako jeden celok 123 00:06:39,180 --> 00:06:41,305 pretože to, čo pracujeme s je celé číslo sem. 124 00:06:41,305 --> 00:06:44,350 A to bude ukladať 65 tam. 125 00:06:44,350 --> 00:06:47,000 >> Teraz už som si trochu hovorím trochu lož, 126 00:06:47,000 --> 00:06:50,150 pravdu, pretože vieme, že počítače pracujú v binárnej. 127 00:06:50,150 --> 00:06:53,100 Nechápu nutne to, čo je hlavným mestom H 128 00:06:53,100 --> 00:06:57,110 alebo čo je to 65 znamená, že iba pochopiť binárne, núl a jednotiek. 129 00:06:57,110 --> 00:06:59,000 A tak vlastne to, čo sme skladovanie tam 130 00:06:59,000 --> 00:07:03,450 nie je písmeno H a číslo 65, ale skôr binárne reprezentácie 131 00:07:03,450 --> 00:07:06,980 tejto zmluvy, ktoré vyzerajú Trochu niečo také. 132 00:07:06,980 --> 00:07:10,360 A najmä v kontext celočíselné premenné, 133 00:07:10,360 --> 00:07:13,559 to nebude len pľuvať do, že to nebude brať to ako jeden štvorlôžkový 134 00:07:13,559 --> 00:07:15,350 Byte kus nutne, je to vlastne deje 135 00:07:15,350 --> 00:07:19,570 brať to ako štyri jedného byte kúsky, ktorý by mohol vyzerať nejako takto. 136 00:07:19,570 --> 00:07:22,424 A ani to nie je úplne pravda buď, 137 00:07:22,424 --> 00:07:24,840 pretože niečo, čo nazýva endianness, čo nie sme 138 00:07:24,840 --> 00:07:26,965 sa dostať do teraz, ale ak ste zvedaví, 139 00:07:26,965 --> 00:07:29,030 si môžete prečítať na malý a veľké endianness. 140 00:07:29,030 --> 00:07:31,640 Ale na účely tohto argumentu, na účely tohto videa, 141 00:07:31,640 --> 00:07:34,860 poďme len predpokladať, že je v Skutočnosť, ako sa číslo 65 by 142 00:07:34,860 --> 00:07:36,970 byť zastúpený pamäť na každom systéme, 143 00:07:36,970 --> 00:07:38,850 aj keď to nie je úplne pravda. 144 00:07:38,850 --> 00:07:41,700 >> Ale poďme vlastne len dostať zbaviť všetkých binárne úplne, 145 00:07:41,700 --> 00:07:44,460 a len premýšľať o tom, ako H a 65, je to oveľa jednoduchšie 146 00:07:44,460 --> 00:07:47,900 premýšľať o tom takto že ako človek. 147 00:07:47,900 --> 00:07:51,420 Dobre, takže to tiež vyzerá, možno trochu náhodný, že I've- môj systém 148 00:07:51,420 --> 00:07:55,130 Nedal mi bytov 5, 6, 7, a 8 pre uloženie celé číslo. 149 00:07:55,130 --> 00:07:58,580 Je tu dôvod pre to, tiež, čo nebudeme sa do teraz, ale postačí 150 00:07:58,580 --> 00:08:00,496 uviesť, že to, čo Počítač je tu 151 00:08:00,496 --> 00:08:02,810 je pravdepodobne dobrý ťah z jeho strany. 152 00:08:02,810 --> 00:08:06,020 Ak nechcete, dajte mi pamäť, ktorá je nutne chrbtom k sebe. 153 00:08:06,020 --> 00:08:10,490 Aj keď to bude robiť to teraz keď chcem získať ďalšie reťazec, 154 00:08:10,490 --> 00:08:13,080 volal priezvisko, a ja chcem dať Lloyd tam. 155 00:08:13,080 --> 00:08:18,360 Budem potrebovať, aby sa zmestili jeden znak, každé písmeno, ktoré je 156 00:08:18,360 --> 00:08:21,330 bude vyžadovať jeden znak, jeden bajt z pamäte. 157 00:08:21,330 --> 00:08:26,230 Takže ak by som mohol dať Lloyd do môjho poľa takto som celkom dobrý ísť, nie? 158 00:08:26,230 --> 00:08:28,870 Čo chýba? 159 00:08:28,870 --> 00:08:31,840 >> Pamätajte si, že každý reťazec pracujeme sa v C končí spätné lomítko nula, 160 00:08:31,840 --> 00:08:33,339 a nemôžeme zabudnúť, že tu, a to buď. 161 00:08:33,339 --> 00:08:36,090 Musíme vyčleniť jeden bajt pamäti rozhodol, že tak sme 162 00:08:36,090 --> 00:08:39,130 vedieť, kedy náš reťazec skončila. 163 00:08:39,130 --> 00:08:41,049 Takže znovu toto usporiadanie z cesty vecí 164 00:08:41,049 --> 00:08:42,799 sa objaví v pamäti sile byť trochu náhodný, 165 00:08:42,799 --> 00:08:44,870 ale v skutočnosti je to, ako väčšina systémov sú určené. 166 00:08:44,870 --> 00:08:48,330 Ak chcete linka je na násobkoch štyri, z dôvodov, znovu 167 00:08:48,330 --> 00:08:50,080 že nepotrebujeme, aby dostať sa do teraz. 168 00:08:50,080 --> 00:08:53,060 Ale to je, tak stačí povedať, že po týchto troch riadkov kódu, 169 00:08:53,060 --> 00:08:54,810 to je to, čo pamäte by mohol vyzerať. 170 00:08:54,810 --> 00:08:58,930 Ak potrebujem pamäťových miest 4, 8, 12 a držať svoje dáta, 171 00:08:58,930 --> 00:09:01,100 To je to, čo moja pamäť by mohla vyzerať. 172 00:09:01,100 --> 00:09:04,062 >> A len byť obzvlášť tu, keď pedantská 173 00:09:04,062 --> 00:09:06,020 hovoríme o pamäti adresy zvyčajne 174 00:09:06,020 --> 00:09:08,390 tak urobiť pomocou hexadecimálne notácie. 175 00:09:08,390 --> 00:09:12,030 Tak prečo nie my previesť všetky z nich z desiatkovej na hexadecimálne 176 00:09:12,030 --> 00:09:15,010 len preto, že je všeobecne ako sme sa odkazovať na pamäti. 177 00:09:15,010 --> 00:09:17,880 A tak namiesto toho, aby 0 až 19, čo máme, je nulový 178 00:09:17,880 --> 00:09:20,340 x nula až nulovú x1 tri. 179 00:09:20,340 --> 00:09:23,790 Tí, ktorí sú 20 bajtov pamäti, že sme majú alebo sa pozeráme na tejto snímke 180 00:09:23,790 --> 00:09:25,540 práve tu. 181 00:09:25,540 --> 00:09:29,310 >> Takže to všetko bolo povedané, poďme krok od pamäte na sekundu 182 00:09:29,310 --> 00:09:30,490 a späť do ukazovateľa. 183 00:09:30,490 --> 00:09:32,420 Tu je najdôležitejšie vec na zapamätanie 184 00:09:32,420 --> 00:09:34,070 ako sme začať pracovať s ukazovateľmi. 185 00:09:34,070 --> 00:09:36,314 Ukazovateľ je nič viac ako adresu. 186 00:09:36,314 --> 00:09:38,230 Poviem to znovu, pretože je to tak dôležité, 187 00:09:38,230 --> 00:09:42,730 ukazovateľ nie je nič viac ako adresu. 188 00:09:42,730 --> 00:09:47,760 Ukazovatele sú adresy na miestach v pamäti, kde žijú premenné. 189 00:09:47,760 --> 00:09:52,590 S vedomím, že sa stane dúfajme, že trochu jednoduchšie s nimi pracovať. 190 00:09:52,590 --> 00:09:54,550 Ďalšia vec sa mi páči musíte urobiť, je mať triedenie 191 00:09:54,550 --> 00:09:58,510 diagramov vizuálne reprezentovať to, čo je deje s rôznymi riadkov kódu. 192 00:09:58,510 --> 00:10:00,660 A budeme to robiť pár časov v ukazovateľov, 193 00:10:00,660 --> 00:10:03,354 a keď hovoríme o dynamický alokácie pamäti rovnako. 194 00:10:03,354 --> 00:10:06,020 Pretože si myslím, že tieto diagramy môže byť obzvlášť užitočné. 195 00:10:06,020 --> 00:10:09,540 >> Takže keď poviem, napríklad, int k v mojom kódu, čo sa deje? 196 00:10:09,540 --> 00:10:12,524 No čo sa v podstate deje sa Začínam pamäte vyhradený pre mňa, 197 00:10:12,524 --> 00:10:14,690 ale nemám ani rád premýšľať o tom, ako to, že som 198 00:10:14,690 --> 00:10:16,300 Páči sa o tom premýšľať ako krabica. 199 00:10:16,300 --> 00:10:20,090 Mám krabici a je to zelenej farbe, pretože ja 200 00:10:20,090 --> 00:10:21,750 môže dať celé čísla v zelených poliach. 201 00:10:21,750 --> 00:10:23,666 Keby to bol charakter I môže mať modrú škatuľu. 202 00:10:23,666 --> 00:10:27,290 Ale ja vždy hovorím, keď som vytvoriť obdĺžnik, ktorý pojme celé čísla 203 00:10:27,290 --> 00:10:28,950 že box je sfarbená zelene. 204 00:10:28,950 --> 00:10:33,020 A ja sa stálou značku a píšem K na strane. 205 00:10:33,020 --> 00:10:37,590 Takže mám okno s názvom K, do ktorej môžem dať celé čísla. 206 00:10:37,590 --> 00:10:41,070 Takže keď poviem int k, to je čo sa deje v mojej hlave. 207 00:10:41,070 --> 00:10:43,140 Keď poviem k rovná päť, čo mám robiť? 208 00:10:43,140 --> 00:10:45,110 No, dávam päť v poli, vpravo. 209 00:10:45,110 --> 00:10:48,670 Toto je veľmi jednoduché, ak Hovorím int k vytvoriť okno s názvom k. 210 00:10:48,670 --> 00:10:52,040 Keď poviem k rovná 5, dať päť do krabice. 211 00:10:52,040 --> 00:10:53,865 Dúfajme, že to nie je príliš veľký skok. 212 00:10:53,865 --> 00:10:55,990 Tu je miesto, kde sa veci ísť málo zaujímavé hoci. 213 00:10:55,990 --> 00:11:02,590 Keď poviem, int * PK, dobre, aj keď to neurobím viem, čo to nevyhnutne znamená, 214 00:11:02,590 --> 00:11:06,150 Je to jasne niečo čo do činenia s celé číslo. 215 00:11:06,150 --> 00:11:08,211 Takže idem na farbu Tento box green-ish, 216 00:11:08,211 --> 00:11:10,210 Viem, že to má niečo čo do činenia s celým číslom, 217 00:11:10,210 --> 00:11:13,400 ale to nie je celé číslo samo o sebe, pretože je to int hviezda. 218 00:11:13,400 --> 00:11:15,390 Je tu niečo, mierne iný o tom. 219 00:11:15,390 --> 00:11:17,620 Takže zapojiť celé číslo je, ale inak je to 220 00:11:17,620 --> 00:11:19,830 príliš nelíši od to, čo sme hovorili o. 221 00:11:19,830 --> 00:11:24,240 Je to krabica, jej dostal označenie, je to na sebe štítok PK, 222 00:11:24,240 --> 00:11:27,280 a to je schopné udržať int hviezdy, bez ohľadu na to sú. 223 00:11:27,280 --> 00:11:29,894 Majú niečo spoločné s celými číslami, jasne. 224 00:11:29,894 --> 00:11:31,060 Tu je posledný riadok hoci. 225 00:11:31,060 --> 00:11:37,650 Keď poviem pk = & K, Whoa, čo sa práve stalo, že jo? 226 00:11:37,650 --> 00:11:41,820 Takže to náhodné číslo, zdanlivo náhodné číslo, dostane hodená do poľa tam. 227 00:11:41,820 --> 00:11:44,930 Všetko, čo je, je pk dostane adresu k. 228 00:11:44,930 --> 00:11:52,867 Takže som sa držať, kde k býva v pamäti, jeho adresu, na adresu jeho bajtov. 229 00:11:52,867 --> 00:11:55,200 Všetko, čo robím, je, že hovorím táto hodnota je to, čo budem 230 00:11:55,200 --> 00:11:59,430 dať vnútri mojej okno s názvom pk. 231 00:11:59,430 --> 00:12:02,080 A pretože tieto veci sú ukazovatele, a preto, že hľadáte 232 00:12:02,080 --> 00:12:04,955 na povrázku ako nulovú x eight zero c siedmich štyroch ôsmich 233 00:12:04,955 --> 00:12:07,790 dvoch nula je pravdepodobne nemá veľký význam. 234 00:12:07,790 --> 00:12:12,390 Keď sme sa všeobecne predstaviť ukazovatele, máme vlastne robiť tak ako ukazovatele. 235 00:12:12,390 --> 00:12:17,000 Pk nám dáva informáciu musíme nájsť K v pamäti. 236 00:12:17,000 --> 00:12:19,120 Takže v podstate pk má šípku v ňom. 237 00:12:19,120 --> 00:12:21,670 A ak budeme chodiť dĺžku tejto šípky, predstavte si, 238 00:12:21,670 --> 00:12:25,280 je to niečo, čo môžete ísť ďalej, keby sme prechádzka po celej dĺžke šípky, 239 00:12:25,280 --> 00:12:29,490 na samom konci tejto šípky, sme nájde miesto v pamäti 240 00:12:29,490 --> 00:12:31,390 kde k býva. 241 00:12:31,390 --> 00:12:34,360 A to je naozaj dôležité pretože akonáhle budeme vedieť, kde k bývajú, 242 00:12:34,360 --> 00:12:37,870 môžeme začať pracovať s dátami vnútri tej miesto v pamäti. 243 00:12:37,870 --> 00:12:40,780 Aj keď sme sa dostávame Teeny bit pred seba pre túto chvíľu. 244 00:12:40,780 --> 00:12:42,240 >> Takže to, čo je ukazovateľ? 245 00:12:42,240 --> 00:12:45,590 Ukazovateľ je dátová položka, ktorej hodnota je adresa pamäti. 246 00:12:45,590 --> 00:12:49,740 To bolo to, že nulou x osem nula stuff deje, že bola adresa pamäti. 247 00:12:49,740 --> 00:12:52,060 To bol umiestnenia v pamäti. 248 00:12:52,060 --> 00:12:55,080 A typ ukazovateľa opisuje druh 249 00:12:55,080 --> 00:12:56,930 dát nájdete v že adresa pamäti. 250 00:12:56,930 --> 00:12:58,810 Takže je tu int hviezda časť vpravo. 251 00:12:58,810 --> 00:13:03,690 Ak by som sa touto šíp, to je ma viesť k umiestnenie. 252 00:13:03,690 --> 00:13:06,980 A to je miesto, to, čo som Nájdete tu v mojom príklade, 253 00:13:06,980 --> 00:13:08,240 je zelený farebný box. 254 00:13:08,240 --> 00:13:12,650 Je to celé číslo, to je to, čo som Nájdete keď pôjdem na túto adresu. 255 00:13:12,650 --> 00:13:14,830 Typ Dátová ukazovateľ opisuje, čo sa 256 00:13:14,830 --> 00:13:17,936 nájdete na tejto adrese pamäti. 257 00:13:17,936 --> 00:13:19,560 Tak tu je naozaj super vec hoci. 258 00:13:19,560 --> 00:13:25,090 Ukazovatele nám umožňuje prejsť premenné medzi funkciami. 259 00:13:25,090 --> 00:13:28,520 A skutočne odovzdať premenné a neprejde ich kópie. 260 00:13:28,520 --> 00:13:32,879 Pretože ak budeme presne vedieť, kde v pamäti nájsť premennú, 261 00:13:32,879 --> 00:13:35,670 nepotrebujeme, aby kópiu to, môžeme ísť na dané miesto 262 00:13:35,670 --> 00:13:37,844 a prácu s týmto premenné. 263 00:13:37,844 --> 00:13:40,260 Takže v zásade iba ukazovatele sort o vytvorenie prostredia počítača 264 00:13:40,260 --> 00:13:42,360 oveľa viac ako v reálnom svete, hneď. 265 00:13:42,360 --> 00:13:44,640 >> Tak tu je analógiou. 266 00:13:44,640 --> 00:13:48,080 Povedzme, že mám notebook, vpravo, a je plná poznámok. 267 00:13:48,080 --> 00:13:50,230 A ja by som rád, keby ste ho aktualizovať. 268 00:13:50,230 --> 00:13:53,960 Ste funkcia, ktorá aktualizácie poznámky, správne. 269 00:13:53,960 --> 00:13:56,390 V spôsobe, akým sme boli pracuje tak ďaleko, čo 270 00:13:56,390 --> 00:14:02,370 stane sa budete mať môj notebook, pôjdete do obchodu kopírovanie, 271 00:14:02,370 --> 00:14:06,410 budete robiť kópiu Xerox o každá stránka notebooku. 272 00:14:06,410 --> 00:14:09,790 Budete opustiť svoj notebook späť na mojom stole, keď budete hotoví, 273 00:14:09,790 --> 00:14:14,600 pôjdeš a vyškrtnúť veci v mojom notebook, že sú zastarané alebo zle, 274 00:14:14,600 --> 00:14:19,280 a potom budete míňať späť me stoh stránok spoločnosti Xerox 275 00:14:19,280 --> 00:14:22,850 že je replikou môjho notebooku s zmeny, ktoré ste vykonali na neho. 276 00:14:22,850 --> 00:14:27,040 A v tomto bode, je to na mňa ako volajúci funkcie, ako volajúci, 277 00:14:27,040 --> 00:14:30,582 sa rozhodnú vziať svoje poznámky a začleniť ich späť do svojho notebooku. 278 00:14:30,582 --> 00:14:32,540 Takže je tu veľa krokov tu jedná, vpravo. 279 00:14:32,540 --> 00:14:34,850 Ako by to bolo lepšie keď som len povedať, hej, môžete 280 00:14:34,850 --> 00:14:38,370 aktualizovať svoje notebook pre me, odovzdať vám svoje notebook, 281 00:14:38,370 --> 00:14:40,440 a budete mať veci a doslova kríž je von 282 00:14:40,440 --> 00:14:42,810 a aktualizovať svoje poznámky v notebooku. 283 00:14:42,810 --> 00:14:45,140 A potom mi daj môj notebook späť. 284 00:14:45,140 --> 00:14:47,320 Je to niečo, čo ukazovatele nám umožňujú robiť, 285 00:14:47,320 --> 00:14:51,320 robia to prostredie veľa viac ako ako pracujeme v skutočnosti. 286 00:14:51,320 --> 00:14:54,640 >> Dobre, takže to, čo je ukazovateľ je, poďme hovoriť 287 00:14:54,640 --> 00:14:58,040 o tom, ako ukazovatele pracovať v C, a ako môžeme začať pracovať s nimi. 288 00:14:58,040 --> 00:15:02,550 Takže tam je veľmi jednoduchý ukazovateľ v C nazýva nulový ukazovateľ. 289 00:15:02,550 --> 00:15:04,830 Ukazovatele null ukazuje na nič. 290 00:15:04,830 --> 00:15:08,310 To pravdepodobne vyzerá, že to v skutočnosti nie je moc užitočná vec, 291 00:15:08,310 --> 00:15:10,500 ale ako budeme vidieť niečo neskôr, skutočnosť, 292 00:15:10,500 --> 00:15:15,410 že tento ukazovateľ null existuje v skutočnosti naozaj môže prísť vhod. 293 00:15:15,410 --> 00:15:19,090 A pri každom vytvorení ukazovateľ a nenastavíte jej hodnotu immediately- 294 00:15:19,090 --> 00:15:21,060 príklad nastavenia jeho hodnota okamžite 295 00:15:21,060 --> 00:15:25,401 bude pár snímok späť kde som povedal, pk rovná & K, 296 00:15:25,401 --> 00:15:28,740 pk dostane adresy K, ako je uvidíme, čo to znamená, 297 00:15:28,740 --> 00:15:32,990 uvidíme, ako sa kód, ktorý shortly- ak nebudeme nastavte jej hodnotu na niečo 298 00:15:32,990 --> 00:15:35,380 zmysluplné okamžite, by ste mali vždy 299 00:15:35,380 --> 00:15:37,480 nastavte ukazovateľ myši na bod na hodnotu null. 300 00:15:37,480 --> 00:15:40,260 Mali by ste nastaviť tak, aby ukazoval na nič. 301 00:15:40,260 --> 00:15:43,614 >> To je veľmi odlišné, než odchode hodnotu, ako je to 302 00:15:43,614 --> 00:15:45,530 a potom vyhlasuje ukazovateľ a len za predpokladu, že 303 00:15:45,530 --> 00:15:48,042 to je null, pretože to je len zriedka pravda. 304 00:15:48,042 --> 00:15:50,000 Takže by ste mali vždy nastaviť Hodnota ukazovateľa 305 00:15:50,000 --> 00:15:55,690 na null, ak nenastavíte jej hodnotu na niečo zmysluplné okamžite. 306 00:15:55,690 --> 00:15:59,090 Môžete skontrolovať, či hodnoty ukazovateľ je je null pomocou operátora rovnosti 307 00:15:59,090 --> 00:16:05,450 (==), Rovnako ako vy porovnať ľubovoľné celé číslo hodnoty alebo znak hodnoty pomocou (==) 308 00:16:05,450 --> 00:16:06,320 tiež. 309 00:16:06,320 --> 00:16:10,994 Je to zvláštny druh konštanty hodnota, ktorú možno použiť na testovanie. 310 00:16:10,994 --> 00:16:13,160 Takže to bol veľmi jednoduchý ukazovateľ, ukazovatele null. 311 00:16:13,160 --> 00:16:15,320 Ďalším spôsobom, ako vytvoriť ukazovateľ je získať 312 00:16:15,320 --> 00:16:18,240 adresa premenné ste už vytvorili, 313 00:16:18,240 --> 00:16:22,330 a vy to pomocou & adresa extrakcie operátor. 314 00:16:22,330 --> 00:16:26,720 Čo sme už videli skôr V prvom príklade diagrame som ukázal. 315 00:16:26,720 --> 00:16:31,450 Takže ak x je premenná, ktorá máme už vytvorili typu integer, 316 00:16:31,450 --> 00:16:35,110 potom a x je ukazovateľ na celé číslo. 317 00:16:35,110 --> 00:16:39,810 & X je- pamätať, a bude extrahovať adresa veci na pravej strane. 318 00:16:39,810 --> 00:16:45,350 A pretože ukazovateľ je len adresa, než & x je ukazovateľ na celé číslo 319 00:16:45,350 --> 00:16:48,560 , Ktorého hodnota je miesto, kde v pamäti x životoch. 320 00:16:48,560 --> 00:16:50,460 Je to adresa X .. 321 00:16:50,460 --> 00:16:53,296 Tak a x je adresa x. 322 00:16:53,296 --> 00:16:55,670 Zoberme si tento krok ďalej a pripojiť sa k niečomu 323 00:16:55,670 --> 00:16:58,380 Narážal Aj v predchádzajúcom videu. 324 00:16:58,380 --> 00:17:06,730 Ak arr je pole štvorhry, potom & Arr hranatou zátvorku aj je ukazovateľ 325 00:17:06,730 --> 00:17:08,109 na dvojnásobok. 326 00:17:08,109 --> 00:17:08,970 OK. 327 00:17:08,970 --> 00:17:12,160 arr zátvorka I, ak arr je pole sa zdvojnásobí, 328 00:17:12,160 --> 00:17:19,069 potom arr hranatou zátvorku aj je i-tý prvok daného poľa, 329 00:17:19,069 --> 00:17:29,270 a & ARR hranatou zátvorku aj je, kde sa v pamäť i-ty prvok arr existuje. 330 00:17:29,270 --> 00:17:31,790 >> Takže to, čo je tu dôsledky? 331 00:17:31,790 --> 00:17:34,570 Poľa meno, implikácia celej tej veci, 332 00:17:34,570 --> 00:17:39,290 Je to meno Array je vlastne sám ukazovateľ. 333 00:17:39,290 --> 00:17:41,170 Pracovali ste s ukazovateľmi všetky pozdĺž 334 00:17:41,170 --> 00:17:45,290 zakaždým, keď ste použili poľa. 335 00:17:45,290 --> 00:17:49,090 Nezabudnite z príkladu na variabilné rozsah, 336 00:17:49,090 --> 00:17:53,420 blízko konci videa Aj predstaviť príklad, kedy máme funkciu 337 00:17:53,420 --> 00:17:56,890 volal set int a Funkcia tzv set poľa. 338 00:17:56,890 --> 00:18:00,490 A vaša výzva na určenie, či alebo nie, alebo to, čo 339 00:18:00,490 --> 00:18:03,220 hodnoty, ktoré sme vytlačiť, koniec funkcie, 340 00:18:03,220 --> 00:18:05,960 Na konci hlavného programu. 341 00:18:05,960 --> 00:18:08,740 >> Ak si spomínate z tohto príkladu alebo ak ste sledovali video, 342 00:18:08,740 --> 00:18:13,080 Viete, že keď Knižný volanie set int efektívne nič nerobí. 343 00:18:13,080 --> 00:18:16,390 Ale výzva na nastavenie poľa robí. 344 00:18:16,390 --> 00:18:19,280 A nejako som prehliadal prečo že bol prípad v tom čase. 345 00:18:19,280 --> 00:18:22,363 Len som povedal, no je to pole, je to zvláštne, viete, je tu dôvod. 346 00:18:22,363 --> 00:18:25,020 Dôvodom je to, že matica je Názov je naozaj len ukazovateľ, 347 00:18:25,020 --> 00:18:28,740 a tam je to zvláštne hranatá zátvorka syntaxe 348 00:18:28,740 --> 00:18:30,510 aby sa veci oveľa lepšie pracovať. 349 00:18:30,510 --> 00:18:34,410 A oni robia myšlienku ukazovateľ oveľa menej zastrašujúce, 350 00:18:34,410 --> 00:18:36,800 a to je dôvod, prečo oni sú druh prezentované týmto spôsobom. 351 00:18:36,800 --> 00:18:38,600 Ale v skutočnosti polia sú len ukazovatele. 352 00:18:38,600 --> 00:18:41,580 A to je dôvod, prečo, keď sme urobil zmenu poľa, 353 00:18:41,580 --> 00:18:44,880 keď sme míňali pole ako parameter na funkciu alebo ako argument 354 00:18:44,880 --> 00:18:50,110 na funkciu, obsah poľa v skutočnosti zmení v volaným 355 00:18:50,110 --> 00:18:51,160 a v volajúceho. 356 00:18:51,160 --> 00:18:55,846 Ktoré pre každý iný druh variabilný sme videli, nebol tento prípad. 357 00:18:55,846 --> 00:18:58,970 Takže to je proste niečo, čo by ste mali mať na myseľ, keď pracujete s ukazovateľmi, 358 00:18:58,970 --> 00:19:01,610 je to, že na meno array vlastne ukazovateľ 359 00:19:01,610 --> 00:19:04,750 na prvý prvok tohto poľa. 360 00:19:04,750 --> 00:19:08,930 >> OK, takže teraz máme všetky tieto Fakty, poďme ďalej, že jo. 361 00:19:08,930 --> 00:19:11,370 Prečo sa staráme o kde niečo žije. 362 00:19:11,370 --> 00:19:14,120 No ako som povedal, je to celkom užitočné vedieť, kde žije niečo 363 00:19:14,120 --> 00:19:17,240 takže môžete ísť tam a zmeniť to. 364 00:19:17,240 --> 00:19:19,390 Práca s ním a vlastne majú veci, ktoré vás 365 00:19:19,390 --> 00:19:23,710 chcete urobiť, aby tejto premennej sa prejaví a neprejaví na nejaké kópie. 366 00:19:23,710 --> 00:19:26,150 To sa nazýva dereferencing. 367 00:19:26,150 --> 00:19:28,690 Ideme do referencie a zmeníme hodnotu tam. 368 00:19:28,690 --> 00:19:32,660 Takže ak budeme mať ukazovateľ a nazýva pc, a to ukazuje na charakter, 369 00:19:32,660 --> 00:19:40,610 potom môžeme povedať, * a * pc pc je Meno toho, čo nájdeme, keď pôjdeme 370 00:19:40,610 --> 00:19:42,910 na adresu PC. 371 00:19:42,910 --> 00:19:47,860 To, čo sme tam nájdete ich charakter a * Pc je, ako sme sa odkazovať na dáta na to 372 00:19:47,860 --> 00:19:48,880 lokalita. 373 00:19:48,880 --> 00:19:54,150 A tak by sme mohli povedať niečo ako * Ks = D, alebo niečo také, 374 00:19:54,150 --> 00:19:59,280 a to znamená, že bez ohľadu na bol na adresu pamäti PC, 375 00:19:59,280 --> 00:20:07,040 bez ohľadu na charakter bol predtým tam je teraz D, povieme-li, * ks = D. 376 00:20:07,040 --> 00:20:10,090 >> Tak je to tu zase s nejaký divný veci C, vpravo. 377 00:20:10,090 --> 00:20:14,560 Takže sme videli * skôr ako bytia nejako časť dátového typu, 378 00:20:14,560 --> 00:20:17,160 a teraz je to byť používaný v trochu iný kontext 379 00:20:17,160 --> 00:20:19,605 prístup k dátam na mieste. 380 00:20:19,605 --> 00:20:22,480 Viem, že je to trochu mätúce a to je vlastne súčasťou tohto celku 381 00:20:22,480 --> 00:20:25,740 ako, prečo ukazovatele majú túto mytológie okolo nich je tak zložitý, 382 00:20:25,740 --> 00:20:28,250 je tak trochu problém syntaxe, úprimne. 383 00:20:28,250 --> 00:20:31,810 Ale * je používaný v oboch kontextoch ako ako súčasť názvu typu, 384 00:20:31,810 --> 00:20:34,100 a uvidíme trochu neskôr niečo iné, taky. 385 00:20:34,100 --> 00:20:36,490 A práve teraz je operátor dereferencia. 386 00:20:36,490 --> 00:20:38,760 Tak to ide do referencie, pristupuje dáta 387 00:20:38,760 --> 00:20:43,000 v mieste ukazovatele, a vám umožňuje manipulovať podľa ľubovôle. 388 00:20:43,000 --> 00:20:45,900 >> Teraz je to veľmi podobné návšteve vášho suseda, hneď. 389 00:20:45,900 --> 00:20:48,710 Ak viete, aké sú vaše sused žije, si 390 00:20:48,710 --> 00:20:50,730 Nie je potĺkal so svojím susedom. 391 00:20:50,730 --> 00:20:53,510 Vieš, že ste náhodou viem, kde žijú, 392 00:20:53,510 --> 00:20:56,870 ale to neznamená, že by cnosť mať tieto znalosti 393 00:20:56,870 --> 00:20:59,170 ste interakciu s nimi. 394 00:20:59,170 --> 00:21:01,920 Ak chcete pracovať s nimi, budete musieť ísť do svojho domu, 395 00:21:01,920 --> 00:21:03,760 musíš ísť tam, kde žijú. 396 00:21:03,760 --> 00:21:07,440 A akonáhle to urobíte, potom môžete komunikovať 397 00:21:07,440 --> 00:21:09,420 sa s nimi rovnako ako by ste chceli. 398 00:21:09,420 --> 00:21:12,730 A podobne s premennými, musíte ísť na ich adresu 399 00:21:12,730 --> 00:21:15,320 pokiaľ ich chcete komunikovať, môžete nielen poznať adresu. 400 00:21:15,320 --> 00:21:21,495 A ako ste ísť na adresu je používať *, operátor dereferencia. 401 00:21:21,495 --> 00:21:23,620 Čo si myslíte, že sa stane keď sa budeme snažiť a dereferencia 402 00:21:23,620 --> 00:21:25,260 ukazovateľ, ktorého hodnota je null? 403 00:21:25,260 --> 00:21:28,470 Pripomeňme, že null ukazovateľ ukazuje na nič. 404 00:21:28,470 --> 00:21:34,110 Takže ak sa pokúsite a dereferencia nič, alebo ísť na adresu nič, 405 00:21:34,110 --> 00:21:36,800 Čo si myslíte, že sa stane? 406 00:21:36,800 --> 00:21:39,630 No, ak ste uhádol segmentácie chyba, mali by ste byť v poriadku. 407 00:21:39,630 --> 00:21:41,390 Ak sa pokúsite a dereferencia nulový ukazovateľ, 408 00:21:41,390 --> 00:21:43,140 utrpíte segmentácia porucha. Ale počkajte, 409 00:21:43,140 --> 00:21:45,820 Nehovoril som ti, že ak si nebudete 410 00:21:45,820 --> 00:21:49,220 nastaviť hodnotu svojho ukazovateľ na niečo zmysluplné, 411 00:21:49,220 --> 00:21:51,000 mali by ste nastaviť na null? 412 00:21:51,000 --> 00:21:55,290 Urobil som, a vlastne segmentácia vina je niečo dobré správanie. 413 00:21:55,290 --> 00:21:58,680 >> Už ste niekedy vyhlásený za premennú a Nie je okamžite priradená jej hodnotu? 414 00:21:58,680 --> 00:22:02,680 Takže stačí povedať int x; vy nie vlastne priradiť na čokoľvek 415 00:22:02,680 --> 00:22:05,340 a potom neskôr vo svojom kóde, môžete vytlačiť hodnotu x, 416 00:22:05,340 --> 00:22:07,650 majú stále nie je pridelený ho na čokoľvek. 417 00:22:07,650 --> 00:22:10,370 Často dostanete nula, ale niekedy 418 00:22:10,370 --> 00:22:15,000 môže získať nejaké náhodné číslo, a nemáte tušenie, odkiaľ pochádza. 419 00:22:15,000 --> 00:22:16,750 Podobne môžu veci sa stalo s ukazovateľmi. 420 00:22:16,750 --> 00:22:20,110 Keď deklarujete ukazovateľ int * pk napríklad, 421 00:22:20,110 --> 00:22:23,490 a nemusíte priradiť ju na hodnotu, dostanete štyri bajty pre pamäte. 422 00:22:23,490 --> 00:22:25,950 Či už štyri bajty Pamäť môže systém 423 00:22:25,950 --> 00:22:28,970 zistíte, že majú nejakú významnú hodnotu. 424 00:22:28,970 --> 00:22:31,760 A tam by mohol byť niečo, čo už tam, že 425 00:22:31,760 --> 00:22:34,190 už nie je potreba iný funkcie, takže stačí mať 426 00:22:34,190 --> 00:22:35,900 čo dáta boli tam. 427 00:22:35,900 --> 00:22:40,570 >> Čo keď ste sa pokúsili urobiť dereferencia niektorí adresa, ktorú don't- existovali 428 00:22:40,570 --> 00:22:43,410 Už bajtov a informácie v tam, že je teraz v ukazovateľom. 429 00:22:43,410 --> 00:22:47,470 Ak sa pokúsite, že dereferencia ukazovateľ, môžete byť umazávání s nejakou pamäťou 430 00:22:47,470 --> 00:22:49,390 že ste nemal v úmysle , Aby si s tým všetkým. 431 00:22:49,390 --> 00:22:51,639 A v skutočnosti by ste mohli urobiť niečo naozaj zničujúce, 432 00:22:51,639 --> 00:22:54,880 ako zlomiť ďalší program, alebo zlomiť inú funkciu, 433 00:22:54,880 --> 00:22:58,289 alebo robiť niečo nebezpečné, že ste nemal v úmysle robiť vôbec. 434 00:22:58,289 --> 00:23:00,080 A tak to je dôvod, prečo je v skutočnosti dobrý nápad 435 00:23:00,080 --> 00:23:04,030 stanoviť svoje ukazovatele na null, ak sa nenastavujte im niečo zmysluplné. 436 00:23:04,030 --> 00:23:06,760 Je to pravdepodobne lepšie u koniec dňa pre vášho programu 437 00:23:06,760 --> 00:23:09,840 k havárii potom pre to robiť Niečo, čo skrutky hore 438 00:23:09,840 --> 00:23:12,400 iný program či iné funkcie. 439 00:23:12,400 --> 00:23:15,207 To správanie je pravdepodobne ešte menej ako ideálne práve zhadzovať. 440 00:23:15,207 --> 00:23:17,040 A tak to je dôvod, prečo je vlastne dobrý zvyk 441 00:23:17,040 --> 00:23:20,920 dostať sa do nastavenia svojej ukazovateľov na null, ak nechcete nastaviť im 442 00:23:20,920 --> 00:23:24,540 ku zmysluplnému hodnotu okamžite, je hodnota, že viete, 443 00:23:24,540 --> 00:23:27,260 a že môžete bezpečne dereferencia. 444 00:23:27,260 --> 00:23:32,240 >> Takže poďme sa vrátiť teraz a pozrieť sa na celkovú syntax situácie. 445 00:23:32,240 --> 00:23:37,400 Keď poviem, int * p;, čo som práve urobil? 446 00:23:37,400 --> 00:23:38,530 To, čo som urobil, je toto. 447 00:23:38,530 --> 00:23:43,290 Viem, že hodnota p je adresa pretože všetky ukazovatele sú len 448 00:23:43,290 --> 00:23:44,660 adresy. 449 00:23:44,660 --> 00:23:47,750 Môžem dereferencia p pomocou operátora *. 450 00:23:47,750 --> 00:23:51,250 V tejto súvislosti je tu, v samom top Pripomeňme * je súčasťou typu. 451 00:23:51,250 --> 00:23:53,510 Int * je typ dát. 452 00:23:53,510 --> 00:23:56,150 Ale môžem dereferencia p pomocou operátora *, 453 00:23:56,150 --> 00:24:01,897 a keď som to, keď pôjdem na túto adresu, čo nájdem na tejto adrese? 454 00:24:01,897 --> 00:24:02,855 Nájdem celé číslo. 455 00:24:02,855 --> 00:24:05,910 Takže int * p je v podstate povediac, p je adresa. 456 00:24:05,910 --> 00:24:09,500 Môžem dereferencia p a pokiaľ Ja áno, nájdem celé číslo 457 00:24:09,500 --> 00:24:11,920 v tomto umiestnení pamäti. 458 00:24:11,920 --> 00:24:14,260 >> OK, takže som povedal, tam bol ďalší mrzutosť s hviezdami 459 00:24:14,260 --> 00:24:17,060 a tu je, kde to mrzutosť s hviezdami je. 460 00:24:17,060 --> 00:24:21,640 Už ste niekedy skúšali deklarovať viac premenných rovnakého typu 461 00:24:21,640 --> 00:24:24,409 na rovnakom riadku kódu? 462 00:24:24,409 --> 00:24:27,700 Takže na sekundu, predstierať, že riadok, kód Vlastne som tam v zelenej farbe 463 00:24:27,700 --> 00:24:29,366 tam nie je, a to len hovorí int x, y, z;. 464 00:24:29,366 --> 00:24:31,634 465 00:24:31,634 --> 00:24:34,550 Čo to bude robiť, je skutočne vytvoriť Tri celočíselné premenné pre vás, 466 00:24:34,550 --> 00:24:36,930 jeden s názvom x, jeden s názvom y, a jeden s názvom z. 467 00:24:36,930 --> 00:24:41,510 Je to spôsob, ako to urobiť bez toho, aby s rozdeliť na tri riadky. 468 00:24:41,510 --> 00:24:43,890 >> Tu je miesto, kde hviezdy dostať otravné znovu aj keď, 469 00:24:43,890 --> 00:24:49,200 pretože je v skutočnosti súčasťou * ako názov typu a časť 470 00:24:49,200 --> 00:24:50,320 z názvu premennej. 471 00:24:50,320 --> 00:24:56,430 A tak, keď poviem, int * px, py, pz, čo som skutočne dostať je ukazovateľ na celé číslo 472 00:24:56,430 --> 00:25:01,650 volal px a dve celé čísla, py a pz. 473 00:25:01,650 --> 00:25:04,950 A že to asi nie je to, čo Chceme, že to nie je dobré. 474 00:25:04,950 --> 00:25:09,290 >> Takže ak chcem vytvoriť viac ukazovatele na rovnakom riadku, rovnakého typu, 475 00:25:09,290 --> 00:25:12,140 a hviezdy, to, čo som skutočne potrebujú urobiť, je povedať, int * pa, pb *, * ks. 476 00:25:12,140 --> 00:25:17,330 477 00:25:17,330 --> 00:25:20,300 Teraz mať len povedal, že a teraz vám to hovorím, 478 00:25:20,300 --> 00:25:22,170 ste pravdepodobne nikdy urobiť. 479 00:25:22,170 --> 00:25:25,170 A to je asi dobrá vec úprimne, pretože by ste mohli nechtiac 480 00:25:25,170 --> 00:25:26,544 opomenúť hviezdu, niečo také. 481 00:25:26,544 --> 00:25:29,290 Je to asi najlepšia možná vyhlásiť ukazovatele na jednotlivých linkách, 482 00:25:29,290 --> 00:25:31,373 ale je to len ďalší z tie otravné syntaxe 483 00:25:31,373 --> 00:25:35,310 veci s hviezdami, ktoré robia ukazovatele tak ťažké s ním pracovať. 484 00:25:35,310 --> 00:25:39,480 Pretože je to práve tento syntaxe bordel musíte pracovať cez. 485 00:25:39,480 --> 00:25:41,600 S praxou to robí Naozaj stať druhou prirodzenosťou. 486 00:25:41,600 --> 00:25:45,410 Stále robiť chyby s ním ešte po naprogramovaní po dobu 10 rokov, 487 00:25:45,410 --> 00:25:49,630 takže sa nemusíte byť narušená, ak sa niečo stane pre vás, je to celkom bežné úprimne. 488 00:25:49,630 --> 00:25:52,850 Je to naozaj trochu vadou syntaxe. 489 00:25:52,850 --> 00:25:54,900 >> OK, takže som trochu sľúbil že by sme znovu 490 00:25:54,900 --> 00:25:59,370 koncept, aký veľký je reťazec. 491 00:25:59,370 --> 00:26:02,750 No, keby som vám povedal, že string, máme naozaj druh 492 00:26:02,750 --> 00:26:04,140 klamal vám po celú dobu. 493 00:26:04,140 --> 00:26:06,181 Neexistuje žiadny dátový typ nazvaný reťazec, a v skutočnosti ja 494 00:26:06,181 --> 00:26:09,730 zmienil v jednom z našich Najstaršie videá na dátové typy, 495 00:26:09,730 --> 00:26:13,820 že reťazec bol dátový typ, ktorý bol vytvorený pre vás CS50.h. 496 00:26:13,820 --> 00:26:17,050 Musíte #include CS50.h aby sa ju používať. 497 00:26:17,050 --> 00:26:19,250 >> No reťazec je naozaj len alias za niečo 498 00:26:19,250 --> 00:26:23,600 volal char *, a ukazovateľ na znak. 499 00:26:23,600 --> 00:26:26,010 No ukazovatele, odvolanie, sú proste rieši. 500 00:26:26,010 --> 00:26:28,780 Takže to, čo je veľkosť v bytoch reťazca? 501 00:26:28,780 --> 00:26:29,796 No to je štyri alebo osem. 502 00:26:29,796 --> 00:26:32,170 A dôvod, prečo hovorím, štyri alebo eight je preto, že v skutočnosti 503 00:26:32,170 --> 00:26:36,730 závisí na systéme, Ak používate CS50 ide, char * je veľkosť char 504 00:26:36,730 --> 00:26:39,340 * Je osem, to je 64-bitový systém. 505 00:26:39,340 --> 00:26:43,850 Každá adresa v pamäti je 64 bitov. 506 00:26:43,850 --> 00:26:48,270 Ak používate CS50 spotrebiče alebo pomocou ľubovoľného 32-bit stroj, 507 00:26:48,270 --> 00:26:51,640 a vy ste počuli, že termín 32-bit Stroj, čo je 32-bitový stroj? 508 00:26:51,640 --> 00:26:56,090 No to jednoducho znamená, že každý adresa v pamäti, je dlhé 32 bitov. 509 00:26:56,090 --> 00:26:59,140 A tak 32 bitov je štyri bajty. 510 00:26:59,140 --> 00:27:02,710 Takže char * sú štyri alebo osem bajtov v závislosti na vašom systéme. 511 00:27:02,710 --> 00:27:06,100 A skutočne všetky dátové typy, a ukazovateľ na akýchkoľvek údajov 512 00:27:06,100 --> 00:27:12,030 typ, pretože všetky ukazovatele sú len adresy, sú štyri alebo osem bajtov. 513 00:27:12,030 --> 00:27:14,030 Takže poďme to znova diagram a poďme k záveru, 514 00:27:14,030 --> 00:27:18,130 toto video s trochou cvičenia tu. 515 00:27:18,130 --> 00:27:21,600 Tak tu je diagram sme prestali s na samom začiatku videa. 516 00:27:21,600 --> 00:27:23,110 Tak čo sa stane teraz, keď poviem * PK = 35? 517 00:27:23,110 --> 00:27:26,370 518 00:27:26,370 --> 00:27:30,530 Takže čo to znamená, keď hovorím, * pk = 35? 519 00:27:30,530 --> 00:27:32,420 Vezmite chvíľku. 520 00:27:32,420 --> 00:27:34,990 * Pk. 521 00:27:34,990 --> 00:27:39,890 V súvislosti tu, je * operátor dereferencia. 522 00:27:39,890 --> 00:27:42,110 Takže keď dereferencia Operátor sa používa, 523 00:27:42,110 --> 00:27:48,520 ideme na adresu poukázal na o PK, a my sa zmeniť to, čo nájdeme. 524 00:27:48,520 --> 00:27:55,270 Takže * pk = 35 účinne to vykoná na obrázku. 525 00:27:55,270 --> 00:27:58,110 Takže je to v podstate syntakticky identické s z toho, že uvedený k = 35. 526 00:27:58,110 --> 00:28:00,740 527 00:28:00,740 --> 00:28:01,930 >> Ešte jeden. 528 00:28:01,930 --> 00:28:05,510 Keď poviem int m, tvorím novú premennú s názvom m. 529 00:28:05,510 --> 00:28:08,260 Nový box, to je zelené polia, pretože to bude držať celé číslo, 530 00:28:08,260 --> 00:28:09,840 a to je označený m. 531 00:28:09,840 --> 00:28:14,960 Keď poviem m = 4, dal som integer do tohto boxu. 532 00:28:14,960 --> 00:28:20,290 Ak povedzme pk = & m, ako sa robí táto zmena diagram? 533 00:28:20,290 --> 00:28:28,760 Pk = & m, spomínate si, čo sa & Operátor robí alebo sa volá? 534 00:28:28,760 --> 00:28:34,430 Pamätajte si, že nejaké & názov premennej je adresa názvu premenné. 535 00:28:34,430 --> 00:28:38,740 Takže to, čo hovoríme, je pk dostane adresu m. 536 00:28:38,740 --> 00:28:42,010 A čo sa stane, tak efektívne diagram je, že pk nie je dlhšia body 537 00:28:42,010 --> 00:28:46,420 až k, ale pripomína, m. 538 00:28:46,420 --> 00:28:48,470 >> Opäť ukazovatele sú veľmi zložité pre prácu s 539 00:28:48,470 --> 00:28:50,620 a berú veľa praxe, ale preto, 540 00:28:50,620 --> 00:28:54,150 ich schopnosti, aby vám pre prenos dát medzi funkciami 541 00:28:54,150 --> 00:28:56,945 a skutočne tí, Zmeny sa prejavia, 542 00:28:56,945 --> 00:28:58,820 ako sa vaša hlava okolo je naozaj dôležité. 543 00:28:58,820 --> 00:29:02,590 Pravdepodobne je najzložitejšie tému diskutujeme v CS50, 544 00:29:02,590 --> 00:29:05,910 ale hodnota, ktorá vás získať od používania ukazovateľa 545 00:29:05,910 --> 00:29:09,200 zďaleka preváži komplikácií ktoré pochádzajú z zoznámenie sa s nimi. 546 00:29:09,200 --> 00:29:12,690 Takže prajem to najlepšie z šťastie učenie o ukazovatele. 547 00:29:12,690 --> 00:29:15,760 Som Doug Lloyd, je to CS50. 548 00:29:15,760 --> 00:29:17,447