1 00:00:00,000 --> 00:00:06,030 >> [Грає музика] 2 00:00:06,030 --> 00:00:08,390 >> ДАГ Lloyd: Покажчики, ось ми тут. 3 00:00:08,390 --> 00:00:11,080 Це, ймовірно, буде найбільш важка тема 4 00:00:11,080 --> 00:00:12,840 що ми говоримо про в CS50. 5 00:00:12,840 --> 00:00:15,060 І якщо ви читали що-небудь про покажчиків 6 00:00:15,060 --> 00:00:19,080 перш ніж може бути трохи залякати вдаючись у цьому відео. 7 00:00:19,080 --> 00:00:21,260 Це правда покажчики дозволяють вам можливість 8 00:00:21,260 --> 00:00:23,740 щоб, можливо, зіпсувати дуже погано, коли ви 9 00:00:23,740 --> 00:00:27,450 Для роботи з змінними та даними, і викликаючи ваша програма до краху. 10 00:00:27,450 --> 00:00:30,490 Але насправді вони дійсно корисні і вони дозволяють нам дійсно відмінний спосіб 11 00:00:30,490 --> 00:00:33,340 для передачі даних і назад вперед між функціями, 12 00:00:33,340 --> 00:00:35,490 що ми в іншому випадку не в змозі зробити. 13 00:00:35,490 --> 00:00:37,750 >> І так, що ми насправді хочу зробити тут поїзд 14 00:00:37,750 --> 00:00:41,060 Ви мати хорошу покажчик дисципліни, так що ви можете ефективно використовувати покажчики 15 00:00:41,060 --> 00:00:43,850 щоб зробити ваші програми, які набагато краще. 16 00:00:43,850 --> 00:00:48,220 Як я вже сказав покажчики дають нам різні спосіб передачі даних між функціями. 17 00:00:48,220 --> 00:00:50,270 Тепер, якщо ви пам'ятаєте з раніше відео, коли 18 00:00:50,270 --> 00:00:53,720 ми говоримо про Мінлива сфера, я згадав 19 00:00:53,720 --> 00:01:00,610 що всі дані, які ми пройти між Функції в С передаються за значенням. 20 00:01:00,610 --> 00:01:03,070 І я не міг використовувати, що Термін, що я мав на увазі там 21 00:01:03,070 --> 00:01:07,170 було те, що ми передаємо копії даних. 22 00:01:07,170 --> 00:01:12,252 Коли ми передати змінну в функцію, ми насправді не передаючи змінну 23 00:01:12,252 --> 00:01:13,210 функції, чи не так? 24 00:01:13,210 --> 00:01:17,670 Ми передаючи копію що дані функції. 25 00:01:17,670 --> 00:01:20,760 Функція робить те, що він буде і він обчислює деяке значення, 26 00:01:20,760 --> 00:01:23,180 і, можливо, ми використовуємо це значення коли він дає його назад. 27 00:01:23,180 --> 00:01:26,700 >> Був одним винятком це правило передачі за значенням, 28 00:01:26,700 --> 00:01:31,210 і ми повернемося до того, що, що трохи пізніше в цьому відео. 29 00:01:31,210 --> 00:01:34,880 Якщо ми використовуємо покажчики замість використання змінних, 30 00:01:34,880 --> 00:01:38,180 або замість використання змінних Самі або копії змінних, 31 00:01:38,180 --> 00:01:43,790 Тепер ми можемо перейти змінні навколо між функціями по-іншому. 32 00:01:43,790 --> 00:01:46,550 Це означає, що якщо ми зробимо зміна в одній функції, 33 00:01:46,550 --> 00:01:49,827 що зміна буде насправді взяти ефект в іншому функції. 34 00:01:49,827 --> 00:01:52,160 Знову ж таки, це те, що ми не могли зробити раніше, 35 00:01:52,160 --> 00:01:56,979 і якщо ви коли-небудь намагалися поміняти місцями Значення двох змінних у функції, 36 00:01:56,979 --> 00:01:59,270 Ви помітили, цю проблему зразок підкрадається, вірно? 37 00:01:59,270 --> 00:02:04,340 >> Якщо ми хочемо, щоб поміняти X і Y, і ми передати їх функції під назвою підкачки, 38 00:02:04,340 --> 00:02:08,680 усередині функції своп Змінні зробити валютні цінності. 39 00:02:08,680 --> 00:02:12,600 Людина стає два, два стає , Але ми насправді не 40 00:02:12,600 --> 00:02:16,890 нічого змінити в оригіналі Функція, в зухвалому. 41 00:02:16,890 --> 00:02:19,550 Тому що ми не можемо, ми тільки роботи з їх копій. 42 00:02:19,550 --> 00:02:24,760 З покажчиками, хоча, ми можемо насправді проходять X і Y у функцію. 43 00:02:24,760 --> 00:02:26,960 Ця функція може зробити щось з ними. 44 00:02:26,960 --> 00:02:29,250 І ці змінні значення може реально змінити. 45 00:02:29,250 --> 00:02:33,710 Так що цілком зміна наша здатність працювати з даними. 46 00:02:33,710 --> 00:02:36,100 >> Перш ніж ми заглибимося в покажчики, я думаю, що це коштує 47 00:02:36,100 --> 00:02:38,580 приймаючи кілька хвилин до повернутися до основ тут. 48 00:02:38,580 --> 00:02:41,000 І є подивимося, як Роботи пам'яті комп'ютера 49 00:02:41,000 --> 00:02:45,340 тому що ці дві теми йдуть насправді досить взаємопов'язані. 50 00:02:45,340 --> 00:02:48,480 Як ви, напевно, знаєте, на вашому комп'ютері 51 00:02:48,480 --> 00:02:51,310 у вас є жорсткий диск або можливо, твердотільний накопичувач, 52 00:02:51,310 --> 00:02:54,430 свого роду місце для зберігання файлів. 53 00:02:54,430 --> 00:02:57,950 Це, як правило, десь у околиця 250 гігабайт 54 00:02:57,950 --> 00:02:59,810 , Може бути, пару терабайт зараз. 55 00:02:59,810 --> 00:03:02,270 І це, де всі ваші Файли в кінцевому рахунку, жити, 56 00:03:02,270 --> 00:03:04,870 навіть коли ваш комп'ютер вимкнений вимкнений, ви можете включити його назад на 57 00:03:04,870 --> 00:03:09,190 і ви знайдете ваші файли є знову, коли ви перезавантажте систему. 58 00:03:09,190 --> 00:03:14,820 Але диски, як жорсткий диск, з жорсткими, або твердотільний накопичувач, твердотільного накопичувача, 59 00:03:14,820 --> 00:03:16,050 просто місце для зберігання. 60 00:03:16,050 --> 00:03:20,400 >> Ми не можемо насправді нічого спільного з дані, які на жорсткому диску, 61 00:03:20,400 --> 00:03:22,080 або твердотілим накопичувачем. 62 00:03:22,080 --> 00:03:24,950 Для того, щоб реально змінити даних або перемістити його навколо, 63 00:03:24,950 --> 00:03:28,800 у нас є, щоб перемістити його ОЗУ, оперативний пристрій. 64 00:03:28,800 --> 00:03:31,170 Тепер ОЗУ, у вас є багато менше у вашому комп'ютері. 65 00:03:31,170 --> 00:03:34,185 Ви можете мати десь в околиця 512 мегабайт 66 00:03:34,185 --> 00:03:38,850 якщо у вас є старий комп'ютер, , Може бути, два, чотири, вісім, 16, 67 00:03:38,850 --> 00:03:41,820 можливо, навіть трохи Більше того, гігабайт оперативної пам'яті. 68 00:03:41,820 --> 00:03:46,390 Так от набагато менше, але це де всі летючі даних існує. 69 00:03:46,390 --> 00:03:48,270 Ось де ми можемо щось змінити. 70 00:03:48,270 --> 00:03:53,350 Але коли ми переходимо наш комп'ютер вимкнений, всі дані в оперативній пам'яті руйнується. 71 00:03:53,350 --> 00:03:57,150 >> Так ось чому ми повинні мати жорсткий диск для більш постійного місця ній, 72 00:03:57,150 --> 00:03:59,720 так, що вона буде exists- він дійсно погано, якщо ми щоразу 73 00:03:59,720 --> 00:04:03,310 Виявилося наш комп'ютер вимкнений, кожен Файл в нашій системі був знищений. 74 00:04:03,310 --> 00:04:05,600 Так ми працюємо всередині оперативної пам'яті. 75 00:04:05,600 --> 00:04:09,210 І кожного разу, коли ми говоримо про пам'яті, в значній мірі, в CS50, 76 00:04:09,210 --> 00:04:15,080 ми говоримо про пам'ять, а не на жорсткому диску. 77 00:04:15,080 --> 00:04:18,657 >> Тому, коли ми перемістити речі в пам'ять, вона займає певну кількість простору. 78 00:04:18,657 --> 00:04:20,740 Всі типи даних, які ми працюємо з 79 00:04:20,740 --> 00:04:23,480 взяти різні кількість простору в пам'яті. 80 00:04:23,480 --> 00:04:27,600 Таким чином, кожен раз, коли ви створити ціле змінна, чотири байти пам'яті 81 00:04:27,600 --> 00:04:30,750 відведені в оперативній пам'яті, щоб ви може працювати з цим числом. 82 00:04:30,750 --> 00:04:34,260 Ви можете оголосити число, змінити його, призначити його 83 00:04:34,260 --> 00:04:36,700 до величини 10 збільшеним однієї, так далі і так далі. 84 00:04:36,700 --> 00:04:39,440 Все, що має статися в Оперативної пам'яті, і ви отримаєте чотири байти 85 00:04:39,440 --> 00:04:42,550 для роботи з для кожного ціле число, ви створюєте. 86 00:04:42,550 --> 00:04:45,410 >> Кожен персонаж вам створити отримує один байт. 87 00:04:45,410 --> 00:04:48,160 От тільки, скільки простору необхідно зберігати символ. 88 00:04:48,160 --> 00:04:51,310 Кожен поплавок, реальна Кількість, отримує чотири байти 89 00:04:51,310 --> 00:04:53,390 якщо це не подвійний точності з плаваючою точкою 90 00:04:53,390 --> 00:04:56,510 число, яке дозволяє є більш точні або більше цифр 91 00:04:56,510 --> 00:04:59,300 після десяткової крапки без втрати точності, 92 00:04:59,300 --> 00:05:01,820 які займають восьмій байт пам'яті. 93 00:05:01,820 --> 00:05:06,730 Довгі жадає, дійсно великі числа, також прийматимуть вісім байт пам'яті. 94 00:05:06,730 --> 00:05:09,000 Скільки байт пам'яті у рядки займають? 95 00:05:09,000 --> 00:05:12,990 Ну давайте шпильку в цьому питанні зараз, але ми повернемося до нього. 96 00:05:12,990 --> 00:05:17,350 >> Отже, повернемося до цієї ідеї пам'яті як великий масив байт розміром осередків. 97 00:05:17,350 --> 00:05:20,871 От і все, що є, це просто величезний масив комірок, 98 00:05:20,871 --> 00:05:23,370 як і будь-який інший масив, який ви знайомі з і подивитися, 99 00:05:23,370 --> 00:05:26,430 крім кожен елемент один байт. 100 00:05:26,430 --> 00:05:30,030 І так само, як масив, кожен елемент має адресу. 101 00:05:30,030 --> 00:05:32,120 Кожен елемент масиву має індекс, і ми 102 00:05:32,120 --> 00:05:36,302 можна використовувати цей індекс, щоб зробити так званий довільного доступу в масиві. 103 00:05:36,302 --> 00:05:38,510 Ми не повинні почати на початок масиву, 104 00:05:38,510 --> 00:05:40,569 перебору кожен один її елемент, 105 00:05:40,569 --> 00:05:41,860 щоб знайти те, що ми шукаємо. 106 00:05:41,860 --> 00:05:45,790 Ми можемо тільки сказати, я хочу, щоб дістатися до 15-елемент або 100-стихія. 107 00:05:45,790 --> 00:05:49,930 А можна просто в той номер і отримати значення, яке ви шукаєте. 108 00:05:49,930 --> 00:05:54,460 >> Аналогічно кожна локація в пам'яті має адресу. 109 00:05:54,460 --> 00:05:57,320 Так ваша пам'ять може шукати щось подібне. 110 00:05:57,320 --> 00:06:01,420 Ось дуже мало шматок пам'ять, це 20 байт пам'яті. 111 00:06:01,420 --> 00:06:04,060 Перші 20 байт, тому що мій адрес є на дні 112 00:06:04,060 --> 00:06:08,890 0, 1, 2, 3, і так на всьому шляху до 19. 113 00:06:08,890 --> 00:06:13,190 І коли я заявляю, змінних і коли я починаю працювати з ними, 114 00:06:13,190 --> 00:06:15,470 система збирається встановити у бік деякий простір для мене 115 00:06:15,470 --> 00:06:17,595 У цій пам'яті для роботи з моїми змінних. 116 00:06:17,595 --> 00:06:21,610 Так що я міг би сказати, символ C дорівнює капітал Х. А що трапиться? 117 00:06:21,610 --> 00:06:23,880 Ну система буде відкладіть для мене одного байта. 118 00:06:23,880 --> 00:06:27,870 У цьому випадку вибрав номер байта чотири байти за адресою чотирьох, 119 00:06:27,870 --> 00:06:31,310 і він збирається зберігати заголовна буква Н в там для мене. 120 00:06:31,310 --> 00:06:34,350 Якщо я кажу, то швидкість INT межа дорівнює 65, це 121 00:06:34,350 --> 00:06:36,806 збирається виділити чотири байт пам'яті для мене. 122 00:06:36,806 --> 00:06:39,180 І це буде ставитися до тих, чотири байти, як єдине ціле 123 00:06:39,180 --> 00:06:41,305 тому що те, що ми працюємо з являє собою ціле число тут. 124 00:06:41,305 --> 00:06:44,350 І це буде зберігати 65 там. 125 00:06:44,350 --> 00:06:47,000 >> Тепер уже я начебто кажу вам трохи брехні, 126 00:06:47,000 --> 00:06:50,150 правильно, тому що ми знаємо, що комп'ютери працюють в двійковій системі. 127 00:06:50,150 --> 00:06:53,100 Вони не розуміють, обов'язково, що столиця Н 128 00:06:53,100 --> 00:06:57,110 або те, що 65 є, вони тільки зрозуміти бінарні, нулі і одиниці. 129 00:06:57,110 --> 00:06:59,000 І так насправді, що ми там зберігати 130 00:06:59,000 --> 00:07:03,450 не буква Н, і число 65, але швидше двійкові уявлення 131 00:07:03,450 --> 00:07:06,980 його, що виглядати дещо як це. 132 00:07:06,980 --> 00:07:10,360 І зокрема в контекст цілої змінної, 133 00:07:10,360 --> 00:07:13,559 він не збирається просто плювати його в, він не збирається розглядати його як один чотирьох 134 00:07:13,559 --> 00:07:15,350 байт шматок обов'язково, це насправді відбувається 135 00:07:15,350 --> 00:07:19,570 щоб розглядати його як один байт чотирьох шматків, які могли б виглядати наступним чином. 136 00:07:19,570 --> 00:07:22,424 І навіть це не зовсім вірно небудь, 137 00:07:22,424 --> 00:07:24,840 через чогось під назвою порядок байт, який ми не 138 00:07:24,840 --> 00:07:26,965 збирається отримати в даний час, але якщо вам цікаво, про, 139 00:07:26,965 --> 00:07:29,030 Ви можете прочитати на трохи і великий порядок байт. 140 00:07:29,030 --> 00:07:31,640 Але заради цього аргументу, заради цього відео, 141 00:07:31,640 --> 00:07:34,860 давайте припустимо, що, в Те ,, як число 65 буде 142 00:07:34,860 --> 00:07:36,970 бути представлені в пам'ять на кожній системі, 143 00:07:36,970 --> 00:07:38,850 хоча це не зовсім вірно. 144 00:07:38,850 --> 00:07:41,700 >> Але давайте насправді просто отримати позбутися всіх бінарних повністю, 145 00:07:41,700 --> 00:07:44,460 і думати тільки про якість H і 65, це набагато простіше, 146 00:07:44,460 --> 00:07:47,900 думати про нього, як що в людській істоті. 147 00:07:47,900 --> 00:07:51,420 Гаразд, так воно і здається, може бути, трохи випадковим, що моя система I've- 148 00:07:51,420 --> 00:07:55,130 не дати мені байт 5, 6, 7, і 8 для зберігання ціле число. 149 00:07:55,130 --> 00:07:58,580 Там причина для цього теж, що ми не зможемо отримати в прямо зараз, але досить 150 00:07:58,580 --> 00:08:00,496 сказати, що те, що Комп'ютер робить тут 151 00:08:00,496 --> 00:08:02,810 Ймовірно, це хороший хід з його боку. 152 00:08:02,810 --> 00:08:06,020 Щоб не дати мені пам'ять, що це обов'язково спиною до спини. 153 00:08:06,020 --> 00:08:10,490 Незважаючи на те, що це збирається зробити це зараз якщо я хочу, щоб отримати інший рядок, 154 00:08:10,490 --> 00:08:13,080 називається прізвище, і я хочу, покласти Ллойда там. 155 00:08:13,080 --> 00:08:18,360 Я збираюся необхідно встановити один характер, кожна буква, що це 156 00:08:18,360 --> 00:08:21,330 вимагатиме одна характер, один байт пам'яті. 157 00:08:21,330 --> 00:08:26,230 Так що, якщо я міг би поставити Ллойда в моїй масиву як це я досить добре йти, вірно? 158 00:08:26,230 --> 00:08:28,870 Чого не вистачає? 159 00:08:28,870 --> 00:08:31,840 >> Пам'ятайте, що кожен рядок ми працюємо з в С закінчується зворотної косої межі нульовий, 160 00:08:31,840 --> 00:08:33,339 і ми не можемо опустити, що тут, або. 161 00:08:33,339 --> 00:08:36,090 Ми повинні відкласти один байт пам'яті для зберігання, що таким чином ми 162 00:08:36,090 --> 00:08:39,130 знаєте, коли наша рядок закінчилася. 163 00:08:39,130 --> 00:08:41,049 Отже, ще раз цю угоду з, як речі 164 00:08:41,049 --> 00:08:42,799 з'являються в мощі пам'яті трохи випадковим, 165 00:08:42,799 --> 00:08:44,870 але насправді, як більшість систем розроблені. 166 00:08:44,870 --> 00:08:48,330 Для вибудувати їх за мультиплікаторами з чотирьох осіб, з причин, знову 167 00:08:48,330 --> 00:08:50,080 що ми не повинні потрапити в прямо зараз. 168 00:08:50,080 --> 00:08:53,060 Але це, так досить сказати, що після цих трьох рядків коду, 169 00:08:53,060 --> 00:08:54,810 це те, що пам'ять може виглядати. 170 00:08:54,810 --> 00:08:58,930 Якщо мені потрібно комірок пам'яті 4, 8 і 12, щоб тримати мої дані, 171 00:08:58,930 --> 00:09:01,100 це те, що моя пам'ять може виглядати. 172 00:09:01,100 --> 00:09:04,062 >> І тільки бути особливо педантичний ось, коли 173 00:09:04,062 --> 00:09:06,020 ми говоримо про пам'ять адреси, як правило, ми 174 00:09:06,020 --> 00:09:08,390 зробити це, використовуючи шістнадцяткові позначення. 175 00:09:08,390 --> 00:09:12,030 Так чому б нам не перетворити все це від десяткової шістнадцятковій формі 176 00:09:12,030 --> 00:09:15,010 тільки тому, що, як правило, це як ми називаємо пам'яттю. 177 00:09:15,010 --> 00:09:17,880 Таким чином, замість того, щоб бути від 0 до 19, що ми маємо нульовий 178 00:09:17,880 --> 00:09:20,340 х від нуля до нуля x1 зо три. 179 00:09:20,340 --> 00:09:23,790 Ті 20 байт пам'яті, що ми Мати чи ми дивимося на на цьому зображенні 180 00:09:23,790 --> 00:09:25,540 саме тут. 181 00:09:25,540 --> 00:09:29,310 >> Таким чином, все, що було сказано, давайте відійти від пам'яті на секунду 182 00:09:29,310 --> 00:09:30,490 і назад до покажчиків. 183 00:09:30,490 --> 00:09:32,420 Ось найголовніше пам'ятати 184 00:09:32,420 --> 00:09:34,070 як ми почали працювати з покажчиками. 185 00:09:34,070 --> 00:09:36,314 Покажчик нічого більш адреси. 186 00:09:36,314 --> 00:09:38,230 Я скажу це знову, тому що це те, що важливо, 187 00:09:38,230 --> 00:09:42,730 покажчик нічого більш адреси. 188 00:09:42,730 --> 00:09:47,760 Покажчики адреси в місцях в пам'яті, де змінні жити. 189 00:09:47,760 --> 00:09:52,590 Знаючи, що вона стає, сподіваюся, трохи легше працювати з ними. 190 00:09:52,590 --> 00:09:54,550 Інша справа, мені подобається щоб зробити, це є свого роду 191 00:09:54,550 --> 00:09:58,510 діаграм візуально представляє те, що відбувається з різними рядків коду. 192 00:09:58,510 --> 00:10:00,660 І ми будемо робити це пару раз на покажчики, 193 00:10:00,660 --> 00:10:03,354 і коли ми говоримо про динамічну розподіл пам'яті, а також. 194 00:10:03,354 --> 00:10:06,020 Тому що я думаю, що ці діаграми можуть бути особливо корисні. 195 00:10:06,020 --> 00:10:09,540 >> Так що, якщо я говорю, наприклад, INT до в моєму коді, що відбувається? 196 00:10:09,540 --> 00:10:12,524 Ну що ж відбувається в основному в Я отримую пам'ять відведених для мене, 197 00:10:12,524 --> 00:10:14,690 але я навіть не хотів би думаю про це, як, що, я 198 00:10:14,690 --> 00:10:16,300 подобається думати про нього, як ящик. 199 00:10:16,300 --> 00:10:20,090 У мене є вікно, і це кольору зелений, тому що я 200 00:10:20,090 --> 00:10:21,750 може поставити цілі числа в зелені коробки. 201 00:10:21,750 --> 00:10:23,666 Якби це був персонаж, якого я може мати синій ящик. 202 00:10:23,666 --> 00:10:27,290 Але я завжди кажу, якщо я створюю коробка, яка може тримати цілі 203 00:10:27,290 --> 00:10:28,950 що коробка пофарбована в зелений колір. 204 00:10:28,950 --> 00:10:33,020 І я беру постійний маркер і я пишу до на стороні. 205 00:10:33,020 --> 00:10:37,590 Так у мене є коробка під назвою K, в якому я можу покласти цілі числа. 206 00:10:37,590 --> 00:10:41,070 Тому коли я кажу Int K, це що відбувається в моїй голові. 207 00:10:41,070 --> 00:10:43,140 Якщо я кажу, до дорівнює п'яти, що я роблю? 208 00:10:43,140 --> 00:10:45,110 Ну, я ставлю п`ять в коробці, правильно. 209 00:10:45,110 --> 00:10:48,670 Це досить просто, якщо Я говорю INT до, створити вікно під назвою K. 210 00:10:48,670 --> 00:10:52,040 Якщо я кажу, до дорівнює 5, поставив п'ять у полі. 211 00:10:52,040 --> 00:10:53,865 Сподіваюся, що це не надто багато стрибком. 212 00:10:53,865 --> 00:10:55,990 Ось де справи йдуть трохи цікаво, хоча. 213 00:10:55,990 --> 00:11:02,590 Якщо я кажу, INT * рк, добре, навіть якщо я не знаю, що це неминуче означає, 214 00:11:02,590 --> 00:11:06,150 це явно є щось зробити з цілим числом. 215 00:11:06,150 --> 00:11:08,211 Так що я збираюся пофарбувати це поле зелений іш, 216 00:11:08,211 --> 00:11:10,210 Я знаю, що є щось зробити з цілим числом, 217 00:11:10,210 --> 00:11:13,400 але це не саме по собі ціле, бо це INT зірка. 218 00:11:13,400 --> 00:11:15,390 Там щось трохи відрізняється про нього. 219 00:11:15,390 --> 00:11:17,620 Так участь ціле х, але в іншому випадку це 220 00:11:17,620 --> 00:11:19,830 не надто відрізняється від те, що ми говорили. 221 00:11:19,830 --> 00:11:24,240 Це коробка, її отримали ярлик, це носити ярлик рк, 222 00:11:24,240 --> 00:11:27,280 і він здатний холдингу INT зірки, все, що це таке. 223 00:11:27,280 --> 00:11:29,894 Вони щось робити з цілими числами, ясно. 224 00:11:29,894 --> 00:11:31,060 Ось останній рядок, хоча. 225 00:11:31,060 --> 00:11:37,650 Якщо я кажу, рк = & K, гей, що тільки що відбулося, вірно? 226 00:11:37,650 --> 00:11:41,820 Так що це випадкове число, здавалося б, випадкові Кількість, викинуть в коробці. 227 00:11:41,820 --> 00:11:44,930 Все, що є, рк отримує адреса к. 228 00:11:44,930 --> 00:11:52,867 Так я дотримуюся, де до живе в пам'яті, його адреса, адреса його байт. 229 00:11:52,867 --> 00:11:55,200 Все, що я роблю, я говорю це значення те, що я збираюся 230 00:11:55,200 --> 00:11:59,430 покласти в моїй коробці під назвою рк. 231 00:11:59,430 --> 00:12:02,080 І тому, що ці речі Покажчики і тому шукає 232 00:12:02,080 --> 00:12:04,955 в рядку, як нульовий х восьмій нулів з семи чотирьох восьмій 233 00:12:04,955 --> 00:12:07,790 другій нуль, ймовірно, не надто значущим. 234 00:12:07,790 --> 00:12:12,390 Коли ми, як правило візуалізувати покажчики, ми насправді зробити це в якості покажчиків. 235 00:12:12,390 --> 00:12:17,000 Рк дає нам інформацію ми повинні знайти K в пам'яті. 236 00:12:17,000 --> 00:12:19,120 Так в основному рк має стрілку в ньому. 237 00:12:19,120 --> 00:12:21,670 І якщо ми ходимо довжину цієї стрілкою, уявіть собі, 238 00:12:21,670 --> 00:12:25,280 це те, що ви можете ходити по, якщо ми ходити уздовж стрілки, 239 00:12:25,280 --> 00:12:29,490 на самому кінчику цього стрілки, ми буде знайти місце в пам'яті 240 00:12:29,490 --> 00:12:31,390 де до життя. 241 00:12:31,390 --> 00:12:34,360 І, що дуже важливо, тому що як тільки ми знаємо, де живе до, 242 00:12:34,360 --> 00:12:37,870 ми можемо почати працювати з даними всередині цьому місці пам'яті. 243 00:12:37,870 --> 00:12:40,780 Хоча ми отримуємо маленький біт попереду себе зараз. 244 00:12:40,780 --> 00:12:42,240 >> Так що покажчик? 245 00:12:42,240 --> 00:12:45,590 Покажчик є елемент даних якого значення адреса пам'яті. 246 00:12:45,590 --> 00:12:49,740 Це було те, що нуль нуль восьмій х речі відбувається, це було адреса пам'яті. 247 00:12:49,740 --> 00:12:52,060 Це було місце в пам'яті. 248 00:12:52,060 --> 00:12:55,080 І тип покажчика описує вид 249 00:12:55,080 --> 00:12:56,930 даних, які ви знайдете в що адреса пам'яті. 250 00:12:56,930 --> 00:12:58,810 Так що це INT зірка частина правий. 251 00:12:58,810 --> 00:13:03,690 Якщо я випливати, що стрілка, це збирається привести мене до місця. 252 00:13:03,690 --> 00:13:06,980 І, що місце, що я знайдете там в моєму прикладі, 253 00:13:06,980 --> 00:13:08,240 зелений кольори коробка. 254 00:13:08,240 --> 00:13:12,650 Це ціле число, це те, що я знайдете, якщо я йду на цю адресу. 255 00:13:12,650 --> 00:13:14,830 Тип даних для Покажчик описує те, що 256 00:13:14,830 --> 00:13:17,936 Ви знайдете за цією адресою пам'яті. 257 00:13:17,936 --> 00:13:19,560 Так от дійсно здорово річ, хоча. 258 00:13:19,560 --> 00:13:25,090 Покажчики дозволяють перейти змінні між функціями. 259 00:13:25,090 --> 00:13:28,520 А насправді передати змінні і не пройти їх копії. 260 00:13:28,520 --> 00:13:32,879 Тому що, якщо ми точно знаємо, де в пам'яті, щоб знайти змінну, 261 00:13:32,879 --> 00:13:35,670 ми не повинні зробити копію це, ми можемо просто піти в це місце 262 00:13:35,670 --> 00:13:37,844 і працювати з цієї змінної. 263 00:13:37,844 --> 00:13:40,260 Таким чином, по суті покажчиків роду з зробити комп'ютерну середу 264 00:13:40,260 --> 00:13:42,360 набагато більше, як в реальному світі, вірно. 265 00:13:42,360 --> 00:13:44,640 >> Так от аналогія. 266 00:13:44,640 --> 00:13:48,080 Давайте припустимо, що у мене є ноутбук, праворуч, і він повний нотаток. 267 00:13:48,080 --> 00:13:50,230 І я б хотів, щоб ви відновите його. 268 00:13:50,230 --> 00:13:53,960 Ви це функція, яка Оновлення зазначає, право. 269 00:13:53,960 --> 00:13:56,390 В дорозі ми були працює досі, те, що 270 00:13:56,390 --> 00:14:02,370 відбувається, ви будете приймати мій ноутбук, Ви йдете в магазин, копіювання, 271 00:14:02,370 --> 00:14:06,410 ви будете робити ксерокопію кожна сторінка записника. 272 00:14:06,410 --> 00:14:09,790 Ви залишити свій ноутбук назад на моєму столі, коли ви закінчите, 273 00:14:09,790 --> 00:14:14,600 ви будете йти і викреслити речі в моєму ноутбук, який застаріли або не так, 274 00:14:14,600 --> 00:14:19,280 і тоді ви будете проходити назад мені стопку сторінок Xerox 275 00:14:19,280 --> 00:14:22,850 що є точною копією мого ноутбука з зміни, які ви внесли в нього. 276 00:14:22,850 --> 00:14:27,040 І в той момент, це до мене, як викликає функція, як абоненту, 277 00:14:27,040 --> 00:14:30,582 щоб вирішити ваші замітки і інтегрувати їх назад в моєму блокноті. 278 00:14:30,582 --> 00:14:32,540 Таким чином, є багато кроків участь тут, прямо. 279 00:14:32,540 --> 00:14:34,850 Як це не було б краще, якщо я просто кажу, гей, ви можете 280 00:14:34,850 --> 00:14:38,370 оновити ноутбук для мені, вручити вам мій ноутбук, 281 00:14:38,370 --> 00:14:40,440 і ви берете речі і буквально перетнути їх 282 00:14:40,440 --> 00:14:42,810 і оновлювати свої записи в блокноті. 283 00:14:42,810 --> 00:14:45,140 А потім дати мені свій ноутбук назад. 284 00:14:45,140 --> 00:14:47,320 Це зразок того, що покажчики дозволяють зробити, 285 00:14:47,320 --> 00:14:51,320 вони роблять це оточення багато більш подобається, як ми працюємо в реальності. 286 00:14:51,320 --> 00:14:54,640 >> Всі права, так ось що покажчик, давайте поговоримо 287 00:14:54,640 --> 00:14:58,040 про те, як покажчики працюють в C, і як ми можемо почати працювати з ними. 288 00:14:58,040 --> 00:15:02,550 Таким чином, є дуже простий покажчик в С називається нульовою покажчик. 289 00:15:02,550 --> 00:15:04,830 Нульовий покажчик вказує на нічого. 290 00:15:04,830 --> 00:15:08,310 Це, ймовірно, здається, що це насправді не дуже корисна річ, 291 00:15:08,310 --> 00:15:10,500 але, як ми побачимо Трохи пізніше на той факт, 292 00:15:10,500 --> 00:15:15,410 що це нульовий покажчик існує насправді дуже може стати в нагоді. 293 00:15:15,410 --> 00:15:19,090 І всякий раз, коли ви створюєте покажчик, а ви не встановите його значення immediately- 294 00:15:19,090 --> 00:15:21,060 приклад установки його значення відразу 295 00:15:21,060 --> 00:15:25,401 буде дещо слайдів назад де я сказав рк дорівнює & K, 296 00:15:25,401 --> 00:15:28,740 рк отримує адреса K, оскільки ми побачимо, що це означає, 297 00:15:28,740 --> 00:15:32,990 ми побачимо, як код, який shortly- якщо ми не встановите його значення на щось 298 00:15:32,990 --> 00:15:35,380 сенс відразу, Ви повинні завжди 299 00:15:35,380 --> 00:15:37,480 встановити покажчик, щоб вказати на нуль. 300 00:15:37,480 --> 00:15:40,260 Ви повинні встановити це, щоб вказати на немає. 301 00:15:40,260 --> 00:15:43,614 >> Це дуже відрізняється від просто залишити значення, як це 302 00:15:43,614 --> 00:15:45,530 а потім можливість оголошення Покажчик і тільки за умови, 303 00:15:45,530 --> 00:15:48,042 це нуль, тому що це рідко правда. 304 00:15:48,042 --> 00:15:50,000 Таким чином, ви завжди повинні встановлювати значення покажчика 305 00:15:50,000 --> 00:15:55,690 до нуля, якщо ви не встановите його значення щоб щось значуще негайно. 306 00:15:55,690 --> 00:15:59,090 Ви можете перевірити, чи є значення покажчика в є недійсним з допомогою оператора рівності 307 00:15:59,090 --> 00:16:05,450 (==), Так само, як ви порівняєте будь-яке ціле число значення або символьні значення, використовуючи (==) 308 00:16:05,450 --> 00:16:06,320 так само. 309 00:16:06,320 --> 00:16:10,994 Це особливий вид постійної значення, яке можна використовувати для тестування. 310 00:16:10,994 --> 00:16:13,160 Так що це було дуже просто покажчик, нульовий покажчик. 311 00:16:13,160 --> 00:16:15,320 Інший спосіб створення покажчик є витяг 312 00:16:15,320 --> 00:16:18,240 адреса змінної ви вже створили, 313 00:16:18,240 --> 00:16:22,330 і ви робите це за допомогою & Видобуток адреса оператора. 314 00:16:22,330 --> 00:16:26,720 Який ми вже бачили раніше у першому прикладі схеми я показав. 315 00:16:26,720 --> 00:16:31,450 Так що, якщо х є змінною, що ми вже створили цілого типу, 316 00:16:31,450 --> 00:16:35,110 то й х є покажчиком на ціле число. 317 00:16:35,110 --> 00:16:39,810 і Х означає пам'ятайте, і збирається витягти адреса речі праворуч. 318 00:16:39,810 --> 00:16:45,350 А так як покажчик це просто адреса, чим і х є покажчиком на ціле число 319 00:16:45,350 --> 00:16:48,560 значення якого, де в пам'яті х життів. 320 00:16:48,560 --> 00:16:50,460 Це адреса Х. 321 00:16:50,460 --> 00:16:53,296 Так і х є адреса х. 322 00:16:53,296 --> 00:16:55,670 Давайте ще один крок далі і підключити до чогось 323 00:16:55,670 --> 00:16:58,380 Я посилався на в попередньому відео. 324 00:16:58,380 --> 00:17:06,730 Якщо обр масив двійників, то і обр квадратна дужка я є покажчиком 325 00:17:06,730 --> 00:17:08,109 в два рази. 326 00:17:08,109 --> 00:17:08,970 ДОБРЕ. 327 00:17:08,970 --> 00:17:12,160 обр квадратну дужку я, якщо обр масив двійників, 328 00:17:12,160 --> 00:17:19,069 Потім обр квадратну дужку я це I-й елемент цього масиву, 329 00:17:19,069 --> 00:17:29,270 і & обр квадратну дужку я де в пам'яті я-й елемент обр існує. 330 00:17:29,270 --> 00:17:31,790 >> Так в чому ж сенс тут? 331 00:17:31,790 --> 00:17:34,570 Масиви ім'я, значення з усієї цієї речі, 332 00:17:34,570 --> 00:17:39,290 є те, що ім'я масиву є насправді сам покажчик. 333 00:17:39,290 --> 00:17:41,170 Ви працювали з покажчиками вздовж усього 334 00:17:41,170 --> 00:17:45,290 кожен раз, коли ви використовували масив. 335 00:17:45,290 --> 00:17:49,090 Запам'ятати на прикладі по області визначення змінної, 336 00:17:49,090 --> 00:17:53,420 в кінці відео я представляю приклад, де ми маємо функцію 337 00:17:53,420 --> 00:17:56,890 називається безліч INT і Функція називається безліч масив. 338 00:17:56,890 --> 00:18:00,490 І ваше завдання, щоб визначити, чи ні, або те, що 339 00:18:00,490 --> 00:18:03,220 цінності, які ми роздруковані кінець функції, 340 00:18:03,220 --> 00:18:05,960 Наприкінці основної програми. 341 00:18:05,960 --> 00:18:08,740 >> Якщо ви пам'ятаєте з цього прикладу або якщо ви дивилися відео, 342 00:18:08,740 --> 00:18:13,080 Ви знаєте, що, коли вам-виклик Набір INT ефективно нічого не робить. 343 00:18:13,080 --> 00:18:16,390 Але виклик, щоб встановити масив робить. 344 00:18:16,390 --> 00:18:19,280 І я начебто замовчується, чому що було на той час. 345 00:18:19,280 --> 00:18:22,363 Я просто сказав, добре це масив, це спеціальна, ви знаєте, є причина. 346 00:18:22,363 --> 00:18:25,020 Причина в тому, що масив-х Назва насправді просто покажчик, 347 00:18:25,020 --> 00:18:28,740 і є цей особливий Синтаксис квадратна дужка, що 348 00:18:28,740 --> 00:18:30,510 зробити речі набагато краще працювати. 349 00:18:30,510 --> 00:18:34,410 І вони роблять ідею про покажчик багато менш страшним, 350 00:18:34,410 --> 00:18:36,800 і ось чому вони начебто з представлених в цьому шляху. 351 00:18:36,800 --> 00:18:38,600 Але насправді масиви просто покажчики. 352 00:18:38,600 --> 00:18:41,580 І ось чому, коли ми внесли зміни в масиві, 353 00:18:41,580 --> 00:18:44,880 коли ми пройшли масив як параметр на функцію або як аргумент 354 00:18:44,880 --> 00:18:50,110 до функції, вміст масиву фактично змінили в обох абонента 355 00:18:50,110 --> 00:18:51,160 і в викликає функції. 356 00:18:51,160 --> 00:18:55,846 Який для кожного іншого виду змінна, яку ми бачили, було не так. 357 00:18:55,846 --> 00:18:58,970 Так що це просто щось, щоб тримати в розум, коли ви працюєте з покажчиками, 358 00:18:58,970 --> 00:19:01,610 є те, що ім'я Масив насправді покажчик 359 00:19:01,610 --> 00:19:04,750 на перший елемент цього масиву. 360 00:19:04,750 --> 00:19:08,930 >> ОК, так що тепер у нас є всі ці факти, давайте продовжувати йти, правильно. 361 00:19:08,930 --> 00:19:11,370 Чому ми піклуємося про десь живе. 362 00:19:11,370 --> 00:19:14,120 Ну, як я вже сказав, це досить Корисно знати, де щось живе 363 00:19:14,120 --> 00:19:17,240 так що ви можете піти туди і змінити його. 364 00:19:17,240 --> 00:19:19,390 Робота з нею і насправді є річ, яку ви 365 00:19:19,390 --> 00:19:23,710 хочу зробити з цієї змінної ефекту відбору, і не набули чинності на деяких копії. 366 00:19:23,710 --> 00:19:26,150 Це називається разименованія. 367 00:19:26,150 --> 00:19:28,690 Ми йдемо до заслання і ми змінюємо значення там. 368 00:19:28,690 --> 00:19:32,660 Так що, якщо у нас є вказівник, і це називається шт, і це вказує на характер, 369 00:19:32,660 --> 00:19:40,610 то можна сказати, * * ПК і ПК є Ім'я того, що ми знайдемо, якщо ми йдемо 370 00:19:40,610 --> 00:19:42,910 на адресу ПК. 371 00:19:42,910 --> 00:19:47,860 Те, що ми знайдемо там персонаж і * Шт як ми звертаємося до даних на що 372 00:19:47,860 --> 00:19:48,880 Місцезнаходження. 373 00:19:48,880 --> 00:19:54,150 Таким чином, ми могли б сказати, щось на зразок * Шт = D або щось подібне, 374 00:19:54,150 --> 00:19:59,280 і це означає, що що б не був на адреси пам'яті комп'ютера, 375 00:19:59,280 --> 00:20:07,040 будь-якого характеру раніше там, в даний час D, якщо ми говоримо * PC = D. 376 00:20:07,040 --> 00:20:10,090 >> Так от ми йдемо знову деякі дивні речі С, право. 377 00:20:10,090 --> 00:20:14,560 Таким чином, ми бачили раніше * як то частина з типом даних, 378 00:20:14,560 --> 00:20:17,160 і в даний час він використовується в трохи інший контекст 379 00:20:17,160 --> 00:20:19,605 для доступу до даних на місці. 380 00:20:19,605 --> 00:20:22,480 Я знаю, це трохи заплутаним і що насправді частина цього цілого 381 00:20:22,480 --> 00:20:25,740 як, чому покажчики мають цю міфологію навколо них як настільки складні, 382 00:20:25,740 --> 00:20:28,250 це свого роду проблеми синтаксису, чесно. 383 00:20:28,250 --> 00:20:31,810 Але * використовується в обох контекстах, і як частина імені типу, 384 00:20:31,810 --> 00:20:34,100 і ми побачимо, трохи пізніше ще щось, теж. 385 00:20:34,100 --> 00:20:36,490 І зараз це разименовать оператор. 386 00:20:36,490 --> 00:20:38,760 Так він іде до заслання, це доступ до даних 387 00:20:38,760 --> 00:20:43,000 на місці покажчика, і дозволяє маніпулювати за своїм бажанням. 388 00:20:43,000 --> 00:20:45,900 >> Тепер це дуже схоже на відвідування вашого сусіда, право. 389 00:20:45,900 --> 00:20:48,710 Якщо ви знаєте, що Сусід живе, ви 390 00:20:48,710 --> 00:20:50,730 не бовтатися з вашим сусідом. 391 00:20:50,730 --> 00:20:53,510 Ви знаєте, трапляється, знаю, де вони живуть, 392 00:20:53,510 --> 00:20:56,870 але це не означає, що силу того, що знання 393 00:20:56,870 --> 00:20:59,170 Ви взаємодіючих з ними. 394 00:20:59,170 --> 00:21:01,920 Якщо ви хочете, щоб взаємодіяти з ними, Ви повинні піти в їхньому будинку, 395 00:21:01,920 --> 00:21:03,760 Ви повинні піти туди, де вони живуть. 396 00:21:03,760 --> 00:21:07,440 І як тільки ви це зробите, то ви можете взаємодіяти 397 00:21:07,440 --> 00:21:09,420 з ними так само, як ви хотіли б. 398 00:21:09,420 --> 00:21:12,730 І точно так само зі змінними, Ви повинні піти на їхню адресу 399 00:21:12,730 --> 00:21:15,320 якщо ви хочете, щоб взаємодіяти їх, Ви не можете просто знати адресу. 400 00:21:15,320 --> 00:21:21,495 І те, як ви йдете на адреси використовувати *, оператор разименованія. 401 00:21:21,495 --> 00:21:23,620 Що ви думаєте станеться якщо ми будемо намагатися разименовать 402 00:21:23,620 --> 00:21:25,260 покажчик, значення якого дорівнює нулю? 403 00:21:25,260 --> 00:21:28,470 Нагадаємо, що нуль покажчик вказує нічого. 404 00:21:28,470 --> 00:21:34,110 Так що, якщо ви спробуєте і разименованія нічого або перейти до адресної нічого, 405 00:21:34,110 --> 00:21:36,800 що ви думаєте відбувається? 406 00:21:36,800 --> 00:21:39,630 Ну, якщо ви здогадалися сегментації вина, ви були б праві. 407 00:21:39,630 --> 00:21:41,390 Якщо ви спробуєте і разименованія порожній покажчик, 408 00:21:41,390 --> 00:21:43,140 Ви страждаєте сегментації вина. Але почекайте, 409 00:21:43,140 --> 00:21:45,820 не кажу вам, що якщо ви не збираєтеся 410 00:21:45,820 --> 00:21:49,220 щоб встановити значення вашого покажчик на щось значуще, 411 00:21:49,220 --> 00:21:51,000 Ви повинні встановити на нуль? 412 00:21:51,000 --> 00:21:55,290 Я зробив, і насправді сегментація несправність роду хорошу поведінку. 413 00:21:55,290 --> 00:21:58,680 >> Ви коли-небудь оголосили змінну і не відразу присвоюється його значення? 414 00:21:58,680 --> 00:22:02,680 Таким чином, ви просто сказати Int х; Ви не насправді привласнити його ні до чого 415 00:22:02,680 --> 00:22:05,340 а потім пізніше в коді, Вам роздрукувати значення х, 416 00:22:05,340 --> 00:22:07,650 маючи досі не призначений його ні до чого. 417 00:22:07,650 --> 00:22:10,370 Часто ви отримаєте нулю, але іноді ви 418 00:22:10,370 --> 00:22:15,000 може отримати випадкове число, і Ви поняття не маєте, де він прийшов. 419 00:22:15,000 --> 00:22:16,750 Точно можу речі станеться з покажчиками. 420 00:22:16,750 --> 00:22:20,110 Коли ви оголошуєте покажчик INT * рк наприклад, 421 00:22:20,110 --> 00:22:23,490 і ви не призначити його значення, Ви отримуєте чотири байти для пам'яті. 422 00:22:23,490 --> 00:22:25,950 Які б не були чотири байти пам'яті система може 423 00:22:25,950 --> 00:22:28,970 виявите, що є деякі значимі цінності. 424 00:22:28,970 --> 00:22:31,760 І, можливо, було то там вже, що 425 00:22:31,760 --> 00:22:34,190 не більше і не потрібен інший Функція, так що ви просто повинні 426 00:22:34,190 --> 00:22:35,900 всі дані там. 427 00:22:35,900 --> 00:22:40,570 >> Що робити, якщо ви намагалися зробити розіменування деякі адресу, яку ви don't- було 428 00:22:40,570 --> 00:22:43,410 вже байти і інформації у там, що тепер в покажчик. 429 00:22:43,410 --> 00:22:47,470 Якщо ви спробуєте і разименованія покажчика цього, Ви могли б возитися з якоюсь пам'яті 430 00:22:47,470 --> 00:22:49,390 що ви не маєте наміру возитися з усім цим. 431 00:22:49,390 --> 00:22:51,639 І справді ви могли б зробити щось дійсно руйнівним, 432 00:22:51,639 --> 00:22:54,880 як зламати іншу програму, або зламати іншу функцію, 433 00:22:54,880 --> 00:22:58,289 або зробити щось, що шкідливий Ви не маєте наміру робити взагалі. 434 00:22:58,289 --> 00:23:00,080 І ось чому це насправді хороша ідея 435 00:23:00,080 --> 00:23:04,030 встановити свої покажчики на нуль, якщо вам не встановлений їх щось осмислене. 436 00:23:04,030 --> 00:23:06,760 Це, ймовірно, краще на Кінець дня для вашої програми 437 00:23:06,760 --> 00:23:09,840 до краху, то для того, щоб зробити те, що гвинти вгору 438 00:23:09,840 --> 00:23:12,400 інша програма або інша функція. 439 00:23:12,400 --> 00:23:15,207 Така поведінка, можливо, навіть менш ідеальним, ніж просто збій. 440 00:23:15,207 --> 00:23:17,040 І ось чому це насправді хороша звичка 441 00:23:17,040 --> 00:23:20,920 щоб потрапити у ваші встановити покажчики до нуля, якщо ви не встановите їх 442 00:23:20,920 --> 00:23:24,540 до значимого вартості негайно, значення, що ви знаєте 443 00:23:24,540 --> 00:23:27,260 і що ви можете безпечно виконувати разименованія. 444 00:23:27,260 --> 00:23:32,240 >> Отже, давайте повернемося в даний час і поглянути у загальному синтаксисі ситуації. 445 00:23:32,240 --> 00:23:37,400 Якщо я кажу, INT * р;, що я тільки що зробив? 446 00:23:37,400 --> 00:23:38,530 Що я зробив це. 447 00:23:38,530 --> 00:23:43,290 Я знаю, що величина р є адреса бо всі покажчики тільки 448 00:23:43,290 --> 00:23:44,660 адреси. 449 00:23:44,660 --> 00:23:47,750 Я можу разименованія р використовуючи оператор *. 450 00:23:47,750 --> 00:23:51,250 У цьому контексті тут, у самому топ згадати * є частиною типу. 451 00:23:51,250 --> 00:23:53,510 Int * тип даних. 452 00:23:53,510 --> 00:23:56,150 Але я можу разименованія р, використовуючи оператор *, 453 00:23:56,150 --> 00:24:01,897 і якщо я роблю так, якщо я йду за цією адресою, те, що я знайду за цією адресою? 454 00:24:01,897 --> 00:24:02,855 Я знайду ціле. 455 00:24:02,855 --> 00:24:05,910 Так INT * р в основному кажучи, р являє собою адресу. 456 00:24:05,910 --> 00:24:09,500 Я можу разименованія р і якщо Я, я знайду ціле 457 00:24:09,500 --> 00:24:11,920 в цьому місці пам'яті. 458 00:24:11,920 --> 00:24:14,260 >> ОК, так що я сказав, що був ще один дратує річ з зірками 459 00:24:14,260 --> 00:24:17,060 і ось де, що дратує річ з зірками є. 460 00:24:17,060 --> 00:24:21,640 Ви коли-небудь намагалися оголосити кілька змінних одного і того ж типу 461 00:24:21,640 --> 00:24:24,409 на тому ж рядку коду? 462 00:24:24,409 --> 00:24:27,700 Таким чином, для другого, робити вигляд, що лінії, код, який я насправді у них там в зелений 463 00:24:27,700 --> 00:24:29,366 там немає, і він просто говорить INT х, у, г;. 464 00:24:29,366 --> 00:24:31,634 465 00:24:31,634 --> 00:24:34,550 Те, що це буде зробити, це насправді створити трьох цілочисельні змінні для вас, 466 00:24:34,550 --> 00:24:36,930 одна називається х, одна називається у, і один називається р 467 00:24:36,930 --> 00:24:41,510 Це спосіб зробити це без того, щоб розділити на три лінії. 468 00:24:41,510 --> 00:24:43,890 >> Ось де зірки отримують дратує знову, хоча, 469 00:24:43,890 --> 00:24:49,200 бо насправді * частина є з імені типу і частини 470 00:24:49,200 --> 00:24:50,320 імені змінної. 471 00:24:50,320 --> 00:24:56,430 І тому, якщо я кажу, INT * рх, ру, рг, те, що я насправді отримати покажчик на ціле 472 00:24:56,430 --> 00:25:01,650 називається ПВ і два цілих числа, ру і рг. 473 00:25:01,650 --> 00:25:04,950 І це, напевно, не те, що ми хочемо, це не добре. 474 00:25:04,950 --> 00:25:09,290 >> Так що, якщо я хочу, щоб створити кілька покажчиків на тій же лінії, того ж типу, 475 00:25:09,290 --> 00:25:12,140 і зірки, те, що я насправді потрібно щоб зробити, це сказати INT * річних, * PB * шт. 476 00:25:12,140 --> 00:25:17,330 477 00:25:17,330 --> 00:25:20,300 Тепер тільки що сказав, що і тепер кажу вам це, 478 00:25:20,300 --> 00:25:22,170 ви, ймовірно, ніколи не буде робити цього. 479 00:25:22,170 --> 00:25:25,170 І це, напевно, добре, чесно кажучи, тому що ви можете випадково 480 00:25:25,170 --> 00:25:26,544 опустити зірку, щось на зразок цього. 481 00:25:26,544 --> 00:25:29,290 Це, ймовірно, краще, може бути, оголосити покажчики на окремих лініях, 482 00:25:29,290 --> 00:25:31,373 але це просто ще один з тих дратівливих синтаксису 483 00:25:31,373 --> 00:25:35,310 речі з зірками, які роблять покажчики так важко працювати. 484 00:25:35,310 --> 00:25:39,480 Тому що це просто синтаксичний це безлад, ви повинні працювати через. 485 00:25:39,480 --> 00:25:41,600 З практикою це робить дійсно стала другою натурою. 486 00:25:41,600 --> 00:25:45,410 Я до сих пір роблять помилки з ним ще після програмування протягом 10 років, 487 00:25:45,410 --> 00:25:49,630 так що не турбуйтеся, якщо щось трапиться Вам, це досить поширене, чесно кажучи. 488 00:25:49,630 --> 00:25:52,850 Це дійсно свого роду недолік синтаксису. 489 00:25:52,850 --> 00:25:54,900 >> ОК, так що я начебто обіцяв що ми знову 490 00:25:54,900 --> 00:25:59,370 поняття, як велика рядок. 491 00:25:59,370 --> 00:26:02,750 Ну, якщо я сказав вам, що Рядок, ми дійсно вид 492 00:26:02,750 --> 00:26:04,140 лежав до вас весь час. 493 00:26:04,140 --> 00:26:06,181 Там немає тип даних називається рядок, а насправді я 494 00:26:06,181 --> 00:26:09,730 згадав про це в одному з наших Перші відео на типи даних, 495 00:26:09,730 --> 00:26:13,820 що рядок була типом даних, був створений для вас в CS50.h. 496 00:26:13,820 --> 00:26:17,050 Ви повинні #include CS50.h для того, щоб використовувати його. 497 00:26:17,050 --> 00:26:19,250 >> Ну рядок насправді просто псевдонім на щось 498 00:26:19,250 --> 00:26:23,600 називається символ *, а покажчик на символ. 499 00:26:23,600 --> 00:26:26,010 Ну покажчики, нагадаємо, просто звертається. 500 00:26:26,010 --> 00:26:28,780 Так що розмір в байтах рядки? 501 00:26:28,780 --> 00:26:29,796 Ну, це чотири чи вісім. 502 00:26:29,796 --> 00:26:32,170 І чому я говорю чотири або восьмій, бо є насправді 503 00:26:32,170 --> 00:26:36,730 залежить від системи, якщо ви використовуєте CS50 язь, голець * є розмір гольця 504 00:26:36,730 --> 00:26:39,340 * Вісім, це 64-розрядна система. 505 00:26:39,340 --> 00:26:43,850 Кожен адреса в пам'яті 64 біта. 506 00:26:43,850 --> 00:26:48,270 Якщо ви використовуєте прилад CS50 або за допомогою будь 32-бітної машини, 507 00:26:48,270 --> 00:26:51,640 і ви чули, що термін 32-біт машина, що 32-бітові машини? 508 00:26:51,640 --> 00:26:56,090 Ну це просто означає, що кожен адреса в пам'яті довжиною 32 біта. 509 00:26:56,090 --> 00:26:59,140 І так 32 біт на чотири байти. 510 00:26:59,140 --> 00:27:02,710 Таким чином, символ * чотири або восьмій байт в залежності від вашої системи. 511 00:27:02,710 --> 00:27:06,100 І справді якісь типи даних, і покажчик на будь-яких даних, 512 00:27:06,100 --> 00:27:12,030 типу, так як всі покажчики тільки адреси, чотири чи вісім байт. 513 00:27:12,030 --> 00:27:14,030 Отже, давайте повернемося в цьому Графік і давайте укласти 514 00:27:14,030 --> 00:27:18,130 це відео з невеликого вправи тут. 515 00:27:18,130 --> 00:27:21,600 Так ось схема ми зупинилися з на самому початку відео. 516 00:27:21,600 --> 00:27:23,110 Так що тепер, якщо я говорю * рк = 35? 517 00:27:23,110 --> 00:27:26,370 518 00:27:26,370 --> 00:27:30,530 Так що це означає, коли я кажу, * рк = 35? 519 00:27:30,530 --> 00:27:32,420 Візьміть другий. 520 00:27:32,420 --> 00:27:34,990 * Рк. 521 00:27:34,990 --> 00:27:39,890 У контексті тут, є * разименовать оператор. 522 00:27:39,890 --> 00:27:42,110 Тому, коли разименовать оператор використовується, 523 00:27:42,110 --> 00:27:48,520 ми йдемо на адресу вказав по рк, і ми змінюємося, що ми знаходимо. 524 00:27:48,520 --> 00:27:55,270 Так * рк = 35 ефективно робить це на картинці. 525 00:27:55,270 --> 00:27:58,110 Так що це в основному синтаксично ідентичні в тому, сказав K = 35. 526 00:27:58,110 --> 00:28:00,740 527 00:28:00,740 --> 00:28:01,930 >> Ще один. 528 00:28:01,930 --> 00:28:05,510 Якщо я кажу, INT м, я створюю нова змінна називається м. 529 00:28:05,510 --> 00:28:08,260 Нове поле, це тому, що зелений ящик він збирається провести ціле, 530 00:28:08,260 --> 00:28:09,840 і це позначені м. 531 00:28:09,840 --> 00:28:14,960 Якщо я кажу, M = 4, я ставлю число в цьому полі. 532 00:28:14,960 --> 00:28:20,290 Якщо скажімо рк = & м, як же це зміна схема? 533 00:28:20,290 --> 00:28:28,760 Рк = & м, ви пригадати, що в І оператор робить або як називається? 534 00:28:28,760 --> 00:28:34,430 Пам'ятайте, що деякі & ім'я змінної це адреса змінної ім'я. 535 00:28:34,430 --> 00:28:38,740 Отже, що ми хочемо сказати, рк отримує адреса м. 536 00:28:38,740 --> 00:28:42,010 І так ефективно, що відбувається, схема, що рк довше без окулярів 537 00:28:42,010 --> 00:28:46,420 К, але вказує на м. 538 00:28:46,420 --> 00:28:48,470 >> Знову покажчики дуже складно працювати 539 00:28:48,470 --> 00:28:50,620 і вони займають багато практика, а тому, що 540 00:28:50,620 --> 00:28:54,150 їх здібності, щоб дозволити вам для передачі даних між функціями 541 00:28:54,150 --> 00:28:56,945 і насправді є ті Зміни вступлять в силу, 542 00:28:56,945 --> 00:28:58,820 отримувати вашу головку навколо це дуже важливо. 543 00:28:58,820 --> 00:29:02,590 Це, ймовірно, є найскладнішим Цю тему ми обговоримо в CS50, 544 00:29:02,590 --> 00:29:05,910 але значення, що вам отримати від використання покажчиків 545 00:29:05,910 --> 00:29:09,200 значно переважує ускладнень які приходять від навчання їх. 546 00:29:09,200 --> 00:29:12,690 Так що я бажаю вам краще удачі дізнатися про покажчики. 547 00:29:12,690 --> 00:29:15,760 Я Дуг Ллойд, це CS50. 548 00:29:15,760 --> 00:29:17,447