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. Malan: Добре. 4 00:00:11,650 --> 00:00:15,610 Това е CS50, и този е краят на седмицата Four. 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 точно сега на мира в Three и 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 County окръжния прокурор 12 00:00:33,560 --> 00:00:34,950 офис, правят криминалистите работят. 13 00:00:34,950 --> 00:00:37,450 Така че, по същество, на Massachusetts Щатската полиция, по повод, 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 [VIDEO PLAYBACK] 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 >> -Чакайте Минути. 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 >> -Vector В на това човек от задната волана. 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 I засилено детайла, и-- 50 00:01:38,562 --> 00:01:40,020 -I Мисля, че има достатъчно, за да се подобри. 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 >> Дръж нататък. 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 >> -Reflection. 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 -Спри. 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 >> -Спри. 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 >> Може би ние можем да използваме Pradeep Сингх метод, за да видите в прозорците. 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 >> -Lock На и разширяване на Z-ос. 93 00:02:36,840 --> 00:02:37,351 >> -Enhance. 94 00:02:37,351 --> 00:02:37,850 Подобрете. 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. Malan: Така че тези, които са всички думи, но те не са били 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 Това е собствен Дейвън 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 И наистина, в окото на Дейвън е е само четири, може би шест пиксела 112 00:03:19,190 --> 00:03:22,110 че композирате точно какво блещукаше там. 113 00:03:22,110 --> 00:03:25,890 Така Проблем Set Four в крайна сметка ще има проучи този свят, особено 114 00:03:25,890 --> 00:03:28,090 от природата на нещо ние наричаме файл I / O, където 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 Наистина, че снимка ние просто трион на Дейвън е 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 от Word документ от файл 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 >> Така че, когато компютърът ви се отваря Word формат, или когато компютърът отваря 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 от, да речем, Задача Set One, който се справи с 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, а, б, в, г, д, е, просто по силата на споразумение. 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. Malan: Това е 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, 05.01, Отивам да напиша, че в шестнадесетичен, 200 00:07:17,310 --> 00:07:22,311 които, ако си мислиш, обратно, ако имате нула през F, което е 15 щеше да бъде? 201 00:07:22,311 --> 00:07:22,810 АУДИТОРИЯ: F. 202 00:07:22,810 --> 00:07:24,434 DAVID J. Malan: Така се оказва, това е F. 203 00:07:24,434 --> 00:07:29,140 И вие можете да го измисля, като казва, добре, ако е 10, а след това OK, F е 15. 204 00:07:29,140 --> 00:07:33,250 Така че, наистина, можем да пренапише същия набор от числа, като е 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 X, която няма друго значение от визуален идентификатор, 213 00:07:58,000 --> 00:07:59,590 тук идва редица шестнадесетичен. 214 00:07:59,590 --> 00:08:04,210 >> И след това, да поставите двете цифри, е е в този случай, тогава г А, след това е 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 Set Four. 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, I Просто трябва наченки 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 Сега аз имам # включват "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 One, Седмица Две неща сега, 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 И аз не искам hardcode три тук. 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 просто така че не е нужно да се hardcode три в няколко места. 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 Ако искам да поставя в I-та име на студента, мисля, че правя това. 286 00:11:22,890 --> 00:11:26,480 И след това, а не имена но къщи скобата аз. 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 Отивам да се направи повече с по- това-- това безспорно IS 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 не като едно цяло число или низ, но нещо по-високо ниво, абстракция, така че 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 Няма такова нещо като грам прякото или един грам овална език за програмиране С. 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 нарича структура и друга една, наречена typedef. 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 че сега стои редом INT, и плувка, и Чар, и низ, 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 да STRUCT 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 Как можете да получите на името, и къщата, и идентификацията, 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 New синтаксис, но една проста идея. 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 Just., Което означава "Влез в структура и се нарича областта 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 започнете да използвате неща, като гр rects и грам овали 358 00:14:46,130 --> 00:14:50,201 и други неща, които не изглежда да идват от Week нула, едно или две, 359 00:14:50,201 --> 00:14:52,950 осъзнават, че това е, защото Stanford обявен някои нови типове данни. 360 00:14:52,950 --> 00:14:56,160 >> И наистина, това е точно това, което ние ще правя, както и, в P Set Four, когато 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 >> Така погледнато сега на изображения, нека върнем Дейвън тук 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. Malan: заема повече пространство, защото аз съм с помощта на променлива, 389 00:16:04,719 --> 00:16:05,400 и това е ОК. 390 00:16:05,400 --> 00:16:07,300 Това е вярно, но аз съм щях да кажа, че е OK. 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. Malan: Точно така. 395 00:16:13,571 --> 00:16:15,090 Той суапове само променливите на местно ниво. 396 00:16:15,090 --> 00:16:18,173 Защото всеки път, когато се обадя на function-- когато имах тавите от Annenberg 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 Какво прави суап получи, сме иск? 401 00:16:26,392 --> 00:16:27,100 Публика: екземпляра. 402 00:16:27,100 --> 00:16:28,090 DAVID J. Malan: Така че копия от тях. 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 че вие ​​или на TFS и Ca имат били те води към по следния начин. 408 00:16:45,180 --> 00:16:51,210 >> Така че без суап отзоваване изглежда като-- оставим отвори това-- изглежда по този начин. 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 тази програма не работи, защото не постоянно сменяте X и Y. 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 А китка на преобладаващото информация, която Ще се отървем от с Control 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. Malan: Точно така. 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. Malan: Малко по-силно. 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. Malan: Не съвсем консенсус. 457 00:18:32,120 --> 00:18:34,760 Така че, да, ние виждаме някаква стойност боклук. 458 00:18:34,760 --> 00:18:37,862 Сега, Y е 134514064 там. 459 00:18:37,862 --> 00:18:39,320 Е, това е просто някаква стойност боклук. 460 00:18:39,320 --> 00:18:41,350 Моята програма използва RAM за различни цели. 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 Но аз не искам да се удари тук, защото ако 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. Malan: стъпки. 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 Print темп. 480 00:19:16,080 --> 00:19:17,129 481 00:19:17,129 --> 00:19:20,170 Стойност Garbage, отрицателна този път, но това е само още стойност за боклук. 482 00:19:20,170 --> 00:19:22,810 Така че нека да направим следващата, печат темп. 483 00:19:22,810 --> 00:19:27,130 Това е инициализира с 1, който е стойността на X, известен на. 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 Но А и Б сега ще бъде копия на X и Y, съответно. 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 За съжаление, х е все едно и Y е все още два. 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 String е лъжа. 509 00:20:39,230 --> 00:20:41,860 Той също не е тип данни която съществува в C. Това е 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 >> Така че, ако S, първия низ, равнява = т, тогава аз съм 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 Позволете ми да отида напред и да кажа нещо : Дейвън и нещо: Роб. 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 и тя се нарича S. 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 или Габе или Дейвън. 578 00:23:11,360 --> 00:23:14,640 Така че нека да изберете първия на тези, които е Дейвън. 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. Malan: Да, от / 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 Как, по дяволите, отиваме да се поберат Дейвън в тази малка кутийка тук? 595 00:23:57,030 --> 00:23:59,880 >> Е, това, което се GetString всъщност прави? 596 00:23:59,880 --> 00:24:03,680 Е, тази мрежа тук представлява памет или RAM на моя компютър. 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 Oxford Street, или 34 Oxford Street, или 35 Oxford Street. 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" се озовава в Byte One в паметта. 607 00:24:31,030 --> 00:24:34,210 >> Нямам какво друго се случва в памет, така че Дейвън получи първия място 608 00:24:34,210 --> 00:24:35,509 в Byte 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 Това ще е 0x3. 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 се чувства като тя не е връщане Дейвън, сами по себе си, 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. Malan: Мястото на Дейвън. 627 00:25:10,540 --> 00:25:12,770 И това е правил това откакто Week One. 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 Дейвън живее в 33 Oxford Street. 632 00:25:24,820 --> 00:25:29,310 Но по-сбито, Gavin живее при 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 Ако кажа, донеси ми низ, можете да ми дадете Дейвън. 643 00:25:55,630 --> 00:25:57,230 Но наистина не ми даде Дейвън. 644 00:25:57,230 --> 00:25:59,310 Всичко, което ми даде, е адрес на Дейвън. 645 00:25:59,310 --> 00:26:04,310 Как мога да знам със сигурност, а след това където Дейвън започва и ends-- 646 00:26:04,310 --> 00:26:07,140 на историята все weird-- където Дейвън започва и завършва, 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 >> Е, ако сте да дадете ми в началото на Дейвън, 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. Malan: Просто защото те имат различни адреси. 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 >> Така че, когато аз правя S е равно на = т, не сте сравняване 674 00:27:15,380 --> 00:27:17,880 D срещу това и срещу A това и 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 срещу този низ с помощта на C код? 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. Malan: Perfect. 694 00:28:01,670 --> 00:28:02,900 АУДИТОРИЯ: [недоловим] 695 00:28:02,900 --> 00:28:03,310 DAVID J. Malan: Да. 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 Ето Version Two. 707 00:28:27,960 --> 00:28:32,910 И това, което аз щях да кажа тук е, че вместо да се сравняват и се равнява = т, 708 00:28:32,910 --> 00:28:38,964 Аз, вместо да каже, ако низ сравнение на S запетая т равнява = 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. Malan: Да, по-голяма или по-малко от. 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 >> Но бихме могли абсолютно има INT * и други неща. 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 или PC, просто причинявайки компютър да виси 766 00:31:08,360 --> 00:31:10,340 или програма, за да се замразява, потенциално. 767 00:31:10,340 --> 00:31:14,930 >> Така че сега, аз твърдя, в копие-0.c, че аз отивам да копирате тези струни чрез 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. Malan: Първо характер на тон. 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 оригинала, S, и тук е копие, т. 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 Какво е низ т = S наистина правят? 791 00:32:09,040 --> 00:32:16,430 Ако имаме в лявата страна страна тук низ т = 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 Какво прави низ т = S направи под капака? 795 00:32:28,847 --> 00:32:30,340 >> АУДИТОРИЯ: [недоловим] 796 00:32:30,340 --> 00:32:34,100 >> DAVID J. Malan: Тя съхранява паметта адреса там, така 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 Така че малко грама ще стане голям G. Но проблемът 808 00:33:07,840 --> 00:33:09,410 е, какво прави S посочват също? 809 00:33:09,410 --> 00:33:10,300 >> АУДИТОРИЯ: Същото. 810 00:33:10,300 --> 00:33:11,841 >> DAVID J. Malan: Едни и същи неща. 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 но ако проблемът е, че просто да правиш т = а само 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. Malan: Да. 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 Но проблемът е, ако това е първоначално S, 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 г-а-Ь-електронна / 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. Malan: Да, ние Необходимо е да попълните това поле празно. 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 Сега, това изглежда много по-загадъчен отколкото-- и аз съм единственият, който може да види 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 на и, разбира се, представлява по-- 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. Malan: Само брой символи в с. 899 00:36:56,710 --> 00:36:59,040 Така дължината на S, първоначалното низ. 900 00:36:59,040 --> 00:37:00,350 Така G-а-Ь-д. 901 00:37:00,350 --> 00:37:02,320 Така че това е може би четири в този случай. 902 00:37:02,320 --> 00:37:05,485 Защо правя едно след призовава strlen на S? 903 00:37:05,485 --> 00:37:06,360 АУДИТОРИЯ: [недоловим] 904 00:37:06,360 --> 00:37:07,590 DAVID J. Malan: За тази специален нула характер. 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. Malan: Адресът на какво? 921 00:37:53,709 --> 00:37:55,250 АУДИТОРИЯ: От паметта за да ги предостави? 922 00:37:55,250 --> 00:37:56,450 DAVID J. Malan: От памет да ги предостави. 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 защото на операционната система, което Windows и Mac OS направи за мен, е 928 00:38:08,800 --> 00:38:11,230 уверете се, че това е даване ми различни парчета от RAM. 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 Oxford Street, 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. Malan: Защо правим проверите за тон, равна на нула? 957 00:39:30,740 --> 00:39:33,250 Ако четем documentation-- голяма въпрос- за изчистване, 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 Oxford Street," 984 00:40:49,070 --> 00:40:53,830 ако го направя "* 33 Oxford Street," това означава, че "Отиде надолу по пътя до сградата CS." 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 S е адресът на това, което, за да бъде ясно, в примера, които сме обсъждали, 989 00:41:06,650 --> 00:41:07,500 на малки букви Габе? 990 00:41:07,500 --> 00:41:08,990 991 00:41:08,990 --> 00:41:10,005 S е адресът на-- 992 00:41:10,005 --> 00:41:11,585 993 00:41:11,585 --> 00:41:12,460 АУДИТОРИЯ: The низ. 994 00:41:12,460 --> 00:41:14,126 DAVID J. Malan: От първоначалното име на Гейб. 995 00:41:14,126 --> 00:41:16,660 Така че това е адресът на това парче на паметта. 996 00:41:16,660 --> 00:41:22,220 Така че, ако кажа, т + Аз--, забележка, е просто стар наш приятел. 997 00:41:22,220 --> 00:41:24,770 Това е просто една променлива индекс че е итерации от нула нагоре 998 00:41:24,770 --> 00:41:26,960 на дължината на низ S. 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 въпреки че отново, синтаксиса е далеч по-тайнствена от Scratch. 1002 00:41:36,140 --> 00:41:39,522 Така т е адрес + аз ще да ми даде 1003 00:41:39,522 --> 00:41:42,480 номер, тъй като всички те са номера, които ние сме били рисуване като шестнадесетичен. 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 Дори ако не сте доволни с още шестнадесетичен, да предположите. 1008 00:41:53,980 --> 00:41:54,410 >> АУДИТОРИЯ: Оригиналът. 1009 00:41:54,410 --> 00:41:55,850 >> DAVID J. Malan: Все още 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 И сега от дясната страна на този израз, * и след това в parens, 1013 00:42:06,930 --> 00:42:11,586 S + I означава и, което е най- справяне тук на малкото грама. 1014 00:42:11,586 --> 00:42:16,220 S + 0 е, разбира се, S, каквото и да е е. 1015 00:42:16,220 --> 00:42:21,230 >> Така че сега, това е * а, които точно като * 33 Oxford Street означава, отидете на адрес 1016 00:42:21,230 --> 00:42:22,010 S. 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 Първоначално тя декларира две променливи, х и Y, които не са номера това време, 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 Те са очевидно INT *. 1040 00:43:22,899 --> 00:43:25,690 Така че просто някой, какво означава това ако вашият тип данни, вашият променлива, 1041 00:43:25,690 --> 00:43:26,860 е от тип INT * звезда? 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 Това просто означава "казано, в крайна сметка, адреса на INT тук. " 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 на междинно съединение, което е вероятно ще бъде 32 бита или четири байта. 1050 00:43:52,370 --> 00:43:53,680 >> Така че това, което се връща изчистване? 1051 00:43:53,680 --> 00:43:55,250 Изчистване връща адрес. 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 Oxford Street. 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. Malan: Отиди на този адрес. 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. Malan: 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. Malan: Има не е памет за у. 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. Malan: Някои стойност боклук. 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 колега, Nishat Мехта в обратно на Елиът Dining Hall. 1090 00:45:19,501 --> 00:45:21,250 Сега, аз съм си спомни това, защото това е 1091 00:45:21,250 --> 00:45:23,920 една от темите, I, в специално, се бореше с. 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 нека хвърлим един последен поглед в нашата последните три минути тук в Бинки, 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 >> [VIDEO PLAYBACK] 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 Er, така че как да се разпредели 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 За този трик, ще ми трябва Magic Wand на Dereferencing. 1128 00:46:32,830 --> 00:46:34,130 1129 00:46:34,130 --> 00:46:36,080 >> Твоята Magic Wand на Dereferencing? 1130 00:46:36,080 --> 00:46:37,357 1131 00:46:37,357 --> 00:46:38,190 Че-- това е страхотно. 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 Аз просто ще създаде номера и [РОР] 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 чрез друга показалеца, Y. 1140 00:46:57,710 --> 00:46:58,760 >> -OK. 1141 00:46:58,760 --> 00:47:03,270 Аз просто ще отида тук, за да Y, и да получите номер 13 набор нагоре. 1142 00:47:03,270 --> 00:47:07,930 И тогава, да вземе пръчката на Dereferencing и просто [BUZZ] 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 Кажете, Бинки, аз не мисля, че dereferencing Y е добра идея, защото вие знаете, 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 Ние разпределени на показалеца Y, но ние Никога не го настроите да се насочи към 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 като X? 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 Сега, Y е фиксиран. 1166 00:47:49,950 --> 00:47:51,120 Той има pointee. 1167 00:47:51,120 --> 00:47:54,510 Така че можете да опитате Жезъла на Dereferencing отново да изпрати 13 свърши. 1168 00:47:54,510 --> 00:47:56,510 >> -Uh, OK. 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 Сега dereferencing произведения на у. 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 >> -Но-- 1179 00:48:11,570 --> 00:48:13,530 >> -Просто Не забравяйте трите правила на показалеца. 1180 00:48:13,530 --> 00:48:16,560 Number One, основната структура е, че имате една показалка, 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 >> Номер Две, показалеца dereferencing започва на показалеца 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. Malan: Това е за CS50. 1198 00:48:52,568 --> 00:48:55,110 Ние ще се видим следващата седмица. 1199 00:48:55,110 --> 00:48:56,064