1 00:00:00,000 --> 00:00:06,030 >> [Гуляе музыка] 2 00:00:06,030 --> 00:00:08,390 >> Даг Lloyd: Паказальнікі, вось мы тут. 3 00:00:08,390 --> 00:00:11,080 Гэта, верагодна, будзе найбольш цяжкая тэма 4 00:00:11,080 --> 00:00:12,840 што мы гаворым пра ў CS50. 5 00:00:12,840 --> 00:00:15,060 І калі вы чыталі што-небудзь пра паказальнікаў 6 00:00:15,060 --> 00:00:19,080 перш чым можа быць трохі запалохаць ўдаючыся ў гэтым відэа. 7 00:00:19,080 --> 00:00:21,260 Гэта праўда паказальнікі дазваляюць вам магчымасць 8 00:00:21,260 --> 00:00:23,740 каб, магчыма, сапсаваць вельмі дрэнна, калі вы 9 00:00:23,740 --> 00:00:27,450 Для працы з зменнымі і дадзенымі, і выклікаючы ваша праграма да краху. 10 00:00:27,450 --> 00:00:30,490 Але на самой справе яны сапраўды карысныя і яны дазваляюць нам сапраўды выдатны спосаб 11 00:00:30,490 --> 00:00:33,340 для перадачы дадзеных і назад наперад паміж функцыямі, 12 00:00:33,340 --> 00:00:35,490 што мы ў адваротным выпадку не ў стане зрабіць. 13 00:00:35,490 --> 00:00:37,750 >> І так, што мы на самай справе хачу зрабіць тут цягнік 14 00:00:37,750 --> 00:00:41,060 Вы мець добрую паказальнік дысцыпліны, так што вы можаце эфектыўна выкарыстоўваць паказальнікі 15 00:00:41,060 --> 00:00:43,850 каб зрабіць вашыя праграмы, якія нашмат лепш. 16 00:00:43,850 --> 00:00:48,220 Як я ўжо сказаў паказальнікі даюць нам розныя спосаб перадачы дадзеных паміж функцыямі. 17 00:00:48,220 --> 00:00:50,270 Цяпер, калі вы памятаеце з раней відэа, калі 18 00:00:50,270 --> 00:00:53,720 мы гаворым пра Пераменная сфера, я згадаў 19 00:00:53,720 --> 00:01:00,610 што ўсе дадзеныя, якія мы прайсці паміж Функцыі ў З перадаюцца па значэнні. 20 00:01:00,610 --> 00:01:03,070 І я не мог выкарыстаць, што Тэрмін, што я меў на ўвазе там 21 00:01:03,070 --> 00:01:07,170 было тое, што мы перадаем копіі дадзеных. 22 00:01:07,170 --> 00:01:12,252 Калі мы перадаць зменную ў функцыю, мы на самай справе не перадаючы зменную 23 00:01:12,252 --> 00:01:13,210 функцыі, ці не так? 24 00:01:13,210 --> 00:01:17,670 Мы перадаючы копію што дадзеныя функцыі. 25 00:01:17,670 --> 00:01:20,760 Функцыя робіць тое, што ён будзе і ён вылічае некаторы значэнне, 26 00:01:20,760 --> 00:01:23,180 і, магчыма, мы выкарыстоўваем гэта значэнне калі ён дае яго назад. 27 00:01:23,180 --> 00:01:26,700 >> Быў адным выключэннем гэтае правіла перадачы па значэнні, 28 00:01:26,700 --> 00:01:31,210 і мы вернемся да таго, што, што крыху пазьней у гэтым відэа. 29 00:01:31,210 --> 00:01:34,880 Калі мы выкарыстоўваем паказальнікі замест выкарыстання зменных, 30 00:01:34,880 --> 00:01:38,180 або замест выкарыстання зменных Самі або копіі зменных, 31 00:01:38,180 --> 00:01:43,790 Цяпер мы можам перайсці зменныя вакол паміж функцыямі па-іншаму. 32 00:01:43,790 --> 00:01:46,550 Гэта азначае, што калі мы зробім змяненне ў адной функцыі, 33 00:01:46,550 --> 00:01:49,827 што змяненне будзе на самой справе ўзяць эфект у іншым функцыі. 34 00:01:49,827 --> 00:01:52,160 Зноў жа, гэта тое, што мы не маглі зрабіць раней, 35 00:01:52,160 --> 00:01:56,979 і калі вы калі-небудзь спрабавалі памяняць месцамі Значэнне двух зменных ў функцыі, 36 00:01:56,979 --> 00:01:59,270 Вы заўважылі, гэтую праблему нібы крадзецца, праўда? 37 00:01:59,270 --> 00:02:04,340 >> Калі мы хочам, каб памяняць X і Y, і мы перадаць іх функцыі пад назвай падпампоўкі, 38 00:02:04,340 --> 00:02:08,680 ўнутры функцыі своп Зменныя зрабіць валютныя каштоўнасці. 39 00:02:08,680 --> 00:02:12,600 Чалавек становіцца два, два становіцца , Але мы на самай справе не 40 00:02:12,600 --> 00:02:16,890 нічога змяніць у арыгінале Функцыя, у выклікалай. 41 00:02:16,890 --> 00:02:19,550 Таму што мы не можам, мы толькі працы з іх копій. 42 00:02:19,550 --> 00:02:24,760 З паказальнікамі, хоць, мы можам на самай справе праходзяць X і Y ў функцыю. 43 00:02:24,760 --> 00:02:26,960 Гэтая функцыя можа зрабіць нешта з імі. 44 00:02:26,960 --> 00:02:29,250 І гэтыя зменныя значэння можа рэальна змяніць. 45 00:02:29,250 --> 00:02:33,710 Так што цалкам змена наша здольнасць працаваць з дадзенымі. 46 00:02:33,710 --> 00:02:36,100 >> Перш чым мы паглыбімся ў паказальнікі, я думаю, што гэта каштуе 47 00:02:36,100 --> 00:02:38,580 прымаючы некалькі хвілін да вярнуцца да асноў тут. 48 00:02:38,580 --> 00:02:41,000 І ёсць паглядзім, як Работы памяці кампутара 49 00:02:41,000 --> 00:02:45,340 таму што гэтыя дзве тэмы ідуць на самай справе даволі ўзаемазвязаны. 50 00:02:45,340 --> 00:02:48,480 Як вы, напэўна, ведаеце, на вашым кампутары 51 00:02:48,480 --> 00:02:51,310 ў вас ёсць жорсткі дыск або магчыма, цвёрдацельны назапашвальнік, 52 00:02:51,310 --> 00:02:54,430 свайго роду месца для захоўвання файлаў. 53 00:02:54,430 --> 00:02:57,950 Гэта, як правіла, дзесьці ў навакольле 250 гігабайт 54 00:02:57,950 --> 00:02:59,810 , Можа быць, пару тэрабайт цяпер. 55 00:02:59,810 --> 00:03:02,270 І гэта, дзе ўсе вашы Файлы ў канчатковым рахунку, жыць, 56 00:03:02,270 --> 00:03:04,870 нават калі ваш кампутар выключаны выключаны, вы можаце ўключыць яго назад на 57 00:03:04,870 --> 00:03:09,190 і вы знойдзеце вашыя файлы ёсць зноў, калі вы перазагрузіце сістэму. 58 00:03:09,190 --> 00:03:14,820 Але дыскі, як жорсткі дыск, з жорсткімі, або цвёрдацельны назапашвальнік, цвёрдацельнага назапашвальніка, 59 00:03:14,820 --> 00:03:16,050 проста месца для захоўвання. 60 00:03:16,050 --> 00:03:20,400 >> Мы не можам на самай справе нічога агульнага з дадзеныя, якія на цвёрдым дыску, 61 00:03:20,400 --> 00:03:22,080 або цвёрдацельным назапашвальнікам. 62 00:03:22,080 --> 00:03:24,950 Для таго, каб рэальна змяніць дадзеных або перамясціць яго вакол, 63 00:03:24,950 --> 00:03:28,800 у нас ёсць, каб перанесьці яго АЗП, аператыўнае запамінальная прылада. 64 00:03:28,800 --> 00:03:31,170 Цяпер АЗП, у вас ёсць шмат менш у вашым кампутары. 65 00:03:31,170 --> 00:03:34,185 Вы можаце мець дзесьці ў навакольле 512 мегабайт 66 00:03:34,185 --> 00:03:38,850 калі ў вас ёсць стары кампутар, , Можа быць, два, чатыры, восем, 16, 67 00:03:38,850 --> 00:03:41,820 магчыма, нават трохі Больш за тое, гігабайт аператыўнай памяці. 68 00:03:41,820 --> 00:03:46,390 Дык вось значна менш, але гэта дзе ўсе лятучыя дадзеных існуе. 69 00:03:46,390 --> 00:03:48,270 Вось дзе мы можам нешта змяніць. 70 00:03:48,270 --> 00:03:53,350 Але калі мы пераходзім наш кампутар выключаны, усе дадзеныя ў аператыўнай памяці руйнуецца. 71 00:03:53,350 --> 00:03:57,150 >> Дык вось чаму мы павінны мець жорсткі дыск для больш пастаяннага месца ёй, 72 00:03:57,150 --> 00:03:59,720 так, што яна будзе exists- ён сапраўды дрэнна, калі мы кожны раз 73 00:03:59,720 --> 00:04:03,310 Аказалася наш кампутар выключаны, кожны Файл у нашай сістэме быў знішчаны. 74 00:04:03,310 --> 00:04:05,600 Так мы працуем ўнутры аператыўнай памяці. 75 00:04:05,600 --> 00:04:09,210 І кожны раз, калі мы гаворым пра памяці, у значнай ступені, у CS50, 76 00:04:09,210 --> 00:04:15,080 мы гаворым аб памяці, а не на цвёрдым дыску. 77 00:04:15,080 --> 00:04:18,657 >> Таму, калі мы перамясціць рэчы ў памяць, яна займае пэўную колькасць прасторы. 78 00:04:18,657 --> 00:04:20,740 Усе тыпы дадзеных, якія мы працуем з 79 00:04:20,740 --> 00:04:23,480 ўзяць розныя колькасць прасторы ў памяці. 80 00:04:23,480 --> 00:04:27,600 Такім чынам, кожны раз, калі вы стварыць цэлае пераменная, чатыры байта памяці 81 00:04:27,600 --> 00:04:30,750 адведзены ў аператыўнай памяці, каб вы можа працаваць з гэтым лікам. 82 00:04:30,750 --> 00:04:34,260 Вы можаце абвясціць лік, змяніць яго, прызначыць яго 83 00:04:34,260 --> 00:04:36,700 да велічыні 10 павялічаным адной, гэтак далей і гэтак далей. 84 00:04:36,700 --> 00:04:39,440 Усё, што павінна адбыцца ў Аператыўнай памяці, і вы атрымаеце чатыры байта 85 00:04:39,440 --> 00:04:42,550 для працы з для кожнага цэлы лік, вы ствараеце. 86 00:04:42,550 --> 00:04:45,410 >> Кожны персанаж вам стварыць атрымлівае адзін байт. 87 00:04:45,410 --> 00:04:48,160 Вось толькі, колькі прасторы неабходна захоўваць сімвал. 88 00:04:48,160 --> 00:04:51,310 Кожны паплавок, рэальная Колькасць, атрымлівае чатыры байта 89 00:04:51,310 --> 00:04:53,390 калі гэта не двайны дакладнасці з якая плавае кропкай 90 00:04:53,390 --> 00:04:56,510 лік, якое дазваляе ёсць больш дакладныя або больш лічбаў 91 00:04:56,510 --> 00:04:59,300 пасля дзесятковай кропкі без страты дакладнасці, 92 00:04:59,300 --> 00:05:01,820 якія займаюць восем байт памяці. 93 00:05:01,820 --> 00:05:06,730 Доўгія прагне, сапраўды вялікія колькасці, таксама прымаць восем байт памяці. 94 00:05:06,730 --> 00:05:09,000 Колькі байт памяці у радкі займаюць? 95 00:05:09,000 --> 00:05:12,990 Ну давайце шпільку ў гэтым пытанні цяпер, але мы вернемся да яго. 96 00:05:12,990 --> 00:05:17,350 >> Такім чынам, вернемся да гэтай ідэі памяці як вялікі масіў байт памерам вочак. 97 00:05:17,350 --> 00:05:20,871 Вось і ўсё, што ёсць, гэта проста велізарны масіў вочак, 98 00:05:20,871 --> 00:05:23,370 як і любы іншы масіў, які вы знаёмыя з і паглядзець, 99 00:05:23,370 --> 00:05:26,430 акрамя кожны элемент адзін байт. 100 00:05:26,430 --> 00:05:30,030 І гэтак жа, як масіў, кожны элемент мае адрас. 101 00:05:30,030 --> 00:05:32,120 Кожны элемент масіва мае індэкс, і мы 102 00:05:32,120 --> 00:05:36,302 можна выкарыстоўваць гэты індэкс, каб зрабіць так званы адвольнага доступу ў масіве. 103 00:05:36,302 --> 00:05:38,510 Мы не павінны пачаць на пачатак масіва, 104 00:05:38,510 --> 00:05:40,569 перабору кожны адзін яе элемент, 105 00:05:40,569 --> 00:05:41,860 каб знайсці тое, што мы шукаем. 106 00:05:41,860 --> 00:05:45,790 Мы можам толькі сказаць, я хачу, каб дабрацца да 15-элемент або 100-стыхія. 107 00:05:45,790 --> 00:05:49,930 А можна проста ў той нумар і атрымаць значэнне, якое вы шукаеце. 108 00:05:49,930 --> 00:05:54,460 >> Аналагічна кожная лакацыя у памяці мае адрас. 109 00:05:54,460 --> 00:05:57,320 Так ваша памяць можа шукаць нешта падобнае. 110 00:05:57,320 --> 00:06:01,420 Вось вельмі мала кавалак памяць, гэта 20 байт памяці. 111 00:06:01,420 --> 00:06:04,060 Першыя 20 байт, таму што мой адрасоў ёсць на дне 112 00:06:04,060 --> 00:06:08,890 0, 1, 2, 3, і так на ўсім шляху да 19. 113 00:06:08,890 --> 00:06:13,190 І калі я заяўляю, зменных і калі я пачынаю працаваць з імі, 114 00:06:13,190 --> 00:06:15,470 сістэма збіраецца ўсталяваць у бок некаторы прастору для мяне 115 00:06:15,470 --> 00:06:17,595 У гэтай памяці для працы з маімі зменных. 116 00:06:17,595 --> 00:06:21,610 Так што я мог бы сказаць, сімвал C роўная капітал Х. А што здарыцца? 117 00:06:21,610 --> 00:06:23,880 Ну сістэма будзе адкладзеце для мяне аднаго байта. 118 00:06:23,880 --> 00:06:27,870 У гэтым выпадку абраў нумар байта чатыры байта па адрасе чатырох, 119 00:06:27,870 --> 00:06:31,310 і ён збіраецца захоўваць загалоўная літара Н ў там для мяне. 120 00:06:31,310 --> 00:06:34,350 Калі я кажу, то хуткасць INT мяжа роўны 65, гэта 121 00:06:34,350 --> 00:06:36,806 збіраецца вылучыць чатыры байт памяці для мяне. 122 00:06:36,806 --> 00:06:39,180 І гэта будзе ставіцца да тых, чатыры байта, як адзінае цэлае 123 00:06:39,180 --> 00:06:41,305 таму што тое, што мы працуем з ўяўляе сабой цэлы лік тут. 124 00:06:41,305 --> 00:06:44,350 І гэта будзе захоўваць 65 там. 125 00:06:44,350 --> 00:06:47,000 >> Цяпер ужо я накшталт кажу вам крыху хлусні, 126 00:06:47,000 --> 00:06:50,150 правільна, таму што мы ведаем, што кампутары працуюць у двайковай сістэме. 127 00:06:50,150 --> 00:06:53,100 Яны не разумеюць, абавязкова, што сталіца Н 128 00:06:53,100 --> 00:06:57,110 або тое, што 65 ёсць, яны толькі зразумець бінарныя, нулі і адзінкі. 129 00:06:57,110 --> 00:06:59,000 І так на самой справе, што мы там захоўваць 130 00:06:59,000 --> 00:07:03,450 ня літара Н, і лік 65, але хутчэй двайковыя прадстаўлення 131 00:07:03,450 --> 00:07:06,980 яго, што выглядаць сёе-тое як гэта. 132 00:07:06,980 --> 00:07:10,360 І ў прыватнасці ў кантэкст цэлай зменнай, 133 00:07:10,360 --> 00:07:13,559 ён не збіраецца проста пляваць яго ў, ён не збіраецца разглядаць яго як адзін чатыры 134 00:07:13,559 --> 00:07:15,350 байт кавалак абавязкова, гэта на самай справе адбываецца 135 00:07:15,350 --> 00:07:19,570 каб разглядаць яго як адзін байт чатырох кавалкаў, якія маглі б выглядаць наступным чынам. 136 00:07:19,570 --> 00:07:22,424 І нават гэта не зусім дакладна небудзь, 137 00:07:22,424 --> 00:07:24,840 з-за чаго-то пад назвай парадак байт, які мы не 138 00:07:24,840 --> 00:07:26,965 збіраецца атрымаць у цяперашні час, але калі вам цікава, пра, 139 00:07:26,965 --> 00:07:29,030 Вы можаце прачытаць на трохі і вялікі парадак байт. 140 00:07:29,030 --> 00:07:31,640 Але дзеля гэтага аргументу, дзеля гэтага відэа, 141 00:07:31,640 --> 00:07:34,860 давайце выкажам здагадку, што, у То ,, як лік 65 будзе 142 00:07:34,860 --> 00:07:36,970 быць прадстаўлены ў памяць на кожнай сістэме, 143 00:07:36,970 --> 00:07:38,850 хоць гэта не зусім дакладна. 144 00:07:38,850 --> 00:07:41,700 >> Але давайце на самай справе проста атрымаць пазбавіцца ад усіх бінарных цалкам, 145 00:07:41,700 --> 00:07:44,460 і думаць толькі аб якасці H і 65, гэта нашмат прасцей, 146 00:07:44,460 --> 00:07:47,900 думаць пра яго, як што ў чалавечым істоце. 147 00:07:47,900 --> 00:07:51,420 Добра, так яно і здаецца, можа быць, трохі выпадковым, што мая сістэма I've- 148 00:07:51,420 --> 00:07:55,130 не даць мне байт 5, 6, 7, і 8 для захоўвання цэлы лік. 149 00:07:55,130 --> 00:07:58,580 Там прычына для гэтага таксама, што мы не зможам атрымаць у прама зараз, але досыць 150 00:07:58,580 --> 00:08:00,496 сказаць, што тое, што Кампутар робіць тут 151 00:08:00,496 --> 00:08:02,810 Верагодна, гэта добры ход з яго боку. 152 00:08:02,810 --> 00:08:06,020 Каб не даць мне памяць, што гэта абавязкова спіной да спіны. 153 00:08:06,020 --> 00:08:10,490 Нягледзячы на ​​тое, што гэта збіраецца зрабіць гэта цяпер калі я хачу, каб атрымаць іншую радок, 154 00:08:10,490 --> 00:08:13,080 называецца прозвішча, і я хачу, пакласці Лойда там. 155 00:08:13,080 --> 00:08:18,360 Я збіраюся неабходна ўсталяваць адзін характар, кожная літара, што гэта 156 00:08:18,360 --> 00:08:21,330 будзе патрабаваць адзін характар, адзін байт памяці. 157 00:08:21,330 --> 00:08:26,230 Так што, калі я мог бы паставіць Лойда ў маёй масіва як гэта я даволі добра ісці, праўда? 158 00:08:26,230 --> 00:08:28,870 Чаго не хапае? 159 00:08:28,870 --> 00:08:31,840 >> Памятаеце, што кожны радок мы працуем з у З сканчаецца зваротнай касой рысы нулявы, 160 00:08:31,840 --> 00:08:33,339 і мы не можам апусціць, што тут, альбо. 161 00:08:33,339 --> 00:08:36,090 Мы павінны адкласці адзін байт памяці для захоўвання, што такім чынам мы 162 00:08:36,090 --> 00:08:39,130 ведаеце, калі наша радок скончылася. 163 00:08:39,130 --> 00:08:41,049 Такім чынам, яшчэ раз гэта пагадненне з, як рэчы 164 00:08:41,049 --> 00:08:42,799 з'яўляюцца ў моцы памяці трохі выпадковым, 165 00:08:42,799 --> 00:08:44,870 але на самой справе, як большасць сістэм распрацаваны. 166 00:08:44,870 --> 00:08:48,330 Для выбудаваць іх па мультыплікатара з чатырох чалавек, па прычынах, зноў 167 00:08:48,330 --> 00:08:50,080 што мы не павінны трапіць у прама цяпер. 168 00:08:50,080 --> 00:08:53,060 Але гэта, так дастаткова сказаць, што пасля гэтых трох радкоў кода, 169 00:08:53,060 --> 00:08:54,810 гэта тое, што памяць можа выглядаць. 170 00:08:54,810 --> 00:08:58,930 Калі мне трэба вочак памяці 4, 8 і 12, каб трымаць мае дадзеныя, 171 00:08:58,930 --> 00:09:01,100 гэта тое, што мая памяць можа выглядаць. 172 00:09:01,100 --> 00:09:04,062 >> І толькі быць асабліва педантычны вось, калі 173 00:09:04,062 --> 00:09:06,020 мы кажам пра памяць адрасы, як правіла, мы 174 00:09:06,020 --> 00:09:08,390 зрабіць гэта, выкарыстоўваючы шаснаццаткавыя абазначэння. 175 00:09:08,390 --> 00:09:12,030 Дык чаму б нам не ператварыць усё гэта ад дзесятковай шаснаццатковай форме 176 00:09:12,030 --> 00:09:15,010 толькі таму, што, як правіла, гэта як мы называем памяццю. 177 00:09:15,010 --> 00:09:17,880 Такім чынам, замест таго, каб быць ад 0 да 19, што мы маем нулявы 178 00:09:17,880 --> 00:09:20,340 х ад нуля да нуля x1 тры. 179 00:09:20,340 --> 00:09:23,790 Тыя 20 байт памяці, што мы Мець ці мы глядзім на на гэтым малюнку 180 00:09:23,790 --> 00:09:25,540 прама тут. 181 00:09:25,540 --> 00:09:29,310 >> Такім чынам, усё, што было сказана, давайце адысці ад памяці на секунду 182 00:09:29,310 --> 00:09:30,490 і назад да паказальнікаў. 183 00:09:30,490 --> 00:09:32,420 Вось самае галоўнае памятаць 184 00:09:32,420 --> 00:09:34,070 як мы пачалі працаваць з паказальнікамі. 185 00:09:34,070 --> 00:09:36,314 Паказальнік нічога больш адрасы. 186 00:09:36,314 --> 00:09:38,230 Я скажу гэта зноў, таму што гэта тое, што важна, 187 00:09:38,230 --> 00:09:42,730 паказальнік нічога больш адрасы. 188 00:09:42,730 --> 00:09:47,760 Паказальнікі адрасы ў месцах ў памяці, дзе зменныя жыць. 189 00:09:47,760 --> 00:09:52,590 Ведаючы, што яна становіцца, спадзяюся, крыху лягчэй працаваць з імі. 190 00:09:52,590 --> 00:09:54,550 Іншая справа, мне падабаецца каб зрабіць, гэта ёсць свайго роду 191 00:09:54,550 --> 00:09:58,510 дыяграм візуальна які ўяўляе тое, што адбываецца з рознымі радкоў кода. 192 00:09:58,510 --> 00:10:00,660 І мы будзем рабіць гэта пару раз у паказальнікі, 193 00:10:00,660 --> 00:10:03,354 і калі мы гаворым пра дынамічнай размеркаванне памяці, а таксама. 194 00:10:03,354 --> 00:10:06,020 Таму што я думаю, што гэтыя дыяграмы могуць быць асабліва карысныя. 195 00:10:06,020 --> 00:10:09,540 >> Так што, калі я кажу, напрыклад, INT да у маім кодзе, што адбываецца? 196 00:10:09,540 --> 00:10:12,524 Ну што ж адбываецца ў асноўным у Я атрымліваю памяць адведзеных для мяне, 197 00:10:12,524 --> 00:10:14,690 але я нават не хацеў бы думаю пра гэта, як, што, я 198 00:10:14,690 --> 00:10:16,300 падабаецца думаць пра яго, як скрыню. 199 00:10:16,300 --> 00:10:20,090 У мяне ёсць акно, і гэта колеру зялёны, таму што я 200 00:10:20,090 --> 00:10:21,750 можа паставіць цэлыя лікі ў зялёныя скрынкі. 201 00:10:21,750 --> 00:10:23,666 Калі б гэта быў персанаж, якога я можа мець сіні скрыню. 202 00:10:23,666 --> 00:10:27,290 Але я заўсёды кажу, калі я ствараю скрынка, якая можа трымаць цэлыя 203 00:10:27,290 --> 00:10:28,950 што скрынка афарбаваная ў зялёны колер. 204 00:10:28,950 --> 00:10:33,020 І я бяру пастаянны маркер і я пішу да на баку. 205 00:10:33,020 --> 00:10:37,590 Так у мяне ёсць скрынка пад назвай K, у якім я магу пакласці цэлыя лікі. 206 00:10:37,590 --> 00:10:41,070 Таму калі я кажу Int K, гэта што адбываецца ў маёй галаве. 207 00:10:41,070 --> 00:10:43,140 Калі я кажу, да роўная пяці, што я раблю? 208 00:10:43,140 --> 00:10:45,110 Ну, я стаўлю пяць у скрынцы, правільна. 209 00:10:45,110 --> 00:10:48,670 Гэта даволі проста, калі Я кажу INT да, стварыць акно пад назвай K. 210 00:10:48,670 --> 00:10:52,040 Калі я кажу, да роўная 5, паставіў пяць у полі. 211 00:10:52,040 --> 00:10:53,865 Спадзяюся, што гэта не занадта шмат скачком. 212 00:10:53,865 --> 00:10:55,990 Вось дзе справы ідуць трохі цікава, хоць. 213 00:10:55,990 --> 00:11:02,590 Калі я кажу, INT * РК, добра, нават калі я не ведаю, што гэта непазбежна азначае, 214 00:11:02,590 --> 00:11:06,150 гэта відавочна ёсць нешта зрабіць з цэлым лікам. 215 00:11:06,150 --> 00:11:08,211 Так што я збіраюся пафарбаваць гэта поле зялёны иш, 216 00:11:08,211 --> 00:11:10,210 Я ведаю, што ёсць нешта зрабіць з цэлым лікам, 217 00:11:10,210 --> 00:11:13,400 але гэта не само па сабе цэлае, таму што гэта INT зорка. 218 00:11:13,400 --> 00:11:15,390 Там нешта крыху адрозніваецца пра яго. 219 00:11:15,390 --> 00:11:17,620 Так ўдзел цэлае х, але ў адваротным выпадку гэта 220 00:11:17,620 --> 00:11:19,830 не занадта адрозніваецца ад тое, што мы гаварылі. 221 00:11:19,830 --> 00:11:24,240 Гэта скрынка, яе атрымалі ярлык, гэта насіць ярлык РК, 222 00:11:24,240 --> 00:11:27,280 і ён здольны холдынгу INT зоркі, усё, што гэта такое. 223 00:11:27,280 --> 00:11:29,894 Яны нешта рабіць з цэлымі лікамі, ясна. 224 00:11:29,894 --> 00:11:31,060 Вось апошняя радок, хоць. 225 00:11:31,060 --> 00:11:37,650 Калі я кажу, РК = & K, эй, што толькі што адбылося, праўда? 226 00:11:37,650 --> 00:11:41,820 Так што гэта выпадковае лік, здавалася б, выпадковыя Колькасць, выкінуць ў скрынцы. 227 00:11:41,820 --> 00:11:44,930 Усё, што ёсць, РК атрымлівае адрас к. 228 00:11:44,930 --> 00:11:52,867 Так я прытрымліваюся, дзе да жыве ў памяці, яго адрас, адрас яго байт. 229 00:11:52,867 --> 00:11:55,200 Усё, што я раблю, я кажу гэта значэнне тое, што я збіраюся 230 00:11:55,200 --> 00:11:59,430 пакласці ў маёй скрынцы пад назвай РК. 231 00:11:59,430 --> 00:12:02,080 І таму, што гэтыя рэчы Паказальнікі і таму шукае 232 00:12:02,080 --> 00:12:04,955 у радку, як нулявы х восем нулёў з сямі чатырох восем 233 00:12:04,955 --> 00:12:07,790 два нуль, верагодна, не вельмі значным. 234 00:12:07,790 --> 00:12:12,390 Калі мы, як правіла візуалізаваць паказальнікі, мы на самай справе зрабіць гэта ў якасці паказальнікаў. 235 00:12:12,390 --> 00:12:17,000 РК дае нам інфармацыю мы павінны знайсці K ў памяці. 236 00:12:17,000 --> 00:12:19,120 Так у асноўным РК мае стрэлку ў ім. 237 00:12:19,120 --> 00:12:21,670 І калі мы ходзім даўжыню гэтай стрэлкай, уявіце сабе, 238 00:12:21,670 --> 00:12:25,280 гэта тое, што вы можаце хадзіць па, калі мы хадзіць уздоўж стрэлкі, 239 00:12:25,280 --> 00:12:29,490 на самым кончыку гэтага стрэлкі, мы будзе знайсці месца ў памяці 240 00:12:29,490 --> 00:12:31,390 дзе да жыцця. 241 00:12:31,390 --> 00:12:34,360 І, што вельмі важна, таму што як толькі мы ведаем, дзе жыве да, 242 00:12:34,360 --> 00:12:37,870 мы можам пачаць працаваць з дадзенымі ўнутры гэтым месцы памяці. 243 00:12:37,870 --> 00:12:40,780 Хоць мы атрымліваем маленькі біт наперадзе сябе цяпер. 244 00:12:40,780 --> 00:12:42,240 >> Так што паказальнік? 245 00:12:42,240 --> 00:12:45,590 Паказальнік з'яўляецца элемент дадзеных якога значэнне адрас памяці. 246 00:12:45,590 --> 00:12:49,740 Гэта было тое, што нуль нуль восем х рэчы адбываецца, гэта было адрас памяці. 247 00:12:49,740 --> 00:12:52,060 Гэта было месца ў памяці. 248 00:12:52,060 --> 00:12:55,080 І тып паказальніка апісвае выгляд 249 00:12:55,080 --> 00:12:56,930 дадзеных, якія вы знойдзеце ў што адрас памяці. 250 00:12:56,930 --> 00:12:58,810 Так што гэта INT зорка частка правы. 251 00:12:58,810 --> 00:13:03,690 Калі я прытрымлівацца, што стрэлка, гэта збіраецца прывесці мяне да месца. 252 00:13:03,690 --> 00:13:06,980 І, што месца, што я знойдзеце там у маім прыкладзе, 253 00:13:06,980 --> 00:13:08,240 зялёны колеру скрынка. 254 00:13:08,240 --> 00:13:12,650 Гэта цэлы лік, гэта тое, што я знойдзеце, калі я іду на гэты адрас. 255 00:13:12,650 --> 00:13:14,830 Тып дадзеных для Паказальнік апісвае тое, што 256 00:13:14,830 --> 00:13:17,936 Вы знойдзеце па гэтым адрасе памяці. 257 00:13:17,936 --> 00:13:19,560 Дык вось сапраўды выдатна рэч, хоць. 258 00:13:19,560 --> 00:13:25,090 Паказальнікі дазваляюць перайсці зменныя паміж функцыямі. 259 00:13:25,090 --> 00:13:28,520 А на самай справе перадаць зменныя і ня прайсці іх копіі. 260 00:13:28,520 --> 00:13:32,879 Таму што, калі мы дакладна ведаем, дзе ў памяці, каб знайсці зменную, 261 00:13:32,879 --> 00:13:35,670 мы не павінны зрабіць копію гэта, мы можам проста пайсці ў гэтае месца 262 00:13:35,670 --> 00:13:37,844 і працаваць з гэтай зменнай. 263 00:13:37,844 --> 00:13:40,260 Такім чынам, у сутнасці паказальнікаў роду з зрабіць кампутарную сераду 264 00:13:40,260 --> 00:13:42,360 нашмат больш, як у рэальным свеце, дакладна. 265 00:13:42,360 --> 00:13:44,640 >> Дык вось аналогія. 266 00:13:44,640 --> 00:13:48,080 Давайце выкажам здагадку, што ў мяне ёсць ноўтбук, справа, і ён поўны нататак. 267 00:13:48,080 --> 00:13:50,230 І я б хацеў, каб вы абновіце яго. 268 00:13:50,230 --> 00:13:53,960 Вы гэта функцыя, якая Абнаўлення адзначае, права. 269 00:13:53,960 --> 00:13:56,390 У шляху мы былі працуе да гэтага часу, тое, што 270 00:13:56,390 --> 00:14:02,370 адбываецца, вы будзеце прымаць мой ноўтбук, Вы ідзяце ў краму, капіявання, 271 00:14:02,370 --> 00:14:06,410 вы будзеце рабіць ксеракопію кожная старонка запісной кніжкі. 272 00:14:06,410 --> 00:14:09,790 Вы пакінуць свой ноўтбук назад на маім стале, калі вы скончыце, 273 00:14:09,790 --> 00:14:14,600 вы будзеце ісці і выкрасліць рэчы ў маім ноўтбук, які састарэлі ці не так, 274 00:14:14,600 --> 00:14:19,280 і тады вы будзеце праходзіць назад мне стос старонак Xerox 275 00:14:19,280 --> 00:14:22,850 што з'яўляецца дакладнай копіяй майго наўтбука з змены, якія вы ўнеслі ў яго. 276 00:14:22,850 --> 00:14:27,040 І ў той момант, гэта да мяне, як якая выклікае функцыя, як абаненту, 277 00:14:27,040 --> 00:14:30,582 каб вырашыць вашыя нататкі і інтэграваць іх назад у маім нататніку. 278 00:14:30,582 --> 00:14:32,540 Такім чынам, ёсць шмат крокаў ўдзел тут, прама. 279 00:14:32,540 --> 00:14:34,850 Як гэта не было б лепш, калі я проста кажу, эй, вы можаце 280 00:14:34,850 --> 00:14:38,370 абнавіць ноўтбук для мне, уручыць вам мой ноўтбук, 281 00:14:38,370 --> 00:14:40,440 і вы бераце рэчы і літаральна перасекчы іх 282 00:14:40,440 --> 00:14:42,810 і абнаўляць свае запісы ў нататніку. 283 00:14:42,810 --> 00:14:45,140 А потым даць мне свой ноўтбук назад. 284 00:14:45,140 --> 00:14:47,320 Гэта накшталт таго, што паказальнікі дазваляюць зрабіць, 285 00:14:47,320 --> 00:14:51,320 яны робяць гэта асяроддзе шмат больш падабаецца, як мы працуем у рэальнасці. 286 00:14:51,320 --> 00:14:54,640 >> Усе правы, так вось што паказальнік, давайце пагаворым 287 00:14:54,640 --> 00:14:58,040 пра тое, як паказальнікі працуюць у C, і як мы можам пачаць працаваць з імі. 288 00:14:58,040 --> 00:15:02,550 Такім чынам, ёсць вельмі просты паказальнік у З называецца нулявы паказальнік. 289 00:15:02,550 --> 00:15:04,830 Нулявы паказальнік паказвае на нічога. 290 00:15:04,830 --> 00:15:08,310 Гэта, верагодна, здаецца, што гэта на самай справе не вельмі карысная рэч, 291 00:15:08,310 --> 00:15:10,500 але, як мы ўбачым Крыху пазней на той факт, 292 00:15:10,500 --> 00:15:15,410 што гэта нулявы паказальнік існуе на самай справе вельмі можа спатрэбіцца. 293 00:15:15,410 --> 00:15:19,090 І кожны раз, калі вы ствараеце паказальнік, а вы не ўсталюеце яго значэнне immediately- 294 00:15:19,090 --> 00:15:21,060 прыклад ўстаноўкі яго значэнне адразу 295 00:15:21,060 --> 00:15:25,401 будзе некалькі слайдаў таму дзе я сказаў РК роўная & K, 296 00:15:25,401 --> 00:15:28,740 РК атрымлівае адрас K, паколькі мы ўбачым, што гэта значыць, 297 00:15:28,740 --> 00:15:32,990 мы ўбачым, як код, які shortly- калі мы не ўсталюеце яго значэнне на нешта 298 00:15:32,990 --> 00:15:35,380 сэнс адразу, Вы павінны заўсёды 299 00:15:35,380 --> 00:15:37,480 ўсталяваць паказальнік, каб паказаць на нуль. 300 00:15:37,480 --> 00:15:40,260 Вы павінны ўсталяваць гэта, каб паказаць на няма. 301 00:15:40,260 --> 00:15:43,614 >> Гэта вельмі адрозніваецца ад проста пакінуць значэнне, як гэта 302 00:15:43,614 --> 00:15:45,530 а затым магчымасць аб'явы Паказальнік і толькі пры ўмове, 303 00:15:45,530 --> 00:15:48,042 гэта нуль, таму што гэта рэдка праўда. 304 00:15:48,042 --> 00:15:50,000 Такім чынам, вы заўсёды павінны ўсталёўваць значэнне паказальніка 305 00:15:50,000 --> 00:15:55,690 да нуля, калі вы не ўсталюеце яго значэнне каб нешта значнае неадкладна. 306 00:15:55,690 --> 00:15:59,090 Вы можаце праверыць, ці з'яўляецца значэнне паказальніка ў з'яўляецца несапраўдным з дапамогай аператара роўнасці 307 00:15:59,090 --> 00:16:05,450 (==), Гэтак жа, як вы параўнайце любы цэлы лік значэння ці знакавыя значэння, выкарыстоўваючы (==) 308 00:16:05,450 --> 00:16:06,320 а таксама. 309 00:16:06,320 --> 00:16:10,994 Гэта асаблівы від пастаяннай значэнне, якое можна выкарыстоўваць для тэставання. 310 00:16:10,994 --> 00:16:13,160 Так што гэта было вельмі проста паказальнік, нулявы паказальнік. 311 00:16:13,160 --> 00:16:15,320 Іншы спосаб стварэння паказальнік з'яўляецца выманне 312 00:16:15,320 --> 00:16:18,240 адрас зменнай вы ўжо стварылі, 313 00:16:18,240 --> 00:16:22,330 і вы робіце гэта з дапамогай & Здабыча адрас аператара. 314 00:16:22,330 --> 00:16:26,720 Які мы ўжо бачылі раней у першым прыкладзе схемы я паказаў. 315 00:16:26,720 --> 00:16:31,450 Так што, калі х з'яўляецца зменнай, што мы ўжо стварылі цэлага тыпу, 316 00:16:31,450 --> 00:16:35,110 то і х з'яўляецца паказальнікам на цэлы лік. 317 00:16:35,110 --> 00:16:39,810 і Х азначае памятаеце, і збіраецца атрымаць адрас рэчы справа. 318 00:16:39,810 --> 00:16:45,350 А так як паказальнік гэта проста адрас, чым і х з'яўляецца паказальнікам на цэлы лік 319 00:16:45,350 --> 00:16:48,560 значэнне якога, дзе ў памяці х жыццяў. 320 00:16:48,560 --> 00:16:50,460 Гэта адрас Х. 321 00:16:50,460 --> 00:16:53,296 Так і х з'яўляецца адрас х. 322 00:16:53,296 --> 00:16:55,670 Давайце яшчэ адзін крок далей і падключыць да чаго-то 323 00:16:55,670 --> 00:16:58,380 Я спасылаўся на ў папярэднім відэа. 324 00:16:58,380 --> 00:17:06,730 Калі обр масіў двайнікоў, то і обр квадратная дужка я з'яўляецца паказальнікам 325 00:17:06,730 --> 00:17:08,109 у два разы. 326 00:17:08,109 --> 00:17:08,970 ДОБРА. 327 00:17:08,970 --> 00:17:12,160 обр квадратную дужку я, калі обр масіў двайнікоў, 328 00:17:12,160 --> 00:17:19,069 Затым обр квадратную дужку я гэта I-й элемент гэтага масіву, 329 00:17:19,069 --> 00:17:29,270 і & обр квадратную дужку я дзе ў памяці я-й элемент обр існуе. 330 00:17:29,270 --> 00:17:31,790 >> Так у чым жа сэнс тут? 331 00:17:31,790 --> 00:17:34,570 Масівы імя, значэнне з усёй гэтай рэчы, 332 00:17:34,570 --> 00:17:39,290 з'яўляецца тое, што імя масіва з'яўляецца на самай справе сам паказальнік. 333 00:17:39,290 --> 00:17:41,170 Вы працавалі з паказальнікамі ўздоўж усяго 334 00:17:41,170 --> 00:17:45,290 кожны раз, калі вы выкарыстоўвалі масіў. 335 00:17:45,290 --> 00:17:49,090 Запомніць на прыкладзе па вобласці вызначэння зменнай, 336 00:17:49,090 --> 00:17:53,420 ў канцы відэа я ўяўляю прыклад, дзе мы маем функцыю 337 00:17:53,420 --> 00:17:56,890 называецца мноства INT і Функцыя называецца мноства масіў. 338 00:17:56,890 --> 00:18:00,490 І ваша задача, каб вызначыць, ці не, або тое, што 339 00:18:00,490 --> 00:18:03,220 каштоўнасці, якія мы раздрукаваныя канец функцыі, 340 00:18:03,220 --> 00:18:05,960 У канцы асноўнай праграмы. 341 00:18:05,960 --> 00:18:08,740 >> Калі вы памятаеце з гэтага прыкладу або калі вы глядзелі відэа, 342 00:18:08,740 --> 00:18:13,080 Вы ведаеце, што, калі вам-выклік Набор INT эфектыўна нічога не робіць. 343 00:18:13,080 --> 00:18:16,390 Але выклік, каб усталяваць масіў робіць. 344 00:18:16,390 --> 00:18:19,280 І я накшталт замоўчваецца, чаму што было на той час. 345 00:18:19,280 --> 00:18:22,363 Я проста сказаў, добра гэта масіў, гэта адмысловае, вы ведаеце, ёсць прычына. 346 00:18:22,363 --> 00:18:25,020 Прычына ў тым, што масіў-х Назва на самай справе проста паказальнік, 347 00:18:25,020 --> 00:18:28,740 і ёсць гэты асаблівы Сінтаксіс квадратная дужка, што 348 00:18:28,740 --> 00:18:30,510 зрабіць рэчы нашмат лепш працаваць. 349 00:18:30,510 --> 00:18:34,410 І яны робяць ідэю аб паказальнік шмат менш страшным, 350 00:18:34,410 --> 00:18:36,800 і вось чаму яны накшталт з прадстаўленых у гэтым шляху. 351 00:18:36,800 --> 00:18:38,600 Але на самой справе масівы проста паказальнікі. 352 00:18:38,600 --> 00:18:41,580 І вось чаму, калі мы ўнеслі змены ў масіве, 353 00:18:41,580 --> 00:18:44,880 калі мы прайшлі масіў у якасці параметру на функцыю або ў якасці аргументу 354 00:18:44,880 --> 00:18:50,110 да функцыі, змесціва масіва фактычна змянілі ў абодвух выкліканага абанента 355 00:18:50,110 --> 00:18:51,160 і ў выклікалай функцыі. 356 00:18:51,160 --> 00:18:55,846 Які для кожнага іншага віду пераменная, якую мы бачылі, было не так. 357 00:18:55,846 --> 00:18:58,970 Так што гэта проста нешта, каб трымаць у розум, калі вы працуеце з паказальнікамі, 358 00:18:58,970 --> 00:19:01,610 з'яўляецца тое, што імя Масіў на самай справе паказальнік 359 00:19:01,610 --> 00:19:04,750 на першы элемент гэтага масіва. 360 00:19:04,750 --> 00:19:08,930 >> ОК, так што цяпер у нас ёсць усе гэтыя факты, давайце працягваць ісці, правільна. 361 00:19:08,930 --> 00:19:11,370 Чаму мы клапоцімся пра дзесьці жыве. 362 00:19:11,370 --> 00:19:14,120 Ну, як я ўжо сказаў, гэта даволі Карысна ведаць, дзе што-то жыве 363 00:19:14,120 --> 00:19:17,240 так што вы можаце пайсці туды і змяніць яго. 364 00:19:17,240 --> 00:19:19,390 Праца з ёй і на самай справе ёсць рэч, якую вы 365 00:19:19,390 --> 00:19:23,710 хачу зрабіць з гэтай зменнай эфекту адбору, і не ўступілі ў сілу на некаторых копіі. 366 00:19:23,710 --> 00:19:26,150 Гэта называецца разнаймення. 367 00:19:26,150 --> 00:19:28,690 Мы ідзем да спасылцы і мы мяняем значэнне там. 368 00:19:28,690 --> 00:19:32,660 Так што, калі ў нас ёсць паказальнік, і гэта завецца шт, і гэта паказвае на характар, 369 00:19:32,660 --> 00:19:40,610 то можна сказаць, * * ПК і ПК з'яўляецца Імя таго, што мы знойдзем, калі мы ідзем 370 00:19:40,610 --> 00:19:42,910 на адрас ПК. 371 00:19:42,910 --> 00:19:47,860 Тое, што мы знойдзем там персанаж і * Шт як мы звяртаемся да дадзеных на што 372 00:19:47,860 --> 00:19:48,880 Месцазнаходжанне. 373 00:19:48,880 --> 00:19:54,150 Такім чынам, мы маглі б сказаць, што нешта накшталт * Шт = D ці нешта падобнае, 374 00:19:54,150 --> 00:19:59,280 і гэта азначае, што што б ні быў на адрасы памяці кампутара, 375 00:19:59,280 --> 00:20:07,040 любога характару раней там, у цяперашні час D, калі мы гаворым * PC = D. 376 00:20:07,040 --> 00:20:10,090 >> Дык вось мы ідзем зноў некаторыя дзіўныя рэчы З, права. 377 00:20:10,090 --> 00:20:14,560 Такім чынам, мы бачылі раней * як то частка з тыпам дадзеных, 378 00:20:14,560 --> 00:20:17,160 і ў цяперашні час ён выкарыстоўваецца ў крыху іншы кантэкст 379 00:20:17,160 --> 00:20:19,605 для доступу да дадзеных на месцы. 380 00:20:19,605 --> 00:20:22,480 Я ведаю, гэта крыху заблытаным і што на самой справе частка гэтага цэлага 381 00:20:22,480 --> 00:20:25,740 як, чаму паказальнікі маюць гэтую міфалогію вакол іх як настолькі складаныя, 382 00:20:25,740 --> 00:20:28,250 гэта свайго роду праблемы сінтаксісу, сумленна. 383 00:20:28,250 --> 00:20:31,810 Але * выкарыстоўваецца ў абодвух кантэкстах, і як частка імя тыпу, 384 00:20:31,810 --> 00:20:34,100 і мы ўбачым, трохі пазней яшчэ нешта, таксама. 385 00:20:34,100 --> 00:20:36,490 І цяпер гэта разыменовать аператар. 386 00:20:36,490 --> 00:20:38,760 Так ён ідзе да спасылцы, гэта доступ да дадзеных 387 00:20:38,760 --> 00:20:43,000 на месцы паказальніка, і дазваляе маніпуляваць па сваім жаданні. 388 00:20:43,000 --> 00:20:45,900 >> Зараз гэта вельмі падобна на наведвання вашага суседа, права. 389 00:20:45,900 --> 00:20:48,710 Калі вы ведаеце, што Сусед жыве, вы 390 00:20:48,710 --> 00:20:50,730 ня боўтацца з вашым суседам. 391 00:20:50,730 --> 00:20:53,510 Вы ведаеце, здараецца, ведаю, дзе яны жывуць, 392 00:20:53,510 --> 00:20:56,870 але гэта не значыць, што сілу таго, што веды 393 00:20:56,870 --> 00:20:59,170 Вы ўзаемадзейнічаюць з імі. 394 00:20:59,170 --> 00:21:01,920 Калі вы хочаце, каб ўзаемадзейнічаць з імі, Вы павінны пайсці ў іх хаце, 395 00:21:01,920 --> 00:21:03,760 Вы павінны пайсці туды, дзе яны жывуць. 396 00:21:03,760 --> 00:21:07,440 І як толькі вы гэта зробіце, то вы можаце ўзаемадзейнічаць 397 00:21:07,440 --> 00:21:09,420 з імі гэтак жа, як вы хацелі б. 398 00:21:09,420 --> 00:21:12,730 І сапраўды гэтак жа з зменнымі, Вы павінны пайсці ў іх адрас 399 00:21:12,730 --> 00:21:15,320 калі вы хочаце, каб ўзаемадзейнічаць іх, Вы не можаце проста ведаць адрас. 400 00:21:15,320 --> 00:21:21,495 І тое, як вы ідзяце на адрасы выкарыстоўваць *, аператар разнаймення. 401 00:21:21,495 --> 00:21:23,620 Што вы думаеце адбудзецца калі мы будзем спрабаваць разыменовать 402 00:21:23,620 --> 00:21:25,260 паказальнік, значэнне якога роўна нулю? 403 00:21:25,260 --> 00:21:28,470 Нагадаем, што нуль паказальнік паказвае нічога. 404 00:21:28,470 --> 00:21:34,110 Так што, калі вы паспрабуеце і разнаймення нічога або перайсці да адраснай нічога, 405 00:21:34,110 --> 00:21:36,800 што вы думаеце адбываецца? 406 00:21:36,800 --> 00:21:39,630 Ну, калі вы здагадаліся сегментацыі віна, вы былі б правы. 407 00:21:39,630 --> 00:21:41,390 Калі вы паспрабуеце і разнаймення пусты паказальнік, 408 00:21:41,390 --> 00:21:43,140 Вы пакутуеце сегментацыі віна. Але пачакайце, 409 00:21:43,140 --> 00:21:45,820 не кажу вам, што калі вы не збіраецеся 410 00:21:45,820 --> 00:21:49,220 каб усталяваць значэнне вашага паказальнік на нешта значнае, 411 00:21:49,220 --> 00:21:51,000 Вы павінны ўсталяваць на нуль? 412 00:21:51,000 --> 00:21:55,290 Я зрабіў, і на самай справе сегментацыя няспраўнасць роду добрыя паводзіны. 413 00:21:55,290 --> 00:21:58,680 >> Вы калі-небудзь абвясцілі зменную і не адразу прысвойваецца яго значэнне? 414 00:21:58,680 --> 00:22:02,680 Такім чынам, вы проста сказаць Int х; Вы не на самай справе прысвоіць яго ні да чаго 415 00:22:02,680 --> 00:22:05,340 а затым пазней у кодзе, Вам раздрукаваць значэнне х, 416 00:22:05,340 --> 00:22:07,650 маючы да гэтага часу не прызначаны яго ні да чаго. 417 00:22:07,650 --> 00:22:10,370 Часта вы атрымаеце нуля, але часам вы 418 00:22:10,370 --> 00:22:15,000 можа атрымаць выпадковае лік, і Вы паняцця не маеце, дзе ён прыйшоў. 419 00:22:15,000 --> 00:22:16,750 Дакладна магу рэчы адбудзецца з паказальнікамі. 420 00:22:16,750 --> 00:22:20,110 Калі вы аб'яўляеце паказальнік INT * РК напрыклад, 421 00:22:20,110 --> 00:22:23,490 і вы не прызначыць яго значэнне, Вы атрымліваеце чатыры байта для памяці. 422 00:22:23,490 --> 00:22:25,950 Якія б ні былі чатыры байта памяці сістэма можа 423 00:22:25,950 --> 00:22:28,970 выявіце, што ёсць некаторыя значныя каштоўнасці. 424 00:22:28,970 --> 00:22:31,760 І, магчыма, было то там ужо, што 425 00:22:31,760 --> 00:22:34,190 ня больш не патрэбен іншы Функцыя, так што вы проста павінны 426 00:22:34,190 --> 00:22:35,900 усе дадзеныя там. 427 00:22:35,900 --> 00:22:40,570 >> Што рабіць, калі вы спрабавалі зрабіць разнаймення некаторыя адрас, які вы don't- было 428 00:22:40,570 --> 00:22:43,410 ўжо байты і інфармацыі ў там, што цяпер у паказальнік. 429 00:22:43,410 --> 00:22:47,470 Калі вы паспрабуеце і разнаймення паказальніка гэтага, Вы маглі б важдацца з нейкай памяці 430 00:22:47,470 --> 00:22:49,390 што вы не маюць намер важдацца з усім гэтым. 431 00:22:49,390 --> 00:22:51,639 І на самай справе вы маглі б зрабіць што-то сапраўды разбуральным, 432 00:22:51,639 --> 00:22:54,880 як зламаць іншую праграму, або зламаць іншую функцыю, 433 00:22:54,880 --> 00:22:58,289 або зрабіць што-то, што шкоднасны Вы не маюць намер рабіць наогул. 434 00:22:58,289 --> 00:23:00,080 І вось чаму гэта на самай справе добрая ідэя 435 00:23:00,080 --> 00:23:04,030 ўсталяваць свае паказальнікі на нуль, калі вам не ўстаноўлены іх нешта асэнсаванае. 436 00:23:04,030 --> 00:23:06,760 Гэта, верагодна, лепш на Канец дня для вашай праграмы 437 00:23:06,760 --> 00:23:09,840 да краху, то для таго, каб зрабіць тое, што шрубы уверх 438 00:23:09,840 --> 00:23:12,400 іншая праграма або іншая функцыя. 439 00:23:12,400 --> 00:23:15,207 Такія паводзіны, магчыма, нават менш ідэальным, чым проста збой. 440 00:23:15,207 --> 00:23:17,040 І вось чаму гэта на самай справе добрая звычка 441 00:23:17,040 --> 00:23:20,920 каб патрапіць у вашы ўсталяваць паказальнікі да нуля, калі вы не ўсталюеце іх 442 00:23:20,920 --> 00:23:24,540 да значнай кошту неадкладна, значэнне, што вы ведаеце 443 00:23:24,540 --> 00:23:27,260 і што вы можаце бяспечна выконваць разнаймення. 444 00:23:27,260 --> 00:23:32,240 >> Такім чынам, давайце вернемся ў цяперашні час і зірнуць у агульным сінтаксісе сітуацыі. 445 00:23:32,240 --> 00:23:37,400 Калі я кажу, INT * р;, што я толькі што зрабіў? 446 00:23:37,400 --> 00:23:38,530 Што я зрабіў гэта. 447 00:23:38,530 --> 00:23:43,290 Я ведаю, што велічыня р з'яўляецца адрас таму што ўсе паказальнікі толькі 448 00:23:43,290 --> 00:23:44,660 адрасы. 449 00:23:44,660 --> 00:23:47,750 Я магу разнаймення р выкарыстоўваючы аператар *. 450 00:23:47,750 --> 00:23:51,250 У гэтым кантэксце тут, у самым топ ўспомніць * з'яўляецца часткай тыпу. 451 00:23:51,250 --> 00:23:53,510 Int * тып дадзеных. 452 00:23:53,510 --> 00:23:56,150 Але я магу разнаймення р, выкарыстоўваючы аператар *, 453 00:23:56,150 --> 00:24:01,897 і калі я раблю так, калі я іду па гэтым адрасе, тое, што я знайду па гэтым адрасе? 454 00:24:01,897 --> 00:24:02,855 Я знайду цэлае. 455 00:24:02,855 --> 00:24:05,910 Так INT * р у асноўным кажучы, р ўяўляе сабой адрас. 456 00:24:05,910 --> 00:24:09,500 Я магу разнаймення р і калі Я, я знайду цэлае 457 00:24:09,500 --> 00:24:11,920 у гэтым месцы памяці. 458 00:24:11,920 --> 00:24:14,260 >> ОК, так што я сказаў, што быў яшчэ адзін раздражняльная рэч з зоркамі 459 00:24:14,260 --> 00:24:17,060 і вось дзе, што раздражняльная рэч з зоркамі ёсць. 460 00:24:17,060 --> 00:24:21,640 Вы калі-небудзь спрабавалі абвясціць некалькі зменных аднаго і таго ж тыпу 461 00:24:21,640 --> 00:24:24,409 на той жа радку кода? 462 00:24:24,409 --> 00:24:27,700 Такім чынам, для другога, рабіць выгляд, што лініі, код, які я на самой справе ў іх там у зялёны 463 00:24:27,700 --> 00:24:29,366 там няма, і ён проста кажа INT х, у, г;. 464 00:24:29,366 --> 00:24:31,634 465 00:24:31,634 --> 00:24:34,550 Тое, што гэта будзе зрабіць, гэта на самай справе стварыць тры цэлалікавых зменныя для вас, 466 00:24:34,550 --> 00:24:36,930 адна называецца х, адна называецца у, і адзін называецца г. 467 00:24:36,930 --> 00:24:41,510 Гэта спосаб зрабіць гэта без таго, каб падзяліць на тры лініі. 468 00:24:41,510 --> 00:24:43,890 >> Вось дзе зоркі атрымліваюць раздражняе зноў, хоць, 469 00:24:43,890 --> 00:24:49,200 таму што на самой справе * частка з'яўляецца з імя тыпу і часткі 470 00:24:49,200 --> 00:24:50,320 імя зменнай. 471 00:24:50,320 --> 00:24:56,430 І таму, калі я кажу, INT * рх, ру, РГ, тое, што я на самой справе атрымаць паказальнік на цэлае 472 00:24:56,430 --> 00:25:01,650 называецца ПВ і два цэлых чысла, ру і РГ. 473 00:25:01,650 --> 00:25:04,950 І гэта, напэўна, не тое, што мы хочам, гэта не добра. 474 00:25:04,950 --> 00:25:09,290 >> Так што, калі я хачу, каб стварыць некалькі паказальнікаў на той жа лініі, таго ж тыпу, 475 00:25:09,290 --> 00:25:12,140 і зоркі, тое, што я на самой справе трэба каб зрабіць, гэта сказаць INT * гадавых, * PB * шт. 476 00:25:12,140 --> 00:25:17,330 477 00:25:17,330 --> 00:25:20,300 Цяпер толькі што сказаў, што і зараз кажу вам гэта, 478 00:25:20,300 --> 00:25:22,170 вы, верагодна, ніколі не будзе рабіць гэтага. 479 00:25:22,170 --> 00:25:25,170 І гэта, напэўна, добра, шчыра кажучы, таму што вы можаце выпадкова 480 00:25:25,170 --> 00:25:26,544 апусціць зорку, нешта накшталт гэтага. 481 00:25:26,544 --> 00:25:29,290 Гэта, верагодна, лепш, можа быць, абвясціць паказальнікі на асобных лініях, 482 00:25:29,290 --> 00:25:31,373 але гэта проста яшчэ адзін з тых раздражняльных сінтаксісу 483 00:25:31,373 --> 00:25:35,310 рэчы з зоркамі, якія робяць паказальнікі так цяжка працаваць. 484 00:25:35,310 --> 00:25:39,480 Таму што гэта проста сінтаксічны гэта беспарадак, вы павінны працаваць праз. 485 00:25:39,480 --> 00:25:41,600 З практыкай гэта робіць сапраўды стала другой натурай. 486 00:25:41,600 --> 00:25:45,410 Я да гэтага часу робяць памылкі з ім яшчэ пасля праграмавання на працягу 10 гадоў, 487 00:25:45,410 --> 00:25:49,630 так што не хвалюйцеся, калі нешта здарыцца Вам, гэта даволі распаўсюджана, шчыра кажучы. 488 00:25:49,630 --> 00:25:52,850 Гэта сапраўды свайго роду недахоп сінтаксісу. 489 00:25:52,850 --> 00:25:54,900 >> ОК, так што я накшталт абяцаў што мы зноў 490 00:25:54,900 --> 00:25:59,370 паняцце, як вялікая радок. 491 00:25:59,370 --> 00:26:02,750 Ну, калі я сказаў вам, што Радок, мы сапраўды выгляд 492 00:26:02,750 --> 00:26:04,140 ляжаў да вас ўвесь час. 493 00:26:04,140 --> 00:26:06,181 Там няма тып дадзеных называецца радок, а на самай справе я 494 00:26:06,181 --> 00:26:09,730 згадаў пра гэта ў адным з нашых Першыя відэа на тыпы дадзеных, 495 00:26:09,730 --> 00:26:13,820 што радок была тыпам дадзеных, быў створаны для вас у CS50.h. 496 00:26:13,820 --> 00:26:17,050 Вы павінны #include CS50.h для таго, каб выкарыстоўваць яго. 497 00:26:17,050 --> 00:26:19,250 >> Ну радок на самай справе проста псеўданім на нешта 498 00:26:19,250 --> 00:26:23,600 называецца сімвал *, а паказальнік на знак. 499 00:26:23,600 --> 00:26:26,010 Ну паказальнікі, нагадаем, проста звяртаецца. 500 00:26:26,010 --> 00:26:28,780 Так што памер у байтах радкі? 501 00:26:28,780 --> 00:26:29,796 Ну, гэта чатыры ці восем. 502 00:26:29,796 --> 00:26:32,170 І чаму я кажу чатыры ці восем, таму што ёсць на самой справе 503 00:26:32,170 --> 00:26:36,730 залежыць ад сістэмы, калі вы карыстаецеся CS50 язь, голец * з'яўляецца памер гольца 504 00:26:36,730 --> 00:26:39,340 * Восем, гэта 64-разрадная сістэма. 505 00:26:39,340 --> 00:26:43,850 Кожны адрас у памяці 64 біта. 506 00:26:43,850 --> 00:26:48,270 Калі вы выкарыстоўваеце прыбор CS50 або з дапамогай любой 32-бітнай машыны, 507 00:26:48,270 --> 00:26:51,640 і вы чулі, што тэрмін 32-біт машына, што 32-бітныя машыны? 508 00:26:51,640 --> 00:26:56,090 Ну гэта проста азначае, што кожны адрас у памяці даўжынёй 32 біта. 509 00:26:56,090 --> 00:26:59,140 І так 32 біт на чатыры байта. 510 00:26:59,140 --> 00:27:02,710 Такім чынам, сімвал * чатыры ці восем байт у залежнасці ад вашай сістэмы. 511 00:27:02,710 --> 00:27:06,100 І на самай справе якія-небудзь тыпы дадзеных, і паказальнік на любых дадзеных, 512 00:27:06,100 --> 00:27:12,030 тыпу, так як усе паказальнікі толькі адрасы, чатыры ці восем байт. 513 00:27:12,030 --> 00:27:14,030 Такім чынам, давайце вернемся ў гэтым Графік і давайце заключыць 514 00:27:14,030 --> 00:27:18,130 гэта відэа з невялікага практыкаванні тут. 515 00:27:18,130 --> 00:27:21,600 Дык вось схема мы спыніліся з у самым пачатку відэа. 516 00:27:21,600 --> 00:27:23,110 Так што цяпер, калі я кажу * РК = 35? 517 00:27:23,110 --> 00:27:26,370 518 00:27:26,370 --> 00:27:30,530 Так што гэта значыць, калі я кажу, * РК = 35? 519 00:27:30,530 --> 00:27:32,420 Вазьміце другой. 520 00:27:32,420 --> 00:27:34,990 * РК. 521 00:27:34,990 --> 00:27:39,890 У кантэксце тут, з'яўляецца * разыменовать аператар. 522 00:27:39,890 --> 00:27:42,110 Таму, калі разыменовать аператар выкарыстоўваецца, 523 00:27:42,110 --> 00:27:48,520 мы ідзем на адрас паказаў па РК, і мы змяняемся, што мы знаходзім. 524 00:27:48,520 --> 00:27:55,270 Так * РК = 35 эфектыўна робіць гэта на малюнку. 525 00:27:55,270 --> 00:27:58,110 Так што гэта ў асноўным сінтаксічна ідэнтычныя у тым, сказаў K = 35. 526 00:27:58,110 --> 00:28:00,740 527 00:28:00,740 --> 00:28:01,930 >> Яшчэ адзін. 528 00:28:01,930 --> 00:28:05,510 Калі я кажу, INT м, я ствараю новая пераменная называецца м. 529 00:28:05,510 --> 00:28:08,260 Новае поле, гэта таму, што зялёны скрыню ён збіраецца правесці цэлае, 530 00:28:08,260 --> 00:28:09,840 і гэта пазначаныя м. 531 00:28:09,840 --> 00:28:14,960 Калі я кажу, M = 4, я стаўлю лік у гэтым полі. 532 00:28:14,960 --> 00:28:20,290 Калі скажам РК = & м, як жа гэта змена схема? 533 00:28:20,290 --> 00:28:28,760 РК = & м, вы ўзгадаць, што ў І аператар робіць ці як называецца? 534 00:28:28,760 --> 00:28:34,430 Памятаеце, што некаторыя & імя зменнай гэта адрас зменнай імя. 535 00:28:34,430 --> 00:28:38,740 Такім чынам, што мы хочам сказаць, РК атрымлівае адрас м. 536 00:28:38,740 --> 00:28:42,010 І так эфектыўна, што адбываецца, схема, што РК даўжэй без ачкоў 537 00:28:42,010 --> 00:28:46,420 Да, але паказвае на м. 538 00:28:46,420 --> 00:28:48,470 >> Зноў паказальнікі вельмі складана працаваць 539 00:28:48,470 --> 00:28:50,620 і яны займаюць шмат практыка, а таму, што 540 00:28:50,620 --> 00:28:54,150 іх здольнасці, каб дазволіць вам для перадачы дадзеных паміж функцыямі 541 00:28:54,150 --> 00:28:56,945 і на самай справе ёсць тыя Змены ўступяць у сілу, 542 00:28:56,945 --> 00:28:58,820 атрымліваць вашу галоўку вакол гэта вельмі важна. 543 00:28:58,820 --> 00:29:02,590 Гэта, верагодна, з'яўляецца самым складаным Гэтую тэму мы абмяркуем у CS50, 544 00:29:02,590 --> 00:29:05,910 але значэнне, што вам атрымаць ад выкарыстання паказальнікаў 545 00:29:05,910 --> 00:29:09,200 значна перавешвае ускладненняў якія прыходзяць ад навучання іх. 546 00:29:09,200 --> 00:29:12,690 Так што я жадаю вам лепш поспехі даведацца аб паказальнікі. 547 00:29:12,690 --> 00:29:15,760 Я Дуг Лойд, гэта CS50. 548 00:29:15,760 --> 00:29:17,447