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