>> [МУЗИКА ГРАЄ]
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.
Ми будемо бачити вас на наступному тижні.