>> [Грає музика]
>> ДАГ Lloyd: Покажчики, ось ми тут.
Це, ймовірно, буде найбільш важка тема
що ми говоримо про в CS50.
І якщо ви читали що-небудь про покажчиків
перш ніж може бути трохи залякати вдаючись у цьому відео.
Це правда покажчики дозволяють вам можливість
щоб, можливо, зіпсувати дуже погано, коли ви
Для роботи з змінними та даними, і викликаючи ваша програма до краху.
Але насправді вони дійсно корисні і вони дозволяють нам дійсно відмінний спосіб
для передачі даних і назад вперед між функціями,
що ми в іншому випадку не в змозі зробити.
>> І так, що ми насправді хочу зробити тут поїзд
Ви мати хорошу покажчик дисципліни, так що ви можете ефективно використовувати покажчики
щоб зробити ваші програми, які набагато краще.
Як я вже сказав покажчики дають нам різні спосіб передачі даних між функціями.
Тепер, якщо ви пам'ятаєте з раніше відео, коли
ми говоримо про Мінлива сфера, я згадав
що всі дані, які ми пройти між Функції в С передаються за значенням.
І я не міг використовувати, що Термін, що я мав на увазі там
було те, що ми передаємо копії даних.
Коли ми передати змінну в функцію, ми насправді не передаючи змінну
функції, чи не так?
Ми передаючи копію що дані функції.
Функція робить те, що він буде і він обчислює деяке значення,
і, можливо, ми використовуємо це значення коли він дає його назад.
>> Був одним винятком це правило передачі за значенням,
і ми повернемося до того, що, що трохи пізніше в цьому відео.
Якщо ми використовуємо покажчики замість використання змінних,
або замість використання змінних Самі або копії змінних,
Тепер ми можемо перейти змінні навколо між функціями по-іншому.
Це означає, що якщо ми зробимо зміна в одній функції,
що зміна буде насправді взяти ефект в іншому функції.
Знову ж таки, це те, що ми не могли зробити раніше,
і якщо ви коли-небудь намагалися поміняти місцями Значення двох змінних у функції,
Ви помітили, цю проблему зразок підкрадається, вірно?
>> Якщо ми хочемо, щоб поміняти X і Y, і ми передати їх функції під назвою підкачки,
усередині функції своп Змінні зробити валютні цінності.
Людина стає два, два стає , Але ми насправді не
нічого змінити в оригіналі Функція, в зухвалому.
Тому що ми не можемо, ми тільки роботи з їх копій.
З покажчиками, хоча, ми можемо насправді проходять X і Y у функцію.
Ця функція може зробити щось з ними.
І ці змінні значення може реально змінити.
Так що цілком зміна наша здатність працювати з даними.
>> Перш ніж ми заглибимося в покажчики, я думаю, що це коштує
приймаючи кілька хвилин до повернутися до основ тут.
І є подивимося, як Роботи пам'яті комп'ютера
тому що ці дві теми йдуть насправді досить взаємопов'язані.
Як ви, напевно, знаєте, на вашому комп'ютері
у вас є жорсткий диск або можливо, твердотільний накопичувач,
свого роду місце для зберігання файлів.
Це, як правило, десь у околиця 250 гігабайт
, Може бути, пару терабайт зараз.
І це, де всі ваші Файли в кінцевому рахунку, жити,
навіть коли ваш комп'ютер вимкнений вимкнений, ви можете включити його назад на
і ви знайдете ваші файли є знову, коли ви перезавантажте систему.
Але диски, як жорсткий диск, з жорсткими, або твердотільний накопичувач, твердотільного накопичувача,
просто місце для зберігання.
>> Ми не можемо насправді нічого спільного з дані, які на жорсткому диску,
або твердотілим накопичувачем.
Для того, щоб реально змінити даних або перемістити його навколо,
у нас є, щоб перемістити його ОЗУ, оперативний пристрій.
Тепер ОЗУ, у вас є багато менше у вашому комп'ютері.
Ви можете мати десь в околиця 512 мегабайт
якщо у вас є старий комп'ютер, , Може бути, два, чотири, вісім, 16,
можливо, навіть трохи Більше того, гігабайт оперативної пам'яті.
Так от набагато менше, але це де всі летючі даних існує.
Ось де ми можемо щось змінити.
Але коли ми переходимо наш комп'ютер вимкнений, всі дані в оперативній пам'яті руйнується.
>> Так ось чому ми повинні мати жорсткий диск для більш постійного місця ній,
так, що вона буде exists- він дійсно погано, якщо ми щоразу
Виявилося наш комп'ютер вимкнений, кожен Файл в нашій системі був знищений.
Так ми працюємо всередині оперативної пам'яті.
І кожного разу, коли ми говоримо про пам'яті, в значній мірі, в CS50,
ми говоримо про пам'ять, а не на жорсткому диску.
>> Тому, коли ми перемістити речі в пам'ять, вона займає певну кількість простору.
Всі типи даних, які ми працюємо з
взяти різні кількість простору в пам'яті.
Таким чином, кожен раз, коли ви створити ціле змінна, чотири байти пам'яті
відведені в оперативній пам'яті, щоб ви може працювати з цим числом.
Ви можете оголосити число, змінити його, призначити його
до величини 10 збільшеним однієї, так далі і так далі.
Все, що має статися в Оперативної пам'яті, і ви отримаєте чотири байти
для роботи з для кожного ціле число, ви створюєте.
>> Кожен персонаж вам створити отримує один байт.
От тільки, скільки простору необхідно зберігати символ.
Кожен поплавок, реальна Кількість, отримує чотири байти
якщо це не подвійний точності з плаваючою точкою
число, яке дозволяє є більш точні або більше цифр
після десяткової крапки без втрати точності,
які займають восьмій байт пам'яті.
Довгі жадає, дійсно великі числа, також прийматимуть вісім байт пам'яті.
Скільки байт пам'яті у рядки займають?
Ну давайте шпильку в цьому питанні зараз, але ми повернемося до нього.
>> Отже, повернемося до цієї ідеї пам'яті як великий масив байт розміром осередків.
От і все, що є, це просто величезний масив комірок,
як і будь-який інший масив, який ви знайомі з і подивитися,
крім кожен елемент один байт.
І так само, як масив, кожен елемент має адресу.
Кожен елемент масиву має індекс, і ми
можна використовувати цей індекс, щоб зробити так званий довільного доступу в масиві.
Ми не повинні почати на початок масиву,
перебору кожен один її елемент,
щоб знайти те, що ми шукаємо.
Ми можемо тільки сказати, я хочу, щоб дістатися до 15-елемент або 100-стихія.
А можна просто в той номер і отримати значення, яке ви шукаєте.
>> Аналогічно кожна локація в пам'яті має адресу.
Так ваша пам'ять може шукати щось подібне.
Ось дуже мало шматок пам'ять, це 20 байт пам'яті.
Перші 20 байт, тому що мій адрес є на дні
0, 1, 2, 3, і так на всьому шляху до 19.
І коли я заявляю, змінних і коли я починаю працювати з ними,
система збирається встановити у бік деякий простір для мене
У цій пам'яті для роботи з моїми змінних.
Так що я міг би сказати, символ C дорівнює капітал Х. А що трапиться?
Ну система буде відкладіть для мене одного байта.
У цьому випадку вибрав номер байта чотири байти за адресою чотирьох,
і він збирається зберігати заголовна буква Н в там для мене.
Якщо я кажу, то швидкість INT межа дорівнює 65, це
збирається виділити чотири байт пам'яті для мене.
І це буде ставитися до тих, чотири байти, як єдине ціле
тому що те, що ми працюємо з являє собою ціле число тут.
І це буде зберігати 65 там.
>> Тепер уже я начебто кажу вам трохи брехні,
правильно, тому що ми знаємо, що комп'ютери працюють в двійковій системі.
Вони не розуміють, обов'язково, що столиця Н
або те, що 65 є, вони тільки зрозуміти бінарні, нулі і одиниці.
І так насправді, що ми там зберігати
не буква Н, і число 65, але швидше двійкові уявлення
його, що виглядати дещо як це.
І зокрема в контекст цілої змінної,
він не збирається просто плювати його в, він не збирається розглядати його як один чотирьох
байт шматок обов'язково, це насправді відбувається
щоб розглядати його як один байт чотирьох шматків, які могли б виглядати наступним чином.
І навіть це не зовсім вірно небудь,
через чогось під назвою порядок байт, який ми не
збирається отримати в даний час, але якщо вам цікаво, про,
Ви можете прочитати на трохи і великий порядок байт.
Але заради цього аргументу, заради цього відео,
давайте припустимо, що, в Те ,, як число 65 буде
бути представлені в пам'ять на кожній системі,
хоча це не зовсім вірно.
>> Але давайте насправді просто отримати позбутися всіх бінарних повністю,
і думати тільки про якість H і 65, це набагато простіше,
думати про нього, як що в людській істоті.
Гаразд, так воно і здається, може бути, трохи випадковим, що моя система I've-
не дати мені байт 5, 6, 7, і 8 для зберігання ціле число.
Там причина для цього теж, що ми не зможемо отримати в прямо зараз, але досить
сказати, що те, що Комп'ютер робить тут
Ймовірно, це хороший хід з його боку.
Щоб не дати мені пам'ять, що це обов'язково спиною до спини.
Незважаючи на те, що це збирається зробити це зараз якщо я хочу, щоб отримати інший рядок,
називається прізвище, і я хочу, покласти Ллойда там.
Я збираюся необхідно встановити один характер, кожна буква, що це
вимагатиме одна характер, один байт пам'яті.
Так що, якщо я міг би поставити Ллойда в моїй масиву як це я досить добре йти, вірно?
Чого не вистачає?
>> Пам'ятайте, що кожен рядок ми працюємо з в С закінчується зворотної косої межі нульовий,
і ми не можемо опустити, що тут, або.
Ми повинні відкласти один байт пам'яті для зберігання, що таким чином ми
знаєте, коли наша рядок закінчилася.
Отже, ще раз цю угоду з, як речі
з'являються в мощі пам'яті трохи випадковим,
але насправді, як більшість систем розроблені.
Для вибудувати їх за мультиплікаторами з чотирьох осіб, з причин, знову
що ми не повинні потрапити в прямо зараз.
Але це, так досить сказати, що після цих трьох рядків коду,
це те, що пам'ять може виглядати.
Якщо мені потрібно комірок пам'яті 4, 8 і 12, щоб тримати мої дані,
це те, що моя пам'ять може виглядати.
>> І тільки бути особливо педантичний ось, коли
ми говоримо про пам'ять адреси, як правило, ми
зробити це, використовуючи шістнадцяткові позначення.
Так чому б нам не перетворити все це від десяткової шістнадцятковій формі
тільки тому, що, як правило, це як ми називаємо пам'яттю.
Таким чином, замість того, щоб бути від 0 до 19, що ми маємо нульовий
х від нуля до нуля x1 зо три.
Ті 20 байт пам'яті, що ми Мати чи ми дивимося на на цьому зображенні
саме тут.
>> Таким чином, все, що було сказано, давайте відійти від пам'яті на секунду
і назад до покажчиків.
Ось найголовніше пам'ятати
як ми почали працювати з покажчиками.
Покажчик нічого більш адреси.
Я скажу це знову, тому що це те, що важливо,
покажчик нічого більш адреси.
Покажчики адреси в місцях в пам'яті, де змінні жити.
Знаючи, що вона стає, сподіваюся, трохи легше працювати з ними.
Інша справа, мені подобається щоб зробити, це є свого роду
діаграм візуально представляє те, що відбувається з різними рядків коду.
І ми будемо робити це пару раз на покажчики,
і коли ми говоримо про динамічну розподіл пам'яті, а також.
Тому що я думаю, що ці діаграми можуть бути особливо корисні.
>> Так що, якщо я говорю, наприклад, INT до в моєму коді, що відбувається?
Ну що ж відбувається в основному в Я отримую пам'ять відведених для мене,
але я навіть не хотів би думаю про це, як, що, я
подобається думати про нього, як ящик.
У мене є вікно, і це кольору зелений, тому що я
може поставити цілі числа в зелені коробки.
Якби це був персонаж, якого я може мати синій ящик.
Але я завжди кажу, якщо я створюю коробка, яка може тримати цілі
що коробка пофарбована в зелений колір.
І я беру постійний маркер і я пишу до на стороні.
Так у мене є коробка під назвою K, в якому я можу покласти цілі числа.
Тому коли я кажу Int K, це що відбувається в моїй голові.
Якщо я кажу, до дорівнює п'яти, що я роблю?
Ну, я ставлю п`ять в коробці, правильно.
Це досить просто, якщо Я говорю INT до, створити вікно під назвою K.
Якщо я кажу, до дорівнює 5, поставив п'ять у полі.
Сподіваюся, що це не надто багато стрибком.
Ось де справи йдуть трохи цікаво, хоча.
Якщо я кажу, INT * рк, добре, навіть якщо я не знаю, що це неминуче означає,
це явно є щось зробити з цілим числом.
Так що я збираюся пофарбувати це поле зелений іш,
Я знаю, що є щось зробити з цілим числом,
але це не саме по собі ціле, бо це INT зірка.
Там щось трохи відрізняється про нього.
Так участь ціле х, але в іншому випадку це
не надто відрізняється від те, що ми говорили.
Це коробка, її отримали ярлик, це носити ярлик рк,
і він здатний холдингу INT зірки, все, що це таке.
Вони щось робити з цілими числами, ясно.
Ось останній рядок, хоча.
Якщо я кажу, рк = & K, гей, що тільки що відбулося, вірно?
Так що це випадкове число, здавалося б, випадкові Кількість, викинуть в коробці.
Все, що є, рк отримує адреса к.
Так я дотримуюся, де до живе в пам'яті, його адреса, адреса його байт.
Все, що я роблю, я говорю це значення те, що я збираюся
покласти в моїй коробці під назвою рк.
І тому, що ці речі Покажчики і тому шукає
в рядку, як нульовий х восьмій нулів з семи чотирьох восьмій
другій нуль, ймовірно, не надто значущим.
Коли ми, як правило візуалізувати покажчики, ми насправді зробити це в якості покажчиків.
Рк дає нам інформацію ми повинні знайти K в пам'яті.
Так в основному рк має стрілку в ньому.
І якщо ми ходимо довжину цієї стрілкою, уявіть собі,
це те, що ви можете ходити по, якщо ми ходити уздовж стрілки,
на самому кінчику цього стрілки, ми буде знайти місце в пам'яті
де до життя.
І, що дуже важливо, тому що як тільки ми знаємо, де живе до,
ми можемо почати працювати з даними всередині цьому місці пам'яті.
Хоча ми отримуємо маленький біт попереду себе зараз.
>> Так що покажчик?
Покажчик є елемент даних якого значення адреса пам'яті.
Це було те, що нуль нуль восьмій х речі відбувається, це було адреса пам'яті.
Це було місце в пам'яті.
І тип покажчика описує вид
даних, які ви знайдете в що адреса пам'яті.
Так що це INT зірка частина правий.
Якщо я випливати, що стрілка, це збирається привести мене до місця.
І, що місце, що я знайдете там в моєму прикладі,
зелений кольори коробка.
Це ціле число, це те, що я знайдете, якщо я йду на цю адресу.
Тип даних для Покажчик описує те, що
Ви знайдете за цією адресою пам'яті.
Так от дійсно здорово річ, хоча.
Покажчики дозволяють перейти змінні між функціями.
А насправді передати змінні і не пройти їх копії.
Тому що, якщо ми точно знаємо, де в пам'яті, щоб знайти змінну,
ми не повинні зробити копію це, ми можемо просто піти в це місце
і працювати з цієї змінної.
Таким чином, по суті покажчиків роду з зробити комп'ютерну середу
набагато більше, як в реальному світі, вірно.
>> Так от аналогія.
Давайте припустимо, що у мене є ноутбук, праворуч, і він повний нотаток.
І я б хотів, щоб ви відновите його.
Ви це функція, яка Оновлення зазначає, право.
В дорозі ми були працює досі, те, що
відбувається, ви будете приймати мій ноутбук, Ви йдете в магазин, копіювання,
ви будете робити ксерокопію кожна сторінка записника.
Ви залишити свій ноутбук назад на моєму столі, коли ви закінчите,
ви будете йти і викреслити речі в моєму ноутбук, який застаріли або не так,
і тоді ви будете проходити назад мені стопку сторінок Xerox
що є точною копією мого ноутбука з зміни, які ви внесли в нього.
І в той момент, це до мене, як викликає функція, як абоненту,
щоб вирішити ваші замітки і інтегрувати їх назад в моєму блокноті.
Таким чином, є багато кроків участь тут, прямо.
Як це не було б краще, якщо я просто кажу, гей, ви можете
оновити ноутбук для мені, вручити вам мій ноутбук,
і ви берете речі і буквально перетнути їх
і оновлювати свої записи в блокноті.
А потім дати мені свій ноутбук назад.
Це зразок того, що покажчики дозволяють зробити,
вони роблять це оточення багато більш подобається, як ми працюємо в реальності.
>> Всі права, так ось що покажчик, давайте поговоримо
про те, як покажчики працюють в C, і як ми можемо почати працювати з ними.
Таким чином, є дуже простий покажчик в С називається нульовою покажчик.
Нульовий покажчик вказує на нічого.
Це, ймовірно, здається, що це насправді не дуже корисна річ,
але, як ми побачимо Трохи пізніше на той факт,
що це нульовий покажчик існує насправді дуже може стати в нагоді.
І всякий раз, коли ви створюєте покажчик, а ви не встановите його значення immediately-
приклад установки його значення відразу
буде дещо слайдів назад де я сказав рк дорівнює & K,
рк отримує адреса K, оскільки ми побачимо, що це означає,
ми побачимо, як код, який shortly- якщо ми не встановите його значення на щось
сенс відразу, Ви повинні завжди
встановити покажчик, щоб вказати на нуль.
Ви повинні встановити це, щоб вказати на немає.
>> Це дуже відрізняється від просто залишити значення, як це
а потім можливість оголошення Покажчик і тільки за умови,
це нуль, тому що це рідко правда.
Таким чином, ви завжди повинні встановлювати значення покажчика
до нуля, якщо ви не встановите його значення щоб щось значуще негайно.
Ви можете перевірити, чи є значення покажчика в є недійсним з допомогою оператора рівності
(==), Так само, як ви порівняєте будь-яке ціле число значення або символьні значення, використовуючи (==)
так само.
Це особливий вид постійної значення, яке можна використовувати для тестування.
Так що це було дуже просто покажчик, нульовий покажчик.
Інший спосіб створення покажчик є витяг
адреса змінної ви вже створили,
і ви робите це за допомогою & Видобуток адреса оператора.
Який ми вже бачили раніше у першому прикладі схеми я показав.
Так що, якщо х є змінною, що ми вже створили цілого типу,
то й х є покажчиком на ціле число.
і Х означає пам'ятайте, і збирається витягти адреса речі праворуч.
А так як покажчик це просто адреса, чим і х є покажчиком на ціле число
значення якого, де в пам'яті х життів.
Це адреса Х.
Так і х є адреса х.
Давайте ще один крок далі і підключити до чогось
Я посилався на в попередньому відео.
Якщо обр масив двійників, то і обр квадратна дужка я є покажчиком
в два рази.
ДОБРЕ.
обр квадратну дужку я, якщо обр масив двійників,
Потім обр квадратну дужку я це I-й елемент цього масиву,
і & обр квадратну дужку я де в пам'яті я-й елемент обр існує.
>> Так в чому ж сенс тут?
Масиви ім'я, значення з усієї цієї речі,
є те, що ім'я масиву є насправді сам покажчик.
Ви працювали з покажчиками вздовж усього
кожен раз, коли ви використовували масив.
Запам'ятати на прикладі по області визначення змінної,
в кінці відео я представляю приклад, де ми маємо функцію
називається безліч INT і Функція називається безліч масив.
І ваше завдання, щоб визначити, чи ні, або те, що
цінності, які ми роздруковані кінець функції,
Наприкінці основної програми.
>> Якщо ви пам'ятаєте з цього прикладу або якщо ви дивилися відео,
Ви знаєте, що, коли вам-виклик Набір INT ефективно нічого не робить.
Але виклик, щоб встановити масив робить.
І я начебто замовчується, чому що було на той час.
Я просто сказав, добре це масив, це спеціальна, ви знаєте, є причина.
Причина в тому, що масив-х Назва насправді просто покажчик,
і є цей особливий Синтаксис квадратна дужка, що
зробити речі набагато краще працювати.
І вони роблять ідею про покажчик багато менш страшним,
і ось чому вони начебто з представлених в цьому шляху.
Але насправді масиви просто покажчики.
І ось чому, коли ми внесли зміни в масиві,
коли ми пройшли масив як параметр на функцію або як аргумент
до функції, вміст масиву фактично змінили в обох абонента
і в викликає функції.
Який для кожного іншого виду змінна, яку ми бачили, було не так.
Так що це просто щось, щоб тримати в розум, коли ви працюєте з покажчиками,
є те, що ім'я Масив насправді покажчик
на перший елемент цього масиву.
>> ОК, так що тепер у нас є всі ці факти, давайте продовжувати йти, правильно.
Чому ми піклуємося про десь живе.
Ну, як я вже сказав, це досить Корисно знати, де щось живе
так що ви можете піти туди і змінити його.
Робота з нею і насправді є річ, яку ви
хочу зробити з цієї змінної ефекту відбору, і не набули чинності на деяких копії.
Це називається разименованія.
Ми йдемо до заслання і ми змінюємо значення там.
Так що, якщо у нас є вказівник, і це називається шт, і це вказує на характер,
то можна сказати, * * ПК і ПК є Ім'я того, що ми знайдемо, якщо ми йдемо
на адресу ПК.
Те, що ми знайдемо там персонаж і * Шт як ми звертаємося до даних на що
Місцезнаходження.
Таким чином, ми могли б сказати, щось на зразок * Шт = D або щось подібне,
і це означає, що що б не був на адреси пам'яті комп'ютера,
будь-якого характеру раніше там, в даний час D, якщо ми говоримо * PC = D.
>> Так от ми йдемо знову деякі дивні речі С, право.
Таким чином, ми бачили раніше * як то частина з типом даних,
і в даний час він використовується в трохи інший контекст
для доступу до даних на місці.
Я знаю, це трохи заплутаним і що насправді частина цього цілого
як, чому покажчики мають цю міфологію навколо них як настільки складні,
це свого роду проблеми синтаксису, чесно.
Але * використовується в обох контекстах, і як частина імені типу,
і ми побачимо, трохи пізніше ще щось, теж.
І зараз це разименовать оператор.
Так він іде до заслання, це доступ до даних
на місці покажчика, і дозволяє маніпулювати за своїм бажанням.
>> Тепер це дуже схоже на відвідування вашого сусіда, право.
Якщо ви знаєте, що Сусід живе, ви
не бовтатися з вашим сусідом.
Ви знаєте, трапляється, знаю, де вони живуть,
але це не означає, що силу того, що знання
Ви взаємодіючих з ними.
Якщо ви хочете, щоб взаємодіяти з ними, Ви повинні піти в їхньому будинку,
Ви повинні піти туди, де вони живуть.
І як тільки ви це зробите, то ви можете взаємодіяти
з ними так само, як ви хотіли б.
І точно так само зі змінними, Ви повинні піти на їхню адресу
якщо ви хочете, щоб взаємодіяти їх, Ви не можете просто знати адресу.
І те, як ви йдете на адреси використовувати *, оператор разименованія.
Що ви думаєте станеться якщо ми будемо намагатися разименовать
покажчик, значення якого дорівнює нулю?
Нагадаємо, що нуль покажчик вказує нічого.
Так що, якщо ви спробуєте і разименованія нічого або перейти до адресної нічого,
що ви думаєте відбувається?
Ну, якщо ви здогадалися сегментації вина, ви були б праві.
Якщо ви спробуєте і разименованія порожній покажчик,
Ви страждаєте сегментації вина. Але почекайте,
не кажу вам, що якщо ви не збираєтеся
щоб встановити значення вашого покажчик на щось значуще,
Ви повинні встановити на нуль?
Я зробив, і насправді сегментація несправність роду хорошу поведінку.
>> Ви коли-небудь оголосили змінну і не відразу присвоюється його значення?
Таким чином, ви просто сказати Int х; Ви не насправді привласнити його ні до чого
а потім пізніше в коді, Вам роздрукувати значення х,
маючи досі не призначений його ні до чого.
Часто ви отримаєте нулю, але іноді ви
може отримати випадкове число, і Ви поняття не маєте, де він прийшов.
Точно можу речі станеться з покажчиками.
Коли ви оголошуєте покажчик INT * рк наприклад,
і ви не призначити його значення, Ви отримуєте чотири байти для пам'яті.
Які б не були чотири байти пам'яті система може
виявите, що є деякі значимі цінності.
І, можливо, було то там вже, що
не більше і не потрібен інший Функція, так що ви просто повинні
всі дані там.
>> Що робити, якщо ви намагалися зробити розіменування деякі адресу, яку ви don't- було
вже байти і інформації у там, що тепер в покажчик.
Якщо ви спробуєте і разименованія покажчика цього, Ви могли б возитися з якоюсь пам'яті
що ви не маєте наміру возитися з усім цим.
І справді ви могли б зробити щось дійсно руйнівним,
як зламати іншу програму, або зламати іншу функцію,
або зробити щось, що шкідливий Ви не маєте наміру робити взагалі.
І ось чому це насправді хороша ідея
встановити свої покажчики на нуль, якщо вам не встановлений їх щось осмислене.
Це, ймовірно, краще на Кінець дня для вашої програми
до краху, то для того, щоб зробити те, що гвинти вгору
інша програма або інша функція.
Така поведінка, можливо, навіть менш ідеальним, ніж просто збій.
І ось чому це насправді хороша звичка
щоб потрапити у ваші встановити покажчики до нуля, якщо ви не встановите їх
до значимого вартості негайно, значення, що ви знаєте
і що ви можете безпечно виконувати разименованія.
>> Отже, давайте повернемося в даний час і поглянути у загальному синтаксисі ситуації.
Якщо я кажу, INT * р;, що я тільки що зробив?
Що я зробив це.
Я знаю, що величина р є адреса бо всі покажчики тільки
адреси.
Я можу разименованія р використовуючи оператор *.
У цьому контексті тут, у самому топ згадати * є частиною типу.
Int * тип даних.
Але я можу разименованія р, використовуючи оператор *,
і якщо я роблю так, якщо я йду за цією адресою, те, що я знайду за цією адресою?
Я знайду ціле.
Так INT * р в основному кажучи, р являє собою адресу.
Я можу разименованія р і якщо Я, я знайду ціле
в цьому місці пам'яті.
>> ОК, так що я сказав, що був ще один дратує річ з зірками
і ось де, що дратує річ з зірками є.
Ви коли-небудь намагалися оголосити кілька змінних одного і того ж типу
на тому ж рядку коду?
Таким чином, для другого, робити вигляд, що лінії, код, який я насправді у них там в зелений
там немає, і він просто говорить INT х, у, г;.
Те, що це буде зробити, це насправді створити трьох цілочисельні змінні для вас,
одна називається х, одна називається у, і один називається р
Це спосіб зробити це без того, щоб розділити на три лінії.
>> Ось де зірки отримують дратує знову, хоча,
бо насправді * частина є з імені типу і частини
імені змінної.
І тому, якщо я кажу, INT * рх, ру, рг, те, що я насправді отримати покажчик на ціле
називається ПВ і два цілих числа, ру і рг.
І це, напевно, не те, що ми хочемо, це не добре.
>> Так що, якщо я хочу, щоб створити кілька покажчиків на тій же лінії, того ж типу,
і зірки, те, що я насправді потрібно щоб зробити, це сказати INT * річних, * PB * шт.
Тепер тільки що сказав, що і тепер кажу вам це,
ви, ймовірно, ніколи не буде робити цього.
І це, напевно, добре, чесно кажучи, тому що ви можете випадково
опустити зірку, щось на зразок цього.
Це, ймовірно, краще, може бути, оголосити покажчики на окремих лініях,
але це просто ще один з тих дратівливих синтаксису
речі з зірками, які роблять покажчики так важко працювати.
Тому що це просто синтаксичний це безлад, ви повинні працювати через.
З практикою це робить дійсно стала другою натурою.
Я до сих пір роблять помилки з ним ще після програмування протягом 10 років,
так що не турбуйтеся, якщо щось трапиться Вам, це досить поширене, чесно кажучи.
Це дійсно свого роду недолік синтаксису.
>> ОК, так що я начебто обіцяв що ми знову
поняття, як велика рядок.
Ну, якщо я сказав вам, що Рядок, ми дійсно вид
лежав до вас весь час.
Там немає тип даних називається рядок, а насправді я
згадав про це в одному з наших Перші відео на типи даних,
що рядок була типом даних, був створений для вас в CS50.h.
Ви повинні #include CS50.h для того, щоб використовувати його.
>> Ну рядок насправді просто псевдонім на щось
називається символ *, а покажчик на символ.
Ну покажчики, нагадаємо, просто звертається.
Так що розмір в байтах рядки?
Ну, це чотири чи вісім.
І чому я говорю чотири або восьмій, бо є насправді
залежить від системи, якщо ви використовуєте CS50 язь, голець * є розмір гольця
* Вісім, це 64-розрядна система.
Кожен адреса в пам'яті 64 біта.
Якщо ви використовуєте прилад CS50 або за допомогою будь 32-бітної машини,
і ви чули, що термін 32-біт машина, що 32-бітові машини?
Ну це просто означає, що кожен адреса в пам'яті довжиною 32 біта.
І так 32 біт на чотири байти.
Таким чином, символ * чотири або восьмій байт в залежності від вашої системи.
І справді якісь типи даних, і покажчик на будь-яких даних,
типу, так як всі покажчики тільки адреси, чотири чи вісім байт.
Отже, давайте повернемося в цьому Графік і давайте укласти
це відео з невеликого вправи тут.
Так ось схема ми зупинилися з на самому початку відео.
Так що тепер, якщо я говорю * рк = 35?
Так що це означає, коли я кажу, * рк = 35?
Візьміть другий.
* Рк.
У контексті тут, є * разименовать оператор.
Тому, коли разименовать оператор використовується,
ми йдемо на адресу вказав по рк, і ми змінюємося, що ми знаходимо.
Так * рк = 35 ефективно робить це на картинці.
Так що це в основному синтаксично ідентичні в тому, сказав K = 35.
>> Ще один.
Якщо я кажу, INT м, я створюю нова змінна називається м.
Нове поле, це тому, що зелений ящик він збирається провести ціле,
і це позначені м.
Якщо я кажу, M = 4, я ставлю число в цьому полі.
Якщо скажімо рк = & м, як же це зміна схема?
Рк = & м, ви пригадати, що в І оператор робить або як називається?
Пам'ятайте, що деякі & ім'я змінної це адреса змінної ім'я.
Отже, що ми хочемо сказати, рк отримує адреса м.
І так ефективно, що відбувається, схема, що рк довше без окулярів
К, але вказує на м.
>> Знову покажчики дуже складно працювати
і вони займають багато практика, а тому, що
їх здібності, щоб дозволити вам для передачі даних між функціями
і насправді є ті Зміни вступлять в силу,
отримувати вашу головку навколо це дуже важливо.
Це, ймовірно, є найскладнішим Цю тему ми обговоримо в CS50,
але значення, що вам отримати від використання покажчиків
значно переважує ускладнень які приходять від навчання їх.
Так що я бажаю вам краще удачі дізнатися про покажчики.
Я Дуг Ллойд, це CS50.