[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.
Але ўлічыце, што пры прызначэнні 1 структуры да іншай,
усе паказальнікі па-ранейшаму паказваюць на адно і тое ж,
так як яны былі проста скапіяваныя.
Калі вы не хочаце, каб паказальнікі для сумеснага выкарыстання,
Вам прыйдзецца ўручную справіцца з гэтым,
магчыма, 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]