СПИКЕР 1: Привет всем. Мы собираемся, чтобы начать. Я думаю, что люди все еще идут быть фильтрации в. Но в целях экономии времени, поэтому мы можем получить вы, ребята, отсюда на время, мы собираемся начать. Так что добро пожаловать к CS50 Викторина 0 отзывов. Для тех из вас, кто не понял, еще, у вас есть вопрос на среду. Ву-ху. Если вы еще не начали изучать еще и не понял, что это существует пока, последние опросы и вся информация о ваш тест находятся на cs50.net/quizzes. Там-то довольно хороший материал там, Прошедшие викторины от последнего 10 лет, а также информацию об этом викторины и темам , которые будут покрыты. Так что давайте начнем. Так вы, ребята, возможно, помните, первый день класса Давида были те лампы на. Так по существу, все, что происходит под капотом компьютера является сделано в двоичной системе. Двоичной означает, что это звучит как, 0 и 1 годов. Она имеет два значения, можно представить. Так же, как в первый день раздел когда Дэвид включил свет лампа для представления на, или 1, наш компьютер понимает двоичный как 0 и 1-х, или нет. Основы Binary. Каждое место представлена в базе два. Таким образом, вы добавьте 2 к 0 до С 1 по 2 все, вплоть до. Чтобы вычислить, что ваша программа является десятичной, вы просто следуете это уравнение Тип вещь. Если у вас есть 1 в любом из этих мест, Вы умножьте его на все основывать это, добавьте его, и Вы получаете десятичной. Так что это, как вы считаете до 5 в двоичном виде. Так же, как то, что мы делали на последний слайд, это, как вы бы представляют с 1 по 5. Точно так же, так же, как вы можете добавлять и вычесть в десятичной или основывать 10, или действительно любое основание, на можно добавить и вычесть в двоичной системе. Точно, что вы ожидали бы, когда вы добавить двух до, если она равна больше чем 1, вы носите 1, сделать его 0, и сделать добавление таким образом, просто как можно было бы ожидать с регулярным десятичное или любой другой базы. Прохладный. Так как я уже говорил, все, что происходит под капотом нашего компьютера делается в 0 и 1, либо бинарный. Так как же мы выражаем, например, букв или цифр или символов? И ответ на это ASCII. ASCII является отображением между персонажами что мы обычно видим в Английский язык, как сайт, B, C о, подчеркивают, тире, и ничего подобного. И он отображает, что в значение ASCII. Значение ASCII это просто число, что можно понять, компьютере. И так же, как вы можете сделать добавление и вычитание с числами, вы можете сделать их со значениями ASCII. Таким образом, в этом примере, что это будет распечатать? Да, так просто пространство B пространство C пространство D. Где моя мышь идти? Обратите внимание, вы можете определить Int на 65. И при печати, что с помощью процентов C, это будет интерпретировать, что, как характер и распечатает А. Кроме того, вы можете объявить это как символ. И когда вы распечатать его с помощью процентов C, это будет интерпретировать, что, как процентов D. И так же, как вы можете добавить число, вы можете добавить символы Значения ASCII, в этом случае. Так немного указатель для всех. 5, в виде строки, не фактически равна 5. Так как мы можем преобразовать Строка 5 к целому 5? Любые идеи? Да. Так что, если у нас есть 5 в виде строки, мы можем вычесть 0. И что даст нам 5. И точно так же, если у нас есть 5 как целое, добавить, что в строку 0. И это дает нам строку 5. Прохладный. Теперь вспомните обратно в лекции тот, где мы говорили о алгоритмов. Так как же мы на самом деле хотим компьютер чтобы делать интересные вещи? Вы знаете, просто сложение и вычитание номера и печати вещи из не что интересно. Как правило, мы хотим, чтобы наш компьютер к выполнять своего рода алгоритм. Что-то немного сложнее чем просто простой арифметики. Алгоритм просто шаг за шагом набора инструкций для выполнения, как определенный task-- так же, как рецепт. Возможно, вы помните первый день Класс, где Давид Подсчитаем номер людей и сколько людей были в комнате. Вы могли бы быть использованы для подсчета один за другим. 1, 2, 3, 4. В этом случае линейный алгоритм времени. Но Давид ввел алгоритм Вы сосчитать людей в номере где все встают, вы Произнесите Число другому лицу, добавить, что число, и один человек садится. И вы повторить это. Это один тип алгоритма. Мы можем проанализировать, как эффективно ап Алгоритм основан на это во время выполнения. Но мы поговорим немного об этом чуть позже. Таким образом, все алгоритмы могут также записать в псевдокоде. ПСЕВДОКОД просто английский как синтаксис, используемый для представления язык программирования. Например, если мы хотели спросить пользователя угадать мой любимый номер, мы псевдокод может иметь как таковой. Получить пользователи думаю. Если догадка верна, сказать им, они правы, иначе сказать им они не правильно. И псевдокод это способ легко представляя идею или алгоритм. Так что теперь мы могли бы на самом деле писать это на языке, что компьютер могли бы понимание. Таким образом, мы можем записать наш псевдокод и интерпретировать, что в исходном коде. Пока, исходный код должен придерживаться в определенной синтаксисом язык программирования. И до сих пор, в CS50, мы использовали в основном в. Так что это может быть исходный код в. Позже в ходе, вы ночью приходят в контакт с другими программирования Языки, как PHP. Или, если вы даже принимать другие классы, вам может сделать Java, Python, или даже OCML. Но в нашем языке с программы, это как мы могли бы написать исходный код для алгоритм псевдокод, что Я только что описал ранее. Так как же ваш компьютер на самом деле понять, что? Как я уже говорил, это только действительно понимает нули и единицы. Так, как это получить от источника Код к тому, что может быть понял? Ну, у нас есть что называется компилятор. Если вы помните назад в большинство psets, вы были какие программы написано в точка C File. И тогда вы должны ввести марку. Так что же делать делать? Вы можете ввести марку, чтобы компилировать Программа потому someone-- тот, кто написал свой р набор; вероятно David-- создал сделать файл. И что говорит сделать, чтобы знать, чтобы запустить свой компилятор, называется звон, что воля скомпилировать исходный код объекта Код, который нули и единицы что ваш компьютер понимает. Но немного позже, мы пойдем более подробно о компиляторов. Так вспомнить PSET 0, where-- да, у вас есть вопрос? АУДИТОРИЯ: [неразборчиво]? СПИКЕР 1: Да. Я думаю, что они на самом деле должны быть онлайн. Да. АУДИТОРИЯ: Это как [неразборчиво]? СПИКЕР 1: Это не так. Находятся на cs50.net/quizzes. АУДИТОРИЯ: Slash викторины, слэш 2013, слэш 0, и просто нажмите через викторины 2013 и викторины 0, пересмотреть раздел слайды. СПИКЕР 1: Да, так что если вы, ребята, хотите потяните его вверх и посмотреть на него на вашем собственный компьютер, это тоже хорошо. Сказать, что снова. АУДИТОРИЯ: [неразборчиво]. СПИКЕР 1: Да, [неразборчиво] является фиктивная переменная. О, да? АУДИТОРИЯ: [неразборчиво]? Динамик 1: Нет, забастовки не на экзамене. К сожалению, ее вопрос был, был удары по экзамену. И это не так. Так PSET 0, вы, ребята, должны иметь все реализованы нибудь через царапину. И мы узнали некоторые основы программирования строительные блоки, использующие царапины. Итак, давайте взглянем на некоторые из этих строительных блоков , которые составляют программу. Впервые это логическое выражение. Логические выражения являются те, и 0-х или все, что имеет два возможных значения. В этом случае, истинным или ложным, или выключить, и да или нет. Пример простой, очень простой, программа, которая использует логическое выражение здесь. Так для того, чтобы логических выражений в быть полезно, у нас есть логические операторы. Эти операторы, которые можно использовать сравнить определенные значения. Поэтому у нас есть и или не равно, меньше или равно, или больше, чем равны, и меньше, чем или больше, чем. Но эти операторы не очень полезно если мы не можем объединить их в условия. Так вы, ребята, помните из нуля и с вашего р устанавливает, что мы было условия. Они, по сути, как вилки в логика вашей программы, что выполняет в зависимости от того условие выполняется. Так одним из условий, которые мы имели использовать много раз в этом курсе если, то в другом месте, если, и в другом месте условия. Вот пример того, как Вы могли бы использовать это. Кто-нибудь знает разницу между только с помощью если заявления всех вплоть стихах, если, еще, если, и еще в сочетании? Да? АУДИТОРИЯ: [неразборчиво]. СПИКЕР 1: Точно. Так что, если у меня было, если все, вплоть этом образом, даже если это условие возвращения правда, он все равно будет продолжать тестирования в ближайшие два. В то время как, с еще-если, к ELSE личных данных, если один возвращает истину, остальные не проверял. Любые вопросы о том, что? Прохладный. Таким образом, вы используете, если-иначе из ELSE заявление, если вы знаете, что он может только быть одним из этих случаев. Итак, мы знаем, если х меньше 0, это определенно не будет больше, чем 0. Далее, еще одним строительным блоком что мы узнали являются петли. У нас есть три типа циклов. Для петель, в то время как петли, и сделать в то время как петли. И вообще, когда вы садитесь в то написать, вы должны решить, какой из трех вы хотите использовать. Так как же нам решить, какой? Мы вообще используем для цикла, если мы знаем, сколько раз мы хотим итерации через то или сколько раз мы хотим, чтобы выполнить задачу. Мы используем в то время как петли, если нам нужны состояние, чтобы быть правдой, чтобы продолжать работать. И мы используем сделать в то время как очень похож на в то время как, но мы хотим, чтобы наш код для запуска на мере один раз. Так что в то время, все, что находится в волю всегда выполняются хотя бы один раз. В то время как, с то время, его не может работать вообще, если условие не выполнено. Любые вопросы с этим? Так структура для цикла. Вы, ребята, все видели это. Вы инициализировать его. У вас есть своего рода состоянии. Так, например, мы могли бы инициализировать как для я равна 0. я меньше 10. И я ++. Очень простой, что мы сделали. Некоторое время цикла, так же, у вас есть иметь своего рода инициализации, своего рода состоянии, и своего рода обновления. Так что мы можем реализовать наши цикле также как время цикла с помощью этого. И точно так же с дел в то время как петли, мы могли бы иметь некоторую инициализацию, выполнить то, обновить его, и Затем проверьте состояние. Так что теперь функции. Ставим все вместе. Мы, возможно, захотите написать некоторые вид функции. Общие функции, которые вы, возможно, уже видели это главный. Основной является функцией. Он имеет тип возвращаемого значения, внутр. Он имеет имя функции, основной. И она имеет аргументы, ARGC и ARGV. Так главный это просто функция. Другие функции, которые вы использовали, printf-- Е является function-- GetInt, ToUpper. Но это, оказывается, был реализованы для нас своего рода библиотеки. Если вы, ребята, помните включая эта библиотека CS50.h или Стандарт I / O библиотека. Да, вопрос? Зала: основной просто присуще с? Имеет ли это только отчасти [неразборчиво]? СПИКЕР 1: Вопрос в том, если главный присуща в. И да, все функции есть основную функцию. Это своего рода необходимы для компьютера знать, с чего начать выполнения кода. АУДИТОРИЯ: Так вы не захотели [неразборчиво]? СПИКЕР 1: N: Еще вопросы? Прохладный. Так же, как вы можете использовать функцию что написано для вас, вы можете также написать свою собственную функцию. Это функция, что кто мог бы написали для расчета объема из д, например. Там в возвращаемый тип здесь, в этом случае Int, наше имя функции д и наши Список параметров. И обратите внимание, что у вас есть, чтобы записать данные тип параметра, который требуется использовать либо функция не знать, какие параметр должен я быть принятие. Так, в данном случае, мы хотим целое, как наш вход. Так почему может мы хотим использовать функции? Прежде всего, отлично подходит для организации. Они помогают разбить свой код в более организованной куски и сделать его было проще читать. Упрощение. Это хорошо для дизайна. Когда вы читаете кусок кода и основная функция действительно, очень долго, это может быть сложнее Причина о том, что происходит. Так что если вы разбить его на функций, это может быть более удобным для чтения. И повторно-способность. Если у вас есть кусок кода, который будучи называется или запустить несколько раз, вместо перезаписи, что код 10 раз в основной функции, вы могли бы хотите использовать его. И тогда каждый раз, вы должны использовать, что кусок кода, вызвать функцию. Так что теперь, если мы вспомним, обратно нуля, мы также говорили о нескольких концепций, один из которых резьбы. Тема является понятие кратного последовательности кода выполнение одновременно. Так вспомните дня, где Дэвид был Вы, ребята, отсчитать количество люди в комнате. По существу, что происходит на все из вас, ребята были работает отдельные потоки. И эти темы шли вместе чтобы получить своего рода ответ. Точно так же в пустом, когда у вас есть несколько спрайты, может есть кошка и собака. И они были бы одновременно работают собственные скрипты. Это является примером резьбы. И другое понятие, что было введен в пустом была события. И события, когда несколько частей ваш код общаться друг с другом. В нуля, это было, когда вы использовали контроль и вещания Когда я Получите блоков. А также, в задаче Набор 4, мы видели немного событий, а также. Вы, ребята, могли бы использовать Библиотека Gevent. И была функция waitForClick в котором вы ждали для пользователя, чтобы нажать кнопку. И ваш щелчок, в этом случае, было бы событий и ждать клик это ваш обработчик событий. А также, по всей показ psets и работает на ваших psets, вы возможно, вступают в контакт с Некоторые из этих команд. Это то, что вы набрали в ваше окно терминала или что окно что появляется на вашем г правку, существенно перейдите компьютер. Так, например, LS перечисляет содержимое каталога. Создание каталога создает новую папку. CD, изменить каталог. RM, удалить, удаляет файл или некоторые каталог. А потом удалить каталог удаляет каталог. АУДИТОРИЯ: [неразборчиво]? СПИКЕР 1: Да, конечно. К сожалению, вопрос был, если вас бы предложить положить это на шпаргалку. Это могло бы помочь. Если у вас есть номер, вы можете поставить его на. Это также просто, как правило достаточно хорошо запомнить, потому что, когда вы используете его Вы могли бы хотеть просто есть он запомнил. Это сделает вашу жизнь намного проще. Я ответил на ваш вопрос? Так что теперь, мы немного поговорили коротко о библиотеках. Но два главных те, которые мы были используя до сих пор в ход идут стандарт ввода / вывода и CS50. Какие вещи включены в стандартной библиотеке ввода / вывода? Да, до сих пор мы использовали Printf. В CS50, мы использовали GetInt и GetString. И тип данных строка также происходит , который был объявлен в этом CS50 библиотеки. Мы поговорим еще немного в глубине о как библиотеки работают и как они взаимодействовать с остальной частью кода. Но те, являются двумя основными те, которые мы вступают в контакт с до сих пор в Конечно. Виды. Это хорошо, чтобы помнить, сколько каждый тип представлен или как количество байт каждый тип requires-- Int, 4 байта; символ, 1 байт. Поплавок составляет 4 байта. Что такое двойной? АУДИТОРИЯ: [неразборчиво]. СПИКЕР 1: Да, так поплавок но удвоить размер. А как насчет тех пор? АУДИТОРИЯ: [неразборчиво]. СПИКЕР 1: OK. Что такое долго? АУДИТОРИЯ: [неразборчиво]. СПИКЕР 1: Да, два раза в Int. Да. АУДИТОРИЯ: [неразборчиво]. СПИКЕР 1: Лонг [неразборчиво]. А потом долго долго вдвое больше, чем. АУДИТОРИЯ: Нет, нет. Длинная просто внутр. Это зависит от архитектуры до [неразборчиво] и Int имеют одинаковый размер. [Неразборчиво]. СПИКЕР 1: Так долго и Int одинаковы. А потом очень долго вдвое внутр. Прохладный. И потом, что это последний тип? АУДИТОРИЯ: Указатель. СПИКЕР 1: Да, так мы узнали Немного о указателей. И независимо от того, указатель указывая to-- него может быть символ звезды или Int star-- это всегда 4 байта для указателя. Вопросы о том, что? Да? АУДИТОРИЯ: [неразборчиво]? СПИКЕР 1: Так долго и Int являются то же самое в этом CS50 устройства. АУДИТОРИЯ: Прибор полностью взаимозаменяемы. СПИКЕР 1: Да. Так потом долго долго двойной внутр. АУДИТОРИЯ: Это 32 бит? СПИКЕР 1: 32 бит, да. АУДИТОРИЯ: Так [неразборчиво]? СПИКЕР 1: Да, если это не так явно говорят, вас должны взять на себя 32 бит. АУДИТОРИЯ: Было бы что-то сказать как предполагая Архитектура как прибора. Для 64-битной, только то, что Изменение являются жаждет и указатели. Как они [неразборчиво]. СПИКЕР 1: Да? АУДИТОРИЯ: Вопрос. Так на одном из практики викторины, он просит о неподписанных Int. Так как же, что определяется от Int [неразборчиво]? СПИКЕР 1: без знака в также 4 байта. Но чем отличаются подписан Int и без знака Int? АУДИТОРИЯ: [неразборчиво]. СПИКЕР 1: Право. Можно представить отрицательные значения. Но как это сделать? АУДИТОРИЯ: [неразборчиво]. СПИКЕР 1: Да, это экономит 1 бит для представления знака. Подписанный имеет один бит, что представляет собой знак. И без знака просто все положительные. АУДИТОРИЯ: ОК. Так вы говорите, что номер на двоих человек в два раза больше поплавком? СПИКЕР 1: Двухместный в два раза Размер целого, да. АУДИТОРИЯ: Как указатель чтобы долго долго [неразборчиво]? СПИКЕР 1: Итак, вопрос в том, как делает указатель на долгое long-- Как это только четыре байта, когда очень долго ее 8 байт. Так что помните, что это указатель, по сути дела, на очень базового значения. АУДИТОРИЯ: [неразборчиво]. СПИКЕР 1: Да, так указатель это просто ячейка памяти. Так что не имеет значения, как много места что указатель направлен в. Это необходимо только 4 байта, чтобы отслеживать из этой ячейки памяти. Еще вопросы? Прохладный. Так последнее, что у меня есть используется стандартный вывод. Вы должны использовать их часто Достаточно того, что вы можете вспомнить. Но это, когда мы используем Е, например. И у нас есть эти заполнители, назывались коды формата. Так процентов с гольца, процентов я для междунар, и мы можем также использовать процентную д. Это то же самое. Но, как правило, в CS50 мы попробуйте использовать процентную I. Процент е для поплавка. Процент л.д. долго долго и процентов с для строки. Точно так же, мы использовали несколько эти управляющие последовательности. Например, обратную косую черту н для новой линии. Это просто, когда вы форматирование ваш код для печати ф. Да? АУДИТОРИЯ: Что такое процентов сут в течение? СПИКЕР 1: Итак, вопрос является то, что процентов сут в течение? Процент г для целых чисел. Процент D и I процентов одинаковы. АУДИТОРИЯ: В чем разница между обратный слеш н и обратный г? СПИКЕР 1: Итак, вопрос в чем Разница между люфта п и люфт г? Я думаю, обратной косой р is-- АУДИТОРИЯ: Так обратный слеш г всего лишь подразумевает, возвращается в начало строки фактически не собираюсь с новой строки. Так что, если вы печатаете обратной косой г и вы вернуться к началу строки затем распечатать больше материала, перезаписи материал, который уже на [Неразборчиво]. В то время как, н фактически идет на новый линии и идет в [неразборчиво]. СПИКЕР 1: Ну, любые другие вопросы? Хорошо. Я собираюсь передать его дальше, чтобы Дэн, который будет продолжаться. [Аплодисменты] ДЭН: Все правша. Так что я буду говорить о другой шириной Диапазон идей из класса, которые примерно представитель недели две и начало три недели, начиная с с литья, который просто способ лечения значение определенного типа, как значение другого типа. Таким образом, мы можем сделать это с символов в Интс, всплывает на целых чисел, и длинные жаждет удвоить. Все эти вещи можно использовать в качестве способов лечения некоторое числовое значение минус символ, как некоторые другие числовое значение. Таким образом, есть некоторые вопросы, с этим, из Конечно, которых приходит, когда вы приводите вещи, как поплавок на целых чисел. Так что это немного странно. У нас есть поплавок, который является 1,31. Умножим его на 10 тысяч. А потом мы печатаем его в качестве междунар. Что это выход? 10000 раз 1,31. Так 13000, в том, что угадать? Зала: Я думаю, что это 10000. ДЭН: Так что я умножив его на 10 тысяч до Я литья его. АУДИТОРИЯ: Ох. Не было там быть один 9 и некоторые 0 цифры? ДЭН: Вы, возможно, некоторые странные цифры. Так правильно, это в 1,3 раза 10000. Так вот 13000. И этот дополнительный weird-- АУДИТОРИЯ: 13100. ДЭН: 13100. Спасибо, Боб. И этот дополнительный weirdness-- это 9,9-- просто потому, что этого литья закончил округления вниз, где оно не должно быть. Да. АУДИТОРИЯ: литье происходит после все остальное? ДЭН: Так потому что у меня это в печати, это делает этот умножение перед ним делает этот кастинг. АУДИТОРИЯ: [неразборчиво]. ДЭН: Я думаю, что это поставит под первым, да, который будет 10000. Что еще? Прохладный. Так что это 13099. Почему это происходит? Неточность. Поплавки не идеальны. Они могут только представлять числа в определенное количество значащих цифр. Так что, если мы распечатать 8 SIG инжир на это поплавок, мы получаем своего рода уродливый взгляд номер. И это потому, что 1,31 не может точно быть представлен простой степенями двойки в машине. Так что в конце концов принимая ближе думаю, что в конечном итоге быть немного низко. Смысл? ОК. Теперь, перешли в другой способ делает условные операторы, где все мы заботимся о том, одна переменная. Таким образом, в этом конкретном примере, мы получая целое число от пользователя. А потом мы смотрим на что это целое является. Предположительно, это число от одного до четырех. Это то, что мы просим. Таким образом, вы сделать переключатель имя переменной. Тогда вы создали случаи можно ценит это могло быть. Так случае, если один, говорят, что это низко. И тогда вы нарушите выйти состояния переключателя, так Вы не продолжать. В следующем case-- так дело два и дело three-- если это дело два он просто падает до Первая строка кода он видит, как с трехмодовом, пока не увидит перерыв. Так что причина вы получаете случай один на только печать низкий потому, что I есть этот перерыв здесь. Если я, скажем, игнорировать этот break-- если я бросил эту breakaway-- было бы напечатать низкий, и тогда было бы печатать середину, и тогда было бы сломать. Так перерывы являются важной частью из переключения условия и они должны быть там. Любые случаи, которые явно не оговорено обрабатываются по умолчанию Дело в коммутаторе и должны быть поданы. АУДИТОРИЯ: Так 1, 2, 3, и 4 будет н? ДЭН: Значения, н может быть. Да. Да? АУДИТОРИЯ: Итак, когда у вас есть что [неразборчиво]? ДЭН: Вы бы напечатать низкий, а затем было бы напечатать середину, и то было бы сломать. Зал: А почему бы распечатать средний если [неразборчиво]? ДЭН: Так что все под случае до перерыва попадает под. Так дело один принт под случай один, как это следующие печатные. Да? АУДИТОРИЯ: [неразборчиво]? ДЭН: Так это число лишь частным значение, эта переменная можно взять, не так ли? Имеет ли это смысл? Да. АУДИТОРИЯ: [неразборчиво]? ДЭН: Да, дело два будет печатать среднего, а затем разбить. АУДИТОРИЯ: [неразборчиво]? ДЭН: Я думаю, что любой? Какие еще типы данных Вы можете перейти? АУДИТОРИЯ: Вы можете переключаться по отношению к любым типам данных. Но это значит только ничего над символов и Интс и все в таком духе, что, поскольку если вы переключении указатель что на самом деле не имеет смысла, переключения нагрузок, если он даже давайте Вы делаете это, потому что из плавающей точкой в точности, вы не будете действительно хочу сделать это в любом случае. Так в значительной степени, всего Интс и символы и все в таком духе. ДЭН: Да, это когда у вас есть явное значения, что вы знаете, я думаю, что, может быть что переход на самом деле полезно. Хорошо? ОК. Сфера является диапазон, что заявил переменная распространяется. Таким образом, в этой маленькой кусок кода у меня есть, было бы полно ошибок. А причина в том, я объявил эту Int я в рамках этого цикла. А потом я пытаюсь ссылаться, что я за пределами, что для сферы петли. Так в основном, вы можете думать о рамки как все, что вы объявляете с внутри набора фигурных скобках только существует в тех фигурные скобки. А если попробовать и использовать эту переменную за пределами тех фигурные скобки, вы будете получите ошибку от компилятора. Да? АУДИТОРИЯ: Так что это один не работает? ДЭН: Это не работает, да. Строки. Строка символ *. Они точно так же. Они просто указатели на символы. И любые строки, которые вы должны должны закончиться с обратной косой черты нулевой, который находится всего с конвенция. Она называется NULL терминатор. И NULL-- капитал N, капитал U, капитал L, капитала L-- это не то же самое, NULL терминатор. Это указатель. Это символ. Они очень различны. Помните это. Это будет на викторине, наверное. Я не видел викторину. Да? АУДИТОРИЯ: Так NULL, скажем, указатель? ДЭН: Да. АУДИТОРИЯ: Что делает [неразборчиво]? ДЭН: Если, скажем, таНос вызывается, когда вам не хватает памяти, чтобы получить независимо от размера вы просите, таНос вернется NULL. Это, в основном, всякий раз, когда функция должна возвращать указатель, вы нужно проверить против NULL, потому что NULL является довольно good-- это, своего рода, значение мусора. Это нулевой насколько указатели идти. Всякий раз, когда вы вызываете функцию, что возвращает указатель. Вы будете хотеть, чтобы проверить, что уверен, что этот указатель не NULL потому NULL является очень распространенным явлением. Это своего рода возвращение мусора. Так что если что-то не идут прямо, просто вернуть NULL вместо. АУДИТОРИЯ: [неразборчиво]? ДЭН: Да, и что это такое. АУДИТОРИЯ: [неразборчиво]? ДЭН: Заклинание, так как это. Это NULL терминатор. Это строчная N-U-L-L, если вы правописание его. АУДИТОРИЯ: И я просто пошел назад и проверил его. И если вы попытаетесь поставить с плавающей точкой Значение в переключатель, он будет кричать на вас говоря, утверждение требует выражение целого типа. DAN: Там вы идете. Но да, какой был вопрос? АУДИТОРИЯ: [неразборчиво]? ДЭН: Так столица N, капитал U, капитал L, капитала L является актуальной с вещью. Это указатель NULL и будет рассматриваться только в качестве таковых. Вы никогда не попробовать и заклинания NULL характер и посмотреть любой другого пути, кроме этого. Да? АУДИТОРИЯ: Так возвращения на персонаж макс или то в примечаниях, так ли воплощают ту же самую функцию как [неразборчиво]? АУДИТОРИЯ: Так вы имеете в виду возвращение сЬаг макс от GetChar, или то, что это? АУДИТОРИЯ: Да. АУДИТОРИЯ: Да, так что общее термин для всех тех вещей, дозорные значения. Так как возвращение целочисленное макс от GetInt и символ макс от GetChar, это должен быть, как, все в порядке, если эти вещи возвращаются к нам, то пошло не так. Для указателей, мы как раз есть это дозорного значение, что каждый согласовывает. И это то, что вам вернуться когда дела идут плохо. Так символ макс это то, что мы используем чтобы представлять собой нечто как NULL или GetChar. АУДИТОРИЯ: Так что, если вы тестируете GetChar, может вы просто положить NULL? Бы, что изменить ситуацию? ДЭН: Вы не могли бы просто проверить NULL. Вы должны были бы проверить сЬаг макс потому Возвращаемое значение из функции персонаж не является указателем. Да? АУДИТОРИЯ: задает этот вопрос для длины строки. Которые включают в себя нулевой символ ли? DAN: Нет И это на самом деле, как длина строки знает, чтобы остановить, потому что он проходит через Ваш массив символов до он видит пустой символ. А потом это как, все Хорошо, я сделал. АУДИТОРИЯ: [неразборчиво] пять? ДЭН: Здравствуйте бы пять. Да. Так массивы непрерывны блоки памяти. Они имеют мгновенный доступ, говоря Имя массива, а затем, в кудрявых скобки, что индекс вы хотите пойти чтобы, они индексируются с нуля через длина массива минус 1. И они объявлены по типу вещь, которая вы храните в Массив, имя массива, а затем что размер этого массива. Так что это символ массив длины шесть, что имеет эти значения. Да? АУДИТОРИЯ: [неразборчиво]? ДЭН: Да. АУДИТОРИЯ: [неразборчиво]? ДЭН: Если у вас есть то, что происходит в массив уже сделал. Таким образом, вы можете указать это вместо этого как, скажем, символ, что название вашей массив, пустые скобки равна вьющиеся готовиться H запятая E запятая L запятой L запятую O запятая NULL характер и фигурная скобка. Это также будет работать в качестве декларации. АУДИТОРИЯ: [неразборчиво]? ДЭН: Тогда вы должны иметь размер уже сделал. АУДИТОРИЯ: [неразборчиво]? ДЭН: Да. Все правша. Аргументы командной строки являются одним из способов получение данных от пользователя в качестве Аргументы главный. Главная принимает два аргумента. Число аргументов, что в настоящее время прошли вдоль командной строки и вектор строк или массив строк из всех аргументов. Так что, если я, скажем, называется такая функция, как точка из 1 пространства, 2 пространства, три, агдс будет 4. И агду 0 будет точка из. Argv1 будет 1. argv2 бы 2. argv3 будет 3, в этом конкретном случае. Да? АУДИТОРИЯ: [неразборчиво]? ДЭН: последний элемент в массиве потому что массив длиной агдс плюс один из ARGB, последний элемент является указателем NULL. Это агдс плюс 1. Таким образом, в случае, что я только что сказал, это будет агду 0 является точка из. агду 1 1 argv2 является 2. агду 3 является 3. агду 4, который является одним больше, чем агдс будет NULL. И это NULL указатель. Да. И это потому, что строка символ звезда указатель. Таким образом, он должен быть того же типа. Да? АУДИТОРИЯ: Два вопроса. Так один, в чем разница между Эта и другие GetString чем одного типа в пользовательском двигателя? И два, это хранится в Ваше недавнее памяти? Так как, GetString бы быть [неразборчиво]? ДЭН: Где это хранится? Я не знаю, где он хранится. АУДИТОРИЯ: Так, на самом деле, вы знаете, как любой функционировать вы называете это аргументы хранятся в стеке? Так агдс и агду аргументы в основной и они в стеке, или действительно чуть выше, что вы думаете, как начало стека. То, что было другая часть вопроса? АУДИТОРИЯ: Так в чем же [неразборчиво]? ДЭН: Да, это просто другой способ получения данных от пользователя. Эта песня немного более эффективным и это удобнее для сценариев, потому что вас может просто передать аргументы ваш главный Функция вместо того, чтобы ждать, для пользователей, если у вас нет никаких пользователей. АУДИТОРИЯ: И да, получить строки будет [неразборчиво]. Было бы хранить вещи вам нужно. ДЭН: Да? АУДИТОРИЯ: [неразборчиво]? ДЭН: Да, агду 0 всегда включает точка слэш вызова функции. Да? АУДИТОРИЯ: [неразборчиво]? ДЭН: Да, каждый из аргументов закончилась в NULL характера, потому что они являются строками. АУДИТОРИЯ: [неразборчиво]? ДЭН: Да, агду агдс является указателем NULL. АУДИТОРИЯ: [неразборчиво]? ДЭН: О, да. Да, жаль. АУДИТОРИЯ: Так [неразборчиво]? ДЭН: Таким образом, вопрос, если у вас командной строки точка слэш точку из 1, 2, бы количество командной строки Аргументы быть два или было бы три? Зала: Я думаю, что это не имеет большого значения. Я, как правило, говорят, о, вы не прошли любые аргументы командной строки, когда, Очевидно, вы вызвали функцию. Так что я, как правило, устно исключить Функция из командной строки Аргументы хотя это включены в ARGV. ДЭН: Но если это было на test-- yeah-- а также, если вы говорите, то как агдс равен 3, вы находитесь в безопасной стоя. Да? АУДИТОРИЯ: [неразборчиво]? ДЭН: Я думаю, что если вместо вызова этого в ARGC и струнных агду скобках но сохранил те же типы и просто называется им-то другое, как и б, будет ли это все еще работает? И это было бы по-прежнему работать, Вы бы просто-- вместо использования argc-- Вы бы использовать и б. Да? АУДИТОРИЯ: [неразборчиво]? ДЭН: Так что вопрос GetString является собираетесь хранить память в куче потому GetString является символ *. Он хранит память в куче, потому что называет теперь таНос в фактический Реализация GetString. ОК, как двигаться дальше. Безопасность. Таким образом, чтобы быть по-настоящему безопасным, вы не полагаться на нет один, и вы не позволит ни одной доступ к любому Вашей информации, и именно поэтому каждый строит свои собственные машины, их собственные операционные системы, все их программы с нуля, и, очевидно, не подключиться к любым другим машин через Интернет. Так компьютеры небезопасно. Они на самом деле. Мы должны доверять другим людям. А идея безопасности является то, что вы пытаясь ограничить количество Доверие, которое вам нужно. И одним из средств вы, что через криптографии. Криптография, по сути, у нас есть секреты. Иногда мы должны пройти наши секреты вместе через, скажем, интернет или другие вещи. И мы не хотим, чтобы люди знать эти секреты. Таким образом, мы зашифровать наши секреты в пути что мы надеемся, что никто не может выяснить. Таким образом, мы used-- через ходе этой class-- вещи, как шифр Цезаря и [Неразборчиво], которые являются очень, очень небезопасные способы шифрования вещи. Их легко понять, что они и что ваши данные находятся. Реальный мир использует гораздо более сложные схемы шифрования. И мы не сможем получить в гораздо больше, чем это. Отладка. GDB является лучшим. Я собираюсь это подчеркнуть еще раз. Используйте GDB все время каждый Время у вас есть проблемы. Команды, которые являются полезными в GDB являются сломать, которые вы передаете строку число, имя функции, по существу где в коде вы хотите остановить, и быть в состоянии взять под контроль. Печать занимает переменную и печатает все, что переменная в том, что точка в исполнении. Далее перемещает выполнение а также один шаг. И шаг шаги внутри функции в вашем исполнении. Другие вещи работать, который является, как вы на самом деле запустить свой код. Продолжить принимает все меры, необходимые чтобы добраться до следующей точки останова. И есть многие, многие другие. Ищите их. Они прекрасно. Да? АУДИТОРИЯ: [неразборчиво]? ДЭН: Да, который является отладчик. Так отладчик это программа, которая позволяет отлаживать программу. Это не программа, которая находит ошибки для Вы, тем не менее, что было бы здорово. И последнее, для меня является поиск. Так типов поиска, что мы говорили о этого класса линейный поиск, который является только, что вы смотрите через каждый элемент пространства поиска, один элемент, в то время, пока вы не найдете то, что Вы ищете или пока вы не достигнете конец вашей пространства поиска, при котором момент вы сказать, что вы не могли найти элемент, который вы искали. И это занимает в лучшем случае постоянное время, который является 0 1, и в худшем случае линейных Время, которое равно 0 н. Бинарный поиск, который необходим грязные элементы. Вы идете в середине ваших элементов, см, если элемент вы ищете больше или меньше, чем элемент что вы в середине. Это это больше, вы говорите, что дно из этой категории пространство это ваш текущее местоположение, средний, и вы перезапустить процесс. Если он меньше, вы посмотрите сказать что the-- да, в чем дело? АУДИТОРИЯ: [неразборчиво]? ДЭН: Да. Любой вид рода, который учили в класс справедливая игра для теста. [Смех] ДЭН: А то, что у вас не было сделать это для набора проблем, это справедливо Игра для испытания. АУДИТОРИЯ: Можем ли мы пойти по нему, как to-- ДЭН: Это уже не будет более. СПИКЕР 2: Фактический код для [Неразборчиво] на study.cs50.net. Так что, если вы посмотрите на проблемы практики на странице сортировки слиянием из study.cs50.net, есть код для реализации сортировки слиянием. Таким образом, вы не должны осуществлять это себя сегодня вечером. Но убедитесь, что вы понимаете его, а чем просто запоминая его. АУДИТОРИЯ: [неразборчиво]? СПИКЕР 2: На странице сортировка слиянием на study.cs50.net, существует практика Проблема, что, если вы щелкните по Проблема, в самом конце есть Решение, которое является слияние Реализация рода. Но убедитесь, что вы понимаете его а не просто запоминать его или копируя ее вниз. АУДИТОРИЯ: И совершенно справедливо Проблема для сдачи экзамена будет что-то вроде вот список. Что это список выглядеть после один шаг Выбранные рода или сортировка вставками или любой другой. Один полный итерация списка. Так что даже если вы не в конечном итоге нужно Код для него, вы должны понять, это достаточно, чтобы знать, как это происходит чтобы быть изменения этого массива. DAN: Вот это для меня. [Аплодисменты] LUCAS: Привет всем. Меня зовут Лукас. Я собираюсь говорить о рекурсии, все растения, которые мы извлекли, и немного всех указателей. ОК? Итак, прежде всего, рекурсия. Что это значит сказать, что функция является рекурсивной? АУДИТОРИЯ: Звонки себя. LUCAS: ОК, называет себя, да. Так любите эту фотографию, например. Это как на картинке внутри картины и так далее. Так, например, вы можете have-- Дана что говорил о бинарного поиска. Один из способов, в которых двоичный поиск рекурсивная является то, что вы пытаясь найти ряд. Так вы идете в середине. И тогда вы убедитесь, что цифры там В слева и справа. И потом, если вы узнали номер будет слева, это то же самое вещь, как раз делать поиск, но только слева от списка. Так вот, как это звучит как это рекурсивная. Так вот почему вы, ребята, есть рекурсивная решение для сортировки слиянием. Итак, вот пример. Так скажем, что я хочу, чтобы выбрать все числа от 1 до п. Я понимаю, что сумма п число п плюс н минус 1 до 1. Но тогда, если я смотрю на п минус 1 плюс н минус 2 плюс 1, это то же самое понятия, как суммирующих номера до н минус 1. Поэтому я могу сказать сумму равной сумме равна п плюс сумма п минус 1. Имеет ли это смысл? И я также бы-то еще называется базовый вариант, который является то, что Сумма чисел на нулю будет равна нулю. Поэтому, как только я доберусь до числа нулю, я перестанем считать. Имеет ли это смысл? Так вот пример того, как Я могу реализовать это. Так что у меня эту функцию в некоторых. Это занимает целое п. Так вот я сначала проверяю, если п меньше или равно нулю. Таким образом, если это менее или равно нулю, я возвратить нуль, который является нашим базовым сценарием. В противном случае, я могу просто вернуться н плюс сумма чисел от один к н минус один. Смысл? ОК. Так вот, как это выглядит. У вас есть сумму 2 равных 2 плюс сумма 1. И некоторые из 1 1 плюс Сумма 0, который является 0. Смысл? Так что, если мы посмотрим на стопку ваш Программа, это то, что он выглядит. Во-первых, у нас есть основной функцией. И тогда основная функция называется сумма 2. И тогда сумма 2 собирается сказать, о, сумма 2 равна 2 плюс сумма одного. Так что я добавить сумму 1 в стек. И сумма 1 собирается назвать сумму 0, который также будет добавлен в стек. И тогда каждый из этих те, которые на другой придется вернуться до того, как остальные могут продолжать идти. Так, например, здесь, сумма 0, Сначала собирается возвращать 0. А потом выбрать сумму 1. Тогда сумма 1 собирается вернуться 1 сумме 2. И, наконец, сумма 2 будет вернуться 3 к основной. Имеет ли это смысл? Это действительно важно, чтобы понять, как стек работает и попытаться увидеть, если это имеет смысл. Итак, сортировка. Так почему же сортировка важно, в первую очередь? Почему мы должны заботиться? Любой? Приведите мне пример? Да? АУДИТОРИЯ: [неразборчиво]. LUCAS: Да, хорошо. Таким образом, вы можете искать более эффективно. Это хороший способ. Так, например, у нас есть много вещи, на самом деле, в нашей жизни, что сортируются. Например, словари. Это очень важно, чтобы все слова в какой-то порядок, что мы можете получить доступ легко. Так вот, что он говорил. Вы можете искать более эффективно. Подумайте о том, как трудно было бы иметь словарь, в котором слова находятся в случайном порядке. Вы должны смотреть на, в значительной степени, каждое слово, пока не найдете слово, которое вы ищете. Если вы используете Facebook также, когда Вы смотрите на ваших друзей, вы увидите, что Facebook положить ваши ближе друг находится на вершине тех что вы не говорите с, что намного. Если вы пройти весь путь до дна список друзей, вы будете видеть люди, что вы, вероятно, даже не помните, что вы друзья с. И это потому, что Facebook сортов ваши друзья, основанные на том, как закрыть вы к ним. Так организации данных. Также Pokemon. Итак, вы видите, что все Покемонов имеют номера. И это, как легко способ доступа к данным. АУДИТОРИЯ: Доступ Pokemon. LUCAS: Да. АУДИТОРИЯ: [неразборчиво]. LUCAS: Да. Итак, выбор рода. Сортировать Выбор собирается выбрать маленький несортированный значение списка каждый время в каждой итерации. Это вроде как то, что вы делаете в вашей голове, когда вы пытаетесь отсортировать список под рукой. В принципе, все, что вам сделать, это посмотреть для наименьшего числа. Вы ставите его в отсортированном списке. И тогда вы посмотрите на Следующий наименьшее число. И тогда вы продолжаете делать , что и так далее. Так выбор рода в основном вы выберите каждый раз наименьший несортированный значение. Положите в конце сортируются часть списка. И продолжать делать это. Так что давайте быстро увидеть, что как это выглядит. Так вот сортируются и несортированный список. Таким образом, для сортируются из списка, это изначально пуст. А потом я собираюсь выбрать наименьшее число здесь, который является 2. Так что я получить номер 2, и я поставил в начале списка. А потом я смотрю на следующий маленький элемент, который является 3. Так что я положил его в конце из отсортированного списка. И тогда я продолжать делать это. Я считаю, 4 и положил его в конце. Найти 5 и положил его в конце. И посмотрим, как все те времена, что Я говорю положить его в конец, в основном, обмен двух значений. ОК? И тогда последний, вы просто есть еще один элемент. Так что это уже отсортированы. Итак, сортировка вставками. Вносимые рода вы будете иметь также что вещь в том, сортируются и несортированный список. Единственное, что каждый раз, что Вы добавляете элемент в сортируются Список, вы просто выбрать элемент, который находится в передней части несортированный список. А потом вы собираетесь найти, что Положение это должно быть в отсортированный часть списка. Давайте посмотрим, что это так это имеет больше смысла. То есть изначально, например, я пытаюсь вставить номер три в отсортированный часть списка. Так что список не имеет ничего. Поэтому я могу только поставить номер 3. Теперь я хочу, чтобы добавить номер 5 в отсортированный часть списка. Так я смотрю на числа 5. Я замечаю, что это больше, чем 3. Так что я знаю, что это должно быть после 3. Так что я положил 3 и 5. Тогда я хочу вставить номер 2. Я замечаю, что число 2 на самом деле последний затем как 3 и 5. Так что я на самом деле должны поставить все это образом в начале списка. Так что я должен, вроде, переложить все элементы в отсортированном списке, поэтому я могу освободить место для числа 2. Потом я вижу номер 6. Я вижу, что это должно быть после 5. Так что я положил его там. И, наконец, я смотрю на числа 4. И я замечаю, он должен быть между 3 и 5. И тогда я положил его туда и сдвиг все остальные элементы. Смысл? Bubble Сортировать. Так пузырьковой сортировки в основном то, что вы собирается do-- мы называем это пузырь Сортировать потому что вы идете через list-- это на самом деле лучше, если я просто показать Хотите это-- и вы собираетесь сравнивать соседние числа. И вы собираетесь обменять их позиции, если они не в правильном порядке. Так в основном, что собирается произойдет здесь, например, у вас есть 8 и 6. Вы знаете, что порядок сортировки будет на самом деле быть 6 и 5, не так ли? Так что вы собираетесь поменять приказы. Потом я вижу 8 и 4 здесь. И я делаю то же самое. Я поменять снова. И, наконец, 2 и 8. Я также поменять их местами. Она называется Bubble Сортировать потому что после каждый из этих итераций, на самом деле, Наибольшее количество в списке получает все путь к концу списка. Имеет ли это смысл? Потому что он держит замены его и перемещение его вправо. Итак, это вторая итерация. Было бы то же самое. Я сделаю один своп и то последний. Я, что нет свопы и список сортируется. Таким образом, в Bubble Сортировать, мы в основном держать переживает списка и перекачки вещи, пока я не заметил, что я не делал любые свопы делают эту итерацию, которая означает, что список уже отсортирован. Смысл? Давайте немного поговорим о времени работы. Так вы, ребята, помните Большой O, Omega, и Тета? Да? Хорошо, что Большой О, в первую очередь? АУДИТОРИЯ: [неразборчиво]. LUCAS: Да, это называется худшем случае выполнения, который просто означает, что это сколько вы ожидаете программу взять для запуска. Как, с точки зрения of-- в этом case-- п. Число элементов в Список в худшем случае. Мол, в худшем случае. Таким образом, для Bubble Сортировать, например, У нас есть большие O н площади. Почему у нас, что? Почему Bubble Сортировать Big O н квадрат? АУДИТОРИЯ: [неразборчиво]. LUCAS: Да, так в худшем случае будет что я должен буду сделать п итераций. Таким образом, каждый из итераций собирается привести к самому большому элемент в конец из списка. Так в худшем случае является то, что у меня есть сделать эту вещь п раз. И для каждого из тех времен, я должен сделать п свопы потому что я должен сравнить каждый из двух элементов. Так вот почему он н квадрат потому что это п раз п. Тогда, выбор рода также н площади потому, что для каждой итерации, я должен смотреть на каждого элемента в списке. А потом найти наименьший, Это означает, что я должен просматривать п элементов. И что я должен сделать, что п раз, потому что Я должен выбрать все п элементов. Сортировка вставками также н площади потому что в худшем случае будет быть, один, я должен вставить п чисел, не так ли? Так что я уже знаю, что я собираюсь иметь п итераций. Но для каждого из этих чисел, если бы мне пришлось смотреть на все номера в отсортированный список и положил его всю дорогу в передней, что будет н площади потому что это будет п раз п раз. Смысл? Как насчет омега? АУДИТОРИЯ: [неразборчиво]. LUCAS: Это в лучшем случае. Так что это, как, в много раз для сортировка, в лучшем случае является когда список уже отсортирован. Таким образом, вы действительно не имеют ничего делать. Bubble Сортировать имеет лучший сценарий н. Как вы, ребята, знаете, почему? АУДИТОРИЯ: [неразборчиво]. LUCAS: Да, если вам отслеживать ли рацион данных было никаких свопов или не, если у вас есть что-то вроде установлен в правда, если бы была итерации, если Список уже отсортированы, в основном, что случится, я буду попробуйте поменять каждый два соседних элементов. Я собираюсь видеть, что нет свопы. И я просто вернуть сразу. Так это значит, что я просто должен был пройти через список один раз. Так что это н потому я смотрю в п элементов. Почему выбор рода п квадрат? Да, даже если список отсортирован, для Каждая итерация выбора рода, я должны выбрать минимальный элемент. Итак, что означает, что у меня есть, чтобы искать на всех элементов в несортированный перечислить и найти минимум для каждой итерации. Имеет ли это смысл? И вставки меч п, потому что в дело, что я пытаюсь вставить номера и все номера, когда я попробуйте вставить их, я вижу, что они находятся в правильном положении. Я не должен пойти проверить все другие Цифры в несортированный список. Так вот почему он будет н. Смысл? И что тета? АУДИТОРИЯ: [неразборчиво]. LUCAS: Что, простите? Скажите это еще раз. АУДИТОРИЯ: [неразборчиво]. LUCAS: Точно. Таким образом, вы можете видеть, что только выбор хранится в Merge рода имеют thetas. И это потому, что у вас есть только тета если оба Big O и Омега одинаковы. ОК. И, наконец, сортировка слиянием есть в лог п. А потом, как говорил Дэн, сортировка слиянием вроде как таким же образом, что вы бинарный поиск. Таким образом, вы получите список. И вы собираетесь разрезать пополам. И тогда вы сократить их в небольших половинок. И тогда вы объедините их. Вы, ребята, помните, что, не так ли? ОК, как он говорил. ОК, указатели. Так что это указатель? АУДИТОРИЯ: [неразборчиво]. LUCAS: адрес. ОК. Я знаю, что Дэвид показывает кучу видео Бинки и вещи, указывающие друг к другу. Но мне нравится думать, указателей лишь как адрес. Так что это переменная, которая будет хранить адреса. Так что это просто это специальная переменная то есть задолго четыре байта. Помните, что указатель к чему это всегда четыре байта длинные для нашей 32-бит Машина так и в случае с прибор. И это как раз имеет место переменной внутри него. ОК, так что эта память, в основном. Таким образом, каждый блок памяти на самом деле имеет этикетка, которая является адрес slotty памяти. Итак, что означает, что у меня может быть указатель, указывающий на любой из этих адресов. Так что причина, почему мы будем использовать указатели является если мне придется запоминать расположение что конкретная переменная памяти. И вы, ребята, помните, что один из тех, случаи были, если у меня есть функция если у меня есть на самом деле хочу, чтобы вы своп для вещественных чисел, я на самом деле должны послать указатель. Не переменная. Вы, ребята, помните ли вы, что? Разница between-- как называется? Вызов по значению и вызова по ссылке, не так ли? ОК, да. Так что звоните по значению. Когда вы просто отправить переменную функционировать вы просто отправив значение. Таким образом, вы на самом деле отправки копия переменной. И ваша программа не могла заботиться меньше о, если та же переменная фактически делает копию. И, призывая ссылка означает, что Я на самом деле направления копии указатель на эту переменную. Так это значит, что я посылаю Расположение этой переменной. Так чувствую я имею расположение переменная, когда я звоню функция с указателями, я в состоянии на самом деле изменить данные, которые были в основной. Смысл? Хотя, указатель является копией, указатель все еще имеет реальный адрес переменная, что я хочу изменить. Смысл? Так создания указателей. Помните, указатель всегда есть тип, который он, указывая чтобы затем звездочку. И тогда вы поставить имя. Так что помните, что всякий раз, когда у вас есть все звезды, это как указатель на что все, что переменная введите что вы имели. Таким образом, здесь, в звезду, например, это указатель и целое число. И тогда символ звезда указатель символ звезды и так далее. Да? АУДИТОРИЯ: Что делать, если у нас есть указатель на п сниматься х. Я знаю, что создает указатель на х. Значит ли это также объявить х целое? LUCAS: ОК, так что, когда вы говорите, н-звездочный х, вы не создаете указатель переменная х. Вы создаете указатель с именем х. АУДИТОРИЯ: [неразборчиво]. LUCAS: Поэтому когда я говорю н звездный х, я говоря, эй, в памяти, я собираюсь получить один из этих трех коробок. И я хочу сказать, что, что будет х, который является будет указатель. И что-то интересное об указателях является то, что мы говорим, что у них есть 4 байта для 32-битной машине. И причина, что объясняется тем, что 4 байта 32-бит. И машины, которые 64 бит на самом деле есть указатели адреса , что в 64 бита. Так это просто означает, что размер адреса в машине отличается. Так Сопоставление и Разыменование. Есть два оператора, что вы, ребята, должны помнить. Первый амперсанд. Второй звездой. Не пугайтесь этой звезды и это звезды, потому что помните, что, в этот случай, у вас есть п звезду. Это как все это вместе. Там нет н Space Star. Так это значит, что это тип. Помните, что, когда у вас есть переменная звезда, ты говорить о типе. Когда у вас есть только звезду, а затем Имя переменной, это означает, что вы разыменования указателя, который означает, что вы смотрите на указатель, найти адрес, это указывая на, собирается на этот адрес, и, глядя на всякий раз, когда у вас там. Поэтому я говорю своим студентам, что, когда у вас есть звезды, вы должны думать, что это аббревиатура содержания. Так что если у вас есть указатель, и вы сделать звезду указатель, это содержание указателя. Так вы идете в то, что он, указывая на и посмотреть на постоянном содержании. И амперсанд то же самое вещи, как адрес. Так что, если у меня есть переменная A-- как, давайте сказать, что я сделал Int равна 3-- если я хочу, чтобы найти адрес, что переменная памяти, я могу просто сделать амперсанд. Так что это адрес. Смысл? Так вот пример. Это отсутствует целочисленное б и целочисленное гр. Так Int равна 3 означает, что Я собираюсь пойти в памяти. И я собираюсь найти слот и дело тут число 3. А потом Int б равна 4. Я собираюсь сделать то же самое. К памяти и поставить ряд 4 в одном из ящиков. И Int равна 5. Найти другую коробку и поставить ряд 5. Так что же это линия делаешь? н звезда годовых равна амперсанд а. Таким образом, в первую очередь, н звездой в год. Что он делает? АУДИТОРИЯ: [неразборчиво]. LUCAS: Да, так н звезда годовых, первый, объявляет указатель под названием годовых. А потом он присвоения значения что указатель будет адрес. Так амперсанд. Тогда, если я звезда Pb, что это звезда рь? Ой, извините. Это также отсутствует. н звезда рь. Я имею в виду звезды шт. Мне очень жаль. Это то же самое. Но сейчас я хорошо ар создания указатель б, а затем указатель на с. Да? АУДИТОРИЯ: [неразборчиво]? LUCAS: Да. Так что, если вы идете в памяти и вы идете в окно, это обозначение для годовых, вы на самом деле собирается увидеть адрес. ОК? Да? АУДИТОРИЯ: [неразборчиво]? LUCAS: Да, указатель является адресом. Никогда не забывайте, что. Это как самый важный часть об указателях. Там в хранении и адрес некоторой переменной. Что еще? Еще вопросы? ОК. Так Указатели и массивы. Помните, что, когда я делаю десятичного массив 3, в основном, то, что я делаю, я, вроде из, объявив в указатель. Так массив вроде как указатель на особое место в памяти, в которой я выделено три слота для целых чисел. Имеет ли это смысл? Поэтому, когда я делаю целочисленное массив 3, то, что я делает, в основном, является создание трех слоты в памяти. Так что я просто найти три слота в памяти. Так что, если я делаю, то, звездой массива, его в основном означает содержание массива, что означает стереть указатель, я иду к тому месту, что это, указывая на, и я поставил номер один. А потом, если я звезда массив плюс 1, что то же самое, как делать массив кронштейны один, который просто означает, я иду в место, которое он, указывая на. И тогда плюс 1 марки мне перейти на одну позицию. Так я иду на эту должность, фактически, и поставить номер два. И вот, наконец, когда я делаю Массив плюс 2, я иду туда, где указывающее массива в. А потом я перейду к блокам памяти. И тогда я положил здесь число три. Да? АУДИТОРИЯ: Так звезда массив просто говоря самый первый пункт. И вы можете добавить 1, только потому, что мы только действительно ссылаясь, что первый адрес. LUCAS: Да. Почему мы, например, сказать, массив 0, массив 1, и массив 2? Я говорю, зачем ты 0, 1, 2, 3, а не 1, 2, 3? Одной из причин является, одним, компьютер программисты предпочитают, чтобы начать начиная с 0. Два, потому что, когда вы делаете массив 0, это то же самое, делают массив плюс 0, что означает, я иду в что позиция, и я не пропускать любые блоки памяти. Так что я не перемещать любые блоки памяти. Да? АУДИТОРИЯ: [неразборчиво]? LUCAS: Так она просит, что является делать различие между это или делать таНос. Одно из различий состоит в том целочисленный массив 3 создании Массив в стеке. И когда я делаю таНос, его создает в куче. Имеет ли это смысл? Так как же таНос самом деле работает? Так почему же мы даже нужно использовать таНос? Ваш компилятор рода деятелей из всех переменные, которые вы объявлены. И он создает пространство для всех из них в стеке. Так все переменные собираются быть где в стеке. Так вот переменные окружения. Так в основном, места для этих переменных в памяти выделяется на время компиляции. Так это значит, что ваш компьютер имеет знать все эти переменные заранее. Для этого не нужно знать, что значение вы собираетесь положить в них. Но для этого нужно знать, как объем памяти вам нужно. Но теперь давайте представим, что, например, вы создаете массив или принимать Строка, вы принимаете от пользователя. Вы не знаете, как долго строка будет, например. Так вы не знаете точно, сколько блоки памяти вы выделяете, не так ли? Так что на самом деле не имеет смысла для Вы сказать положить 100 символов. А что потом, если пользователь пишет 150? Вы собираетесь быть пьяным. Так в основном, вы не можете быть уверены в том, как объем памяти нужно выделить при компиляции программы. Вы просто знаете, что на время работы. Так вот почему у вас кучу. Так куча будет иметь память что вы выделения во время Продолжительность выполнения программы. Так в основном, когда вы делаете таНос, что Вы делаете выделяет память в выполнения, что означает, что вы решив право в тот момент, что вам должны иметь эту память. Так вот, когда вы выделяя его. Имеет ли это смысл? Так что помните, стек имеет переменные что создаются на время компиляции. А потом куча имеет переменные что создаются, как вы идете с таНос, например. АУДИТОРИЯ: [неразборчиво]? LUCAS: Так GetString является буду называть таНос. Позвольте мне говорить о таНос, и Я объясню GetString. Так таНос то же самое как распределение памяти. Так он собирается выделить памяти в куче. И он собирается возвращать указатель на где, что память была выделена в. Итак, когда вы do-- здесь example-- н звезда указатель. А потом указатель равен таНос размер дюймовых раз 10. Я создаю указатель. И тогда я задаю этот указатель значение указателя, что Malloc дает мне. Вот я и спрашиваю таНос вы можете выделить пространство для 10 целых чисел. Вот что он говорил. И таНос дает мне указатель к тому месту. Смысл? ОК. Я И GetString является, в основном, делают звоните в таНос так что вы можете выделить памяти во время выполнения. Всегда помните, чтобы проверить на нуль потому таНос собирается вернуться нуль если он не может выделить память. Давайте предположим, что вы просите смешно объем памяти. Компьютер не будет возможность выделять так много. Так таНос только собирается вернуться нуль. Так всегда помнить, чтобы проверить, если указатель, который вы получили от таНос является NULL или нет, потому что, если это, можно быть разыменования указателя и вызывая побочных ошибки. И, наконец, не забудьте Ваш свободной памяти. Malloc создает память в куче. И вы должны освободить память прежде чем программа заканчивается. Хорошо, это все для меня. К сожалению, Роб. Благодаря. [Аплодисменты] LUCAS: Любые последние вопросы перед Роб приходит? Нет? Да? АУДИТОРИЯ: я не видел это один онлайн. Вы загрузили его еще? LUCAS: Я думаю, что Дейв загрузки его в ближайшее время. DAVE: Это будет размещена. LUCAS: Это будет онлайн. АУДИТОРИЯ: Это зависит. LUCAS: Это зависит? ОК. Да? АУДИТОРИЯ: [неразборчиво]? LUCAS: Да, вы должны освободить всех память, которая помещается в куче. АУДИТОРИЯ: [неразборчиво]? LUCAS: Да. Всякий раз, когда у вас есть культуры таНос, Вы должны иметь культуру бесплатно после прекращения использования этой переменной. Так таНос и свободны всегда вместе. Их лучшие друзья. Да. Роб? ROB: Я пойду быстро. А также видео будет мириться. У меня есть микрофон на. Итак, неделю пять материал. Первое, что мы должны это стек. Так что помните, что есть только один стек кадров в случае активного вызова функции. Мы увидим, что в секунду. А также помнить, что в действительности происходит в каждом кадре стека собираются быть локальные переменные наших функций, аргументы, которые передаются в наш функции, наряду с парой другие вещи, которые вы действительно не нужно беспокоиться о. Так вот пример программы, где, уведомление, основной является printfing возвращение Значение Foo 4. Foo только собирается вернуться Значение бар 4 запятой 6. И бар собирается установить некоторые местные переменная п равна 4 раза 6. А потом вернуться н. Итак, давайте взглянем на стек на протяжении фактический итерации этой программы. Таким образом, есть основание нашего стека. Помните, что стек растет вверх. Так в нижней части нашего стека, мы есть фрейм стека для основного. При запуске программы, главным всегда будет в Дно нашей стека. И то, что внутри нашего стек вызовов для основной? Таким образом, даже при том, что не существует никакого местного переменные в основном, как я уже говорил, мы агдс и RGV занимая место внутри основного кадра стека. Так главный теперь собирается вызвать функцию Foo. А это значит, Foo собирается получить свой собственный кадр стека. Так что теперь мы внутри функция Foo. И то, что нужно идти в фрейм стека класса Foo? Ну, Foo имеет аргументов н. И н равна 4 с, что то, что Основной проходит в качестве аргумента Foo в. Так что теперь Foo собирается назвать бар. Что бар придется внутри его 'кадра стека? Он имеет х, равное 4 Y, равным шести. Это еще не все, что мы собираемся иметь в кадре стека, потому что бар также имеет локальную переменную п. И н мы собираемся установить равным 24. Так что теперь бар собирается вернуться н. Так бар возвращается 24 к кадр стека нечто. И потому, что бар теперь возвращается, что означает, что мы выскакивают кадр стека для панели из стека. Так вся память, что бар был используя теперь из стека. Теперь, Foo также собирается вернуться 24 на главную. Так что теперь Foo возвращается, память что Foo использовал в своей ' кадр стека также ушел. А теперь, главный собирается позвонить Printf. Так Е является только одна функция. Когда мы называем Е, это будет другой фрейм стека для Printf вызов функции. Что мы передаем Printf? Это то, что собирается пойти на его кадра стека. По крайней мере, мы передаем что процентов я обратную косую черту н и аргумент 24. Это может иметь больше в это кадр стека если Е, случается, используя некоторые локальные переменные. Мы не знаем. Но все, что идет в Е-ых стек вызовов. Это собирается выполнить Printf. Тогда Е сделано. Он вернется. Наконец, главный делается. Главная вернется. И тогда наша программа. Да? АУДИТОРИЯ: Вы видите [неразборчиво] Аргументы [неразборчиво] параметры? ROB: Так что есть тонкое различие между аргументами и параметрами. И действительно, в общей говорят, люди, как правило, просто смешивать их все время. Но параметры формальное назвать вещи. Так агдс и агду являются Параметры На главную. Аргументы, что вы на самом деле пройти в качестве этих параметров. Так что, когда я звоню Foo из 4, 4 это аргумент я передаю в. И параметр N, внутри Foo, принимает значение 4 с 4 был аргумент. АУДИТОРИЯ: [неразборчиво]? ROB: н является локальной переменной в бар. н-прежнему местного до Foo, но это параметр, чтобы Foo. Это не локальная переменная. Да? АУДИТОРИЯ: [неразборчиво]? ROB: Foo просто вызывает бар и возвращения безотносительно штрих отдачу. АУДИТОРИЯ: [неразборчиво]? ROB: Да, просто чтобы посмотреть, многократного стек кадров. Да? Зал: А почему был Foo называется до Printf? ROB: Почему Foo вызывается перед Printf? Так что я мог иметь, а не, то сделали как Int х равна Foo из 4 а затем печатается х. Но вместо этого, я совмещал функции позвонить в аргумент Е. Но обратите внимание, что мы не можем на самом деле выполнить вызов не PRINTF пока мы выяснить, что Foo 4 является. Так что мы собираемся оценить этот. И только один раз, что делается собираются вернуться и оценить это. Да? АУДИТОРИЯ: Поскольку и бар [неразборчиво] Значение, почему бы нам не иметь [неразборчиво]? ROB: Они полностью должны быть внутр. Это не был пойман за несколько проходов. Так и должно быть Int бар и Int Foo, так как оба из них возвращаются целые. Пустота, только если они не собираются вернуться фактические значения. Да? АУДИТОРИЯ: Если вы имели строку выше возврат [неразборчиво]? ROB: линия над взамен? АУДИТОРИЯ: Да. Как если бы вы сделали Е и [неразборчиво], будет распечатать два раза? ROB: Так внутри Foo? Если бы мы имели Printf прямо здесь? АУДИТОРИЯ: Да. ROB: Так что, если у нас был PRINTF право здесь, будут печататься один раз. Так мы называем Foo раз прямо здесь, тогда мы будем ударил Printf. Тогда мы будем называть бар. А потом Foo вернется. И вот именно. Мы только когда сталкиваются с Е один раз. Да? АУДИТОРИЯ: [неразборчиво] Е вызова Foo, потому что мы первые называя Printf а затем мы передаем аргументы. ROB: Так в теории, не Е вызова Foo? Так нет. Просто порядок, что с будет выполнить эти вещи есть, прежде чем мы сможем вызвать функцию, все аргументы к функции должны быть полностью оценены. Так как это полностью оценены? Да, это просто строка. Это просто значение. Тогда мы должны полностью оценить это. Как только это будет сделано, теперь все ее аргументы оцениваются. И теперь мы можем сделать звоните в Е. Да? АУДИТОРИЯ: Один вопрос. Если у вас есть функция пустот, должны у вас есть обратный запятой? ROB: Вы не возвращение запятой если у вас есть функция пустот. ОК. Так что теперь некоторые куча материал. Так кучи, как мы собираемся иметь дело с управления динамической памятью. И это напрямую контрастирует с стек, который мы бы назвали автоматический управление памятью. Так в стеке, вы никогда не должны дело с тем, как локальных переменных толкают и выталкивается все эти кадры стека и все такое. Вы не должны беспокоиться об этом. Это автоматический. Так куча вручную. И [неразборчиво] поступает из этих функций таНос и бесплатно. Так вот еще программа. Все, что мы делаем, mallocing целым числом. Мы хранить его в звездном х. Конечно, мы должны проверить чтобы увидеть, если х является недействительным. Тогда мы идем просто установить, что х указывает на 50. Печатайте то, что х указывает на, печать х, а затем бесплатно х. Так как это на самом деле будет выглядеть если мы посмотрим на нашу стека и кучи? Таким образом, мы начнем снова. В нижней части нашей стек, как и раньше. Помните, что тебя куча непосредственно выступает против стек? Таким образом, мы будем иметь верх нашего кучи там. Так в нижней части нашего стека, у нас есть наш кадр стека для основного. Это имеет место для ARGC, ARGV, и мы теперь имеют локальную переменную х, которые является Int звезда. Итак, мы собираемся для перебора с помощью этой программы. Первое, что мы имеем, призыв к таНос. Таким образом, мы делаем вызов таНос. Malloc является функцией. Это собирается получить кадр стека. Что мы переходе к Malloc? Это собирается идти внутрь из кадра стека. Мы прохождения размер п, что на 4. Так что передается таНос. Что таНос делать? Она захватывает нам некоторое пространство в куче. Итак, мы собираемся пойти в куче. И мы собираемся захватить 4 байта из кучи. Так что давайте просто дать, что произвольный адрес. 0x123 Просто делать вид, что это адрес, который находится на куче. Так что же такое на самом деле внутри, что область памяти в адресном Ox123? Мусор. Таким образом, мы еще не записали ничего в ней. Таким образом, насколько мы знаем, его может быть что угодно. Вы не должны считать, что это нулевой. Это, скорее всего, не равна нулю. Так что теперь Malloc возвращается. И что же нам делать, когда Malloc возвращается? Положим, что он возвращает. Положим х, равные, что она возвращается. Так что же это возвращение? Это возвращение 0x123 так как это адрес блока памяти, который него просто выделяется в куче. Так вернуться 0x123 х теперь собирается быть установлен равен 0x123, которые, образно, мы часто рисовать как х, имеющие фактическое стрелка, указывающая на этот блок. Но х просто хранить этот адрес. Так что теперь мы должны проверить, если х является недействительным. Это не нуль. Мы делаем вид, что что таНос удалось. Так что теперь звезда х равна 50. Так звезда помнит это означает пойти на этот адрес. Так 0x123 Мы собираемся пойти на этот адрес. Так что подводит нас там. Что мы делаем по этому адресу? Мы хранения 50. Таким образом, после этой линии, то есть то, что вещи будут выглядеть. Так что теперь это уже не мусор там. Теперь мы знаем, что 50 заключается в том, частности адрес, потому что мы устанавливаем его в том, что. ОК? Так что теперь мы собираемся печатать ф. Итак, сначала мы собираемся печатать звезды х. Так что же такое звезда х? Опять же, звезда х означает пойти вещь, которая х указывает на. Так х хранения 0x123 Перейти к этому. Мы получаем 50. Так распечатать е, что. А это значит, что это собирается печатать 50. А потом, что возвращает. И тогда у нас есть вторая Printf. Теперь мы процентов р. Если вы еще не видели его, что это просто, как вы напечатать указатель. Поэтому у нас есть процентное I, процентов е, и все те, которые уже. Так процентов р, печатать указатель. Так х является указателем. Так что, если мы собираемся печатать х себе, Мы печатаем то, что на самом деле внутри х, что 0x123 Таким образом, первый печать е собирается печатать 50. Вторая печать е собирается печатать 0x123 Да? АУДИТОРИЯ: Вы пользуетесь процентов х напечатать указатель? ROB: Так что вы используете процентов х напечатать указатель? Таким образом, вы можете, но процентов х просто, вообще, для, как если у вас есть некоторые целое, и вы хотите напечатать это как шестнадцатеричное. Вот только, как ты это делаешь. Принимая во внимание, процентов г будет распечатать в виде десятичных чисел. Это были мы получить процентов г. я просто целое. процентов р специально для указателей. Так х является указателем. Мы хотим использовать процентную р. Но процентов х мог работать. Да? АУДИТОРИЯ: [неразборчиво]? ROB: Да. По крайней мере, для этого call-- поэтому я не включать его в здесь. Но эти два аргумента обязательно внутри этого кадра стека наряду с любыми локальных переменных Е, случается, используя. И тогда, при следующем вызове PRINTF сейчас внутри Printf кадр стека является процентов р обратный слеш н и независимо от значение х, которое является 0x123. Да? АУДИТОРИЯ: [неразборчиво]? ROB: Это будет печатать то который выглядит следующим образом. АУДИТОРИЯ: [неразборчиво]. ROB: Так он печатает его в адресной форме. Это похоже на адрес. Да? АУДИТОРИЯ: [неразборчиво]? ROB: Почему что? АУДИТОРИЯ: [неразборчиво]? ROB: Почему это указатель 4 байта? Таким образом, есть целая куча из 0-ых перед этим. Так что это действительно 0x0000000123. На 64-битной системе, не было бы целая куча более нулей. Да? АУДИТОРИЯ: [неразборчиво]. ROB: Итак, первый Е собирается print-- АУДИТОРИЯ: [неразборчиво]. ROB: Да, это будет распечатать что х указывает на. Звезда говорит, что это вещь указывая. Захватите его. Так что же это, указывая на? 50. Захватите его. Это то, что мы собираемся печатать. Принимая во внимание, следующий, мы просто печать х себе. Что находится внутри F? 0x123. ОК. И вот, наконец, у нас есть свободная. Что мы передаем освободить? Мы прохождения х. В то время я фактически отображается это в кадре стека. Так мы передаем значение 0x123 освободить. Так что теперь бесплатно знает, все в порядке, Я должен идти до кучи и бесплатно, что память. Это уже не использовать то, что является по адресу 0x123. Так бесплатно собирается выпустить что из кучи. Теперь наша куча снова пуст. У нас нет никаких утечек памяти. Теперь бесплатно вернется. Обратите внимание, что до сих пор х 0x123. Но что теперь не действительны памяти. Мы должны больше разыменовывания х. Да? Зала: вернуться 0 излишним? ROB: Является RETUREN 0 лишним? Да. Мы просто положить, что там, потому что у нас есть возвращение один для воздуха. Так что это, как, да, позволяет включать возврат 0. Да? АУДИТОРИЯ: [неразборчиво]? ROB: Таким образом, после свободных х, что произойдет, если мы попытке разыменования указателя? Вполне возможно, что все идет как надо. Вполне возможно, что мы все равно получите 50. Возможно, также, что эта память в настоящее время используется для другого. Так что это неопределенное поведение. И не определено означает ничего может случиться. Да? АУДИТОРИЯ: [неразборчиво]? ROB: Нет, так что если вы назначаете х на другое. Так что, если здесь мы сказали х равна таНос то else-- таНос размер event-- то, что исходный блок памяти не освобождается. И мы официально потерял его. То есть утечка памяти. Мы потеряли все ссылки в этом блоке памяти. Так что нет никакого способа, мы можем либо освободить его. Итак, затем вернуться 0 средства сделали. Ладно, так переполнения стека. В чем идея здесь? Так что помните, куча идет вниз. Стек растет. Так что это был пример из лекции, Я думаю, где основным только собирается Вызывайте эту функцию Фу, которая собирается называть себя рекурсивно над и снова и снова. Так стек кадров собираются работать точно так же. Таким образом, мы собираемся начать с главной в качестве нижнего кадра стека. Тогда главный собирается позвонить Foo, который собирается получить кадр стека. Тогда Foo собирается позвонить Foo снова, которая собирается получить другой фрейм стека. И тогда снова, и снова, и снова, и снова, пока, в конце концов, мы не запустить в кучу. Так что это, как мы получаем переполнение стека. И в этот момент, вы SEG неисправность. Или вы действительно SEG вины перед эта точка, но да. АУДИТОРИЯ: дампа памяти ли же, как SEG вине? ROB: Таким образом, вы увидите сегментацию Ядро вина сбрасывали. Вы получаете дамп когда Вы SEG неисправность. И это как свалку все содержимое вашей текущей памяти так что вы можете попробовать и определить почему вы SEG нарушенными. Да? АУДИТОРИЯ: [неразборчиво]? ROB: Так средство ошибки сегментации есть переполнение стека. Так что не обязательно. Сегментация вина означает, что вы прикосновения памяти таким образом, Вы не должны быть. Так один из способов такого случая, когда Вы переполнению стека, мы начинаем трогательно памяти таким образом, что мы не должны быть. Да? АУДИТОРИЯ: [неразборчиво]? ROB: Так внутри бесконечного цикла. Мол, это как рекурсивной бесконечного петли и таким образом мы получаем еще один фрейм стека каждый раз. Но только внутри регулярным бесконечна, а одно-- хорошо, давайте даже не печатать F-- что-то делать. Независимо. Мы не собираемся получать другой фрейм стека. Мы просто будем продолжать зацикливания над этой одной инструкции. Стек не растет. Это то, что каждый рекурсивный вызов дает нам фрейм стека. Вот почему мы получаем переполнение стека. Да? АУДИТОРИЯ: Так что, если вы сказали, чтобы получить в то время как цикл, а затем [неразборчиво]? ROB: Так что если внутри то время цикла был Е, вы все еще будет не SEG вина. Я просто не хочу, чтобы запутать вещи. Было бы цикл. Вы бы получить единую стопку кадр для Printf. Тогда Е вернется. Тогда вы снова бы петлю. Вы бы получить единую стопку кадр для Printf. Это вернется. Одноместный кадр стека. Так вы не получаете это бесконечное нагромождение кадры стека. АУДИТОРИЯ: [неразборчиво]? ROB: Да. Так что это переполнение стека происходит потому ни один из них звонки на Foo возвращаются. Так что, если мы вернемся, то мы бы начинают терять кадры стека. И тогда мы бы не переполнению стека. И вот почему вам нужен базовый вариант для ваших личных функций. Да? АУДИТОРИЯ: Является ли данный потенциальный размер и стек для кучи же для все программы? ROB: Грубо. Является ли данный потенциальный размер стека и куча одинаковы для всех программ? Грубо. Существует некоторая рандомизации до где начинается стека и где куча начинается. Если вам посчастливилось иметь кучу глобальные переменные и вещи, вы могли бы забрать из некоторого пространства для кучи. На 64-битной системе, вы практически имеют бесконечную память. Там просто так много. Между 32 бит и 64 бит, что значительная разница. Вы собираетесь получить намного больше стек и куча места на 64-битной Система потому что просто больше адресов, которые они могут использовать. Но на индивидуальной системы, она будет быть примерно такое же количество стека и куча пространство. Хорошо. Так последнее, что является компиляция. Таким образом, вы должны знать этот процесс. Есть четыре большие шаги. Таким образом, первый следует легко запомнить. Предварительная обработка. Он имеет префикс предварительно в нем. Так дело доходит до всего остального. Важно помнить, хэш. Так хэш определяет и хэш включает во всех тех. Это все предварительно процессор директивы. Это те вещи, что предварительной обработки заботится о. Итак, что же предварительно процессор делать? Это действительно тупой вещь. Все это способно все из них копирования, и вырезать и вставлять операции. Так хэш включает стандартный i0 точка час. Что это делает? Это захват стандартный i0 точка час подать и вставить его в верхней там, где она говорит хэш включает Стандарт i0 точка ч. И любой хеш определить, что мы видел, что то, что делаешь? Его копирование значения, что хэш- определено определяется как и вставка, что везде, где вы используете значение. Так препроцессор просто делает действительно Операции, основанные простой текст. Он ничего не делает смарт. Так все остальное более сложным. Так что теперь препроцессор сделать, мы на самом деле компиляции. Итак, что же компиляции в виду? Теперь мы собираемся с С-код в коде сборки. Да? АУДИТОРИЯ: [неразборчиво]? ROB: Да, мы поймали, что. Так компиляции. Мы собираемся от с до сборки. Так что это фактическое изменение языка. Компиляция себя означает переход от на языке высокого уровня в ниже уровень языка. И с является языке высокого уровня по сравнению с собрания. Что такое сборка? Его инструкции, которые, в значительной много, сделал для вашего процессора. Но компьютер все еще делает не понимаю сборку. Это понимает только нули и единицы. Так что следующий шаг это сборка, которая приводит нас от этих инструкций, ваш процессор понимает и фактически переводит их, чтобы единицы и нули. Так C до сборки в двоичный. Но у меня нет исполняемый еще. Так что думайте библиотеки CS50. Мы предоставили вам двоичного для это CS50 библиотека, которая имеет GetString и GetInt и все такое. Но CS50 library-- в и из в том: не является исполняемым. Это не имеет главную функцию. Это просто куча двоичный что вы можете использовать. Так связывание как мы собираем все из этих различных бинарных файлов в фактический исполняемый файл. Тот, который вы можете ввести точка слэш точку из. Так что это, как файл, который написал, - все, что ваша программа is-- Цезарь точка с. Но теперь он был составлен вниз в двоичный. Так Цезарь точка о. И это наша CS50 библиотеки бинарный. И они сочетаясь в единый исполняемый файл. Да? АУДИТОРИЯ: [неразборчиво]? ROB: Итак, сначала включают, помните, хэш включают фактически предварительной обработки шаг. Но это отдельный. Если вы не используете любые функции, которые находятся за пределами вашего одном файле, то, нет, вы не должны связать ничего так у вас есть все. Тем не менее, Е увязывается в. Если Вы никогда не использовать Printf, это то, что , который должен быть связан в потому что вы не пишете, что. И в самом деле, Е автоматически связаны в. Вы знаете, как в командной строке или когда вы вводите сделать, вы видите, что есть тире л CS50, который имеет ссылку в библиотеке CS50? Printf, и все в таком духе, что происходит , связаны автоматически. Любые другие вопросы по теме? АУДИТОРИЯ: [неразборчиво]? ROB: Связывание? У нас есть целый букет различные бинарные файлы. Это канонический пример что мы используем это библиотека CS50. Мы собрали и дано вам в двоичный для этого CS50 библиотеки. Вы хотите использовать GetString в вашей программе. Так вы идете и использовать GetString. Но без моего двоичном коде для GetString, при компиляции кода вниз, вы не смогли запустить свой Программа потому GetString Строка еще не полностью определены. Это только при ссылке на мой двоичный что содержит GetString что теперь, все Хорошо, я могу на самом деле выполнить GetString. Мой файл завершена. И я могу запустить этот. Да? АУДИТОРИЯ: ли конвертировать линковку бинарный к исполняемым? Так что даже если у вас нет друга библиотеки, не будет ли еще будет необходимо перевести [неразборчиво]? ROB: Так исполняемый по-прежнему в двоичной системе. Это просто объединение целое куча исполняемых файлов. АУДИТОРИЯ: Огромное спасибо. ROB: Нет проблем. Еще вопросы? В противном случае, мы все готово. Хорошо. Благодаря. [Аплодисменты] Зала: Спасибо. ROB: Да.