[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 цотных лікаў.
Можа быць, выраўноўвае было б крыху лепш, імя зменнай, чым х,
але гэта дало б рэчы.
Другі цыкл, то проста друкуе значэння, што мы ўжо захоўваецца ўнутры масіва.
>> Давайце паспрабуем запусціць праграму з абодвума тыпамі масіва дэкларацый
і паглядзіце на вынік працы праграмы.
Наколькі мы можам бачыць, праграма паводзіць сябе так жа для абодвух тыпаў дэкларацый.
Давайце ж зірнем на тое, што адбудзецца, калі мы зменім 1. пятлю, каб не спыняцца на N
а сказаць 10.000.
Шляхі за межы масіва.
Ой. Можа быць, вы бачылі гэта раней.
Памылкі сегментацыі азначае, што вашы праграмы адбыўся збой.
Вы пачынаеце бачыць гэта, калі вы дакранаецеся вобласці памяці, вы не павінны дакранацца.
Тут датыкаюцца 10000 месцаў за пачатак х,
якая, відавочна, з'яўляецца месцам у памяці, мы не павінны датыкацца.
Таму большасць з нас, верагодна, не выпадкова паставіў 10000 замест N,
Але што, калі мы робім нешта больш тонкае, як кажуць запісу менш або роўна N
у цыкле ўмова, а не менш, чым N.
Памятаеце, што масіў мае толькі індэксамі ад 0 да N-1,
Гэта азначае, што індэкс N знаходзіцца за межамі канца масіва.
Праграма не можа прывесці да збою ў дадзеным выпадку, але гэта ўсё роўна памылка.
На самай справе, гэтая памылка з'яўляецца настолькі распаўсюджаным, што яно мае сваё ўласнае імя,
выключэння на 1 памылка.
>> Вось менавіта для асновы.
Такім чынам, якія ж асноўныя адрозненні паміж 2 тыпамі масіва дэкларацый?
Адно з адрозненняў з'яўляецца, дзе вялікі блок памяці ідзе.
У першую дэкларацыю, у якой я буду называць брекет-тып масіва,
хоць гэта зусім не ўмоўную назву,
ён будзе ісці ў стэку.
У той час як у другім, які я буду называць паказальнік тыпу масіва, ён будзе ісці ў кучу.
Гэта азначае, што калі функцыя вяртае, кранштэйны масіў будзе аўтаматычна вызваляецца,
у той час як вы павінны explicitily патэлефанаваць бясплатна на масіў паказальнікаў
ці ж у вас ёсць ўцечка памяці.
Акрамя таго, кранштэйны масіва фактычна не з'яўляецца зменнай.
Гэта вельмі важна. Гэта проста знак.
Вы можаце думаць пра гэта як канстанта, кампілятар выбірае для вас.
Гэта азначае, што мы не можам зрабіць нешта накшталт х + + з кранштэйнам тыпу,
хоць гэта цалкам дапушчальна з паказальнікам.
>> Паказальнік тыпу зменнай.
Для паказальнікаў тыпу, у нас ёсць 2 асобных блокаў памяці.
Зменная х сам захоўваюцца ў стэку і толькі адзін паказальнік,
але вялікі блок памяці захоўваюцца ў кучы.
Зменная х у стэк толькі захоўвае адрас
вялікі блок памяці ў кучы.
Адным з наступстваў гэтага з'яўляецца з памерам аператара.
Калі вы папытаеце памер кранштэйна масіў, гэта дасць вам памер вялікі блок памяці,
нешта накшталт 40 байт,
Але калі вы папытаеце памер паказальніка тыпу масіва,
гэта дасць вам памер зменнай х сябе, што на прыбор, хутчэй за ўсё, толькі 4 байт.
Выкарыстанне паказальнікаў тыпу масіва, нельга наўпрост звярнуцца за
Памер вялікі блок памяці.
Гэта звычайна не шмат абмежаванняў, так як мы вельмі рэдка хочуць памеру
вялікі блок памяці, і мы, як правіла, вылічыць яго, калі нам гэта трэба.
>> Нарэшце, кранштэйны масіва адбываецца, каб даць нам ярлык для ініцыялізацыі масіва.
Давайце паглядзім, як мы маглі б напісаць першыя 10 цотных лікаў з дапамогай кантэкстнага initilization.
З масіва паказальнікаў, не існуе спосабу зрабіць ярлык, як гэта.
Гэта ўсяго толькі ўвядзенне да таго, што вы можаце зрабіць з масівамі.
Яны з'яўляюцца амаль у кожнай праграме вы пішаце.
Спадзяюся, цяпер вы можаце бачыць лепшы спосаб гэта зрабіць на прыкладзе студэнтаў ідэнтыфікатары
З пачатку відэа.
>> Мяне клічуць Боб Боуден, і гэта CS50.