>> [Гуляе музыка]
>> Даг Lloyd: Паказальнікі, вось мы тут.
Гэта, верагодна, будзе найбольш цяжкая тэма
што мы гаворым пра ў CS50.
І калі вы чыталі што-небудзь пра паказальнікаў
перш чым можа быць трохі запалохаць ўдаючыся ў гэтым відэа.
Гэта праўда паказальнікі дазваляюць вам магчымасць
каб, магчыма, сапсаваць вельмі дрэнна, калі вы
Для працы з зменнымі і дадзенымі, і выклікаючы ваша праграма да краху.
Але на самой справе яны сапраўды карысныя і яны дазваляюць нам сапраўды выдатны спосаб
для перадачы дадзеных і назад наперад паміж функцыямі,
што мы ў адваротным выпадку не ў стане зрабіць.
>> І так, што мы на самай справе хачу зрабіць тут цягнік
Вы мець добрую паказальнік дысцыпліны, так што вы можаце эфектыўна выкарыстоўваць паказальнікі
каб зрабіць вашыя праграмы, якія нашмат лепш.
Як я ўжо сказаў паказальнікі даюць нам розныя спосаб перадачы дадзеных паміж функцыямі.
Цяпер, калі вы памятаеце з раней відэа, калі
мы гаворым пра Пераменная сфера, я згадаў
што ўсе дадзеныя, якія мы прайсці паміж Функцыі ў З перадаюцца па значэнні.
І я не мог выкарыстаць, што Тэрмін, што я меў на ўвазе там
было тое, што мы перадаем копіі дадзеных.
Калі мы перадаць зменную ў функцыю, мы на самай справе не перадаючы зменную
функцыі, ці не так?
Мы перадаючы копію што дадзеныя функцыі.
Функцыя робіць тое, што ён будзе і ён вылічае некаторы значэнне,
і, магчыма, мы выкарыстоўваем гэта значэнне калі ён дае яго назад.
>> Быў адным выключэннем гэтае правіла перадачы па значэнні,
і мы вернемся да таго, што, што крыху пазьней у гэтым відэа.
Калі мы выкарыстоўваем паказальнікі замест выкарыстання зменных,
або замест выкарыстання зменных Самі або копіі зменных,
Цяпер мы можам перайсці зменныя вакол паміж функцыямі па-іншаму.
Гэта азначае, што калі мы зробім змяненне ў адной функцыі,
што змяненне будзе на самой справе ўзяць эфект у іншым функцыі.
Зноў жа, гэта тое, што мы не маглі зрабіць раней,
і калі вы калі-небудзь спрабавалі памяняць месцамі Значэнне двух зменных ў функцыі,
Вы заўважылі, гэтую праблему нібы крадзецца, праўда?
>> Калі мы хочам, каб памяняць X і Y, і мы перадаць іх функцыі пад назвай падпампоўкі,
ўнутры функцыі своп Зменныя зрабіць валютныя каштоўнасці.
Чалавек становіцца два, два становіцца , Але мы на самай справе не
нічога змяніць у арыгінале Функцыя, у выклікалай.
Таму што мы не можам, мы толькі працы з іх копій.
З паказальнікамі, хоць, мы можам на самай справе праходзяць X і Y ў функцыю.
Гэтая функцыя можа зрабіць нешта з імі.
І гэтыя зменныя значэння можа рэальна змяніць.
Так што цалкам змена наша здольнасць працаваць з дадзенымі.
>> Перш чым мы паглыбімся ў паказальнікі, я думаю, што гэта каштуе
прымаючы некалькі хвілін да вярнуцца да асноў тут.
І ёсць паглядзім, як Работы памяці кампутара
таму што гэтыя дзве тэмы ідуць на самай справе даволі ўзаемазвязаны.
Як вы, напэўна, ведаеце, на вашым кампутары
ў вас ёсць жорсткі дыск або магчыма, цвёрдацельны назапашвальнік,
свайго роду месца для захоўвання файлаў.
Гэта, як правіла, дзесьці ў навакольле 250 гігабайт
, Можа быць, пару тэрабайт цяпер.
І гэта, дзе ўсе вашы Файлы ў канчатковым рахунку, жыць,
нават калі ваш кампутар выключаны выключаны, вы можаце ўключыць яго назад на
і вы знойдзеце вашыя файлы ёсць зноў, калі вы перазагрузіце сістэму.
Але дыскі, як жорсткі дыск, з жорсткімі, або цвёрдацельны назапашвальнік, цвёрдацельнага назапашвальніка,
проста месца для захоўвання.
>> Мы не можам на самай справе нічога агульнага з дадзеныя, якія на цвёрдым дыску,
або цвёрдацельным назапашвальнікам.
Для таго, каб рэальна змяніць дадзеных або перамясціць яго вакол,
у нас ёсць, каб перанесьці яго АЗП, аператыўнае запамінальная прылада.
Цяпер АЗП, у вас ёсць шмат менш у вашым кампутары.
Вы можаце мець дзесьці ў навакольле 512 мегабайт
калі ў вас ёсць стары кампутар, , Можа быць, два, чатыры, восем, 16,
магчыма, нават трохі Больш за тое, гігабайт аператыўнай памяці.
Дык вось значна менш, але гэта дзе ўсе лятучыя дадзеных існуе.
Вось дзе мы можам нешта змяніць.
Але калі мы пераходзім наш кампутар выключаны, усе дадзеныя ў аператыўнай памяці руйнуецца.
>> Дык вось чаму мы павінны мець жорсткі дыск для больш пастаяннага месца ёй,
так, што яна будзе exists- ён сапраўды дрэнна, калі мы кожны раз
Аказалася наш кампутар выключаны, кожны Файл у нашай сістэме быў знішчаны.
Так мы працуем ўнутры аператыўнай памяці.
І кожны раз, калі мы гаворым пра памяці, у значнай ступені, у CS50,
мы гаворым аб памяці, а не на цвёрдым дыску.
>> Таму, калі мы перамясціць рэчы ў памяць, яна займае пэўную колькасць прасторы.
Усе тыпы дадзеных, якія мы працуем з
ўзяць розныя колькасць прасторы ў памяці.
Такім чынам, кожны раз, калі вы стварыць цэлае пераменная, чатыры байта памяці
адведзены ў аператыўнай памяці, каб вы можа працаваць з гэтым лікам.
Вы можаце абвясціць лік, змяніць яго, прызначыць яго
да велічыні 10 павялічаным адной, гэтак далей і гэтак далей.
Усё, што павінна адбыцца ў Аператыўнай памяці, і вы атрымаеце чатыры байта
для працы з для кожнага цэлы лік, вы ствараеце.
>> Кожны персанаж вам стварыць атрымлівае адзін байт.
Вось толькі, колькі прасторы неабходна захоўваць сімвал.
Кожны паплавок, рэальная Колькасць, атрымлівае чатыры байта
калі гэта не двайны дакладнасці з якая плавае кропкай
лік, якое дазваляе ёсць больш дакладныя або больш лічбаў
пасля дзесятковай кропкі без страты дакладнасці,
якія займаюць восем байт памяці.
Доўгія прагне, сапраўды вялікія колькасці, таксама прымаць восем байт памяці.
Колькі байт памяці у радкі займаюць?
Ну давайце шпільку ў гэтым пытанні цяпер, але мы вернемся да яго.
>> Такім чынам, вернемся да гэтай ідэі памяці як вялікі масіў байт памерам вочак.
Вось і ўсё, што ёсць, гэта проста велізарны масіў вочак,
як і любы іншы масіў, які вы знаёмыя з і паглядзець,
акрамя кожны элемент адзін байт.
І гэтак жа, як масіў, кожны элемент мае адрас.
Кожны элемент масіва мае індэкс, і мы
можна выкарыстоўваць гэты індэкс, каб зрабіць так званы адвольнага доступу ў масіве.
Мы не павінны пачаць на пачатак масіва,
перабору кожны адзін яе элемент,
каб знайсці тое, што мы шукаем.
Мы можам толькі сказаць, я хачу, каб дабрацца да 15-элемент або 100-стыхія.
А можна проста ў той нумар і атрымаць значэнне, якое вы шукаеце.
>> Аналагічна кожная лакацыя у памяці мае адрас.
Так ваша памяць можа шукаць нешта падобнае.
Вось вельмі мала кавалак памяць, гэта 20 байт памяці.
Першыя 20 байт, таму што мой адрасоў ёсць на дне
0, 1, 2, 3, і так на ўсім шляху да 19.
І калі я заяўляю, зменных і калі я пачынаю працаваць з імі,
сістэма збіраецца ўсталяваць у бок некаторы прастору для мяне
У гэтай памяці для працы з маімі зменных.
Так што я мог бы сказаць, сімвал C роўная капітал Х. А што здарыцца?
Ну сістэма будзе адкладзеце для мяне аднаго байта.
У гэтым выпадку абраў нумар байта чатыры байта па адрасе чатырох,
і ён збіраецца захоўваць загалоўная літара Н ў там для мяне.
Калі я кажу, то хуткасць INT мяжа роўны 65, гэта
збіраецца вылучыць чатыры байт памяці для мяне.
І гэта будзе ставіцца да тых, чатыры байта, як адзінае цэлае
таму што тое, што мы працуем з ўяўляе сабой цэлы лік тут.
І гэта будзе захоўваць 65 там.
>> Цяпер ужо я накшталт кажу вам крыху хлусні,
правільна, таму што мы ведаем, што кампутары працуюць у двайковай сістэме.
Яны не разумеюць, абавязкова, што сталіца Н
або тое, што 65 ёсць, яны толькі зразумець бінарныя, нулі і адзінкі.
І так на самой справе, што мы там захоўваць
ня літара Н, і лік 65, але хутчэй двайковыя прадстаўлення
яго, што выглядаць сёе-тое як гэта.
І ў прыватнасці ў кантэкст цэлай зменнай,
ён не збіраецца проста пляваць яго ў, ён не збіраецца разглядаць яго як адзін чатыры
байт кавалак абавязкова, гэта на самай справе адбываецца
каб разглядаць яго як адзін байт чатырох кавалкаў, якія маглі б выглядаць наступным чынам.
І нават гэта не зусім дакладна небудзь,
з-за чаго-то пад назвай парадак байт, які мы не
збіраецца атрымаць у цяперашні час, але калі вам цікава, пра,
Вы можаце прачытаць на трохі і вялікі парадак байт.
Але дзеля гэтага аргументу, дзеля гэтага відэа,
давайце выкажам здагадку, што, у То ,, як лік 65 будзе
быць прадстаўлены ў памяць на кожнай сістэме,
хоць гэта не зусім дакладна.
>> Але давайце на самай справе проста атрымаць пазбавіцца ад усіх бінарных цалкам,
і думаць толькі аб якасці H і 65, гэта нашмат прасцей,
думаць пра яго, як што ў чалавечым істоце.
Добра, так яно і здаецца, можа быць, трохі выпадковым, што мая сістэма I've-
не даць мне байт 5, 6, 7, і 8 для захоўвання цэлы лік.
Там прычына для гэтага таксама, што мы не зможам атрымаць у прама зараз, але досыць
сказаць, што тое, што Кампутар робіць тут
Верагодна, гэта добры ход з яго боку.
Каб не даць мне памяць, што гэта абавязкова спіной да спіны.
Нягледзячы на ​​тое, што гэта збіраецца зрабіць гэта цяпер калі я хачу, каб атрымаць іншую радок,
называецца прозвішча, і я хачу, пакласці Лойда там.
Я збіраюся неабходна ўсталяваць адзін характар, кожная літара, што гэта
будзе патрабаваць адзін характар, адзін байт памяці.
Так што, калі я мог бы паставіць Лойда ў маёй масіва як гэта я даволі добра ісці, праўда?
Чаго не хапае?
>> Памятаеце, што кожны радок мы працуем з у З сканчаецца зваротнай касой рысы нулявы,
і мы не можам апусціць, што тут, альбо.
Мы павінны адкласці адзін байт памяці для захоўвання, што такім чынам мы
ведаеце, калі наша радок скончылася.
Такім чынам, яшчэ раз гэта пагадненне з, як рэчы
з'яўляюцца ў моцы памяці трохі выпадковым,
але на самой справе, як большасць сістэм распрацаваны.
Для выбудаваць іх па мультыплікатара з чатырох чалавек, па прычынах, зноў
што мы не павінны трапіць у прама цяпер.
Але гэта, так дастаткова сказаць, што пасля гэтых трох радкоў кода,
гэта тое, што памяць можа выглядаць.
Калі мне трэба вочак памяці 4, 8 і 12, каб трымаць мае дадзеныя,
гэта тое, што мая памяць можа выглядаць.
>> І толькі быць асабліва педантычны вось, калі
мы кажам пра памяць адрасы, як правіла, мы
зрабіць гэта, выкарыстоўваючы шаснаццаткавыя абазначэння.
Дык чаму б нам не ператварыць усё гэта ад дзесятковай шаснаццатковай форме
толькі таму, што, як правіла, гэта як мы называем памяццю.
Такім чынам, замест таго, каб быць ад 0 да 19, што мы маем нулявы
х ад нуля да нуля x1 тры.
Тыя 20 байт памяці, што мы Мець ці мы глядзім на на гэтым малюнку
прама тут.
>> Такім чынам, усё, што было сказана, давайце адысці ад памяці на секунду
і назад да паказальнікаў.
Вось самае галоўнае памятаць
як мы пачалі працаваць з паказальнікамі.
Паказальнік нічога больш адрасы.
Я скажу гэта зноў, таму што гэта тое, што важна,
паказальнік нічога больш адрасы.
Паказальнікі адрасы ў месцах ў памяці, дзе зменныя жыць.
Ведаючы, што яна становіцца, спадзяюся, крыху лягчэй працаваць з імі.
Іншая справа, мне падабаецца каб зрабіць, гэта ёсць свайго роду
дыяграм візуальна які ўяўляе тое, што адбываецца з рознымі радкоў кода.
І мы будзем рабіць гэта пару раз у паказальнікі,
і калі мы гаворым пра дынамічнай размеркаванне памяці, а таксама.
Таму што я думаю, што гэтыя дыяграмы могуць быць асабліва карысныя.
>> Так што, калі я кажу, напрыклад, INT да у маім кодзе, што адбываецца?
Ну што ж адбываецца ў асноўным у Я атрымліваю памяць адведзеных для мяне,
але я нават не хацеў бы думаю пра гэта, як, што, я
падабаецца думаць пра яго, як скрыню.
У мяне ёсць акно, і гэта колеру зялёны, таму што я
можа паставіць цэлыя лікі ў зялёныя скрынкі.
Калі б гэта быў персанаж, якога я можа мець сіні скрыню.
Але я заўсёды кажу, калі я ствараю скрынка, якая можа трымаць цэлыя
што скрынка афарбаваная ў зялёны колер.
І я бяру пастаянны маркер і я пішу да на баку.
Так у мяне ёсць скрынка пад назвай K, у якім я магу пакласці цэлыя лікі.
Таму калі я кажу Int K, гэта што адбываецца ў маёй галаве.
Калі я кажу, да роўная пяці, што я раблю?
Ну, я стаўлю пяць у скрынцы, правільна.
Гэта даволі проста, калі Я кажу INT да, стварыць акно пад назвай K.
Калі я кажу, да роўная 5, паставіў пяць у полі.
Спадзяюся, што гэта не занадта шмат скачком.
Вось дзе справы ідуць трохі цікава, хоць.
Калі я кажу, INT * РК, добра, нават калі я не ведаю, што гэта непазбежна азначае,
гэта відавочна ёсць нешта зрабіць з цэлым лікам.
Так што я збіраюся пафарбаваць гэта поле зялёны иш,
Я ведаю, што ёсць нешта зрабіць з цэлым лікам,
але гэта не само па сабе цэлае, таму што гэта INT зорка.
Там нешта крыху адрозніваецца пра яго.
Так ўдзел цэлае х, але ў адваротным выпадку гэта
не занадта адрозніваецца ад тое, што мы гаварылі.
Гэта скрынка, яе атрымалі ярлык, гэта насіць ярлык РК,
і ён здольны холдынгу INT зоркі, усё, што гэта такое.
Яны нешта рабіць з цэлымі лікамі, ясна.
Вось апошняя радок, хоць.
Калі я кажу, РК = & K, эй, што толькі што адбылося, праўда?
Так што гэта выпадковае лік, здавалася б, выпадковыя Колькасць, выкінуць ў скрынцы.
Усё, што ёсць, РК атрымлівае адрас к.
Так я прытрымліваюся, дзе да жыве ў памяці, яго адрас, адрас яго байт.
Усё, што я раблю, я кажу гэта значэнне тое, што я збіраюся
пакласці ў маёй скрынцы пад назвай РК.
І таму, што гэтыя рэчы Паказальнікі і таму шукае
у радку, як нулявы х восем нулёў з сямі чатырох восем
два нуль, верагодна, не вельмі значным.
Калі мы, як правіла візуалізаваць паказальнікі, мы на самай справе зрабіць гэта ў якасці паказальнікаў.
РК дае нам інфармацыю мы павінны знайсці K ў памяці.
Так у асноўным РК мае стрэлку ў ім.
І калі мы ходзім даўжыню гэтай стрэлкай, уявіце сабе,
гэта тое, што вы можаце хадзіць па, калі мы хадзіць уздоўж стрэлкі,
на самым кончыку гэтага стрэлкі, мы будзе знайсці месца ў памяці
дзе да жыцця.
І, што вельмі важна, таму што як толькі мы ведаем, дзе жыве да,
мы можам пачаць працаваць з дадзенымі ўнутры гэтым месцы памяці.
Хоць мы атрымліваем маленькі біт наперадзе сябе цяпер.
>> Так што паказальнік?
Паказальнік з'яўляецца элемент дадзеных якога значэнне адрас памяці.
Гэта было тое, што нуль нуль восем х рэчы адбываецца, гэта было адрас памяці.
Гэта было месца ў памяці.
І тып паказальніка апісвае выгляд
дадзеных, якія вы знойдзеце ў што адрас памяці.
Так што гэта INT зорка частка правы.
Калі я прытрымлівацца, што стрэлка, гэта збіраецца прывесці мяне да месца.
І, што месца, што я знойдзеце там у маім прыкладзе,
зялёны колеру скрынка.
Гэта цэлы лік, гэта тое, што я знойдзеце, калі я іду на гэты адрас.
Тып дадзеных для Паказальнік апісвае тое, што
Вы знойдзеце па гэтым адрасе памяці.
Дык вось сапраўды выдатна рэч, хоць.
Паказальнікі дазваляюць перайсці зменныя паміж функцыямі.
А на самай справе перадаць зменныя і ня прайсці іх копіі.
Таму што, калі мы дакладна ведаем, дзе ў памяці, каб знайсці зменную,
мы не павінны зрабіць копію гэта, мы можам проста пайсці ў гэтае месца
і працаваць з гэтай зменнай.
Такім чынам, у сутнасці паказальнікаў роду з зрабіць кампутарную сераду
нашмат больш, як у рэальным свеце, дакладна.
>> Дык вось аналогія.
Давайце выкажам здагадку, што ў мяне ёсць ноўтбук, справа, і ён поўны нататак.
І я б хацеў, каб вы абновіце яго.
Вы гэта функцыя, якая Абнаўлення адзначае, права.
У шляху мы былі працуе да гэтага часу, тое, што
адбываецца, вы будзеце прымаць мой ноўтбук, Вы ідзяце ў краму, капіявання,
вы будзеце рабіць ксеракопію кожная старонка запісной кніжкі.
Вы пакінуць свой ноўтбук назад на маім стале, калі вы скончыце,
вы будзеце ісці і выкрасліць рэчы ў маім ноўтбук, які састарэлі ці не так,
і тады вы будзеце праходзіць назад мне стос старонак Xerox
што з'яўляецца дакладнай копіяй майго наўтбука з змены, якія вы ўнеслі ў яго.
І ў той момант, гэта да мяне, як якая выклікае функцыя, як абаненту,
каб вырашыць вашыя нататкі і інтэграваць іх назад у маім нататніку.
Такім чынам, ёсць шмат крокаў ўдзел тут, прама.
Як гэта не было б лепш, калі я проста кажу, эй, вы можаце
абнавіць ноўтбук для мне, уручыць вам мой ноўтбук,
і вы бераце рэчы і літаральна перасекчы іх
і абнаўляць свае запісы ў нататніку.
А потым даць мне свой ноўтбук назад.
Гэта накшталт таго, што паказальнікі дазваляюць зрабіць,
яны робяць гэта асяроддзе шмат больш падабаецца, як мы працуем у рэальнасці.
>> Усе правы, так вось што паказальнік, давайце пагаворым
пра тое, як паказальнікі працуюць у C, і як мы можам пачаць працаваць з імі.
Такім чынам, ёсць вельмі просты паказальнік у З называецца нулявы паказальнік.
Нулявы паказальнік паказвае на нічога.
Гэта, верагодна, здаецца, што гэта на самай справе не вельмі карысная рэч,
але, як мы ўбачым Крыху пазней на той факт,
што гэта нулявы паказальнік існуе на самай справе вельмі можа спатрэбіцца.
І кожны раз, калі вы ствараеце паказальнік, а вы не ўсталюеце яго значэнне immediately-
прыклад ўстаноўкі яго значэнне адразу
будзе некалькі слайдаў таму дзе я сказаў РК роўная & K,
РК атрымлівае адрас K, паколькі мы ўбачым, што гэта значыць,
мы ўбачым, як код, які shortly- калі мы не ўсталюеце яго значэнне на нешта
сэнс адразу, Вы павінны заўсёды
ўсталяваць паказальнік, каб паказаць на нуль.
Вы павінны ўсталяваць гэта, каб паказаць на няма.
>> Гэта вельмі адрозніваецца ад проста пакінуць значэнне, як гэта
а затым магчымасць аб'явы Паказальнік і толькі пры ўмове,
гэта нуль, таму што гэта рэдка праўда.
Такім чынам, вы заўсёды павінны ўсталёўваць значэнне паказальніка
да нуля, калі вы не ўсталюеце яго значэнне каб нешта значнае неадкладна.
Вы можаце праверыць, ці з'яўляецца значэнне паказальніка ў з'яўляецца несапраўдным з дапамогай аператара роўнасці
(==), Гэтак жа, як вы параўнайце любы цэлы лік значэння ці знакавыя значэння, выкарыстоўваючы (==)
а таксама.
Гэта асаблівы від пастаяннай значэнне, якое можна выкарыстоўваць для тэставання.
Так што гэта было вельмі проста паказальнік, нулявы паказальнік.
Іншы спосаб стварэння паказальнік з'яўляецца выманне
адрас зменнай вы ўжо стварылі,
і вы робіце гэта з дапамогай & Здабыча адрас аператара.
Які мы ўжо бачылі раней у першым прыкладзе схемы я паказаў.
Так што, калі х з'яўляецца зменнай, што мы ўжо стварылі цэлага тыпу,
то і х з'яўляецца паказальнікам на цэлы лік.
і Х азначае памятаеце, і збіраецца атрымаць адрас рэчы справа.
А так як паказальнік гэта проста адрас, чым і х з'яўляецца паказальнікам на цэлы лік
значэнне якога, дзе ў памяці х жыццяў.
Гэта адрас Х.
Так і х з'яўляецца адрас х.
Давайце яшчэ адзін крок далей і падключыць да чаго-то
Я спасылаўся на ў папярэднім відэа.
Калі обр масіў двайнікоў, то і обр квадратная дужка я з'яўляецца паказальнікам
у два разы.
ДОБРА.
обр квадратную дужку я, калі обр масіў двайнікоў,
Затым обр квадратную дужку я гэта I-й элемент гэтага масіву,
і & обр квадратную дужку я дзе ў памяці я-й элемент обр існуе.
>> Так у чым жа сэнс тут?
Масівы імя, значэнне з усёй гэтай рэчы,
з'яўляецца тое, што імя масіва з'яўляецца на самай справе сам паказальнік.
Вы працавалі з паказальнікамі ўздоўж усяго
кожны раз, калі вы выкарыстоўвалі масіў.
Запомніць на прыкладзе па вобласці вызначэння зменнай,
ў канцы відэа я ўяўляю прыклад, дзе мы маем функцыю
называецца мноства INT і Функцыя называецца мноства масіў.
І ваша задача, каб вызначыць, ці не, або тое, што
каштоўнасці, якія мы раздрукаваныя канец функцыі,
У канцы асноўнай праграмы.
>> Калі вы памятаеце з гэтага прыкладу або калі вы глядзелі відэа,
Вы ведаеце, што, калі вам-выклік Набор INT эфектыўна нічога не робіць.
Але выклік, каб усталяваць масіў робіць.
І я накшталт замоўчваецца, чаму што было на той час.
Я проста сказаў, добра гэта масіў, гэта адмысловае, вы ведаеце, ёсць прычына.
Прычына ў тым, што масіў-х Назва на самай справе проста паказальнік,
і ёсць гэты асаблівы Сінтаксіс квадратная дужка, што
зрабіць рэчы нашмат лепш працаваць.
І яны робяць ідэю аб паказальнік шмат менш страшным,
і вось чаму яны накшталт з прадстаўленых у гэтым шляху.
Але на самой справе масівы проста паказальнікі.
І вось чаму, калі мы ўнеслі змены ў масіве,
калі мы прайшлі масіў у якасці параметру на функцыю або ў якасці аргументу
да функцыі, змесціва масіва фактычна змянілі ў абодвух выкліканага абанента
і ў выклікалай функцыі.
Які для кожнага іншага віду пераменная, якую мы бачылі, было не так.
Так што гэта проста нешта, каб трымаць у розум, калі вы працуеце з паказальнікамі,
з'яўляецца тое, што імя Масіў на самай справе паказальнік
на першы элемент гэтага масіва.
>> ОК, так што цяпер у нас ёсць усе гэтыя факты, давайце працягваць ісці, правільна.
Чаму мы клапоцімся пра дзесьці жыве.
Ну, як я ўжо сказаў, гэта даволі Карысна ведаць, дзе што-то жыве
так што вы можаце пайсці туды і змяніць яго.
Праца з ёй і на самай справе ёсць рэч, якую вы
хачу зрабіць з гэтай зменнай эфекту адбору, і не ўступілі ў сілу на некаторых копіі.
Гэта называецца разнаймення.
Мы ідзем да спасылцы і мы мяняем значэнне там.
Так што, калі ў нас ёсць паказальнік, і гэта завецца шт, і гэта паказвае на характар,
то можна сказаць, * * ПК і ПК з'яўляецца Імя таго, што мы знойдзем, калі мы ідзем
на адрас ПК.
Тое, што мы знойдзем там персанаж і * Шт як мы звяртаемся да дадзеных на што
Месцазнаходжанне.
Такім чынам, мы маглі б сказаць, што нешта накшталт * Шт = D ці нешта падобнае,
і гэта азначае, што што б ні быў на адрасы памяці кампутара,
любога характару раней там, у цяперашні час D, калі мы гаворым * PC = D.
>> Дык вось мы ідзем зноў некаторыя дзіўныя рэчы З, права.
Такім чынам, мы бачылі раней * як то частка з тыпам дадзеных,
і ў цяперашні час ён выкарыстоўваецца ў крыху іншы кантэкст
для доступу да дадзеных на месцы.
Я ведаю, гэта крыху заблытаным і што на самой справе частка гэтага цэлага
як, чаму паказальнікі маюць гэтую міфалогію вакол іх як настолькі складаныя,
гэта свайго роду праблемы сінтаксісу, сумленна.
Але * выкарыстоўваецца ў абодвух кантэкстах, і як частка імя тыпу,
і мы ўбачым, трохі пазней яшчэ нешта, таксама.
І цяпер гэта разыменовать аператар.
Так ён ідзе да спасылцы, гэта доступ да дадзеных
на месцы паказальніка, і дазваляе маніпуляваць па сваім жаданні.
>> Зараз гэта вельмі падобна на наведвання вашага суседа, права.
Калі вы ведаеце, што Сусед жыве, вы
ня боўтацца з вашым суседам.
Вы ведаеце, здараецца, ведаю, дзе яны жывуць,
але гэта не значыць, што сілу таго, што веды
Вы ўзаемадзейнічаюць з імі.
Калі вы хочаце, каб ўзаемадзейнічаць з імі, Вы павінны пайсці ў іх хаце,
Вы павінны пайсці туды, дзе яны жывуць.
І як толькі вы гэта зробіце, то вы можаце ўзаемадзейнічаць
з імі гэтак жа, як вы хацелі б.
І сапраўды гэтак жа з зменнымі, Вы павінны пайсці ў іх адрас
калі вы хочаце, каб ўзаемадзейнічаць іх, Вы не можаце проста ведаць адрас.
І тое, як вы ідзяце на адрасы выкарыстоўваць *, аператар разнаймення.
Што вы думаеце адбудзецца калі мы будзем спрабаваць разыменовать
паказальнік, значэнне якога роўна нулю?
Нагадаем, што нуль паказальнік паказвае нічога.
Так што, калі вы паспрабуеце і разнаймення нічога або перайсці да адраснай нічога,
што вы думаеце адбываецца?
Ну, калі вы здагадаліся сегментацыі віна, вы былі б правы.
Калі вы паспрабуеце і разнаймення пусты паказальнік,
Вы пакутуеце сегментацыі віна. Але пачакайце,
не кажу вам, што калі вы не збіраецеся
каб усталяваць значэнне вашага паказальнік на нешта значнае,
Вы павінны ўсталяваць на нуль?
Я зрабіў, і на самай справе сегментацыя няспраўнасць роду добрыя паводзіны.
>> Вы калі-небудзь абвясцілі зменную і не адразу прысвойваецца яго значэнне?
Такім чынам, вы проста сказаць Int х; Вы не на самай справе прысвоіць яго ні да чаго
а затым пазней у кодзе, Вам раздрукаваць значэнне х,
маючы да гэтага часу не прызначаны яго ні да чаго.
Часта вы атрымаеце нуля, але часам вы
можа атрымаць выпадковае лік, і Вы паняцця не маеце, дзе ён прыйшоў.
Дакладна магу рэчы адбудзецца з паказальнікамі.
Калі вы аб'яўляеце паказальнік INT * РК напрыклад,
і вы не прызначыць яго значэнне, Вы атрымліваеце чатыры байта для памяці.
Якія б ні былі чатыры байта памяці сістэма можа
выявіце, што ёсць некаторыя значныя каштоўнасці.
І, магчыма, было то там ужо, што
ня больш не патрэбен іншы Функцыя, так што вы проста павінны
усе дадзеныя там.
>> Што рабіць, калі вы спрабавалі зрабіць разнаймення некаторыя адрас, які вы don't- было
ўжо байты і інфармацыі ў там, што цяпер у паказальнік.
Калі вы паспрабуеце і разнаймення паказальніка гэтага, Вы маглі б важдацца з нейкай памяці
што вы не маюць намер важдацца з усім гэтым.
І на самай справе вы маглі б зрабіць што-то сапраўды разбуральным,
як зламаць іншую праграму, або зламаць іншую функцыю,
або зрабіць што-то, што шкоднасны Вы не маюць намер рабіць наогул.
І вось чаму гэта на самай справе добрая ідэя
ўсталяваць свае паказальнікі на нуль, калі вам не ўстаноўлены іх нешта асэнсаванае.
Гэта, верагодна, лепш на Канец дня для вашай праграмы
да краху, то для таго, каб зрабіць тое, што шрубы уверх
іншая праграма або іншая функцыя.
Такія паводзіны, магчыма, нават менш ідэальным, чым проста збой.
І вось чаму гэта на самай справе добрая звычка
каб патрапіць у вашы ўсталяваць паказальнікі да нуля, калі вы не ўсталюеце іх
да значнай кошту неадкладна, значэнне, што вы ведаеце
і што вы можаце бяспечна выконваць разнаймення.
>> Такім чынам, давайце вернемся ў цяперашні час і зірнуць у агульным сінтаксісе сітуацыі.
Калі я кажу, INT * р;, што я толькі што зрабіў?
Што я зрабіў гэта.
Я ведаю, што велічыня р з'яўляецца адрас таму што ўсе паказальнікі толькі
адрасы.
Я магу разнаймення р выкарыстоўваючы аператар *.
У гэтым кантэксце тут, у самым топ ўспомніць * з'яўляецца часткай тыпу.
Int * тып дадзеных.
Але я магу разнаймення р, выкарыстоўваючы аператар *,
і калі я раблю так, калі я іду па гэтым адрасе, тое, што я знайду па гэтым адрасе?
Я знайду цэлае.
Так INT * р у асноўным кажучы, р ўяўляе сабой адрас.
Я магу разнаймення р і калі Я, я знайду цэлае
у гэтым месцы памяці.
>> ОК, так што я сказаў, што быў яшчэ адзін раздражняльная рэч з зоркамі
і вось дзе, што раздражняльная рэч з зоркамі ёсць.
Вы калі-небудзь спрабавалі абвясціць некалькі зменных аднаго і таго ж тыпу
на той жа радку кода?
Такім чынам, для другога, рабіць выгляд, што лініі, код, які я на самой справе ў іх там у зялёны
там няма, і ён проста кажа INT х, у, г;.
Тое, што гэта будзе зрабіць, гэта на самай справе стварыць тры цэлалікавых зменныя для вас,
адна называецца х, адна называецца у, і адзін называецца г.
Гэта спосаб зрабіць гэта без таго, каб падзяліць на тры лініі.
>> Вось дзе зоркі атрымліваюць раздражняе зноў, хоць,
таму што на самой справе * частка з'яўляецца з імя тыпу і часткі
імя зменнай.
І таму, калі я кажу, INT * рх, ру, РГ, тое, што я на самой справе атрымаць паказальнік на цэлае
называецца ПВ і два цэлых чысла, ру і РГ.
І гэта, напэўна, не тое, што мы хочам, гэта не добра.
>> Так што, калі я хачу, каб стварыць некалькі паказальнікаў на той жа лініі, таго ж тыпу,
і зоркі, тое, што я на самой справе трэба каб зрабіць, гэта сказаць INT * гадавых, * PB * шт.
Цяпер толькі што сказаў, што і зараз кажу вам гэта,
вы, верагодна, ніколі не будзе рабіць гэтага.
І гэта, напэўна, добра, шчыра кажучы, таму што вы можаце выпадкова
апусціць зорку, нешта накшталт гэтага.
Гэта, верагодна, лепш, можа быць, абвясціць паказальнікі на асобных лініях,
але гэта проста яшчэ адзін з тых раздражняльных сінтаксісу
рэчы з зоркамі, якія робяць паказальнікі так цяжка працаваць.
Таму што гэта проста сінтаксічны гэта беспарадак, вы павінны працаваць праз.
З практыкай гэта робіць сапраўды стала другой натурай.
Я да гэтага часу робяць памылкі з ім яшчэ пасля праграмавання на працягу 10 гадоў,
так што не хвалюйцеся, калі нешта здарыцца Вам, гэта даволі распаўсюджана, шчыра кажучы.
Гэта сапраўды свайго роду недахоп сінтаксісу.
>> ОК, так што я накшталт абяцаў што мы зноў
паняцце, як вялікая радок.
Ну, калі я сказаў вам, што Радок, мы сапраўды выгляд
ляжаў да вас ўвесь час.
Там няма тып дадзеных называецца радок, а на самай справе я
згадаў пра гэта ў адным з нашых Першыя відэа на тыпы дадзеных,
што радок была тыпам дадзеных, быў створаны для вас у CS50.h.
Вы павінны #include CS50.h для таго, каб выкарыстоўваць яго.
>> Ну радок на самай справе проста псеўданім на нешта
называецца сімвал *, а паказальнік на знак.
Ну паказальнікі, нагадаем, проста звяртаецца.
Так што памер у байтах радкі?
Ну, гэта чатыры ці восем.
І чаму я кажу чатыры ці восем, таму што ёсць на самой справе
залежыць ад сістэмы, калі вы карыстаецеся CS50 язь, голец * з'яўляецца памер гольца
* Восем, гэта 64-разрадная сістэма.
Кожны адрас у памяці 64 біта.
Калі вы выкарыстоўваеце прыбор CS50 або з дапамогай любой 32-бітнай машыны,
і вы чулі, што тэрмін 32-біт машына, што 32-бітныя машыны?
Ну гэта проста азначае, што кожны адрас у памяці даўжынёй 32 біта.
І так 32 біт на чатыры байта.
Такім чынам, сімвал * чатыры ці восем байт у залежнасці ад вашай сістэмы.
І на самай справе якія-небудзь тыпы дадзеных, і паказальнік на любых дадзеных,
тыпу, так як усе паказальнікі толькі адрасы, чатыры ці восем байт.
Такім чынам, давайце вернемся ў гэтым Графік і давайце заключыць
гэта відэа з невялікага практыкаванні тут.
Дык вось схема мы спыніліся з у самым пачатку відэа.
Так што цяпер, калі я кажу * РК = 35?
Так што гэта значыць, калі я кажу, * РК = 35?
Вазьміце другой.
* РК.
У кантэксце тут, з'яўляецца * разыменовать аператар.
Таму, калі разыменовать аператар выкарыстоўваецца,
мы ідзем на адрас паказаў па РК, і мы змяняемся, што мы знаходзім.
Так * РК = 35 эфектыўна робіць гэта на малюнку.
Так што гэта ў асноўным сінтаксічна ідэнтычныя у тым, сказаў K = 35.
>> Яшчэ адзін.
Калі я кажу, INT м, я ствараю новая пераменная называецца м.
Новае поле, гэта таму, што зялёны скрыню ён збіраецца правесці цэлае,
і гэта пазначаныя м.
Калі я кажу, M = 4, я стаўлю лік у гэтым полі.
Калі скажам РК = & м, як жа гэта змена схема?
РК = & м, вы ўзгадаць, што ў І аператар робіць ці як называецца?
Памятаеце, што некаторыя & імя зменнай гэта адрас зменнай імя.
Такім чынам, што мы хочам сказаць, РК атрымлівае адрас м.
І так эфектыўна, што адбываецца, схема, што РК даўжэй без ачкоў
Да, але паказвае на м.
>> Зноў паказальнікі вельмі складана працаваць
і яны займаюць шмат практыка, а таму, што
іх здольнасці, каб дазволіць вам для перадачы дадзеных паміж функцыямі
і на самай справе ёсць тыя Змены ўступяць у сілу,
атрымліваць вашу галоўку вакол гэта вельмі важна.
Гэта, верагодна, з'яўляецца самым складаным Гэтую тэму мы абмяркуем у CS50,
але значэнне, што вам атрымаць ад выкарыстання паказальнікаў
значна перавешвае ускладненняў якія прыходзяць ад навучання іх.
Так што я жадаю вам лепш поспехі даведацца аб паказальнікі.
Я Дуг Лойд, гэта CS50.