[МУЗЫКА ИГРАЕТ] David J. МАЛАН: Хорошо. Это CS50, и это это конец четвертой недели. И одна из тем, сегодня является то, что из цифровой криминалистики, искусство восстановления информации. И действительно, несмотря на то, вы находитесь в разгар Прямо сейчас мира в трех и Breakout, на следующей неделе, Упор будет сделан на именно этот домен. Так один из самых крутых работ, которые я когда-либо было вернулся в аспирантуре, когда я работал на местной Графство Middlesex окружного прокурора офис, делающие экспертизы работать. Так по существу, Массачусетс Государственная полиция, по случаю, при работе на случаях будет принести в таких вещах, как жесткие диски и дискет и карты памяти и тому подобное. И они бы передать их мне и моим наставником, и наша цель в том, чтобы найти доказательства, есть ли, на этих средах. Теперь, вы, возможно, видели проблески этого мира судебно-медицинской экспертизы в средствах массовой информации, телевидения и кино. Но работа, которую я имел, и осмелюсь сказать, что мир, не совсем, как вы увидите его. Давайте взглянем на то, что Вы, наверное, видели. [ВИДЕОВОСПРОИЗВЕДЕНИЕ] -OK. Теперь, давайте хороший взгляд на вас. [МУЗЫКА ИГРАЕТ] -Держись Его. Запустите его обратно. -wait Минуту. Переход права. -Есть. Замораживание что. -Полная Экраном. -OK. Замораживание что. -Tighten На что, не так ли? -векторных В на что Парень на заднем колесе. -Zoom В прямо здесь, на этом месте. Наведя правой оборудования, Изображение можно увеличить и заточены. -Что Что? -Это Программа повышения. -Можешь Ясно, что до любой? Я не знаю. Давайте повышения его. -Enhance Раздел A6. Я повысил деталь, и-- Я думаю, что есть достаточно, чтобы добавлять. Отпустите его к моему экране. -I Усиливается отражение в ее глазах. -Давай Запустить это через улучшения видео. -Edgar, Может вы сможете улучшить это? -hang На. -Я Работал над этим отражением. Чей-то -Там отражение. -отражении. -Там Отражением лица человека. Исследованы отражение! -Там Отражением. -Zoom В на зеркале. Вы можете увидеть отражение. -Может Вы сможете улучшить изображение отсюда? -Может Вы сможете улучшить его? -Может Вы сможете улучшить его? -Может Мы увеличиваем это? -Может Вы сможете улучшить его? -Держись Секунды. Я повышения. -Zoom На дверь. Шрифт Times 10. -Zoom. -Move В. -Более. Подожди, остановить. -Stop. -PAUSE Его. -rotate Нам 75 градусов по вертикали, пожалуйста. -Stop. Вернитесь в части о дверь снова. -У Энхансер изображения, которые могут Иноземные? -Может Мы можем использовать Прадип Сингх Метод, чтобы увидеть в окна. Исследованы программное обеспечение состояние искусства. Исследованы собственное выключен. Наведя права Сочетание algorithms-- Приняты освещение -Он алгоритмы на следующий уровень, и я могу использовать их, чтобы повысить эту фотографию. -Блокировка На и увеличить ось г. -Enhance. Enhance. -Enhance. -Freeze И повышения. [END ВИДЕОВОСПРОИЗВЕДЕНИЕ] David J. МАЛАН: Итак, это все слова, но они не были используется в предложениях правильно. И действительно, в будущем, в любое время, пожалуйста, вы слышите кто сказать слово, "Повысить", хихиканье только немного. Потому что, когда вы пытаетесь, чтобы добавлять, например, это то, что происходит. Так вот великолепный фото. Это собственный Daven CS50 в. И предположим, что мы хотели сосредоточиться в на огоньком в глазах, или отражение плохой парень, что был четко снятое камерой безопасности. Это то, что происходит, когда Если вы увеличиваете изображение, которое имеет лишь конечное число битов, связанных с ним. Это то, что вы получите. И действительно, в глаза Daven в является, но четыре, может, шесть пикселей , которые составляют именно то, что был мерцающий там. Так Задача Набор Четыре в конечном счете окажет вам изучить этот мир, особенно по характеру-то мы называем файл ввода / вывода, где I / O это просто причудливый способ говоря вход и выход. Так до сих пор, все взаимодействия у нас были с компьютером были в значительной степени с вашим клавиатура и экран, но не столько с жестким диском, или сохранения файлов помимо тех, которые вы сами написать. Ваши программы до сих пор есть не создавая и сохраняя, и обновления своих собственных файлов. Ну, что файл? Ну, то, как JPEG. Это образ, который вы могли бы есть или загрузить на Facebook, или увидеть в любом месте сети. В самом деле, что фото мы просто пила Daven был JPEG. И что интересно о файлах, как в формате JPEG в том, что они могут быть идентифицированы, Как правило, с помощью определенных шаблонов битов. Другими словами, то, что это такое, что отличает JPEG с GIF от PING от слова документ из файла Excel? Ну, это просто разные последовательности битов. И эти разные шаблоны Обычно в начале этих файлов. Так что, когда ваш компьютер открывает Слово док, или когда компьютер открывает JPEG, это выглядит, как правило, по крайней Первые несколько битов в файле. И если он распознает шаблон, он говорит, о, это образ. Позвольте мне показать его в пользователь в качестве графического. Или, о, это выглядит как документ Word. Позвольте мне показать его пользователю в виде эссе. Так, например, в формате JPEG, оказывается, являются довольно сложный под капотом. Но первые три байта почти каждый JPEG начать с этих трех чисел. Так байт ноль, один и два, в Наиболее каждый JPEG, 255, то число 216, то число 255. И то, что вы сможете чтобы начать делать на следующей неделе на самом деле тыкать под капот файлов как в формате JPEG и как растровых файлов, и, видя, что всегда был там до тех пор, как вы были с помощью компьютера. Но то, что там обычно не написано как десятичных чисел, как это. Компьютерные ученые не как правило, говорят в десятичной системе. Они действительно не говорят в двоичной системе. Как правило, когда мы хотим выразить цифры, мы на самом деле использовать шестнадцатеричную, которые вы, возможно, помните от, скажем, вопрос, поставленный Один, который бросил вызов чтобы вы подумали о другой системе. Мы, конечно, знакомы с десятичной, от нуля до девяти. Мы говорили о двоичном виде. И мы действительно не имеют в использовании, что многое здесь на, потому что компьютеры будут использовать это. Но программисты очень Часто, но не всегда, использовать шестнадцатеричную, который просто означает, у вас есть 16 букв в вашем алфавите, в отличие от двух или 10. Итак, как вы рассчитывать на более чем девять в шестнадцатеричном? Вы перейти 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, , B, C, D, E, F, только по соглашению. Но то, что ключ, что каждый из них представляет собой один символ. Там нет 10. Там нет 11, по существу, потому что каждый из ваших цифр, так же, как в десятичной и так же, как в двоичном, должны просто быть одним знаком, по соглашению. Так что же тогда является алфавит у нас есть в нашем распоряжении для шестнадцатеричном. Итак, что же JPEG выглядеть, если вам были выписать те первые три байты не как десятичной, но, например, как шестнадцатеричном? И почему шестигранной даже все, что полезно? Ну, быстрый взгляд на примере. Так что, если я пишу из биты, представляют эти десятичную numbers-- это может быть немного ржавый Теперь от нескольких недель назад, но левая и правый довольно легко. 255 был самым большим число мы может представлять с восемью битами. Это было все те. Так только один, это мягко интересным является средним один. И если вы вроде сделать из математика, вы будете сделать вывод, что, действительно, , что структура одного и нули представляет 216. Так что давайте просто предусматривают для Теперь, когда они правильно. Но почему это интересно? Ну, байт, конечно, восемь бит. И получается, что если вы думаете, байта в виде двух кусков четырех битов, как это. Позвольте мне добавить некоторое пространство. Поэтому, прежде чем, после. Я только добавил некоторые пробелы ради визуализации здесь. Как мы можем в настоящее время представляют в, скажем, шестнадцатеричное каждый квад битов, Каждый набор из четырех битов? Так, например, на левой Теперь, у нас есть 1111 в двоичном. Что это число в десятичной, если вы делаете из математику? У вас есть место те, двоек место, место четверки, и место восьмерки. АУДИТОРИЯ: 15. David J. МАЛАН: Это 15. Так что если мы делаем восемь плюс четыре плюс два плюс один, мы получаем 15. Так что я мог записать 15 ниже 1111, но здесь все дело шестнадцатеричное, не десятичную. Таким образом, вместо того, чтобы писать на 15, 1-5, Я собираюсь написать, что в HEX, который, если вы вспомните, если у вас есть от нуля до F, что 15 будет? АУДИТОРИЯ: ф. David J. МАЛАН: Вот и получается, что это ф. И вы можете работать, что, говоря, хорошо, если это 10, то ОК, F 15. Так действительно, мы можем переписать это же набор чисел, как F F. И потом, если мы делаем немного математики, мы заключаем, что это г. Восемь довольно легко, потому что мы есть один в месте восьмерки. А потом, у нас есть еще пара F F годов. Так что люди имеют тенденцию делать по соглашению когда они используют шестнадцатеричное они просто пишу это немного более кратко, избавиться от большей части этого пробела. И только, чтобы быть супер ясно, читатели, что это шестнадцатеричное, просто конвенция среди люди в написании нулю х, которые не имеет смысла другое чем визуальное идентификатор, вот идет шестнадцатеричное число. А потом, вы положили две цифры, F е в данном случае, то г, то F F. Так короче говоря, шестнадцатеричное просто стремится чтобы быть полезным, потому что каждый из его цифры, от нуля до F, отлично линии с узором из четырех битов. Так что если у вас есть два шестнадцатеричных цифр, от нуля до F, снова и снова, что дает вам идеально восемь бит или один байт. Так вот почему она стремится к быть условно полезно. Там нет интеллектуальной Содержание действительно кроме того, кроме его фактического полезности. Теперь в формате JPEG не только форматов файлов для графики. Вы можете вспомнить, что есть файлы, как это в мире, по крайней мере, от несколько лет назад. Так что это было на самом деле установлен в Windows XP на миллионах ПК по всему миру. И это был файл растровые, BMP. И Файл растрового, как вы увидите в следующем неделю, просто означает, что образец точек, пикселей, как они называют, карту на бит, действительно. Так что интересно, хотя, об этом файле формата, BMP, является что под капотом, его имеет более чем за три байт , которые составляют его заголовок, так говорить, первые несколько укусов. Это на самом деле выглядит немного сложно на первый взгляд. И вы увидите, что это в P набора. И получать то частности из этого сейчас это не так важно, как только на то, , что в начале каждого растрового изображения файла, графический формат, есть целая куча цифр. Теперь Microsoft, Автор этого формата, имеет тенденцию называть тех, Вещи не Интс и символы и плавает, но слова и д слова и жаждет и байты. Так что они просто разные типы данных. Они разные имена за то же самое. Но вы увидите, что в P Установить четыре. Но это только сказать, что если у человека дважды щелкает некоторое .BMP файл на его или ее жесткий диск, и открывается окно до показывая ему или ей, что изображения, что произошло, потому что операционная Система предположительно заметил не только расширение .BMP файл в имени файла, но и тот факт, что есть некоторые Конвенция образцу битов в самом начале этого растрового файла. Но давайте теперь сосредоточиться на такой сложный файл, но вместо этого на то вроде этого. Предположим, здесь в GEdit, я просто есть начала программы, это довольно просто. У меня некоторые включает верх. Теперь у меня есть include "structs.h", но Я вернусь к тому, что в один момент. Но это полезно для теперь. Так что это программа что собирается реализовать как базы данных регистратора. Так база данных студентов, и каждый студент в мире имеет имя и дом и, возможно, некоторые другие вещи, но мы будем держать это простым. Каждый студент имеет имя и дом. Так что, если я хотел написать Программа, цель которой в жизни просто для перебора от нулю на до трех, если есть трех студентов в Гарвардском университете. И я просто хочу, чтобы, используя GetString, Имя каждого студента и дом, а затем просто распечатать те из. Это вроде как Week Один, Неделя Две вещи сейчас, где я просто хочу для цикл или нечто подобное. И я хочу назвать GetString несколько раз, а затем распечатать е несколько раз. Так как я мог бы сделать это, хотя, когда оба имя и дом участвуют для каждого студента? Так что мой первый инстинкт мог бы в том, чтобы сделать нечто подобное. Я мог бы сначала сказать, хорошо, дай мне, сказать, массив строк называемых имена. И я не хочу жестко три здесь. Что я хочу поставить там? Так СТУДЕНТЫ, потому что это только постоянная объявлены в начале, только поэтому я не придется жестко три в нескольких местах. Таким образом, я могу изменить его на одно место, и это влияет на изменение везде. А потом, я мог бы сделать строка находится студентов. А теперь, я мог бы сделать нечто подобное для (INT I = 0; г <СТУДЕНТОВ; я ++. Так я печатаю быстро, но это вероятно, знакомы синтаксис сейчас. И теперь, это было недавно. Если я хочу поставить в г-го Имя студента, я думаю, что я делаю это. И потом, не имена но дома скобки I. Я делаю это, GetString, и пусть мне вернуться и исправить эту линию. Согласитесь? Не согласен? Это не очень удобно. Я не сказал пользователю, что делать. Но теперь, если я также хотел позже, давайте скажем, напечатать эти вещи out-- так TODO позже. Я собираюсь делать больше с это-- это возможно есть Правильная реализация получать имена и домов, три из них в общей сложности каждая, от пользователя. Но это не очень хороший дизайн, не так ли? Что делать, если студент имеет не только имя и дом, но и идентификационный номер, и номер телефона, и адрес электронной почты, и, может быть, главная, и может быть, ручка Twitter, и любое количество других деталей связано со студентом или лицом, в целом. Как бы мы начинаем добавить Функциональность этой программе? Ну, я чувствую, что самый простой способ мог бы в том, чтобы сделать нечто подобное, скажем, Int IDS студентов. Так я могу поставить все свои удостоверения в там. А потом, за то, как телефонные номера, Я не уверен, как представляют, что только пока. Так что давайте идти вперед и только звонок это щебечет студенты, которые немного странно, но-- и куча более полей. Я начал эффективно скопируйте и вставьте сюда. И это будет расти довольно громоздким довольно быстро, не так ли? Не было бы хорошо, если были в мире структура данных известно не как Int или строки, а нечто высокий уровень, абстракция, так говорить, известно как студент? C не пришел со встроенным Функциональность для студентов, но что, если я хотел дать это такое? Ну, получается, что я собираюсь открыть файл с именем structs.h здесь, и вы можете сделать именно это. И мы собираемся начать делать это сейчас. А под капотом P установить три, Вы уже делали это сейчас. Там нет такого понятия, как г прямоугольника или г овальные на языке программирования C. Люди в Стэнфорде реализованы те типы данных, используя этот подход здесь, объявляя свои собственные новые данные Типы, использующие новое ключевое слово называется структура, а другой одна называется ЬурейеЕ. И действительно, даже при том, что синтаксис выглядит немного отличается от материала мы видели раньше, в Принцип, это супер просто. Это просто означает, "определить тип." Это будет Структура и состав просто как контейнер для нескольких вещей. И, что структура будет иметь строку с именем имя, и строка называется дом. И давайте называть, просто для удобства, вся эта структура данных студент. Так как только вы получите в точка с запятой, у вас есть сейчас создали свой собственный данных тип, называемый студент что сейчас стоит в одном ряду междунар, и поплавок, и символ, и строка, и г прямоугольник, и г овальные, и в любом количестве из других вещей, которые люди придумали. Так что полезно об этом сейчас является то, что, если я вернусь на структуру 0 и закончить это реализация, который я написал заранее здесь, обратите внимание, что все неизбежного беспорядка, что собирался начать происходит, как я добавил телефонов и щебечет и все эти другие вещи в Определение студента, теперь он лаконично завернутый как только один массив студентов. И каждый из тех студентов, теперь имеет несколько вещей внутри него. Так что просто оставляет один вопрос. Как вы получаете на имя, и дом, и ID, и все, что еще внутри студента? Супер простой, а также. Новый синтаксис, но простая идея. Вы просто индекс в массиве, как мы сделали на прошлой неделе и это. И то, что явно новая часть синтаксиса? Просто., Что означает "идти внутрь Структура и получить поле называется Имя, получить поле, называемое дом, получить поле, называемое студент ". Таким образом, в P установить три, если вы еще работаем над этим, и большинство людей до сих пор которые, понимаешь, что, как вы начать использовать такие вещи, как г прямоугольникам и г овалов и другие вещи, которые, кажется, не приходят из Week ноль, один или два, понимаю, что это потому, что Стэнфорде заявил некоторые новые типы данных. И в самом деле, что это именно то, что мы будем сделать, а, в P Установить четыре, когда мы начинаем иметь дело с вещами например, изображений, растровые изображения, и многое другое. Так что просто тизер и ментальная модель для того, что грядет. Теперь, я откладывал немного этим утром. Я был отчасти любопытно посмотреть, что обои Microsoft на самом деле выглядит сегодня. И получается, кого в 2006 году на самом деле отправился в почти точно то же самое место, чтобы сфотографировать на самом деле , что выглядит как что в эти дни. Поле теперь немного заросшие. Поэтому, если говорить сейчас изображений, давайте вернуть Daven здесь на экране и Николая, и лишь напомню, что если вы хотите присоединиться к нам на обед в эту пятницу, с головы до нашей обычной URL здесь. Так где же мы оставить в понедельник? Мы ввели эту проблему, не так ли? Это было, казалось бы, правильно Реализация своп, в котором вы принимать два целых, один называется, одна называется б, обменять их, как Лаура сделал здесь на стадии с молоком и водой, с помощью временной переменная, или пустую чашку, так что мы могли бы поставить б в и а в б, не делая беспорядок вещей. Мы использовали переменную. Это называется температура. Но то, что было основной Проблема с этим кодом на понедельник? В чем проблема здесь? Да. АУДИТОРИЯ: Это занимает больше места. David J. МАЛАН: Занимает более пространство, потому что я использую переменную, и это нормально. Это верно, но я хочу сказать, что все в порядке. Это только 32 бит в Большом Схема вещей, таким образом, не имеет большого значения. Другие мысли? АУДИТОРИЯ: Это только свопы переменные локально. David J. МАЛАН: Точно. Это только меняет переменные локально. Потому что в любое время вы называете function-- когда у меня был лотки из Анненберг последний раз, у вас есть главная на дне. Как только вы вызываете функцию под названием своп, своп не получить х и у, первоначальные значения. Что подкачки GET, так мы утверждаем? Аудитория: Копии. David J. МАЛАН: Так их копии. Так он получает один и два, если вам вспомнить пример с прошлого раза, но копия одного и двух , которые успешно поменялись. Но, к сожалению, в конце концов, эти значения по-прежнему то же самое. Итак, мы видим это с нашим новый друг, надеюсь, GDB, что вы или ТФ и СА есть был проведет Вас к следующим. Так нет подкачки напомним выглядит like-- давайте открыть это-- выглядит следующим образом. Мы инициализации х к одному, у двух. Имел кучу печати е годов. Но тогда, клавишу вызова здесь было поменять, которые именно код, который мы только что видел несколько минут назад. Что правильно сначала взгляд, но функционально, эта программа не работает, потому что это не навсегда поменять х и у. Итак, давайте посмотрим на это, быстро тепло здесь с GDB, в ./noswap. Связка подавляющего информации, Я избавиться от с управления L сейчас. А теперь, я собираюсь идти вперед и запустить его. И, к сожалению, что не было, что полезно. Он побежал программу внутри этого Программа называется GDB, отладчик, но это не позвольте мне копаться. Так как я могу на самом деле пауза выполнение внутри этой программы? Так сломать. И я мог бы разорвать на любом номер строки, один, 10, 15. Но я также могу сломать символически говоря разговора Основное. И, что собирается установить перерыв Дело, видимо в строке 16 в основной. А где линия 16? Пойдем до кода и идти до noswap. И в самом деле, линия 16 является Самое первое в программе. Так что теперь, если я пойду вперед и тип запустить этот раз, Enter, это сделал паузу. Так что давайте копаться. Распечатать x-- почему х нулю? И игнорировать знак доллара. Вот только для любителя Использование программы. Почему х нулю на данный момент? Да. АУДИТОРИЯ: Это сделал паузу прямо перед строка 16, на самом деле не на линии 16. David J. МАЛАН: Точно. GDB, по умолчанию, остановилось выполнение непосредственно перед линией 16. Так что не выполнил, которая означает х имеет некоторое неизвестное значение. И нам повезло, что это то чистый как ноль. Так что теперь, если я печатаю следующий, теперь он выполнен 16. Он ждет, чтобы я выполнить 17. Позвольте мне идти вперед и печать х. Это одна. Позвольте мне идти вперед и печать у. То, что я должен увидеть сейчас? АУДИТОРИЯ: [неразборчиво] David J. МАЛАН: немного громче. АУДИТОРИЯ: [неразборчиво] David J. МАЛАН: Не совсем консенсус. Так что, да, мы видим некоторую ценность мусора. Теперь, у есть 134514064 есть. Ну, это просто некоторое значение мусора. Моя программа использует ОЗУ для различных целей. Там в другие функции. Другие люди написали внутри моего компьютера. Так эти биты были использованы для другие значения, и что я вижу является остатки некоторых до использование этой памяти. Так нет ничего особенного, потому что, как только поскольку я печатаю следующий, а затем распечатать у, это инициализируется значение, что я хочу. Так что теперь, давайте идти вперед немного быстрее. N на следующий. Давайте сделаем это снова. Давайте сделаем это снова. Но я не хочу, чтобы поразить это здесь, потому что, если I хочу посмотреть, что происходит внутри подкачки, что команда? АУДИТОРИЯ: шаги. David J. МАЛАН: шаги. Так что это шаги меня в функции, а не над ним. И теперь, это немного загадочными честно, но это всего лишь говорил мне, что я в линии 33 сейчас. И давайте сделаем это снова. Распечатать темп. Мусор значение, отрицательное этот раз, но это только еще значение мусора. Так что давайте делать дальше, темп печати. Это инициализируется 1, которые было значение х, ака. Теперь, когда наш и х из? Ну, заметить в основном, мы назвали эти значения х и у. Затем мы прошли их, чтобы обменять следующим образом. X пришел первым, запятая у. А потом, своп может называть их х и у. Но для ясности, что это называя их и б. Но и б теперь будет копии х и у, соответственно. Так что, если я вернусь в GDB, температура Сейчас один и сейчас является одним. Но если мне делать дальше, и теперь сделать печать , уже перебрался. Молоко излилась в бывший стекло апельсинового сока, либо наоборот. И если мне делать дальше снова, и теперь если я распечатать для проверки отсутствия ошибок, еще два, но б сейчас является одним. Честно говоря, он все еще там. Меня не волнует, что температура является. Но как только я теперь типа, скажем, продолжим возвращаться, теперь я в конце программа. И, к сожалению, х является еще один и у еще двух. Так в чем же польза от GDB там? Это не помогло мне исправить Проблема сама по себе, но это, надеюсь, поможет мне понимаю, понимая, что да, моя логика правильная, но мой код в конечном счете не имея постоянное воздействие. Так вот проблема мы собирается сейчас решить сегодня. Но давайте попасть путем это. Строка это ложь. Это тоже не является типом данных что существует в С. Это является синонимом некоторые Время-то другое, и мы можем показать, что следующим образом. Позвольте мне идти вперед и открыть Программа под названием сравнить-0. И вместо того, введите это один из, мы начнем ходить через код Я уже писал, но это только несколько строк. Так что это сравнить-0. И первое, что я делаю получает строку текста. Но обратите внимание, что я делать в первый раз. Чем отличается ясно о линии 21? На самом деле, подождите минуту. Это копия два. То есть даже не право программа. Ладно, спойлер оповещения. Ладно, так не берите в голову, что. Вот и ответ на будущий вопрос. Вот сравните-0, и я собирается получить строку текста. Программа гораздо проще. Так что это просто. Это как Week One, недели две вещи сейчас. струны S = GetString. Теперь, я еще раз говорю здесь. Строка т = GetString. А потом, последнее, что в этом Программа, как предполагает его название, является Я собираюсь попытаться сравнить их. Так что если с, первая строка, равна = Т, то я собираюсь сказать вводе то же самое. В противном случае, я собираюсь сказать, вводе разные вещи. Так что давайте скомпилировать и запустить эту программу. Так что сравнивать нулю. Выглядит хорошо. Нет компиляции ошибки. Позвольте мне идти вперед сейчас и введите ./compare-0. Позвольте мне идти вперед и то сказать : Daven и то: Роб. И я печатаю разные вещи. Пока все идет хорошо. Программа кажется правильным. Но давайте запустим его снова. Скажи что-нибудь: Гейб. Скажи что-нибудь: Гейб. Хорошо. Может быть, я ударил пробел или что-то в стиле фанк. Давайте сделаем это снова. Так Zamyla. Zamyla. Разные вещи. Так что же происходит? Поэтому у нас есть эти две линии Код, GetString вызывается дважды. А потом, я просто пытаются сравнивать с и т. Но то, что действительно то, что происходит? Ну, мой почерк собирается мясник этот пример несколько. И давайте на самом деле бросить это до сюда, а. Поэтому у нас есть такая строка: струны S = GetString. Так вот просто первый Интересно линия от этой программы. Но то, что было все это время происходит под капотом? Ну, на левой стороне находится строка, что некоторый тип переменной, и это называется с. Так что я знаю, что это, используя память, или RAM, в моем компьютере так или иначе. Так что я собираюсь абстрактно обратить, что в виде квадрата. 32 бита, это получается, но подробнее об этом в будущем. А потом, что происходит здесь? Ну, GetString очевидно получает строку от пользователя. И GetString получил Zamyla или Гейб или Daven. Так давайте выберем первый из тех, который был Daven. Так эффективно, что GetString получил мне в этом первом случае был D--V-е-н. А потом, что еще сделал это дает мне тайно? АУДИТОРИЯ: [неразборчиво] David J. МАЛАН: Да, / 0 или пустой символ. Так что фактически дало мне строку. Но мы уже знаем из предыдущего выглядит, что строка является просто массив символов, и это заканчивается это специальная дозорного характер, / 0. Но если это правда и это представляет собой квадрат, это явно намного больше прямоугольник. И в самом деле, это, Я утверждаю,, только 32 бит. И это явно больше, чем 32 бит, потому что это, вероятно, восемь плюс восемь плюс восемь плюс восемь плюс восемь, только потому, что байт в ASCII. Как, черт возьми, мы собираемся, чтобы соответствовать Daven в этой маленькой коробке здесь? Ну, что же GetString на самом деле делать? Ну, эта сетка здесь представляет памяти моего компьютера или ОЗУ. Итак, давайте условно сказать, что если каждый из них представляет собой байт, то мы можем думать о каждом байт, как имеющий адрес, как 33 Оксфорд-стрит, или 34 Оксфорд-стрит, или 35 Оксфорд-стрит. Так же, как дома имеют адреса и здания имеют адреса, так что отдельные байт памяти имеют адреса или номера что однозначно идентифицировать их. Теперь, это произвольное. Но держать его просто, я собираюсь использовать шестнадцатеричную только по соглашению, но 0x означает не что иное чем "это шестнадцатеричное." и я собираюсь утверждать, что "D" заканчивается в Байт One в памяти. Я ничего не получил еще происходит в памяти, так Daven получил первое место в Байт One. Это, то, будет 0x2. Это будет 0х3. Это будет 0x4. Это будет 0x5. Это будет 0x6. Но как только вы начинаете думать о каком делания компьютера под капотом, Вы можете начать вывод как вам, несколько лет назад, будет реализовали C себе. Что такое GetString вероятно returning-- потому что это чувствует, что это не возвращение Daven, по сути, потому что он, конечно, не собираюсь чтобы соответствовать в этом маленьком box-- так что GetString, вероятно, возвращается? АУДИТОРИЯ: [неразборчиво] David J. МАЛАН: Расположение Daven. И это было делать это с тех пор неделе один. Что GetString действительно возвращение не является строкой, как таковой. Это один из маленьких белых лжи. Это возвращение адрес строка в памяти, уникальный адрес. Daven живет в 33 Оксфорд-стрит. Но более кратко, Гэвин живет на 0x1, Адрес Number One. Так что получает положить в этот маленькая коробочка то, чтобы было ясно, просто адрес этой строки. Так что все это время, это имеет, что происходит. Но то, что это намек на Теперь, что если все с имеет это число внутри него, кто , чтобы остановить вас, программист, от сдачи любое число в любая переменная и просто прыгать к этому кусок памяти? И в самом деле, мы увидим вот угроза в следующий раз. Но сейчас, это чувствует недостаточно. Если я говорю, поймите меня Строка, вы дадите мне Daven. Но вы действительно не дают мне Daven. Все, что вам дают мне это адрес Daven в. Как мне тогда знать наверняка где Daven начинается и ends-- история становится weird-- где Daven начинается и заканчивается, а затем, на следующий строка в памяти начинается? Ну, если вы вручая мне начало Daven, по сути дела, как я знаю где конец его имени? Это особое нулевой символ, который тем более важно сейчас, если строк под капот просто определены однозначно их расположения в памяти. Так что все это время, это что происходит. Поэтому, когда мы смотрим сейчас на Код здесь, объяснить если вы бы ошибка в линии 26. Почему Zamyla и Zamyla отличается? Почему Гейб и Гейб по-другому? Да, в спину. АУДИТОРИЯ: Они имеют разные адреса. David J. МАЛАН: Просто потому, что они имеют разные адреса. Потому что, когда вы звоните GetString снова, что я буду делать быстро здесь, если это вторая линия, строка т, как я сделал в этой программе, равна другой звонок GetString. В следующий раз я называю GetString, я собираюсь чтобы получить другой участок памяти. GetString допускается просить операционные Система для получения дополнительной и большим объемом памяти. Это не собирается повторно использовать тот же шесть байт каждый раз. Это происходит, для получения новой кусок памяти, который означает т собирается получить некоторое другое значение здесь. Поэтому, когда я с равна = т, вы не сравнивая D против этого и против это и V против этого. Ты сравниваешь это от этого, которая откровенно довольно useful-- useless-- довольно бесполезно, потому что, кто действительно заботится, где струны в памяти? И в самом деле, у нас нет. И мы не собираемся начать особенно заботливым. Только в том случае, ошибки могут возникать и угрозы безопасности могут возникнуть волю мы фактически начинают заботиться об этом. Так давайте исправим эту проблему. Оказывается, это исправить супер просто. А давайте на самом деле, прежде, чем я показывают, что снова, что бы вы сделали, если в классе CS50, и нужно было реализовать сравнение с двумя строками. Вы явно не можете просто использовать с равна = Т. Но только логически, как бы вы сравнили эту строку против этой строки, используя С-код? Да. АУДИТОРИЯ: Просто делать для контура [неразборчиво] David J. МАЛАН: Прекрасно. АУДИТОРИЯ: [неразборчиво] David J. МАЛАН: Да. Просто используйте цикл или в то время как петли или любой другой. Но просто применить основную идею, что если это кусок памяти или массив и это, перебрать и в то же время. И просто сравните буквы. И вы должны быть немного осторожным, потому что вы не хочу один палец пройти другой потому что один строка длиннее другого. Таким образом, вы будете хотеть, чтобы проверить это специальное значение в конце, нуль. Но на самом деле это, в конец, так просто. И, честно говоря, нам не нужно изобретать, что колесо. Вот версия Два. И то, что я собираюсь сказать, является то, что вместо сравнения сек равна = Т, Я вместо собираюсь сказать, если строка Сравнение с запятой т равна = 0. Теперь, что же строка сравнить? Оказывается, это функция, которая поставляется с C, цель которого в жизни является для сравнения двух строк. И перемешать сравнивать, если мы читаем его Человек страницы или документы или CS50 ссылка, это будет просто вам сказать, что ажиотаж сравнить возвращает либо отрицательные номер или положительное число или ноль, где ноль означает, что они равны. Так что просто гипотеза. Что это может означать, если перемешать сравнения доходности отрицательное значение или положительное значение? АУДИТОРИЯ: Больше или меньше. David J. МАЛАН: Да, больше или меньше. Так что если вы хотите отсортировать целое куча строк в dictionary-- как мы в конечном итоге вниз road-- Отличная функциональность в использовании потенциально, потому что это собирается делать, что сравнение строк для вас, и скажите Вы действительно идет перед б, или делает б прийти до алфавитном порядке. Мы можем сделать именно это. И заметьте, что я один другой вещь в этом примере. Что еще изменилось выше в этой основной функции? Char *. И это есть ни что иное ложь. Все это время, когда вы писал строку, мы были тайно перезаписи Строка в символьном * так, что звон фактически понимает вас. Другими словами, в CS50.h и как мы будем в конечном счете видеть, мы сделали синоним называется строку что то же самое, как символ *. И на данный момент, только что знаю * В данном контексте, по крайней мере означает адрес. Адрес и что? Ну, то, что я сказал, символ *, а не INT * или плавать *, означает, что символ * является адрес гольца. Так что это маленькая коробочка здесь, ака строка, действительно типа символ *, которая является просто причудливый способ сказать, в этом поле пойдет адрес. А что значит, что адрес относится? Судя по всему, символ. Но мы могли абсолютно есть целочисленное * и другие вещи. Но сейчас, символ * действительно самый простым и одним из интерес. Таким образом, эта проблема будет расти, тем не менее, еще раз. Предположим, я открываю эту программу. Давайте посмотрим, если сейчас мы можем предсказать что не так с этим кодом. Таким образом, в этой программе, скопировать-0, я собираюсь идти вперед и снова позвонить GetString и сохранить значение в с. И потом, почему я это делаю, просто как напоминание от недели прошлом? Мы действительно говорили, что GetString иногда возвращает нуль. Что это значит, если GetString возвращает нуль? Что пошло не так. Это, вероятно, означает, что строка слишком большой, из компьютера памяти. Бывает супер, супер, супер редко, но это может произойти. Мы хотим, чтобы проверить его, и это все, что мы делаем. Потому что мы видим сейчас, если вы не начать проверку привычно для вещей как нуль, вы могли бы на самом деле начинают идти по адресам в памяти, что являются недействительными. И вы собираетесь начать вызывая все больше и больше ошибки сегментации. Или в Mac или ПК, просто побуждения компьютера повесить или программа для замораживания, потенциально. Так что теперь, я утверждаю, в копирования 0.c, что I буду копировать эти строки путем из линии 28. А потом, я собираюсь утверждать, в нижней части вот что я собираюсь изменить один из них. Так заметить это. Я звоню наш старый друг STRLEN. И только объяснить на английском языке что эта линия 34 делает? Что т кронштейн 0 представляют слева. Да. АУДИТОРИЯ: первый символ т? David J. МАЛАН: первый символ т. Это так. Впервые характер т, я хочу назначить заглавную версию первого символа в т. Так что это капитализации первая буква. А потом, в самый последний, что я делаю В этой программе есть я утверждаю, вот оригинальная, с, и вот копия, т. Но, основываясь на истории мы просто сказал о том, что строки на самом деле, что линия 28 действительно делать, а что в результате ошибка происходит чтобы быть на экране? Итак, сначала, первый вопрос, 28. Что строка T = S действительно делаешь? Если у нас есть на левой руке сторона здесь строка T = S; что дает мне одну коробку здесь и одна коробка здесь. И предположим, этот адрес 0x, скажем, 50 на этот раз, произвольно. Что строка T = S сделать под капотом? АУДИТОРИЯ: [неразборчиво] David J. МАЛАН: Он хранит память обратиться туда, так 0x50 идет туда. Так что если сейчас, я иду в первый характер в т и верхний его, что я эффективно делать, чтобы с? Я действительно делают то же самое, не так ли? Потому что, если адрес 0x50-- и просто, я нет много места на борту здесь, но предположить, что это 0x50 сюда, где-то в памяти моего компьютера. И я, например, Гейб в нижний регистр здесь, как это. И я уже говорил т кронштейн 0 получает капитализируются. Ну, т кронштейн 0 первая буква в т. Так мало г собирается стать большой Г. Но проблема будет, что же ы также указывают на? АУДИТОРИЯ: То же самое. David J. МАЛАН: точно такой же вещи. Таким образом, простое объяснение, возможно, даже если синтаксис немного странно. Так давайте сделаем это. Сделайте копию-0, а затем ./copy-0. Скажи что-нибудь: Гейб. И, к сожалению, оба им уже были капитализированы, но для, что в основе Причина, по которой мы просто Теперь дело с адресами. Так как же мы начинаем address-- не каламбур intended-- как мы приступить к решению это особая проблема? Ну, в copy1.c, дела идут чтобы получить немного сложнее. Но я бы претендовать концептуально простое решение. Так трудно получить на первый взгляд. Не будет легко для первого Время вводе его, возможно, но если проблема в том, что просто делать T = S всего копирует адрес, что, снова, если я могу забрать от вас, будет решение за фактически копирование строки? АУДИТОРИЯ: Мы, наверное, использовать цикл снова. David J. МАЛАН: Да. Таким образом, мы собираемся нужно петлю снова. И потому, если мы хотим, чтобы скопировать строка с в другую строку, мы, вероятно, хотите сделать это посимвольно. Но проблема в том, если Это изначально с, Теперь мы должны начать явно выделения памяти для т. Другими словами, давайте перекроить этот последний раз. Если это струны S = GetString. И давайте поставим это здесь, а также. Это GetString. А потом, картина за то, как что будет, как и прежде, G-A-B-е / 0. Это выглядит немного-то вроде этого. И с поэтому, мы называем это 0x50, и что будет 51, 52. Так что это 0x50. А потом, я делаю строку т. В памяти, что только собирается дать мне небольшую площадь, как это. Так что ключевым шагом сейчас? Если я хочу, чтобы скопировать сек в т, что пустой нам нужно заполнить здесь? Или то, что нам нужно делать на высоком уровне? Да? Кто? Да. АУДИТОРИЯ: Мы должны [неразборчиво]. David J. МАЛАН: Да, мы необходимо заполнить этот пробел. Я не могу скопировать, а затем капитализировать имя Гейба пока я не прошу операционную систему для другого куска памяти что, по крайней мере, как большой, как в оригинале. Так что оставляет нас с вопросом. Как попросить операционную систему не только для простенькой pointer-- как это называется, адрес, pointer-- не для простого небольшой коробке как это называется строку? Как попросить операционную Система для большой кусок памяти? До сих пор, я только получил свои слова обратно косвенно путем вызова GetString. Итак, как GetString даже получая свою память? Ну, получается, что есть это другая функция здесь что теперь мы начнем использовать. Теперь, это выглядит намного больше, загадочное than-- и я единственный, кто может видеть it-- эта линия выглядит путь более загадочными то он должен с первого взгляда. Но давайте дразнить его на части. На левой стороне, у меня есть символ * т. Таким образом, в английском языке, давайте начнем сформулировать надлежащие предложения в техническом жаргоне. Так что это выделяет переменная типа гольца * называется т. Теперь, что же это на самом деле означает? Ну, значит, что я собираюсь поставить в этой переменной называемой т? Адрес гольца. Так что просто проще, более разумный способ описания левую часть. Так что создает это поле только здесь. Так правая, предположительно, будет выделить, что больше кусок памяти, как? Так что давайте дразнить это друг от друга. Это подавляющее на первый взгляд, но что происходит внутри здесь? Во-первых, есть выделения и которые по-видимому, наш новый друг, "Памяти выделить." Так что это аргумент передается в него, так что это довольно большой аргумент. Так что давайте дразнить это друг от друга. StrLen из х, конечно, представляет the-- АУДИТОРИЯ: Количество символов. David J. МАЛАН: Просто Количество символов в с. Таким образом, длина с, исходная строка. Таким образом, G-A-B-E. Так что это, вероятно, четыре в данном случае. Почему я делаю 1 после называя STRLEN из х? АУДИТОРИЯ: [неразборчиво] David J. МАЛАН: Для этого специальный пустой символ. Если вы спросите меня, что длина Имя Гейба, я собираюсь сказать, четыре. Под капотом, хотя, мне нужно что пятый байт для нулевого символа. Так вот почему я делаю 1. Теперь на всякий случай вы работаете в этом Программа на компьютере, чем, скажем, CS50 прибор, где размер гольца может отличаться из моего собственного computer-- Получается, что я могу назвать это Оператор SizeOf, просто спросить компьютер, что размер обугливаться на этом компьютере? И путем умножения пять в этом Пример по размеру полукокса, которые на большинстве компьютеров будет быть просто одним, таНос собирается выделить для меня это большой кусок памяти здесь справа. И это будет return-- это function-- так что собирается вернуть мне что? АУДИТОРИЯ: адрес? David J. МАЛАН: адрес и что? АУДИТОРИЯ: Из памяти это выделено? David J. МАЛАН: Из памяти это выделено. Так что я понятия не имею,, откровенно говоря, где это будет в конечном итоге. Я собираюсь предложить, что это будет в конечном итоге на 0x88. Полностью произвольно, но где кроме 0x50, Так как операционная система, что Окна и Mac OS сделать для меня, является убедитесь, что это дает мне разные куски памяти. Так что это значение, где это кусок памяти может в конечном итоге. Так это то, что попадает в здесь, 0x88. Так что теперь ясно, я могу понять, что это не так же, как это, потому что они, указывая на различных участков памяти. Так что, если я сейчас на самом деле хотят, чтобы скопировать этот в, давайте сделаем предлагаемого вами решения. Давайте просто пойти, создать цикл, и сделать т кронштейн я получает с кронштейна я. Потому что теперь я могу использовать этот массив, как обозначение, потому что, хотя таНос очень в общем выделяет мне память, память только смежных байт. Байт, байт, байт, спина к спине к спине. Я могу, конечно, в качестве программиста рассматривать его как массив, который значит, я могу использовать это, наконец, знакомы обозначение всего несколько квадратных скобках. Итак, позвольте мне остановиться там, потому что это много все сразу, даже хотя основная идея резюмировать является то, что строка, все это время, это не новый тип данных как таковой. Это просто так называемый указатель, адрес символа, которые просто означает, что это число что в соответствии с соглашением человека мы, как правило, писать, как 0x то. Но это всего лишь число, как 33 Оксфорд-стрит, которые, случается, Адрес CS здания. Любые вопросы по эти детали? Да? АУДИТОРИЯ: Почему мы проверяем для т равен нулю? David J. МАЛАН: Почему мы проверить т равен нулю? Если мы читаем documentation-- большой question-- для таНос, он собирается сказать мелким шрифтом, иногда таНос может вернуться нуль, как GetString. И в самом деле, GetString возвращает нуль Если, в свою очередь, возвращает нуль таНос, потому GetString использует таНос. И что может случиться, если ОС, Mac OS, Windows, независимо, просто из памяти для вас. Так вот, что там произошло. И позвольте мне показать одну вещь что, возможно, просто сразит вас наповал или полностью быть слишком далеко над линией. Но позвольте мне подтянуть же для цикла для копирования, которые минуту назад, напомним, был это. т кронштейн я получает с кронштейна я. Хороший и удобный. По ощущениям второй недели снова. Но эта версия на самом деле может быть переписать так как это, который выглядит загадочно. Это указатель техника называется арифметика, адресная арифметика. Но почему это работает? Теперь раздражающе, Авторы C решено использовать * символ для различных целей. Мы видели это раньше, как только уже, символ *, что означает "дать мне переменную что собирается содержать адрес полукокса ". Так символ * в этом контексте означает "дать мне переменную." К сожалению, если вы используете * без Слово перед ним, как гольца, это теперь называется разыменовать оператор. И мы будем видеть больше этого в ближайшее время. Но это просто означает "пойти туда." Это как сказать, если кто вручил мне на листке бумаги "33 Оксфорд-стрит," если я делаю "* 33 Оксфорд-стрит," это означает, что "Пойти в будущем в здание КС." Так * просто означает пойти туда, если там нет ни слова перед ним. Так что же такое т, чтобы было ясно? т является адрес кусок памяти, что было дано мне. с это адрес, что, чтобы было ясно, в примере мы обсуждали, из строчной Gabe? с это адрес of-- АУДИТОРИЯ: Строка. David J. МАЛАН: Из оригинального названия Гейба. Так что это адрес это кусок памяти. Так что, если я говорю, т + i-- я, заметьте, просто наш старый друг. Это просто переменная индекс который итерации от нуля на до к длине строки с. Так что это будет равен нулю, то один, затем два, затем три, затем четыре. Так что давайте собрать эти новые Скретч-как кусочки головоломки, если хотите, хотя, опять же, синтаксис является гораздо более тайной, чем нуля. Так т является адрес + я собирается дать мне Число, потому что они все Номера, которые мы были чертежные как HEX. Но они просто цифры. Таким образом, если адрес т мы сказали был 0x88, что 0x88 плюс ноль. Даже если вас не устраивает с HEX еще, сделать предположение. АУДИТОРИЯ: Оригинальный. David J. МАЛАН: Еще 0x88. Итак, что же * 0x88 означает? Это означает, "пойти туда", что означает эффективно, "подай перст твой сюда." И теперь на правой стороне это выражение, * а затем в скобках,, S + I означает S, которое является обратиться сюда из маленького г. S + 0, конечно, с, что является с. Так что теперь, это * с, что так же, как * 33 Оксфорд-стрит означает перейти по адресу с. Так вот этот палец, правая рука. Так что я собираюсь скопировать в чем? Дело о праве, которое является Гейб, немного г здесь, в здесь. И поэтому эффект, что первая итерация цикла, как вы предложили, хотя это выглядит ума сложнее, чем все мы видели раньше, просто говорит зайдите сюда и скопировать этот символ здесь. Это дает вам карту к обоих местах. И мы увидим гораздо больше этого. Но сейчас, надеюсь, это просто ввести некоторые из этих основных идей. И в самом деле, давайте посмотрим на один окончательную программу здесь, а затем пообещал Claymation, что сделает все в порядке. Хорошо. Итак, позвольте мне открыть up-- там мы идем. Так что давайте мне-- мы вернемся к этой картине до тех пор. Позвольте мне открыть этот последний пример здесь. Так вот это супер, супер программа, которая выполняет ничто в жизни, что делает следующее. Это первая заявляет две переменные, х и у, что не цифры на этот раз, как таковые. Они не целые числа, по себе. Они, по-видимому десятичного *. Так что просто кто, что это значит если типом данных, переменная, имеет тип десятичного * звезды? Это адрес в междунар. Так что я понятия не имею, где это еще. Это просто означает "поставить, в конце концов, адрес в междунар здесь ". 0x50, 0x88, там, где это в памяти, адрес идти туда. И вот что у есть будет, а. Если я сейчас говорю х = таНос (SizeOf (INT)), это причудливый способ сказать, эй операционная система, с помощью таНос, дать мне достаточно памяти для размера из Int, который, вероятно, будет 32 бита или четыре байта. Итак, что же таНос вернуться? Malloc возвращает адрес. Так что же происходит, чтобы хранить в х? Адрес кусок памяти, четыре байта, что таНос только что нашел для меня, задавая операционная система. Теперь то же время, линия четыре здесь, * х = 42. Просто чтобы быть ясно, что происходит там, внизу? На левой стороне, * х. вот как * 33 Оксфорд-стрит. Так * х означает? АУДИТОРИЯ: К. David J. МАЛАН: К этому адресу. Где бы что кусок память, идти к ней. И положить то, что есть, очевидно,? АУДИТОРИЯ: 42. David J. МАЛАН: 42. Ладно, * у, та же идея. К адресу в у. Укажите номер 13 есть, но то, что у на данный момент? АУДИТОРИЯ: Там нет памяти для у. David J. МАЛАН: Там нет памяти для у. Итак, что же у вероятно содержат, как мы говорили? АУДИТОРИЯ: Garbage. David J. МАЛАН: Некоторые значение мусора. Теперь, значение мусор по-прежнему ряд. Он по-прежнему может быть ошибочно принято за адрес. Это как если бы кто-то нацарапал то вниз, и я неправильно его в том смысле, некоторые здания по улице. И если вы просто попробуйте войти в некоторые здания вы не являетесь владельцем, или некоторые кусок памяти у вас не был задан, плохие вещи могут случиться. Компьютер может зависнуть, или другой Не определено поведение может случиться. Так интро, затем, чтобы Binky это. Я до сих пор помню, 20 небольшим лет спустя, где я был, когда я, наконец, понял указатели. Который должен сказать, если вы оставить здесь в три минуты и думаю, что я не понять указатели, реализовать Я вспомнил для 20 лет для некоторых сумасшедшей причине когда и почему он, наконец, затонул в, сидя с моим учением молодец, Нишат Мехта в Задняя Элиот столовую. Теперь, я вспомнил это потому, что это было одной из тем я, в частности, боролся с. А потом, он, наконец, нажал, как я смею говорить, много вопросов в конечном итоге будет. И теперь, чтобы сделать, что чувствую все счастливее и тем более убедительно, давайте окончательный вид в нашей Последние три минуты здесь в Binky, от нашего друга, Ника Parlante из Стэнфорда. [ВИДЕОВОСПРОИЗВЕДЕНИЕ] Эй, Бинки. Просыпайся! Это время для указателя веселья. -Что Что? Узнайте о указателей? О, положительный герой! Ну, для начала, я думаю, мы понадобится пару указателей. -OK. Этот код выделяет два указателя, которые могут указывать на целых чисел. -OK. Ну, я вижу два указателя, но они не кажется, указывая ни к чему. -Верно. Первоначально, указатели не указывает ни на что. Вещи, которые они указывают на называются pointees, и их создании годов отдельный шаг. О, точно, точно. Я знал, что. В pointees раздельные. Э-э, так как в таком случае распределить pointee? -OK. Ну, этот код выделяет новый целое pointee, и эта часть комплектов х, чтобы указать на него. Эй, что выглядит лучше. Так что это что-то делать. -OK. Я буду разыменовать указателя х до сохранить номер 42 в его pointee. Для этого трюка, мне нужно мое Волшебная палочка разыменования. -Ваш Волшебная палочка из Разыменование? That-- это здорово. -Это Что код выглядит. Я просто установить количество и [POP] Эй, посмотрите. Там он идет. -Так Делать разыменования на х следующим образом стрелкой для его pointee. В этом случае, магазин 42 там. Эй попробуйте использовать его, чтобы сохранить номер 13 через другой указатель, у. -OK. Я просто пойду сюда, чтобы у, и получить число 13 создана. А потом, взять жезл Разыменование и просто [Базз] Ох! Ох, эй! Это не сработало. Скажите, Бинки, я не думаю, что разыменования у это хорошая идея, потому что вы знаете, настройке pointee отдельный шаг. И я не думаю, что мы никогда это сделал. Добрый точка. -Да. Мы выделили указателя у, но мы никогда не установить его, чтобы указать на pointee. -Очень Наблюдательны. Эй, вы ищете хорошее там, Бинки. Вы можете это исправить, так что у точки к тому же pointee как х? -Конечно. Я буду использовать свой Magic Wand из Pointer уступке. -Это Будет Проблема, как раньше? -Нет. Это не касается pointees. Это просто меняет один указатель на указывают на то же самое, другой. О, я вижу. Сейчас у указывает на то же место, что и х. Так что ждите. Теперь, у фиксируется. Он имеет pointee. Таким образом, вы можете попробовать жезл Разыменование снова отправить 13 в течение. -Мм, ОК. Вот он идет. [POP] Эй, посмотрите на это. Теперь разыменования работ по у. И потому, что указатели обмена что одной pointee, они оба увидеть 13. -Да. Обмен, что угодно. Так же мы будем, чтобы поменяться местами с предприятием? О, смотрите. Мы вне времени. -But-- -Просто Помнить три правила указателей. Номер один, основная структура является то, что у вас есть указатель, и это указывает более к pointee. Но указатель и pointee раздельные, и распространенная ошибка является создание указатель, но забыть дать ему pointee. Номер Два, разыменование указателя начинается с указателем и следующим его стрелку над чтобы получить доступ к его pointee. Как мы все знаем, это работает только, если есть pointee, какой вид возвращается к Правило номер один. Номер Три, указатель присваивание одного указателя и изменяет его, чтобы указать на же pointee как другой указатель. Таким образом, после выполнения задания, два указателя будет указывать на тот же pointee. Иногда, что называется обмен. И это все, что нужно сделать, на самом деле. До свидания сейчас. [END ВИДЕОВОСПРОИЗВЕДЕНИЕ] David J. МАЛАН: Вот именно для CS50. Мы будем видеть вас на следующей неделе.