1 00:00:00,000 --> 00:00:02,310 [Powered by Google Translate] [Тиждень 4, продовження] 2 00:00:02,310 --> 00:00:04,240 [David J. Малан - Гарвардський університет] 3 00:00:04,240 --> 00:00:07,290 [Це CS50. - CS50.TV] 4 00:00:07,290 --> 00:00:11,290 >> Це CS50, і це в кінці тижня 4. 5 00:00:11,290 --> 00:00:14,030 Таким чином, деякі гарні новини і погані новини. 6 00:00:14,030 --> 00:00:26,240 Ні лекції в понеділок, не проблема встановити на наступному тижні. [Оплески студентів] 7 00:00:26,240 --> 00:00:28,680 Ви не сподобається, де це відбувається. 8 00:00:28,680 --> 00:00:31,590 Але у нас є це, а в наступну середу, 9 00:00:31,590 --> 00:00:37,740 і є також в програмі 1 лекція п'ятницю в наступну п'ятницю, так що ми можемо залишитися на трасі. 10 00:00:37,740 --> 00:00:40,580 Але все буде знятий, як зазвичай, так що не турбуйтеся. 11 00:00:40,580 --> 00:00:44,100 >> І в зв'язку з вікторину 0 Що ми будемо робити ближче до кінця тижня 12 00:00:44,100 --> 00:00:47,140 буде розміщувати на домашній сторінці cs50.net курсу пояснень 13 00:00:47,140 --> 00:00:50,160 , Якого роду очікування ви повинні мати, коли справа доходить до першої вікторини. 14 00:00:50,160 --> 00:00:55,100 Загалом, це буде множинний вибір, вірно-невірно, коротка відповідь, короткий кодування проблеми. 15 00:00:55,100 --> 00:00:57,360 Ви не будете чекати для реалізації еквівалентних 16 00:00:57,360 --> 00:01:00,030 проблеми, які ви бачите на PSET, для яких у вас є комп'ютер 17 00:01:00,030 --> 00:01:03,240 і відладчик і тому подібне, але там буде невелика кодування проблеми. 18 00:01:03,240 --> 00:01:06,900 >> І дійсно, краще керівництво, щоб отримати уявлення про те, що CS50 вікторини, як 19 00:01:06,900 --> 00:01:09,180 це зайти на cs50.net, перейдіть на посилання вікторини, 20 00:01:09,180 --> 00:01:11,920 і ви можете побачити останні декілька років стоїть вікторини. 21 00:01:11,920 --> 00:01:16,600 Просто розумію, що навчальні програми не завжди було незмінним протягом багатьох років. 22 00:01:16,600 --> 00:01:18,510 Іноді ми додамо, іноді віднімати, 23 00:01:18,510 --> 00:01:20,670 тому якщо ви бачите якусь тему на одному з тих старих вікторини 24 00:01:20,670 --> 00:01:25,380 що ви поняття не маєте, що це говорить про те, що це або те, що ми не покрити її 25 00:01:25,380 --> 00:01:27,210 або що ми не покриває його. 26 00:01:27,210 --> 00:01:31,110 Але у вигляді відгуків, в це неділю, понеділок і вівторок 27 00:01:31,110 --> 00:01:34,770 а також хід всієї сесії з проведення огляду в ніч на неділю - 28 00:01:34,770 --> 00:01:37,500 Час і місце будуть оголошені на домашній сторінці курсу - 29 00:01:37,500 --> 00:01:40,120 Ви все маєте можливість ознайомитися з викладанням курсу стипендіати 30 00:01:40,120 --> 00:01:44,830 Матеріал у цьому році, як і в розділі якості повноправного класу, 31 00:01:44,830 --> 00:01:48,400 , І вони будуть зняті, як зазвичай, а також. 32 00:01:48,400 --> 00:01:53,380 >> Добре. Отже, без подальших церемоній, в одному з коментарів на залік / незалік і введення / виводу. 33 00:01:53,380 --> 00:01:57,980 Можливо, ви бачили мої замітки минулої ночі, і це дійсно просто деякі додаткові запевнення 34 00:01:57,980 --> 00:02:01,250 що якщо ви належите до числа тих, хто особливо менш комфортно або десь посередині 35 00:02:01,250 --> 00:02:04,870 і ви відчуваєте себе просто трохи більш ніж у вашій голові, 36 00:02:04,870 --> 00:02:08,430 розуміють, що насправді цілком нормально, і є достатня структури підтримки на місці, 37 00:02:08,430 --> 00:02:13,530 один з яких прийомні години були наміри щодо поліпшення тим більше за мою електронну пошту минулої ночі, 38 00:02:13,530 --> 00:02:16,520 і розумію, що теж варіант, як годен / не придатний для класу, як це 39 00:02:16,520 --> 00:02:21,540 насправді мається на увазі в якості механізму, зняти гостроту курсу, як це, 40 00:02:21,540 --> 00:02:24,200 так що знову, якщо ви витрачаєте ті 10, 15, 20 годин 41 00:02:24,200 --> 00:02:28,160 просто намагаюся отримати деякі PSET працювати і ви знаєте, що 90-95% від туди 42 00:02:28,160 --> 00:02:32,100 але ви не можете знайти прокляту помилку, в залік / незалік модель, яка начебто нормально. 43 00:02:32,100 --> 00:02:36,230 >> Ідея полягає в тому, що з цим механізмом ви можете піти уваги на інших psets 44 00:02:36,230 --> 00:02:39,530 або спати або що це таке, що ви хочете, щоб зосередитися. 45 00:02:39,530 --> 00:02:43,390 Так розумію, що у вас є, поки це найближчий вівторок - технічно 5-й понеділок, 46 00:02:43,390 --> 00:02:50,840 але це свято, так що це найближчий вівторок - перейти від придатний / не придатний до градуйований або навпаки. 47 00:02:50,840 --> 00:02:54,450 І якщо ви дійсно на краю прірви, і думає падіння в цілому, 48 00:02:54,450 --> 00:02:56,440 Будь ласка, злови мене після лекції або напишіть мені записку. 49 00:02:56,440 --> 00:02:59,990 Ми хотіли б, принаймні чату перед вами попрощатися. 50 00:02:59,990 --> 00:03:03,470 Добре. Таким чином, ми почали приймати підготовки коліс в минулий раз. 51 00:03:03,470 --> 00:03:06,030 Зокрема, ми звернули увагу на рядок. 52 00:03:06,030 --> 00:03:09,740 Струнний є те, що оголошені в бібліотеці CS50, 53 00:03:09,740 --> 00:03:14,340 зокрема в тому, що файл з ім'ям cs50.h яких ми почнемо дивитися на цей тиждень і наступний. 54 00:03:14,340 --> 00:03:17,250 Але рядок насправді просто спрощення щось 55 00:03:17,250 --> 00:03:20,980 , Що трохи більше arcanely описано як символ *. 56 00:03:20,980 --> 00:03:24,090 Char, що ми знайомі. Це всього лише один символ. 57 00:03:24,090 --> 00:03:28,010 Але * станом на понеділок позначається як? >> [Студент] покажчик. 58 00:03:28,010 --> 00:03:31,290 Покажчика. І що покажчик? >> [Студент] адресу. 59 00:03:31,290 --> 00:03:33,420 >> Це все одно, адреса, місце в пам'яті. 60 00:03:33,420 --> 00:03:35,910 Що адресу або місце чи пам'ять? 61 00:03:35,910 --> 00:03:40,290 Знову ж таки, у всіх нас є ноутбуки з концерту або 2 гігабайти оперативної пам'яті, швидше за все, в ці дні, 62 00:03:40,290 --> 00:03:44,160 і це означає, що у вас є мільярд або 2 млрд. байт стоїть пам'яті. 63 00:03:44,160 --> 00:03:46,240 І це дійсно не має значення, що це фізично виглядає, 64 00:03:46,240 --> 00:03:51,220 але прийняти на віру, що ви можете порахувати всі окремі байти, що ваш власний ноутбук - 65 00:03:51,220 --> 00:03:54,580 це байт 0, це 1 байт, це байт 2 млрд. - 66 00:03:54,580 --> 00:03:56,100 і це саме те, що комп'ютер робить. 67 00:03:56,100 --> 00:04:00,030 Коли ви виділити місце для одного символу, наприклад, 68 00:04:00,030 --> 00:04:02,480 він, очевидно, повинен жити десь в пам'яті комп'ютера, 69 00:04:02,480 --> 00:04:05,860 і може бути, це на номер 12345 байт, 70 00:04:05,860 --> 00:04:08,470 і що десь тут, в пам'яті комп'ютера. 71 00:04:08,470 --> 00:04:12,630 І адресу, то цього символу 12345. 72 00:04:12,630 --> 00:04:16,140 >> Тепер, на тиждень від 0 до тепер досі, ми дійсно не дбали 73 00:04:16,140 --> 00:04:19,170 , Де в пам'яті зберігаються речі, тому що ми зазвичай використовують символи, 74 00:04:19,170 --> 00:04:22,540 Змінні та масиви насправді отримати на нашому даних. 75 00:04:22,540 --> 00:04:24,950 Але, як в понеділок, а тим більше сьогодні, ви тепер будете мати 76 00:04:24,950 --> 00:04:27,710 Тим більше виразні можливості при написанні програм 77 00:04:27,710 --> 00:04:31,330 щоб дійсно управляти пам'яттю комп'ютера як ви вважаєте за потрібне, 78 00:04:31,330 --> 00:04:33,720 як для благих цілей і погано, 79 00:04:33,720 --> 00:04:39,620 помилки бути дуже загальний результат на даний момент у вивченні цього матеріалу. 80 00:04:39,620 --> 00:04:42,460 Але що це насправді означає бути символ *? 81 00:04:42,460 --> 00:04:46,140 Давайте підемо далі назад в - і ми повернемося до Бінки як і обіцяв сьогодні. 82 00:04:46,140 --> 00:04:48,670 Підемо простим прикладом тут. 83 00:04:48,670 --> 00:04:53,060 Дозвольте мені зберегти цей файл як compare.c, і дозвольте мені просто отримати код шаблону тут 84 00:04:53,060 --> 00:05:00,490 тому включати stdio.h, дозвольте мені також віддати себе включати cs50.h. Я збільшити там. 85 00:05:00,490 --> 00:05:05,850 Дозвольте мені почати писати основні INT, основних (недійсними), і тепер я хочу зробити щось на зразок цього: 86 00:05:05,850 --> 00:05:13,520 Е ("Дайте мені рядки:"), а потім я буду використовувати рядки з одержує GetString 87 00:05:13,520 --> 00:05:16,750 , Щоб отримати рядок від користувача, то я збираюся запитати користувача на інший. 88 00:05:16,750 --> 00:05:21,870 ("Дайте мені ще рядки:"), і я збираюся попросити їх через GetString, щоб отримати це. 89 00:05:21,870 --> 00:05:27,020 Я буду називати його, тому що т т приходить після с і з це хороша назва для рядка, якщо це досить загальний характер. 90 00:05:27,020 --> 00:05:30,030 Так GetString, і тепер я просто хочу зробити загальний контроль, і я збираюся сказати, 91 00:05:30,030 --> 00:05:39,770 Якщо (S == т), то я просто хочу, щоб повідомити користувачеві Е ("Ви ввели те ж саме, \ п"); 92 00:05:39,770 --> 00:05:45,520 ще я хочу, щоб роздрукувати щось подібне ("Ви ввели щось інше! \ п") 93 00:05:45,520 --> 00:05:48,460 або що вирок буде. Таким чином, щось на зразок цього. 94 00:05:48,460 --> 00:05:52,200 Потім, як звичайно, я буду повертати 0, який просто означав, що нічого поганого не сталося, 95 00:05:52,200 --> 00:05:54,400 і я збираюся йти вперед і скомпілювати і запустити цю програму. 96 00:05:54,400 --> 00:05:56,540 >> Але в понеділок ми запустили цю програму, 97 00:05:56,540 --> 00:06:00,420 і насправді було сказано, що ПРИВІТ НЕ Здрастуй і прощай не прощає. 98 00:06:00,420 --> 00:06:03,140 Поведінка, яке ми бачили, було трохи більше, як це. 99 00:06:03,140 --> 00:06:11,450 Відпустіть мене в мій вихідний каталог, збільшити тут, і давайте зробимо зробити порівняння. 100 00:06:11,450 --> 00:06:14,570 Укладач порядку. Дозвольте мені виконати порівняння. Дайте мені рядки: Доброго. 101 00:06:14,570 --> 00:06:16,300 Дайте мені інший рядок: Доброго. 102 00:06:16,300 --> 00:06:18,000 Ви ввели щось інше! 103 00:06:18,000 --> 00:06:22,650 Ну, давайте я спробую що-небудь простіше, як 50, 50. Ви ввели щось інше! 104 00:06:22,650 --> 00:06:25,740 привіт, привіт. Таким чином, ясно, що щось тут відбувається. 105 00:06:25,740 --> 00:06:28,440 Але яке ж було пояснення, чому? 106 00:06:28,440 --> 00:06:33,850 Мабуть, лінія 12 повністю функціонує. 107 00:06:34,300 --> 00:06:39,430 Яка основна проблема тут? Так. >> [Студент] Це порівняння адрес. 108 00:06:39,430 --> 00:06:41,850 Так, саме так. Це насправді порівняння адрес 109 00:06:41,850 --> 00:06:44,580 , В якому ПРИВІТ ПРИВІТ і зберігаються. 110 00:06:44,580 --> 00:06:48,290 Це не порівняння букв ПРИВІТ знову і знову, 111 00:06:48,290 --> 00:06:52,370 тому що те, що відбулося насправді, весь цей час ми використовували GetString - 112 00:06:52,370 --> 00:06:56,130 Це дошці знову пам'яті нашого комп'ютера, 113 00:06:56,130 --> 00:07:00,100 і скажемо, я називаю GetString після оголошення змінної с. 114 00:07:00,100 --> 00:07:01,930 Що означає моя пам'ять схожа? 115 00:07:01,930 --> 00:07:07,070 Давайте довільно сказати, що з виглядає наступним чином. Це квадрат. 116 00:07:07,070 --> 00:07:09,040 І в значній мірі будь-який час я намалював шматок пам'яті на екрані 117 00:07:09,040 --> 00:07:12,860 якщо це 32 біт, я був малюнок квадратів, як це, тому що дійсно в прилад, 118 00:07:12,860 --> 00:07:17,380 покажчик, адреса, становить 32 біт. Це так само, як Int. 119 00:07:17,380 --> 00:07:19,420 Це може варіюватися залежно від комп'ютерної системи. 120 00:07:19,420 --> 00:07:24,630 Ті з вас, хто смутно знайомі з тим фактом, що ваш Mac або PC складає 64 біт, 121 00:07:24,630 --> 00:07:28,120 що насправді означає, що ваш комп'ютер використовує 64-розрядні покажчики, 122 00:07:28,120 --> 00:07:33,730 64-розрядні адреси, а серед розквитатися цього ваш комп'ютер 123 00:07:33,730 --> 00:07:35,560 може мати набагато більше пам'яті, ніж минулого. 124 00:07:35,560 --> 00:07:39,240 Коротше кажучи, ще в той день, коли комп'ютери використовуються тільки 32 біт 125 00:07:39,240 --> 00:07:42,740 для представлення адрес, найбільша кількість байт ви могли б представляти 126 00:07:42,740 --> 00:07:46,280 У цьому випадку було те, що якщо у вас є 32 біт? 127 00:07:46,280 --> 00:07:49,590 Таким чином, 4 млрд, праві, тому що від 2 до 32, 4 мільярди доларів. 128 00:07:49,590 --> 00:07:51,370 Це число було повторення в курсі. 129 00:07:51,370 --> 00:07:55,240 >> Так що якщо у вас є тільки 32 біта, найбільше число ви можете розраховувати на приблизно 4 мільярди доларів. 130 00:07:55,240 --> 00:07:58,750 Але це було фундаментальне обмеження комп'ютерів, поки кілька років тому 131 00:07:58,750 --> 00:08:01,180 тому що якщо ви можете розраховувати тільки досягати 4 млрд. 132 00:08:01,180 --> 00:08:05,270 це не має значення, якщо ви купуєте 8 гігабайт оперативної пам'яті або навіть 5 гігабайт оперативної пам'яті; 133 00:08:05,270 --> 00:08:07,780 Ви не можете розраховувати, що високий, так що це було марно. 134 00:08:07,780 --> 00:08:11,430 Ви можете отримати доступ тільки до перших 3 або 4 гігабайтами пам'яті комп'ютера. 135 00:08:11,430 --> 00:08:14,410 Це менш важливою проблемою в даний час, і ви можете купити MacBook Pros і Dells 136 00:08:14,410 --> 00:08:17,680 з 8 гігабайтами оперативної пам'яті або навіть більше в ці дні. 137 00:08:17,680 --> 00:08:24,100 Але якщо я просто виділити в цій програмі покажчик, покажчик називається S, 138 00:08:24,100 --> 00:08:28,370 це може виглядати це на екрані, тому що дійсно нам потрібно відігніть цей шар. 139 00:08:28,370 --> 00:08:33,520 Я постійно говорю рядки, але за станом на понеділок, рядок дійсно символ *, 140 00:08:33,520 --> 00:08:35,590 Адреса деякий характер. 141 00:08:35,590 --> 00:08:39,280 Так що давайте вважати, що навчання колеса відключається, навіть якщо ми будемо продовжувати використовувати GetString на даний момент. 142 00:08:39,280 --> 00:08:42,600 Так що я оголосив їй, і це частина пам'яті, 32 біт. 143 00:08:42,600 --> 00:08:47,370 Що тут у пам'ять за замовчуванням? >> [Нерозбірливо відповідь студента] 144 00:08:47,370 --> 00:08:50,040 Що це? >> [Студент] Garbage. >> Garbage. Саме так. 145 00:08:50,040 --> 00:08:54,610 Якщо ви програміст не ставимо значення у змінній, хто знає, що це таке? 146 00:08:54,610 --> 00:08:57,990 Іноді вам щастить, і це 0, яка є своєрідною хороший, чистий значення за замовчуванням, 147 00:08:57,990 --> 00:09:00,310 але, як ми бачили понеділок, іноді це повна маячня, 148 00:09:00,310 --> 00:09:04,130 деякі дійсно великі позитивні або негативні числа, які прийшли з де? 149 00:09:05,350 --> 00:09:07,010 Так. >> [Студент] Функція раніше. >> Да. 150 00:09:07,010 --> 00:09:10,170 >> Часто функції, які отримав колл раніше, тому що пам'ятаю, 151 00:09:10,170 --> 00:09:13,920 як ви називаєте функції в пам'яті, вони займають все більше і більше простору знизу вгору, 152 00:09:13,920 --> 00:09:17,040 і як тільки функція повертає, що пам'ять отримує повторно 153 00:09:17,040 --> 00:09:20,890 на наступний хлопець, який викликається, хто використовує ваші ж шматок пам'яті. 154 00:09:20,890 --> 00:09:23,450 І якщо ви залишили сміття там, попередні значення, 155 00:09:23,450 --> 00:09:28,190 ми могли б переплутати з як має деяке значення, коли насправді ми не кладіть нічого немає. 156 00:09:28,190 --> 00:09:30,960 Таким чином, наші оперативної пам'яті на даний момент виглядає наступним чином. 157 00:09:30,960 --> 00:09:36,030 Тепер на правій стороні рядка 7 ми називаємо GetString, 158 00:09:36,030 --> 00:09:40,150 які ми робимо зараз протягом тижнів, а то, що GetString насправді? 159 00:09:40,150 --> 00:09:43,350 GetString написано CS50 персонал трохи інтелектуального 160 00:09:43,350 --> 00:09:46,500 в тому, що, як тільки користувач починає вводити ключі і хітів Enter, 161 00:09:46,500 --> 00:09:50,010 GetString цифри, скільки натискань клавіш зробив користувач хіт, 162 00:09:50,010 --> 00:09:53,360 скільки символів я повинен виділити RAM для. 163 00:09:53,360 --> 00:09:55,660 А де, що RAM приходить, хто знає? 164 00:09:55,660 --> 00:09:58,930 Це десь в 2 комп'ютери гігабайт і ще багато чого з пам'яті. 165 00:09:58,930 --> 00:10:05,200 Але давайте припустимо, що комп'ютер знайшов місце для слова ПРИВІТ прямо тут. 166 00:10:05,200 --> 00:10:08,710 Я набрав слово було Н-Е-Л-Л-О. 167 00:10:08,710 --> 00:10:13,510 І якщо ми проведемо це як послідовність символів, ми могли б зробити це так. 168 00:10:13,510 --> 00:10:17,860 Але мені потрібно зробити 1 додаткову річ. Те, що належить в кінці будь рядки в C? 169 00:10:17,860 --> 00:10:20,710 Нульовий символ, який ми пишемо, як \ 0. 170 00:10:20,710 --> 00:10:23,980 Це технічно число 0, а зворотна коса риса робить все чітко 171 00:10:23,980 --> 00:10:28,150 що це буквально число 0, ціле число 0; 172 00:10:28,150 --> 00:10:32,440 це не так, наприклад, цитата-кінець цитати 0, що можна ввести з клавіатури. 173 00:10:32,440 --> 00:10:33,940 Так що це HELLO. 174 00:10:33,940 --> 00:10:36,350 >> І що ж ми говоримо в понеділок, що функції, як GetString 175 00:10:36,350 --> 00:10:39,580 насправді повертаються всі ці тижні? 176 00:10:39,580 --> 00:10:43,960 Це не повертаються рядки як такої, тому що насправді не мають сенс 177 00:10:43,960 --> 00:10:47,710 Оскільки рядки не існує. Вони начебто виготовлення в CS50 бібліотеки. 178 00:10:47,710 --> 00:10:51,300 Що насправді є рядком, більш технічно? >> [Студент] Це перший символ. 179 00:10:51,300 --> 00:10:55,950 Саме так. Це досить просто адресу першого символу, який користувач ввів дюйма 180 00:10:55,950 --> 00:11:02,810 Так що, якщо мої слова ПРИВІТ закінчує його в байт 123 номери, а потім з байта номер 124, 181 00:11:02,810 --> 00:11:08,320 125, 126, і так далі, якщо я просто мій номер байта від 0 до о, 182 00:11:08,320 --> 00:11:12,650 що насправді GetString повертається буквально номер 123. 183 00:11:12,650 --> 00:11:19,270 Таким чином, те, що можна покласти в и це номер 123, а не буква H, не то слово HELLO, 184 00:11:19,270 --> 00:11:23,130 просто адреса, за якою я можу знайти першу букву HELLO. 185 00:11:23,130 --> 00:11:26,500 Але це не здається достатньо. Я запитав вас за рядком, а не характер. 186 00:11:26,500 --> 00:11:32,970 Так як же нам або комп'ютер знаємо, що ELLO виду приходять разом з H? 187 00:11:35,760 --> 00:11:37,460 Що роду угоди в нас є? Так. 188 00:11:37,460 --> 00:11:40,100 [Студент] Він продовжує говорити сам знайти ще кілька символів. >> Саме так. 189 00:11:40,100 --> 00:11:44,570 >> Там є людина-комп'ютер конвенції якій коли ви маєте справу з рядками, 190 00:11:44,570 --> 00:11:49,410 інакше відомий тепер як символ зірки, ви просто повинні з'ясувати, 191 00:11:49,410 --> 00:11:54,350 де в кінці кожного рядка в житті є насправді просто ітерації по його цикл, 192 00:11:54,350 --> 00:11:57,820 час циклу, що завгодно, так що, коли ви знаходите кінці рядка 193 00:11:57,820 --> 00:12:02,160 Тепер ви можете укласти з цього, ой, ціле слово було HELLO. 194 00:12:02,160 --> 00:12:04,820 Ті з вас, з досвідом програмування може знати в Java 195 00:12:04,820 --> 00:12:09,880 Ви можете просто подзвонити. Довжину і на інших мовах можна назвати довжину або аналогічний. 196 00:12:09,880 --> 00:12:14,060 Це тому, що в багатьох мовах, зокрема, що називається об'єктно-орієнтованих мов, 197 00:12:14,060 --> 00:12:18,580 Довжина щось подібне інкапсульовані всередині частини самих даних, 198 00:12:18,580 --> 00:12:24,000 багато, як ми інкапсульовані ідентифікатори та імена і вдома всередині студента в понеділок. 199 00:12:24,000 --> 00:12:28,700 Але C набагато більш низькому рівні. Є ніяких об'єктів або класів, якщо ви чули ці терміни раніше. 200 00:12:28,700 --> 00:12:31,490 Все, що вам дійсно адрес пам'яті. 201 00:12:31,490 --> 00:12:35,540 Так що це свого роду старомодним способом представлення цікавої структури даних. 202 00:12:35,540 --> 00:12:38,760 У вас є початкове значення, як адресу першого символу 203 00:12:38,760 --> 00:12:42,340 , А потім лише деякі довільні конвенції, що всі згодні з тим, щоб слідувати. 204 00:12:42,340 --> 00:12:46,420 Отже, як довжина рядка реалізовані, не ми пропонуємо? 205 00:12:46,420 --> 00:12:51,360 STRLEN, StrLen, що деякі з вас вже використали кілька разів. Це досить просто, чи не так? 206 00:12:51,360 --> 00:12:53,060 Це як 2 рядки коду. 207 00:12:53,060 --> 00:12:56,140 Це в значній мірі за цикл якийсь, може бути, з додатковою локальної змінної. 208 00:12:56,140 --> 00:13:00,540 Але StrLen просто повинен взяти покажчик, а потім починають шукати \ 0. 209 00:13:00,540 --> 00:13:05,190 >> І як тільки він знаходить його, він може повертати загальна кількість кроків, які він взяв у цьому рядку. 210 00:13:05,190 --> 00:13:07,150 Таким чином, ми можемо укласти з цього, що відбувається далі. 211 00:13:07,150 --> 00:13:11,850 Нехай тоді я заявляю, т як я зробив у рядку 10. 212 00:13:11,850 --> 00:13:14,280 Це якась фігня значення. Хто знає, в першу чергу? 213 00:13:14,280 --> 00:13:18,490 Але на правій стороні лінії 10 я дзвоню GetString знову. 214 00:13:18,490 --> 00:13:20,050 Хто знає, де це закінчується? 215 00:13:20,050 --> 00:13:23,830 Давайте як завгодно говорити про те, що операційна система знайшла місце для нього шляху сюди. 216 00:13:23,830 --> 00:13:28,610 Я, трапляється, випадково типу Н-Е-Л-Л-О знову, 217 00:13:28,610 --> 00:13:31,260 і таким чином, ми можемо зробити таку ж картину. 218 00:13:31,260 --> 00:13:34,290 Але те, що у мене перемалювати цю картину навмисного 219 00:13:34,290 --> 00:13:37,720 тому що це інший ПРИВІТ, ніж цей. 220 00:13:37,720 --> 00:13:43,920 Так от, це може бути розташування 456, це 457, і так далі. 221 00:13:43,920 --> 00:13:47,170 Таким чином, те, що можна поставити, де знак питання було раніше? 222 00:13:47,170 --> 00:13:50,190 У цьому випадку 456. 223 00:13:50,190 --> 00:13:53,540 Ми вибираючи ці цифри довільно, тому що насправді після того, як сьогодні 224 00:13:53,540 --> 00:13:57,110 Ми не збираємося так турбуватися про те, що адреса нічого. 225 00:13:57,110 --> 00:14:02,690 Все, що ми дбаємо про те, що ми можемо з'ясувати адресу деякої частини даних, як HELLO. 226 00:14:02,690 --> 00:14:07,100 >> Так насправді те, що більшість людей в області комп'ютерної науки, коли йдеться про пам'ять адреси 227 00:14:07,100 --> 00:14:10,210 і говорити про покажчиків зокрема, 228 00:14:10,210 --> 00:14:14,220 , А не турбуватися з'ясовуючи 123 - кого це хвилює, де ці речі насправді, 229 00:14:14,220 --> 00:14:17,440 ми просто знаємо, що це в деякій числовій адресу - 230 00:14:17,440 --> 00:14:22,180 ми спрощуємо світ і просто сказати, що з указує на цього персонажа 231 00:14:22,180 --> 00:14:25,080 і т вказує на цього персонажа. 232 00:14:25,080 --> 00:14:27,430 А те, що це стрілка цілком навмисною 233 00:14:27,430 --> 00:14:31,610 тому що буквально зараз з указує на H і T вказує на іншу H 234 00:14:31,610 --> 00:14:34,720 тому що в кінці кінців, це не має значення, що адреса, 235 00:14:34,720 --> 00:14:40,240 але це не справа, що у нас є можливість, щоб висловити, що адресу з деякими шматок коду. 236 00:14:40,240 --> 00:14:42,730 Ми дійсно не маніпулював цими адресами тільки поки 237 00:14:42,730 --> 00:14:47,770 так що подивимося, де ми можемо вставляти і як би робити речі з покажчиками, 238 00:14:47,770 --> 00:14:52,030 але зараз в рядку 12 буквальному які цінності ми порівняно 239 00:14:52,030 --> 00:14:55,500 відповідно з цією історією в рядку 12? 240 00:14:56,570 --> 00:15:01,290 Ми говоримо, що становить 123 рівних рівними до 456? І це безумовно не той випадок. 241 00:15:01,290 --> 00:15:05,320 І навіть концептуально, цей покажчик, безумовно, не так само, як це 242 00:15:05,320 --> 00:15:09,500 тому що ви називали GetString двічі, і GetString не намагатися бути супер розумним, 243 00:15:09,500 --> 00:15:12,470 вона не намагається зрозуміти, ой, ви набрали ПРИВІТ 5 хвилин назад; 244 00:15:12,470 --> 00:15:15,090 Дозвольте мені дати вам той же покажчик, як я дав тобі раніше, 245 00:15:15,090 --> 00:15:18,450 він просто виділяє новий блок пам'яті кожен раз, коли ви це називаєте. 246 00:15:18,450 --> 00:15:20,350 >> Так як же нам вирішити цю проблему? 247 00:15:20,350 --> 00:15:24,270 Якщо високому рівні я хочу порівняти рядки привіт і привіт - 248 00:15:24,270 --> 00:15:28,680 Я не дбаю про покажчики - як я можу йти про відповідаючи на запитання, 249 00:15:28,680 --> 00:15:31,980 ж користувач введіть те ж саме? Що тут необхідна? Так. 250 00:15:31,980 --> 00:15:35,200 [Студент] Використовуйте функцію. >> Я можу використовувати функції з коробки. 251 00:15:35,200 --> 00:15:38,170 Я можу використовувати функцію під назвою STRCMP, с-т-р-с-т-р, 252 00:15:38,170 --> 00:15:41,190 тільки скорочену версію кажучи порівняння рядків. 253 00:15:41,190 --> 00:15:45,070 І якщо ми йдемо в, наприклад, порівняти 2, який є одним з роздавальних матеріалів сьогоднішньому 254 00:15:45,070 --> 00:15:46,690 Я роблю саме це. 255 00:15:46,690 --> 00:15:51,750 Я тримав все інше те ж саме від лінії 1 на до 26 або близько того, 256 00:15:51,750 --> 00:15:54,360 і тепер помічаю цю частину змінилася лише трохи. 257 00:15:54,360 --> 00:15:57,690 Давайте ігнорувати лінії 28 на мить і зосередитися тільки на цьому. 258 00:15:57,690 --> 00:16:00,410 Що ми говоримо в понеділок, що, вул порівняння робить? 259 00:16:00,410 --> 00:16:05,200 Він відповідає за процес прийняття 2 покажчиків, з і т в цьому випадку, 260 00:16:05,200 --> 00:16:08,480 роду практично поклавши руку на ці 2 листи, 261 00:16:08,480 --> 00:16:11,530 і що він повинен зробити щось подібне петлі під час або цикл, 262 00:16:11,530 --> 00:16:16,050 і він говорить ці ж саме? Якщо це так, вона рухається пальців або покажчиків вперед. 263 00:16:16,050 --> 00:16:17,970 Це ті ж, це те ж саме, це те ж саме, 264 00:16:17,970 --> 00:16:22,710 це те ж саме, це те ж саме? І ох, я в кінці рядка на обох з і т. 265 00:16:22,710 --> 00:16:26,780 Я не знайшов жодних протиріч. Так, ці рядки однакові. 266 00:16:26,780 --> 00:16:31,940 А що значить вул порівняти повернення, якщо 2 рядки ті ж, мабуть? Zero. 267 00:16:31,940 --> 00:16:35,900 Таким чином, 0 хороша в цьому випадку, тому що якщо він повертає -1 або +1, 268 00:16:35,900 --> 00:16:40,560 це означає, що просто відбувається постати перед т в алфавітному порядку або після т. 269 00:16:40,560 --> 00:16:43,760 І чому б, що б корисно мати функцію, яка говорить вам, які рядки передує 270 00:16:43,760 --> 00:16:46,720 або після того, як в словнику? 271 00:16:46,720 --> 00:16:48,740 [Студент] Пошук. >> Пошуку і сортування. 272 00:16:48,740 --> 00:16:51,730 >> Так що ви можете робити речі, як двійковий пошук або бульбашкового сортування та сортування злиттям 273 00:16:51,730 --> 00:16:53,230 де ви повинні порівняти речі. 274 00:16:53,230 --> 00:16:56,420 До цих пір ми начебто скоротити деякі кути і говорили тільки про сортування 275 00:16:56,420 --> 00:16:59,430 в контексті номера, тому що це легко і приємно поговорити, 276 00:16:59,430 --> 00:17:02,430 але можна, звичайно, порівнювати рядки, яблуко і банан, 277 00:17:02,430 --> 00:17:05,349 тому що, якщо яблуко, як відомо, приходять до банана, аналогічно, 278 00:17:05,349 --> 00:17:09,319 Ви можете переміщатися по всьому рядків в пам'яті так само, як Роб зробив з сортування злиттям в відео 279 00:17:09,319 --> 00:17:15,880 і ми зробили тут, на сцені з вибором сортування, сортування вставкою, і бульбашкового сортування. 280 00:17:15,880 --> 00:17:18,710 Так де ж ще ми можемо прийняти це? Давайте спробуємо це. 281 00:17:18,710 --> 00:17:23,980 Давайте роду забувати, що урок на хвилину і спробуйте зараз і скопіювати 1.c зробити наступне. 282 00:17:23,980 --> 00:17:26,800 У рядку 21 Я те говорю, друку, 283 00:17:26,800 --> 00:17:28,520 Потім я отримую рядок від користувача, 284 00:17:28,520 --> 00:17:30,690 Потім я перевіряю це. 285 00:17:30,690 --> 00:17:33,620 Ми ще не отримали в цій звичці немає, але давайте тепер зробити це. 286 00:17:33,620 --> 00:17:40,990 Давайте насправді відігніть цей шар. Це дійсно символ *. Цей хлопець дійсно символ *. 287 00:17:40,990 --> 00:17:45,690 Отже, що ж означає бути перевірка, якщо з == NULL? 288 00:17:45,690 --> 00:17:48,380 Виявляється, що при виклику функції, як GetString 289 00:17:48,380 --> 00:17:51,540 або взагалі просто запитати комп'ютера, щоб дати вам деяку кількість пам'яті, 290 00:17:51,540 --> 00:17:53,030 щось може піти не так. 291 00:17:53,030 --> 00:17:56,630 Ви могли б бути божевільним, і попросити комп'ютер на терабайт пам'яті 292 00:17:56,630 --> 00:18:01,780 , Просячи трильйонів байт пам'яті, які просто не існують в комп'ютері, 293 00:18:01,780 --> 00:18:05,130 але GetString та інші функції потрібно якимось чином кричати на вас 294 00:18:05,130 --> 00:18:06,820 якщо ви просили занадто багато. 295 00:18:06,820 --> 00:18:10,450 І те, як GetString робить це, якщо ви попросили більше пам'яті 296 00:18:10,450 --> 00:18:14,250 , Чим є в комп'ютері, навіть якщо це супер, супер низької ймовірності 297 00:18:14,250 --> 00:18:17,730 тому що ніхто з нас не збирається вводити трлн символів, а потім натисніть Enter, 298 00:18:17,730 --> 00:18:21,980 але низька ймовірність хоча це може бути, я все ще хочу, щоб перевірити його на всякий випадок, 299 00:18:21,980 --> 00:18:26,120 і спеціальне значення, яке GetString, відповідь, та інші функції повертається 300 00:18:26,120 --> 00:18:30,630 якщо щось пішло не є NULL великими літерами. 301 00:18:30,630 --> 00:18:36,520 >> А що таке NULL? NULL просто так трапляється являють собою покажчик. Це 0 адреса пам'яті. 302 00:18:36,520 --> 00:18:40,800 Світ вирішив, що довільно, якщо це пам'ять мого комп'ютера - ви знаєте, що? - 303 00:18:40,800 --> 00:18:46,260 ми збираємося, щоб вкрасти тільки 1 байт пам'яті кожного комп'ютера, і це положення 0. 304 00:18:46,260 --> 00:18:49,560 Ми збираємося дати йому прізвисько NULL, і ми збираємося обіцяти 305 00:18:49,560 --> 00:18:52,660 що ми ніколи не будуть ставити реальні дані є 306 00:18:52,660 --> 00:18:56,770 тому що ми просто довільно потрібно спеціальне значення 0, інакше NULL, 307 00:18:56,770 --> 00:19:00,230 так що ми можемо кричати на користувачів, якщо щось піде не так. 308 00:19:00,230 --> 00:19:03,590 В іншому випадку ви можете не знати зовсім 0 означають, покласти щось тут 309 00:19:03,590 --> 00:19:05,490 або це значить щось пішло не так? 310 00:19:05,490 --> 00:19:09,190 Ми повинні всі погодитися, що NULL нічого засобів була повернута, 311 00:19:09,190 --> 00:19:11,700 немає фактичної адреси були повернуті. 312 00:19:11,700 --> 00:19:15,210 Тепер, ось, я просто прийнявши моє людське з'їзді я повертаюся 1 від основної 313 00:19:15,210 --> 00:19:17,040 якщо щось піде не так. 314 00:19:17,040 --> 00:19:20,650 Це тому, що повернення основної конвенції в тому, щоб повертати 0, якщо добре, 315 00:19:20,650 --> 00:19:22,990 1 або інше значення, якщо погане. 316 00:19:22,990 --> 00:19:28,200 Але GetString і будь-яка функція, яка займається в пам'ять повертає NULL, якщо щось іде погано. 317 00:19:28,200 --> 00:19:33,480 >> Добре. Тому, на жаль, рядок 27, супер просто, хоча це, абсолютно не скопіювати рядок. 318 00:19:33,480 --> 00:19:35,740 Чому? У цьому можна переконатися наступним чином. 319 00:19:35,740 --> 00:19:40,120 Я стверджуючи, у рядку 27 слід зробити копію з і т називаючи його. 320 00:19:40,120 --> 00:19:45,790 Так що я не прошу у користувача 2 рядки на цей раз, я просто кажу значення в и 321 00:19:45,790 --> 00:19:47,870 повинен бути поміщений в т а. 322 00:19:47,870 --> 00:19:52,890 Так що тепер просто щоб продемонструвати, як зламані це, у рядку 29 вперед те, що я роблю? 323 00:19:52,890 --> 00:19:56,980 Перший я перевіряю, якщо довжина т більше, ніж 0. 324 00:19:56,980 --> 00:19:59,330 Там якась рядок там. Користувач ввів щось дюйма 325 00:19:59,330 --> 00:20:03,410 Що таке лінія 32 роблять, мабуть? 326 00:20:03,410 --> 00:20:08,910 [Нерозбірливо відповідь студента] >> праві. Ви можете види вивести його з того, що я сказав, що це робить. 327 00:20:08,910 --> 00:20:13,200 Але технічно, те, що це робить? T [0] представляє те, що? 328 00:20:13,200 --> 00:20:15,140 [Студент] характер нульовий. >> [Малан] характер нульовий. 329 00:20:15,140 --> 00:20:19,620 Або, що більш людського типу, перший символ в т, що б це, H, може бути, в цьому випадку. 330 00:20:19,620 --> 00:20:24,990 І ToUpper робить те, що він говорить. Він капіталізує нульового символу т, і це міняє його. 331 00:20:24,990 --> 00:20:28,430 Таким чином, це означає взяти на нульовому характером т, зробити її верхній регістр, 332 00:20:28,430 --> 00:20:30,320 і поклав його назад в тому ж місці. 333 00:20:30,320 --> 00:20:35,540 Так що, якщо я типу привіт в нижньому регістрі, це повинно змінити рядкові год до столиці H. 334 00:20:35,540 --> 00:20:41,400 Але проблема в тому, що в рядках 35 та 36, що я збираюся зробити, це роздрукувати для нас з і т. 335 00:20:41,400 --> 00:20:43,120 А що ваші здогадки? 336 00:20:43,120 --> 00:20:47,250 Що я насправді відбувається, щоб побачити, якщо я набрав в привіт в нижньому регістрі? 337 00:20:47,250 --> 00:20:52,280 Що буде надрукована? >> [Нерозбірливо відповідь студента] >> Що це таке? 338 00:20:52,280 --> 00:20:58,360 [Студент] Big H, а інші маленькі. >> Великого H і інші невеликі, для яких, з або т? 339 00:20:58,360 --> 00:21:03,170 [Студент], і інше. >> Інше. Саме так. Отже, давайте подивимося, що відбувається тут. 340 00:21:03,170 --> 00:21:08,380 >> Дозвольте мені йти далі і зібрати це. Це copy1, так що copy1. Добре. 341 00:21:08,380 --> 00:21:14,840 Збільшити масштаб Дозвольте мені йти вперед і працювати copy1, Enter Сказати що-небудь: привіт в нижньому регістрі. 342 00:21:14,840 --> 00:21:19,570 Це капіталізуються копію, але він, очевидно, капіталізуються оригінальні, а також, 343 00:21:19,570 --> 00:21:22,070 тому що те, що зараз відбувається в цій історії? 344 00:21:22,070 --> 00:21:27,030 У рядку 27 я насправді не здається, копіювання рядка, 345 00:21:27,030 --> 00:21:30,450 але навіть якщо ви, можливо, інтуїтивно сподівалася, що буде так, 346 00:21:30,450 --> 00:21:33,680 якщо ви думаєте про цю картину, що насправді я зробив? 347 00:21:33,680 --> 00:21:35,410 Половина картина та ж. 348 00:21:35,410 --> 00:21:39,390 Так що давайте відкат у часі, так що т ще не існує в історії. 349 00:21:39,390 --> 00:21:43,160 S може існувати в історії, але давайте нижній привіт в цей раз. 350 00:21:43,160 --> 00:21:46,710 Отже, дозвольте мені виправити те, що я насправді ввели дюйма 351 00:21:46,710 --> 00:21:51,280 У цьому випадку тут ми маємо ч-е-л-л-о. 352 00:21:51,280 --> 00:21:58,050 Ми будемо малювати його як послідовність символів, поклав розділові лінії тут, і моя \ 0. 353 00:21:58,050 --> 00:22:05,980 Так що це, де ми знаходимося, як тільки лінія від 1 до 24-іш, плюс-мінус, виконали. 354 00:22:05,980 --> 00:22:07,800 Це фотографія моєї пам'яті. 355 00:22:07,800 --> 00:22:10,800 Коли я добираюся до лінії 27, що відбувається? 356 00:22:10,800 --> 00:22:14,730 Як і раніше, я отримую покажчик, який я намалюю, як цю площу. 357 00:22:14,730 --> 00:22:19,740 Це називається тонн. І те, що його значення за замовчуванням? Хто знає? Деякі сміття значення. 358 00:22:19,740 --> 00:22:22,060 >> Так що я буду абстрактним, що далеко, як знак питання. 359 00:22:22,060 --> 00:22:27,670 І як тільки праву сторону лінії 27 виконує, що я покласти всередину т? 360 00:22:27,670 --> 00:22:30,770 Те ж саме, що знаходиться в с. 361 00:22:30,770 --> 00:22:34,120 Тому, якщо ми на мить видалити цю абстракцію, вказаному стрілкою, і ми говоримо, 362 00:22:34,120 --> 00:22:40,330 О, це пам'ять адресу завантаження 123, коли ви говорите т отримує з, крапка з комою, 363 00:22:40,330 --> 00:22:42,700 Ви буквально покласти 123 тут. 364 00:22:42,700 --> 00:22:45,200 Тепер, якщо ми якось спростити наш світ знову з фотографіями, 365 00:22:45,200 --> 00:22:48,750 те, що ви дійсно зробили просто додається ще одну стрілу в свій світ 366 00:22:48,750 --> 00:22:52,910 який вказує с т в точно такий же рядок. 367 00:22:52,910 --> 00:22:59,730 Тому, коли в рядку 31 і 32 я насправді йти про зміну т [0] 368 00:22:59,730 --> 00:23:05,580 що T [0] мабуть синонімом зараз? з [0] 369 00:23:05,580 --> 00:23:07,030 Так що все, що відбувається. 370 00:23:07,030 --> 00:23:09,900 І хоча цей вид почуває себе трохи низькому рівні і таємні 371 00:23:09,900 --> 00:23:12,760 і такого роду почуття, що, можливо, інтуїтивно це повинно було б просто працював - 372 00:23:12,760 --> 00:23:15,410 Я зробив копії раніше, і він просто працював - 373 00:23:15,410 --> 00:23:18,590 якщо ви насправді думаєте про те, що рядок насправді, це символ *. 374 00:23:18,590 --> 00:23:21,700 Ну, що це таке? Це адресу деяких характеру. 375 00:23:21,700 --> 00:23:24,930 Тоді, можливо, має сенс, коли ви намагаєтеся зробити щось 376 00:23:24,930 --> 00:23:29,220 Супер здавалося б, простий, як це, все, що ви робите, копіювання адреси пам'яті. 377 00:23:29,220 --> 00:23:32,530 Ви насправді не роблять нічого з самої рядки. 378 00:23:32,530 --> 00:23:37,500 Так що навіть якщо ви поняття не маєте, як би ви вирішити цю проблему в коді, 379 00:23:37,500 --> 00:23:45,080 високому рівні, концептуально, що ми повинні зробити для того, щоб та справжня копія з, мабуть? 380 00:23:46,670 --> 00:23:48,820 Так. >> [Студент] дати йому нове місце? >> Саме так. 381 00:23:48,820 --> 00:23:50,800 >> Ми повинні дати т новому місці. 382 00:23:50,800 --> 00:23:55,230 Нам потрібно якимось чином створити світ, в якому ми отримуємо новий шматок пам'яті, 383 00:23:55,230 --> 00:24:00,090 які просто для ясності я буду малювати прямо під цим, але це не повинні бути там. 384 00:24:00,090 --> 00:24:04,880 Але вона повинна бути того ж розміру, так що я буду малювати ці вертикальні лінії в тому ж місці. 385 00:24:04,880 --> 00:24:09,720 Це нормально, якщо це все фігня на початковому етапі. Хто знає, що там було? 386 00:24:09,720 --> 00:24:13,850 Але крок 1 буде потрібно, дайте мені стільки пам'яті, скільки мені потрібно 387 00:24:13,850 --> 00:24:18,630 , Щоб відповідати копію привіт, а потім з'ясувати, як скопіювати ч тут, електронну тут, 388 00:24:18,630 --> 00:24:20,390 л Тут і так далі. 389 00:24:20,390 --> 00:24:24,880 Але це вже повинні відчувати себе трохи очевидна, навіть якщо деякі деталі все ще абстрактно. 390 00:24:24,880 --> 00:24:28,690 Щоб скопіювати цей рядок у цьому, це просто цикл або час циклу 391 00:24:28,690 --> 00:24:31,580 або те, з чим ви стали все більш знайомим. 392 00:24:31,580 --> 00:24:35,970 Так давайте спробуємо це. Відпустіть мене в copy2.c. 393 00:24:35,970 --> 00:24:43,270 У copy2.c ми маємо майже ту ж програму, за винятком лінії 27. 394 00:24:43,270 --> 00:24:47,260 Це виглядає трохи складним, але якщо ми розбити його по частинах, 395 00:24:47,260 --> 00:24:48,950 ліва сторона те ж саме. 396 00:24:48,950 --> 00:24:52,790 Char * т створює цю річ в пам'яті, хоча і зі знаком питання 397 00:24:52,790 --> 00:24:54,680 тому що ми поняття не маємо, що там за замовчуванням. 398 00:24:54,680 --> 00:24:57,920 З правого боку ми тепер введення нової функції, Танос, 399 00:24:57,920 --> 00:25:00,640 на пам'ять виділити, дай мені пам'яті, 400 00:25:00,640 --> 00:25:06,900 і він, очевидно, бере, скільки аргументів, скільки речей у дужках? 401 00:25:09,660 --> 00:25:12,130 Я почув ремствування 1 і 2, але це всього лише 1. 402 00:25:12,130 --> 00:25:15,320 Там немає коми, яка означає, що є тільки 1 річ у круглих дужках. 403 00:25:15,320 --> 00:25:17,720 Хоча є інші дужки, дозвольте мені підкреслити 404 00:25:17,720 --> 00:25:21,460 те, що всередині самої зовнішньої дужки, і саме цей вираз: 405 00:25:21,460 --> 00:25:25,880 (StrLen (и) + 1) * SizeOf (Char). 406 00:25:25,880 --> 00:25:29,190 Таким чином, якщо ми насправді думаю, що це до кінця, це говорить мені довжини с. 407 00:25:29,190 --> 00:25:34,440 Чому я, правда, додавши 1 на довжині? >> [Нерозбірливо відповідь студента] 408 00:25:34,440 --> 00:25:40,200 Саме так. Нам потрібно місце для цього хлопця в хвіст, шостий символ, який не має сенсу англійською 409 00:25:40,200 --> 00:25:42,250 але є спеціальні програмні сенс. 410 00:25:42,250 --> 00:25:46,800 >> Так що нам потрібно + 1 за це, тому StrLen повертає людину очікування довжини, 411 00:25:46,800 --> 00:25:50,890 привіт чи 5, це не дає вам додаткові нульового символу. 412 00:25:50,890 --> 00:25:52,980 Так що я вручну додати це з + 1. 413 00:25:52,980 --> 00:25:56,060 І тоді це, * розмір (символ), ми не бачили цього раніше. 414 00:25:56,060 --> 00:25:57,480 Це технічно не є функцією. 415 00:25:57,480 --> 00:26:04,150 Це спеціальне ключове слово, яке просто говорить вам, що розмір деяких типів даних на комп'ютері 416 00:26:04,150 --> 00:26:06,980 тому що насправді, деякі з нас мають 32-розрядних комп'ютерах. 417 00:26:06,980 --> 00:26:10,900 У мене досить старий комп'ютер вдома, і він використовує тільки 32 біта для подання покажчиків. 418 00:26:10,900 --> 00:26:13,900 І тому, якщо я зробив розмір типу даних, це може бути 32 біт. 419 00:26:13,900 --> 00:26:18,300 Але якщо я використовую мій новий модний комп'ютер, я міг би повернути значення 64 біт 420 00:26:18,300 --> 00:26:20,510 щось на зразок адреси. 421 00:26:20,510 --> 00:26:25,400 Таким чином, в цьому випадку, просто, щоб бути супер безпечно, ми не збираємося на жорсткому щось подібне коду - 422 00:26:25,400 --> 00:26:28,740 Ну, що розмір символів в залежності від того, що ми говорили досі? 423 00:26:28,740 --> 00:26:34,450 Ми в значній мірі сказав усно, що це 1 байт, і, що дуже багато щирих через борт. 424 00:26:34,450 --> 00:26:37,000 Але, знову ж, припущення, як правило, погано. 425 00:26:37,000 --> 00:26:40,850 Вони призводять до помилки в програмному забезпеченні, якщо люди використовують програмне забезпечення таким чином, ви не маєте наміру. 426 00:26:40,850 --> 00:26:44,750 Так що давайте це абстрактне, і прямо говорити в більш загальному 427 00:26:44,750 --> 00:26:46,830 Мені це потрібно багато ділянок пам'яті 428 00:26:46,830 --> 00:26:50,210 і кожен шматок пам'яті повинна бути еквівалентна розміру характеру, 429 00:26:50,210 --> 00:26:54,870 який насправді дорівнює 1 в цьому випадку, але це більш загальний спосіб написання. 430 00:26:54,870 --> 00:27:00,460 Таким чином, якщо слово привіт, скільки байт робить Танос мабуть виділити на що-небудь? 431 00:27:00,460 --> 00:27:04,980 [Студент] Six. >> Шість. Рівно стільки, скільки ми маємо знаки питання на екрані. 432 00:27:04,980 --> 00:27:07,800 А потім зробити припущення тепер заснована на ваше розуміння GetString 433 00:27:07,800 --> 00:27:12,790 Що ж Танос, ймовірно, повернуться? >> [Студент] адресу. 434 00:27:12,790 --> 00:27:17,020 Адреса який? З першого блоку пам'яті. 435 00:27:17,020 --> 00:27:20,670 >> Ми поняття не маємо, що там, тому що деякі інші функції 436 00:27:20,670 --> 00:27:23,010 можна було б за допомогою цієї пам'яті раніше. 437 00:27:23,010 --> 00:27:28,380 Але Танос, як GetString повертає адреса першого байта пам'яті 438 00:27:28,380 --> 00:27:30,540 що він виділив для вас. 439 00:27:30,540 --> 00:27:38,380 Однак те, що воно не зробити, це заповнити цю прогалину з нульового символу зворотної косої межі 440 00:27:38,380 --> 00:27:43,030 тому що виявляється, можна використовувати Танос виділити все що завгодно: цілі, рядки, масиви, 441 00:27:43,030 --> 00:27:45,700 поплавці, студент структур. 442 00:27:45,700 --> 00:27:47,750 Ви можете використовувати Танос повністю в загальних рисах. 443 00:27:47,750 --> 00:27:51,470 Він не піклується чи повинні знати, що ви виділення пам'яті для. 444 00:27:51,470 --> 00:27:55,810 Тому було б самовпевнено Танос поставити \ 0 445 00:27:55,810 --> 00:27:58,340 В кінці кожного блоку пам'яті це дає вам 446 00:27:58,340 --> 00:28:02,620 тому що це \ 0 річ просто конвенцію для рядків. 447 00:28:02,620 --> 00:28:06,310 Це не для цілих чисел, він не використовується для поплавців, він не використовується для студентів. 448 00:28:06,310 --> 00:28:11,730 І так Гоча з Танос в тому, що тягар повністю на вас програміст 449 00:28:11,730 --> 00:28:16,790 згадати, скільки байтів виділяються і не коли-небудь використовувати для циклу 450 00:28:16,790 --> 00:28:21,570 або петлю, і пройти повз кордону блоку пам'яті ви отримали. 451 00:28:21,570 --> 00:28:23,540 Іншими словами, як тільки ви виділити пам'ять, 452 00:28:23,540 --> 00:28:28,510 Ви не можете запитати операційної системи, ой, до речі, наскільки великий шматок пам'яті це було? 453 00:28:28,510 --> 00:28:32,080 Це повністю залежить від вас, щоб пам'ятати, якщо ви маєте потребу в цьому цінність. 454 00:28:32,080 --> 00:28:34,330 >> Отже, давайте подивимося, як я приступити до використання цієї пам'яті. 455 00:28:34,330 --> 00:28:38,430 У рядку 28 і 29, чому я це роблю? 456 00:28:39,850 --> 00:28:42,260 Тільки спільна перевірка осудності. 457 00:28:42,260 --> 00:28:45,110 Тільки у випадку, якщо щось пішло не так, я прошу якийсь божевільний обсяг пам'яті 458 00:28:45,110 --> 00:28:48,690 або я так багато працює на комп'ютері, що там просто не вистачає пам'яті, 459 00:28:48,690 --> 00:28:51,780 щось на зразок цього, я принаймні хочете перевірити на NULL. 460 00:28:51,780 --> 00:28:55,260 У дійсності, більшість комп'ютерів дасть вам ілюзію, що всі програми 461 00:28:55,260 --> 00:28:57,080 Можна використовувати сукупність оперативної пам'яті, 462 00:28:57,080 --> 00:29:00,740 але навіть у цьому випадку, якщо користувач вводить деякі божевільні довгий рядок, може бути, тому, що вони поганого хлопця 463 00:29:00,740 --> 00:29:03,440 і вони насправді намагаються привести до збою програми чи зламати його, 464 00:29:03,440 --> 00:29:07,300 Ви хочете, щоб принаймні перевірити повернене значення Танос і чи буде вона дорівнює нулю. 465 00:29:07,300 --> 00:29:11,630 І якщо це так, давайте просто кинути прямо зараз, тому що я не знаю, що робити в цьому випадку. 466 00:29:11,630 --> 00:29:13,950 Як скопіювати рядок? Там є кілька способів зробити це. 467 00:29:13,950 --> 00:29:18,850 Є вул скопіювати функції в C, але це супер просто для нас, щоб зробити це старомодним способом. 468 00:29:18,850 --> 00:29:23,110 >> Перш за все дозвольте мені з'ясувати, що довжина и їсти. 469 00:29:23,110 --> 00:29:26,930 Я міг би зробити це в циклі, але замість цього я просто поклав його тут для ясності. 470 00:29:26,930 --> 00:29:30,610 Таким чином, п тепер зберігає довжину вихідної рядки, мабуть, 5. 471 00:29:30,610 --> 00:29:35,290 Тоді в моїй циклу я ітерації від 0о до п, 472 00:29:35,290 --> 00:29:40,940 і на кожній ітерації я ставлю з [я] всередині т [I]. 473 00:29:40,940 --> 00:29:45,060 Так ось що я мав на увазі з моїми 2-ма пальцями, вказуючи на рядків до. 474 00:29:45,060 --> 00:29:49,260 Як це цикл ітерації, як це, я збираюся бути копіювання ч в тут, 475 00:29:49,260 --> 00:29:52,890 е в тут, я тут, тому що в цей с, це т. 476 00:29:52,890 --> 00:29:58,770 І тоді, нарешті, в рядку 35, чому я це роблю? 477 00:29:58,770 --> 00:30:03,770 Мені потрібно, щоб переконатися, що я в кінцевому рядок тонн. 478 00:30:03,770 --> 00:30:06,170 І я зробив це таким чином, щоб бути супер явним. 479 00:30:06,170 --> 00:30:09,510 Але пропоную, хтось, якщо б ви могли, різних способів зробити це. 480 00:30:09,510 --> 00:30:13,930 Я дійсно не потрібна рядок 35. Там ще один спосіб зробити це. 481 00:30:13,930 --> 00:30:18,880 Так. >> [Нерозбірливо відповідь студента] >> Скажи це голосніше. 482 00:30:18,880 --> 00:30:20,960 [Студент] менше або дорівнює. >> Саме так. 483 00:30:20,960 --> 00:30:24,450 Ми могли б просто сказати, менше або дорівнює N, яка в цілому була поганою 484 00:30:24,450 --> 00:30:28,190 тому що майже завжди, коли ми йдемо в рівній речі ми розраховуємо 485 00:30:28,190 --> 00:30:30,000 ми йдемо 1 крок занадто далеко. 486 00:30:30,000 --> 00:30:32,170 Але пам'ятаєте, скільки байтів Чи ми виділити? 487 00:30:32,170 --> 00:30:37,210 Ми виділили з StrLen с, тому 5 + 1 на загальну суму 6. 488 00:30:37,210 --> 00:30:39,980 Так що в цьому випадку ми могли б зробити щось на зразок цього 489 00:30:39,980 --> 00:30:46,450 так що ми копіювання не тільки привіт, але й \ 0 в самому кінці. 490 00:30:46,450 --> 00:30:49,860 Крім того, ми могли б використовувати функцію вул копія, зЬгсру, 491 00:30:49,860 --> 00:30:51,700 але це не було б майже так само весело. 492 00:30:51,700 --> 00:30:54,000 Але це все, що він робить під капотом. 493 00:30:54,000 --> 00:30:56,050 Тоді, нарешті, ми робимо те ж саме, що і раніше. 494 00:30:56,050 --> 00:31:01,620 Я капіталізувати т, а потім я стверджую, що оригінальна виглядає наступним чином і копія виглядає так. 495 00:31:01,620 --> 00:31:08,570 Так давайте спробуємо це зараз. Відпусти мене тут. Зробити copy2. Ми будемо збільшувати і запустити copy2. 496 00:31:08,570 --> 00:31:13,840 Я збираюся ввести привіт в нижньому регістрі, та й я отримую нижній привіт, як оригінал 497 00:31:13,840 --> 00:31:16,930 але капітал Привіт для копіювання. 498 00:31:16,930 --> 00:31:20,300 Але я не зробив тільки поки. Мені потрібно зробити 1 остання річ тут. 499 00:31:20,300 --> 00:31:28,000 46 і 47 чітко звільняючи оперативну пам'ять, але що це насправді означає? 500 00:31:28,000 --> 00:31:33,250 Що я роблю, як ти думаєш, зателефонувавши за телефоном лінії 46 і лінії 47? 501 00:31:33,250 --> 00:31:38,900 Які наслідки це має? Так. 502 00:31:38,900 --> 00:31:43,140 [Нерозбірливо відповідь студента] >> Саме так. 503 00:31:43,140 --> 00:31:46,380 >> Ви просто говорите операційної системи, привіт, дякую за цю пам'ять. 504 00:31:46,380 --> 00:31:48,320 Тепер ви можете використовувати його для когось ще. 505 00:31:48,320 --> 00:31:50,790 А ось прекрасний приклад сміття значення. 506 00:31:50,790 --> 00:31:55,430 Я тільки що використовував цю пам'ять, щоб записати слово привіт в 2 місцях, 507 00:31:55,430 --> 00:31:57,490 тут, тут, тут, і тут. 508 00:31:57,490 --> 00:32:00,910 Таким чином, це ч-е-л-л-о-\ 0. 509 00:32:00,910 --> 00:32:06,960 Але тоді я називаю лінією 46 і лінією 47, і ви знаєте, що там відбувається, з точки зору картина? 510 00:32:06,960 --> 00:32:10,010 Насправді, почекайте, ця картина старого. 511 00:32:10,010 --> 00:32:12,550 Як тільки ми зробити копію, цей хлопець насправді вказує тут, 512 00:32:12,550 --> 00:32:16,110 так що давайте видалити цифри і просто абстрагуватися від, як наші стрілки знову. 513 00:32:16,110 --> 00:32:19,370 Що відбувається в цій картині, коли я дзвоню безкоштовно? 514 00:32:19,370 --> 00:32:22,750 [Нерозбірливо відповідь студента] >> Не парними. 515 00:32:22,750 --> 00:32:29,510 Якщо я зателефоную безкоштовно на с і т - свого роду питання з підступом - це картина не змінюється на всіх 516 00:32:29,510 --> 00:32:33,880 тому, що виклик і виклик з т просто говорить операційній системі, 517 00:32:33,880 --> 00:32:39,010 агов, ви можете використовувати цю пам'ять знову, але це не змінює цього до нуля 518 00:32:39,010 --> 00:32:41,840 або спеціальними символами, це не змінити, 519 00:32:41,840 --> 00:32:47,350 це не змінює год або електронною або л або л або виведення в будь-якому місці ні з чим. 520 00:32:47,350 --> 00:32:51,610 З точки зору картину, як тільки Ви телефонуєте безкоштовно, нічого не змінюється. 521 00:32:51,610 --> 00:32:56,570 І в цьому полягає походження сміття значення, тому що якщо я потім у цій програмі 522 00:32:56,570 --> 00:33:01,010 запитаєте операційної системи для додаткової пам'яті з GetString або Танос або щось на зразок того 523 00:33:01,010 --> 00:33:04,900 і операційна система говорить, звичайно, у мене є 12 байт пам'яті тільки звільнили, 524 00:33:04,900 --> 00:33:08,080 використовувати їх, що ви збираєтеся бути передані? 525 00:33:08,080 --> 00:33:10,830 Ви збираєтеся бути передана частина пам'яті, що ми зазвичай використовують 526 00:33:10,830 --> 00:33:13,700 з питальними знаками, але те, що ці знаки питання? 527 00:33:13,700 --> 00:33:17,000 Вони, виявляється, ч-е-л-л-о, ч-е-л-л-о. 528 00:33:17,000 --> 00:33:20,940 Це наші нові значення сміттям, як тільки ви звільнити цю пам'ять. 529 00:33:20,940 --> 00:33:22,750 >> Там в реальному світі імплікації тут. 530 00:33:22,750 --> 00:33:24,720 Це відбувається, робити з оперативною пам'яттю, але ваші комп'ютери 531 00:33:24,720 --> 00:33:26,720 насправді зробити те ж саме з диска. 532 00:33:26,720 --> 00:33:30,620 Ми поговоримо про це, зокрема, з майбутнім поставленої задачі, яка фокусується на судової експертизи. 533 00:33:30,620 --> 00:33:36,170 Але те, що відбувається насправді якщо у вас є деякі чутливі фінансові файл на робочому столі 534 00:33:36,170 --> 00:33:39,600 або деякі уривчасті JPEG, і ви перетягнете його в сміття, 535 00:33:39,600 --> 00:33:44,390 що відбувається, коли ви перетягнете його в сміттєве відро або кошик? 536 00:33:44,390 --> 00:33:47,240 Ви знали, що я говорю. [Сміх] 537 00:33:47,240 --> 00:33:52,370 Що відбувається, коли ви витягли, що докази у кошики або відро для сміття? 538 00:33:52,370 --> 00:33:55,920 [Нерозбірливо відповідь студента] 539 00:33:55,920 --> 00:33:58,000 Ну, так що обережніше. Що відбувається, коли ви це робите? 540 00:33:58,000 --> 00:34:01,030 Коротка відповідь: нічого, вірно? 541 00:34:01,030 --> 00:34:04,790 Ескізні або чутливої ​​файл як і раніше просто сидів там десь на вашому жорсткому диску. 542 00:34:04,790 --> 00:34:07,940 Більшість з нас хоча б навчилися на гіркому досвіді, що вам потрібно, щоб очистити ваше сміття 543 00:34:07,940 --> 00:34:10,429 або кошики насправді видалення файлів. 544 00:34:10,429 --> 00:34:13,440 І справді, коли ви клацніть правою кнопкою миші або клацніть на управління вашим відро для сміття 545 00:34:13,440 --> 00:34:15,580 або виберіть Файл, Empty Trash або будь-який інший 546 00:34:15,580 --> 00:34:21,420 і ви насправді очистити сміттєвий кошик або кошики, що насправді відбувається, то в цій картині? 547 00:34:22,810 --> 00:34:25,969 Більше нічого. Отже нічого насправді відбувається на диску. 548 00:34:25,969 --> 00:34:30,880 >> І якщо ми просто тимчасово відволіктися і писати - I'll просто використовувати задню цього. 549 00:34:30,880 --> 00:34:34,639 Так що тепер історія змінюється від RAM, який є, де існують програми 550 00:34:34,639 --> 00:34:39,250 в той час як ви працюєте них, на диску, який є, де вони зберігаються довгострокові 551 00:34:39,250 --> 00:34:42,920 навіть тоді, коли влада йде, на даний момент - і ми повернемося до цього в майбутньому - 552 00:34:42,920 --> 00:34:46,380 давайте просто робити вигляд, що це являє собою жорсткий диск всередині комп'ютера 553 00:34:46,380 --> 00:34:50,110 тому що ще в той день вони звикли бути круглими дисками, так само, як дискети. 554 00:34:50,110 --> 00:34:55,130 Так що якщо у вас є деякі чутливі файлів Excel, він може взяти на себе цю частину пам'яті 555 00:34:55,130 --> 00:34:59,770 на диску вашого комп'ютера, і я просто малювання ж довільного 1 і 0. 556 00:34:59,770 --> 00:35:03,970 Коли ви перетягнете файл так, щоб ваше відро для сміття або кошики, 557 00:35:03,970 --> 00:35:07,750 буквально нічого не відбувається тому, що компанії Apple і Microsoft тільки що вирішили 558 00:35:07,750 --> 00:35:10,450 відро для сміття і кошики насправді це просто тимчасові рамки. 559 00:35:10,450 --> 00:35:14,710 Може бути, врешті-решт ОС буде очистити його для вас, але, як правило, він нічого не робить, 560 00:35:14,710 --> 00:35:17,090 по крайней мере, до тих пір поки ви дійсно мало місця. 561 00:35:17,090 --> 00:35:20,870 >> Тим не менше, коли ви йдете в порожні сміття або порожні кошики, 562 00:35:20,870 --> 00:35:23,460 Аналогічно, нічого не відбувається в цій картині. 563 00:35:23,460 --> 00:35:28,590 Все, що відбувається в іншому місці на вашому комп'ютері, є свого роду таблиці. 564 00:35:28,590 --> 00:35:35,400 Це ніби як маленька шпаргалка, яка говорить, що, скажімо, resume.doc, 565 00:35:35,400 --> 00:35:40,920 так що ваше резюме у файл Microsoft Word жили на місці 123 на жорсткому диску, 566 00:35:40,920 --> 00:35:43,710 не в пам'яті, а не в пам'яті, а на жорсткому диску, 567 00:35:43,710 --> 00:35:49,050 і вашим уривчастих життя JPEG на 456, і ваш файл Excel живе на 789 або де завгодно. 568 00:35:49,050 --> 00:35:53,640 Коли ви видаляєте файли насправді спорожнення кошика чи кошика, 569 00:35:53,640 --> 00:35:59,530 ця картина не змінюється. 0 і 1 на жорсткому диску нікуди не ходжу. 570 00:35:59,530 --> 00:36:03,930 Але ця таблиця, ця маленька база даних сортів, змінюється. 571 00:36:03,930 --> 00:36:08,750 При видаленні вашого резюме, це як якби файл видаляється, в деякому розумінні, 572 00:36:08,750 --> 00:36:12,790 але комп'ютер не буде забувати, де ця штука живе на вашому жорсткому диску. 573 00:36:12,790 --> 00:36:17,870 0 і 1, які складають ваше резюме або будь-який з цих інших файлів залишаються недоторканими. 574 00:36:17,870 --> 00:36:21,960 >> Так що якщо ви зробили це випадково, ще є ненульова ймовірність 575 00:36:21,960 --> 00:36:25,800 що ви можете відновити дані за допомогою Нортон Утиліти та деякі комерційні програми 576 00:36:25,800 --> 00:36:29,810 чиї цілі в житті, щоб знайти 0 і 1, які начебто сироти, 577 00:36:29,810 --> 00:36:33,300 забули тут, але залишив тут, так що ви можете отримати ваші дані назад. 578 00:36:33,300 --> 00:36:38,410 Або судових слідчих поліції або ФБР буде насправді взяти жорсткий диск 579 00:36:38,410 --> 00:36:42,550 а насправді шукати зразки з 0 і 1, які виглядають як JPEG, виглядають як файли Excel, 580 00:36:42,550 --> 00:36:46,400 і відновити їх таким чином, навіть якщо комп'ютер забула їх там. 581 00:36:46,400 --> 00:36:49,820 Тому єдиний спосіб дійсно видалити дані, як ми будемо обговорювати в майбутньому, 582 00:36:49,820 --> 00:36:54,190 це, щоб вичистити або стерти файл або жорсткий диск - 583 00:36:54,190 --> 00:36:56,540 Ви не можете реально позбутися від 0 і 1 584 00:36:56,540 --> 00:36:59,440 тому що інакше ви б почати з гігабайтний жорсткий диск 585 00:36:59,440 --> 00:37:02,380 і ви в кінцевому підсумку з мегабайта жорсткого диска, якщо ви постійно були видалення, 586 00:37:02,380 --> 00:37:04,380 буквально, 0 і 1. 587 00:37:04,380 --> 00:37:06,310 Отже, що б ви зробили, якби ви дійсно хотіли, щоб замести сліди 588 00:37:06,310 --> 00:37:10,510 і основною проблемою є те, що ще є 0 і 1 на диску? 589 00:37:10,510 --> 00:37:14,930 Я бачу, хтось жестикулюючи, що ви фізично зламати пристрій. Це буде працювати. 590 00:37:14,930 --> 00:37:19,600 [Сміється] Але якщо це свого роду дороге рішення, що було б більш розумним? 591 00:37:19,600 --> 00:37:23,270 Так. >> [Студент] переписати їх. >> Перезаписати їх чи що? >> [Студент] Інші дані. 592 00:37:23,270 --> 00:37:29,070 Інші дані. Ви можете просто перезаписати диск з 0s і 1s або всі 0s, все 1s. 593 00:37:29,070 --> 00:37:31,230 >> І це дійсно те, що деякі програми робить. 594 00:37:31,230 --> 00:37:33,570 Ви можете купити програмне забезпечення або навіть отримати безкоштовне програмне забезпечення, 595 00:37:33,570 --> 00:37:36,610 і навіть вбудовану в Mac OS в ці дні, в меншій мірі в Windows, 596 00:37:36,610 --> 00:37:38,660 є здатність надійно стирати. 597 00:37:38,660 --> 00:37:41,960 Насправді, якщо ви хочете, щоб всі біжать додому сьогодні, якщо у вас є Mac і зробити це, 598 00:37:41,960 --> 00:37:45,740 якщо у вас є деякі речі у вашій відро для сміття, ви можете зробити Безпека Empty Trash, 599 00:37:45,740 --> 00:37:47,610 який робить саме це. 600 00:37:47,610 --> 00:37:53,350 Замість того щоб просто стерти файли тут, вона не стирає 0 і 1 тут, 601 00:37:53,350 --> 00:38:01,240 скоріше, він просто змінює їх, наприклад, на 0 і точка, точка, точка. 602 00:38:01,240 --> 00:38:05,330 Тому однією з ваших майбутніх psets насправді буде навмисно відновлення даних - 603 00:38:05,330 --> 00:38:08,430 фотографії, які ми взяли людей, місць і речей на території кампуса 604 00:38:08,430 --> 00:38:12,810 , Для якого ми будемо робити судово зображення карти пам'яті цифрової камери, 605 00:38:12,810 --> 00:38:17,120 який є точно такий же ідеєю - і ви будете мати, щоб бути оскаржені насправді знайти 606 00:38:17,120 --> 00:38:20,160 моделей, які являють собою зображення у форматі JPEG на жорсткий диск, 607 00:38:20,160 --> 00:38:23,610 так само, як, що колишній студент, лист, який я прочитав кілька тижнів тому зробив 608 00:38:23,610 --> 00:38:25,860 відновити фотографії своєї сестри. 609 00:38:25,860 --> 00:38:30,300 Чому б нам не взяти 5-хвилинну перерву тут, і ми перегрупуватися більш на пам'ять. 610 00:38:33,030 --> 00:38:38,610 Так ось де все стає трохи галюциногенний, але це дуже потужний крок 611 00:38:38,610 --> 00:38:40,480 до розуміння цього все більше. 612 00:38:40,480 --> 00:38:42,900 Ось програма під назвою pointers.c. 613 00:38:42,900 --> 00:38:45,430 Він є одним із зразків коду сьогодні. 614 00:38:45,430 --> 00:38:51,280 Зверніть увагу, що в перші кілька рядків, з 19 по 22, все, що ми робимо щось подібне GetString 615 00:38:51,280 --> 00:38:54,460 і повернення адреси, зберігання в с. 616 00:38:54,460 --> 00:38:58,380 Надалі для PSET навіть 3, якщо ви хочете, але PSET 4 і на 617 00:38:58,380 --> 00:39:01,030 де ви можете почати приймати ці навчальні коліс від себе, 618 00:39:01,030 --> 00:39:04,030 немає ніяких причин робити вигляд, що рядки існує. 619 00:39:04,030 --> 00:39:07,030 Це, звичайно, добре, щоб просто почати говорити символ *. 620 00:39:07,030 --> 00:39:12,610 >> Як осторонь, в онлайн-довідниках і книгах ви можете часто бачити на зірочку поряд із змінною. 621 00:39:12,610 --> 00:39:15,600 Ви навіть можете бачити простір навколо обидві сторони від нього. 622 00:39:15,600 --> 00:39:17,680 Всі ці функціонально правильно. 623 00:39:17,680 --> 00:39:21,180 Зараз, однак, ми будемо стандартизувати цей підхід, щоб зробити Super Clear 624 00:39:21,180 --> 00:39:24,000 , Що символ *, як кажуть покажчик на символ. 625 00:39:24,000 --> 00:39:25,680 Це тип даних. 626 00:39:25,680 --> 00:39:28,730 А потім ім'я змінної з в цьому випадку. 627 00:39:28,730 --> 00:39:31,180 Таким чином, ми отримали рядок, і ми назвали її з. 628 00:39:31,180 --> 00:39:35,180 А потім сюди, помітили, що я роблю насправді трохи хитрості. 629 00:39:35,180 --> 00:39:39,080 Це називається арифметика покажчиків, яка є свого роду супер просто. 630 00:39:39,080 --> 00:39:41,790 Це просто означає, складати і віднімати номери покажчиків. 631 00:39:41,790 --> 00:39:43,660 Але це насправді працює. 632 00:39:43,660 --> 00:39:49,170 Ця програма мабуть друкує 1 символ рядка з на лінію таким чином, що кінцевий результат - 633 00:39:49,170 --> 00:39:54,920 Точно так само ми можемо зіпсувати, де це відбувається, зробити покажчики, покажчики працювати, дозвольте мені змінити масштаб зображення 634 00:39:54,920 --> 00:39:58,940 Тепер дозвольте мені типу в щось на зразок привіт і тип Enter 635 00:39:58,940 --> 00:40:01,080 і він друкує 1 символу в рядку. 636 00:40:01,080 --> 00:40:04,730 До секунду назад, ми б зробили це з квадратними позначення кронштейна. 637 00:40:04,730 --> 00:40:09,760 Ми б цикл, і ми будемо робити Printf з [я], і ми будемо робити це знову і знову і знову 638 00:40:09,760 --> 00:40:11,950 з зворотною косою рисою п в кінці кожного рядка. 639 00:40:11,950 --> 00:40:16,800 Але ця програма відрізняється. Ця програма використовується, в буквальному сенсі, арифметика. 640 00:40:16,800 --> 00:40:18,860 Так що ж тут відбувається? 641 00:40:18,860 --> 00:40:24,720 Перш за все, до цього цикл виконує навіть те, що, просто щоб бути ясно, є насправді? 642 00:40:24,720 --> 00:40:27,270 S є? >> [Студент] адресу. >> Адреса. 643 00:40:27,270 --> 00:40:32,980 >> І це адреса, в випадку здрастуй, перший символ в тому, що слово, яке годину. 644 00:40:32,980 --> 00:40:37,370 Так що з Тобто, у даному конкретному прикладі, адреса годину. 645 00:40:37,370 --> 00:40:41,850 Так що ж це значить зробити з + я? 646 00:40:41,850 --> 00:40:46,280 Ну, я починається з 0 в цьому цикл. Ми робили це багато разів. 647 00:40:46,280 --> 00:40:49,760 Я маю намір йти до довжини рядка, мабуть. 648 00:40:49,760 --> 00:40:53,950 Таким чином, на першій ітерації цього циклу, я, очевидно, 0. 649 00:40:53,950 --> 00:41:01,740 Таким чином, цей вислів говорив з + я - скоріше, з +0--це, очевидно, тільки з. 650 00:41:01,740 --> 00:41:04,320 Так що ж таке * з тут? 651 00:41:04,320 --> 00:41:08,530 Зараз ми використовуємо зірка в дещо інший шлях. 652 00:41:08,530 --> 00:41:13,080 Дозвольте мені йти вперед і позбутися від т, тому що ми зробили говоримо про т і копії з. 653 00:41:13,080 --> 00:41:15,540 Зараз ми просто хочемо, щоб розповісти історію за участю с. 654 00:41:15,540 --> 00:41:20,090 І ось в цей момент, після того, як тип рядка, наш світ виглядає зовсім як це було раніше 655 00:41:20,090 --> 00:41:26,630 всього із зберіганням адресу год і в більш загальному вказуючи на рядок привіт. 656 00:41:26,630 --> 00:41:33,170 Якщо я зараз роблю такий рядок * (S + I), давайте спробуємо це. 657 00:41:33,170 --> 00:41:40,140 Так * (S + I). Дозвольте мені спростити це, тому що це 0, так що це * (S +0). 658 00:41:40,140 --> 00:41:43,790 Ну, почекай хвилинку. Спрощення далі. Це * (с). 659 00:41:43,790 --> 00:41:47,020 Ну, а тепер дужках є свого роду дурним, так що тепер давайте просто робити * с. 660 00:41:47,020 --> 00:41:50,540 Таким чином, у першій ітерації цього циклу, що лінія яка підкреслила, 26, 661 00:41:50,540 --> 00:41:53,650 в значній мірі еквівалентно друку цьому. 662 00:41:53,650 --> 00:41:56,040 Що таке тип даних * з? 663 00:41:56,040 --> 00:42:00,770 У цьому контексті, бо зірка опиниться поряд з себе, 664 00:42:00,770 --> 00:42:04,930 але більш конкретно, тому що ми більше не оголосивши їй, 665 00:42:04,930 --> 00:42:09,730 Ми не створюємо змінну більше, немає жодної згадки символ * в рядку 26, 666 00:42:09,730 --> 00:42:14,280 немає жодної згадки ключового слова рядки, ми просто за допомогою змінної с, 667 00:42:14,280 --> 00:42:19,650 Виявляється тепер зірка має дещо інший і, треба визнати, плутаючи сенс. 668 00:42:19,650 --> 00:42:26,590 * И тут означає перейти за адресою в с і друку все, що є. 669 00:42:26,590 --> 00:42:33,750 Таким чином, з тут, * S є - ніби як жолоби і драбини, слідуйте за стрілкою - тут. 670 00:42:33,750 --> 00:42:35,850 Так що це * с. 671 00:42:35,850 --> 00:42:39,060 >> Так що ж отримує надрукований на першій ітерації цього циклу в рядку 26? 672 00:42:39,060 --> 00:42:42,170 Я роздрукувати% C, який є прототипом для символу, 673 00:42:42,170 --> 00:42:48,520 Потім \ п для нового рядка. * (S + I), де я = 0 є саме це. 674 00:42:48,520 --> 00:42:53,670 Так що символ потрібно помістити в% для C? H. 675 00:42:53,670 --> 00:42:56,900 У наступній ітерації циклу - можна, ймовірно, побачити, де це відбувається - 676 00:42:56,900 --> 00:43:01,350 Наступна ітерація я, очевидно, 1, так що це означає з +1, 677 00:43:01,350 --> 00:43:05,580 і тепер мені потрібно дужки, тому що тепер зірка повинна сказати 678 00:43:05,580 --> 00:43:08,620 перейдіть за адресою пам'яті з +1. 679 00:43:08,620 --> 00:43:14,170 Що таке S? Давайте повернутися в минуле і сказати, що це стрілка зараз насправді не роблять нам ніяких позичені. 680 00:43:14,170 --> 00:43:18,450 Давайте більш конкретно сказати, що це зберіганні номер 123 681 00:43:18,450 --> 00:43:25,110 тому що на початку цього рядка Здравствуйте, це адреса 123, це 124, і так далі. 682 00:43:25,110 --> 00:43:30,550 Таким чином, на другій ітерації, коли я говорю з +1, це, як кажуть 123 +1, 683 00:43:30,550 --> 00:43:35,340 інакше відома як 124, так що символ отримує надрукований на другий ітерації? 684 00:43:35,340 --> 00:43:37,850 E на адресу пам'яті, 124. 685 00:43:37,850 --> 00:43:44,440 Потім знову +, 125, 126, 127, і ця петля на щастя зупиняється, перш ніж ми отримаємо тут 686 00:43:44,440 --> 00:43:49,040 тому що я використовую StrLen щоб переконатися, що я не вважає занадто високою. 687 00:43:49,040 --> 00:43:50,810 Так що це теж його. 688 00:43:50,810 --> 00:43:55,000 Знову ж таки, це як якби ми зробили тиждень тому. 689 00:43:55,000 --> 00:43:59,200 Дозвольте мені написати його на рядок нижче, хоча ми не хочемо, щоб зробити обидва. 690 00:43:59,200 --> 00:44:02,500 Це ідентично тепер до цього. 691 00:44:02,500 --> 00:44:08,310 >> Тому, навіть якщо з собою рядок, як ми називаємо його на тижні, а насправді символ *. 692 00:44:08,310 --> 00:44:13,270 Тому якщо ми хочемо, щоб бути супер анал, це дійсно правильний написати специфіка 693 00:44:13,270 --> 00:44:17,490 на р-м місці за допомогою цих числових адрес і ця зірка оператора, 694 00:44:17,490 --> 00:44:20,470 але, чесно кажучи, це просто так набагато чистіше. Таким чином, це не погано. 695 00:44:20,470 --> 00:44:26,720 Немає причин, щоб перестати робити лінію 27 тут, але 26 є функціонально те ж саме, 696 00:44:26,720 --> 00:44:31,570 і це функціонально той же рівно причин того, що ми обговорювали до сих пір. 697 00:44:31,570 --> 00:44:33,650 І, нарешті, 29 просто хороша практика. 698 00:44:33,650 --> 00:44:38,420 Виклик безкоштовно з означає, що тепер ви даєте задній пам'яті, яка дала вам GetString 699 00:44:38,420 --> 00:44:41,630 тому що знову, як я вже говорив понеділок, GetString тижні 700 00:44:41,630 --> 00:44:44,180 впроваджує помилка в коді. 701 00:44:44,180 --> 00:44:46,490 Ваш код тижнів була витік пам'яті 702 00:44:46,490 --> 00:44:49,970 яких ви запитували GetString для пам'яті, але ви ніколи не давав його назад. 703 00:44:49,970 --> 00:44:53,410 І це була свідомо обрана нами педагогічно 704 00:44:53,410 --> 00:44:55,880 тому що це просто занадто багато, щоб думати про початок. 705 00:44:55,880 --> 00:44:57,710 Але тепер нам потрібно більше симетрії. 706 00:44:57,710 --> 00:45:00,830 Якщо ви запитаєте комп'ютер для пам'яті, як і у випадку з GetString, 707 00:45:00,830 --> 00:45:02,820 як і у випадку мабуть Танос, 708 00:45:02,820 --> 00:45:07,970 Ви повинні тепер PSET 4 і в подальших також безкоштовно будь такої пам'яті. 709 00:45:07,970 --> 00:45:11,650 Зауважте, що це відрізняється від того, Int N. 710 00:45:11,650 --> 00:45:15,040 Вам не потрібно, щоб звільнити це тому, що ви не дзвоните GetString 711 00:45:15,040 --> 00:45:16,890 і ви не дзвоните Танос. 712 00:45:16,890 --> 00:45:20,610 >> І навіть якщо ви називали GetInt, як ми бачимо в остаточному підсумку, 713 00:45:20,610 --> 00:45:25,520 GetInt не виділити пам'ять для вас, тому що ви можете обійти цілих чисел 714 00:45:25,520 --> 00:45:29,430 і плаває і букви так, як ми робили протягом тижня. 715 00:45:29,430 --> 00:45:33,960 Струни, однак, є особливими, тому що насправді вони конкатенації декількох символів. 716 00:45:33,960 --> 00:45:37,450 Таким чином, вони просто відрізняються від символів і поплавці й цілими тощо. 717 00:45:37,450 --> 00:45:39,980 Але ми повернемося до цього незабаром. 718 00:45:39,980 --> 00:45:44,920 Будь-які питання, то на цьому початку покажчики? Так. 719 00:45:44,920 --> 00:45:49,690 [Нерозбірливо запитання студента] 720 00:45:49,690 --> 00:45:51,440 Ах, дуже хороше запитання. 721 00:45:51,440 --> 00:45:55,790 Одна з небагатьох речей, C насправді робить для вас, що зручно, 722 00:45:55,790 --> 00:46:00,110 воно з'ясовує, для вас те, що розмір типу даних 723 00:46:00,110 --> 00:46:03,060 , А потім робить такий множення для вас. 724 00:46:03,060 --> 00:46:06,610 Це не має ніякого значення в разі символів, тому що майже завжди символ займає 1 байт, 725 00:46:06,610 --> 00:46:08,150 так що це просто працює. 726 00:46:08,150 --> 00:46:11,220 Але заради обговорення, якщо б ви були насправді друкувати цілі 727 00:46:11,220 --> 00:46:15,500 і ви намагалися роздрукувати деякі значення с, що вказувало на ціле число, 728 00:46:15,500 --> 00:46:20,720 Вам також не потрібно буде робити + 4 * я тільки тому, що Int становить 4 байти. 729 00:46:20,720 --> 00:46:25,780 Арифметика з покажчиками означає, що C і компілятор робити все, що математика для вас. 730 00:46:25,780 --> 00:46:29,190 Все, що ви повинні піклуватися про те, підрахунок роду в людському сенсі. Так. 731 00:46:29,190 --> 00:46:35,200 [Студент] Якщо ви оголошуєте рядки всередині циклу, ви повинні звільнити його пізніше? 732 00:46:35,200 --> 00:46:36,760 Хороше питання. 733 00:46:36,760 --> 00:46:41,390 >> Якщо ви оголосили рядки всередині циклу, ви повинні звільнити його пізніше? 734 00:46:41,390 --> 00:46:47,520 Вам потрібно всього лише вільною пам'яттю, що ви виділяєте з GetString або з Танос. 735 00:46:47,520 --> 00:46:53,110 Так що якщо ви тільки що сказали щось на кшталт - дозвольте мені фігурні дужки тепер так весь код пов'язані між собою. 736 00:46:53,110 --> 00:46:58,580 Якщо ви зробили щось, хоча buggily, як ця, символ * T = S, 737 00:46:58,580 --> 00:47:03,450 Вам не потрібно, щоб безкоштовно т т тому, що не пов'язане з яким-небудь згадкою Танос або GetString. 738 00:47:03,450 --> 00:47:08,960 Якщо, навпаки, ви зробили це, GetString, то так, вам потрібно буде безкоштовним тонн. 739 00:47:08,960 --> 00:47:14,350 І справді, ваш єдиний шанс зробити це зараз всередині цієї петлі, з того ж питання за рамки 740 00:47:14,350 --> 00:47:16,060 , Які ми обговорювали в минулому. 741 00:47:16,060 --> 00:47:18,830 В іншому випадку ви будете виділення пам'яті, виділення пам'яті, виділення пам'яті, 742 00:47:18,830 --> 00:47:21,230 і в кінці програми, тому що ви перебуваєте за межами цього циклу, 743 00:47:21,230 --> 00:47:24,240 т не існує, але ви ніколи не говорили операційної системи 744 00:47:24,240 --> 00:47:26,750 що вам не потрібно, що пам'ять більше. 745 00:47:26,750 --> 00:47:30,430 І незабаром, до PSET 4 або 5 ми озброїти вас з програмою під назвою Valgrind, 746 00:47:30,430 --> 00:47:34,160 які близькі за духом GDB в тому, що він отримав свого роду таємне інтерфейс, 747 00:47:34,160 --> 00:47:35,750 але його мета в житті, щоб допомогти вам. 748 00:47:35,750 --> 00:47:39,380 І Valgrind це програма, яка в майбутньому буде шукати ваші програми 749 00:47:39,380 --> 00:47:42,550 шукати витоки пам'яті, чи то від GetString або Танос, 750 00:47:42,550 --> 00:47:47,800 які ми почнемо, використовуючи все більше, як ми припинити використання CS50 бібліотеці стільки ж. 751 00:47:47,800 --> 00:47:53,030 Ми, нарешті, тепер є свого роду словника і свого роду ментальної моделі в теорії 752 00:47:53,030 --> 00:47:55,170 з яким для вирішення цієї зламаною програмі. 753 00:47:55,170 --> 00:47:59,410 >> Так що в цьому зламаною програми, своп працює всередині підкачки, 754 00:47:59,410 --> 00:48:05,280 але він ніколи не працював в основному тому, що основна пройшло в х і у, нагадаємо, 755 00:48:05,280 --> 00:48:07,260 і ті були прийняті в цінностями, так би мовити. 756 00:48:07,260 --> 00:48:09,330 Копії з них були дані поміняти. 757 00:48:09,330 --> 00:48:12,520 До кінця підкачки, і б дійсно були обмінені, 758 00:48:12,520 --> 00:48:16,120 але, звичайно, х і у, як ми обговорювали в понеділок, не було. 759 00:48:16,120 --> 00:48:19,940 Тому я пропоную в зеленому тут, що це насправді рішення тут. 760 00:48:19,940 --> 00:48:22,640 А насправді, дозвольте мені рухати зірки просто бути послідовним 761 00:48:22,640 --> 00:48:24,440 хоча, знову ж таки, функціонально це не має значення. 762 00:48:24,440 --> 00:48:28,730 У майбутньому тижнів ми будемо пояснювати, коли і чому це має значення. 763 00:48:28,730 --> 00:48:30,600 Таким чином, в зеленому зараз є рішенням. 764 00:48:30,600 --> 00:48:33,700 Чесно кажучи, це виглядає набагато брудніше, тому що у мене є всі ці зірки. 765 00:48:33,700 --> 00:48:35,380 Дозвольте мені зазначити одну річ. 766 00:48:35,380 --> 00:48:40,040 Верхній рядок тут, де він говорить Int * і Int * б 767 00:48:40,040 --> 00:48:42,820 принципово робить те ж саме, як це було завжди. 768 00:48:42,820 --> 00:48:47,070 Він заявляє, 2 аргументи або параметри поміняти, 769 00:48:47,070 --> 00:48:49,940 першим з яких є Int покажчика називається, 770 00:48:49,940 --> 00:48:53,100 другий з яких є Int покажчика називається б. 771 00:48:53,100 --> 00:48:55,770 Єдине, що нового на даний момент є те, що там є зірки. 772 00:48:55,770 --> 00:48:59,340 >> Що це значить? Чи не INT, б не є Int. 773 00:48:59,340 --> 00:49:04,100 Це адреса Int і б це адреса іншого Int. 774 00:49:04,100 --> 00:49:06,980 Тут, внизу, це де я визнаю C збиває з пантелику. 775 00:49:06,980 --> 00:49:09,790 Зараз ми використовуємо зіркою, але він має різне значення в цьому контексті. 776 00:49:09,790 --> 00:49:13,150 Тому що ми не оголошуємо покажчики, як ми тут, 777 00:49:13,150 --> 00:49:15,500 Тут ми разименованія речі. 778 00:49:15,500 --> 00:49:21,520 Таким чином, технічно, зірки в цьому контексті першої, другої і третьої лінії всередині своп 779 00:49:21,520 --> 00:49:24,560 є оператором разименованія, який просто означає, що йти туди. 780 00:49:24,560 --> 00:49:27,400 Так само, як мій палець пішов за стрілками годинника, 781 00:49:27,400 --> 00:49:31,100 * Кошти йдуть на цю адресу і знайти мене Int, що є. 782 00:49:31,100 --> 00:49:34,250 * В означає, перейти за адресою і передати мені, що там. 783 00:49:34,250 --> 00:49:40,730 Так що давайте перемальовувати зображення з понеділка тепер використовується стек кадрів, 784 00:49:40,730 --> 00:49:43,130 нижній, один з яких буде основним, 785 00:49:43,130 --> 00:49:47,600 верхня, одна з яких буде своп, 786 00:49:47,600 --> 00:49:50,880 так що наш світ виглядає, як понеділка, як це. 787 00:49:50,880 --> 00:49:53,620 Ось шматок пам'яті, що основною збирається використовувати. 788 00:49:53,620 --> 00:49:56,520 >> Нагадаємо, з понеділка, що програма просто було 2 змінних, 789 00:49:56,520 --> 00:50:01,930 одна називається х і одна називається у, і я поклав числа 1 і 2. 790 00:50:01,930 --> 00:50:06,580 Тепер, коли я називаю поміняти, як я зробив у понеділок, 791 00:50:06,580 --> 00:50:11,000 Раніше, коли я використовував червону версію цієї програми, яка виглядає так, 792 00:50:11,000 --> 00:50:17,470 Я отримав 2 параметри, а, б, і що ж ми пишемо тут і тут? 793 00:50:17,470 --> 00:50:21,160 Тільки 1 і 2, буквально копіює х і у. 794 00:50:21,160 --> 00:50:23,070 Сьогодні ми це змінити. 795 00:50:23,070 --> 00:50:28,510 Сьогодні замість передачі в цілих а і б ми збираємося передати в 2-адрес. 796 00:50:28,510 --> 00:50:34,290 Ці адреси трапитися, щоб вказати на цілі, але ці адреси не цілими себе. 797 00:50:34,290 --> 00:50:37,330 Вони адрес. Це як поштова адреса. 798 00:50:37,330 --> 00:50:40,580 Так що тепер нам потрібно просто дати собі трохи більш докладно на екрані. 799 00:50:40,580 --> 00:50:43,250 Це моя пам'ять комп'ютера, як це було весь день. 800 00:50:43,250 --> 00:50:45,120 Тепер нам потрібно довільної схеми нумерації. 801 00:50:45,120 --> 00:50:50,580 Так що давайте просто скажемо, просто випадково, що це адреса пам'яті, 123, 124. 802 00:50:50,580 --> 00:50:55,660 Давайте просто скажемо, що це 125, це 126, і так далі, але це абсолютно довільними. 803 00:50:55,660 --> 00:50:58,590 Нам просто потрібно деякий схеми нумерації в моїй пам'яті. 804 00:50:58,590 --> 00:51:04,030 Так що тепер, коли я насправді проходять в х і у, я не збираюся переходити в х і у; 805 00:51:04,030 --> 00:51:08,400 Я збираюся перейти в поштову адресу, так би мовити, х і у 806 00:51:08,400 --> 00:51:11,870 так що те, що отримує зберігається тут і тут не 1 і 2, 807 00:51:11,870 --> 00:51:16,030 Але якщо ви можете побачити мої дрібний текст, те, що пройшло в тут і тут? 808 00:51:16,030 --> 00:51:23,340 [Нерозбірливо відповідь студента] >> Саме так. 123 отримує покласти тут, і 124 отримує покласти тут. 809 00:51:23,340 --> 00:51:28,910 >> Тепер, тому що я використовував зірка в цій самій першому рядку шлях тут, на вершині, 810 00:51:28,910 --> 00:51:34,340 моя програма просто знає, що 123 і 124, хоча вони, очевидно, цілі 811 00:51:34,340 --> 00:51:40,160 що будь-яка людина міг помітити, вони повинні бути інтерпретовані як адреси, числові адреси. 812 00:51:40,160 --> 00:51:43,250 Вони не є самі по собі цілими, вони адрес, 813 00:51:43,250 --> 00:51:46,120 і це тому, що я явно поставив зірки там. 814 00:51:46,120 --> 00:51:51,360 Так що тепер у моїй першій, другій і третій лінії фактичного коду, що тут відбувається? 815 00:51:51,360 --> 00:51:53,380 Давайте намалюємо решті частини картини. 816 00:51:53,380 --> 00:51:56,980 Tmp так само, як це було в понеділок. Нічого особливого TMP. 817 00:51:56,980 --> 00:52:03,060 Це просто місцевий 32 біт змінної, так і всередині, що я мабуть зберігання значення *. 818 00:52:03,060 --> 00:52:08,580 Тепер, якщо я тільки що сказав, TMP =, що б я тут? >> [Студент] 123. 819 00:52:08,580 --> 00:52:10,370 123. Але це не те, що я роблю. 820 00:52:10,370 --> 00:52:13,670 Я кажу TMP = *. Зірка кошти йдуть туди. 821 00:52:13,670 --> 00:52:19,370 Так от, 123. Як мені туди йти? Прикиньтеся, що є стрілка. 822 00:52:19,370 --> 00:52:24,460 Ну, так і є, 1. Так що ж отримує зберігається у TMP, по-видимому? Просто 1. 823 00:52:24,460 --> 00:52:29,620 Отже, іншими словами, TMP є *, * кошти йдуть на адресу, який є в даний час, 824 00:52:29,620 --> 00:52:31,320 по-видимому, 123. 825 00:52:31,320 --> 00:52:33,910 >> Ну, ось ми і на місці 123, я бачу, № 1, 826 00:52:33,910 --> 00:52:35,670 так що я збираюся поставити номер 1 там. 827 00:52:35,670 --> 00:52:39,020 Тепер те, що я роблю в рядку 2, * = * б? 828 00:52:39,020 --> 00:52:44,570 Це одна трохи складніше, тому що тепер це? Це 123. 829 00:52:44,570 --> 00:52:50,220 Так що * це де? Там, де я був раніше. Так що йдіть туди. Добре. 830 00:52:50,220 --> 00:52:53,420 Тепер, нарешті, і, нарешті, це почне мати сенс, сподіваюся, 831 00:52:53,420 --> 00:53:00,280 * Б означає, що в б? 124. Так що мені потрібно піти туди, що на 2. 832 00:53:00,280 --> 00:53:03,430 Так що я ставлю де? 833 00:53:03,430 --> 00:53:10,100 2 йде в тут, тому що * б * переходить в. Так що я буду робити. 834 00:53:10,100 --> 00:53:13,120 І ви вже можете бачити, мабуть, що ми набагато ближче 835 00:53:13,120 --> 00:53:17,710 до вирішення цієї дурної, просте завдання правильно в перший раз 836 00:53:17,710 --> 00:53:20,920 тому що тепер у нас ще є спогад про те, що х був, 837 00:53:20,920 --> 00:53:23,230 у нас є 2-х примірниках, по загальному визнанню, у, 838 00:53:23,230 --> 00:53:25,850 але лінія 3 тепер говорить, * б. 839 00:53:25,850 --> 00:53:31,080 Так от б. * В означає піти туди. Так де ж розташування 124? 840 00:53:31,080 --> 00:53:35,560 Це мабуть тут. Отже, що ж я тут? Очевидно, TMP. 841 00:53:35,560 --> 00:53:39,600 Так що тепер я це роблю. Так що у мене є 1 і 2 тут тут. 842 00:53:39,600 --> 00:53:43,560 І що тепер про все це, 123, 124 і 1? 843 00:53:43,560 --> 00:53:47,910 Як тільки своп повертається, ця пам'ять так добре, як втратили 844 00:53:47,910 --> 00:53:51,070 тому що як тільки своп повертається, операційна система 845 00:53:51,070 --> 00:53:54,190 має право використовувати цю пам'ять в майбутньому. 846 00:53:54,190 --> 00:53:58,870 Тільки основної пам'яті в нижній цього так званого стеком тиняється поблизу. 847 00:53:58,870 --> 00:54:01,470 >> І ось ми, нарешті, зараз робоча версія. 848 00:54:01,470 --> 00:54:06,310 Відпустіть мене в swap.c, і зверніть увагу на наступне. 849 00:54:06,310 --> 00:54:11,280 У верхній частині програми я змінив мій прототип, щоб бути Int * і * б Int. 850 00:54:11,280 --> 00:54:15,000 Так що єдине, що я змінилася, щоб перейти від червоного, який був поганий, на зелений, і це добре, 851 00:54:15,000 --> 00:54:17,350 це я додав ці зірки сьогодні. 852 00:54:17,350 --> 00:54:21,520 Але тут, в самій поміняти мені довелося скопіювати, вставити те, що було тільки на слайді. 853 00:54:21,520 --> 00:54:24,140 У мене є зірка тут, зірка тут - що відповідає прототипу - 854 00:54:24,140 --> 00:54:27,930 і тоді всі ці речі тепер мають зірки, за винятком TMP 855 00:54:27,930 --> 00:54:30,680 тому, що використання тимчасових змінних, немає нічого нового. 856 00:54:30,680 --> 00:54:33,040 Мені просто потрібно тимчасове сховище для внутр. 857 00:54:33,040 --> 00:54:34,820 Таким чином, нам не потрібні зірки там. 858 00:54:34,820 --> 00:54:39,310 Нам просто потрібно зірці, щоб ми могли перетнути такого роду довільні кордону 859 00:54:39,310 --> 00:54:42,900 Між цими 2 кадри в пам'яті мого комп'ютера. 860 00:54:42,900 --> 00:54:45,630 Але останнє, що має змінитися, і ви, можливо, побачив його вже. 861 00:54:45,630 --> 00:54:48,810 Які інші лінії, очевидно, відрізняється тепер? >> [Студент] & х. 862 00:54:48,810 --> 00:54:53,270 >> Так, так що 25 є останньому рядку коду мені потрібно змінити, щоб це працювало. 863 00:54:53,270 --> 00:54:58,360 Тиждень тому, і навіть в понеділок лінії 25 виглядала так, поміняйте місцями х і у, 864 00:54:58,360 --> 00:55:02,020 і це було просто зламана, тому що якщо ви говорите свопу (х, у) 865 00:55:02,020 --> 00:55:05,660 Ви даєте копії х і у поміняти, то він робить свою справу, 866 00:55:05,660 --> 00:55:09,080 але ви ніколи не міняється х і у себе. 867 00:55:09,080 --> 00:55:12,880 Так що навіть якщо ви ніколи не бачили цей символ, перш ніж з амперсанд в коді, 868 00:55:12,880 --> 00:55:15,860 просто взяти припущення. Що робити амперсанд, мабуть? 869 00:55:15,860 --> 00:55:17,890 [Студент] приймає адресу. >> Бере адресу. 870 00:55:17,890 --> 00:55:21,160 Таким чином, амперсанд говорить, дайте мені адресу х. 871 00:55:21,160 --> 00:55:25,590 Хто знає, де це? Це трапляється, 123. Мені все одно. Просто дайте мені адресу х. 872 00:55:25,590 --> 00:55:28,340 І у означає дати мені адресу у. 873 00:55:28,340 --> 00:55:34,450 І в цей момент історія цілком узгоджується з картиною ми зробили хвилину тому. 874 00:55:34,450 --> 00:55:38,310 >> Таким чином, я визнаю, покажчики, звичайно, для мене, коли я вперше почав Дізнавшись про це, 875 00:55:38,310 --> 00:55:40,570 був безперечно одним з найважчих речей, щоб обернути свій розум навколо. 876 00:55:40,570 --> 00:55:43,760 Але розумієте, тим більше, що ми продовжуємо грати з цими речами, 877 00:55:43,760 --> 00:55:48,030 Якщо ви розбити його на ці супер простий вид інтелектуально нецікаві проблеми 878 00:55:48,030 --> 00:55:52,270 всього рухомого навколо номера, відповідь на багато плутанини з покажчиками 879 00:55:52,270 --> 00:55:56,590 дійсно може бути отримана з цих самих основних механіки. 880 00:55:56,590 --> 00:55:59,070 Ось адреса. Піди туди із зіркою. 881 00:55:59,070 --> 00:56:03,830 Або навпаки, ось амперсанд. З'ясувати, що адресу насправді. 882 00:56:03,830 --> 00:56:06,270 Добре. 883 00:56:06,270 --> 00:56:09,000 Так де ж все це пам'ять приходять? 884 00:56:09,000 --> 00:56:12,360 Ми намалювали цю картину кілька разів, і я тримаю перспективним, ми повернемося до нього, 885 00:56:12,360 --> 00:56:14,920 але от уявлення пам'яті комп'ютера 886 00:56:14,920 --> 00:56:17,420 , Що трохи більше, ніж наші помічені дошці тут. 887 00:56:17,420 --> 00:56:21,590 Текст у верхньому сегменті становить те, що по відношенню до вашої програми? 888 00:56:21,590 --> 00:56:26,090 [Нерозбірливо відповідь студента] >> Вибачте? Скажіть ще раз. 889 00:56:26,090 --> 00:56:28,660 [Студент] Фактичне програми. >> Фактичною програмою. 890 00:56:28,660 --> 00:56:32,430 >> Таким чином, 0 і 1, що ви зібрали після написання коду C і потім запустити Clang 891 00:56:32,430 --> 00:56:35,910 і генеруючих 0 і 1 кінцях тим, що були там ховаються в пам'яті 892 00:56:35,910 --> 00:56:38,570 тому що, коли ви двічі клацніть значок на вашому Mac або PC 893 00:56:38,570 --> 00:56:43,010 або виконайте команду, як Маріо на ваше запрошення, ваше 0 і 1 з диска 894 00:56:43,010 --> 00:56:45,700 завантажуються в пам'ять, так що комп'ютер може керувати ними 895 00:56:45,700 --> 00:56:47,540 і виконувати їх швидше. 896 00:56:47,540 --> 00:56:50,880 Так початкові дані і неініціалізовані дані, ми не будемо багато говорити про тих, 897 00:56:50,880 --> 00:56:52,420 але це тільки глобальні змінні. 898 00:56:52,420 --> 00:56:54,710 Initialized означає глобальні змінні, які ви дали значення; 899 00:56:54,710 --> 00:56:59,300 неініціалізовані означає глобальні змінні, які ви ще не дають значення. 900 00:56:59,300 --> 00:57:01,900 Тоді є ці змінні оточення, які я повністю махнути рукою на, 901 00:57:01,900 --> 00:57:04,860 але вони є, і що магазини речі, як ім'я користувача 902 00:57:04,860 --> 00:57:08,090 та іншого роду нижній рівень подробиці. 903 00:57:08,090 --> 00:57:12,880 Але найсоковитіші шматки макет вашої пам'яті є те, що називається стека і купи. 904 00:57:12,880 --> 00:57:17,470 Стек знову, щоб було ясно, це пам'ять, яка використовується щоразу, коли функції викликаються, 905 00:57:17,470 --> 00:57:19,710 всякий раз, коли є локальні змінні 906 00:57:19,710 --> 00:57:22,120 а також за наявності параметрів, що передаються навколо. 907 00:57:22,120 --> 00:57:24,490 Все, що відбувається в стеці. 908 00:57:24,490 --> 00:57:29,570 Купа ми не говорили про це, але зробити припущення, хто використовує купу. 909 00:57:31,120 --> 00:57:32,690 Просто інший шматок пам'яті. 910 00:57:32,690 --> 00:57:36,620 Буває, який можна зробити тут, на вершині, але це довільне мальовничій конвенції. 911 00:57:36,620 --> 00:57:41,670 Хто Очевидно, використання пам'яті з купи тижні? 912 00:57:41,670 --> 00:57:44,830 Це технічно вас, але побічно. >> [Студент] GetString. 913 00:57:44,830 --> 00:57:47,950 GetString і Танос. Так ось принципова різниця. 914 00:57:47,950 --> 00:57:51,300 >> Ви знаєте, протягом останніх декількох тижнів, що якщо вам потрібна пам'ять, просто оголосити змінну. 915 00:57:51,300 --> 00:57:54,560 Якщо вам потрібно багато пам'яті, оголосити масив прямо всередині вашої функції. 916 00:57:54,560 --> 00:57:59,620 Але проблема ми зберегли зіткнулася, якщо ви оголосите змінні локально всередині функції, 917 00:57:59,620 --> 00:58:05,340 Як тільки функція повертає значення, що відбувається з пам'яттю і ці змінні? 918 00:58:05,340 --> 00:58:09,620 Тільки начебто це вже не ваш, чи не так? Він просто зникає роду концептуально. 919 00:58:09,620 --> 00:58:13,950 Це все ще фізично існує, очевидно, але це вже не ваше право на використання. 920 00:58:13,950 --> 00:58:17,160 Очевидно, що це проблематично, якщо ви хочете написати функції в житті 921 00:58:17,160 --> 00:58:20,440 що насправді виділяє пам'ять і не дають його назад. 922 00:58:20,440 --> 00:58:24,180 Справа в точку: GetString мети в житті, поняття не мають заздалегідь 923 00:58:24,180 --> 00:58:26,390 як великий з рядка Я збираюся ввести на клавіатурі, 924 00:58:26,390 --> 00:58:30,390 але він повинен бути в змозі виділити пам'ять для зберігання Давида або привіт 925 00:58:30,390 --> 00:58:32,860 або цілу статтю про те, що користувач, можливо, ввели дюйма 926 00:58:32,860 --> 00:58:35,280 Так GetString використовує Танос. 927 00:58:35,280 --> 00:58:38,910 Malloc тому необхідно використовувати не стек; 928 00:58:38,910 --> 00:58:40,770 Замість цього, використовуючи те, що називається купою. 929 00:58:40,770 --> 00:58:44,430 Там немає нічого іншого про пам'яті. Це не швидше або повільніше або що-небудь подібне. 930 00:58:44,430 --> 00:58:46,570 Це просто фізично у іншому місці. 931 00:58:46,570 --> 00:58:50,120 >> Але правило, що пам'ять яка виділяється в купі 932 00:58:50,120 --> 00:58:56,180 ніколи не буде відібране у вас, поки ви не зателефонуйте - зробити припущення - безкоштовно. 933 00:58:56,180 --> 00:59:00,510 З іншого боку, будь-яка пам'ять ви просите в стек просто оголошенні масиву 934 00:59:00,510 --> 00:59:03,320 або оголошення змінної, як ми робили протягом тижня, 935 00:59:03,320 --> 00:59:05,640 , Що за замовчуванням закінчується в стеці. 936 00:59:05,640 --> 00:59:09,550 І це прекрасно працює 90% часу, а на тих рідкісних випадках 937 00:59:09,550 --> 00:59:12,470 де ви хочете виділити пам'ять, і тримати його навколо, 938 00:59:12,470 --> 00:59:14,730 Потім ви повинні використовувати функції, як Танос. 939 00:59:14,730 --> 00:59:19,370 Або ми використовували функцію, як GetString, який в свою чергу використовує Танос. 940 00:59:19,370 --> 00:59:23,300 Давайте подивимося, де це може зламати, а потім поглянути на Бінки. 941 00:59:23,300 --> 00:59:25,820 Ми повернемося до цього в майбутньому. 942 00:59:25,820 --> 00:59:29,270 Ось це супер просту програму, яка в перші 2 рядки що робить? 943 00:59:29,270 --> 00:59:33,460 В англійській мові, те, що ці перші 2 рядки коду зробити всередині основного? 944 00:59:33,460 --> 00:59:35,600 [Нерозбірливо відповідь студента] 945 00:59:35,600 --> 00:59:37,880 Обережно. Це не дає мені адресу х або у. 946 00:59:37,880 --> 00:59:41,840 [Студент] Дає покажчиків на цілі. >> Добрий. Дайте мені 2 покажчиків на цілі числа. 947 00:59:41,840 --> 00:59:45,130 Іншими словами, дайте мені 2 ділянок пам'яті, що я тримаю креслення сьогодні, 948 00:59:45,130 --> 00:59:46,950 хоча я стер його зараз, як квадрати. 949 00:59:46,950 --> 00:59:50,000 Дайте мені 2 ділянок пам'яті, одна називається х, одна називається у - 950 00:59:50,000 --> 00:59:54,320 Раніше я називав їх з і т - а що це тип, що частина пам'яті? 951 00:59:54,320 --> 00:59:57,160 Це буде зберігати адресу. 952 00:59:57,160 --> 00:59:59,110 Це типу * Int. 953 00:59:59,110 --> 01:00:01,630 >> Таким чином, адреса Int в кінцевому підсумку жити в х, 954 01:00:01,630 --> 01:00:03,860 Адреса Int в кінцевому підсумку жити в у, 955 01:00:03,860 --> 01:00:08,460 але спочатку, що всередині х і у? Хто знає? Сміття значення. 956 01:00:08,460 --> 01:00:10,180 Це не має нічого спільного з покажчиками. 957 01:00:10,180 --> 01:00:12,720 Якщо ми не встигли щось там, хто знає, що насправді існує? 958 01:00:12,720 --> 01:00:18,950 Тепер, х. Що тут відбувається? Це законно, тому х є покажчиком. Це Int *. 959 01:00:18,950 --> 01:00:21,870 Таким чином, це означає, що я можу покласти в X в адресу деяких шматок пам'яті. 960 01:00:21,870 --> 01:00:25,120 Що Танос повернутися? Perfect, він повертає адресу, 961 01:00:25,120 --> 01:00:28,510 адреса першого байта в цілий шматок пам'яті. 962 01:00:28,510 --> 01:00:31,140 Скільки байт це, очевидно виділення, наприклад, в холодильнику? 963 01:00:31,140 --> 01:00:33,510 Який розмір Int? 4. 964 01:00:33,510 --> 01:00:36,600 Якщо ви згадаєте тижня 1, це не супер важливо завжди пам'ятати, що, 965 01:00:36,600 --> 01:00:38,870 але в даному випадку це корисно знати, 4 байт. 966 01:00:38,870 --> 01:00:41,770 Отже, це виділення в купі 4 байти 967 01:00:41,770 --> 01:00:46,110 і він повертався на адресу першого до мене довільно. 968 01:00:46,110 --> 01:00:47,700 Тепер, що х робите? 969 01:00:47,700 --> 01:00:52,200 * Х = 42, що робить? 970 01:00:52,200 --> 01:00:57,150 Якщо в цей момент в історії ми маємо х, який виглядає, як це з деякими сміття значення, 971 01:00:57,150 --> 01:01:04,120 це зараз у деяких сміття значення, тепер в рядку 3 Я виділив 4 байт. 972 01:01:04,120 --> 01:01:06,950 Ця картина істотно виглядає наступним чином. 973 01:01:06,950 --> 01:01:12,010 Або, більш точно, якщо це довільний адресу 123, це те, що наша історія виглядає тепер. 974 01:01:12,010 --> 01:01:23,940 * Х = 42 означає тепер, що? Це означає, що перехід на адресу 123 і поклав число 42 там. 975 01:01:23,940 --> 01:01:26,220 Мені не потрібно, щоб зробити ці рядки, тому що ми не робимо рядків. 976 01:01:26,220 --> 01:01:29,480 >> Я тільки що написав це так, і тільки заради демонстрації, в 977 01:01:29,480 --> 01:01:33,240 42, внутр вигляд займає багато місця, 4 байт. 978 01:01:33,240 --> 01:01:35,960 Так от що там сталося, але є проблема. 979 01:01:35,960 --> 01:01:40,580 * У = 13. Що станеться тут? 980 01:01:40,580 --> 01:01:46,470 Проблема в тому, * у в нашому спрощеному світі означає лише перейти за адресою у. 981 01:01:46,470 --> 01:01:48,590 Що в Y? Це якась фігня значення. 982 01:01:48,590 --> 01:01:53,150 Отже, давайте припустимо, що сміття значення 5551212, щось божевільний, як це. 983 01:01:53,150 --> 01:01:56,750 * У кошти йдуть на рішення 5551212. 984 01:01:56,750 --> 01:02:00,450 Це все одно тут. Він не існує, наприклад. 985 01:02:00,450 --> 01:02:05,310 Таким чином, у * отримує 13 означає, що я намагаюся зробити тут 13. Вона не існує. 986 01:02:05,310 --> 01:02:08,790 Я перевищили сегмент дошці. Що я отримаю? 987 01:02:08,790 --> 01:02:14,930 Це загадкове вини сегментації повідомлення, тому що я намагаюся поставити в пам'яті 988 01:02:14,930 --> 01:02:19,470 значення, як 13 в місці, яке не існує. 989 01:02:19,470 --> 01:02:23,900 Інша частина програми може працювати добре, але до цього моменту він не робить. 990 01:02:23,900 --> 01:02:25,350 Так давайте спробуємо розповісти цю історію. 991 01:02:25,350 --> 01:02:27,830 Ми повернемося до цього, коли ми говорили про шестігр. 992 01:02:27,830 --> 01:02:30,290 Давайте повернемося до цього і укласти з цією річчю, званої Бінки, 993 01:02:30,290 --> 01:02:33,710 Нагадаємо якої є професор Стенфордського сидячи у себе вдома, граючи з Claymation, 994 01:02:33,710 --> 01:02:36,380 щоб розповісти історію саме тієї ж програми. 995 01:02:36,380 --> 01:02:40,580 Це всього лише близько 3 хвилин. Тут ми маємо Бінки. 996 01:02:40,580 --> 01:02:45,030 [Чоловік динаміка на відео] Гей, Бінки, прокинься. Це час для покажчика весело. 997 01:02:45,030 --> 01:02:50,080 [Бінки] Що це? Дізнатися про покажчиків? О, сентиментальний! 998 01:02:50,080 --> 01:02:53,700 [Чоловік динамік] Ну, для початку, я думаю, ми будемо мати потребу в кількох покажчиків. 999 01:02:53,700 --> 01:02:57,890 >> [Бінки] Добре. Цей код виділяє 2 покажчики, які можуть указувати на цілі числа. 1000 01:02:57,890 --> 01:03:02,220 [Чоловік динамік] Добре. Ну, я бачу 2 покажчиків, але вони, схоже, не вказуючи ні до чого. 1001 01:03:02,220 --> 01:03:05,550 [Бінки] Це вірно. Спочатку, покажчики не вказують ні до чого. 1002 01:03:05,550 --> 01:03:09,270 Те, що вони вказують називають pointees, а їх створення є окремим кроком. 1003 01:03:09,270 --> 01:03:12,330 [Чоловік динамік] Ах, так, так. Я знав, що. Pointees окремо. 1004 01:03:12,330 --> 01:03:15,630 Е-е, так як ви виділити pointee? 1005 01:03:15,630 --> 01:03:21,510 [Бінки] Добре. Цей код створює новий ціле pointee, і ця частина безлічі Х, щоб вказати на це. 1006 01:03:21,510 --> 01:03:23,500 [Чоловік динамік] Гей, це виглядає краще. 1007 01:03:23,500 --> 01:03:26,030 Так що це щось робити. >> [Бінки] Добре. 1008 01:03:26,030 --> 01:03:30,300 Я буду разименовать х, щоб зберегти номер 42 у своєму pointee. 1009 01:03:30,300 --> 01:03:34,410 Для цього трюку мені потрібна моя чарівна паличка разименованія. 1010 01:03:34,410 --> 01:03:38,610 [Чоловік динамік] Ваша чарівна паличка разименованія? Це здорово. 1011 01:03:38,610 --> 01:03:44,230 [Бінки] Це те, що код виглядає наступним чином. Я просто налаштувати кількість і ... [Уривчасті звуки] 1012 01:03:44,230 --> 01:03:46,100 [Чоловік динамік] Гей, подивіться, там вона йде. 1013 01:03:46,100 --> 01:03:50,990 Так роблять разименованія на х слід стрілку, щоб відкрити її pointee, 1014 01:03:50,990 --> 01:03:53,230 У цьому випадку для зберігання 42 в там. 1015 01:03:53,230 --> 01:03:57,630 Гей, спробуйте використовувати його, щоб зберегти номер 13 через інший покажчик, у. 1016 01:03:57,630 --> 01:04:03,250 [Бінки] Добре. Я піду сюди, щоб у і отримаємо число 13 створений 1017 01:04:03,250 --> 01:04:08,360 , А потім взяти паличку разименованія і просто ... [Звук, що дзижчить] Ух ти! 1018 01:04:08,360 --> 01:04:10,980 [Чоловік динамік] О, агов, це не працює. 1019 01:04:10,980 --> 01:04:14,870 >> Скажімо, Бінки, я не думаю, що у разименованія це гарна ідея 1020 01:04:14,870 --> 01:04:17,880 тому що створення pointee окремий крок 1021 01:04:17,880 --> 01:04:19,850 і я не думаю, що ми коли-небудь робили це. 1022 01:04:19,850 --> 01:04:21,770 [Бінки] Хм, гарне питання. 1023 01:04:21,770 --> 01:04:26,640 [Чоловік динамік] Так. Ми виділили покажчик у, але ми ніколи не встановите його, щоб вказати на pointee. 1024 01:04:26,640 --> 01:04:28,780 [Бінки] Хм, дуже спостережливі. 1025 01:04:28,780 --> 01:04:30,690 [Чоловік динамік] Гей, ви шукаєте там добре, Бінки. 1026 01:04:30,690 --> 01:04:34,160 Ви можете це виправити, так що у вказує на той же pointee як х? >> [Бінки] Звичайно. 1027 01:04:34,160 --> 01:04:37,100 Я буду використовувати мою чарівну паличку покажчика призначення. 1028 01:04:37,100 --> 01:04:39,070 [Чоловік динамік], що буде проблема, як раніше? 1029 01:04:39,070 --> 01:04:40,840 [Бінки] Ні, це не стосується pointees. 1030 01:04:40,840 --> 01:04:44,780 Це просто змінює один покажчик, щоб вказати на те ж саме іншим. [Уривчасті звуки] 1031 01:04:44,780 --> 01:04:48,570 [Чоловік динамік] О, я бачу. Тепер у вказує на те ж місце, х. 1032 01:04:48,570 --> 01:04:51,140 Так що чекайте. Тепер у фіксовано. Він має pointee. 1033 01:04:51,140 --> 01:04:54,520 Таким чином, ви можете спробувати паличку разименованія знову відправити на 13 старше. 1034 01:04:54,520 --> 01:04:58,130 [Бінки] Ну, гаразд. Тут йде. [Уривчасті звуки] 1035 01:04:58,130 --> 01:05:01,250 [Чоловік динамік] Гей, подивися на це. Тепер разименованія робіт по в. 1036 01:05:01,250 --> 01:05:05,200 І тому, що покажчики обміну, що одна pointee, вони обидва бачать 13. 1037 01:05:05,200 --> 01:05:06,910 [Бінки] Так, обмін. Неважливо. 1038 01:05:06,910 --> 01:05:08,880 >> Таким чином, ми збираємося, щоб помінятися місцями зараз? 1039 01:05:08,880 --> 01:05:11,420 [Чоловік динамік] О, дивіться, ми поза часом. >> [Бінки] Але - 1040 01:05:11,420 --> 01:05:13,880 [Чоловік динамік] Тільки пам'ятайте, 3 положення покажчика. 1041 01:05:13,880 --> 01:05:18,630 Номер 1, базова структура є те, що у вас є покажчик і він вказує до pointee. 1042 01:05:18,630 --> 01:05:23,120 Але покажчик і pointee окремо, а поширена помилка полягає в створенні покажчика 1043 01:05:23,120 --> 01:05:25,680 але забути дати йому pointee. 1044 01:05:25,680 --> 01:05:29,580 Номер 2, разименованія покажчика починається з покажчика і слід його стрілки над 1045 01:05:29,580 --> 01:05:31,060 Для доступу до pointee. 1046 01:05:31,060 --> 01:05:34,340 Як ми всі знаємо, це працює тільки, якщо є pointee, 1047 01:05:34,340 --> 01:05:36,460 який вид повертається в Правило № 1. 1048 01:05:36,460 --> 01:05:39,870 Номер 3, покажчик призначення приймає один покажчик і змінює його 1049 01:05:39,870 --> 01:05:42,390 вказують на той же pointee як ще один покажчик. 1050 01:05:42,390 --> 01:05:45,890 Таким чином, після призначення, 2 покажчики будуть вказувати на той же pointee. 1051 01:05:45,890 --> 01:05:47,800 Іноді це називається обмін. 1052 01:05:47,800 --> 01:05:50,910 >> І це все, що є насправді. Прощай зараз. 1053 01:05:50,910 --> 01:05:55,840 Це Бінки. Це CS50. Побачимося наступного тижня. [Оплески] 1054 01:05:55,840 --> 01:05:59,000 >> [CS50.TV]