>> DAVID мала: Здравствуйте, і ласкаво просимо назад в CS50.
Так що це в кінці тижня чотири.
Тільки одне оголошення в першу чергу.
Таким чином, так званий п'ятий понеділок придумувати наступний понеділок.
Це можливість перейти від СБ / ненасиченого на лист класі, або з
буквенную СБ / ненасиченого.
Прикро, що процес вимагає підпису, тому що ви повинні заповнити
один з тих, рожевий введення / виведення форм.
>> Тому що технічно, СБ / ненасиченого версії і версії буквенную
мають різні номери за каталогом.
Але ніяке грандіозне підприємство.
Просто приходьте до мене чи до Робу або Лорен в будь-який момент.
Або напишіть нам, якщо у вас немає виду документів вам потрібно сьогодні, і ми
будете впевнені, щоб допомогти вам прийняти догляд за що до понеділка.
>> Гаразд, так що сьогодні -
Насправді, є щось на зразок луни.
Чи можемо ми тон мене трохи?
ОК.
Таким чином, сьогодні ми вводимо тему відомий як покажчики.
І я визнаю, що це один з більш складні теми, які ми, як правило,
охоплюють в цьому класі, або дійсно будь вступний курс, який використовує C.
>> Але повірте мені на слово це, зокрема, Якщо ваш розум відчуває себе трохи більш вигнуті
сьогодні і в найближчі тижні.
Це не представник ви отримуєте гірше в це це просто означає, що
це особливо складні теми Я обіцяю, що, через кілька тижнів
Таким чином, буде здаватися надто разюче простий в ретроспективі.
>> Я все ще пам'ятаю донині.
Я сидів у Елліотт їдальня, сидячи поруч з моїм TF Нішат Мехта,
який був жителем Elliott House.
І чомусь, ця Тема просто кліків.
Який повинен сказати, що я теж боровся з ним протягом деякого кількості часу, але я
зроблю все можливе, щоб допомогти уникнути таких боротьба з тими, що в кінцевому рахунку
є досить потужним.
>> Справді, одна з тем, які ми будемо обговорювати У найближчі тижні в тому, що
безпеки, і як ви можете насправді експлуатувати машини таким чином,
які не були призначені.
А ті, як правило, exploitations результатом помилки, помилки, які ми
люди роблять, чи не розуміння деяких від конкретної реалізації
докладніше через які програми зробили.
>> Тепер, щоб зробити це здається все більш користувачів доброзичливий, я думав, що я буду грати 10
секундний фрагмент трохи Claymation цифру назвав Binky який був доставлений в
життя нашого друга в Стенфорді, Професор Нік Parlante.
Так що дозвольте мені дати вам це тизер Binky тут.
>> [ВІДТВОРЕННЯ ВІДЕО]
>> -Ей, Бінкі.
Прокинутися.
Це час для покажчика весело.
>> -Що це?
Дізнайтеся про покажчики?
О, позитивний герой.
>> [КІНЕЦЬ відеовідтворення]
>> DAVID мала: Це Стенфорді інформатики.
Так про це в майбутньому.
>> [Оплески]
>> DAVID мала: Вибач, Нік.
>> Тому нагадаємо, що минулого разу ми закінчили на це дійсно захоплююче захоплюючим
причому ця функція просто не працює.
Принаймні, інтуїтивно, він відчував як вона повинна працювати.
Просто поміняти місцями значення двох цілих чисел.
Але нагадаємо, що, коли ми виводимо вихідних значень в основному, один і
два, вони були досі одне і два, а не дві, а одну.
>> Отже, дозвольте мені насправді перемикання більш до приладу.
І я написав трохи коду в скелетних просування тут, де я стверджую, що X
буде 1, у 2 буде.
Я потім роздрукувати і їх Значення F з печаткою.
>> Я тоді стверджувати, що тут ми збираємося поміняти їх місцями.
Я залишив порожнє місце тут для нас заповнити сьогодні через хвилину.
Тоді, я буду стверджувати, що двох змінних були обміняні.
Тоді я збираюся роздрукувати їх знову.
І так, ми сподіваємося, я повинен бачити 1, 2.
2, 1.
Це супер просто мета зараз.
>> Так як же нам йти про обмін двох змінних?
Ну, якщо я пропоную тут, що ці чашки може представляти пам'яті в комп'ютері.
Це дещо укусів, це Інший кілька укусів.
Чи могли ми волонтер піднімайся і змішати нам випити, якщо знайомі?
Піднімайся.
Як тебе звуть?
>> Джессі: Джесс.
>> DAVID мала: Джесс?
Піднімайся, Джесс.
Якщо ви не заперечуєте, ми повинні покласти Google скла на вас, щоб ми могли
увічнити це.
Добре, скла.
Запис відео.
І добре, що ми хороші, щоб піти з Джесс тут.
Добре.
Дуже приємно.
>> Так що я хотів би вам зробити тут - якщо б ви могли, досить швидко -
просто ллє нам половину склянки апельсинового соку і півсклянки молока
представляє ефективно цифрами 1 В одній чашці і 2 в іншій чашці.
>> Це збирається бути хороші кадри.
>> JESS: Вибачте.
>> DAVID мала: Ні, ні.
Все в порядку.
Ніццу.
Гаразд, у нас є чотири байти Варто апельсинового соку.
Ми назвали його значення 1.
Тепер ще чотири байти варто молока.
Будемо називати його значення 2.
Так що х і у, відповідно.
>> Гаразд, так що тепер, якщо завданню - для вас, Джесс, на очах у всіх
з ваших однокласників -
є заміна значення х і у такі, що ми хочемо, апельсиновий сік в
іншій чашці і молоко в чашу цю, як може вас - перш ніж насправді
це - йти про це?
>> Добре, мудре рішення.
Так що вам потрібно трохи більше пам'яті.
Так що давайте виділити тимчасове чашку, якщо ви будете.
А тепер перейдемо до поміняти х і у.
>> Відмінно.
Так що дуже добре зроблено.
Велике вам спасибі, Джесс.
Ось, будь ласка.
Невеликий сувенір.
>> Добре, таким чином, очевидно, супер просто ідея.
Абсолютно інтуїтивно, що нам потрібно трохи більше місця для зберігання - в такому вигляді,
чашка - якщо ми дійсно хочемо поміняти цих двох змінних.
Так що давайте робити саме це.
Тут, в між тим, де я стверджую, що я збираюся робити деякі заміни, я буду
йти вперед і оголосити темп.
І я буду його рівним, скажімо, х.
>> Тоді я збираюся змінити значення X так само, як Джесс зробив тут з
молоко і апельсиновий сік рівним у.
І я збираюся змінити Y рівним НЕ х, тому що тепер ми будемо
застряг в коло, а темп.
Там, де я тимчасово - або там, де Джесс тимчасово відкласти апельсиновий сік
до затирання, що чашки з молоком.
>> Отже, дозвольте мені тепер іти вперед і зробити це.
Вона називається noswap.c.
А тепер дозвольте мені працювати не свопу.
І справді я бачу, якщо я розширюю вікна трохи, що
х дорівнює 1, у дорівнює 2.
, А потім х 2, у = 1.
>> Але нагадаємо, що в понеділок ми зробили речі трохи по-іншому якій я
, Реалізуються допоміжні функції, якщо хочете, що було насправді порожнеча.
Я назвав його поміняти.
Я дав їй два параметри, і я подзвонив їх і я назвав їх б.
>> Чесно кажучи, я міг би назвати їх х і у.
Там ніщо не заважає мене від цього.
Але я б сказав, що це те трохи двозначно.
Тому нагадаємо, що в понеділок ми стверджують, що ці параметри були
копії значень пройшло дюйма
Так що просто псує з увазі, я думаю, якщо ви використовуєте
точно так само змінних.
>> Так що я буду називати їх замість і В, тільки для ясності.
Але ми могли б назвати їх найбільш все, що хочемо.
І я збираюся копіювати і вставляти ефективно цей код від там
вниз в тут.
Тому що я тільки що бачив, що він працює.
Так от в досить хорошій формі.
І я зміню свою х к, х моя а, у мого б і у мого б.
>> Отже, іншими словами, ті ж логікою.
Одне і те ж, що Джесс зробив.
А потім одна річ, я повинен зробити до Тут, звичайно, зараз посилатися на це
функції або викликати цю функцію.
Так що я буду називати цю функцію з двома входів, х і у, і натисніть Зберегти.
>> Гаразд, принципово те ж саме.
Насправді, я, ймовірно, зробили програму зайво складним шляхом
пишете функцію, яка просто приймає близько шести рядків коду, тоді як я
раніше реалізовані це всього за три.
>> Отже, дозвольте мені тепер йти вперед і переробити цього не роблять підкачки.
Гаразд, я облажався тут.
Це має бути помилок, які можуть см. все більш широко, як ваша
Програми стають все більш складними.
Але є легко виправити.
Дозвольте мені прокрутки повернутися сюди.
>> І те, що перша помилка, що я бачу?
Неявна декларація.
Що це зазвичай вказують?
Ой, я забув прототип.
Я забув навчити компілятор, який своп буде існувати, хоча він
не існує на самому початку програми.
Так що я просто хотів сказати порожнечу, своп, Інтелект, Перехоплення INT B, крапкою з комою.
>> Так що я не збираюся перевизначити її.
Але тепер це відповідає тому, що це тут.
І зауважте, відсутність крапки з комою тут, який не є необхідним, коли
реалізації.
>> Отже, дозвольте мені переробити це, можете не свопу.
Набагато кращій формі.
Біжіть НЕ свопу.
І чорт забирай.
Тепер ми повернулися, де ми були в понеділок, де річ не змінити.
>> І те, що інтуїтивне пояснення , Чому це так?
Так?
>> СТУДЕНТ: [нерозбірливо].
>> DAVID мала: Абсолютно вірно.
Так що А і В є копіями х і у.
І справді, в будь-який час ви були виклику функції до цих пір, що
передає змінні, як цілі -
так само, як своп чекає тут -
Ви, хлопці, що проходить в копіях.
>> Тепер, означає, що вона займає небагато часу, долі секунди, для
Комп'ютер для копіювання бітів з одного змінна в біти з одним.
Але це не така вже велика справа.
Але вони, тим не менш копію.
>> І ось тепер, в контексті обміну, Я насправді успішно
зміни і б.
Справді, давайте робити швидкі санітарної перевірки.
Друк F є% I, новий рядок.
І підключити давайте в.
Тепер давайте зробимо те ж саме з б.
І давайте робити те ж саме тут.
>> А тепер, дозвольте мені скопіювати ці ж лінії знову в нижній частині функції
після моїх трьох ліній цікавого могли б стратили, а
роздрукувати і B ще раз.
Отже, тепер давайте зробимо це, не робіть підкачки.
Дозвольте мені зробити вікно терміналу трохи вище, так що ми можемо бачити
більше його відразу.
>> І ніколи працювати не свопу.
х дорівнює 1, у дорівнює 2. = 1, B = 2.
І потім, а дорівнює 2, B = 1.
Так він працює, як і Джес зробив тут всередині підкачки.
Але, звичайно, він не залишається ніякої ефект на змінні в основний.
>> Таким чином, ми побачили трюк, за допомогою якого ми могла б це виправити, чи не так?
Якщо ви зіткнулися з цією оглядової Питання, можна просто плоскодонки і зробити X
Y і які змінні замість цього?
>> Ви могли б зробити їх глобальними.
Покладіть їх на самому початку файлу як і ми, навіть у грі 15.
Ми використовуємо глобальну змінну.
Проте в контексті гри 15, це розумно мати глобальне
змінна, що представляє дошку, тому що повнота 15.С всі
про реалізацію цій грі.
Це те, що файл існує, щоб зробити.
>> Але в даному випадку тут, я виклику функції підкачки.
Я хочу, щоб поміняти двох змінних.
І вона повинна почати відчувати себе так само неакуратно якщо рішення всіх наших
проблеми, коли ми біжимо в область питання, це зробити його глобальним.
Тому що дуже швидко наша програма збирається стати справжній безлад.
І ми зробили це дуже економно У підсумку в 15.c.
>> Але, виявляється, є Кращий спосіб в цілому.
Дозвольте мені насправді повернутися і видалити роздрукувати F, всього спростити цей код.
І дозвольте мені запропонувати, що це, дійсно, погано.
Але якби я замість цього додати в деяких зірочками і зірки, я можу перетворити це замість
функції в той, який насправді працює.
>> Отже, дозвольте мені повернутися сюди і зізнатися кажучи зірочками завжди важко,
Тому я скажу так зірки.
Я просто зізнатися до того.
Добре.
А тепер, що я збираюся зробити замість цього?
>> Отже, перш за все, я збираюся поставити що замість проходження в десяткового
своп функції, я замість з збирався сказати десяткового зірки.
Отже, що ж зірки вказують?
Це поняття, що покажчик, який Бінкі, Claymation характером, був
посилаючись на мить тому.
>> Так що якщо ми говоримо десяткового зірки, сенс це зараз, що не збирається бути
пройшла в його значенням.
Це не збирається бути скопійовані дюйма
Швидше, адреса є буде передаватися дюйма
>> Тому нагадаємо, що всередині комп'ютера ціла купа пам'яті, в іншому випадку
відомої як ОЗУ.
І це тільки RAM ціла купа байтів.
Так що якщо ваш Mac або ваш комп'ютер має два гігабайти, у вас є 2
мільярд байт пам'яті.
>> Тепер давайте припустимо, що просто тримати речі добре і організовано, ми
призначити адреса -
номер -
в кожен байт оперативної пам'яті на вашому комп'ютері.
Найперший байт з тих 2 млрд. за кількістю нулю.
Наступний байт є номером один, число два, всю дорогу на вгору, точка точка
точки, приблизно 2 мільярди доларів.
>> Так що ви можете кількості байтів пам'яті в комп'ютері.
Отже, давайте припустимо, що це те, що ми маємо на увазі під адресою.
Тому, коли я бачу десяткового зірки, що відбувається повинні бути пропущені через своп в даний час є
адресу.
Чи не його вартість, але все, що його поштову адресу, так сказати -
його розташування в пам'яті.
>> І аналогічно для В, я збираюся сказати те ж саме.
Int, зірка, б.
Як осторонь, технічно зірки могли б піти в інші місця.
Але ми будемо стандартизувати зірка є в безпосередній близькості від типу даних.
>> Так своп підпису тепер означає, дай мені адреса Інтелект, і виклик
цю адресу.
І дай мені іншу адресу Int і називати цю адресу б.
>> Але тепер мій код тут має змінитися.
Тому що, якщо я заявляю десяткового Temp -
який до цих пір типу Int -
але я зберігаю в ньому, які цінності?
Щоб було ясно, я Введення з код як написано прямо зараз?
>> Я ставлю розташування в.
Але я не піклуються про місце в даний час, чи не так?
Temp існує тільки третину склянки Джес існував, з якою метою?
Для збереження значення.
Молоко або апельсиновий сік.
Чи не фактично зберігати адреси або з тих речей, яка відчуває себе
трохи безглузде в цьому реальному світовий контекст в будь-якому випадку.
>> Так насправді, те, що я хочу поставити в Temp не є адресою, але
Зміст.
Так що якщо це число, як 123, це Сто двадцять третій байт пам'яті, що справедливий
трапляється, окупаційною, що значення У трапляється окупаційними.
>> Якщо я хочу піти на цю адресу, Я повинен сказати, зірки.
Аналогічним чином, якщо б я повинен був змінити те, що за адресою, я міняю
це для початку.
Якщо я хочу зберегти в тому, що, по крайней Розміщення з тим, що на місці
в B, B зірки зірки.
>> Коротше кажучи, навіть якщо це не зовсім потопаючи в ще - і я б не очікував
що вона буде так швидко -
розуміти, що все що я роблю, випереджаючи ці зірки до мого змінних,
кажу, що не захопити цінності.
Не змінюйте значення.
Але, швидше, йти на ці адреси і отримати значення.
До цього адресою і зміни значення там.
>> Так що тепер дозвольте мені прокручувати вперед до самого верху, тільки для виправлення цієї лінії тут, щоб
змінити прототип, щоб відповідати.
Але мені тепер потрібно зробити ще одну річ.
Інтуїтивно, якщо я змінив типи аргументів, які своп очікує,
Що ще мені потрібно змінити в моєму коді?
>> Коли я дзвоню підкачки.
Тому що зараз, що ж мені Я переходячи до ще поміняти?
Х цінність і значення у, або молока і апельсиновий сік.
Але я не хочу цього робити.
Замість цього я хочу передати в чому?
Розміщення х і розташування у.
Які їх поштові адреси, так сказати.
>> Таким чином, щоб зробити це, є амперсанд.
Ampersand виду звучить як адреси.
т. п., амперсанд, адреса х, а також адресу у.
Так що це навмисне, які ми використовуємо амперсандом при виклику функції,
і зірки при оголошенні і коли реалізації функції.
>> І тільки подумайте, як амперсанд адреса оператора і зірки, як
туди оператора -
або, точніше, оператор разименованія.
Так що в цілому багато слів просто сказати, що тепер, сподіваюся, своп буде
правильними.
>> Дозвольте мені піти далі і зробити -
давайте насправді перейменувати файл, щоб ця програма як і раніше не будуть називати не свопу.
Я стверджую, що ми будемо називати його swap.c зараз.
Тому переконайтеся, своп.
Точки, похилій риси поміняти.
>> А тепер дійсно, х = 1, у = 2.
І потім, х дорівнює 2, у дорівнює одиниці.
Ну давайте подивимося, якщо ми не можемо зробити цього трохи по-іншому, як до того, що
тут відбувається.
По-перше, дозвольте мені збільшити на наш малювання екрану тут.
І дозвольте мені запропонувати на мить - і всякий раз, коли я малюю тут буде дзеркально
там зараз - дозвольте мені запропонувати, що Тут ціла купа пам'яті, або
Оперативної пам'яті, всередині мого комп'ютера.
>> І це буде укус числа, скажімо, 1.
Це буде байт номер 2.
І я зроблю цілий букет більше, і Потім купа многоточий багатокрапки точку, щоб
показують, що є 2000000000 з цих речей.
4, 5, і так далі.
>> Таким чином, є перші п'ять байтів пам'яті мого комп'ютера.
Все в порядку?
Дуже мало хто з 2000000000.
Але зараз я збираюся запропонувати наступному.
Я збираюся запропонувати, щоб X збирається зберегти номер 1, а Y буде
, Щоб зберегти номер 2.
І дозвольте мені тепер йти вперед і являє ці значення таким чином.
>> Давайте зробимо це таким чином.
Дайте мені всього за одну секунду.
Одна секунда.
ОК.
Я хочу зробити це небагато -
давайте зробимо це знову.
В іншому випадку я збираюся і використання ті ж номери, ненавмисно,
кілька разів.
>> Так що у нас є різні номери про що поговорити, давайте назвемо цей байт
номер 123, 124, 125, 126, і крапка крапка крапка.
І дозвольте мені стверджувати тепер, що я збираюся помістити значення 1 тут, і значення 2
Тут, інакше відомий як х і у.
Так вже сталося, що це х, це у.
>> І тільки деякі випадковості, комп'ютер, операційна система,
сталося покласти х за місцем знаходження номер 123.
І у закінчили в розташування 124 -
чорт забирай.
Я повинен був це виправив.
Про людина, я дійсно хочу це зробити?
Так, я хочу, щоб виправити це і У належний про це сьогодні.
На жаль, новачок в цьому.
>> 127, 131, і я не хочу бути цим складно, але чому я змінити
номерах є?
Тому що я хочу, щоб цілими насправді в чотири байти.
Так що давайте бути супер анальний про це.
Так що якщо 1 відбувається вирішувати 123, 2 буде за адресою
127, тому що це всього в 4 прощання далеко.
Ось і все.
І ми забудемо про всі іншими адресами у світі.
>> Так що х знаходиться в місці розташування 123, Y знаходиться в місці розташування 127.
А тепер, що ж я насправді хочете зробити?
Коли я дзвоню своп Тепер, що відбувається насправді?
Ну, коли я називаю своп, я передаю в адреса х а також адресу у.
Так, наприклад, якщо ці дві частини паперу в даний час представляють два
Аргументи і B поміняти, то, що я збираюся написати на першому з них,
якого я буду називати називати?
>> Точно, 123.
Так що це я стверджую це.
Це параметр.
Я ставлю адресу X у там.
>> Що це?
>> Ні, ні.
Це нормально.
Тим не менш добре, все ще добре.
Так що це.
А тепер на другий аркуш паперу, це буде B, і що я
збираюся писати на цей папірець?
127.
>> Так що єдине, що змінилося в порівнянні з наші попередні показовим цієї історії,
буквально, а не 1 і 2, я збирається пройти в 123 і 127.
І я зараз збираюся поставити всередині цих з цієї рамки, все гаразд?
Так що чорний ящик в даний час являє своп функції.
>> Тим часом, давайте тепер є хтось здійснювати своп функції.
Хтось тут хотів стати волонтером?
Піднімайся.
Як тебе звуть?
Чарлі.
Гаразд, Чарлі.
Піднімайся.
>> Так що Чарлі буде грати роль нашого чорного ящика.
І Чарлі, що я б хотів, щоб ви Тепер буде здійснювати обмін таким чином
, Що з урахуванням цих двох адреси, Ви були насправді відбувається
для зміни значень.
І я буду шепотіти вам на вухо як запустити телебачення тут.
>> Так що давай, а ти чорний ящик.
Reach у там.
Які цінності Ви бачите, і які цінності ви бачите для B?
>> Чарлі: становить 123 і В 127.
>> DAVID мала: ОК, це точно.
Тепер зупинимося там на мить.
Перше, що ви збираєтеся робити зараз, відповідно з кодом, - які
Тепер я буду тягнути на екрані -
буде виділити кілька біт пам'яті називається темп.
Так що я збираюся йти вперед і дати вам, що пам'яті.
>> Так що це буде третя мінлива що у вас є доступними для
Ви назвали темп.
І що ви збираєтеся написати Температура на аркуші паперу?
>> Чарлі: покажчики, чи не так?
>> DAVID мала: Добре, ну не обов'язково покажчиків.
Таким чином, рядок коду, що я виділені на правій стороні,
давайте почнемо там.
Це говорить зірка.
Так в даний час зберігання номер 123.
І так само, інтуїтивно, що зробив зіркою 123 означає?
>> А конкретно, якщо це 123, зірка означає, що?
Значення.
Або більш недбало, йдіть туди.
Отже, дозвольте мені запропонувати, що, тримаючи в руки, йти вперед і лікування, що
як ніби це карта.
І ходити до себе комп'ютера пам'яті, і знайти те, що нам
в точці 123.
Саме так.
>> Отже, ми бачимо в розташуванні 123 це те, що, очевидно?
Отже, яке значення зараз Ви збираються поставити в ТЕМР?
Саме так.
Так що йти вперед і робити це.
І написати номер 1 на шматок паперу, що в даний час під назвою темп.
>> А тепер наступний крок, який Ви збираєтеся реалізувати
буде що.
Ну, з правого боку Наступний рядок коду є зіркою б. B, з
Звичайно, зберігаються адреси.
У якому розглядаються 127.
Зірка B означає, що, випадково говорю?
>> Перейдіть в папку.
Так йдуть вперед і знайти нам, що в точці 127.
ОК.
Звичайно, в положення 127, колишнього значення 2.
Так чого ж ви тепер збираєтеся зберігати при Що б не було на місці в?
Так зірки кошти йдуть на місце.
Що таке розташування?
>> Саме так.
Так що тепер, якщо ви хочете змінити що в цьому місці -
Я буду йти вперед і запустити Ластик тут.
І тепер повернути його на кисті.
Який номер ви збираєтеся написати в цьому порожнє поле зараз?
>> Саме так.
Так що цей рядок коду, щоб було ясно - нехай мені перерватися, що Чарлі робить і
відзначити тут, що він тільки що зробили це написати в цю коробку в розташуванні 123
значення, яке було раніше в б.
І тому ми зараз дійсно реалізовано цей другий рядки коду.
>> Зараз, на жаль, є ще одна лінія залишається.
Тепер те, що в темп, в буквальному сенсі?
Очевидно, що це номер один.
Це не адресу.
Це просто числа, роду змінну з одного тижня.
>> І тепер, коли ви говорите, зірки B, це означає, що перейти за адресою B, яка має
Звичайно тут.
Тому, як тільки ви отримаєте там -
Я буду йти вперед і стерти те, що насправді там - і що ви
збираюся написати нової позиції 127?
>> ЧАРЛІ: Темп, який є одним.
>> DAVID мала: Темп, який є одним.
І що відбувається з температурою в кінці кінців?
Ну, ми не знаємо.
Ми дійсно не піклуються.
Кожен раз, коли ми реалізували функцію Досі всіх локальних змінних у вас є
дійсно є локальними.
І вони просто зникають.
Вони утилізований в операційній система в кінцевому підсумку.
>> Таким чином, той факт, що температура і раніше має Значення 1 є свого роду принципово
нецікаві.
Гаразд, оплески якби ми могли для Чарлі.
Дуже добре зроблено.
>> Гаразд, так про що ще робить це означає, що ми можемо зробити?
Ось і виходить, що ми були говорити кілька білих брехні
протягом досить довгого часу.
Справді, виходить, що рядок, весь цей час, насправді не
послідовність символів, як таких.
Це частково є те, що інтуїтивно.
>> Але з формальної точки зору, рядок Тип даних, який ми оголосили всередині
CS50 бібліотеку для спрощення світу протягом перших декількох тижнів класу.
Яка рядок дійсно є адресою символу десь у пам'яті.
Рядок дійсно номер, наприклад, 123 або 127, що відбувається, щоб розмежувати
де рядок починається в комп'ютера пам'яті.
>> Але вона не представляє рядок, по суті, себе.
І ми бачимо це в такий спосіб.
Дозвольте мені йти вперед і відкривати деякий код, який серед
джерело сьогоднішніх прикладів коду.
І я збираюся йти вперед і відкрити до, скажімо, порівняти-0.c.
Це програма, яка баггі збирається повинні бути реалізовані таким чином.
>> Перша.
Я збираюся дещо сказати.
Тоді я буду йти вперед і отримати рядок від користувача
, Що в наступному рядку.
Тоді я збираюся сказати це знову.
Тоді я йду, щоб отримати іншу рядка від користувача.
>> І зауважте, я показую один з рядка в змінної с, а
інший з цих рядків у змінній T.
І тепер я збираюся стверджувати, дуже розумно, що якщо з одно дорівнює т,
рядка однакові.
Ви вводите те ж саме.
В іншому випадку, рядки не те ж саме.
>> Зрештою, якщо ми введемо два цілих, два символи, двома поплавками, два двомісних, будь-який з
типи даних ми говорили про до цих пір їх порівнювати -
пам'ятаю ми дуже чітко деякий час тому що ви не робите цього, бо
один знак рівності, звичайно, оператора привласнення.
Так що було б помилкою.
>> Ми використовуємо рівну знак рівності, які дійсно порівнює
речі для справжньої рівності.
Але я стверджую, що це дитяча коляска.
Якщо я йду вперед і зробити порівняння нулю, і тоді точка слеш порівняти нулю.
І я ввести, скажімо, здравствуйте.
А потім скажемо ще раз привіт.
Буквально те ж саме, комп'ютер претензії я набрав різні речі.
>> Тепер, можливо я просто друкарські помилки.
Я буду введіть своє ім'я в цей раз.
Я маю на увазі, здравствуйте.
Здравствуйте.
Це різні кожен раз.
>> Ну, чому ж?
Що відбувається насправді під капотом?
Ну, те, що відбувається насправді під Капот Рядок тепер
Я набрав в той перший раз, наприклад, це слово привіт, звичайно.
Але якщо уявити це під капот, нагадаємо, що
рядок у масиві.
І ми так і сказав у минулому.
>> Так що, якщо я малюю цей масив, як це, я буде представляти щось зовсім
подібний до того, що ми зробили хвилину тому.
І насправді те спеціальні і тут.
Що ми визначити було в в кінці кожного рядка?
Так, ця нульова зворотна коса риска, яка є тільки спосіб представлення,
буквально, 00000000.
Вісім біт 0 в ряд.
>> Я не знаю, чесно кажучи, Що після цього.
Це просто купа більше оперативної пам'яті всередині мого комп'ютера.
Але це масив.
Ми говорили про масивах раніше.
І ми зазвичай говоримо про масивах як розташування нулю,
то один, то два.
Але це тільки для зручності.
І це абсолютно відносне.
>> Коли ви насправді отримати пам'ять з комп'ютер, то, звичайно, будь
2000000000 байт якоїсь дивної, потенційно.
Так насправді під капотом, Весь цей час, так.
Це цілком може бути кронштейн нулю.
Але якщо копнути ще глибше під капот, що насправді
Номер адреси 123.
Це адреса 124.
Це адреса 125.
>> І я не облажався на цей раз.
Це тепер один байт один від одного з якої причини?
Наскільки велика символ?
Символ є тільки один байт.
Цілочисельне, як правило, чотири байти.
Так ось чому я зробив це 123, 127, 131 і так далі.
Тепер я можу тримати просту математику і вобще плюс 1.
І це тепер, що насправді відбувається на під капотом.
>> Тому, коли ви розкажете щось на зразок цього, Рядок з, це насправді -
виходить -
символ зірки.
Star, звичайно, означає адреса, інакше покажчик.
Так що це адреса щось.
Що це адреса?
>> Ну -
Я єдиний, хто може бачити дуже Важливий момент я роблю, або думати
Я роблю.
Так рядок -
Сумно те, у мене є монітор саме там, де я
можливо, не бачив цього.
>> Гаразд, так що рядок є те, що з Я оголосив раніше.
Але, виявляється, завдяки невеликій магії в бібліотеці CS50, все це
Рядок часу буквально був символ зірки.
Зірки знову означає, покажчик або адреси.
Той факт, що це флангові Слово символ означає, що це
адреса символу.
>> Так що якщо взяти мотузку називається, і я друкую У H-Е-Л-Л-О, пропонувати те, що зараз отримати
Рядок буквально повертали всі на цей раз, хоча ми досить
спрощеному світі?
Що насправді отримати рядок повернутися в якості значення, що повертається?
>> 123 в цьому випадку, наприклад.
Ми раніше заявили, що взяти мотузку просто повертає рядок, послідовність
символів.
Але це трохи білої брехнею.
Спосіб отримати рядок дійсно працює Під капотом він отримує
рядка від користувача.
Він шльопає символів, які він чи вона типу в пам'яті.
Це ставить зворотну косу риску Нуль в кінці тих послідовності символів.
>> Але тоді що ж взяти мотузку буквально повернути?
Це буквально повертає адресу перший байт в оперативній пам'яті, що
вона використовувала для цього сили.
І виходить, що тільки шляхом повернення однієї адреси
перший символ у рядку, тобто достатній для знаходження сукупності
рядка.
>> Іншими словами, отримують рядок не має повернути 123 і 124 і 125.
Він не повинен дати мені довгий Список всіх байтів, які
моя рядок використовує.
Тому що, вони все спиною до спини.
І два, заснованої на перший адресу, я можу зрозуміти, де рядок закінчується.
Яким чином?
>> Спеціальний символ порожній, Зворотна коса риса нуля в кінці.
Отже, іншими словами, якщо Ви передаєте навколо -
всередині змінних -
адреса голець, і ви припускаєте, що наприкінці будь-якого рядка, будь
послідовність символів, що ми, люди, думаю рядків, якщо припустити, що
в кінці будь-якого такого рядок є нулю зворотну косу риску, ви золотий.
Тому що завжди можна знайти кінця рядка.
>> Тепер те, що насправді то при переході в цій програмі?
Чому ця програма, порівняти-0.c, баггі?
Що насправді порівнюється?
Так?
>> СТУДЕНТ: [нерозбірливо].
>> DAVID мала: Абсолютно вірно.
Це зіставлення струн.
Таким чином, якщо користувач ввів Вітаю ще, як я зробив, пам'ять може в кінцевому підсумку
в такому вигляді.
Якщо користувач потім типів Вітаю ще раз, але по телефону отримати рядок знову, з-
не дуже розумний, якщо ви вчите це бути розумним шляхом написання коду.
>> C -
і комп'ютерів у цілому -
Якщо ви введете слово ще раз привіт, Ви знаєте, що ви збираєтеся отримати.
Ти просто збираюся отримати другий масив пам'яті, що, так, буває бути
зберігання H-E-L-L-виводу і так далі.
>> Це буде виглядати так само, щоб нас, людей, але цей адресу
не може бути 123.
Це може бути просто так сталося, що операційна система має деякі доступні
просторі, наприклад, на місці -
щось скажемо довільне, як це розташування в 200.
І це осередок 201.
І це розташування 202.
Ми поняття не маю, де це буде в пам'яті.
>> Але що це означає, що те, що будуть зберігатися в кінцевому рахунку, в с?
Номер 123.
Що буде зберігатися в т, У цьому прикладі довільної?
Номер 200.
І все це означає, що те, очевидно, 123 не дорівнює 200.
І так, якщо це умова ніколи оцінюється як істина.
Тому що взяти мотузку використовують різні ділянок пам'яті кожного разу.
>> Тепер ми можемо бачити це знову в іншому прикладі.
Дозвольте мені йти вперед і відкривати копіювання 0.c.
Я стверджую, що цей приклад буде спробувати - але не в змозі - для копіювання двох рядків
наступним чином.
>> Я збираюся сказати щось користувачеві.
Я тоді збирався отримати Рядок і назвіть його с.
І тепер, я роблю це тут галочку.
Ми згадали це деякий час назад.
Але коли могли б отримати порожній рядок повернення, іншого спеціального символу або спеціальних
Символ скажімо так.
Якщо це з пам'яті.
>> Наприклад, якщо користувач дійсно бути важким і види звірячих
Кількість символів в Клавіатура і хітів Enter.
Якщо ця кількість символів, просто не можу поміститися в оперативній пам'яті з якоїсь божевільної
Причина, добре отримати рядок може дуже добре повертає нуль.
>> Або, якщо ваша програма сама робить багато інших речей, і є тільки
Бракує пам'яті для отримую рядок щоб домогтися успіху, це може скінчитися
тим, що повернувся порожнім.
Але давайте будемо більш точними щодо того, що це таке.
Що таке тип даних з насправді?
Char зірки.
>> Ось і виходить, тепер ми можемо шкірки тому шар нульових.
Виявляється, NULL - так, очевидно, спеціальний символ.
Але що це таке насправді?
Дійсно, NULL просто символ, що ми люди використовують для заміни нуля, а також.
>> Таким чином, автори С, і комп'ютери більш загально, вирішив років тому
, Що, ви знаєте, що.
Чому б нам не забезпечити, щоб ні користувач Дані ніколи, ніколи, ніколи
зберігати при побачення нулю?
Справді, навіть у моєму прикладі довільного раніше, я не почала нумерації
байт в нулі.
Я почав працювати в одному.
Я знав, що люди в світі вирішили залишаємо за собою нуля
байт в оперативній пам'яті, як нікому щось особливе.
>> Причина в тому, в будь-який час ви хочете сигнал, що щось пішло не так
щодо адрес, повертається нульовий - інакше відомий як нульове -
І тому, що ви не знаєте, що немає ніякої законні дані з нульового адреси, чітко
це означає, що повідомлення про помилку.
І саме тому ми, за угодою, перевірити за те, нульовий і зворотного
як один в таких випадках.
>> Тому, якщо ми прокрутити вниз зараз, це всього лише Потім обробку помилок, про всяк випадок
щось пішло не так з [? заставу?]
в цілому і вийти з програми , Повернувшись рано.
Ця лінія в даний час може бути переписана як це, що означає, що?
На лівій стороні, дайте мені ще покажчик на символ, і назвемо його T.
Що я зберіганні всередині т, заснованих на цій одного рядка коду?
>> Я запис місця розташування.
Зокрема розташування , Яка була в с.
Таким чином, якщо користувач ввів привіт, і що перший привіт відбувається в кінцевому підсумку
тут, то число 123 збирається повернутися з отримати
рядок і зберігати -
Як ми говорили раніше -
в с.
>> Коли я оголошую покажчик на інший символ і називають це т, що число
буквально буде в кінцевому підсумку в T відповідно з історією?
Так 123.
>> Так що технічно тепер обидва с і т вказують на точне
той же ділянок пам'яті.
Так помітити, що я збираюся зробити зараз, щоб довести, що ця програма глючить.
>> Спочатку я збираюся стверджувати, з Друк F, спекулюючи
копія рядка.
Тоді я збираюся зробити слабкий перевірка на наявність помилок.
Я йду, щоб переконатися.
Давайте переконався, що рядок T знаходиться в міру більше нуля в довжину,
так що є деякий характер насправді вигоду.
>> І тоді ви, можливо, пам'ятаєте це від попередніх прикладах.
2 верхні - який знаходиться в ctype.h файлу.
T Кронштейн нуля дає мені нулю символ рядка т.
І два верхніх того ж вартості, Звичайно, перетворює його у верхній регістр.
>> Так інтуїтивно, завдяки виділеній лінії коду робить ставку першим
Лист у т.
Але це не капіталізація, інтуїтивно, перша буква в с.
Але якщо ви думаєте вперед, те, що я дивитися, коли я запускаю цю програму
і роздрукувати як оригінальні, сек, і так звані копії, т?
>> Вони насправді буде те ж саме.
І чому вони буде те ж саме?
Вони обидва вказують на рівно те ж саме.
Так давайте зробимо це.
>> Зробіть копію нулю.
У ньому зібрана OK.
Дозвольте мені запустити копію нулю.
Дозвольте мені що небудь типу привіт в усі малі потім натисніть Enter.
І він стверджує, що і з оригінальним та копія дійсно ідентичні.
>> Так що насправді відбулося?
Дозвольте мені перемалювати цю картину просто щоб розповісти історію в
трохи інакше.
Що відбувається насправді під капот, коли я заявляю, щось на зразок
символ початку с, або рядок з, Я отримую покажчик -
який, виявляється, чотири байти У CS50 приладу
і у великій кількості комп'ютерів.
І я буду називати це с.
І це в даний час має невідомого значення.
>> Коли ви не розкажете змінну, якщо Ви себе підставляти значення там, які
знає, що там.
Це може бути деякої випадкової послідовності бітів з попереднього виконання.
Тому, коли я, на мою рядок коду дійсно отримуємо рядка, а потім зберігання повертається
значення в рядок з так чи інакше отримати -
і ми в кінцевому рахунку відігніть як отримати Рядок робіт, так чи інакше виділяє
масив, який, ймовірно, виглядає як-небудь так.
H-E-L-L-О, зворотний слеш нулю.
>> Давайте припустимо, що це адреса 123 тільки перша послідовність.
Так що рядок повертається, в Виділена рядок є, він повертає
числа ми вже говорили, 123.
Так що ж насправді відбувається всередині з тут?
>> Ну, що дійсно відбувається Всередині з 123.
Але, відверто кажучи, я отримую трохи бентежать всі ці адреси,
всі ці довільні числа.
123, 124, 127.
Так що давайте насправді спрощення світі небагато.
>> Коли ми говоримо про покажчики, чесно кажучи, для нас, людей, хто, чорт візьми, де піклується
речі в пам'яті?
Це абсолютно довільно.
Це залежатиме від того, обсяг оперативної пам'яті у користувача.
Це залежатиме від того, коли в той же день ви запустите програму, мабуть, і
що введені користувачем дані, дає тобі.
Ми зупиняючись на несуттєвих деталей.
>> Так що давайте абстрагуватися від і сказати, що, При виконанні рядки коду, як це,
символ зірки з отримує повертається Значення взяти мотузку.
Чому б нам не просто намалювати, а не те, що ми дзвонять покажчик, як ніби це
, Вказуючи на щось?
Тому я стверджую, що зараз с до є вказівник -
під капотом, що це адреса.
Але це всього лише вказує на перший байт
рядок, яка була повернута.
>> Якби я зараз повернутися до коду тут, що відбувається на цій лінії?
Ну, в цій виділеній лінії зараз, Я оголошую мабуть інше
змінну T.
Але це також покажчик, так що я збираюся намалювати її, так як в теорії, точне
ж розміру коробки.
І я буду називати його T.
>> І тепер, якщо ми повернемося до коду знову, коли я з зберігання всередині т,
те, що я технічно покласти всередину T?
Ну технічно це був номер 123.
Так насправді я повинен писати номер 123 там.
Але давайте це більш високий рівень.
т, якщо це тільки покажчик Інтуїтивно, є саме це.
Це все, що буття там зберігаються.
>> Так що тепер в останні цікаві рядки коду, коли я насправді йти про
капіталізації символ нуль в т, що відбувається?
Ну, т кронштейна нуля тепер вказує до того, що характер, мабуть?
>> Це вказує на годину.
Оскільки T Кронштейн нуля -
Нагадаємо, що це старий синтаксис. т кронштейна нуля просто означає, що якщо T є рядок, т
Кронштейн нуля означає отримання нульової символ в цю силу.
Так що це дійсно означає це зайти в цей масив -
і так, це може бути 123, це може бути 124.
Але це все відносно, пам'ятаю.
Всякий раз, коли говорять про масиві, у нас є Перевага говорити про
відносні показники.
>> І ось тепер ми можемо просто припустити, що Zero T кронштейн ч.
Так що, якщо я називаю 2 верхніх на це, що це дійсно робите робить ставку
рядкова год в верхній H. Але, звичайно, те, що з?
Це вказує на те ж кляте рядок.
>> Так що це все, що відбувалося У цьому коді досі.
Так в чому ж тоді наслідки?
Як це виправити ці дві проблеми?
Як ми можемо порівняти з фактичними рядками?
>> Ну інтуїтивно, як би ви йдете з приводу порівняння двох
Струни для справжньої рівності?
>> Що означає, якщо два рядки рівні?
Очевидно, що ні, що їх адреси рівними в пам'яті, тому що це низько
Рівень деталізації реалізації.
Усі символи є однаковими.
Отже, дозвольте мені запропонувати, і дозвольте мені представити у версії одного з compare.c
тут, так що порівняти-1с.
>> Дозвольте мені запропонувати, що ми все ще отримуємо Покажчик називається с, і магазин в ньому
повернути значення взяти мотузку.
Давайте зробимо те ж саме з T.
І ніхто з коду не відрізняються.
Я збираюся додати трохи більше перевірки помилок зараз.
Так що тепер, коли ми начебто відшаровування це шарами в CS50, що рядок
насправді, ми повинні бути більш анальний про те, що ми не зловживайте
неприпустимі значення як нульові.
>> Так що я просто збираюся перевірити.
Якщо їй не дорівнює таким, що втратив Т НЕ рівним нульовою, це означає, що ми в порядку.
Взяти мотузку не облажався отриманні будь-який з цих рядків.
І ви, можливо, може думаю зараз, що зовсім STR CMP імовірно робити?
Порівняння рядків.
>> Так що якщо ви в програмі Java і колись, Це схоже на рівних методу в
Рядок класу.
Але для тих з вас, хто не запрограмовані перш,
це всього лише функція с.
Це відбувається, щоб прийти в файл з ім'ям string.h.
Ось де вони оголошені.
>> І порівняння рядків -
Я насправді забувають його використання, але це не важливо.
Нагадаємо, що ми можемо зробити Людина, перемішати порівняння.
І це буде виховувати Linux Керівництво програміста.
І це, чесно кажучи, трохи загадковим.
Але я бачу тут, що, так.
Я повинен включити string.h.
>> І тут кажуть, під описом " Функція порівняння рядків порівнює
два рядки S1 і S2. "І S1 і S2 мабуть, є два
Аргументи, що передаються дюйма
Я не пам'ятаю, що константа має значення, але тепер помічаю -
і ви, можливо, бачили це вже тоді, коли ви використовувати довідкові сторінки, якщо ви
все це є -
символ, що зірка просто синонімом мотузкою.
>> Так він порівнює два рядки, S1 і S2, і повертає ціле число
або рівну або більше нуля якщо S1 знаходиться, відповідно, бути
менше або збігаються, або бути більше, ніж S2.
Ось тільки дуже складний спосіб сказати що порівняння рядків повертається
нулю, якщо два рядки інтуїтивно ідентичні, символ для
символ на символ.
>> Це повертає від'ємне число, якщо с, в алфавітному порядку, передбачається
постати перед Т.
Або повертає позитивне число, якщо и повинні йти за Т
в алфавітному порядку.
Так що з цієї простої функції, міг Ви, наприклад, сортувати
цілу купу слів?
>> Так що в цій новій версії, я збираюся йти вперед і зробити compare1.
Dot порівняти одну рису.
Я буду вводити привіт в нижньому регістрі.
Я збираюся ввести привіт в нижньому регістрі знову.
І на щастя тепер він розуміє, Я надрукував те ж саме.
>> Тим часом, якщо я друкую в привіт до зниження випадку і привіт у верхньому регістрі і
порівняти їх, я набрав різні речі.
Оскільки не тільки адреси різні, але ми порівнюємо
різні персонажі знову і знову.
>> Ну давайте і виправити одну Тепер інша проблема.
Дозвольте мені відкрити версію одного з копію, яка тепер адресує
це питання наступним чином.
А це буде виглядати трохи більш складною.
Але якщо ви думаєте про те, що проблема, яку ми потрібно вирішити, ми сподіваємося, це буде
очистити всього за момент.
>> Таким чином, це перший рядок, символ початку т, в З точки зору непрофесіонала може хтось запропонує
те, що ця лінія тут означає?
Char зірки т, що ж це робиш?
>> Добре.
Створити покажчик на деякий місце в пам'яті.
І дозвольте мені уточнити його небагато.
Оголосіть змінну, яка буде зберігати адресу деяких символів в пам'яті, просто
бути трохи більш правильним.
>> Отже, тепер на правій стороні, у мене ніколи не бачив одну з цих функцій
раніше, Malloc.
Але що ж це значить?
Розподіл пам'яті.
Розподілу пам'яті.
>> Так що не виходить, досі, ми дійсно не було потужним способом
просить операційну систему, дати мені деяку пам'ять.
Швидше, у нас тепер є функція під назвою Malloc, що робить саме це.
Навіть якщо це трохи відволікання прямо зараз, відзначимо, що в
між двома дужках просто буде поруч.
Де я набрав у питанні мітки можуть бути числом.
>> І це число означає, дайте мені 10 байт.
Дайте мені 20 байт.
Дайте мені 100 байт.
І Malloc зробить все можливе, щоб просити операційної системи -
Linux, в даному випадку -
Ей, а їх 100 байт доступної оперативної пам'яті?
Якщо так, то повернути ці байти мені повернення адреса якого з
ці байти, чи що?
Найперший.
>> Так і тут - і це переважне в C, в будь-який час ви
справа з адресами?
Ви майже завжди маємо справу з Перший такий адресу, незалежно від того, наскільки велика
шматок пам'яті ви в даний час повернув, так би мовити.
>> Так давайте приступимо тут.
Я намагаюся виділити як кількість байт, точно?
Ну.
Довжина рядка з - давайте робити конкретний приклад.
Якщо їй це привіт, Н-Е-Л-Л-О, що довжина рядка з, очевидно?
Так що це п'ять.
Але я роблю плюс 1 про те, чому?
Чому я хочу шість байтів замість п'яти?
Нульовий символ.
>> Я не хочу кинути цю спеціальні нульовим символом.
Тому що якщо я зробити копію Привіт і просто робити H-E-L-L-O, але я не ставлю
, Що спеціальний символ, комп'ютер не могли б, випадково, зворотну косу риску
нулю там для мене.
І тому, якщо я намагаюся з'ясувати, довжину копії, я міг би думати, що
це 20 символів, або мільйон символів, якщо я просто ніколи не трапиться
вдарити зворотну косу риску нулю.
>> Так що нам потрібно шість байт H-E-L-L-О, зворотний слеш нулю.
А потім це просто бути супер анальний.
Припустимо, що я забув, що розмір символів є.
Ми постійно говорять, що це один байт.
І це зазвичай.
У теорії, це може бути щось різними, на іншому комп'ютері або
інший комп'ютер.
>> Ось і виходить, що є цей оператор називається SizeOf, що якщо ви передаєте його
ім'я типу даних - як вугілля або Інтелект, або поплавець -
він скаже вам, динамічно, скільки байт символ займає на цьому
конкретного комп'ютера.
>> Так що це просто ефективно як кажуть раз 1 або
Не раз взагалі нічого.
Але я роблю це тільки, щоб бути супер анал, , Що на всякий випадок символ відрізняється
на ваш комп'ютер в порівнянні з моїм, таким чином, математика завжди буде перевірити.
>> Нарешті, тут я перевіряти нульові, яка завжди хороша практика - знову ж,
Будь-коли ми маємо справу з покажчиками.
Якщо Malloc не був у змозі дати мені шість прощань - що
малоймовірно, але про всяк випадок -
повернутися негайно.
А тепер, йти вперед і скопіювати рядка таким чином.
І це знайомий синтаксис хоча і в іншій ролі.
>> Я збираюся йти вперед і отримати рядок довжина с і зберігати його російською мовою.
Я тоді збирався я від ітерації дорівнює нуля аж до N,
більше або дорівнює.
Так що на кожній ітерації, я поставив го характеру з в го
Характер T.
>> Так що ж насправді відбувається під капотом тут?
Добре, якщо це, наприклад, в с -
і я набрав у слові H-Е-Л-Л-О і є зворотний слеш нулю.
І знову ж, це вказує тут.
І ось тепер це т.
>> І це вказує зараз копію пам'яті, правильно?
Malloc дав мені цілу шматок пам'яті.
Я не знаю, що спочатку У будь-якому з цих місць.
Так що я буду думати про них як про цілу купу знаків питання.
>> Але як тільки я починаю цикл від нуля далі, аж до довжини S, T
Кронштейн нуля і кронштейном 1 т -
і я покладу це зараз на верхньому -
T Кронштейн нуля і з нульовим середнім кронштейном , Що я збираюся бути копіюванням
итеративно год тут, E-L-L-O. Плюс, тому що я зробив плюс
1, зворотну косу риску нулю.
>> Так що тепер у разі порівняти-1с, Зрештою, якщо я роздрукувати
Капіталізація т, ми повинні бачити, що з не змінюється.
Дозвольте мені тепер йти вперед і робити це.
Тому переконайтеся, copy1.
Dot слеш copy1.
Я збираюся ввести привіт, Enter.
А тепер зверніть увагу, тільки копію були капіталізовані.
Тому що я дійсно є два ділянок пам'яті.
>> На жаль, ви можете зробити деякі досить погане і досить небезпечні речі.
Дозвольте мені підтягнути приклад тут і зараз, що дає нам приклад кілька
різних ліній.
Так що просто інтуїтивно тут, перша лінія коду, внутр зірку х, заявляє
змінну х.
І те, що тип даних цієї змінної?
Який тип даних цієї змінної?
Це не було захоплюючим.
>> Тип даних десяткового зірки.
Так що ж це значить? X буде зберегти адресу Int.
Ось як все просто.
Y ми збираємося зберігати адреса Int.
Що таке третя лінія коду там робить?
Це розподіл, скільки байт, швидше за все?
Чотири.
Через розміру десяткового це взагалі чотири, Malloc з чотирьох дає
мені назад адресу шматок пам'ять, перший з яких байт
зберігається нині в х.
>> Зараз ми рухаємося трохи швидше.
Зірка X означає, що?
Це означає, піти на цю адресу і покласти те, що число є?
, Число 42 є.
Зірка Y означає йти до того, що при у , А також номер 13 там.
>> Але почекайте хвилину.
Що знаходиться в Y на даний момент?
Який адреса у зберіганні?
Ми не знаємо, вірно?
Ми жодного разу не використовувати призначення оператор, що містить у.
Так у яке зазначено на другій лінії код лише деякі сміття значення, великий
знак питання, так би мовити.
Воно може вказувати випадковим ні до чого в пам'яті, яка
, Як правило, погано.
>> Тому, як тільки ми потрапили цю лінію там, зірки Y дорівнює 13, щось погане,
щось дуже погане становить близько трапитися з Бінкі.
Отже, давайте подивимося, що буде в кінцевому підсумку відбувається з Бінкі тут, в цю хвилину
або так подивитися.
>> [ВІДТВОРЕННЯ ВІДЕО]
>> -Ей, Бінкі.
Прокинутися.
Це час для покажчика весело.
>> -Що це?
Дізнайтеся про покажчики?
О, позитивний герой.
>> -Ну, для початку, я думаю, ми знадобиться пару покажчиків.
>> -OK.
Цей код виділяє два покажчика які можуть вказувати на цілі числа.
>> -Добре, добре, я бачу два покажчика.
Але вони, здається, не бути вказуючи ні до чого.
>> -Це вірно.
Спочатку, вказівник не вказує ні на що.
Те, що вони вказують на називаються pointees, і їх створення є
окремий крок.
>> -Ах, так, точно.
Я знав, що.
Pointees роздільні.
Отже, як ви розподіляєте pointee?
>> -OK.
Ну, цей код створює новий цілі pointee, і ця частина множини Х
, Щоб вказати на це.
>> -Ей, це виглядає краще.
Так що зробіть це щось робити.
>> -OK.
Я разименовать х для зберігання 42 числа в свій pointee.
Для цього трюку, мені знадобиться моя магія Жезл разименованія.
>> -Ваша чарівна паличка разименованія?
Е-е, це здорово.
>> -Це те, що код виглядає наступним чином.
Я просто встановити кількість, і -
>> -Ей, подивися.
Там вона йде.
Так роблять разименованія на X наступним стрілки для доступу до pointee.
У цьому випадку, для зберігання 42 в там.
Ей, спробуйте використовувати його, щоб зберегти номер 13 через інший покажчик, у.
>> -OK.
Я просто піду сюди, щоб у і отримати число 13 створена.
А потім взяти паличку разименованія і просто -
Ух ти!
>> -О, привіт.
Це не спрацювало.
Скажімо, Бінкі, я не думаю, разименованія Y є гарною ідеєю,
Оскільки настройка pointee є окремої стадії.
І я не думаю, що ми коли-небудь робили це.
>> -Хм.
Хороше питання.
>> -Так, ми виділили у покажчика.
Але ми ніколи не встановити його на вказувати на pointee.
>> -Хм.
Дуже спостережливі.
>> -Ей, ви шукаєте Добре там, Бінкі.
Ви можете це виправити, так що у пунктів до того ж, як pointee х?
>> -Звичайно.
Я буду використовувати мою чарівну паличку присвоювання покажчика.
>> -Хіба що буде проблема, як раніше?
>> -Ні.
Це не стосується pointees.
Це просто змінює один покажчик, щоб вказати до того ж, як інший.
>> -О, я бачу.
Тепер у вказує на тому ж місці, х.
Так що чекайте.
Тепер у фіксоване.
Вона має pointee.
Таким чином, ви можете спробувати паличку разименованія знову
відправити по 13.
>> -OK.
Тут йде.
>> -Ей, подивися на це.
Тепер разименованія робіт з у.
І тому, що покажчики поділяються що один pointee, вони
обидва бачать 13.
>> -Так.
Обмін.
Яка різниця.
Так що ми будемо тепер міняються місцями?
>> -О, дивись.
У нас немає часу.
>> -Але -
>> -Просто пам'ятайте, три Покажчик правил.
Номер один, основна структура є те, що у вас є вказівник.
І він вказує до pointee.
Але покажчик і pointee роздільні.
А поширена помилка полягає в створити покажчик, але
забудьте дали pointee.
>> Номер два, разименованія покажчика починається на покажчик, слідуючи своєму
стрілкою на доступ до його pointee.
Як ми всі знаємо, це працює тільки, якщо є є pointee, яка повертається до
Правило номер один.
>> Номер три, присвоювання покажчика один покажчик і змінює його, щоб вказати на
pointee ж як ще один покажчик.
Таким чином, після призначення, два покажчика буде
вказувати на той же pointee.
Іноді це називається обмін.
А ну, от і все, насправді.
Прощай, прощай, зараз.
>> [КІНЕЦЬ відеовідтворення]
>> DAVID мала: Так більше на покажчики, більше на Бінкі наступного тижня.
Побачимося в понеділок.