[МУЗЫКА ГУЛЯЕ] David J. малая: Добра. Гэта CS50, і гэта гэта канец чацвёртага тыдня. І адна з тым, сёння з'яўляецца тое, што з лічбавай крыміналістыкі, мастацтва аднаўлення інфармацыі. І сапраўды, нягледзячы на ​​тое, вы знаходзіцеся ў разгар Прама зараз свету ў трох і Breakout, на наступным тыдні, Упор будзе зроблены на менавіта гэты дамен. Так адзін з самых стромкіх работ, якія я калі-небудзь было вярнуўся ў аспірантуры, калі я працаваў на мясцовай Графства Middlesex акруговага пракурора офіс, якія робяць экспертызы працаваць. Так па сутнасці, Масачусэтс Дзяржаўная паліцыя, з нагоды, пры працы на выпадках будзе прынесці ў такіх рэчах, як жорсткія дыскі і дыскет і карты памяці і таму падобнае. І яны б перадаць іх мне і маім настаўнікам, і наша мэта ў тым, каб знайсці доказы, ці ёсць, на гэтых асяроддзях. Зараз, вы, магчыма, бачылі пробліскі гэтага свету судова-медыцынскай экспертызы у сродках масавай інфармацыі, тэлебачання і кіно. Але праца, якую я меў, і адважуся сказаць, што свет, не зусім, як вы ўбачыце яго. Давайце зірнем на тое, што Вы, напэўна, бачылі. [ВИДЕОВОСПРОИЗВЕДЕНИЕ] -OK. Цяпер, давайце добры погляд на вас. [МУЗЫКА ГУЛЯЕ] -Трымай Яго. Запусціце яго назад. -wait Хвіліну. Пераход права. -Ёсць. Замарожванне што. -Поўнае Экране. -OK. Замарожванне што. -Tighten На што, ці не так? -векторных У на што Хлопец на заднім коле. -Zoom У прама тут, на гэтым месцы. Каб навесьці правай абсталявання, Малюнак можна павялічыць і заточаныя. -што Што? -Гэта Праграма павышэння. -Можешь Ясна, што да любой? Я не ведаю. Давайце павышэння яго. -Enhance Раздзел A6. Я павысіў дэталь, и-- Я думаю, што ёсць дастаткова, каб дадаваць. Адпусціце яго да майго экране. -I Узмацняецца адлюстраванне ў яе вачах. -Давай Запусціць гэта праз паляпшэння відэа. -Edgar, Можа вы зможаце палепшыць гэта? -hang На. -Я Працаваў над гэтым адлюстраваннем. Чый-то -Там адлюстраванне. -отражении. -Там Адлюстраваннем асобы чалавека. Даследаваны адлюстраванне! -Там Адлюстраваннем. -Zoom У на люстэрку. Вы можаце ўбачыць адлюстраванне. -можа Вы зможаце палепшыць малюнак адсюль? -можа Вы зможаце палепшыць яго? -можа Вы зможаце палепшыць яго? -можа Мы павялічваем гэта? -можа Вы зможаце палепшыць яго? -Трымай Секунды. Я павышэння. -Zoom На дзверы. Шрыфт Times 10. -Zoom. -Move В. -больш. Пачакай, спыніць. -Stop. -PAUSE Яго. -rotate Нам 75 градусаў па вертыкалі, калі ласка. -Stop. Вярніцеся ў частцы аб дзверы зноў. -У Энхансер малюнкі, якія могуць іншаземных? -можа Мы можам выкарыстоўваць Прадип Сінгх Метад, каб убачыць у вокны. Даследаваны праграмнае забеспячэнне стан мастацтва. Даследаваны ўласнае выключаны. Каб навесьці правы Спалучэнне algorithms-- Прынятыя асвятленне -Ён алгарытмы на наступны ўзровень, і я магу выкарыстоўваць іх, каб павысіць гэты фотаздымак. -Блокировка На і павялічыць вось г. -Enhance. Enhance. -Enhance. -Freeze І павышэння. [END ВИДЕОВОСПРОИЗВЕДЕНИЕ] David J. малая: Такім чынам, гэта усе словы, але яны не былі выкарыстоўваецца ў прапановах правільна. І сапраўды, у будучыні, у любы час, калі ласка, вы чуеце хто сказаць слова, "Падвысіць", хіхіканне толькі трохі. Таму што, калі вы спрабуеце, каб дадаваць, напрыклад, гэта тое, што адбываецца. Дык вось цудоўны фота. Гэта ўласны Daven CS50 ст. І выкажам здагадку, што мы хацелі засяродзіцца ў на агеньчыкам у вачах, або адлюстраванне дрэнны хлопец, што быў выразна знятае камерай бяспекі. Гэта тое, што адбываецца, калі Калі вы павялічваеце малюнак, якое мае толькі канечны лік бітаў, звязаных з ім. Гэта тое, што вы атрымаеце. І сапраўды, у вочы Daven ў з'яўляецца, але чатыры, можа, шэсць пікселяў , Якія складаюць менавіта тое, што быў мігатлівы там. Так Задача Набор Чатыры ў канчатковым рахунку акажа вам вывучыць гэты свет, асабліва па характары-то мы называем файл ўводу / высновы, дзе I / O гэта проста мудрагелісты спосаб кажучы ўваход і выхад. Так да гэтага часу, усе ўзаемадзеяння у нас былі з кампутарам былі ў значнай ступені з вашым клавіятура і экран, але не столькі з жорсткім дыскам, або захавання файлаў акрамя тых, якія вы самі напісаць. Вашы праграмы да гэтага часу ёсць не ствараючы і захоўваючы, і абнаўлення сваіх уласных файлаў. Ну, што файл? Ну, то, як JPEG. Гэта вобраз, які вы маглі б ёсць або загрузіць на Facebook, ці ўбачыць у любым месцы сеткі. На самай справе, што фота мы проста піла Daven быў JPEG. І што цікава аб файлах, як у фармаце JPEG у тым, што яны могуць быць ідэнтыфікаваныя, Як правіла, з дапамогай пэўных шаблонаў бітаў. Іншымі словамі, тое, што гэта такое, што адрознівае JPEG з GIF ад PING ад слова дакумент з файла Excel? Ну, гэта проста розныя паслядоўнасці бітаў. І гэтыя розныя шаблоны Звычайна ў пачатку гэтых файлаў. Так што, калі ваш кампутар адкрывае Слова док, або калі кампутар адкрывае JPEG, гэта выглядае, як правіла, па крайняй Першыя некалькі бітаў у файле. І калі ён распазнае шаблон, ён кажа, о, гэта вобраз. Дазвольце мне паказаць яго ў карыстач у якасці графічнага. Ці, о, гэта выглядае як дакумент Word. Дазвольце мне паказаць яго карыстальніку ў выглядзе эсэ. Так, напрыклад, у фармаце JPEG, аказваецца, з'яўляюцца даволі складаны пад капотам. Але першыя тры байта амаль кожны JPEG пачаць з гэтых трох лікаў. Так байт нуль, адзін і два, у Найбольш кожны JPEG, 255, то лік 216, то лік 255. І тое, што вы зможаце каб пачаць рабіць на наступным тыдні на самай справе тыкаць пад капот файлаў як у фармаце JPEG і як растравых файлаў, і, бачачы, што заўсёды быў там да таго часу, як вы былі з дапамогай кампутара. Але тое, што там звычайна не напісана як дзесятковых лікаў, як гэта. Кампутарныя навукоўцы не як правіла, кажуць у дзесятковай сістэме. Яны сапраўды ня кажуць у двайковай сістэме. Як правіла, калі мы хочам выказаць лічбы, мы на самай справе выкарыстаць шаснаццатковай, якія вы, магчыма, памятаеце ад, скажам, пытанне, пастаўлены Адзін, які кінуў выклік каб вы падумалі аб іншай сістэме. Мы, вядома, знаёмыя з дзесятковай, ад нуля да дзевяці. Мы гаварылі пра двайковым выглядзе. І мы сапраўды не маюць ў выкарыстанні, што многае тут на, таму што кампутары будуць выкарыстоўваць гэта. Але праграмісты вельмі Часта, але не заўсёды, выкарыстоўваць шаснаццатковай, які проста азначае, у вас ёсць 16 літар у вашым алфавіце, у адрозненне ад двух або 10. Такім чынам, як вы разлічваць на больш чым дзевяць у шаснаццатковым? Вы перайсці 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, , B, C, D, E, F, толькі па пагадненні. Але тое, што ключ, што кожны з іх уяўляе сабой адзін знак. Там няма 10. Там няма 11, па сутнасці, таму што кожны з вашых лічбаў, гэтак жа, як у дзесятковай і гэтак жа, як у двайковым, павінны проста быць адным знакам, па дамове. Дык што ж тады з'яўляецца алфавіт у нас ёсць у нашым распараджэнні для шаснаццатковым. Такім чынам, што ж JPEG выглядаць, калі вам былі выпісаць тыя першыя тры байты не як дзесятковай, але, напрыклад, як шаснаццатковым? І чаму шасціграннай нават усё, што карысна? Ну, хуткі погляд на прыкладзе. Так што, калі я пішу з біты, ўяўляюць гэтыя дзесятковую numbers-- гэта можа быць трохі іржавы Зараз ад некалькіх тыдняў таму, але левая і правы даволі лёгка. 255 быў самым вялікім лік мы можа прадстаўляць з васьмю бітамі. Гэта было ўсё тыя. Так толькі адзін, гэта мякка цікавым з'яўляецца сярэднім адзін. І калі вы, здаецца, зрабіць з матэматыка, вы будзеце зрабіць выснову, што, сапраўды, , Што структура аднаго і нулі ўяўляе 216. Так што давайце проста прадугледжваюць для Цяпер, калі яны правільна. Але чаму гэта цікава? Ну, байт, вядома, восем біт. І атрымліваецца, што калі вы думаеце, байта ў выглядзе двух кавалкаў чатырох бітаў, як гэта. Дазвольце мне дадаць некаторы прастору. Таму, перш чым, пасля. Я толькі дадаў некаторыя прабелы дзеля візуалізацыі тут. Як мы можам у цяперашні час прадстаўляюць у, скажам, шаснаццатковае кожны квад бітаў, Кожны набор з чатырох бітаў? Так, напрыклад, на левай Цяпер, у нас ёсць 1111 у падвоеным. Што гэта лік у дзесятковай, калі вы робіце з матэматыку? У вас ёсць месца тыя, двоек месца, месца чацвёркі, і месца васьмёркі. АЎДЫТОРЫЯ: 15. David J. малая: Гэта 15. Так што калі мы робім восем плюс чатыры плюс два плюс адзін, мы атрымліваем 15. Так што я мог запісаць 15 ніжэй за 1111, але тут уся справа шаснаццатковае, ня дзесятковы. Такім чынам, замест таго, каб пісаць на 15, 1-5, Я збіраюся напісаць, што ў HEX, які, калі вы ўспомніце, калі ў вас ёсць ад нуля да F, што 15 будзе? АЎДЫТОРЫЯ: ф. David J. малая: Вось і атрымліваецца, што гэта ф. І вы можаце працаваць, што, кажучы, добра, калі гэта 10, то ОК, F 15. Так сапраўды, мы можам перапісаць гэта ж набор лікаў, як F F. І потым, калі мы робім трохі матэматыкі, мы заключаем, што гэта г. Восем даволі лёгка, таму што мы ёсць адзін ў месцы васьмёркі. А потым, у нас ёсць яшчэ пара F F гадоў. Так што людзі маюць тэндэнцыю рабіць па пагадненні калі яны выкарыстоўваюць шаснаццатковае яны проста пішу гэта крыху больш коратка, пазбавіцца ад большай часткі гэтага прабелу. І толькі, каб быць супер ясна, чытачы, што гэта шаснаццатковае, проста канвенцыя сярод людзі ў напісанні нуля х, якія не мае сэнсу іншае чым візуальнае ідэнтыфікатар, вось ідзе шаснаццатковы лік. А потым, вы паклалі дзве лічбы, F е ў дадзеным выпадку, то г, то F F. Так карацей кажучы, шаснаццатковае проста імкнецца каб быць карысным, таму што кожны з яго лічбы, ад нуля да F, выдатна лініі з узорам з чатырох бітаў. Так што калі ў вас ёсць два шаснаццатковых лічбаў, ад нуля да F, зноў і зноў, што дае вам ідэальна восем біт або адзін байт. Дык вось чаму яна імкнецца да быць умоўна карысна. Там няма інтэлектуальнай Змест сапраўды акрамя таго, акрамя яго фактычнага карыснасці. Цяпер у фармаце JPEG не толькі фарматаў файлаў для графікі. Вы можаце ўспомніць, што ёсць файлы, як гэта ў свеце, па меншай меры, ад некалькі гадоў таму. Так што гэта было на самай справе усталяваны ў Windows XP на мільёнах ПК па ўсім свеце. І гэта быў файл растравыя, BMP. І Файл растравага, як вы ўбачыце ў наступным тыдзень, проста азначае, што ўзор кропак, пікселяў, як яны называюць, карту на біт, сапраўды. Так што цікава, хоць, пра гэта файле фармату, BMP, з'яўляецца што пад капотам, яго мае больш чым за тры байт , Якія складаюць яго загаловак, так казаць, першыя некалькі укусаў. Гэта на самай справе выглядае крыху складана на першы погляд. І вы ўбачыце, што гэта ў P набору. І атрымліваць тое прыватнасці з гэтага зараз гэта не так важна, як толькі на тое, , Што ў пачатку кожнага растравага малюнка файла, графічны фармат, ёсць цэлая куча лічбаў. Зараз Microsoft, Аўтар гэтага фармату, мае тэндэнцыю называць тых, Рэчы не Інтс і сімвалы і плавае, але словы і д слова і прагне і байты. Так што яны проста розныя тыпы дадзеных. Яны розныя імёны за тое ж самае. Але вы ўбачыце, што ў P Усталяваць чатыры. Але гэта толькі сказаць, што калі ў чалавека двойчы пстрыкае некаторы .BMP файл на яго ці яе жорсткі дыск, і адкрываецца акно да паказваючы яму ці ёй, што малююнкі, што адбылося, таму што аперацыйная Сістэма меркавана заўважыў не толькі пашырэнне .BMP файл у імя файла, але і той факт, што ёсць некаторыя Канвенцыя ўзоры бітаў у самым пачатку гэтага растравага файла. Але давайце зараз засяродзіцца на такі складаны файл, але замест гэтага на нешта накшталт гэтага. Выкажам здагадку, тут у GEdit, я проста ёсць пачатку праграмы, гэта даволі проста. У мяне некаторыя ўключае верх. Цяпер у мяне ёсць include "structs.h", але Я вярнуся да таго, што ў адзін момант. Але гэта карысна для цяпер. Так што гэта праграма што збіраецца рэалізаваць як базы дадзеных рэгістратара. Так база дадзеных студэнтаў, і кожны студэнт у свеце мае імя і дом і, магчыма, некаторыя іншыя рэчы, але мы будзем трымаць гэта простым. Кожны студэнт мае імя і дом. Так што, калі я хацеў напісаць Праграма, мэта якой у жыцці проста для перабору ад нуля на да трох, калі ёсць трох студэнтаў ў Гарвардскім універсітэце. І я проста хачу, каб, выкарыстоўваючы GetString, Імя кожнага студэнта і дом, а затым проста раздрукаваць тыя з. Гэта накшталт як Week Адзін, Тыдзень Дзве рэчы зараз, дзе я проста хачу для цыкл або нешта падобнае. І я хачу назваць GetString некалькі раз, а затым раздрукаваць е некалькі разоў. Так як я мог бы зрабіць гэта, хоць, калі абодва імя і дом удзельнічаюць для кожнага студэнта? Так што мой першы інстынкт мог бы ў тым, каб зрабіць нешта падобнае. Я мог бы спачатку сказаць, добра, дай мне, сказаць, масіў радкоў званых імёны. І я не хачу жорстка тры тут. Што я хачу паставіць там? Так СТУДЭНТЫ, таму што гэта толькі пастаянная абвешчаныя ў пачатку, толькі таму я не прыйдзецца жорстка тры ў некалькіх месцах. Такім чынам, я магу змяніць яго на адно месца, і гэта ўплывае на змяненне ўсюды. А потым, я мог бы зрабіць радок знаходзіцца студэнтаў. А цяпер, я мог бы зрабіць нешта падобнае для (INT I = 0; г <СТУДЭНТАЎ; я ++. Так я друкую хутка, але гэта верагодна, знаёмыя сінтаксіс цяпер. І зараз, гэта было нядаўна. Калі я хачу паставіць у г-га Імя студэнта, я думаю, што я раблю гэта. І потым, не імёны але дома дужкі I. Я раблю гэта, GetString, і хай мне вярнуцца і выправіць гэтую лінію. Пагадзіцеся? Не згодны? Гэта не вельмі зручна. Я не сказаў карыстачу, што рабіць. Але цяпер, калі я таксама хацеў пазней, давайце скажам, надрукаваць гэтыя рэчы out-- так TODO пазней. Я збіраюся рабіць больш з это-- гэта магчыма ёсць Правільная рэалізацыя атрымліваць імёны і дамоў, тры з іх у агульнай складанасці кожная, ад карыстальніка. Але гэта не вельмі добры дызайн, ці не так? Што рабіць, калі студэнт мае не толькі імя і дом, але і ідэнтыфікацыйны нумар, і нумар тэлефона, і адрас электроннай пошты, і, можа быць, галоўная, і можа быць, ручка Twitter, і любую колькасць іншых дэталяў звязана са студэнтам або асобай, ў цэлым. Як бы мы пачынаем дадаць Функцыянальнасць гэтай праграме? Ну, я адчуваю, што самы просты спосаб мог бы ў тым, каб зрабіць нешта падобнае, скажам, Int IDS студэнтаў. Так я магу паставіць усе свае пасведчанні ў там. А потым, за тое, як тэлефонныя нумары, Я не ўпэўнены, як ўяўляюць, што толькі пакуль. Так што давайце ісці наперад і толькі званок гэта шчабеча студэнты, якія крыху дзіўна, но-- і куча больш палёў. Я пачаў эфектыўна скапіруйце і ўстаўце сюды. І гэта будзе расці даволі грувасткім даволі хутка, ці не так? Не было б добра, калі былі у свеце структура дадзеных вядома не як Int або радкі, а нешта высокі ўзровень, абстракцыя, так казаць, вядома як студэнт? C не прыйшоў з убудаваным Функцыянальнасць для студэнтаў, але што, калі я хацеў даць гэта такое? Ну, атрымліваецца, што я збіраюся адкрыць файл з імем structs.h тут, і вы можаце зрабіць менавіта гэта. І мы збіраемся пачаць рабіць гэта цяпер. А пад капотам P ўсталяваць тры, Вы ўжо рабілі гэта цяпер. Там няма такога паняцця, як г прамавугольніка або г авальныя на мове праграмавання C. Людзі ў Стэнфардзе рэалізаваны тыя тыпы дадзеных, выкарыстоўваючы гэты падыход тут, абвяшчаючы свае ўласныя новыя дадзеныя Тыпы, якія выкарыстоўваюць новае ключавое слова называецца структура, а другі адна называецца ЬурейеЕ. І сапраўды, нават пры тым, што сінтаксіс выглядае трохі адрозніваецца ад матэрыялу мы бачылі раней, у Прынцып, гэта супер проста. Гэта проста азначае, "вызначыць тып." Гэта будзе Структура і склад проста як кантэйнер для некалькіх рэчаў. І, што структура будзе мець радок з імем імя, і радок называецца дом. І давайце называць, проста для зручнасці, ўся гэтая структура дадзеных студэнт. Так як толькі вы атрымаеце ў кропка з коскі, у вас ёсць цяпер стварылі свой уласны дадзеных тып, званы студэнт што цяпер стаіць у адным шэрагу міжнар, і паплавок, і сімвал, і радок, і г прастакутнік, і г авальныя, і ў любой колькасці з іншых рэчаў, якія людзі прыдумалі. Так што карысна аб гэтым зараз з'яўляецца тое, што, калі я вярнуся на структуру 0 і скончыць гэта рэалізацыя, які я напісаў загадзя тут, звярніце ўвагу, што ўсе непазбежнага бязладзіцы, што збіраўся пачаць адбываецца, як я дадаў тэлефонаў і шчабеча і ўсё гэтыя іншыя рэчы ў Вызначэнне студэнта, цяпер ён лаканічна загорнуты як толькі адзін масіў студэнтаў. І кожны з тых студэнтаў, цяпер мае некалькі рэчаў ўнутры яго. Так што проста пакідае адно пытанне. Як вы атрымліваеце на імя, і дом, і ID, і ўсё, што яшчэ ўнутры студэнта? Супер просты, а таксама. Новы сінтаксіс, але простая ідэя. Вы проста індэкс ў масіве, як мы зрабілі на мінулым тыдні і гэта. І тое, што відавочна новая частка сінтаксісу? Проста., Што азначае "ісці ўнутр Структура і атрымаць поле называецца Імя, атрымаць поле, званае дом, атрымаць поле, званае студэнт ". Такім чынам, у P ўсталяваць тры, калі вы яшчэ працуем над гэтым, і большасць людзей да гэтага часу якія, разумееш, што, як вы пачаць выкарыстоўваць такія рэчы, як г прастакутнікам і г авалаў і іншыя рэчы, якія, здаецца, не прыходзяць з Week нуль, адзін ці два, разумею, што гэта таму, што Стэнфардзе заявіў некаторыя новыя тыпы дадзеных. І на самай справе, што гэта менавіта тое, што мы будзем зрабіць, а, у P Усталяваць чатыры, калі мы пачынаем мець справу з рэчамі напрыклад, малюнкаў, растравыя выявы, і многае іншае. Так што проста тізер і ментальная мадэль для таго, што будзе. Зараз, я адкладваў трохі гэтай раніцай. Я быў збольшага цікава паглядзець, што шпалеры Microsoft на самай справе выглядае сёння. І атрымліваецца, каго ў 2006 годзе на самай справе адправіўся ў амаль дакладна тое ж самае месца, каб сфатаграфаваць на самай справе , Што выглядае як што ў гэтыя дні. Поле цяпер крыху зарослыя. Таму, калі казаць зараз малюнкаў, давайце вярнуць Daven тут на экране і Мікалая, і толькі нагадаю, што калі вы хочаце далучыцца да нас на абед у гэтую пятніцу, з галавы да нашай звычайнай URL тут. Дык дзе ж мы пакінуць у панядзелак? Мы ўвялі гэтую праблему, ці не так? Гэта было, здавалася б, правільна Рэалізацыя своп, у якім вы прымаць два цэлых, адзін называецца, адна называецца б, абмяняць іх, як Лаура зрабіў тут на стадыі з малаком і вадой, з дапамогай часовай зменная, або пусты кубак, так што мы маглі б паставіць б ў і а ў б, не робячы беспарадак рэчаў. Мы выкарыстоўвалі зменную. Гэта называецца тэмпература. Але тое, што было асноўнай Праблема з гэтым кодам на панядзелак? У чым праблема тут? Так. АЎДЫТОРЫЯ: Гэта займае больш месца. David J. малая: Займае больш прастору, таму што я выкарыстоўваю зменную, і гэта нармальна. Гэта дакладна, але я хачу сказаць, што ўсё ў парадку. Гэта толькі 32 біт у Вялікім Схема рэчаў, такім чынам, не мае вялікага значэння. Іншыя думкі? АЎДЫТОРЫЯ: Гэта толькі свопы зменныя лакальна. David J. малая: Точно. Гэта толькі змяняе зменныя лакальна. Таму што ў любы час вы называеце function-- калі ў мяне быў латкі з Анненберг апошні раз, у вас ёсць галоўная на дне. Як толькі вы выклікаеце функцыю пад назвай своп, своп не атрымаць х і у, пачатковыя значэнні. Што падпампоўкі GET, так мы сцвярджаем? Аўдыторыя: Копіі. David J. малая: Так іх копіі. Так ён атрымлівае адзін і два, калі вам ўзгадаць прыклад з мінулага разу, але копія аднаго і двух , Якія паспяхова памяняліся. Але, на жаль, у рэшце рэшт, гэтыя значэння па-ранейшаму тое ж самае. Такім чынам, мы бачым гэта з нашым новы сябар, спадзяюся, GDB, што вы ці ТФ і СА ёсць быў правядзе Вас да наступных. Дык не падпампоўкі нагадаем выглядае like-- давайце адкрыць это-- выглядае наступным чынам. Мы ініцыялізацыі х да аднаго, у дзвюх. Меў кучу друку е гадоў. Але тады, клавішу выкліку тут было памяняць, якія менавіта код, які мы толькі што бачыў некалькі хвілін таму. Што правільна спачатку погляд, але функцыянальна, гэтая праграма не працуе, таму што гэта не назаўсёды памяняць х і у. Такім чынам, давайце паглядзім на гэта, хутка цяпло тут з GDB, у ./noswap. Звязка пераважнай інфармацыі, Я пазбавіцца ад з кіравання L цяпер. А цяпер, я збіраюся ісці наперад і запусціць яго. І, на жаль, што не было, што карысна. Ён пабег праграму ўнутры гэтага Праграма называецца GDB, адладчык, але гэта не дазвольце мне капацца. Так як я магу на самой справе паўза выкананне ўнутры гэтай праграмы? Так зламаць. І я мог бы разарваць на любым нумар радка, адзін, 10, 15. Але я таксама магу зламаць сімвалічна кажучы размовы Асноўнае. І, што збіраецца ўсталяваць перапынак Справа, мабыць у радку 16 у асноўны. А дзе лінія 16? Пойдзем да кода і ісці да noswap. І на самай справе, лінія 16 з'яўляецца Самае першае ў праграме. Так што цяпер, калі я пайду наперад і тып запусціць гэты раз, Enter, гэта зрабіў паўзу. Так што давайце капацца. Раздрукаваць x-- чаму х нуля? І ігнараваць знак даляра. Вось толькі для аматара Выкарыстанне праграмы. Чаму х нуля на дадзены момант? Так. АЎДЫТОРЫЯ: Гэта зрабіў паўзу прама перад радок 16, на самай справе не на лініі 16. David J. малая: Точно. GDB, па змаўчанні, спынілася выкананне непасрэдна перад лініяй 16. Так што не выканаў, якая азначае х мае некаторы невядомае значэнне. І нам пашанцавала, што гэта то чысты як нуль. Так што цяпер, калі я друкую наступны, цяпер ён выкананы 16. Ён чакае, каб я выканаць 17. Дазвольце мне ісці наперад і друк х. Гэта адна. Дазвольце мне ісці наперад і друк у. Тое, што я павінен убачыць цяпер? АЎДЫТОРЫЯ: [неразборліва] David J. малая: крыху гучней. АЎДЫТОРЫЯ: [неразборліва] David J. малая: Не зусім кансэнсус. Так што, так, мы бачым некаторую каштоўнасць смецця. Зараз, ля ёсць 134514064 ёсць. Ну, гэта проста некаторы значэнне смецця. Мая праграма выкарыстоўвае АЗП для розных мэтаў. Там у іншыя функцыі. Іншыя людзі напісалі ўнутры майго кампутара. Так гэтыя біты былі выкарыстаныя для іншыя значэнні, і што я бачу з'яўляецца рэшткі некаторых да выкарыстанне гэтай памяці. Дык няма нічога асаблівага, таму што, як толькі паколькі я друкую наступны, а затым раздрукаваць у, гэта ініцыялізуецца значэнне, што я хачу. Так што цяпер, давайце ісці наперад трохі хутчэй. N на наступны. Давайце зробім гэта зноў. Давайце зробім гэта зноў. Але я не хачу, каб ўразіць гэта тут, таму што, калі I хачу паглядзець, што адбываецца ўнутры падпампоўкі, што каманда? АЎДЫТОРЫЯ: крокі. David J. малая: крокі. Так што гэта крокі мяне ў функцыі, а не над ім. І зараз, гэта крыху загадкавымі шчыра, але гэта ўсяго толькі казаў мне, што я ў лініі 33 цяпер. І давайце зробім гэта зноў. Раздрукаваць тэмп. Смецце значэнне, адмоўнае гэты раз, але гэта толькі яшчэ значэнне смецця. Так што давайце рабіць далей, тэмп друку. Гэта ініцыялізуецца 1, якія было значэнне х, ака. Цяпер, калі наш і х з? Ну, заўважыць у асноўным, мы назвалі гэтыя значэння х і у. Затым мы прайшлі іх, каб абмяняць наступным чынам. X прыйшоў першым, коска у. А потым, своп можа называць іх х і у. Але для яснасці, што гэта называючы іх і б. Але і б цяпер будзе копіі х і у, адпаведна. Так што, калі я вярнуся ў GDB, тэмпература Цяпер адзін і цяпер з'яўляецца адным. Але калі мне рабіць далей, і цяпер зрабіць друк , Ужо перабраўся. Малако вылілася ў былы шкло апельсінавага соку, альбо наадварот. І калі мне рабіць далей зноў, і цяпер калі я раздрукаваць для праверкі адсутнасці памылак, яшчэ два, але б цяпер з'яўляецца адным. Шчыра кажучы, ён усё яшчэ там. Мяне не хвалюе, што тэмпература з'яўляецца. Але як толькі я цяпер тыпу, скажам, працягнем вяртацца, зараз я ў канцы праграма. І, на жаль, х з'яўляецца яшчэ адзін і ў яшчэ двух. Так у чым жа карысць ад GDB там? Гэта не дапамагло мне выправіць Праблема сама па сабе, але гэта, спадзяюся, дапаможа мне разумею, разумеючы, што так, мая логіка правільная, але мой код у канчатковым рахунку не маючы пастаяннае ўздзеянне. Дык вось праблема мы збіраецца зараз вырашыць сёння. Але давайце трапіць шляхам гэта. Радок гэта хлусня. Гэта таксама не з'яўляецца тыпам дадзеных што існуе ў С. Гэта з'яўляецца сінонімам некаторыя Час нешта іншае, і мы можам паказаць, што наступным чынам. Дазвольце мне ісці наперад і адкрыць Праграма пад назвай параўнаць-0. І замест таго, увядзіце гэта адзін з, мы пачнем хадзіць праз код Я ўжо пісаў, але гэта толькі некалькі радкоў. Так што гэта параўнаць-0. І першае, што я раблю атрымлівае радок тэксту. Але звярніце ўвагу, што я рабіць у першы раз. Чым адрозніваецца ясна пра лінію 21? На самай справе, пачакайце хвіліну. Гэта копія два. Гэта значыць нават не права праграма. Добра, спойлер абвесткі. Добра, так не бярыце ў галаву, што. Вось і адказ на будучы пытанне. Вось параўнайце-0, і я збіраецца атрымаць радок тэксту. Праграма значна прасцей. Так што гэта проста. Гэта як Week One, тыдні дзве рэчы цяпер. струны S = GetString. Зараз, я яшчэ раз кажу тут. Радок т = GetString. А потым, апошняе, што ў гэтым Праграма, як прадугледжвае яго назву, з'яўляецца Я збіраюся паспрабаваць параўнаць іх. Так што калі з, першы радок, роўная = Т, то я збіраюся сказаць ўводзе тое ж самае. У адваротным выпадку, я збіраюся сказаць, ўводзе розныя рэчы. Так што давайце скампіляваць і запусціць гэтую праграму. Так што параўноўваць нуля. Выглядае добра. Няма кампіляцыі памылкі. Дазвольце мне ісці наперад зараз і ўвядзіце ./compare-0. Дазвольце мне ісці наперад і то сказаць : Daven і тое: Роб. І я друкую розныя рэчы. Пакуль усё ідзе добра. Праграма здаецца правільным. Але давайце запусцім яго зноў. Скажы што-небудзь: Гейб. Скажы што-небудзь: Гейб. Добра. Можа быць, я ўдарыў прабел ці нешта ў стылі фанк. Давайце зробім гэта зноў. Так Zamyla. Zamyla. Розныя рэчы. Так што ж адбываецца? Таму ў нас ёсць гэтыя дзве лініі Код, GetString выклікаецца двойчы. А потым, я проста спрабуюць параўноўваць з і т. Але тое, што сапраўды тое, што адбываецца? Ну, мой почырк збіраецца мяснік гэты прыклад некалькі. І давайце на самай справе кінуць гэта да сюды, а. Таму ў нас ёсць такі радок: струны S = GetString. Дык вось проста першы Цікава лінія ад гэтай праграмы. Але тое, што было ўвесь гэты час адбываецца пад капотам? Ну, на левай баку знаходзіцца радок, што некаторы тып зменнай, і гэта завецца с. Так што я ведаю, што гэта, выкарыстоўваючы памяць, або RAM, у маім кампутары так ці інакш. Так што я збіраюся абстрактна звярнуць, што ў выглядзе квадрата. 32 біта, гэта атрымліваецца, але больш падрабязна пра гэта ў будучыні. А потым, што адбываецца тут? Ну, GetString відавочна атрымлівае радок ад карыстальніка. І GetString атрымаў Zamyla або Гейб або Daven. Так давайце абярэм першы з тых, які быў Daven. Так эфектыўна, што GetString атрымаў мне ў гэтым першым выпадку быў D - V-е-н. А потым, што яшчэ зрабіў гэта дае мне таемна? АЎДЫТОРЫЯ: [неразборліва] David J. малая: Так, / 0 або пусты знак. Так што фактычна дало мне радок. Але мы ўжо ведаем з папярэдняга выглядае, што радок з'яўляецца проста масіў сімвалаў, і гэта заканчваецца гэта спецыяльная дазорнай характар, / 0. Але калі гэта праўда і гэта ўяўляе сабой квадрат, гэта відавочна нашмат больш прастакутнік. І на самай справе, гэта, Я сцвярджаю ,, толькі 32 біт. І гэта відавочна больш, чым 32 біт, таму што гэта, верагодна, восем плюс восем плюс восем плюс восем плюс восем, толькі таму, што байт у ASCII. Як, чорт вазьмі, мы збіраемся, каб адпавядаць Daven ў гэтай маленькай скрынцы тут? Ну, што ж GetString на самай справе рабіць? Ну, гэтая сетка тут уяўляе памяці майго кампутара ці АЗП. Такім чынам, давайце ўмоўна сказаць, што калі кожны з іх уяўляе сабой байт, то мы можам думаць пра кожны байт, як мае адрас, як 33 Оксфард-стрыт, або 34 Оксфард-стрыт, або 35 Оксфард-стрыт. Гэтак жа, як дома маюць адрасы і будынкі маюць адрасы, так што асобныя байт памяці маюць адрасу ці нумары што адназначна ідэнтыфікаваць іх. Цяпер, гэта адвольнае. Але трымаць яго проста, я збіраюся выкарыстоўваць шаснаццатковай толькі па пагадненні, але 0x азначае не што іншае чым "гэта шаснаццатковае." і я збіраюся сцвярджаць, што "D" заканчваецца ў Байт One ў памяці. Я нічога не атрымаў яшчэ адбываецца ў памяці, так Daven атрымаў першае месца ў Байт One. Гэта, тое, будзе 0x2. Гэта будзе 0х3. Гэта будзе 0x4. Гэта будзе 0x5. Гэта будзе 0x6. Але як толькі вы пачынаеце думаць аб якім рабення кампутара пад капотам, Вы можаце пачаць вывад як вам, некалькі гадоў таму, будзе рэалізавалі C сабе. Што такое GetString верагодна returning-- таму што гэта адчувае, што гэта не вяртанне Daven, па сутнасці, таму што ён, вядома, не збіраюся каб адпавядаць у гэтым маленькім box-- так што GetString, верагодна, вяртаецца? АЎДЫТОРЫЯ: [неразборліва] David J. малая: Размяшчэнне Daven. І гэта было рабіць гэта з тых часоў тыдні адзін. Што GetString сапраўды вяртанне не з'яўляецца радком, як такой. Гэта адзін з маленькіх белых хлусні. Гэта вяртанне адрас радок у памяці, унікальны адрас. Daven жыве ў 33 Оксфард-стрыт. Але больш коратка, Гэвін жыве на 0x1, Адрас Number One. Так што атрымлівае пакласці ў гэты маленькая скрыначка тое, каб было ясна, проста адрас гэтага радка. Так што ўвесь гэты час, гэта мае, што адбываецца. Але тое, што гэта намёк на Цяпер, што калі ўсё з мае гэты лік ўнутры яго, хто , Каб спыніць вас, праграміст, ад здачы любы лік у любая пераменная і проста скакаць да гэтага кавалак памяці? І на самай справе, мы ўбачым вось пагроза ў наступны раз. Але цяпер, гэта адчувае недастаткова. Калі я кажу, зразумейце мяне Радок, вы дасце мне Daven. Але вы сапраўды не даюць мне Daven. Усё, што вам даюць мне гэта адрас Daven ст. Як мне тады ведаць напэўна дзе Daven пачынаецца і ends-- гісторыя становіцца weird-- дзе Daven пачынаецца і заканчваецца, а затым, на наступны радок у памяці пачынаецца? Ну, калі вы уручаючы мне пачатак Daven, па сутнасці справы, як я ведаю дзе канец яго імя? Гэта асаблівая нулявы сімвал, які тым больш важна цяпер, калі радкоў пад капот проста вызначаны адназначна іх размяшчэння ў памяці. Так што ўвесь гэты час, гэта што адбываецца. Таму, калі мы глядзім зараз на Код тут, растлумачыць калі вы б памылка ў лініі 26. Чаму Zamyla і Zamyla адрозніваецца? Чаму Гейб і Гейб па-іншаму? Так, у спіну. АЎДЫТОРЫЯ: Яны маюць розныя адрасы. David J. малая: Проста таму, што яны маюць розныя адрасы. Таму што, калі вы тэлефануеце GetString зноў, што я буду рабіць хутка тут, калі гэта другая лінія, радок т, як я зрабіў у гэтай праграме, роўная іншы званок GetString. У наступны раз я называю GetString, я збіраюся каб атрымаць іншы ўчастак памяці. GetString дапускаецца прасіць аперацыйныя Сістэма для атрымання дадатковай і вялікім аб'ёмам памяці. Гэта не збіраецца паўторна выкарыстоўваць той жа шэсць байт кожны раз. Гэта адбываецца, для атрымання новай кавалак памяці, які азначае т збіраецца атрымаць некаторы іншае значэнне тут. Таму, калі я з роўная = т, вы не параўноўваючы D супраць гэтага і супраць гэта і V супраць гэтага. Ты параўноўваеш гэта ад гэтага, якая адкрыта даволі useful-- useless-- даволі бескарысна, таму што, хто сапраўды клапоціцца, дзе струны ў памяці? І на самай справе, у нас няма. І мы не збіраемся пачаць асабліва клапатлівым. Толькі ў тым выпадку, памылкі могуць узнікаць і пагрозы бяспекі могуць узнікнуць волю мы фактычна пачынаюць клапаціцца пра гэта. Так давайце выправім гэтую праблему. Аказваецца, гэта выправіць супер проста. А давайце на самай справе, перш, чым я паказваюць, што зноў, што б вы зрабілі, калі ў класе CS50, і трэба было рэалізаваць параўнанне з двума радкамі. Вы відавочна не можаце проста выкарыстоўваць з роўная = Т. Але толькі лагічна, як б вы параўналі гэты радок супраць гэтага радка, выкарыстоўваючы З-код? Так. АЎДЫТОРЫЯ: Проста рабіць для контуру [неразборліва] David J. малая: Выдатна. АЎДЫТОРЫЯ: [неразборліва] David J. малая: Так. Проста выкарыстоўвайце цыкл або у той час як завесы або любы іншы. Але проста ўжыць асноўную ідэю, што калі гэта кавалак памяці або масіў і гэта, перабраць і ў той жа час. І проста параўнайце літары. І вы павінны быць трохі асцярожным, таму што вы не хачу адзін палец прайсці іншы таму што адзін радок даўжэй іншага. Такім чынам, вы будзеце жадаць, каб праверыць гэта спецыяльнае значэнне ў канцы, нуль. Але на самой справе гэта, у канец, так проста. І, шчыра кажучы, нам не трэба вынаходзіць, што кола. Вось версія Два. І тое, што я збіраюся сказаць, з'яўляецца тое, што замест параўнання сек роўная = Т, Я замест збіраюся сказаць, калі радок Параўнанне з коскі т роўная = 0. Цяпер, што ж радок параўнаць? Аказваецца, гэта функцыя, якая пастаўляецца з C, мэта якога ў жыцці з'яўляецца для параўнання двух радкоў. І змяшаць параўноўваць, калі мы чытаем яго Чалавек старонкі або дакументы або CS50 спасылка, гэта будзе проста вам сказаць, што ажыятаж параўнаць вяртае альбо адмоўныя нумар або станоўчае лік або нуль, дзе нуль азначае, што яны роўныя. Так што проста гіпотэза. Што гэта можа азначаць, калі змяшаць параўнання даходнасці адмоўнае значэнне або станоўчае значэнне? АЎДЫТОРЫЯ: Больш ці менш. David J. малая: Так, больш ці менш. Так што калі вы хочаце адсартаваць цэлае куча радкоў у dictionary-- як мы ў канчатковым выніку ўніз road-- Выдатная функцыянальнасць ў выкарыстанні патэнцыйна, таму што гэта збіраецца рабіць, што параўнанне радкоў для вас, і скажыце Вы сапраўды ідзе перад б, ці робіць б прыйсці да алфавітным парадку. Мы можам зрабіць менавіта гэта. І заўважце, што я адзін іншы рэч у гэтым прыкладзе. Што яшчэ змянілася вышэй у гэтай асноўнай функцыі? Char *. І гэта ёсць ні што іншае хлусня. Увесь гэты час, калі вы пісаў радок, мы былі таемна перазапісу Радок у сімвальным * так, што звон фактычна разумее вас. Іншымі словамі, у CS50.h і як мы будзем у канчатковым рахунку бачыць, мы зрабілі сінонім называецца радок што тое ж самае, як сімвал *. І на дадзены момант, толькі што ведаю * У дадзеным кантэксце, па меншай меры азначае адрас. Адрас і што? Ну, тое, што я сказаў, сімвал *, а не INT * ці плаваць *, азначае, што сімвал * з'яўляецца адрас гольца. Так што гэта маленькая скрыначка тут, ака радок, сапраўды тыпу сімвал *, якая з'яўляецца проста мудрагелісты спосаб сказаць, у гэтым полі пойдзе адрас. А што значыць, што адрас ставіцца? Мяркуючы па ўсім, сімвал. Але мы маглі абсалютна ёсць цэлалікавае * і іншыя рэчы. Але цяпер, сімвал * сапраўды самы простым і адным з інтарэс. Такім чынам, гэтая праблема будзе расці, тым не менш, яшчэ раз. Выкажам здагадку, я адкрываю гэтую праграму. Давайце паглядзім, калі цяпер мы можам прадказаць што не так з гэтым кодам. Такім чынам, у гэтай праграме, скапіяваць-0, я збіраюся ісці наперад і зноў патэлефанаваць GetString і захаваць значэнне ў с. І потым, чаму я гэта раблю, проста як напамін ад тыдня мінулым? Мы сапраўды казалі, што GetString часам вяртае нуль. Што гэта значыць, калі GetString вяртае нуль? Што пайшло не так. Гэта, верагодна, азначае, што радок занадта вялікі, з кампутара памяці. Бывае супер, супер, супер рэдка, але гэта можа адбыцца. Мы хочам, каб праверыць яго, і гэта ўсё, што мы робім. Таму што мы бачым цяпер, калі вы не пачаць праверку звыкла для рэчаў як нуль, вы маглі б на самай справе пачынаюць ісці па адрасах у памяці, што з'яўляюцца несапраўднымі. І вы збіраецеся пачаць выклікаючы ўсё больш і больш памылкі сегментацыі. Або ў Mac або ПК, проста падахвочванні кампутара павесіць ці праграма для замарожвання, патэнцыйна. Так што цяпер, я сцвярджаю, у капіявання 0.c, што I буду капіяваць гэтыя радкі шляхам з лініі 28. А потым, я збіраюся сцвярджаць, у ніжняй частцы вось што я збіраюся змяніць адзін з іх. Так заўважыць гэта. Я тэлефаную наш стары сябар STRLEN. І толькі растлумачыць на англійскай мове што гэтая лінія 34 робіць? Што т кранштэйны 0 ўяўляюць злева. Так. АЎДЫТОРЫЯ: першы сімвал т? David J. малая: першы сімвал т. Гэта так. Упершыню характар ​​т, я хачу прызначыць загалоўную версію першага сімвала у т. Так што гэта капіталізацыі першая літара. А потым, у самы апошні, што я раблю У гэтай праграме ёсць я сцвярджаю, вось арыгінальная, з, і вось копія, т. Але, грунтуючыся на гісторыі мы проста сказаў аб тым, што радкі на самай справе, што лінія 28 сапраўды рабіць, а што у выніку памылка адбываецца каб быць на экране? Такім чынам, спачатку, першае пытанне, 28. Што радок T = S сапраўды робіш? Калі ў нас ёсць на левай руцэ бок тут радок T = S; што дае мне адну скрынку тут і адна скрынка тут. І выкажам здагадку, гэты адрас 0x, скажам, 50 на гэты раз, адвольна. Што радок T = S зрабіць пад капотам? АЎДЫТОРЫЯ: [неразборліва] David J. малая: Ён захоўвае памяць звярнуцца туды, так 0x50 ідзе туды. Так што калі цяпер, я іду ў першы характар ​​у т і верхні яго, што я эфектыўна рабіць, каб з? Я сапраўды робяць тое ж самае, ці не так? Таму што, калі адрас 0x50-- і проста, я няма шмат месца на борце тут, але выказаць здагадку, што гэта 0x50 сюды, дзе-то ў памяці майго кампутара. І я, напрыклад, Гейб у ніжні рэгістр тут, як гэта. І я ўжо казаў т кранштэйны 0 атрымлівае капитализируются. Ну, т кранштэйны 0 першая літара ў т. Так мала г збіраецца стаць вялікай Г. Але праблема будзе, што ж ы таксама паказваюць на? АЎДЫТОРЫЯ: Тое ж самае. David J. малая: сапраўды такі ж рэчы. Такім чынам, простае тлумачэнне, магчыма, нават калі сінтаксіс крыху дзіўна. Так давайце зробім гэта. Зрабіце копію-0, а затым ./copy-0. Скажы што-небудзь: Гейб. І, на жаль, абодва ім ужо былі капіталізаваць, але для, што ў аснове Прычына, па якой мы проста Цяпер справу з адрасамі. Так як жа мы пачынаем address-- ня каламбур intended-- як мы прыступіць да вырашэння гэта адмысловая праблема? Ну, у copy1.c, справы ідуць каб атрымаць крыху больш складана. Але я б прэтэндаваць канцэптуальна простае рашэнне. Так цяжка атрымаць на першы погляд. Не будзе лёгка для першага Час ўводзе яго, магчыма, але калі праблема ў тым, што проста рабіць T = S за ўсё капіюе адрас, што, зноў, калі я магу забраць ад вас, будзе рашэнне за фактычна капіраванне радкі? АЎДЫТОРЫЯ: Мы, напэўна, выкарыстоўваць цыкл зноў. David J. малая: Так. Такім чынам, мы збіраемся трэба пятлю зноў. І таму, калі мы хочам, каб скапіяваць радок з у іншую радок, мы, верагодна, хочаце зрабіць гэта посимвольно. Але праблема ў тым, калі Гэта першапачаткова с, Цяпер мы павінны пачаць відавочна выдзялення памяці для т. Іншымі словамі, давайце перакроіць гэты апошні раз. Калі гэта струны S = GetString. І давайце паставім гэта тут, а таксама. Гэта GetString. А потым, карціна за тое, як што будзе, як і раней, G-A-B-е / 0. Гэта выглядае трохі нешта накшталт гэтага. І з таму, мы называем гэта 0x50, і што будзе 51, 52. Так што гэта 0x50. А потым, я раблю радок т. У памяці, што толькі збіраецца даць мне невялікую плошчу, як гэта. Так што ключавым крокам цяпер? Калі я хачу, каб скапіяваць сек ў т, што пусты нам трэба запоўніць тут? Ці тое, што нам трэба рабіць на высокім узроўні? Так? Хто? Так. АЎДЫТОРЫЯ: Мы павінны [неразборліва]. David J. малая: Так, мы неабходна запоўніць гэты прабел. Я не магу скапіяваць, а затым капіталізаваць імя Гейба пакуль я не прашу аперацыйную сістэму для іншага кавалка памяці што, па меншай меры, як вялікі, як у арыгінале. Так што пакідае нас з пытаннем. Як папрасіць аперацыйную сістэму не толькі для прасценькай pointer-- як гэта называецца, адрас, pointer-- ня для простага невялікі скрынцы як гэта называецца радок? Як папрасіць аперацыйную Сістэма для вялікі кавалак памяці? Да гэтага часу, я толькі атрымаў свае словы назад ўскосна шляхам выкліку GetString. Такім чынам, як GetString нават атрымліваючы сваю памяць? Ну, атрымліваецца, што ёсць гэта іншая функцыя тут што зараз мы пачнем выкарыстоўваць. Цяпер, гэта выглядае нашмат больш, загадкавае than-- і я адзіны, хто можа бачыць it-- гэтая лінія выглядае шлях больш загадкавымі то ён павінен з першага погляду. Але давайце дражніць яго на часткі. На левым баку, у мяне ёсць сімвал * т. Такім чынам, у англійскай мове, давайце пачнем сфармуляваць належныя прапановы ў тэхнічным жаргоне. Так што гэта вылучае пераменная тыпу гольца * называецца т. Цяпер, што ж гэта на самай справе азначае? Ну, значыць, што я збіраюся паставіць у гэтай зменнай званай т? Адрас гольца. Так што проста прасцей, больш разумны спосаб апісання левую частку. Так што стварае гэта поле толькі тут. Так правая, як мяркуецца, будзе вылучыць, што больш кавалак памяці, як? Так што давайце дражніць гэта адзін ад аднаго. Гэта пераважная на першы погляд, але што адбываецца ўнутры тут? Па-першае, ёсць выдзялення і якія па-відаць, наш новы сябар, "Памяці вылучыць." Так што гэта аргумент перадаецца ў яе, таму што гэта даволі вялікі аргумент. Так што давайце дражніць гэта адзін ад аднаго. StrLen з х, вядома, уяўляе the-- АЎДЫТОРЫЯ: Колькасць знакаў. David J. малая: Проста Колькасць знакаў у с. Такім чынам, даўжыня з, зыходная радок. Такім чынам, G-A-B-E. Так што гэта, верагодна, чатыры ў дадзеным выпадку. Чаму я раблю 1 пасля называючы STRLEN з х? АЎДЫТОРЫЯ: [неразборліва] David J. малая: Для гэтага спецыяльны пусты знак. Калі вы спытаеце мяне, што даўжыня Імя Гейба, я збіраюся сказаць, чатыры. Пад капотам, хоць, мне трэба што пяты байт для нулявога знака. Дык вось чаму я раблю 1. Цяпер на ўсялякі выпадак вы працуеце ў гэтым Праграма на кампутары, чым, скажам, CS50 прыбор, дзе памер гольца можа адрознівацца з майго ўласнага computer-- Атрымліваецца, што я магу назваць гэта Аператар SizeOf, проста спытаць кампутар, што памер асмальваецца на гэтым кампутары? І шляхам множання пяць у гэтым Прыклад па памеры паўкокс, якія на большасці кампутараў будзе быць проста адным, Таноса збіраецца вылучыць для мяне гэта вялікі кавалак памяці тут справа. І гэта будзе return-- гэта function-- так што збіраецца вярнуць мне што? АЎДЫТОРЫЯ: адрас? David J. малая: адрас і што? АЎДЫТОРЫЯ: З памяці гэта выдзелена? David J. малая: З памяці гэта выдзелена. Так што я паняцця не маю ,, шчыра кажучы, дзе гэта будзе ў канчатковым выніку. Я збіраюся прапанаваць, што гэта будзе ў канчатковым выніку на 0x88. Цалкам адвольна, але дзе акрамя 0x50, Так як аперацыйная сістэма, што Вокны і Mac OS зрабіць для мяне, з'яўляецца пераканайцеся, што гэта дае мне розныя кавалкі памяці. Так што гэтае значэнне, дзе гэта кавалак памяці можа ў канчатковым выніку. Дык гэта тое, што трапляе ў тут, 0x88. Так што цяпер ясна, я магу зразумець, што гэта не так жа, як гэта, таму што яны, паказваючы на розных участкаў памяці. Так што, калі я зараз на самай справе хочуць, каб скапіяваць гэты ў, давайце зробім прапанаванага вамі рашэння. Давайце проста пайсці, стварыць цыкл, і зрабіць т кранштэйны я атрымлівае з кранштэйна я. Таму што цяпер я магу выкарыстоўваць гэты масіў, як абазначэнне, таму што, хоць Таноса вельмі у агульным вылучае мне памяць, памяць толькі сумежных байт. Байт, байт, байт, спіна да спіны да спіны. Я магу, вядома, у якасці праграміста разглядаць яго як масіў, які значыць, я магу выкарыстоўваць гэта, нарэшце, знаёмыя абазначэнне ўсяго некалькі квадратных дужках. Такім чынам, дазвольце мне спыніцца там, таму што гэта шмат ўсё адразу, нават хоць асноўная ідэя рэзюмаваць з'яўляецца тое, што радок, увесь гэты час, гэта не новы тып дадзеных як такой. Гэта проста так званы паказальнік, адрас сімвала, якія проста азначае, што гэта лік што ў адпаведнасці з пагадненнем чалавека мы, як правіла, пісаць, як 0x то. Але гэта ўсяго толькі лік, як 33 Оксфард-стрыт, якія, здараецца, Адрас CS будынка. Любыя пытанні па гэтыя дэталі? Так? АЎДЫТОРЫЯ: Чаму мы правяраем для т роўны нулю? David J. малая: Чаму мы праверыць т роўны нулю? Калі мы чытаем documentation-- вялікі question-- для Таноса, ён збіраецца сказаць дробным шрыфтам, часам Таноса можа вярнуцца нуль, як GetString. І на самай справе, GetString вяртае нуль Калі, у сваю чаргу, вяртае нуль Таноса, таму GetString выкарыстоўвае Таноса. І што можа здарыцца, калі АС, Mac OS, Windows, незалежна, проста з памяці для вас. Дык вось, што там адбылося. І дазвольце мне паказаць адну рэч што, магчыма, проста адразу вас наповал або цалкам быць занадта далёка над лініяй. Але дазвольце мне падцягнуць ж для цыклу для капіявання, што хвіліну назад, нагадаем, быў гэта. т кранштэйны я атрымлівае з кранштэйна я. Добры і зручны. Па адчуваннях другога тыдня зноў. Але гэтая версія на самай справе можа быць перапісаць так як гэта, які выглядае загадкава. Гэта паказальнік тэхніка называецца арыфметыка, адрасная арыфметыка. Але чаму гэта працуе? Цяпер раздражняльна, Аўтары C вырашана выкарыстоўваць * Сімвал для розных мэтаў. Мы бачылі гэта раней, як толькі ўжо, сімвал *, што азначае "даць мне зменную што збіраецца ўтрымліваць адрас паўкокс ". Так сімвал * у гэтым кантэксце азначае "даць мне зменную." На жаль, калі вы карыстаецеся * без Слова перад ім, як гольца, гэта цяпер называецца разыменовать аператар. І мы будзем бачыць больш гэтага ў бліжэйшы час. Але гэта проста азначае "пайсці туды." Гэта як сказаць, калі хто ўручыў мне на лістку паперы "33 Оксфард-стрыт," калі я раблю "* 33 Оксфард-стрыт," гэта азначае, што "Пайсці ў будучыні ў будынак КС." Так * проста азначае пайсці туды, калі там няма ні слова перад ім. Так што ж такое т, каб было ясна? т з'яўляецца адрас кавалак памяці, што было дадзена мне. з гэта адрас, што, каб было ясна, у прыкладзе мы абмяркоўвалі, з маленькай Gabe? з гэта адрас of-- АЎДЫТОРЫЯ: Радок. David J. малая: З арыгінальнага назвы Гейба. Так што гэта адрас гэта кавалак памяці. Так што, калі я кажу, т + i-- я, заўважце, проста наш стары сябар. Гэта проста пераменная індэкс які ітэрацыі ад нуля на да да даўжыні радка с. Так што гэта будзе роўны нулю, то адзін, затым два, затым тры, затым чатыры. Так што давайце сабраць гэтыя новыя Скрэтч-як кавалачкі галаваломкі, калі хочаце, хоць, зноў жа, сінтаксіс з'яўляецца значна больш таямніцай, чым нуль. Так т з'яўляецца адрас + я збіраецца даць мне Лік, таму што яны ўсё Нумары, якія мы былі чарцёжныя як HEX. Але яны проста лічбы. Такім чынам, калі адрас т мы сказалі быў 0x88, што 0x88 плюс нуль. Нават калі вас не задавальняе з HEX яшчэ, зрабіць здагадку. АЎДЫТОРЫЯ: Арыгінальны. David J. малая: Яшчэ 0x88. Такім чынам, што ж * 0x88 азначае? Гэта азначае, "пайсці туды", што азначае эфектыўна, "падай палец твой сюды." І зараз на правай баку гэты выраз, * а затым у дужках ,, S + I азначае S, якое з'яўляецца звярнуцца сюды з маленькага г. S + 0, вядома, з, што з'яўляецца с. Так што цяпер, гэта * с, што гэтак жа, як * 33 Оксфард-стрыт азначае перайсці па адрасе с. Дык вось гэты палец, правая рука. Так што я збіраюся скапіяваць у чым? Справа аб праве, якое з'яўляецца Гейб, трохі г тут, у тут. І таму эфект, што першая ітэрацыя цыклу, як вы прапанавалі, хоць гэта выглядае розуму складаней, чым усе мы бачылі раней, проста кажа зайдзіце сюды і скапіяваць гэты сімвал тут. Гэта дае вам карту да абодвух месцах. І мы ўбачым значна больш гэтага. Але цяпер, спадзяюся, гэта проста ўвесці некаторыя з гэтых асноўных ідэй. І на самай справе, давайце паглядзім на адзін канчатковую праграму тут, а затым паабяцаў Claymation, што зробіць усё ў парадку. Добра. Такім чынам, дазвольце мне адкрыць up-- там мы ідзем. Так што давайце мне-- мы вернемся да гэтай карціны да таго часу. Дазвольце мне адкрыць гэты апошні прыклад тут. Дык вось гэта супер, супер праграма, якая выконвае нішто ў жыцці, што робіць наступнае. Гэта першая заяўляе дзве зменныя, х і у, што не лічбы на гэты раз, як такія. Яны не цэлыя лікі, па сабе. Яны, відаць дзесятковага *. Так што проста хто, што гэта значыць калі тыпам дадзеных, зменная, мае тып дзесятковага * зоркі? Гэта адрас у міжнар. Так што я паняцця не маю, дзе гэта яшчэ. Гэта проста азначае "паставіць, у рэшце рэшт, адрас у міжнар тут ". 0x50, 0x88, там, дзе гэта ў памяці, адрас ісці туды. І вось што ў ёсць будзе, а. Калі я зараз кажу х = Таноса (SizeOf (INT)), гэта мудрагелісты спосаб сказаць, эй аперацыйная сістэма, з дапамогай Таноса, даць мне дастаткова памяці для памеру з Int, які, верагодна, будзе 32 біта ці чатыры байта. Такім чынам, што ж Таноса вярнуцца? Malloc вяртае адрас. Так што ж адбываецца, каб захоўваць у х? Адрас кавалак памяці, чатыры байта, што Таноса толькі што знайшоў для мяне, задаючы аперацыйная сістэма. Цяпер тое ж час, лінія чатыры тут, * х = 42. Проста каб быць ясна, што адбываецца там, унізе? На левым баку, * х. вось як * 33 Оксфард-стрыт. Так * х азначае? АЎДЫТОРЫЯ: К. David J. малая: Да гэтага адрасе. Дзе б што кавалак памяць, ісці да яе. І пакласці тое, што ёсць, відавочна ,? АЎДЫТОРЫЯ: 42. David J. малая: 42. Добра, * у, тая ж ідэя. Да адрасе ў у. Пакажыце нумар 13 ёсць, але тое, што ў на дадзены момант? АЎДЫТОРЫЯ: Там няма памяці для у. David J. малая: Там няма памяці для у. Такім чынам, што ж у верагодна ўтрымліваюць, як мы казалі? АЎДЫТОРЫЯ: Garbage. David J. малая: Некаторыя значэнне смецця. Зараз, значэнне смецце па-ранейшаму шэраг. Ён па-ранейшаму можа быць памылкова прынята за адрас. Гэта як калі б хто-то надрапаў то ўніз, і я няправільна яго ў тым сэнсе, некаторыя будынкі па вуліцы. І калі вы проста паспрабуйце ўвайсці ў некаторыя будынкі вы не з'яўляецеся уладальнікам, ці некаторыя кавалак памяці ў вас не быў зададзены, дрэнныя рэчы могуць здарыцца. Кампутар можа завіснуць, ці іншы Не вызначана паводзіны можа здарыцца. Так інтра, затым, каб Binky гэта. Я да гэтага часу памятаю, 20 невялікім гадоў праз, дзе я быў, калі я, нарэшце, зразумеў паказальнікі. Які павінен сказаць, калі вы пакінуць тут у тры хвіліны і думаю, што я не зразумець паказальнікі, рэалізаваць Я ўспомніў для 20 гадоў для некаторых вар'яцкай прычыне калі і чаму ён, нарэшце, затануў ў, седзячы з маім вучэннем малайчына, Нишат Мехта ў Задняя Эліёт сталовую. Зараз, я ўспомніў гэта таму, што гэта было адной з тым я, у прыватнасці, змагаўся з. А потым, ён, нарэшце, націснуў, як я маю права гаварыць, шмат пытанняў у канчатковым выніку будзе. І зараз, каб зрабіць, што адчуваю ўсё больш шчаслівым і тым больш пераканаўча, давайце канчатковы выгляд у нашай Апошнія тры хвіліны тут у Binky, ад нашага сябра, Ніка Parlante з Стэнфорда. [ВИДЕОВОСПРОИЗВЕДЕНИЕ] Эй, Бинки. Прачынайся! Гэта час для паказальніка весялосці. -што Што? Даведайцеся аб паказальнікаў? О, станоўчы герой! Ну, для пачатку, я думаю, мы спатрэбіцца пару паказальнікаў. -OK. Гэты код вылучае два паказальніка, якія могуць паказваць на цэлых лікаў. -OK. Ну, я бачу два паказальніка, але яны не падаецца, паказваючы ні да чаго. -Верно. Першапачаткова, паказальнікі не паказвае ні на што. Рэчы, якія яны паказваюць на называюцца pointees, і іх стварэнні гадоў асобны крок. О, дакладна, дакладна. Я ведаў, што. У pointees паасобныя. Э-э, так як у такім выпадку размеркаваць pointee? -OK. Ну, гэты код вылучае новы цэлае pointee, і гэтая частка камплектаў х, каб паказаць на яго. Гэй, што выглядае лепш. Так што гэта нешта рабіць. -OK. Я буду разыменовать паказальніка х да захаваць нумар 42 у яго pointee. Для гэтага трука, мне трэба маё Чароўная палачка разнаймення. -Ваш Чароўная палачка з разнаймення? That-- гэта выдатна. -гэта Што код выглядае. Я проста ўсталяваць колькасць і [POP] Гэй, паглядзіце. Там ён ідзе. -так Рабіць разнаймення на х наступным чынам стрэлкай для яго pointee. У гэтым выпадку, крама 42 там. Эй паспрабуйце выкарыстоўваць яго, каб захаваць нумар 13 праз іншы паказальнік, у. -OK. Я проста пайду сюды, каб у, і атрымаць лік 13 створана. А потым, узяць жазло Разнаймення і проста [Базз] Ох! Ох, эй! Гэта не спрацавала. Скажыце, Бинки, я не думаю, што разнаймення у гэта добрая ідэя, таму што вы ведаеце, наладзе pointee асобны крок. І я не думаю, што мы ніколі гэта зрабіў. Добры кропка. -Так. Мы вылучылі паказальніка у, але мы ніколі не ўсталяваць яго, каб паказаць на pointee. -Вельмі Назіральнасць. Гэй, вы шукаеце добрае і там, Бинки. Вы можаце гэта выправіць, так што ў пункту да таго ж pointee як х? -Вядома. Я буду выкарыстоўваць свой Magic Wand з Pointer уступцы. -Гэта Будзе Праблема, як раней? -нет. Гэта не тычыцца pointees. Гэта проста мяняе адзін паказальнік на паказваюць на тое ж самае, іншы. О, я бачу. Цяпер у паказвае на тое ж месца, што і х. Так што чакайце. Цяпер, у фіксуецца. Ён мае pointee. Такім чынам, вы можаце паспрабаваць жазло Разнаймення зноў адправіць 13 на працягу. -мм, ОК. Вось ён ідзе. [POP] Гэй, паглядзіце на гэта. Цяпер разнаймення работ па у. І таму, што паказальнікі абмену што адной pointee, яны абодва ўбачыць 13. -Так. Абмен, што заўгодна. Гэтак жа мы будзем, каб памяняцца месцамі з прадпрыемствам? О, глядзіце. Мы па-за часам. -But-- -Проста Памятаць тры правілы паказальнікаў. Нумар адзін, асноўная структура з'яўляецца тое, што ў вас ёсць паказальнік, і гэта паказвае больш да pointee. Але ўказальнік і pointee паасобныя, і распаўсюджаная памылка з'яўляецца стварэнне паказальнік, але забыцца даць яму pointee. Нумар Два, разнаймення паказальніка пачынаецца з паказальнікам і наступным яго стрэлку над каб атрымаць доступ да яго pointee. Як мы ўсе ведаем, гэта працуе толькі, калі ёсць pointee, які выгляд вяртаецца да Правіла нумар адзін. Нумар Тры, паказальнік прысвойванне аднаго паказальніка і змяняе яго, каб паказаць на ж pointee як іншы паказальнік. Такім чынам, пасля выканання задання, два паказальніка будзе паказваць на той жа pointee. Часам, што называецца абмен. І гэта ўсё, што трэба зрабіць, на самай справе. Да пабачэння цяпер. [END ВИДЕОВОСПРОИЗВЕДЕНИЕ] David J. малая: Вось менавіта для CS50. Мы будзем бачыць вас на наступным тыдні.