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