[Powered by Google Translate] Давайте поговоримо про структур.
Структури дають нам спосіб угруповання купу змінних разом
в красивий пакет.
Це, напевно, найпростіше побачити приклад прямо зараз,
тому ми говоримо структури,
Потім відкриття фігурною дужкою,
і в цій структурі, ми будемо мати Int віку,
символ назви *,
от і все.
Це може здатися дивним крапку з комою після фігурної дужки,
але це насправді необхідно з структурам.
Будь допустимий тип може піти в структурі визначенню.
Тут ми використовували Int і символ *,
але Ви можете також використовувати масив, зі, скажімо, 100 елементів
або навіть в іншій структурі.
Коли ви використовуєте структур в C,
Ви створюєте нові типи
з колекції інших типів.
Тут ми робимо новий тип
з цілого числа і символ *.
Як ми побачимо пізніше, тип структури
У чому еквівалентна будь-який інший тип ви звикли.
Зазвичай, я буду порівняння, як тип структури
схожий на ціле типу.
У той час як ми писали код дійсний C,
це не дуже корисно,
і брязкіт дасть нам попередження.
Пам'ятаєте, як структури і її схожі?
Ну, ми в основному просто сказав
INT,
яке не є дуже корисним лінії.
Так що давайте насправді оголосити перемінну цього типу
, Давши йому ім'я перед крапкою з комою.
Ми будемо називати змінну студента.
Зараз ми оголосили змінну звану студента
з типом задається структурою.
Як нам дістатися до змінних всередині структури?
Технічно, імена для таких змінних
є її членами.
Щоб отримати доступ до будь-якого окремого члена в студентській структури,
Ви додаєте точку на ім'я змінної,
слід ім'я члена ви хочете.
Так от, тільки 2 дійсно можливостями
є student.age
і student.name.
І ми можемо зробити щось подібне
student.age = 12
і student.name = студента.
А що, якщо ми хотіли зробити другий студент?
Ви можете подумати, щоб скопіювати і вставити ці рядки
і змінити студент студент 2 або щось,
і що буде працювати,
але технічно, студент і студентка 2
не мають такого ж типу.
Бачите, ви не зможете призначити їх один з одним.
Це тому, що до цих пір,
ваша структура була анонімною.
Ми повинні дати йому ім'я.
Щоб зробити це, ми вставляємо назву структури
після слів структури.
студент,
наступним визначенням.
Ми все ще можемо негайно оголосити змінну типу
Побудуємо студент, як ми робили це раніше.
Ми будемо називати його S1
Даючи структуру імені,
Тепер ми можемо використовувати структури студента
майже точно так само, ми хотіли б використовувати Int.
Таким чином, ми можемо оголосити змінну типу студент структури,
зразок
Структура студент S2.
Як і масиви, структури забезпечують синтаксис контекстного ініціалізації,
таким чином, ми можемо сказати, структура студент S2
одно
лівої фігурною дужкою 3, S2.
Тут, S2.age буде 3,
і S2.name буде вказувати на S2.
Подумайте, що ви можете зробити з цілого типу
і більшість з них можна зробити з типом студента структури.
Ми можемо використовувати структури студента як тип параметра функції.
Ми можемо використовувати структури студента в новій структурі.
Ми можемо мати покажчик на структуру студента.
Ми можемо зробити розмір структури студента.
Struct студентів є одним з видів
як Int є типом.
Ми також можемо призначити S1 та S2
оскільки обидва мають однаковий тип, так що ми можемо зробити
S1 = S2.
Що станеться, якщо ми робимо
S1.age = 10?
Чи S2 зміни на всіх?
Знову ж таки, думаю структури так само, як регулярні цілі числа.
Якщо задати деякі Int X деякої Y Int,
як X = Y
, А потім змінити X,
як і в X + +,
Y чи зміниться взагалі?
Y не міняється тут, і тому ні один не робить S2 вище.
S2.age ще 3.
Але врахуйте, що при призначенні одна структура до іншої,
всі покажчики і раніше вказують на одне і те ж,
так як вони були просто скопійовані.
Якщо ви не хочете, щоб покажчики для спільного використання,
Вам доведеться вручну впоратися з цим,
можливо, malicking один блок пам'яті для одного з покажчиків вказує на
і копіювання даних на.
Це може бути дратівливим, щоб написати структура студентів у всьому світі.
Використання типу визначення, ми можемо зробити
Тип чіткості
Структура
і ми будемо називати його учнем.
Тепер ми можемо використовувати студентів у всьому світі
що ми звикли використовувати структуру студента.
Цей тип Дефа анонімні структури
і називає його учнем.
Але якщо ми будемо також тримати студентів ідентифікатор
поруч зі словом структуру, як і в ЬурейеЕ студент структури,
ми могли б використовувати обидва студента структури і студентів взаємозамінні зараз.
Вони навіть не повинні мати те ж саме ім'я.
Ми могли б ввести визначення структури студента Боба
, А потім побудуємо студента і Бобу
б бути взаємозамінними типів.
Незалежно від типу DEF,
ми повинні ідентифікатор наступного на структуру
якщо визначення структури
рекурсивно.
Наприклад,
Тип визначення структури вузла
і він буде визначений як Int вал
і вона буде мати покажчик, який вказує на іншу структуру вузла.,
як в структурі вузла * наступний.
І тоді ми будемо називати його вузлів.
Ця структура є рекурсивною,
Оскільки визначення структури вузла містить в собі
покажчик на структуру вузла.
Зверніть увагу, що ми повинні сказати, структура вузла * Наступний
Усередині визначення структури вузла,
так як визначення типу ще не закінчився, щоб дозволити нам спростити цю
просто вузол * наступний.
Ви дізнаєтесь більше про структури схожа на цю
при роботі зі зв'язаними списками і деревами.
А як щодо структур у функції?
Це також цілком припустимо.
Ми могли б
анулювати функції
, Яка приймає в якості аргументу,
Студент з
і робить щось з цим студентом.
І тоді ми можемо передати його в якості студента структура наступним чином.
Func з S1, ніж раніше.
Структура поводиться
точно так, як ціле буде, коли передається в функцію.
Func отримує копію S1
і тому не може змінити S1;
, А тільки копія, яка зберігається в С.
Якщо ви хочете функцію, щоб мати можливість змінити S1,
функції необхідно буде прийняти студента * S,
і вам доведеться пройти S1 за адресою, ось так.
Студентські * S, функції і S1.
Там ще одна причина, щоб пройти за адресою тут.
Що, якщо наша структура містила 100 полів?
Кожен раз, коли ми переходимо студента функцій,
наша програма повинна скопіювати всі ці 100 полів у аргументі S функцій, в
навіть якщо він ніколи не використовує переважна більшість з них.
Тому, навіть якщо функція не планується зміна студента,
якщо все ще може бути цінним для передачі за адресою.
Добре, що, якщо ми хочемо створити покажчик на структуру?
Ми могли б зробити щось подібне
Студент * S
одно Танос
Розмір студента.
Зверніть увагу, що розмір все ще працює тут.
Так як же нам тепер отримати доступ до віку член
блоку, який вказує на S?
Ви могли б спочатку подумати, щоб зробити
* S.age = 4,
але це не зовсім працює.
Так як це дійсно буде інтерпретуватися як
* S.age в дужках = 4,
який навіть не компіляції,
Так як S не є структурою або, скоріше, покажчик на структуру,
і тому точка тут працювати не буде.
Ми могли б зробити
(* S). Вік = 4
але дужках може дратувати і заплутаною.
На щастя, у нас є спеціальний оператор стрілка
який виглядає приблизно так
S-> віком = 4.
Ці 2 способи посиланням віку
еквівалентні
і ми дійсно не знадобиться стрілка оператора,
але він робить речі виглядають краще.
Так як S є покажчиком на деякий блок пам'яті, який містить структуру,
Ви можете думати про вік S> як слідувати за покажчиком стрілки
і захопити вік членів.
То чому ми повинні завжди використовувати структури?
Це виразно можна піти тільки з примітивними цілих чисел,
символи, покажчики і т.п.
що ми звикли;
замість S1 та S2 і раніше,
Ми могли б мати age1, age2, name1 і name2
Все на окремих змінних.
Це нормально, тільки з 2 студентами,
Але що, якщо у нас було 10 з них?
А що, якщо замість того, щоб тільки 2 поля,
Студент структури було 100 полів?
GPA, курси, колір волосся, стать і так далі.
Замість всього 10 структур, нам потрібно 1000 окремих змінних.
Крім того, розглянути функцію
, Яка приймає, що структура з 100 полів з єдиним аргументом
і виводить всі поля.
Якщо ми не будемо використовувати структуру,
кожен раз, коли ми називаємо цю функцію,
Ми повинні передати на всі 100 змінних,
і якщо у нас є 100 змінних для студентів 1,
і 100 змінних для студентів 2,
Ми повинні бути впевнені, що ми випадково не передати деякі змінні з студент 1
і деякі змінні із студентів 2.
Це неможливо зробити, що помилка з структурою,
так як всі 100 змінних, що містяться в єдиному пакеті.
Буквально за пару Заключні зауваження:
Якщо ви зрозуміли все до цього моменту, здорово.
Інша частина відео просто заради повноти.
Оскільки структури може містити будь-який тип покажчика,
вони також можуть тримати покажчики на функції.
Якщо ви знайомі з об'єктно-орієнтованим програмуванням,
це дає можливість використовувати структури програм в об'єктно-орієнтованому стилі.
Ще на покажчики на функції в інший час.
Крім того, іноді ви можете мати 2 структури
визначення яких залежать один від одного.
Наприклад,
ми могли б мати структуру,
яка визначається як
покажчик на структуру B,
Структура B * X,
і тепер ми можемо їсти структура B
яка визначається як покажчик
на структуру,
Структура * Y.
Але це не буде компілюватися,
так як структура B не існує, в той час, структура складається.
І якщо ми будемо міняти структуру і структуру B,
Потім ми просто залишили з тією ж проблемою;
це час, з будуємо не існує.
Щоб вирішити цю проблему, ми можемо написати
Структура B;
Перед визначенням структури A.
Це називається вперед декларації.
Це просто дозволяє компілятору відомо, що
Структура B є допустимим типом, який буде повністю визначено пізніше цього терміну або у іншому місці.
Мене звуть Боб Боуден, і це CS50.
[CS50.TV]