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