SPEAKER 1: Здравейте всички. Отиваме, за да започнете. Мисля, че хората са все още ще за филтриране инча Но в интерес на време, така че ние можем да Махни си момчета от тук навреме, отиваме да се започне. Така че, добре дошли в 0 прегледа на CS50 Quiz. За тези от вас, които не са разбрали, все пак, имате въпрос в сряда. Woo-Hoo. Ако не са започнали все още учат или не са разбрали, че това все още съществува, последните викторини и цялата информация за викторина са на cs50.net/quizzes. Има някои доста добри неща за там, последните тестове от последната 10 година, както и информация за този тест и теми че ще бъдат обхванати. Така че нека да започнем. Така че вие ​​може би си спомняте, на първата ден на клас Давид тези лампи на. Така че, по същество, всичко, което отива за под капака на компютъра е направено в двоичен. Binary означава това, което звучи като, 0 и 1 на. Тя има две стойности, които могат да бъдат представени. Така че точно като в първия ден от раздел когато Давид се обърна на светлината Смолата представлява на, или 1, нашия компютър разбира двоичен като 0 и 1 е, включен или изключен. Основи на Binary. Всяко място е представено в база две. Така че можете да добавите 2 към 0 до 1 към 2 по целия път нагоре. За да се изчисли какъв е вашият двоичен е да знак, просто следвайте това уравнение тип нещо. Ако имате един във всяка от тези места, вие го умножете по какъвто и основе тя е в, да го добавите нагоре, и можете да получите след десетичната. Така че това е начина, по който се брои до 5 в двоичен. Точно като това, което правехме относно: последния слайд, това е как бихте представлява 1 до 5. По същия начин, точно като можете да добавяте и изважда в десетичен или основа 10, или наистина всяка основа, върху може да добавите и изважда в двоичен. Точно това, което можете да очаквате, когато добавете две нагоре, ако той е равен по-голяма от 1, носите една, да я направи по-0, и да направим добавянето по този начин, просто като може да се очаква с редовен знак или друга база. Cool. Така че, както казах и преди, всичко, което продължава под капака на компютъра ни се извършва в 0 и 1 е, или двоичен. Е, как да изразяваме, например, букви или цифри или символи? И отговорът на този въпрос е ASCII. ASCII е картографиране между героите които обикновено искаме да видим в Английски език като А, Б, От C, подчертават, тирета, и нещо подобно. И карти, които на стойност ASCII. Стойност на ASCII е просто число, което може да бъде разбрано от вашия компютър. И точно като можете да направите допълнение и изваждане с числа, можете да направите ги със стойности ASCII. Така в този пример, какво това ще се отпечата? Да, толкова просто пространство B пространство C пространство D. Къде отиде мишката ми? Забележете, можете да определите едно цяло число на 65. И когато печатате, че се използва процента C, това ще се тълкува, че като характер и ще отпечатате A. Също така, можете да декларирате това като знак. И когато го отпечатате с помощта на процента C, това ще се тълкува, че като процента D. И точно като можете да добавите номер, можете да добавите знаци са ASCII стойности, в този случай. Така че малко показалеца за всички. 5, като низ, не го прави всъщност се равнява на 5. И така, как бихме могли да конвертирате низ 5 до числото 5? Някакви идеи? Да. Така че, ако имаме 5 като низ ние можем да извадим 0. И това ще ни даде 5. И също така, ако имаме 5 като число, добави, че в низа 0. И това ни дава низ 5. Cool. Сега, припомни отново да изнася лекции, където един ние говорихме за алгоритми. И така, как ние всъщност искаме компютър да правят интересни неща? Знаеш ли, просто добавяне и изваждане номера и печат неща, не е че вълнуващо. Обикновено, ние искаме нашия компютър, за да изпълнява някакъв вид алгоритъм. Нещо малко по-сложна отколкото просто проста аритметика. Един алгоритъм е само една стъпка по стъпка набор от инструкции за това как да се извърши определен task-- просто като рецепта. Може би си спомняте от първия ден на клас, където Давид беше ни брои стая на хората и колко хора са в стаята. Може да се използва за броене един по един. 1, 2, 3, 4. В този случай, линеен алгоритъм време. Но Дейвид въведен алгоритъм за можете да разчитате на хората в стаята където всеки се изправя, че ти номер на друг човек, да добавя, че номер нагоре, а един човек сяда. И ти повтарям това. Това е един вид алгоритъм. Ние можем да анализираме как ефективно на алгоритъм се основава на това е тече времето. Но ние ще говорим малко по- повече за това по-късно. Така че всички алгоритми може също да бъде написана в pseudocode. Pseudocode е само на английски език, като синтаксис използва за представяне език за програмиране. Например, ако искаме да задам един потребител да предполагам, любимото ми число, ние може да има pseudocode като такива. Вземи потребители предполагам. Ако предположението е правилно, кажи им те са правилни, друг да им кажа те не са верни. И pseudocode е начин за лесно представлява идея или алгоритъм. Така че сега ние може да искате наистина да пиша тази на езика, че компютърът мощ разбиране. Така че бихме могли да напишем pseudocode и тълкува, че в изходния код. Досега, изходния код трябва да се придържат на определен синтаксис на език за програмиране. И така до момента, в CS50, ние сме Използвам най-вече в. Така че това може да бъде източник на код за C. По-късно в хода, вие нощ дойде в контакт с друго програмиране езици като PHP. Или, ако дори и да предприемат други класове, можете може да направи Java, Python, или дори OCML. Но в нашия език в програма, това е как бихме могли да пиша на изходния код за алгоритъм pseudocode че Аз току-що описах по-рано. И така, как вашия компютър всъщност Разбираш ли това? Както казах и преди, това само наистина разбира нули и единици. И така, как да го получите от източника код за нещо, което може да бъде Ясно ли е? Е, ние имаме нещо нарича компилатор. Ако си спомняте обратно в повечето от psets, сте имали някакъв вид програма написано в една точка в файл. И тогава можете да напишете марка. Така че това, което се прави това? Можете да напишете марка да компилирате програма, защото someone-- всеки, който си написал стр комплект; вероятно David-- създава файл марка. И това казва направи да знаете, за да пускате компилатор, наречен трясък, че волята след това компилирате изходния код на възражение код, който е нули и единици че компютърът ви разбира. Но малко по-късно, ние ще отидем по-задълбочено за компилатори. Така припомни pset 0, where-- да, Имате въпрос? АУДИТОРИЯ: [недоловим]? SPEAKER 1: Да. Аз мисля, че те всъщност трябва да бъде на линия. Да. АУДИТОРИЯ: Дали е като [недоловим]? SPEAKER 1: Това не е така. The сте на cs50.net/quizzes. АУДИТОРИЯ: Slash викторини, наклонена черта 2013 г., Слаш 0 и само да кликнете чрез викторини 2013 и викторина 0, прегледайте раздел пързалки. SPEAKER 1: Да, така че, ако вие искате да го издърпайте нагоре и погледнете в него на своя собствения си компютър, това е добре също. Кажи, че отново. АУДИТОРИЯ: [недоловим]. SPEAKER 1: Да, [недоловим] е фиктивна променлива. О, да? АУДИТОРИЯ: [недоловим]? SPEAKER 1: Не, стачки не са включени в изпита. Съжаляваме, въпроса си беше, стачки на изпит. И това не е така. Така pset 0, вие трябва да имат всички изпълнява нещо, използвайки нулата. И ние научихме някои основни програмиране градивни елементи, използвайки нулата. Така че нека да разгледаме някои на тези градивни блокове които съставят програма. На първо място е Булев израз. Булевите изрази са такива и 0 или всичко, което има две възможни стойности. В този случай, е вярно или невярно, или изключване, както и с да или не. Един пример на прост, много прост, програма, която използва Boolean израз тук. Така че, за булеви изрази, до бъде полезна, имаме булеви оператори. Това са оператори, които могат да бъдат използвани за сравнение на определени ценности. Така че ние имаме и или не е равно на по-малко от или равен на или по-голяма от равен, и по-малко от или по-голяма от. Но тези оператори, които не са много полезни освен ако не можем да ги комбинирате в условия. Така че вие ​​може би си спомняте от нулата и от вашия стр определя, че ние имаше условия. Те са, по същество, като вилици в логиката на вашата програма, която извършва в зависимост от това дали условие е изпълнено. Така че едно от условията, които сме имали използва много пъти в този курс е , ако друго, ако и друго условия. Ето един пример за това как бихте могли да използвате това. Някой знае ли разликата между само с помощта, ако всички твърдения чак стихове, ако друго, Ако и друг комбиниран? Да? АУДИТОРИЯ: [недоловим]. SPEAKER 1: Точно така. Така че, ако съм имал, ако по целия път надолу тази начин, дори и ако това условие не се връща вярно, че все още ще продължи изпитване на следващите две. Има предвид, че с друго-ако едно друго декларация, ако един се връща истина, другите не са тествани. Всякакви въпроси за това? Cool. Така че можете да използвате, ако-друг на друго декларация, ако знаете, че тя само може един от тези случаи. Така че ние знаем, ако х е по-малко от 0, това е Определено няма да бъде по-голяма от 0. След това друг изграждащ блок че сме научили са контури. Имаме три вида цикли. За вериги, докато примки, и направи, докато цикли. И обикновено, когато седнете да напиша нещо, което трябва да се реши кой от тримата искате да използвате. Е, как да решим кое? Ние обикновено се използва за линия, ако знаем колко пъти ние искаме да превъртите през нещо или колко пъти ние искаме да се изпълни дадена задача. Ние използваме докато цикли, ако имаме нужда от състояние, за да е истина, за да продължат да работят. И ние използваме, докато много подобен на време, но ние искаме нашият код, който да се движи с най-малко един час. Така правя, докато, каквото е в правите, винаги работи най-малко един час. Като има предвид, в същото време, тя не могат да се движат на всички, ако на условие не е изпълнено. Всички въпроси, с това? Така за структура на цикъл. Вие, момчета, сте виждали всичко това. Можете да го инициализира. Имате някакво състояние. Така, например, бихме могли да се инициализира Що се отнася аз равна на 0. аз е по-малко от 10. И аз ++. Много просто едно, че ние сме направили. За линия, докато също така, трябва да има някакъв вид на инициализация, някакво състояние, и някаква актуализация. Така че можем да реализираме за контур също като линия, докато използването на този. И по същия начин със задачи, докато контур, можем да имаме някаква инициализация, изпълни нещо, го актуализира, и след проверка на състоянието. Така че сега функции. Ние събрахме всичко заедно. Ние може да искате да напишете някои вид на функция. Общата функция, която може да се Вече видяхме, е основният. Основно е функция. Той има вид завръщане, вътр. Той има име на функция, основен. И тя има аргументи, argc и argv. Така че основното е просто функция. Други функции, които може да сте се използват, printf-- ФОРМАТ е function-- GetInt, toupper. Но това се случи, че са били изпълнява за нас от някакъв вид библиотека. Ако вие си спомнят включително тази библиотека CS50.h или Standard I / O библиотека. Да, въпрос? АУДИТОРИЯ: е основният просто присъщи на C? Има ли просто вид [недоловим]? SPEAKER 1: Въпросът е ако основният е присъщо в. И да, всички функции имат основна функция. Това е нещо необходимо за компютъра да знаете откъде да започнете използвате кода. АУДИТОРИЯ: Значи вие не искахте [недоловим]? SPEAKER 1: Не Всякакви други въпроси? Cool. Така че, точно като можете да използвате функцията , което е написано за вас, можете също да напишете своя собствена функция. Това е функция, която някой може да са писали за изчисляване на обем на Q, например. Налице е един вид завръщане тук, в този случай ПНА, нашето име функция Q и нашата списък на параметрите. И имайте предвид, че трябва да напиша данните тип на параметъра, който искате да използвате или иначе функцията не Знам какъв вид параметър трябва да се приеме. Така че, в този случай, ние искаме цяло число, като наш принос. Така че, защо може да искаме да използваме функции? На първо място, чудесно за организация. Те помагат разбият кода си в по-организиран парчета и да направи е по-лесно да се чете. Опростяване. Това е добре за дизайн. Когато четете парче код и чиято основна функция е наистина, наистина дълго, то може да бъде по-трудно да причина за това, което се случва. Така че, ако се раздели на функции, тя може да бъде по-лесно да се чете. И повторно използване-способност. Ако имате парче код, който се е нарича или стартирате няколко пъти, вместо пренаписването че код 10 пъти в основната си функция, може да се искате да го използвате отново. И след това всеки път, когато трябва да се използва, че част от код, обадете се на функция. Така че сега, ако ние си спомняме обратно към нулата, Ние също така говорихме за няколко концепции, един от които е резби. Тема е концепцията за множествена последователности на код изпълняващата в същото време. Така че мисля, че обратно към първия ден, когато Давид вие изброиш броя на хора в стаята. По същество, това, което се случва на е всички вие бяхте използвате отделни нишки. И тези теми идваха заедно за да получите някакъв вид отговор. По същия начин, в Scratch, когато имате множество спрайтове, може да се котка и куче. И те ще бъдат едновременно изпълнение на техните собствени скриптове. Това е пример на резба. И друга концепция, която е въведена през нулата беше събития. И събития са, когато множество части от кода си комуникират един с друг. В Scratch, това беше, когато сте използвали излъчване контрол и когато аз Получаване на блокове. И също така, в Проблем Set 4, видяхме малко от събития, както добре. Вие, момчета, може да са използвани библиотеката Gevent. И имаше функция waitForClick , в който сте били чака за потребителя да кликнете. И клик, в този случай, би било случай и да чакат за клик е вашата събитие манипулатор. И също така, през пускането на вашите psets и работи по вашите psets, вие може да влезе в контакт с някои от тези команди. Това е, което сте написали в своя терминален прозорец или каквото прозорец , който показва на вашия грама редактиране, за да, по същество, се движите вашия компютър. Така например, LS изброява съдържанието на директория. Направете директория създава нова папка. CD, промяна директория. RM, премахнете изтрива файл или някоя директория. И след това извадете директория премахва директория. АУДИТОРИЯ: [недоловим]? SPEAKER 1: Да, разбира се. За съжаление, въпросът е, ако ще предложи въвеждането на този на мамят лист. Тя може да помогне. Ако имате стая, можете да го облечете. То също е само по принцип достатъчно добър да се помни, защото, когато го използвате може да искате просто да да го запомнил. Това ще направят живота ви много по-лесно. Отговорих ли на въпроса ти? Така че сега, ние говорихме малко накратко за библиотеки. Но двете основни тези, които сме били използвайки досега в курса са Standard I / O и CS50. Какви неща са включени в стандартния I / O библиотеката? Да, досега сме използвали ФОРМАТ. В CS50, ние сме използвали GetInt и GetString. И низ тип данни също се случва които трябва да бъдат декларирани в този CS50 библиотека. Ние ще говорим малко по-задълбочено за как работят библиотеките и как те взаимодействат с останалата част от кода си. Но тези, които са двете основни тези, които сме да влезе в контакт с толкова далеч в курса. Видове. Това са добре да се помни колко всеки тип е представен от или как много байта всеки тип requires-- ПНА, 4 байта; Чар, един байт. Float е 4 байта. Какво е двойно? АУДИТОРИЯ: [недоловим]. SPEAKER 1: Да, така поплавък но се удвои размера. Какво ще кажете за дълго? АУДИТОРИЯ: [недоловим]. SPEAKER 1: OK. Какво е време? АУДИТОРИЯ: [недоловим]. SPEAKER 1: Да, удвои с вътр. Да. АУДИТОРИЯ: [недоловим]. SPEAKER 1: Long [недоловим]. И след това дълго време е двойно. АУДИТОРИЯ: Не, не. Дълга е само едно цяло число. Това зависи от архитектурата преди [недоловим] и междинно съединение има същия размер. [Недоловим]. SPEAKER 1: Така че, дълъг и на INT са еднакви. И тогава много, много дълго е два пъти по-Int. Cool. И тогава, какво е последният тип? АУДИТОРИЯ: Pointer. SPEAKER 1: Да, така научихме малко за указатели. И независимо от това, което показалка е сочейки да-- тя може да бъде Чар звезда или INT star-- тя винаги е 4 байта за показалеца. Въпроси за това? Да? АУДИТОРИЯ: [недоловим]? SPEAKER 1: Така дълго и INT са същото в този CS50 уред. АУДИТОРИЯ: Уредът са напълно взаимозаменяеми. SPEAKER 1: Да. Така че след това дълго време е двойно на вътр. АУДИТОРИЯ: Това е 32-битов? SPEAKER 1: 32 битов, да. АУДИТОРИЯ: Значи [недоловим]? SPEAKER 1: Да, ако това не стане изрично се каже, вие следва да поеме 32-битов. АУДИТОРИЯ: Той ще каже нещо като се приеме архитектура като уреда. За 64-битова, единствените неща, които климата са копнее и указатели. Те и двете [недоловим]. SPEAKER 1: Да? АУДИТОРИЯ: Въпрос. Така на един от тестовете на практика, го пита за един грозен Int. Така че как ще се определя от вътр [недоловим]? SPEAKER 1: Един грозен в също е 4 байта. Но това, което е различно за подписан INT и грозен INT? АУДИТОРИЯ: [недоловим]. SPEAKER 1: Точно така. Човек може да представлява отрицателни стойности. Но как да го направя това? АУДИТОРИЯ: [недоловим]. SPEAKER 1: Да, тя спестява 1 малко да представлява знак. Подписаният има един бит, който представлява знак. И грозен просто е всички позитиви. АУДИТОРИЯ: OK. Значи вие казвате, че двойно е два пъти размера на плувка? SPEAKER 1: Двойна е два пъти размера на плувка, да. АУДИТОРИЯ: Как показалка за много, много дълго [недоловим]? SPEAKER 1: Така че въпросът е как показалеца на дълго long-- как е, че само четири байта, когато много, много дълго си 8 байта. Така че да си спомня какво е указател, по същество, в много базовата стойност. АУДИТОРИЯ: [недоловим]. SPEAKER 1: Да, така показалка е само място в паметта. Така че това не е от значение колко място че стрелката сочи. Тя се нуждае само от 4 байта, за да следите на това място в паметта. Всякакви други въпроси? Cool. Така че последното нещо, което имам е стандартния изход. Можете да ги използвате често достатъчно, че можете да си спомните. Но това е, когато ние използваме ФОРМАТ, например. И ние имаме тези контейнери, които бяха наречени кодове формат. Така че процента в Чар, процента аз за вътр, и ние можем да използваме процента г. Това е едно и също нещо. Но, обикновено, в CS50 ние опитате да използвате процента аз. Процент е за оборотни средства. Процент LD за дълго, дълго и процента и за низ. По същия начин, ние сме били с помощта на няколко на тези аварийни последователности. Например, наклонена черта н за нов ред. Това е само за когато сте на форматиране вашия код за печат F. Да? АУДИТОРИЯ: Какво е процента г за? SPEAKER 1: Така че въпросът е това, което е на сто за г? Процент г е за цели числа. Процент г и процента и са еднакви. АУДИТОРИЯ: Каква е разликата между наклонена черта н наклонена черта и R? SPEAKER 1: Така че въпросът е каква е разлика между луфт н и хлабина R? Мисля, наклонена черта R е-- АУДИТОРИЯ: Значи наклонена черта R просто предполага се връща в началото на линията без всъщност отива на нов ред. Така че, ако отпечатате наклонена черта R и да се върнете в началото на реда след това да отпечатате повече неща, можете да презапише неща, които вече е на [Недоловим]. Като има предвид, п всъщност води до нов линия и отива [недоловим]. SPEAKER 1: Е, някакви други въпроси? Добре. Отивам да го оставиш в ръцете Дан, който ще продължи. [APPLAUSE] DAN: All десняк. Така че аз ще се говори за друг широк спектър от идеи от класа, в който са грубо представител на две седмици и началото на три седмици потегляне с леене, което е само начин на лечение на стойност на определен вид като на стойност от различен тип. Така че ние можем да направим това с символа на целочислени, поплавъци за цели числа, и дълги копнее да се удвоят. Всичко това може да се използва като начин за лечение на някои числова стойност Чар минус, тъй като някои други числена стойност. Така че има някои проблеми с това, на Разбира се, който идва, когато хвърли неща като плувка на целочислени. Така че това е малко странно. Имаме плувка, която е 1.31. Ние го умножете по 10 000. И тогава можем да го отпечатате като вътр. Какво прави този изход? 10,000 пъти 1.31. Така 13 000, е, че предполагам? АУДИТОРИЯ: Мисля, че е 10 000. DAN: Така че аз съм го умножи по 10 000 преди съм го леене. АУДИТОРИЯ: О. Няма ли да има едно 9 и някои 0 числа? DAN: Може да има някои странни цифри. Така че прав, това е 1,3 пъти 10000. Така че това е 13 000. И това допълнително weird-- АУДИТОРИЯ: 13100. DAN: 13100. Благодаря ви, Роб. И това допълнително weirdness-- този 9,9-- е просто, защото този кастинг се стигна до закръгляне надолу, където тя не трябва да има. Да. АУДИТОРИЯ: Кастингът се случва след нещо друго? DAN: Значи, защото имам това в печатен вид, тя прави това умножение, преди да го прави този кастинг. АУДИТОРИЯ: [недоловим]. DAN: Мисля, че ще хвърли първата, да, която ще бъде 10 000. Нещо друго? Cool. Така че това е 13 099. Защо се случва това? Неточността. Плувки не са съвършени. Те могат да представляват само номера към определен брой значещи цифри. Така че, ако ние разпечатате 8 SIG смокини върху този поплавък, ние получаваме един вид грозен търсите номер. И това е така, защото 1.31 не може точно да бъдат представени от прост правомощия на две в машината. Така че в крайна сметка като най-близо Предполагам, който се озовава е малко ниско. Направи ли смисъл? OK. Сега, включен са различен начин на прави условни конструкции, при които всички ние се грижим за е една променлива. Така че в този конкретен пример, ние сме получаване на цяло число от потребителя. И след това, което търсим в какво е това число е. Предполага се, че това е номер между един и четири. Това е, което ние ви молим. Така че направи ключ на името на променливата. Тогава се създаде случаите на възможна стойности може да бъде. Така случай, за да кажа, че е ниска. И тогава ще се счупи да се измъкнем на състоянието на ключа, така не продължавай. В следващия case-- така случай две и съдебната three-- ако това е случай две тя просто пада надолу, за да на първа линия на код го вижда като с главни и малки три, докато не вижда почивка. Така че причината да се получи един случай да само печат ниско е така, защото аз имат тази почивка тук. Ако, да речем, игнорира тази break-- ако хвърлих тази breakaway-- той ще отпечата ниска, а след това ще отпечатате средна, а след това може да се счупи. Така че почивките са важна част на превключване условия и те трябва да бъдат там. Всички случаи, които не са посочени изрично се обработват от по подразбиране случай в ключа и трябва да бъде изхвърлен. АУДИТОРИЯ: Така 1, 2, 3, и 4 е N? DAN: Стойности, че п може да бъде. Да. Да? АУДИТОРИЯ: Така че, когато имате че [недоловим]? DAN: Можете да отпечатате ниска, а след това той ще отпечата среда и а след това ще се счупят. АУДИТОРИЯ: Защо да го отпечатате средна, ако [недоловим]? DAN: Значи всичко под един случай преди почивка попада под. Така случай един печат е под случай един както е това след печат. Да? АУДИТОРИЯ: [недоловим]? DAN: Така че този номер е само конкретен стойност, която тази променлива може да вземе, нали? Това прави ли смисъл? Да. АУДИТОРИЯ: [недоловим]? DAN: Да, при две ще отпечата среден и след това почивка. АУДИТОРИЯ: [недоловим]? DAN: Мисля, че има такива? Какви други типове данни може да ви превключване? АУДИТОРИЯ: Можете да превключвате над всякакви типове данни. Но това означава, че само нещо над символа и цели числа и неща като това, защото Ако преминавате през показалка че не наистина да има смисъл, превключване натоварвания, ако дори и нека можете да направите това, защото на плаваща запетая в точност, не би наистина искам да направя, че така или иначе. Така че доста много, само цели числа и символа и подобни неща. DAN: Да, това е, когато имате изричното ценности, които вие знаете, аз мисля, че може да бъде че преминаването е действително полезно. Добре ли е? OK. Обхват е диапазонът, че декларираната променлива разширява. Така че в това малко парче код, което имам, това ще бъде пълен с грешки. И причината е, че декларираната тази INT и в обхвата на това за цикъл. И тогава аз се опитвам да съпоставяме Аз извън този обхват за контур. Така че основно, можете да мислите за обхват като нещо, което вие декларирате с вътрешна набор от фигурни скоби само съществува в рамките на тези фигурни скоби. И ако се опитате и да използва тази променлива извън тези фигурни скоби, ще получите съобщение за грешка от компилатора. Да? АУДИТОРИЯ: Така че този човек не иска да работи? DAN: Това не работи, да. Strings. String Чар *. Те са едни и същи. Те са само указатели към знаци. И всички струни, които трябва да приключат с наклонена черта нула, което е само С конвенция. Тя се нарича NULL терминатора. И NULL-- капитал N, U капитал, капитал L, капитали аз-- не е същото като NULL терминатор. Това е указател. Това е характер. Те са много различни. Не забравяйте това. Тя ще бъде на теста, най-вероятно. Аз не съм виждал викторината. Да? АУДИТОРИЯ: Значи NULL е, да речем, на показалеца? DAN: Да. АУДИТОРИЯ: Какво означава [недоловим]? DAN: Ако, да речем, изчистване се нарича, когато не разполагат с достатъчно памет, за да получите каквото размер питаш за, изчистване ще се върне NULL. Това е, общо взето, когато дадена функция е Трябваше да се върне на показалеца, трябва Трябва да се провери срещу NULL, защото NULL е доста good-- това е, един вид, стойността на боклук. Това е нула, доколкото указатели отиват. Всеки път, когато ти се обадя на функция, че връща указател. Вие ще искате да проверите, за да бъде сигурен, че това показалка не е NULL защото NULL е много чести. Това е нещо като завръщане боклук. Така че, ако нещо не отиде надясно, Просто се върне NULL вместо. АУДИТОРИЯ: [недоловим]? DAN: Да, и това е този. АУДИТОРИЯ: [недоловим]? DAN: тя правописа, тъй като това. Това е NULL терминатора. Той е с малки букви N-U-L-L, ако сте го правописа. АУДИТОРИЯ: И аз просто отиде назад и го изпитва. И ако се опитате да сложите с плаваща запетая стойност в ключа, тя ще ти крещя казвайки, отчет изисква изразяване на цяло число тип. DAN: Ето ти. Но да, това беше въпросът отново? АУДИТОРИЯ: [недоловим]? DAN: Значи капитал N, U капитал, капитал L, капитал L е действително в нещо. Това е показалеца на NULL и ще се третира само като такъв. Вие никога няма да се опита и правописа на NULL герой и да видим всеки друг начин от това. Да? АУДИТОРИЯ: Така че връщането към Чар макс или нещо в бележките, нали въплъщават същата функция като [недоловим]? АУДИТОРИЯ: Значи имате предвид връщане Чар макс от getchar, или каквото и да е? Публика: Да. АУДИТОРИЯ: Да, така генералът термин за всички онези неща, са индикаторни стойности. Така че като се върне вътр макс от GetInt Чар и макс от getchar, това е Трябваше да бъде като, добре, ако тези неща се завръщат при нас, нещо се е объркало. За съвети, ние просто се случи да има този страж стойност, която всеки изразява съгласие. И това е нещо, което се върнете когато нещата се объркат. Така Чар макс е това, което ние използваме да представлява нещо като NULL или getchar. АУДИТОРИЯ: Така че, ако сте тестване getchar, може ли просто сложи NULL? Бихте, които правят разлика? DAN: Не може просто да се покажат NULL. Вие ще трябва да се провери Чар макс, защото благодарение на върнатата стойност от функцията е а не характера на показалеца. Да? АУДИТОРИЯ: Този въпрос пита за дължината на низ. Това включва ли NULL характер? DAN: Не И това е всъщност как дължина низ знае как да спре, тъй като преминава през си масив от знаци, докато тя вижда NULL характер. И тогава тя е като всички Добре, аз съм направил. АУДИТОРИЯ: [недоловим] пет? DAN: Здравейте ще бъде пет. Да. Така масиви са непрекъснати блокове памет. Те имат незабавен достъп, като изречете име на масива и след това, в къдрава тиранти, независимо форум, който искате да отидете да, те са индексирани от нула през дължината на масива минус 1. И те са декларирани от типа на нещо, което сте съхранение в масив, името на масива, и тогава независимо от размерите е, че масив. Така че това е Чар масив с дължина шест че има следните стойности. Да? АУДИТОРИЯ: [недоловим]? DAN: Да. АУДИТОРИЯ: [недоловим]? DAN: Ако имате какво се случва в масива вече е направена. Така бихте могли да определите това, вместо като да речем, Чар, независимо от името на вашия масив е, празни скоби се равнява къдрави подпре H запетая E запетая L запетая L запетая O запетая NULL характер и фигурна скоба. Това също така ще работи като декларация. АУДИТОРИЯ: [недоловим]? DAN: След това трябва да има размера вече извършени. АУДИТОРИЯ: [недоловим]? DAN: Да. All десняк. Аргументи от командния ред са начин за получаване на данни от потребителя, както аргументи към основната. Main отнема два аргумента. Броят на аргументи, които се минаваше командния ред и А низ вектор или низ масив на всички аргументи. Така че, ако, да речем, се нарича функция, като например една точка от едно пространство, две пространство, три, argc ще бъде 4. И argv 0 би било точка от. Argv1 ще бъде 1. argv2 ще бъде 2. argv3 биха били 3, в този конкретен случай. Да? АУДИТОРИЯ: [недоловим]? DAN: Последният елемент в масива защото масивът е с дължина argc плюс един от argb, последният елемент е показалеца на NULL. Това е argc плюс 1. Така че, в случай, че току-що казах, то ще бъде argv 0 е точка от. argv 1 е 1 argv2 е 2. argv 3 е 3. argv 4, което е един голям от argc ще бъде NULL. И това е нулев указател. Да. И това е така, защото е низ Чар звезда е указател. Така че трябва да бъде един и същ вид. Да? АУДИТОРИЯ: Два въпроса. Така че едно, каква е разликата между това и GetString друг от един тип в потребителския двигателя? И второ, той се съхранява в неотдавнашното си памет? Така че, като, GetString би бъде [недоловим]? DAN: Къде се съхранява? Аз не знам къде да го съхранява. АУДИТОРИЯ: Така че, всъщност, знаете ли как всеки функционира ти се обадя, че е аргументи се съхраняват в стека? Така argc и argv са аргументи на основното и те са в стека, или наистина точно над това, което мислите, че като началото на стека. Каква беше другата част на въпроса? АУДИТОРИЯ: Така че това, което е [недоловим]? DAN: Да, това е просто различен начин за получаване на информация от страна на потребителя. Това е малко по-ефективен и това е по-удобно за скриптове, защото може просто да премине аргументи за вашия основен функция, а не да се налага да чакам за потребителите, ако те не разполагат с никакви потребители. АУДИТОРИЯ: И да, да струни ще бъде [недоловим]. Тя ще се съхранява на нещата, които се нуждаят. DAN: Да? АУДИТОРИЯ: [недоловим]? DAN: Да, argv 0 винаги включва точка наклонена черта на разговора функция. Да? АУДИТОРИЯ: [недоловим]? DAN: Да, всеки от аргументите са приключи през NULL характер, тъй като те са струни. АУДИТОРИЯ: [недоловим]? DAN: Да, argv argc е нулев указател. АУДИТОРИЯ: [недоловим]? DAN: О, да. Да, съжалявам. АУДИТОРИЯ: Значи [недоловим]? DAN: Така че въпросът е, ако сте имали командния ред точка наклонена черта една точка от 1, 2, би броят на командния ред аргументи да бъдат две или щеше да бъде три? АУДИТОРИЯ: Мисля, че това не е така наистина има значение. Склонен съм да кажа, о, ти не премине никакви аргументи от командния ред, когато Очевидно е, че сте се обадили на функцията. Така че съм склонен да вокално изключва функция от командния ред аргументи, въпреки че е включени в argv. DAN: Но, ако това е било в test-- Да-- а също и ако ви кажа нещо като argc в размер на 3, вие сте в безопасно състояние. Да? АУДИТОРИЯ: [недоловим]? DAN: Мисля, че ако вместо да извикат тази в argc и струнен argv скоби но остави същите видове и току що се обади тях нещо по-различно като и б, би тя все още работи? И тя все още ще работят, бихте просто-- вместо да се използва argc-- би трябвало да използвате а и б. Да? АУДИТОРИЯ: [недоловим]? DAN: Така че въпросът е GetString е ще се съхранява паметта в купчината защото GetString е знак *. Тя съхранява памет в хийпа, защото призовава сега изчистване в рамките на реалния изпълнение на GetString. OK, напред. Security. Така че, за да бъде наистина сигурен, можете да разчита на не една и позволи никой не достъп до всяка на вашата информация, поради което всеки изгражда свои собствени машини, свои собствени операционни системи, всичките им програми от нулата, и очевидно НЕ се свързвайте с други машини чрез интернет. Така че компютрите са несигурни. Те наистина са. Ние трябва да се доверите на други хора. И идеята за сигурност, е, че ти си Опитвам се да се ограничи количеството на доверие, което ви трябва. И един от начините да направите това е чрез криптография. Криптографията е, по същество, имаме тайни. Понякога ние трябва да преминат нашите тайни заедно през, да речем, в интернет или други неща. И ние не искаме хората да знаят тези тайни. Така че ние криптират нашите тайни в начин че ние се надяваме, никой не може да разбере. Така че ние used-- в хода на тази class-- неща като Цезар шифър и [Недоловим], които да са много, много несигурни начини за криптиране неща. Те са лесни за да разбера това, което те намирате и какви са вашите тайни. Реалният свят използва много по- сложни схеми за криптиране. И ние няма да получите в много повече от това. Debugging. GDB е най-добрият. Отивам да се подчертае това отново. Използвайте GDB през цялото време всеки път, когато имате проблем. Командите, които са полезни в GDB са пауза, която ви мине нито една линия номер, име на функция, по същество къде в кода, който искате да спрете, и да бъде в състояние да поеме контрола. Print отнема променлива и отпечатва каквото и да е променлива по това точка във вашето изпълнение. Следваща движи си изпълнение заедно една стъпка. И стъпка стъпки в рамките на дадена функция в изпълнение. Други неща, които се движат, което е как всъщност стартирате свой код. Продължи предприема всички необходими стъпки, за да стигнем до следващата почивка точка. А има и много, много други. Потърсете ги. Те са много добър начин. Да? АУДИТОРИЯ: [недоловим]? DAN: Да, което е дебъгер. Така дебъгер е програма, която ви позволява да развенчава вашата програма. Това не е програма, която намира за бъгове теб, все пак, че ще бъде страхотно. И на последно място за мен е търсене. Така видовете търсене, за които говорихме за в този клас са линейни търсене, която е само, че гледате през всеки елемент на пространството на търсене, един елемент в даден момент, докато не намерите това, което , което търсите или докато достигнете края на Вашето търсене на място, на което точка вие казвате, че не сте могли да намерите елемент, който сте били търсите. И това се прави в най-добрия константно време, която е 0 на 1 и в най-лошия линеен време, което е 0 п. Binary търсене, което се нуждае от користните елементи. Отиваш до средата на вашите елементи, виж, ако елементът, което търсите е по-голям или по-малък от елемента че сте в средата. Той е по-голям, вие казвате, че дъното на търсенето пространство е вашият текущото местоположение, в центъра, и рестартирате процеса. Ако тя е по-малка, изглеждаш каже че по-- Да, какво има? АУДИТОРИЯ: [недоловим]? DAN: Да. Всякакъв вид на вид, който е бил преподава в класа е честна игра за теста. [СМЯХ] DAN: А фактът, че не сте имали да го направя за проблем набор, че е справедливо игра за теста. АУДИТОРИЯ: Може ли да отидем над него как да-- DAN: Той ще мине през. SPEAKER 2: Действителната кода за [Недоловим] е на study.cs50.net. Така че, ако се вгледате в проблема на практика в страницата сливат вид study.cs50.net, там е кодът за прилагане слеят вид. Така че не е нужно да се приложат Направи си сам тази вечер. Но не забравяйте да го разбере по-скоро отколкото просто да го запомнят. АУДИТОРИЯ: [недоловим]? SPEAKER 2: Страницата сливат вид на study.cs50.net, там е практика проблем, който, ако чрез кликване на проблем, в края има решение, което е сливането изпълнение на сортиране. Но се уверете, че го разбирам а не просто да го запомнят или да го копирате надолу. АУДИТОРИЯ: И съвсем валиден проблем за изпита ще бъде нещо като ето списък. Какво означава този списък изглежда като след една стъпка от селекции на сортиране или вмъкване вид или нещо такова. Едно пълно повторение на списъка. Така че, дори ако не се окажете се налага да код за него, трябва да го разберем достатъчно, за да знам как става да се променят тази масив. DAN: Това е за мен. [APPLAUSE] LUCAS: Ей всички. Моето име е Лукас. Отивам да говоря за рекурсия, всички сортовете, които сме научили, а малко от всички указатели. OK? Така че, на първо място, рекурсия. Какво означава да се каже, че функция е рекурсивно? АУДИТОРИЯ: нарича себе си. LUCAS: OK, призовава себе си, да. Така че, като тази картина, например. Това е като на снимката вътре на картината и така нататък. Така например, можете да трябва-- като Dan че говорех за двоично търсене. Един начин, по който е двоично търсене рекурсивно е фактът, че вие ​​сте Опитвам се да намеря брой. Така че можете да преминете към средата. И след това да проверите, ако номерата там в ляво и в дясно. И след това, ако разберете броя е ще бъде в ляво, това е същото нещо като прави търсенето отново, но само на лявата страна на списъка. Така че това е начина, по който звучи като това е рекурсивно. Така че това е защо вие имате рекурсивни решение за сливане на сортиране. ОК, така че тук е един пример. Така че нека да кажем, че искам да се избере всички числа от 1 до п. Мога да осъзнаят, че сумата на N номер е п п плюс минус 1 до 1. Но тогава, ако аз гледам на п минус един плюс п минус две плюс едно, че е същото нещо като сумиране номера до п минус 1. Така че мога да кажа, сумата от равен сума равнява п плюс сумата от п минус 1. Това прави ли смисъл? И аз също ще има нещо друго нарича база случай, който е сумата на числата до до нула ще бъде нула. Така че веднага щом стигнем до броя нула, аз спирам да се брои. Това прави ли смисъл? Така че тук е един пример за това как Мога да го привеждат в изпълнение. Така че аз имам тази функция в някои. Това отнема цяло число п. Така че тук за първи път, проверете дали N е по-малко или равно на нула. Така че, ако това е по-малко или равно на нула, I върнете нула, което е нашата база случай. В противен случай, просто мога да се върне н плюс сумата на числата от един до п минус едно. Направи ли смисъл? OK. Така че тук е това, което изглежда. Имате сума от 2 равни 2 плюс сумата на 1. А някои от 1 е един плюс сума на 0, което е 0. Направи ли смисъл? Така че, ако се вгледаме в тестето си програма, това е това, което изглежда. Първо, ние имаме основната функция. И след това основната функция нарича сума 2. И тогава сума 2 ще кажа, о, сума 2 е равно на 2 плюс сумата на един. Така че мога да добавя сума в размер на 1 до комина. И сумата от 1 ще се обадя сума от 0, което е също така да се добавят до комина. И след това всеки от тези хора, които са на върха на друга трябва да се върне преди други такива, може да продължим. Така например, тук, сума на 0, на първо място, ще се върне 0. И след това изберете сума от 1. След това сумата от 1 ще върнете 1 до сумата от 2. И накрая, сумата от 2 ще да се върне от 3 до главната. Това прави ли смисъл? Това наистина е много важно да се разбере как стека работи и се опитват да да видим дали това има смисъл. ОК, така че сортирането. Така че, защо е важно за сортиране, на първо място? Защо трябва да ни е грижа? Някой? Дайте ми пример? Да? АУДИТОРИЯ: [недоловим]. LUCAS: Да, OK. Така че можете да търсите по-ефективно. Това е един добър начин. Така, например, ние имаме много неща, всъщност, в живота ни, че са подредени. Например, речници. Това е много важно да се разполага с всички думи в някакъв ред, че ние да получите достъп до лесно. Така че това е, което той казва. Можете да търсите по-ефективно. Помислете колко трудно би било да има речник в които думите са в произволен ред. Ще трябва да погледнете, доста много, всяка дума, докато намерите дума, която търсите. Ако използвате Facebook също, когато виждате вашите приятели, вие сте Ще видите, че Facebook сложиш близо приятел е на върха на тези, че да не се говори за това много. Ако отидем по целия път до дъното на списъка ви с приятели, ти започваш да се види хора, които най-вероятно дори не не забравяйте, че сте приятели с. И това е така, защото Facebook всевъзможни приятелите си на базата на това как сте близо до тях. Така организиране на данните. Също Pokemon. Така че виждате, че всички Pokemons имат номера. И това е като лесна начин за достъп до данни. АУДИТОРИЯ: Достъп Pokemon. LUCAS: Да. АУДИТОРИЯ: [недоловим]. LUCAS: Да. ОК, така че нещо като селекция. Избор на вид ще изберете най-малката стойност на несортиран списък всеки време на всяка итерация. Това е нещо подобно на вид, което правите в главата си, когато се опитвате да сортирате списък на ръка. По принцип, всичко, което правя е да изглеждате за най-малкия номер. Можете да я прати в сортиран списък. И тогава ще се търсят на Следващата най-малкия номер. И тогава ти продължаваш да правиш че и така нататък. Така че избора на подреждане е основната ви изберете всеки път, когато най-малките несортиран стойност. Сложете в края на Подредено част от списъка. И продължавам да правя това. Така че нека бързо да видите какво това прилича. Така че тук е сортиран и е сортиран списък. Така че за подредени на списък, това е първоначално празна. И тогава аз отивам да изберете най-малкия номер тук, което е 2. Така че аз се броят два и сложих в предната част на списъка. И тогава аз гледам за следващата по-малка елемент, който е 3. Така че аз го слагам в края на сортирани списъка. И тогава аз продължавам да правя това. Намирам 4 и го сложи в края. Намери 5 и го сложи в края. И погледнете как всички тези пъти, че Казвам го сложи в края е, основно, смяна две стойности. OK? И тогава последната една, просто още един елемент. Така той вече е сортиран. ОК, така вмъкване вид. Insertion вид ти започваш да имат също това нещо, че е по-подредени и на несортиран списък. Единственото нещо е, че всеки път, когато добавяте елемент към Подредено списък, можете просто да изберете елемент, който е в предната част на сортиран списък. И тогава започваш да се намери това, което позиция трябва да бъде в сортирания част от списъка. Нека да видим какво е, така че това това прави по-дълбок смисъл. Така че първоначално, например, аз се опитвам да въведете номер три в Подредено част на списъка. Така че списъкът не е нужно нищо. Така че аз може просто да постави под номер 3. Сега, аз искам да добавите номера 5 до сортирания част на списъка. Така че аз гледам на броя 5. Прави ми впечатление, че това е по-голямо от 3. Така че аз знам, че тя трябва да бъде след три. Така че сложих 3 и 5. След това искам да вмъкнете номер 2. Забелязвам, че номер 2 е всъщност продължи след 3, както и 5. Така че аз всъщност трябва да постави всички го начин в началото на списъка. Така че трябва да, вид, SHIFT всички елементи в списъка подредени, така че аз мога направи място за номер 2. Тогава виждам номер 6. Виждам, че тя трябва да бъде след 5. Така че аз го слагам там. И накрая, аз гледам на броя 4. И забелязвам, че трябва да бъде между 3 и 5. И тогава аз го слагам там и промяна всички други елементи. Направи ли смисъл? Bubble Sort. Така балон вид е основно това, което сте ще направиш-- ние го наричаме балон вид, защото ако минеш през list-- това е действително по-добре, ако просто се покаже искате това-- и ти започваш да се сравни съседни числа. И ти започваш да прекарат позиции, ако те не са в правилния ред. Така че основно, какво ще се се случи, е тук, например, имате 8 и 6. Вие знаете, че сортираните поръчка ще действително да бъде 6 и 5, нали? Така че ти започваш да сменяте поръчките. Тогава виждам 8 и 4 тук. И аз правя едно и също нещо. I сменяте отново. И накрая, 2 и 8. Аз също ги разменят. Тя се нарича Bubble Sort защото след всеки от тези повторения, всъщност, най-голям брой в списъка получава всички чак до края на списъка. Това прави ли смисъл? Тъй като това продължава да го смяна и тя се движи надясно. ОК, така че това е втората итерация. Това ще бъде едно и също нещо. Аз ще направя един суап и След последната една. Аз, че няма суапове и списъкът се сортира. Така че в Bubble Sort, ние основно се запази преминава през списъка и смяна неща, докато не забележат, че не съм направил всички суапове правят това повторение, които означава, че този списък е вече подредени. Направи ли смисъл? Нека поговорим малко за времето за работа. Така че вие ​​си спомнят Big O, Omega, и Theta? Да? Добре, какво е Big O, на първо място? АУДИТОРИЯ: [недоловим]. LUCAS: Да, това се нарича най-лошия случай по време на работа, което просто означава, че това е колко очаквате програмата да предприеме, за да се изпълнява. Например, по отношение на-- в тази case-- п. Броят на елементите в списък в най-лошия случай. Подобно, в най-лошия възможен случай. Така че за Bubble Sort, например, имаме Big O на п квадрат. Защо имаме това? Защо е Bubble Sort Big O н квадрат? АУДИТОРИЯ: [недоловим]. LUCAS: Да, така че най-лошия случай ще бъде че аз ще трябва да направя N повторения. Така всеки от повторения ще въвеждат най-големият елемент до края от списъка. Така че най-лошия случай е, че имам да направя това нещо п пъти. И за всеки един от тези пъти, аз трябва да направи н суапове, защото аз трябва да се сравняват всеки два елемента. Така че това е защо тя се п квадрат защото това е п пъти п. След това, избор на подреждане е също н квадрат защото за всяка итерация, аз трябва да разгледаме всеки един елемент в списъка. И след това се намери най-малката, което означава, че аз трябва да погледнете през наш елементи. И аз трябва да направя това, че п пъти, защото Трябва да изберете всички н елементи. Вмъкване вид е също н квадрат защото най-лошия случай ще да, един, трябва да поставите N номера, нали? Така че аз вече знам, че аз отивам да има N повторения. Но за всеки един от тези номера, ако имах да разгледаме всички номера в подбраният списък и го сложи целия път в предната част, която ще бъде N квадратен защото това ще бъде N пъти п отново. Направи ли смисъл? Какво ще кажете за омега? АУДИТОРИЯ: [недоловим]. LUCAS: Това е най-добрия случай. Така че това е като в много пъти за сортиране, най-добрия случай е когато списъкът е вече подредени. Така че наистина не са да се направи нещо. Bubble Sort има най-добрите сценарий на п. Смятате ли, момчета знаят защо? АУДИТОРИЯ: [недоловим]. LUCAS: Да, ако следите дали дажба данни имали някакви суапове или не, ако имате нещо подобно положение вярно, ако имаше повторение, ако е на списък е вече подредени, общо взето, какво ще се случи, е, че аз отивам да опитайте да сменяте всеки две съседни елементи. Отивам да видя, че не съществуват суапове. И аз просто се върне веднага. Така че това означава, че аз просто трябваше да проверете списъка един път. Така че това е п защото изглеждам в наш елементи. Защо селекция вид н квадрат? Да, дори и ако списъкът е сортиран, за всяка итерация на избор на сортиране, I Трябва да изберете минимум елемент. Така че това означава, че аз трябва да търси на всички елементи в несортиран изброят и да намерят минимум за всяка итерация. Това прави ли смисъл? И вмъкване меч е N, тъй като в случай, че се опитвам да вмъкнете номера и всички числа, когато аз се опита да ги вмъкнете, виждам, че те са в правилната позиция. Не е нужно да проверя всички останали номера в несортиран списък. Така че това е защо тя ще бъде п. Направи ли смисъл? И това, което е тета? АУДИТОРИЯ: [недоловим]. LUCAS: Какво, извинявай? Кажи го отново. АУДИТОРИЯ: [недоловим]. LUCAS: Точно така. Така че можете да видите, че само избор съхраняват в Merge вид имат thetas. И това е така, защото имате само тета ако и двете Big О и Омега са еднакви. OK. И най-накрая, се слеят Сортът е в дневника п. И тогава, както Дан казвах, Обединяване на сортиране е нещо като по същия начин, правиш двоично търсене. Така че, можете да получите в списъка. И ти започваш да се намали наполовина. И тогава ще ги нарежете в малки половини. И тогава можете да ги обедините. Вие, момчета, не забравяйте, че, нали? OK, както той казваше. OK, показалки. Така че това, което е указател? АУДИТОРИЯ: [недоловим]. LUCAS: An адрес. OK. Знам, че Дейвид показва куп клипове на Бинки и неща, сочещи всеки друг. Но аз обичам да мисля за указатели просто като адрес. Така че това е променлива, която ще да се съхранява на адрес. Така че това е просто тази специална променлива че е дълъг четири байта. Не забравяйте, че показалеца на всичко е винаги четири байта, за нашата 32-битов машина, така че случаят с уреда. И тя просто има местоположението на променлива вътре в него. ОК, така че тази памет, общо взето. Така че всеки блок от памет всъщност има етикет, който е адресът на slotty памет. Така че това означава, че мога да имам показалец, насочен към всеки от тези адреси. Така че причината, поради която ние ще използваме указатели е ако трябва да се помни мястото че конкретна променлива е памет. И вие не забравяйте, че един от тези, случаи е, ако имам функция ако имам действително искате да суап за реала, аз всъщност Трябва да изпратите показалка. Не е променлива. Вие, момчета, не забравяйте, че? Between-- The разлика какво е името? Обаждане по стойност и призова чрез препратка, нали? OK, да. Така се обадя по стойност. Когато трябва само да изпратите една променлива да функционира сте просто изпращане на стойност. Значи всъщност изпращане копие на променливата. А вашата програма не може да се грижи по-малко Ами ако една и съща променлива всъщност прави копие. И нарече по референтен означава, че Аз съм всъщност изпращане на копие от указател към тази променлива. Така че това означава, че аз съм изпращането на Местоположение на тази променлива. Така усещам Имам местоположението на променлива, когато аз наричам функцията с указатели, аз съм в състояние действително да промяна на данните, които е бил в главната. Направи ли смисъл? Въпреки, че показалецът е копие, на указател все още има реалния адрес на променливата, че искам да се променя. Направи ли смисъл? Така че създаването на указатели. Не забравяйте, че показалеца винаги има типа, че това е сочейки да и след това звезда. И тогава ще ви постави името. Така че не забравяйте, че винаги, когато имате каквото звезда, това е като указател към че каквото и променлива напишете, че сте имали. Така че тук в звезда, например, това е указател и число. И след това слага звезда е указател Чар звезда и така нататък. Да? АУДИТОРИЯ: Какво става, ако имаме указател към п звезда х. Знам, че се създава указател към х. Дали той също декларира х цяло число? LUCAS: ОК, така че, когато ти казват н звезда х, не сте създаване на показалец към променлива х. Вие създавате показалеца кръстен х. АУДИТОРИЯ: [недоловим]. LUCAS: Така че, когато казвам, п звезда х, аз съм казвайки, хей, в паметта, аз отивам да получи един от тези три кутии. И аз отивам да се каже, че това ще бъде X, който е Ще бъде показалка. И нещо интересно за указатели е, че ние казваме, че те имат 4 байта за 32-битова машина. И причината за това е, че 4 байта са 32-бита. И машини, които са 64 бита всъщност имат указатели адреси които са дълго 64 бита. Така че това просто означава, че размерът на адреси в машината е различна. Така Отбелязване и Dereferencing. Има двама оператори, които вие трябва да запомнят. Първият е амперсанд. Вторият е звезда. Не се бърка с тази звезда и това звездният защото си спомням, че в този случай, имате п звезда. Това е като цяло нещо заедно. Няма по п пространство звезда. Така че това означава, че тя е от типа. Не забравяйте, че когато имаш променливата звезда, ти си говорим за вида. Когато имате само звезда и след това на име на променлива, това означава, че сте dereferencing показалеца, който означава, че вие ​​търсите в показалка, намирането на адреса, че е посочвайки, отиваш на този адрес, и гледаше, когато имате там. Така че аз казвам на моите студенти, че когато имаш звезда, трябва да мисля, че това е съкращението на съдържанието на. Така че, ако имате показалеца и вие направи звезда показалеца, това е съдържание на показалеца. Така че отидете на каквото и да е, сочещи към и погледнете в постоянна съдържанието. И амперсант е същият нещо като адрес. Така че, ако имате променлива A-- подобно, нека се каже, че съм направил вътр А е равно на 3-- ако искате да намерите на адреса на тази променлива с памет, просто мога да направя амперсанд а. Така че това е адрес на един. Направи ли смисъл? Така че тук е един пример. Това липсва вътр б и вътр в. Така вътр А е равно на 3, което значи, че Отивам да отидете на паметта. И аз отивам да се намери слот и постави под номер 3 тук. И тогава вътр б равнява на 4. Отивам да правя едно и също нещо. Отиди на паметта и постави редица 4 в една от кутиите. И INT се равнява на 5. Намерете още една кутия и сложи номер 5. Така че какъв е този ред правиш? п звезда годишно се равнява амперсанд а. Така че, на първо място, п звезда годишно. Какво е да го прави? АУДИТОРИЯ: [недоловим]. LUCAS: Да, така п звезда годишно, на първо място, декларира указател наречена БКП. И след това е присвояване на стойността на че стрелката да бъде адрес на. Така амперсанд а. След това, ако го направя звезда Pb, какво е звезда Pb? О, съжалявам. Това също липсва. п звезда Pb. Искам да кажа звезда бр. Толкова съжалявам. Това е едно и също нещо. Но сега съм добре ар създаване на показалец да Б и след това указател към C. Да? АУДИТОРИЯ: [недоловим]? LUCAS: Да. Така че, ако отидете на паметта и да отидете полето, което е обозначение за БКП, вие всъщност ще виж адрес на. OK? Да? АУДИТОРИЯ: [недоловим]? LUCAS: Да, показалеца е един адрес. Никога не забравяйте това. Това е като най-важното част за указатели. Има съхраняване и адрес някои променливи. Нещо друго? Всякакви други въпроси? OK. Така Указатели и масиви. Не забравяйте, че когато правя INT масив 3, По принцип, това, което аз правя е, че аз съм, вид на, за обявяване в показалеца. Така масив е нещо като указател към специфично място в паметта, в които съм разпределени три слота за числа. Това прави ли смисъл? Така че, когато аз правя INT масив 3, това, което аз съм прави, общо взето, е създаването на три слотове в паметта. Така че аз просто намери три слота в паметта. Така че, ако го направя, след това, една звезда масив, то в общи линии означава, че съдържанието на масив, което означава, че изтриете показалеца, отивам на това място, че тя да сочи на, и сложих номер едно. И тогава, ако го направя звезда масив плюс 1, това е същото като да правиш масив конзоли едно, което просто означава, отивам да на мястото, което тя сочеше. И тогава марките плюс 1 ми се измести с една позиция. Така че отивам към тази позиция, всъщност, и сложи номер две. И тогава, най-накрая, когато го направя масив плюс 2, отивам там, където посочващо масив е най. И тогава аз се премести в памет блокове. И след това сложих броя три тук. Да? АУДИТОРИЯ: Значи звезда масив е просто заявявайки, че много първата точка. И вие можете да добавите 1, само защото ние сме само наистина съотнасяне, че първият адрес. LUCAS: Да. Защо, например, да речем масив 0, гама 1, гама и 2? Казвам, защо се занимаваш 0, 1, 2, 3, вместо на 1, 2, 3? Една от причините за това е, един, компютър програмисти предпочитат да започнат брои от 0. Две е така, защото, когато правиш масив 0, това е същото като да правиш масив плюс 0, което означава, че ще отида да тази позиция, а аз не пропуснете никакви памет блокове. Така че аз не се движат никакви памет блокове. Да? АУДИТОРИЯ: [недоловим]? LUCAS: И така, тя пита какво е разликата между това това или това изчистване. Една от разликите е, че INT масив 3 е създаването на масив на стека. И когато го направя изчистване него, създава на куп. Това прави ли смисъл? И така, как изчистване действително работят? Така че, защо ние дори трябва да използвате изчистване? Вашият компилатор вид фигури от всички променливите, които ви декларирани. И той създава пространство за всички ги на в стека. Така че всичките си променливи ще да бъде някъде в стека. Така че тук е на околната среда променливи. Така че основно, място за променливите в паметта се разпределя в време на компилация. Така че това означава, че вашият компютър има да знае всички тези променливи предварително. Тя не трябва да се знае каква стойност ти започваш да се постави в тях. Но той трябва да знае как много памет ви трябва. Но сега нека да кажем, че, например, създавате масив или приемате низ, който вие приемате от потребителя. Ти не знаеш колко дълго низ ще бъде, например. Така че не знам точно колко Блокове на паметта ви разпределят, нали? Така че не наистина да има смисъл за да се каже, сложи 100 знака. И после какво, ако потребителят пише 150? Ще бъдат прецакани. Така че, общо взето, не можете да бъдете сигурни в това как много памет, което трябва да се разпределят когато компилирате програмата. Ти просто знаеш, че по време на протичане. Така че това е защо имате куп. Така че купчината ще има памет че сте разпределяне по време на продължителност на изпълнението на програмата. Така че основно, когато правиш изчистване, какво , което правиш, е разпределението на паметта на по време на работа, което означава, че вие ​​сте вземане на решение точно в този момент, че сте трябва да има, че паметта. Така че, това е, когато сте го разпределяне. Това прави ли смисъл? Така че не забравяйте, стека има променливи които са създадени по време на компилация. И тогава купчината има променливи , които са създадени като отидеш с изчистване, например. АУДИТОРИЯ: [недоловим]? LUCAS: Значи GetString е Ще се обадя на изчистване. Нека да говорим за изчистване, и Ще обясня GetString. Така изчистване е едно и също нещо като заделяне на памет. Така че ще се разпредели памет на куп. И това няма да се върне указател към когато тази памет е бил присвоен адрес. Така че, когато направиш-- тук за example-- п показалеца звезда. И тогава показалка равнява изчистване размер на инчови пъти 10. Аз съм създаване на показалеца. И тогава аз съм възлагане че показалеца стойността на показалеца, че изчистване ми дава. Така че аз питам изчистване може да ви отпусне пространство за 10 числа. Това е, което той казва. И изчистване ми дава назад указател към това място. Направи ли смисъл? OK. I И GetString е, общо взето, прави призовавам към изчистване, така че могат да отделят памет по време на изпълнение. Винаги помнете, за да проверите за нищожна защото изчистване ще върне нулев ако не може да бъде заделена памет. Да речем, че ви помоля за една смешна количество памет. Вашият компютър няма да бъде в състояние да разпредели че много. Така изчистване е просто ще да се върне нулев. Така че винаги да помним, за да проверите дали показалка, че имаш от изчистване е нищожна или не, защото, ако е така, може да се се dereferencing показалка и причинява странични дефекти. И накрая, не забравяйте Вашата свободна памет. Изчистване е създаването на памет в купчината. И вие трябва да освободите паметта преди програмата да свършва. ОК, това е всичко за мен. Съжаляваме, Роб. Благодаря. [APPLAUSE] LUCAS: Някакви последни въпроси преди Роб идва? Не? Да? АУДИТОРИЯ: Аз не виждам това един онлайн. Били го качил все още? LUCAS: Мисля, че Дейв е да го качите скоро. DAVE: Ще бъдат публикувани. LUCAS: Той ще бъде на линия. АУДИТОРИЯ: Това зависи. LUCAS: Това е нагоре? OK. Да? АУДИТОРИЯ: [недоловим]? LUCAS: Да, трябва да освободи всички памет, която се поставя в купчината. АУДИТОРИЯ: [недоловим]? LUCAS: Да. Всеки път, когато имате изчистване култура, вие трябва да имате култура безплатно след като спрете да използвате променлива. Така изчистване и свободно са винаги заедно. Най-добрите си приятели. Да. Роб? ROB: Аз ще отида бързо. А също и видеото ще бъдат поставени. Имам микрофона нататък. ОК, така че седмица пет неща. Първото нещо, което имаме, е стека. Така че не забравяйте, че има само един стек кадъра в активна функция повикване. Ще видим, че в една секунда. И също така не забравяйте, какво всъщност се отива във всеки стек рамка ще бъде локалните променливи на нашите функции, аргументите, които са преминали в нашата функции, заедно с двойка други неща, които наистина не трябва да се притесняваш. Така че ето един пример програма, когато, предизвестие, основната е printfing връщането стойност на Foo 4. Foo е просто ще се върне стойност на бар четири запетая 6. И бар ще се създаде някакъв локален променлива п равно на 4 пъти 6. И след това се върнете п. Така че нека да погледнем стека през действителната итерация на тази програма. Така че там е най-долната част на нашия стак. Не забравяйте, че стека расте. Така в дъното на нашия комин, ние има една купчина рамка за основното. Когато програмата се стартира, главен винаги ще бъде в дъното на нашата купчина. И това, което е вътре в нас стека рамка за основното? Така че, въпреки че няма местни променливи към основната, както казах и преди, сме argc и RGV предприемането пространство вътрешността на главен стека рамка. Така че основната сега ще наричаме функция Foo. А това означава, Foo ще се своя стак рамка. Така че сега ние сме вътре на Foo функция. И това, което трябва да отидете в стека рамка Foo е? Е, Foo има аргумент п. А п е равно на 4, тъй като това е, което Основната минава като аргумент Foo е. Така че сега Foo ще се обадя бар. Какво е бар ще има вътре на своята "стека рамка? Тя има X равно на 4 г равно на шест. Това не е всичко, че ние ще имаме в стек рамката защото бар също има локална променлива п. И н отиваме да зададете равен на 24. Така че сега бар ще се върне п. Така бар се завръща от 24 до на Foo стека рамка. И тъй като бар сега е връщане, че означава, че ние сме се пръкват рамката стак за бар на разстояние от стека. Така че всичко, паметта, която бар е бил използване на предприятието е от стека. Сега, Foo е също така ще за да се върнете 24 към основното. Така че сега, че Foo се завръща, паметта че Foo е използвал в своята " стека рамка също е изчезнал. И сега, основното е да се обади ФОРМАТ. Така ФОРМАТ е просто още една функция. Когато ние наричаме ФОРМАТ, той ще бъде друг стек рамка за ФОРМАТ извикване на функция. Какво минава ФОРМАТ? Това е, което се случва да отида на неговата купчина рамка. Най-малкото, ние сме минаваща че сто и обратно наклонена черта н и аргумента, 24. Може да има повече в това е стека рамка ако ФОРМАТ се случва да се използва някаква локални променливи. Ние не знаем. Но всичко това отива в ФОРМАТ е стека рамка. Тя ще изпълни ФОРМАТ. След това ФОРМАТ е направено. Той ще се върне. И накрая, основният е направено. Main ще се върне. И тогава нашата програма е направено. Да? АУДИТОРИЯ: Има ли виждам [недоловим] аргументи [недоловим] параметри? ROB: Така че има малка разлика между аргументи и параметри. И наистина, в общ говори, хората са склонни просто да ги смесват през цялото време. Но параметри са формалната Име на нещата. Така argc и argv са на параметри на Майн. Аргументите са това, което всъщност премине в тези параметри. Така че, когато аз наричам Foo на 4, 4 е аргументът, аз съм преминаване вътре. И параметъра п, вътре в Foo, отнема от стойността 4 тъй като 4 е аргумент. АУДИТОРИЯ: [недоловим]? ROB: п е локална променлива в бара. п е все още местно до Foo, но това е параметър на Foo. Това не е локална променлива. Да? АУДИТОРИЯ: [недоловим]? ROB: Foo се обаждам бар и връщане на каквито и бар възвръщаемост. АУДИТОРИЯ: [недоловим]? ROB: Да, само за да видя множествена стека рамки. Да? АУДИТОРИЯ: Защо се нарича Foo преди ФОРМАТ? ROB: Защо е Foo извикана преди ФОРМАТ? Така че би могло да има, вместо това, е направил нещо като INT х е равно на Foo от 4 и след това отпечатани х. Но вместо това, аз се комбинира функцията поставя под аргумента ФОРМАТ. Но забележете, че ние не можем действително изпълни призива за ФОРМАТ докато ние разбера какво е Foo от 4. Така че отиваме да се оцени това. И само след като това е направено ще да се върне и да се оцени това. Да? АУДИТОРИЯ: Тъй като и бар [недоловим] стойност, защо не трябва [недоловим]? ROB: Те трябва да бъде напълно Int. Това не бе заловен през множество пасове. Така че тя трябва да бъде вътр бар и вътр Foo тъй като и двете от тези се завръщат числа. Void е само ако те не започваш за да се върнете на действителните стойности. Да? АУДИТОРИЯ: Ако сте имали линия над връщането, [недоловим]? ROB: A Линия над връщането? Публика: Да. Например, ако си направил ФОРМАТ и [недоловим], ще го отпечатате два пъти? ROB: Значи вътре Foo? Ако имахме ФОРМАТ точно тук? Публика: Да. ROB: Така че, ако имахме право ФОРМАТ тук, това ще отпечата веднъж. Тъй като ние призоваваме Foo веднъж полето тук, а след това ние ще се удари в ФОРМАТ. След това ние ще се обадя бар. И тогава Foo ще се върне. И това е всичко. Ние само някога срещнете на ФОРМАТ веднъж. Да? АУДИТОРИЯ: [недоловим] ФОРМАТ обажда Foo защото сме първи призовава ФОРМАТ и след това ние сме минаваща аргументите. ROB: Така че на теория, не е ФОРМАТ обажда Foo? Така че не. Просто реда, че в ще се изпълни тези неща е, преди да можем да наричаме функция, всички аргументи на функцията трябва да бъде напълно оценена. Така е този напълно оценен? Да, това е просто низ. Това е само една стойност. Тогава ние трябва да напълно оцени това. След като това е направено, сега всички неговите аргументи са оценени. И сега можем да направим призовавам да ФОРМАТ. Да? АУДИТОРИЯ: Един въпрос. Ако имате функция за нищожен, трябва имате възвращаемост запетая? ROB: Не правя връщане запетая ако имате функция за невалидни. OK. Така че сега някои куп неща. Така грамада е как ние ще се справим с динамично управление на паметта. И това директно контрастира с Пакет, който бихме нарекли автоматично управление на паметта. Така в стека, никога не сте наистина трябва да се занимава с това как местните променливи се избута и пръснах всички тези стека рамки и всички тези неща. Не е нужно да се притеснявате за него. Това е автоматична. Така че купчината е ръчна. И [недоловим] идва от тези функции изчистване и безплатно. Така че тук е друга програма. Всичко, което правим е mallocing цяло число. Ние сме го приберете в звезда х. Разбира се, ние трябва да се провери за да видите дали х е нула. След това отиваме просто да определя какво х е насочена към 50. Печат какво х сочи, печат X, и след това свободно х. Е, как става това всъщност ще изглежда ако погледнем нашия стак и купчина? Така че ние ще започнем отново. Дъното на нашия купчина, както преди. Не забравяйте, че те натрупам директно противопоставя на стека? Така че отиваме да имат началото на нашата купчина там. Така дъното на нашия комин, имаме нашата стека рамка за основното. Той има пространство за argc, argv и ние Сега имаме локална променлива х, която е вътр звезда. Така че отиваме да превъртите чрез тази програма. Първото нещо, което имаме, е призив за изчистване. Така че ние правим призив към изчистване. Изчистване е функция. Това ще получите купчина рамка. Какво ще се премине към изчистване? Това ще влезем вътре на рамката купчина. Ние сме преминаване размер на N, което е с 4. Така, че се предава на изчистване. Какво означава изчистване направя? Тя ни грабва някои пространство на куп. Така че ние ще отидем на куп. И ние отиваме, за да вземете 4 байта от купчината. Така че нека просто да дам, че произволен адрес. 0x123 Просто си представи, че е адрес, който е на куп. Така че това, което е всъщност вътре на тази област на паметта на адрес Ox123? Garbage. Така че ние не сме се съхранява всичко в него. Така че, доколкото знаем, той Може да е всичко. Не трябва да приеме, че тя е равна на нула. Това е най-вероятно не е нула. Така че сега изчистване възвръщаемост. И какво правим, когато се връща изчистване? Ние си поставихме за какво се връща. Зададохме х равни на това, което тя се връща. И така, какво е да го върне? Това е връщане 0x123 тъй като това е адрес на блока на паметта, че просто разпределени в купчината. Така се върне 0x123 х сега ще бъде създаден равна на 0x123 които картинно, ние често се направи като х с действително стрелка сочеща към този блок. Но х е просто съхраняване на този адрес. Така че сега ние трябва да се провери, ако х е нула. Това не е нищожна. Ние се преструваме, че това изчистване успя. Така че сега звезден х е равно на 50. Така звезда си спомня това означава, отидете на този адрес. Така 0x123 Отиваме отидете на този адрес. Така че това ни води до там. Какво правим на този адрес? Ние сме съхраняване 50. Така след тази линия, това е, което нещата ще изглеждат. Така че сега това вече не е боклук там. Сега знаем, че 50 е в тази специално адрес, защото ние го настроите до това. OK? Така че сега ние отиваме, за да отпечатате F. Така че първо отиваме да отпечатате звезда х. Така че това, което е звезда х? Отново, звезда х означава, отидете на нещо, че х е насочена към. Така че х е съхраняване 0x123 Go до това. Ние получаваме 50. Така отпечатате е това. А това означава, че ще отпечата 50. И след това, че се връща. И след това ние имаме втора ФОРМАТ. Ние сме сега на сто стр. Ако не сте го видели, че е просто как да печатате на показалеца. Така че ние имаме процента I, процента F, и всички тези вече. Така процента стр, отпечатайте показалка. Така че х е указател. Така че, ако ще да отпечатате х себе си, ние сме печат, което е всъщност вътре х, която е 0x123 Така че първото печат е ще отпечата 50. Вторият печат F ще да отпечатате 0x123 Да? АУДИТОРИЯ: Използвате ли процента х да отпечатате показалка? ROB: И така, да използвате процента х да отпечатате показалка? Така че можете, но процента х е просто, общо, за като, ако имате някаква число и искате да отпечатате него като шестнадесетичен вид. Това е просто как го правиш. Като има предвид, че процентът на г би отпечатате като десетични. Това бяха стигнем процента г. I е просто число. процента р е специално за указатели. Така че х е указател. Искаме да използваме процента стр. Но процента х биха могли да работят. Да? АУДИТОРИЯ: [недоловим]? ROB: Да. Най-малко за това, така че аз call-- не го включи в тук. Но тези два аргумента са непременно вътре в този купчина рамка заедно с всички локални променливи ФОРМАТ се случва да бъде използвате. И тогава следващата покана да ФОРМАТ сега вътре в ФОРМАТ стека рамка е процента р н наклонена черта и независимо от стойност на х е, което е 0x123. Да? АУДИТОРИЯ: [недоловим]? ROB: Това ще отпечата нещо който изглежда по този начин. АУДИТОРИЯ: [недоловим]. ROB: Така че това го отпечатва в адресната форма. Прилича на адрес. Да? АУДИТОРИЯ: [недоловим]? ROB: Защо е това? АУДИТОРИЯ: [недоловим]? ROB: Защо е тази показалка 4 байта? Така че има един куп от 0 е пред това. Така че това е наистина 0x0000000123. На 64-битова система, нямаше да има цял куп повече нули. Да? АУДИТОРИЯ: [недоловим]. ROB: Така че първото ФОРМАТ ще print-- АУДИТОРИЯ: [недоловим]. ROB: Да, това се случва, за да отпечатате какво х сочи. Star казва какво е това нещо, сочейки. Вземете го. Така че това, което е тя посочи? 50. Вземете го. Това е, което ние отиваме да отпечатате. Като има предвид, следващия, ние сме просто печат х себе си. Какво е вътре е? 0x123. OK. И тогава, най-накрая, ние имаме безплатно. Какво ще се премине към свободен? Ние сме преминаване х. Това време аз всъщност показва това в рамките купчина. Така че ние сме преминаване на стойността 0x123 за да освободите. Така че сега безплатно знае, нали, Трябва да отида до купчината и свободно, че паметта. Тя вече не се използва това, което е на адрес 0x123. Така безплатно ще се освободи че от купчината. Сега нашата купчина отново е празна. Имаме няма течове на паметта. Сега безплатно ще се върне. Забележете, че х е все още 0x123. Но това вече не е валидна памет. Ние вече не би следвало сочен х. Да? АУДИТОРИЯ: Дали ще върне 0 излишни? ROB: Е returen 0 излишни? Да. Ние просто сложи това там, защото имаме връщане една за въздух. Така че това е като, да, позволява включва връщането 0. Да? АУДИТОРИЯ: [недоловим]? ROB: Така след безплатни х, какво ще се случи, ако ние се опитваме да сочен показалеца? Това е възможно, че нищо не е наред. Това е възможно, че ние все още ще получите 50. Възможно е, също така, че тази памет е сега се използва за нещо друго. Така че това е неопределено поведение. И неопределен означава нищо може да се случи. Да? АУДИТОРИЯ: [недоловим]? ROB: Не, така че ако зададете X към нещо друго. Така че, ако точно тук казахме х е равно на изчистване нещо else-- изчистване размер event-- след това, че първоначалната блокова на паметта не се освобождава. И ние сме го загубили официално. Това е изтичане на памет. Загубихме всички позовавания в този блок на паметта. Така че няма начин ние някога може да го освободи. ОК, така че след това се върнете 0 средства направили. Добре, препълване на стека. Каква е идеята тук? Така че не забравяйте, грамада е захождането. Stack се покачва. Така че това е примера от лекция, Мисля, където основната е просто ще наричаме тази функция Foo, което се случва да се нарича рекурсивно отново и отново. Така стека рамки ще се работи точно същото. Така че ние ще започнем с основното като дъното купчина рамката. Тогава основното е да се обади Foo, които ще се получи купчина рамка. Тогава Foo ще се обадя Foo отново, което ще се получи, друг стек рамка. И след това отново, и отново, и отново, и отново, докато, в крайна сметка, ние тичам в купчината. Така че това е начина, по който се с препълване на стека. И в този момент, вие SEG вина. Или бихте наистина SEG виновен преди тази точка, но да. АУДИТОРИЯ: Има ядро ​​зареже същото като SEG вина? ROB: Така ще видите сегментиране основната вина заряза. Можете да получите ядро ​​бунище, когато вие SEG вина. И това е като изхвърляне на всички от съдържание на текущата си памет, така , които можете да опитате и да се определят защо SEG обвиняван. Да? АУДИТОРИЯ: [недоловим]? ROB: Значи средство сегментиране разломни има препълване на стека. Така че не е задължително. Сегментиране вина A означава, че сте трогателно памет по начин, Вие не трябва да бъде. Така че един от начините това да се случи е, когато можете стека преливане, започваме трогателно памет по такъв начин, че ние не трябва да бъде. Да? АУДИТОРИЯ: [недоловим]? ROB: Значи вътре в един безкраен цикъл. Например, това е като рекурсивно безкрайна контур и така получаваме друг стека кадър всеки път. Но само вътре в рамките на редовен безкрайна докато едно-- добре, нека не дори отпечатате F-- направи нещо. Каквато и да е. Ние няма да бъдат намалени друг стек рамка. Ние просто ще продължим да се брънка през тази една инструкция. Топчето не расте. Това е факта, че всеки рекурсивно призива ни дава купчина рамка. Ето защо ние се получи препълване на стека. Да? АУДИТОРИЯ: Така че, ако ти каза, за да получите докато контур и след това [недоловим]? ROB: Така че, ако вътре в контура, докато имаше ФОРМАТ, вие все пак ще не SEG вина. Аз просто не искам да обърка нещата. Тя ще контур. Вие ще получите еднопакетна рамка за ФОРМАТ. След това ФОРМАТ ще се върне. Тогава пак ли ще контур. Вие ще получите еднопакетна рамка за ФОРМАТ. Той ще се върне. Single стека рамка. Така че не получавате този безкраен трупат стека рамки. АУДИТОРИЯ: [недоловим]? ROB: Да. Така че това препълване на стека се случва тъй като нито един от тях повиквания към Foo се завръщат. Така че, ако се върнем, тогава ние ще започвам да губя стека рамки. И тогава ние нямаше препълване на стека. И това е защо имате нужда от базов за личните си функции. Да? АУДИТОРИЯ: Дали потенциалния размер и стека за купчината еднакви за всички програми? ROB: Грубо. Дали потенциалният размер на стека и купчината еднакви за всички програми? Грубо. Има някои рандомизацията до където започва стека и където купчината започва. Ако ви се случи да има един куп глобални променливи и неща, може да се отнеме от малко пространство за вашата купчина. На 64-битова система, вие на практика има безкрайна памет. Има само толкова много. Между 32 бита и 64 бита, че е значителна разлика. Ще получите много повече стека и куп пространство на 64-битов система, защото там е просто още адреси, които те могат да използват. Но на индивидуална система, тя ще бъде приблизително същото количество от стака и куп пространство. Добре. Така че последното нещо което е компилация. Така че вие ​​трябва да знаете този процес. Има четири големи стъпки. Така че първо трябва бъде лесен за запомняне. Предварителна обработка. Той има префикс предварително в него. Така че става дума преди всичко останало. Това, което трябва да запомните е хеш. Така че хеш определя и хеш включва във всички от тях. Това са всички предварително процесор директиви. Това са нещата, които най- предварително процесор се грижи за. Така че това, което прави предварително процесор направя? Това е нещо наистина тъпо. Всичко това е в състояние да са всички тези Копиране и нарязани, и поставяне на операции. Така че хеш включва стандартен i0 точка з. Какво е, че правиш? Тя измъкна стандарт i0 точка з файл и да го поставите в горната където той казва хеш включва стандарт i0 точка з. И всеки хеш определи, че сме види, какво е това правиш? Нейната копиране на стойността, че хеш дефиниция, се определя както и поставяне че където и да се използва стойността на. Така Препроцесорът просто прави наистина базирани операции прост текст. Той не прави нищо умно. Така че всичко останало е по-сложно. Така че сега е препроцесор направено, ние всъщност компилирате. Е, какво значи съставянето кажеш? Ние сега ще от C код за сглобяване код. Да? АУДИТОРИЯ: [недоловим]? ROB: Да, хванахме това. Така компилиране. Отиваме от С до монтажа. Така че това е действителна промяна на език. Самата Съставяне означава преминаване от по-високо ниво на езика на нисша език ниво. И С е високо ниво на езика в сравнение с монтажа. Какво е монтаж? Неговите инструкции, които са доста много, направени за вашия процесор. Но вашия компютър все още прави Не разбирам събрание. Той разбира само единици и нули. Така че следващата стъпка е монтаж, които ни води от тези инструкции, които процесора разбира и всъщност ги преобразува, за да от единици и нули. Така C за монтаж в двоично. Но не е нужно да изпълним още. Така че мисля, че на CS50 библиотеката. Имаме предвидени с бинарна за този CS50 библиотека, която има GetString и GetInt и всичко това. Но CS50 library-- в и на itself-- не е изпълним. Тя не разполага с основна функция. Това е просто един куп двоичен , които можете да използвате. Така свързване е как ние да обедини всички на тези различни двоични файлове в реално изпълним. Едно, че можете да напишете точка наклонена черта точка навън. Така че това е като на файла, който сте пише, - каквото си програма е-- Ceaser точка в. Но сега той е бил съставен надолу, за да двоичен. Така Ceaser точка о. И това е нашата CS50 библиотеки двоичен. И те се комбинират в един-единствен изпълним файл. Да? АУДИТОРИЯ: [недоловим]? ROB: Значи първо да включва, не забравяйте, хеша включва всъщност е предварително процесор стъпка. Но това е отделен. Ако не използвате всички функции, които са извън вашият единствен файл, след това, Не, не е нужно да се свърже нещо тъй като имате всичко. Това заяви, ФОРМАТ е свързан вътре. Ако някога сте се използва ФОРМАТ, това е нещо, че трябва да бъде свързан в защото не съм писал това. И в действителност, ФОРМАТ е автоматично свързан инча Знаеш ли как в командния ред или когато Вид направите, ще видите, че има тире л CS50, която има връзка в CS50 библиотеката? ФОРМАТ, и подобни неща, ще да бъдат свързани в автоматично. Всякакви други въпроси, свързани с нещо? АУДИТОРИЯ: [недоловим]? ROB: Свързване? Имаме цял куп различни двоични файлове. Това е каноничен пример която ние използваме е CS50 библиотека. Ние сме съставили и който ви е даден на двоичен за този CS50 библиотека. Вие искате да използвате GetString във вашата програма. Така че отидете и да използвате GetString. Но без да ми двоичен код за GetString, когато компилирате кода си надолу, вие всъщност не може да стартирате програма, защото GetString String е все още не е напълно определено. Това е само, когато се свържат в моя двоичен който съдържа GetString че сега, всички Добре, че всъщност мога да изпълни GetString. Моят файл е пълна. И мога да изпълня този. Да? АУДИТОРИЯ: Има ли свързваща конвертирате двоичната да изпълним? Така че, дори ако не разполагате с друга библиотеките, не би ли все още да е необходимо да се преведат на [недоловим]? ROB: Значи изпълним все още е в двоичен. Това е просто комбиниране цяло китка на бинарни файлове. АУДИТОРИЯ: Благодаря ви много. ROB: Няма проблем. Всякакви други въпроси? В противен случай, ние сме всичко е готово. Добре. Благодаря. [APPLAUSE] АУДИТОРИЯ: Благодаря ви. ROB: Да.