1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:01,395 [Přehrávání hudby] 3 00:00:01,395 --> 00:00:05,590 4 00:00:05,590 --> 00:00:07,940 >> DOUG LLOYD: OK, takže návrh, Před spuštěním zde. 5 00:00:07,940 --> 00:00:11,660 Pokud jste sledovali video na na ukazatele budete chtít dělat tak jako první. 6 00:00:11,660 --> 00:00:15,860 Vzhledem k tomu, toto video je další způsob práce s ukazateli. 7 00:00:15,860 --> 00:00:17,574 >> Takže to bude mluvit o některých pojmů 8 00:00:17,574 --> 00:00:19,490 že budeme povídat v na ukazatele videa, a my jsme 9 00:00:19,490 --> 00:00:21,948 bude lesk nad nimi teď, za předpokladu, že jsou již 10 00:00:21,948 --> 00:00:23,090 tak nějak pochopil. 11 00:00:23,090 --> 00:00:25,440 Tak to je jen váš fér varování že pokud jste viděl toto video 12 00:00:25,440 --> 00:00:27,814 a vy jste neviděli ukazatele video, by to mohlo nějak 13 00:00:27,814 --> 00:00:29,610 létat nad hlavou, trochu. 14 00:00:29,610 --> 00:00:32,080 A tak by to mohlo být lepší se dívat na to v tomto pořadí. 15 00:00:32,080 --> 00:00:34,710 >> Takže jsme již viděli jeden způsob práce s ukazateli, 16 00:00:34,710 --> 00:00:37,810 což je deklarujeme variabilní, a pak jsme 17 00:00:37,810 --> 00:00:42,160 deklarovat další proměnnou, ukazatel proměnná, která ukazuje na to. 18 00:00:42,160 --> 00:00:44,870 Proto jsme vytvořili proměnná s názvem, máme 19 00:00:44,870 --> 00:00:48,480 vytvořil druhou proměnnou s názvem, a upozorňujeme, že Druhá proměnná 20 00:00:48,480 --> 00:00:50,220 na to jako první. 21 00:00:50,220 --> 00:00:52,370 Tento druh má Problémem však, protože to 22 00:00:52,370 --> 00:00:54,650 vyžaduje, abychom přesně věděli, kolik paměti, že jsme 23 00:00:54,650 --> 00:00:57,600 bude potřebovat ve chvíli, Náš program je sestaven. 24 00:00:57,600 --> 00:00:58,220 >> Proč tomu tak je? 25 00:00:58,220 --> 00:01:03,338 Vzhledem k tomu, musíme být schopni pojmenovat nebo identifikovat všechny možné proměnných 26 00:01:03,338 --> 00:01:04,129 můžeme setkat. 27 00:01:04,129 --> 00:01:07,910 Mohli bychom mít pole, které by mohlo být schopný pojmout velké množství informací, 28 00:01:07,910 --> 00:01:10,110 ale je to stále není přesně dostatečně přesná. 29 00:01:10,110 --> 00:01:12,640 Co když nevíme, co když budeme mít tušení 30 00:01:12,640 --> 00:01:14,370 kolik budeme potřebovat v době kompilace? 31 00:01:14,370 --> 00:01:17,020 Nebo co když náš program bude běžet opravdu dlouhou dobu, 32 00:01:17,020 --> 00:01:19,810 přijímat různé uživatele dat, a můžeme opravdu 33 00:01:19,810 --> 00:01:23,170 odhadnout, zda jsme bude potřebovat 1000 kusů? 34 00:01:23,170 --> 00:01:26,060 >> Není to tak, můžeme říkají, na příkazovém řádku 35 00:01:26,060 --> 00:01:28,040 Zadejte, kolik položek si myslíte, že budete potřebovat. 36 00:01:28,040 --> 00:01:31,100 No co když odhad je špatně? 37 00:01:31,100 --> 00:01:34,300 Dynamické přidělování paměti druh umožňuje nám cestu 38 00:01:34,300 --> 00:01:36,867 obejít tento konkrétní problém. 39 00:01:36,867 --> 00:01:38,700 A to, jak to dělá je pomocí ukazatelů. 40 00:01:38,700 --> 00:01:42,140 >> Můžeme použít odkazy na získat přístup k dynamicky 41 00:01:42,140 --> 00:01:45,710 přidělené paměti, paměti, která je přidělen jako váš program běží. 42 00:01:45,710 --> 00:01:48,290 Není to přiděleny v době kompilace. 43 00:01:48,290 --> 00:01:51,570 Když dynamicky přidělovat Paměť pochází z bazénu 44 00:01:51,570 --> 00:01:53,795 paměti známý jako haldy. 45 00:01:53,795 --> 00:01:56,420 Dříve je celá paměť máme pracuje se v průběhu 46 00:01:56,420 --> 00:01:59,920 byl pocházející z bazénu paměti známý jako zásobníku. 47 00:01:59,920 --> 00:02:02,470 Dobrým způsobem, jak všeobecně mějte na mind-- a tomto pravidle 48 00:02:02,470 --> 00:02:04,720 nemusí vždy platit, ale do značné míry téměř 49 00:02:04,720 --> 00:02:09,940 vždy myslí true-- je, že každý čas si dát název proměnné it 50 00:02:09,940 --> 00:02:12,090 pravděpodobně žije na zásobníku. 51 00:02:12,090 --> 00:02:14,650 A pokaždé, když ne vykazovat proměnlivou jméno, 52 00:02:14,650 --> 00:02:19,160 které můžete dělat s dynamické paměti alokace, žije na haldě. 53 00:02:19,160 --> 00:02:22,190 >> Teď jsem trochu prezentovat to jako v případě, že je tyto dva bazény paměti. 54 00:02:22,190 --> 00:02:24,740 Ale možná viděli toto diagram, který je obecně 55 00:02:24,740 --> 00:02:27,290 znázornění Jaké paměťové vypadá, 56 00:02:27,290 --> 00:02:30,373 a nebudeme se starat o všem Hmota v horní a dolní části. 57 00:02:30,373 --> 00:02:33,580 To, co zajímá je tato část v prostřední tady, haldy a zásobník. 58 00:02:33,580 --> 00:02:35,570 Jak můžete vidět při pohledu na tomto diagramu, 59 00:02:35,570 --> 00:02:38,390 Tyto skutečnosti nejsou dvou oddělené bazény paměti. 60 00:02:38,390 --> 00:02:42,757 Je to jedna společná pool paměti kde začít, v tomto vizuální 61 00:02:42,757 --> 00:02:44,590 začnete v dolní části a začít vyplnění 62 00:02:44,590 --> 00:02:48,040 ode dna s zásobníku, a vy začínají na horní a zahájení doplňování 63 00:02:48,040 --> 00:02:50,072 shora dolů s haldy. 64 00:02:50,072 --> 00:02:51,780 Ale je to opravdu je Stejný bazén, je to jen 65 00:02:51,780 --> 00:02:56,050 různých místech, různá umístění v paměti, které jsou přiděleny. 66 00:02:56,050 --> 00:02:59,060 A můžete dojdou paměť buď s 67 00:02:59,060 --> 00:03:01,240 halda jet celou cestu ke dnu, nebo se 68 00:03:01,240 --> 00:03:05,440 zásobníku jet celou cestu na vrchol, nebo má haldy a zásobníku 69 00:03:05,440 --> 00:03:06,740 setkat se proti sobě. 70 00:03:06,740 --> 00:03:09,500 Všechny z nich mohou být podmínky které způsobují program 71 00:03:09,500 --> 00:03:11,030 spustit nedostatek paměti. 72 00:03:11,030 --> 00:03:11,952 Takže mějte na paměti, že. 73 00:03:11,952 --> 00:03:13,660 Když mluvíme o halda a zásobník 74 00:03:13,660 --> 00:03:17,880 jsme opravdu mluvíme o stejné obecné kus paměti, jen 75 00:03:17,880 --> 00:03:21,930 různé části této paměti. 76 00:03:21,930 --> 00:03:24,910 >> Tak jak se dostaneme dynamicky přidělené paměti v první řadě? 77 00:03:24,910 --> 00:03:27,740 Jak se dostat náš program paměť, jak to běží? 78 00:03:27,740 --> 00:03:32,660 No C poskytuje funkci nazvanou malloc, paměť alokátor, který 79 00:03:32,660 --> 00:03:36,810 voláte na, a ty předat kolik bajtů paměti, které chcete. 80 00:03:36,810 --> 00:03:39,940 Takže pokud váš program běží a chcete integer runtime, 81 00:03:39,940 --> 00:03:46,040 můžete Mallocka čtyři byty paměť, malloc závorky čtyři. 82 00:03:46,040 --> 00:03:48,540 >> Mallock projde hledá přes haldy, 83 00:03:48,540 --> 00:03:50,750 protože jsme dynamicky přidělování paměti, 84 00:03:50,750 --> 00:03:53,500 a navrátím se k vám ukazatel na této paměti. 85 00:03:53,500 --> 00:03:56,180 To nedává vám, že memory-- nedává to jméno, 86 00:03:56,180 --> 00:03:57,950 to vám dává ukazatel na něj. 87 00:03:57,950 --> 00:04:00,780 A tak to je důvod, proč jsem zase řekl, že je důležité možná 88 00:04:00,780 --> 00:04:03,770 Sledoval ukazatele videa než se dostaneme příliš daleko do toho. 89 00:04:03,770 --> 00:04:05,940 Tak malloc to bude vám zpět ukazatel. 90 00:04:05,940 --> 00:04:08,950 >> Pokud Mallock nemůže dát vám některý paměť, protože jste dojdou, 91 00:04:08,950 --> 00:04:10,645 to bude vám zpět ukazatele null. 92 00:04:10,645 --> 00:04:15,282 Pamatuješ si, co se stane, když vyzkoušet a dereference null ukazatel? 93 00:04:15,282 --> 00:04:17,019 Trpíme poruchu seg, že jo? 94 00:04:17,019 --> 00:04:18,060 To je asi není dobré. 95 00:04:18,060 --> 00:04:21,579 >> Takže pokaždé, když voláte vás malloc vždycky, vždycky 96 00:04:21,579 --> 00:04:25,270 je třeba ověřit, zda je nebo není ukazatel, že vám dal zpátky, je null. 97 00:04:25,270 --> 00:04:28,800 Pokud ano, budete muset ukončit svůj program protože pokud se pokusíte a dereference 98 00:04:28,800 --> 00:04:31,360 ukazatele null budete trpět poruchy segmentace 99 00:04:31,360 --> 00:04:34,380 a váš program je spadne tak jako tak. 100 00:04:34,380 --> 00:04:37,190 Tak jak jsme staticky získat celé číslo? 101 00:04:37,190 --> 00:04:37,730 >> int x. 102 00:04:37,730 --> 00:04:40,010 Jsme pravděpodobně udělal banda z časů, je to tak? 103 00:04:40,010 --> 00:04:43,480 To vytváří proměnnou s názvem x, která žije v zásobníku. 104 00:04:43,480 --> 00:04:46,190 Jak můžeme dynamicky získat číslo? 105 00:04:46,190 --> 00:04:50,010 Int hvězda px rovná malloc 4. 106 00:04:50,010 --> 00:04:53,050 >> Nebo více vhodně bychom říci, int hvězda px 107 00:04:53,050 --> 00:04:57,680 rovná malloc velikost int, jen hodit některé méně 108 00:04:57,680 --> 00:04:59,740 Magická čísla kolem našeho programu. 109 00:04:59,740 --> 00:05:04,140 To se chystá získat pro nás Čtyři bajtů paměti z haldy, 110 00:05:04,140 --> 00:05:06,720 a ukazatel dostaneme zpět k ní, se nazývá px. 111 00:05:06,720 --> 00:05:08,430 A pak už jen jako my máme provedeno již dříve jsme 112 00:05:08,430 --> 00:05:13,966 může dereference PX přístup k této paměti. 113 00:05:13,966 --> 00:05:15,590 Jak můžeme získat celé číslo od uživatele? 114 00:05:15,590 --> 00:05:17,970 Dá se říci, int x rovná se dostat int. 115 00:05:17,970 --> 00:05:19,930 To je docela jednoduché. 116 00:05:19,930 --> 00:05:24,030 Co když chceme vytvořit pole z x plováky, které žijí ve frontě? 117 00:05:24,030 --> 00:05:28,210 float stack_array--, že se jmenuje z našich array-- hranatých závorek x. 118 00:05:28,210 --> 00:05:32,419 To bude vytvářet pro nás pole z x plováky, které žijí v zásobníku. 119 00:05:32,419 --> 00:05:34,960 Můžeme vytvořit celou řadu plováků která žije na haldě, taky. 120 00:05:34,960 --> 00:05:37,330 Syntaxe může vypadat trochu těžkopádné, 121 00:05:37,330 --> 00:05:41,740 ale můžeme říci, float hvězda heap_array rovná 122 00:05:41,740 --> 00:05:44,360 malloc x měří velikost plováku. 123 00:05:44,360 --> 00:05:48,160 Potřebuji dostatek prostoru držet x s plovoucí desetinnou čárkou hodnoty. 124 00:05:48,160 --> 00:05:51,560 Takže říct, že jsem potřebovat 100 plováky, nebo plováky 1000. 125 00:05:51,560 --> 00:05:54,810 Takže v tomto případě by bylo 400 bytů pro 100 plováky, 126 00:05:54,810 --> 00:05:59,080 nebo 4000 bajtů na 1000 plováky, protože každý float zabírá 127 00:05:59,080 --> 00:06:01,230 čtyři byty prostoru. 128 00:06:01,230 --> 00:06:05,110 >> Poté, co to mohu použít hranatou závorku syntax na heap_array. 129 00:06:05,110 --> 00:06:08,970 Stejně jako bych na stack_array, já mohou individuálně přistupovat k její prvky 130 00:06:08,970 --> 00:06:11,590 pomocí heap_array nula, heap_array jednu. 131 00:06:11,590 --> 00:06:15,800 Ale vzpomínám, proč to můžeme udělat Je tomu tak proto název pole v C 132 00:06:15,800 --> 00:06:19,990 je opravdu ukazatel na První prvek této matice je. 133 00:06:19,990 --> 00:06:23,480 Takže k tomu, že jsme deklarování řada plováků na zásobníku zde 134 00:06:23,480 --> 00:06:24,810 je vlastně trochu zavádějící. 135 00:06:24,810 --> 00:06:27,600 Jsme opravdu v Druhý řádek kódu tam 136 00:06:27,600 --> 00:06:32,360 také vytváří ukazatel na kus paměti, že jsme pak udělat nějakou práci s. 137 00:06:32,360 --> 00:06:35,620 >> Zde je velký problém s dynamicky přidělené paměti však, 138 00:06:35,620 --> 00:06:38,360 a to je důvod, proč je to opravdu důležité vytvořit nějaké dobré návyky 139 00:06:38,360 --> 00:06:39,800 při práci s ním. 140 00:06:39,800 --> 00:06:43,060 Na rozdíl od staticky deklaroval paměť, paměť 141 00:06:43,060 --> 00:06:46,790 není automaticky vrácena do Systém, kdy je vaše funkce provádí. 142 00:06:46,790 --> 00:06:49,280 Takže pokud máme hlavní, a Hlavní volá funkci 143 00:06:49,280 --> 00:06:53,860 f, když f povrchové úpravy jak se to dělá a vrátí řízení programu 144 00:06:53,860 --> 00:06:58,810 zpět na hlavní, všechny paměti že f použít, je vrácena zpět. 145 00:06:58,810 --> 00:07:01,250 To může být znovu použit nějakým jiným programem, 146 00:07:01,250 --> 00:07:04,250 nebo nějaké jiné funkce, která se zavolá později v main. 147 00:07:04,250 --> 00:07:06,970 Je možné používat stejně paměť opět nad. 148 00:07:06,970 --> 00:07:09,620 >> Pokud vás dynamicky alokovat paměť ačkoli 149 00:07:09,620 --> 00:07:14,380 budete muset říct, systém, který jste s ním udělal. 150 00:07:14,380 --> 00:07:18,370 Bude to držet to pro vás, které by mohly vedou k problému z vás běží 151 00:07:18,370 --> 00:07:19,290 paměti. 152 00:07:19,290 --> 00:07:22,179 A ve skutečnosti jsme někdy se odkazují na toto jako nevracení paměti. 153 00:07:22,179 --> 00:07:24,970 A někdy tyto nevracení paměti může být ve skutečnosti opravdu zničující 154 00:07:24,970 --> 00:07:27,020 na výkon systému. 155 00:07:27,020 --> 00:07:31,120 >> Pokud jste častým uživatel internetu můžete použít některé webové prohlížeče, 156 00:07:31,120 --> 00:07:35,630 a nebudu zde jmenovat jména, ale tam jsou některé webové prohlížeče venku 157 00:07:35,630 --> 00:07:39,150 které jsou notoricky známé pro skutečně mají úniky paměti, které nejsou opraveny. 158 00:07:39,150 --> 00:07:44,570 A pokud necháte Váš prohlížeč otevřené Po velmi dlouhou dobu, dny 159 00:07:44,570 --> 00:07:48,060 a dny, nebo týdny, někdy všimnout, že ve vašem systému 160 00:07:48,060 --> 00:07:49,790 běží opravdu, ale opravdu pomalu. 161 00:07:49,790 --> 00:07:54,640 A důvod pro to je skutečnost, že prohlížeč má přidělené paměti, 162 00:07:54,640 --> 00:07:57,320 ale pak neřekl systém že se to dělá s ním. 163 00:07:57,320 --> 00:08:01,000 A tak, že opustí méně paměti k dispozici pro všechny vaše jiných programů 164 00:08:01,000 --> 00:08:04,480 muset podělit, protože jsi leaking--, že webový prohlížeč 165 00:08:04,480 --> 00:08:06,755 Program je netěsní paměti. 166 00:08:06,755 --> 00:08:08,880 Jak můžeme dát paměť zpět když jsme s ním udělal? 167 00:08:08,880 --> 00:08:10,838 No naštěstí je to velmi snadný způsob, jak to udělat. 168 00:08:10,838 --> 00:08:11,710 Právě jsme ho uvolnit. 169 00:08:11,710 --> 00:08:15,020 K dispozici je funkce nazvaná zdarma, přijímá ukazatel na paměti, 170 00:08:15,020 --> 00:08:16,010 a my jsme dobré jít. 171 00:08:16,010 --> 00:08:18,310 >> Takže řekněme, že jsme v Uprostřed našeho programu, 172 00:08:18,310 --> 00:08:21,970 Chceme malloc 50 znaků. 173 00:08:21,970 --> 00:08:25,710 Chceme malloc pole, které může schopné pojmout 50 znaků. 174 00:08:25,710 --> 00:08:29,109 A když se dostaneme ukazatel zpět že název přes tento ukazatel je slovo. 175 00:08:29,109 --> 00:08:30,900 Děláme, co máme dělat s slovu, 176 00:08:30,900 --> 00:08:33,440 a pak, když jsme udělali jsme prostě ho uvolnit. 177 00:08:33,440 --> 00:08:37,460 A teď jsme se vrátili ty 50 bajtů paměti zpět do systému. 178 00:08:37,460 --> 00:08:40,147 Některé další funkce mohou používat. 179 00:08:40,147 --> 00:08:43,480 Nemusíme se starat o utrpení nevracení paměti, protože jsme osvobozeni slovo. 180 00:08:43,480 --> 00:08:46,639 Dali jsme paměť zpět, takže jsme skončili práci s ním. 181 00:08:46,639 --> 00:08:48,430 Takže tam jsou tři zlatých pravidel, která by měla 182 00:08:48,430 --> 00:08:51,700 třeba mít na paměti vždy, když budete dynamicky přidělování paměti 183 00:08:51,700 --> 00:08:52,990 s malloc. 184 00:08:52,990 --> 00:08:56,480 Každý blok paměti, která vy malloc musí být uvolněn 185 00:08:56,480 --> 00:08:58,430 Před programu dokončení spuštění. 186 00:08:58,430 --> 00:09:02,029 Nyní opět do spotřebiče nebo v IDE tento druh stane pro vás tak jako tak 187 00:09:02,029 --> 00:09:04,820 kdy vás-- se to stane tak jako tak je-li váš program ukončen, 188 00:09:04,820 --> 00:09:06,880 celá paměť se uvolní. 189 00:09:06,880 --> 00:09:10,750 Ale je to obecně dobrá kódování praxe vždy, když budete hotovi, 190 00:09:10,750 --> 00:09:13,810 osvobodit, co jste mallocd. 191 00:09:13,810 --> 00:09:16,690 >> To znamená, že pouze věci, které nemáš mallocd by měl být osvobozen. 192 00:09:16,690 --> 00:09:19,880 Pokud staticky deklarovat integer, int x středník, 193 00:09:19,880 --> 00:09:23,500 která žije na zásobníku, budete nemají pak chtít osvobodit x. 194 00:09:23,500 --> 00:09:25,970 Takže jen věci, které jste mallocd by měl být osvobozen. 195 00:09:25,970 --> 00:09:28,960 >> A konečně, ne volné něco dvakrát. 196 00:09:28,960 --> 00:09:31,170 To může vést k další divná situace. 197 00:09:31,170 --> 00:09:33,530 Takže vše, co jsem mallocd musí být osvobozen. 198 00:09:33,530 --> 00:09:36,000 Pouze věci, které jste si malloc by mělo být uvolněno. 199 00:09:36,000 --> 00:09:38,730 A ne bez něco dvakrát. 200 00:09:38,730 --> 00:09:43,660 >> Takže pojďme projít příklad zde z toho, co někteří dynamicky přidělené 201 00:09:43,660 --> 00:09:46,122 Paměť může vypadat jako smíšené v s nějakým statické paměti. 202 00:09:46,122 --> 00:09:47,080 Co by se mohlo stát tady? 203 00:09:47,080 --> 00:09:48,913 Uvidíme, jestli můžete sledovat spolu, a hádejte, co je 204 00:09:48,913 --> 00:09:51,720 se stane, jak jsme jít přes všechny tyto řádky kódu. 205 00:09:51,720 --> 00:09:53,980 >> Takže říkáme int m. 206 00:09:53,980 --> 00:09:54,840 Co se tady děje? 207 00:09:54,840 --> 00:09:56,339 No to je docela jednoduché. 208 00:09:56,339 --> 00:09:59,650 I vytvořit celočíselnou proměnnou s názvem m. 209 00:09:59,650 --> 00:10:01,400 I barva je zelená, protože to je barva 210 00:10:01,400 --> 00:10:03,730 který používám, když mluvím o celočíselné proměnné. 211 00:10:03,730 --> 00:10:05,160 Je to krabice. 212 00:10:05,160 --> 00:10:08,400 Říká se tomu m, a můžete ukládat celá čísla uvnitř něj. 213 00:10:08,400 --> 00:10:12,400 >> Co když jsem pak řekl int hvězdičkou? 214 00:10:12,400 --> 00:10:13,530 No to je dost podobné. 215 00:10:13,530 --> 00:10:15,780 Jsem vytvořit krabice volal. 216 00:10:15,780 --> 00:10:19,100 Je schopna pojmout int hvězdy, ukazatele na celá čísla. 217 00:10:19,100 --> 00:10:21,570 Takže jsem to barvení Green-ish stejně. 218 00:10:21,570 --> 00:10:24,140 >> Vím, že to má něco co do činění s celým číslem, 219 00:10:24,140 --> 00:10:25,852 ale to není samo o sobě celé číslo. 220 00:10:25,852 --> 00:10:27,310 Ale je to skoro stejné nápad. 221 00:10:27,310 --> 00:10:28,101 Vytvořil jsem krabici. 222 00:10:28,101 --> 00:10:30,070 Obě tyto práva nyní žijí na zásobníku. 223 00:10:30,070 --> 00:10:32,520 Já jsem jim dal obě jména. 224 00:10:32,520 --> 00:10:36,750 >> int hvězda b rovná malloc velikost int. 225 00:10:36,750 --> 00:10:38,560 Tohle by mohlo být trochu složitější. 226 00:10:38,560 --> 00:10:44,110 Vezměte druhý a přemýšlet o tom, co by se očekávat, že se stane v tomto schématu. 227 00:10:44,110 --> 00:10:50,210 int hvězda b rovná malloc velikost int. 228 00:10:50,210 --> 00:10:51,940 >> No to není jen vytvořit jednu kolonku. 229 00:10:51,940 --> 00:10:53,800 Toto vlastně vytváří dvě krabice. 230 00:10:53,800 --> 00:10:58,670 A to vazby, ale také stanovuje bod ve vztahu. 231 00:10:58,670 --> 00:11:02,240 Máme přiděleno jeden blok paměti na haldě. 232 00:11:02,240 --> 00:11:05,940 Všimněte si, že v pravém horním rohu box tam nemá jméno. 233 00:11:05,940 --> 00:11:06,760 >> Mallocd jsme to. 234 00:11:06,760 --> 00:11:08,050 To existuje na haldě. 235 00:11:08,050 --> 00:11:10,090 Ale b má jméno. 236 00:11:10,090 --> 00:11:11,950 Je to ukazatel proměnnou s názvem b. 237 00:11:11,950 --> 00:11:13,910 Která žije na zásobníku. 238 00:11:13,910 --> 00:11:18,250 >> Takže je to kus paměti , který odkazuje na jiný. 239 00:11:18,250 --> 00:11:21,840 b obsahuje adresu z tohoto bloku paměti. 240 00:11:21,840 --> 00:11:23,757 Nemá jméno jinak. 241 00:11:23,757 --> 00:11:24,590 Ale to poukazuje na to. 242 00:11:24,590 --> 00:11:29,760 Takže když řekneme int star b se rovná Velikost malloc int, že právě tam, 243 00:11:29,760 --> 00:11:33,490 že šipka, která vyskočila na pravá strana tam, že celá ta věc, 244 00:11:33,490 --> 00:11:36,740 Budu mít to vypadat Znovu, je to, co se stane. 245 00:11:36,740 --> 00:11:39,341 To vše se děje v že jediný řádek kódu. 246 00:11:39,341 --> 00:11:41,340 Teď budeme mít trochu víc přímočaré znovu. 247 00:11:41,340 --> 00:11:43,330 A je rovna ampersand m. 248 00:11:43,330 --> 00:11:46,280 Vzpomínáte si, co si rovná ampersand m je? 249 00:11:46,280 --> 00:11:48,920 No to je dostane adresu M. 250 00:11:48,920 --> 00:11:54,150 Nebo dát více schematicky, A ukazuje na m. 251 00:11:54,150 --> 00:11:56,360 >> A je rovna b. 252 00:11:56,360 --> 00:11:57,560 OK, takže tady je další. 253 00:11:57,560 --> 00:11:59,230 A je rovna b. 254 00:11:59,230 --> 00:12:02,260 Co se bude dít diagramu tentokrát? 255 00:12:02,260 --> 00:12:04,330 >> No připomenout, že Operátor přiřazení práce 256 00:12:04,330 --> 00:12:08,960 přiřazením hodnoty na straně právo na hodnotu vlevo. 257 00:12:08,960 --> 00:12:14,820 Takže místo toho, ukazovací do m, je nyní poukazuje na stejném místě, které b bodů. 258 00:12:14,820 --> 00:12:18,900 neukazuje na B, A místa, kde se b bodů. 259 00:12:18,900 --> 00:12:25,280 >> Pokud se ukázal na B, která by byli se rovná ampersand b. 260 00:12:25,280 --> 00:12:28,150 Ale místo toho se rovná b jen Znamená to, že a a b jsou nyní 261 00:12:28,150 --> 00:12:31,770 směřující na stejnou adresu, protože uvnitř b je jen adresa. 262 00:12:31,770 --> 00:12:35,004 A teď uvnitř a je stejná adresa. 263 00:12:35,004 --> 00:12:37,170 m se rovná 10, pravděpodobně Nejjednodušší věc 264 00:12:37,170 --> 00:12:38,690 udělali jsme v trochu. 265 00:12:38,690 --> 00:12:40,460 Dejte 10 v krabici. 266 00:12:40,460 --> 00:12:45,640 Hvězda b se rovná m plus 2, převezme zpět od náš ukazatele video Co hvězda b znamená. 267 00:12:45,640 --> 00:12:50,230 Budeme dereference b a put nějakou hodnotu v tomto paměťovém místě. 268 00:12:50,230 --> 00:12:51,860 V tomto případě 12. 269 00:12:51,860 --> 00:12:55,300 >> Takže když jsme se dereference bodu vzpomínám jen jsme cestovat dolů na šipku. 270 00:12:55,300 --> 00:12:58,205 Jinak řečeno, my jděte na tuto adresu paměti 271 00:12:58,205 --> 00:12:59,580 a my jsme s ním manipulovat nějakým způsobem. 272 00:12:59,580 --> 00:13:00,830 Dali jsme nějakou hodnotu tam. 273 00:13:00,830 --> 00:13:03,960 V tomto případě hvězdičkový B rovná se M plus 2 je prostě 274 00:13:03,960 --> 00:13:08,230 jít do proměnné ukázal na B, přejít do paměti ukázal na B, 275 00:13:08,230 --> 00:13:11,750 a dal m plus 2 tam, 12. 276 00:13:11,750 --> 00:13:14,970 >> Teď jsem osvobodit b. 277 00:13:14,970 --> 00:13:16,490 Co se stane, když jsem se osvobodit b? 278 00:13:16,490 --> 00:13:18,800 Vzpomeňte si, co jsem řekl, volné prostředky. 279 00:13:18,800 --> 00:13:21,920 Co jsem řekl, když jsem se osvobodit b? 280 00:13:21,920 --> 00:13:23,410 >> Skončil jsem s ní pracovat, ne? 281 00:13:23,410 --> 00:13:25,702 Já v podstatě vzdát paměti. 282 00:13:25,702 --> 00:13:26,910 Dávám ji zpět do systému. 283 00:13:26,910 --> 00:13:33,010 Nepotřebuju to už je to, co jsem jim řekl, OK? 284 00:13:33,010 --> 00:13:37,390 >> Teď, když řeknu hvězdičkou se rovná 11 můžete pravděpodobně 285 00:13:37,390 --> 00:13:40,460 Již, že něco špatného říct, se stane, že? 286 00:13:40,460 --> 00:13:44,160 A skutečně, když jsem se snažil, že bych asi by utrpěla chybu segmentace. 287 00:13:44,160 --> 00:13:47,140 Vzhledem k tomu, nyní, i když předtím, že kus paměti 288 00:13:47,140 --> 00:13:50,220 bylo něco, co jsem měl přístupu k nim v tomto bodě 289 00:13:50,220 --> 00:13:54,590 teď jsem přístup k paměti, že není legální pro mě přístup. 290 00:13:54,590 --> 00:13:57,330 >> A jak budeme pravděpodobně vzpomínáte, když jsme se přístup k paměti 291 00:13:57,330 --> 00:14:00,000 že jsme neměli na dotek, to je nejčastější příčinou 292 00:14:00,000 --> 00:14:01,860 z segmentace porucha. A tak se můj program 293 00:14:01,860 --> 00:14:05,170 zřítí, když jsem se snažil to udělat. 294 00:14:05,170 --> 00:14:09,910 Takže opět je to dobrý nápad, aby si dobře praxe a dobré návyky hluboce zakořeněné 295 00:14:09,910 --> 00:14:12,920 Při práci s malloc a zdarma, takže nemusíte trpět segmentaci 296 00:14:12,920 --> 00:14:15,310 chyby, a že používáte vaše dynamicky přidělené 297 00:14:15,310 --> 00:14:17,370 paměť zodpovědně. 298 00:14:17,370 --> 00:14:20,300 >> Jsem Doug Lloyd je to CS50. 299 00:14:20,300 --> 00:14:21,947