1 00:00:00,000 --> 00:00:11,320 2 00:00:11,320 --> 00:00:13,260 >> DAVID МАЛАН: Здравствуйте, и добро пожаловать обратно в CS50. 3 00:00:13,260 --> 00:00:14,860 Так что это в конце недели четыре. 4 00:00:14,860 --> 00:00:16,680 Только одно объявление в первую очередь. 5 00:00:16,680 --> 00:00:19,600 Таким образом, так называемый пятый понедельник придумывать следующий понедельник. 6 00:00:19,600 --> 00:00:22,800 Это возможность перейти от СБ / ненасыщенного на письмо классе, или из 7 00:00:22,800 --> 00:00:24,130 буквенную СБ / ненасыщенного. 8 00:00:24,130 --> 00:00:27,130 Досадно, что процесс требует подписи, потому что вы должны заполнить 9 00:00:27,130 --> 00:00:28,770 один из тех, розовый ввода / вывода форм. 10 00:00:28,770 --> 00:00:31,680 >> Потому что технически, СБ / ненасыщенного версии и версии буквенную 11 00:00:31,680 --> 00:00:33,320 имеют различные номера по каталогу. 12 00:00:33,320 --> 00:00:34,240 Но никакое грандиозное предприятие. 13 00:00:34,240 --> 00:00:36,620 Просто приходите ко мне или к Робу или Лорен в любой момент. 14 00:00:36,620 --> 00:00:39,550 Или напишите нам, если у вас нет вида документов вам нужно сегодня, и мы 15 00:00:39,550 --> 00:00:43,410 будете уверены, чтобы помочь вам принять уход за что до понедельника. 16 00:00:43,410 --> 00:00:45,780 >> Ладно, так что сегодня - 17 00:00:45,780 --> 00:00:47,630 На самом деле, есть что-то вроде эха. 18 00:00:47,630 --> 00:00:51,070 Можем ли мы тон меня немного? 19 00:00:51,070 --> 00:00:51,730 ОК. 20 00:00:51,730 --> 00:00:54,850 Таким образом, сегодня мы вводим тему известный как указатели. 21 00:00:54,850 --> 00:00:57,770 И я признаю, что это один из более сложные темы, которые мы, как правило, 22 00:00:57,770 --> 00:01:00,960 охватывают в этом классе, или действительно любой вводный курс, который использует C. 23 00:01:00,960 --> 00:01:05,510 >> Но поверьте мне на слово это, в частности, Если ваш ум чувствует себя немного более изогнутые 24 00:01:05,510 --> 00:01:07,100 сегодня и в ближайшие недели. 25 00:01:07,100 --> 00:01:10,340 Это не представитель вы получаете хуже в это это просто означает, что 26 00:01:10,340 --> 00:01:13,360 это особенно сложные темы Я обещаю, что, через несколько недель 27 00:01:13,360 --> 00:01:17,610 Таким образом, будет казаться слишком разительно прост в ретроспективе. 28 00:01:17,610 --> 00:01:18,720 >> Я все еще помню по сей день. 29 00:01:18,720 --> 00:01:22,190 Я сидел в Эллиотт столовая, сидя рядом с моим TF Нишат Мехта, 30 00:01:22,190 --> 00:01:24,070 который был жителем Elliott House. 31 00:01:24,070 --> 00:01:26,340 И почему-то, эта Тема просто кликов. 32 00:01:26,340 --> 00:01:29,430 Который должен сказать, что я тоже боролся с ним в течение некоторого количества времени, но я 33 00:01:29,430 --> 00:01:33,610 сделаю все возможное, чтобы помочь избежать таких борьба с теми, что в конечном счете 34 00:01:33,610 --> 00:01:34,580 является достаточно мощным. 35 00:01:34,580 --> 00:01:37,350 >> В самом деле, одна из тем, которые мы будем обсуждать В ближайшие недели в том, что 36 00:01:37,350 --> 00:01:41,130 безопасности, и как вы можете на самом деле эксплуатировать машины таким образом, 37 00:01:41,130 --> 00:01:42,320 которые не были предназначены. 38 00:01:42,320 --> 00:01:45,850 А те, как правило, exploitations результатом ошибки, ошибки, которые мы 39 00:01:45,850 --> 00:01:49,740 люди делают, не понимания некоторых от конкретной реализации 40 00:01:49,740 --> 00:01:52,250 подробнее через какие программы сделали. 41 00:01:52,250 --> 00:01:55,410 >> Теперь, чтобы сделать это кажется все более пользователей доброжелателен, я думал, что я буду играть 10 42 00:01:55,410 --> 00:01:59,680 секундный фрагмент немного Claymation цифру назвал Binky который был доставлен в 43 00:01:59,680 --> 00:02:03,020 жизни нашего друга в Стэнфорде, Профессор Ник Parlante. 44 00:02:03,020 --> 00:02:06,753 Так что позвольте мне дать вам это тизер Binky здесь. 45 00:02:06,753 --> 00:02:09,520 >> [ВОСПРОИЗВЕДЕНИЕ ВИДЕО] 46 00:02:09,520 --> 00:02:10,380 >> -Эй, Бинки. 47 00:02:10,380 --> 00:02:11,050 Проснуться. 48 00:02:11,050 --> 00:02:13,610 Это время для указателя весело. 49 00:02:13,610 --> 00:02:14,741 >> -Что это? 50 00:02:14,741 --> 00:02:16,440 Узнайте о указатели? 51 00:02:16,440 --> 00:02:17,928 О, положительный герой. 52 00:02:17,928 --> 00:02:18,920 >> [КОНЕЦ ВИДЕОВОСПРОИЗВЕДЕНИЕ] 53 00:02:18,920 --> 00:02:20,670 >> DAVID МАЛАН: Это Стэнфорде информатики. 54 00:02:20,670 --> 00:02:23,194 Так об этом в будущем. 55 00:02:23,194 --> 00:02:24,930 >> [Аплодисменты] 56 00:02:24,930 --> 00:02:26,660 >> DAVID МАЛАН: Извини, Ник. 57 00:02:26,660 --> 00:02:30,680 >> Поэтому напомним, что в прошлый раз мы закончили на это действительно захватывающее захватывающим 58 00:02:30,680 --> 00:02:32,960 причем эта функция просто не работает. 59 00:02:32,960 --> 00:02:34,960 По крайней мере, интуитивно, он чувствовал как она должна работать. 60 00:02:34,960 --> 00:02:37,600 Просто поменять местами значения двух целых чисел. 61 00:02:37,600 --> 00:02:40,915 Но напомним, что, когда мы выводим исходных значений в основном, один и 62 00:02:40,915 --> 00:02:44,210 два, они были все еще одно и два, а не две, а одну. 63 00:02:44,210 --> 00:02:46,070 >> Итак, позвольте мне на самом деле переключения более к прибору. 64 00:02:46,070 --> 00:02:50,180 И я написал немного кода в скелетных продвижения здесь, где я утверждаю, что X 65 00:02:50,180 --> 00:02:52,500 будет 1, у 2 будет. 66 00:02:52,500 --> 00:02:54,810 Я затем распечатать и их Значения F с печатью. 67 00:02:54,810 --> 00:02:57,540 >> Я тогда утверждать, что здесь мы собираемся поменять их местами. 68 00:02:57,540 --> 00:03:00,800 Я оставил пустое место здесь для нас заполнить сегодня через минуту. 69 00:03:00,800 --> 00:03:03,380 Тогда, я буду утверждать, что двух переменных были обменяны. 70 00:03:03,380 --> 00:03:04,770 Тогда я собираюсь распечатать их снова. 71 00:03:04,770 --> 00:03:07,090 И так, мы надеемся, я должен видеть 1, 2. 72 00:03:07,090 --> 00:03:07,380 2, 1. 73 00:03:07,380 --> 00:03:09,830 Это супер просто цель сейчас. 74 00:03:09,830 --> 00:03:12,430 >> Так как же нам идти об обмене двух переменных? 75 00:03:12,430 --> 00:03:17,220 Ну, если я предлагаю здесь, что эти чашки может представлять памяти в компьютере. 76 00:03:17,220 --> 00:03:19,070 Это несколько укусов, это Другой несколько укусов. 77 00:03:19,070 --> 00:03:23,260 Могли ли мы волонтер поднимайся и смешать нам выпить, если знакомы? 78 00:03:23,260 --> 00:03:23,920 Поднимайся. 79 00:03:23,920 --> 00:03:24,815 Как тебя зовут? 80 00:03:24,815 --> 00:03:25,260 >> Джесси: Джесс. 81 00:03:25,260 --> 00:03:25,690 >> DAVID МАЛАН: Джесс? 82 00:03:25,690 --> 00:03:26,540 Поднимайся, Джесс. 83 00:03:26,540 --> 00:03:29,180 Если вы не возражаете, мы должны положить Google стекла на вас, чтобы мы могли 84 00:03:29,180 --> 00:03:30,430 увековечить это. 85 00:03:30,430 --> 00:03:32,800 86 00:03:32,800 --> 00:03:34,670 Хорошо, стекла. 87 00:03:34,670 --> 00:03:37,250 Запись видео. 88 00:03:37,250 --> 00:03:43,103 И хорошо, что мы хорошие, чтобы пойти с Джесс здесь. 89 00:03:43,103 --> 00:03:43,810 Хорошо. 90 00:03:43,810 --> 00:03:45,120 Очень приятно. 91 00:03:45,120 --> 00:03:47,720 >> Так что я хотел бы вам сделать здесь - если бы вы могли, достаточно быстро - 92 00:03:47,720 --> 00:03:51,040 просто льет нам половину стакана апельсинового сока и полстакана молока 93 00:03:51,040 --> 00:03:55,710 представляющий эффективно цифрами 1 В одной чашке и 2 в другой чашке. 94 00:03:55,710 --> 00:04:01,380 95 00:04:01,380 --> 00:04:02,630 >> Это собирается быть хорошие кадры. 96 00:04:02,630 --> 00:04:04,910 97 00:04:04,910 --> 00:04:05,860 >> JESS: Извините. 98 00:04:05,860 --> 00:04:06,330 >> DAVID МАЛАН: Нет, нет. 99 00:04:06,330 --> 00:04:08,703 Все в порядке. 100 00:04:08,703 --> 00:04:10,120 Ниццу. 101 00:04:10,120 --> 00:04:12,950 Ладно, у нас есть четыре байта Стоит апельсинового сока. 102 00:04:12,950 --> 00:04:14,460 Мы назвали его значение 1. 103 00:04:14,460 --> 00:04:16,579 Теперь еще четыре байта стоит молока. 104 00:04:16,579 --> 00:04:18,519 Будем называть его значение 2. 105 00:04:18,519 --> 00:04:20,440 Так что х и у, соответственно. 106 00:04:20,440 --> 00:04:23,450 >> Ладно, так что теперь, если задаче - для вас, Джесс, на глазах у всех 107 00:04:23,450 --> 00:04:24,270 из ваших одноклассников - 108 00:04:24,270 --> 00:04:28,510 является замена значения х и у такие, что мы хотим, апельсиновый сок в 109 00:04:28,510 --> 00:04:32,070 другой чашке и молоко в чашу сию, как может вас - прежде чем на самом деле 110 00:04:32,070 --> 00:04:34,020 это - идти об этом? 111 00:04:34,020 --> 00:04:35,220 >> Хорошо, мудрое решение. 112 00:04:35,220 --> 00:04:36,340 Так что вам нужно немного больше памяти. 113 00:04:36,340 --> 00:04:38,190 Так что давайте выделить временное чашку, если вы будете. 114 00:04:38,190 --> 00:04:40,540 А теперь перейдем к поменять х и у. 115 00:04:40,540 --> 00:04:52,950 116 00:04:52,950 --> 00:04:53,530 >> Отлично. 117 00:04:53,530 --> 00:04:54,420 Так что очень хорошо сделано. 118 00:04:54,420 --> 00:04:55,670 Большое вам спасибо, Джесс. 119 00:04:55,670 --> 00:04:59,520 120 00:04:59,520 --> 00:05:00,020 Вот, пожалуйста. 121 00:05:00,020 --> 00:05:01,950 Небольшой сувенир. 122 00:05:01,950 --> 00:05:04,350 >> Хорошо, таким образом, очевидно, супер просто идея. 123 00:05:04,350 --> 00:05:07,500 Совершенно интуитивно, что нам нужно немного больше места для хранения - в таком виде, 124 00:05:07,500 --> 00:05:09,750 чашка - если мы действительно хотим поменять этих двух переменных. 125 00:05:09,750 --> 00:05:11,110 Так что давайте делать именно это. 126 00:05:11,110 --> 00:05:14,330 Здесь, в между тем, где я утверждаю, что я собираюсь делать некоторые замены, я буду 127 00:05:14,330 --> 00:05:15,720 идти вперед и объявить темп. 128 00:05:15,720 --> 00:05:17,980 И я буду его равным, скажем, х. 129 00:05:17,980 --> 00:05:21,110 >> Тогда я собираюсь изменить значение X так же, как Джесс сделал здесь с 130 00:05:21,110 --> 00:05:23,200 молоко и апельсиновый сок равным у. 131 00:05:23,200 --> 00:05:27,460 И я собираюсь изменить Y равным не х, потому что теперь мы будем 132 00:05:27,460 --> 00:05:29,530 застрял в круг, а темп. 133 00:05:29,530 --> 00:05:33,170 Там, где я временно - или там, где Джесс временно отложить апельсиновый сок 134 00:05:33,170 --> 00:05:35,460 до затирания, что чашки с молоком. 135 00:05:35,460 --> 00:05:37,250 >> Итак, позвольте мне теперь идти вперед и сделать это. 136 00:05:37,250 --> 00:05:39,210 Она называется noswap.c. 137 00:05:39,210 --> 00:05:41,190 А теперь позвольте мне работать не свопа. 138 00:05:41,190 --> 00:05:43,910 И в самом деле я вижу, если я расширяю окна немного, что 139 00:05:43,910 --> 00:05:45,160 х равен 1, у равен 2. 140 00:05:45,160 --> 00:05:47,230 , А затем х 2, у = 1. 141 00:05:47,230 --> 00:05:51,910 >> Но напомним, что в понедельник мы сделали вещи немного по-другому которой я 142 00:05:51,910 --> 00:05:56,760 , реализуются вспомогательные функции, если хотите, что было на самом деле пустота. 143 00:05:56,760 --> 00:05:58,010 Я назвал его поменять. 144 00:05:58,010 --> 00:06:01,600 Я дал ей два параметра, и я позвонил их и я назвал их б. 145 00:06:01,600 --> 00:06:04,380 >> Честно говоря, я мог бы назвать их х и у. 146 00:06:04,380 --> 00:06:06,040 Там ничто не мешает меня от этого. 147 00:06:06,040 --> 00:06:08,140 Но я бы сказал, что это то немного двусмысленно. 148 00:06:08,140 --> 00:06:11,910 Потому напомним, что в понедельник мы утверждают, что эти параметры были 149 00:06:11,910 --> 00:06:13,650 копии значений прошло дюйма 150 00:06:13,650 --> 00:06:15,640 Так что просто портит с виду, я думаю, если вы используете 151 00:06:15,640 --> 00:06:17,370 точно так же переменных. 152 00:06:17,370 --> 00:06:20,150 >> Так что я буду называть их вместо и В, только для ясности. 153 00:06:20,150 --> 00:06:21,840 Но мы могли бы назвать их наиболее все, что хотим. 154 00:06:21,840 --> 00:06:26,280 И я собираюсь копировать и вставлять эффективно этот код от там 155 00:06:26,280 --> 00:06:27,170 вниз в здесь. 156 00:06:27,170 --> 00:06:29,110 Потому что я только что видел, что он работает. 157 00:06:29,110 --> 00:06:30,790 Так вот в довольно хорошей форме. 158 00:06:30,790 --> 00:06:37,390 И я изменю свое х к, х моя а, у моего б и у моего б. 159 00:06:37,390 --> 00:06:39,130 >> Итак, другими словами, те же логикой. 160 00:06:39,130 --> 00:06:40,850 Одно и то же, что Джесс сделал. 161 00:06:40,850 --> 00:06:44,350 А потом одна вещь, я должен сделать до Здесь, конечно, сейчас ссылаться на это 162 00:06:44,350 --> 00:06:45,990 функции или вызвать эту функцию. 163 00:06:45,990 --> 00:06:50,430 Так что я буду называть эту функцию с двумя входов, х и у, и нажмите Сохранить. 164 00:06:50,430 --> 00:06:52,300 >> Ладно, принципиально то же самое. 165 00:06:52,300 --> 00:06:55,570 На самом деле, я, вероятно, сделали программу излишне сложным путем 166 00:06:55,570 --> 00:07:00,820 пишете функцию, которая просто принимает около шести строк кода, тогда как я 167 00:07:00,820 --> 00:07:02,970 ранее реализованы это всего за три. 168 00:07:02,970 --> 00:07:06,230 >> Итак, позвольте мне теперь идти вперед и переделать этого не делают подкачки. 169 00:07:06,230 --> 00:07:07,920 Ладно, я облажался здесь. 170 00:07:07,920 --> 00:07:11,290 Это должно быть ошибок, которые могут см. все более широко, как ваша 171 00:07:11,290 --> 00:07:12,380 Программы становятся все более сложными. 172 00:07:12,380 --> 00:07:13,470 Но есть легко исправить. 173 00:07:13,470 --> 00:07:15,650 Позвольте мне прокрутки вернуться сюда. 174 00:07:15,650 --> 00:07:18,190 >> И то, что первая ошибка, что я вижу? 175 00:07:18,190 --> 00:07:19,520 Неявная декларация. 176 00:07:19,520 --> 00:07:21,466 Что это обычно указывают? 177 00:07:21,466 --> 00:07:22,830 Ой, я забыл прототип. 178 00:07:22,830 --> 00:07:26,900 Я забыл научить компилятор, который своп будет существовать, хотя он 179 00:07:26,900 --> 00:07:28,920 не существует в самом начале программы. 180 00:07:28,920 --> 00:07:35,780 Так что я просто хотел сказать пустоту, своп, Интеллект, Перехват INT B, точкой с запятой. 181 00:07:35,780 --> 00:07:37,280 >> Так что я не собираюсь переопределить ее. 182 00:07:37,280 --> 00:07:39,140 Но теперь это соответствует тому, что это здесь. 183 00:07:39,140 --> 00:07:42,530 И заметьте, отсутствие точки с запятой здесь, который не является необходимым, когда 184 00:07:42,530 --> 00:07:43,200 реализации. 185 00:07:43,200 --> 00:07:46,010 >> Итак, позвольте мне переделать это, можете не свопа. 186 00:07:46,010 --> 00:07:46,910 Гораздо лучшей форме. 187 00:07:46,910 --> 00:07:48,130 Бегите не свопа. 188 00:07:48,130 --> 00:07:48,740 И черт побери. 189 00:07:48,740 --> 00:07:51,650 Теперь мы вернулись, где мы были в понедельник, где вещь не поменять. 190 00:07:51,650 --> 00:07:55,410 >> И то, что интуитивное объяснение , почему это так? 191 00:07:55,410 --> 00:07:56,380 Да? 192 00:07:56,380 --> 00:07:57,630 >> СТУДЕНТ: [неразборчиво]. 193 00:07:57,630 --> 00:08:04,140 194 00:08:04,140 --> 00:08:05,230 >> DAVID МАЛАН: Совершенно верно. 195 00:08:05,230 --> 00:08:07,330 Так что А и В являются копиями х и у. 196 00:08:07,330 --> 00:08:10,680 И в самом деле, в любое время вы были вызове функции до сих пор, что 197 00:08:10,680 --> 00:08:12,540 передает переменные, как целые - 198 00:08:12,540 --> 00:08:14,470 так же, как своп ожидает здесь - 199 00:08:14,470 --> 00:08:16,270 Вы, ребята, проходящий в копиях. 200 00:08:16,270 --> 00:08:19,150 >> Теперь, означает, что она занимает немного времени, доли секунды, для 201 00:08:19,150 --> 00:08:23,270 Компьютер для копирования битов из одного переменная в биты с другом. 202 00:08:23,270 --> 00:08:24,610 Но это не такое уж большое дело. 203 00:08:24,610 --> 00:08:25,920 Но они, тем не менее копию. 204 00:08:25,920 --> 00:08:30,020 >> И вот теперь, в контексте обмена, Я на самом деле успешно 205 00:08:30,020 --> 00:08:31,180 изменения и б. 206 00:08:31,180 --> 00:08:33,000 В самом деле, давайте делать быстрые санитарной проверки. 207 00:08:33,000 --> 00:08:36,830 Печать F является% I, новая строка. 208 00:08:36,830 --> 00:08:38,770 И подключить давайте в. 209 00:08:38,770 --> 00:08:41,830 Теперь давайте сделаем то же самое с б. 210 00:08:41,830 --> 00:08:43,640 И давайте делать то же самое здесь. 211 00:08:43,640 --> 00:08:47,260 >> А теперь, позвольте мне скопировать эти же линии снова в нижней части функции 212 00:08:47,260 --> 00:08:51,250 после моих трех линий интересного могли бы казнили, а 213 00:08:51,250 --> 00:08:53,270 распечатать и B еще раз. 214 00:08:53,270 --> 00:08:56,030 Итак, теперь давайте сделаем это, не делайте подкачки. 215 00:08:56,030 --> 00:08:58,430 Позвольте мне сделать окно терминала немного выше, так что мы можем видеть 216 00:08:58,430 --> 00:08:59,520 больше его сразу. 217 00:08:59,520 --> 00:09:00,860 >> И никогда работать не свопа. 218 00:09:00,860 --> 00:09:04,000 х равен 1, у равен 2. = 1, B = 2. 219 00:09:04,000 --> 00:09:06,070 И потом, а равно 2, B = 1. 220 00:09:06,070 --> 00:09:09,390 Так он работает, как и Джесс сделал здесь внутри подкачки. 221 00:09:09,390 --> 00:09:13,090 Но, конечно, он не остается никакой эффект на переменные в основной. 222 00:09:13,090 --> 00:09:15,360 >> Таким образом, мы увидели трюк, посредством которого мы могла бы это исправить, не так ли? 223 00:09:15,360 --> 00:09:19,560 Если вы столкнулись с этой обзорной Вопрос, можно просто плоскодонки и сделать X 224 00:09:19,560 --> 00:09:22,400 Y и какие переменные вместо этого? 225 00:09:22,400 --> 00:09:23,390 >> Вы могли бы сделать их глобальными. 226 00:09:23,390 --> 00:09:27,560 Положите их в самом начале файла как и мы, даже в игре 15. 227 00:09:27,560 --> 00:09:28,890 Мы используем глобальную переменную. 228 00:09:28,890 --> 00:09:32,420 Однако в контексте игры 15, это разумно иметь глобальное 229 00:09:32,420 --> 00:09:37,170 переменная, представляющая доску, потому что полнота 15.С все 230 00:09:37,170 --> 00:09:38,650 о реализации этой игре. 231 00:09:38,650 --> 00:09:41,470 Это то, что файл существует, чтобы сделать. 232 00:09:41,470 --> 00:09:44,170 >> Но в данном случае здесь, я вызове функции подкачки. 233 00:09:44,170 --> 00:09:45,380 Я хочу, чтобы поменять двух переменных. 234 00:09:45,380 --> 00:09:48,950 И она должна начать чувствовать себя так же неаккуратно если решение всех наших 235 00:09:48,950 --> 00:09:51,300 проблемы, когда мы бежим в область вопросы, это сделать его глобальным. 236 00:09:51,300 --> 00:09:54,730 Потому что очень быстро наша программа собирается стать настоящий беспорядок. 237 00:09:54,730 --> 00:09:57,760 И мы сделали это очень экономно В итоге в 15.c. 238 00:09:57,760 --> 00:10:00,470 >> Но, оказывается, есть Лучший способ в целом. 239 00:10:00,470 --> 00:10:05,600 Позвольте мне на самом деле вернуться и удалить распечатать F, всего упростить этот код. 240 00:10:05,600 --> 00:10:09,160 И позвольте мне предложить, что это, действительно, плохо. 241 00:10:09,160 --> 00:10:15,990 Но если бы я вместо этого добавить в некоторых звездочками и звезды, я могу превратить это вместо 242 00:10:15,990 --> 00:10:18,670 функции в тот, который на самом деле работает. 243 00:10:18,670 --> 00:10:25,020 >> Итак, позвольте мне вернуться сюда и признаться говоря звездочками всегда трудно, 244 00:10:25,020 --> 00:10:26,170 Поэтому я скажу так звезды. 245 00:10:26,170 --> 00:10:27,660 Я просто признаться до того. 246 00:10:27,660 --> 00:10:28,190 Хорошо. 247 00:10:28,190 --> 00:10:30,190 А теперь, что я собираюсь сделать вместо этого? 248 00:10:30,190 --> 00:10:34,130 >> Итак, прежде всего, я собираюсь задать что вместо прохождения в десятичной 249 00:10:34,130 --> 00:10:37,980 своп функции, я вместо из собирался сказать десятичного звезды. 250 00:10:37,980 --> 00:10:39,170 Итак, что же звезды указывают? 251 00:10:39,170 --> 00:10:41,970 Это понятие, что указатель, который Бинки, Claymation характером, был 252 00:10:41,970 --> 00:10:43,465 ссылаясь на мгновение назад. 253 00:10:43,465 --> 00:10:47,610 >> Так что если мы говорим десятичного звезды, смысл это сейчас, что не собирается быть 254 00:10:47,610 --> 00:10:49,110 прошла в его значением. 255 00:10:49,110 --> 00:10:50,350 Это не собирается быть скопированы дюйма 256 00:10:50,350 --> 00:10:54,700 Скорее, адрес является будет передаваться дюйма 257 00:10:54,700 --> 00:10:57,840 >> Поэтому напомним, что внутри компьютера целая куча памяти, в противном случае 258 00:10:57,840 --> 00:10:58,760 известной как ОЗУ. 259 00:10:58,760 --> 00:11:00,520 И это только RAM целая куча байтов. 260 00:11:00,520 --> 00:11:03,320 Так что если ваш Mac или ваш компьютер имеет два гигабайта, у вас есть 2 261 00:11:03,320 --> 00:11:05,760 миллиард байт памяти. 262 00:11:05,760 --> 00:11:08,440 >> Теперь давайте предположим, что просто держать вещи хорошо и организованно, мы 263 00:11:08,440 --> 00:11:09,450 назначить адрес - 264 00:11:09,450 --> 00:11:10,170 номер - 265 00:11:10,170 --> 00:11:12,270 в каждый байт оперативной памяти на вашем компьютере. 266 00:11:12,270 --> 00:11:15,410 Самый первый байт из тех 2 млрд. по числу нулю. 267 00:11:15,410 --> 00:11:18,572 Следующий байт является номером один, число два, всю дорогу на вверх, точка точка 268 00:11:18,572 --> 00:11:20,530 точки, примерно 2 миллиарда долларов. 269 00:11:20,530 --> 00:11:23,640 >> Так что вы можете количества байтов памяти в компьютере. 270 00:11:23,640 --> 00:11:26,460 Итак, давайте предположим, что это то, что мы подразумеваем под адресом. 271 00:11:26,460 --> 00:11:31,360 Поэтому, когда я вижу десятичного звезды, что происходит должны быть пропущены через своп в настоящее время является 272 00:11:31,360 --> 00:11:32,830 адрес. 273 00:11:32,830 --> 00:11:37,150 Не его стоимость, но все, что его почтовый адрес, так сказать - 274 00:11:37,150 --> 00:11:38,810 его расположение в памяти. 275 00:11:38,810 --> 00:11:41,250 >> И аналогично для В, я собираюсь сказать то же самое. 276 00:11:41,250 --> 00:11:42,720 Int, звезда, б. 277 00:11:42,720 --> 00:11:46,350 Как в стороне, технически звезды могли бы пойти в другие места. 278 00:11:46,350 --> 00:11:50,140 Но мы будем стандартизировать звезда является в непосредственной близости от типа данных. 279 00:11:50,140 --> 00:11:54,080 >> Так своп подписи теперь означает, дай мне адрес Интеллект, и вызов 280 00:11:54,080 --> 00:11:55,400 этот адрес. 281 00:11:55,400 --> 00:11:58,690 И дай мне другой адрес Int и называть этот адрес б. 282 00:11:58,690 --> 00:12:01,120 >> Но теперь мой код здесь должно измениться. 283 00:12:01,120 --> 00:12:03,470 Потому что, если я заявляю десятичного Temp - 284 00:12:03,470 --> 00:12:05,580 который до сих пор типа Int - 285 00:12:05,580 --> 00:12:08,700 но я храню в нем, какие ценности? 286 00:12:08,700 --> 00:12:12,870 Чтобы было ясно, я Ввод с код как написано прямо сейчас? 287 00:12:12,870 --> 00:12:14,360 >> Я ставлю расположение в. 288 00:12:14,360 --> 00:12:16,500 Но я не заботятся о место в настоящее время, не так ли? 289 00:12:16,500 --> 00:12:21,940 Temp существует только треть стакана Джес существовал, с какой целью? 290 00:12:21,940 --> 00:12:23,090 Для сохранения значения. 291 00:12:23,090 --> 00:12:24,830 Молоко или апельсиновый сок. 292 00:12:24,830 --> 00:12:28,520 Не фактически хранить адреса либо из тех вещей, которая чувствует себя 293 00:12:28,520 --> 00:12:31,200 немного бессмысленное в этом реальном мировой контекст в любом случае. 294 00:12:31,200 --> 00:12:34,990 >> Так на самом деле, то, что я хочу поставить в Temp не является адресом, но 295 00:12:34,990 --> 00:12:36,180 Содержание. 296 00:12:36,180 --> 00:12:41,930 Так что если это число, как 123, это 123-й байт памяти, что справедливый 297 00:12:41,930 --> 00:12:45,090 случается, оккупационной, что значение В случается оккупационными. 298 00:12:45,090 --> 00:12:49,040 >> Если я хочу пойти на этот адрес, Я должен сказать, звезды. 299 00:12:49,040 --> 00:12:52,610 Аналогичным образом, если бы я должен был изменить то, что по адресу, я меняю 300 00:12:52,610 --> 00:12:53,570 это для начала. 301 00:12:53,570 --> 00:12:58,185 Если я хочу сохранить в том, что, по крайней Расположение с тем, что на месте 302 00:12:58,185 --> 00:13:02,180 в B, B звезды звезды. 303 00:13:02,180 --> 00:13:05,340 >> Короче говоря, даже если это не совсем утопая в еще - и я бы не ожидал 304 00:13:05,340 --> 00:13:06,560 что она будет так быстро - 305 00:13:06,560 --> 00:13:11,100 понимать, что все что я делаю, предваряя эти звезды к моему переменных, 306 00:13:11,100 --> 00:13:13,350 говорю, не захватить ценности. 307 00:13:13,350 --> 00:13:14,520 Не изменяйте значения. 308 00:13:14,520 --> 00:13:17,600 Но, скорее, идти на эти адреса и получить значение. 309 00:13:17,600 --> 00:13:21,430 К этому адресу и изменения значение там. 310 00:13:21,430 --> 00:13:25,500 >> Так что теперь позвольте мне прокручивать вперед до самого верха, только для исправления этой линии здесь, чтобы 311 00:13:25,500 --> 00:13:27,690 изменить прототип, чтобы соответствовать. 312 00:13:27,690 --> 00:13:30,280 Но мне теперь нужно сделать еще одну вещь. 313 00:13:30,280 --> 00:13:35,500 Интуитивно, если я изменил типы аргументов, которые своп ожидает, 314 00:13:35,500 --> 00:13:37,245 Что еще мне нужно изменить в моем коде? 315 00:13:37,245 --> 00:13:39,750 316 00:13:39,750 --> 00:13:40,840 >> Когда я звоню подкачки. 317 00:13:40,840 --> 00:13:43,340 Потому что сейчас, что же мне Я переходя к еще поменять? 318 00:13:43,340 --> 00:13:47,450 Х ценность и значение у, или молока и апельсиновый сок. 319 00:13:47,450 --> 00:13:48,510 Но я не хочу этого делать. 320 00:13:48,510 --> 00:13:51,060 Вместо этого я хочу передать в чем? 321 00:13:51,060 --> 00:13:53,050 Расположение х и расположение у. 322 00:13:53,050 --> 00:13:55,300 Каковы их почтовые адреса, так сказать. 323 00:13:55,300 --> 00:13:57,600 >> Таким образом, чтобы сделать это, есть амперсанд. 324 00:13:57,600 --> 00:13:59,260 Ampersand вида звучит как адреса. 325 00:13:59,260 --> 00:14:03,240 т. п., амперсанд, адрес х, а также адрес у. 326 00:14:03,240 --> 00:14:06,790 Так что это преднамеренное, которые мы используем амперсандах при вызове функции, 327 00:14:06,790 --> 00:14:10,230 и звезды при объявлении и когда реализации функции. 328 00:14:10,230 --> 00:14:14,220 >> И только подумайте, как амперсанд адрес оператора и звезды, как 329 00:14:14,220 --> 00:14:15,490 туда оператора - 330 00:14:15,490 --> 00:14:18,640 или, точнее, оператор разыменования. 331 00:14:18,640 --> 00:14:23,480 Так что в целом много слов просто сказать, что теперь, надеюсь, своп будет 332 00:14:23,480 --> 00:14:24,440 правильными. 333 00:14:24,440 --> 00:14:26,550 >> Позвольте мне пойти дальше и сделать - 334 00:14:26,550 --> 00:14:30,940 давайте на самом деле переименовать файл, чтобы эта программа по-прежнему не будут называть не свопа. 335 00:14:30,940 --> 00:14:33,240 Я утверждаю, что мы будем называть его swap.c сейчас. 336 00:14:33,240 --> 00:14:35,670 Поэтому убедитесь, своп. 337 00:14:35,670 --> 00:14:37,520 Точки, наклонной черты поменять. 338 00:14:37,520 --> 00:14:40,210 >> А теперь действительно, х = 1, у = 2. 339 00:14:40,210 --> 00:14:44,040 И затем, х равен 2, у равно единице. 340 00:14:44,040 --> 00:14:46,500 Ну давайте посмотрим, если мы не можем сделать этого немного по-другому, как к тому, что 341 00:14:46,500 --> 00:14:47,180 здесь происходит. 342 00:14:47,180 --> 00:14:51,250 Во-первых, позвольте мне увеличить на наш рисования экрана здесь. 343 00:14:51,250 --> 00:14:54,160 И позвольте мне предложить на мгновение - и всякий раз, когда я рисую здесь будет зеркально 344 00:14:54,160 --> 00:14:58,660 там сейчас - позвольте мне предложить, что Здесь целая куча памяти, или 345 00:14:58,660 --> 00:15:00,540 Оперативной памяти, внутри моего компьютера. 346 00:15:00,540 --> 00:15:04,140 >> И это будет укус числа, скажем, 1. 347 00:15:04,140 --> 00:15:05,720 Это будет байт номер 2. 348 00:15:05,720 --> 00:15:08,220 И я сделаю целый букет больше, и Затем куча многоточий многоточия точку, чтобы 349 00:15:08,220 --> 00:15:10,880 показывают, что есть 2000000000 из этих вещей. 350 00:15:10,880 --> 00:15:13,520 4, 5, и так далее. 351 00:15:13,520 --> 00:15:17,055 >> Таким образом, есть первые пять байтов памяти моего компьютера. 352 00:15:17,055 --> 00:15:17,560 Все в порядке? 353 00:15:17,560 --> 00:15:19,060 Очень немногие из 2000000000. 354 00:15:19,060 --> 00:15:21,120 Но сейчас я собираюсь предложить следующем. 355 00:15:21,120 --> 00:15:27,490 Я собираюсь предложить, чтобы X собирается сохранить номер 1, а Y будет 356 00:15:27,490 --> 00:15:29,690 , чтобы сохранить номер 2. 357 00:15:29,690 --> 00:15:35,000 И позвольте мне теперь идти вперед и представляет эти значения следующим образом. 358 00:15:35,000 --> 00:15:41,510 >> Давайте сделаем это следующим образом. 359 00:15:41,510 --> 00:15:42,870 Дайте мне всего за одну секунду. 360 00:15:42,870 --> 00:15:44,150 Одна секунда. 361 00:15:44,150 --> 00:15:45,680 ОК. 362 00:15:45,680 --> 00:15:47,560 Я хочу сделать это немного - 363 00:15:47,560 --> 00:15:50,440 давайте сделаем это снова. 364 00:15:50,440 --> 00:15:53,250 В противном случае я собираюсь и использование те же номера, неумышленно, 365 00:15:53,250 --> 00:15:54,230 несколько раз. 366 00:15:54,230 --> 00:15:57,320 >> Так что у нас есть разные номера о чем поговорить, давайте назовем этот байт 367 00:15:57,320 --> 00:16:03,391 номер 123, 124, 125, 126, и точка точка точка. 368 00:16:03,391 --> 00:16:08,400 И позвольте мне утверждать теперь, что я собираюсь поместить значение 1 здесь, и значение 2 369 00:16:08,400 --> 00:16:11,990 Здесь, иначе известный как х и у. 370 00:16:11,990 --> 00:16:15,300 Так уж случилось, что это х, это у. 371 00:16:15,300 --> 00:16:18,180 >> И только некоторые случайности, компьютер, операционная система, 372 00:16:18,180 --> 00:16:21,890 произошло положить х по месту нахождения номер 123. 373 00:16:21,890 --> 00:16:25,590 И у закончили в расположение 124 - 374 00:16:25,590 --> 00:16:26,330 черт побери. 375 00:16:26,330 --> 00:16:28,700 Я должен был это исправил. 376 00:16:28,700 --> 00:16:34,040 О человек, я действительно хочу это сделать? 377 00:16:34,040 --> 00:16:37,340 Да, я хочу, чтобы исправить это и В надлежащее об этом сегодня. 378 00:16:37,340 --> 00:16:39,950 К сожалению, новичок в этом. 379 00:16:39,950 --> 00:16:45,020 >> 127, 131, и я не хочу быть этим сложно, но почему я изменить 380 00:16:45,020 --> 00:16:46,340 номерах есть? 381 00:16:46,340 --> 00:16:48,360 Потому что я хочу, чтобы целыми на самом деле в четыре байта. 382 00:16:48,360 --> 00:16:49,810 Так что давайте быть супер анальный об этом. 383 00:16:49,810 --> 00:16:53,800 Так что если 1 происходит решать 123, 2 будет по адресу 384 00:16:53,800 --> 00:16:55,730 127, потому что это всего в 4 прощания далеко. 385 00:16:55,730 --> 00:16:56,210 Вот и все. 386 00:16:56,210 --> 00:16:58,640 И мы забудем обо всех другим адресам в мире. 387 00:16:58,640 --> 00:17:03,320 >> Так что х находится в местоположении 123, Y находится в местоположении 127. 388 00:17:03,320 --> 00:17:05,770 А теперь, что же я на самом деле хотите сделать? 389 00:17:05,770 --> 00:17:10,099 Когда я звоню своп Теперь, что происходит на самом деле? 390 00:17:10,099 --> 00:17:14,920 Ну, когда я называю своп, я передаю в адрес х а также адрес у. 391 00:17:14,920 --> 00:17:18,540 Так, например, если эти две части бумаги в настоящее время представляют два 392 00:17:18,540 --> 00:17:23,510 Аргументы и B поменять, то, что я собираюсь написать на первом из них, 393 00:17:23,510 --> 00:17:27,720 которого я буду называть называть? 394 00:17:27,720 --> 00:17:30,610 >> Точно, 123. 395 00:17:30,610 --> 00:17:31,905 Так что это я утверждаю это. 396 00:17:31,905 --> 00:17:32,955 Это параметр. 397 00:17:32,955 --> 00:17:35,856 Я ставлю адрес X в там. 398 00:17:35,856 --> 00:17:38,152 >> Что это? 399 00:17:38,152 --> 00:17:40,890 >> Что это? 400 00:17:40,890 --> 00:17:41,190 >> Нет, нет. 401 00:17:41,190 --> 00:17:41,720 Это нормально. 402 00:17:41,720 --> 00:17:42,570 Тем не менее хорошо, все еще хорошо. 403 00:17:42,570 --> 00:17:43,530 Так что это. 404 00:17:43,530 --> 00:17:46,240 А теперь на второй лист бумаги, это будет B, и что я 405 00:17:46,240 --> 00:17:49,010 собираюсь писать на эта бумажка? 406 00:17:49,010 --> 00:17:50,080 127. 407 00:17:50,080 --> 00:17:53,720 >> Так что единственное, что изменилось по сравнению с наши предыдущие показательным этой истории, 408 00:17:53,720 --> 00:17:58,590 буквально, а не 1 и 2, я собирается пройти в 123 и 127. 409 00:17:58,590 --> 00:18:02,130 И я сейчас собираюсь поставить внутри этих из этой рамки, все в порядке? 410 00:18:02,130 --> 00:18:04,640 Так что черный ящик в настоящее время представляет своп функции. 411 00:18:04,640 --> 00:18:07,230 >> Между тем, давайте теперь есть кто-то осуществлять своп функции. 412 00:18:07,230 --> 00:18:09,090 Кто-то здесь хотел стать волонтером? 413 00:18:09,090 --> 00:18:09,560 Поднимайся. 414 00:18:09,560 --> 00:18:11,080 Как тебя зовут? 415 00:18:11,080 --> 00:18:11,460 Чарли. 416 00:18:11,460 --> 00:18:12,080 Ладно, Чарли. 417 00:18:12,080 --> 00:18:14,810 Поднимайся. 418 00:18:14,810 --> 00:18:17,310 >> Так что Чарли будет играть роль нашего черного ящика. 419 00:18:17,310 --> 00:18:21,460 И Чарли, что я бы хотел, чтобы вы Теперь будет осуществлять обмен таким образом 420 00:18:21,460 --> 00:18:25,320 , что с учетом этих двух адреса, Вы были на самом деле происходит 421 00:18:25,320 --> 00:18:26,330 для изменения значений. 422 00:18:26,330 --> 00:18:28,290 И я буду шептать вам на ухо как запустить телевидение здесь. 423 00:18:28,290 --> 00:18:29,930 >> Так что давай, а ты черный ящик. 424 00:18:29,930 --> 00:18:30,920 Reach в там. 425 00:18:30,920 --> 00:18:34,054 Какие ценности Вы видите, и какие ценности вы видите для B? 426 00:18:34,054 --> 00:18:36,740 >> Чарли: составляет 123 и В 127. 427 00:18:36,740 --> 00:18:37,530 >> DAVID МАЛАН: ОК, это точно. 428 00:18:37,530 --> 00:18:38,940 Теперь остановимся там на мгновение. 429 00:18:38,940 --> 00:18:41,680 Первое, что вы собираетесь делать сейчас, в соответствии с кодом, - которые 430 00:18:41,680 --> 00:18:43,220 Теперь я буду тянуть на экране - 431 00:18:43,220 --> 00:18:46,750 будет выделить несколько бит памяти называется темп. 432 00:18:46,750 --> 00:18:48,850 Так что я собираюсь идти вперед и дать вам, что памяти. 433 00:18:48,850 --> 00:18:52,210 >> Так что это будет третья переменная что у вас есть доступными для 434 00:18:52,210 --> 00:18:54,080 Вы назвали темп. 435 00:18:54,080 --> 00:18:57,120 И что вы собираетесь написать Температура на листе бумаги? 436 00:18:57,120 --> 00:19:02,524 437 00:19:02,524 --> 00:19:03,470 >> Чарли: указатели, не так ли? 438 00:19:03,470 --> 00:19:04,790 >> DAVID МАЛАН: Хорошо, ну не обязательно указателей. 439 00:19:04,790 --> 00:19:07,230 Таким образом, строка кода, что я выделены на правой стороне, 440 00:19:07,230 --> 00:19:07,900 давайте начнем там. 441 00:19:07,900 --> 00:19:08,890 Это говорит звезда. 442 00:19:08,890 --> 00:19:11,670 Так в настоящее время хранения номер 123. 443 00:19:11,670 --> 00:19:16,660 И так же, интуитивно, что сделал звездой 123 означает? 444 00:19:16,660 --> 00:19:21,630 >> А конкретно, если это 123, звезда означает, что? 445 00:19:21,630 --> 00:19:22,560 Значение. 446 00:19:22,560 --> 00:19:24,580 Или более небрежно, идите туда. 447 00:19:24,580 --> 00:19:28,620 Итак, позвольте мне предложить, что, держа в руки, идти вперед и лечения, что 448 00:19:28,620 --> 00:19:29,430 как будто это карта. 449 00:19:29,430 --> 00:19:32,940 И ходить к себе компьютера памяти, и найти то, что нам 450 00:19:32,940 --> 00:19:36,520 в точке 123. 451 00:19:36,520 --> 00:19:37,720 Именно так. 452 00:19:37,720 --> 00:19:41,100 >> Итак, мы видим в расположении 123 это то, что, очевидно? 453 00:19:41,100 --> 00:19:44,240 Итак, какое значение сейчас Вы собираются поставить в ТЕМР? 454 00:19:44,240 --> 00:19:44,750 Именно так. 455 00:19:44,750 --> 00:19:45,600 Так что идти вперед и делать это. 456 00:19:45,600 --> 00:19:51,280 И написать номер 1 на кусок бумаги, что в настоящее время под названием темп. 457 00:19:51,280 --> 00:19:53,540 >> А теперь следующий шаг, который Вы собираетесь реализовать 458 00:19:53,540 --> 00:19:54,310 будет что. 459 00:19:54,310 --> 00:19:57,820 Ну, с правой стороны Следующая строка кода является звездой б. B, из 460 00:19:57,820 --> 00:19:59,260 Конечно, хранятся адреса. 461 00:19:59,260 --> 00:20:02,270 В котором рассматриваются 127. 462 00:20:02,270 --> 00:20:06,620 Звезда B означает, что, случайно говорю? 463 00:20:06,620 --> 00:20:08,700 >> Перейдите в папку. 464 00:20:08,700 --> 00:20:14,988 Так идут вперед и найти нам, что в точке 127. 465 00:20:14,988 --> 00:20:15,480 ОК. 466 00:20:15,480 --> 00:20:19,170 Конечно, в положение 127, прежнему значению 2. 467 00:20:19,170 --> 00:20:24,060 Так чего же вы теперь собираетесь хранить при Что бы ни было на месте в? 468 00:20:24,060 --> 00:20:26,860 Так звезды средства идут на место. 469 00:20:26,860 --> 00:20:29,770 Что такое расположение? 470 00:20:29,770 --> 00:20:30,430 >> Именно так. 471 00:20:30,430 --> 00:20:34,190 Так что теперь, если вы хотите изменить что в этом месте - 472 00:20:34,190 --> 00:20:36,470 Я буду идти вперед и запустить Ластик здесь. 473 00:20:36,470 --> 00:20:37,760 И теперь вернуть его на кисти. 474 00:20:37,760 --> 00:20:42,190 Какой номер вы собираетесь написать в этом пустое поле сейчас? 475 00:20:42,190 --> 00:20:42,850 >> Именно так. 476 00:20:42,850 --> 00:20:46,470 Так что эту строку кода, чтобы было ясно - пусть мне прерваться, что Чарли делает и 477 00:20:46,470 --> 00:20:51,730 отметить здесь, что он только что сделали это написать в эту коробку в расположении 123 478 00:20:51,730 --> 00:20:55,150 значение, которое было ранее в б. 479 00:20:55,150 --> 00:20:59,140 И поэтому мы сейчас действительно реализовано этот второй строки кода. 480 00:20:59,140 --> 00:21:01,920 >> Сейчас, к сожалению, есть еще одна линия остается. 481 00:21:01,920 --> 00:21:04,900 Теперь то, что в темп, в буквальном смысле? 482 00:21:04,900 --> 00:21:06,200 Очевидно, что это номер один. 483 00:21:06,200 --> 00:21:07,020 Это не адрес. 484 00:21:07,020 --> 00:21:09,380 Это просто числа, рода переменную из одной недели. 485 00:21:09,380 --> 00:21:13,520 >> И теперь, когда вы говорите, звезды B, это означает, что перейти по адресу B, которая имеет 486 00:21:13,520 --> 00:21:15,090 Конечно здесь. 487 00:21:15,090 --> 00:21:16,020 Поэтому, как только вы получите там - 488 00:21:16,020 --> 00:21:18,320 Я буду идти вперед и стереть то, что на самом деле там - и что вы 489 00:21:18,320 --> 00:21:20,820 собираюсь написать новой позиции 127? 490 00:21:20,820 --> 00:21:22,010 >> ЧАРЛИ: Темп, который является одним. 491 00:21:22,010 --> 00:21:23,430 >> DAVID МАЛАН: Темп, который является одним. 492 00:21:23,430 --> 00:21:25,670 И что происходит с температурой в конце концов? 493 00:21:25,670 --> 00:21:26,600 Ну, мы не знаем. 494 00:21:26,600 --> 00:21:27,420 Мы действительно не заботятся. 495 00:21:27,420 --> 00:21:31,090 Каждый раз, когда мы реализовали функцию До сих пор всех локальных переменных у вас есть 496 00:21:31,090 --> 00:21:31,890 действительно являются локальными. 497 00:21:31,890 --> 00:21:33,060 И они просто исчезают. 498 00:21:33,060 --> 00:21:35,040 Они утилизирован в операционной система в конечном итоге. 499 00:21:35,040 --> 00:21:39,800 >> Таким образом, тот факт, что температура по-прежнему имеет Значение 1 является своего рода принципиально 500 00:21:39,800 --> 00:21:41,150 неинтересные. 501 00:21:41,150 --> 00:21:43,100 Ладно, аплодисменты если бы мы могли для Чарли. 502 00:21:43,100 --> 00:21:46,400 Очень хорошо сделано. 503 00:21:46,400 --> 00:21:51,520 >> Ладно, так о чем еще делает это означает, что мы можем сделать? 504 00:21:51,520 --> 00:21:54,400 Вот и получается, что мы были говорить несколько белых лжи 505 00:21:54,400 --> 00:21:55,540 в течение достаточно долгого времени. 506 00:21:55,540 --> 00:21:59,990 В самом деле, получается, что строка, все это время, на самом деле не 507 00:21:59,990 --> 00:22:02,190 последовательность символов, как таковых. 508 00:22:02,190 --> 00:22:03,980 Это отчасти является то, что интуитивно. 509 00:22:03,980 --> 00:22:08,270 >> Но с формальной точки зрения, строка Тип данных, который мы объявили внутри 510 00:22:08,270 --> 00:22:12,170 CS50 библиотеку для упрощения мира в течение первых нескольких недель класса. 511 00:22:12,170 --> 00:22:20,130 Какая строка действительно является адресом символа где-то в памяти. 512 00:22:20,130 --> 00:22:25,530 Строка действительно номер, например, 123 или 127, что происходит, чтобы разграничить 513 00:22:25,530 --> 00:22:28,420 где строка начинается в компьютера памяти. 514 00:22:28,420 --> 00:22:31,870 >> Но она не представляет строка, по сути, себя. 515 00:22:31,870 --> 00:22:33,460 И мы видим это следующим образом. 516 00:22:33,460 --> 00:22:35,980 Позвольте мне идти вперед и открывать некоторый код, который среди 517 00:22:35,980 --> 00:22:38,340 источник сегодняшних примеров кода. 518 00:22:38,340 --> 00:22:42,225 И я собираюсь идти вперед и открыть до, скажем, сравнить-0.c. 519 00:22:42,225 --> 00:22:44,830 520 00:22:44,830 --> 00:22:48,790 Это программа, которая багги собирается должны быть реализованы следующим образом. 521 00:22:48,790 --> 00:22:49,040 >> Первая. 522 00:22:49,040 --> 00:22:50,420 Я собираюсь кое-что сказать. 523 00:22:50,420 --> 00:22:52,660 Тогда я буду идти вперед и получить строку от пользователя 524 00:22:52,660 --> 00:22:53,750 , что в следующей строке. 525 00:22:53,750 --> 00:22:55,370 Тогда я собираюсь сказать это снова. 526 00:22:55,370 --> 00:22:57,540 Тогда я иду, чтобы получить другую строки от пользователя. 527 00:22:57,540 --> 00:23:00,390 >> И заметьте, я показываю один из строки в переменной с, а 528 00:23:00,390 --> 00:23:03,040 другой из этих строк в переменной T. 529 00:23:03,040 --> 00:23:07,480 И теперь я собираюсь утверждать, очень разумно, что если с равно равна т, 530 00:23:07,480 --> 00:23:08,940 строки одинаковы. 531 00:23:08,940 --> 00:23:09,970 Вы вводите то же самое. 532 00:23:09,970 --> 00:23:11,830 В противном случае, строки не то же самое. 533 00:23:11,830 --> 00:23:15,440 >> В конце концов, если мы введем два целых, два символы, двумя поплавками, два двухместных, любой из 534 00:23:15,440 --> 00:23:18,400 типы данных мы говорили о до сих пор их сравнивать - 535 00:23:18,400 --> 00:23:22,070 помню мы очень четко некоторое время назад что вы не делаете этого, потому что 536 00:23:22,070 --> 00:23:25,840 один знак равенства, конечно, оператора присваивания. 537 00:23:25,840 --> 00:23:26,820 Так что было бы ошибкой. 538 00:23:26,820 --> 00:23:29,260 >> Мы используем равную знак равенства, которые действительно сравнивает 539 00:23:29,260 --> 00:23:31,050 вещи для подлинного равенства. 540 00:23:31,050 --> 00:23:32,275 Но я утверждаю, что это детская коляска. 541 00:23:32,275 --> 00:23:37,400 Если я иду вперед и сделать сравнение нулю, и тогда точка слэш сравнить нулю. 542 00:23:37,400 --> 00:23:39,700 И я ввести, скажем, здравствуйте. 543 00:23:39,700 --> 00:23:41,590 А потом скажем еще раз привет. 544 00:23:41,590 --> 00:23:46,040 Буквально то же самое, компьютер претензии я набрал разные вещи. 545 00:23:46,040 --> 00:23:47,640 >> Теперь, может быть я просто опечатки. 546 00:23:47,640 --> 00:23:49,910 Я буду введите свое имя в этот раз. 547 00:23:49,910 --> 00:23:52,580 Я имею в виду, здравствуйте. 548 00:23:52,580 --> 00:23:54,770 Здравствуйте. 549 00:23:54,770 --> 00:23:57,360 Это разные каждый раз. 550 00:23:57,360 --> 00:23:58,430 >> Ну, почему же? 551 00:23:58,430 --> 00:24:00,140 Что происходит на самом деле под капотом? 552 00:24:00,140 --> 00:24:03,270 Ну, то, что происходит на самом деле под Капот Строка теперь 553 00:24:03,270 --> 00:24:07,410 Я набрал в тот первый раз, например, это слово привет, конечно. 554 00:24:07,410 --> 00:24:11,660 Но если представить это под капот, напомним, что 555 00:24:11,660 --> 00:24:13,470 строка в массиве. 556 00:24:13,470 --> 00:24:15,040 И мы так и сказал в прошлом. 557 00:24:15,040 --> 00:24:20,200 >> Так что, если я рисую этот массив, как это, я будет представлять нечто совершенно 558 00:24:20,200 --> 00:24:23,030 подобный тому, что мы сделали минуту назад. 559 00:24:23,030 --> 00:24:25,390 И на самом деле то специальные и здесь. 560 00:24:25,390 --> 00:24:28,090 Что мы определить было в в конце каждой строки? 561 00:24:28,090 --> 00:24:30,760 Да, эта нулевая обратная косая черта, которая является только способ представления, 562 00:24:30,760 --> 00:24:33,610 буквально, 00000000. 563 00:24:33,610 --> 00:24:35,680 Восемь бит 0 в ряд. 564 00:24:35,680 --> 00:24:37,610 >> Я не знаю, честно говоря, Что после этого. 565 00:24:37,610 --> 00:24:40,090 Это просто куча больше оперативной памяти внутри моего компьютера. 566 00:24:40,090 --> 00:24:40,970 Но это массив. 567 00:24:40,970 --> 00:24:42,260 Мы говорили о массивах раньше. 568 00:24:42,260 --> 00:24:45,010 И мы обычно говорим о массивах как расположение нулю, 569 00:24:45,010 --> 00:24:46,580 то один, то два. 570 00:24:46,580 --> 00:24:47,950 Но это только для удобства. 571 00:24:47,950 --> 00:24:49,380 И это совершенно относительное. 572 00:24:49,380 --> 00:24:53,010 >> Когда вы на самом деле получить память из компьютер, то, конечно, любой 573 00:24:53,010 --> 00:24:55,450 2000000000 байт какой-то странной, потенциально. 574 00:24:55,450 --> 00:24:59,100 Так на самом деле под капотом, Все это время, да. 575 00:24:59,100 --> 00:25:01,670 Это вполне может быть кронштейн нулю. 576 00:25:01,670 --> 00:25:04,780 Но если копнуть еще глубже под капот, что на самом деле 577 00:25:04,780 --> 00:25:07,000 Номер адреса 123. 578 00:25:07,000 --> 00:25:09,150 Это адрес 124. 579 00:25:09,150 --> 00:25:11,040 Это адрес 125. 580 00:25:11,040 --> 00:25:12,540 >> И я не облажался на этот раз. 581 00:25:12,540 --> 00:25:15,840 Это теперь один байт друг от друга по какой причине? 582 00:25:15,840 --> 00:25:17,930 Насколько велика символ? 583 00:25:17,930 --> 00:25:19,170 Символ является только один байт. 584 00:25:19,170 --> 00:25:20,570 Целочисленное, как правило, четыре байта. 585 00:25:20,570 --> 00:25:24,850 Так вот почему я сделал это 123, 127, 131 и так далее. 586 00:25:24,850 --> 00:25:27,560 Теперь я могу держать простую математику и вобще плюс 1. 587 00:25:27,560 --> 00:25:30,510 И это теперь, что на самом деле происходит на под капотом. 588 00:25:30,510 --> 00:25:37,760 >> Поэтому, когда вы объявляете что-то вроде этого, Строка с, это на самом деле - 589 00:25:37,760 --> 00:25:39,170 получается - 590 00:25:39,170 --> 00:25:41,190 символ звезды. 591 00:25:41,190 --> 00:25:44,640 Star, конечно, означает адрес, иначе указатель. 592 00:25:44,640 --> 00:25:46,200 Так что это адрес что-то. 593 00:25:46,200 --> 00:25:47,510 Что это адрес? 594 00:25:47,510 --> 00:25:47,760 >> Ну - 595 00:25:47,760 --> 00:25:51,680 Я единственный, кто может видеть очень Важный момент я делаю, или думать 596 00:25:51,680 --> 00:25:52,560 Я делаю. 597 00:25:52,560 --> 00:25:55,270 Так строка - 598 00:25:55,270 --> 00:25:57,180 Печально то, у меня есть монитор именно там, где я 599 00:25:57,180 --> 00:25:58,100 возможно, не видел этого. 600 00:25:58,100 --> 00:26:00,990 >> Ладно, так что строка является то, что с Я объявил ранее. 601 00:26:00,990 --> 00:26:04,600 Но, оказывается, благодаря небольшой магии в библиотеке CS50, все это 602 00:26:04,600 --> 00:26:08,780 Строка времени буквально был символ звезды. 603 00:26:08,780 --> 00:26:11,310 Звезды снова означает, указатель или адреса. 604 00:26:11,310 --> 00:26:14,180 Тот факт, что это фланговые Слово символ означает, что это 605 00:26:14,180 --> 00:26:15,970 адрес символа. 606 00:26:15,970 --> 00:26:23,100 >> Так что если взять веревку называется, и я печатаю В H-Е-Л-Л-О, предлагать то, что сейчас получить 607 00:26:23,100 --> 00:26:27,330 Строка буквально возвращали все на этот раз, хотя мы довольно 608 00:26:27,330 --> 00:26:29,980 упрощенном мире? 609 00:26:29,980 --> 00:26:33,310 Что на самом деле получить строку вернуться в качестве возвращаемого значения? 610 00:26:33,310 --> 00:26:35,830 611 00:26:35,830 --> 00:26:38,720 >> 123 в этом случае, например. 612 00:26:38,720 --> 00:26:42,630 Мы ранее заявили, что взять веревку просто возвращает строку, последовательность 613 00:26:42,630 --> 00:26:43,300 символов. 614 00:26:43,300 --> 00:26:44,790 Но это немного белой ложью. 615 00:26:44,790 --> 00:26:48,010 Способ получить строку действительно работает Под капотом он получает 616 00:26:48,010 --> 00:26:48,930 строки от пользователя. 617 00:26:48,930 --> 00:26:51,530 Он шлепает символов, которые он или она типа в памяти. 618 00:26:51,530 --> 00:26:54,680 Это ставит обратную косую черту Ноль в конце тех последовательности символов. 619 00:26:54,680 --> 00:26:57,310 >> Но тогда что же взять веревку буквально вернуть? 620 00:26:57,310 --> 00:27:02,710 Это буквально возвращает адрес первый байт в оперативной памяти, что 621 00:27:02,710 --> 00:27:04,130 она использовала для этого силы. 622 00:27:04,130 --> 00:27:07,500 И получается, что только путем возврата одного адреса 623 00:27:07,500 --> 00:27:12,120 первый символ в строке, то есть достаточный для нахождения совокупности 624 00:27:12,120 --> 00:27:12,630 строки. 625 00:27:12,630 --> 00:27:16,930 >> Другими словами, получают строка не имеет вернуть 123 и 124 и 125. 626 00:27:16,930 --> 00:27:19,950 Он не должен дать мне длинный Список всех байтов, которые 627 00:27:19,950 --> 00:27:20,740 моя строка использует. 628 00:27:20,740 --> 00:27:22,670 Потому что, они все спиной к спине. 629 00:27:22,670 --> 00:27:28,160 И два, основанной на первый адрес, я могу понять, где строка заканчивается. 630 00:27:28,160 --> 00:27:29,910 Каким образом? 631 00:27:29,910 --> 00:27:33,490 >> Специальный символ пустой, Обратная косая черта нуля в конце. 632 00:27:33,490 --> 00:27:35,430 Итак, другими словами, если Вы передаете вокруг - 633 00:27:35,430 --> 00:27:36,530 внутри переменных - 634 00:27:36,530 --> 00:27:41,300 адрес голец, и вы предполагаете, что в конце любой строки, любые 635 00:27:41,300 --> 00:27:45,040 последовательность символов, что мы, люди, думаю строк, если предположить, что 636 00:27:45,040 --> 00:27:48,600 в конце любого такого строка есть нулю обратную косую черту, вы золотой. 637 00:27:48,600 --> 00:27:52,430 Потому что всегда можно найти конца строки. 638 00:27:52,430 --> 00:27:54,870 >> Теперь то, что на самом деле то при переходе в этой программе? 639 00:27:54,870 --> 00:27:59,990 Почему эта программа, сравнить-0.c, багги? 640 00:27:59,990 --> 00:28:01,690 Что на самом деле сравнивается? 641 00:28:01,690 --> 00:28:02,420 Да? 642 00:28:02,420 --> 00:28:05,000 >> СТУДЕНТ: [неразборчиво]. 643 00:28:05,000 --> 00:28:05,730 >> DAVID МАЛАН: Совершенно верно. 644 00:28:05,730 --> 00:28:08,350 Это сопоставлени струн. 645 00:28:08,350 --> 00:28:12,420 Таким образом, если пользователь ввел Здравствуйте еще, как я сделал, память может в конечном итоге 646 00:28:12,420 --> 00:28:13,430 в таком виде. 647 00:28:13,430 --> 00:28:18,210 Если пользователь затем типов Здравствуйте еще раз, но по телефону получить строку снова, с- 648 00:28:18,210 --> 00:28:21,800 не особенно умный, если вы учите это быть умным путем написания кода. 649 00:28:21,800 --> 00:28:22,430 >> C - 650 00:28:22,430 --> 00:28:23,860 и компьютеров в целом - 651 00:28:23,860 --> 00:28:27,370 Если вы введете слово еще раз привет, Вы знаете, что вы собираетесь получить. 652 00:28:27,370 --> 00:28:31,480 Ты просто собираюсь получить второй массив памяти, что, да, бывает быть 653 00:28:31,480 --> 00:28:35,510 хранение H-E-L-L-вывода и так далее. 654 00:28:35,510 --> 00:28:38,240 >> Это будет выглядеть так же, чтобы нас, людей, но этот адрес 655 00:28:38,240 --> 00:28:39,460 не может быть 123. 656 00:28:39,460 --> 00:28:42,470 Это может быть просто так случилось, что операционная система имеет некоторые доступные 657 00:28:42,470 --> 00:28:45,430 пространстве, например, на месте - 658 00:28:45,430 --> 00:28:49,820 скажем нечто произвольное, как это расположение в 200. 659 00:28:49,820 --> 00:28:51,620 И это ячейка 201. 660 00:28:51,620 --> 00:28:53,060 И это расположение 202. 661 00:28:53,060 --> 00:28:55,730 Мы понятия не имею, где это будет в памяти. 662 00:28:55,730 --> 00:28:59,110 >> Но что это означает, что то, что будут храниться в конечном счете, в с? 663 00:28:59,110 --> 00:29:00,750 Номер 123. 664 00:29:00,750 --> 00:29:04,860 Что будет храниться в т, В этом примере произвольной? 665 00:29:04,860 --> 00:29:06,300 Номер 200. 666 00:29:06,300 --> 00:29:11,410 И все это означает, что то, очевидно, 123 не равно 200. 667 00:29:11,410 --> 00:29:14,940 И так, если это условие никогда оценивается как истина. 668 00:29:14,940 --> 00:29:18,430 Потому что взять веревку используют различные участков памяти каждый раз. 669 00:29:18,430 --> 00:29:20,360 >> Теперь мы можем видеть это снова в другом примере. 670 00:29:20,360 --> 00:29:23,764 Позвольте мне идти вперед и открывать копирования 0.c. 671 00:29:23,764 --> 00:29:28,770 Я утверждаю, что этот пример будет попробовать - но не в состоянии - для копирования двух строк 672 00:29:28,770 --> 00:29:29,910 следующим образом. 673 00:29:29,910 --> 00:29:31,730 >> Я собираюсь сказать что-то пользователю. 674 00:29:31,730 --> 00:29:34,490 Я тогда собирался получить Строка и назовите его с. 675 00:29:34,490 --> 00:29:36,400 И теперь, я делаю это здесь галочку. 676 00:29:36,400 --> 00:29:37,990 Мы упомянули это некоторое время назад. 677 00:29:37,990 --> 00:29:42,490 Но когда могли бы получить пустую строку возвращения, другого специального символа или для специальных 678 00:29:42,490 --> 00:29:45,050 Символ скажем так. 679 00:29:45,050 --> 00:29:45,900 Если это из памяти. 680 00:29:45,900 --> 00:29:48,970 >> Например, если пользователь действительно быть трудным и виды зверских 681 00:29:48,970 --> 00:29:51,220 Количество символов в Клавиатура и хитов Enter. 682 00:29:51,220 --> 00:29:54,580 Если это количество символов, просто не могу поместиться в оперативной памяти по какой-то сумасшедшей 683 00:29:54,580 --> 00:29:57,820 Причина, хорошо получить строка может очень хорошо возвращает нуль. 684 00:29:57,820 --> 00:30:01,080 >> Или, если ваша программа сама делает много других вещей, и есть только 685 00:30:01,080 --> 00:30:03,790 Не хватает памяти для получаю строку чтобы добиться успеха, это может кончиться 686 00:30:03,790 --> 00:30:05,240 тем, что вернулся пустым. 687 00:30:05,240 --> 00:30:07,160 Но давайте будем более точными относительно того, что это такое. 688 00:30:07,160 --> 00:30:10,280 Что такое тип данных с на самом деле? 689 00:30:10,280 --> 00:30:11,610 Char звезды. 690 00:30:11,610 --> 00:30:14,560 >> Вот и получается, теперь мы можем кожуры назад слой нулевых. 691 00:30:14,560 --> 00:30:17,500 Оказывается, NULL - да, очевидно, специальный символ. 692 00:30:17,500 --> 00:30:19,190 Но что это такое на самом деле? 693 00:30:19,190 --> 00:30:25,220 Действительно, NULL просто символ, что мы люди используют для замены нуля, а также. 694 00:30:25,220 --> 00:30:29,010 >> Таким образом, авторы С, и компьютеры более общо, решил лет назад 695 00:30:29,010 --> 00:30:30,010 , что, вы знаете, что. 696 00:30:30,010 --> 00:30:34,850 Почему бы нам не обеспечить, чтобы ни пользователь Данные никогда, никогда, никогда 697 00:30:34,850 --> 00:30:36,730 хранить при свидания нулю? 698 00:30:36,730 --> 00:30:39,610 В самом деле, даже в моем примере произвольного раньше, я не начала нумерации 699 00:30:39,610 --> 00:30:40,390 байт в нуле. 700 00:30:40,390 --> 00:30:41,540 Я начал работать в одном. 701 00:30:41,540 --> 00:30:44,950 Я знал, что люди в мире решили оставляем за собой нуля 702 00:30:44,950 --> 00:30:47,970 байт в оперативной памяти, как никому что-то особенное. 703 00:30:47,970 --> 00:30:52,020 >> Причина в том, в любое время вы хотите сигнал, что что-то пошло не так 704 00:30:52,020 --> 00:30:55,960 в отношении адресов, возвращается нулевой - иначе известный как нулевое - 705 00:30:55,960 --> 00:30:59,410 И потому, что вы не знаете, что нет никакой законны данные с нулевого адреса, четко 706 00:30:59,410 --> 00:31:00,400 это означает, что сообщение об ошибке. 707 00:31:00,400 --> 00:31:04,080 И именно поэтому мы, по соглашению, проверить за то, нулевой и обратной 708 00:31:04,080 --> 00:31:06,260 как один в таких случаях. 709 00:31:06,260 --> 00:31:09,300 >> Поэтому, если мы прокрутить вниз сейчас, это всего лишь Затем обработку ошибок, на всякий случай 710 00:31:09,300 --> 00:31:10,610 что-то пошло не так с [? залог?] 711 00:31:10,610 --> 00:31:13,470 в целом и выйти из программы , вернувшись рано. 712 00:31:13,470 --> 00:31:19,030 Эта линия в настоящее время может быть переписана как это, что означает, что? 713 00:31:19,030 --> 00:31:23,155 На левой стороне, дайте мне еще указатель на символ, и назовем его T. 714 00:31:23,155 --> 00:31:26,935 Что я хранении внутри т, основанных на этой одной строки кода? 715 00:31:26,935 --> 00:31:30,950 716 00:31:30,950 --> 00:31:32,170 >> Я запись местоположения. 717 00:31:32,170 --> 00:31:34,742 В частности расположение , которая была в с. 718 00:31:34,742 --> 00:31:39,000 Таким образом, если пользователь ввел привет, и что первый привет происходит в конечном итоге 719 00:31:39,000 --> 00:31:42,567 здесь, то число 123 собирается вернуться из получить 720 00:31:42,567 --> 00:31:43,810 строку и хранить - 721 00:31:43,810 --> 00:31:44,780 Как мы говорили ранее - 722 00:31:44,780 --> 00:31:45,440 в с. 723 00:31:45,440 --> 00:31:50,560 >> Когда я объявляю указатель на другой символ и называют это т, что число 724 00:31:50,560 --> 00:31:53,940 буквально будет в конечном итоге в T в соответствии с историей? 725 00:31:53,940 --> 00:31:55,420 Так 123. 726 00:31:55,420 --> 00:32:00,310 >> Так что технически теперь оба с и т указывают на точное 727 00:32:00,310 --> 00:32:02,410 то же участков памяти. 728 00:32:02,410 --> 00:32:06,140 Так заметить, что я собираюсь сделать сейчас, чтобы доказать, что эта программа глючит. 729 00:32:06,140 --> 00:32:08,820 >> Сначала я собираюсь утверждать, с Печать F, спекулируя 730 00:32:08,820 --> 00:32:10,080 копия строки. 731 00:32:10,080 --> 00:32:11,660 Тогда я собираюсь сделать небольшой проверка на наличие ошибок. 732 00:32:11,660 --> 00:32:12,160 Я иду, чтобы убедиться. 733 00:32:12,160 --> 00:32:16,710 Давайте удостоверимся, что строка T находится в мере больше нуля в длину, 734 00:32:16,710 --> 00:32:19,190 так что есть некоторый характер на самом деле выгоду. 735 00:32:19,190 --> 00:32:22,840 >> И тогда вы, возможно, помните это от предыдущих примерах. 736 00:32:22,840 --> 00:32:25,630 2 верхние - который находится в ctype.h файла. 737 00:32:25,630 --> 00:32:30,800 T Кронштейн нуля дает мне нулю символ строки т. 738 00:32:30,800 --> 00:32:34,360 И два верхних того же стоимости, Конечно, преобразует его в верхний регистр. 739 00:32:34,360 --> 00:32:38,230 >> Так интуитивно, благодаря выделенной линии кода делает ставку первым 740 00:32:38,230 --> 00:32:40,250 Письмо в т. 741 00:32:40,250 --> 00:32:44,485 Но это не капитализация, интуитивно, первая буква в с. 742 00:32:44,485 --> 00:32:48,130 Но если вы думаете вперед, то, что я смотреть, когда я запускаю эту программу 743 00:32:48,130 --> 00:32:54,220 и распечатать как оригинальные, сек, и так называемые копии, т? 744 00:32:54,220 --> 00:32:55,350 >> Они на самом деле будет то же самое. 745 00:32:55,350 --> 00:32:56,600 И почему они будет то же самое? 746 00:32:56,600 --> 00:32:58,970 747 00:32:58,970 --> 00:33:01,020 Они оба указывают на ровно то же самое. 748 00:33:01,020 --> 00:33:01,610 Так давайте сделаем это. 749 00:33:01,610 --> 00:33:03,160 >> Сделайте копию нулю. 750 00:33:03,160 --> 00:33:04,070 В нем собрана OK. 751 00:33:04,070 --> 00:33:06,500 Позвольте мне запустить копию нулю. 752 00:33:06,500 --> 00:33:10,110 Позвольте мне что нибудь типа привет в все строчные затем нажмите Enter. 753 00:33:10,110 --> 00:33:16,520 И он утверждает, что и с оригинальным и копия действительно идентичны. 754 00:33:16,520 --> 00:33:17,920 >> Так что на самом деле произошло? 755 00:33:17,920 --> 00:33:20,100 Позвольте мне перерисовать эту картину просто чтобы рассказать историю в 756 00:33:20,100 --> 00:33:21,340 несколько иначе. 757 00:33:21,340 --> 00:33:26,060 Что происходит на самом деле под капот, когда я заявляю, что-то вроде 758 00:33:26,060 --> 00:33:30,410 символ начала с, или строка с, Я получаю указатель - 759 00:33:30,410 --> 00:33:33,090 который, оказывается, четыре байта В CS50 прибора 760 00:33:33,090 --> 00:33:34,410 и в большом количестве компьютеров. 761 00:33:34,410 --> 00:33:36,008 И я буду называть это с. 762 00:33:36,008 --> 00:33:39,810 И это в настоящее время имеет неизвестного значения. 763 00:33:39,810 --> 00:33:43,900 >> Когда вы не объявляете переменную, если Вы себя подставлять значение там, которые 764 00:33:43,900 --> 00:33:44,570 знает, что там. 765 00:33:44,570 --> 00:33:48,110 Это может быть некоторой случайной последовательности битов из предыдущего выполнения. 766 00:33:48,110 --> 00:33:52,490 Поэтому, когда я, по моему строка кода действительно получаем строки, а затем хранения возвращаемого 767 00:33:52,490 --> 00:33:54,800 значения в строку с так или иначе получить - 768 00:33:54,800 --> 00:33:58,520 и мы в конечном счете отогните как получить Строка работ, так или иначе выделяет 769 00:33:58,520 --> 00:34:00,480 массив, который, вероятно, выглядит как-нибудь так. 770 00:34:00,480 --> 00:34:05,390 H-E-L-L-О, обратный слэш нулю. 771 00:34:05,390 --> 00:34:09,510 >> Давайте предположим, что это адрес 123 только первая последовательность. 772 00:34:09,510 --> 00:34:13,000 Так что строка возвращается, в Выделенная строка есть, он возвращает 773 00:34:13,000 --> 00:34:15,000 числа мы уже говорили, 123. 774 00:34:15,000 --> 00:34:17,420 Так что же на самом деле происходит внутри с здесь? 775 00:34:17,420 --> 00:34:26,590 >> Ну, что действительно происходит Внутри с 123. 776 00:34:26,590 --> 00:34:29,250 Но, откровенно говоря, я получаю немного смущают все эти адреса, 777 00:34:29,250 --> 00:34:30,320 все эти произвольные числа. 778 00:34:30,320 --> 00:34:32,290 123, 124, 127. 779 00:34:32,290 --> 00:34:34,570 Так что давайте на самом деле упрощения мире немного. 780 00:34:34,570 --> 00:34:38,800 >> Когда мы говорим об указателях, честно говоря, для нас, людей, кто, черт возьми, где заботится 781 00:34:38,800 --> 00:34:39,870 вещи в памяти? 782 00:34:39,870 --> 00:34:41,080 Это совершенно произвольно. 783 00:34:41,080 --> 00:34:43,370 Это будет зависеть от того, объем оперативной памяти у пользователя. 784 00:34:43,370 --> 00:34:46,590 Это будет зависеть от того, когда в тот же день вы запустите программу, пожалуй, и 785 00:34:46,590 --> 00:34:48,250 что введенные пользователем данные, дает тебе. 786 00:34:48,250 --> 00:34:50,060 Мы останавливаясь на несущественных деталей. 787 00:34:50,060 --> 00:34:54,230 >> Так что давайте абстрагироваться от и сказать, что, При выполнении строки кода, как это, 788 00:34:54,230 --> 00:34:57,320 символ звезды с получает возвращаемое Значение взять веревку. 789 00:34:57,320 --> 00:35:02,720 Почему бы нам не просто нарисовать, а не то, что мы звонят указатель, как будто это 790 00:35:02,720 --> 00:35:04,140 , указывая на что-то? 791 00:35:04,140 --> 00:35:07,000 Поэтому я утверждаю, что сейчас с до есть указатель - 792 00:35:07,000 --> 00:35:08,480 под капотом, что это адрес. 793 00:35:08,480 --> 00:35:11,330 Но это всего лишь указывает на первый байт 794 00:35:11,330 --> 00:35:12,780 строку, которая была возвращена. 795 00:35:12,780 --> 00:35:16,710 >> Если бы я сейчас вернуться к коду здесь, что происходит на этой линии? 796 00:35:16,710 --> 00:35:20,020 Ну, в этой выделенной линии сейчас, Я объявляю видимо другое 797 00:35:20,020 --> 00:35:21,070 переменную T. 798 00:35:21,070 --> 00:35:25,700 Но это также указатель, так что я собираюсь нарисовать ее, так как в теории, точное 799 00:35:25,700 --> 00:35:26,710 же размера коробки. 800 00:35:26,710 --> 00:35:28,160 И я буду называть его T. 801 00:35:28,160 --> 00:35:33,500 >> И теперь, если мы вернемся к коду снова, когда я с хранения внутри т, 802 00:35:33,500 --> 00:35:36,920 то, что я технически положить внутрь T? 803 00:35:36,920 --> 00:35:39,350 Ну технически это был номер 123. 804 00:35:39,350 --> 00:35:42,270 Так на самом деле я должен писать номер 123 там. 805 00:35:42,270 --> 00:35:43,900 Но давайте это более высокий уровень. 806 00:35:43,900 --> 00:35:48,090 т, если это только указатель Интуитивно, является именно это. 807 00:35:48,090 --> 00:35:49,800 Это все, что бытие там хранятся. 808 00:35:49,800 --> 00:35:54,970 >> Так что теперь в последние интересные строки кода, когда я на самом деле идти о 809 00:35:54,970 --> 00:36:00,680 капитализации символ ноль в т, что происходит? 810 00:36:00,680 --> 00:36:06,310 Ну, т кронштейна нуля теперь указывает к тому, что характер, по-видимому? 811 00:36:06,310 --> 00:36:07,460 >> Это указывает на час. 812 00:36:07,460 --> 00:36:08,870 Поскольку T Кронштейн нуля - 813 00:36:08,870 --> 00:36:12,490 Напомним, что это старый синтаксис. т кронштейна нуля просто означает, что если T является строка, т 814 00:36:12,490 --> 00:36:15,590 Кронштейн нуля означает получение нулевой символ в эту силу. 815 00:36:15,590 --> 00:36:18,650 Так что это действительно означает это зайти в этот массив - 816 00:36:18,650 --> 00:36:21,520 и да, это может быть 123, это может быть 124. 817 00:36:21,520 --> 00:36:22,790 Но это все относительно, помню. 818 00:36:22,790 --> 00:36:25,640 Всякий раз, когда говорят о массиве, у нас есть Преимущество говорить о 819 00:36:25,640 --> 00:36:27,000 относительные показатели. 820 00:36:27,000 --> 00:36:31,120 >> И вот теперь мы можем просто предположить, что Zero T кронштейн ч. 821 00:36:31,120 --> 00:36:35,090 Так что, если я называю 2 верхних на это, что это действительно делаете делает ставку 822 00:36:35,090 --> 00:36:38,290 строчная ч в верхний H. Но, конечно, то, что с? 823 00:36:38,290 --> 00:36:41,010 Это указывает на то же проклятое строку. 824 00:36:41,010 --> 00:36:44,200 >> Так что это все, что происходило В этом коде до сих пор. 825 00:36:44,200 --> 00:36:45,960 Так в чем же тогда последствия? 826 00:36:45,960 --> 00:36:48,300 Как это исправить эти две проблемы? 827 00:36:48,300 --> 00:36:50,870 Как мы можем сравнить с фактическими строками? 828 00:36:50,870 --> 00:36:53,720 >> Ну интуитивно, как бы вы идете по поводу сравнения двух 829 00:36:53,720 --> 00:36:55,090 Струны для подлинного равенства? 830 00:36:55,090 --> 00:36:58,920 831 00:36:58,920 --> 00:37:00,750 >> Что значит, если два строки равны? 832 00:37:00,750 --> 00:37:04,330 Очевидно, что нет, что их адреса равными в памяти, потому что это низко 833 00:37:04,330 --> 00:37:06,590 Уровень детализации реализации. 834 00:37:06,590 --> 00:37:08,360 Все символы являются одинаковыми. 835 00:37:08,360 --> 00:37:12,810 Итак, позвольте мне предложить, и позвольте мне представить в версии одного из compare.c 836 00:37:12,810 --> 00:37:14,970 здесь, так что сравнить-1с. 837 00:37:14,970 --> 00:37:19,590 >> Позвольте мне предложить, что мы все еще получаем Указатель называется с, и магазин в нем 838 00:37:19,590 --> 00:37:20,610 вернуть значение взять веревку. 839 00:37:20,610 --> 00:37:21,750 Давайте сделаем то же самое с T. 840 00:37:21,750 --> 00:37:23,230 И никто из кода не отличаются. 841 00:37:23,230 --> 00:37:25,420 Я собираюсь добавить немного больше проверки ошибок сейчас. 842 00:37:25,420 --> 00:37:29,390 Так что теперь, когда мы вроде отслаивания это слоями в CS50, что строка 843 00:37:29,390 --> 00:37:33,520 на самом деле, мы должны быть более анальный о том, что мы не злоупотребляйте 844 00:37:33,520 --> 00:37:35,330 недопустимые значения как нулевые. 845 00:37:35,330 --> 00:37:36,440 >> Так что я просто собираюсь проверить. 846 00:37:36,440 --> 00:37:41,490 Если ей не равна утратившим Т не равным нулевой, это означает, что мы в порядке. 847 00:37:41,490 --> 00:37:44,460 Взять веревку не облажался получении любой из этих строк. 848 00:37:44,460 --> 00:37:51,270 И вы, возможно, может думаю сейчас, что вовсе STR CMP предположительно делать? 849 00:37:51,270 --> 00:37:52,000 Сравнение строк. 850 00:37:52,000 --> 00:37:55,470 >> Так что если вы в программе Java и прежде, Это похоже на равных метода в 851 00:37:55,470 --> 00:37:56,490 Строка класса. 852 00:37:56,490 --> 00:37:57,890 Но для тех из вас, кто не запрограммированы прежде, 853 00:37:57,890 --> 00:37:59,320 это всего лишь функция с. 854 00:37:59,320 --> 00:38:02,180 Это происходит, чтобы прийти в файл с именем string.h. 855 00:38:02,180 --> 00:38:03,830 Вот где они объявлены. 856 00:38:03,830 --> 00:38:05,110 >> И сравнение строк - 857 00:38:05,110 --> 00:38:07,530 Я на самом деле забывают его использование, но это не важно. 858 00:38:07,530 --> 00:38:10,470 Напомним, что мы можем сделать Человек, перемешать сравнения. 859 00:38:10,470 --> 00:38:12,590 И это будет воспитывать Linux Руководство программиста. 860 00:38:12,590 --> 00:38:14,060 И это, честно говоря, немного загадочным. 861 00:38:14,060 --> 00:38:15,270 Но я вижу здесь, что, да. 862 00:38:15,270 --> 00:38:17,570 Я должен включить string.h. 863 00:38:17,570 --> 00:38:20,590 >> И здесь говорится, под описанием " Функция сравнения строк сравнивает 864 00:38:20,590 --> 00:38:24,560 две строки S1 и S2. "И S1 и S2-видимому, являются два 865 00:38:24,560 --> 00:38:26,120 Аргументы, передаваемые дюйма 866 00:38:26,120 --> 00:38:28,650 Я не помню, что конст имеет значение, но теперь замечаю - 867 00:38:28,650 --> 00:38:31,480 и вы, возможно, видели это уже тогда, когда вы использовать справочные страницы, если вы 868 00:38:31,480 --> 00:38:32,390 все это есть - 869 00:38:32,390 --> 00:38:36,220 символ, что звезда просто синонимом бечевкой. 870 00:38:36,220 --> 00:38:40,440 >> Так он сравнивает две строки, S1 и S2, и возвращает целое число 871 00:38:40,440 --> 00:38:44,930 или равную или больше нуля если S1 находится, соответственно, быть 872 00:38:44,930 --> 00:38:47,450 меньше или совпадают, или быть больше, чем S2. 873 00:38:47,450 --> 00:38:51,220 Вот только очень сложный способ сказать что сравнение строк возвращается 874 00:38:51,220 --> 00:38:55,760 нулю, если две строки интуитивно идентичны, символ для 875 00:38:55,760 --> 00:38:57,120 символ в символ. 876 00:38:57,120 --> 00:38:59,970 >> Это возвращает отрицательное число, если с, в алфавитном порядке, предполагается 877 00:38:59,970 --> 00:39:01,010 предстать перед Т. 878 00:39:01,010 --> 00:39:05,300 Или возвращает положительное число, если ы должны идти за Т 879 00:39:05,300 --> 00:39:06,170 в алфавитном порядке. 880 00:39:06,170 --> 00:39:08,360 Так что с этой простой функции, мог Вы, например, сортировать 881 00:39:08,360 --> 00:39:09,770 целую кучу слов? 882 00:39:09,770 --> 00:39:13,984 >> Так что в этой новой версии, я собираюсь идти вперед и сделать compare1. 883 00:39:13,984 --> 00:39:15,750 Dot сравнить одну черту. 884 00:39:15,750 --> 00:39:18,030 Я буду вводить привет в нижнем регистре. 885 00:39:18,030 --> 00:39:20,300 Я собираюсь ввести привет в нижнем регистре снова. 886 00:39:20,300 --> 00:39:23,340 И к счастью теперь он понимает, Я напечатал то же самое. 887 00:39:23,340 --> 00:39:27,520 >> Между тем, если я печатаю в привет к снижению случае и привет в верхнем регистре и 888 00:39:27,520 --> 00:39:29,710 сравнить их, я набрал разные вещи. 889 00:39:29,710 --> 00:39:32,530 Поскольку не только адреса разные, но мы сравниваем 890 00:39:32,530 --> 00:39:35,350 разные персонажи снова и снова. 891 00:39:35,350 --> 00:39:37,320 >> Ну давайте и исправить одну Теперь другая проблема. 892 00:39:37,320 --> 00:39:41,590 Позвольте мне открыть версию одного из копию, которая теперь адресует 893 00:39:41,590 --> 00:39:42,900 этот вопрос следующим образом. 894 00:39:42,900 --> 00:39:45,650 А это будет выглядеть немного более сложной. 895 00:39:45,650 --> 00:39:49,320 Но если вы думаете о том, что проблема, которую мы нужно решить, мы надеемся, это будет 896 00:39:49,320 --> 00:39:51,870 очистить всего за момент. 897 00:39:51,870 --> 00:39:57,280 >> Таким образом, это первая строка, символ начала т, в С точки зрения непрофессионала может кто-то предложит 898 00:39:57,280 --> 00:39:59,450 то, что эта линия здесь означает? 899 00:39:59,450 --> 00:40:01,050 Char звезды т, что же это делаешь? 900 00:40:01,050 --> 00:40:06,660 901 00:40:06,660 --> 00:40:07,210 >> Хорошо. 902 00:40:07,210 --> 00:40:09,500 Создать указатель на некоторый место в памяти. 903 00:40:09,500 --> 00:40:10,930 И позвольте мне уточнить его немного. 904 00:40:10,930 --> 00:40:17,180 Объявите переменную, которая будет хранить адрес некоторых символов в памяти, просто 905 00:40:17,180 --> 00:40:18,480 быть немного более правильным. 906 00:40:18,480 --> 00:40:21,210 >> Итак, теперь на правой стороне, у меня никогда не видел одну из этих функций 907 00:40:21,210 --> 00:40:22,660 раньше, Malloc. 908 00:40:22,660 --> 00:40:26,980 Но что же это значит? 909 00:40:26,980 --> 00:40:28,050 Распределение памяти. 910 00:40:28,050 --> 00:40:29,410 Распределения памяти. 911 00:40:29,410 --> 00:40:33,050 >> Так что не получается, до сих пор, мы действительно не было мощным способом 912 00:40:33,050 --> 00:40:36,210 просит операционную систему, дать мне некоторую память. 913 00:40:36,210 --> 00:40:39,980 Скорее, у нас теперь есть функция под названием Malloc, что делает именно это. 914 00:40:39,980 --> 00:40:42,960 Даже если это немного отвлечение прямо сейчас, отметим, что в 915 00:40:42,960 --> 00:40:46,200 между двумя скобках просто будет рядом. 916 00:40:46,200 --> 00:40:48,510 Где я набрал в вопросе метки могут быть числом. 917 00:40:48,510 --> 00:40:51,020 >> И это число означает, дайте мне 10 байт. 918 00:40:51,020 --> 00:40:52,320 Дайте мне 20 байт. 919 00:40:52,320 --> 00:40:53,820 Дайте мне 100 байт. 920 00:40:53,820 --> 00:40:56,500 И Malloc сделает все возможное, чтобы просить операционной системы - 921 00:40:56,500 --> 00:40:57,630 Linux, в данном случае - 922 00:40:57,630 --> 00:40:59,630 Эй, а их 100 байт доступной оперативной памяти? 923 00:40:59,630 --> 00:41:04,320 Если да, то вернуть эти байты мне возвращение адрес которого из 924 00:41:04,320 --> 00:41:06,610 эти байты, что ли? 925 00:41:06,610 --> 00:41:07,610 Самый первый. 926 00:41:07,610 --> 00:41:10,460 >> Так и здесь - и это преобладающее в C, в любое время вы 927 00:41:10,460 --> 00:41:11,680 дело с адресами? 928 00:41:11,680 --> 00:41:15,830 Вы почти всегда имеем дело с Первый такой адрес, независимо от того, насколько велика 929 00:41:15,830 --> 00:41:19,490 кусок памяти вы в настоящее время вернул, так сказать. 930 00:41:19,490 --> 00:41:20,880 >> Так давайте приступим здесь. 931 00:41:20,880 --> 00:41:23,940 Я пытаюсь выделить как количество байт, точно? 932 00:41:23,940 --> 00:41:24,080 Ну. 933 00:41:24,080 --> 00:41:26,090 Длина строки с - давайте делать конкретный пример. 934 00:41:26,090 --> 00:41:30,700 Если ей это привет, Н-Е-Л-Л-О, что длина строки с, очевидно? 935 00:41:30,700 --> 00:41:32,010 Так что это пять. 936 00:41:32,010 --> 00:41:34,590 Но я делаю плюс 1 о том, почему? 937 00:41:34,590 --> 00:41:37,700 Почему я хочу шесть байтов вместо пяти? 938 00:41:37,700 --> 00:41:38,790 Нулевой символ. 939 00:41:38,790 --> 00:41:41,210 >> Я не хочу бросить эту специальные нулевым символом. 940 00:41:41,210 --> 00:41:45,160 Потому что если я сделать копию Здравствуйте и просто делать H-E-L-L-O, но я не ставлю 941 00:41:45,160 --> 00:41:50,160 , что специальный символ, компьютер не могли бы, случайно, обратную косую черту 942 00:41:50,160 --> 00:41:51,730 нулю там для меня. 943 00:41:51,730 --> 00:41:55,570 И поэтому, если я пытаюсь выяснить, длину копии, я мог бы думать, что 944 00:41:55,570 --> 00:41:59,360 это 20 символов, или миллион символов, если я просто никогда не случится 945 00:41:59,360 --> 00:42:01,050 ударить обратную косую черту нулю. 946 00:42:01,050 --> 00:42:05,780 >> Так что нам нужно шесть байт H-E-L-L-О, обратный слэш нулю. 947 00:42:05,780 --> 00:42:07,870 А потом это просто быть супер анальный. 948 00:42:07,870 --> 00:42:10,700 Предположим, что я забыл, что размер символов есть. 949 00:42:10,700 --> 00:42:12,020 Мы постоянно говорят, что это один байт. 950 00:42:12,020 --> 00:42:12,860 И это обычно. 951 00:42:12,860 --> 00:42:15,425 В теории, это может быть что-то разными, на другом компьютере или 952 00:42:15,425 --> 00:42:16,250 другой компьютер. 953 00:42:16,250 --> 00:42:19,650 >> Вот и получается, что есть этот оператор называется SizeOf, что если вы передаете его 954 00:42:19,650 --> 00:42:22,680 имя типа данных - как угля или Интеллект, или поплавок - 955 00:42:22,680 --> 00:42:26,930 он скажет вам, динамично, сколько байт символ занимает на этом 956 00:42:26,930 --> 00:42:28,090 конкретного компьютера. 957 00:42:28,090 --> 00:42:31,360 >> Так что это просто эффективно как говорят раз 1 или 958 00:42:31,360 --> 00:42:32,440 Не раз вообще ничего. 959 00:42:32,440 --> 00:42:36,340 Но я делаю это только, чтобы быть супер анал, , что на всякий случай символ отличается 960 00:42:36,340 --> 00:42:40,610 на ваш компьютер по сравнению с моим, таким образом, математика всегда будет проверить. 961 00:42:40,610 --> 00:42:43,720 >> Наконец, здесь я проверять нулевые, которая всегда хорошая практика - опять же, 962 00:42:43,720 --> 00:42:44,920 любое время мы имеем дело с указателями. 963 00:42:44,920 --> 00:42:47,520 Если Malloc не был в состоянии дать мне шесть прощаний - что 964 00:42:47,520 --> 00:42:49,210 маловероятно, но на всякий случай - 965 00:42:49,210 --> 00:42:50,730 вернуться немедленно. 966 00:42:50,730 --> 00:42:53,290 А теперь, идти вперед и скопировать строки следующим образом. 967 00:42:53,290 --> 00:42:57,240 И это знакомый синтаксис хотя и в иной роли. 968 00:42:57,240 --> 00:43:01,210 >> Я собираюсь идти вперед и получить строку длина с и хранить его на русском языке. 969 00:43:01,210 --> 00:43:06,620 Я тогда собирался я от итерации равна нулю вплоть до N, 970 00:43:06,620 --> 00:43:08,410 больше или равно. 971 00:43:08,410 --> 00:43:13,540 Так что на каждой итерации, я поставил го характера с в го 972 00:43:13,540 --> 00:43:15,380 Характер T. 973 00:43:15,380 --> 00:43:18,190 >> Так что же на самом деле происходит под капотом здесь? 974 00:43:18,190 --> 00:43:22,140 Хорошо, если это, например, в с - 975 00:43:22,140 --> 00:43:26,400 и я набрал в слове H-Е-Л-Л-О и есть обратный слеш нулю. 976 00:43:26,400 --> 00:43:29,020 И опять же, это указывающем здесь. 977 00:43:29,020 --> 00:43:30,830 И вот теперь это т. 978 00:43:30,830 --> 00:43:34,860 >> И это указывает сейчас копию памяти, правильно? 979 00:43:34,860 --> 00:43:37,340 Malloc дал мне целую кусок памяти. 980 00:43:37,340 --> 00:43:41,440 Я не знаю, что первоначально В любом из этих мест. 981 00:43:41,440 --> 00:43:44,340 Так что я буду думать о них как о целую кучу вопросительных знаков. 982 00:43:44,340 --> 00:43:50,190 >> Но как только я начинаю цикл от нуля далее, вплоть до длины S, T 983 00:43:50,190 --> 00:43:52,790 Кронштейн нуля и кронштейном 1 т - 984 00:43:52,790 --> 00:43:55,080 и я положу это сейчас на верхнем - 985 00:43:55,080 --> 00:44:04,190 T Кронштейн нуля и с нулевым средним кронштейном , что я собираюсь быть копированием 986 00:44:04,190 --> 00:44:09,875 итеративно ч здесь, E-L-L-O. Плюс, потому что я сделал плюс 987 00:44:09,875 --> 00:44:12,370 1, обратную косую черту нулю. 988 00:44:12,370 --> 00:44:19,060 >> Так что теперь в случае сравнить-1с, В конце концов, если я распечатать 989 00:44:19,060 --> 00:44:24,760 Капитализация т, мы должны видеть, что с не изменяется. 990 00:44:24,760 --> 00:44:26,090 Позвольте мне теперь идти вперед и делать это. 991 00:44:26,090 --> 00:44:28,630 Поэтому убедитесь, copy1. 992 00:44:28,630 --> 00:44:30,860 Dot слэш copy1. 993 00:44:30,860 --> 00:44:33,670 Я собираюсь ввести привет, Enter. 994 00:44:33,670 --> 00:44:37,430 А теперь обратите внимание, только копию были капитализированы. 995 00:44:37,430 --> 00:44:40,890 Потому что я действительно есть два участков памяти. 996 00:44:40,890 --> 00:44:44,390 >> К сожалению, вы можете сделать некоторые довольно плохое и довольно опасные вещи. 997 00:44:44,390 --> 00:44:49,290 Позвольте мне подтянуть пример здесь и сейчас, что дает нам пример несколько 998 00:44:49,290 --> 00:44:51,540 различных линий. 999 00:44:51,540 --> 00:44:56,040 Так что просто интуитивно здесь, первая линия кода, внутр звезду х, заявляет 1000 00:44:56,040 --> 00:44:57,340 переменную х. 1001 00:44:57,340 --> 00:44:58,810 И то, что тип данных этой переменной? 1002 00:44:58,810 --> 00:45:01,820 1003 00:45:01,820 --> 00:45:04,290 Какой тип данных этой переменной? 1004 00:45:04,290 --> 00:45:06,980 Это не было захватывающим. 1005 00:45:06,980 --> 00:45:08,350 >> Тип данных десятичного звезды. 1006 00:45:08,350 --> 00:45:12,600 Так что же это значит? X будет сохранить адрес Int. 1007 00:45:12,600 --> 00:45:13,520 Вот как все просто. 1008 00:45:13,520 --> 00:45:16,220 Y мы собираемся хранить адрес Int. 1009 00:45:16,220 --> 00:45:18,390 Что такое третья линия кода там делает? 1010 00:45:18,390 --> 00:45:21,850 Это распределение, сколько байт, скорее всего? 1011 00:45:21,850 --> 00:45:22,350 Четыре. 1012 00:45:22,350 --> 00:45:25,460 Из-за размера десятичного это вообще четыре, Malloc из четырех дает 1013 00:45:25,460 --> 00:45:29,950 мне обратно адрес кусок память, первый из которых байт 1014 00:45:29,950 --> 00:45:32,110 хранится в настоящее время в х. 1015 00:45:32,110 --> 00:45:34,410 >> Сейчас мы движемся немного быстрее. 1016 00:45:34,410 --> 00:45:35,760 Звезда X означает, что? 1017 00:45:35,760 --> 00:45:38,480 1018 00:45:38,480 --> 00:45:42,590 Это значит, пойти на этот адрес и положить то, что число есть? 1019 00:45:42,590 --> 00:45:43,870 , Число 42 есть. 1020 00:45:43,870 --> 00:45:47,590 Звезда Y означает идти к тому, что при у , а также номер 13 там. 1021 00:45:47,590 --> 00:45:48,600 >> Но подождите минуту. 1022 00:45:48,600 --> 00:45:51,640 Что находится в Y на данный момент? 1023 00:45:51,640 --> 00:45:54,950 Какой адрес у хранении? 1024 00:45:54,950 --> 00:45:55,770 Мы не знаем, верно? 1025 00:45:55,770 --> 00:45:59,230 Мы ни разу не использовать назначение оператор, содержащий у. 1026 00:45:59,230 --> 00:46:03,370 Так у которое указано на второй линии код лишь некоторые мусора значение, большой 1027 00:46:03,370 --> 00:46:04,760 вопросительный знак, так сказать. 1028 00:46:04,760 --> 00:46:07,230 Оно может указывать случайным ни к чему в памяти, которая 1029 00:46:07,230 --> 00:46:08,340 , как правило, плохо. 1030 00:46:08,340 --> 00:46:13,540 >> Поэтому, как только мы попали эту линию там, звезды Y равно 13, что-то плохое, 1031 00:46:13,540 --> 00:46:17,220 что-то очень плохое составляет около случиться с Бинки. 1032 00:46:17,220 --> 00:46:25,810 Итак, давайте посмотрим, что будет в конечном итоге происходит с Бинки здесь, в эту минуту 1033 00:46:25,810 --> 00:46:26,200 или так посмотреть. 1034 00:46:26,200 --> 00:46:26,490 >> [ВОСПРОИЗВЕДЕНИЕ ВИДЕО] 1035 00:46:26,490 --> 00:46:26,745 >> -Эй, Бинки. 1036 00:46:26,745 --> 00:46:27,000 Проснуться. 1037 00:46:27,000 --> 00:46:29,296 Это время для указателя весело. 1038 00:46:29,296 --> 00:46:30,680 >> -Что это? 1039 00:46:30,680 --> 00:46:31,980 Узнайте о указатели? 1040 00:46:31,980 --> 00:46:34,010 О, положительный герой. 1041 00:46:34,010 --> 00:46:37,220 >> -Ну, для начала, я думаю, мы понадобится пару указателей. 1042 00:46:37,220 --> 00:46:37,930 >> -OK. 1043 00:46:37,930 --> 00:46:41,650 Этот код выделяет два указателя которые могут указывать на целые числа. 1044 00:46:41,650 --> 00:46:43,760 >> -Хорошо, хорошо, я вижу два указателя. 1045 00:46:43,760 --> 00:46:45,850 Но они, кажется, не быть указывая ни к чему. 1046 00:46:45,850 --> 00:46:46,490 >> -Это верно. 1047 00:46:46,490 --> 00:46:48,630 Первоначально, указателей не указывает ни на что. 1048 00:46:48,630 --> 00:46:51,700 То, что они указывают на называются pointees, и их создания является 1049 00:46:51,700 --> 00:46:52,850 отдельный шаг. 1050 00:46:52,850 --> 00:46:53,740 >> -Ах, да, точно. 1051 00:46:53,740 --> 00:46:54,500 Я знал, что. 1052 00:46:54,500 --> 00:46:56,270 Pointees раздельные. 1053 00:46:56,270 --> 00:46:58,553 Итак, как вы распределяете pointee? 1054 00:46:58,553 --> 00:46:59,480 >> -OK. 1055 00:46:59,480 --> 00:47:03,707 Ну, этот код создает новый целые pointee, и эта часть множества Х 1056 00:47:03,707 --> 00:47:05,520 , чтобы указать на это. 1057 00:47:05,520 --> 00:47:06,760 >> -Эй, это выглядит лучше. 1058 00:47:06,760 --> 00:47:08,520 Так что сделайте это что-то делать. 1059 00:47:08,520 --> 00:47:09,530 >> -OK. 1060 00:47:09,530 --> 00:47:14,110 Я разыменовать х для хранения 42 числа в свой pointee. 1061 00:47:14,110 --> 00:47:17,660 Для этого трюка, мне понадобится моя магия Жезл разыменования. 1062 00:47:17,660 --> 00:47:20,695 >> -Ваша волшебная палочка разыменования? 1063 00:47:20,695 --> 00:47:22,632 Э-э, это здорово. 1064 00:47:22,632 --> 00:47:24,620 >> -Это то, что код выглядит следующим образом. 1065 00:47:24,620 --> 00:47:27,526 Я просто установить количество, и - 1066 00:47:27,526 --> 00:47:28,250 >> -Эй, посмотри. 1067 00:47:28,250 --> 00:47:29,680 Там она идет. 1068 00:47:29,680 --> 00:47:34,520 Так делают разыменования на X следующим стрелки для доступа к pointee. 1069 00:47:34,520 --> 00:47:36,690 В этом случае, для хранения 42 в там. 1070 00:47:36,690 --> 00:47:40,890 Эй, попробуйте использовать его, чтобы сохранить номер 13 через другой указатель, у. 1071 00:47:40,890 --> 00:47:42,125 >> -OK. 1072 00:47:42,125 --> 00:47:46,810 Я просто пойду сюда, чтобы у и получить число 13 создана. 1073 00:47:46,810 --> 00:47:50,890 А затем взять палочку разыменования и просто - 1074 00:47:50,890 --> 00:47:52,430 Ух ты! 1075 00:47:52,430 --> 00:47:53,030 >> -О, привет. 1076 00:47:53,030 --> 00:47:54,610 Это не сработало. 1077 00:47:54,610 --> 00:47:58,200 Скажем, Бинки, я не думаю, разыменовании Y является хорошей идеей, 1078 00:47:58,200 --> 00:48:01,370 Поскольку настройка pointee является отдельной стадии. 1079 00:48:01,370 --> 00:48:03,460 И я не думаю, что мы когда-либо делали это. 1080 00:48:03,460 --> 00:48:03,810 >> -Хм. 1081 00:48:03,810 --> 00:48:05,160 Хороший вопрос. 1082 00:48:05,160 --> 00:48:07,410 >> -Да, мы выделили у указателя. 1083 00:48:07,410 --> 00:48:10,045 Но мы никогда не установить его на указывать на pointee. 1084 00:48:10,045 --> 00:48:10,490 >> -Хм. 1085 00:48:10,490 --> 00:48:12,170 Очень наблюдательны. 1086 00:48:12,170 --> 00:48:13,790 >> -Эй, вы ищете Хорошо там, Бинки. 1087 00:48:13,790 --> 00:48:16,920 Вы можете это исправить, так что у пунктов к тому же, как pointee х? 1088 00:48:16,920 --> 00:48:17,810 >> -Конечно. 1089 00:48:17,810 --> 00:48:20,300 Я буду использовать мою волшебную палочку присваивания указателя. 1090 00:48:20,300 --> 00:48:22,240 >> -Разве что будет проблема, как раньше? 1091 00:48:22,240 --> 00:48:22,665 >> -Нет. 1092 00:48:22,665 --> 00:48:24,300 Это не касается pointees. 1093 00:48:24,300 --> 00:48:27,880 Это просто меняет один указатель, чтобы указать к тому же, как другой. 1094 00:48:27,880 --> 00:48:28,970 >> -О, я вижу. 1095 00:48:28,970 --> 00:48:31,730 Теперь у указывает на том же месте, х. 1096 00:48:31,730 --> 00:48:32,450 Так что ждите. 1097 00:48:32,450 --> 00:48:33,490 Теперь у фиксировано. 1098 00:48:33,490 --> 00:48:34,630 Она имеет pointee. 1099 00:48:34,630 --> 00:48:36,520 Таким образом, вы можете попробовать палочку разыменования снова 1100 00:48:36,520 --> 00:48:39,200 отправить по 13. 1101 00:48:39,200 --> 00:48:39,840 >> -OK. 1102 00:48:39,840 --> 00:48:41,570 Здесь идет. 1103 00:48:41,570 --> 00:48:42,870 >> -Эй, посмотри на это. 1104 00:48:42,870 --> 00:48:44,320 Теперь разыменовании работ по у. 1105 00:48:44,320 --> 00:48:47,020 И потому, что указатели делятся что один pointee, они 1106 00:48:47,020 --> 00:48:48,585 оба видят 13. 1107 00:48:48,585 --> 00:48:49,040 >> -Да. 1108 00:48:49,040 --> 00:48:49,670 Обмен. 1109 00:48:49,670 --> 00:48:50,380 Какая разница. 1110 00:48:50,380 --> 00:48:52,290 Так что мы будем теперь меняются местами? 1111 00:48:52,290 --> 00:48:52,970 >> -О, смотри. 1112 00:48:52,970 --> 00:48:54,150 У нас нет времени. 1113 00:48:54,150 --> 00:48:55,200 >> -Но - 1114 00:48:55,200 --> 00:48:57,060 >> -Просто помните, три Указатель правил. 1115 00:48:57,060 --> 00:49:00,100 Номер один, основная структура является то, что у вас есть указатель. 1116 00:49:00,100 --> 00:49:02,170 И он указывает к pointee. 1117 00:49:02,170 --> 00:49:04,160 Но указатель и pointee раздельные. 1118 00:49:04,160 --> 00:49:06,460 А распространенная ошибка заключается в создать указатель, но 1119 00:49:06,460 --> 00:49:08,540 забудьте дали pointee. 1120 00:49:08,540 --> 00:49:12,460 >> Номер два, разыменования указателя начинается на указатель, следуя своему 1121 00:49:12,460 --> 00:49:14,570 стрелкой на доступ к его pointee. 1122 00:49:14,570 --> 00:49:18,640 Как мы все знаем, это работает только, если есть является pointee, которая возвращается к 1123 00:49:18,640 --> 00:49:19,790 Правило номер один. 1124 00:49:19,790 --> 00:49:23,670 >> Номер три, присваивание указателя один указатель и изменяет его, чтобы указать на 1125 00:49:23,670 --> 00:49:25,850 pointee же как еще один указатель. 1126 00:49:25,850 --> 00:49:27,840 Таким образом, после назначения, два указателя будет 1127 00:49:27,840 --> 00:49:29,430 указывать на тот же pointee. 1128 00:49:29,430 --> 00:49:31,600 Иногда это называется обмен. 1129 00:49:31,600 --> 00:49:33,430 А ну, вот и все, на самом деле. 1130 00:49:33,430 --> 00:49:33,840 Прощай, прощай, сейчас. 1131 00:49:33,840 --> 00:49:34,300 >> [КОНЕЦ ВИДЕОВОСПРОИЗВЕДЕНИЕ] 1132 00:49:34,300 --> 00:49:36,940 >> DAVID МАЛАН: Так больше на указатели, больше на Бинки на следующей неделе. 1133 00:49:36,940 --> 00:49:38,190 Увидимся в понедельник. 1134 00:49:38,190 --> 00:49:42,187