1 00:00:00,000 --> 00:00:06,030 >> [Přehrávání hudby] 2 00:00:06,030 --> 00:00:08,390 >> DOUG LLOYD: Ukazatele, jsme tady. 3 00:00:08,390 --> 00:00:11,080 To se pravděpodobně bude nejtěžší téma 4 00:00:11,080 --> 00:00:12,840 že mluvíme o v CS50. 5 00:00:12,840 --> 00:00:15,060 A pokud jste dočetli nic o ukazatele 6 00:00:15,060 --> 00:00:19,080 než byste mohli být trochu zastrašující jít do tohoto videa. 7 00:00:19,080 --> 00:00:21,260 Je pravda, že ukazatele Myslíte si, aby schopnost 8 00:00:21,260 --> 00:00:23,740 aby snad mhouřit dost špatně, když jste 9 00:00:23,740 --> 00:00:27,450 práce s proměnnými a dat, a způsobuje váš program k havárii. 10 00:00:27,450 --> 00:00:30,490 Ale jsou opravdu velmi užitečné a oni nám to opravdu skvělý způsob, jak umožnit 11 00:00:30,490 --> 00:00:33,340 předat data zpět a přepínat mezi funkcemi, 12 00:00:33,340 --> 00:00:35,490 že jsme schopni dělat jinak. 13 00:00:35,490 --> 00:00:37,750 >> A tak to, co opravdu chcete udělat, je zde vlak 14 00:00:37,750 --> 00:00:41,060 budete mít dobrý ukazatel disciplínu, tak že můžete efektivně využívat ukazatele 15 00:00:41,060 --> 00:00:43,850 aby se vaše programy, které mnohem lépe. 16 00:00:43,850 --> 00:00:48,220 Jak jsem již řekl ukazatele nám jiný způsob, jak předat data mezi funkcemi. 17 00:00:48,220 --> 00:00:50,270 Nyní, pokud si vzpomínáte z dřívější video, když 18 00:00:50,270 --> 00:00:53,720 jsme mluvili o variabilní prostor, jsem se zmínil, 19 00:00:53,720 --> 00:01:00,610 že všechny údaje, které jsme projít mezi Funkce v C je předán podle hodnoty. 20 00:01:00,610 --> 00:01:03,070 A já nemusí mít používal to Termín, co jsem tam chtěl 21 00:01:03,070 --> 00:01:07,170 bylo to, že jsme kolem kopie dat. 22 00:01:07,170 --> 00:01:12,252 Když jsme se předat proměnnou do funkce, nejsme ve skutečnosti předávání proměnné 23 00:01:12,252 --> 00:01:13,210 do funkce, že jo? 24 00:01:13,210 --> 00:01:17,670 Jsme předáním kopie že data na funkci. 25 00:01:17,670 --> 00:01:20,760 Tato funkce dělá to, co bude a vypočítává nějakou hodnotu, 26 00:01:20,760 --> 00:01:23,180 a možná použijeme tuto hodnotu když to dává ji zpět. 27 00:01:23,180 --> 00:01:26,700 >> Tam byla jedna výjimka toto pravidlo předávání hodnotou, 28 00:01:26,700 --> 00:01:31,210 a my se vrátíme k tomu, co, že je o něco později v tomto videu. 29 00:01:31,210 --> 00:01:34,880 Pokud budeme používat ukazatele místo použití proměnných, 30 00:01:34,880 --> 00:01:38,180 nebo namísto použití proměnných samy nebo kopie proměnných, 31 00:01:38,180 --> 00:01:43,790 nyní můžeme projít kolem proměnné mezi funkce v jinak. 32 00:01:43,790 --> 00:01:46,550 To znamená, že pokud uděláme změna v jedné funkci, 33 00:01:46,550 --> 00:01:49,827 že změna bude skutečně trvat vliv v jiné funkci. 34 00:01:49,827 --> 00:01:52,160 Opět platí, že to je něco, jsme nemohli udělat dříve, 35 00:01:52,160 --> 00:01:56,979 a pokud jste někdy zkoušeli swap Hodnota dvou proměnných ve funkci, 36 00:01:56,979 --> 00:01:59,270 jste si všimli tento problém nějak plíží, že jo? 37 00:01:59,270 --> 00:02:04,340 >> Pokud chceme vyměnit X a Y a my předat je do funkci nazvanou swapu, 38 00:02:04,340 --> 00:02:08,680 uvnitř funkce swap proměnné dělat směnné hodnoty. 39 00:02:08,680 --> 00:02:12,600 Jedna se stává dvou, dvou se stane jednu, ale ne ve skutečnosti 40 00:02:12,600 --> 00:02:16,890 cokoliv měnit v originále funkce, v volajícího. 41 00:02:16,890 --> 00:02:19,550 Vzhledem k tomu, nemůžeme, jsme jen práce s jejich kopie. 42 00:02:19,550 --> 00:02:24,760 S ukazateli ale můžeme skutečně projít X a Y do funkce. 43 00:02:24,760 --> 00:02:26,960 Tato funkce může dělat co s nimi. 44 00:02:26,960 --> 00:02:29,250 A tyto proměnné hodnoty může skutečně změnit. 45 00:02:29,250 --> 00:02:33,710 Tak to je docela změna naše schopnost pracovat s daty. 46 00:02:33,710 --> 00:02:36,100 >> Než jsme se ponořit do ukazatele, myslím, že to stojí za to 47 00:02:36,100 --> 00:02:38,580 přičemž několik minut, aby se vrátit k základům zde. 48 00:02:38,580 --> 00:02:41,000 A mají se podívat, jak paměť počítače práce 49 00:02:41,000 --> 00:02:45,340 protože tyto dva předměty jdou k vlastně být docela vzájemně propojeny. 50 00:02:45,340 --> 00:02:48,480 Jak asi víte, v systému počítače 51 00:02:48,480 --> 00:02:51,310 máte pevný disk nebo snad solid state drive, 52 00:02:51,310 --> 00:02:54,430 jakési místo uložení souboru. 53 00:02:54,430 --> 00:02:57,950 Je to obvykle někde v sousedství 250 gigabajtů 54 00:02:57,950 --> 00:02:59,810 se možná pár terabajtů nyní. 55 00:02:59,810 --> 00:03:02,270 A to je místo, kde všechny vaše Soubory nakonec žít, 56 00:03:02,270 --> 00:03:04,870 i když je počítač vypnut off, můžete jej znovu zapněte 57 00:03:04,870 --> 00:03:09,190 a zjistíte, vaše soubory jsou tam opět po restartu systému. 58 00:03:09,190 --> 00:03:14,820 Ale disky, jako je pevný disk, HDD nebo SSD, SSD, 59 00:03:14,820 --> 00:03:16,050 jsou prostě úložný prostor. 60 00:03:16,050 --> 00:03:20,400 >> Nemůžeme vlastně dělat nic s data, která jsou v pevném disku, 61 00:03:20,400 --> 00:03:22,080 nebo v SSD. 62 00:03:22,080 --> 00:03:24,950 Pro skutečné změně údaje nebo ji přesunout kolem, 63 00:03:24,950 --> 00:03:28,800 musíme ji přesunout do RAM, paměť s přímým přístupem. 64 00:03:28,800 --> 00:03:31,170 Nyní RAM, máte hodně méně ve vašem počítači. 65 00:03:31,170 --> 00:03:34,185 Můžete mít někde v sousedství 512 megabajtů 66 00:03:34,185 --> 00:03:38,850 pokud máte starší počítač, na možná dva, čtyři, osm, 16, 67 00:03:38,850 --> 00:03:41,820 možná dokonce i trochu více, GB paměti RAM. 68 00:03:41,820 --> 00:03:46,390 Tak to je mnohem menší, ale to je kde všechny těkavých dat existuje. 69 00:03:46,390 --> 00:03:48,270 To je místo, kde můžeme věci změnit. 70 00:03:48,270 --> 00:03:53,350 Ale když jsme zase náš počítač vypnout, všechna data v paměti RAM je zničena. 71 00:03:53,350 --> 00:03:57,150 >> Takže to je důvod, proč musíme mít pevný disk Pro více trvalé umístění toho, 72 00:03:57,150 --> 00:03:59,720 tak, že by to exists- být opravdu špatné, pokud pokaždé, když 73 00:03:59,720 --> 00:04:03,310 obrátil náš počítač vypnout, každý soubor v našem systému byla zničena. 74 00:04:03,310 --> 00:04:05,600 Tak jsme práci uvnitř paměti RAM. 75 00:04:05,600 --> 00:04:09,210 A pokaždé, když mluvíme o paměť, do značné míry, v CS50, 76 00:04:09,210 --> 00:04:15,080 mluvíme o paměti RAM, nikoliv na pevném disku. 77 00:04:15,080 --> 00:04:18,657 >> Takže když jsme se přesunout věci do paměti, zabere určitý prostor. 78 00:04:18,657 --> 00:04:20,740 Všechny typy dat, které jsme pracovali s 79 00:04:20,740 --> 00:04:23,480 zaujímají různé množství prostoru v paměti RAM. 80 00:04:23,480 --> 00:04:27,600 Takže pokaždé, když vytvoříte celé číslo variabilní, čtyři bajtů paměti 81 00:04:27,600 --> 00:04:30,750 jsou vyčleněny v paměti RAM, takže vás může pracovat s tímto celé číslo. 82 00:04:30,750 --> 00:04:34,260 Můžete deklarovat celé číslo, změňte jej, přiřadit 83 00:04:34,260 --> 00:04:36,700 na hodnotu 10 inkrementovanou jedním, tak dále a tak dále. 84 00:04:36,700 --> 00:04:39,440 Vše, co se má stát v RAM, a dostanete čtyři bajty 85 00:04:39,440 --> 00:04:42,550 pracovat s pro každou integer, které vytvoříte. 86 00:04:42,550 --> 00:04:45,410 >> Každý znak vytvoření dostane jeden bajt. 87 00:04:45,410 --> 00:04:48,160 To je jen, kolik místa je potřebné k uložení charakter. 88 00:04:48,160 --> 00:04:51,310 Každý plovák, skutečný číslo, dostane čtyři byty 89 00:04:51,310 --> 00:04:53,390 pokud je to double přesnost s plovoucí desetinnou čárkou 90 00:04:53,390 --> 00:04:56,510 číslo, které vám umožní mají přesnější nebo číslic 91 00:04:56,510 --> 00:04:59,300 za desetinnou čárkou bez ztráty přesnosti, 92 00:04:59,300 --> 00:05:01,820 které zabírají osm bajtů paměti. 93 00:05:01,820 --> 00:05:06,730 Dlouhé touží, opravdu velké celá čísla, také zabírají osm bajtů paměti. 94 00:05:06,730 --> 00:05:09,000 Kolik bajtů paměti se struny zabírají? 95 00:05:09,000 --> 00:05:12,990 Tak pojďme dát kolík v této otázce pro teď, ale vrátíme se k tomu. 96 00:05:12,990 --> 00:05:17,350 >> Takže zpět k této myšlence paměti jako velké pole bajtů velikosti buněk. 97 00:05:17,350 --> 00:05:20,871 To je opravdu vše, co je, je to jen obrovská pole buněk, 98 00:05:20,871 --> 00:05:23,370 stejně jako jakékoli jiné pole, které jste obeznámeni s, a vidět, 99 00:05:23,370 --> 00:05:26,430 kromě každý prvek je jeden bajt široký. 100 00:05:26,430 --> 00:05:30,030 A stejně jako pole, každý prvek má adresu. 101 00:05:30,030 --> 00:05:32,120 Každý prvek pole má index a my 102 00:05:32,120 --> 00:05:36,302 Můžete použít tento index k tomu tzv náhodný přístup na seskupení. 103 00:05:36,302 --> 00:05:38,510 Nemusíme začínat začátek pole, 104 00:05:38,510 --> 00:05:40,569 iterovat každý jediný prvek této smlouvy, 105 00:05:40,569 --> 00:05:41,860 najít to, co hledáme. 106 00:05:41,860 --> 00:05:45,790 Můžeme jen říct, chci se dostat do 15 prvek nebo 100. element. 107 00:05:45,790 --> 00:05:49,930 A můžete právě v ten číslo a získat hodnotu hledáte. 108 00:05:49,930 --> 00:05:54,460 >> Podobně každé místo V paměti má adresu. 109 00:05:54,460 --> 00:05:57,320 Takže vaše paměť by mohla vypadat nějak takto. 110 00:05:57,320 --> 00:06:01,420 Zde je velmi malý kus paměť, to je 20 bajtů paměti. 111 00:06:01,420 --> 00:06:04,060 Prvních 20 bytů, protože my řeší tam dole 112 00:06:04,060 --> 00:06:08,890 jsou 0, 1, 2, 3, a proto na celou cestu až do 19. 113 00:06:08,890 --> 00:06:13,190 A když jsem deklarovat proměnné a když začnu pracovat s nimi, 114 00:06:13,190 --> 00:06:15,470 Systém bude nastaven stranou nějaký prostor pro mě 115 00:06:15,470 --> 00:06:17,595 V této paměti pracovat s mými proměnných. 116 00:06:17,595 --> 00:06:21,610 A tak bych mohl říci, char c rovná kapitál H. A co se bude dít? 117 00:06:21,610 --> 00:06:23,880 No systém bude vyčlenit pro mě jeden bajt. 118 00:06:23,880 --> 00:06:27,870 V tomto případě si vybral číslo bajtu čtyři, byte na adrese čtyři, 119 00:06:27,870 --> 00:06:31,310 a to bude ukládat písmeno H kapitál tam pro mě. 120 00:06:31,310 --> 00:06:34,350 Pokud bych pak řekl rychlost int Limit se rovná 65, to je 121 00:06:34,350 --> 00:06:36,806 chystá vyčlenit čtyři bajtů paměti pro mě. 122 00:06:36,806 --> 00:06:39,180 A to bude léčit ty, čtyři byty jako jeden celek 123 00:06:39,180 --> 00:06:41,305 protože to, co pracujeme s je celé číslo sem. 124 00:06:41,305 --> 00:06:44,350 A to bude ukládat 65 tam. 125 00:06:44,350 --> 00:06:47,000 >> Teď už jsem si trochu říkám trochu lež, 126 00:06:47,000 --> 00:06:50,150 pravdu, protože víme, že počítače pracují v binární. 127 00:06:50,150 --> 00:06:53,100 Nechápou nutně to, co je hlavním městem H 128 00:06:53,100 --> 00:06:57,110 nebo co je to 65 znamená, že pouze pochopit binární, nul a jedniček. 129 00:06:57,110 --> 00:06:59,000 A tak vlastně to, co jsme skladování tam 130 00:06:59,000 --> 00:07:03,450 není písmeno H a číslo 65, ale spíše binární reprezentace 131 00:07:03,450 --> 00:07:06,980 této smlouvy, které vypadají Trochu něco takového. 132 00:07:06,980 --> 00:07:10,360 A zejména v kontext celočíselné proměnné, 133 00:07:10,360 --> 00:07:13,559 to nebude jen plivat do, že to nebude brát to jako jeden čtyřlůžkový 134 00:07:13,559 --> 00:07:15,350 byte kus nutně, je to vlastně děje 135 00:07:15,350 --> 00:07:19,570 brát to jako čtyři jednoho byte kousky, který by mohl vypadat nějak takto. 136 00:07:19,570 --> 00:07:22,424 A ani to není úplně pravda buď, 137 00:07:22,424 --> 00:07:24,840 protože něco, co nazývá endianness, což nejsme 138 00:07:24,840 --> 00:07:26,965 se dostat do teď, ale pokud jste zvědaví, 139 00:07:26,965 --> 00:07:29,030 si můžete přečíst na malý a velké endianness. 140 00:07:29,030 --> 00:07:31,640 Ale pro účely tohoto argumentu, pro účely tohoto videa, 141 00:07:31,640 --> 00:07:34,860 pojďme jen předpokládat, že je v Skutečnost, jak se číslo 65 by 142 00:07:34,860 --> 00:07:36,970 být zastoupen paměť na každém systému, 143 00:07:36,970 --> 00:07:38,850 i když to není úplně pravda. 144 00:07:38,850 --> 00:07:41,700 >> Ale pojďme vlastně jen dostat zbavit všech binární úplně, 145 00:07:41,700 --> 00:07:44,460 a jen přemýšlet o tom, jak H a 65, je to mnohem snazší 146 00:07:44,460 --> 00:07:47,900 přemýšlet o tom takhle že jako člověk. 147 00:07:47,900 --> 00:07:51,420 Dobře, takže to také vypadá, možná trochu náhodný, že I've- můj systém 148 00:07:51,420 --> 00:07:55,130 Nedal mi bytů 5, 6, 7, a 8 pro uložení celé číslo. 149 00:07:55,130 --> 00:07:58,580 Je tu důvod pro to, také, což nebudeme se do teď, ale postačí 150 00:07:58,580 --> 00:08:00,496 uvést, že to, co Počítač je tady 151 00:08:00,496 --> 00:08:02,810 je pravděpodobně dobrý tah z jeho strany. 152 00:08:02,810 --> 00:08:06,020 Nechcete-li, dejte mi paměť, která je nutně zády k sobě. 153 00:08:06,020 --> 00:08:10,490 I když to bude dělat to teď když chci získat další řetězec, 154 00:08:10,490 --> 00:08:13,080 volal příjmení, a já chci dát Lloyd tam. 155 00:08:13,080 --> 00:08:18,360 Budu potřebovat, aby se vešly jeden znak, každé písmeno, které je 156 00:08:18,360 --> 00:08:21,330 bude vyžadovat jeden znak, jeden bajt z paměti. 157 00:08:21,330 --> 00:08:26,230 Takže pokud bych mohl dát Lloyd do mého pole takhle jsem docela dobrý jít, ne? 158 00:08:26,230 --> 00:08:28,870 Co chybí? 159 00:08:28,870 --> 00:08:31,840 >> Pamatujte si, že každý řetězec pracujeme se v C končí zpětné lomítko nula, 160 00:08:31,840 --> 00:08:33,339 a nemůžeme opomenout, že tady, a to buď. 161 00:08:33,339 --> 00:08:36,090 Musíme vyčlenit jeden bajt paměti rozhodl, že tak jsme 162 00:08:36,090 --> 00:08:39,130 vědět, kdy náš řetězec skončila. 163 00:08:39,130 --> 00:08:41,049 Takže znovu toto uspořádání z cesty věcí 164 00:08:41,049 --> 00:08:42,799 se objeví v paměti síle být trochu náhodný, 165 00:08:42,799 --> 00:08:44,870 ale ve skutečnosti je to, jak většina systémů jsou určeny. 166 00:08:44,870 --> 00:08:48,330 Chcete-li linka je na násobcích čtyři, z důvodů, znovu 167 00:08:48,330 --> 00:08:50,080 že nepotřebujeme, aby dostat se do teď. 168 00:08:50,080 --> 00:08:53,060 Ale to je, tak stačí říct, že po těchto tří řádků kódu, 169 00:08:53,060 --> 00:08:54,810 to je to, co paměti by mohl vypadat. 170 00:08:54,810 --> 00:08:58,930 Pokud potřebuji paměťových míst 4, 8, 12 a držet svá data, 171 00:08:58,930 --> 00:09:01,100 To je to, co moje paměť by mohla vypadat. 172 00:09:01,100 --> 00:09:04,062 >> A jen být zvláště tady, když pedantský 173 00:09:04,062 --> 00:09:06,020 mluvíme o paměti adresy obvykle 174 00:09:06,020 --> 00:09:08,390 tak učinit pomocí hexadecimální notace. 175 00:09:08,390 --> 00:09:12,030 Tak proč ne my převést všechny z nich z desítkové na šestnáctkové soustavě 176 00:09:12,030 --> 00:09:15,010 jen proto, že je všeobecně jak jsme se odkazovat na paměti. 177 00:09:15,010 --> 00:09:17,880 A tak místo toho, aby 0 až 19, co máme, je nulový 178 00:09:17,880 --> 00:09:20,340 x nula až nulovou x1 tři. 179 00:09:20,340 --> 00:09:23,790 Ti, kteří jsou 20 bajtů paměti, že jsme mají nebo se díváme na tomto snímku 180 00:09:23,790 --> 00:09:25,540 právě tady. 181 00:09:25,540 --> 00:09:29,310 >> Takže to všechno bylo řečeno, pojďme krok od paměti na vteřinu 182 00:09:29,310 --> 00:09:30,490 a zpět do ukazatele. 183 00:09:30,490 --> 00:09:32,420 Zde je nejdůležitější věc k zapamatování 184 00:09:32,420 --> 00:09:34,070 jak jsme začít pracovat s ukazateli. 185 00:09:34,070 --> 00:09:36,314 Ukazatel je nic více než adresu. 186 00:09:36,314 --> 00:09:38,230 Řeknu to znovu, protože je to tak důležité, 187 00:09:38,230 --> 00:09:42,730 ukazatel není nic více než adresu. 188 00:09:42,730 --> 00:09:47,760 Ukazatele jsou adresy na místech v paměti, kde žijí proměnné. 189 00:09:47,760 --> 00:09:52,590 S vědomím, že se stane doufejme, že trochu jednodušší s nimi pracovat. 190 00:09:52,590 --> 00:09:54,550 Další věc se mi líbí musíte udělat, je mít třídění 191 00:09:54,550 --> 00:09:58,510 diagramů vizuálně reprezentovat to, co je děje s různými řádků kódu. 192 00:09:58,510 --> 00:10:00,660 A budeme to dělat pár časů v ukazatelů, 193 00:10:00,660 --> 00:10:03,354 a když hovoříme o dynamický alokace paměti stejně. 194 00:10:03,354 --> 00:10:06,020 Protože si myslím, že tyto diagramy může být zvláště užitečné. 195 00:10:06,020 --> 00:10:09,540 >> Takže když řeknu, například, int k v mém kódu, co se děje? 196 00:10:09,540 --> 00:10:12,524 No co se v podstatě děje se Začínám paměti vyhrazený pro mě, 197 00:10:12,524 --> 00:10:14,690 ale nemám ani rád přemýšlet o tom, jako to, že jsem 198 00:10:14,690 --> 00:10:16,300 Líbí se o tom přemýšlet jako krabice. 199 00:10:16,300 --> 00:10:20,090 Mám krabici a je to zelené barvě, protože já 200 00:10:20,090 --> 00:10:21,750 může dát celá čísla v zelených polích. 201 00:10:21,750 --> 00:10:23,666 Kdyby to byl charakter I může mít modrou krabici. 202 00:10:23,666 --> 00:10:27,290 Ale já vždycky říkám, když jsem vytvořit obdélník, který pojme celá čísla 203 00:10:27,290 --> 00:10:28,950 že box je zbarvena zeleně. 204 00:10:28,950 --> 00:10:33,020 A já se stálou značku a píšu K na straně. 205 00:10:33,020 --> 00:10:37,590 Takže mám okno s názvem K, do které mohu dát celá čísla. 206 00:10:37,590 --> 00:10:41,070 Takže když řeknu int k, to je co se děje v mé hlavě. 207 00:10:41,070 --> 00:10:43,140 Když řeknu k rovná pět, co mám dělat? 208 00:10:43,140 --> 00:10:45,110 No, dávám pět v poli, vpravo. 209 00:10:45,110 --> 00:10:48,670 Toto je velice jednoduché, pokud Říkám int k vytvořit okno s názvem k. 210 00:10:48,670 --> 00:10:52,040 Když řeknu k rovná 5, dát pět do krabice. 211 00:10:52,040 --> 00:10:53,865 Doufejme, že to není příliš velký skok. 212 00:10:53,865 --> 00:10:55,990 Tady je místo, kde se věci jít málo zajímavé ačkoli. 213 00:10:55,990 --> 00:11:02,590 Když řeknu, int * PK, dobře, i když to neudělám vím, co to nutně znamená, 214 00:11:02,590 --> 00:11:06,150 Je to jasně něco co do činění s celé číslo. 215 00:11:06,150 --> 00:11:08,211 Takže jdu na barvu Tento box green-ish, 216 00:11:08,211 --> 00:11:10,210 Vím, že to má něco co do činění s celým číslem, 217 00:11:10,210 --> 00:11:13,400 ale to není celé číslo samo o sobě, protože je to int hvězda. 218 00:11:13,400 --> 00:11:15,390 Je tu něco, mírně jiný o tom. 219 00:11:15,390 --> 00:11:17,620 Takže zapojit celé číslo je, ale jinak je to 220 00:11:17,620 --> 00:11:19,830 příliš neliší od to, co jsme mluvili o. 221 00:11:19,830 --> 00:11:24,240 Je to krabice, její dostal označení, je to na sobě štítek PK, 222 00:11:24,240 --> 00:11:27,280 a to je schopné udržet int hvězdy, bez ohledu na to jsou. 223 00:11:27,280 --> 00:11:29,894 Mají něco společného s celými čísly, jasně. 224 00:11:29,894 --> 00:11:31,060 Zde je poslední řádek ačkoli. 225 00:11:31,060 --> 00:11:37,650 Když řeknu pk = & K, Whoa, co se právě stalo, že jo? 226 00:11:37,650 --> 00:11:41,820 Takže to náhodné číslo, zdánlivě náhodné číslo, dostane hozen do pole tam. 227 00:11:41,820 --> 00:11:44,930 Vše, co je, je pk dostane adresu k. 228 00:11:44,930 --> 00:11:52,867 Takže jsem se držet, kde k bydlí v paměti, jeho adresu, na adresu jeho bajtů. 229 00:11:52,867 --> 00:11:55,200 Všechno, co dělám, je, že říkám tato hodnota je to, co budu 230 00:11:55,200 --> 00:11:59,430 dát uvnitř mé okno s názvem pk. 231 00:11:59,430 --> 00:12:02,080 A protože tyto věci jsou ukazatele, a proto, že hledáte 232 00:12:02,080 --> 00:12:04,955 na provázku jako nulovou x eight zero c sedmi čtyř osmi 233 00:12:04,955 --> 00:12:07,790 dvou nula je pravděpodobně nemá velký význam. 234 00:12:07,790 --> 00:12:12,390 Když jsme se obecně představit ukazatele, máme vlastně dělat tak jako ukazatele. 235 00:12:12,390 --> 00:12:17,000 Pk nám dává informaci musíme najít K v paměti. 236 00:12:17,000 --> 00:12:19,120 Takže v podstatě pk má šipku v něm. 237 00:12:19,120 --> 00:12:21,670 A pokud budeme chodit délku této šipky, představte si, 238 00:12:21,670 --> 00:12:25,280 je to něco, co můžete jít dál, kdybychom procházka po celé délce šipky, 239 00:12:25,280 --> 00:12:29,490 na samém konci této šipky, jsme najde místo v paměti 240 00:12:29,490 --> 00:12:31,390 kde k bydlí. 241 00:12:31,390 --> 00:12:34,360 A to je opravdu důležité protože jakmile budeme vědět, kde k bydlí, 242 00:12:34,360 --> 00:12:37,870 můžeme začít pracovat s daty uvnitř té místo v paměti. 243 00:12:37,870 --> 00:12:40,780 I když jsme se dostáváme Teeny bit před sebe pro tuto chvíli. 244 00:12:40,780 --> 00:12:42,240 >> Takže to, co je ukazatel? 245 00:12:42,240 --> 00:12:45,590 Ukazatel je datová položka, jejíž hodnota je adresa paměti. 246 00:12:45,590 --> 00:12:49,740 To bylo to, že nulou x osm nula stuff děje, že byla adresa paměti. 247 00:12:49,740 --> 00:12:52,060 To byl umístění v paměti. 248 00:12:52,060 --> 00:12:55,080 A typ ukazatele popisuje druh 249 00:12:55,080 --> 00:12:56,930 dat najdete v že adresa paměti. 250 00:12:56,930 --> 00:12:58,810 Takže je tu int hvězda část vpravo. 251 00:12:58,810 --> 00:13:03,690 Pokud bych se touto šíp, to je mě vést k umístění. 252 00:13:03,690 --> 00:13:06,980 A to je místo, to, co jsem Naleznete zde v mém příkladu, 253 00:13:06,980 --> 00:13:08,240 je zelený barevný box. 254 00:13:08,240 --> 00:13:12,650 Je to celé číslo, to je to, co jsem Najdete když půjdu na tuto adresu. 255 00:13:12,650 --> 00:13:14,830 Typ Datová ukazatel popisuje, co se 256 00:13:14,830 --> 00:13:17,936 najdete na této adrese paměti. 257 00:13:17,936 --> 00:13:19,560 Tak tady je opravdu super věc ačkoli. 258 00:13:19,560 --> 00:13:25,090 Ukazatele nám umožňuje projít proměnné mezi funkcemi. 259 00:13:25,090 --> 00:13:28,520 A skutečně předat proměnné a neprojde jejich kopie. 260 00:13:28,520 --> 00:13:32,879 Protože pokud budeme přesně vědět, kde v paměti najít proměnnou, 261 00:13:32,879 --> 00:13:35,670 nepotřebujeme, aby kopii to, můžeme jít na dané místo 262 00:13:35,670 --> 00:13:37,844 a práci s tímto proměnné. 263 00:13:37,844 --> 00:13:40,260 Takže v zásadě pouze ukazatele sort o vytvoření prostředí počítače 264 00:13:40,260 --> 00:13:42,360 mnohem více jako v reálném světě, hned. 265 00:13:42,360 --> 00:13:44,640 >> Tak tady je analogií. 266 00:13:44,640 --> 00:13:48,080 Řekněme, že mám notebook, vpravo, a je plná poznámek. 267 00:13:48,080 --> 00:13:50,230 A já bych rád, kdybyste jej aktualizovat. 268 00:13:50,230 --> 00:13:53,960 Jste funkce, která aktualizace poznámky, správně. 269 00:13:53,960 --> 00:13:56,390 Ve způsobu, jakým jsme byli pracuje tak daleko, co 270 00:13:56,390 --> 00:14:02,370 stane se budete mít můj notebook, půjdete do obchodu kopírování, 271 00:14:02,370 --> 00:14:06,410 budete dělat kopii Xerox o každá stránka notebooku. 272 00:14:06,410 --> 00:14:09,790 Budete opustit svůj notebook zpět na mém stole, když budete hotovi, 273 00:14:09,790 --> 00:14:14,600 půjdeš a vyškrtnout věci v mém notebook, že jsou zastaralé nebo špatně, 274 00:14:14,600 --> 00:14:19,280 a pak budete míjet zpět me stoh stránek společnosti Xerox 275 00:14:19,280 --> 00:14:22,850 že je replikou mého notebooku s změny, které jste provedli na něj. 276 00:14:22,850 --> 00:14:27,040 A v tomto bodě, je to na mě jako volající funkce, jako volající, 277 00:14:27,040 --> 00:14:30,582 se rozhodnou vzít své poznámky a začlenit je zpět do svého notebooku. 278 00:14:30,582 --> 00:14:32,540 Takže je tu spousta kroků zde jedná, vpravo. 279 00:14:32,540 --> 00:14:34,850 Jako by to bylo lepší když jsem jen říct, hej, můžete 280 00:14:34,850 --> 00:14:38,370 aktualizovat své notebook pro me, předat vám své notebook, 281 00:14:38,370 --> 00:14:40,440 a budete mít věci a doslova kříž je ven 282 00:14:40,440 --> 00:14:42,810 a aktualizovat své poznámky v notebooku. 283 00:14:42,810 --> 00:14:45,140 A pak mi dej můj notebook zpět. 284 00:14:45,140 --> 00:14:47,320 Je to něco, co ukazatele nám umožňují dělat, 285 00:14:47,320 --> 00:14:51,320 dělají to prostředí hodně víc jako jak pracujeme ve skutečnosti. 286 00:14:51,320 --> 00:14:54,640 >> Dobře, takže to, co je ukazatel je, pojďme mluvit 287 00:14:54,640 --> 00:14:58,040 o tom, jak ukazatele pracovat v C, a jak můžeme začít pracovat s nimi. 288 00:14:58,040 --> 00:15:02,550 Takže tam je velmi jednoduchý ukazatel v C nazývá nulový ukazatel. 289 00:15:02,550 --> 00:15:04,830 Ukazatele null ukazuje na nic. 290 00:15:04,830 --> 00:15:08,310 To pravděpodobně vypadá, že to ve skutečnosti není moc užitečná věc, 291 00:15:08,310 --> 00:15:10,500 ale jak budeme vidět něco později, skutečnost, 292 00:15:10,500 --> 00:15:15,410 že tento ukazatel null existuje ve skutečnosti opravdu může přijít vhod. 293 00:15:15,410 --> 00:15:19,090 A při každém vytvoření ukazatel a nenastavíte její hodnotu immediately- 294 00:15:19,090 --> 00:15:21,060 příklad nastavení jeho hodnota okamžitě 295 00:15:21,060 --> 00:15:25,401 bude pár snímků zpět kde jsem řekl, pk rovná & K, 296 00:15:25,401 --> 00:15:28,740 pk dostane adresy K, jak je uvidíme, co to znamená, 297 00:15:28,740 --> 00:15:32,990 uvidíme, jak se kód, který shortly- pokud nebudeme nastavte její hodnotu na něco 298 00:15:32,990 --> 00:15:35,380 smysluplné okamžitě, byste měli vždy 299 00:15:35,380 --> 00:15:37,480 nastavte ukazatel myši na bod na hodnotu null. 300 00:15:37,480 --> 00:15:40,260 Měli byste nastavit tak, aby ukazoval na nic. 301 00:15:40,260 --> 00:15:43,614 >> To je velmi odlišné, než odchodu hodnotu, jak je to 302 00:15:43,614 --> 00:15:45,530 a pak prohlašující ukazatel a jen za předpokladu, že 303 00:15:45,530 --> 00:15:48,042 to je null, protože to je jen zřídka pravda. 304 00:15:48,042 --> 00:15:50,000 Takže byste měli vždy nastavit Hodnota ukazatele 305 00:15:50,000 --> 00:15:55,690 na null, pokud nenastavíte její hodnotu na něco smysluplného okamžitě. 306 00:15:55,690 --> 00:15:59,090 Můžete zkontrolovat, zda hodnoty ukazatel je je null pomocí operátoru rovnosti 307 00:15:59,090 --> 00:16:05,450 (==), Stejně jako vy porovnat libovolné celé číslo hodnoty nebo znak hodnoty pomocí (==) 308 00:16:05,450 --> 00:16:06,320 také. 309 00:16:06,320 --> 00:16:10,994 Je to zvláštní druh konstanty hodnota, kterou lze použít k testování. 310 00:16:10,994 --> 00:16:13,160 Takže to byl velmi jednoduchý ukazatel, ukazatele null. 311 00:16:13,160 --> 00:16:15,320 Dalším způsobem, jak vytvořit ukazatel je získat 312 00:16:15,320 --> 00:16:18,240 adresa proměnné jste již vytvořili, 313 00:16:18,240 --> 00:16:22,330 a vy to pomocí & adresa extrakce operátor. 314 00:16:22,330 --> 00:16:26,720 Což jsme již viděli dříve V prvním příkladu diagramu jsem ukázal. 315 00:16:26,720 --> 00:16:31,450 Takže pokud x je proměnná, která máme již vytvořili typu integer, 316 00:16:31,450 --> 00:16:35,110 pak a x je ukazatel na celé číslo. 317 00:16:35,110 --> 00:16:39,810 & x je- pamatovat, a bude extrahovat adresa věci na pravé straně. 318 00:16:39,810 --> 00:16:45,350 A protože ukazatel je jen adresa, než & x je ukazatel na celé číslo 319 00:16:45,350 --> 00:16:48,560 , jehož hodnota je místo, kde v paměti x životech. 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 Vezměme si tento krok dále a připojit se k něčemu 323 00:16:55,670 --> 00:16:58,380 Narážel I v předchozím videu. 324 00:16:58,380 --> 00:17:06,730 Pokud arr je pole čtyřhry, pak & arr hranatou závorku i je ukazatel 325 00:17:06,730 --> 00:17:08,109 na dvojnásobek. 326 00:17:08,109 --> 00:17:08,970 DOBŘE. 327 00:17:08,970 --> 00:17:12,160 arr hranatou závorku I, pokud arr je pole se zdvojnásobí, 328 00:17:12,160 --> 00:17:19,069 pak arr hranatou závorku i je i-tý prvek daného pole, 329 00:17:19,069 --> 00:17:29,270 a & arr hranatou závorku i je, kde se v paměť i-tý prvek arr existuje. 330 00:17:29,270 --> 00:17:31,790 >> Takže to, co je tady důsledky? 331 00:17:31,790 --> 00:17:34,570 Pole jméno, implikace celé té věci, 332 00:17:34,570 --> 00:17:39,290 Je to jméno Array je vlastně sám ukazatel. 333 00:17:39,290 --> 00:17:41,170 Pracovali jste s ukazateli všechny podél 334 00:17:41,170 --> 00:17:45,290 pokaždé, když jste použili pole. 335 00:17:45,290 --> 00:17:49,090 Nezapomeňte z příkladu na variabilní rozsah, 336 00:17:49,090 --> 00:17:53,420 blízko konci videa I představit příklad, kdy máme funkci 337 00:17:53,420 --> 00:17:56,890 volal set int a Funkce tzv set pole. 338 00:17:56,890 --> 00:18:00,490 A vaše výzva k určení, zda nebo ne, nebo to, co 339 00:18:00,490 --> 00:18:03,220 hodnoty, které jsme vytisknout, konec funkce, 340 00:18:03,220 --> 00:18:05,960 Na konci hlavního programu. 341 00:18:05,960 --> 00:18:08,740 >> Pokud si vzpomínáte z tohoto příkladu nebo pokud jste sledovali video, 342 00:18:08,740 --> 00:18:13,080 Víte, že když Ty- volání set int efektivně nic nedělá. 343 00:18:13,080 --> 00:18:16,390 Ale výzva k nastavení pole dělá. 344 00:18:16,390 --> 00:18:19,280 A nějak jsem přehlížel proč že byl případ v té době. 345 00:18:19,280 --> 00:18:22,363 Jen jsem řekl, no je to pole, je to zvláštní, víte, je tu důvod. 346 00:18:22,363 --> 00:18:25,020 Důvodem je to, že matice je Název je opravdu jen ukazatel, 347 00:18:25,020 --> 00:18:28,740 a tam je to zvláštní hranatá závorka syntaxe 348 00:18:28,740 --> 00:18:30,510 aby se věci mnohem lepší pracovat. 349 00:18:30,510 --> 00:18:34,410 A oni dělají myšlenku ukazatel mnohem méně zastrašující, 350 00:18:34,410 --> 00:18:36,800 a to je důvod, proč oni jsou druh prezentované tímto způsobem. 351 00:18:36,800 --> 00:18:38,600 Ale ve skutečnosti pole jsou jen ukazatele. 352 00:18:38,600 --> 00:18:41,580 A to je důvod, proč, když jsme udělal změnu pole, 353 00:18:41,580 --> 00:18:44,880 když jsme míjeli pole jako parametr na funkci nebo jako argument 354 00:18:44,880 --> 00:18:50,110 na funkci, obsah pole ve skutečnosti změní v volaným 355 00:18:50,110 --> 00:18:51,160 a v volajícího. 356 00:18:51,160 --> 00:18:55,846 Které pro každý jiný druh variabilní jsme viděli, nebyl tento případ. 357 00:18:55,846 --> 00:18:58,970 Takže to je prostě něco, co byste měli mít na mysl, když pracujete s ukazateli, 358 00:18:58,970 --> 00:19:01,610 je to, že na jméno array vlastně ukazatel 359 00:19:01,610 --> 00:19:04,750 na první prvek tohoto pole. 360 00:19:04,750 --> 00:19:08,930 >> OK, takže teď máme všechny tyto Fakta, pojďme dál, že jo. 361 00:19:08,930 --> 00:19:11,370 Proč se staráme o kde něco žije. 362 00:19:11,370 --> 00:19:14,120 No jak jsem řekl, je to docela užitečné vědět, kde žije něco 363 00:19:14,120 --> 00:19:17,240 takže můžete jít tam a změnit to. 364 00:19:17,240 --> 00:19:19,390 Práce s ním a vlastně mají věci, které vás 365 00:19:19,390 --> 00:19:23,710 chcete udělat, aby této proměnné se projeví a neprojeví na nějaké kopie. 366 00:19:23,710 --> 00:19:26,150 To se nazývá dereferencing. 367 00:19:26,150 --> 00:19:28,690 Jdeme do reference a změníme hodnotu tam. 368 00:19:28,690 --> 00:19:32,660 Takže pokud budeme mít ukazatel a nazývá pc, a to ukazuje na charakter, 369 00:19:32,660 --> 00:19:40,610 pak můžeme říci, * a * pc pc je Jméno toho, co najdeme, když půjdeme 370 00:19:40,610 --> 00:19:42,910 na adresu PC. 371 00:19:42,910 --> 00:19:47,860 To, co jsme tam najdete je charakter a * pc je, jak jsme se odkazovat na data na to 372 00:19:47,860 --> 00:19:48,880 lokalita. 373 00:19:48,880 --> 00:19:54,150 A tak bychom mohli říci něco jako * ks = D, nebo něco takového, 374 00:19:54,150 --> 00:19:59,280 a to znamená, že bez ohledu na byl na adresu paměti PC, 375 00:19:59,280 --> 00:20:07,040 bez ohledu na charakter byl dříve tam je nyní D, řekneme-li, * ks = D. 376 00:20:07,040 --> 00:20:10,090 >> Tak je to tady zase s nějaký divný věci C, vpravo. 377 00:20:10,090 --> 00:20:14,560 Takže jsme viděli * dříve jako bytí nějak část datového typu, 378 00:20:14,560 --> 00:20:17,160 a teď je to být používán v trochu jiný kontext 379 00:20:17,160 --> 00:20:19,605 přístup k datům na místě. 380 00:20:19,605 --> 00:20:22,480 Vím, že je to trochu matoucí a to je vlastně součástí tohoto celku 381 00:20:22,480 --> 00:20:25,740 jako, proč ukazatele mají tuto mytologie kolem nich je tak složitý, 382 00:20:25,740 --> 00:20:28,250 je tak trochu problém syntaxe, upřímně. 383 00:20:28,250 --> 00:20:31,810 Ale * je používán v obou kontextech jak jako součást názvu typu, 384 00:20:31,810 --> 00:20:34,100 a uvidíme trochu později něco jiného, ​​taky. 385 00:20:34,100 --> 00:20:36,490 A právě teď je operátor dereference. 386 00:20:36,490 --> 00:20:38,760 Tak to jde do reference, přistupuje data 387 00:20:38,760 --> 00:20:43,000 v místě ukazatele, a vám umožňuje manipulovat dle libosti. 388 00:20:43,000 --> 00:20:45,900 >> Nyní je to velmi podobné návštěvě vašeho souseda, hned. 389 00:20:45,900 --> 00:20:48,710 Pokud víte, jaké jsou vaše soused žije, jsi 390 00:20:48,710 --> 00:20:50,730 Není potloukal se svým sousedem. 391 00:20:50,730 --> 00:20:53,510 Víš, že jste náhodou vím, kde žijí, 392 00:20:53,510 --> 00:20:56,870 ale to neznamená, že by ctnost mít tyto znalosti 393 00:20:56,870 --> 00:20:59,170 jste interakci s nimi. 394 00:20:59,170 --> 00:21:01,920 Chcete-li pracovat s nimi, budete muset jít do svého domu, 395 00:21:01,920 --> 00:21:03,760 musíš jít tam, kde žijí. 396 00:21:03,760 --> 00:21:07,440 A jakmile to uděláte, pak můžete komunikovat 397 00:21:07,440 --> 00:21:09,420 se s nimi stejně jako byste chtěli. 398 00:21:09,420 --> 00:21:12,730 A podobně s proměnnými, musíte jít na jejich adresu 399 00:21:12,730 --> 00:21:15,320 pokud je chcete komunikovat, můžete nejen znát adresu. 400 00:21:15,320 --> 00:21:21,495 A jak jste jít na adresu je používat *, operátor dereference. 401 00:21:21,495 --> 00:21:23,620 Co si myslíte, že se stane když se budeme snažit a dereference 402 00:21:23,620 --> 00:21:25,260 ukazatel, jehož hodnota je null? 403 00:21:25,260 --> 00:21:28,470 Připomeňme, že null ukazatel ukazuje na nic. 404 00:21:28,470 --> 00:21:34,110 Takže pokud se pokusíte a dereference nic, nebo jít na adresu nic, 405 00:21:34,110 --> 00:21:36,800 Co si myslíte, že se stane? 406 00:21:36,800 --> 00:21:39,630 No, pokud jste uhodl segmentace chyba, měli byste být v pořádku. 407 00:21:39,630 --> 00:21:41,390 Pokud se pokusíte a dereference nulový ukazatel, 408 00:21:41,390 --> 00:21:43,140 utrpíte segmentace porucha. Ale počkejte, 409 00:21:43,140 --> 00:21:45,820 Neříkal jsem ti, že pokud si nebudete 410 00:21:45,820 --> 00:21:49,220 nastavit hodnotu svého ukazatel na něco smysluplného, 411 00:21:49,220 --> 00:21:51,000 měli byste nastavit na null? 412 00:21:51,000 --> 00:21:55,290 Udělal jsem, a vlastně segmentace vina je něco dobrého chování. 413 00:21:55,290 --> 00:21:58,680 >> Už jste někdy prohlášen za proměnnou a Není okamžitě přiřazena její hodnotu? 414 00:21:58,680 --> 00:22:02,680 Takže stačí říct int x; vy ne vlastně přiřadit na cokoliv 415 00:22:02,680 --> 00:22:05,340 a pak později ve svém kódu, můžete vytisknout hodnotu x, 416 00:22:05,340 --> 00:22:07,650 mají stále není přidělen ho na cokoli. 417 00:22:07,650 --> 00:22:10,370 Často dostanete nula, ale někdy 418 00:22:10,370 --> 00:22:15,000 může získat nějaké náhodné číslo, a nemáte tušení, odkud pochází. 419 00:22:15,000 --> 00:22:16,750 Podobně mohou věci se stalo s ukazateli. 420 00:22:16,750 --> 00:22:20,110 Když deklarujete ukazatel int * pk například, 421 00:22:20,110 --> 00:22:23,490 a nemusíte přiřadit ji na hodnotu, dostanete čtyři bajty pro paměti. 422 00:22:23,490 --> 00:22:25,950 Ať už čtyři bajty Paměť může systém 423 00:22:25,950 --> 00:22:28,970 zjistíte, že mají nějakou významnou hodnotu. 424 00:22:28,970 --> 00:22:31,760 A tam by mohl být něco, co už tam, že 425 00:22:31,760 --> 00:22:34,190 již není potřeba jiný funkce, takže stačí mít 426 00:22:34,190 --> 00:22:35,900 co data byla tam. 427 00:22:35,900 --> 00:22:40,570 >> Co když jste se pokusili udělat dereference někteří adresa, kterou don't- existovaly 428 00:22:40,570 --> 00:22:43,410 Již bajtů a informace v tam, že je nyní v ukazatelem. 429 00:22:43,410 --> 00:22:47,470 Pokusíte-li se, že dereference ukazatel, můžete být umazávání s nějakou pamětí 430 00:22:47,470 --> 00:22:49,390 že jste neměl v úmyslu , aby si s tím vším. 431 00:22:49,390 --> 00:22:51,639 A ve skutečnosti byste mohli udělat něco opravdu zničující, 432 00:22:51,639 --> 00:22:54,880 jako zlomit další program, nebo zlomit jinou funkci, 433 00:22:54,880 --> 00:22:58,289 nebo dělat něco nebezpečného, ​​že jste neměl v úmyslu dělat vůbec. 434 00:22:58,289 --> 00:23:00,080 A tak to je důvod, proč je ve skutečnosti dobrý nápad 435 00:23:00,080 --> 00:23:04,030 stanovit své ukazatele na null, pokud se nenastavujte jim něco smysluplného. 436 00:23:04,030 --> 00:23:06,760 Je to pravděpodobně lepší u konec dne pro vašeho programu 437 00:23:06,760 --> 00:23:09,840 k havárii pak pro to dělat Něco, co šrouby nahoru 438 00:23:09,840 --> 00:23:12,400 jiný program či jiné funkce. 439 00:23:12,400 --> 00:23:15,207 To chování je pravděpodobně ještě méně než ideální právě shazovat. 440 00:23:15,207 --> 00:23:17,040 A tak to je důvod, proč je vlastně dobrý zvyk 441 00:23:17,040 --> 00:23:20,920 dostat se do nastavení své ukazatelů na null, pokud nechcete nastavit jim 442 00:23:20,920 --> 00:23:24,540 ke smysluplnému hodnotu okamžitě, je hodnota, že víte, 443 00:23:24,540 --> 00:23:27,260 a že můžete bezpečně dereference. 444 00:23:27,260 --> 00:23:32,240 >> Takže pojďme se vrátit teď a podívat se na celkovou syntaxi situace. 445 00:23:32,240 --> 00:23:37,400 Když řeknu, int * p ;, co jsem právě udělal? 446 00:23:37,400 --> 00:23:38,530 To, co jsem udělal, je toto. 447 00:23:38,530 --> 00:23:43,290 Vím, že hodnota p je adresa protože všechny ukazatele jsou jen 448 00:23:43,290 --> 00:23:44,660 adresy. 449 00:23:44,660 --> 00:23:47,750 Mohu dereference p pomocí operátoru *. 450 00:23:47,750 --> 00:23:51,250 V této souvislosti je tady, v samém top Připomeňme * je součástí typu. 451 00:23:51,250 --> 00:23:53,510 Int * je typ dat. 452 00:23:53,510 --> 00:23:56,150 Ale mohu dereference p pomocí operátoru *, 453 00:23:56,150 --> 00:24:01,897 a když jsem to, když půjdu na tuto adresu, co najdu na této adrese? 454 00:24:01,897 --> 00:24:02,855 Najdu celé číslo. 455 00:24:02,855 --> 00:24:05,910 Takže int * p je v podstatě řka, p je adresa. 456 00:24:05,910 --> 00:24:09,500 Mohu dereference p a pokud Já ano, najdu celé číslo 457 00:24:09,500 --> 00:24:11,920 v tomto umístění paměti. 458 00:24:11,920 --> 00:24:14,260 >> OK, takže jsem řekl, tam byl další mrzutost s hvězdami 459 00:24:14,260 --> 00:24:17,060 a tady je, kde to mrzutost s hvězdami je. 460 00:24:17,060 --> 00:24:21,640 Už jste někdy zkoušeli deklarovat více proměnných stejného typu 461 00:24:21,640 --> 00:24:24,409 na stejném řádku kódu? 462 00:24:24,409 --> 00:24:27,700 Takže na vteřinu, předstírat, že řádek, kód Vlastně jsem tam v zelené barvě 463 00:24:27,700 --> 00:24:29,366 tam není, a to jen říká int x, y, z ;. 464 00:24:29,366 --> 00:24:31,634 465 00:24:31,634 --> 00:24:34,550 Co to bude dělat, je skutečně vytvořit Tři celočíselné proměnné pro vás, 466 00:24:34,550 --> 00:24:36,930 jeden s názvem x, jeden s názvem y, a jeden s názvem z. 467 00:24:36,930 --> 00:24:41,510 Je to způsob, jak to udělat, aniž by s rozdělit na tři řádky. 468 00:24:41,510 --> 00:24:43,890 >> Tady je místo, kde hvězdy dostat otravné znovu i když, 469 00:24:43,890 --> 00:24:49,200 protože je ve skutečnosti součástí * jak název typu a část 470 00:24:49,200 --> 00:24:50,320 z názvu proměnné. 471 00:24:50,320 --> 00:24:56,430 A tak, když řeknu, int * px, py, pz, co jsem skutečně dostat je ukazatel na celé číslo 472 00:24:56,430 --> 00:25:01,650 volal px a dvě celá čísla, py a pz. 473 00:25:01,650 --> 00:25:04,950 A že to asi není to, co Chceme, že to není dobré. 474 00:25:04,950 --> 00:25:09,290 >> Takže pokud chci vytvořit více ukazatele na stejném řádku, stejného typu, 475 00:25:09,290 --> 00:25:12,140 a hvězdy, to, co jsem skutečně potřebují udělat, je říci, int * pa, pb *, * ks. 476 00:25:12,140 --> 00:25:17,330 477 00:25:17,330 --> 00:25:20,300 Teď mít jen řekl, že a teď vám to říkám, 478 00:25:20,300 --> 00:25:22,170 jste pravděpodobně nikdy udělat. 479 00:25:22,170 --> 00:25:25,170 A to je asi dobrá věc upřímně, protože byste mohli nechtěně 480 00:25:25,170 --> 00:25:26,544 opomenout hvězdu, něco takového. 481 00:25:26,544 --> 00:25:29,290 Je to asi nejlepší možná prohlásit ukazatele na jednotlivých linkách, 482 00:25:29,290 --> 00:25:31,373 ale je to jen další z ty otravné syntaxe 483 00:25:31,373 --> 00:25:35,310 věci s hvězdami, které dělají ukazatele tak těžké s ním pracovat. 484 00:25:35,310 --> 00:25:39,480 Protože je to právě tento syntaktický bordel musíte pracovat přes. 485 00:25:39,480 --> 00:25:41,600 S praxí to dělá Opravdu stát druhou přirozeností. 486 00:25:41,600 --> 00:25:45,410 Pořád dělat chyby s ním ještě po naprogramování po dobu 10 let, 487 00:25:45,410 --> 00:25:49,630 takže se nemusíte být narušena, pokud se něco stane pro vás, je to docela běžné upřímně. 488 00:25:49,630 --> 00:25:52,850 Je to opravdu trochu vadou syntaxe. 489 00:25:52,850 --> 00:25:54,900 >> OK, takže jsem trochu slíbil že bychom znovu 490 00:25:54,900 --> 00:25:59,370 koncept, jak velký je řetězec. 491 00:25:59,370 --> 00:26:02,750 No, kdybych vám řekl, že string, máme opravdu druh 492 00:26:02,750 --> 00:26:04,140 lhal vám po celou dobu. 493 00:26:04,140 --> 00:26:06,181 Neexistuje žádný datový typ nazvaný řetězec, a ve skutečnosti já 494 00:26:06,181 --> 00:26:09,730 zmínil v jednom z našich Nejstarší videa na datové typy, 495 00:26:09,730 --> 00:26:13,820 že řetězec byl datový typ, který byl vytvořen pro vás CS50.h. 496 00:26:13,820 --> 00:26:17,050 Musíte #include CS50.h aby se ji používat. 497 00:26:17,050 --> 00:26:19,250 >> No řetězec je opravdu jen alias za něco 498 00:26:19,250 --> 00:26:23,600 volal char *, a ukazatel na znak. 499 00:26:23,600 --> 00:26:26,010 No ukazatele, odvolání, jsou prostě řeší. 500 00:26:26,010 --> 00:26:28,780 Takže to, co je velikost v bytech řetězce? 501 00:26:28,780 --> 00:26:29,796 No to je čtyři nebo osm. 502 00:26:29,796 --> 00:26:32,170 A důvod, proč říkám, čtyři nebo eight je proto, že ve skutečnosti 503 00:26:32,170 --> 00:26:36,730 závisí na systému, Pokud používáte CS50 ide, char * je velikost char 504 00:26:36,730 --> 00:26:39,340 * Je osm, to je 64-bitový systém. 505 00:26:39,340 --> 00:26:43,850 Každá adresa v paměti je 64 bitů. 506 00:26:43,850 --> 00:26:48,270 Pokud používáte CS50 spotřebiče nebo pomocí libovolného 32-bit stroj, 507 00:26:48,270 --> 00:26:51,640 a vy jste slyšeli, že termín 32-bit Stroj, co je 32-bitový stroj? 508 00:26:51,640 --> 00:26:56,090 No to prostě znamená, že každý adresa v paměti, je dlouhé 32 bitů. 509 00:26:56,090 --> 00:26:59,140 A tak 32 bitů je čtyři bajty. 510 00:26:59,140 --> 00:27:02,710 Takže char * jsou čtyři nebo osm bajtů v závislosti na vašem systému. 511 00:27:02,710 --> 00:27:06,100 A skutečně všechny datové typy, a ukazatel na jakýchkoliv údajů 512 00:27:06,100 --> 00:27:12,030 typ, protože všechny ukazatele jsou jen adresy, jsou čtyři nebo osm bajtů. 513 00:27:12,030 --> 00:27:14,030 Takže pojďme to znovu diagram a pojďme k závěru, 514 00:27:14,030 --> 00:27:18,130 toto video s trochou cvičení zde. 515 00:27:18,130 --> 00:27:21,600 Tak tady je diagram jsme přestali s na samém začátku videa. 516 00:27:21,600 --> 00:27:23,110 Tak co se stane teď, když řeknu * PK = 35? 517 00:27:23,110 --> 00:27:26,370 518 00:27:26,370 --> 00:27:30,530 Takže co to znamená, když říkám, * pk = 35? 519 00:27:30,530 --> 00:27:32,420 Vezměte chvilku. 520 00:27:32,420 --> 00:27:34,990 * pk. 521 00:27:34,990 --> 00:27:39,890 V souvislosti tady, je * operátor dereference. 522 00:27:39,890 --> 00:27:42,110 Takže když dereference Operátor se používá, 523 00:27:42,110 --> 00:27:48,520 jdeme na adresu poukázal na o PK, a my se změnit to, co najdeme. 524 00:27:48,520 --> 00:27:55,270 Takže * pk = 35 účinně to provede na obrázku. 525 00:27:55,270 --> 00:27:58,110 Takže je to v podstatě 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 >> Ještě jeden. 528 00:28:01,930 --> 00:28:05,510 Když řeknu int m, tvořím novou proměnnou s názvem m. 529 00:28:05,510 --> 00:28:08,260 Nový box, to je zelené pole, protože to bude držet 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 Když řeknu m = 4, dal jsem integer do tohoto boxu. 532 00:28:14,960 --> 00:28:20,290 Pokud řekněme pk = & m, jak se dělá tato změna diagram? 533 00:28:20,290 --> 00:28:28,760 Pk = & m, vzpomínáte si, co se & Operátor dělá nebo se jmenuje? 534 00:28:28,760 --> 00:28:34,430 Pamatujte si, že nějaké & název proměnné je adresa názvu proměnné. 535 00:28:34,430 --> 00:28:38,740 Takže to, co říkáme, je pk dostane adresu m. 536 00:28:38,740 --> 00:28:42,010 A co se stane, tak efektivně diagram je, že pk není delší body 537 00:28:42,010 --> 00:28:46,420 až k, ale připomíná, m. 538 00:28:46,420 --> 00:28:48,470 >> Opět ukazatele jsou velmi složité pro práci s 539 00:28:48,470 --> 00:28:50,620 a berou hodně praxe, ale proto, 540 00:28:50,620 --> 00:28:54,150 jejich schopnosti, aby vám pro přenos dat mezi funkcemi 541 00:28:54,150 --> 00:28:56,945 a skutečně ti, Změny se projeví, 542 00:28:56,945 --> 00:28:58,820 jak se vaše hlava kolem je opravdu důležité. 543 00:28:58,820 --> 00:29:02,590 Pravděpodobně je nejsložitější téma diskutujeme v CS50, 544 00:29:02,590 --> 00:29:05,910 ale hodnota, která vás získat od používání ukazatele 545 00:29:05,910 --> 00:29:09,200 zdaleka převáží komplikací které pocházejí z seznámení se s nimi. 546 00:29:09,200 --> 00:29:12,690 Takže přeji to nejlepší z štěstí učení o ukazatele. 547 00:29:12,690 --> 00:29:15,760 Jsem Doug Lloyd, je to CS50. 548 00:29:15,760 --> 00:29:17,447