[За възпроизвеждане на музика] DAVID J. Malan: Добре това е CS50 и това е началото на пет седмици. Така че днес, изпод възглавниците на седалките, няма да намерите нищо. Но по-горе, трябва да се намери това, а малко знак на нашата благодарност за цялата работа, че сте поставили в Играта на петнадесетте. Просто махнете малка окръжност върху дъното, за да започнете да играете за останалата част от класа. Така се припомни, че, или знаете, че определен проблем четири, който излезе този уикенд, включва написването друга игра. Но този път тя включва използване на застроена графичен потребителски интерфейс, а не Общо интерфейс като Игра на петнадесетте беше. И играта, която се намира пред вас, Ако все още не съм виждал това следващата, изглежда малко нещо като това. Аз ще отида в моя терминал прозорец тук, в GDB. И аз ще отида напред и да стартирате персонал решение, което можете да получите достъп след пускането на актуализация 50, както обикновено. Но аз ще я сложа в малко тайна режим, малко великденско яйце, така наречените Бог режим, от пускането Бога в argv1. И аз трябва да следват собствените си посоки, работи тя в моята собствена Проблемът зададете директория. Така че сега вие видите пълната версия на играта на Breakout. В действителност, това е не-ръце режим. Така че това е всъщност - изумили макар че може да сте - доста тривиално да прилагат Бог режим в Breakout, за разлика от играта на петнадесетте, които някои от вас може да са преодолени за хакер издание. В Breakout е достатъчно в Бог режим просто да правя това, което, интуитивно с бухалка? Просто направи равен, независимо от хоризонтално положение е на топката. И така, стига да направите това в идентичен марш с топката движи Тази игра ще Никога, никога, никога пропуснете топката и ще спечели всеки път. Но в хакер издание тази седмица има нещо повече от това просто режим на Бог. Има редица други функции. Сред тях, лазери. Така че, ако наистина се нетърпеливи да да започнете свалянето на тухли и няколко други. А за тези от вас, които искате да калибрирате стандарт срещу хакер издание, мога да видя, че тази седмица хакер издание умишлено е малко по-постижимо, да речем, от Бога режим е с игра на петнадесетте. Така че, ако търсите за участък и , което търсите за някои допълнителни забавно функции направи гмуркане, ако на интереси. Сега, повече практически, нека да се отбележи от едно нещо, както добре. GDB, които някои от вас не може да има все още докоснал лично, което е добре. Но сега наистина е време да свикне за това и удобно с този инструмент защото той ще направи живота ви много по-лесно, наистина. На лекцията на Роб на GDB няколко Преди седмица, припомнят че GDB е дебъгер. Това е инструмент, който ви позволява да управлявате вашия програма, но работи това стъпка по стъпка, ред по ред, така че можете да мушкам наоколо, така че да виждаме нещата случва, така че , които можете да отпечатате стойности на променливи. С една дума, той ви дава много повече енергия, отколкото printDef прави. Сега разбира се, интерфейсът е доста тайнствена. Черно-бели текстови интерфейс по-голямата част. Командите са малко по-трудно да се помни, на първо време. Но въпреки че това може да отнеме ли половината един час, един час, за да сложи това предварително инвестиция на време в нея, повярвай ми. Със сигурност до края на семестъра ще спести ви един порядък повече време от това. Така че в началото на седмицата гмуркане инча И от гледна точка на Breakout, знаете, че може да направи това, стига да имат разпределението код или собствен код в процес на извършване в Pst4 си директория. Знайте, че можете да стартирате GDB. / Пробив. Това ще отвори прозорец като този. Позволете ми да се даде повече от терминален прозорец. И тогава какво ще да вървим напред и не, това не е просто го стартирате. Ще първо да зададете точка на прекъсване Спомнете си, който ви позволява да направите пауза изпълнение на определено място. Само за да запазим нещата прости Отивам да се прекъсне при първа линия просто като напишете номер едно. Нека действително отвори отново този прозорец защото това е удар с малко по малко там. Така че това, което аз сега ще направя тук, е ако отворя прозорец за регистрация. Хайде, ето. Така че сега, ако се върна в Dropbox, Pst4 и тичам GDB. / пробив влиза, забележите Отивам да се прекъсне един да се създаде критичната точка на първа линия. И сега аз ще отида напред и вид работи. И когато го направя, забележите нищо изглежда да се случи. Не е поп. Няма по графичен потребителския интерфейс, все още. Но това е разбираемо, защото аз съм буквално на първа линия в моята програма. И забелязвам, че съм на бързи обороти, специално сега на 62, защото всички нещата в горната част на този файл е неща като коментари и константи и безинтересни неща за сега. Така че сега аз съм вътре в главния, изглежда, в ред 62. И това е само разпределението код, изземване. Ако отворите нагоре, като отидете по подобен начин в моята директория капка кутия в Pst4, в breakout.c. И ако аз превъртете надолу и надолу и надолу, за да си отида напред и да включите ми номерата на редовете. Това, което ще видите, ако превъртете надолу до линия 62, е точно на линията, която ние сме на пауза. Така че тази линия тук, 62, е когато сме на път да бъде. Така че сега в GDB, ако отида напред и да въведете сега нататък, влиза, че ще изпълнение на съответната линия. И готово, ние имаме така наречените г прозореца. Ако не са запознати с това, което GWindow е, да не се притеснява. Спецификацията ще ви запозная с него, тъй като както и редица обхождане видеоклипове вградени в спекулация. Но сега нека да направи това малко по-интересна. Позволете ми да се движат през този прозорец да отстрани малко. Позволете ми да направя прозореца малко по-голяма, за да видя повече. А сега нека да вървим напред и правя по-нататък отново. И там са моите тухли. Ако пиша следващия път сега виждам топката. И ако пиша следващия път Сега виждам бухалка. И за щастие това не е Gedit наистина съдействие и ми показаха, всичко, което искам. Но сега, ако го направя следващия път, следващия път, аз съм само обявяване някои променливи. И аз да отпечатате всеки един на тези момчета. Принтирай тухли, щампи живот. И сега, ако аз продължавам да правя следващия, забележите, че аз ще бъда вътрешността на тази линия. Но код ще изпълни точно така, както аз очаквам. Така че, когато удари тази функция, изчакайте за клик, той ще направи тя буквално това. Така че аз като че ли са загубили контрол по програмата. GDB не ми дава друг ред. Но не се тревожи. Отидете на играта ми, щракнете някъде. И готово, сега той преминава към ред 86. И отново, това е безценно, в крайна сметка, за отстраняване на грешки проблеми. Защото вие можете буквално да преминете през кода си, за печат неща и много, много повече. Но за сега, тези средства само трябва да ви стане доста далеч. Така че ние сме, разбира се, като погледнете най Graphics сега, изведнъж. И сега нашият свят става малко по-интересно. И знаете ли, може би, от някои от видео онлайн, че имаме тези шорти, които сте гледали като част от проблемните комплекти. И те са били застреляни, умишлено, върху бял фон. И някои от тях имат учение Стипендианти рисуване някакъв текст на екран, който е обкован от страна на тях. Но разбира се, това не е всичко, което интересно в реалния свят. Това е само една лекционна зала с голям бял екран и фона. И нашата невероятна вид производствен екип на прави всичко изглежда красива след като факт от изрязване от или наслагване нищо правим или не искате. Сега, само за да мотивира тази седмица и наистина, където можете да отидете, в крайна сметка, с компютърни науки. Не само след проблем зададете четири. Но след друг курс или цяла план това е невероятно това, което можеш правя тези дни по отношение на Графиката в частност. Някои от вас може да са видели това тече около онлайн. Но аз мислех, че ще ви покажа, само за няколко минути, един поглед на това, което компютърни технологии и какво CGI, компютърна графика може да направи тези дни с позната песен и може би филм. [MUSIC - LANA DEL RAY, "Млада и красива] SPEAKER 1: Това е само малко невероятно, може би, колко вездесъщ - [APPLAUSE] SPEAKER 1: Току-що го изтеглили. Но това е наистина невероятно, мисля, че просто как вездесъщ софтуер и код и инструменти като този в действителност. Така че това е вкусът на посоката , в които можете да отидете. О, не повече техника днес. Е, това е наистина трагично времето като се има предвид точка аз просто се опитах да направя. Добре, така че нека да започне Fusion отново. Напомни ми по-късно. Добре, и вие трябва да имаме една приятел Като настрана, ако си направил получите забележите подобно. Добре, така припомни, че миналата седмица ние започнахме да Отлепете тази по-късно известен като низ. низ припомня тип данни, че е декларирани в библиотеката CS50. И това е част от обучението колела че сега ще започне да се свали. Това е полезно концепцията рано. Но сега това ще стане по- интересни и по-мощен да всъщност виждаме, че под предния капак, низ е точно това, нали казахме? Да, това е така наречената Чар *. И * там означава, че има някакъв адрес участват. И така, когато ти казват Чар * просто означава променлива, чийто тип данни се показалеца сега. Фактът, че е звезда там просто означава, че сте за обявяване на така наречените показалеца. И това показалеца ще изглежда съхраняване на адрес, на Разбира се, Чар. Сега защо този смисъл? Е, какво е низ под предния капак? Е, за известно време ние сме били казват че низ под предния капак е само з-е-L-L-о, например. Но ние сме говорили за това като е по същество масив. И масив тогава ще изглежда малко по- по този начин, с всеки от тези постъпване на ухапване. И тогава си казахме, че има нещо специално тук, на наклонена черта 0, или нула терминатор. Така че през цялото това време, тази тук е низ. Но наистина, низ е всъщност един адрес. И адреси, както ще видим, често са префикс 0x от Конвенцията. Какво означава 0x означават? Някой знае ли? Така че това просто означава, шестнадесетичен вид. Така че можете да си спомним, всъщност, от Pst 1, според мен, една от загряване въпроси всъщност попита за шестнайсетична система, в допълнение към двоичен и десетичен знак. И мотивацията тук е, че с шестнадесетичен имате 16 цифри на ваше разположение. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, последвано с A, B, C, D, E, F. И ако броим всички, нагоре, ще получите общо 16. Това е в контраст с десетична, където имаме 10 цифри, от 0 до девет. Това е в контраст с двоичен където ние просто трябва 0 и 1. Но в края на деня може просто представляват същите номера, но малко по различен начин. И шестнадесетичен е обща, тъй като Оказва се - и ще видим тази по-късно в хода - дори когато се за уеб програмиране в контекста на HTML и цветови кодове, шестнадесетичен е хубаво. Защото всяка цифра, оказва се, представлява четири бита перфектно. Така че просто вид линии на добре както ще видите в края на краищата. Така че това може да бъде Ox123 или нещо така, обозначаващ адрес 123 някъде вътре в мен компютъра памет. Но, разбира се, някои проблеми възникват Поради това основната изпълнение. И припомни, че взех хладно оръжие на прилагане на функция като тази - сравни тире 0 точки в последната седмица, че макар да изглеждаше, че е Добре, просто не сравнява две струни правилно. Аз бях изхвърлят основната и съм хвърлен далеч коментарите просто да се съсредоточи в по на кода, който е от интерес тук. И това е в червено, защото това е бъги. По каква причина? Е, най-отгоре там, когато обявих низ, това, което наистина се случва под предния капак? Е, нека да преминем към скрининг тук и да това. Така че аз обявена, отново, низ S GetString. Така че аз ще да се продължи напред и сега изготвя и за това, което е в действителност. Това ще бъде квадрат тук. И аз отивам да претендира че това е 32 бита. Най-малко това обикновено е, най-малко на CS50 уреда на много компютри. Отивам да го наричат ​​лидер. Но сега си припомним, че ние нарича GetString. Така GetString връща, разбира се, низ. Ако потребителят в з-е-L-L-о влиза низ Здравейте получава върнати. И това низ, както току-що каза, приключва някъде в паметта на компютъра си с наклонена черта 0 в края. Аз ще изготви тази като масив - или съседни блока на героите - че е в действителност. И сега, какво е GetString всъщност връщане? Какво е GetString е връщане всичко това време? Е, да речем, в седмиците преди, го връща низ. Но по-технически, какво прави GetString връщане очевидно? Публика: An адрес. SPEAKER 1: адрес. Конкретно той се връща адреса на първата хапка, каквото и да е. Просто си с помощта на един, два, три защото това е удобно. Тя връща адреса на първия знак в низ. И ние казахме миналата седмица, че , което е достатъчно. Защото винаги можем да разберем къде края на низа просто итерации над него, може би, с за цикъл или цикъл, докато или нещо подобно че просто търсят "наклонена черта 0", на специалния характер Sentinel. И тогава ние знаем, че низ се случва да бъде с дължина - в този случай - пет. Така че технически това, което прави GetString е го връща Ox123 в този случай. И технически тогава какво се случва, е че ние съхраняваме, вътрешната страна на S, Ox123. В края на деня, въпреки че това е нова концепция, насоки, те са само променливи. Но те се случи да се съхранява бита, че колективно представляват адрес. Така че технически всичко, което получава съхраняват в S е Ox123. Но ние като хора - включително от днес нататък - не са наистина се случва да се грижи, обикновено, това, което действително адрес на някои парче на паметта. Това е само за ниско ниво на подробност бъде интересно интелектуално занимание. Така че аз отивам да отмените това. И вместо това, по-високо ниво, просто кажете че когато ние говорим за указатели Отивам да просто да привлече повече лесен за употреба стрелката, която се предава Същата идея и резюмета далеч данни за това, което действително базовия адрес. Сега, ако се върнем на кода, което се случи миналата седмица, ако имаме низ тон равнява GetString? Е, ако аз отново, напишете просто 'Здравей' този път аз ще се друго парче от паметта. ч-е-л-л-о наклонена черта 0. Но тъй като се обадих GetString втори път - и знам, че това не гледат на Сорс кодът за GetString - дори че това е съвпадение, че здравей бе напечатани в два пъти, GetString не е Ще се опитам да се оптимизира и да бъде умен. Той просто ще получите друга парче памет от компютъра, който е ще бъде в друг адрес. Нека просто кажем, произволно 456. И тогава какво е то ще се върне? Това ще върне 456 и да го съхранява в тон. Така че това, което наистина се случва, на лявата страна е имам друга парче памет, 32 бита обикновено. И там ще отиде Ox456. Но отново, аз не се интересувам от тях специално номера вече. Аз съм просто ще абстрактно изготвя тя като стрела. Така че това сега е ново обяснение. Но това е точно същата идея, която е се случва през цялото това време. И така, поради това, че този първи версия за сравнение е бъгав миналата седмица е защо? Когато го направите, ако и се равнява равен т това, което наистина сте под капака сравняване? Вие сте сравняване на адреси. И просто интуитивно ясно, Ox123 е няма да равно Ox456. Тези цифри, тези бита са просто различни. И така последователно, миналата седмица той каза изпишете различни неща, дори ако Думите бяха дословно същото. Така че ние се определи това. От гледна точка на лаик, какво беше уговорката? Публика: Използвайте функцията. SPEAKER 1: Използвайте функцията. Или звезди определено са включени, но се използва функция за какво? Публика: За сравнение конците. SPEAKER 1: За да сравнявате конците. Така че основният проблем тук е че аз просто се има предвид качеството на струните да бъдат определени от сравнение на техните адреси. И очевидно това е просто тъпо сега веднъж да разберете какво се случва под предния капак. Да наистина сравни струни, за да видите, ако те са равни по начинът, по който човек ще разгледа две струни за равен ние трябва да ги сравните характер за характер за характер. Сега можех да направя това много досадно. Но свойски, ние сме използвайки за линия. И само за сравнение и скоба Аз срещу т винкел аз. S скоба аз плюс един срещу т винкел Аз плюс едно, и така нататък, вътре някаква линия. И ако забележат всякакви два знака, че се различават, или ако аз осъзнавам, че ох, а е по-малък от Т или повече от тон Мога да кажа веднага невярна, те не са едно и също. Но ако получа чрез S и тон и да кажа същата, същата, същото, същата, същото, в края на двете струни, мога да кажа, Вярно, те са равни. Е, слава Богу, преди години някой пише, че кода за нас. И те го наричат ​​StrComp за низ сравнение. И въпреки че това е малко контра интуитивен, StrComp връща 0, ако тези две струни, S и T са едни и същи. Но той се връща отрицателна стойност, ако S трябва да дойде преди т по азбучен ред или положителна стойност, ако тя трябва да дойде след т по азбучен ред. Така че, ако някога искате да сортирате нещо, Оказва се, че StrComp е полезно. Защото той не просто да кажа да или не, равно или не. Тя ви дава усещане за поръчване искал мощ речника. Така StrComp, а запетая тона се равнява е равно на 0 означава, че струни са наистина равни. Защото всеки, който пише тази функция години вероятно използва за линия или докато линия или нещо подобно да се интегрират над знаците отново и отново и отново. Но проблемните два стана тук. Това е copy0.c. И двамата в червено е защото това е погрешна. И какво правим тук? Ами, първо се обадих GetString. И аз се съхранява на върнатата стойност е. Така че това е почти същото като това горната част на картината. Но това, което идва след това? Е, нека да вървим напред и да се отървете на цял куп от това. Ще назад във времето до мястото, където ние просто имат S, която сега е в съответствие с първа линия до там. Да проверя. Ако и равен равна на 0. Сега, един бърз страна нота, когато може GetString върне 0? Няма достатъчно памет. Така ли е? Това е рядък, че това ще се случи, сигурност на компютър, който е има стотици мегабайта или дори гигабайта RAM. Но може на теория да се върне 0, особено ако потребителят не сътрудничат. Има начини да се преструваме, че не сте въведения нищо и трик GetString да върне 0 ефективно. Така че това става, за да проверите за това. Защото, ако някой от вас са започнали да да, вече, сегментационни грешки - която вероятно е била източник на някои чувство на неудовлетвореност - тези, които са почти винаги резултат на паметта, свързани с грешка. Някак объркано по отношение на показалеца, дори и да не осъзнаваш имаше показалеца. Така че може да са предизвикани сегментацията грешки още на седмица единия се използва нещо като за линия или докато линия и масив, като отидете твърде далеч миналото границите на някои масив, който можете заявени в двуседмичен в специално. Може би сте го направили дори и в проблем определени четири с Breakout. Въпреки че най-вероятно не сте виждали всички звезди в разпределението код за Breakout, се оказва, че тези, GRect и GOval и други такива неща, това всъщност са указатели под предния капак. Но Станфорд, като нас, нещо кожи че най-малко подробности за библиотеки цели, много като нас за струнен и Чар *. Но GRect и GOval и всички онези, неща, вие сте или ще се използва тази седмица са в крайна сметка адреси от паметта. Ти просто не го знаят. Така че не е изненадващо тогава, може би, че може да се спъне в някои сегментационни грешки. Но това, което е интересно тук, сега, ако след като се провери за 0 правим низ тон стане лидер. Е, нека да декларират тон. Отивам да го извади като квадрат, 32 бита, го наричат ​​тон. И тогава аз ще направя стане лидер. Е, какво значи това? Е, това е малко трудно да се мисли за да си го представя мъдър. Но нека да мислим за това, което е вътре в х? Какво е буквално в рамките на тази променлива? Стойността Ox123. Така че, когато казвам, низ тон стане лидер, че само буквално означава да броят в лидер, който е Ox123 и да я постави Ox123. Или картинно, ако някак абстрактно далеч от тази подробност го има ефект на буквално прави това, както добре. Така че сега, мисля обратно към миналата седмица, когато продължихме да капиталистическата T. I направи T скоба 0. Е, T скоба 0, въпреки че това е показалеца, може да го третирате като че това е масив, с квадратна скоба нотация. Е, къде е T скоба 0? Е, това е з. И така, когато ние използваме, че ред код, две горни, което е с това, че в type.h заглавния файл, това е, когато тя е обявена. Ти капитализиране тази H. Но на Разбира се, това е точно същата ч това е вътре и, така да се каже. И така, вече сте променили или капитализират както на оригинала и така наречените копие. Понеже не си направите копие в начинът, по който човек би искал да бъде. Така че това, което беше оправя тук, в copy1.c миналата седмица? Функции, така че в действителност може да копиране на низ. И в основата си, това, което ние трябва да направите, за да копирате низ? Е, в тази зелена версия тук съм ще го направя доста ниско ниво. Има действително функции те биха могли да помогнат за това. Но най-основната една страна, и най- запознати един, най-малко, скоро ще бъде познати на нас, е следната - така че един на първа линия на код в зелено сега. Аз просто пренаписва и като знак *. Няма по функционална Разликата там. Просто изхвърлих CS50 библиотека и Аз съм го нарече това, което е, а Чар *. Сега точка, точка, точка, защото имаше някаква проверка за грешки, че не е Интересно е да се говори за отново. Така че сега т е обявена. Това също е знак *. Така че аз си пое малък площад на на екрана, както преди. Но от дясната страна, изчистване, казахме е паметта разпредели. Така че заделят част парче памет. И колко байта правим всъщност искат да разпределят, изглежда ли то? Е, низ дължината на S. Така че, ако това е здравей, че е ще бъде пет. Ще кажа, ч-е-л-л-о. Така пет байта. Но след това, плюс един, защо един? The 0 характер. Ако ние не оставят място за този човек ние случайно могат да създадат положение когато низ е Н-е-л-л-о. И след това на следващия GetString време е се обади и ми напишете, например, David, D-A-V-I-D, компютърът ще да мисля, че и всъщност Н-Е-Л-л-О-г-а-V-I-D, защото има няма прекъсване между тези думи. Така че ние трябва, че почивката. Така че ние не искаме пет. Искаме шест байта. И байта, което казвам. Но това е наистина време размерът на Чар. Технически Чар е почти винаги един байт. Но само за да направи нашия код преносими, така да се каже, така че да работи по различни компютри, дори ако те могат да бъде малко по-различно под качулка, аз ще генерично казват размера на Чар, така че моя код винаги работи. И не е нужно да го компилирате само защото аз си ъпгрейд компютър или използвате няколко различни платформи. Така че аз имам 6 пъти размера на на Чар, който се случва да бъде един. Така че това означава изчистване може дайте ми шест байта. Какво е това всъщност прави? Е, нека да хвърли назад във времето тук до къде сме в историята. Така че ако се върна тук, аз съм обявена на Чар * нарича тон. Аз сега се нарича изчистване на шест байта. И сега аз отивам да изготвя тези шест байта точно като масив по-рано. Но аз наистина не знам какво е. в този масив. Ако имате достатъчно памет се оказва, че не можеш да вярваш, че има някои известна стойност там. Тя може да са били използвани от нещо друго, някаква друга функция, някои други линия на кода, който е написал. Така че ние ще обикновено наричат ​​тези боклук ценности и да ги привлекат, може би, както въпросителни знаци, просто показва, че ние Не знам какво е всъщност там. И това не е голяма работа, докато ние са достатъчно умни, за да презапишете тези боклук стойности с номера или символа, че ни е грижа за. Така че в този случай какво ще правя? Е, моята линия на код След това имам четири. INT аз добивам 0, п получава низ дължината на S. Така един познат за линия. I е по-малка или равна на N, която обикновено е по-горе. Но този път това е умишлено. I + +, а след това просто да направи т винкел аз стане лидер. Защото моята снимка изглежда така в този момент, записани в паметта Т е адресът на този случаен парче на паметта чиито стойности са неизвестни. Но веднага след като правя т винкел 0, че ме поставя тук. И това, което завършва Първи съставен там? Ние в крайна сметка пускането з. Защото това е, което е най-ите скоба 0. И тогава едно и също нещо за Е и L и L, и о. N, защо отивам нагоре през равна на п? Поради 0 характер. Така, само за да бъде ясно, а след това, ако действително изтриете каквото и те боклук стойности са и след това действително привлече Това, което очаквам, това е и скобата 1, 2, 3, 4, плюс това е зад гърба нов герой. И така, сега, ако ние продължихме покрай точка, точка, точка в този правилната версия и капитализираната скоба тона 0 Бих, на Разбира се, да се възползва само този човек тук, който концептуално, е в крайна сметка целта. Така че това е всичко, показалецът е. И си ги използват за седмица сега в контекста на струните. Но под предния капак са малко по-сложна. Но ако мислите, че за тях в този изобразителното форма предлагам, че те са Вероятно не всичко, което страшно, тъй като те може първо да изглежда на пръв поглед, особено с такъв нов синтаксис. Въпроси по указатели, конци, или овъгли? Да? Публика: Можеш ли да се върна до [недоловим]? SPEAKER 1: Разбира се. Публика: Е, как се случват в последния линия, вие не разполагате с * т линия и * е в ред? Нямаш ли позоваването на - SPEAKER 1: Ah, много добър въпрос. Защо не имам * т и и *? Защото за кратко, през миналата седмица, като в нашата суап функция, аз съм казал, че когато имаш показалеца на средства от който отиде там, както направихме физически на сцената, е действително използвайте оператор звезда. Оказва се, че този площад-скоба нотация е това, което ние ще се обадя синтактична захар, което е просто секси начин на заявявайки, че това е краткото записване за точно това, което описвате. Но това е малко по-интуитивен. И с риск да направи това изглежда по- сложно, отколкото трябва да бъде, това, което наистина се случва тук е следното - Ако кажа, че това означава, че т * отидете адреса съхраняват в тон. Така буквално, ако т е съхраняване адреса на този з първоначално, * т средства отидете тук. Сега, какво означава тон скоба 0 кажеш? Едни и същи неща. Това е само малко по-удобни приятелски да пиша. Но аз не съм свършил още. Не мога просто да кажа * т * е получава. Защото какво ще се прави след това? Бих се пускането ч, ч, ч, ч, ч през цялото нещо. Така ли е? Тъй * т е да отидете на адреса в тон. Но ние сме вътре в една линия. И каква стойност съм увеличаване, разбира се, на всяка итерация? аз. Но има възможност тук, нали? Въпреки че това се чувства като става все по- малко по-сложни от квадратна скоба нотация сме използвали за известно време - нека да отмените промяната ми з там - Въпреки че това е сега става малко любител, основната идея, ако * т означава тук и * т е само отидете на адрес в тон. Но това, което е на адреса в т? Броят пазим използвате? Както Ox456, нека донесе, че обратно само за целите на дискусията. Е, ако аз искам да отида на д в т низ, аз просто искам да отида, по същество, 456. Или по-скоро, 457. Аз просто трябва да добавите една. Но аз мога да го направя, нали? Защото тон, въпреки че запази чертежа сега като стрела, това е просто номер, Ox456. И ако мога да добавя един към това, или по- Като цяло, ако мога да добавя, че за да мога да всъщност става дума точно там, където си искам. Така че, ако наистина направите това - и това е, което е сега се нарича показалеца аритметика - Мога да се премахне тази линия. Което е, честно казано, мисля, че по-ясна и малко по-лесен за четене. Но това е не по-малко вярно. Тази линия на код сега е с помощта показалеца аритметика. Той казва, отидете на следния адрес - независимо от началото на Т е, което е т плюс и, която първоначално е 0, което е страхотно. Тъй като това означава, че в началото на Т плюс 1 плюс 2, плюс 3, и така нататък. И същото се занимават с лидер. Така синтактична захар за това. Но разбирането на това какво наистина се случва под предния капак, бих казал, всъщност е полезен и на себе си. Защото това означава, сега там не е много по-магията става под предния капак. Там няма да бъде много по- слоеве, които можем да Отлепете за вас. Това е в. И това е програмиране. Наистина добър въпрос. Добре, така че това е, че има грешки програма имах предвид по-рано. суап е погрешно. Ако не изглежда да работят. Припомнете си, че точно като с мляко и портокалов сок - което започнах пиене демонстрация днес. Така както с портокалов сок и млякото, ние нямаше да се използва временна променлива, ПТУ, да проведе временно, така че бихме могли след това променя стойността си и след това да актуализирате б. Но тази функция, ние казахме, или това програма, в която тази функция е писмено не е наред и с много недостатъци, защо? Да? Публиката: [недоловим]. SPEAKER 1: Точно, когато ти се обадя суап - или по-общо, когато наричат ​​най никакви функции - ако аргументите на тази функция, са примитивни, така да се каже, цели числа и символа и двойни и салове, неща, без звезди, която преминава в копие на аргумента. Така че, ако х е 1 и Y е 2, а ще да бъде 1 и Ь ще бъде 2. Но те ще бъдат различни парчета на бита, различни парчета памет, която се случи и се съхранят еднакви стойности. Така че този код е супер добра при смяна на А и Б. Това не е добър в замяна - в пример от миналата седмица - х и у. Защото отново, те са в грешната обхват. Сега, как да отида за определянето на това? Трябваше да направим функцията изглежда малко по-грозна. Но отново, помислете за това, което това просто означава. И всъщност, нека, за съгласуваност, промените едно нещо, така че е идентичен с това, което току-що го направих. Както споменах миналата седмица, тя не значение къде отива. В действителност, обикновено ще постави звезда до името на променливата. Но аз мисля, че ще е малко по-лесно да разгледа * до тип данни, тъй като смисъл е показалеца на вътр в този случай. И така, какво правя тук? Аз казвам, че не ми даде Int последван от друг Int, наричайки ги а и б. Дай ми адреса на вътр. Дай ми адреса на друг вътр. Обадете тези адреси а и б. И след това с помощта на * нотация надолу по-долу, отидете на всеки един от тези адреси както е необходимо или да се или да зададете неговата стойност. Но има едно изключение тук. Защо не имам * до ПТУ? Защо не правя това, например? Той се чувства като просто трябва да отидете на всички навън и коригиране на цялото нещо. Да? Публиката: [недоловим]. SPEAKER 1: Не са декларирали ПТУ като низ. Така че това ще декларират, в този случай, ПТУ да е адресът на вътр. Но това не е съвсем това, което аз искам, в продължение на няколко причини. Публика: Вие не искате да ги разменят. SPEAKER 1: Точно така, аз не искам да сменяте нещо с ПТУ. ПТУ е просто седмица-он неща. Всичко, което искам е променлива за съхраняване на някои номера. Аз дори не е грижа за адреси в този момент. Просто имам нужда от 32 бита или така да се съхранява на вътр. И аз искам да се сложи в тези 32 бита всичко, което не е в, така да се каже, но , което е в а, само за да бъдат по-точни. Защото ако е адрес, * средство отиде там и да получите стойността 1. Например, в пример от миналата седмица или в случай б, да се качи на стойност 2. Така че това, което наистина се случва? Позволете ми направи снимка тук, че ще само дразни, освен част от днес. Но това ще продължат да се появяват от доста време. Това, смея да твърдя, е това, което вашия компютър памет прилича когато стартирате програма, всяка програма. Когато стартирате програмата, на самия връх от RAM на вашия компютър - така че на този правоъгълник, наистина, като си компютър RAM или памет, всички 101 милиард байта от него, всички два милиарда байта, най-много два гигабайта него, независимо от количеството, което имам е, нека да изготви него като правоъгълник. И аз твърдя, че когато стартирате програмата като Microsoft Word или Chrome или нещо подобно, за бита, че Microsoft или Google пише - в случаите по тези програми - се зареждат в паметта на компютъра си където те могат да бъдат изпълнени по- бързо и се подават в CPU, което е мозъка на компютъра. И в TAM Те се съхраняват в самото горната част на програмата, така да се каже. С други думи, ако това е парче от памет, когато щракнете два пъти върху Microsoft Word, бита идват изключване на твърдия диск. Те се зареждат в RAM. И ние ще ги навра в най-горната на този правоъгълник концептуално. Е, останалата част от паметта е използвани за различни неща. На върха на кулата се видим инициализира данни и деинициализиране данни. Това трябва да се направи, за по-голямата част, с константи или глобални променливи които имат стойности. Но повече за тези, друг път. След това имате куп, които ще се върнем към. Но в дъното е част, която е особено уместен в момента. Това е така наречената стека. Така че точно като в почти всички D зала тук кампуса, имате тези тави, които само подредят един върху друг, на които можете да сложите храната и какво ли не. Стекът в компютърна система е много подобна. Освен че тавата, както ние използваме в трапезарията, разбира се, се разбира да извърши неща тавите или рамки - както ще ги наричаме - в компютъра памет се използва за провеждане променливи и ценности. Така че това, което наистина се случва под предния капак? Е, нека да обърнете към екрана тук. И нека да се концентрираме само върху долната част за миг. Ако това е долната част на моя паметта на компютъра се оказва, когато извикате функцията на Майн - което се случва, честно казано, автоматично за мен - I получи парче от паметта на дъното на RAM така да се каже. И това е мястото, където е основната локални променливи отида. Това е мястото, където argc и ARGV може би отида, и всички I променливи обяви вътрешността на главен. Те в крайна сметка най-долу от RAM на компютъра ми. Сега предполагам, че основните обаждания на функция като суап, като го е направил миналата седмица? Е, ние по същество постави нов тава, а нова конструкция, върху парче ми на паметта. И аз отивам да се опише това като принадлежащи към суап функция. Сега това, което е вътре в замяна? Е, въз основа на програма от миналата седмица и на един току-що видяхме един откъс от, вътрешната страна на рамката суаповата сделка, или по суаповата сделка тава, са това, което променливи? Е, А и Б. Защото тези, които са си местни аргументи, плюс трета, ПТУ. Така че, наистина, може да се направи това малко по-чисто. Нека да вървим напред и връщане на етикета. И нека да твърдят, че знаеш ли какво? а вероятно ще свърши тук. B ще свърши до тук. И ПТУ ще свърши тук. Сега, подреждането може да бъде малко по-различна. Но концептуално това е идеята. И само заедно, това е, което ние ще се обадя на рамката суаповата сделка, или трапезария зала тава. И същото се справят с основното. Но аз няма да преначертае това. Но това е, когато argc и ARGV и всеки на неговите локални променливи като х и у може да бъде, както добре. Така че сега, помисли какво наистина се случва когато ти се обадя суап. Когато се обадите суап, изпълняващата код като това, което преминава в, в бъги версия, а и б като копия на х и у. Така че, ако го направя сега изготвя този на екрана - Трябва да си по-добър в това - Така че историята ми е казал за себе си е в това бъги версия, когато обадете сменяте преминаване в буквално а и б като цели числа, какво всъщност се случва? Е, какво всъщност се случва, е това. Нека да вървим напред и връщане само да изчисти малко място тук. Така че това е моя компютър с памет. Така че, ако трябва, например - всъщност нека да го направя по този начин - ако аз твърдя, че това е х, съхраняване на стойност 1 точно като миналата седмица. И това е Y, съхраняване на стойността 2 точно като миналата седмица. И това е основното, когато викам за размяна, като по този начин се дава достъп до една и б и ПТУ, аз отивам да се твърди, че това е и това е 1. Това е б. Това е 2. Това се нарича ПТУ. И първоначално, че има някои боклук стойност докато аз всъщност се съхранява в нея, което е 1. След това отидете напред и да се промени а да бъде това? B е стойност. И така, сега имам две тук. И тогава казахме б получава ПТУ. Отново, само като здрав разум проверите, третият ред код тук е просто това един, б получава ПТУ. И накрая, какво да правя? Отида напред и да се промени Б да бъде независимо стойността на TMP е, което е 1. Не докосвайте ПТУ отново. Но сега, проблемът е, веднага след като суап се връща, защото не раздава обратно част от стойността, няма връщане изявление изрично в него. Какво всъщност се случва? Е, по същество цялата тази памет - OK, явно гумата харесва само един пръст в даден момент - просто изчезва. Сега в действителност това не е ходя никъде. Но можете да мислите за него сега като въпросителни знаци. Защото това вече не е всъщност в употреба. И нищо не е направено с тези ценности. Така в случай на зелената версия този код, което вместо да се премина в замяна? Така адреси. Така адрес на х и на адрес на у. Така че, ако искаме отново да разкажа тази история един последен време, и аз всъщност изготвя суап отново, но с насоки, като това е, тази е б, и това е ПТУ, това, което е всъщност се съхранява в в зелено версия на моя код, където аз съм минаваща в адреси? Това ще бъде указател към х. Така че може да се направи една стрела. Но нека да използват един и същ произволна Например, както преди. Да кажем, че това е нещо като Ox123. И това ще бъде, защото Ox127 това е четири байта далеч, защото това е Int, така Ox127. И отново, аз съм като някои свободи с числа. Те са много по-малки, отколкото те биха действително да бъде и в различен ред. Но това е начина на снимката сега е различно. Но когато използвам тази зелена код и аз Int ПТУ се * а. * Средство да направите следното, да вземе справяне с това е в програмата и премини към него, което е 1. И това е, което аз след това пуснати в ПТУ. В същото време, в следващия ред код тук, * а получава б, какво означава това? Е, * а, така че давай тук получава * б, което означава, че отиде там. А това означава, сложи стойността на там. И накрая, последната линия на код просто каза * б получава ПТУ. Така казва б отиде там и да го заместите с TMP, което в този случай, ще да бъде отново 1. И затова зелената версия на нашите код работи, докато червено версия никога не е направил. Всичко се свежда само до това как памет се управлява и където е в действителност е пуснат в компютър RAM. И за сега, това е едно от нещата, на комина да се използва за. Въпроси за оформление? На указатели? Или по суап? Добре, изчистване, изземване, направя нещо такова. Това беше супер прост пример. И това е този, който Бинки въведе на нас, макар и доста бързо, в края на класа. По дяволите, там да отидем отново. Така се припомни, че това е пример, че Binky ни запозна с, макар и малко по-бързо в края на класа. И тук ние използвахме изчистване наистина за втори път. Защото първият път, когато го използва, за да създаде достатъчно RAM, разпределят достатъчно RAM Съхранение на низ. Този път Binky държат го прости. Така че това е просто да се съхранява едно цяло число, както изглежда. И това е напълно наред. Това е малко странно, честно казано, да използвате изчистване да разпределите вътр. Но точката на глинената анимация Ник беше наистина само разказват историята на това, което се случва или не се случва, когато обхождаш зле с паметта. Така че в този случай, тази програма направи няколко неща. В първия случай тук, той декларира, указател наречен X към вътр. След това той декларира указател наречен Y към вътр. След това той съхранява в х, какво? Някой друг сега. Това, което се съхранява в х според третата линия на тази програма? Публиката: [недоловим]. SPEAKER 1: Е, не съвсем байта, за се каже. И по-точно сега. Какво получава съхраняват в х? Един адрес, мисля, че го чух. И какво означава изчистване върне? изчистване поведенчески разпределя парче памет. Но защо трябва да ви даде достъп до него? Тя връща какво? Адресът на първия байт в парче на паметта. Сега, това е супер проста. Това е просто един байт, което означава, че справяне Ще се върна е адрес на цялото нещо. Така се съхранява в х тогава е адрес на това парче на паметта. В същото време, това, което се случва след това? Така че, всъщност, да вървим напред и да изготви това доста бързо. Така че, ако ние преминем към екрана тук и свирим това Int * X и Y Int * ще направи това, което за мен? Аз твърдя, че това е просто ще направи нещо като това и го наричат ​​х и това и го наричат ​​г. Междувременно, трети ред код е ще разпределя размера на Int, който се случва да бъде - Съжалявам, ако кажа, и преди имах предвид една Int - четири байта на един типичен компютър. Най-малко с CS50 уреда. Така че това ще се разпределят тя, кой знае? Някъде тук. И това е съхраняван при някои адрес Ox, кой знае? Но какво се случва, за да се върна е този адрес. Но ние ще изготви тази картинно като само стрелка така. А в следващия ред * х получава 42. Какво означава Х означава в гледна точка на лаик? Просто отидете там. Отидете на този адрес. Или с други думи, следвайте стрелка и отбеляза 42 там. Но тогава нещо лошо се е случило да Binky, нали? Припомнете си, че линията пет тук, * Y получава 13, наистина е нещастен номер, Направих това, което за нас? Е, * у средства там. Е, това не е дадено стойност, все пак, нали? Кодът не разполага г. е инициализира с нищо. Бяхме х се инициализират до адрес. Но г е обявен до върха. Но след точка и запетая, няма никаква стойност е действително пуснати в него. Така че това е справедливо да наричаме това боклук стойност. Кой знае какво е там? Това са остатъците от бита, които са използвани от някои предишния ред код в моята програма. Така че, ако съм казал, че отивам там, това е като, Нямам представа къде е тази стрелка ще свърши. И това е, когато обикновено получите грешка сегментация. Ако случайно и сочен, така да се говори, или да отидете на адрес, който не е всъщност законен адрес, се случват лоши неща. И това е точно какво се е случило да се мисли Binky. Така се припомни, че историята, която Ник беше казва тук е същата идея като какво Аз бях изготвен с илюзията за тебешир на дъската има. X и Y са декларирани. Тогава разпределени размера на едно цяло число и да го съхранява в х. След това на следващия ред, което направихме * х. Това е магическа пръчка Ник на dereferencing. Това постави 42 в паметта посочени от х. Но това е мястото, където нещата отиде ужасно погрешно. Така ли е? Опитахме се да сочен г. Но у имали някаква фалшива стойност, нали? Това стрелка в долния ляв ъгъл, не е всъщност сочи към нищо. Това е вид на това, което съм направи тук на дъската. Така се случват лоши неща, сегментацията вина, или Binky вина, в този случай. Но ако след това се определят, че по този х получава у как историята на климата? Е, ако го направя х получава Y, това е ефективно същото да казва Каквото и да е, Ox-нещо ще бъде едно и също тук, Ox-нещо. Или картинно ще изготви стрелка. Така че тук, на борда с Binky, със следващия ред на код, * Y означава отида там. Когато е там? Това означава тук. И когато се актуализира, че да бъде 13 тя просто ще включва и написването 13 тук. Така че може би не е напълно обикновена на пръв поглед. Но за да обобщим и да използвате същия жаргон че Binky се използва тук, така че първите две разпределят указатели, X и Y, но не и pointees. И pointees не е обикновено се използва терминът. Но показалеца е абсолютно. Но това е това, което се посочи в в номенклатурата на Binky. Това следващия ред, разбира се, Заделя Int pointee. Така парче памет - както аз привлече над по на дясната страна има - и в стаята X равно точка към него. Това dereferences х да съхранявате 42 в спомена, че това е сочеше. И след това, разбира се, е нещо лошо. Защото у не сочеше на нищо все още. Това го определя. Така че това все още е лоша програма. Само защото сме духаше през кода ред по ред и да казва: Е, добре, нека го разбият там. Това е лошо нещо. Коефициентите са програмата просто ще прекъснете напълно в тази линия. Но ако ви се налага да се премахне разби линия и да го замени с последните две линии там присвоите - използвате показалеца задача - Y да сочи към х като точка тон. И тогава и сочен Y в много безопасен начин. Така че откъде идва тази ни остави? Е, оказва се, че под предния капак в библиотеката CS50, указатели са използвана във всички. И ние действително ще започне да се бели отново този слой не след дълго. Но се оказва твърде, израз, който някои от вас може би са запознати с, особено тези, които по-удобно, всъщност, че на много популярни сайт, или препълване стека, тези дни. Но това всъщност е много техническо значение. Ние вече знаем какво е топчето е. Това е като една купчина от тавите вътре в трапезарията. Или вътре на вашия компютър паметта му, тези рамки които се използват от функции. Е, оказва се, че заради това много просто изпълнение на памет и рамки на така наречената стека, всъщност можете да поемат контрола на компютърна система сравнително лесно. Можете да проникна в една система, ако хората като нас не са писали нашия код особено добре. Ако хора като нас, използвайте парчета на паметта или използването масиви - още по-често - но понякога забравят да се провери границите на нашия масив когато имате възможност имат си понякога, и представен твърде далеч след края на масив. В най-добрия случай, вашата програма може просто катастрофа. Сегментация вина, вид на неудобно. Не е голяма, но това не е задължително изключително лошо нещо. Но ако програмата ви е всъщност върху недвижимите ползвателите компютри, ако той се движи на уебсайт, че реалните случайни хора в интернет се удря, отдаване под наем хората предизвика лоши неща на вашия код е като цяло не е добро нещо, защото това означава възможност да се направи контрол на компютъра. И това ще изглежда малко загадъчен. Но аз мислех, че ще ви плаша с този последен пример тук. Ето един пример на код. И има добър Wikipedia статия, която минава през това по-подробно. Имам основната на дъното призвание Foo, преминавайки в ARGV на 1. И това е само, така че можете да стартирате програмата и да премине произволен вход. И тогава Foo е обявена отгоре като приема низ, или повече точно, а Чар *. След това той декларира масив от символи. Наречете го буфер, по-общо, размер на 12. Така 12 символа може да се побере в на този масив наречен C. И тогава той използва тази нова функция, което е ново, но не е трудно да разбирам, копие памет. Той копира памет от бара, който е променливата N миналото, независимо от потребителя написали в ARGV 1 в C. Колко байта? The низ дължина на гредата. Така че с други думи, ако потребителят е въвел в ч-е-л-л-о въведете низ дължина на здравей е пет. Така че пет от тези байтове, ще се получи, копират в масив наречен С, който е с размер 12. Но това, което потребителят видове в много по-дълъг дума, която е 13 знака или 14 символи или 100 знака или повече? Къде отиват да отидете? Е, тази рамка, тази тава в трапезарията антре комин, те ще отидат там. И това е просто ще започне презаписването други неща, които вече на този стак, прелива стека, така да се каже. Така картинно, мисля за него по този начин. Това е само една цветна версия на на снимката, ние сме били изготвяне. В долната част, да кажем, е основната. И на върха, това, което виждаме сега е рамката, цвят кодирани сега, за функция, наречена Foo. Но това, което е интересно тук за Foo е, че тук е рамката му. Така че това е съставен само ми харесва направи, но в светло синьо. А сега и това е мястото, където в скобата 0 отива. И това е мястото, където в скобата 11 ще свърши. С други думи, това се случва на да се представи като квадрат. Но ако просто продължавайте цопване байта надолу - или символа - те започват до края На място 0 по целия път нагоре до 11, защото това е 0 индексирани. Но там, където е 13-ти характер ще свърши? Къде е 14-та? Когато е на 50-герой ще свърши? Ще продължим надолу. Защото, въпреки че сме съставена картина с топчето Растейки адреси, оказва се, да премине от малки адреси, малка указатели, до големи адреси. Така че това просто продължава да се движи нагоре-нагоре. Така че, ако потребителят е въвел в Здравейте, това е чудесно. Не бъг, няма проблем, всеки е в безопасност. Но ако потребителят е въвел в това, което ние ще обадете състезателна код, представлявана генерично като, атака, атака, атака, нападение, това, което може да се случи? Е, ако всички от входа, че потребителят написах не е просто някакъв приятелски или обидно низ от знаци. Това е всъщност поредица от символи, че ако го събират, тя всъщност е код. Може би това е код, който изтрива всички файлове на твърдия ви диск или изпраща спам или нещо подобно. Забележете, че това, което е ключът тук е, че ако лош човек има късмета да презапише червено парче на паметта - което аз не се възползва от моя снимка, но тази снимка Wikipedia тук има - така наречената обратен адрес. Когато храната се връща, когато суап декларации, как компютъра знаете, за да премине от тук да тук? Или в технологичния сегмент до горе, как не го знае да отиде от суапа код - за 0 и 1 на които съставят суап - Обратно към главната? Има т. нар. обратен адрес съхраняват в същата рамка комин, за същата тава кафене. Така че, ако на лош човек е достатъчно умен, за да постави кода атака, атака код, атака код, и да получите достатъчно късмет - често чрез опити и грешки - да презапише че червеното адрес за връщане, с адрес и информация на самия връх. Забележете 0835C080. Той е написан наобратно до върха за причини, може би ще преразгледат. Това е този номер. Така че, ако на лош човек получава достатъчно късмет или е достатъчно умен, за да презапишете червено съблекат памет с адреса на код, който той или тя има някакъв начин инжектира в компютъра ви, предполагам, чието код ще бъдат върнати веднага след като Foo се прави изпълняващата? Лошото момче на кода. Така че тази атака код, AAA, отново, може изпращане на спам, може да изтриете всички файлове на вашия твърд диск. Но това е, което наистина е препълване на стека е, или буфер превишаване или буфер атака преливник. И това е невероятно, невероятно обща и до днес с програми, написани на C, C + +, а дори и някои други езици. На това страшно бележка, ще завършва с шега. [СМЯХ] Ще се видим в сряда. На следващото CS50 - Така че аз съм всичко от диск лампи днес, но изчакайте, без мазнини, мляко, половината от телефона книга, портокалов сок че аз пих днес. USB кабел, гаечен ключ. [За възпроизвеждане на музика]