1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:01,395 [Грає музика] 3 00:00:01,395 --> 00:00:05,590 4 00:00:05,590 --> 00:00:07,940 >> ДАГ Lloyd: Добре, таким чином пропозицію перед початком тут. 5 00:00:07,940 --> 00:00:11,660 Якщо ви не дивилися відео на покажчики ви можете зробити так в першу чергу. 6 00:00:11,660 --> 00:00:15,860 Тому що це відео є ще одним спосіб роботи з покажчиками. 7 00:00:15,860 --> 00:00:17,574 >> Таким чином, це буде говорити про деяких понять 8 00:00:17,574 --> 00:00:19,490 що ми розглянемо в Покажчики відео, і ми 9 00:00:19,490 --> 00:00:21,948 збирається замовчувати їх зараз, припускаючи, що вони вже 10 00:00:21,948 --> 00:00:23,090 начебто зрозумів. 11 00:00:23,090 --> 00:00:25,440 Так що це просто ваш справедливе попередження що якщо ви бачите це відео 12 00:00:25,440 --> 00:00:27,814 і ви ще не бачили покажчики відео, це могло б свого роду 13 00:00:27,814 --> 00:00:29,610 літати над вашою головою небагато. 14 00:00:29,610 --> 00:00:32,080 І так було б краще щоб подивитися його в такому порядку. 15 00:00:32,080 --> 00:00:34,710 >> Таким чином, ми вже бачили одне спосіб роботи з покажчиками, 16 00:00:34,710 --> 00:00:37,810 що ми оголосити Мінлива, а потім ми 17 00:00:37,810 --> 00:00:42,160 оголосити ще одну змінну, покажчик Змінна, яка вказує на нього. 18 00:00:42,160 --> 00:00:44,870 Таким чином, ми створили Змінна з ім'ям, ми 19 00:00:44,870 --> 00:00:48,480 створив другу змінну з ім'ям, і ми вказуємо, що друга змінна 20 00:00:48,480 --> 00:00:50,220 на що в першу чергу. 21 00:00:50,220 --> 00:00:52,370 Цей вид має Проблема, хоча, тому що це 22 00:00:52,370 --> 00:00:54,650 вимагає від нас, щоб точно знати, скільки пам'яті ми 23 00:00:54,650 --> 00:00:57,600 знадобиться в той момент, наша програма буде скомпільована. 24 00:00:57,600 --> 00:00:58,220 >> Чому так? 25 00:00:58,220 --> 00:01:03,338 Тому що ми повинні бути в змозі назвати або визначити всі можливі змінні 26 00:01:03,338 --> 00:01:04,129 ми могли б зіткнутися. 27 00:01:04,129 --> 00:01:07,910 Ми могли б мати масив, що може бути в змозі тримати багато інформації, 28 00:01:07,910 --> 00:01:10,110 але це ще не точно досить точним. 29 00:01:10,110 --> 00:01:12,640 Що робити, якщо ми не знаємо, що, якщо у нас немає анінайменшого уявлення 30 00:01:12,640 --> 00:01:14,370 скільки нам потрібно під час компіляції? 31 00:01:14,370 --> 00:01:17,020 Або що, якщо наша програма буде запустити протягом дійсно довгого часу, 32 00:01:17,020 --> 00:01:19,810 приймаючи різні користувача даних і ми не можемо насправді 33 00:01:19,810 --> 00:01:23,170 оцінити чи ми знадобиться 1000 одиниць? 34 00:01:23,170 --> 00:01:26,060 >> Це не те, ми можемо кажуть у командному рядку 35 00:01:26,060 --> 00:01:28,040 введіть скільки предметів Ви думаєте, що ви будете потребувати. 36 00:01:28,040 --> 00:01:31,100 Ну що, якщо це припущення невірно? 37 00:01:31,100 --> 00:01:34,300 Динамічне виділення пам'яті роду дозволяє нам шлях 38 00:01:34,300 --> 00:01:36,867 щоб обійти цієї конкретної проблеми. 39 00:01:36,867 --> 00:01:38,700 І те, як він це робить є використання покажчиків. 40 00:01:38,700 --> 00:01:42,140 >> Ми можемо використовувати покажчики на отримати доступ до динамічно 41 00:01:42,140 --> 00:01:45,710 виділена пам'ять, пам'ять, виділено в якості програми. 42 00:01:45,710 --> 00:01:48,290 Це не виділяється під час компіляції. 43 00:01:48,290 --> 00:01:51,570 Коли ви динамічно виділяти пам'яті вона виходить від басейну 44 00:01:51,570 --> 00:01:53,795 пам'яті відомий як купи. 45 00:01:53,795 --> 00:01:56,420 Раніше всі ми в пам'яті працює з в ході 46 00:01:56,420 --> 00:01:59,920 був виходячи з пулу пам'яті відомий як стек. 47 00:01:59,920 --> 00:02:02,470 Хороший спосіб, як правило тримати в mind-- і з цього правила 48 00:02:02,470 --> 00:02:04,720 не завжди справедливі, але в значній мірі майже 49 00:02:04,720 --> 00:02:09,940 завжди тримає true--, що будь раз ви дати ім'я змінної його 50 00:02:09,940 --> 00:02:12,090 ймовірно, живе в стеку. 51 00:02:12,090 --> 00:02:14,650 І в будь-який час ви не дати змінної ім'я, 52 00:02:14,650 --> 00:02:19,160 які ви можете зробити з динамічною пам'яттю розподіл, вона живе в купі. 53 00:02:19,160 --> 00:02:22,190 >> Тепер я начебто уявлення, як це якщо є ці два басейни пам'яті. 54 00:02:22,190 --> 00:02:24,740 Але ви, можливо, бачили це Діаграма, яка, як правило 55 00:02:24,740 --> 00:02:27,290 уявлення те, що пам'ять виглядає, 56 00:02:27,290 --> 00:02:30,373 і ми не збираємося, щоб піклуватися про все матеріал у верхній і нижній частині. 57 00:02:30,373 --> 00:02:33,580 Те, що ми дбаємо про те, ця частина в середній тут, купа і стек. 58 00:02:33,580 --> 00:02:35,570 Як ви можете бачити, дивлячись на цю діаграму, 59 00:02:35,570 --> 00:02:38,390 це насправді не два окремі басейни пам'яті. 60 00:02:38,390 --> 00:02:42,757 Це одна спільна пул пам'яті де ви починаєте в це візуальна 61 00:02:42,757 --> 00:02:44,590 Ви починаєте в нижній і почати заповнення 62 00:02:44,590 --> 00:02:48,040 з дна стека, і ви почати у верхній і почати заповнення 63 00:02:48,040 --> 00:02:50,072 зверху вниз з купи. 64 00:02:50,072 --> 00:02:51,780 Але насправді це Того ж пул, це просто 65 00:02:51,780 --> 00:02:56,050 різні плями, різних місцях в пам'яті, які виділяються. 66 00:02:56,050 --> 00:02:59,060 І ви можете працювати з пам'яті, або мають 67 00:02:59,060 --> 00:03:01,240 купа пройти весь шлях на дно, або 68 00:03:01,240 --> 00:03:05,440 стек пройти весь шлях до вершини, або мають купу і стек 69 00:03:05,440 --> 00:03:06,740 зустрітися один з одним. 70 00:03:06,740 --> 00:03:09,500 Всі ті, може бути умови які викликають вашу програму 71 00:03:09,500 --> 00:03:11,030 бігти з пам'яті. 72 00:03:11,030 --> 00:03:11,952 Так що майте це на увазі. 73 00:03:11,952 --> 00:03:13,660 Коли ми говоримо про купа і стек 74 00:03:13,660 --> 00:03:17,880 ми насправді говоримо про Взагалі ж шматок пам'яті, просто 75 00:03:17,880 --> 00:03:21,930 різні частини цієї пам'яті. 76 00:03:21,930 --> 00:03:24,910 >> Так як же нам отримати динамічно розподіленої пам'яті в першу чергу? 77 00:03:24,910 --> 00:03:27,740 Як отримати нашу програму пам'яті, як він працює? 78 00:03:27,740 --> 00:03:32,660 Ну З передбачена функція Танос, пам'ять розподільник, який 79 00:03:32,660 --> 00:03:36,810 Ви робите виклик, і ви проходите в скільки байт пам'яті, які ви хочете. 80 00:03:36,810 --> 00:03:39,940 Так що, якщо ваша програма працює і ви хочете ціле виконання, 81 00:03:39,940 --> 00:03:46,040 Ви могли б Mallock чотири байти пам'яті, Танос дужки чотири. 82 00:03:46,040 --> 00:03:48,540 >> Mallock буде пройти дивлячись через купу, 83 00:03:48,540 --> 00:03:50,750 бо ми динамічно виділення пам'яті, 84 00:03:50,750 --> 00:03:53,500 і він повернеться до вас покажчик на цю пам'ять. 85 00:03:53,500 --> 00:03:56,180 Це не дає вам, що memory-- це не дає йому ім'я, 86 00:03:56,180 --> 00:03:57,950 це дає вам покажчик на нього. 87 00:03:57,950 --> 00:04:00,780 І ось чому я знову сказав що важливо, може бути, 88 00:04:00,780 --> 00:04:03,770 переглянули відео покажчики перш ніж ми отримаємо надто далеко в цьому. 89 00:04:03,770 --> 00:04:05,940 Так Танос збирається дати вам назад покажчик. 90 00:04:05,940 --> 00:04:08,950 >> Якщо Mallock не можу дати вам будь-якої пам'яті, тому що ви запустите з, 91 00:04:08,950 --> 00:04:10,645 це дасть Вам нульовий покажчик. 92 00:04:10,645 --> 00:04:15,282 Ви пам'ятаєте, що станеться, якщо ми спробувати разименованія нульового покажчика? 93 00:04:15,282 --> 00:04:17,019 Ми страждаємо несправність SEG, чи не так? 94 00:04:17,019 --> 00:04:18,060 Це, ймовірно, не дуже добре. 95 00:04:18,060 --> 00:04:21,579 >> Таким чином, кожен раз, коли ви зробити дзвінок щоб Танос вас завжди, завжди 96 00:04:21,579 --> 00:04:25,270 необхідно перевірити, чи є покажчик він дав вам назад порожнім. 97 00:04:25,270 --> 00:04:28,800 Якщо це так, ви повинні закінчити вашу програму тому що, якщо ви спробуєте і разименованія 98 00:04:28,800 --> 00:04:31,360 нульовий покажчик ви збираєтеся страждати помилку сегментації 99 00:04:31,360 --> 00:04:34,380 і ваша програма вріжеться в будь-якому випадку. 100 00:04:34,380 --> 00:04:37,190 Так, як ми статично отримати ціле число? 101 00:04:37,190 --> 00:04:37,730 >> INT х. 102 00:04:37,730 --> 00:04:40,010 Ми, ймовірно, зробили що купу разів, вірно? 103 00:04:40,010 --> 00:04:43,480 Це створює змінну з ім'ям х, який живе в стеку. 104 00:04:43,480 --> 00:04:46,190 Як ми динамічно отримуємо число? 105 00:04:46,190 --> 00:04:50,010 Int зірка ПВ дорівнює Танос 4. 106 00:04:50,010 --> 00:04:53,050 >> Або більш доречно ми б сказали, INT зірок точок 107 00:04:53,050 --> 00:04:57,680 дорівнює виділення пам'яті розмір Int, просто кинути деякі менше 108 00:04:57,680 --> 00:04:59,740 магічні числа навколо нашої програми. 109 00:04:59,740 --> 00:05:04,140 Це буде для нас отримати чотири байти пам'яті з купи, 110 00:05:04,140 --> 00:05:06,720 і покажчик ми отримуємо повернутися до неї називається пікс. 111 00:05:06,720 --> 00:05:08,430 А потім просто, як ми зроблено раніше ми 112 00:05:08,430 --> 00:05:13,966 може разименовать пікселів на доступ до цієї пам'яті. 113 00:05:13,966 --> 00:05:15,590 Як ми можемо отримати ціле число від користувача? 114 00:05:15,590 --> 00:05:17,970 Ми можемо сказати, INT х дорівнює отримати Int. 115 00:05:17,970 --> 00:05:19,930 Це досить просто. 116 00:05:19,930 --> 00:05:24,030 Що робити, якщо ми хочемо створити масив х поплавців, які живуть в стеку? 117 00:05:24,030 --> 00:05:28,210 плавати stack_array-- це ім'я наших array-- квадратних дужках х. 118 00:05:28,210 --> 00:05:32,419 Це створить для нас масив х поплавців, які живуть в стеку. 119 00:05:32,419 --> 00:05:34,960 Ми можемо створити масив поплавців що живе в купі, теж. 120 00:05:34,960 --> 00:05:37,330 Синтаксис може виглядати трохи більш громіздким, 121 00:05:37,330 --> 00:05:41,740 але ми можемо сказати, поплавок зірковий heap_array дорівнює 122 00:05:41,740 --> 00:05:44,360 Танос х разів розмір поплавця. 123 00:05:44,360 --> 00:05:48,160 Мені потрібно достатньо місця, щоб провести х з плаваючою комою. 124 00:05:48,160 --> 00:05:51,560 Так би мовити, мені потрібно 100 поплавці, або 1000 поплавці. 125 00:05:51,560 --> 00:05:54,810 Так що в цьому випадку було б 400 байт на 100 поплавців, 126 00:05:54,810 --> 00:05:59,080 або 4000 байт на 1000 поплавців, бо кожен поплавок займає 127 00:05:59,080 --> 00:06:01,230 чотири байти простору. 128 00:06:01,230 --> 00:06:05,110 >> Після цього я можу використовувати квадрат синтаксис кронштейн heap_array. 129 00:06:05,110 --> 00:06:08,970 Так само, як я б на stack_array, я може отримати доступ до його елементи окремо 130 00:06:08,970 --> 00:06:11,590 використовуючи heap_array нулю, heap_array одним. 131 00:06:11,590 --> 00:06:15,800 Але згадати причину ми можемо зробити, що це тому, що ім'я масиву в C 132 00:06:15,800 --> 00:06:19,990 дійсно покажчик на Перший елемент цього масиву. 133 00:06:19,990 --> 00:06:23,480 Так на те, що ми оголошенні масив плаває в стеку тут 134 00:06:23,480 --> 00:06:24,810 насправді трохи вводить в оману. 135 00:06:24,810 --> 00:06:27,600 Ми дійсно в Другий рядок коду є 136 00:06:27,600 --> 00:06:32,360 Також створення покажчик на шматок пам'яті, що ми тоді робити якусь роботу с. 137 00:06:32,360 --> 00:06:35,620 >> Ось велика проблема з динамічною пам'яттю, хоча, 138 00:06:35,620 --> 00:06:38,360 і саме тому це дійсно Важливо розробити деякі хороші звички 139 00:06:38,360 --> 00:06:39,800 коли ви працюєте з ним. 140 00:06:39,800 --> 00:06:43,060 На відміну від статично оголошена пам'яті, ваша пам'ять 141 00:06:43,060 --> 00:06:46,790 автоматично не повертається Система, коли ваша функція зробити. 142 00:06:46,790 --> 00:06:49,280 Так що, якщо у нас є головний, і Основний викликає функцію 143 00:06:49,280 --> 00:06:53,860 ті, коли F обробки все, що робить і повертає управління програмою 144 00:06:53,860 --> 00:06:58,810 на головну, вся пам'ять що F використовується дається тому. 145 00:06:58,810 --> 00:07:01,250 Він може бути використаний знову іншою програмою, 146 00:07:01,250 --> 00:07:04,250 або деякі інші функції, які викликається пізніше в основному. 147 00:07:04,250 --> 00:07:06,970 Він може використовувати цю ж пам'ять знову і знову. 148 00:07:06,970 --> 00:07:09,620 >> Якщо ви динамічно виділити пам'ять, хоча 149 00:07:09,620 --> 00:07:14,380 Ви повинні явно вказати Система, що ви зробили з ним. 150 00:07:14,380 --> 00:07:18,370 Це буде тримати на нього для вас, які могли б привести до проблеми з вас йде 151 00:07:18,370 --> 00:07:19,290 пам'яті. 152 00:07:19,290 --> 00:07:22,179 І справді, ми іноді називаємо на це як витік пам'яті. 153 00:07:22,179 --> 00:07:24,970 І іноді ці витоку пам'яті може насправді бути дійсно руйнівним 154 00:07:24,970 --> 00:07:27,020 для продуктивності системи. 155 00:07:27,020 --> 00:07:31,120 >> Якщо ви часто інтернет-користувач Ви могли б використовувати деякі веб-браузери, 156 00:07:31,120 --> 00:07:35,630 і я не буду називати імен тут, але Є деякі веб-браузери там 157 00:07:35,630 --> 00:07:39,150 що сумно відомі фактично не маючи витоку пам'яті, які не отримують фіксовані. 158 00:07:39,150 --> 00:07:44,570 І якщо ви виходите ваш браузер з відкритим для дуже довгого періоду часу, днів 159 00:07:44,570 --> 00:07:48,060 і днів, або тижнів, іноді Можна помітити, що у вашій системі 160 00:07:48,060 --> 00:07:49,790 це працює насправді, дуже повільно. 161 00:07:49,790 --> 00:07:54,640 І причина для цього є те, що браузер виділив пам'ять, 162 00:07:54,640 --> 00:07:57,320 але тоді не повідомив систему що це зроблено з ним. 163 00:07:57,320 --> 00:08:01,000 І так, що залишає менше пам'яті доступні для всіх ваших інших програм 164 00:08:01,000 --> 00:08:04,480 щоб поділитися, тому що ви leaking-- що веб-браузер 165 00:08:04,480 --> 00:08:06,755 Програма витік пам'яті. 166 00:08:06,755 --> 00:08:08,880 Як ми даємо пам'ять назад коли ми зробили з ним? 167 00:08:08,880 --> 00:08:10,838 Ну, на щастя, це дуже простий спосіб зробити це. 168 00:08:10,838 --> 00:08:11,710 Ми просто звільнити його. 169 00:08:11,710 --> 00:08:15,020 Там це функція називається вільним, він приймає покажчик на пам'ять, 170 00:08:15,020 --> 00:08:16,010 і ми добре йти. 171 00:08:16,010 --> 00:08:18,310 >> Отже, давайте говорити, що ми в середина нашої програми, 172 00:08:18,310 --> 00:08:21,970 ми хочемо, щоб Танос 50 символів. 173 00:08:21,970 --> 00:08:25,710 Ми хочемо, щоб Танос масив, який може здатна утримувати 50 символів. 174 00:08:25,710 --> 00:08:29,109 І коли ми отримуємо покажчик назад що ім'я цього покажчика є слово. 175 00:08:29,109 --> 00:08:30,900 Ми робимо все, що ми збирається робити зі словом, 176 00:08:30,900 --> 00:08:33,440 а потім, коли ми зроблено, ми просто звільнити його. 177 00:08:33,440 --> 00:08:37,460 А тепер ми повернулися ті 50 байт пам'яті назад в систему. 178 00:08:37,460 --> 00:08:40,147 Деякі інші функції можуть їх використовувати. 179 00:08:40,147 --> 00:08:43,480 Ми не повинні турбуватися про переносячи витік пам'яті, тому що ми звільнили слово. 180 00:08:43,480 --> 00:08:46,639 Ми дали пам'ять назад, так, що ми закінчили працювати з ним. 181 00:08:46,639 --> 00:08:48,430 Таким чином, є три Золоті правила, які повинні 182 00:08:48,430 --> 00:08:51,700 мати на увазі, коли ви динамічного розподілу пам'яті 183 00:08:51,700 --> 00:08:52,990 з Танос. 184 00:08:52,990 --> 00:08:56,480 Кожен блок пам'яті, Ви Танос повинні бути звільнені 185 00:08:56,480 --> 00:08:58,430 Перед вашою програми завершення роботи. 186 00:08:58,430 --> 00:09:02,029 Тепер знову, у виробі чи IDE такого роду походить для вас в будь-якому випадку 187 00:09:02,029 --> 00:09:04,820 коли you-- це відбудеться в будь-якому випадку якщо ваша програма завершується, 188 00:09:04,820 --> 00:09:06,880 вся пам'ять буде випущений. 189 00:09:06,880 --> 00:09:10,750 Але це в цілому хороший кодування Практика завжди, коли ви закінчите, 190 00:09:10,750 --> 00:09:13,810 звільнити те, що ви mallocd. 191 00:09:13,810 --> 00:09:16,690 >> Це сказало, тільки те, що Ви маєте mallocd повинні бути звільнені. 192 00:09:16,690 --> 00:09:19,880 Якщо ви статично проголосити число, INT х коми, 193 00:09:19,880 --> 00:09:23,500 що живе в стеку, ви не те хочу, щоб звільнити х. 194 00:09:23,500 --> 00:09:25,970 Так тільки те, що ви mallocd повинні бути звільнені. 195 00:09:25,970 --> 00:09:28,960 >> І, нарешті, не безкоштовно щось в два рази. 196 00:09:28,960 --> 00:09:31,170 Це може призвести до другий дивна ситуація. 197 00:09:31,170 --> 00:09:33,530 Так що все, що ви маєте mallocd повинен бути звільнений. 198 00:09:33,530 --> 00:09:36,000 Тільки те, що ви Танос повинні бути звільнені. 199 00:09:36,000 --> 00:09:38,730 І не безкоштовно щось в два рази. 200 00:09:38,730 --> 00:09:43,660 >> Отже, давайте розглянемо приклад тут що деякі динамічно розподіляється 201 00:09:43,660 --> 00:09:46,122 пам'яті може виглядати змішаної в з деякою статичної пам'яті. 202 00:09:46,122 --> 00:09:47,080 Що може трапитися тут? 203 00:09:47,080 --> 00:09:48,913 Дивіться, якщо ви можете слідувати вздовж і думаю, що 204 00:09:48,913 --> 00:09:51,720 станеться, як ми йдемо всі ці рядків коду. 205 00:09:51,720 --> 00:09:53,980 >> Тому ми говоримо, INT м. 206 00:09:53,980 --> 00:09:54,840 Що тут відбувається? 207 00:09:54,840 --> 00:09:56,339 Ну це досить просто. 208 00:09:56,339 --> 00:09:59,650 Я створюю ціле змінну м. 209 00:09:59,650 --> 00:10:01,400 Я пофарбувати його зеленим, бо це колір 210 00:10:01,400 --> 00:10:03,730 що я використовую, коли я кажу про цілочисельні змінні. 211 00:10:03,730 --> 00:10:05,160 Це коробка. 212 00:10:05,160 --> 00:10:08,400 Це називається м, і ви можете магазин цілі всередині нього. 213 00:10:08,400 --> 00:10:12,400 >> Що робити, якщо я тоді сказати INT зірці? 214 00:10:12,400 --> 00:10:13,530 Ну, що це досить схожі. 215 00:10:13,530 --> 00:10:15,780 Я створюю вікно називається. 216 00:10:15,780 --> 00:10:19,100 Він здатний холдингу Int зірки, покажчики на цілі числа. 217 00:10:19,100 --> 00:10:21,570 Так що я забарвлення це зелений-іш, а також. 218 00:10:21,570 --> 00:10:24,140 >> Я знаю, що є щось зробити з цілим числом, 219 00:10:24,140 --> 00:10:25,852 але це саме по собі не є цілим числом. 220 00:10:25,852 --> 00:10:27,310 Але це в значній мірі та ж ідея. 221 00:10:27,310 --> 00:10:28,101 Я створив вікно. 222 00:10:28,101 --> 00:10:30,070 Обидва ці права в даний час живуть в стеку. 223 00:10:30,070 --> 00:10:32,520 Я дав їм імена обох. 224 00:10:32,520 --> 00:10:36,750 >> INT зірка б дорівнює виділення пам'яті розмір Int. 225 00:10:36,750 --> 00:10:38,560 Цей може бути трохи складніше. 226 00:10:38,560 --> 00:10:44,110 Візьміть другий і подумайте, що ви було б очікувати, щоб це відбулося на цій діаграмі. 227 00:10:44,110 --> 00:10:50,210 INT зірка б дорівнює виділення пам'яті розмір Int. 228 00:10:50,210 --> 00:10:51,940 >> Ну це не просто створити одну коробку. 229 00:10:51,940 --> 00:10:53,800 Це насправді створює дві коробки. 230 00:10:53,800 --> 00:10:58,670 І це прив'язує, він також встановлює крапка у відносинах. 231 00:10:58,670 --> 00:11:02,240 Ми виділено один блок пам'яті в купі. 232 00:11:02,240 --> 00:11:05,940 Зверніть увагу, що верхній правий ящик Тобто не є ім'я. 233 00:11:05,940 --> 00:11:06,760 >> Ми mallocd його. 234 00:11:06,760 --> 00:11:08,050 Вона існує на купі. 235 00:11:08,050 --> 00:11:10,090 Але Ь має ім'я. 236 00:11:10,090 --> 00:11:11,950 Це змінна покажчик називається б. 237 00:11:11,950 --> 00:11:13,910 Це живе в стеку. 238 00:11:13,910 --> 00:11:18,250 >> Так що це частина пам'яті що вказує на інший. 239 00:11:18,250 --> 00:11:21,840 б містить адреса цього блоку пам'яті. 240 00:11:21,840 --> 00:11:23,757 Це не є ім'я інакше. 241 00:11:23,757 --> 00:11:24,590 Але він вказує на нього. 242 00:11:24,590 --> 00:11:29,760 Тому коли ми говоримо INT зірка б дорівнює Розмір Танос ІНТ, що тут, 243 00:11:29,760 --> 00:11:33,490 що стрілка, яка вискочив на права сторона є, що вся річ, 244 00:11:33,490 --> 00:11:36,740 Я він з'явиться знову ж таки, те, що відбувається. 245 00:11:36,740 --> 00:11:39,341 Все, що відбувається в що один рядок коду. 246 00:11:39,341 --> 00:11:41,340 Тепер ми отримаємо трохи більше просто ще раз. 247 00:11:41,340 --> 00:11:43,330 А одно амперсанд м. 248 00:11:43,330 --> 00:11:46,280 Пам'ятаєш вам, що дорівнює амперсанд м є? 249 00:11:46,280 --> 00:11:48,920 Ну, це отримує адреса M'S. 250 00:11:48,920 --> 00:11:54,150 Або, більш схематично, а вказує на м. 251 00:11:54,150 --> 00:11:56,360 >> А одно б. 252 00:11:56,360 --> 00:11:57,560 ОТЖЕ, ось ще один. 253 00:11:57,560 --> 00:11:59,230 А одно б. 254 00:11:59,230 --> 00:12:02,260 Що станеться діаграмі цей час? 255 00:12:02,260 --> 00:12:04,330 >> Ну нагадати, що Оператор присвоювання роботи 256 00:12:04,330 --> 00:12:08,960 шляхом присвоєння значення на Право на вартості зліва. 257 00:12:08,960 --> 00:12:14,820 Таким чином, замість вказуючого м, А тепер вказує на те ж місце, що б точок. 258 00:12:14,820 --> 00:12:18,900 а, не вказують на B, A вказує, де б балів. 259 00:12:18,900 --> 00:12:25,280 >> Якщо гострий б, що б були одно амперсанд б. 260 00:12:25,280 --> 00:12:28,150 Але замість цього дорівнює б тільки означає, що б зараз 261 00:12:28,150 --> 00:12:31,770 вказуючи на ту ж адресу, тому що всередині б тільки адресу. 262 00:12:31,770 --> 00:12:35,004 А тепер всередині це той же адресу. 263 00:12:35,004 --> 00:12:37,170 м дорівнює 10, ймовірно, Найбільш проста справа 264 00:12:37,170 --> 00:12:38,690 ми зробили в небагато. 265 00:12:38,690 --> 00:12:40,460 Помістіть 10 в коробці. 266 00:12:40,460 --> 00:12:45,640 Зірка б дорівнює м плюс 2, нагадаємо, з наш покажчики відео, що зірка б означає. 267 00:12:45,640 --> 00:12:50,230 Ми збираємося разименовиванія б і покласти деяке значення в цьому місці пам'яті. 268 00:12:50,230 --> 00:12:51,860 У цьому випадку 12. 269 00:12:51,860 --> 00:12:55,300 >> Тому, коли ми разименовивать точки Нагадаємо, ми просто рухатися вниз стрілку. 270 00:12:55,300 --> 00:12:58,205 Або іншими словами, ми перейти на цю адресу пам'яті 271 00:12:58,205 --> 00:12:59,580 і ми маніпулювати якимось чином. 272 00:12:59,580 --> 00:13:00,830 Ми ставимо деяке значення в там. 273 00:13:00,830 --> 00:13:03,960 У цьому випадку зірки У дорівнює т плюс 2 просто 274 00:13:03,960 --> 00:13:08,230 перейти до змінної, на яку вказує б, перейти до пам'яті, на яку вказує б, 275 00:13:08,230 --> 00:13:11,750 і поклав м плюс 2 там, 12. 276 00:13:11,750 --> 00:13:14,970 >> Тепер я вільно б. 277 00:13:14,970 --> 00:13:16,490 Що відбувається, коли я звільняю б? 278 00:13:16,490 --> 00:13:18,800 Пам'ятайте, що я сказав, безкоштовні засоби. 279 00:13:18,800 --> 00:13:21,920 Що я кажу, коли я звільнитися б? 280 00:13:21,920 --> 00:13:23,410 >> Я зробив з ним працювати, чи не так? 281 00:13:23,410 --> 00:13:25,702 Я по суті відмовитися від пам'яті. 282 00:13:25,702 --> 00:13:26,910 Я даю його назад в систему. 283 00:13:26,910 --> 00:13:33,010 Мені не потрібно це більше є те, що я кажу їм, ОК? 284 00:13:33,010 --> 00:13:37,390 >> Тепер, якщо я говорю зірці дорівнює 11, ймовірно, можна 285 00:13:37,390 --> 00:13:40,460 вже сказати, що щось погане відбудеться тут, прямо? 286 00:13:40,460 --> 00:13:44,160 І справді, якщо я пробував, що я, ймовірно, страждатиме помилку сегментації. 287 00:13:44,160 --> 00:13:47,140 Тому що зараз, хоча раніше, що частина пам'яті 288 00:13:47,140 --> 00:13:50,220 було щось, що я мав доступ до, в цій точці 289 00:13:50,220 --> 00:13:54,590 тепер я доступу до пам'яті, що не є законним для мене, щоб отримати доступ. 290 00:13:54,590 --> 00:13:57,330 >> І, як ми, ймовірно, Нагадаємо, що, коли ми отримуємо доступ до пам'яті 291 00:13:57,330 --> 00:14:00,000 що ми не повинні чіпати, це найпоширеніша причина 292 00:14:00,000 --> 00:14:01,860 з сегментації вина. І так моя програма 293 00:14:01,860 --> 00:14:05,170 буде катастрофа, якщо я намагався зробити це. 294 00:14:05,170 --> 00:14:09,910 Отже, ще раз, що це гарна ідея, щоб отримати хороший практика і хороші звички вкоренилися 295 00:14:09,910 --> 00:14:12,920 при роботі з Танос і безкоштовно, так що ви не страждаєте сегментації 296 00:14:12,920 --> 00:14:15,310 помилки, і що ви використовуєте Ваш виділяється динамічно 297 00:14:15,310 --> 00:14:17,370 пам'яті відповідально. 298 00:14:17,370 --> 00:14:20,300 >> Я Дуг Ллойда це CS50. 299 00:14:20,300 --> 00:14:21,947