1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] Давайте поговоримо про масивах. 2 00:00:09,360 --> 00:00:12,780 Так чому ж ми всі хочемо використовувати масиви? 3 00:00:12,780 --> 00:00:17,210 Ну, скажімо, у вас є програма, яку необхідно зберігати 5 ідентифікаторів студентів. 4 00:00:17,210 --> 00:00:21,270 Здавалося б розумно мати 5 окремих змінних. 5 00:00:21,270 --> 00:00:24,240 З причин, які ми побачимо в трохи, ми почнемо відлік з 0. 6 00:00:24,240 --> 00:00:30,700 Змінних ми будемо мати буде id0 Int, Int id1, і так далі. 7 00:00:30,700 --> 00:00:34,870 Будь логіка, яку ми хочемо виконати на студентський квиток потрібно буде скопіювати і вставити 8 00:00:34,870 --> 00:00:36,870 Для кожного з цих студентів ідентифікаторів. 9 00:00:36,870 --> 00:00:39,710 Якщо ми хочемо, щоб перевірити, які студенти опинилися в CS50, 10 00:00:39,710 --> 00:00:43,910 ми спочатку потрібно перевірити, якщо id0 представляє студентом на курсі. 11 00:00:43,910 --> 00:00:48,070 Потім зробити те ж саме на наступний студент, нам потрібно скопіювати і вставити код для id0 12 00:00:48,070 --> 00:00:54,430 і замінити всі входження id0 з id1 і так далі для id2, 3, і 4. 13 00:00:54,430 --> 00:00:57,560 >> Як тільки ви почуєте, що нам потрібно скопіювати і вставити, 14 00:00:57,560 --> 00:01:00,440 Ви повинні почати думати, що є краще рішення. 15 00:01:00,440 --> 00:01:05,360 А що, якщо ви розумієте, що ви не потребуєте в 5 ідентифікатори студентів, але замість 7? 16 00:01:05,360 --> 00:01:09,570 Вам потрібно повернутися до початкового коду і додати в ID5, ID6, 17 00:01:09,570 --> 00:01:14,260 і скопіювати і вставити логіку для перевірки, якщо ідентифікатори відносяться до класу для цих 2 нових ідентифікаторів. 18 00:01:14,260 --> 00:01:19,600 Існує нічого підключення всіх цих ідентифікаторів разом, і тому немає способу просити 19 00:01:19,600 --> 00:01:22,040 Програма зробити це для ідентифікаторів 0 до 6. 20 00:01:22,040 --> 00:01:26,120 Ну тепер ви розумієте, у вас є 100 ідентифікаторів студентів. 21 00:01:26,120 --> 00:01:30,770 Це починає здаватися менше, ніж ідеально потрібно окремо оголосити кожну з цих ідентифікаторів, 22 00:01:30,770 --> 00:01:33,760 і скопіювати і вставити будь логіки для цих нових ідентифікаторів. 23 00:01:33,760 --> 00:01:38,380 Але, можливо, ми сповнені рішучості, і ми робимо це для всіх 100 студентів. 24 00:01:38,380 --> 00:01:42,240 Але що, якщо ви не знаєте, скільки студентів є насправді? 25 00:01:42,240 --> 00:01:47,320 Є тільки деякі російських студентів і ваша програма повинна запитати користувача, що це п. 26 00:01:47,320 --> 00:01:50,250 Ой-ой. Це не буде працювати дуже добре. 27 00:01:50,250 --> 00:01:53,820 Ваша програма працює тільки для деяких постійних числа студентів. 28 00:01:53,820 --> 00:01:57,520 >> Вирішення всіх цих проблем є краса масивів. 29 00:01:57,520 --> 00:01:59,930 Так що ж таке масив? 30 00:01:59,930 --> 00:02:04,480 У деяких мовах програмування типу масиву могли б зробити трохи більше, 31 00:02:04,480 --> 00:02:09,960 але тут ми зосередимося на основній структури масиву даних так само, як ви побачите його в C. 32 00:02:09,960 --> 00:02:14,030 Масив це просто великий блок пам'яті. Ось і все. 33 00:02:14,030 --> 00:02:17,770 Коли ми говоримо, у нас є масив з 10 цілих чисел, що просто означає, що у нас є блок 34 00:02:17,770 --> 00:02:20,740 пам'яті, досить великий, щоб провести 10 окремих чисел. 35 00:02:29,930 --> 00:02:33,410 Припускаючи, що ціле 4 байти, це означає, що масив з 10 цілих чисел 36 00:02:33,410 --> 00:02:37,180 безперервний блок з 40 байт в пам'яті. 37 00:02:42,660 --> 00:02:46,280 Навіть якщо ви використовуєте багатовимірні масиви, які ми не будемо вдаватися в сюди, 38 00:02:46,280 --> 00:02:49,200 це ще тільки великий блок пам'яті. 39 00:02:49,200 --> 00:02:51,840 Багатовимірних позначень просто для зручності. 40 00:02:51,840 --> 00:02:55,640 Якщо у вас є 3 на 3 багатовимірний масив цілих чисел, 41 00:02:55,640 --> 00:03:00,650 Потім ваша програма буде дійсно тільки розглядати це як великий блок з 36 байт. 42 00:03:00,650 --> 00:03:05,460 Загальна кількість цілих чисел в 3 рази 3, і кожне ціле число займає 4 байти. 43 00:03:05,460 --> 00:03:07,750 >> Давайте поглянемо на простий приклад. 44 00:03:07,750 --> 00:03:10,660 Ми бачимо тут 2 різних способів оголошення масивів. 45 00:03:15,660 --> 00:03:18,580 Ми повинні будемо коментувати 1 з них за програма для компіляції 46 00:03:18,580 --> 00:03:20,900 так як ми заявляємо х в два рази. 47 00:03:20,900 --> 00:03:25,140 Ми поглянемо на деякі відмінності між цими 2 типами заяв в трохи. 48 00:03:25,140 --> 00:03:28,560 Обидві ці лінії оголосити масив розміру N, 49 00:03:28,560 --> 00:03:30,740 де ми визначимо N # як 10. 50 00:03:30,740 --> 00:03:34,460 Ми могли б так само легко, попросив у користувача натуральне 51 00:03:34,460 --> 00:03:37,250 і використовував його як ціле число елементів у масиві. 52 00:03:37,250 --> 00:03:41,960 Подобається наш студентський квиток, наприклад, перед, це ніби як оголосити 10 повністю окремий 53 00:03:41,960 --> 00:03:49,000 уявних змінних x0, x1, x2, і так далі до Xn-1. 54 00:03:57,270 --> 00:04:00,840 Не звертаючи уваги на лініях, де ми оголошуємо масив, зверніть увагу на квадратні дужки недоторканими 55 00:04:00,840 --> 00:04:02,090 усередині циклів. 56 00:04:02,090 --> 00:04:09,660 Коли ми пишемо щось подібне X [3], який я тільки що прочитав, як х кронштейн 3, 57 00:04:09,660 --> 00:04:13,090 Ви можете думати про нього, як просити уявної x3. 58 00:04:13,090 --> 00:04:17,519 Зверніть увагу, ніж масив розміру N, це означає, що номер усередині дужок 59 00:04:17,519 --> 00:04:22,630 який ми будемо називати індексом, може бути що завгодно від 0 до N-1, 60 00:04:22,630 --> 00:04:25,660 яка є спільною індексів N. 61 00:04:25,660 --> 00:04:28,260 >> Думати про те, як це насправді працює 62 00:04:28,260 --> 00:04:31,260 пам'ятайте, що масив являє собою великий блок пам'яті. 63 00:04:31,260 --> 00:04:37,460 Припускаючи, що ціле 4 байти, весь масив х 40 байт блоку пам'яті. 64 00:04:37,460 --> 00:04:41,360 Так x0 належить до найбільш першим 4 байта блоку. 65 00:04:45,810 --> 00:04:49,230 X [1] посилається на наступні 4 байти і так далі. 66 00:04:49,230 --> 00:04:53,760 Це означає, що на початку х всі програми ніколи не повинні відстежувати. 67 00:04:55,660 --> 00:04:59,840 Якщо ви хочете використовувати х [400], то програма знає, що це еквівалентно 68 00:04:59,840 --> 00:05:03,460 тільки 1600 байт після початку х. 69 00:05:03,460 --> 00:05:08,780 Звідки ми отримуємо 1600 байт з? Це всього лише в 400 разів 4 байти на ціле число. 70 00:05:08,780 --> 00:05:13,170 >> Перш ніж рухатися далі, це дуже важливо розуміти, що в C 71 00:05:13,170 --> 00:05:17,080 немає органів індекс, який ми використовуємо в масиві. 72 00:05:17,080 --> 00:05:23,180 Наш великий блок знаходиться всього в 10 цілих довго, але нічого не буде кричати на нас, якщо ми пишемо х [20] 73 00:05:23,180 --> 00:05:26,060 або навіть х [-5]. 74 00:05:26,060 --> 00:05:28,240 Індекс не повинні навіть бути поруч. 75 00:05:28,240 --> 00:05:30,630 Це може бути будь-яке довільне вираження. 76 00:05:30,630 --> 00:05:34,800 У програмі ми використовуємо змінну я з циклу в якості індексу в масиві. 77 00:05:34,800 --> 00:05:40,340 Це дуже поширена картина, цикл від I = 0 до довжини масиву, 78 00:05:40,340 --> 00:05:43,350 а потім за допомогою я як індекс для масиву. 79 00:05:43,350 --> 00:05:46,160 Таким чином, ви ефективно цикл по всьому масиву, 80 00:05:46,160 --> 00:05:50,600 і ви можете присвоїти кожному місце в масиві, або використовувати його для деяких розрахунків. 81 00:05:50,600 --> 00:05:53,920 >> У перший цикл, я починається з 0, 82 00:05:53,920 --> 00:05:58,680 і так буде призначити на 0 місці в масиві, значення 0 раз 2. 83 00:05:58,680 --> 00:06:04,370 Тоді я кроком, і ми привласнити перше місце в масиві значення 1 раз 2. 84 00:06:04,370 --> 00:06:10,170 Тоді я знову збільшується на одиницю і так далі, поки ми не призначити в положення N-1 в масиві 85 00:06:10,170 --> 00:06:13,370 Значення N-1 раз 2. 86 00:06:13,370 --> 00:06:17,810 Таким чином, ми створили масив з перших 10 парних чисел. 87 00:06:17,810 --> 00:06:21,970 Може бути, вирівнює було б трохи краще, ім'я змінної, ніж х, 88 00:06:21,970 --> 00:06:24,760 але це дало б речі. 89 00:06:24,760 --> 00:06:30,210 Другий цикл, то просто друкує значення, що ми вже зберігається всередині масиву. 90 00:06:30,210 --> 00:06:33,600 >> Давайте спробуємо запустити програму з обома типами масиву декларацій 91 00:06:33,600 --> 00:06:36,330 і подивіться на результат роботи програми. 92 00:06:51,450 --> 00:06:57,020 Наскільки ми можемо бачити, програма веде себе так само для обох типів декларацій. 93 00:06:57,020 --> 00:07:02,230 Давайте ж поглянемо на те, що станеться, якщо ми змінимо першу петлю, щоб не зупинятися на N 94 00:07:02,230 --> 00:07:05,040 а сказати 10.000. 95 00:07:05,040 --> 00:07:07,430 Шляхи за межі масиву. 96 00:07:14,700 --> 00:07:17,210 Ой. Може бути, ви бачили це раніше. 97 00:07:17,210 --> 00:07:20,440 Помилки сегментації означає, що ваші програми стався збій. 98 00:07:20,440 --> 00:07:24,430 Ви починаєте бачити це, коли ви торкаєтеся області пам'яті, ви не повинні стосуватися. 99 00:07:24,430 --> 00:07:27,870 Тут стикаються 10000 місць за початок х, 100 00:07:27,870 --> 00:07:31,920 яка, очевидно, є місцем в пам'яті, ми не повинні стикатися. 101 00:07:31,920 --> 00:07:37,690 Тому більшість з нас, ймовірно, не випадково поставив 10000 замість N, 102 00:07:37,690 --> 00:07:42,930 Але що, якщо ми робимо щось більш тонке, як кажуть запису менше або дорівнює N 103 00:07:42,930 --> 00:07:46,830 в циклі умова, а не менше, ніж N. 104 00:07:46,830 --> 00:07:50,100 Пам'ятайте, що масив має тільки індексами від 0 до N-1, 105 00:07:50,100 --> 00:07:54,510 Це означає, що індекс N знаходиться за межами кінця масиву. 106 00:07:54,510 --> 00:07:58,050 Програма не може привести до збою в даному випадку, але це все одно помилка. 107 00:07:58,050 --> 00:08:01,950 Насправді, ця помилка є настільки поширеним, що воно має своє власне ім'я, 108 00:08:01,950 --> 00:08:03,970 вимикання на 1 помилка. 109 00:08:03,970 --> 00:08:05,970 >> Ось саме для основи. 110 00:08:05,970 --> 00:08:09,960 Отже, які ж основні відмінності між 2 типами масиву декларацій? 111 00:08:09,960 --> 00:08:13,960 Одна з відмінностей є, де великий блок пам'яті йде. 112 00:08:13,960 --> 00:08:17,660 У першу декларацію, в якій я буду називати брекет-тип масиву, 113 00:08:17,660 --> 00:08:20,300 хоча це аж ніяк не умовне найменування, 114 00:08:20,300 --> 00:08:22,480 він буде йти в стеці. 115 00:08:22,480 --> 00:08:27,450 У той час як у другому, який я буду називати покажчик типу масиву, він буде йти в купу. 116 00:08:27,450 --> 00:08:32,480 Це означає, що коли функція повертає, кронштейн масив буде автоматично звільняється, 117 00:08:32,480 --> 00:08:36,419 в той час як ви повинні explicitily подзвонити безкоштовно на масив покажчиків 118 00:08:36,419 --> 00:08:38,010 або ж у вас є витік пам'яті. 119 00:08:38,010 --> 00:08:42,750 Крім того, кронштейн масиву фактично не є змінною. 120 00:08:42,750 --> 00:08:45,490 Це дуже важливо. Це просто символ. 121 00:08:45,490 --> 00:08:49,160 Ви можете думати про це як константа, компілятор вибирає для вас. 122 00:08:49,160 --> 00:08:52,970 Це означає, що ми не можемо зробити щось подібне х + + з кронштейном типу, 123 00:08:52,970 --> 00:08:56,240 хоча це цілком припустимо з покажчиком. 124 00:08:56,240 --> 00:08:58,270 >> Покажчик типу змінної. 125 00:08:58,270 --> 00:09:01,510 Для покажчиків типу, у нас є 2 окремих блоків пам'яті. 126 00:09:01,510 --> 00:09:06,060 Змінна х сам зберігаються в стеку і тільки один покажчик, 127 00:09:06,060 --> 00:09:08,620 але великий блок пам'яті зберігаються в купі. 128 00:09:08,620 --> 00:09:11,010 Змінна х в стек тільки зберігає адресу 129 00:09:11,010 --> 00:09:14,010 великий блок пам'яті в купі. 130 00:09:14,010 --> 00:09:17,370 Одним з наслідків цього є з розміром оператора. 131 00:09:17,370 --> 00:09:22,480 Якщо ви попросите розмір кронштейна масив, це дасть вам розмір великий блок пам'яті, 132 00:09:22,480 --> 00:09:24,620 щось на зразок 40 байт, 133 00:09:24,620 --> 00:09:26,920 Але якщо ви попросите розмір покажчика типу масиву, 134 00:09:26,920 --> 00:09:32,740 це дасть вам розмір змінної х себе, що на прилад, швидше за все, тільки 4 байт. 135 00:09:32,740 --> 00:09:36,530 Використання покажчиків типу масиву, не можна напряму звернутися за 136 00:09:36,530 --> 00:09:38,530 Розмір великий блок пам'яті. 137 00:09:38,530 --> 00:09:42,530 Це звичайно не багато обмежень, так як ми дуже рідко хочуть розміру 138 00:09:42,530 --> 00:09:46,980 великий блок пам'яті, і ми, як правило, обчислити його, якщо нам це потрібно. 139 00:09:46,980 --> 00:09:51,490 >> Нарешті, кронштейн масиву відбувається, щоб надати нам ярлик для ініціалізації масиву. 140 00:09:51,490 --> 00:09:56,130 Давайте подивимося, як ми могли б написати перші 10 парних чисел за допомогою контекстного initilization. 141 00:10:11,220 --> 00:10:14,470 З масиву покажчиків, не існує способу зробити ярлик, як це. 142 00:10:14,470 --> 00:10:18,120 Це всього лише введення до того, що ви можете зробити з масивами. 143 00:10:18,120 --> 00:10:20,990 Вони з'являються майже в кожній програмі ви пишете. 144 00:10:20,990 --> 00:10:24,390 Сподіваюся, тепер ви можете бачити кращий спосіб це зробити на прикладі студентів ідентифікатори 145 00:10:24,390 --> 00:10:26,710 З початку відео. 146 00:10:26,710 --> 00:10:29,960 >> Мене звуть Боб Боуден, і це CS50.