[Powered by Google Translate] Давайте поговоримо про масивах.
Так чому ж ми всі хочемо використовувати масиви?
Ну, скажімо, у вас є програма, яку необхідно зберігати 5 ідентифікаторів студентів.
Здавалося б розумно мати 5 окремих змінних.
З причин, які ми побачимо в трохи, ми почнемо відлік з 0.
Змінних ми будемо мати буде id0 Int, Int id1, і так далі.
Будь логіка, яку ми хочемо виконати на студентський квиток потрібно буде скопіювати і вставити
Для кожного з цих студентів ідентифікаторів.
Якщо ми хочемо, щоб перевірити, які студенти опинилися в CS50,
ми спочатку потрібно перевірити, якщо id0 представляє студентом на курсі.
Потім зробити те ж саме на наступний студент, нам потрібно скопіювати і вставити код для id0
і замінити всі входження id0 з id1 і так далі для id2, 3, і 4.
>> Як тільки ви почуєте, що нам потрібно скопіювати і вставити,
Ви повинні почати думати, що є краще рішення.
А що, якщо ви розумієте, що ви не потребуєте в 5 ідентифікатори студентів, але замість 7?
Вам потрібно повернутися до початкового коду і додати в ID5, ID6,
і скопіювати і вставити логіку для перевірки, якщо ідентифікатори відносяться до класу для цих 2 нових ідентифікаторів.
Існує нічого підключення всіх цих ідентифікаторів разом, і тому немає способу просити
Програма зробити це для ідентифікаторів 0 до 6.
Ну тепер ви розумієте, у вас є 100 ідентифікаторів студентів.
Це починає здаватися менше, ніж ідеально потрібно окремо оголосити кожну з цих ідентифікаторів,
і скопіювати і вставити будь логіки для цих нових ідентифікаторів.
Але, можливо, ми сповнені рішучості, і ми робимо це для всіх 100 студентів.
Але що, якщо ви не знаєте, скільки студентів є насправді?
Є тільки деякі російських студентів і ваша програма повинна запитати користувача, що це п.
Ой-ой. Це не буде працювати дуже добре.
Ваша програма працює тільки для деяких постійних числа студентів.
>> Вирішення всіх цих проблем є краса масивів.
Так що ж таке масив?
У деяких мовах програмування типу масиву могли б зробити трохи більше,
але тут ми зосередимося на основній структури масиву даних так само, як ви побачите його в C.
Масив це просто великий блок пам'яті. Ось і все.
Коли ми говоримо, у нас є масив з 10 цілих чисел, що просто означає, що у нас є блок
пам'яті, досить великий, щоб провести 10 окремих чисел.
Припускаючи, що ціле 4 байти, це означає, що масив з 10 цілих чисел
безперервний блок з 40 байт в пам'яті.
Навіть якщо ви використовуєте багатовимірні масиви, які ми не будемо вдаватися в сюди,
це ще тільки великий блок пам'яті.
Багатовимірних позначень просто для зручності.
Якщо у вас є 3 на 3 багатовимірний масив цілих чисел,
Потім ваша програма буде дійсно тільки розглядати це як великий блок з 36 байт.
Загальна кількість цілих чисел в 3 рази 3, і кожне ціле число займає 4 байти.
>> Давайте поглянемо на простий приклад.
Ми бачимо тут 2 різних способів оголошення масивів.
Ми повинні будемо коментувати 1 з них за програма для компіляції
так як ми заявляємо х в два рази.
Ми поглянемо на деякі відмінності між цими 2 типами заяв в трохи.
Обидві ці лінії оголосити масив розміру N,
де ми визначимо N # як 10.
Ми могли б так само легко, попросив у користувача натуральне
і використовував його як ціле число елементів у масиві.
Подобається наш студентський квиток, наприклад, перед, це ніби як оголосити 10 повністю окремий
уявних змінних x0, x1, x2, і так далі до Xn-1.
Не звертаючи уваги на лініях, де ми оголошуємо масив, зверніть увагу на квадратні дужки недоторканими
усередині циклів.
Коли ми пишемо щось подібне X [3], який я тільки що прочитав, як х кронштейн 3,
Ви можете думати про нього, як просити уявної x3.
Зверніть увагу, ніж масив розміру N, це означає, що номер усередині дужок
який ми будемо називати індексом, може бути що завгодно від 0 до N-1,
яка є спільною індексів N.
>> Думати про те, як це насправді працює
пам'ятайте, що масив являє собою великий блок пам'яті.
Припускаючи, що ціле 4 байти, весь масив х 40 байт блоку пам'яті.
Так x0 належить до найбільш першим 4 байта блоку.
X [1] посилається на наступні 4 байти і так далі.
Це означає, що на початку х всі програми ніколи не повинні відстежувати.
Якщо ви хочете використовувати х [400], то програма знає, що це еквівалентно
тільки 1600 байт після початку х.
Звідки ми отримуємо 1600 байт з? Це всього лише в 400 разів 4 байти на ціле число.
>> Перш ніж рухатися далі, це дуже важливо розуміти, що в C
немає органів індекс, який ми використовуємо в масиві.
Наш великий блок знаходиться всього в 10 цілих довго, але нічого не буде кричати на нас, якщо ми пишемо х [20]
або навіть х [-5].
Індекс не повинні навіть бути поруч.
Це може бути будь-яке довільне вираження.
У програмі ми використовуємо змінну я з циклу в якості індексу в масиві.
Це дуже поширена картина, цикл від I = 0 до довжини масиву,
а потім за допомогою я як індекс для масиву.
Таким чином, ви ефективно цикл по всьому масиву,
і ви можете присвоїти кожному місце в масиві, або використовувати його для деяких розрахунків.
>> У перший цикл, я починається з 0,
і так буде призначити на 0 місці в масиві, значення 0 раз 2.
Тоді я кроком, і ми привласнити перше місце в масиві значення 1 раз 2.
Тоді я знову збільшується на одиницю і так далі, поки ми не призначити в положення N-1 в масиві
Значення N-1 раз 2.
Таким чином, ми створили масив з перших 10 парних чисел.
Може бути, вирівнює було б трохи краще, ім'я змінної, ніж х,
але це дало б речі.
Другий цикл, то просто друкує значення, що ми вже зберігається всередині масиву.
>> Давайте спробуємо запустити програму з обома типами масиву декларацій
і подивіться на результат роботи програми.
Наскільки ми можемо бачити, програма веде себе так само для обох типів декларацій.
Давайте ж поглянемо на те, що станеться, якщо ми змінимо першу петлю, щоб не зупинятися на N
а сказати 10.000.
Шляхи за межі масиву.
Ой. Може бути, ви бачили це раніше.
Помилки сегментації означає, що ваші програми стався збій.
Ви починаєте бачити це, коли ви торкаєтеся області пам'яті, ви не повинні стосуватися.
Тут стикаються 10000 місць за початок х,
яка, очевидно, є місцем в пам'яті, ми не повинні стикатися.
Тому більшість з нас, ймовірно, не випадково поставив 10000 замість N,
Але що, якщо ми робимо щось більш тонке, як кажуть запису менше або дорівнює N
в циклі умова, а не менше, ніж N.
Пам'ятайте, що масив має тільки індексами від 0 до N-1,
Це означає, що індекс N знаходиться за межами кінця масиву.
Програма не може привести до збою в даному випадку, але це все одно помилка.
Насправді, ця помилка є настільки поширеним, що воно має своє власне ім'я,
вимикання на 1 помилка.
>> Ось саме для основи.
Отже, які ж основні відмінності між 2 типами масиву декларацій?
Одна з відмінностей є, де великий блок пам'яті йде.
У першу декларацію, в якій я буду називати брекет-тип масиву,
хоча це аж ніяк не умовне найменування,
він буде йти в стеці.
У той час як у другому, який я буду називати покажчик типу масиву, він буде йти в купу.
Це означає, що коли функція повертає, кронштейн масив буде автоматично звільняється,
в той час як ви повинні explicitily подзвонити безкоштовно на масив покажчиків
або ж у вас є витік пам'яті.
Крім того, кронштейн масиву фактично не є змінною.
Це дуже важливо. Це просто символ.
Ви можете думати про це як константа, компілятор вибирає для вас.
Це означає, що ми не можемо зробити щось подібне х + + з кронштейном типу,
хоча це цілком припустимо з покажчиком.
>> Покажчик типу змінної.
Для покажчиків типу, у нас є 2 окремих блоків пам'яті.
Змінна х сам зберігаються в стеку і тільки один покажчик,
але великий блок пам'яті зберігаються в купі.
Змінна х в стек тільки зберігає адресу
великий блок пам'яті в купі.
Одним з наслідків цього є з розміром оператора.
Якщо ви попросите розмір кронштейна масив, це дасть вам розмір великий блок пам'яті,
щось на зразок 40 байт,
Але якщо ви попросите розмір покажчика типу масиву,
це дасть вам розмір змінної х себе, що на прилад, швидше за все, тільки 4 байт.
Використання покажчиків типу масиву, не можна напряму звернутися за
Розмір великий блок пам'яті.
Це звичайно не багато обмежень, так як ми дуже рідко хочуть розміру
великий блок пам'яті, і ми, як правило, обчислити його, якщо нам це потрібно.
>> Нарешті, кронштейн масиву відбувається, щоб надати нам ярлик для ініціалізації масиву.
Давайте подивимося, як ми могли б написати перші 10 парних чисел за допомогою контекстного initilization.
З масиву покажчиків, не існує способу зробити ярлик, як це.
Це всього лише введення до того, що ви можете зробити з масивами.
Вони з'являються майже в кожній програмі ви пишете.
Сподіваюся, тепер ви можете бачити кращий спосіб це зробити на прикладі студентів ідентифікатори
З початку відео.
>> Мене звуть Боб Боуден, і це CS50.