Джейсон Хиршхорн: Добро пожаловать А5, все. У нас есть захватывающая неделя впереди нас, в основном, потому что есть так много нового сталкивается в этой комнате. Это замечательно. Многие из вас здесь случайно, который еще лучше. Так что, надеюсь вы будете держать присоединились к нам. На этой неделе мы собираемся потратить основная часть разделе готовится к викторине. Так за нашей повестке дня, мы собираемся говорить немного о ресурсах для класса, но и для викторины, а затем, опять же, тратить большую часть класса разговора о вопросах. После того, как мы закончили отвечать на ваши вопросы, или если ваши вопросы естественно, привести нас к некоторому кодирования, я есть проблемы образцы из промежуточных выборах прошлое, которое мы будем кодировать живут в разделе вместе, что также воспитывать некоторые другие хорошие темы для покрытия. Итак, сначала, как мы прошли через для последние пару недель, чтобы напомнить вам, ребята, есть тонна ресурсов по данному курсу. Многие из них будет невероятно полезным для вас, как вы будете продолжать учиться на викторине 0, потому что это во вторник днем. Так что все из вас были учится на некоторое время. Есть конспекты лекций и источник код, который вы должны обязательно проверить. Смотреть шорты. Проверьте study.cs50.net. А потом, перечислены ниже, ряд других ресурсов. Опять же, викторина 0 завтра на 1 час. Если вы еще не сделали этого, проверьте вне О Викторина 0 документа о Домашняя страница Конечно, чтобы выяснить, где вы принимая викторины. Викторина начинается в 1:10 и заканчивается 70 минут спустя. Так что если вы только после 1:10, вы собирается получить, что гораздо меньше минут чем 70 пройти тест. Поэтому убедитесь, что вы там на время. Если вы расширение студент или есть некоторые другие соображения тестирования, это может быть не в 1:00 завтра. Но, опять же, проверить О Викторина 0 документ, чтобы убедиться, что вы знаете, когда вы принимаете викторину. Я написал 75 минут здесь. Я думаю, что это право, а не 70. Она охватывает весь материал от недели 0 лекцию на прошлой неделе в среду. И опять же, для этой викторине, за что документ, вы получаете один двухсторонний и 8 1/2 на 11 листе бумаги, который вы получаете использовать в качестве заметок во время викторины. Многие люди, если не большинство людей, имеют обнаружили, что единственный самый полезный способ учиться для викторины является сделать исследование лист, один-тент, своих собственных. Так что смотрите на последние из них, если вы видели в прошлом те. Обратитесь к друзьям, чтобы видеть то, что они помещают на них. Но руки вниз, лучший способ вы можете исследование, чтобы пройти через все, и свести его к тому, что должны или не принадлежит на этом листе бумага, потому что это просто очень полезный способ для вас, чтобы убедиться, вы собираетесь через все и немного знакомы с ним. Большинство людей, мы находим, хотя они уже лист бумаги сидит рядом с ними на викторине, не включайте к нему, потому что, опять же, что очень Процесс прохождения информации помогло им научиться. Кто-нибудь есть какие-либо вопросы о викторине 0? Имеет всех - Я не собираюсь делать поднятием рук. Не берите в голову. Я собирался спросить, кто начал изучать. Но я не хочу, чтобы вас все не поднять руки. Так как я уже сказал - да, Ави, идти вперед. AVI: Что будет полезная вещь поставить на одну пейджер? СТУДЕНТ: Это зависит от вас. Джейсон Хиршхорн: Вы получаете использовать свое суждение. Полезные вещи, чтобы положить на одну пейджер, если вы не уверены о большом O выполнения различных видов поиска и виды, считай это на там в удобно денди диаграммы. Таким образом, если вы попросили, чтобы на викторина, вам не нужно, чтобы попытаться выяснить это вне или причина через выполнения. Вы можете просто скопировать его. Если вы посмотрите на викторина прошлом, много раз, там работает времени вопросы. Так что было бы примером хорошей вещь, чтобы поставить на свой одной пейджер. Другие хорошие вещи, чтобы надеть, если вы путают о том, чтобы объявить Функция или то, что разные части Объявление функции являются, написать что ни на есть, общая версия а затем, возможно пример. Если вы смущены об указателях, схема, как указатели работа вероятно, очень полезно. Если вы смущены о рекурсии, а попробовать рекурсивную функцию там может также оказаться действительно полезными. Значит ли это, дать вам некоторые идеи? AVI: Вы должны понимать, Весь процесс компиляции, как , как это все работает? Джейсон Хиршхорн: Все , которая была покрыта мог показать на викторине. Вопросы - но опять же, некоторые вещи будут взвешенный степени, чем другие. Некоторые вещи придумали снова и снова в классе, в лекция, и раздел. Другие вещи не имеют придумать, что часто. Мы много говорили о # включить и -Л-то и то, что те, значит, в процесс компиляции. Мы много говорили о GDB, цепляться, эти различные флаги, которые мы используем, когда мы собираем и то, и то, что make15, например, действительно означает и действительно делает. Мы не будем говорить, как много о каждый шаг в процесс компиляции. У нас еще говорили об этом. Так что это еще то, что вы должны быть знакомы с. Но опять же, мы не собираемся быть - вещи, которые приходят чаще, в классе , скорее всего, чтобы придумать более часто и более сильно взвешенный на викторине. Круто. Любые другие вопросы о викторине 0? ОК, так что я положил список темы на доске. Я прошел через учебную программу. Я прошел через разделе обзора от вчера вечером, и эти слайды придумать с неполного списка вопросов , когда мы рассмотрели до сих пор в CS50 и вещи, которые могли бы появляются на викторине. Так что я не собираюсь пройти через каждый из них. Это займет гораздо больше времени, чем мы имеем сейчас. Но я поставить это здесь, мы надеемся пробежку ваша память, как к вещам, которые могут быть или не быть так хорошо знакомы с вами. И я хотел бы провести большую часть раздел отвечая на ваши вопросы о Эти темы, темы, которые здесь не рассматриваются. Мы можем написать псевдокод. Мы можем написать реальный код убедиться, что вы - Я могу ответить на ваш вопрос и помочь все принципиально понять Многие из этих вопросов, так что вы будете чувствовать себя подготовлены и комфортно будет в викторина завтра. Так что читайте по списку. Вы, надеюсь, пришли к разделу с некоторыми вопросами, а также. Когда вы будете готовы, поднимите руку и мы начнем. Имейте в виду, вопросы у вас есть, нет глупых вопросов. Мы слышали, что много. И вопросы у вас есть, я готов сделать ставку, многим другим людям и сижу здесь и смотреть онлайн есть также. Таким образом, вы можете только помочь людям , задавая вопросы. Маркус. Маркус: Между стека и куча, есть ли предварительно выделено процент памяти, который определяется как это для стека или кучи? Или как это работает, точно? Джейсон Хиршхорн: Хороший вопрос. Я собираюсь обратно проследить немного. Ли всех - пожалуйста, будьте честными. Я знаю, я прошу вас, чтобы поднять ваш рукой перед своими сверстниками. Но есть люди, которые считают, неудобно со стеком и кучей и хотели бы перейти, что и что те, значит? Поднимите руку, если - ОК. Спасибо. Таким образом, мы собираемся пойти стопку и куча действительно быстро, а затем перейти в отвечая на ваш вопрос. Так что, если мы вытянуть коробку представлять памяти на вашем компьютере, что некоторые вещи, которые идут в этом поле? Главная. Основная функция. Где главный идти? СТУДЕНТ: [неразборчиво]. Джейсон Хиршхорн: Так мы будем положить главный здесь. Что еще идет в этом поле? СТУДЕНТ: Функции, которые вы называете. Джейсон Хиршхорн: Функции что мы называем. И куда они идут? СТУДЕНТ: В стеке. Джейсон Хиршхорн: Они перейти в стеке. Так что мы собираемся называть это вещь здесь стек. И наверху, у нас есть куча. Так память не коробка так же, как это. Но это на самом деле очень похожи. Это собирается быть много коробок над и более, в зависимости от размера вашего компьютер или насколько велика ваша память. В котировок конец цитаты "дна" это стек. И есть несколько вещей, , которые идут в стек. А те, зависит от функций у вас есть в вашем коде. У вас всегда есть одна функция в вашем Код называют основным, так что всегда раздел здесь, в стек посвящена основным. Эти разделы в стеке называются кадры стека. При вызове другой функции, скажем основной вызывает бинарную функцию поиска, мы ставим другую рамку в стеке. В частности, мы собираемся пожертвовать часть памяти на нашем компьютер для хранения бинарный поиск Часовой переменные и запустить исполняемый файл Поиск кода. Так мы называем бинарный поиск. В этом куске памяти, мы собираемся для хранения своих локальных переменных. Мы собираемся хранить свои Printf звонки. Что бы ни случилось, что функция будут храниться прямо там. Двоичного поиска собирается выполнять. Она собирается завершить выполнение. Что такое слово в C, что означает что функция должна завершить ее выполнение? СТУДЕНТ: Возвращение. Джейсон Хиршхорн: Возвращение. Поэтому, когда вы видите оператор возврата, концы функции когда она попадает, что. Так бинарный поиск ударит его возвращения. Эта часть памяти будет существенно быть освобождены до. А главное вернется к исполнению. Так главный приостановит где бы было, вызов бинарный поиск, получить возвращаемого значения, и продолжить выполнение. Этот стек кадра уйдет. Если мы называем рекурсивную функцию, которая это функция, которая называет себя более и более, мы могли бы получить - сказать, что мы сделал бинарный поиск рекурсивно. Мы могли бы получить бинарный поиск версию один, бинарный поиск двух, бинарный поиск три, бинарный поиск четыре, бинарный поиск пять. А потом эта последняя бинарный поиск пять выйдет на базовый вариант, и стек кадры будут возвращаться и продолжать закрытие пока мы не вернемся к основной. Мы можем пойти по рекурсии в немного. Но все это есть, если вы вызова нескольких функций одновременно, там будет несколько стека кадров в стеке. Куча, с другой стороны, до здесь, не для функций, не для локальных переменных. Это для динамически распределяется переменные. Таким образом, эти переменные, которые могут быть инициализации в любой основной или функционировать, что основные вызовы. Нигде в коде, они можно инициализировать. И для инициализации динамично размещенная переменная. Какую функцию в C мы используем? СТУДЕНТ: Malloc. Джейсон Хиршхорн: Malloc. Вы называете таНос. Вы получаете пространство памяти. И это пространство памяти является в куче. И это пространство памяти остается там, пока не звонить бесплатно. Так динамически выделенные переменные в куча будет существовать до тех пор, как вы хочу, чтобы они существуют, и они не будут не пойду, пока вы явно сказать им, чтобы уйти. Вы можете создать их в одной функции. Стек, которые функционируют в рамка уйдет. Но, что переменная будет по-прежнему существуют в куче, пока не будет освобожден, потенциально той функцией, которая называется бинарный поиск или любой другой. Так что те кучи переменные остаться там так долго, как вы хотите им оставаться там. И они получают поставить здесь. А потом следующий получает положить там. Они держат наполняется в, и они там оставайтесь, пока не звонить бесплатно. И по сути, куча и стек, получать на вопрос Маркуса, расти навстречу друг другу. И если они бегут друг в друга, вы, используется всю память в вашем компьютер, и ваша программа будет бросить потому что вы не имеете больше памяти оставили в использовании. В промежутках между ними существует потенциально другое. Но для рамки данного курса, вы не нужно беспокоиться об этом. Так что был ответ на ваш вопрос. Не беспокойтесь об этом. Но это было длинный ответ. Все, что вам нужно знать, куча и стек будет - один начинается на дне. Стек делает. Куча там наверху. Они будут расти ближе друг к другу. И если они касаются, это проблема. Вы не хватило памяти. А кроме того, в дополнение к зная, где они, что хранится в оба стека и кучи. Кертис. CURTIS: Когда они сталкиваются, является то, что переполнение стека? Джейсон Хиршхорн: Когда они сталкиваются, это не переполнение стека. Переполнение стека является другая область что мы можем перейти, если вы хотите. Хорошо, мы еще вернемся к этому немного позже. СТУДЕНТ: Какое слово называется когда они бьют друг друга, стек и куча? Джейсон Хиршхорн: В настоящее время, не о чем беспокоиться. Просто знайте - Я отвечу на этот вопрос после занятий. Если они сталкиваются друг с другом, у него кончились памяти, потому что нет более пространство там. СТУДЕНТ: К сожалению, то, что вина сегмент? Джейсон Хиршхорн: Сегмент Неисправность может быть вызвана для - это зависит, почему называется SEG вине автора. Иногда, ваш переполнение стека, оно будет говорят сегмент обвинить как ошибки. СТУДЕНТ: А как насчет разыменования нулевой переменной? Это ошибка сегмент? Джейсон Хиршхорн: Разыменование пустой указатель - Итак, если у вас есть указатель, который вам установить равен нулю, указатели, напомним, адреса памяти и не храните как их значения. И пустой указатель, по существу, хранение 0, 0-й обратиться в этой переменной. Так 0x, 0, 0, 0, 0, и так далее. Это 0-й адрес в памяти, что это не в нашей картине, это там где-то, вот защищены на компьютере. Нам не разрешают прикоснуться к ней. Так что, когда ваша программа это выполнение, если что-то пытается пойти в памяти адрес 0, он знает, что то есть пустое значение. Она знает, ничто не должно быть там. Так что, если вы пытаетесь использовать что-то есть и лечить что-то вроде там или пытается идти в это место, вы собирается получить вину сегм или ошибку. Я ответил на ваш вопрос? А теперь мы вернемся к переполнению стека. Вещи в стеке, а вы, ребята, видел, в - нарисуем близко план кадра стека. Все ли могут видеть, что? Так у нас есть фрейм стека. Мы экономим массив в качестве местного переменная в этой функции. Так сказать, наш массив имеет пять мест. Все пять из них будут сохранены в этом кадре стека. Если мы начнем писать за Границы данного массива - поэтому, если мы начнем писать в, скажем, что это 0. Таковы показатели пять нашего массива. Если мы начнем писать в индекс 5, который мы не имеем, когда у нас есть массив размером 5, мы начинаем писать в индекс 6, 7, 8, 9, мы можем получить стек Ошибка переполнения. Вообще это не - вы, вероятно, попасть в беду если вы идете на один. Но в целом, вы получите в всего хлопот, если вы идете на себя много и вы идете до сих пор более, что вы пишете над обратным адресом, что Функция, которая находится по адресу Дно кадра стека. Потому что, не так ли? Вы - в - извините. Не "потому что прямо." В кадре стека, у вас есть Ваши локальные переменные. В самом низу стека кадр обратный адрес. Вот где функция идет, когда все закончится. И если вы перезаписать, что возвращение адрес, то, когда этот фрейм стека, когда вы собираетесь через стек кадр и выполнения каждой строки, вы собирается идти на новый обратного адреса что там написано, а не Фактический один. И вот как мы видели некоторые нарушения правил безопасности может случиться с компьютерами. Так переполнения стека, короче говоря, это когда Вы перезаписать участие в стеке вы должны использовать, местный Переменная вы должны использовать, и в частности, когда вы начинаете перезаписи важные вещи, как обратный адрес. И вот, когда вы получите сообщение об ошибке. Или, может быть, даже вы могли бы начать даже писать в - говорят бинарный поиск был прямо над основным. Если вы переписал много, вам мог бы написать в основной. Но в целом, вы получаете сообщение об ошибке и Затем, потому что компьютер знает Вы делаете то, что вы не должны делать. Да. СТУДЕНТ: В чем разница между переполнению стека и переполнение буфера? Джейсон Хиршхорн: Переполнение буфера является более общим типом то, что я только что описал. СТУДЕНТ: Так переполнение стека является пример переполнения буфера. Джейсон Хиршхорн: Совершенно верно. Это массив мы можем думать о качестве буфера, пространство для вещей, чтобы входить Это переполнение буфера. Мы могли бы переполнение буфера. Если бы не было буфер, который там часто является массивом куча, и мы переписал эти границы, то мы бы есть переполнение буфера. И выходит за рамки этого курса, они обнаружены немного по-другому. Компилятор имеет особое способы обнаружения друг. Но переполнение буфера является более общим тип, что я описал, который был переполнение буфера. Разве что ответить на ваш вопрос? Сладкий. Были ли другие вопросы, связанные в стек или в куче? Да. СТУДЕНТ: я знаю, у вас есть, чтобы освободить строк потому что они в куче и вы не хотите, чтобы утечка памяти. Но у вас есть, чтобы освободить глобальные переменные и все в таком духе? Или они автоматически освобождаются? Джейсон Хиршхорн: Хороший вопрос. Таким образом, в CS50.H, мы создаем эту вещь ты звал строку. Строка действительно то, что? СТУДЕНТ: Чар звезда. Джейсон Хиршхорн: символ звезды, указатель в символ, указатель на массив символов. Это то, что строка. Так что мы должны освободить его, так как GetString, который мы использовали много - Строка имени равна GetString - что mallocs для нас некоторое количество памяти на кучи, а затем возвращает указатель на Первый символ, что строка, символ звезды. Так якобы, если вы не были писать бесплатно на любом из ваших строк что вы назвали до сих пор, у вас есть протекала некоторое количество памяти. Конечно, мы не говорили о это, так что никто не добрался в Беда за это. Но идти вперед, да. При вызове GetString, вы mallocing некоторое пространство в куче. И если вы не звоните бесплатно позже, что Строка, у вас есть утечка памяти. Это ответ на ваш вопрос? Да СТУДЕНТ: Таким образом, чтобы сделать это, мы используем бесплатно прямо перед возвращением? Мол, в рамках, я думаю, если мы говорим, как, тап_п, в Объем кода, это в тех фигурные скобки, прямо перед - Вы знаете, где вы бы обычно ставят возвращение. Вы поставить бесплатно до этого? Джейсон Хиршхорн: Таким образом, вы можете поставить бесплатно куда вы хотите поставить бесплатно. Потому что эти выделяются динамически переменные, потому что они могут жить за рамки частности Функция, если вы звоните таНос в отдельную функцию, например, GetString, вы можете позвонить бесплатно в основной. Вам не нужно называть его в конкретной функции где таНос называется. Но вы должны назвать его до основных деклараций. И это действительно зависит. Это зависит от того, почему вы malloced, что пространство в первую очередь. Некоторые люди будут называть освободить довольно быстро. Некоторые люди никогда не будут звонить бесплатно до конец своей программы. И они будут проходить через и бесплатно все. Это зависит от того, почему вы назвали таНос. СТУДЕНТ: А что бы вы сказали, если вы назвали использование GetString? Вы бы сказал, что бесплатно и что? Джейсон Хиршхорн: Так синтаксис бесплатно просто бесплатно, открытые скобка, недалеко Парень, и имя указателя. Так что если вы пишете строку равных имя GetString, вы ставите имя здесь. Это имя указателя. И он знает, чтобы освободить эту память. СТУДЕНТ: Так что, когда он освобождает эту память, указатель-прежнему указывает на то место, в памяти? Или это указатель также освобождается от адрес, который он указывает. Джейсон Хиршхорн: Мы должны попробовать это. Мы должны кодировать что. Давайте вернемся, когда мы доберемся до кодирования, и давайте код, который. И если вы хотите, чтобы выяснить ответ к тому, что вы также можете код, который в то же время. Но это большой вопрос. СТУДЕНТ: Можно ли бесплатно что-то слишком рано? Таким образом, вы все еще это нужно для вашей программы, и вы освободили, что объем памяти? Джейсон Хиршхорн: Да. Это возможно, если вы бесплатно что-то и тогда вы использовать его снова, вы будете столкнетесь с ошибкой. Но это на вас, потому что вы освободили что-то, а затем назвал его позже. Так, чтобы было ошибкой программиста. Но да. Вы могли бы написать, что. Есть еще вопросы по - Да. СТУДЕНТ: Так что если вы, как предполагается, только освободить его в целом до Программа заканчивается, значит ли это, если Программа заканчивается, и вы не освободить его, что память еще выделяется? Джейсон Хиршхорн: Если ваша программа заканчивается и вы забудьте освободить что-то, то что память была выделена в течение время жизни вашей программы. Когда ваша программа полностью закрывается, что память не собирается чтобы остаться там навсегда. Компьютер достаточно умен, чтобы знать, , что, когда программа закрывается, это должны избавиться от всех памяти, что был связан с этой программой. Тем не менее, есть инструменты можно запускать по программе для обнаружения, если, когда Программа завершена, вы забыли чтобы освободить память. И для вашего следующего проблемы установить, где вы будете использовать таНос и использование указатели, вы будете запускать этот запрограммировать на вашу программу, чтобы увидеть, если, когда основные возвращается, вы были некоторые вещи, которые остались unfreed. Так что они не собираются оставаться malloced навсегда в вашем компьютере. Это было бы расточительно, потому что очень быстро, компьютеры бы не хватить памяти. Но если они не работать до конца вашего запрограммировать и они не освобождены и ваш Программа выходит, что по-прежнему является проблемой что этот инструмент поможет вам в решении. СТУДЕНТ: Это Valgrind? Джейсон Хиршхорн: Это называется Valgrind. И вы будете - СТУДЕНТ: Но мы не должны знать, что для викторины, хотя? Я имею в виду, это было говорили о немного в лекции. Джейсон Хиршхорн: Так Valgrind это имя этого инструмента. Зная, что она делает это достаточно для викторины. Но вы не использовали его еще на вашем Проблема установить, потому что у нас не было Проблема набор, который явно имел дело с таНос или вы используете таНос. Таким образом, вы еще не использовали Valgrind. Но вы будете использовать его рано , чем позже. СТУДЕНТ: Можете ли вы повторить что Valgrind является? Джейсон Хиршхорн: Извините? СТУДЕНТ: Можете ли вы повторить, что Цель Valgring является? Джейсон Хиршхорн: Valgrind это имя - как GDB помогает вам отладки программы, Valgrind помогает вам понять, если вещи не были освобождены когда закрывается ваша программа. Таким образом, вы будете запустить его на вашей программе. И ваша программа выходит, и он будет говорить, ваша программа называется таНос это многие раз для этого много байт, и вы только называется свободным это много раз. И так вы оставили эти много байт без освобождения. Или это будет сказать, что вы освободили все. Хорошая работа. СТУДЕНТ: ОК. И это называется Valgring? ДЖЕЙСОН Hirschhorn: V-A-L-G-R-I-N-D. СТУДЕНТ: Вопрос об указателях. Так сказать, что вы н звезды х равно что-то. Это равняется, что вы кладете там, в том, что то, что будучи положить внутрь что х указывает на, или указатель х? Джейсон Хиршхорн: Можете ли вы повторить вопрос? Можем ли мы сделать это в то время вы это говорите? СТУДЕНТ: В викторине, на самом деле, тот, который вы послали нас, как это было, символ звезды правда равна CS50 скалы, не так ли? Так это значит, что, что CS50 скалы это то, что правда указывает на? Джейсон Хиршхорн: Так вы говорите о сЬаг звезды в строку, как это работает? Да. ОК. Давайте нарисуем это здесь. [СТОРОНА РАЗГОВОР] Джейсон Хиршхорн: Так эта переменная будет из символьного типа звезды. Насколько велика переменная из символьного типа звезды? Сколько байт? СТУДЕНТЫ: Четыре. Джейсон Хиршхорн: Это четыре байта. Сколько права является переменной из типа десятичного звезды? СТУДЕНТЫ: Четыре. Джейсон Хиршхорн: Четыре байта. Если это указатель, то это всегда четыре байта, так как указатели, их значение является адрес памяти. И адреса памяти на CS50 Прибор четыре байта. Поэтому, когда мы называем GetString или когда мы скажем, имя_строки равна, а затем в двойные кавычки поставить строку, мы вкладываем - ну, это немного по-другому. Мы сделаем GetString в качестве примера. Или символ звезды что-то равна строку. К сожалению, дать мне пример которые вы прочитали? СТУДЕНТ: символ звезды правда равна "CS50 камни" в двойные кавычки. Джейсон Хиршхорн: Так что это звезда, это мы будем называть этот переменную х для нашего общие цели. Мы создали переменную х. Это тип символ звезды. Это указатель на серии символов. Так здесь - Так что это, как это будет работать в памяти. Это будет хранить адрес памяти. Было бы хранить адрес памяти первый символ в массиве. А потом, когда вы следовали указатель, вы бы получить первый символ. И если вы читаете эту вещь, как строка, ваш компьютер умный достаточно знать, читать все это дело пока он не попадает в зазор 0. Но если вы читаете ему характер в время, так что вы итерации эта строка, то вы только что прочитали характер, в то время, пока вы не дойдете до обратный слеш 0. Это не может ответить на ваши Вопрос, однако. СТУДЕНТ: Да, но у вас нет malloced, что пространство но для этого указателя. Джейсон Хиршхорн: Так что я не совсем уверен, именно то, что вы смотрите на, потому что я не делал, что викторину. Это должен был быть полезными ресурсов из другого TF. Если вы создаете строку на стек или в качестве локальной переменной, оно будет просто массив обвинений, а не как правило, символ звезды указывая на другую строку. Но я не знаю. Это может быть указателем на другой строка в стеке, а также. Да. СТУДЕНТ: я знаю, что вам нужно выделить память, если указатель получать объявлен внутри другой функции. Вы должны сделать то же самое, если это был объявлен внутри основной, вы используете его внутри основной? Джейсон Хиршхорн: Так что, да. Вы можете объявить указатель на любой адрес памяти в памяти. Это может быть адрес памяти местный переменная, хотя зачастую, люди не заявляют адреса памяти в локальных переменных, потому что они идут далеко, как только что функция возвращает, которые Поэтому мы, как правило Malloc вещи. Но да, вы могли бы объявить указатель в другой локальной переменной. Это просто правило, не делается. Но я могу взглянуть на что определенная вещь после занятий. Да. СТУДЕНТ: Я думаю, что это своего рода из того, что просят. Это кажется странным, чтобы быть инициализации указатель не так адрес, но как то, что кажется стоимости. Похоже, CS50 является то, что внутри вещь будучи указал на и не фактический адрес, не так ли? Джейсон Хиршхорн: Так вот не так, однако. Это не то, что происходит. При объявлении сЬаг звезду, это адрес памяти. Указатели все адреса памяти указывая на что-то другое. Это что-то еще может быть на стек, но почти всегда находится на кучи, как мы увидим это используется. Но имя_строки равна двойной кавычки "GetString," мы видим, что и мы можете посмотреть, что и код, который. GetString строка не сохраняется в эта переменная, или как строка имя не сохраняется в том, что переменная, потому что это не так, как указатели работать. Имеет ли это смысл? СТУДЕНТ: Да. Джейсон Хиршхорн: ОК. Будем надеяться, что это не было запутанной никому. Но если это так, мы можем посмотреть на нее еще раз в немного, потому что мы на самом деле происходит кодировать то, что, мы надеемся, работы со строками и поможет вам чувствовать себя более комфортно с ними. Любые другие вопросы, связанные с их темы или другие темы, которые Я положу обратно? И - Прямо сейчас. Да, Олден. ALDEN: Так что это не имеет никакого отношения, но мы можем просто пойти на очень быстро, что мы должны знать, о разнице между 32 и 64-разрядная машина? Джейсон Хиршхорн: Да. Так 32 бита, сколько байт? ALDEN: Это четыре байта. Джейсон Хиршхорн: Это четыре байта. И 64 бита, сколько байт? СТУДЕНТ: Восемь. Джейсон Хиршхорн: Восемь байт. Итак, еще раз, восемь бит на один байт. Ваш CS50 прибор 32-разрядная машина. Так адреса памяти четыре байта. Есть 2 к 32 адреса памяти. От 0 до 2 в 32 минус 1. И я не уверен, но это вероятно, сфера, что вам нужно знаю для 32-битной машине, что память адреса, опять же, долго четыре байта, и это максимальная сумма адресов памяти. Кроме того, типы данных - это может быть что-то, как хорошо, что это стоит отметить. Размер типа данных зависит от машина вы работаете с. Так символ, один символ, то, как количество байт на нашем CS50 прибора? Один байт. И это на самом деле один байт, как хорошо на 64-битной машине. И большинство типы данных и тот же номер байтов на обеих машинах. Но некоторые типы данных будут отличаться на обеих машинах. Так что было бы потенциально Единственное, что вам нужно знать. Но даже то, что, как мне кажется, является за пределами - Я почти уверен,, если оглянуться назад на старые викторины, он говорит, предположим, для проблемы вы с помощью кодирования 32-разрядная машина. Но есть, чтобы идти вместе с, что в если вам интересно, есть типы данных, которые аналогичны Размер на всех машинах. Если вы видели что-то вроде uint32_t, вы можете или не видели, что. Это тип данных. Это говорит, 32 бита независимо от того, на какой машине это на. Поэтому, когда люди пишут портативный Код, они, вероятно, не будет использовать целыми. Они вместо этого использовать эти другие данные типы, что они знают, будет то же самое Размер на каждой машине. Мадху. Мадху: у меня был вопрос о процесс компиляции. Так что если вы пишете программу, которая использует библиотека как CS50 или что-то так, я знаю, что эта библиотека должен в какой-то момент, быть собрано и связано дюйма Но сколько из этого происходит во время составление вашей программы? Какая часть этого процесса библиотеки происходит, когда вы составления собственной программы? Джейсон Хиршхорн: Итак, давайте перейдем Обычно шаги этого процесса. Вы пишете. C файл. В вашем. C File, вы # включить ваш библиотеки заголовка, например, cs50.h. Что делает, что резкое включают линия сделать для вашей программы? Akchar. AKCHAR: Он добавляет прототипы функции из заголовка файлы в библиотеках. Джейсон Хиршхорн: Совершенно верно. Это добавляет эти прототипы функций в код. Поэтому, когда ваш код составляется в на ранних стадиях, компилятор знает что эти функции действительно существуют, и что в другом месте они были определены. В. Ч файлы не включают определения для этих функций или, как они действительно работают. Cs50.h просто включает что-то, что говорит GetString реальная вещь, которая может случиться. И standardio.h говорит Е является реальная вещь, которая может случиться. Так что ваша с языком с этим. Заголовка файл запускается превратился в некоторые машиночитаемой код, который в конечном итоге получает превратился в двоичный Код, 0 и 1 в. И это код, который в конечном счете запускается на выполнение. -Л CS50 линии - например, когда вы пишете Clang - а затем вы включаете-л CS50, вводе, что дюйма И вы видите, что. Когда вы пишете сделать, вы будете видеть, что линия здесь. И мы увидим, что через секунду, когда мы кодировать или поздно, когда мы кода. Но что-л CS50 линия делает что-то немного отличается от # включить cs50.h. Что это-л CS50 линии делать? Ави? AVI: Я хочу сказать, что она связывает библиотека с функцией называть, как и. Ø файлов. Джейсон Хиршхорн: Итак, очень близко, если не спот-он. -Л CS50 принимает двоичный файл и объединяет его с вашим двоичный файл. Так cs50.h, нет никакого смысла в превращении cs50.h от языка C в двоичную каждый раз, когда он используется. Это было бы глупо, потому что будет тратить много времени. Так что уже составлен и превратился в исполняемый файл. И теперь он собирается быть объединены с файлом в конце. Так что те 1 и 0 собираетесь слиться с вашим них и 0 в конце. Так что теперь вы будете на самом деле есть реальная 1 и 0, которые определяют, каким GetString, например, работает, или как Е, например, работает. И для получения дополнительной информации, есть короткие компиляторы, Нейт дает, что вы должны проверить, что идет через эти шаги. Но - Да. СТУДЕНТ: Являются ли они всегда в уплотнительные файлы. когда они в виде библиотеки, готов быть объединены, связаны - как они в двоичном коде? Джейсон Хиршхорн: ОК. Что - СТУДЕНТ: Это всегда имеет место для библиотеки, когда вы связать их? Джейсон Хиршхорн: Да. Так что есть. Ы файлы, которые будут машинный код, который также будет загадочными для вас. Вам не нужно беспокоиться о них. Но в целом, да, они будут быть в. о файлы готовы к работе. СТУДЕНТ: Итак, когда вы грузить к библиотека, вы только грузим . ч и. о? Вы не грузим. Гр или. С. Джейсон Хиршхорн: Так - и это в этой короткой, а также, если эта информация, кажется, приходит немного быстро. Но мало компиляторов говорит об этом, а также. Когда вы грузите библиотеку, если вы поставляете . ч, файл заголовка, тех, прототипы функций, а также 1-х и 0-х, это все, что нужно дать. Вам не нужно, чтобы дать как Функция работает,. с файл. Так как точка абстракции, или указать интерфейсы, точка, в этом SPL, переносимая библиотека Стэнфорд, это для вас, чтобы не беспокоиться о том, как новые GRect работает, или как двигаться работ, или как добавить работ. Все, что вам нужно знать, что добавить является функцией, что вы можете использовать, и он делает это. Таким образом, вы действительно не нужно знать, как это написано в C. нужно просто знаю, вот функции, то, что они сделать, и вот'S 1 и 0 когда вы действительно хотите их использовать. Круто. Есть еще вопросы по компиляторов или другие темы на доске? СТУДЕНТ: У меня есть вопрос о реализации рекурсивных функций. Вопрос о рекурсии. У меня было ощущение, что бы придумать. Так что давайте быстро пройти рекурсия с определенным Например, факториал. Потому что это пример, который часто появляется или используется чтобы проиллюстрировать рекурсию. Таким образом, "4!" читается как 4 факториала. И что 4 факторный значит? Что это делать? Как рассчитать 4 факториала? 4 раза 3 раз 2 раз 1. Так еще один способ написать 4 факториала является, чтобы написать это. 4 раза 3 факторный. Потому что 3 факториал 3 раза 2 раз 1. Так в 4 раза 3 факториал 4 раз 3 раз 2 раз 1. Вот почему факторный является отличным кандидат на рекурсии, потому что это Понятно, что есть нечто, что происходит снова и снова и снова на меньшее количество вещей до вы дойдете до конца. Когда вы достигнете 1, 1 факториал 1. Вы не можете пойти гораздо дальше. 0 факторный также определяется как 1. Поэтому, когда вы получаете 1 или 0, вы в конце концов, и вы можете начать идти назад. Так что, если мы хотели написать рекурсивный Функция для вычисления факториала, мы собираемся написать некоторые псевдокод, что сейчас. Прежде, чем мы написать, что псевдокод - Я дам вам, ребята пару минут написать псевдокод или просто думаю, об этом - Есть две вещи, каждые рекурсивная функция нуждается. Каковы эти две вещи? Джек: Он должен называть себя. Джейсон Хиршхорн: Ной? О, Джек. Идем дальше. Джек: Он должен называть себя. Джейсон Хиршхорн: Так рекурсивный функция должна рекурсивный вызов, позвонить в себе. Это одна. И то, что другое дело? Джек: базовый вариант. Джейсон Хиршхорн: базовый вариант. Базовая случай, вот, когда мы останавливаемся. Так что ваша функция вызывается. Базовый вариант стоит на первом месте. Вы хотите знать, если вы в конце. И если вы не в конце, вы сделать свой рекурсивный вызов. И вы идете через эту функцию снова, проверить базовый вариант снова. Если вы еще не конец, вы делаете другой рекурсивный вызов, и так далее, и так далее. Вот почему рекурсивные функции всегда нужны эти базовые случаи и те, рекурсивные вызовы. Если у вас нет рекурсивный вызов, это не будет рекурсивная функция. Если у вас не было базовый вариант, Вы пошли бы навсегда и там не было бы окончание. И базовый вариант всегда на первом месте, потому что вы всегда хотите, чтобы проверить если вы в конце первого. Поэтому, прежде чем сделать некоторые псевдокод, почему Вы не найдите минутку, чтобы подумать о как рекурсивный факториала было бы написано? Кроме того, как многие, как вы делаете, письмо это на листе бумаги является то, что вы будете иметь, чтобы сделать на викторине завтра. Так, вероятно, хорошая практика, чтобы сделать что код вы пишете вниз на лист бумаги - или вы можете сделать это. Вы знаете, где точки с запятой. Вы помните синтаксис. Потому что вы не в состоянии иметь компилятор сказать вы сделали ошибку. Кроме того, в этом направлении, завтра, когда Вы кодирования проблемы, если вы бросились за время, или если вы очень путать, как вы, как предполагается, написать определенную вещь в с, это надлежало бы вам написать псевдо-код или писать комментарии в а. Потому что есть частичное кредит на Много вопросов по викторины. Так что вы можете быть спешки, или вы может просто путать. Дать в комментариях или псевдо-код часто способы, которые вы может получить частичный кредит. Так что не оставить что-то пустой на викторине. Там нет наказания за положить вещи дюйма В самом деле, полагая в псевдо-код или комментарии собирается помочь грейдер выяснить, если вы на самом деле знаете, что Вы говорите о, и, возможно, награду Вы некоторая частичная заслуга в этом. Также в этом направлении, писать ясно. Если мы можем на самом деле не то, что вы пишете, мы не собираемся называть тебя в полночь завтра к фигуре то, что вы написали. Мы просто собираемся снять очки. Пишите ясно, чтобы мы могли услышать, вернее, мы можем прочитать, что вы написали. И если он говорит, два предложения, не написать абзац. Следуйте инструкциям. Пишите ясно. И писать в этих замечаний или псевдокод для вопросов, которые могли бы Награда частичное кредит. Хорошо, давайте вернемся к факториала. Поэтому у нас есть функция факториала. Если бы я был на самом деле пишу это в C, что мне нужно поставить перед именем функции? Возвращаемый тип, который, в этом так, мы дадим ему Int. А потом в фигурных скобках, является то, что происходит в фигурных скобках для функция? СТУДЕНТЫ: Тип аргумента. Джейсон Хиршхорн: Ее аргументы. Так факторный, вероятно, принимать аргумент. Это, наверное, только взять один аргумент. И мы скажем это займет целое число, называемое х. И снова, при написании прототип функция или записи функцию в коде перед его определения, вам написать тип данных и имя эта переменная только для этой функции. Таким образом, вы можете передать некоторое количество в это функция, она будет называться х внутри. У нас есть функцию факториала. Нам нужно две вещи, базовый вариант и рекурсивный вызов. Что такое базовый вариант для факториала? Кто-то, кто ее написал, и кто не имеет говорят еще, что является базовым чехол для факториала? СТУДЕНТ: Если п меньше чем 2, вернуть 1. Джейсон Хиршхорн: Если п меньше 2, вернуть 1. Мне это нравится, потому что это заботится о 0 и 1. Так сделаем х <2, вернуть 1. Если нас прошло 0, если мы получим прошло 1, эта функция будет немедленно вернуть 1. Если нас прошло некоторое число, большее или равно 2, мы собираемся есть наш рекурсивный вызов. И так как это то, что будет работать? Может кто-то еще, кто работал над этим которые пока не говорят, дайте мне рекурсивный вызов для этой функции в псевдокоде? Если мы получить прошло в числа х и это больше, чем 2, то мы хотим сделать? Мы также пример написано на сторона, которая может дать вам подсказку. СТУДЕНТ: Позвоните х раз Факториал х минус 1? Джейсон Хиршхорн: Совершенно верно. Мы собираемся вернуться х раз Факториал х минус 1. И, что, хотя я и написал, в основном, то, что вы сказали, на английском языке, это факториала будет вызван снова. Это будет выполняться на х минус 1. Это будет вернуться с некоторого целого, и то он будет размножаться эти два вместе, и это значение будет вернулся к тому, что называется это факториала, которые могли бы еще один экземпляр это факториала. Так что это пример рекурсивной Функция, очень просто рекурсивная функция. Но большинство из них будет так. Если вы хотели бы хорошую рекурсивным вызов для викторины, попробуйте кодирования бинарный поиск рекурсивно. Потому что, если вы сделали бинарный поиск для Проблема установить три, вы, вероятно, сделал это многократно в цикле. Но это также может быть записана рекурсивно. Вы будете нуждаться, чтобы написать собственный отдельная функция, которая принимает некоторые различные аргументы командной строки - или не аргументы командной строки, некоторые разные только регулярные аргументы. Но вы могли бы написать бинарный поиск рекурсивно, а также. СТУДЕНТ: Таким образом, вы, возможно, также написал, вместо х минус 1, вы может также написал х минус минус, или вы могли бы написано минус минус х. Вы можете просто объяснить очень быстро, почему те были бы разные вещи, как то, что разница между х минус минус и минус минус х? Джейсон Хиршхорн: Нет, я не буду вдаваться в это. Но я буду говорить с вами об этом после того, как класс. х минус минус, минус минус х уменьшения х на 1. Но они делают это немного по-другому. Но я не хочу вдаваться в это. Другие вопросы о рекурсии или эта функция? Это не совсем даже псевдокод. Вот в принципе и код в C можно было бы написать для этого. OK, любые другие вопросы о темах здесь? Да. СТУДЕНТ: У меня есть краткий список с плавающей точкой и точность. Джейсон Хиршхорн: Плавающий точки и точность. Может кто-то очень быстро дать мне краткое изложение с плавающей точкой и точность? Вы все должны были сделать это для вашего Проблема установить, так что вы все знакомы с ней. Или, может быть, не все из вас. Любой? Дайте мне начали пятно. С плавающей точкой и точность. В чем проблема? Да. Виктория? VANESSA: Ванесса. Джейсон Хиршхорн: Ванесса. Извините. VANESSA: Там только конечное число чисел, которые могут быть представлены потому что вы находитесь на, в нашем так, 32-разрядная система. Таким образом, вы отчасти должны составляют некоторые цифры. Джейсон Хиршхорн: Так вот Совершенно верно. Есть только определенное количество числа, которые могут быть представлены. Если умножить два очень больших чисел, это может переполнить количество пространств у вас есть, чтобы представлять целым числом. Вот почему иногда мы используем давным вместо Int. Это имеет больше пространства. Это может держать большее количество. Точности с плавающей запятой имеет отношение к , но также имеет отношение к Дело в том, что десятичные цифры не всегда представляется. Извините. Позвольте мне сказать это обратно вверх. Десятичное число 1.0 не всегда представлены как вы ожидали бы, 1,000000000. Это иногда представлен в виде 1,000000001 или 0,999999999. Это может быть даже 89 брошен где-то там. Так что те десятичные числа не представлены так же, как вы бы ожидать, что они должны быть представлены. Таким образом, в проблеме набор - это было два? - Проблема установить два, где мы имели дело с числа с плавающей точкой, когда мы хотели им представлять именно то, что мы хотели им представлять, число пенни, или количество центов, умножим их на 100. Мы окружили их. А потом мы отрезали все после запятой. Это было для того, чтобы они были бы фактически равны именно то, что мы хотели им равняться. Потому что, когда вы берете то, что это плавать и превратить его в междунар, вы отрезать все, чтобы права десятичной точки. Потому что есть некоторые с плавающей точкой неточность, 100.000 может быть представлен в виде +99,999999999. И если вы просто отрезать все, чтобы право сразу же, вы собираетесь получить неправильный номер. Да. СТУДЕНТ: У меня был вопрос о приведении. Какой порядок это происходит в? Если вы хотите сделать поплавок, кронштейны, 1 разделен на 10, она делает 1 делится на 10, затем получить 0,1, а затем включите это в обращении? Джейсон Хиршхорн: Если вы делаете плавать 1 делится на 10 - СТУДЕНТ: Да, а потом составляет - Ну, было бы нормально есть его равным в - Да. Вы хотите, чтобы сделать его плавать, не так ли? Джейсон Хиршхорн: Итак, мы собираемся использовать это, чтобы непосредственно перейти в выяснение того, ответы на эти вопросы через кодирование. Потому что вы, вероятно, есть много эти мельчайшие вопросы, и это хороший способ для их решения через кодирование. Так что мы собираемся, чтобы закодировать это прямо сейчас, а затем мы собираемся вернуться и код на вопрос, вы должны были. Таким образом, первая строка - Я не должен был написать его - что это Первое, что мы хотим сделать, когда мы открыть новый файл в Gedit? СТУДЕНТ: Включите. Джейсон Хиршхорн: Включите что? СТУДЕНТ: библиотека CS50. Джейсон Хиршхорн: ОК. Что еще мы должны включить? Мы просто собираемся, чтобы проверить, что происходит , когда вы приводите что-то поплавком. Но то, что мы должны включить, если мы собираюсь написать программу на С? СТУДЕНТ: Standard I / O. Джейсон Хиршхорн: stdio.h. Мы на самом деле не нужно, для этого Программа, cs50.h, хотя это всегда полезно включить его. Но мы всегда должны stdio.h. СТУДЕНТ: При кодировании в С? Джейсон Хиршхорн: При кодировании в С. Так что я сохранить его, как это. Гр файла. Я получить некоторые интересные подсветку синтаксиса. Я написал пустоту внутри основной. Что недействительным в виду? СТУДЕНТ не несет никакой аргументы командной строки. Джейсон Хиршхорн: отпадает средства, в этом случай, главный не несет никакой аргументы командной строки. В других случаях, это означает, что функции не принимает аргументы командной строки. Или функция, если бы мне пришлось писать пустоту основных (недействительными), что бы сказал основные годов не возвращаются ничего. Так недействительными просто ничего не значит. Что бы я написать, если бы я принимать аргументы командной строки? СТУДЕНТ: внутр дуги с строка дуги против Джейсон Хиршхорн: внутр агдс строка агду. Так ли это? СТУДЕНТ: Это символьные звезда ARGV скобки. Джейсон Хиршхорн: Таким образом, вы могли бы написать Строка ARGV кронштейны или символ звезды агду скобки, но вы должны скобки. Потому агду является массивом строк, помню. Это не просто одна струна. Так строка агду есть, вот это одну строку называется агду. Строка ARGV скобках, вот массив строк. Так внутр агдс строка ARGV скобки будет то, что я , вероятно, написать. Таким образом, вы хотели сохранить в виде целого числа? СТУДЕНТ: Да, целое число. Или в обращении. Джейсон Хиршхорн: В поплавком? Мол, поплавок х равна 1 делится на 10. Джейсон Хиршхорн: ОК. Как мне распечатать поплавок в Printf? Что? СТУДЕНТ% е. Джейсон Хиршхорн:% е. Что целое? г, или я. Что строка? СТУДЕНТ: с. Джейсон Хиршхорн: с. Как я могу получить новую линию? СТУДЕНТ: Обратная косая черта н. Джейсон Хиршхорн: Что мне вернуться если основные трассы правильно? СТУДЕНТ: 0. Нужно ли мне написать эту линию, хотя? СТУДЕНТ: Нет. Хорошо, мы не будем писать, то. Все ли могут прочитать, что? Это выглядит немного мала. Все ли могут увидеть, или должны Я сделать его больше? Я думаю, что для камеры, мы сделаем это немного больше, однако. Джейсон Хиршхорн: Если я хочу, чтобы превратить это . C файл в исполняемый файл, что я пишу? СТУДЕНТ: Сделайте тест. Джейсон Хиршхорн: Извините? СТУДЕНТ: Сделайте тест. Джейсон Хиршхорн: Сделайте тест. Мы говорили о эта линия раньше. Clang. Что лязг? Название компилятором. Что это линия? СТУДЕНТ: Установка его на использование GDB. Джейсон Хиршхорн: Наборы это на использовании GDB. Эта линия, что это такое? СТУДЕНТ: Исходный код. Джейсон Хиршхорн: Это Исходный файл,. с файл. Что означают эти две линии делать? Или эти два не линии. СТУДЕНТ: Он называет это тест. Джейсон Хиршхорн: Так тире о говорит, назвать его что-то по-другому. И вот вы звоните его испытания. Если у меня не было, что в, что бы это назвать это? СТУДЕНТ: a.out. Джейсон Хиршхорн: a.out. Что это делать? СТУДЕНТ: Ссылки на математическую библиотеку. Джейсон Хиршхорн: Он связывает в математической библиотеки. Мы не включали математическая библиотека, но так как это настолько часто, они уже написано марка всегда включать математическая библиотека. И так же, это включает в себя библиотека CS50. Итак, если мы перечислим, у нас теперь есть исполняемый называемый тест. Чтобы выполнить его, я пишу тест. Я вижу, что мой плавающей точкой, Как и ожидалось, равна 0. Значит ли это, - так - СТУДЕНТ: Тогда, если вы положили плавать сейчас, как вы привести его поплавка - Джейсон Хиршхорн: Cast от 1 до поплавка? СТУДЕНТ: Нет, бросил полный вещь - да. Если вы только что сделали, что, бы которые делают его 0,1? Джейсон Хиршхорн: Хорошо, таким образом очень быстро, 1 делится на 10, те целые разделена. Поэтому, когда вы разделите целые, они 0, и вы экономите, что 0 в плавать, потому что слэш просто целочисленное деление. Так что теперь мы поворота что-то в обращении. Давайте посмотрим, что произойдет. Мы сделаем тест. Так что теперь мы видим, что, что косая черта не было целочисленное деление было плавающей точка деления. Потому что один из ее аргументов был брошен в обращении. Так что теперь это уже говорил, относиться к этому разделение, как мы имеем дело с плавающие точки, а не с целыми числами. И таким образом мы получаем ответ мы ожидаем. Давайте посмотрим, что происходит - упс. Если бы я хотел, чтобы напечатать больше десятичные пятна, как я мог это сделать? СТУДЕНТ: Точка точка е, или столько, сколько знаков после запятой, как вы хотите. Джейсон Хиршхорн: Так что я распечатать 10 десятичные пятна. И теперь мы видим, что мы получаем некоторые странные вещи. И это восходит на ваш вопрос о плавающей запятой неточность. Там в странные вещи хранятся здесь. ОК, значит ли это ответ на ваш вопрос? Что еще вы хотите быстро кодировать? СТУДЕНТ: Я просто хотел, чтобы увидеть или не, если вы освободили некоторое указатель, еще что ли указатель хранили в это также адрес, какой она была указывая на ранее. Джейсон Хиршхорн: ОК, так давайте сделаем это. Чара звезда PTR, это создает переменную называется PTR из символьного типа звезды. Как написать таНос? Олден? ALDEN: Просто таНос. Но тогда он должен быть размер и в этом случае, я думаю, вы бы указывать на символ. Так что это будет символ. Джейсон Хиршхорн: ОК, так что больше в общем, внутри - давайте редактирования. Внутри таНос, вы хотите, чтобы ряд байтов в куче. Как правило, то, что мы видели, что мы делать это мы собираемся Malloc строки, например, или массивы целых чисел. Так что если мы хотим 10 целых чисел, или 10 символы, 10 даст нам 10. А потом размер символов даст нам, что размер символов, которые в этот случай 1 байт. Мы получаем 10 байт. Если бы мы должны были написать размер Int, что даст нам 40 байт. Так в более общем, внутри таНос является количество байт вы хотите. В этом случае мы получаем 1 байт. Какие кажется странным использования из таНос, но для нашего цели имеет смысл. Так что есть что. Мы собираемся звонить бесплатно. Мы от него избавиться, и мы используем PTR снова. И что же вы хотите проверить? СТУДЕНТ: Я просто хотел проверить, является ли или нет, было ли что-нибудь внутри него. Джейсон Хиршхорн: Так ли он указал ни к чему? СТУДЕНТ: Да, точно, является ли он по-прежнему был адрес памяти. Джейсон Хиршхорн: Итак, вы хотите чтобы проверить значение PTR? СТУДЕНТ: Да, именно так. Джейсон Хиршхорн: Что я пишу здесь если я хочу проверить значение точка - что это, Иордания сказал, значение? Или то, что хранится внутри PTR? СТУДЕНТ: адрес памяти. Джейсон Хиршхорн: адрес памяти. Так что если я пишу только в этом, оно будет дайте мне значение PTR. И как я могу распечатать адрес памяти? Что строка формата для адреса памяти? СТУДЕНТ% р. Джейсон Хиршхорн:% р. % С является строкой. % Р для указателя. Так ли это? Это правильно. Так PTR равно - она до сих пор что-то в нем. Это, вероятно, более интересный вопрос. Что это линия делать? СТУДЕНТ: Seg неисправности. Джейсон Хиршхорн: Что? СТУДЕНТ: Я думаю, что SEG недостатки. Джейсон Хиршхорн: Хм? СТУДЕНТ: Я думаю, что это SEG неисправность. Джейсон Хиршхорн: Так эта линия из кода, звезды PTR, что делает звезда в виду? СТУДЕНТ: Содержание. Джейсон Хиршхорн: Да. К получить содержимое. Так что это будет идти в память обратиться туда и дать мне это. Я использовал% о прямо здесь, потому что там хранятся символы. Таким образом, мы собираемся пойти на этот адрес мы только что видел - или это, вероятно, будет немного отличается в этом раз, когда мы запустить программу. Но мы пойдем по этому адресу которые мы знаем все еще существует и посмотреть, что там. Так что не SEG неисправность. Это просто не дают нам ничего. Это, возможно, на самом деле дает нам что-то, мы просто не можем увидеть его. И это восходит к этой идее - и мы не собираемся, чтобы получить слишком много в это, потому что это за пределами Объем этого курса. Но мы говорили о прямо здесь, если мы вышел за границы массива на 1, мы не могли бы попасть в беду. Иногда, когда вы просто уйти на 1, вы делаете что-то неправильно, и вы может попасть в беду. Но вы не всегда попадают в неприятности. Это зависит, сколько о плохой вещи вы делаете, вы собираетесь попасть в беду. Который не должен сказать, быть неаккуратным с вашим кодом. Но это сказать, программа не будет всегда бросить курить, даже если вы идете куда-нибудь ты не должен идти. Хорошим примером этого является, много люди в их проблемы набор 3, которые был 15, не проверял Границы борту. Таким образом, вы смотрели налево, посмотрел на Хорошо, посмотрел на вершину, посмотрел на дно. Но вы не убедитесь в том, верхняя был на самом деле происходит, чтобы быть на борту. И много людей, которые сделали это, и Оказалось, что в их программа работала отлично, потому что, где, что доска была хранятся в памяти, если вы пошли один над ним или проверить, что память адрес, не было ничего, особенно ужасно об этом, так что ваша программа не была собирается кричать на вас. Но мы все равно снять очки, если вы не убедитесь, что, так как вам делали то, что вы не были должен делать, и вы могли бы получили в беде. Разногласия, тем не менее, вы, вероятно, этого не сделали. Так что это, чтобы показать, что, да, мы все еще можем идти к ней. И мы не получаем в Беда в этом случае. Если бы мы попытались сделать читать Следующие 100 символов, мы бы вероятно, попасть в беду. И вы можете написать чтение следующего 100 символы, если вы хотите, делая некоторые рода цикл. Да. СТУДЕНТ: Так как мы были назначены, что пространство фактическое значение, мы не были бы на самом деле быть в состоянии видеть ничего. Может быть, попробовать его с установкой, что равно как и в С или еще что-нибудь? Джейсон Хиршхорн: Хороший вопрос. Как мне установить это значение - что строка кода я пишу на линии семь делать то, что вы сказали? СТУДЕНТ: Звезда PTR равна одной цитата C конец одинарные кавычки. Джейсон Хиршхорн: Так это положить персонаж, с, в этом месте, потому что снова, что звезда означает пойти в туда. И при использовании на левой стороне Оператор присваивания, что составляет подписать, мы не собираемся, чтобы получить, что значение так как установлено, что значение. Теперь давайте посмотрим, что произойдет. Мы положить что-то есть и это было там. Мы назвали бесплатно. Некоторые вещи, вероятно, произошло в куче. Так что это не там больше. Но опять же, мы не получаем в проблему идти туда. Я делаю это в коде, чтобы проиллюстрировать что многие из них вопросы, которые у вас есть, что они действительно интересно отвечает много времени. И они действительно хорошие вопросы. И вы можете понять их на свой собственный, если, например, мы не в разделе. Да. СТУДЕНТ: Потому что ты не посылает указатель в любом месте, вы должны использовать таНос? Джейсон Хиршхорн: Так это восходит на ваш первоначальный вопрос. [? ?] Неужели это всего лишь локальная переменная? Malloc здесь не то, что убедительными. Использование таНос здесь не что убедительным, потому что это просто локальная переменная. СТУДЕНТ: Так не могли бы вы сделать символ звезды PTR равна Привет? Джейсон Хиршхорн: Ох. Так что мы собираемся теперь вернуться на ваш первоначальный вопрос. Я думаю, что вы не были удовлетворены с моим ответом. ОК? Как это? СТУДЕНТ: Да. Подождите. Джейсон Хиршхорн: А где Вы хотите распечатать? Таким образом мы будем распечатать строку, как это? СТУДЕНТ: Интересно. Джейсон Хиршхорн: Так что это говорит, что это Аргумент имеет тип характера. Так это должно быть характер. СТУДЕНТ: Просто берет первый. Джейсон Хиршхорн: Так что это это то, что я сказал прежде. Как я уже сказал, это не хранения строка внутри переменной указателя. Это хранения - СТУДЕНТ: Первое значение строки. Джейсон Хиршхорн: адрес первое значение строки. Если бы мы должны были распечатать это, мы получение значения внутри указатель. И мы будем видеть, что это, в самом деле, адрес памяти. Имеет ли это смысл? Извините. Подождите, Я ответил на ваш Вопрос, однако? СТУДЕНТ: Да. Джейсон Хиршхорн: Эта строка кода является создания строку и затем еще один переменная-указатель, который указывает в этой строке, что массив. Да. СТУДЕНТ: Так что, если мы пошли одно воспоминание обратиться дальше, будет получаем ч? Была ли она хранится в виде строки? Джейсон Хиршхорн: Мол, мы сделали - так что это ценный сделать. Это арифметика, которые вы, ребята, видели раньше, и должны быть относительно комфортно. Это сродни тому, писать - если мы должны были написать эту строку кода, мы видели нотации массива раньше. Это должно дать нам второй Значение в этом массиве, ч. Если бы мы сделали это, это должно также дать нам второе значение в этом массиве. Потому что это будет не в память адрес первого вещь, но адрес памяти вещи один старше. И тогда звезда оператор разыменовывает что указатель. И опять же, давайте посмотрим. Мы получаем ч снова. СТУДЕНТ: Что именно делает разыменовать значит? Джейсон Хиршхорн: Dereference является причудливое слово для пойти. К, что и получить то, что там является разыменовывать указатель. Это просто причудливое слово для этого. СТУДЕНТ: Если бы мы хотели печати вся строка, мог мы сделать амперсанд указатель? Джейсон Хиршхорн: Хорошо, мы собирается останавливаться здесь. Мы собираемся заканчивается. Ampersand дает адрес расположение, поэтому, когда вы делаете амперсанд из переменная, это дает вам адрес где хранится эта переменная. Ampersand указатель даст вам адрес PTR где PTR находится в памяти. Мы не собираемся идти на с этим примером. Вы можете выяснить это вещи по своему усмотрению. Но опять же, это может быть даже на грани немного сверх того, что вам нужно знать для объем этого среднесрочной перспективе - или этот тест, а. Извините. Мы собираемся двигаться дальше, потому что я бы нравится делать одну проблему кодирования перед время истекло. И мы собираемся запрограммировать то, что я думаю, является наиболее убедительным из них примеры, atoi. Так что это был вопрос о викторина два года назад. И у меня есть его на доске здесь. Люди спросили относительно викторины - им дали немного больше tesxt в вопрос, но я устранены Текст, потому что это было ненужным для наших целей сейчас. Это было лишь некоторые фон от того, что atoi сделал. Но вы все знаете, и очень знакомы с atoi. Я предлагаю вам закодировать это на листе бумаги. Я также предлагаю вам использовать стратегию что мы перешли много в нашем разделе. Во-первых, убедитесь, что вы понимаете, что atoi делает. Нарисуйте или придумать некоторые мысленный образ него в голове. Далее, выписать псевдокод для этого. На викторине, если все, что вы получаете, псевдокод, по крайней мере, вы положить что-то вниз. А потом отобразить эту псевдокод на С. Если у вас есть чек в вашем псевдокод, как проверить, если что-то является 1, что отображается на, если состояние и так далее. И, наконец, код программы в С. Так вернемся к atoi и занять пять минут закодировать это на листе бумага, которая, вероятно, о количество времени, вы бы взять на викторина для кодирования atoi. От пяти до 15 минут, от пяти до 12, от пяти до 10 минут, о размере раз, когда вы потратили бы на это Вопрос в викторине. Так что берите пять минут, пожалуйста. И если у вас есть какие-либо вопросы, поднять ваша рука, и я приду вокруг. [SIDE БЕСЕДЫ] Джейсон Хиршхорн: Итак, что было пять минут. Это было, вероятно, около размере раз, когда вы потратили бы на том, что на викторине, может быть, нижний предел того времени. Мы будем Напомним в немного. Начнем кодирования это. И если мы не получаем все путем, Ответы на этот и этот вопрос викторины доступны, опять же, Осень 2011, когда этот вопрос появился на викторине. И это стоило восемь очков на викторине то. Восемь очков находится на высоком конце количество точек что-то стоит. Большинство вопросов находятся в диапазоне от одного до шести очков. Так что это более сложным Вопрос, конечно. Кто-нибудь может начинайте меня? Как правило, то, что мы собираемся хотеть сделать с этим функционировать atoi, логически? Что мы хотим сделать? Так что мы собираемся написать некоторые псевдокод. СТУДЕНТ: Преобразование символов в целых числах. Джейсон Хиршхорн: Преобразование символов в целых числах. ОК. Так сколько символов мы будете нуждаться, чтобы пройти? СТУДЕНТ: Все из них. СТУДЕНТ: Все персонажи в строке. Джейсон Хиршхорн: Все символы в строке. Так что, если мы хотели пойти через каждый символ в строке, что это вещь, в С мы видели, что позволило нам пройти через каждый символ в строке? СТУДЕНТЫ: для петли. Джейсон Хиршхорн: для петли. Так что мы собираемся для перебора каждый символ в с. Тогда что мы будем хотеть сделать когда мы получаем специфический характер? Скажем, у нас вы получаете принял 90. Мы получаем 9. Это символ. Что мы хотим сделать с что характер 9? СТУДЕНТ: вычесть его из характера 0? СТУДЕНТ: Добавить 0? Джейсон Хиршхорн: Вычтите это от характера 0? СТУДЕНТ: Да. Джейсон Хиршхорн: Почему Вы хотите это сделать? СТУДЕНТ: [неразборчиво] значение. Его внутр значение. Джейсон Хиршхорн: Итак, мы берем характер 9, вычесть его из характер 0, чтобы получить фактическое целое 9. Сладкий. И как вы знаете, что характер 9 минус 0 персонаж 9? Что диаграмма ты смотреть? СТУДЕНТ: Есть логически девять места между 9 и 0. Или вы могли бы посмотреть на таблицу ASCII. Джейсон Хиршхорн: таблица ASCII. Но да, вы правы, а также. Таким образом, мы вычитаем 0. Так что теперь у нас есть целое 9. И то, что мы хотим делать с этим? Если у нас есть 90, это первое целое мы, что мы хотим сделать? СТУДЕНТ: я бы поставил во временном целого массив, то сделать математику к нему позже, чтобы сделать его в конце. Джейсон Хиршхорн: ОК. СТУДЕНТ: Вы можете начать в конце массив, а затем двигаться вперед так что каждый раз, когда вы двигаться вперед, умножить его на 10. Джейсон Хиршхорн: ОК. Это звучит, как довольно убедительные идея. Мы можем начать в конце нашего массива, и мы можем использовать strleng. Мы можем использовать strleng здесь. Мы получим длину нашей строки. Мы начинаем в конце. И + первый, мы просто считать, что целое число, и, возможно, мы создаем как Новый целая переменная наверху, где мы сохраняем все. Таким образом, мы петля через каждый символ вход с с задом наперед, мы вычитаем 0, и то возьмем его, и в зависимости от где он находится, мы умножаем его на степень 10. Потому что первый, что мы умножить крайнюю правую цифру по? СТУДЕНТ: 10 к 0. Джейсон Хиршхорн: 10 к 0. Что Умножим второе правый характер по? СТУДЕНТ: [неразборчиво]. Джейсон Хиршхорн: Что? СТУДЕНТ: 10 к 1. Джейсон Хиршхорн: 10 к 1. Третий-правый персонаж? СТУДЕНТ: 10 к 2. Джейсон Хиршхорн: 10 к 2. СТУДЕНТ: Извините, я не понимаю, что мы делаем здесь. Джейсон Хиршхорн: ОК, давайте вернемся, то. Так что мы собираемся, чтобы получить прошло в строке. Потому что мы пишем atoi. Таким образом, мы получить прошло в строке. Скажем, у нас вы получаете прошло в строке 90. Первое, что мы собираемся сделать, это установить новый целая переменная, что мы просто хочу, чтобы создать в качестве нашего нового целого числа. Это то, что мы собираемся вернуться в конце. Мы должны пройти через каждый символ в строка, потому что мы решили, что мы должны коснуться каждого и затем добавить его в наш новый целого числа. Но мы не можем просто добавить его в виде числа. Мы не можем просто взять 9 и добавить 9 до нашей целого числа. Это зависит от того, какое место это в строке. Мы собираемся нужно умножить это на степень 10. Потому что, как база 10 работ. Так что мы собираемся, чтобы получить фактическое характер, или фактический целое число, путем вычитания характер 0 от характера 9, как мы сделали с вычитания символов капитала из любого характера мы имели в одном из эти проблемы. Поэтому мы на самом деле получить число от 0 до 9 сохранен как вещественное число, и мы будем умножить его на степень 10 в зависимости от того, где мы находимся в строку. А потом мы собираемся добавить его обратно в наш новый целой переменной. Так что же это будет выглядеть будет быть - мы будем рисовать здесь. Если нас передаются в строке 90 - СТУДЕНТ: [неразборчиво]. Джейсон Хиршхорн: Но atoi принимает строку. Так что мы собираемся пройти через проведение. Мы будем получить прошло 90. Мы идем от задней к передней. Берем 0. СТУДЕНТ: Мне очень жаль. Может быть, это глупо. Если мы становимся прошло в строке, почему 90 то, что мы получать переданы в? Поскольку 90 является целым числом. Джейсон Хиршхорн: Потому что atoi берет строка и превращает его в целое представление этой строки. Но строка 90 не целое число 90 или № 90. Строка 90 является массивом из двух, или три символа, скорее, 9 характер, 0 характер, и обратный слеш 0 характер. И мы пишем atoi потому, что для Например, когда вы берете на себя команду Аргумент линия, и она сохраняется в агду, он сохраняется в виде строки. Но если вы хотите, чтобы рассматривать его как числа, вам нужно преобразовать его в Фактическое число. Который мы сделали одну из наших проблемных множеств. Который мы сделали в ряде из наших проблемных множеств. Все, что взял целое как аргумент командной строки. Так вот почему наша функция atoi принимает строку. Итак, еще раз, в нашем примере, мы собирается взять последний. Мы собираемся вычесть характер 0 из него, потому что персонажи 0 вычитается по характеру 0 дает фактическое число 0, в соответствии с ASCII математика, что мы делаем. Потому что персонажи представлены в виде отличается от их фактическое - характер, например, в нижнем регистре 97. Это не - ой! Это не все, что можно было бы ожидать чтобы это было, 0, например. Таким образом, вы должны вычесть характер, чтобы получить 0. Так что мы собираемся сделать, что здесь чтобы получить реальное число. А потом мы собираемся умножить его на степенью 10 в зависимости от того, где находится в строку, а затем принять, что и добавить его в наш заполнителя переменная, чтобы мы могли придумать наша окончательная новая целое. Значит ли это, имеет смысл для всех? Так что мы не собираемся, чтобы закодировать это прямо сейчас, потому что мы получать мало времени. Я прошу прощения за сроках, что. Но это то, что, как мы надеемся, вы бы быть в состоянии сделать на викторине - на крайней мере, получить этот псевдокод выписали. И потом, если бы мы должны были написать псевдокод, на самом деле, мы могли бы сделать это довольно быстро. Каждая строка комментариев, которые мы мы писали здесь переводится как о одна линия C кода. Объявление новую переменную, письма петля, некоторые вычитание, некоторые умножение, а некоторые назначение. Мы бы, вероятно, также хотят, чтобы написать обратную линию. Мы могли бы также хочу поставить некоторые проверки в здесь. Да. СТУДЕНТ: Так можем ли мы рассматривать с как реальную строку? Потому что я знаю, что это просто адрес. Мол, как бы вы получить длину строка передается через? Джейсон Хиршхорн: Так как же Длина строки? STRLEN. СТУДЕНТ: STRLEN, да. Но вы можете положить сек как Аргумент для этого? Джейсон Хиршхорн: Так STRLEN принимает символ звезду. И следует, что сЬаг звезду, и это продолжает отсчет, пока он не попадает в обратный слеш 0. STRLEN было на самом деле один из других программ, которые мы собирались кода. Вот еще один хороший один для кода. Это один немного легче, потому что, если Вы будете думать о том, что концептуально - Я только что сказал это вслух - STRLEN следующим указатель и продолжает идти и считая и не отслеживать до вы достигнете обратную косую черту 0. СТУДЕНТ: ОК, получил его. Джейсон Хиршхорн: Так лучше удачи на викторине 0 завтра. Если у вас есть какие-либо вопросы, я буду быть вне после этого. Не стесняйтесь, пишите мне. Обратитесь к вашему собственному TF, если вы не в моем разделе, или получить мой по электронной почте, если вы хотите его. Если вы хотите волноваться и просто отправить мне по электронной почте, Freakout письмо, я буду отправить тебя обратно, как, улыбающееся лицо, или, как, шутка или что-то. Так что не стесняйтесь сделать это также. Удачи снова, и я буду видеть вас всех на следующей неделе.