1 00:00:00,000 --> 00:00:11,242 >> [Музички] 2 00:00:11,242 --> 00:00:16,630 >> Дејвид Џ 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 Па сега ќе видите една целосна верзија на играта на Збег. 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 wowed иако можеби ќе биде - 25 00:01:26,470 --> 00:01:30,850 прилично тривијална да се спроведе Бог на владата во Збег, за разлика Игра на Петнаесет, 26 00:01:30,850 --> 00:01:33,590 што некои од вас може да се справуваат со за хакер издание. 27 00:01:33,590 --> 00:01:37,890 >> Во Збег е доволно во Бога владата едноставно да го направи она што, 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 малку повеќе doable, да речеме, од Бога владата беше со играта на Петнаесет. 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 >> На предавање на Rob за 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 И во однос на Збег, знаете дека ви да го направите тоа толку долго колку што имаат 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 >> Нема pop-up. 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 И Voila, имаме т.н. g прозорец. 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 >> И Voila, сега продолжува со линија 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 >> Па ние сме, се разбира, земајќи изглед на Графика сега, одеднаш. 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 >> [Музика - LANA DEL Реј, "Млади и убави] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> ЗВУЧНИК 1: Тоа е само малку неверојатно, можеби, само како 151 00:10:52,470 --> 00:10:52,857 сеприсутно - 152 00:10:52,857 --> 00:10:57,040 >> [Аплауз] 153 00:10:57,040 --> 00:10:59,230 >> ЗВУЧНИК 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 >> Сите во право, па ајде да започне Фузија повторно. 160 00:11:18,670 --> 00:11:20,800 Потсетете ме подоцна. 161 00:11:20,800 --> 00:11:24,190 Сите во право, а вие треба да го имаме e-mail како настрана, ако не добие 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 >> Да, па тоа е т.н. char *. 171 00:11:50,500 --> 00:11:53,860 И * таму означува дека има некој вид на адреса вклучени. 172 00:11:53,860 --> 00:11:58,690 И така, кога ќе се каже char * само значи променлива чија тип на податок е 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 само ж-е-л-л-о, на пример. 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, проследено од страна на а, б, в, г, д, ѓ. 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 Па јас декларирани, повторно, Стринг и GetString. 225 00:14:23,230 --> 00:14:26,640 >> Па ќе одам да се оди напред сега и подготви s за она што навистина е. 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 Одам да го наречеме s. 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 Ако корисникот видови во ж-е-л-л-о внесете стрингот здраво добива се врати. 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 >> ПУБЛИКАТА: Еден адреса. 243 00:15:11,610 --> 00:15:12,600 >> ЗВУЧНИК 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", посебните стража карактер. 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 И технички она што потоа се случува е дека ние чување, внатрешноста на с, 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 Одам да само да привлече повеќе user-friendly стрелките кој го спроведува 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 >> ЗВУЧНИК 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 >> ЗВУЧНИК 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 >> Сега јас би можеле да имаат направено овој многу tediously. 315 00:18:30,020 --> 00:18:32,240 Но familiarly, ние сме користење на за телефонска линија. 316 00:18:32,240 --> 00:18:36,050 И само се споредуваат на заградата з против т заградата јас. 317 00:18:36,050 --> 00:18:39,590 Додади заградата јас плус 1 против т заградата i плус 1, и така натаму, во внатрешноста 318 00:18:39,590 --> 00:18:40,580 некој вид на јамка. 319 00:18:40,580 --> 00:18:44,950 И ако јас самото место било два лика кои разликуваат или ако сфаќам дека ooh, а е 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 и t и да каже исти, исти, исти, исти, исти, крајот на 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 Но тоа се враќа негативна вредност, ако е треба да дојде пред т по азбучен ред или 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 доби стотици megs или дури и свирки на 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 >> Можеби сте го сториле тоа, дури и во проблемот постави четири со Збег. 371 00:21:09,220 --> 00:21:12,910 И покрај тоа што најверојатно не го виделе било ѕвезди во дистрибуцијата кодот за 372 00:21:12,910 --> 00:21:17,410 Збег, излегува дека оние 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 низа т добива s. 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 А потоа јас ќе одам да направите добива s. 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 Но ајде да размислиме за она што е внатре на X? 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 во s, која е 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 >> Па сега, се сетам на минатата недела, кога Тргнавме кон капиталистичката Т јас 396 00:22:22,110 --> 00:22:23,800 направив Т заградата 0. 397 00:22:23,800 --> 00:22:27,150 Па, Т заградата 0, иако тоа е покажувачот, можете да го третираат како иако 398 00:22:27,150 --> 00:22:29,220 тоа е низа, со квадратна заградата нотација. 399 00:22:29,220 --> 00:22:31,550 >> Па каде е Т заградата 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 Сте Капитализиране на овој Х Но, на Се разбира, тоа е исто точно ж тоа е 404 00:22:44,410 --> 00:22:46,540 внатрешноста на s, така да се каже. 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 >> Јас само rewrote s како char *. 418 00:23:23,970 --> 00:23:25,250 Нема функционални Разликата таму. 419 00:23:25,250 --> 00:23:28,790 Јас само фрли CS50 библиотека и Јас сум нарекувајќи она што е, char *. 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 Тоа не е премногу е char *. 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 >> Па, стринг должина на С. 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 >> Но, тогаш плус 1, зошто 1? 433 00:23:57,960 --> 00:23:58,830 На 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, Д-а-V-i-г, компјутерот се случува да се мисли дека е, всушност, 438 00:24:14,020 --> 00:24:18,900 ж-е-л-л-о-г-а-V-i-г бидејќи има без пауза помеѓу овие зборови. 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 пати поголема од големината на char, кој се случува да биде 1. 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 >> Значи, ако јас се вратиме тука, јас сум прогласи на char * наречен т. 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 i добиете 0, n добива стринг должина на С. 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 Јас + +, и тогаш јас едноставно не правете т заградата јас добива s. 474 00:25:51,890 --> 00:25:56,320 Затоа што мојата слика како изгледа тоа во овој момент, се чуваат во t е 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 А потоа истото за Е, и л и ј, и o. 481 00:26:14,300 --> 00:26:17,930 >> n, зошто јас одат нагоре преку еднаков на 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 и капитализирана t заградата 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 >> ЗВУЧНИК 1: Секако. 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> ПУБЛИКАТА: Па како дојде во вашиот последен линија, ќе немаат * T линија 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 >> ЗВУЧНИК 1: Ах, навистина добро прашање. 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 Ако кажам * T тоа значи да одат во на адреса чуваат во т. 515 00:28:01,450 --> 00:28:04,350 >> Значи буквално, ако т е чување адресата на која часот 516 00:28:04,350 --> 00:28:07,300 на почетокот, * T средства одат овде. 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 Јас не може само да се каже * T добива * s. 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 >> Бидејќи * T е да отидете на адреса во т. 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 i. 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 иако ова е сега добивам малку познавач, основната идеја, ако * T 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 Па, ако сакате да добиете на e во т стринг, сакам само да одат, 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 без оглед на почетокот на t е, кој е т плус i, која на почетокот 555 00:29:44,670 --> 00:29:45,730 е 0, што е одлично. 556 00:29:45,730 --> 00:29:49,280 Бидејќи тоа значи дека на почетокот на t плус 1, плус 2, плус 3, и така натаму. 557 00:29:49,280 --> 00:29:51,030 И истиот договор, со s. 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 swap беше недостатоци. 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 >> ЗВУЧНИК 1: Точно, кога ти се јавам трампа - 581 00:30:44,940 --> 00:30:47,820 или поопшто, кога ќе јавете се повеќето било функција - 582 00:30:47,820 --> 00:30:51,210 ако аргументи за таа функција се примитивен, така да се каже, ints и карактери 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 Па ако x е 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 >> Па овој код е супер совршен на Замена на a и b. 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 x и y. 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 податочен тип како што значи дека е покажувач до int во овој случај. 603 00:31:44,910 --> 00:31:46,270 >> Па што сум јас тука? 604 00:31:46,270 --> 00:31:49,590 Сакам да кажам дека не ми даде int проследено со уште еден број, 605 00:31:49,590 --> 00:31:50,810 нарекувајќи ги a и b. 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 Се јавите на оние обраќа a и b. 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 >> ЗВУЧНИК 1: Јас не го прогласија tmp како стринг. 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 >> ЗВУЧНИК 1: Точно, не сакам да се разменуваат со ништо со мали. tmp е само 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 На пример, во примерот од минатата недела или во случај на b, ја добиете вредноста на 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 или Хром 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 брзо и хранат во процесорот, кој е мозокот на компјутерот. 646 00:33:57,520 --> 00:34:00,940 >> И во ТАМ тие се чуваат на самиот врвот на својата програма, така да се каже. 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 Но на дното е делот кој е особено germane во моментов. 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 Можам да добијам парче од меморијата на дното на моето RAM меморија, така да зборува. 673 00:35:10,510 --> 00:35:13,390 И ова е местото каде што главните е локални променливи оди. 674 00:35:13,390 --> 00:35:16,770 Тоа е каде што argc и argv можеби оди, и сите променливи јас 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 И јас одам да се опише ова како кои припаѓаат на swap функција. 680 00:35:34,160 --> 00:35:35,770 >> Сега она што е внатре на swap? 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 Добро, a и b. 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 Б се случува да се заокружи тука. 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 и било нејзините локални променливи како x и y 698 00:36:17,810 --> 00:36:18,940 може да биде толку добро. 699 00:36:18,940 --> 00:36:22,170 >> Па сега сметаат дека она што навистина се случува кога ќе се јавите, swap. 700 00:36:22,170 --> 00:36:26,370 Кога ќе се јавите, swap, извршување на кодот како ова, ти си поминува во, во 701 00:36:26,370 --> 00:36:30,670 кабриолет верзија, a и b како копии на x и y. 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 јавете се разменуваат поминува во буквално a и b како цели броеви, она што навистина се случува? 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 ако тврдам дека ова е x, чување вредност 1 исто како и минатата недела. 712 00:37:02,690 --> 00:37:05,930 И ова е Y, чување на вредноста 2 Исто како и минатата недела. 713 00:37:05,930 --> 00:37:11,370 И ова е главниот, кога ќе се јавам, swap, на тој начин себе си даваат пристап до и 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 Б е вредност. 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 Јас одам напред и промена b за да биде она што вредноста на мали е, што е 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 Добро, очигледно гума сака само еден прст во време - 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 Па на адреса на x и на адреса на y. 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 >> Тоа се случува да биде покажувач до x. 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 мали добиете * a. 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 >> Па b вели одиме таму и пребришете го со 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 Или на swap? 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 И тоа беше оној кој Binky воведе нас да, иако доста 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 Па тоа е да ги чувате само на int, очигледно. 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 Но поентата на claymation на Nick беше навистина само раскаже приказната за тоа што 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 >> ЗВУЧНИК 1: Па, не сосема бајти, по се каже. 799 00:41:14,130 --> 00:41:16,760 Бидеме попрецизни сега. 800 00:41:16,760 --> 00:41:18,325 Што добива чуваат во X? 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 Примерок behaviorally доделува парче меморија. 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 и int * y 815 00:41:52,490 --> 00:41:53,740 се случува да го направи она што за мене? 816 00:41:53,740 --> 00:41:58,280 Тврдам дека тоа е само случува да се направи нешто како ова и го нарекуваат X, и 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 И ова е зачуван во некои адреса Волот, кој знае? 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 >> Сега во следната линија * x добива 42. 828 00:42:25,430 --> 00:42:29,400 Што значи * x значи во однос лаик? 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 Добро, * y средства одат таму. 836 00:42:47,320 --> 00:42:50,460 Па, ова не е дадено вредност, сепак, нели? 837 00:42:50,460 --> 00:42:54,090 Кодот не мора y се иницијализиран на ништо. 838 00:42:54,090 --> 00:42:56,120 Имавме x се иницијализира на адреса. 839 00:42:56,120 --> 00:42:57,640 Но y беше прогласен до врвот. 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 Ако случајно сте dereference, така да се зборува, или одам во адреса што не е 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 >> Тогаш ние доделени на големината на на int и чуваат тоа во х. 855 00:43:39,690 --> 00:43:42,130 Тогаш следната линија што го правевме * x. 856 00:43:42,130 --> 00:43:46,070 Ова беше магично стапче на Nick на 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 Се обидовме да dereference y. 861 00:43:53,550 --> 00:43:55,620 Но y имаше некои лажни вредност, нели? 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 >> Но ако ние потоа одреди дека со тоа х добива y како го прави приказната промена? 867 00:44:10,800 --> 00:44:15,760 Па, ако го направам х добива y, тоа е ефикасно иста како вели 868 00:44:15,760 --> 00:44:19,235 што е ова, Волот-нешто се случува да биде ист тука, 869 00:44:19,235 --> 00:44:20,080 Вол-нешто. 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 на X да ја запази 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 да се укаже x како точка т. 898 00:45:35,310 --> 00:45:39,280 А потоа можете dereference 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 И има добри Википедија статија која шета низ 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 карактери можат да се вклопуваат во внатрешноста на таа низа наречен в. 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 во в. 944 00:47:42,080 --> 00:47:43,090 Колку бајти? 945 00:47:43,090 --> 00:47:44,260 На стринг должина на бар. 946 00:47:44,260 --> 00:47:48,380 >> Значи со други зборови, ако корисникот видови во ж-е-л-л-о Enter, стринг должина 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 Но ако сте само задржи plopping бајти надолу - или знаци - тие се случува да се стави крај 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 што јас не се подготви за мојата слика, но оваа слика Википедија тука има - 990 00:49:41,080 --> 00:49:42,890 нејзините т.н. враќање адреса. 991 00:49:42,890 --> 00:49:47,470 >> Кога храната се враќа, кога swap се враќа, како не на компјутер знаат да одат од 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 Па овој напад код, ААА, повторно, можеби испрати спам, би можеле да ги избришете сите датотеки 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 buffer overflow напад. 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 >> [Музички]