[Музички] [Видео репродукција] -Тој Лаже. -За што? -Не знам. -Па, Што знаеме? -Тоа Во 9:15, Реј Santoya беше на банкомат. -Да. Значи, прашањето е, она што правел во 09:16? -Shooting 9-милиметарски во нешто. Можеби тој го виде снајперист. И обратно може Работев со него. -Wait. Вратете се назад едно. -Што Гледаш? -Bring Лицето нагоре на цел екран. -His Очила. -Има Е одраз. -Тоа Е безбол тим Nuevitas. Тоа е нивното лого. -И Тој зборува за кој е облечен дека јакна. [END репродукција] Дејвид MALAN: Во ред. Ова е CS50 и ова е малку повеќе на [Беззвучен] со која сте dabbling со проблем во собата четири. Денес ние започнуваме да се погледне малку повеќе длабоко на овие работи вика покажувачи, кој иако тоа е прилично таинствени тема, излегува дека тоа се случува да биде средство со кое се да почнете со изградба и монтажа многу пософистицирани програми. Но, ние тоа го правеше на минатата среда по пат на некои claymation прво. Па ова, да се потсетиме, е Binky, а ние го користи да ги разгледаме во една програма која не навистина да направите нешто интересно, но тоа не се откриваат неколку проблеми. Така да се започне денес, зошто да не можеме да одиме брзо преку неколку од овие чекори, се обиде да го дестилираат во смисла на човековото точно што се случува овде и зошто ова е лошо, а потоа се пресели а всушност се започне изградба на нешто Со оваа техника? Значи овие се првите две линии во оваа програма и во однос на Едноставен, она што се прават овие две линии? Некој кој е разумно удобно со она што е наведено на екранот? Кои се овие две линии се прави? Тоа не е сè што различни од една недела, но има некои нови специјални симбол. Да? Врати таму. ПУБЛИКАТА: Прогласувањето покажувачи? Дејвид MALAN: еднаш се каже? ПУБЛИКАТА: Прогласувањето покажувачи? Дејвид MALAN: Прогласувањето покажувачи и ајде да го насочите малку повеќе. ПУБЛИКАТА: [Беззвучен] адреса x и y тогаш. Дејвид MALAN: И потоа се обрати. Толку посебно она што го правиме ние се декларираат две променливи. Овие променливи, иако, се случува да биде од тип int ѕвезда, која поконкретно значи тие се случува да се сместат на адреса на int, соодветно, x и y. Сега постојат никакви вредности? Дали има некои вистински адреси во овие две променливи во овој момент во времето? Бр Тоа е само т.н. вредности ѓубре. Ако не ви се всушност доделите променлива, што и да е во RAM меморија претходно се случува да се пополни со нули и оние двете од овие променливи. Но, ние се уште не знаеме Што се тие и тоа е ќе бидат клучни за тоа зошто Binky загуби главата минатата недела. Значи ова е claymation инкарнација на овој при што ќе ги имаат само две променливи, малку кружни парчиња од глина, кои можат да се сместат променливи, но како на завиткани стрели укажуваат на тоа, тие не се всушност укажува до насекаде познат по себе. Па тогаш имавме оваа линија, и тоа беше ново, минатата недела, Примерок за меморија распределба, што е само стилизиран начин на раскажување на оперативниот систем, Линукс или Mac OS или Windows, еј, дај ми некои меморија, и сè што треба да се каже на оперативниот систем е тоа што кога прашува за меморија. Тоа не се случува тоа што се грижи ви се случува да се направи со неа, но вие не треба да му кажете на оперативниот систем што по пат на Примерок. Да? ПУБЛИКАТА: Колку? Дејвид MALAN: Колку? Колку во бајти, и да е така, ова, повторно, добро смислена пример, е само велејќи, дај ми на големината на int. Сега, големината на int е четири бајти или 32 бита. Така што ова е само начин на велејќи дека, еј, оперативен систем, ми даде четири бајти меморија дека можам да користам на располагање, и посебно, она што го прави Примерок враќање во однос да дека парче од четири бајти? ПУБЛИКАТА: адреса? Дејвид MALAN: На адреса. Адресата на дека парче од четири бајти. Токму така. И така тоа е она што се чуваат во крајна линија во x и тоа е причината зошто ние навистина не гајле што бројот на кои адреса е, без разлика дали е или OX1 OX2 или некои криптичната хексадецимална адреса. Ние само се грижат сликовито дека таа променлива x е сега покажувајќи на оваа парче на меморија. Па стрелката претставува покажувач, или поконкретно, адреса на меморијата. Но, повторно, ние не обично се грижат кои се тие вистинските адреси се. Сега, оваа линија, вели што во однос лаик? Ѕвезда х добива 42 запирка. Што значи ова? Сакате да одите? Не нула вратот. ПУБЛИКАТА: Адресата на x е на 42. Дејвид MALAN: Адресата на x е на 42. Не сосема. Толку блиску, но не сосема, бидејќи има ѕвездата која е префиксот овој х. Значи ние треба да tweak малку. Да? ПУБЛИКАТА: Вредноста дека покажувачот x е да се покажува кон е 42. Дејвид MALAN: Во ред. Вредноста што покажувачот x е укажува на, да речеме, ќе биде 42, или поинаку кажано, ѕвездата x вели, да одат во која било адреса е во х, без разлика дали е 1 Оксфорд Улица или 33 Оксфорд Стрит или OX1 или ox33, без оглед на дека нумерички адреса е, ѕвезда x е dereferencing на x. Па оди на таа адреса и потоа го ставаат на бројот 42 таму. Така што ќе биде еквивалент начин да се каже тоа. Па тоа е во ред, а потоа ќе претставуваат слика на следниов начин каде што додадовме од 42 до дека парче на четири бајти на десната рака, но оваа линија беше местото каде што работите отиде криво и главата Binky е појави надвор во овој момент, бидејќи лоши работи се случуваат кога ви dereference вредности ѓубре или можете dereference неважечки покажувачи, и велам неважечки бидејќи во овој момент во приказна, она што е внатре на y? Што е вредноста на y базирана на изминатите неколку чекори? Да? Што е тоа? ПУБЛИКАТА: адреса. Дејвид MALAN: адреса. Тоа треба да биде адреса но јас го иницијализиран? Па јас се уште не го имаат. Значи она што е познато да биде таму? Тоа е само некои вредност на ѓубрето. Тоа може да биде било која адреса од нула до 2 милијарди ако имате две свирки на RAM меморија, или нула до 4 милијарди ако сте доби четири гигабајти RAM меморија. Тоа е некоја вредност ѓубре, но проблемот е во дека на оперативниот систем, ако тоа не ти даде дека парче меморија конкретно дека се обидуваш да се оди, тоа е обично ќе предизвика она што ние сме виделе како дефект на сегментација. Така, всушност, било кој од вас кои имаат провлекував проблеми на работното време или во проблеми, тоа е повеќе обично со обидувам да дознаам сегментација вина, што обично значи сте допирање еден сегмент од меморија која не треба да биде. Сте допирање меморија која оперативниот систем не е е дозволено да се допре, без разлика дали е со одење предалеку во својата низа или да започнат веднаш, без разлика дали тоа е затоа што сте се допира меморија што само е некоја вредност за отпадоци. Притоа ѕвезда х тука е вид на недефинирано однесување. Никогаш не треба да го прават тоа затоа коефициенти се, на програмата е само случува да се сруши, затоа што си ти што зборуваш, на оваа адреса а вие немате идеја каде таа адреса всушност е. Па на оперативниот систем е веројатно ќе се сруши вашата програма како резултат на тоа и навистина, тоа е што се случи таму да Binky. Па на крајот, Binky фиксна овој проблем со тоа. Така што самата програма беше грешка. Но, ако сте вид на движам и извршување на оваа линија, наместо тоа, y е еднаков х само значи дека без оглед на адреса е Х, исто така, го стави во y. И така сликовито, ние сме отсликуваа оваа со две стрелки од x и y од покажување на истото место. Па семантички, x е еднаква на y, бидејќи и двете од овие складирање на истиот адреса, ergo посочувајќи на 42, и сега, кога ќе се каже ѕвезда y, одете на адресата во y, ова има една интересна ефект. Па ја адресата во y е истото како и адреса во х. Па ако може да се каже да одат на адреса во y и промена на вредноста на 13, кој друг ќе влијае? X е, точката D, така да се каже, треба да бидат погодени, како и. И навистина, како Ник нацрта оваа слика во claymation беше токму тоа. И покрај тоа што го следат на покажувачот y, ние заврши на истото место, и така ако ние требаше да се печати надвор x или y pointee е, тогаш ќе се види вредноста на 13. Сега, велам pointee да биде во согласност со видео. Програмери, во мојата знаење, всушност никогаш не каже зборот pointee, она што се посочува во, но за конзистентност со видео, да сфатат тоа е се што беше значи во таа ситуација. Така било какви прашања за claymation или покажувачи Примерок или само уште? Не? Во ред. Значи без понатамошно ado, ајде да ги разгледаме од каде што тоа е всушност се користат за некое време. Па имавме оваа библиотека CS50 тоа е мора сите овие функции. Сме користи GetInt многу, GetString, веројатно GetLongLong порано во мојата pset еден или така, но она што всушност се случува? Па, ајде да се земе брз поглед под хаубата на програма со која инспирира зошто ние ви даде на CS50 библиотека, и навистина како на минатата недела, почнавме преземање на тие обука тркала исклучени. Па ова сега е сортирана на посмртна на она што се случува во библиотеката CS50, и покрај тоа што сега ќе почнат да се движат подалеку од тоа за повеќето програми. Значи ова е програма наречена scanf 0. Тоа е супер краток. Тоа само ги има овие линии, но тоа воведува функција наречена scanf дека ние сме всушност ќе се види во момент во внатрешноста на библиотеката CS50, иако во малку поинаква форма. Значи оваа програма на линија 16 е прогласување на променлива x. Па ми даде четири бајти за int. Тоа е се кажува на корисникот, Ве молиме број, а потоа ова е една интересна линија која всушност ги врзува последната седмица и ова. Scanf, а потоа забележите дека е потребно формат низа, исто како printf, % i значи int, и тоа трае Вториот аргумент кој изгледа малку фанки. Тоа е симболот x, и да се потсетиме, ние само го виде тоа уште минатата недела. Што значи симболот х претставуваат? Што значи симболот направи во Ц? Да? ПУБЛИКАТА: Адресата на. Дејвид MALAN: Адресата на. Па тоа е токму спротивното на операторот на ѕвезда, со оглед на операторот на ѕвезда вели, одете на оваа адреса, на симболот на операторот вели, дознаам адреса на оваа променлива, па така ова е клучна, бидејќи Целта scanf во животот е за скенирање на корисникот влез од тастатура, во зависност од она што тој или таа видови, а потоа читаат внесување дека корисникот со променлива, но ние видовме во изминатите две недели дека swap функција која се обиде да се спроведе без никаков напор беше само скршени. Сетете се дека со функција на размената, ако ние само прогласи А и Б како ints, ние успешно се разменуваат со две променливи во внатрешноста на swap Исто како и со млеко и ОВ, но штом трампа врати, каков беше резултатот во однос да x и y, оригиналниот вредности? Ништо. Је. Ништо не се случи тоа време, бидејќи свопови смени свој локалните копии, а тоа е да се каже, сите ова време, кога имаме се поминува во аргументите да функционира, ние сме само поминуваат копии од тие аргументи. Можете да го направите со тоа што сакате со нив, но тие се случува да немаме да влијаат на оригинални вредности. Значи ова е проблематично ако сакаат да имаат функција како scanf во животот, чија цел е да ги скенира внес на корисникот од тастатурата а потоа се пополни во празни места, па за да зборувате, што е, да даде како променлива x вредност, затоа што ако јас се само да го помине на X да scanf, ако сметате дека логиката на минатата недела, scanf може да прави што сака со копија на X, но тоа не може постојано се менува, освен ако не им даде на x scanf мапа на богатство, така да се каже, каде што х означува место, при што ние помине во адресата на x, така што scanf можат да одат таму, а всушност се промени вредноста на x. И така навистина, сите дека оваа програма не ако јас се направи scanf 0, во мојот извор Директориум 5м, направи scanf 0, дот црта scanf, број Ве молиме 50, благодарение на 50. Па тоа не е се што се интересни, но она што е навистина се случува е дека веднаш штом ќе се јавам scanf тука, вредноста на x се постојано е изменета. Сега, ова изгледа убаво и добро, и всушност, тоа се чини дека ние навистина не треба CS50 библиотека на веќе сите. На пример, ајде да се кандидира ова уште еднаш тука. Дозволете ми да го отвори за една секунда. Ајде да се обидеме број молам и наместо да се каже 50 како порано, ајде да се каже не. Во ред, тоа е малку чудно. ВО РЕД. И само некои глупости овде. Па тоа не чини да се се справи со погрешни ситуации. Значи ние треба да се минимално почеток додавање на некои грешка проверка за да бидете сигурни дека корисникот внесе во вистински број како 50, бидејќи очигледно пишување зборови не е откриен дека се проблематични, но тоа веројатно треба да биде. Ајде да погледнеме во оваа верзија сега тоа е мојот обид да reimplement GetString. Ако scanf има сето ова функционалност изградена во, зошто сме биле dabbling со овие обука тркала како GetString? Па, тука е можеби мојата едноставна верзија на GetString при што пред една недела, јас може да се рече, дај ми низа и го нарекуваат тампон. Денес, јас ќе одам да се почне само велејќи знак ѕвезда, која, да се потсетиме, тоа е само синоним. Тоа изгледа пострашно, но тоа е иста работа. Па ми даде променлива наречена тампон на што се случува да се сместат на стринг, кажете стрингот корисник, ве молам, а потоа, како и порано, ајде да се обидеме да ги позајмите, оваа лекција scanf % s ова време, а потоа положи во тампон. Сега, брза проверка разумност. Зошто сум велејќи дека не симболот тампон ова време? Заклучиме од претходниот пример. ПУБЛИКАТА: Шар ѕвезда е покажувачот. Дејвид MALAN: Точно, бидејќи овој пат, знак Ѕвездата е веќе покажувач, адреса, по дефиниција на таа ѕвезда се таму. И ако scanf очекува на адреса, доволно е само да се помине во тампон. Јас не треба да се каже симболот со тампон. За љубопитни, може да ги направи нешто како ова. Тоа ќе има различно значење. Ова ќе ви даде покажувач на покажувач, што е, всушност, валидна нешто во C, но за сега, ајде да ја задржиш едноставен и да ја задржите приказната доследни. Јас сум само ќе се случи во тампон и тоа е точно. Проблемот иако е ова. Дозволете ми да оди напред и да ја извршите оваа програма по нејзиното изготвување. Направи scanf 1. По ѓаволите, мојот компајлерот фати мојата грешка. Дај ми една секунда. Ѕвекот. Да речеме scanf-1 в. ВО РЕД. Таму ќе одиме. Ми треба. CS50 проект има различни прилагодувања за конфигурација што ќе се заштитат од себеси. Ми требаше да ги оневозможите страна водење ѕвекот рачно тоа време. Па низа молам. Одам да се оди напред и да напишеш во мојата омилена свет здраво. Добро, нула. Тоа не е она што го напишале. Така, тоа е показател за нешто да се биде во ред. Дозволете ми да оди напред и да напишеш во една навистина долга низа. Ви благодариме за ништовни и не знам ако јас одам да се биде во можност да го сруши. Ајде да пробаме малку копија ставете и да видиме дали ова ви помага. Само да се залепите за многу за тоа. Тоа е дефинитивно поголем низа од вообичаеното. Ајде само навистина го напише. Бр По ѓаволите. Командата не е пронајдена. Значи тоа е не се поврзани. Тоа е затоа што јас пејст некои лоши ликови, но ова Излегува не е оди на работа. Ајде да се обидеме ова повеќе пати, бидејќи тоа е позабавно ако ние всушност го сруши. Ајде да напишеш ова и сега, јас сум ќе копирате навистина долга низа И сега ајде да видиме дали можеме може да се сруши оваа работа. Забележиш јас изоставени простори и нови линии и запирки и сите фанки карактери. Влезе. А сега на интернет е само да се биде бавен. Се одржа надолу команда-V предолго, јасно. По ѓаволите! Командата не е пронајдена. ВО РЕД. Па, поентата е сепак следниве. Значи она што навистина се случува на со оваа декларација на char ѕвезда тампон на линија 16? Значи она што сум јас добивам кога Изјавувам покажувач? Сите јас сум добивање на е четири byte вредност на наречен тампон, но она што е во него во моментот? Тоа е само некои вредност на ѓубрето. Бидејќи секое време ви се декларирате променлива во C, тоа е само некои вредност на ѓубрето, и ние сме почнуваат да патување во текот на оваа реалност. Сега, кога ќе ти речам scanf, на оваа адреса и да се стави она што на корисникот видови. Ако корисникот видови здраво свет, добро, каде можам да го стави? Тампон е вредност за отпадоци. Значи, тоа е вид на како стрела кој укажува кој знае каде. Можеби тоа е посочувајќи токму тука, во моето сеќавање. И така, кога на корисникот видови во здраво светот, на програмата се обидува да се стави на стринг Здраво светот црта 0 во таа парче меморија. Но со голема веројатност, но Јасно е дека не 100% веројатност, компјутер ќе несреќа тогаш на програмата, бидејќи ова не е меморија јас треба да им биде дозволено да се допре. Значи на кратко, оваа програма е недостатоци за токму од таа причина. Јас во основа не го правам она што? Кои чекори пропуштив, исто како и ние испуштени со првиот пример Binky е? Да? ПУБЛИКАТА: алокација на меморијата? Дејвид MALAN: алокација на меморијата. Јас не се всушност наменети меморија за било која низа. За да можеме да го надминете овој во неколку начини. Еден, ние може да биде едноставно и всушност, сега сте ќе почне да ја видите замаглување на линиите помеѓу она што низа е, што е низа, што е знак ѕвезда е, она што низа на карактери е. Еве втор пример вклучуваат жици и известување сите што го направив на линија 16 е, наместо да се каже тампон ќе биде знак ѕвезда, покажувач кон парче меморија, Одам да се даде многу проактивно си тампон за 16 знаци, и во Всушност, ако сте запознаени со терминот визуелниот, најверојатно од светот на видео клипови, каде што видео е визуелниот, визуелниот, визуелниот. Па, што е врската тука? Па, внатрешноста на YouTube и во внатрешноста на видео плеери генерално е низа што е многу поголемо од 16. Тоа би можело да се низа на големината на еден мегабајт, а можеби и 10 мегабајти, и во таа низа прави вашиот интернет пребарувач преземете целиот куп на бајти, целиот куп на мегабајти видео и видео плеерот, На YouTube или кој и да е, ќе почне читање на бајти од таа низа, и во секое време можете да го видите Зборот визуелниот, визуелниот, тоа значи дека играчот има добивано и до крајот на таа низа. Мрежата е толку бавно што тоа не се случило полни низа со повеќе бајти и така ќе бидете надвор од битови за прикажување на корисникот. Така тампон е соодветен термин тука во таа тоа е само низа, еден дел од меморијата. И ова ќе го поправам бидејќи излегува кои може да се третираат како низи тие се адреси, иако тампон е само симбол, тоа е секвенца од знаци, тампон, тоа е корисно за мене, програмер, може да помине околу името како и покрај тоа што беа покажувач, како и покрај тоа беа на адреса на парче меморија за 16 карактери. Значи, тоа е да се каже, јас може да се помине на scanf токму тој збор И така сега, ако јас се направи оваа програма, направи scanf 2, точка црта scanf 2, и тип во здраво светот, Внесете, дека time-- Хм, што се случило? Стринг молам. Што направив погрешно? Здраво светот, тампон. Здраво свету. Ах, знам што таа го прави. ВО РЕД. Па тоа е до читање до првиот простор. Па ајде да лажеш за само еден миг и велат Сакав само да пишувате нешто навистина долго како оваа е долга затворска тоа е еден, два, три, четири, пет, шест, седум, осум, девет, 10, 11, 12, 13, 14, 15, 16. ВО РЕД. Тоа е навистина долга казна. Значи оваа реченица е подолг од 16 карактери и така кога ќе притиснете Enter, што ќе се случи? Па, во овој случај на приказна, јас го прогласи тампон за да всушност се низа со 16 карактери подготвени да одите. Така еден, два, три, четири, пет, шест, седум, осум, девет, 10, 11, 12, 13, 14, 15, 16. Па 16 знаци, а сега, кога ќе читаат во нешто како ова е долг казната, што ќе се случи е што јас ќе одам да се прочита во тоа е долг S-E-N-T-E-N-C-E, реченица. Значи ова е намерно лоша работа што сум задржи пишување надвор од границите на мојот низа, надвор од границите на мојот тампон. Можев да добиете среќа и програмата ќе продолжи да работи и да не се грижи, но општо земено, ова навистина ќе несреќа мојата програма, и тоа е грешка во мојата кодот моментот јас чекор надвор од границите на таа низа, бидејќи јас не знам дали тоа е нужно ќе се сруши или ако јас сум само ќе имаат среќа. Значи ова е проблематично, бидејќи во овој случај, тоа изгледа да се работи и ајде да примамат судбина тука, иако ИРО чини да се толерира доста of-- Таму ќе одиме. Конечно. Па јас сум единствениот кој може да се види тоа. Па јас само имаше многу забава пишување надвор навистина долго вистинските фраза дека тоа сигурно надмината 16 бајти, бидејќи јас внесе во оваа луда долго мулти-линија фраза, а потоа се забележи она што се случило. На програмата се обиделе тоа печатење а потоа доби дефект на сегментација и маани сегментација е кога вакво нешто се случува и на оперативниот систем, вели не, не може да го допре тоа сеќавање. Ние ќе треба да се убие програмата целосно. Па ова изгледа проблематично. Сум се подобри програмата со која барем да имаат некои меморија, но ова се чини да се ограничи функцијата GetString за добивање низи од некои конечни должина 16. Значи, ако сакате да го поддржи повеќе речениците од 16 знаци, што правиш? Па, можете да се зголеми Големината на овој тампон до 32 или дека чини вид на кратко. Зошто не можеме само да се направи тоа 1.000 но притисни назад. Што е одговорот на интуитивно само да се избегне овој проблем, со тоа што мојот тампон поголема, како и 1.000 карактери? Со спроведување getstring овој начин. Што е добро или лошо во оваа ситуација? Да? ПУБЛИКАТА: Ако преврзат многу на просторот и да не го користат, тогаш не може да се реалоцираат тој простор. Дејвид MALAN: Апсолутно. Тоа е неефикасен доколку ако не всушност се потребни 900 од оние бајти а сепак си прашува за 1.000 во вкупен сепак, ти си само конзумирање на повеќе меморија на компјутерот на корисникот, отколку што треба, и на крајот на краиштата, некои од веќе сте наишле во животот дека кога сте работи многу програми и тие се јаде многу меморија, ова всушност може да влијае на извршувањето и искуството на корисникот на компјутерот. Значи, тоа е вид на мрзливи решение, сигурно, и обратно, тоа не е само непотребно, што проблем останува, дури и ако можам да направам мојот тампон 1.000? Да? ПУБЛИКАТА: Низата е должина 1.001. Дејвид MALAN: Токму така. Ако вашиот стринг е должина 1.001, имате исти проблем, а од страна на мојот аргумент, јас би токму тогаш се направи 2000, но не знаете во унапредат колку е голема тоа треба да биде, а сепак, јас мора да го компајлирате мојата програма пред најмување луѓе ги користат и да ја преземете тоа. Значи ова е токму оној вид на работи дека библиотеката обидува CS50 да ни помогне со и ние ќе само поглед во некои од основните имплементација тука, но ова е CS50 точката C. Ова е датотеката што е создадено на CS50 ИРО сите овие недели, кои сте биле со. Тоа е пред-состави и сте бил го користите автоматски по природа на постоење на цртичка L CS50 знаме со ѕвекот, ако, пак, дојдете преку сите овие функции, тука е GetString, и само да ви даде вкусот на она што се случува, да го земеме еден брз поглед на релативна комплексност. Тоа не е супер долг функција, но ние не сме мора да се мисли тешко за сите како да се обратите за добивање на жици. Значи тука е мојот тампон и јас очигледно тоа се иницијализира на нула. Ова, се разбира, е истото како знак ѕвезда, но решив во спроведување на библиотеката CS50 дека ако ние се случува да се биде целосно динамичен, Јас не се знае однапред колку е голема на стринг корисници се случува да сакаат да се добие. Па јас ќе одам да се започне само со празен стринг а јас ќе одам да се изгради како многу меморија, како јас треба да се вклопи во низа на корисникот а ако немам доволно, јас ќе одам да прашам оперативниот систем за повеќе меморија. Одам да се движат кон својата низа во поголема парче меморија а јас ќе одам да се пушти на слобода или ослободување на недоволно голем дел од меморијата и ние сме само ќе да го направите ова iteratively. Па еден брз поглед, тука е само променлива со што јас ќе одам да ги пратите на капацитетот на мојот тампон. Колку бајти можам да се вклопи? Еве една променлива n со што јас ќе одам да се задржи пратите на колку бајти се всушност во тампон или дека корисникот има отчукува. Ако не сте виделе тоа порано, може да се каже дека со променлива како int е непотпишана, која како што сугерира името, значи тоа е не-негативен, и зошто би Што некогаш сум сакаат да се мачат специфицирање дека не е само int int, но тоа е една непотпишана int? Тоа е не-негативни Инт. Што значи [Беззвучен] значи? ПУБЛИКАТА: Тоа е опишување износ на меморија, која може да биде [Беззвучен]. Дејвид MALAN: Да. Значи, ако јас кажам непотпишана, ова е всушност кои ви даваат еден малку на дополнителна меморија и се чини вид на смешно, но ако има една малку на дополнителни меморија, која значи дека ќе имаат два пати повеќе вредности можете да ја застапува, поради тоа што може да биде 0 или 1. По правило, на int може да се грубо негативни 2 милијарди целиот пат до позитивен 2 милијарди долари. Ова се големи се движи, но тоа е уште вид на непотребното ако само се грижат за големини, кои само интуитивно треба да биде не-негативен или позитивна или 0, добро тогаш, зошто се трошат 2 милијарди можни вредности за негативни броеви ако никогаш не се случува да ги користите? Значи, велејќи непотпишана, сега мојот int може биде помеѓу 0 и околу 4 милијарди долари. Значи тука е само на int C за причини ние нема да се влезе само сега како зошто тоа е, наместо на int на знак, но тука е суштината на она што се случува на, а некои од вас може да се користат, на пример, fgetc функцијата, дури и во pset четири или после тоа, ние ќе го видите повторно во проблем во собата пет, fgetc е убаво, бидејќи како што е името вид на, вид arcanely сугерира, тоа е функција која добива лик и така, што е фундаментално различно за она што го правиме во GetString е тоа што не сте користење scanf на ист начин. Ние само се прикрадуваат чекор-по-чекор над она што корисникот го внеле во, затоа што секогаш може да одвои еден знак, и така ние може секогаш безбедно погледнете на еден знак во еден момент, и магијата започнува да се случува тука. Одам да се движите надолу да до средината на оваа функција само за да се запознаам накратко оваа функција. Слично како таму е Примерок функција, има функција realloc каде realloc Ви овозможува да се реалоцираат на парче меморија и да ја направат поголеми или помали. Па скратам приказната и со еден бран на мојата рака, за денес, се знае дека она GetString е тоа е тоа е вид на магично расте или намалување на тампон како корисник видови во неговиот или нејзиниот низа. Па ако корисникот впишува кусата низа, овој код само издвојува доволно меморија за да ги собере на стрингот. Ако корисникот го задржува пишување како што јас повторно и повторно тоа го правеше и повторно, и, ако тампон првично овој голем а програмата ќе сфати, да се почекајте една минута, јас сум надвор од просторот, тоа се случува да се зголеми двојно на големината на пуфер а потоа се удвои големината на баферот и кодот што го прави двојно зголемување, ако ја гледаме тука, тоа е само овој умен една лагер. Вие не може да се гледа оваа синтакса пред тоа, но ако ви кажам ѕвезда е еднаква, ова е исто што и велејќи пати капацитет 2. Па тоа само продолжува удвојување капацитетот на баферот а потоа го кажувам realloc да им даде самата дека многу повеќе меморија. Сега, како настрана, таму и други функции во тука дека ние нема да се погледне во секој детал освен да се покаже во GetInt, ние ги користиме во GetString GetInt. Ние се провери дека тоа не е ништовни, која, да се потсетиме, е посебна вредност што значи дека нешто не беше во ред. Ние сме надвор од меморија. Подобро да се провери за тоа. А ние се врати на вредност стража. Но, јас ќе се одложи на коментарите како да зошто, а потоа ние ги користиме оваа братучед на scanf наречен sscanf и испоставува дека sscanf, или стринг scanf, Ви овозможува да ги погледнеме на линија која корисникот ги внеле во и нека се анализира тоа во суштина и што сум прави тука е јас кажувам sscanf, се анализира она што корисникот има внеле во и бидете сигурни дека% i, таму е цел број во неа, а ние нема да се влезе денес точно зошто таму е исто така на% c тука, но тоа во мало страница ни се да се открие ако корисникот има отчукува во нешто лажен по број. Така од причина што GetInt и GetString ти кажам да се обидете повторно, обидете се повторно, обидете се повторно е затоа што на сите тој код сме писмени, тоа е вид на гледање на внес на корисникот во што си сигурен што е сосема нумерички или тоа е вистински лебдат точка вредност или слично, во зависност од она што вредност функционираат што го користите. Whew. ВО РЕД. Тоа беше еден залак но поентата тука е дека причината моравме оние кои се на обука тркала е затоа што на најниското ниво, има само толку многу работи кои може да тргне наопаку што сакавме да превентивно справи тие работи, секако, во Најраните недели на класата, но сега со pset четири и пет и pset надвор ќе видите дека тоа е повеќе до вас, но, исто така, ти си повеќе способен за решавање на овие видови на проблеми себе. Било какви прашања во врска со GetString или GetInt? Да? ПУБЛИКАТА: Зошто и вие ќе се удвои капацитетот на баферот а не само зголемување тоа со точниот износ? Дејвид MALAN: Добро прашање. Зошто ние би го удвои капацитетот на тампон за разлика само да го зголеми од страна на некои константна вредност? Тоа беше одлука на дизајн. Ние само одлучи дека поради тоа се стреми да да биде малку скапо време-мудро да се побара на оперативниот систем за меморија, ние не сакате да се заокружи навлегува во ситуација за големи низи кои ги поставуваа повторно и повторно на оперативниот систем и повторно и повторно во набрзо едноподруго за меморија. Па ние само одлучи, донекаде произволно но се надеваме разумно, дека, знаеш што, ајде обидете се да се понапред од нас и треба постојано да се двојно зголемување, така што ние се намали износот на време ние сме за да се јавите или Примерок realloc, туку целосна пресуда јавите во отсуство на знаејќи она што корисниците би сакале да напишете. Двата начини може да биде спорно. Веројатно добро. Па ајде да ги разгледаме во неколку на други несакани ефекти на меморија, нешта што може да тргне наопаку и алатки кои можете да ги користите за да се фати на овие видови на грешки. Излезе на сите вас, иако check50 не ти реков колку, се пишува кабриолет код од една недела, дури и ако сите тестови се check50 поминаа, па дури и ако вие и вашиот ТФ се супер убедени дека Вашиот код за работи како што треба. Вашиот код е кабриолет или недостатоци затоа сите вас, за користење на библиотеката CS50, биле протекување меморија. Вие ги баравте оперативниот систем за меморија во повеќето од програми што сте го напишале, но сте всушност никогаш не им ја вратиме. Сте повика GetString и GetInt и GetFloat, но со GetString, сте никогаш наречен unGetString или Испрати Стринг назад или слично, но ние сме виделе дека GetString прави алоцирам меморија по пат на Примерок или ова функција realloc, што е само многу слични во духот, а сепак, ние сме биле поставување на оперативниот систем за меморија и меморијата повторно и повторно но никогаш не ја даваат назад. Сега, како настрана, излегува дека кога на програмата се откажа, сите на меморија е ослободен автоматски. Па тоа не е е голема работа. Тоа не се случува да се скрши IDE или забават работите надолу, но кога програми прават генерално меморија излегуваат во јавноста и тие се работи за долго време. Ако некогаш сте виделе глупави малку плажа топката во Mac OS или песочен часовник на Windows, каде тоа е вид на забавување или размислување или размислување или само навистина почнува за да се одолговлечи, тоа многу веројатно може да биде резултат на меморија излегуваат во јавноста. Програмери кои пишувале на софтверот што го користите побара од оперативниот систем за меморија на секои неколку минути, секој час. Но, ако сте водење на софтвер, па дури и ако тоа е минимизиран во вашиот компјутер за неколку часа или денови без крај, може да се бара за повеќе и повеќе меморија и никогаш всушност го користат и така вашиот код да биде, или програми може да биде протекување меморија, и ако почнете да излегуваат во јавноста меморија, има помалку меморија за други програми, а ефектот е да се бавно се надолу. Сега, ова е далеку еден од најмногу крволочен програми ќе имаат можност да се кандидира во CS50 доколку како своето производство е дури и повеќе од езотеричните ѕвекот или направат, ниту пак од командата програми линија сме се кандидира, но пред за среќа, вградени во своето производство е некои супер корисни совети кои ќе биде корисно ниту за pset четири или секако pset пет. Па valgrind е алатка кои можат да се користат да се погледне за меморија протекување во вашата програма. Тоа е релативно едноставно да се кандидира. Трчате valgrind а потоа, дури и иако тоа е малку опширниот, цртичка проверка цртичка течење еднаква со полно, а потоа и точка црта и името на вашата програма. Valgrind па потоа ќе ја изршува вашата програма и на самиот крај на вашата програма работи пред да го поднесе оставка и ви дава уште една брза, тоа се случува да се анализира вашиот програма, а тоа е да се кандидира и да ти кажам да си излегуваат во јавноста било меморија и уште подобро, си те допрам меморија која не му припаѓала на вас? Тоа не може да се фати сè, но тоа е прилично добар во фаќање на повеќето работи. Па еве еден пример на мојот има рок оваа програма, со рок valgrind, на програма наречена меморија, а јас ќе одам да се потенцира на линии, кои се на крајот од интерес за нас. Па таму е дури и повеќе одвлекување на вниманието што сум ги брише од слајд. Но ајде да видиме што тоа програмата е во состојба да ни кажува. Тоа е во состојба да ни кажува работи како валиден запишување на големина од 4. Со други зборови, ако те допрам меморија, конкретно 4 бајти меморија дека не треба да има, valgrind да ви кажам дека. Валиден запишување на големина од 4. Ти се осврна и четири бајти дека не треба да има. Каде ќе го направите тоа? Ова е убавината. Дот меморија в линија 21 е местото каде што зезнав и тоа е причината зошто тоа е од корист. Слично како GDB, може да помогне ви точка во вистинската грешка. Сега, ова е малку повеќе опширниот, ако не и збунувачки. 40 бајти во 1 блокови се дефинитивно изгубени во загуба рекорд 1 од 1. Што значи тоа? Па, тоа само значи дека ќе побара 40 бајти и никогаш не го даде назад. Те повика Примерок или ќе се нарекува GetString и на оперативниот систем ви 40 бајти, но ти никогаш не даде ослободен или ослободена дека меморијата, и да бидат фер, ние никогаш не сум се покаже како да му ја врати меморијата. Излегува има супер едноставна функција наречена бесплатно. Зема еден аргумент, она сакате да се ослободи или да му ја врати, но 40 бајти, очигледно, во оваа програма биле изгубени на линија 20 од меморија точка в. Да видиме оваа програма. Тоа е супер бескорисни. Тоа само покажува ова особено грешка. Па ајде да ги разгледаме. Тука е главниот и главната, известување, повици функција наречена ѓ а потоа се враќа. Па не се сите толку интересно. Што значи ѓ направам? Известување јас не се мачат со прототип. Сакав да се задржи на кодот минималното можно. Па да го ставам ѓ над главниот и тоа е во ред, се разбира, за кратки програми се допаѓа ова. Па ѓ не враќа ништо и го прави тоа не се ништо, но тоа не го направите тоа. Изјавува, многу сличен на во примерот Binky, покажувач наречен X кој ќе за чување на адресата на int. Па тоа е од левата рака. На англиски јазик, што е десната страна се прави? Некој? Што е тоа го прават за нас? Да? ПУБЛИКАТА: [Беззвучен] пати поголема од големината на int што е за 10 пати поголема од таа [Беззвучен] Дејвид MALAN: Добар и дозволете ми да резимираме. Па одвои доволно простор за 10 броеви или 10, што е големината на int, тоа е четири бајти, па 10 пати 4 е 40, така што десната страна што сум потенцираат е ми даде 40 бајти и чување на адресата на првиот бајт во х. И сега на крај, и тука е местото каде оваа програма е кабриолет, што е во ред со линијата 21 врз основа на таа логика? Што има лошо во линија 21? Да? Публика: Вие не може да индекс во х [Беззвучен]. Дејвид MALAN: Да. Јас не треба индекс во х допаѓа. Па синтаксички, тоа е во ред. Што е убаво е, многу како тебе може да се третираат на името на низа како да е покажувач, слично може да ви се третираат покажувач како да е низа, и да можам да се синтаксички велат х Држач нешто, х заградата јас, но 10 е проблематична. Зошто? ПУБЛИКАТА: Поради тоа што не е внатре. Дејвид MALAN: Тоа не е внатре дека парче на меморија. Што е најголемата вредност што треба да се да се доведува во оние квадратни загради? 9, од 0 до 9. Затоа што на нула индексирање. Па од 0 до 9 ќе биде во ред. Држач за 10 не е добро и но, да се потсетиме, иако, во секое време Ми се чини дека да се обиде да направи CS50 ИРО несреќата со впишување лажни вредности, тоа не секогаш соработуваат, и навистина, често ќе имаат среќа, само затоа што оперативниот систем не забележите дека некогаш толку малку поминат некои парче на меморија, затоа што останаа во технички Вашиот сегмент, но повеќе за тоа во оперативни системи класа, и така нешто како ова многу лесно може да остане незабележано. Вашата програма никогаш не се случува да се сруши доследно но можеби еднаш во некое време. Па ајде да се обидеме valgrind за ова, и тука е каде што ќе се преоптовари од страна на излез моментално. Така бидете меморија чек valgrind течење еднаква со целосни точки коса црта меморија. И еве зошто јас ветувам ова ќе победат. Еве што valgrind, тука е она што програмер, неколку години ago- одлучи дека ќе биде добра идеја за излез да изгледа. Значи, да се направи смисла на тоа. Па сите на патот на левата рака страна без добра причина е ID на процес на програмата ние едноставно се кандидира, единствениот идентификатор за програмата ние само се стрча. Ние избришани дека од слајд, но има и е некои корисни информации тука. Ајде да дојдете до самиот врв. Тука е местото каде што почна. Па тоа не е на сите дека многу излез. Еве што пишуваат неважечки на големината на 4 на линија 21. Па, она што е на линија 21? Линија 21 е точно ова и тоа го прави смисла дека јас сум во валидно пишување 4 бајти, бидејќи јас сум во обид да се стави овој број, што би можело да биде ништо, тоа само се случува да биде нула, но јас се обидувам за да го стави на локација дека не му припаѓа на мене. Згора на тоа, овде долу, 40 бајти во една Блоковите се дефинитивно изгубени во рекордни 1. Тоа е затоа што кога ќе се јавам Примерок тука, јас никогаш не се ослободи меморија. Па како можеме да го надминете овој? Дозволете ми да оди напред и да биде малку побезбедни и направи 9 таму и нека ме тука слободно х. Ова е новата функција за денес. Ако јас сега повторување направи меморија точка коса црта, Ајде да се кандидира valgrind повторно на неа, зголеми мојот прозорец и притиснете Enter. Сега, тоа е добро. Тие ги закопа добрата вест Во сето ова производство. Сите грамада блокови беа слободни. Ние ќе се вратам на она што грамада е, но нема протекување се е можно. Така што ова е само уште една алатка за вашата алатка комплет со која можете да почнете да се најдете грешки сега како тоа. Но, ајде да видиме што повеќе може да тргне наопаку тука. Ајде сега да транзиција всушност решавање на некој проблем. Како настрана, дали ова ќе се ослободат малку конфузија или напнатост, ова сега е смешно. Је. Тоа е прилично добро. Бидејќи покажувачи се и адреси обично се по конвенција напишани со хексадецимален. Ха, ха, ова е смешно сега. Во секој случај, па ајде сега всушност се реши проблемот. Ова е супер, супер ниско ниво досега, и ние, всушност, може да направи корисни работите со овие детали на ниско ниво. Па ние се воведе неколку недели пред поимот низа. Низа е убаво, бидејќи тоа е тешко да се исчисти нашите код бидејќи ако сакаме да се напише програма со повеќе студенти или повеќе имиња и куќи и домови и колеџи и сето тоа, сè што ние би можеле да се сместат повеќе демонтирани во внатрешноста на низа. Но, предложи една лоша на низа досега. Дури и ако не сте ја претрпеле себе во програма, само инстинктивно, она што е лоша работа за низа, можеби? Слушнав дека некои шумови. ПУБЛИКАТА: Тоа е тешко за промена на големината. Дејвид MALAN: Тоа е тешко за промена на големината. Вие не може да ја смените големината на низа, всушност, само по себе во C. Може да се доделат уште низа, се движи сè од стариот во новата, а сега има некои екстра простор, но тоа не е како јазик како Java или Пајтон или било кој број на други јазици со што некои од вас може да биде запознаен, каде што може само да ја задржите додавањето на работите ad nauseam до крајот на низа. Кога ќе имаат низа на големина 6, што е нејзината големина, и толку многу се допаѓа идејата претходно има пуфер на одредена големина, мора да се погоди од портата Кој големина сакате тоа да биде? Ако се погоди премногу голема, ти си губи простор. Ако се погоди премногу мал, не може да се сместат тие податоци, најмалку без многу повеќе работа. Така, денес, благодарение на покажувачи, можеме почне прикрпувањето нашите сопствени структури на податоци, и во Всушност, тука е нешто што изгледа малку повеќе криптичната на прв поглед, но тоа е она што ние ќе го наречеме поврзан листа, а нејзиното име вид на сумира тоа. Ова е листа на броеви, или во овој случај, листа на броеви, но тоа би можело да биде листа со ништо, но тоа се поврзани заедно со помош на стрелките, и само се погоди со што техника ќе се дојде за да може да бод заедно, како вид на пуканки со една тема, а поврзани листи правоаголници тука? Нејзиниот број? Што не е во функција на основниот јазик? ПУБЛИКАТА: покажувач. Дејвид MALAN: покажувач. Така што секоја од овие стрели тука претставува покажувач или само на адреса. Значи со други зборови, ако сакам за чување на листа на броеви, Јас не може само да се чува, ако сакам способност да расте и се намалува моите податоци структура во низа. Па ми треба да се има малку повеќе софистицираност, не се забележи дека овој слика вид сугерира дека ако сте само што влегов малку теми поврзување сето заедно, веројатно не е толку тешко да се направи простор меѓу две од овие правоаголници или две од овие јазли, како што ние ќе започнеме нарекувајќи ги, стави во нов јазол, а потоа со некој нова тема, само браздата на три јазли заедно, првиот, за последен пат, и оној кој штотуку го вметнува во средината на теренот. И навистина поврзани листа, за разлика од низа, е динамичен. Тоа може да расте и тоа може да смалуваат, а ти немаш мора да се знае или се грижат однапред колку колку податоци што ќе треба да се складираат, но излегува дека ние треба да биде малку внимателни за тоа како да се спроведе оваа. Значи прво, да се разгледа како што ги спроведуваме едно од овие мали правоаголници. Тоа е лесно да се спроведе int. Можете само да се каже int n и потоа добивате 4 бајти за int, но како можам да добијам на int, го нарекуваат n, а потоа покажувач, ајде да го наречеме следната. Ние би можеле да го нарекуваме овие работите нешто што сакаме но ми треба една структура сопствени податоци. Да? ПУБЛИКАТА: симболот [Беззвучен]. Дејвид MALAN: Значи симболот ние ќе ги искористиме за да се ја добиете адресата на еден јазол потенцијално. Но, ние треба уште една карактеристика на C со цел да ми даде способност да се создаде овој обичај правоаголник, овој обичај променлива ако сакате, во меморијата. ПУБЛИКАТА: А struct. Дејвид MALAN: А struct. Потсетиме од минатата недела, ќе воведе struct, овој релативно едноставни клучни зборови што ни овозможува да се направи нешто како ова. Ц не доаѓаат со податоци структура наречена студент. Тоа доаѓа со int и плови и знак и такви, но тоа не доаѓа со студентот, но можеме да се создаде еден вид на студентите на податоци, студент структура, со оваа синтакса овде. И ќе видите дека ова повторно и повторно. Па не се грижи за меморирање на клучни зборови, но клучен збор, која што е важно е само фактот што рековме struct а потоа ние го нарече ученик и во внатрешноста на студентот е име и куќа или dorm или слично. И така сега, денес, да предложи ова. Јас додадов неколку зборови, но ако сакам за спроведување на оваа правоаголник што е доби двете int и еден покажувач, знаеш што, јас сум ќе се изјасни за struct нарекува јазол. Јас сум исто така, во него, требаше да се каже дека еден јазол, овој правоаголник, има int и ние ќе го наречеме n и тоа што има следниот покажувач. И ова е малку опширниот, но ако мислите дека за тоа, стрели што беа во слика пред еден миг се на тоа каков тип на податоци? Каде што секој од овие стрели е да се покажува за тоа каков тип на структура на податоци? Тоа не е само за да се укажува на int сама за себе. Тоа укажува на Целата правоаголни работа и дека правоаголни работа, рековме, се нарекува јазол. И така ние вид на мора да рекурзивно дефинираат ова како дека еден јазол, ние треба да се каже, ќе содржи int n наречен и покажувач наречен следната и тип на структура на податоци на која дека покажувачот поени е очигледно ќе биде struct јазол. Значи ова е annoyingly опширниот и само за да бидат педантни, Затоа не можеме да само да го кажам ова, која искрено изгледа многу повеќе може да се чита, е затоа што се потсетиме дека C прочита работите врвот до дното, лево кон десно. Тоа не е додека не го добиеме запирка дека всушност постои јазол на клучни зборови. Значи, ако сакаме да го имаат овој вид на циклични референца во внатрешноста на податоци структура, ние треба да го направите ова, каде што велиме struct јазол на врвот, која ни дава повеќе начин на опишување на овој работа, а потоа внатре велиме struct јазол, а потоа во последен линија ние се каже, сите во право, Ц, патем, само јавете целата оваа проклето работа еден јазол и да престане користење на клучни зборови struct заедно. Значи ова е само еден вид на синтаксички трик што во крајна линија ни овозможува да се создаде нешто што изгледа токму вака. Па ако претпоставиме сега можеме да се спроведување на оваа работа во C, како тоа го правиме, всушност, почне traversing ова? Па, всушност, сите ние треба да направите е iterate од лево кон десно и само вид на вметнете јазли или избришете јазли или потрага по нешта каде што сакаме, но да го направите ова, ајде да одиме напред и да се направи работите малку пореално, бидејќи овој е досега супер ниско ниво. Дали некој буквално сакал да биде на прво место? ВО РЕД. Качи. Како се викаш? Давид: Давид. Дејвид MALAN: Давид. Мило ми е што те запознав. И јас. Во ред. И ние треба голем број 9. Не толку добри како прво, можеби. Добро, број 9. Голем број 17, те молам. Дозволете ми да се врати малку подалеку. Број 22, ве молам, и како за поназад ако може да се види било раце со сета светлина или не. Некој се доброволно право таму. Дали сакате да се излезе? Подлактица насилно се искачува. Во ред, 17. 22. 26 иде надолу. Некој друг би сакале да forcefully-- Качи. Вистински волонтер. Толку многу брзо, ако вие момци може да организира си сакала јазли на екранот. Ти благодарам. И ќе биде 26. Сите права и брз вовед. Па јас сум Давид и вие сте исто така? Давид: Давид. Дејвид MALAN: А ти си? Џејк: Џејк. Тужи: Сју. Алекс: Алекс. Рафаел: Рафаел. Тејлор: Тејлор. Дејвид MALAN: Тејлор. Одличен. Значи овие се нашите волонтери за денес и да се оди напред и ја префрлат малку на тој начин, и само да оди напред и да ја задржите држи вашите броеви како што се, или вашиот Првиот знак и користење на левата рака, оди напред и да се спроведе само овие стрели, само така што левата рака е буквално покажувајќи кон она што ќе треба да се истакне во, и си даде некои соба, така што визуелно може да се види вашиот оружје, всушност, посочувајќи, и вие само може да се истакне вид во земјата е во ред. Значи тука имаме поврзани листа од еден, два, три, четири, пет јазли на почетокот, и ќе забележите дека имаме оваа специјална покажувачот на почетокот кој е клуч, бидејќи ние треба да ги пратите на листа на целата должина некако. Овие момци, и покрај тоа што си замина кон десно, назад да се врати во меморијата, тие всушност може да биде било каде во меморијата на компјутерот. Па овие момци можат да бидат стои било каде на сцената и тоа е во ред, се додека тие се всушност, покажувајќи на една со друга, но да се задржи нешта чиста и едноставна, ние ќе само да ги подготви лево кон десно, како ова, но може да има масивна празнини помеѓу оние јазли. Сега, ако сакам да се, всушност, ставете некои нова вредност, да се оди напред и да го направите тоа. Имаме можност сега да се избере друг јазол. Кажеш да започнете со mallocing 55. Некој би пречи што Примерок? Добро, ајде до. Како се викаш? Виножито: Виножито. Дејвид MALAN: Виножито? Во ред. Примерок Виножито. Качи. Па сега ние треба да се запрашаме алгоритамски каде што може да се стави 55. Така што сите од нас, очигледно, каде што најверојатно припаѓа ако ние се обидуваме да се задржи оваа решат и ако вие момци можат да однесат чекор назад, па ние не падне на сцената, тоа би било одлично. Така всушност, Виножито, започне овде со мене, бидејќи ние како компјутерот да сега гледаат само една променлива во исто време. Значи, ако ова е првиот јазол. Забележи дека не е еден јазол, тој е само покажувач, а тоа е зошто тој е подготвен да биде само на големината на покажувачот, не еден од оние со полно правоаголници. Па ние ќе треба да се провери на секој итерација е 55 помалку од 9? Бр Е 55 помалку од 17? Бр Помалку од 22? Помалку од 26? Помалку од 34? И така сега, очигледно Виножито припаѓа на крајот. Значи да биде јасно, и она што е вашето име, Тејлор? Тејлор: Тејлор. Дејвид MALAN: Значи меѓу Тејлор левата рака и рацете Виножито тука, чија рака треба да се укаже на тоа што во цел да вметнете 55 во оваа листа? Што треба да се направи? Да? ПУБЛИКАТА: рака Тејлор Треба да се истакне лево. Дејвид MALAN: Токму така. Па вметнување на јазол во крајот на листата е прилично едноставен, бидејќи само Тејлор мора да се истакне, наместо на теренот или ние ќе го наречеме нула, ништовни е вид на отсуство на покажувачот или посебен нула покажувачот, ти си случува да се истакне со вашиот лево рака на Виножито и потоа Виножито, Каде треба да се вашиот лево рака веројатно точка? Надолу. Тоа не е добро, ако нејзината рака е вид на показни исклучите тука или на било кој вид на кој начин. Кое ќе се смета вредноста на ѓубре, но ако таа укажува на некои позната вредност, ние ќе го нарекуваат нула или нула, тоа е во ред затоа што имаат мандат во оваа и знаеме дека листата е завршена. Значи она што е уште еден релативно едноставен случај? Дали можеме Примерок 5? Качи. Како се викаш? TIFFANY: Тифани. Дејвид MALAN: Жал ми е? TIFFANY: Тифани. Дејвид MALAN: Тифани. Во ред. Тифани е malloced со вредност 5. Качи. Ова ми е релативно лесно, ама ајде да се разгледа редоследот на операциите сега. Тоа беше прилично лесно со Тејлор на крајот. Број 5 е секако помалку од 9, и така имаме Давид, имаме Тифани, и она што е вашето име? Џејк: Џејк. Дејвид MALAN: Џејк. Тифани, Џејк, и Давид. Чија рака треба да се ажурираат на прво место? Што сакате да се направи во оваа ситуација? Има неколку можни начини, но тука е и една или повеќе погрешни начини. ПУБЛИКАТА: Започнете со најлева. Дејвид MALAN: Започнете со најлева. Кој е најлева тука тогаш? ПУБЛИКАТА: Прво. Дејвид MALAN: Во ред. Па почнуваат со првиот и каде што ќе се направи сакате да го обновите рацете на Давид да биде? ПУБЛИКАТА: За 5. Дејвид MALAN: Во ред. Така Давид, точка на пет или Тифани тука, а сега? ПУБЛИКАТА: Тифани укажува на 9? Дејвид MALAN: Совршен, освен Binky е главата само вид на паѓале, нели? Затоа што има лошо во оваа слика буквално? ПУБЛИКАТА: Ништо не е да се покажува. Дејвид MALAN: Ништо не е што укажува на Џејк сега. Ние сме буквално сираче 9 17, а ние сме буквално протекоа сите на оваа меморија, бидејќи со ажурирање рака Давид прво, тоа е Глоба до степен до кој тоа е правилно посочувајќи на Тифани сега, но ако никој нема предвидливост да се укаже на Џејк, тогаш ние го заборавиле интегритет на таа листа. Па ајде да го вратите. Така што е добра работа да се сопнал но, ајде да се поправи сега. Она што ние треба да се направи првата, наместо? Да? ПУБЛИКАТА: Тифани треба да се укаже на 9? Дејвид MALAN: Не можам се добие дека се блиску до тебе. Кој треба да се укаже на 9? ПУБЛИКАТА: Тифани. Дејвид MALAN: Во ред. Па Тифани треба прво точка на 9. Тифани така треба да се земе на идентична вредност Давид, кој се чини дека излишни за момент, но тоа е во ред, бидејќи сега, второто чекор, ние може да го ажурира страна на David да се укаже на Тифани, а потоа ако ние само вид на чисти работите како иако ова е вид на како пролет, сега тоа е точно вметнување. Така одличен. Па сега сме речиси таму. Ајде да внесете една конечна вредност како на вредност 20. Ако би можеле да Примерок една конечна волонтер? Качи. Така што ова е малку повеќе слабо. Но, навистина, ние сме го кодот пишување, иако вербално, е само сакаат да имаат еден куп дали се исполнети условите од сега, нели? Имавме состојба проверка, ако тоа му припаѓа на крајот, можеби и на почетокот. Ние треба некој вид на јамка за да се најде на самото место во средината. Значи, да се направи тоа со она што е вашето име? Ерик: Ерик. Дејвид MALAN: Ерик? Ерик. Мило ми е што те запознав. Па ние имаме 20. Помалку од пет? Бр Помалку од девет? Бр Помалку од 17? Бр ВО РЕД. Тој припаѓа тука и вашите имиња повторно се? Тужи: Сју. Дејвид MALAN: Сју. Алекс: Алекс. Дејвид MALAN: Сју, Алекс, а? Ерик: Ерик. Дејвид MALAN: Ерик. Треба да се ажурираат прво чии раце? ПУБЛИКАТА: Ерик. ВО РЕД. Ерик така треба да се истакне во каде? На 22. Добро. И сега што е следно? Сју, тогаш може да се укаже на Ерик и сега, ако вие момци само направи некоја соба, која е во ред визуелно, сега ние го направивме за внесување. Па ајде сега сметаат дека е прашање, но Ви благодарам многу за нашите волонтери. Многу добро направено. Можете да ги задржи оние кои, ако ви се допаѓа. И ние имаме една прекрасна разделба подарок ако секој што би сакале да се земе стрес топчето. Дозволете ми да го помине овој надолу. Значи она што е храна за носење од ова? Ова се чини дека е неверојатно доколку имаме сега воведен алтернатива за Низа која не е толку ограничена во низа на некои фиксна големина. Тие може да расте динамично. Но многу како што сум го видел во недели минатото, ние никогаш нема да добие ништо бесплатно, како сигурно има трампа тука. Па со главата на една врска листа, е оваа динамика? Оваа способност да растат и искрено, можевме да направиме за бришење и ние би можеле да се намали колку што е потребно. Која цена сме ние да плаќаат? Двојно повеќе простор, прв од сите. Ако се погледне на слика, веќе не сум чување листа на цели броеви. Јас сум во чување на листа на цели броеви плус покажувачи. Па јас сум двојно зголемување на износот на просторот. Сега, можеби тоа не е толку голема работа 4 бајти, 8 бајти, но тоа секако може да се додаде за големи множества податоци. Што е уште една лоша работа? Да? ПУБЛИКАТА: Ние треба да се напречни нив еден по еден. Дејвид MALAN: Да. Ние треба да ги поминуваат еден-по-еден. Знаеш што, ние се откажа овој супер удобен функција на плоштадот заградата нотација, посоодветно познат како случаен пристап, каде што само може да се фрламе на поединец елемент но сега ако јас сè уште имаше мојата волонтери тука, ако сакав да се најде број 22, јас не може само Скокни до заградата нешто нешто. Морам да се погледне во текот на листа, многу како и нашите пребарување примери линеарно, да се најде бројот 22. Значи ние се чини дека да се плати цената таму. Но, можеме да ја решавање на други проблеми. Всушност, дозволете ми да се воведе само неколку визуелни елементи. Значи, ако сте се сведува на Јадење сала Mather неодамна, што ќе се сетите дека нивните Купишта на коцки, како таков, сме ја позајмиле од овие Annenberg пред класа. Па ова магацинот на коцки, сепак, е претставник всушност на податоци структура компјутерски науки. Таму е податочна структура по компјутерски науки познат како магацинот која многу убаво помага на самата да токму тоа визуелното. Значи, ако секој од овие коцки не е послужавник, но како и голем број и сакав за чување на броеви, јас може да се стави еден долу тука, и би можел да стави уште овде на земјата, и продолжи редење броеви на врвот од еден на друг, и она што е потенцијално корисни за ова е тоа што е импликација на оваа структура на податоци? Која бројот што можам да се повлече Првиот повеќето склопот? Најскоро еден стави таму. Значи тоа е она што ние би го нарекол во компјутерски науки на податоци структура LIFO. Трае, а прв. И ќе видиме пред долго зошто кои би можеле да бидат корисни, но сега за сега, само се разгледа на имотот. И тоа е глупаво ако мислите за тоа како мензата тоа го прави. Секој пат кога се чисти пепелниците и стави на freshest оние на врвот, може да имаат претходно чисти но на крајот се многу валкани и правливи лента на дното ако никогаш всушност дојде до дното на таа магацинот, затоа што само ги стави на нови и на чиста оние на врвот на тоа. Истото може да се случи во еден супермаркет премногу. Ако имате приказ на случај млеко и секој пат кога CVS или кој добива повеќе млеко, можете само да бутам на млеката што веќе имаш на грбот и ќе се стави на нови, пред се, ви се случува да имаат некои прилично гаден млеко на крајот на структурата на податоци, бидејќи тоа е секогаш на дното или еквивалентно тоа е секогаш на задната страна. Но, има уште еден начин да се размислува за редат на податоци и на пример, ова. Ако сте еден од оние луѓе кои сака да се редат надвор од Apple продавници кога новиот производ доаѓа надвор, ти си веројатно не со помош на податоци магацинот структура затоа што ќе ги отуѓи и секој друг кој е обидел да купите некои нови играчка. Наместо тоа, ти си веројатно користење каков вид на структура на податоци или каков вид на систем во реалниот свет? Се надевам дека е една линија, или повеќе правилно или повеќе британски-како, на дното. И излегува редица е исто така структура на податоци во компјутерски науки, но на дното има многу различни имот. Тоа не е LIFO. Трае, а прв. Не дај Боже. Тоа е, наместо FIFO. Прв дојден, прв надвор. И тоа е добра работа за правичност доброто " секако, кога ќе си поставата до супер во раните утрински часови. Ако одам таму на прво место, ќе се сакате да се излезе првиот, како и. И така сите овие податоци структури, редици и Купишта и гроздовете на другите, се испоставува дека сте можат да мислат на тоа како само низа. Ова е низа, можеби фиксна големина 4, но тоа би да биде вид на убаво доколку би можеле само да се куп пепелниците речиси бескрајно висок ако ние имаат тоа многу коцки или броеви. Па можеби би сакале да користете поврзани листа овде, но трампа ќе биде потенцијално што ни е потребно повеќе меморија, Потребно е малку повеќе време, но ние не се ограничи висината на оџакот, слично како приказ на случај Mather е може да ја ограничи големината на магацинот, и така ова се одлуки дизајн или опции на располагање на нас на крајот. Така е и со овие податоци структури, ние сме отворени гледате новата горните граници потенцијално на она што претходно беше супер брз и каде што ние ќе си одиш започнува денес и каде ние ќе се надеваме да се дојде до е во средата, ние ќе да почне да се погледне на податоци структура, која ни овозможува да пребарувате преку податоците во дневник времето крајот повторно. И видовме дека, да се потсетиме, во нула недела и еден со бинарни пребарување или поделба и освојување. Се враќа и уште подобро, Светиот Грал за оваа среда ќе биде да се излезе со податочна структура која работи навистина или теоретски во постојана време, при што тоа не е важно колку милиони или милијарди работи имаме во податочна структура, тоа ќе земе ни постојана време, можеби еден чекор или два чекори или 10 чекори, но константен број на чекори за да пребарувате низ таа податочна структура. Дека навистина ќе биде светиот грал но повеќе за тоа во средата. Види ya тогаш. [Музички]