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