[Powered by Google Translate] [Тыдзень 4, працяг]
[David J. малая - Гарвардскі універсітэт]
[Гэта CS50. - CS50.TV]
>> Гэта CS50, і гэта ў канцы тыдня 4.
Такім чынам, некаторыя добрыя навіны і дрэнныя навіны.
Няма лекцыі ў панядзелак, не праблема ўсталяваць на наступным тыдні. [Апладысменты студэнтаў]
Вы не спадабаецца, дзе гэта адбываецца.
Але ў нас ёсць гэта, а ў наступную сераду,
і ёсць таксама ў праграме 1 лекцыя пятніцу ў наступную пятніцу, так што мы можам застацца на трасе.
Але ўсё будзе зняты, як звычайна, так што не турбуйцеся.
>> І ў сувязі з віктарыну 0 Што мы будзем рабіць бліжэй да канца тыдня
будзе размяшчаць на хатняй старонцы cs50.net курсу тлумачэнняў
, Якога роду чакання вы павінны мець, калі справа даходзіць да першай віктарыны.
Увогуле, гэта будзе множны выбар, дакладна-няслушна, кароткі адказ, кароткі кадавання праблемы.
Вы не будзеце чакаць для рэалізацыі эквівалентных
праблемы, якія вы бачыце на PSET, для якіх у вас ёсць кампутар
і адладчык і да таго падобнае, але там будзе невялікая кадавання праблемы.
>> І сапраўды, лепшае кіраўніцтва, каб атрымаць уяўленне аб тым, што CS50 віктарыны, як
гэта зайсці на cs50.net, перайдзіце на спасылку віктарыны,
і вы можаце ўбачыць апошнія некалькі гадоў стаіць віктарыны.
Проста разумею, што навучальныя праграмы не заўсёды было нязменным на працягу многіх гадоў.
Часам мы дадамо, часам адымаць,
таму калі вы бачыце нейкую тэму на адным з тых старых віктарыны
што вы паняцця не маеце, што гэта гаворыць пра тое, што гэта альбо тое, што мы не пакрыць яе
або што мы не пакрывае яго.
Але ў выглядзе водгукаў, у гэтую нядзелю, панядзелак і аўторак
а таксама ход ўсёй сесіі па правядзенні агляду ў ноч на нядзелю -
Час і месца будуць абвешчаныя на хатняй старонцы курса -
Вы ўсё маеце магчымасць азнаёміцца ​​з выкладаннем курса стыпендыяты
Матэрыял у гэтым годзе, як і ў раздзеле якасці паўнапраўнага класа,
, І яны будуць знятыя, як звычайна, а таксама.
>> Добра. Такім чынам, без далейшых цырымоній, у адным з каментароў на залік / незалік і ўводу / высновы.
Магчыма, вы бачылі мае нататкі мінулай ноччу, і гэта сапраўды проста некаторыя дадатковыя запэўніванні
што калі вы належыце да ліку тых, хто асабліва менш камфортна або дзесьці пасярэдзіне
і вы адчуваеце сябе проста трохі больш чым у вашай галаве,
разумеюць, што на самай справе цалкам нармальна, і ёсць дастатковая структуры падтрымкі на месцы,
адзін з якіх прыёмныя гадзіны былі намеры па паляпшэнню тым больш за маю электронную пошту мінулай ноччу,
і разумею, што таксама варыянт, як прыдатны / не прыдатны для класа, як гэта
на самай справе маецца на ўвазе ў якасці механізму, зняць вастрыню курсу, як гэта,
так што зноў, калі вы марнуеце тыя 10, 15, 20-й гадзіне
проста спрабую атрымаць некаторыя PSET працаваць і вы ведаеце, што 90-95% ад туды
але вы не можаце знайсці праклятую памылку, у залік / незалік мадэль, якая быццам бы нармальна.
>> Ідэя складаецца ў тым, што з гэтым механізмам вы можаце пайсці увагі на іншых psets
або спаць ці што гэта такое, што вы хочаце, каб засяродзіцца.
Так разумею, што ў вас ёсць, пакуль гэта бліжэйшы аўторак - тэхнічна 5-й панядзелак,
але гэта свята, так што гэта бліжэйшы аўторак - перайсці ад прыдатны / не прыдатны да градуяваная ці наадварот.
І калі вы сапраўды на краі прорвы, і думае падзення ў цэлым,
Калі ласка, злаві мяне пасля лекцыі ці напішыце мне цыдулку.
Мы хацелі б, па меншай меры чата перад вамі развітацца.
Добра. Такім чынам, мы пачалі прымаць падрыхтоўкі колаў у мінулы раз.
У прыватнасці, мы звярнулі ўвагу на радок.
Струнны з'яўляецца тое, што абвешчаныя ў бібліятэцы CS50,
у прыватнасці ў тым, што файл з імем cs50.h якіх мы пачнём глядзець на гэты тыдзень і наступную.
Але радок на самай справе проста спрашчэнне нешта
, Што крыху больш arcanely апісана як сімвал *.
Char, што мы знаёмыя. Гэта ўсяго толькі адзін знак.
Але * па стане на панядзелак пазначаецца як? >> [Студэнт] паказальнік.
Паказальніка. І што паказальнік? >> [Студэнт] адрас.
>> Гэта ўсё роўна, адрас, месца ў памяці.
Што адрас або месца або памяць?
Зноў жа, ва ўсіх нас ёсць наўтбукі з канцэрту або 2 гігабайта аператыўнай памяці, хутчэй за ўсё, у гэтыя дні,
і гэта азначае, што ў вас ёсць мільярд або 2 млрд. байт варта памяці.
І гэта сапраўды не мае значэння, што гэта фізічна выглядае,
але прыняць на веру, што вы можаце палічыць усе асобныя байты, што ваш уласны ноўтбук -
гэта байт 0, гэта 1 байт, гэта байт 2 млрд. -
і гэта менавіта тое, што кампутар робіць.
Калі вы вылучыць месца для аднаго знака, напрыклад,
ён, відавочна, павінен жыць дзесьці ў памяці кампутара,
і можа быць, гэта на нумар 12345 байт,
і што дзесьці тут, у памяці кампутара.
І адрас, то гэтага сімвала 12345.
>> Зараз, у тыдзень ад 0 да цяпер да гэтага часу, мы сапраўды не клапаціліся
, Дзе ў памяці захоўваюцца рэчы, таму што мы звычайна выкарыстоўваюць сімвалы,
Зменныя і масівы на самай справе атрымаць на нашым дадзеных.
Але, як у панядзелак, а тым больш сёння, вы зараз будзеце мець
Тым больш выразныя магчымасці пры напісанні праграм
каб сапраўды кіраваць памяццю кампутара як вы лічыце патрэбным,
як для добрых мэтаў і дрэнна,
памылкі быць вельмі агульны вынік на дадзены момант у вывучэнні гэтага матэрыялу.
Але што гэта на самай справе значыць быць знак *?
Давайце пойдзем далей назад у - і мы вернемся да Бинки як і абяцаў сёння.
Пойдзем простым прыкладам тут.
Дазвольце мне захаваць гэты файл як compare.c, і дазвольце мне проста атрымаць код пра шаблон тут
таму ўключаць stdio.h, дазвольце мне таксама аддаць сябе ўключаць cs50.h. Я павялічыць там.
Дазвольце мне пачаць пісаць асноўныя INT, асноўных (несапраўднымі), і цяпер я хачу зрабіць нешта накшталт гэтага:
Е ("Дайце мне радкі:"), а затым я буду выкарыстоўваць радкі з атрымлівае GetString
, Каб атрымаць радок ад карыстальніка, то я збіраюся спытаць карыстальніка на іншы.
("Дайце мне яшчэ радкі:"), і я збіраюся папрасіць іх праз GetString, каб атрымаць гэта.
Я буду называць яго, таму што т т прыходзіць пасля з і з гэта добрае назву для радка, калі гэта даволі агульны характар.
Так GetString, і цяпер я проста хачу зрабіць агульны кантроль, і я збіраюся сказаць,
Калі (S == т), то я проста хачу, каб паведаміць карыстачу Е ("Вы ўвялі тое ж самае, \ п");
яшчэ я хачу, каб раздрукаваць нешта накшталт ("Вы ўвялі нешта іншае! \ п")
або што прысуд будзе. Такім чынам, нешта накшталт гэтага.
Затым, як звычайна, я буду вяртаць 0, які проста азначаў, што нічога дрэннага не здарылася,
і я збіраюся ісці наперад і скампіляваць і запусціць гэтую праграму.
>> Але ў панядзелак мы запусцілі гэтую праграму,
і на самай справе было сказана, што прывітання не Добры дзень і бывай ня бывай.
Паводзіны, якое мы бачылі, было крыху больш, як гэта.
Адпусціце мяне ў мой зыходны каталог, павялічыць тут, і давайце зробім зрабіць параўнанне.
Складальнік парадку. Дазвольце мне выканаць параўнанне. Дайце мне радкі: Добры дзень.
Дайце мне іншую радок: Добры дзень.
Вы ўвялі нешта іншае!
Ну, давайце я паспрабую што-небудзь прасцей, як 50, 50. Вы ўвялі нешта іншае!
прывітанне, прывітанне. Такім чынам, ясна, што нешта тут адбываецца.
Але якое ж было тлумачэнне, чаму?
Мабыць, лінія 12 цалкам функцыянуе.
Якая асноўная праблема тут? Так. >> [Студэнт] Гэта параўнанне адрасоў.
Так, менавіта так. Гэта на самай справе параўнання адрасоў
, У якім ПРЫВІТАННЕ ПРЫВІТАННЕ і захоўваюцца.
Гэта не параўнанне літар ПРЫВІТАННЕ зноў і зноў,
таму што тое, што адбылося на самай справе, увесь гэты час мы выкарыстоўвалі GetString -
Гэта дошцы зноў памяці нашага кампутара,
і скажам, я называю GetString пасля абвяшчэння зменнай с.
Што азначае мая памяць падобная?
Давайце адвольна сказаць, што з выглядае наступным чынам. Гэта квадрат.
І ў значнай ступені любы час я намаляваў кавалак памяці на экране
калі гэта 32 біт, я быў малюнак квадратаў, як гэта, таму што сапраўды ў прыбор,
паказальнік, адрас, складае 32 біт. Гэта так жа, як Int.
Гэта можа вар'іравацца ў залежнасці ад кампутарнай сістэмы.
Тыя з вас, хто цьмяна знаёмыя з тым фактам, што ваш Mac ці PC складае 64 біт,
што на самой справе азначае, што ваш кампутар выкарыстоўвае 64-разрадныя паказальнікі,
64-разрадныя адрасы, а сярод расквітацца гэтага ваш кампутар
можа мець значна больш памяці, чым мінулага.
Карацей кажучы, яшчэ ў той дзень, калі кампутары выкарыстоўваюцца толькі 32 біт
для прадстаўлення адрасоў, найбольшая колькасць байт вы маглі б прадстаўляць
У гэтым выпадку было тое, што калі ў вас ёсць 32 біт?
Такім чынам, 4 млрд, маюць рацыю, таму што ад 2 да 32, 4 мільярды даляраў.
Гэты лік было паўтарэння ў курсе.
>> Так што калі ў вас ёсць толькі 32 біта, найбольшая колькасць вы можаце разлічваць на прыкладна 4 мільярды даляраў.
Але гэта было фундаментальнае абмежаванне кампутараў, пакуль некалькі гадоў назад
таму што калі вы можаце разлічваць толькі дасягаць 4 млрд.
гэта не мае значэння, калі вы купляеце 8 гігабайт аператыўнай памяці або нават 5 гігабайт аператыўнай памяці;
Вы не можаце разлічваць, што высокі, так што гэта было бескарысна.
Вы можаце атрымаць доступ толькі да першых 3 ці 4 гігабайтамі памяці кампутара.
Гэта менш важнай праблемай у цяперашні час, і вы можаце купіць MacBook Pros і Dells
з 8 гігабайтамі аператыўнай памяці або нават больш у гэтыя дні.
Але калі я проста вылучыць у гэтай праграме паказальнік, паказальнік завецца S,
гэта можа выглядаць гэта на экране, таму што сапраўды нам трэба адхіліце гэты пласт.
Я ўвесь час кажу радкі, але па стане на панядзелак, радок сапраўды сімвал *,
Адрас некаторы характар.
Так што давайце лічыць, што навучанне колы адключаецца, нават калі мы будзем працягваць выкарыстоўваць GetString на дадзены момант.
Так што я абвясціў ёй, і гэта частка памяці, 32 біт.
Што тут у памяць па змаўчанні? >> [Неразборліва адказ студэнта]
Што гэта? >> [Студэнт] Garbage. >> Garbage. Менавіта так.
Калі вы праграміст не ставім значэнне ў зменнай, хто ведае, што гэта такое?
Часам вам шанцуе, і гэта 0, якая з'яўляецца своеасаблівай добры, чысты значэнні па змаўчанні,
але, як мы бачылі панядзелак, часам гэта поўнае трызненне,
некаторыя сапраўды вялікія станоўчыя або адмоўныя лікі, якія прыйшлі з дзе?
Так. >> [Студэнт] Функцыя раней. >> Так.
>> Часта функцыі, якія атрымаў колл раней, таму што памятаю,
як вы называеце функцыі ў памяці, яны займаюць усё больш і больш прасторы знізу ўверх,
і як толькі функцыя вяртае, што памяць атрымлівае паўторна
на наступны хлопец, які выклікаецца, хто выкарыстоўвае вашыя ж кавалак памяці.
І калі вы пакінулі смецце там, папярэднія значэння,
мы маглі б пераблытаць з як мае некаторы значэнне, калі на самай справе мы не кладзіце нічога няма.
Такім чынам, нашы аператыўнай памяці на дадзены момант выглядае наступным чынам.
Цяпер на правай баку радкі 7 мы называем GetString,
якія мы робім цяпер на працягу тыдняў, а тое, што GetString самай справе?
GetString напісана CS50 персанал трохі інтэлектуальнага
у тым, што, як толькі карыстач пачынае ўводзіць ключы і хітоў Enter,
GetString лічбы, колькі націскаў клавіш зрабіў карыстальнік хіт,
колькі знакаў я павінен вылучыць RAM для.
А дзе, што RAM прыходзіць, хто ведае?
Гэта дзесьці ў 2 кампутара гігабайт і яшчэ шмат чаго з памяці.
Але давайце выкажам здагадку, што кампутар знайшоў месца для слова ПРЫВІТАННЕ прама тут.
Я набраў слова было Н-Е-Л-Л-О.
І калі мы правядзем гэта як паслядоўнасць сімвалаў, мы маглі б зрабіць гэта так.
Але мне трэба зрабіць 1 дадатковую рэч. Тое, што належыць у канцы любой радкі ў C?
Нулявы сімвал, які мы пішам, як \ 0.
Гэта тэхнічна лік 0, а зваротная касая рыса робіць усё выразна
што гэта літаральна лік 0, цэлы лік 0;
гэта не так, напрыклад, цытата-канец цытаты 0, што можна ўвесці з клавіятуры.
Так што гэта HELLO.
>> І што ж мы кажам у панядзелак, што функцыі, як GetString
на самай справе вяртаюцца ўсе гэтыя тыдні?
Гэта не вяртаюцца радкі як такой, таму што на самой справе не маюць сэнс
Паколькі радкі не існуе. Яны накшталт вырабу ў CS50 бібліятэкі.
Што на самай справе з'яўляецца радком, больш тэхнічна? >> [Студэнт] Гэта першы знак.
Менавіта так. Гэта даволі проста адрас першага знака, які карыстальнік увёў цалі
Так што, калі мае словы ПРЫВІТАННЕ заканчвае яго ў байт 123 нумары, а затым з байта нумар 124,
125, 126, і гэтак далей, калі я проста мой нумар байта ад 0 да о,
што на самой справе GetString вяртаецца літаральна нумар 123.
Такім чынам, тое, што можна пакласці ў ы гэта нумар 123, а не літара H, не тое слова HELLO,
проста адрас, па якім я магу знайсці першую літару HELLO.
Але гэта не здаецца дастаткова. Я спытаў вас за радком, а не характар.
Так як жа нам або кампутар ведаем, што ELLO выгляду прыходзяць разам з H?
Што роду дамовы ў нас ёсць? Так.
[Студэнт] Ён працягвае казаць сам знайсці яшчэ некалькі знакаў. >> Менавіта так.
>> Там ёсць чалавек-кампутар канвенцыі якой калі вы маеце справу з радкамі,
інакш вядомы зараз як сімвал зоркі, вы проста павінны высветліць,
дзе ў канцы кожнага радка ў жыцці з'яўляецца на самай справе проста ітэрацыі па яго цыкл,
час цыклу, што заўгодна, так што, калі вы знаходзіце канцы радка
Цяпер вы можаце заключыць з гэтага, ой, цэлае слова было HELLO.
Тыя з вас, з вопытам праграмавання можа ведаць у Java
Вы можаце проста патэлефанаваць. Даўжыню і на іншых мовах можна назваць даўжыню ці аналагічны.
Гэта таму, што ў шматлікіх мовах, у прыватнасці, што называецца аб'ектна-арыентаваных моў,
Даўжыня нешта накшталт інкапсуляваць ў часці саміх дадзеных,
шмат, як мы інкапсуляваць ідэнтыфікатары і імёны і дома ўнутры студэнта ў панядзелак.
Але C значна больш нізкім узроўні. Ёсць ніякіх аб'ектаў або класаў, калі вы чулі гэтыя тэрміны раней.
Усё, што вам сапраўды адрасоў памяці.
Так што гэта свайго роду старамодным спосабам прадстаўлення цікавай структуры дадзеных.
У вас ёсць пачатковае значэнне, як адрас першага знака
, А затым толькі некаторыя адвольныя канвенцыі, што ўсе згодныя з тым, каб прытрымлівацца.
Такім чынам, як даўжыня радка рэалізаваны, не мы прапануем?
STRLEN, StrLen, што некаторыя з вас ужо выкарысталі некалькі разоў. Гэта даволі проста, ці не так?
Гэта як 2 радкі кода.
Гэта ў значнай ступені за цыкл нейкі, можа быць, з дадатковай лакальнай зменнай.
Але StrLen проста павінен узяць паказальнік, а затым пачынаюць шукаць \ 0.
>> І як толькі ён знаходзіць яго, ён можа вяртаць агульная колькасць крокаў, якія ён узяў у гэтай радку.
Такім чынам, мы можам заключыць з гэтага, што адбываецца далей.
Хай тады я заяўляю, т як я зрабіў у радку 10.
Гэта нейкая фігня значэнне. Хто ведае, у першую чаргу?
Але на правай баку лініі 10 я тэлефаную GetString зноў.
Хто ведае, дзе гэта заканчваецца?
Давайце калі заўгодна казаць аб тым, што аперацыйная сістэма знайшла месца для яго шляху сюды.
Я, здараецца, выпадкова тыпу Н-Е-Л-Л-О зноў,
і такім чынам, мы можам зрабіць такую ​​ж карціну.
Але тое, што ў мяне перамаляваць гэтую карціну наўмыснага
таму што гэта іншае PRIVET, чым гэты.
Дык вось, гэта можа быць размяшчэнне 456, гэта 457, і гэтак далей.
Такім чынам, тое, што можна паставіць, дзе знак пытання было раней?
У гэтым выпадку 456.
Мы выбіраючы гэтыя лічбы адвольна, таму што на самой справе пасля таго, як сёння
Мы не збіраемся так турбавацца аб тым, што адрас нічога.
Усё, што мы клапоцімся пра тое, што мы можам высветліць адрас некаторай часткі дадзеных, як HELLO.
>> Так на самай справе тое, што большасць людзей у вобласці кампутарнай навукі, калі гаворка ідзе аб памяці адрасы
і казаць пра паказальнікаў у прыватнасці,
, А не турбавацца высвятляючы 123 - каго гэта хвалюе, дзе гэтыя рэчы на ​​самай справе,
мы проста ведаем, што гэта ў некаторай лікавы адрас -
мы спрашчаем свет і проста сказаць, што з паказвае на гэтага персанажа
і т паказвае на гэтага персанажа.
А тое, што гэта стрэлка цалкам наўмыснай
таму што літаральна цяпер з паказвае на H і T паказвае на іншую H
таму што ў рэшце рэшт, гэта не мае значэння, што адрас,
але гэта не справа, што ў нас ёсць магчымасць, каб выказаць, што адрас з некаторымі кавалак кода.
Мы сапраўды не маніпуляваў гэтымі адрасамі толькі пакуль
так што паглядзім, дзе мы можам ўстаўляць і як бы рабіць рэчы з паказальнікамі,
але цяпер у радку 12 літаральным якія каштоўнасці мы параўнанні
у адпаведнасці з гэтай гісторыяй у радку 12?
Мы кажам, што складае 123 роўных роўнымі да 456? І гэта вызначана не той выпадак.
І нават канцэптуальна, гэты паказальнік, безумоўна, не гэтак жа, як гэта
таму што вы называлі GetString двойчы, і GetString не спрабаваць быць супер разумным,
яна не спрабуе зразумець, ой, вы набралі ПРЫВІТАННЕ 5 хвілін назад;
Дазвольце мне даць вам той жа паказальнік, як я даў табе раней,
ён проста вылучае новы блок памяці кожны раз, калі вы гэта называеце.
>> Так як жа нам вырашыць гэтую праблему?
Калі высокім узроўні я хачу параўнаць радкі прывітанне і прывітанне -
Я не клапачуся аб паказальнікі - як я магу ісці аб адказваючы на ​​пытанне,
ж карыстальнік увядзіце тое ж самае? Што тут неабходная? Так.
[Студэнт] Выкарыстоўвайце функцыю. >> Я магу выкарыстоўваць функцыі з скрынкі.
Я магу выкарыстоўваць функцыю пад назвай STRCMP, з-т-р-с-т-р,
толькі скарочаны версію кажучы параўнання радкоў.
І калі мы ідзем у, напрыклад, параўнаць 2, які з'яўляецца адным з раздатачных матэрыялаў сённяшнім
Я раблю менавіта гэта.
Я трымаў ўсё астатняе тое ж самае ад лініі 1 на да 26 ці каля таго,
і цяпер заўважаю гэтую частку змянілася толькі трохі.
Давайце ігнараваць лініі 28 на імгненне і засяродзіцца толькі на гэтым.
Што мы кажам у панядзелак, што, вул параўнання робіць?
Ён адказвае за працэс прыняцця 2 паказальнікаў, з і т у гэтым выпадку,
роду практычна паклаўшы руку на гэтыя 2 лісты,
і што ён павінен зрабіць нешта накшталт завесы падчас або цыкл,
і ён кажа гэтыя ж самае? Калі гэта так, яна рухаецца пальцаў ці паказальнікаў наперад.
Гэта тыя ж, гэта тое ж самае, гэта тое ж самае,
гэта тое ж самае, гэта тое ж самае? І ох, я ў канцы радка на абодвух з і т.
Я не знайшоў ніякіх супярэчнасцяў. Так, гэтыя радкі аднолькавыя.
А што значыць вул параўнаць вяртання, калі 2 радкі тыя ж, па-відаць? Zero.
Такім чынам, 0 добрая ў гэтым выпадку, таму што калі ён вяртае -1 або +1,
гэта азначае, што проста адбываецца паўстаць перад т у алфавітным парадку або пасля т.
І чаму б, што б карысна мець функцыю, якая кажа вам, якія радкі папярэднічае
або пасля таго, як у слоўніку?
[Студэнт] Пошук. >> Пошуку і сартавання.
>> Так што вы можаце рабіць рэчы, як двайковы пошук або пузырьковый сартавання і сартавання зліццём
дзе вы павінны параўнаць рэчы.
Да гэтага часу мы накшталт скараціць некаторыя куты і казалі толькі пра сартаванні
ў кантэксце нумары, таму што гэта лёгка і прыемна пагаварыць,
але можна, вядома, параўноўваць радкі, яблык і банан,
таму што, калі яблык, як вядома, прыходзяць да банана, аналагічна,
Вы можаце перамяшчацца па ўсім радкоў у памяці так жа, як Роб зрабіў з сартавання зліццём ў відэа
і мы зрабілі тут, на сцэне з выбарам сартавання, сартавання устаўкай, і пузырьковый сартавання.
Дык дзе ж яшчэ мы можам прыняць гэта? Давайце паспрабуем гэта.
Давайце роду забываць, што ўрок на хвіліну і паспрабуйце зараз і скапіяваць 1.c зрабіць наступнае.
У радку 21 Я кажу тое, друку,
Затым я атрымліваю радок ад карыстальніка,
Затым я правяраю гэта.
Мы яшчэ не атрымалі ў гэтай звычцы няма, але давайце цяпер зрабіць гэта.
Давайце на самай справе адхіліце гэты пласт. Гэта сапраўды сімвал *. Гэты хлопец сапраўды сімвал *.
Такім чынам, што ж значыць быць праверка, калі з == NULL?
Аказваецца, што пры выкліку функцыі, як GetString
ці ўвогуле проста спытаць кампутара, каб даць вам некаторы колькасць памяці,
нешта можа пайсці не так.
Вы маглі б быць вар'ятам, і папрасіць кампутар на тэрабайт памяці
, Просячы трыльёнаў байт памяці, якія проста не існуюць у кампутары,
але GetString і іншыя функцыі трэба нейкім чынам крычаць на вас
калі вы прасілі занадта шмат.
І тое, як GetString робіць гэта, калі вы папрасілі больш памяці
, Чым маецца на кампутары, нават калі гэта супер, супер нізкай верагоднасці
таму што ніхто з нас не збіраецца ўводзіць трлн знакаў, а затым націсніце Enter,
але нізкая верагоднасць хоць гэта можа быць, я ўсё яшчэ хачу, каб праверыць яго на ўсялякі выпадак,
і спецыяльнае значэнне, якое GetString, адказ, і іншыя функцыі вяртаецца
калі нешта пайшло не з'яўляецца NULL загалоўнымі літарамі.
>> А што такое NULL? NULL проста так здараецца ўяўляюць сабой паказальнік. Гэта 0 адрас памяці.
Свет вырашыў, што адвольна, калі гэта памяць майго кампутара - вы ведаеце, што? -
мы збіраемся, каб скрасці толькі 1 байт памяці кожнага кампутара, і гэта становішча 0.
Мы збіраемся даць яму мянушку NULL, і мы збіраемся абяцаць
што мы ніколі не будуць ставіць рэальныя дадзеныя ёсць
таму што мы проста адвольна трэба адмысловае значэнне 0, інакш NULL,
так што мы можам крычаць на карыстальнікаў, калі нешта пойдзе не так.
У адваротным выпадку вы можаце не ведаць зусім 0 азначае, пакласці нешта тут
ці гэта значыць нешта пайшло не так?
Мы павінны ўсё пагадзіцца, што NULL нічога сродкаў была вернутая,
няма фактычнага адрасы былі вернутыя.
Цяпер, вось, я проста прыняўшы чалавечае маё з'ездзе я вяртаюся 1 ад асноўнай
калі нешта пойдзе не так.
Гэта таму, што вяртанне асноўнай канвенцыі ў тым, каб вяртаць 0, калі добра,
1 або іншае значэнне, калі дрэннае.
Але GetString і любая функцыя, якая займаецца ў памяць вяртае NULL, калі нешта ідзе дрэнна.
>> Добра. Таму, на жаль, радок 27, супер проста, хоць гэта, зусім не скапіяваць радок.
Чаму? У гэтым можна пераканацца наступным чынам.
Я сцвярджаючы, у радку 27 варта зрабіць копію з і т называючы яго.
Так што я не прашу ў карыстальніка 2 радкі на гэты раз, я проста кажу значэнне ў ы
павінен быць змешчаны ў т а.
Так што цяпер проста каб прадэманстраваць, як зламаныя гэта, у радку 29 наперад за тое, што я раблю?
Першы я правяраю, калі даўжыня т больш, чым 0.
Там нейкая радок там. Карыстальнік увёў нешта цалі
Што такое лінія 32 робяць, па-відаць?
[Неразборліва адказ студэнта] >> праве. Вы можаце віды вывесці яго з таго, што я сказаў, што гэта робіць.
Але тэхнічна, тое, што гэта робіць? T [0] ўяўляе тое, што?
[Студэнт] характар ​​нулявы. >> [Малая] характар ​​нулявы.
Або, што больш чалавечага тыпу, першы знак у т, што б гэта, H, можа быць, у гэтым выпадку.
І ToUpper робіць тое, што ён кажа. Ён капитализирует нулявога сімвала т, і гэта мяняе яго.
Такім чынам, гэта азначае ўзяць на нулявым характарам т, зрабіць яе верхні рэгістр,
і паклаў яго назад у тым жа месцы.
Так што, калі я тыпу прывітанне ў ніжнім рэгістры, гэта павінна змяніць малыя ч да сталіцы H.
Але праблема ў тым, што ў радках 35 і 36, што я збіраюся зрабіць, гэта раздрукаваць для нас з і т.
А што вашы здагадкі?
Што я на самой справе адбываецца, каб убачыць, калі я набраў у прывітанне ў ніжнім рэгістры?
Што будзе надрукавана? >> [Неразборліва адказ студэнта] >> Што гэта такое?
[Студэнт] Big H, а астатнія маленькія. >> Вялікага H і астатнія невялікія, для якіх, з або т?
[Студэнт], і іншае. >> Іншая. Менавіта так. Такім чынам, давайце паглядзім, што адбываецца тут.
>> Дазвольце мне ісці далей і сабраць гэта. Гэта copy1, так што copy1. Добра.
Павялічыць маштаб Дазвольце мне ісці наперад і працаваць copy1, Enter Сказаць што-небудзь: прывітанне ў ніжнім рэгістры.
Гэта капитализируются копію, але ён, відавочна, капитализируются арыгінальныя, а таксама,
таму што тое, што зараз адбываецца ў гэтай гісторыі?
У радку 27 я на самой справе не здаецца, капіяванне радкі,
але нават калі вы, магчыма, інтуітыўна спадзявалася, што будзе так,
калі вы думаеце аб гэтай карціне, што на самай справе я зрабіў?
Палова карціна тая ж.
Так што давайце адкат ў часе, так што т яшчэ не існуе ў гісторыі.
S можа існаваць у гісторыі, але давайце ніжні прывітанне ў гэты раз.
Такім чынам, дазвольце мне выправіць тое, што я на самой справе ўвялі цалі
У гэтым выпадку тут мы маем ч-е-л-л-о.
Мы будзем маляваць яго як паслядоўнасць сімвалаў, паклаў раздзяляльныя лініі тут, і мая \ 0.
Так што гэта, дзе мы знаходзімся, як толькі лінія ад 1 да 24-иш, плюс-мінус, выканалі.
Гэта фотаздымак маёй памяці.
Калі я дабіраюся да лініі 27, што адбываецца?
Як і раней, я атрымліваю паказальнік, які я намалюю, як гэтую плошчу.
Гэта называецца тон. І тое, што яго значэнне па змаўчанні? Хто ведае? Некаторыя смецця значэнне.
>> Так што я буду абстрактным, што далёка, як знак пытання.
І як толькі правы бок лініі 27 выконвае, што я пакласці ўнутр т?
Тое ж самае, што знаходзіцца ў с.
Таму, калі мы на імгненне выдаліць гэтую абстракцыю, паказаным стрэлкай, і мы кажам,
О, гэта памяць адрас загрузкі 123, калі вы кажаце т атрымлівае з, кропка з коскі,
Вы літаральна пакласці 123 тут.
Цяпер, калі мы неяк спрасьціць наш свет зноў з фотаздымкамі,
тое, што вы сапраўды зрабілі проста дадаецца яшчэ адну стралу ў свой свет
які паказвае с т ў дакладна такой жа радок.
Таму, калі ў радку 31 і 32 я на самой справе ісці аб змене т [0]
што T [0] па-відаць сінонімам зараз? з [0]
Так што ўсё, што адбываецца.
І хоць гэты від адчувае сябе крыху нізкім узроўні і таемныя
і такога роду пачуццё, што, магчыма, інтуітыўна гэта павінна было б проста працаваў -
Я зрабіў копіі раней, і ён проста працаваў -
калі вы на самой справе думаеце пра тое, што радок на самай справе, гэта сімвал *.
Ну, што гэта такое? Гэта адрас некаторых характару.
Тады, магчыма, мае сэнс, калі вы спрабуеце зрабіць нешта
Супер здавалася б, просты, як гэта, усё, што вы робіце, капіяванне адрасы памяці.
Вы на самой справе не робяць нічога з самой радка.
Так што нават калі вы паняцця не маеце, як бы вы вырашыць гэтую праблему ў кодзе,
высокім узроўні, канцэптуальна, што мы павінны зрабіць для таго, каб тая сапраўдная копія з, па-відаць?
Так. >> [Студэнт] даць яму новае месца? >> Менавіта так.
>> Мы павінны даць т новым месцы.
Нам трэба нейкім чынам стварыць свет, у якім мы атрымліваем новы кавалак памяці,
якія проста для яснасці я буду маляваць прама пад гэтым, але гэта не павінны быць там.
Але яна павінна быць таго ж памеру, так што я буду маляваць гэтыя вертыкальныя лініі ў тым жа месцы.
Гэта нармальна, калі гэта ўсё фігня на пачатковым этапе. Хто ведае, што там было?
Але крок 1 будзе трэба, дайце мне столькі памяці, колькі мне трэба
, Каб адпавядаць копію прывітанне, а затым высветліць, як скапіяваць ч тут, электронную тут,
л Тут і так далей.
Але гэта ўжо павінны адчуваць сябе крыху відавочная, нават калі некаторыя дэталі ўсё яшчэ абстрактна.
Каб скапіяваць гэты радок у гэтым, гэта проста цыкл або час цыклу
або тое, з чым вы сталі ўсё больш знаёмым.
Так давайце паспрабуем гэта. Адпусціце мяне ў copy2.c.
У copy2.c мы маем амаль тую ж праграму, за выключэннем лініі 27.
Гэта выглядае крыху складаным, але калі мы разбіць яго па частках,
левая бок тое ж самае.
Char * т стварае гэтую рэч у памяці, хоць і са знакам пытання
таму што мы паняцця не маем, што там па змаўчанні.
З правага боку мы цяпер ўвядзення новай функцыі, таНос,
на памяць вылучыць, дай мне памяці,
і ён, відавочна, бярэ, колькі аргументаў, колькі рэчаў у дужках?
Я пачуў нараканьні 1 і 2, але гэта ўсяго толькі 1.
Там няма коскі, якая азначае, што ёсць толькі 1 рэч у круглых дужках.
Хоць ёсць іншыя дужкі, дазвольце мне падкрэсліць
тое, што ўнутры самой знешняй дужкі, і менавіта гэта выраз:
(StrLen (ы) + 1) * SizeOf (Char).
Такім чынам, калі мы на самай справе думаю, што гэта да канца, гэта кажа мне даўжыні з.
Чаму я, праўда, дадаўшы 1 на даўжыні? >> [Неразборліва адказ студэнта]
Менавіта так. Нам трэба месца для гэтага хлопца ў хвост, шосты знак, які не мае сэнсу англійскай
але ёсць спецыяльныя праграмныя сэнс.
>> Так што нам трэба + 1 за гэта, таму StrLen вяртае чалавека чаканне даўжыні,
прывітанне ці 5, гэта не дае вам дадатковыя нулявога знака.
Так што я ўручную дадаць гэта з + 1.
І тады гэта, * памер (знак), мы не бачылі гэтага раней.
Гэта тэхнічна не з'яўляецца функцыяй.
Гэта спецыяльнае ключавое слова, якое проста кажа вам, што памер некаторых тыпаў дадзеных на кампутары
таму што ў рэчаіснасці, некаторыя з нас маюць 32-разрадных кампутарах.
У мяне даволі стары кампутар дома, і ён выкарыстоўвае толькі 32 біта для прадстаўлення паказальнікаў.
І таму, калі я зрабіў памер тыпу дадзеных, гэта можа быць 32 біт.
Але калі я выкарыстоўваю мой новы модны кампутар, я мог бы вярнуць значэнне 64 біт
нешта накшталт адрасу.
Такім чынам, у гэтым выпадку, проста, каб быць супер бяспечна, мы не збіраемся на цвёрдым нешта накшталт кода -
Ну, што памер знакаў у залежнасці ад таго, што мы гаварылі да гэтага часу?
Мы ў значнай ступені сказаў вусна, што гэта 1 байт, і, што вельмі шмат сапраўдных праз борт.
Але, зноў жа, здагадкі, як правіла, дрэнна.
Яны прыводзяць да памылкі ў праграмным забеспячэнні, калі людзі выкарыстоўваюць праграмнае забеспячэнне такім чынам, вы не маюць намер.
Так што давайце гэта абстрактнае, і прама гаварыць у больш агульным
Мне гэта трэба шмат участкаў памяці
і кожны кавалак памяці павінна быць эквівалентная памеры характару,
які на самай справе роўная 1 у гэтым выпадку, але гэта больш агульны спосаб напісання.
Такім чынам, калі слова прывітанне, колькі байт робіць таНос мабыць вылучыць на што-небудзь?
[Студэнт] Six. >> Шэсць. Роўна столькі, колькі мы маем знакі пытання на экране.
А потым зрабіць здагадку цяпер заснавана на ваша разуменне GetString
Што ж таНос, верагодна, вернуцца? >> [Студэнт] адрас.
Адрас які? З першага блока памяці.
>> Мы паняцця не маем, што там, таму што некаторыя іншыя функцыі
можна было б з дапамогай гэтай памяці раней.
Але таНос, як GetString вяртае адрас першых байта памяці
што ён вылучыў для вас.
Аднак тое, што яно не зрабіць, гэта запоўніць гэты прабел з нулявога сімвала зваротнай касой рысы
таму што аказваецца, можна выкарыстоўваць таНос вылучыць усё што заўгодна: цэлыя, радкі, масівы,
паплаўкі, студэнт структур.
Вы можаце выкарыстоўваць таНос цалкам у агульных рысах.
Ён не клапоціцца або павінны ведаць, што вы вылучэнне памяці для.
Таму было б саманадзейна таНос паставіць \ 0
У канцы кожнага блока памяці гэта дае вам
таму што гэта \ 0 рэч проста канвенцыю для радкоў.
Гэта не для цэлых лікаў, ён не выкарыстоўваецца для паплаўкоў, ён не выкарыстоўваецца для студэнтаў.
І так Гоча з таНос у тым, што цяжар цалкам на вас праграміст
ўспомніць, колькі байтаў вылучаюцца і не калі-небудзь выкарыстаць для цыклу
або пятлю, і прайсці міма мяжы блока памяці вы атрымалі.
Іншымі словамі, як толькі вы вылучыць памяць,
Вы не можаце спытаць аперацыйнай сістэмы, ой, дарэчы, наколькі вялікі кавалак памяці гэта было?
Гэта цалкам залежыць ад вас, каб памятаць, калі вы маеце патрэбу ў гэтым каштоўнасць.
>> Такім чынам, давайце паглядзім, як я прыступіць да выкарыстання гэтай памяці.
У радку 28 і 29, чаму я гэта раблю?
Толькі агульная праверка наяўнасці свядомасці.
Толькі ў выпадку, калі нешта пайшло не так, я прашу нейкі вар'ят аб'ём памяці
ці я так шмат працуе на кампутары, што там проста не хапае памяці,
нешта накшталт гэтага, я па крайняй меры хочаце праверыць на NULL.
У рэчаіснасці, большасць кампутараў дасць вам ілюзію, што ўсе праграмы
Можна выкарыстаць сукупнасць аператыўнай памяці,
але нават у гэтым выпадку, калі карыстальнік ўводзіць некаторыя вар'яты доўгую радок, можа быць, таму, што яны дрэннага хлопца
і яны на самой справе спрабуюць прывесці да збою праграмы або ўзламаць яго,
Вы хочаце, каб па крайняй меры праверыць вяртаецца значэнне таНос і ці будзе яна роўная нулю.
І калі гэта так, давайце проста кінуць прама зараз, таму што я не ведаю, што рабіць у гэтым выпадку.
Як скапіяваць радок? Там ёсць некалькі спосабаў зрабіць гэта.
Ёсць вул скапіяваць функцыі ў C, але гэта супер проста для нас, каб зрабіць гэта старамодным спосабам.
>> Перш за ўсё дазвольце мне высветліць, што даўжыня ы ёсць.
Я мог бы зрабіць гэта ў цыкле, але замест гэтага я проста паклаў яго тут для яснасці.
Такім чынам, п цяпер захоўвае даўжыню зыходнай радкі, па-відаць, 5.
Тады ў маёй цыклу я ітэрацыі ад 0 пра да п,
і на кожнай ітэрацыі я стаўлю з [я] ўнутры т [I].
Дык вось што я меў на ўвазе з маімі 2-ма пальцамі, паказваючы на ​​радкоў да.
Як гэта цыкл ітэрацыі, як гэта, я збіраюся быць капіявання г у тут,
е ў тут, я тут, таму што ў гэта з, гэта т.
І тады, нарэшце, у радку 35, чаму я гэта раблю?
Мне трэба, каб пераканацца, што я ў канчатковым радок тон.
І я зрабіў гэта такім чынам, каб быць супер відавочным.
Але прапаную, хтосьці, калі б вы маглі, розных спосабаў зрабіць гэта.
Я сапраўды не патрэбна радок 35. Там яшчэ адзін спосаб зрабіць гэта.
Так. >> [Неразборліва адказ студэнта] >> Скажы гэта гучней.
[Студэнт] менш або роўна. >> Менавіта так.
Мы маглі б проста сказаць, менш ці роўна N, якая ў цэлым была дрэннай
таму што амаль заўсёды, калі мы ідзем у роўнай рэчы мы разлічваем
мы ідзем 1 крок занадта далёка.
Але памятайце, колькі байтаў ці мы вылучыць?
Мы вылучылі з StrLen с, таму 5 + 1 на агульную суму 6.
Так што ў гэтым выпадку мы маглі б зрабіць нешта накшталт гэтага
так што мы капіявання не толькі прывітанне, але і \ 0 у самым канцы.
Акрамя таго, мы маглі б выкарыстоўваць функцыю вул копія, зЬгсру,
але гэта не было б амаль гэтак жа весела.
Але гэта ўсё, што ён робіць пад капотам.
Тады, нарэшце, мы робім тое ж самае, што і раней.
Я капіталізаваць т, а затым я сцвярджаю, што арыгінальная выглядае наступным чынам і копія выглядае так.
Так давайце паспрабуем гэта цяпер. Адпусці мяне тут. Зрабіць copy2. Мы будзем павялічваць і запусціць copy2.
Я збіраюся ўвесці прывітанне ў ніжнім рэгістры, ды і я атрымліваю ніжні прывітанне, як арыгінал
але капітал Добры дзень для капіявання.
Але я не зрабіў толькі пакуль. Мне трэба зрабіць 1 апошняя рэч тут.
46 і 47 выразна вызваляючы аператыўную памяць, але што гэта на самай справе азначае?
Што я раблю, як ты думаеш, патэлефанаваўшы па тэлефоне лініі 46 і лініі 47?
Якія наступствы гэта мае? Так.
[Неразборліва адказ студэнта] >> Менавіта так.
>> Вы проста кажаце аперацыйнай сістэмы, прывітанне, дзякуй за гэтую памяць.
Цяпер вы можаце выкарыстоўваць яго для кагосьці яшчэ.
А вось выдатны прыклад смецце значэння.
Я толькі што выкарыстаў гэтую памяць, каб запісаць слова прывітанне ў 2 месцах,
тут, тут, тут, і тут.
Такім чынам, гэта ч-е-л-л-о-\ 0.
Але тады я называю лініяй 46 і лініяй 47, і вы ведаеце, што там адбываецца, з пункту гледжання карціна?
На самай справе, пачакайце, гэтая карціна старога.
Як толькі мы зрабіць копію, гэты хлопец на самай справе паказвае тут,
так што давайце выдаліць лічбы і проста абстрагавацца ад, як нашы стрэлкі зноў.
Што адбываецца ў гэтай карціне, калі я тэлефаную бясплатна?
[Неразборліва адказ студэнта] >> Ня цотнымі.
Калі я пазваню бясплатна на з і т - свайго роду пытанне з падвохам - гэта карціна не мяняецца на ўсіх
таму, што выклік і выклік с т проста кажа аперацыйнай сістэме,
эй, вы можаце выкарыстоўваць гэтую памяць зноў, але гэта не мяняе гэтага да нуля
ці адмысловымі знакамі, гэта не змяніць,
гэта не мяняе ч або электроннай або л або л або высновы ў любым месцы ні з чым.
З пункту гледжання карціну, як толькі Вы тэлефануеце бясплатна, нічога не мяняецца.
І ў гэтым заключаецца паходжанне смецця значэння, таму што калі я потым у гэтай праграме
спытаеце аперацыйнай сістэмы для дадатковай памяці з GetString або таНос ці нешта накшталт таго
і аперацыйная сістэма кажа, вядома, у мяне ёсць 12 байт памяці толькі вызвалілі,
выкарыстоўваць іх, што вы збіраецеся быць перададзены?
Вы збіраецеся быць перададзена частка памяці, што мы звычайна выкарыстоўваюць
з пытальнікамі, але тое, што гэтыя знакі пытання?
Яны, аказваецца, ч-е-л-л-о, ч-е-л-л-о.
Гэта нашы новыя значэння смеццем, як толькі вы вызваліць гэтую памяць.
>> Там у рэальным свеце імплікацыі тут.
Гэта адбываецца, рабіць з аператыўнай памяццю, але вашы кампутары
на самай справе зрабіць тое ж самае з дыска.
Мы пагаворым пра гэта, у прыватнасці, з будучыняй пастаўленай задачы, якая факусуюць на судовай экспертызы.
Але тое, што адбываецца на самай справе калі ў вас ёсць некаторыя адчувальныя фінансавыя файл на працоўным стале
ці некаторыя адрывістыя JPEG, і вы перацягнеце яго ў смецце,
што адбываецца, калі вы перацягнеце яго ў смеццевае вядро ці кошык?
Вы ведалі, што я кажу. [Смех]
Што адбываецца, калі вы выцягнулі, што доказы ў кашы або смеццевае вядро?
[Неразборліва адказ студэнта]
Ну, так што асцярожней. Што адбываецца, калі вы гэта робіце?
Кароткі адказ: нічога, дакладна?
Эскізныя або адчувальнай файл па-ранейшаму проста сядзеў там дзесьці на вашым цвёрдым дыску.
Большасць з нас хоць бы навучыліся на горкім вопыце, што вам трэба, каб ачысціць ваш смецце
або кошыка на самай справе выдалення файлаў.
І на самай справе, калі вы пстрыкніце правай кнопкай мышы або пстрыкніце на кіраванне вашым смеццевае вядро
або абярыце Файл, Empty Trash або любы іншы
і вы на самой справе ачысціць смеццевы кошык або кошыка, што на самой справе адбываецца, то ў гэтай карціне?
Больш нічога. Так што нічога на самай справе адбываецца на дыску.
>> І калі мы проста часова адцягнуцца і пісаць - I'll проста выкарыстоўваць заднюю гэтага.
Так што цяпер гісторыя змяняецца ад RAM, які з'яўляецца, дзе існуюць праграмы
у той час як вы працуеце іх, на дыску, які з'яўляецца, дзе яны захоўваюцца доўгатэрміновыя
нават тады, калі ўлада сыходзіць, на дадзены момант - і мы вернемся да гэтага ў будучыні -
давайце проста рабіць выгляд, што гэта ўяўляе сабой жорсткі дыск ўнутры кампутара
таму што яшчэ ў той дзень яны прывыклі быць круглымі дыскамі, гэтак жа, як дыскеты.
Так што калі ў вас ёсць некаторыя адчувальныя файлаў Excel, ён можа ўзяць на сябе гэтую частку памяці
на дыску вашага кампутара, і я проста маляванне ж адвольнага 1 і 0.
Калі вы перацягнуць файл так, каб ваша смеццевае вядро ці каша,
літаральна нічога не адбываецца таму, што кампаніі Apple і Microsoft толькі што вырашылі
смеццевае вядро і кошыкі самай справе гэта проста часовыя рамкі.
Можа быць, у рэшце рэшт АС будзе ачысціць яго для вас, але, як правіла, ён нічога не робіць,
па крайняй меры, да таго часу, пакуль вы сапраўды мала месца.
>> Тым не менш, калі вы ідзяце ў пустыя смецце або пустыя кошыка,
Аналагічна, нічога не адбываецца ў гэтай карціне.
Усё, што адбываецца ў іншым месцы на вашым кампутары, ёсць свайго роду табліцы.
Гэта накшталт як маленькая шпаргалка, якая кажа, што, скажам, resume.doc,
так што ваша рэзюмэ ў файл Microsoft Word жылі на месцы 123 на цвёрдым дыску,
не ў памяці, а не ў памяці, а на цвёрдым дыску,
і вашым адрывачным жыцця JPEG на 456, і ваш файл Excel жыве на 789 ці дзе заўгодна.
Калі вы выдаляеце файлы на самай справе апаражнення кошыка або кошыка,
гэтая карціна не мяняецца. 0 і 1 на цвёрдым дыску нікуды не хаджу.
Але гэтая табліца, гэтая маленькая база дадзеных гатункаў, змяняецца.
Пры выдаленні вашага рэзюмэ, гэта як калі б файл выдаляецца, у пэўным сэнсе,
але кампутар не будзе забываць, дзе гэтая штука жыве на вашым цвёрдым дыску.
0 і 1, якія складаюць ваша рэзюмэ або любы з гэтых іншых файлаў застаюцца некранутымі.
>> Так што калі вы зрабілі гэта выпадкова, яшчэ ёсць ненулявое верагоднасць
што вы можаце аднавіць дадзеныя з дапамогай Нортан Утыліты і некаторыя камерцыйныя праграмы
чые мэты ў жыцці, каб знайсці 0 і 1, якія накшталт сіроты,
забыліся тут, але пакінуў тут, так што вы можаце атрымаць вашыя дадзеныя назад.
Ці судовых следчых паліцыі або ФБР будзе на самой справе ўзяць жорсткі дыск
а на самай справе шукаць ўзоры з 0 і 1, якія выглядаюць як JPEG, выглядаюць як файлы Excel,
і аднавіць іх такім чынам, нават калі кампутар забылася іх там.
Таму адзіны спосаб сапраўды выдаліць дадзеныя, як мы будзем абмяркоўваць у будучыні,
гэта, каб вычысціць або сцерці файл ці цвёрды дыск -
Вы не можаце рэальна пазбавіцца ад 0 і 1
таму што інакш вы б пачаць з гігабайтны жорсткі дыск
і вы ў канчатковым выніку з мегабайта жорсткага дыска, калі вы ўвесь час былі выдалення,
літаральна, 0 і 1.
Такім чынам, што б вы зрабілі, калі б вы сапраўды хацелі, каб замесці сляды
і асноўнай праблемай з'яўляецца тое, што яшчэ ёсць 0 і 1 на дыску?
Я бачу, хтосьці жэстыкулюючы, што вы фізічна зламаць прылада. Гэта будзе працаваць.
[Смяецца] Але калі гэта свайго роду дарагое рашэнне, што было б больш разумным?
Так. >> [Студэнт] перапісаць іх. >> Перазапісаць іх ці што? >> [Студэнт] Іншыя дадзеныя.
Іншыя дадзеныя. Вы можаце проста перазапісаць дыск з 0s і 1s ці ўсё 0s, усё 1s.
>> І гэта сапраўды тое, што некаторыя праграмы робіць.
Вы можаце купіць праграмнае забеспячэнне або нават атрымаць бясплатнае праграмнае забеспячэнне,
і нават убудаваную ў Mac OS ў гэтыя дні, у меншай ступені ў Windows,
з'яўляецца здольнасць надзейна сціраць.
На самай справе, калі вы хочаце, каб усе бягуць дамоў сёння, калі ў вас ёсць Mac і зрабіць гэта,
калі ў вас ёсць некаторыя рэчы ў вашай смеццевае вядро, вы можаце зрабіць Бяспека Empty Trash,
які робіць менавіта гэта.
Замест таго каб проста сцерці файлы тут, яна не сцірае 0 і 1 тут,
хутчэй, ён проста мяняе іх, напрыклад, на 0 і кропка, кропка, кропка.
Таму адной з вашых будучых psets на самай справе будзе наўмысна аднаўлення дадзеных -
фатаграфіі, якія мы ўзялі людзей, месцаў і рэчаў на тэрыторыі кампуса
, Для якога мы будзем рабіць судова малюнак карты памяці лічбавай камеры,
які з'яўляецца сапраўды такі жа ідэяй - і вы будзеце мець, каб быць аспрэчаныя на самай справе знайсці
мадэляў, якія ўяўляюць сабой выявы ў фармаце JPEG на жорсткі дыск,
гэтак жа, як, што былы студэнт, ліст, якое я прачытаў некалькі тыдняў таму зрабіў
аднавіць фатаграфіі сваёй сястры.
Чаму б нам не ўзяць 5-хвілінны перапынак тут, і мы перагрупавацца больш на памяць.
Дык вось дзе ўсё становіцца трохі галюцынагенных, але гэта вельмі магутны крок
да разумення гэтага ўсё больш.
Вось праграма пад назвай pointers.c.
Ён з'яўляецца адным з узораў кода сёння.
Звярніце ўвагу, што ў першыя некалькі радкоў, з 19 па 22, усё, што мы робім нешта накшталт GetString
і вяртанне адрасы, захоўванне ў с.
У далейшым для PSET нават 3, калі вы хочаце, але PSET 4 і на
дзе вы можаце пачаць прымаць гэтыя навучальныя колаў ад сябе,
няма ніякіх прычын рабіць выгляд, што радкі існуе.
Гэта, вядома, добра, каб проста пачаць казаць сімвал *.
>> Як у баку, у онлайн-даведніках і кнігах вы можаце часта бачыць на зорачку побач з пераменнай.
Вы нават можаце бачыць прастору вакол абодва бакі ад яго.
Усе гэтыя функцыянальна правільна.
Цяпер, аднак, мы будзем стандартаваць гэты падыход, каб зрабіць Super Clear
, Што знак *, як кажуць паказальнік на знак.
Гэта тып дадзеных.
А затым імя зменнай з у гэтым выпадку.
Такім чынам, мы атрымалі радок, і мы назвалі яе с.
А потым сюды, заўважылі, што я раблю на самай справе трохі хітрасці.
Гэта называецца арыфметыка паказальнікаў, якая з'яўляецца свайго роду супер проста.
Гэта проста азначае, складаць і адымаць нумары паказальнікаў.
Але гэта на самай справе працуе.
Гэтая праграма па-відаць друкуе 1 сімвал радкі з на лінію такім чынам, што канчатковы вынік -
Сапраўды гэтак жа мы можам сапсаваць, дзе гэта адбываецца, зрабіць паказальнікі, паказальнікі працаваць, дазвольце мне змяніць маштаб малюнка
Цяпер дазвольце мне тыпу ў нешта накшталт прывітанне і тып Enter
і ён друкуе 1 знака ў радку.
Да секунду назад, мы б зрабілі гэта з квадратнымі пазначэнне кранштэйна.
Мы б цыкл, і мы будзем рабіць Printf з [я], і мы будзем рабіць гэта зноў і зноў і зноў
з зваротнай касой рысай п ў канцы кожнага радка.
Але гэтая праграма адрозніваецца. Гэтая праграма выкарыстоўваецца, у літаральным сэнсе, арыфметыка.
Так што ж тут адбываецца?
Перш за ўсё, да гэтага цыкл выконвае нават тое, што, проста каб быць ясна, з'яўляецца на самой справе?
S ёсць? >> [Студэнт] адрас. >> Адрас.
>> І гэта адрас, у выпадку дабрыдзень, першы знак у тым, што слова, якое час.
Так што з значыць, у дадзеным канкрэтным прыкладзе, адрас гадзіну.
Дык што ж гэта значыць зрабіць з + я?
Ну, я пачынаецца з 0 у гэтым цыкл. Мы рабілі гэта шмат разоў.
Я маю намер ісці да даўжыні радка, мабыць.
Такім чынам, на першай ітэрацыі гэтага цыклу, я, відавочна, 0.
Такім чынам, гэты выраз гаварыў з + я - хутчэй, з +0--гэта, відавочна, толькі з.
Так што ж такое * з тут?
Цяпер мы выкарыстоўваем зорка ў некалькі іншы шлях.
Дазвольце мне ісці наперад і пазбавіцца ад т, таму што мы зрабілі гаворым аб т і копіі з.
Цяпер мы проста хочам, каб распавесці гісторыю з удзелам с.
І вось у гэты момант, пасля таго, як тып радкі, наш свет выглядае зусім як гэта было раней
за ўсё з захоўваннем адрас ч і ў больш агульным паказваючы на ​​радок прывітанне.
Калі я цяпер раблю такую ​​радок * (S + I), давайце паспрабуем гэта.
Так * (S + I). Дазвольце мне спрасціць гэта, таму што гэта 0, так што гэта * (S +0).
Ну, пачакай хвілінку. Спрашчэнне далей. Гэта * (с).
Ну, а цяпер дужках з'яўляюцца свайго роду дурным, так што цяпер давайце проста рабіць * с.
Такім чынам, у першай ітэрацыі гэтага цыклу, што лінія якая падкрэсліла, 26,
у значнай ступені эквівалентна друку гэтым.
Што такое тып дадзеных * з?
У гэтым кантэксце, таму што зорка апынецца побач з сябе,
але больш канкрэтна, таму што мы больш не абвясціўшы ёй,
Мы не ствараем зменную больш, няма ніякай згадкі знак * у радку 26,
няма ніякай згадкі ключавога слова радкі, мы проста з дапамогай зменнай с,
Аказваецца цяпер зорка мае некалькі іншы і, трэба прызнаць, блытаючы сэнс.
* Ы тут азначае перайсці па адрасе ў с і друку ўсе, што ёсць.
Такім чынам, з тут, * S ёсць - накшталт як жолабы і лесвіцы, прытрымлівайцеся за стрэлкай - тут.
Так што гэта * с.
>> Так што ж атрымлівае надрукаваны на першай ітэрацыі гэтага цыкла ў радку 26?
Я раздрукаваць% C, які з'яўляецца прататыпам для знака,
Затым \ п для новага радка. * (S + I), дзе я = 0 з'яўляецца менавіта гэта.
Так што знак трэба змясціць у% для C? H.
У наступнай ітэрацыі цыклу - можна, верагодна, убачыць, дзе гэта адбываецца -
Наступная ітэрацыя я, відавочна, 1, так што гэта азначае с +1,
і цяпер мне трэба дужкі, таму што цяпер зорка павінна сказаць
перайдзіце па адрасе памяці з +1.
Што такое S? Давайце вярнуцца ў мінулае і сказаць, што гэта стрэлка цяпер на самай справе не робяць нам ніякіх паслуг.
Давайце больш канкрэтна сказаць, што гэта захоўванні нумар 123
таму што ў пачатку гэтага радка Добры дзень, гэта адрас 123, гэта 124, і гэтак далей.
Такім чынам, на другі ітэрацыі, калі я кажу з +1, гэта, як кажуць 123 1,
інакш вядомая як 124, так што знак атрымлівае надрукаваны на другі ітэрацыі?
E на адрас памяці, 124.
Затым зноў +, 125, 126, 127, і гэтая пятля на шчасце спыняецца, перш чым мы атрымаем тут
таму што я выкарыстоўваю StrLen каб пераканацца, што я не лічыць занадта высокай.
Так што гэта таксама яго.
Зноў жа, гэта як калі б мы зрабілі тыдзень таму.
Дазвольце мне напісаць яго на радок ніжэй, хоць мы не хочам, каб зрабіць абодва.
Гэта ідэнтычна цяпер да гэтага.
>> Таму, нават калі з сабой радок, як мы называем яго на тыдні, а на самай справе сімвал *.
Таму калі мы хочам, каб быць супер анал, гэта сапраўды правільны напісаць спецыфіка
на г-м месцы з дапамогай гэтых лікавых адрасоў і гэтая зорка аператара,
але, шчыра кажучы, гэта проста так значна чысцей. Такім чынам, гэта не дрэнна.
Няма прычын, каб перастаць рабіць лінію 27 тут, але 26 з'яўляецца функцыянальна тое ж самае,
і гэта функцыянальна той жа роўна прычын таго, што мы абмяркоўвалі да гэтага часу.
І, нарэшце, 29 проста добрая практыка.
Выклік бясплатна з азначае, што цяпер вы даяце задні памяці, якая дала вам GetString
таму што зноў, як я ўжо казаў панядзелак, GetString тыдні
ўкараняе памылка ў кодзе.
Ваш код тыдняў была ўцечка памяці
якіх вы пыталіся GetString для памяці, але вы ніколі не даваў яго назад.
І гэта была свядома абраная намі педагагічна
таму што гэта проста занадта шмат, каб думаць пра пачатак.
Але цяпер нам трэба больш сіметрыі.
Калі вы спытаеце кампутар для памяці, як і ў выпадку з GetString,
як і ў выпадку відаць таНос,
Вы павінны зараз PSET 4 і ў наступных таксама бясплатна любой такой памяці.
Заўважце, што гэта адрозніваецца ад таго, Int N.
Вам не трэба, каб вызваліць гэта таму, што вы не тэлефануеце GetString
і вы не тэлефануеце таНос.
>> І нават калі вы называлі GetInt, як мы бачым у канчатковым выніку,
GetInt не вылучыць памяць для вас, таму што вы можаце абыйсці цэлых лікаў
і плавае і літары так, як мы рабілі на працягу тыдня.
Струны, аднак, з'яўляюцца асаблівымі, таму што на самой справе яны канкатэнацыі некалькіх сімвалаў.
Такім чынам, яны проста адрозніваюцца ад знакаў і паплаўкі і цэлымі і таму падобнае.
Але мы вернемся да гэтага ў хуткім часе.
Любыя пытанні, то на гэтым пачатку паказальнікі? Так.
[Неразборліва пытанне студэнта]
Ах, вельмі добры пытанне.
Адна з нямногіх рэчаў, C самой справе робіць для вас, што зручна,
яно высвятляе, для вас тое, што памер тыпу дадзеных
, А затым робіць такі множання для вас.
Гэта не мае ніякага значэння ў выпадку знакаў, таму што амаль заўсёды сімвал займае 1 байт,
так што гэта проста працуе.
Але дзеля абмеркавання, калі б вы былі на самай справе друкаваць цэлыя
і вы спрабавалі раздрукаваць некаторыя значэння з, што паказвала на цэлы лік,
Вам таксама не трэба будзе рабіць + 4 * я толькі таму, што Int складае 4 байта.
Арыфметыка з паказальнікамі азначае, што C і кампілятар рабіць усё, што матэматыка для вас.
Усё, што вы павінны клапаціцца аб тым, падлік роду ў чалавечым сэнсе. Так.
[Студэнт] Калі вы аб'яўляеце радкі ўнутры цыклу, вы павінны вызваліць яго пазней?
Добры пытанне.
>> Калі вы абвясцілі радкі ўнутры цыклу, вы павінны вызваліць яго пазней?
Вам трэба ўсяго толькі свабоднай памяццю, што вы вылучаеце з GetString або з таНос.
Так што калі вы толькі што сказалі нешта накшталт - дазвольце мне фігурныя дужкі цяпер так увесь код звязаныя паміж сабой.
Калі вы зрабілі нешта, хоць buggily, як гэтая, сімвал * T = S,
Вам не трэба, каб бясплатна т т таму, што не звязана з якім-небудзь згадваннем таНос або GetString.
Калі, наадварот, вы зрабілі гэта, GetString, то так, вам трэба будзе бясплатным тон.
І на самай справе, ваш адзіны шанец зрабіць гэта цяпер ўнутры гэтай завесы, па тым жа пытанні за рамкі
, Якія мы абмяркоўвалі ў мінулым.
У адваротным выпадку вы будзеце выдзялення памяці, вылучэнне памяці, вылучэнне памяці,
і ў канцы праграмы, таму што вы знаходзіцеся за межамі гэтага цыклу,
т не існуе, але вы ніколі не казалі аперацыйнай сістэмы
што вам не трэба, што памяць больш.
І неўзабаве, да PSET 4 або 5 мы узброіць вас з праграмай пад назвай Valgrind,
якія блізкія па духу GDB у тым, што ён атрымаў свайго роду таемнае інтэрфейс,
але яго мэта ў жыцці, каб дапамагчы вам.
І Valgrind гэта праграма, якая ў будучыні будзе шукаць вашыя праграмы
шукаць уцечкі памяці, ці то ад GetString або таНос,
якія мы пачнем, выкарыстоўваючы ўсе больш, як мы спыніць выкарыстанне CS50 бібліятэцы столькі ж.
Мы, нарэшце, зараз ёсць свайго роду слоўніка і свайго роду ментальнай мадэлі ў тэорыі
з якім для вырашэння гэтай зламанай праграме.
>> Так што ў гэтым зламанай праграмы, своп працуе ўсярэдзіне падпампоўкі,
але ён ніколі не працаваў у асноўным таму, што асноўная прайшло ў х і у, нагадаем,
і тыя былі прынятыя ў каштоўнасцямі, так бы мовіць.
Копіі з іх былі дадзены памяняць.
Да канца падпампоўкі, і б сапраўды былі абменены,
але, вядома, х і у, як мы абмяркоўвалі ў панядзелак, не было.
Таму я прапаную ў зялёным тут, што гэта на самай справе рашэнне тут.
А на самай справе, дазвольце мне рухацца маёй зоркі проста быць паслядоўным
хоць, зноў жа, функцыянальна гэта не мае значэння.
У будучыні тыдняў мы будзем тлумачыць, калі і чаму гэта мае значэнне.
Такім чынам, у зялёным зараз з'яўляецца рашэннем.
Шчыра кажучы, гэта выглядае нашмат брудней, таму што ў мяне ёсць усе гэтыя зоркі.
Дазвольце мне адзначыць адну рэч.
Верхняя радок тут, дзе ён кажа Int * і Int * б
прынцыпова робіць тое ж самае, як гэта было заўсёды.
Ён заяўляе, 2 аргументы або параметры памяняць,
першым з якіх з'яўляецца Int паказальніка называецца,
другі з якіх з'яўляецца Int паказальніка называецца б.
Адзінае, што новага на дадзены момант з'яўляецца тое, што там ёсць зоркі.
>> Што гэта значыць? Ня INT, каб не з'яўляецца Int.
Гэта адрас Int і б гэта адрас іншага Int.
Тут, унізе, гэта дзе я прызнаю C збівае з толку.
Цяпер мы выкарыстоўваем зоркай, але ён мае рознае значэнне ў гэтым кантэксце.
Таму што мы не аб'яўляем паказальнікі, як мы тут,
Тут мы разыменования рэчы.
Такім чынам, тэхнічна, зоркі ў гэтым кантэксце першай, другой і трэцяй лініі ўнутры своп
з'яўляецца аператарам разыменования, які проста азначае, што ісці туды.
Гэтак жа, як мой палец рушыў услед за стрэлкамі гадзін,
* Сродкі ідуць на гэты адрас і знайсці мяне Int, што ёсць.
* У азначае, перайсці па адрасе і перадаць мне, што там.
Так што давайце перамалёваць малюнак з панядзелка зараз выкарыстоўваецца стэк кадраў,
ніжні, адзін з якіх будзе асноўным,
верхняя, адна з якіх будзе своп,
так што наш свет выглядае, як панядзелак, як гэта.
Вось кавалак памяці, што асноўнай збіраецца выкарыстоўваць.
>> Нагадаем, з панядзелка, што праграма проста было 2 зменных,
1 завецца х і адна называецца у, і я паклаў ліку 1 і 2.
Цяпер, калі я тэлефаную памяняць, як я зрабіў у панядзелак,
Раней, калі я выкарыстаў чырвоную версію гэтай праграмы, якая выглядае так,
Я атрымаў 2 параметру, а, б, і што ж мы пішам тут і тут?
Толькі 1 і 2, літаральна капіюе х і у.
Сёння мы гэта змяніць.
Сёння замест перадачы ў цэлых а і б мы збіраемся перадаць у 2-адрасоў.
Гэтыя адрасы здарыцца, каб паказаць на цэлыя, але гэтыя адрасы не цэлымі сябе.
Яны адрасоў. Гэта як паштовы адрас.
Так што цяпер нам трэба проста даць сабе трохі больш падрабязна на экране.
Гэта мая памяць кампутара, як гэта было ўвесь дзень.
Цяпер нам трэба адвольнай схемы нумарацыі.
Так што давайце проста скажам, проста выпадкова, што гэта адрас памяці, 123, 124.
Давайце проста скажам, што гэта 125, гэта 126, і гэтак далей, але гэта зусім адвольнымі.
Нам проста трэба некаторы схемы нумарацыі ў маёй памяці.
Так што цяпер, калі я на самай справе праходзяць у х і у, я не збіраюся пераходзіць у х і ў;
Я збіраюся перайсці ў паштовы адрас, так бы мовіць, х і ў
так што тое, што атрымлівае захоўваецца тут і тут не 1 і 2,
Але калі вы можаце ўбачыць мае дробны тэкст, тое, што прайшло ў тут і тут?
[Неразборліва адказ студэнта] >> Менавіта так. 123 атрымлівае пакласці тут, і 124 атрымлівае пакласці тут.
>> Цяпер, таму што я выкарыстаў зорка ў гэтай самай першай радку шлях тут, на вяршыні,
мая праграма проста ведае, што 123 і 124, хоць яны, відавочна, цэлыя
што любы чалавек мог заўважыць, яны павінны быць інтэрпрэтаваныя як адрасы, лікавыя адрасу.
Яны не з'яўляюцца самі па сабе цэлымі, яны адрасоў,
і гэта таму, што я відавочна паставіў зоркі там.
Так што цяпер у маёй першай, другой і трэцяй лініі фактычнага кода, што тут адбываецца?
Давайце намалюем астатняй часткі карціны.
Tmp гэтак жа, як гэта было ў панядзелак. Нічога асаблівага TMP.
Гэта проста мясцовы 32 біт зменнай, так і ўнутры, што я мабыць захоўвання значэння *.
Цяпер, калі я толькі што сказаў, TMP =, што б я тут? >> [Студэнт] 123.
123. Але гэта не тое, што я раблю.
Я кажу TMP = *. Зорка сродкі ідуць туды.
Дык вось, 123. Як мне туды ісці? Бабінцам, што ёсць стрэлка.
Ну, так і ёсць, 1. Так што ж атрымлівае захоўваецца ў TMP, па-відаць? Проста 1.
Такім чынам, іншымі словамі, TMP з'яўляецца *, * сродкі ідуць на адрас, які з'яўляецца ў цяперашні час,
па-відаць, 123.
>> Ну, вось мы і на месцы 123, я бачу, № 1,
так што я збіраюся паставіць нумар 1 там.
Цяпер тое, што я раблю ў радку 2, * = * б?
Гэта адна крыху больш складана, таму што зараз гэта? Гэта 123.
Так што * гэта дзе? Там, дзе я быў раней. Так што ідзіце туды. Добра.
Цяпер, нарэшце, і, нарэшце, гэта пачне мець сэнс, спадзяюся,
* Б азначае, што ў б? 124. Так што мне трэба пайсці туды, што на 2.
Так што я стаўлю дзе?
2 ідзе ў тут, таму што * б * пераходзіць ст. Так што я буду рабіць.
І вы ўжо можаце бачыць, мабыць, што мы значна бліжэй
да вырашэння гэтай дурной, простая задача правільна ў першы раз
таму што цяпер у нас яшчэ ёсць успамін пра тое, што х быў,
у нас ёсць 2-х экземплярах, па агульным прызнанні, у,
але лінія 3 зараз кажа, * б.
Дык вось б. * У азначае пайсці туды. Дык дзе ж размяшчэнне 124?
Гэта мабыць тут. Такім чынам, што ж я тут? Відавочна, TMP.
Так што цяпер я гэта раблю. Так што ў мяне ёсць 1 і 2 тут тут.
І што цяпер пра ўсё гэта, 123, 124 і 1?
Як толькі своп вяртаецца, гэтая памяць так добра, як страцілі
таму што як толькі своп вяртаецца, аперацыйная сістэма
мае права выкарыстоўваць гэтую памяць у будучыні.
Толькі асноўнай памяці ў ніжняй гэтага так званага стэкам блукае нейкі час паблізу.
>> І вось мы, нарэшце, зараз рабочая версія.
Адпусціце мяне ў swap.c, і звярніце ўвагу на наступнае.
У верхняй частцы праграмы я змяніў мой прататып, каб быць Int * і * б Int.
Так што адзінае, што я змянілася, каб перайсці ад чырвонага, які быў дрэнны, на зялёны, і гэта добра,
гэта я дадаў гэтыя зоркі сёння.
Але тут, у самой памяняць мне прыйшлося скапіяваць, уставіць тое, што было толькі на слайдзе.
У мяне ёсць зорка тут, зорка тут - што адпавядае прататыпу -
і тады ўсе гэтыя рэчы зараз маюць зоркі, за выключэннем TMP
таму, што выкарыстанне часовых зменных, няма нічога новага.
Мне проста трэба часовае сховішча для унутр.
Такім чынам, нам не патрэбныя зоркі там.
Нам проста трэба зорцы, каб мы маглі перасекчы такога роду адвольныя мяжы
Паміж гэтымі 2 кадра ў памяці майго кампутара.
Але апошняе, што павінна змяніцца, і вы, магчыма, убачыў яго ўжо.
Якія іншыя лініі, відавочна, адрозніваецца цяпер? >> [Студэнт] & х.
>> Так, так што 25 з'яўляецца апошняй радку кода мне трэба змяніць, каб гэта працавала.
Тыдзень таму, і нават у панядзелак лініі 25 выглядала так, памяняйце месцамі х і у,
і гэта было проста зламаная, таму што калі вы кажаце свопу (х, у)
Вы даеце копіі х і ў памяняць, то ён робіць сваю справу,
але вы ніколі не змяняецца х і ў сябе.
Так што нават калі вы ніколі не бачылі гэты знак, перш чым з амперсанда ў кодзе,
проста ўзяць здагадка. Што рабіць амперсанда, па-відаць?
[Студэнт] прымае адрас. >> Прымае адрас.
Такім чынам, амперсанда кажа, дайце мне адрас х.
Хто ведае, дзе гэта? Гэта здараецца, 123. Мне ўсё роўна. Проста дайце мне адрас х.
І ў азначае даць мне адрас у.
І ў гэты момант гісторыя цалкам адпавядае з карцінай мы зрабілі хвіліну таму.
>> Такім чынам, я прызнаю, паказальнікі, вядома, для мяне, калі я ўпершыню пачаў Даведаўшыся пра гэта,
быў вызначана адным з самых цяжкіх рэчаў, каб абгарнуць свой розум вакол.
Але разумееце, тым больш, што мы працягваем гуляць з гэтымі рэчамі,
Калі вы разбіць яго на гэтыя супер просты выгляд інтэлектуальна нецікавыя праблемы
за ўсё рухаецца вакол нумара, адказ на шмат блытаніны з паказальнікамі
сапраўды можа быць атрымана з гэтых самых асноўных механікі.
Вось адрас. Ідзі туды з зоркай.
Ці наадварот, вось амперсанда. Высветліць, што адрас на самай справе.
Добра.
Дык дзе ж усё гэта памяць прыходзяць?
Мы намалявалі гэтую карціну некалькі разоў, і я трымаю перспектыўным, мы вернемся да яго,
але вось ўяўленне памяці кампутара
, Што крыху больш, чым нашы пазначаныя дошцы тут.
Тэкст у верхнім сегменце ўяўляе тое, што ў адносінах да вашай праграме?
[Неразборліва адказ студэнта] >> Прабачце? Скажыце яшчэ раз.
[Студэнт] Фактычнае праграмы. >> Фактычныя праграмай.
>> Такім чынам, 0 і 1, што вы сабралі пасля напісання кода C і затым запусціць Clang
і генерыруючых 0 і 1 канцах тым, што былі там хаваюцца ў памяці
таму што, калі вы двойчы пстрыкніце значок на вашым Mac ці PC
або выканайце каманду, як Марыё на ваша запрашэнне, ваша 0 і 1 з дыска
загружаюцца ў памяць, так што кампутар можа кіраваць імі
і выконваць іх хутчэй.
Так ініцыялізаваць дадзеныя і неинициализированные дадзеныя, мы не будзем шмат казаць пра тых,
але гэта толькі глабальныя зменныя.
Initialized азначае глабальныя зменныя, якія вы далі значэння;
неинициализированные азначае глабальныя зменныя, якія вы яшчэ не даюць значэння.
Тады ёсць гэтыя зменныя асяроддзі, якія я цалкам махнуць рукой на,
але яны ёсць, і што крамы рэчы, як імя карыстальніка
і іншага роду ніжні ўзровень падрабязнасці.
Але самыя сакавітыя кавалкі макет вашай памяці з'яўляецца тое, што называецца стэка і кучы.
Стэк зноў, каб было зразумела, гэта памяць, якая выкарыстоўваецца кожны раз, калі функцыі выклікаюцца,
кожны раз, калі ёсць лакальныя зменныя
а таксама пры наяўнасці параметраў, перадаюцца вакол.
Усё, што адбываецца ў стэку.
Куча мы не казалі пра гэта, але зрабіць здагадку, хто выкарыстоўвае кучу.
Проста іншы кавалак памяці.
Бывае, які можна зрабіць тут, на вяршыні, але гэта адвольнае маляўнічай канвенцыі.
Хто-відаць, выкарыстанне памяці з кучы тыдня?
Гэта тэхнічна вас, але ўскосна. >> [Студэнт] GetString.
GetString і таНос. Дык вось прынцыповая розніца.
>> Вы ведаеце, на працягу апошніх некалькіх тыдняў, што калі вам патрэбна памяць, проста абвясціць зменную.
Калі вам трэба шмат памяці, абвясціць масіў прама ўсярэдзіне вашай функцыі.
Але праблема мы захавалі сутыкнулася, калі вы аб'явіце зменныя лакальна ўнутры функцыі,
Як толькі функцыя вяртае значэнне, што адбываецца з памяццю і гэтыя зменныя?
Толькі накшталт гэта ўжо не ваш, ці не так? Ён проста знікае роду канцэптуальна.
Гэта ўсё яшчэ фізічна існуе, відавочна, але гэта ўжо не ваша права на выкарыстанне.
Відавочна, што гэта праблематычна, калі вы хочаце напісаць функцыі ў жыцці
што на самой справе вылучае памяць і не даюць яго назад.
Справа ў кропку: GetString мэты ў жыцці, паняцця не маюць загадзя
як вялікі з радка Я збіраюся ўвесці на клавіятуры,
але ён павінен быць у стане вылучыць памяць для захоўвання Давіда або прывітанне
ці цэлую артыкул пра тое, што карыстальнік, магчыма, увялі цалі
Так GetString выкарыстоўвае таНос.
Malloc таму неабходна выкарыстоўваць не стэк;
Замест гэтага, выкарыстоўваючы тое, што называецца кучай.
Там няма нічога іншае аб памяці. Гэта не хутчэй або павольней ці што-небудзь падобнае.
Гэта проста фізічна ў іншым месцы.
>> Але правіла, што памяць якая вылучаецца ў кучы
ніколі не будзе аднята ў вас, пакуль вы не патэлефануеце - зрабіць здагадку - бясплатна.
З іншага боку, любая памяць вы просіце ў стэк проста аб'яўленні масіва
або аб'яўлення зменнай, як мы рабілі на працягу тыдня,
, Што па змаўчанні заканчваецца ў стэку.
І гэта выдатна працуе 90% часу, а на тых рэдкіх выпадках
дзе вы хочаце вылучыць памяць, і трымаць яго вакол,
Затым вы павінны выкарыстоўваць функцыі, як таНос.
Ці мы выкарыстоўвалі функцыю, як GetString, які ў сваю чаргу выкарыстоўвае таНос.
Давайце паглядзім, дзе гэта можа зламаць, а затым зірнуць на Бинки.
Мы вернемся да гэтага ў будучыні.
Вось гэта супер простую праграму, якая ў першыя 2 радкі што робіць?
У ангельскай мове, то, што гэтыя першыя 2 радкі кода зрабіць ўнутры асноўнага?
[Неразборліва адказ студэнта]
Асцярожна. Гэта не дае мне адрас х ці ў.
[Студэнт] Дае паказальнікаў на цэлыя. >> Добра. Дайце мне 2 паказальнікаў на цэлыя лікі.
Іншымі словамі, дайце мне 2 участкаў памяці, што я трымаю чарцёж сёння,
хоць я сцёр яго цяпер, як квадраты.
Дайце мне 2 участкаў памяці, адна называецца х, адна называецца у -
Раней я называў іх з і т - а што гэта тып, што частка памяці?
Гэта будзе захоўваць адрас.
Гэта тыпу * Int.
>> Такім чынам, адрас Int ў канчатковым выніку жыць у х,
Адрас Int ў канчатковым выніку жыць у у,
але першапачаткова, што ўнутры х і у? Хто ведае? Смецце значэння.
Гэта не мае нічога агульнага з паказальнікамі.
Калі мы не паспелі нешта там, хто ведае, што на самой справе існуе?
Цяпер, х. Што тут адбываецца? Гэта законна, таму х з'яўляецца паказальнікам. Гэта Int *.
Такім чынам, гэта азначае, што я магу пакласці ў X ст адрас некаторых кавалак памяці.
Што таНос вярнуцца? Perfect, ён вяртае адрас,
адрас першых байта ў цэлы кавалак памяці.
Колькі байт гэта, відавочна вылучэнне, напрыклад, у халадзільніку?
Які памер Int? 4.
Калі вы ўспомніце тыдні 1, гэта не супер важна заўсёды памятаць, што,
але ў дадзеным выпадку гэта карысна ведаць, 4 байт.
Такім чынам, гэта вылучэнне ў кучы 4 байта
і ён вяртаўся ў адрас першых да мяне адвольна.
Цяпер, што х робіце?
* Х = 42, што робіць?
Калі ў гэты момант у гісторыі мы маем х, які выглядае, як гэта з некаторымі смецця значэнне,
гэта адразу ў некаторых смецця значэнне, цяпер у радку 3 Я выдзеліць 4 байт.
Гэтая карціна істотна выглядае наступным чынам.
Ці, больш дакладна, калі гэта адвольны адрас 123, гэта тое, што наша гісторыя выглядае цяпер.
* Х = 42 азначае цяпер, што? Гэта азначае, што пераход на адрас 123 і паклаў ліку 42 там.
Мне не трэба, каб зрабіць гэтыя радкі, таму што мы не робім радкоў.
>> Я толькі што напісаў гэта так, і толькі дзеля дэманстрацыі, у
42, унутр выгляд займае шмат месца, 4 байт.
Дык вось што там адбылося, але ёсць праблема.
* У = 13. Што адбудзецца тут?
Праблема ў тым, * у ў нашым спрошчаным свеце азначае толькі перайсці па адрасе у.
Што ў Y? Гэта нейкая фігня значэнне.
Такім чынам, давайце выкажам здагадку, што смецце значэнне 5551212, нешта вар'ят, як гэта.
* У сродкі ідуць на рашэнне 5551212.
Гэта ўсё роўна тут. Ён не існуе, напрыклад.
Такім чынам, у * атрымлівае 13 азначае, што я спрабую зрабіць тут 13. Яна не існуе.
Я перавысілі сегмент дошцы. Што я атрымаю?
Гэта загадкавае віне сегментацыі паведамленне, таму што я спрабую паставіць у памяці
значэння, як 13 ў месцы, якое не існуе.
Астатняя частка праграмы можа працаваць добра, але да гэтага моманту ён не робіць.
Так давайце паспрабуем распавесці гэтую гісторыю.
Мы вернемся да гэтага, калі мы казалі аб шестигр.
Давайце вернемся да гэтага і заключыць з гэтай рэччу, званай Бинки,
Нагадаем якой з'яўляецца прафесар Стэнфардскага седзячы ў сябе дома, гуляючы з Claymation,
каб распавесці гісторыю менавіта той жа праграмы.
Гэта ўсяго толькі каля 3 хвілін. Тут мы маем Бинки.
[Мужчынскі дынаміка на відэа] Гэй, Бинки, прачніся. Гэта час для паказальніка весела.
[Бинки] Што гэта? Даведацца пра паказальнікаў? О, сентыментальны!
[Мужчынскі дынамік] Ну, для пачатку, я думаю, мы будзем мець патрэбу ў некалькіх паказальнікаў.
>> [Бинки] Добра. Гэты код вылучае 2 паказальнікі, якія могуць паказваць на цэлыя лікі.
[Мужчынскі дынамік] Добра. Ну, я бачу 2 паказальнікаў, але яны, падобна, не паказваючы ні да чаго.
[Бинки] Гэта дакладна. Першапачаткова, паказальнікі не паказваюць ні да чаго.
Тое, што яны паказваюць называюць pointees, а іх стварэння з'яўляецца асобным крокам.
[Мужчынскі дынамік] Ах, так, так. Я ведаў, што. Pointees асобна.
Э-э, так як вы вылучыць pointee?
[Бинки] Добра. Гэты код стварае новы цэлае pointee, і гэтая частка мноства Х, каб паказаць на гэта.
[Мужчынскі дынамік] Гэй, гэта выглядае лепш.
Так што гэта нешта рабіць. >> [Бинки] Добра.
Я буду разыменовать х, каб захаваць нумар 42 у сваім pointee.
Для гэтага трука мне патрэбна мая чароўная палачка разнаймення.
[Мужчынскі дынамік] Ваша чароўная палачка разнаймення? Гэта вельмі добра.
[Бинки] Гэта тое, што код выглядае наступным чынам. Я проста наладзіць колькасць і ... [Замест яе зухаваты гук]
[Мужчынскі дынамік] Гэй, паглядзіце, там яна ідзе.
Так робяць разнаймення на х варта стрэлку, каб адкрыць яе pointee,
У гэтым выпадку для захоўвання 42 у там.
Гэй, паспрабуйце выкарыстоўваць яго, каб захаваць нумар 13 праз іншы паказальнік, у.
[Бинки] Добра. Я пайду сюды, каб у і атрымаем лік 13 створаны
, А затым ўзяць палачку разнаймення і проста ... [Гудучы гук] Ух ты!
[Мужчынскі дынамік] О, эй, гэта не працуе.
>> Скажам, Бинки, я не думаю, што ў разнаймення гэта добрая ідэя
таму што стварэнне pointee асобны крок
і я не думаю, што мы калі-небудзь рабілі гэта.
[Бинки] Хм, добры пытанне.
[Мужчынскі дынамік] Так. Мы вылучылі паказальнік у, але мы ніколі не ўсталюйце яго, каб паказаць на pointee.
[Бинки] Хм, вельмі назіральныя.
[Мужчынскі дынамік] Гэй, вы шукаеце там добра, Бинки.
Вы можаце гэта выправіць, так што ў паказвае на той жа pointee як х? >> [Бинки] Вядома.
Я буду выкарыстоўваць маю чароўную палачку паказальніка прызначэння.
[Мужчынскі дынамік], што будзе праблема, як раней?
[Бинки] Не, гэта не датычыцца pointees.
Гэта проста мяне адзін паказальнік, каб паказаць на тое ж самае іншым. [Замест яе зухаваты гук]
[Мужчынскі дынамік] О, я бачу. Цяпер у паказвае на тое ж месца, х.
Так што чакайце. Цяпер у фіксавана. Ён мае pointee.
Такім чынам, вы можаце паспрабаваць палачку разнаймення зноў адправіць на 13 старэй.
[Бинки] Ну, добра. Тут ідзе. [Замест яе зухаваты гук]
[Мужчынскі дынамік] Гэй, паглядзі на гэта. Цяпер разнаймення работ па у.
І таму, што паказальнікі абмену, што адна pointee, яны абодва бачаць 13.
[Бинки] Так, абмен. Усё роўна.
>> Такім чынам, мы збіраемся, каб памяняцца месцамі цяпер?
[Мужчынскі дынамік] О, глядзіце, мы па-за часам. >> [Бинки] Але -
[Мужчынскі дынамік] Толькі памятайце, 3 становішча паказальніка.
Нумар 1, базавая структура з'яўляецца тое, што ў вас ёсць паказальнік і ён паказвае да pointee.
Але паказальнік і pointee асобна, а распаўсюджаная памылка заключаецца ў стварэнні паказальніка
але забыцца даць яму pointee.
Нумар 2, разнаймення паказальніка пачынаецца з паказальніка і варта яго стрэлкі над
Для доступу да pointee.
Як мы ўсе ведаем, гэта працуе толькі, калі ёсць pointee,
які выгляд вяртаецца ў Правіла № ​​1.
Нумар 3, паказальнік прызначэнні прымае адзін паказальнік і змяняе яго
паказваюць на тое ж pointee як яшчэ адзін паказальнік.
Такім чынам, пасля прызначэння, 2 паказальнікі будуць паказваць на той жа pointee.
Часам гэта завецца абмен.
>> І гэта ўсё, што ёсць на самой справе. Бывай цяпер.
Гэта Бинки. Гэта CS50. Убачымся на наступным тыдні. [Апладысменты]
>> [CS50.TV]