Tip:
Highlight text to annotate it
X
>> SPEAKER 1: Здравейте всички.
Отиваме, за да започнете.
Мисля, че хората все още продължават да се филтриране инча
Но в интерес на време, за да можем да Get You момчета от тук навреме,
ние ще започнем.
Така че, добре дошли в CS50 Quiz 0 преглед.
За тези от вас, които не са осъзнали все пак, имате въпрос в сряда.
Woo-Hoo.
>> Ако не са започнали все още учи или не са осъзнали, че това все още съществува,
последните викторини и цялата информация за Вашата викторина са на cs50.net/quizzes.
Има някои доста добри неща за там, последните тестове от последния 10
години, както и информация за този тест и теми
че ще бъдат обхванати.
Така че нека да започнем.
>> Така че, вие може да си спомнят, на първо ден на клас David имаше тези лампи на.
Така че по същество, всичко, което става за под капака на компютъра е
направено в двоичен.
Binary означава това, което звучи като, 0 и 1 на.
Тя има две стойности, които могат да бъдат представени.
>> Така че точно като в първия ден от раздел когато Дейвид се обърна на светлината
крушка за представяне на, или един, нашият компютър разбира двоичен като 0 и
1 е, включен или изключен.
Основи на Binary.
Всяко място е представено в база две.
Така че можете да добавите 2 към 0 до предварително 1 към 2 по целия път нагоре.
>> За да се изчисли какъв е вашият двоичен е да десетични, просто следвайте това уравнение
напишете нещо.
Ако имате едно във всеки от тези места, вие го умножете по какъвто и
основе тя е в, да го добавите нагоре, и можете да получите десетичния знак.
Така че това е начина, по който се брои до 5 в двоичен.
Точно като това, което правехме относно последния слайд, това е как бихте
представляват от 1 до 5.
>> По същия начин, просто искал можете да добавите и изважда в десетичен или основа 10, или
Наистина всяка основа, върху може да добавите и изважда в двоичен.
Точно това, което можете да очаквате, когато ви добавете две нагоре, ако той е равен по-голяма
от 1, носите една, да я направи на 0, и да направим добавянето по този начин, просто
като може да се очаква с редовен десетични или друга база.
Cool.
>> Така че, както казах и преди, всичко, което се продължава под капака на компютъра ни
се извършва в 0 и 1 е, или двоичен.
И как ще се изразя, например, букви или цифри или символи?
И отговорът на това е ASCII.
>> ASCII е картиране между героите че обикновено ние ще видим в
Английски език като А, Б, От C, подчертават, тирета, и
нещо подобно.
И карти, които на стойност ASCII.
An стойност ASCII е просто номер, който може да бъде разбрано от вашия компютър.
И точно както можете да направите и допълнение изваждане с номера, можете да направите
ги със стойности ASCII.
>> Така в този пример, какво това ще се отпечата?
Да, така че просто A пространство B пространство C пространство D. Къде ми отиде мишката?
Забележете, можете да определите едно цяло число на 65.
И когато печатате, че, като се използват процента C, това ще се тълкува, че като
характер и ще отпечата A.
>> По подобен начин, можете да декларират го като знак.
И когато го отпечатате с помощта на процента C, това ще се тълкува, че като
процента D. И точно като можете да добавите номер, можете да добавите символи са
ASCII стойности, в този случай.
>> Така че е малко показалеца за всички.
5, като низ, не прави всъщност се равнява на 5.
И така, как бихме могли да конвертирате низ 5 до числото 5?
Някакви идеи?
Да.
>> Така че, ако имаме 5 като низ ние можем да извадим 0.
И това ще ни даде 5.
И по същия начин, ако имаме 5 като число, да добавя, че в низа 0.
И това ни дава низ 5.
Cool.
>> Сега, припомни обратно към една лекция, където ние говорихме за алгоритми.
И така, как ние всъщност искаме компютър да направите интересни неща?
Знаеш ли, просто добавяне и изваждане номера и печат неща, не е
че вълнуващо.
Обикновено, ние искаме нашия компютър, за да изпълнява някакъв алгоритъм.
Нещо малко по-сложна не само проста аритметика.
>> Един алгоритъм е само една стъпка по стъпка набор на инструкции за това как да се изпълнява
определена задача -
Точно като рецепта.
Вие може би си спомняте от първия ден на клас, където Давид беше ни брои стая
на хора и колко много хора са в стаята.
Може да се използва за отчитане един по един.
1, 2, 3, 4.
В този случай, линеен алгоритъм време.
>> Но Дейвид въведен алгоритъм за можете да разчитате на хората в залата
където всеки се изправя, че ти номер на друг човек, да добавя, че
номер нагоре, и един човек сяда.
И ти повтарям това.
Това е един вид алгоритъм.
Ние можем да анализираме как ефективно на алгоритъма се основава на това е време на изпълнение.
Но ние ще говорим малко по- повече за това по-късно.
>> Така че всички алгоритми могат също да бъде написана в pseudocode.
Pseudocode е само на английски език, като синтаксис се използва за представяне
език за програмиране.
Например, ако искаме да зададете потребителското да отгатне любимото ми число, ние
Може да се наложи pseudocode като такива.
>> Вземи потребители предполагам.
Ако предположение е вярно, кажи им те са правилни, друг да им кажа
те не са верни.
И pseudocode е начин за лесно представляваща една идея или алгоритъм.
Така че сега ние може да искате да се впишете тази на езика, че компютърът
може да се разбере.
Така че бихме могли да напишем pseudocode и тълкува, че в изходния код.
>> Досега, изходния код трябва да се придържат до известна синтаксис на
език за програмиране.
И така до момента, в CS50, ние сме Използвам най-вече в.
Така че това може да бъде източник на код за C.
По-късно в хода, можете нощ дойде в контакт с другите програмни
езици като PHP.
Или, ако дори и да предприемат други класове, вие може да направи Java, Python, или дори OCML.
Но в нашата в програма език, това е как бихме могли да пишат в сорс кода за
алгоритъм pseudocode че Аз току-що описах по-рано.
>> Е, как прави вашия компютър всъщност Разбираш ли това?
Както казах и преди, само наистина разбира нули и единици.
Е как няма да го получите от източника код за нещо, което може да бъде
Ясно ли е?
Е, ние имаме нещо наречена компилатор.
>> Ако си спомняте през по-голямата част си psets, сте имали някакъв вид програма
написано в една точка в файл.
И тогава вие ще напишете марка.
Така че това, което се прави това?
>> Можете да въведете грим да компилирате програма, защото някой -
всеки, който си написал стр. комплект; вероятно David -
създава файл марка.
И това казва направи да знаете, за да пускате компилатор, наречен трясък, че волята
след това компилирате изходния код на обект код, който е нули и единици
че компютърът ви разбира.
Но малко по-късно, ние ще отидем по-задълбочено за компилатори.
>> Така припомни PSET 0, където - да, Имате въпрос?
>> ПУБЛИКАТА: [недоловим]?
>> 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.
>> На следващо място, друг градивен че сме научили са примки.
Имаме три вида цикли.
За вериги, докато вериги, и направи, докато цикли.
И обикновено, когато седнеш да напиша нещо, което трябва да реши
кой от тримата искате да използвате.
И как ще се реши кой?
>> Ние обикновено се използва за линия, ако знаем колко пъти ние искаме да превъртите
през нещо или колко пъти ние искаме да изпълни дадена задача.
Ние използваме, докато цикли, ако имаме нужда от състояние, за да е истина, за да продължат да работят.
И ние използваме правя, докато много подобен на време, но ние искаме нашия код, за да се движи с
най-малко един път.
>> Така че, докато, що е в изпълни волята винаги работи най-малко един път.
Като има предвид, в същото време, тя не може да се движи с всички, ако
условие не е изпълнено.
Всякакви въпроси, с това?
>> Така за структура на цикъл.
Вие, момчета, сте виждали всичко това.
Можете да го инициализира.
Вие имате някакъв вид състояние.
Така, например, бихме могли да се инициализира като за I е равна на 0.
и е по-малко от 10.
И аз + +.
Много просто едно, че ние сме направили.
>> За известно време цикъл, по подобен начин, вие имате да има някакъв вид на инициализация,
някакво състояние, и някаква актуализация.
Така че можем да реализираме за контур също като линия, докато използването на този.
И по същия начин със задачи, докато контур, ние може да има някои инициализация,
изпълни нещо, го актуализира, и след проверка на състоянието.
>> Така че сега функции.
Ние събрахме всичко заедно.
Ние може да искате да напишете някои вид функция.
Общата функция, която може да са видели вече е основна.
Основна е функция.
Той има вид завръщане, вътр.
Той има име на функция, главната.
И тя има аргументи, argc и ARGV.
Така че основната е просто функция.
>> Други функции, които може да са използвани, ФОРМАТ - ФОРМАТ е функция -
GetInt, toupper.
Но това се случи, че са били изпълнява за нас от
някаква библиотека.
Ако вие не забравяйте, включително тази библиотека CS50.h или
стандартна I / O библиотека.
Да, въпрос?
>> ПУБЛИКАТА: Дали основната просто присъщи на C?
Дали тя просто вид [недоловим]?
>> SPEAKER 1: Въпросът е ако основният е присъщо в.
И да, всички функции имат основна функция.
Това е нещо необходимо за компютъра да знаете откъде да започнете
използвате кода.
>> ПУБЛИКАТА: Значи не би [недоловим]?
>> SPEAKER 1: Не.
Някакви други въпроси?
Cool.
Така че, точно както можете да използвате функцията , което е написано за вас, можете също да
напишете своя собствена функция.
Това е функция, която някой може да са писали за изчисляване на обем
на Q, например.
Налице е един вид завръщане тук, в този случай ПНА, нашето име функция Q и нашата
списък от параметри.
>> И имайте предвид, че трябва да пиша на данните тип на параметъра, който искате да
използвате или иначе функция не знам какви
параметър трябва да се приеме.
Така че, в този случай, ние искаме цяло число, като наш принос.
Така че, защо може да искаме да използваме функции?
>> На първо място, чудесно за организация.
Те помагат разбият кода си в по-организиран парчета и да направи
е по-лесно да се чете.
Опростяване.
Това е добре за дизайн.
Когато четете част от код и чиято основна функция е наистина,
наистина дълго време, той може да бъде по-трудно да се причина за това, което става.
Така че, ако се раздели на функции, тя може да бъде по-лесно да се чете.
И повторна употреба-способността.
Ако имате парче код, който се е наречен или стартирате няколко пъти,
вместо пренаписването че код 10 пъти в основната си функция, може да се
искате да го използвате отново.
И след това всеки път, когато трябва да се използва, че част от код, обадете се на функция.
>> Така че сега, ако ние си спомняме обратно към нулата, Ние също така говорихме за няколко концепции,
един от които е отгоре.
Thread е концепцията за множествена последователности на код
изпълняващата в същото време.
Така че мисля, че обратно на ден един където David трябваше вие броиш броя на
хора в стаята.
>> По същество, това, което се случва на се всички от вас са били
работи отделни нишки.
И тези теми идваха заедно за да получите някакъв вид отговор.
По същия начин, в Scratch, когато имате множество спрайтове, може да се
котка и куче.
И те ще бъдат едновременно изпълнение на техните собствени скриптове.
Това е пример на резби.
>> И други концепцията, че е въведена през нулата е събития.
И събития са, когато множество части от кода си комуникират един с друг.
В Scratch, това беше, когато сте използвали излъчват контрол и когато аз
Получаване на блокове.
>> И също така, в Проблем Set 4, видяхме малко събития, както добре.
Вие, момчета, може да са използвани библиотеката Gevent.
И там е функция waitForClick , в който сте били чака
за потребителя да кликнете.
И на клик, в този случай, би било събитието и да чакат за клик е вашата
манипулатор на събитие.
>> И също така, през целия пускането на вашите psets и работи по вашите psets, вие
може да влезе в контакт с някои от тези команди.
Това е, което сте въвели във вашия терминален прозорец или каквото прозорец
, който показва на вашия грама редактиране да, по същество, се движите вашия компютър.
>> Така например, LS изброява съдържанието на директорията.
Направете директория създава нова папка.
CD, промяна на указателя.
RM, премахване изтрива файл или някаква директория.
И след това да премахнете директория премахва директория.
>> ПУБЛИКАТА: [недоловим]?
>> SPEAKER 1: Да, разбира се.
За съжаление, въпросът е, ако Бих предложил въвеждането на този
на мамят лист.
Тя може да помогне.
Ако имате стая, можете да я облечете.
То също е просто обикновено достатъчно добър да се помни, защото, когато го използвате
може да искате просто да са го запомнил.
Това ще направят живота ви много по-лесно.
Отговорих ли на въпроса ти?
>> Така че сега, ние говорихме малко накратко за библиотеки.
Но двете основни тези, които сме били използвайки досега в курса
стандартна I / O и CS50.
Какви неща са включени в стандартния I / O библиотеката?
>> Да, досега сме използвали ФОРМАТ.
В CS50, сме използвали GetInt и GetString.
И низ тип данни също се случва които трябва да бъдат декларирани в този CS50 библиотека.
Ние ще говорим малко по-задълбочено за как работят библиотеките и как те
взаимодействат с останалата част от кода си.
Но това са две основни тези, които ние влязла в контакт с толкова далеч в
курса.
>> Видове.
Това са добре да се помни колко всеки вид е представен от или как
много байта всеки вид изисква -
ПНА, 4 байта; Чар, един байт.
Float е 4 байта.
Какво е двойно?
>> ПУБЛИКАТА: [недоловим].
>> SPEAKER 1: Да, така поплавък но се удвои размера.
Какво ще кажете за дълго?
>> ПУБЛИКАТА: [недоловим].
>> SPEAKER 1: OK.
Какво е време?
>> ПУБЛИКАТА: [недоловим].
>> SPEAKER 1: Да, два пъти на вътр.
Да.
>> ПУБЛИКАТА: [недоловим].
>> SPEAKER 1: Long [недоловим].
И след това дълго време е двойно.
>> ПУБЛИКАТА: Не, не.
Дълга е само едно цяло число.
Това зависи от архитектурата преди [недоловим]
и вътр има същия размер.
[Недоловим].
>> SPEAKER 1: Значи дълго и на Int са еднакви.
И след това дълго, дълго е два пъти по-Int.
Cool.
И тогава, какво е последното вида?
>> ПУБЛИКАТА: Pointer.
>> SPEAKER 1: Да, така сме се научили малко за указатели.
И независимо от това, което указател е сочейки - тя може да бъде знак звезда
или Int звезда -
тя винаги е 4 байта за показалеца.
Въпроси за това?
Да?
>> ПУБЛИКАТА: [недоловим]?
>> SPEAKER 1: Значи дълго и вътр са същите в това 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: Double е два пъти размера на плувка, да.
>> ПУБЛИКАТА: Как указател за дълго, дълго [недоловим]?
>> SPEAKER 1: Така че въпросът е как показалеца дълго, дълго -
как е, че само четири байта, когато дълго, дълго си 8 байта.
Така че да си спомня какво е указател, по същество, най-базовата стойност.
>> ПУБЛИКАТА: [недоловим].
>> SPEAKER 1: Да, така указател е само място в паметта.
Така че няма значение колко място че показалеца сочи.
Тя се нуждае само от 4 байта, за да следите на това място в паметта.
Някакви други въпроси?
Cool.
>> Така че последното нещо, което трябва е стандартния изход.
Можете да ги използвате често достатъчно, че можете да си спомните.
Но това е, когато ние използваме ФОРМАТ, например.
И ние имаме тези контейнери, които бяха наречени кодове формат.
>> Така процента в Чар, процента аз за ПНА, и ние можем да използваме процента г.
Това е едно и също нещо.
Но, обикновено, в CS50 ние опитате да използвате процента аз.
Percent е за оборотни средства.
Процент LD за дълго, дълго и процента и за низ.
>> Също така, ние сме били с помощта на няколко на тези аварийни последователности.
Например, наклонена черта н за нов ред.
Това е само за когато сте на форматиране вашия код за печат ф.
Да?
>> Публика: Какъв е процента за г?
>> SPEAKER 1: Така че въпросът е това, което е на сто за г?
Процент г е за цели числа.
Процент г и процента и са еднакви.
>> ПУБЛИКАТА: Каква е разликата между наклонена черта н наклонена черта и R?
>> SPEAKER 1: Така че въпросът е какъв е разлика между хлабина н и
хлабина R?
Мисля, че наклонена черта R е -
>> ПУБЛИКАТА: Така наклонена черта R просто предполага се връща към началото на реда
без всъщност да отидеш на нова линия.
Така че, ако можете да отпечатате наклонена черта R и вие да се върнете в началото на реда
след това да отпечатате повече неща, вие презапишете неща, които вече е на
[Недоловим].
Като има предвид, п всъщност отива към нова линия и отива [недоловим].
>> SPEAKER 1: Е, някакви други въпроси?
Добре.
Отивам да я оставиш в ръцете Дан, който ще продължи.
>> [APPLAUSE]
>> DAN: Добре.
Така че аз ще се говори за друг широк спектър от идеи, от класа, в който са
грубо представител на две седмици и началото на три седмици да потеглите
с леене, която е просто начин на лечение на стойност на определен вид като
стойност от различен тип.
Така че ние можем да направим това с символа на целочислени, плувки за цели числа, и
дълги копнее да се удвоят.
>> Всичко това може да се използва като начин за лечение на някои числова стойност
Чар минус, тъй като някои други числена стойност.
Така че има някои проблеми с това, на Разбира се, който идва, когато хвърлиха
неща като плувка за целочислени.
Така че това е малко странно.
Имаме плувка, която е 1.31.
Ние го умножете по 10 000.
И тогава можем да го отпечатате като вътр.
Какво прави този изход?
10000 пъти 1.31.
Така 13 000, е, че предполагам?
>> ПУБЛИКАТА: Мисля, че е 10 000.
>> DAN: Така че аз съм го умножи по 10 000 преди съм го леене.
>> ПУБЛИКАТА: Oh.
Няма ли да има една 9 и някои 0 номера?
>> DAN: Може да има някои странни цифри.
Така че, добре, това е 1,3 пъти 10000.
Така че това е 13 000.
И това допълнително странно -
>> Публика: 13100.
>> DAN: 13100.
Благодаря ви, Роб.
И това допълнително странност -
това 9,9 -
е просто, защото този кастинг се стигна до закръгляне надолу, където
тя не трябва да има.
Да.
>> ПУБЛИКАТА: Кастингът се случва след нещо друго?
>> DAN: Значи, защото имам това в печатен вид, тя прави това умножение, преди да го
прави този кастинг.
>> ПУБЛИКАТА: [недоловим].
>> DAN: Мисля, че ще хвърли първата, да, която ще бъде 10 000.
Нещо друго?
Cool.
Така че това е 13 099.
Защо се случва това?
Неточност.
>> Плувки не са съвършени.
Те могат да представляват само номера на определен брой значещи цифри.
Така че, ако ние разпечатате 8 SIG смокини този поплавък, ние получаваме един вид
грозен търсите номер.
И това е така, защото 1.31 не може точно да да бъдат представлявани от прост
правомощия на две в машината.
Така че в крайна сметка като най-близо Предполагам, който се озовава
е малко по-ниска.
Направи ли смисъл?
OK.
>> Сега, включена са различен начин на прави условни конструкции, където всички
ние се грижим за е една променлива.
Така че в този конкретен пример, ние сме получаване на цяло число от потребителя.
И след това, което търсим в какво е това число е.
Предполага се, че това е номер между един и четири.
Това е, което ние ви молим.
>> Така че направи ключ на името на променливата.
Тогава се създаде случаи на възможно стойности може да бъде.
Така случай, че един, да речем, че е ниско.
И тогава ще се прекъсне, за да се измъкнем на състоянието на превключвателя, така
не продължавай.
>> В следващия случай -
така случай две и три случая -
ако това е случай две просто падне надолу, за да на първа линия на код го вижда като с
главни и малки три, докато не вижда почивка.
Така че причината да се получи един случай да само на печат е ниска, защото аз
имат тази почивка тук.
Ако, да речем, не обърна внимание на тази почивка - ако Хвърлих този отцепилата -
той ще отпечата ниска, а след това ще отпечатате средна, а след това може да се счупи.
>> Така че почивките са важна част превключите на условия и
те трябва да бъдат там.
Всички случаи, които не са посочени изрично се обработват от по подразбиране
случаят в ключа и трябва да бъде изхвърлен.
>> ПУБЛИКАТА: Така 1, 2, 3, и 4 ще бъде п?
>> DAN: Стойности, които могат да бъдат п.
Да.
Да?
>> ПУБЛИКАТА: Така че, когато имате че [недоловим]?
>> DAN: Можете да отпечатате ниска, а след това би принтиране среда и
а след това ще се счупят.
>> ПУБЛИКАТА: Защо ще го отпечатате средна, ако [недоловим]?
>> DAN: Значи всичко под един случай преди почивка попада под.
Така случай един печат е под случай един както е това след печат.
Да?
>> ПУБЛИКАТА: [недоловим]?
>> DAN: Така че този номер е само специално стойност, която тази променлива
може да вземе, нали?
Това прави ли смисъл?
Да.
>> ПУБЛИКАТА: [недоловим]?
>> DAN: Да, дело две ще отпечата средно и след това почивка.
>> ПУБЛИКАТА: [недоловим]?
>> DAN: Мисля, че има такива?
Какви други типове данни може ли да преминете?
>> ПУБЛИКАТА: Можете да превключвате над всяко типове данни.
Но това само означава нищо над символа и цели числа и подобни неща, защото
Ако преминавате през указател че не наистина да има смисъл,
превключване на товари, ако дори и нека можете да направите това, защото на плаваща запетая
в точност, вие не би наистина искам да направя, че така или иначе.
Така че доста много, само целочислени и символа и подобни неща.
>> DAN: Да, това е, когато имате изричното стойности, които знаят, мисля, че могат да бъдат
че преминаването е действително полезно.
Добре ли е?
OK.
>> Обхват е диапазонът, че декларираната променлива разширява.
Така че в това малко парче код, което имам, че ще бъде пълен с грешки.
И причината е, че заявил, вътр и в рамките на обхвата на това за цикъл.
И тогава аз се опитвам да съпоставяме Аз извън този обхват за контур.
>> Така че основно, можеш да се сетиш за обхват като нещо, което вие декларирате
с в рамките на набор от фигурни скоби само съществува в рамките на тези фигурни скоби.
И ако се опитате и да използвате тази променлива извън тези фигурни скоби, вие ще
получите съобщение за грешка от компилатора.
Да?
>> ПУБЛИКАТА: Така че това един не работи?
>> DAN: Това не работи, да.
Strings.
String Чар *.
Те са едни и същи.
Те са само указатели към знаци.
И всички струни, които трябва да приключат с наклонена черта нула, което е само
С конвенция.
>> Това се нарича NULL терминатор.
И NULL -
N капитал, капитал U, капитал L, капитал L -
не е същото като NULL терминатор.
Това е указател.
Това е знак.
Те са много различни.
Не забравяйте това.
Тя ще бъде на теста, най-вероятно.
Аз не съм виждал теста.
Да?
>> ПУБЛИКАТА: Така NULL е, да речем, на показалеца?
>> DAN: Да.
>> ПУБЛИКАТА: Какво означава [недоловим]?
>> DAN: Ако, да речем, изчистване се нарича, когато не разполагат с достатъчно памет, за да получите
каквото размер питаш за, изчистване ще върне NULL.
Това е, общо взето, когато дадена функция е Трябваше да се върне указател, можете
Трябва да се провери, защото срещу NULL NULL е доста добра -
това е, един вид, стойността на боклук.
Това е нула, доколкото указатели отиват.
>> Всеки път, когато ти се обадя на функция, че връща указател.
Вие ще искате да проверите, за да бъде сигурен, че това не е NULL показалка
защото NULL е много чести.
Това е нещо като завръщане боклук.
Така че, ако нещо не се е прав, Просто се върне NULL вместо.
>> ПУБЛИКАТА: [недоловим]?
>> DAN: Да, и това е този.
>> ПУБЛИКАТА: [недоловим]?
>> DAN: го правописа, тъй като това.
Това е NULL терминатора.
Той е с малки букви N-U-L-L, ако вие сте му на правописа.
>> Публика: А аз просто отиде назад и го изпитва.
И ако се опитате да се сложи с плаваща запетая ценят в превключвател, той ще ти викам
казвайки, отчет изисква изразяване на цяло число тип.
>> DAN: Ето ти.
Но да, това, което беше въпросът отново?
>> ПУБЛИКАТА: [недоловим]?
>> DAN: Така капитал N, U капитал, капитал L, капитал L е действително в нещо.
Тя е показалеца на NULL и ще се третира само като такъв.
Вие никога няма да се опита и да обяснят на NULL герой и да видим всеки
друг начин от това.
Да?
>> ПУБЛИКАТА: Значи връщане към Чар макс или нещо в бележките, нали
въплъщават същата функция като [недоловим]?
>> ПУБЛИКАТА: Значи имате предвид връщане Чар макс от getchar, или
каквото и да е?
>> Публика: Да.
>> Публика: Да, така генералът термин за всички онези неща,
са индикаторни стойности.
Така че като се върне вътр макс от GetInt Чар и макс от getchar, това е
Предполага се, че като, добре, ако тези неща се завръщат при нас,
нещо се е объркало.
>> За съвети, ние просто се случи да има този часовой стойност, която всеки
изразява съгласие.
И това е нещо, което се върнете когато нещата се объркат.
Така Чар макс е това, което ние използваме за да представи нещо
като NULL или getchar.
>> ПУБЛИКАТА: Така че, ако сте тестване getchar, може ли просто да се поставя НУЛЕВА?
Бихте, които правят разлика?
>> DAN: Не може просто да проверите NULL.
Вие ще трябва да се провери Чар макс защото благодарение на параметъра върнатата стойност от функцията е
а не характера на показалеца.
Да?
>> ПУБЛИКАТА: Този въпрос пита за дължината на низ.
Това включва ли на NULL характер?
>> DAN: Не.
И това е всъщност как дължина низ знае как да спре, защото той преминава през
Вашата масив от знаци, докато тя вижда NULL характер.
И тогава тя е като всички Добре, аз съм свършил.
>> ПУБЛИКАТА: [недоловим] пет?
>> DAN: Здравейте ще бъде пет.
Да.
Така масиви са непрекъснати блокове памет.
Те имат незабавен достъп, като изречете име на масива и след това, в къдрава
тиранти, каквото индекс, които искате да отидете да, те са индексирани от нула през
дължината на масива минус 1.
>> И те са декларирани от типа на нещо, което сте на съхранение в
масив, името на масива, и след това независимо от размера е на този масив.
Така че това е Чар масив с дължина шест, че има следните стойности.
Да?
>> ПУБЛИКАТА: [недоловим]?
>> DAN: Да.
>> ПУБЛИКАТА: [недоловим]?
>> DAN: Ако имате какво се случва във вече направена масива.
Така бихте могли да посочите това, вместо като казват, Чар, независимо от името на вашия
масив е, празни скоби се равнява къдрава презрамки H запетая E запетая L запетая L запетая
O запетая NULL характер и къдрава скоба.
Това също така ще работи като декларация.
>> ПУБЛИКАТА: [недоловим]?
>> DAN: След това е необходимо да има размера вече направени.
>> ПУБЛИКАТА: [недоловим]?
>> DAN: Да.
Добре.
Аргументи на командния ред са начин за получаване на информация от потребителя, както
аргументи на Майн.
Главна отнема два аргумента.
Броят на аргументи, които се минаваше командния линия и
низ вектор или низ масив на всички аргументи.
>> Така че, ако, да речем, се нарича функция като точка 1 от пространство, 2 пространство, три,
argc ще бъде 4.
И ARGV 0 ще бъде една точка навън.
Argv1 ще бъде 1.
argv2 ще бъде 2. argv3 би било 3, в този конкретен случай.
Да?
>> ПУБЛИКАТА: [недоловим]?
>> DAN: Последният елемент в масива защото масивът е с дължина argc плюс
един от argb, последният елемент е показалеца на NULL.
Тя е argc плюс един.
Така че, в случай, че току-що казах, то ще бъде ARGV 0 е една точка навън.
ARGV 1 е 1. argv2 е 2. ARGV 3 е 3.
ARGV 4, което е един голям от argc ще бъде NULL.
>> И това е показалеца на NULL.
Да.
И това е така, защото е низ Чар звезда е указател.
Така че това трябва да бъде един и същ вид.
Да?
>> ПУБЛИКАТА: Два въпроса.
Така че едно, каква е разликата между това и GetString различна от един тип
в потребителския двигателя?
И второ, тя се съхранява в рамките на неотдавнашното си памет?
Така че, като, GetString би бъде [недоловим]?
>> DAN: Къде се съхранява?
Аз не знам къде да го съхранява.
>> ПУБЛИКАТА: Така че, всъщност, вие знаете как всеки функцията, която се обади, че е аргументи
се съхраняват в стека?
Така argc и ARGV са аргументи на главната и те са в стека, или наистина
точно над това, което си мислиш, като началото на стека.
Какво беше другата част на въпроса?
>> ПУБЛИКАТА: Е, какъв е [недоловим]?
>> DAN: Да, това е просто различен начин за получаване на информация от страна на потребителя.
Това е малко по-ефективен и това е по-удобен за скриптове, защото
може просто да премине аргументи към вашия основен функция, а не да се налага да чакам
за потребителите, ако не разполагат с никакви потребители.
>> ПУБЛИКАТА: И да, получи струни би било [недоловим].
Тя ще се съхранява на нещата, които се нуждаят.
>> DAN: Да?
>> ПУБЛИКАТА: [недоловим]?
>> DAN: Да, ARGV 0 винаги включва дот черта на извикване на функция.
Да?
>> ПУБЛИКАТА: [недоловим]?
>> DAN: Да, всеки от аргументите са приключи през NULL характер, тъй като те
са струни.
>> ПУБЛИКАТА: [недоловим]?
>> DAN: Да, ARGV argc е нулев указател.
>> ПУБЛИКАТА: [недоловим]?
>> DAN: О, да.
Да, съжалявам.
>> ПУБЛИКАТА: Така [недоловим]?
>> DAN: Така че въпросът е, ако сте имали командния ред дот наклонена черта една точка от 1, 2,
би броят на командния ред аргументи да бъдат две или три ще бъде тя?
>> ПУБЛИКАТА: Мисля, че това не е така наистина има значение.
Склонен съм да кажа, о, ти не премине каквито и да било аргументи от командния ред, когато,
Очевидно е, че сте се обадили на функцията.
Така че съм склонен да гласно изключва функция от командния ред
аргументи, въпреки че това е включени в ARGV.
>> DAN: Но, ако това е било в теста -
Да - и също така, ако ви кажа нещо като argc равнява на 3,
ти си в безопасно състояние.
Да?
>> ПУБЛИКАТА: [недоловим]?
>> DAN: Мисля, че ако вместо да извикат тази в argc и струнен ARGV скоби
но остави същите видове и току що се обади тях нещо по-различно като
и б, би тя все още работи?
И тя все още ще работят, бихте просто -
вместо да се използва argc - би трябвало да използвате а и б.
Да?
>> ПУБЛИКАТА: [недоловим]?
>> DAN: Така че въпросът е GetString е ще се съхранява в паметта на куп
защото GetString е Чар *.
Тя съхранява памет в хийпа, защото тя призовава сега изчистване в рамките на реалния
изпълнение на GetString.
OK, продължаваме.
>> Security.
Така че, за да бъде наистина сигурен, можете да разчита на не една и позволи никой достъп до всеки
на вашата информация, поради което всеки изгражда свои собствени машини,
свои собствени операционни системи, всичките им програми от нулата, и очевидно
не се свърже с други машини чрез интернет.
Така че компютрите са несигурни.
Те наистина са.
Ние трябва да се довери на други хора.
>> И идеята за сигурност, е, че ти си опитва да се ограничи количеството на
Вярвам, че имате нужда.
И един от начините да направите това е чрез криптография.
Криптографията е, по същество, имаме тайни.
>> Понякога ние трябва да преминат нашите тайни заедно през, да речем, в интернет или
други неща.
И ние не искаме хората да знаете тези тайни.
Така че ние криптиране на нашите тайни в начин че ние се надяваме, никой не може да разбере.
>> Така че ние използвахме -
в хода на този клас -
неща като Цезар шифър и [Недоловим], които да са много, много
несигурни начини за криптиране на нещата.
Те са лесно да разбера какво те намирате и какви са вашите тайни.
Реалният свят използва много по- сложни схеми за криптиране.
И ние няма да влязат в много повече от това.
>> Debugging.
GDB е най-добрият.
Отивам да подчертая това отново.
Използвайте GDB цялото време всеки път, когато имате проблем.
Командите, които са полезни в GDB са прекъсне, която ви мине нито ред
брой, име на функция, по същество където в кода, който искате да спрете,
и да бъде в състояние да поеме контрола.
>> Print отнема променлива и отпечатва каквото и да е променлива по това
Точка в изпълнение.
Следваща движи си изпълнение заедно с една стъпка.
И стъпка стъпки в рамките на дадена функция в изпълнение.
>> Други неща, които се движат, което е как всъщност стартирате свой код.
Продължи предприема всички необходими стъпки, за да стигнем до следващото прекъсване точка.
И има много, много други.
Потърсете ги.
Те са много добър начин.
Да?
>> ПУБЛИКАТА: [недоловим]?
>> DAN: Да, което е дебъгер.
Така дебъгер е програма, която ви позволява да развенчава вашата програма.
Това не е програма, която намира за бъгове вас, макар че ще бъде страхотно.
>> И на последно място за мен е търсене.
Така видовете търсене, за които говорихме за в този клас са линейни търсене,
която е само, че гледате през всяка елемент от пространството на търсене, едно
елемент в даден момент, докато не намерите това, което , което търсите или докато достигнете
края на Вашето търсене на място, на което точката, в която казват, че не сте могли да намерите
елемент, който сте били търсите.
И това се прави в най-добрия константно време, която е 0 на 1 и в най-лошия линеен
време, което е 0 п.
>> Binary търсене, което се нуждае от користните елементи.
Отиваш в средата на вашите елементи, виж, ако елементът, което търсите
е по-голям или по-малък от елемента че ти си в средата.
Той е по-голям, вие казвате, че дъното на Вашето търсене на място е вашият
текущото местоположение, в центъра, и рестартиране на процеса.
Ако тя е по-малка, изглеждаш каже че - Да, какво има?
>> ПУБЛИКАТА: [недоловим]?
>> DAN: Да.
Всякакъв вид на вид, който е бил преподава в класа е честна игра за теста.
>> [Смях]
>> DAN: А фактът, че не сте имали да го направя за проблем настроен, че е справедливо
игра за теста.
>> ПУБЛИКАТА: Можем ли да го прегледаме как да -
>> DAN: Той ще мине през.
>> SPEAKER 2: The действителният код за [Недоловим] е на study.cs50.net.
Така че, ако се вгледате в проблема на практика в страницата сливат вид
study.cs50.net, там е кодът за прилагане на сливане на сортиране.
Така че не е нужно да се приложат Направи си сам тази вечер.
Но не забравяйте да го разберем по-скоро отколкото просто да го запомнят.
>> ПУБЛИКАТА: [недоловим]?
>> SPEAKER 2: Страницата за обединяване на сортиране на study.cs50.net, там е практика
проблем, който, ако чрез кликване на проблем, в самия край има
разтвор, който е обединяването изпълнение на сортиране.
Но не забравяйте да го разбирам а не просто да го запаметяването
или да го копирате надолу.
>> Публика: А перфектно валиден проблем за изпита ще бъде
нещо като ето списък.
Какво означава този списък изглежда като след една стъпка от селекции на сортиране или
вмъкване на сортиране или нещо такова.
Едно пълно повторение на списъка.
Така че, дори ако не се окажете се налага да код за него, трябва да го разберем
достатъчно, за да знам как става да се променят тази масив.
>> DAN: Това е за мен.
>> [APPLAUSE]
>> LUCAS: Хей всички.
Моето име е Лукас.
Отивам да говоря за рекурсия, всички сортовете, които сме научили, а
Малко от всички указатели.
OK?
Така че, на първо място, рекурсия.
Какво означава да се каже, че функция е рекурсивно?
>> ПУБЛИКАТА: нарича себе си.
>> LUCAS: OK, призовава себе си, да.
Така че, като тази картина, например.
Това е като на снимката вътре на картината и така нататък.
Така например, може да има - като Dan че говорех за двоично търсене.
Един от начините, по който е двоично търсене рекурсивно е фактът, че вие сте
Опитвам се да намеря брой.
Така че можете да преминете към средата.
И тогава можете да проверите дали цифрите там в ляво и в дясно.
>> И след това, ако разберете броя е ще бъде в ляво, това е същото
нещо като правене на търсенето отново, но само в ляво на списъка.
Така че това е начина, по който звучи като това е рекурсивно.
Така че това е защо вие имате рекурсивни решение за сливане на сортиране.
>> ОК, така че тук е един пример.
Така че нека да кажем, че искам да се избере всички числа от 1 до п.
Мога да осъзнаят, че сумата от п брой е н н плюс минус 1 до 1.
Но след това, ако аз гледам на п минус 1 плюс п минус 2 плюс 1, че е същото
нещо като сумиране номера до п минус 1.
Така че мога да кажа, сумата от равен сума равнява п плюс сумата от п минус 1.
Това прави ли смисъл?
>> И аз също ще има нещо друго нарича база случай, който е
сумата на числата до до нула ще бъде нула.
Така че веднага щом стигнем до броя нула, аз спирам да броим.
Това прави ли смисъл?
>> Така че ето един пример за това как Мога да го привеждат в изпълнение.
Така че аз имам тази функция в някои.
Това отнема цяло число п.
Така че тук за първи път, проверете дали н е по-малко или равно на нула.
Така че, ако това е по-малко или равно на нула, I върнете нула, което е нашата база случай.
В противен случай, може просто да се върне н плюс сумата на числата от
една до п минус едно.
Направи ли смисъл?
OK.
>> Така че тук е това, което изглежда.
Вие имате сбор от две равни 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.
Така че аз да взема номер 2 и сложих в предната част на списъка.
И тогава аз гледам за следващата по-малка елемент, което е 3.
Така че аз го слагам в края на сортирани списъка.
И тогава аз продължавам да правя това.
Намирам 4 и да я тури в края.
Намери 5 и го сложи в края.
>> И погледнете как всички тези пъти, че Казвам го сложи в края е,
основно, смяна на две стойности.
OK?
И след последната една, просто има още един елемент.
Така той вече е сортиран.
>> ОК, така че вкарването на сортиране.
Insertion сортиране ти започваш да имат също това нещо на наличието на сортираните и
несортиран списък.
Единственото нещо е, че всеки път, сте добавяне на елемент към сортирано
списък, можете просто да изберете елемент, който е в предната част на несортиран списък.
И тогава започваш да се намери това, което позиция трябва да бъде в сортирания
част от списъка.
>> Нека видим какво е, така че това това прави по-дълбок смисъл.
Така че първоначално, например, аз се опитвам да въведете номер три в
сортирано част на списъка.
Така че списъкът не е нужно нищо.
Така че аз може да съм сложил под номер 3.
>> Сега, аз искам да добавите номера 5 до сортираната част на списъка.
Така че аз гледам на числото 5.
Прави ми впечатление, че тя е по-голямо от 3.
Така че аз знам, че той трябва да бъде след три.
Така че аз слагам 3 и 5.
>> След това искам да вмъкнете номер 2.
Забелязвам, че номер 2 е всъщност продължи след 3, както и 5.
Така че аз всъщност трябва да я тури всички начин в началото на списъка.
Така че трябва да, вид, смени всички елементи в списъка подредени така че мога да
направи място за номер 2.
>> Тогава виждам номер 6.
Виждам, че тя трябва да бъде след 5.
Така че аз го слагам там.
И накрая, аз гледам на броя 4.
И забелязвам, че трябва да бъде между 3 и 5.
И тогава аз го слагам там и промяна всички други елементи.
Направи ли смисъл?
>> Bubble Sort.
Така балон вид е основно това, което сте ще направим - ние го наричаме балон
подреди защото ти мине през списъка - това е действително по-добре, ако просто се покаже
Харесва ли ви този -
и ти започваш да се сравни съседни числа.
И ти започваш да прекарат позиции, ако те не са
в правилния ред.
>> Така че основно, какво ще се се случи, е тук, например,
имате 8 и 6.
Вие знаете, че сортираните поръчка ще действително да бъде шест и пет, нали?
Така че ти започваш да сменяте поръчките.
Тогава виждам 8 и 4 тук.
И аз правя едно и също нещо.
I сменяте отново.
И накрая, 2 и 8.
Аз също ги разменят.
>> Тя се нарича Bubble Sort защото след всяка от тези повторения, всъщност,
най-голям брой в списъка получава всички чак до края на списъка.
Това прави ли смисъл?
Тъй като това продължава да го смяна и придвижване надясно.
>> ОК, така че това е втората итерация.
Това ще бъде едно и също нещо.
Аз ще направя един суап и след последната една.
Аз, че няма суапове и списъкът се сортира.
Така че в Bubble Sort, ние основно се запази върви по списъка и смяна
неща, докато не забележите, че не съм направил всички суапове правят това итерация, която
означава, че този списък вече е сортиран.
Направи ли смисъл?
>> Нека поговорим малко за времето за работа.
Така че вие си спомнят Big O, Omega, и Theta?
Да?
Добре, какво е Big O, на първо място?
>> ПУБЛИКАТА: [недоловим].
>> LUCAS: Да, това се нарича най-лошия случай по време на работа, което просто означава, че това е
колко очаквате програмата да предприеме, за да се изпълнява.
Например, по отношение на -
в този случай - п.
Броят на елементите в вписва в най-лошия случай.
Например, във възможно най-лошия случай.
>> Така че за Bubble Sort, например, имаме Big O на п квадрат.
Защо имаме това?
Защо е Bubble Sort Big O н квадрат?
>> ПУБЛИКАТА: [недоловим].
>> LUCAS: Да, така че най-лошия случай ще бъде че аз ще трябва да направя н повторения.
Така че всеки от итерации ще въвеждат най-големият елемент до края
на списъка.
Така че най-лошия случай е, че имам да направя това нещо п пъти.
И за всеки един от тези пъти, аз трябва да направи н суапове, защото аз трябва да се сравняват
всеки два елемента.
Така че това е защо тя се п квадрат защото това е п пъти п.
>> След това, избор на подреждане е също п квадрат защото за всяка итерация, аз трябва да
разгледаме всеки един елемент в списъка.
И след това се намери най-малката, което означава, че аз трябва да
погледнете през наш елементи.
И аз трябва да направя това, че п пъти, защото Трябва да изберете всички н елементи.
>> Вмъкване вид е също п квадрат защото най-лошия случай ще
да, един, трябва да поставите н номера, нали?
Така че аз вече знам, че аз отивам да има N повторения.
Но за всеки един от тези номера, ако имах да разгледаме всички номера в
подредени по списъка и го сложи целия път в предната част, която ще бъде п квадрат
, тъй като ще се N пъти N отново.
Направи ли смисъл?
Ами омега?
>> ПУБЛИКАТА: [недоловим].
>> LUCAS: Това е най-добрия случай.
Така че това е като в много пъти за сортиране, сценарият на най-добрия случай е
когато списъкът е вече подредени.
Така че наистина не са да се направи нещо.
Bubble Sort има най-доброто сценарий на п.
Познавате ли се защо?
>> ПУБЛИКАТА: [недоловим].
>> LUCAS: Да, ако следите дали дажба данни имали някакви суапове или
не, ако имате нещо като комплект за вярно, ако имаше повторение, ако на
списък е вече подредени, общо взето, какво ще се случи е, че ще
опитайте да сменяте всеки две съседни елементи.
Отивам да видя, че не съществуват суапове.
И аз просто се върне веднага.
>> Така че това означава, че аз просто трябваше да проверете списъка едно време.
Така че това е п защото изглеждам в наш елементи.
Защо избора на сортиране н квадрат?
>> Да, дори и ако списъкът е сортиран, за всяка итерация на избор на сортиране, I
Трябва да изберете минимум елемент.
Така че това означава, че аз трябва да търси на всички елементи в несортиран
списък и да намерят минимум за всяка итерация.
Това прави ли смисъл?
>> И вмъкване меч е N, тъй като в случай, че се опитвам да вмъкнете
номера и всички номера, когато се опита да ги вмъкнете, виждам, че те
са в правилната позиция.
Не е нужно да проверя всички останали номера в несортиран списък.
Така че това е защо тя ще бъде п.
Направи ли смисъл?
И това, което е тета?
>> ПУБЛИКАТА: [недоловим].
>> LUCAS: Какво, извинявай?
Кажи го отново.
>> ПУБЛИКАТА: [недоловим].
>> LUCAS: Точно така.
Така че можете да видите, че само избор съхраняват в Merge вид имат thetas.
И това е така, защото имате само тета ако както Big О и Омега са еднакви.
OK.
И най-накрая, се слеят Сортът е в дневника п.
>> И тогава, като Dan казвах, Обединяване на сортиране е нещо като по същия начин, че
нали двоично търсене.
Така че, можете да получите в списъка.
И ти започваш да се намали наполовина.
И тогава ще ги нарежете в малки половини.
И тогава можете да ги обедините.
Вие, момчета, не забравяйте, че, нали?
OK, както казваше той.
>> OK, указатели.
Така че това, което е указател?
>> ПУБЛИКАТА: [недоловим].
>> LUCAS: An адрес.
OK.
Знам, че Дейвид показва куп клипове на Бинки и неща, сочещи
всеки друг.
Но аз обичам да мисля за указатели като само един адрес.
Така че това е променлива, която ще да се съхранява на адрес.
>> Така че това е просто тази специална променлива че е дълъг четири байта.
Не забравяйте, че всичко е указател към винаги четири дълги за нашата 32-битов байта
машина, така че случаят с уреда.
И тя просто има местоположението на променлива вътре в него.
>> ОК, така че тази памет, общо взето.
Така че всеки блок от памет всъщност има етикет, който е адреса на
slotty памет.
Така че това означава, че мога да имам указател сочещ към
всеки от тези адреси.
Така че причината, поради която ние ще използваме указатели е ако трябва да запомните местоположението
че конкретна променлива е памет.
>> И вие не забравяйте, че един от тези, случаи е, ако имам функция
ако действително искате да суап за реала, аз всъщност
Трябва да изпратите показалка.
Не е променлива.
Смятате ли, момчета, не забравяйте, че?
Разликата между -
какво е името?
Обаждане по стойност и призова чрез препратка, нали?
>> OK, да.
Така че се обади по стойност.
Когато ви трябва само да изпратите на някоя променлива функционира сте просто изпращане на стойност.
Значи всъщност изпращане копие на променливата.
И вашата програма не може да се грижи по-малко ще кажете, ако една и съща променлива всъщност
прави копие.
>> И призова чрез позоваване означава, че Аз всъщност изпращане на копие от
указател към тази променлива.
Така че това означава, че аз съм изпращане на Местоположение на тази променлива.
Така усещам Имам местоположението на променлива, когато аз наричам функцията
с указатели, аз съм в състояние действително да промяна на данните, които е бил в главната.
Направи ли смисъл?
>> Въпреки, показалецът е копие, на указател все още има реален адрес на
променливата, че искам да променя.
Направи ли смисъл?
>> Така че създаването на указатели.
Не забравяйте, че винаги има показалеца от типа, който тя е сочейки
да и след това звезда.
Тогава се слагат името.
Така че не забравяйте, че винаги, когато имате каквото и звезда, това е като указател към
че каквото и променлива напишете, че сте имали.
>> Така че тук в звезда, например, това е указател и число.
И след това слага звезда е указател Чар звезда и така нататък.
Да?
>> ПУБЛИКАТА: Какво става, ако имаме указател към N до звезда х.
Знам, че създава указател към х.
Дали тя също така декларира х цяло число?
>> LUCAS: ОК, така че, когато ти казват н звезда х, не сте създаване на показалец към
променлива х.
Вие създавате показалеца кръстен х.
>> ПУБЛИКАТА: [недоловим].
>> LUCAS: Така че, когато казвам, п звезда х, аз съм казвайки, хей, в паметта, аз отивам да
получи един от тези три кутии.
И аз ще кажа, че това ще бъде х, което е
Ще бъде показалка.
И нещо интересно за указатели е, че ние казваме, че те имат
4 байта за 32-битова машина.
И причината за това е, защото 4 байта са 32-бита.
>> И машини, които са 64 бита всъщност имат указатели адреси
че са дълги 64 бита.
Така че това просто означава, че размерът на адреси в машината е различна.
>> Така Отбелязване и Dereferencing.
Има двама оператори, които вие трябва да запомнят.
Първата е амперсанд.
Вторият е звезда.
Да не се бърка с тази звезда и това звезда, защото не забравяйте, че в
този случай, имате п звезда.
>> Това е като цяло нещо заедно.
Няма по п пространство звезда.
Така че това означава, че тя е от типа.
Не забравяйте, че когато имаш променливата звезда, ти си
Говоря за този тип.
>> Когато току-що сте звезда и след това име на променлива, това означава, че
сте dereferencing показалеца, който означава, че търсите в
показалка, намирането на адреса е посочвайки, става на този адрес,
и гледаш, когато имате там.
Така че аз казвам на моите студенти, че когато имаш звезда, трябва да се мисли, че това е
съкращението на съдържанието на.
>> Така че, ако имате показалеца и вие направи звезда показалеца, това е
съдържание на показалеца.
Така че отидете на каквото и да е, сочещи към и погледнете в постоянна съдържанието.
И амперсант е същото нещо като адрес.
>> Така че, ако имате променлива - например, да се каже, че съм направил Int А е равно на 3 -
ако искате да намерите на адреса на тази променлива с памет, просто мога да направя
Амперсант а.
Така че това е адрес на един.
Направи ли смисъл?
>> Така че ето един пример.
Това липсва Int б и в Int.
Така Int А е равно на 3, което значи, че Отивам да отидат в паметта.
И аз отивам да се намери слот и увеличиха броя три тук.
>> И тогава вътр б равнява на четири.
Отивам да правя едно и също нещо.
Отиди на паметта и постави редица 4 в една от клетките.
И Int се равнява на 5.
Намерете още една кутия и сложи номер 5.
>> И така, какво е тази линия правиш? п звезда годишно се равнява на един амперсанд.
Така че, на първо място, п звезда годишно.
Какво е да го прави?
>> ПУБЛИКАТА: [недоловим].
>> LUCAS: Да, така п звезда годишно, на първо място, декларира указател, наречен годишно.
И тогава това е присвояване на стойността на че показалеца да бъде адрес на.
Така Амперсант а.
След това, ако го направя звезда Pb, какво е звезда Pb?
>> О, съжалявам.
Това също е изчезнал. п звезда Pb.
Искам да кажа звезда бр.
Толкова съжалявам.
Това е едно и също нещо.
Но сега съм добре ар създаване на показалец да Б и след това показалеца в.
Да?
>> ПУБЛИКАТА: [недоловим]?
>> LUCAS: Да.
Така че, ако отидете в паметта и да отидете кутията, която е обозначение за БКП,
вие всъщност ще виж адрес на.
OK?
Да?
>> ПУБЛИКАТА: [недоловим]?
>> LUCAS: Да, показалка е адрес.
Никога не забравяйте това.
Това е като най-важното част за указатели.
Има съхраняване и адрес някои променливи.
Нещо друго?
Някакви други въпроси?
OK.
>> Така Указатели и масиви.
Не забравяйте, че когато го направя INT масив 3, По принцип, това, което правя е, че аз съм, вид
на, за обявяване в показалеца.
Така масив е нещо като указател към определено място в паметта, в които съм
разпределени на три слота за числа.
Това прави ли смисъл?
>> Така че, когато аз INT масив 3, това, което аз съм прави, общо взето, е създаването на три
слотове в паметта.
Така че аз просто намери три слота за памет.
Така че, ако го направя, след това, една звезда масив, то По същество означава, съдържанието на масив,
което означава, че изтриете показалеца, отивам на това място, че тя да сочи на,
и аз слагам номер едно.
>> И тогава, ако го направя звезда масив плюс 1, това е същото като да правиш масив
скоби едно, което просто означава, отивам да на мястото, което тя сочеше.
И след това на плюс 1 марки ми се измести с една позиция.
Така че аз отивам към тази позиция, всъщност, и увеличиха броя две.
>> И тогава, най-накрая, когато го направя масив плюс 2, отивам там, където
посочващо масив на адрес.
И после се премести в памет блокове.
И след това сложих броя три тук.
Да?
>> ПУБЛИКАТА: Така звезда масив е просто заявявайки, че много първата точка.
И вие можете да добавите 1, само защото ние сме само наистина
съотнасяне, че първият адрес.
>> LUCAS: Да.
Защо, например, да речем масив 0, 1 масив, масив и две?
Аз казвам, защо го правиш 0, 1, 2, 3, вместо на 1, 2, 3?
Една от причините за това е, един, компютър програмисти предпочитат да започнат
брои от 0.
Две е така, защото, когато правиш масив 0, това е същото като да правиш масив
плюс 0, което означава, че мога да отида тази позиция, а аз не
пропуснете никакви памет блокове.
Така че аз не се движат никакви памет блокове.
Да?
>> ПУБЛИКАТА: [недоловим]?
>> LUCAS: И така, тя пита какво е разликата между прави
това или прави изчистване.
Една от разликите е, че Int масив 3 се създава
масив в стека.
И когато го направя изчистване, го създава на хийпа.
Това прави ли смисъл?
>> Е как няма изчистване действително работят?
Така че защо ние дори трябва да използвате изчистване?
Вашият компилатор вид на фигури от всички променливите, които ви декларирани.
И той създава пространство за всички ги на в стека.
Така че всичките си променливи ще да бъде някъде в стека.
Така че тук е на околната среда променливи.
>> Така че основно, място за променливите в паметта се разпределя в
време на компилация.
Така че това означава, че компютърът ви има да знаете всички тези променливи
предварително.
Тя не трябва да се знае каква стойност ти започваш да се постави в тях.
Но той трябва да знае как колко памет имате нужда.
>> Но сега нека да кажем, че, например, създавате масив или приемате
низ които сте приемате от потребителя.
Ти не знаеш колко дълго низ ще бъде, например.
Така че не знам точно колко Блокове на паметта ви разпределят, нали?
>> Така че не наистина да има смисъл за да се каже, сложи 100 знака.
И после какво, ако потребителят пише 150?
Ще бъдат прецакани.
>> Така че, общо взето, не можете да бъдете сигурни в това как много памет, което трябва да се разпределят
когато компилирате програмата.
Ти просто знаеш, че по време на изпълнение.
Така че това е защо имате куп.
Така че купчината ще има памет че сте разпределяне по време на
продължителност на изпълнението на програмата.
>> Така че основно, когато правиш изчистване, какво , което правиш, е разпределението на паметта на
по време на работа, което означава, че вие сте реши точно в този момент, че сте
трябва да има, че паметта.
Така че това е, когато сте го разпределяне.
Това прави ли смисъл?
>> Така че не забравяйте, стека има променливи които са създадени по време на компилация.
И тогава купчината има променливи които са създадени като отидеш
с изчистване, например.
>> ПУБЛИКАТА: [недоловим]?
>> LUCAS: Така е GetString Ще се обадя на изчистване.
Нека да говорим за изчистване, и Ще обясня GetString.
Така изчистване е едно и също нещо като разпределение на паметта.
Така че това ще разпредели памет на куп.
И тя ще се върне указател към когато тази памет е бил присвоен адрес.
>> Така че, когато правиш -
тук за пример -
п показалеца звезда.
И след това се равнява на показалеца изчистване размер на 10 инчови пъти.
Аз съм създаване на показалеца.
И тогава аз съм присвояване че показалеца стойността на показалеца, че изчистване
е ми дава.
>> Така че аз питам изчистване може да ви отпусне пространство за 10 числа.
Това е, което той казва.
И изчистване ми дава назад указател към това място.
Направи ли смисъл?
OK.
I И GetString е, общо взето, прави призовавам към изчистване така можете да заделите
памет по време на изпълнение.
>> Винаги помнете, за да проверите за нищожна защото изчистване ще върне нулев
ако не може да бъде заделена памет.
Да речем, че ви помоля за една смешна размер на паметта.
Вашият компютър няма да бъде в състояние да отпусне толкова много.
>> Така изчистване е просто ще да се върне нулев.
Така че винаги да помним, за да проверите дали показалка, че имаш от изчистване е
нищожна или не, защото, ако е така, може да имате се dereferencing указател и
причинява странични дефекти.
И накрая, не забравяйте Вашата свободна памет.
>> Изчистване е създаването на памет в купчината.
И вие трябва да освободите памет преди програмата да свършва.
ОК, това е всичко за мен.
Съжаляваме, Роб.
Благодаря.
>> [APPLAUSE]
>> LUCAS: Някакви последни въпроси преди Rob идва?
Не?
Да?
>> ПУБЛИКАТА: Аз не виждам това един онлайн.
Били го качил все още?
>> 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.
Може да има повече в него е стека кадър ако ФОРМАТ се случва да се използва някои
локални променливи.
Ние не знаем.
>> Но всичко това отива в ФОРМАТ е стека рамка.
Тя ще изпълни ФОРМАТ.
Тогава ФОРМАТ е направено.
Той ще се върне.
Накрая, се прави основен.
Основно ще се върне.
И тогава нашата програма е направено.
Да?
>> ПУБЛИКАТА: Има ли виждам [недоловим]
аргументи [недоловим]
параметри?
>> 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, и ние Сега имаме локална променлива х, които
е Int звезда.
Така че ние отиваме да превъртите чрез тази програма.
Първото нещо, което имаме, е призив за изчистване.
>> Така че ние правим призив към изчистване.
Изчистване е функция.
Това ще се получи купчина рамка.
Какво ще се премине към изчистване?
Това ще влезем вътре на рамката стак.
Минаваме размер на N, което е с 4.
Така, че се предава на изчистване.
>> Какво означава изчистване направя?
То ни грабва някои пространство на куп.
Така че ние ще отидем на куп.
И ние отиваме да вземем 4 байта от купчината.
Така че нека просто да дам, че произволен адрес.
0x123 Просто си представи, че е адрес, който е на куп.
>> Така че това, което всъщност е вътре в това област на паметта на адрес Ox123?
Garbage.
Така че ние не са съхранявани нищо в него.
Така че, доколкото знаем, то Може да е всичко.
Вие не трябва да се предположи, че е нула.
Това не е най-вероятно нула.
>> Така че сега изчистване възвръщаемост.
И какво правим, когато изчистване възвръщаемост?
Ние си поставяме за какво се връща.
Зададохме х равно на това, което тя се завръща.
И така, какво е да го върне?
Това е връщане 0x123 тъй като това е адреса на блока на паметта, че
просто разпределени в купчината.
>> Така се върне 0x123 х сега ще бъде създаден равна на 0x123, които картинно,
ние често се изготвят като х с действително стрелка сочеща към този блок.
Но х е просто съхраняване на този адрес.
Така че сега ние трябва да се провери, ако х е нула.
Това не е нищожна.
Ние се преструваме, че това изчистване успя.
>> Така че сега звезда х е равно на 50.
Така звезда си спомня това означава, отидете на този адрес.
Така 0x123 Отиваме отидете на този адрес.
Така че това ни води до там.
Какво правим на този адрес?
Ние сме съхраняване 50.
>> Така след тази линия, това е, което нещата ще изглеждат.
Така че сега това е вече не боклук там.
Сега ние знаем, че 50 е в тази специално адрес, защото
ние го настроите за това.
OK?
Така че сега ние отиваме да отпечатате F.
>> Така че първо отиваме да отпечатате звезда х.
Така че това, което е звезда х?
Отново звезден х означава отидете на нещо, което х е насочена към.
Така че х е съхраняване на 0x123 Go за това.
Ние получаваме 50.
Така отпечатате е това.
А това означава, че ще ходи да отпечатате 50.
И след това, че се връща.
>> И тогава ние имаме втора ФОРМАТ.
Ние сме сега на сто р.
Ако не сте го видели, че е просто как да печатате указател.
Така че ние имаме процента аз, процента F, и всички тези вече.
Така процента стр., отпечатайте показалка.
>> Така че х е указател.
Така че, ако ще да отпечатате х себе си, ние сме печат какво е всъщност вътре
х, което е 0x123 Така че първото печат е ще отпечата 50.
Вторият печат Е се случва да отпечатате 0x123 Да?
>> ПУБЛИКАТА: Използвате ли процента х да отпечатате указател?
>> ROB: Значи искаш да използвате процента х да отпечатате указател?
Така че можете, но процента х е просто, като цяло, за като, ако имате някаква
число и искате да отпечатате то като шестнадесетичен вид.
Това е просто начина, по който прави това.
>> Като има предвид, че процентът на г би отпечатате като десетични.
Това бяха стигнем процента г. аз е просто число.
процента р е специално за указатели.
>> Така че х е указател.
Искаме да използваме процента р.
Но процента х биха могли да работят.
Да?
>> ПУБЛИКАТА: [недоловим]?
>> ROB: Да.
Най-малко за този разговор - така че аз не го включи в тук.
Но тези два аргумента са непременно вътре в този стак кадър
заедно с всички локални променливи ФОРМАТ се случва да се използва.
И след това на следващия призив за ФОРМАТ сега във вътрешността на ФОРМАТ стека рамка е
процента р н наклонена черта и независимо от стойност на х е, което е 0x123.
Да?
>> ПУБЛИКАТА: [недоловим]?
>> ROB: Това ще отпечата нещо който изглежда така.
>> ПУБЛИКАТА: [недоловим].
>> ROB: Така че това го отпечатва в адресната форма.
Прилича на адрес.
Да?
>> ПУБЛИКАТА: [недоловим]?
>> ROB: Защо е това?
>> ПУБЛИКАТА: [недоловим]?
>> ROB: Защо е този указател 4 байта?
Така че има един куп от 0 е в предната част на това.
Така че това е наистина 0x0000000123.
На 64-битова система, нямаше да има цял куп повече нули.
Да?
>> ПУБЛИКАТА: [недоловим].
>> ROB: Така че първото ФОРМАТ ще се отпечата -
>> ПУБЛИКАТА: [недоловим].
>> ROB: Да, това ще печат какво х е насочена към.
Star казва какво е това нещо, сочейки.
Вземете го.
Така че това, което е тя посочи?
50.
Вземете го.
Това е, което ние ще се отпечата.
Като има предвид, следващата една, ние сме просто печат х себе си.
Какво е вътре е?
0x123.
OK.
>> И тогава най-накрая, ние имаме безплатно.
Какво ще се премине към свободен?
Минаваме х.
Това време аз всъщност показва то в рамките стак.
>> Така че ние сме преминаване на стойността 0x123 за да освободите.
Така че сега безплатно знае, нали, Трябва да отида до купчината
и безплатно, че паметта.
Това е вече не използва това, което е на адрес 0x123.
>> Така безплатно ще освободи че от купчината.
Сега нашата купчина отново е празен.
Нямаме никакви течове памет.
Сега безплатно ще се върне.
Забележете, че х е все още 0x123.
Но сега, че не е валидна памет.
Ние вече не трябва сочен х.
Да?
>> ПУБЛИКАТА: Дали връщането на 0 излишни?
>> ROB: Е returen 0 излишни?
Да.
Ние просто сложи това там, защото ние имаме едно връщане на въздуха.
Така че това е като, да, позволява включва връщането 0.
Да?
>> ПУБЛИКАТА: [недоловим]?
>> ROB: Така след свободно х, какво ще се случи, ако ние се опитваме да сочен показалеца?
Това е възможно, че нищо не е наред.
Това е възможно, че ние все още ще получите 50.
>> Възможно е, също така, че тази памет е сега се използва за нещо друго.
Така че е неопределена поведение.
И неопределен означава нищо може да се случи.
Да?
>> ПУБЛИКАТА: [недоловим]?
>> ROB: Не, така че, ако сте задали х към нещо друго.
Така че, ако точно тук казахме х е равно на изчистване нещо друго -
размер изчистване събитие -
след това, че първоначалната блокова на паметта не се освобождава.
И ние сме официално го загубили.
Това е изтичане на памет.
Ние сме загубили всички позовавания в този блок на паметта.
Така че няма начин ние някога може да го освободи.
ОК, така че след това се върнете 0 средства направено.
>> Добре, така препълване на стека.
Каква е идеята тук?
Така че не забравяйте, грамада е захождането.
Stack се покачва.
Така че това е пример от лекция, Мисля, където основната е просто ще
наричаме тази функция Foo, което се случва да се нарича рекурсивно отново и
отново.
>> Така се натрупват рамки ще работи точно същото.
Така че ние ще започнем с основната като долната стека рамката.
Тогава основната е да се обади Foo, които ще се получи купчина рамка.
>> Тогава Foo ще се обадя Foo отново, което ще се получи
друг стек рамка.
И отново, и отново, и отново, и отново, докато в крайна сметка ще свършим
в купчината.
Така че това е начина, по който се комин препълване.
И в този момент, вие SEG вина.
Или наистина ще SEG повреда преди тази точка, но да.
>> ПУБЛИКАТА: Дали ядро зареже същото като SEG вина?
>> ROB: Така ще видите сегментация Основната вина заряза.
Можете да получите ядро бунище, когато вие SEG вина.
И това е като сметище на всичко съдържанието на сегашния си памет, така
, които можете да опитате и да се определят защо SEG обвиняван.
Да?
>> ПУБЛИКАТА: [недоловим]?
>> ROB: Значи вината сегментация означава има препълване на стека.
Така че не е задължително.
Сегментация вина A означава, че сте трогателно памет по начин,
Вие не трябва да бъде.
Така че един от начините това да се случи е, когато можете стека преливане, започваме трогателно
памет по начин, който ние не трябва да бъде.
Да?
>> ПУБЛИКАТА: [недоловим]?
>> ROB: Така че вътре в един безкраен цикъл.
Например, това е като рекурсивни безкрайна контур и така получаваме друг
стека кадър всеки път.
Но точно вътре на редовен безкрайна, докато един -
добре, нека не дори отпечатате е -
направи нещо.
Каквото.
>> Ние няма да бъдат намалени друг стек рамка.
Ние просто ще продължим да се брънка през тази една инструкция.
Топчето не се разраства.
Това е факта, че всеки рекурсивен призива ни дава купчина рамка.
Ето защо ние се получи препълване на стека.
Да?
>> ПУБЛИКАТА: Така че, ако ти каза, за да получите докато контур и след това [недоловим]?
>> ROB: Така че, ако вътре в неведение, докато имаше ФОРМАТ, вие все пак ще
SEG не неизправност.
Аз просто не искам да обърка нещата.
Това би контур.
Вие ще получите еднопакетна рамка за ФОРМАТ.
>> Тогава ФОРМАТ ще се върне.
След това отново, че ще контур.
Вие ще получите еднопакетна рамка за ФОРМАТ.
Той ще се върне.
Single стека рамка.
Така че не получавате този безкраен трупат стека рамки.
>> ПУБЛИКАТА: [недоловим]?
>> ROB: Да.
Така че това се случва препълване на стека тъй като нито един от тях
повиквания към Foo се завръщат.
Така че, ако се върнем, тогава ние ще започвам да губя стека рамки.
И тогава ние нямаше препълване на стека.
И това е защо имате нужда от базов модел за личните си функции.
Да?
>> ПУБЛИКАТА: Дали потенциалния размер и стека за купчината същото за
всички програми?
>> ROB: Грубо.
Е потенциалният размер на стека и купчината еднакви за всички програми?
Грубо.
Има някои рандомизацията до където започва стека и
където купчината започва.
Ако ви се случи да има един куп глобални променливи и неща, може да се
отнеме от малко пространство за вашата купчина.
>> На 64-битова система, вие на практика има безкрайна памет.
Има само толкова много.
Между 32 бита и 64 бита, че е значителна разлика.
>> Ще получите много повече стека и куп пространство на 64-битов
система, защото там е просто още адреси, които те могат да използват.
Но на индивидуална система, тя ще бъде приблизително същото количество от стака
и куп пространство.
Добре.
>> Така последно нещо е компилация.
Така че вие трябва да знаете този процес.
Има четири големи стъпки.
Така че първо трябва бъде лесен за запомняне.
Предварителна обработка.
Той има префикс предварително в него.
Така че става дума преди всичко останало.
>> Това, което трябва да запомните е хашиш.
Така че хеш определя и хеш включва във всички тях.
Това са всички предварително процесор директиви.
Това са нещата, които предварително процесор се грижи за.
>> Така че това, което прави предварително процесор направя?
Това е нещо наистина тъпо.
Всичко това е в състояние да са всички тези операции за копиране и нарязани, и паста.
>> Така че хеш включва стандартен i0 точка з.
Какво е, че правиш?
Тя измъкна стандарт i0 точка з файл и да го поставите в горната
където и да се казва, хеш включва стандарт i0 точка з.
>> И всеки хеш определи, че сме види, какво е това правиш?
Нейната копиране на стойността, която хеша определено се определя като поставяне и че
където и да се използва стойността на.
Така че Препроцесорът просто прави наистина прост текст базирани операции.
Тя не прави нищо умно.
Така че всичко останало е по-сложно.
>> Така че сега, че Preprocessor е направено, ние всъщност компилирате.
Е, какво значи Комплектовката предвид?
Сега ще от C код за сглобяване код.
Да?
>> ПУБЛИКАТА: [недоловим]?
>> ROB: Да, хванахме това.
Така че съставянето.
Отиваме от С до монтажа.
Така че това е действителна промяна на езика.
Самата Съставяне означава преминаване от език, по-високо ниво, за да
език, по-ниско ниво.
>> И с е език на високо ниво в сравнение със сглобяването.
Какво е монтаж?
Неговите инструкции, които са доста много, направени за вашия процесор.
Но компютърът ви все още прави не разбирам монтаж.
Той разбира само единици и нули.
Така че следващата стъпка е монтиране, които ни води от тези инструкции, които
процесора разбира и всъщност ги превежда, да
тези и нули.
>> Така C за монтаж в двоично.
Но не е нужно да изпълним още.
Така че мисля, че на CS50 библиотеката.
Имаме предвидени с двоичен за това CS50 библиотека, която има GetString
и GetInt и всичко това.
>> Но CS50 библиотеката -
само по себе си - не е изпълним.
Тя не разполага с основна функция.
Това е просто един куп двоичен , които можете да използвате.
Така свързване е как ние да обедини всички на тези различни двоични файлове
в реално изпълним.
Едно, че можете да въведете дот наклонена черта точка навън.
>> Така че това е като файла, който пише, - каквото и програмата ви е -
Ceaser точка в.
Но сега той е бил съставен надолу, за да двоичен.
Така Ceaser точка о.
И това е нашата CS50 библиотеки двоичен.
И те се комбинират в един-единствен изпълним файл.
Да?
>> ПУБЛИКАТА: [недоловим]?
>> ROB: Значи първо да включва, не забравяйте, хеша включва всъщност е
предварително процесор стъпка.
Но това е отделен.
Ако не използвате всички функции, които са извън вашата един файл и след това,
не, не е нужно да се свърже нещо тъй като имате всичко.
>> Това заяви, ФОРМАТ е свързан инча
Ако някога сте се използва ФОРМАТ, това е нещо, че трябва да бъде свързан в
защото не съм писал това.
И в действителност, ФОРМАТ автоматично свързан инча
Знаеш ли как в командния ред или когато изпишете направи, ще видите, че имате
тире л CS50, който има връзка в CS50 библиотеката?
ФОРМАТ, и подобни неща, ще да бъдат свързани в автоматично.
Всякакви други въпроси, свързани с нещо?
>> ПУБЛИКАТА: [недоловим]?
>> ROB: Обвързването?
Имаме цял куп различни двоични файлове.
Това е каноничен пример , която ние използваме е CS50 библиотека.
Ние сме съставили и който ви е даден на двоичен за този CS50 библиотека.
>> Вие искате да използвате GetString във вашата програма.
Така че отидете и да използвате GetString.
Но без да ми двоичен код за GetString, когато компилирате кода си
надолу, вие всъщност не може да пускате програма, защото GetString String е
все още не е напълно определено.
>> Това е само при свързване в моята двоичен който съдържа GetString че сега, всички
Добре, може действително изпълни GetString.
Моят файл е пълна.
И аз може да работи това.
Да?
>> ПУБЛИКАТА: Има ли обвързване конвертирате двоичен да изпълним?
Така че, дори ако не разполагате с друга библиотеките, не би все още да бъдат
необходимо да се преобразува на [недоловим]?
>> ROB: Така изпълним все още е в двоичен.
Това е просто комбиниране цяло китка на бинарни файлове.
>> ПУБЛИКАТА: Благодаря ви много.
>> ROB: Няма проблем.
Някакви други въпроси?
В противен случай, ние сме всичко е готово.
Добре.
Благодаря.
>> [APPLAUSE]
>> ПУБЛИКАТА: Благодаря ви.
>> ROB: Да.