1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] Давайце пагаворым пра масівах. 2 00:00:09,360 --> 00:00:12,780 Дык чаму ж мы ўсе хочам выкарыстаць масівы? 3 00:00:12,780 --> 00:00:17,210 Ну, скажам, у вас ёсць праграма, якую неабходна захоўваць 5 ідэнтыфікатараў студэнтаў. 4 00:00:17,210 --> 00:00:21,270 Гэта можа здацца разумным, каб мець 5 асобных зменных. 5 00:00:21,270 --> 00:00:24,240 Па прычынах, якія мы ўбачым ў трохі, мы пачнем адлік з 0. 6 00:00:24,240 --> 00:00:30,700 Зменных мы будзем мець будзе id0 Int, Int id1, і гэтак далей. 7 00:00:30,700 --> 00:00:34,870 Любая логіка, якую мы хочам выканаць на студэнцкі білет трэба будзе скапіяваць і ўставіць 8 00:00:34,870 --> 00:00:36,870 Для кожнага з гэтых студэнтаў ідэнтыфікатараў. 9 00:00:36,870 --> 00:00:39,710 Калі мы хочам, каб праверыць, якія студэнты апынуліся ў CS50, 10 00:00:39,710 --> 00:00:43,910 мы спачатку трэба праверыць, калі id0 ўяўляе студэнтам на курсе. 11 00:00:43,910 --> 00:00:48,070 Затым зрабіць тое ж самае на наступны студэнт, нам трэба скапіяваць і ўставіць код для id0 12 00:00:48,070 --> 00:00:54,430 і замяніць усе ўваходжання id0 з id1 і так далей для id2, 3, і 4. 13 00:00:54,430 --> 00:00:57,560 >> Як толькі вы пачуеце, што нам трэба скапіяваць і ўставіць, 14 00:00:57,560 --> 00:01:00,440 Вы павінны пачаць думаць, што ёсць лепшае рашэнне. 15 00:01:00,440 --> 00:01:05,360 А што, калі вы разумееце, вы не маеце патрэбу ў 5 ідэнтыфікатары студэнтаў, а 7? 16 00:01:05,360 --> 00:01:09,570 Вам трэба вярнуцца ў зыходны код і дадаць у ID5, ID6, 17 00:01:09,570 --> 00:01:14,260 і скапіяваць і ўставіць логіку для праверкі, калі ідэнтыфікатары ставяцца да класа для гэтых 2 новых ідэнтыфікатараў. 18 00:01:14,260 --> 00:01:19,600 Існуе нічога падлучэння ўсіх гэтых ідэнтыфікатараў разам, і таму няма спосабу прасіць 19 00:01:19,600 --> 00:01:22,040 Праграма зрабіць гэта для ідэнтыфікатараў 0 да 6. 20 00:01:22,040 --> 00:01:26,120 Ну цяпер вы разумееце, у вас ёсць 100 ідэнтыфікатараў студэнтаў. 21 00:01:26,120 --> 00:01:30,770 Гэта пачынае здавацца менш, чым ідэальна трэба асобна абвясціць кожную з гэтых ідэнтыфікатараў, 22 00:01:30,770 --> 00:01:33,760 і скапіяваць і ўставіць любы логікі для гэтых новых ідэнтыфікатараў. 23 00:01:33,760 --> 00:01:38,380 Але, магчыма, мы поўныя рашучасці, і мы робім гэта для ўсіх 100 студэнтаў. 24 00:01:38,380 --> 00:01:42,240 Але што, калі вы не ведаеце, колькі студэнтаў ёсць на самой справе? 25 00:01:42,240 --> 00:01:47,320 Ёсць толькі некаторыя расійскіх студэнтаў і ваша праграма павінна спытаць карыстальніка, што гэта п. 26 00:01:47,320 --> 00:01:50,250 Ой-ой. Гэта не будзе працаваць вельмі добра. 27 00:01:50,250 --> 00:01:53,820 Ваша праграма працуе толькі для некаторых сталых ліку студэнтаў. 28 00:01:53,820 --> 00:01:57,520 >> Вырашэнне ўсіх гэтых праблем ёсць прыгажосць масіваў. 29 00:01:57,520 --> 00:01:59,930 Так што ж такое масіў? 30 00:01:59,930 --> 00:02:04,480 У некаторых мовах праграмавання тыпу масіва маглі б зрабіць трохі больш, 31 00:02:04,480 --> 00:02:09,960 але тут мы засяродзімся на асноўнай структуры масіва дадзеных гэтак жа, як вы ўбачыце яго ў C. 32 00:02:09,960 --> 00:02:14,030 Масіў гэта проста вялікі блок памяці. Вось і ўсё. 33 00:02:14,030 --> 00:02:17,770 Калі мы кажам, у нас ёсць масіў з 10 цэлых лікаў, што проста азначае, што ў нас ёсць блок 34 00:02:17,770 --> 00:02:20,740 памяці, досыць вялікі, каб правесці 10 асобных лікаў. 35 00:02:29,930 --> 00:02:33,410 Мяркуючы, што цэлае 4 байта, гэта азначае, што масіў з 10 цэлых лікаў 36 00:02:33,410 --> 00:02:37,180 бесперапынны блок з 40 байт у памяці. 37 00:02:42,660 --> 00:02:46,280 Нават калі вы выкарыстоўваеце шматмерныя масівы, якія мы не будзем удавацца ў сюды, 38 00:02:46,280 --> 00:02:49,200 гэта яшчэ толькі вялікі блок памяці. 39 00:02:49,200 --> 00:02:51,840 Шматмерных пазначэнняў проста для выгоды. 40 00:02:51,840 --> 00:02:55,640 Калі ў вас ёсць 3 на 3 мнагамерны масіў цэлых лікаў, 41 00:02:55,640 --> 00:03:00,650 Затым ваша праграма будзе сапраўды толькі разглядаць гэта як вялікі блок з 36 байт. 42 00:03:00,650 --> 00:03:05,460 Агульная колькасць цэлых лікаў ў 3 разы 3, і кожнае цэлы лік займае 4 байта. 43 00:03:05,460 --> 00:03:07,750 >> Давайце зірнем на просты прыклад. 44 00:03:07,750 --> 00:03:10,660 Мы бачым тут 2 розных спосабаў аб'явы масіваў. 45 00:03:15,660 --> 00:03:18,580 Мы павінны будзем каментаваць 1 з іх за праграма для кампіляцыі 46 00:03:18,580 --> 00:03:20,900 так як мы заяўляем х у два разы. 47 00:03:20,900 --> 00:03:25,140 Мы зірнем на некаторыя адрозненні паміж гэтымі 2 тыпамі заяў у няшмат. 48 00:03:25,140 --> 00:03:28,560 Абедзве гэтыя лініі абвясціць масіў памеру N, 49 00:03:28,560 --> 00:03:30,740 дзе мы вызначым N # як 10. 50 00:03:30,740 --> 00:03:34,460 Мы маглі б так жа лёгка, папрасіў у карыстальніка натуральнае 51 00:03:34,460 --> 00:03:37,250 і выкарыстоўваў яго як цэлы лік элементаў у масіве. 52 00:03:37,250 --> 00:03:41,960 Падабаецца наш студэнцкі білет, напрыклад, перад, гэта накшталт як аб'явіць 10 цалкам асобны 53 00:03:41,960 --> 00:03:49,000 ўяўных зменных x0, x1, x2, і гэтак далей да Xn-1. 54 00:03:57,270 --> 00:04:00,840 Не звяртаючы ўвагі на лініях, дзе мы аб'яўляем масіў, звернеце ўвагу на квадратныя дужкі некранутымі 55 00:04:00,840 --> 00:04:02,090 ўнутры цыклаў. 56 00:04:02,090 --> 00:04:09,660 Калі мы пішам нешта накшталт X [3], які я толькі што прачытаў, як х кранштэйны 3, 57 00:04:09,660 --> 00:04:13,090 Вы можаце думаць аб ім, як прасіць ўяўнай x3. 58 00:04:13,090 --> 00:04:17,519 Звярніце ўвагу, чым масіў памеру N, гэта значыць, што нумар ўнутры дужак 59 00:04:17,519 --> 00:04:22,630 які мы будзем называць індэксам, можа быць што заўгодна ад 0 да N-1, 60 00:04:22,630 --> 00:04:25,660 якая з'яўляецца агульнай індэксаў N. 61 00:04:25,660 --> 00:04:28,260 >> Думаць аб тым, як гэта на самай справе працуе 62 00:04:28,260 --> 00:04:31,260 памятаеце, што масіў ўяўляе сабой вялікі блок памяці. 63 00:04:31,260 --> 00:04:37,460 Мяркуючы, што цэлае 4 байта, увесь масіў х 40 байт блока памяці. 64 00:04:37,460 --> 00:04:41,360 Так x0 ставіцца да самых першых 4 байта блока. 65 00:04:45,810 --> 00:04:49,230 X [1] спасылаецца на наступныя 4 байта і гэтак далей. 66 00:04:49,230 --> 00:04:53,760 Гэта азначае, што ў пачатку х ўсе праграмы ніколі не павінны адсочваць. 67 00:04:55,660 --> 00:04:59,840 Калі вы жадаеце выкарыстоўваць х [400], то праграма ведае, што гэта эквівалентна 68 00:04:59,840 --> 00:05:03,460 толькі 1600 байт пасля пачатку х. 69 00:05:03,460 --> 00:05:08,780 Адкуль мы атрымліваем 1600 байт з? Гэта ўсяго толькі ў 400 раз 4 байта на цэлае лік. 70 00:05:08,780 --> 00:05:13,170 >> Перш чым рухацца далей, гэта вельмі важна разумець, што ў C 71 00:05:13,170 --> 00:05:17,080 няма органаў індэкс, які мы выкарыстоўваем у масіве. 72 00:05:17,080 --> 00:05:23,180 Наш вялікі блок знаходзіцца ўсяго ў 10 цэлых доўга, але нічога не будзе крычаць на нас, калі мы пішам х [20] 73 00:05:23,180 --> 00:05:26,060 ці нават х [-5]. 74 00:05:26,060 --> 00:05:28,240 Індэкс не павінны нават быць побач. 75 00:05:28,240 --> 00:05:30,630 Гэта можа быць любая адвольнае выраз. 76 00:05:30,630 --> 00:05:34,800 У праграме мы выкарыстоўваем зменную я з цыклу ў якасці індэкса ў масіве. 77 00:05:34,800 --> 00:05:40,340 Гэта вельмі распаўсюджаная карціна, цыкл ад I = 0 да даўжыні масіва, 78 00:05:40,340 --> 00:05:43,350 а затым з дапамогай я як індэкс для масіва. 79 00:05:43,350 --> 00:05:46,160 Такім чынам, вы эфектыўна цыкл па ўсім масіве, 80 00:05:46,160 --> 00:05:50,600 і вы можаце прысвоіць кожнаму месца ў масіве, або выкарыстаць яго для некаторых разлікаў. 81 00:05:50,600 --> 00:05:53,920 >> У першы цыкл, я пачынаецца з 0, 82 00:05:53,920 --> 00:05:58,680 і так будзе прызначыць на 0 месцы ў масіве, значэнне 0 раз 2. 83 00:05:58,680 --> 00:06:04,370 Тады я крокам, і мы прысвоіць першае месца ў масіве значэнне 1 раз 2. 84 00:06:04,370 --> 00:06:10,170 Тады я зноў павялічваецца на адзінку і гэтак далей, пакуль мы не прызначыць у становішча N-1 у масіве 85 00:06:10,170 --> 00:06:13,370 Значэнне N-1 раз 2. 86 00:06:13,370 --> 00:06:17,810 Такім чынам, мы стварылі масіў з першых 10 цотных лікаў. 87 00:06:17,810 --> 00:06:21,970 Можа быць, выраўноўвае было б крыху лепш, імя зменнай, чым х, 88 00:06:21,970 --> 00:06:24,760 але гэта дало б рэчы. 89 00:06:24,760 --> 00:06:30,210 Другі цыкл, то проста друкуе значэння, што мы ўжо захоўваецца ўнутры масіва. 90 00:06:30,210 --> 00:06:33,600 >> Давайце паспрабуем запусціць праграму з абодвума тыпамі масіва дэкларацый 91 00:06:33,600 --> 00:06:36,330 і паглядзіце на вынік працы праграмы. 92 00:06:51,450 --> 00:06:57,020 Наколькі мы можам бачыць, праграма паводзіць сябе так жа для абодвух тыпаў дэкларацый. 93 00:06:57,020 --> 00:07:02,230 Давайце ж зірнем на тое, што адбудзецца, калі мы зменім 1. пятлю, каб не спыняцца на N 94 00:07:02,230 --> 00:07:05,040 а сказаць 10.000. 95 00:07:05,040 --> 00:07:07,430 Шляхі за межы масіва. 96 00:07:14,700 --> 00:07:17,210 Ой. Можа быць, вы бачылі гэта раней. 97 00:07:17,210 --> 00:07:20,440 Памылкі сегментацыі азначае, што вашы праграмы адбыўся збой. 98 00:07:20,440 --> 00:07:24,430 Вы пачынаеце бачыць гэта, калі вы дакранаецеся вобласці памяці, вы не павінны дакранацца. 99 00:07:24,430 --> 00:07:27,870 Тут датыкаюцца 10000 месцаў за пачатак х, 100 00:07:27,870 --> 00:07:31,920 якая, відавочна, з'яўляецца месцам у памяці, мы не павінны датыкацца. 101 00:07:31,920 --> 00:07:37,690 Таму большасць з нас, верагодна, не выпадкова паставіў 10000 замест N, 102 00:07:37,690 --> 00:07:42,930 Але што, калі мы робім нешта больш тонкае, як кажуць запісу менш або роўна N 103 00:07:42,930 --> 00:07:46,830 у цыкле ўмова, а не менш, чым N. 104 00:07:46,830 --> 00:07:50,100 Памятаеце, што масіў мае толькі індэксамі ад 0 да N-1, 105 00:07:50,100 --> 00:07:54,510 Гэта азначае, што індэкс N знаходзіцца за межамі канца масіва. 106 00:07:54,510 --> 00:07:58,050 Праграма не можа прывесці да збою ў дадзеным выпадку, але гэта ўсё роўна памылка. 107 00:07:58,050 --> 00:08:01,950 На самай справе, гэтая памылка з'яўляецца настолькі распаўсюджаным, што яно мае сваё ўласнае імя, 108 00:08:01,950 --> 00:08:03,970 выключэння на 1 памылка. 109 00:08:03,970 --> 00:08:05,970 >> Вось менавіта для асновы. 110 00:08:05,970 --> 00:08:09,960 Такім чынам, якія ж асноўныя адрозненні паміж 2 тыпамі масіва дэкларацый? 111 00:08:09,960 --> 00:08:13,960 Адно з адрозненняў з'яўляецца, дзе вялікі блок памяці ідзе. 112 00:08:13,960 --> 00:08:17,660 У першую дэкларацыю, у якой я буду называць брекет-тып масіва, 113 00:08:17,660 --> 00:08:20,300 хоць гэта зусім не ўмоўную назву, 114 00:08:20,300 --> 00:08:22,480 ён будзе ісці ў стэку. 115 00:08:22,480 --> 00:08:27,450 У той час як у другім, які я буду называць паказальнік тыпу масіва, ён будзе ісці ў кучу. 116 00:08:27,450 --> 00:08:32,480 Гэта азначае, што калі функцыя вяртае, кранштэйны масіў будзе аўтаматычна вызваляецца, 117 00:08:32,480 --> 00:08:36,419 у той час як вы павінны explicitily патэлефанаваць бясплатна на масіў паказальнікаў 118 00:08:36,419 --> 00:08:38,010 ці ж у вас ёсць ўцечка памяці. 119 00:08:38,010 --> 00:08:42,750 Акрамя таго, кранштэйны масіва фактычна не з'яўляецца зменнай. 120 00:08:42,750 --> 00:08:45,490 Гэта вельмі важна. Гэта проста знак. 121 00:08:45,490 --> 00:08:49,160 Вы можаце думаць пра гэта як канстанта, кампілятар выбірае для вас. 122 00:08:49,160 --> 00:08:52,970 Гэта азначае, што мы не можам зрабіць нешта накшталт х + + з кранштэйнам тыпу, 123 00:08:52,970 --> 00:08:56,240 хоць гэта цалкам дапушчальна з паказальнікам. 124 00:08:56,240 --> 00:08:58,270 >> Паказальнік тыпу зменнай. 125 00:08:58,270 --> 00:09:01,510 Для паказальнікаў тыпу, у нас ёсць 2 асобных блокаў памяці. 126 00:09:01,510 --> 00:09:06,060 Зменная х сам захоўваюцца ў стэку і толькі адзін паказальнік, 127 00:09:06,060 --> 00:09:08,620 але вялікі блок памяці захоўваюцца ў кучы. 128 00:09:08,620 --> 00:09:11,010 Зменная х у стэк толькі захоўвае адрас 129 00:09:11,010 --> 00:09:14,010 вялікі блок памяці ў кучы. 130 00:09:14,010 --> 00:09:17,370 Адным з наступстваў гэтага з'яўляецца з памерам аператара. 131 00:09:17,370 --> 00:09:22,480 Калі вы папытаеце памер кранштэйна масіў, гэта дасць вам памер вялікі блок памяці, 132 00:09:22,480 --> 00:09:24,620 нешта накшталт 40 байт, 133 00:09:24,620 --> 00:09:26,920 Але калі вы папытаеце памер паказальніка тыпу масіва, 134 00:09:26,920 --> 00:09:32,740 гэта дасць вам памер зменнай х сябе, што на прыбор, хутчэй за ўсё, толькі 4 байт. 135 00:09:32,740 --> 00:09:36,530 Выкарыстанне паказальнікаў тыпу масіва, нельга наўпрост звярнуцца за 136 00:09:36,530 --> 00:09:38,530 Памер вялікі блок памяці. 137 00:09:38,530 --> 00:09:42,530 Гэта звычайна не шмат абмежаванняў, так як мы вельмі рэдка хочуць памеру 138 00:09:42,530 --> 00:09:46,980 вялікі блок памяці, і мы, як правіла, вылічыць яго, калі нам гэта трэба. 139 00:09:46,980 --> 00:09:51,490 >> Нарэшце, кранштэйны масіва адбываецца, каб даць нам ярлык для ініцыялізацыі масіва. 140 00:09:51,490 --> 00:09:56,130 Давайце паглядзім, як мы маглі б напісаць першыя 10 цотных лікаў з дапамогай кантэкстнага initilization. 141 00:10:11,220 --> 00:10:14,470 З масіва паказальнікаў, не існуе спосабу зрабіць ярлык, як гэта. 142 00:10:14,470 --> 00:10:18,120 Гэта ўсяго толькі ўвядзенне да таго, што вы можаце зрабіць з масівамі. 143 00:10:18,120 --> 00:10:20,990 Яны з'яўляюцца амаль у кожнай праграме вы пішаце. 144 00:10:20,990 --> 00:10:24,390 Спадзяюся, цяпер вы можаце бачыць лепшы спосаб гэта зрабіць на прыкладзе студэнтаў ідэнтыфікатары 145 00:10:24,390 --> 00:10:26,710 З пачатку відэа. 146 00:10:26,710 --> 00:10:29,960 >> Мяне клічуць Боб Боуден, і гэта CS50.