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