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