1 00:00:07,260 --> 00:00:09,180 [Powered by Google Translate] Давайте поговоримо про структур. 2 00:00:09,180 --> 00:00:12,130 Структури дають нам спосіб угруповання купу змінних разом 3 00:00:12,130 --> 00:00:14,350 в красивий пакет. 4 00:00:14,350 --> 00:00:17,020 Це, напевно, найпростіше побачити приклад прямо зараз, 5 00:00:17,020 --> 00:00:20,030 тому ми говоримо структури, 6 00:00:20,030 --> 00:00:23,340 Потім відкриття фігурною дужкою, 7 00:00:23,340 --> 00:00:26,630 і в цій структурі, ми будемо мати Int віку, 8 00:00:28,920 --> 00:00:31,350 символ назви *, 9 00:00:31,350 --> 00:00:34,670 от і все. 10 00:00:37,350 --> 00:00:40,650 Це може здатися дивним крапку з комою після фігурної дужки, 11 00:00:40,650 --> 00:00:43,620 але це насправді необхідно з структурам. 12 00:00:43,620 --> 00:00:46,270 Будь допустимий тип може піти в структурі визначенню. 13 00:00:46,270 --> 00:00:49,530 Тут ми використовували Int і символ *, 14 00:00:49,530 --> 00:00:52,610 але Ви можете також використовувати масив, зі, скажімо, 100 елементів 15 00:00:52,610 --> 00:00:54,910 або навіть в іншій структурі. 16 00:00:54,910 --> 00:00:56,960 Коли ви використовуєте структур в C, 17 00:00:56,960 --> 00:00:58,430 Ви створюєте нові типи 18 00:00:58,430 --> 00:01:00,860 з колекції інших типів. 19 00:01:00,860 --> 00:01:02,620 Тут ми робимо новий тип 20 00:01:02,620 --> 00:01:05,060 з цілого числа і символ *. 21 00:01:05,060 --> 00:01:07,400 Як ми побачимо пізніше, тип структури 22 00:01:07,400 --> 00:01:10,700 У чому еквівалентна будь-який інший тип ви звикли. 23 00:01:10,700 --> 00:01:13,310 Зазвичай, я буду порівняння, як тип структури 24 00:01:13,310 --> 00:01:15,790 схожий на ціле типу. 25 00:01:15,790 --> 00:01:18,520 У той час як ми писали код дійсний C, 26 00:01:18,520 --> 00:01:20,320 це не дуже корисно, 27 00:01:20,320 --> 00:01:22,340 і брязкіт дасть нам попередження. 28 00:01:22,340 --> 00:01:24,970 Пам'ятаєте, як структури і її схожі? 29 00:01:24,970 --> 00:01:26,710 Ну, ми в основному просто сказав 30 00:01:27,840 --> 00:01:30,060 INT, 31 00:01:30,060 --> 00:01:33,140 яке не є дуже корисним лінії. 32 00:01:33,140 --> 00:01:35,760 Так що давайте насправді оголосити перемінну цього типу 33 00:01:35,760 --> 00:01:38,760 , Давши йому ім'я перед крапкою з комою. 34 00:01:42,170 --> 00:01:45,000 Ми будемо називати змінну студента. 35 00:01:48,190 --> 00:01:51,350 Зараз ми оголосили змінну звану студента 36 00:01:51,350 --> 00:01:53,980 з типом задається структурою. 37 00:01:53,980 --> 00:01:56,730 Як нам дістатися до змінних всередині структури? 38 00:01:56,730 --> 00:01:59,040 Технічно, імена для таких змінних 39 00:01:59,040 --> 00:02:01,070 є її членами. 40 00:02:01,070 --> 00:02:04,000 Щоб отримати доступ до будь-якого окремого члена в студентській структури, 41 00:02:04,000 --> 00:02:06,440 Ви додаєте точку на ім'я змінної, 42 00:02:06,440 --> 00:02:08,860 слід ім'я члена ви хочете. 43 00:02:08,860 --> 00:02:11,690 Так от, тільки 2 дійсно можливостями 44 00:02:11,690 --> 00:02:17,760 є student.age 45 00:02:17,760 --> 00:02:24,460 і student.name. 46 00:02:24,460 --> 00:02:26,820 І ми можемо зробити щось подібне 47 00:02:26,820 --> 00:02:30,320 student.age = 12 48 00:02:30,320 --> 00:02:39,310 і student.name = студента. 49 00:02:39,310 --> 00:02:42,580 А що, якщо ми хотіли зробити другий студент? 50 00:02:42,580 --> 00:02:44,760 Ви можете подумати, щоб скопіювати і вставити ці рядки 51 00:02:44,760 --> 00:02:48,110 і змінити студент студент 2 або щось, 52 00:02:48,110 --> 00:02:50,090 і що буде працювати, 53 00:02:50,090 --> 00:02:52,670 але технічно, студент і студентка 2 54 00:02:52,670 --> 00:02:54,540 не мають такого ж типу. 55 00:02:54,540 --> 00:02:56,940 Бачите, ви не зможете призначити їх один з одним. 56 00:02:56,940 --> 00:02:58,560 Це тому, що до цих пір, 57 00:02:58,560 --> 00:03:00,950 ваша структура була анонімною. 58 00:03:00,950 --> 00:03:02,290 Ми повинні дати йому ім'я. 59 00:03:02,290 --> 00:03:04,420 Щоб зробити це, ми вставляємо назву структури 60 00:03:04,420 --> 00:03:06,950 після слів структури. 61 00:03:09,440 --> 00:03:11,170 студент, 62 00:03:11,170 --> 00:03:14,680 наступним визначенням. 63 00:03:16,500 --> 00:03:18,940 Ми все ще можемо негайно оголосити змінну типу 64 00:03:18,940 --> 00:03:21,570 Побудуємо студент, як ми робили це раніше. 65 00:03:24,320 --> 00:03:28,360 Ми будемо називати його S1 66 00:03:28,590 --> 00:03:30,760 Даючи структуру імені, 67 00:03:30,760 --> 00:03:33,050 Тепер ми можемо використовувати структури студента 68 00:03:33,050 --> 00:03:36,950 майже точно так само, ми хотіли б використовувати Int. 69 00:03:36,950 --> 00:03:39,580 Таким чином, ми можемо оголосити змінну типу студент структури, 70 00:03:39,580 --> 00:03:42,360 зразок 71 00:03:42,360 --> 00:03:49,500 Структура студент S2. 72 00:03:51,020 --> 00:03:55,130 Як і масиви, структури забезпечують синтаксис контекстного ініціалізації, 73 00:03:55,130 --> 00:03:58,670 таким чином, ми можемо сказати, структура студент S2 74 00:03:58,670 --> 00:04:01,420 одно 75 00:04:01,420 --> 00:04:06,040 лівої фігурною дужкою 3, S2. 76 00:04:09,210 --> 00:04:12,600 Тут, S2.age буде 3, 77 00:04:12,600 --> 00:04:15,910 і S2.name буде вказувати на S2. 78 00:04:15,910 --> 00:04:19,149 Подумайте, що ви можете зробити з цілого типу 79 00:04:19,149 --> 00:04:22,460 і більшість з них можна зробити з типом студента структури. 80 00:04:22,460 --> 00:04:26,060 Ми можемо використовувати структури студента як тип параметра функції. 81 00:04:26,060 --> 00:04:28,790 Ми можемо використовувати структури студента в новій структурі. 82 00:04:28,790 --> 00:04:31,010 Ми можемо мати покажчик на структуру студента. 83 00:04:31,010 --> 00:04:33,540 Ми можемо зробити розмір структури студента. 84 00:04:33,540 --> 00:04:35,510 Struct студентів є одним з видів 85 00:04:35,510 --> 00:04:38,030 як Int є типом. 86 00:04:38,030 --> 00:04:40,540 Ми також можемо призначити S1 та S2 87 00:04:40,540 --> 00:04:43,760 оскільки обидва мають однаковий тип, так що ми можемо зробити 88 00:04:44,390 --> 00:04:47,540 S1 = S2. 89 00:04:47,540 --> 00:04:50,430 Що станеться, якщо ми робимо 90 00:04:50,430 --> 00:04:55,300 S1.age = 10? 91 00:04:56,340 --> 00:04:58,880 Чи S2 зміни на всіх? 92 00:04:58,880 --> 00:05:02,800 Знову ж таки, думаю структури так само, як регулярні цілі числа. 93 00:05:02,800 --> 00:05:05,590 Якщо задати деякі Int X деякої Y Int, 94 00:05:05,590 --> 00:05:08,970 як X = Y 95 00:05:08,970 --> 00:05:10,850 , А потім змінити X, 96 00:05:10,850 --> 00:05:14,230 як і в X + +, 97 00:05:14,230 --> 00:05:17,020 Y чи зміниться взагалі? 98 00:05:17,020 --> 00:05:20,980 Y не міняється тут, і тому ні один не робить S2 вище. 99 00:05:20,980 --> 00:05:24,120 S2.age ще 3. 100 00:05:24,120 --> 00:05:27,350 Але врахуйте, що при призначенні одна структура до іншої, 101 00:05:27,350 --> 00:05:30,300 всі покажчики і раніше вказують на одне і те ж, 102 00:05:30,300 --> 00:05:32,260 так як вони були просто скопійовані. 103 00:05:32,260 --> 00:05:34,300 Якщо ви не хочете, щоб покажчики для спільного використання, 104 00:05:34,300 --> 00:05:36,100 Вам доведеться вручну впоратися з цим, 105 00:05:36,100 --> 00:05:39,780 можливо, malicking один блок пам'яті для одного з покажчиків вказує на 106 00:05:39,780 --> 00:05:42,120 і копіювання даних на. 107 00:05:42,120 --> 00:05:45,540 Це може бути дратівливим, щоб написати структура студентів у всьому світі. 108 00:05:45,540 --> 00:05:48,730 Використання типу визначення, ми можемо зробити 109 00:05:51,630 --> 00:05:55,850 Тип чіткості 110 00:05:55,850 --> 00:05:58,830 Структура 111 00:05:58,830 --> 00:06:01,270 і ми будемо називати його учнем. 112 00:06:05,620 --> 00:06:08,360 Тепер ми можемо використовувати студентів у всьому світі 113 00:06:08,360 --> 00:06:11,090 що ми звикли використовувати структуру студента. 114 00:06:11,090 --> 00:06:13,410 Цей тип Дефа анонімні структури 115 00:06:13,410 --> 00:06:15,750 і називає його учнем. 116 00:06:15,750 --> 00:06:18,220 Але якщо ми будемо також тримати студентів ідентифікатор 117 00:06:18,220 --> 00:06:22,380 поруч зі словом структуру, як і в ЬурейеЕ студент структури, 118 00:06:27,670 --> 00:06:31,590 ми могли б використовувати обидва студента структури і студентів взаємозамінні зараз. 119 00:06:31,590 --> 00:06:34,060 Вони навіть не повинні мати те ж саме ім'я. 120 00:06:34,060 --> 00:06:36,710 Ми могли б ввести визначення структури студента Боба 121 00:06:36,710 --> 00:06:38,950 , А потім побудуємо студента і Бобу 122 00:06:38,950 --> 00:06:41,270 б бути взаємозамінними типів. 123 00:06:41,270 --> 00:06:44,050 Незалежно від типу DEF, 124 00:06:44,050 --> 00:06:46,750 ми повинні ідентифікатор наступного на структуру 125 00:06:46,750 --> 00:06:48,250 якщо визначення структури 126 00:06:48,250 --> 00:06:50,450 рекурсивно. 127 00:06:50,450 --> 00:06:52,620 Наприклад, 128 00:06:52,620 --> 00:06:56,140 Тип визначення структури вузла 129 00:06:56,140 --> 00:07:01,200 і він буде визначений як Int вал 130 00:07:01,200 --> 00:07:05,420 і вона буде мати покажчик, який вказує на іншу структуру вузла., 131 00:07:05,420 --> 00:07:09,490 як в структурі вузла * наступний. 132 00:07:09,490 --> 00:07:13,670 І тоді ми будемо називати його вузлів. 133 00:07:15,490 --> 00:07:18,020 Ця структура є рекурсивною, 134 00:07:18,020 --> 00:07:21,450 Оскільки визначення структури вузла містить в собі 135 00:07:21,450 --> 00:07:24,200 покажчик на структуру вузла. 136 00:07:24,200 --> 00:07:27,740 Зверніть увагу, що ми повинні сказати, структура вузла * Наступний 137 00:07:27,740 --> 00:07:30,690 Усередині визначення структури вузла, 138 00:07:30,690 --> 00:07:33,620 так як визначення типу ще не закінчився, щоб дозволити нам спростити цю 139 00:07:33,620 --> 00:07:36,210 просто вузол * наступний. 140 00:07:36,210 --> 00:07:39,260 Ви дізнаєтесь більше про структури схожа на цю 141 00:07:39,260 --> 00:07:41,750 при роботі зі зв'язаними списками і деревами. 142 00:07:41,750 --> 00:07:44,130 А як щодо структур у функції? 143 00:07:44,130 --> 00:07:46,800 Це також цілком припустимо. 144 00:07:46,800 --> 00:07:49,430 Ми могли б 145 00:07:49,430 --> 00:07:53,630 анулювати функції 146 00:07:53,630 --> 00:07:55,930 , Яка приймає в якості аргументу, 147 00:07:55,930 --> 00:07:59,590 Студент з 148 00:07:59,590 --> 00:08:02,790 і робить щось з цим студентом. 149 00:08:05,270 --> 00:08:08,450 І тоді ми можемо передати його в якості студента структура наступним чином. 150 00:08:08,450 --> 00:08:12,850 Func з S1, ніж раніше. 151 00:08:12,850 --> 00:08:15,230 Структура поводиться 152 00:08:15,230 --> 00:08:18,460 точно так, як ціле буде, коли передається в функцію. 153 00:08:18,460 --> 00:08:21,510 Func отримує копію S1 154 00:08:21,510 --> 00:08:23,690 і тому не може змінити S1; 155 00:08:23,690 --> 00:08:27,110 , А тільки копія, яка зберігається в С. 156 00:08:27,110 --> 00:08:30,010 Якщо ви хочете функцію, щоб мати можливість змінити S1, 157 00:08:30,010 --> 00:08:33,000 функції необхідно буде прийняти студента * S, 158 00:08:33,000 --> 00:08:36,570 і вам доведеться пройти S1 за адресою, ось так. 159 00:08:37,549 --> 00:08:41,100 Студентські * S, функції і S1. 160 00:08:41,100 --> 00:08:44,760 Там ще одна причина, щоб пройти за адресою тут. 161 00:08:44,760 --> 00:08:48,030 Що, якщо наша структура містила 100 полів? 162 00:08:48,030 --> 00:08:51,250 Кожен раз, коли ми переходимо студента функцій, 163 00:08:51,250 --> 00:08:55,770 наша програма повинна скопіювати всі ці 100 полів у аргументі S функцій, в 164 00:08:55,770 --> 00:08:59,320 навіть якщо він ніколи не використовує переважна більшість з них. 165 00:08:59,320 --> 00:09:02,700 Тому, навіть якщо функція не планується зміна студента, 166 00:09:02,700 --> 00:09:05,170 якщо все ще може бути цінним для передачі за адресою. 167 00:09:05,170 --> 00:09:08,990 Добре, що, якщо ми хочемо створити покажчик на структуру? 168 00:09:08,990 --> 00:09:11,130 Ми могли б зробити щось подібне 169 00:09:11,130 --> 00:09:17,580 Студент * S 170 00:09:17,580 --> 00:09:20,980 одно Танос 171 00:09:20,980 --> 00:09:26,600 Розмір студента. 172 00:09:30,450 --> 00:09:33,590 Зверніть увагу, що розмір все ще працює тут. 173 00:09:33,590 --> 00:09:37,260 Так як же нам тепер отримати доступ до віку член 174 00:09:37,260 --> 00:09:39,640 блоку, який вказує на S? 175 00:09:39,640 --> 00:09:42,300 Ви могли б спочатку подумати, щоб зробити 176 00:09:42,300 --> 00:09:47,970 * S.age = 4, 177 00:09:47,970 --> 00:09:50,220 але це не зовсім працює. 178 00:09:50,220 --> 00:09:52,940 Так як це дійсно буде інтерпретуватися як 179 00:09:52,940 --> 00:09:57,740 * S.age в дужках = 4, 180 00:09:57,740 --> 00:10:00,160 який навіть не компіляції, 181 00:10:00,160 --> 00:10:03,600 Так як S не є структурою або, скоріше, покажчик на структуру, 182 00:10:03,600 --> 00:10:06,270 і тому точка тут працювати не буде. 183 00:10:06,270 --> 00:10:08,860 Ми могли б зробити 184 00:10:08,860 --> 00:10:13,760 (* S). Вік = 4 185 00:10:13,760 --> 00:10:16,790 але дужках може дратувати і заплутаною. 186 00:10:16,790 --> 00:10:19,880 На щастя, у нас є спеціальний оператор стрілка 187 00:10:19,880 --> 00:10:22,350 який виглядає приблизно так 188 00:10:22,350 --> 00:10:28,860 S-> віком = 4. 189 00:10:28,860 --> 00:10:31,600 Ці 2 способи посиланням віку 190 00:10:31,600 --> 00:10:33,270 еквівалентні 191 00:10:33,270 --> 00:10:36,870 і ми дійсно не знадобиться стрілка оператора, 192 00:10:36,870 --> 00:10:39,300 але він робить речі виглядають краще. 193 00:10:39,300 --> 00:10:43,050 Так як S є покажчиком на деякий блок пам'яті, який містить структуру, 194 00:10:43,050 --> 00:10:47,820 Ви можете думати про вік S> як слідувати за покажчиком стрілки 195 00:10:47,820 --> 00:10:50,250 і захопити вік членів. 196 00:10:50,250 --> 00:10:53,750 То чому ми повинні завжди використовувати структури? 197 00:10:53,750 --> 00:10:57,560 Це виразно можна піти тільки з примітивними цілих чисел, 198 00:10:57,560 --> 00:10:59,050 символи, покажчики і т.п. 199 00:10:59,050 --> 00:11:01,550 що ми звикли; 200 00:11:01,550 --> 00:11:03,340 замість S1 та S2 і раніше, 201 00:11:03,340 --> 00:11:06,290 Ми могли б мати age1, age2, name1 і name2 202 00:11:06,290 --> 00:11:09,120 Все на окремих змінних. 203 00:11:09,120 --> 00:11:11,390 Це нормально, тільки з 2 студентами, 204 00:11:11,390 --> 00:11:13,310 Але що, якщо у нас було 10 з них? 205 00:11:13,310 --> 00:11:15,540 А що, якщо замість того, щоб тільки 2 поля, 206 00:11:15,540 --> 00:11:17,720 Студент структури було 100 полів? 207 00:11:17,720 --> 00:11:21,240 GPA, курси, колір волосся, стать і так далі. 208 00:11:21,240 --> 00:11:25,790 Замість всього 10 структур, нам потрібно 1000 окремих змінних. 209 00:11:25,790 --> 00:11:28,360 Крім того, розглянути функцію 210 00:11:28,360 --> 00:11:32,270 , Яка приймає, що структура з 100 полів з єдиним аргументом 211 00:11:32,270 --> 00:11:34,350 і виводить всі поля. 212 00:11:34,350 --> 00:11:36,320 Якщо ми не будемо використовувати структуру, 213 00:11:36,320 --> 00:11:38,540 кожен раз, коли ми називаємо цю функцію, 214 00:11:38,540 --> 00:11:41,460 Ми повинні передати на всі 100 змінних, 215 00:11:41,460 --> 00:11:44,430 і якщо у нас є 100 змінних для студентів 1, 216 00:11:44,430 --> 00:11:47,020 і 100 змінних для студентів 2, 217 00:11:47,020 --> 00:11:50,540 Ми повинні бути впевнені, що ми випадково не передати деякі змінні з студент 1 218 00:11:50,540 --> 00:11:52,910 і деякі змінні із студентів 2. 219 00:11:52,910 --> 00:11:55,710 Це неможливо зробити, що помилка з структурою, 220 00:11:55,710 --> 00:11:59,010 так як всі 100 змінних, що містяться в єдиному пакеті. 221 00:11:59,010 --> 00:12:02,050 Буквально за пару Заключні зауваження: 222 00:12:02,050 --> 00:12:04,870 Якщо ви зрозуміли все до цього моменту, здорово. 223 00:12:04,870 --> 00:12:07,900 Інша частина відео просто заради повноти. 224 00:12:07,900 --> 00:12:11,010 Оскільки структури може містити будь-який тип покажчика, 225 00:12:11,010 --> 00:12:14,220 вони також можуть тримати покажчики на функції. 226 00:12:14,220 --> 00:12:17,040 Якщо ви знайомі з об'єктно-орієнтованим програмуванням, 227 00:12:17,040 --> 00:12:21,790 це дає можливість використовувати структури програм в об'єктно-орієнтованому стилі. 228 00:12:21,790 --> 00:12:24,500 Ще на покажчики на функції в інший час. 229 00:12:24,500 --> 00:12:27,760 Крім того, іноді ви можете мати 2 структури 230 00:12:27,760 --> 00:12:30,220 визначення яких залежать один від одного. 231 00:12:30,220 --> 00:12:32,320 Наприклад, 232 00:12:32,320 --> 00:12:35,470 ми могли б мати структуру, 233 00:12:35,470 --> 00:12:38,580 яка визначається як 234 00:12:38,580 --> 00:12:41,910 покажчик на структуру B, 235 00:12:41,910 --> 00:12:47,180 Структура B * X, 236 00:12:47,180 --> 00:12:50,470 і тепер ми можемо їсти структура B 237 00:12:53,890 --> 00:12:56,280 яка визначається як покажчик 238 00:12:56,280 --> 00:12:59,180 на структуру, 239 00:12:59,180 --> 00:13:03,640 Структура * Y. 240 00:13:07,230 --> 00:13:09,060 Але це не буде компілюватися, 241 00:13:09,060 --> 00:13:14,110 так як структура B не існує, в той час, структура складається. 242 00:13:14,110 --> 00:13:17,600 І якщо ми будемо міняти структуру і структуру B, 243 00:13:17,600 --> 00:13:20,100 Потім ми просто залишили з тією ж проблемою; 244 00:13:20,100 --> 00:13:22,640 це час, з будуємо не існує. 245 00:13:22,640 --> 00:13:24,720 Щоб вирішити цю проблему, ми можемо написати 246 00:13:24,720 --> 00:13:29,290 Структура B; 247 00:13:29,290 --> 00:13:32,460 Перед визначенням структури A. 248 00:13:32,460 --> 00:13:35,590 Це називається вперед декларації. 249 00:13:35,590 --> 00:13:38,590 Це просто дозволяє компілятору відомо, що 250 00:13:38,590 --> 00:13:42,040 Структура B є допустимим типом, який буде повністю визначено пізніше цього терміну або у іншому місці. 251 00:13:42,040 --> 00:13:45,980 Мене звуть Боб Боуден, і це CS50. 252 00:13:45,980 --> 00:13:48,980 [CS50.TV]