DAVID малая: Добры дзень, і дабро запрашаем назад у CS50. Так што гэта ў канцы тыдня чатыры. Толькі адно аб'яву ў першую чаргу. Такім чынам, так званы пяты панядзелак прыдумляць наступны панядзелак. Гэта магчымасць перайсці ад СБ / ненасычанага на ліст класе, або з літарную СБ / ненасычанага. Прыкра, што працэс патрабуе подпісы, таму што вы павінны запоўніць адзін з тых, ружовы ўводу / высновы формаў. Таму што тэхнічна, СБ / ненасычанага версіі і версіі літарную маюць розныя нумары па каталогу. Але ніякае грандыёзнае прадпрыемства. Проста прыходзіце да мяне ці да адзежу або Ларэн ў любы момант. Або напішыце нам, калі ў вас няма выгляду дакументаў вам трэба сёння, і мы будзеце ўпэўнены, каб дапамагчы вам прыняць догляд за што да панядзелка. Добра, так што сёння - На самай справе, ёсць нешта накшталт рэха. Ці можам мы тон мяне крыху? ОК. Такім чынам, сёння мы ўводзім тэму вядомы як паказальнікі. І я прызнаю, што гэта адзін з больш складаныя тэмы, якія мы, як правіла, ахопліваюць ў гэтым класе, ці сапраўды любы ўводны курс, які выкарыстоўвае C. Але паверце мне на слова гэта, у прыватнасці, Калі ваш розум адчувае сябе крыху больш выгнутыя сёння і ў бліжэйшыя тыдні. Гэта не прадстаўнік вы атрымліваеце горш у гэта гэта проста азначае, што гэта асабліва складаныя тэмы Я абяцаю, што, праз некалькі тыдняў Такім чынам, будзе здавацца занадта ашаламляльна просты ў рэтраспектыве. Я ўсё яшчэ памятаю па гэты дзень. Я сядзеў у Эліат сталовая, седзячы побач з маім TF Нишат Мехта, які быў жыхаром Elliott House. І чамусьці, гэтая Тэма проста клікаў. Які павінен сказаць, што я таксама змагаўся з ім на працягу некаторага колькасці часу, але я зраблю ўсё магчымае, каб дапамагчы пазбегнуць такіх барацьба з тымі, што ў канчатковым рахунку з'яўляецца досыць магутным. На самай справе, адна з тэм, якія мы будзем абмяркоўваць У бліжэйшыя тыдні ў тым, што бяспекі, і як вы можаце на самой справе эксплуатаваць машыны такім чынам, якія не былі прызначаны. А тыя, як правіла, exploitations вынікам памылкі, памылкі, якія мы людзі робяць, а не разумення некаторых ад канкрэтнай рэалізацыі больш падрабязна праз якія праграмы зрабілі. Зараз, каб зрабіць гэта здаецца ўсё больш карыстальнікаў добразычлівы, я думаў, што я буду гуляць 10 секундны фрагмент трохі Claymation лічбу назваў Binky які быў дастаўлены ў жыцця нашага сябра ў Стэнфардзе, Прафесар Нік Parlante. Так што дазвольце мне даць вам гэта тізер Binky тут. [Прайграванне відэа] -Гэй, Бинки. Прачнуцца. Гэта час для паказальніка весела. -Што гэта? Даведайцеся аб паказальнікі? О, станоўчы герой. [КАНЕЦ ВИДЕОВОСПРОИЗВЕДЕНИЕ] DAVID малая: Гэта Стэнфардзе інфарматыкі. Так пра гэта ў будучыні. [Апладысменты] DAVID малая: Прабач, Нік. Таму нагадаем, што ў мінулы раз мы скончылі на гэта сапраўды захапляльнае захапляльным прычым гэтая функцыя проста не працуе. Па крайняй меры, інтуітыўна, ён адчуваў як яна павінна працаваць. Проста памяняць месцамі значэнні двух цэлых лікаў. Але нагадаем, што, калі мы выводзім зыходных значэнняў у асноўным, адзін і два, яны былі ўсё яшчэ адно і два, а не дзве, а адну. Такім чынам, дазвольце мне на самай справе пераключэння больш да прыбора. І я напісаў трохі кода ў шкілетных прасоўвання тут, дзе я сцвярджаю, што X будзе 1, у 2 будзе. Я затым раздрукаваць і іх Значэнні F з пячаткай. Я тады сцвярджаць, што тут мы збіраемся памяняць іх месцамі. Я пакінуў пустое месца тут для нас запоўніць сёння праз хвіліну. Тады, я буду сцвярджаць, што двух зменных былі абмяняны. Тады я збіраюся раздрукаваць іх зноў. І так, мы спадзяемся, я павінен бачыць 1, 2. 2, 1. Гэта супер проста мэта цяпер. Так як жа нам ісці аб абмене двух зменных? Ну, калі я прапаную тут, што гэтыя кубкі можа прадстаўляць памяці ў кампутары. Гэта некалькі укусаў, гэта Іншы некалькі укусаў. Ці маглі мы валанцёр падымайся і змяшаць нам выпіць, калі знаёмыя? Падымайся. Як цябе завуць? Джэсі: Джэс. DAVID малая: Джэс? Падымайся, Джэс. Калі вы не пярэчыце, мы павінны пакласці Google шкла на вас, каб мы маглі увекавечыць гэта. Добра, шкла. Запіс відэа. І добра, што мы добрыя, каб пайсці з Джэс тут. Добра. Вельмі прыемна. Так што я хацеў бы вам зрабіць тут - калі б вы маглі, досыць хутка - проста лье нам палову шклянкі апельсінавага соку і паўшклянкі малака прадстаўляе эфектыўна лічбамі 1 У адной кубку і 2 у іншы кубку. Гэта збіраецца быць добрыя кадры. JESS: Выбачайце. DAVID малая: Не, няма. Усё ў парадку. Ніцу. Добра, у нас ёсць чатыры байта Варта апельсінавага соку. Мы назвалі яго значэнне 1. Цяпер яшчэ чатыры байта варта малака. Будзем называць яго значэнне 2. Так што х і у, адпаведна. Добра, так што цяпер, калі задачы - для вас, Джэс, на вачах ва ўсіх з вашых аднакласнікаў - з'яўляецца замена значэнні х і ў такія, што мы хочам, апельсінавы сок у іншы кубку і малако ў чару гэтую, як можа вас - перш чым на самай справе гэта - ісці пра гэта? Добра, мудрае рашэнне. Так што вам трэба крыху больш памяці. Так што давайце вылучыць часовае кубак, калі вы будзеце. А зараз пяройдзем да памяняць х і у. Выдатна. Так што вельмі добра зроблена. Вялікае вам дзякуй, Джэс. Вось, калі ласка. Невялікі сувенір. Добра, такім чынам, відавочна, супер проста ідэя. Цалкам інтуітыўна, што нам трэба крыху больш месца для захоўвання - у такім выглядзе, кубак - калі мы сапраўды хочам памяняць гэтых двух зменных. Так што давайце рабіць менавіта гэта. Тут, у паміж тым, дзе я сцвярджаю, што я збіраюся рабіць некаторыя замены, я буду ісці наперад і аб'явіць тэмп. І я буду яго роўным, скажам, х. Тады я збіраюся змяніць значэнне X гэтак жа, як Джэс зрабіў тут з малако і апельсінавы сок роўным у. І я збіраюся змяніць Y роўным ня х, таму што цяпер мы будзем затрымаўся ў круг, а тэмп. Там, дзе я часова - ці там, дзе Джэс часова адкласці апельсінавы сок да заціраньня, што кубкі з малаком. Такім чынам, дазвольце мне цяпер ісці наперад і зрабіць гэта. Яна называецца noswap.c. А цяпер дазвольце мне працаваць не свопу. І на самай справе я бачу, калі я Пашыраюцца вокны трохі, што х роўны 1, у роўны 2. , А затым х 2, у = 1. Але нагадаем, што ў панядзелак мы зрабілі рэчы крыху па-іншаму якой я , Рэалізуюцца дапаможныя функцыі, калі хочаце, што было на самай справе пустата. Я назваў яго памяняць. Я даў ёй два параметры, і я патэлефанаваў іх і я назваў іх б. Шчыра кажучы, я мог бы назваць іх х і у. Там нішто не перашкаджае мяне ад гэтага. Але я б сказаў, што гэта тое трохі двухсэнсоўна. Таму нагадаем, што ў панядзелак мы сцвярджаюць, што гэтыя параметры былі копіі значэнняў прайшло цалі Так што проста псуе з ўвазе, я думаю, калі вы карыстаецеся сапраўды гэтак жа зменных. Так што я буду называць іх замест і В, толькі для яснасці. Але мы маглі б назваць іх найбольш усё, што хочам. І я збіраюся капіяваць і ўстаўляць эфектыўна гэты код ад там ўніз ў тут. Таму што я толькі што бачыў, што ён працуе. Дык вось у даволі добрай форме. І я змяню сваё х к, х мая а, у майго б і ў майго б. Такім чынам, іншымі словамі, тыя ж логікай. Адно і тое ж, што Джэс зрабіў. А потым адна рэч, я павінен зрабіць да Тут, вядома, цяпер спасылацца на гэта функцыі або выклікаць гэтую функцыю. Так што я буду называць гэтую функцыю з двума уваходаў, х і у, і націсніце Захаваць. Добра, прынцыпова тое ж самае. На самай справе, я, верагодна, зрабілі праграму залішне складаным шляхам пішаце функцыю, якая проста прымае каля шасці радкоў кода, тады як я раней рэалізаваныя гэта ўсяго за тры. Такім чынам, дазвольце мне цяпер ісці наперад і перарабіць гэтага не робяць swap. Добра, я аблажаўся тут. Гэта павінна быць памылак, якія могуць гл. ўсё больш шырока, як ваша Праграмы становяцца ўсё больш складанымі. Але ёсць лёгка выправіць. Дазвольце мне пракруткі вярнуцца сюды. І тое, што першая памылка, што я бачу? Няяўная дэкларацыя. Што гэта звычайна паказваюць? Ой, я забыўся прататып. Я забыўся навучыць кампілятар, які своп будзе існаваць, хоць ён не існуе ў самым пачатку праграмы. Так што я проста хацеў сказаць пустэчу, своп, Інтэлект, Перахоп INT B, кропкай з коскі. Так што я не збіраюся перавызначыць яе. Але цяпер гэта адпавядае таму, што гэта тут. І заўважце, адсутнасць кропкі з коскай тут, які не з'яўляецца неабходным, калі рэалізацыі. Такім чынам, дазвольце мне перарабіць гэта, можаце не свопу. Значна лепшай форме. Уцякайце ня свопу. І чорт пабяры. Цяпер мы вярнуліся, дзе мы былі ў панядзелак, дзе рэч не памяняць. І тое, што інтуітыўнае тлумачэнне , Чаму гэта так? Да? Студэнт: [неразборліва]. DAVID малая: Цалкам дакладна. Так што А і У з'яўляюцца копіямі х і у. І на самай справе, у любы час вы былі выкліку функцыі да гэтага часу, што перадае зменныя, як цэлыя - гэтак жа, як своп чакае тут - Вы, хлопцы, які праходзіць у копіях. Зараз, азначае, што яна займае крыху часу, долі секунды, для Кампутар для капіявання бітаў з аднаго пераменная у біты з адным. Але гэта не такое ўжо вялікая справа. Але яны, тым не менш копію. І вось зараз, у кантэксце абмену, Я на самой справе паспяхова змены і б. На самай справе, давайце рабіць хуткія санітарнай праверкі. Друк F з'яўляецца% I, новая радок. І падключыць давайце ст. Зараз давайце зробім тое ж самае з б. І давайце рабіць тое ж самае тут. А цяпер, дазвольце мне скапіяваць гэтыя жа лініі зноў у ніжняй частцы функцыі пасля маіх трох ліній цікавага маглі б пакаралі смерцю, а раздрукаваць і B яшчэ раз. Такім чынам, зараз давайце зробім гэта, не рабіце swap. Дазвольце мне зрабіць акно тэрмінала крыху вышэй, так што мы можам бачыць больш яго адразу. І ніколі працаваць не свопу. х роўны 1, у роўны 2. = 1, B = 2. І потым, а роўна 2, B = 1. Так ён працуе, як і Джэс зрабіў тут ўнутры swap. Але, вядома, ён не застаецца ніякай эфект на зменныя ў асноўны. Такім чынам, мы ўбачылі трук, з дапамогай якога мы магла б гэта выправіць, ці не так? Калі вы сутыкнуліся з гэтай агляднай Пытанне, можна проста пласкадонку і зрабіць X Y і якія зменныя замест гэтага? Вы маглі б зрабіць іх глабальнымі. Пакладзіце іх у самым пачатку файла як і мы, нават у гульні 15. Мы выкарыстоўваем глабальную зменную. Аднак у кантэксце гульні 15, гэта разумна мець глабальнае пераменная, якая прадстаўляе дошку, таму што паўната 15.С ўсё аб рэалізацыі гэтай гульні. Гэта тое, што файл існуе, каб зрабіць. Але ў дадзеным выпадку тут, я выкліку функцыі swap. Я хачу, каб памяняць двух зменных. І яна павінна пачаць адчуваць сябе так жа неакуратна калі рашэнне ўсіх нашых праблемы, калі мы бяжым у вобласць пытанні, гэта зрабіць яго глабальным. Таму што вельмі хутка наша праграма збіраецца стаць сапраўдны беспарадак. І мы зрабілі гэта вельмі эканомна У выніку ў 15.c. Але, аказваецца, ёсць Лепшы спосаб у цэлым. Дазвольце мне на самай справе вярнуцца і выдаліць раздрукаваць F, усяго спрасціць гэты код. І дазвольце мне прапанаваць, што гэта, сапраўды, дрэнна. Але калі б я замест гэтага дадаць у некаторых зорачкамі і зоркі, я магу ператварыць гэта замест функцыі ў той, які на самай справе працуе. Такім чынам, дазвольце мне вярнуцца сюды і прызнацца кажучы зорачкамі заўсёды цяжка, Таму я скажу так зоркі. Я проста прызнацца да таго. Добра. А цяпер, што я збіраюся зрабіць замест гэтага? Такім чынам, перш за ўсё, я збіраюся задаць што замест праходжання ў дзесятковай своп функцыі, я замест з збіраўся сказаць дзесятковага зоркі. Такім чынам, што ж зоркі паказваюць? Гэта паняцце, што паказальнік, які Бинки, Claymation характарам, быў спасылаючыся на імгненне таму. Так што калі мы гаворым дзесятковага зоркі, сэнс гэта цяпер, што не збіраецца быць прайшла ў яго значэннем. Гэта не збіраецца быць скапіяваныя цалі Хутчэй, адрас з'яўляецца будзе перадавацца цалі Таму нагадаем, што ўнутры кампутара цэлая куча памяці, у адваротным выпадку вядомай як АЗП. І гэта толькі RAM цэлая куча байтаў. Так што калі ваш Mac ці ваш кампутар мае два гігабайта, у вас ёсць 2 мільярд байт памяці. Зараз давайце выкажам здагадку, што проста трымаць рэчы добра і арганізавана, мы прызначыць адрас - нумар - ў кожны байт аператыўнай памяці на вашым кампутары. Самы першы байт з тых 2 млрд. па ліку нуля. Наступны байт з'яўляецца нумарам адзін, колькасць два, усю дарогу на уверх, кропка кропка кропкі, прыкладна 2 мільярды даляраў. Так што вы можаце колькасці байтаў памяці ў кампутары. Такім чынам, давайце выкажам здагадку, што гэта тое, што мы маем на ўвазе пад адрасам. Таму, калі я бачу дзесятковага зоркі, што адбываецца павінны быць прапушчаны праз своп у цяперашні час з'яўляецца адрас. Не яго кошт, але ўсё, што яго паштовы адрас, так бы мовіць - яго размяшчэнне ў памяці. І аналагічна для У, я збіраюся сказаць тое ж самае. Int, зорка, б. Як у баку, тэхнічна зоркі маглі б пайсці ў іншыя месцы. Але мы будзем стандартаваць зорка з'яўляецца ў непасрэднай блізкасці ад тыпу дадзеных. Так своп подпісы цяпер азначае, дай мне адрас Інтэлект, і выклік гэты адрас. І дай мне іншы адрас Int і называць гэты адрас б. Але цяпер мой код тут павінна змяніцца. Таму што, калі я заяўляю дзесятковага Temp - які да гэтага часу тыпу Int - але я захоўваю ў ім, якія каштоўнасці? Каб было ясна, я Увод з код як напісана прама цяпер? Я стаўлю размяшчэнне ў. Але я не клапоцяцца аб месца ў цяперашні час, ці не так? Temp існуе толькі траціну шклянкі Джес існаваў, з якой мэтай? Для захавання значэння. Малако або апельсінавы сок. Ня фактычна захоўваць адрасы небудзь з тых рэчаў, якая адчувае сябе крыху бессэнсоўнае у гэтым рэальным сусветнай кантэкст у любым выпадку. Так на самай справе, тое, што я хачу паставіць у Temp не зьяўляецца адрасам, але Змест. Так што калі гэты лік, як 123, гэта 123. Байт памяці, што справядлівы здараецца, акупацыйнай, што значэнне У здараецца акупацыйнымі. Калі я хачу пайсці на гэты адрас, Я павінен сказаць, зоркі. Аналагічным чынам, калі б я павінен быў змяніць тое, што па адрасе, я мяняю гэта для пачатку. Калі я хачу захаваць у тым, што, па меншай Размяшчэнне з тым, што на месцы у B, B зоркі зоркі. Карацей кажучы, нават калі гэта не зусім патанаючы ў яшчэ - і я б не чакаў што яна будзе так хутка - разумець, што ўсё што я раблю, папярэднічаючы гэтыя зоркі да майго зменных, кажу, не захапіць каштоўнасці. Не змяняйце значэння. Але, хутчэй, ісці на гэтыя адрасы і атрымаць значэнне. Да гэтага адрасе і змены значэнне там. Так што цяпер дазвольце мне пракручваць наперад да самага верху, толькі для выпраўлення гэтай лініі тут, каб змяніць прататып, каб адпавядаць. Але мне зараз трэба зрабіць яшчэ адну рэч. Інтуітыўна, калі я змяніў тыпы аргументаў, якія своп чакае, Што яшчэ мне трэба змяніць у маім кодзе? Калі я тэлефаную swap. Таму што цяпер, што ж мне Я пераходзячы да яшчэ памяняць? Х каштоўнасць і значэнне у, або малака і апельсінавы сок. Але я не хачу гэтага рабіць. Замест гэтага я хачу перадаць у чым? Размяшчэнне х і размяшчэнне у. Якія іх паштовыя адрасы, так бы мовіць. Такім чынам, каб зрабіць гэта, ёсць Ампэрсанд. Ampersand выгляду гучыць як адрасу. т. п., Ампэрсанд, адрас х, а таксама адрас у. Так што гэта наўмыснае, якія мы выкарыстоўваем амперсанда пры выкліку функцыі, і зоркі пры аб'яўленні і калі рэалізацыі функцыі. І толькі падумайце, як Ампэрсанд адрас аператара і зоркі, як туды аператара - ці, дакладней, аператар разнаймення. Так што ў цэлым шмат слоў проста сказаць, што цяпер, спадзяюся, своп будзе правільнымі. Дазвольце мне пайсці далей і зрабіць - давайце на самай справе перайменаваць файл, каб гэтая праграма па-ранейшаму не будуць называць не свопу. Я сцвярджаю, што мы будзем называць яго swap.c цяпер. Таму пераканайцеся, своп. Кропкі, нахільнай рысы памяняць. А цяпер сапраўды, х = 1, у = 2. І затым, х роўны 2, у роўна адзінцы. Ну давайце паглядзім, калі мы не можам зрабіць гэтага крыху па-іншаму, як да таго, што тут адбываецца. Па-першае, дазвольце мне павялічыць на наш малявання экрана тут. І дазвольце мне прапанаваць на імгненне - і кожны раз, калі я малюю тут будзе люстрана там цяпер - дазвольце мне прапанаваць, што Тут цэлая куча памяці, або Аператыўнай памяці, ўнутры майго кампутара. І гэта будзе ўкус колькасці, скажам, 1. Гэта будзе байт нумар 2. І я зраблю цэлы букет больш, і Затым куча шматкроп'е шматкроп'е кропку, каб паказваюць, што ёсць 2000000000 з гэтых рэчаў. 4, 5, і гэтак далей. Такім чынам, ёсць першыя пяць байтаў памяці майго кампутара. Усё ў парадку? Вельмі нешматлікія з 2000000000. Але цяпер я збіраюся прапанаваць наступным. Я збіраюся прапанаваць, каб X збіраецца захаваць нумар 1, а Y будзе , Каб захаваць нумар 2. І дазвольце мне цяпер ісці наперад і ўяўляе гэтыя значэнні наступным чынам. Давайце зробім гэта наступным чынам. Дайце мне ўсяго за адну секунду. Адна секунда. ОК. Я хачу зрабіць гэта крыху - давайце зробім гэта зноў. У адваротным выпадку я збіраюся і выкарыстанне тыя ж нумары, ненаўмысна, некалькі разоў. Так што ў нас ёсць розныя нумары пра што пагаварыць, давайце назавем гэты байт нумар 123, 124, 125, 126, і кропка кропка кропка. І дазвольце мне сцвярджаць цяпер, што я збіраюся змясціць значэнне 1 тут, і значэнне 2 Тут, інакш вядомы як х і у. Так ужо здарылася, што гэта х, гэта ў. І толькі некаторыя выпадковасці, кампутар, аперацыйная сістэма, адбылося пакласці х па месцы знаходжання нумар 123. І ў скончылі ў размяшчэнне 124 - чорт пабяры. Я павінен быў гэта выправіў. Аб чалавек, я сапраўды хачу гэта зрабіць? Так, я хачу, каб выправіць гэта і У належнае пра гэта сёння. На жаль, пачатковец ў гэтым. 127, 131, і я не хачу быць гэтым складана, але чаму я змяніць нумарах ёсць? Таму што я хачу, каб цэлымі на самай справе ў чатыры байта. Так што давайце быць супер анальны пра гэта. Так што калі 1 адбываецца вырашаць 123, 2 будзе па адрасе 127, таму што гэта ўсяго ў 4 развітання далёка. Вось і ўсё. І мы забудзем пра ўсе іншых адрасах у свеце. Так што х знаходзіцца ў месцазнаходжанні 123, Y знаходзіцца ў месцазнаходжанні 127. А цяпер, што ж я на самой справе хочаце зрабіць? Калі я тэлефаную своп Цяпер, што адбываецца на самай справе? Ну, калі я называю своп, я перадаю ў адрас х а таксама адрас у. Так, напрыклад, калі гэтыя дзве часткі паперы ў цяперашні час уяўляюць два Аргументы і B памяняць, тое, што я збіраюся напісаць на першым з іх, якога я буду называць называць? Сапраўды, 123. Так што гэта я сцвярджаю гэта. Гэта параметр. Я стаўлю адрас X ст там. Што гэта? Што гэта? Не, няма. Гэта нармальна. Тым не менш добра, усё яшчэ добра. Так што гэта. А цяпер на другі ліст паперы, гэта будзе B, і што я збіраюся пісаць на гэтая паперка? 127. Так што адзінае, што змянілася ў параўнанні з нашы папярэднія паказальным гэтай гісторыі, літаральна, а не 1 і 2, я збіраецца прайсці ў 123 і 127. І я зараз збіраюся паставіць ўнутры гэтых з гэтай рамкі, усё ў парадку? Так што чорны скрыню ў цяперашні час уяўляе своп функцыі. Між тым, давайце зараз ёсць хто-то ажыццяўляць своп функцыі. Хтосьці тут хацеў стаць валанцёрам? Падымайся. Як цябе завуць? Чарлі. Добра, Чарлі. Падымайся. Так што Чарлі будзе гуляць ролю нашага чорнага скрыні. І Чарлі, што я б хацеў, каб вы Цяпер будзе ажыццяўляць абмен такім чынам , Што з улікам гэтых двух адрасы, Вы былі на самай справе адбываецца для змены значэнняў. І я буду шаптаць вам на вуха як запусціць тэлебачанне тут. Так што давай, а ты чорны скрыню. Reach ў там. Якія каштоўнасці Вы бачыце, і якія каштоўнасці вы бачыце для B? Чарлі: складае 123 і У 127. DAVID малая: ОК, гэта дакладна. Цяпер спынімся там на імгненне. Першае, што вы збіраецеся рабіць цяпер, ў адпаведнасці з кодам, - якія Цяпер я буду цягнуць на экране - будзе вылучыць некалькі біт памяці называецца тэмп. Так што я збіраюся ісці наперад і даць вам, што памяці. Так што гэта будзе трэцяя пераменная што ў вас ёсць даступнымі для Вы назвалі тэмп. І што вы збіраецеся напісаць Тэмпература на аркушы паперы? Чарлі: паказальнікі, ці не так? DAVID малая: Добра, ну не абавязкова паказальнікаў. Такім чынам, радок кода, што я вылучаныя на правай баку, давайце пачнем там. Гэта кажа зорка. Так у цяперашні час захоўвання нумар 123. І гэтак жа, інтуітыўна, што зрабіў зоркай 123 азначае? А канкрэтна, калі гэта 123, зорка азначае, што? Значэнне. Або больш нядбайна, ідзіце туды. Такім чынам, дазвольце мне прапанаваць, што, трымаючы ў рукі, ісці наперад і лячэння, што як быццам гэта карта. І хадзіць да сябе кампутара памяці, і знайсці тое, што нам у пункце 123. Менавіта так. Такім чынам, мы бачым у размяшчэнні 123 гэта тое, што, відавочна? Такім чынам, якое значэнне цяпер Вы збіраюцца паставіць у ТЕМР? Менавіта так. Так што ісці наперад і рабіць гэта. І напісаць нумар 1 на кавалак паперы, што ў цяперашні час пад назвай тэмп. А цяпер наступны крок, які Вы збіраецеся рэалізаваць будзе што. Ну, з правага боку Наступны радок кода з'яўляецца зоркай б. B, з Вядома, захоўваюцца адрасы. У якім разглядаюцца 127. Зорка B азначае, што, выпадкова кажу? Перайдзіце ў тэчку. Так ідуць наперад і знайсці нам, што у пункце 127. ОК. Вядома, у становішча 127, ранейшаму значэння 2. Дык чаго ж вы цяпер збіраецеся захоўваць пры Што б ні было на месцы ў? Так зоркі сродкі ідуць на месца. Што такое размяшчэнне? Менавіта так. Так што цяпер, калі вы хочаце змяніць што ў гэтым месцы - Я буду ісці наперад і запусціць Гумка тут. І цяпер вярнуць яго на пэндзля. Які нумар вы збіраецеся напісаць у гэтым пустое поле зараз? Менавіта так. Так што гэты радок кода, каб было ясна - хай мне перапыніцца, што Чарлі робіць і адзначыць тут, што ён толькі што зрабілі гэта напісаць у гэтую скрынку ў размяшчэнні 123 значэнне, якое было раней у б. І таму мы цяпер сапраўды рэалізавана гэты другі радкі кода. Цяпер, на жаль, ёсць яшчэ адна лінія застаецца. Цяпер тое, што ў тэмп, у літаральным сэнсе? Відавочна, што гэта нумар адзін. Гэта не адрас. Гэта проста ліку, роду зменную з аднаго тыдня. І зараз, калі вы кажаце, зоркі B, гэта азначае, што перайсці па адрасе B, якая мае Вядома тут. Таму, як толькі вы атрымаеце там - Я буду ісці наперад і сцерці тое, што на самой справе там - і што вы збіраюся напісаць новай пазіцыі 127? ЧАРЛІ: Тэмп, які з'яўляецца адным. DAVID малая: Тэмп, які з'яўляецца адным. І што адбываецца з тэмпературай у рэшце рэшт? Ну, мы не ведаем. Мы сапраўды не клапоцяцца. Кожны раз, калі мы рэалізавалі функцыю Да гэтага часу ўсіх лакальных зменных ў вас ёсць сапраўды з'яўляюцца лакальнымі. І яны проста знікаюць. Яны утылізаваны ў аперацыйнай сістэма ў канчатковым выніку. Такім чынам, той факт, што тэмпература па-ранейшаму мае Значэнне 1 з'яўляецца свайго роду прынцыпова нецікавыя. Добра, апладысменты калі б мы маглі для Чарлі. Вельмі добра зроблена. Добра, так пра што яшчэ робіць гэта азначае, што мы можам зрабіць? Вось і атрымліваецца, што мы былі казаць некалькі белых хлусні на працягу досыць доўгага часу. На самай справе, атрымліваецца, што радок, ўвесь гэты час, на самай справе не паслядоўнасць знакаў, як такіх. Гэта збольшага з'яўляецца тое, што інтуітыўна. Але з фармальнага пункту гледжання, радок Тып дадзеных, які мы абвясцілі ўнутры CS50 бібліятэку для спрашчэння свету на працягу першых некалькіх тыдняў класа. Якая радок сапраўды з'яўляецца адрасам сімвала дзесьці ў памяці. Радок сапраўды нумар, напрыклад, 123 або 127, што адбываецца, каб размежаваць дзе радок пачынаецца ў кампутара памяці. Але яна не ўяўляе радок, па сутнасці, сябе. І мы бачым гэта наступным чынам. Дазвольце мне ісці наперад і адкрываць некаторы код, які сярод крыніца сённяшніх прыкладаў кода. І я збіраюся ісці наперад і адкрыць да, скажам, параўнаць-0.c. Гэта праграма, якая багі збіраецца павінны быць рэалізаваны наступным чынам. Першая. Я збіраюся сёе-тое сказаць. Тады я буду ісці наперад і атрымаць радок ад карыстальніка , Што ў наступным радку. Тады я збіраюся сказаць гэта зноў. Тады я іду, каб атрымаць іншую радкі ад карыстальніка. І заўважце, я паказваю адзін з радкі ў зменнай с, а іншы з гэтых радкоў ў зменнай T. І цяпер я збіраюся сцвярджаць, вельмі разумна, што калі з роўна роўная т, радка аднолькавыя. Вы ўводзіце тое ж самае. У адваротным выпадку, радкі не тое ж самае. У рэшце рэшт, калі мы ўвядзем два цэлых, два сімвалы, двума паплаўкамі, два двухмесных, любы з тыпы дадзеных мы казалі пра да гэтага часу іх параўноўваць - памятаю мы вельмі выразна некаторы час таму што вы не робіце гэтага, таму што адзін знак роўнасці, вядома, аператара прысвойвання. Так што было б памылкай. Мы выкарыстоўваем роўную знак роўнасці, якія сапраўды параўноўвае рэчы для сапраўднага роўнасці. Але я сцвярджаю, што гэта дзіцячая калыска. Калі я іду наперад і зрабіць параўнанне нуля, і тады кропка слэш параўнаць нуля. І я ўвесці, скажам, добры дзень. А потым скажам яшчэ раз прывітанне. Літаральна тое ж самае, кампутар прэтэнзіі я набраў розныя рэчы. Цяпер, можа быць я проста памылкі друку. Я буду увядзіце сваё імя ў гэты раз. Я маю на ўвазе, добры дзень. Добры дзень. Гэта розныя кожны раз. Ну, чаму ж? Што адбываецца на самай справе пад капотам? Ну, тое, што адбываецца на самай справе пад Капот Радок цяпер Я набраў у той першы раз, напрыклад, гэтае слова прывітанне, вядома. Але калі ўявіць гэта пад капот, нагадаем, што радок ў масіве. І мы так і сказаў у мінулым. Так што, калі я малюю гэты масіў, як гэта, я будзе прадстаўляць нешта зусім падобнае на тое, што мы зрабілі хвіліну таму. І на самай справе тое спецыяльныя і тут. Што мы вызначыць было ў ў канцы кожнага радка? Так, гэтая нулявая зваротная касая рыса, якая з'яўляецца толькі спосаб прадстаўлення, літаральна, 00000000. Восем біт 0 ў шэраг. Я не ведаю, шчыра кажучы, Што пасля гэтага. Гэта проста куча больш аператыўнай памяці ўнутры майго кампутара. Але гэта масіў. Мы гаварылі пра масівах раней. І мы звычайна кажам пра масівах як размяшчэнне нуля, то адзін, то два. Але гэта толькі для выгоды. І гэта зусім адноснае. Калі вы на самой справе атрымаць памяць з кампутар, то, вядома, любы 2000000000 байт нейкай дзіўнай, патэнцыйна. Так на самай справе пад капотам, Увесь гэты час, так. Гэта цалкам можа быць кранштэйны нуля. Але калі капнуць яшчэ глыбей пад капот, што на самой справе Нумар адрасы 123. Гэта адрас 124. Гэта адрас 125. І я не аблажаўся на гэты раз. Гэта цяпер адзін байт адзін ад аднаго па якой прычыне? Наколькі вялікая сімвал? Сімвал з'яўляецца толькі адзін байт. Цэлалікавай, як правіла, чатыры байта. Дык вось чаму я зрабіў гэта 123, 127, 131 і гэтак далей. Цяпер я магу трымаць простую матэматыку й навогул плюс 1. І гэта зараз, што на самой справе адбываецца на пад капотам. Таму, калі вы аб'яўляеце нешта накшталт гэтага, Радок з, гэта на самай справе - атрымліваецца - сімвал зоркі. Star, вядома, азначае адрас, інакш паказальнік. Так што гэта адрас нешта. Што гэта адрас? Ну - Я адзіны, хто можа бачыць вельмі Важны момант я раблю, ці думаць Я раблю. Так радок - Сумна тое, у мяне ёсць манітор менавіта там, дзе я магчыма, не бачыў гэтага. Добра, так што радок з'яўляецца тое, што з Я абвясціў раней. Але, аказваецца, дзякуючы невялікай магіі ў бібліятэцы CS50, усё гэта Радок часу літаральна быў сімвал зоркі. Зоркі зноў азначае, паказальнік або адрасы. Той факт, што гэта флангавыя Слова сімвал азначае, што гэта адрас знака. Так што калі ўзяць вяроўку называецца, і я друкую У H-Е-Л-Л-О, прапаноўваць тое, што цяпер атрымаць Радок літаральна вярталі ўсё на гэты раз, хоць мы даволі спрошчаным свеце? Што на самой справе атрымаць радок вярнуцца ў якасці вяртаецца значэння? 123 у гэтым выпадку, напрыклад. Мы раней заявілі, што ўзяць вяроўку проста вяртае радок, паслядоўнасць знакаў. Але гэта крыху белай хлуснёй. Спосаб атрымаць радок сапраўды працуе Пад капотам ён атрымлівае радкі ад карыстальніка. Ён пляскае знакаў, якія ён ці яна тыпу ў памяці. Гэта ставіць зваротную касую рысу Нуль ў канцы тых паслядоўнасці знакаў. Але тады што ж узяць вяроўку літаральна вярнуць? Гэта літаральна вяртае адрас першы байт у аператыўнай памяці, што яна выкарыстала для гэтага сілы. І атрымліваецца, што толькі шляхам вяртання аднаго адрасы першы знак у радку, гэта значыць дастатковы для знаходжання сукупнасці радка. Іншымі словамі, атрымліваюць радок не мае вярнуць 123 і 124 і 125. Ён не павінен даць мне доўгі Спіс усіх байтаў, якія мая радок выкарыстоўвае. Таму што, яны ўсё спіной да спіны. І два, заснаванай на першы адрас, я магу зразумець, дзе радок заканчваецца. Якім чынам? Спецыяльны сімвал пусты, Зваротная касая рыса нуля ў канцы. Такім чынам, іншымі словамі, калі Вы перадаеце вакол - ўнутры зменных - адрас голец, і вы мяркуеце, што ў канцы любой радкі, любыя паслядоўнасць знакаў, што мы, людзі, думаю радкоў, калі выказаць здагадку, што ў канцы любога такога радок ёсць нуля зваротную касую рысу, вы залаты. Таму што заўсёды можна знайсці канца радка. Цяпер тое, што на самой справе тое пры пераходзе ў гэтай праграме? Чаму гэтая праграма, параўнаць-0.c, багі? Што на самой справе параўноўваецца? Да? Студэнт: [неразборліва]. DAVID малая: Цалкам дакладна. Гэта супастаўленне струн. Такім чынам, калі карыстач увёў Добры дзень яшчэ, як я зрабіў, памяць можа ў канчатковым выніку ў такім выглядзе. Калі карыстальнік затым тыпаў Добры дзень яшчэ раз, але па тэлефоне атрымаць радок зноў, з- не надта разумны, калі вы вучыце гэта быць разумным шляхам напісання кода. C - і кампутараў у цэлым - Калі вы ўведзяце слова яшчэ раз прывітанне, Вы ведаеце, што вы збіраецеся атрымаць. Ты проста збіраюся атрымаць другі масіў памяці, што, так, бывае быць захоўванне H-E-L-L-высновы і гэтак далей. Гэта будзе выглядаць гэтак жа, каб нас, людзей, але гэты адрас не можа быць 123. Гэта можа быць проста так здарылася, што аперацыйная сістэма мае некаторыя даступныя прасторы, напрыклад, на месцы - скажам нешта адвольнае, як гэта размяшчэнне ў 200. І гэта вочка 201. І гэта размяшчэнне 202. Мы паняцця не маю, дзе гэта будзе ў памяці. Але што гэта азначае, што тое, што будуць захоўвацца ў канчатковым рахунку, у з? Нумар 123. Што будзе захоўвацца ў т, У гэтым прыкладзе адвольнай? Нумар 200. І ўсё гэта азначае, што тое, відавочна, 123 ня роўна 200. І так, калі гэта ўмова ніколі ацэньваецца як ісціна. Таму што ўзяць вяроўку выкарыстоўваюць розныя участкаў памяці кожны раз. Цяпер мы можам бачыць гэта зноў ў іншым прыкладзе. Дазвольце мне ісці наперад і адкрываць капіявання 0.c. Я сцвярджаю, што гэты прыклад будзе паспрабаваць - але не ў стане - для капіявання двух радкоў наступным чынам. Я збіраюся сказаць нешта карыстальніку. Я тады збіраўся атрымаць Радок і назавіце яго з. І цяпер, я раблю гэта тут галачку. Мы згадалі гэта некаторы час таму. Але калі маглі б атрымаць пустую радок вяртання, іншага спецыяльнага знака або для спецыяльных Сімвал скажам так. Калі гэта з памяці. Напрыклад, калі карыстальнік сапраўды быць цяжкім і віды зверскіх Колькасць знакаў у Клавіятура і хітоў Enter. Калі гэта колькасць знакаў, проста не магу змясціцца ў аператыўнай памяці па нейкай вар'яцкай Прычына, добра атрымаць радок можа вельмі добра вяртае нуль. Ці, калі ваша праграма сама робіць шмат іншых рэчаў, і ёсць толькі Не хапае памяці для атрымліваю радок каб дамагчыся поспеху, гэта можа скончыцца тым, што вярнуўся пустым. Але давайце будзем больш дакладнымі адносна таго, што гэта такое. Што такое тып дадзеных з на самай справе? Char зоркі. Вось і атрымліваецца, зараз мы можам лупіны таму пласт нулявых. Аказваецца, NULL - так, відавочна, адмысловы знак. Але што гэта такое на самай справе? Сапраўды, NULL проста знак, што мы людзі выкарыстоўваюць для замены нуля, а таксама. Такім чынам, аўтары С, і кампутары больш агульна, вырашыў гадоў таму , Што, вы ведаеце, што. Чаму б нам не забяспечыць, каб ні карыстальнік Дадзеныя ніколі, ніколі, ніколі захоўваць пры спаткання нуля? На самай справе, нават у маім прыкладзе адвольнага раней, я не пачала нумарацыі байт у нулі. Я пачаў працаваць у адным. Я ведаў, што людзі ў свеце вырашылі пакідаем за сабой нуля байт у аператыўнай памяці, як нікому нешта асаблівае. Прычына ў тым, у любы час вы хочаце сігнал, што нешта пайшло не так ў дачыненні да адрасоў, вяртаецца нулявы - інакш вядомы як нулявы - І таму, што вы не ведаеце, што няма ніякай законныя дадзеныя з нулявога адрасы, выразна гэта азначае, што паведамленне пра памылку. І менавіта таму мы, па дамове, праверыць за тое, нулявы і зваротнай як адзін у такіх выпадках. Таму, калі мы пракруціць ўніз зараз, гэта ўсяго толькі Затым апрацоўку памылак, на ўсялякі выпадак нешта пайшло не так з [? заклад?] ў цэлым і выйсці з праграмы , Вярнуўшыся рана. Гэтая лінія ў цяперашні час можа быць перапісана як гэта, што азначае, што? На левым баку, дайце мне яшчэ паказальнік на сімвал, і назавем яго T. Што я захоўванні ўнутры т, заснаваных на гэтай адной радкі кода? Я запіс месцазнаходжання. У прыватнасці размяшчэнне , Якая была ў с. Такім чынам, калі карыстач увёў прывітанне, і што першы прывітанне адбываецца ў канчатковым выніку тут, то лік 123 збіраецца вярнуцца з атрымаць радок і захоўваць - Як мы казалі раней - ў с. Калі я абвяшчаю паказальнік на іншы сімвал і называюць гэта т, што колькасць літаральна будзе ў канчатковым выніку ў T у адпаведнасці з гісторыяй? Так 123. Так што тэхнічна цяпер абодва з і т паказваюць на дакладнае той жа участкаў памяці. Так заўважыць, што я збіраюся зрабіць цяпер, каб даказаць, што гэтая праграма глючыць. Спачатку я збіраюся сцвярджаць, з Друк F, спекулюючы копія радка. Тады я збіраюся зрабіць невялікі праверка на наяўнасць памылак. Я іду, каб пераканацца. Давайце пераканаемся, што радок T знаходзіцца ў меры больш за нуль у даўжыню, так што ёсць некаторы характар на самай справе выгаду. І тады вы, магчыма, памятаеце гэта ад папярэдніх прыкладах. 2 верхнія - які знаходзіцца ў ctype.h файла. T Кранштэйн нуля дае мне нуля сімвал радкі т. І два верхніх таго ж кошту, Вядома, пераўтворыць яго ў верхні рэгістр. Так інтуітыўна, дзякуючы вылучанай лініі кода робіць стаўку першым Ліст у т. Але гэта не капіталізацыя, інтуітыўна, першая літара ў с. Але калі вы думаеце наперад, тое, што я глядзець, калі я запускаю гэтую праграму і раздрукаваць як арыгінальныя, сек, і так званыя копіі, т? Яны на самай справе будзе тое ж самае. І чаму яны будзе тое ж самае? Яны абодва паказваюць на роўна тое ж самае. Так давайце зробім гэта. Зрабіце копію нуля. У ім сабрана OK. Дазвольце мне запусціць копію нуля. Дазвольце мне што небудзь тыпу прывітанне ў усе малыя затым націсніце Enter. І ён сцвярджае, што і з арыгінальным і копія сапраўды ідэнтычныя. Так што на самай справе адбылося? Дазвольце мне перамаляваць гэтую карціну проста каб распавесці гісторыю ў некалькі інакш. Што адбываецца на самай справе пад капот, калі я заяўляю, нешта накшталт сімвал пачала з, або радок з, Я атрымліваю паказальнік - які, аказваецца, чатыры байта У CS50 прыбора і ў вялікай колькасці кампутараў. І я буду называць гэта з. І гэта ў цяперашні час мае невядомага значэння. Калі вы не аб'яўляеце зменную, калі Вы сябе падстаўляць значэнне там, якія ведае, што там. Гэта можа быць некаторай выпадковай паслядоўнасці бітаў з папярэдняга выканання. Таму, калі я, на маю радок кода сапраўды атрымліваем радкі, а затым захоўвання вяртаецца значэння ў радок з так ці інакш атрымаць - і мы ў канчатковым рахунку адхіліце як атрымаць Радок работ, так ці інакш вылучае масіў, які, верагодна, выглядае як-небудзь так. H-E-L-L-О, зваротны слэш нуля. Давайце выкажам здагадку, што гэта адрас 123 толькі першая паслядоўнасць. Так што радок вяртаецца, у Вылучаная радок ёсць, то ён вяртае чысла мы ўжо казалі, 123. Так што ж на самай справе адбываецца ўнутры з тут? Ну, што сапраўды адбываецца Усярэдзіне з 123. Але, шчыра кажучы, я атрымліваю трохі бянтэжаць ўсе гэтыя адрасы, ўсе гэтыя адвольныя колькасці. 123, 124, 127. Так што давайце на самай справе спрашчэння свеце няшмат. Калі мы гаворым аб паказальніках, шчыра кажучы, для нас, людзей, хто, чорт вазьмі, дзе клапоціцца рэчы ў памяці? Гэта зусім адвольна. Гэта будзе залежаць ад таго, аб'ём аператыўнай памяці ў карыстальніка. Гэта будзе залежаць ад таго, калі ў той жа дзень вы запусціце праграму, мабыць, і што уведзеныя карыстачом дадзеныя, дае табе. Мы спыняючыся на неістотных дэталяў. Так што давайце абстрагавацца ад і сказаць, што, Пры выкананні радкі кода, як гэта, сімвал зоркі з атрымлівае якое вяртаецца Значэнне ўзяць вяроўку. Чаму б нам не проста намаляваць, а не тое, што мы тэлефануюць паказальнік, як быццам гэта , Паказваючы на ​​што-то? Таму я сцвярджаю, што зараз з да ёсць паказальнік - пад капотам, што гэта адрас. Але гэта ўсяго толькі паказвае на першы байт радок, якая была вернутая. Калі б я цяпер вярнуцца да кода тут, што адбываецца на гэтай лініі? Ну, у гэтай выдзеленай лініі зараз, Я абвяшчаю мабыць іншае зменную T. Але гэта таксама паказальнік, так што я збіраюся намаляваць яе, так як у тэорыі, дакладнае ж памеру скрынкі. І я буду называць яго T. І зараз, калі мы вернемся да кода зноў, калі я з захоўвання ўнутры т, тое, што я тэхнічна пакласці ўнутр T? Ну тэхнічна гэта быў нумар 123. Так на самай справе я павінен пісаць нумар 123 там. Але давайце гэта больш высокі ўзровень. т, калі гэта толькі паказальнік Інтуітыўна, з'яўляецца менавіта гэта. Гэта ўсё, што быццё там захоўваюцца. Так што цяпер у апошнія цікавыя радкі кода, калі я на самай справе ісці аб капіталізацыі сімвал нуль у т, што адбываецца? Ну, т кранштэйна нуля цяпер паказвае да таго, што характар, па-відаць? Гэта паказвае на гадзіну. Паколькі T Кранштэйн нуля - Нагадаем, што гэта стары сінтаксіс. т кранштэйна нуля проста азначае, што калі T з'яўляецца радок, т Кранштэйн нуля азначае атрыманне нулявы знак у гэтую сілу. Так што гэта сапраўды азначае гэта зайсці ў гэты масіў - і так, гэта можа быць 123, гэта можа быць 124. Але гэта ўсё адносна, памятаю. Кожны раз, калі кажуць аб масіве, у нас ёсць Перавага казаць пра адносныя паказчыкі. І вось зараз мы можам проста выказаць здагадку, што Zero T кранштэйны ч. Так што, калі я называю 2 верхніх на гэта, што гэта сапраўды робіце робіць стаўку маленькая г у верхні H. Але, вядома, тое, што з? Гэта паказвае на тое ж праклятае радок. Так што гэта ўсё, што адбывалася У гэтым кодзе да гэтага часу. Так у чым жа тады наступствы? Як гэта выправіць гэтыя дзве праблемы? Як мы можам параўнаць з фактычнымі радкамі? Ну інтуітыўна, як бы вы ідзяце па нагоды параўнання двух Струны для сапраўднага роўнасці? Што значыць, калі два радкі роўныя? Відавочна, што не, што іх адрасы роўнымі ў памяці, таму што гэта нізка Узровень дэталізацыі рэалізацыі. Усе сімвалы з'яўляюцца аднолькавымі. Такім чынам, дазвольце мне прапанаваць, і дазвольце мне прадставіць у версіі аднаго з compare.c тут, так што параўнаць-1с. Дазвольце мне прапанаваць, што мы ўсё яшчэ атрымліваем Паказальнік называецца з, і крама ў ім вярнуць значэнне ўзяць вяроўку. Давайце зробім тое ж самае з T. І ніхто з кода не адрозніваюцца. Я збіраюся дадаць трохі больш праверкі памылак цяпер. Так што цяпер, калі мы накшталт адслойванне гэта пластамі ў CS50, што радок на самай справе, мы павінны быць больш анальны аб тым, што мы не марнатраўце недапушчальныя значэння як нулявыя. Так што я проста збіраюся праверыць. Калі ёй не роўная страціўшым Т ня роўным нулявы, гэта азначае, што мы ў парадку. Узяць вяроўцы не аблажаўся атрыманні любы з гэтых радкоў. І вы, магчыма, можа думаю зараз, што зусім STR CMP мяркуецца рабіць? Параўнанне радкоў. Так што калі вы ў праграме Java і раней, Гэта падобна на роўных метаду ў Радок класа. Але для тых з вас, хто не запраграмаваныя перш, гэта ўсяго толькі функцыя з. Гэта адбываецца, каб прыйсці ў файл з імем string.h. Вось дзе яны абвешчаныя. І параўнанне радкоў - Я на самой справе забываюць яго выкарыстанне, але гэта не важна. Нагадаем, што мы можам зрабіць Чалавек, змяшаць параўнання. І гэта будзе выхоўваць Linux Кіраўніцтва праграміста. І гэта, шчыра кажучы, трохі загадкавым. Але я бачу тут, што, так. Я павінен ўключыць string.h. І тут гаворыцца, пад апісаннем " Функцыя параўнання радкоў параўноўвае два радкі S1 і S2. "І S1 і S2-відаць, з'яўляюцца два Аргументы, якія перадаюцца цалі Я не памятаю, што канст мае значэнне, але цяпер заўважаю - і вы, магчыма, бачылі гэта ўжо тады, калі вы выкарыстоўваць даведачныя старонкі, калі вы усё гэта ёсць - сімвал, што зорка проста сінонімам аборкай. Так ён параўноўвае два радкі, S1 і S2, і вяртае цэлы лік або роўная або больш за нуль калі S1 знаходзіцца, адпаведна, быць менш або супадаюць, або быць больш, чым S2. Вось толькі вельмі складаны спосаб сказаць што параўнанне радкоў вяртаецца нуля, калі дзве радка інтуітыўна ідэнтычныя, сімвал для знак у знак. Гэта вяртае адмоўнае лік, калі с, у алфавітным парадку, мяркуецца паўстаць перад Т. Ці вяртае станоўчае лік, калі ы павінны ісці за Т ў алфавітным парадку. Так што з гэтай простай функцыі, мог Вы, напрыклад, сартаваць цэлую кучу слоў? Так што ў гэтай новай версіі, я збіраюся ісці наперад і зрабіць compare1. Dot параўнаць адну рысу. Я буду ўводзіць прывітанне ў ніжнім рэгістры. Я збіраюся ўвесці прывітанне у ніжнім рэгістры зноў. І на шчасце цяпер ён разумее, Я надрукаваў тое ж самае. Між тым, калі я друкую ў прывітанне да зніжэння выпадку і прывітанне ў верхнім рэгістры і параўнаць іх, я набраў розныя рэчы. Паколькі не толькі адрасы розныя, але мы параўноўваем розныя персанажы зноў і зноў. Ну давайце і выправіць адну Цяпер іншая праблема. Дазвольце мне адкрыць версію аднаго з копію, якая цяпер адрасуе гэтае пытанне наступным чынам. А гэта будзе выглядаць трохі больш складанай. Але калі вы думаеце пра тое, што праблема, якую мы трэба вырашыць, мы спадзяемся, гэта будзе ачысціць ўсяго за момант. Такім чынам, гэта першы радок, сімвал пачатку т, у З пункту гледжання непрафесіяналы можа хтосьці прапануе тое, што гэтая лінія тут азначае? Char зоркі т, што ж гэта робіш? Добра. Стварыць паказальнік на некаторы месца ў памяці. І дазвольце мне ўдакладніць яго няшмат. Абвясьцеце зменную, якая будзе захоўваць адрас некаторых знакаў у памяці, проста быць трохі больш правільным. Такім чынам, цяпер на правай баку, у мяне ніколі не бачыў адну з гэтых функцый раней, Malloc. Але што ж гэта значыць? Размеркаванне памяці. Размеркавання памяці. Так што не атрымліваецца, да гэтага часу, мы сапраўды не было магутным спосабам просіць аперацыйную сістэму, даць мне некаторую памяць. Хутчэй, у нас зараз ёсць функцыя пад назвай Malloc, што робіць менавіта гэта. Нават калі гэта крыху адцягненне прама зараз, адзначым, што ў паміж двума дужках проста будзе побач. Дзе я набраў у пытанні пазнакі могуць быць лікам. І гэта лік азначае, дайце мне 10 байт. Дайце мне 20 байт. Дайце мне 100 байт. І Malloc зробіць усё магчымае, каб прасіць аперацыйнай сістэмы - Linux, у дадзеным выпадку - Гэй, а іх 100 байт даступнай аператыўнай памяці? Калі так, то вярнуць гэтыя байты мне вяртанне адрас якога з гэтыя байты, ці што? Самы першы. Так і тут - і гэта пераважная ў C, у любы час вы справу з адрасамі? Вы амаль заўсёды маем справу з Першы такі адрас, незалежна ад таго, наколькі вялікая кавалак памяці вы ў цяперашні час вярнуў, так бы мовіць. Дык давайце прыступім тут. Я спрабую вылучыць як колькасць байт, дакладна? Ну. Даўжыня радка з - давайце рабіць канкрэтны прыклад. Калі ёй гэта прывітанне, Н-Е-Л-Л-О, што даўжыня радка з, відавочна? Так што гэта пяць. Але я раблю плюс 1 аб тым, чаму? Чаму я хачу шэсць байтаў замест пяці? Нулявой сімвал. Я не хачу кінуць гэтую спецыяльныя нулявым сімвалам. Таму што калі я зрабіць копію Добры дзень і проста рабіць H-E-L-L-O, але я не стаўлю , Што адмысловы сімвал, кампутар не маглі б, выпадкова, зваротную касую рысу нуля там для мяне. І таму, калі я спрабую высветліць, даўжыню копіі, я мог бы думаць, што гэта 20 сімвалаў, ці мільён знакаў, калі я проста ніколі не здарыцца стукнуць зваротную касую рысу нуля. Так што нам трэба шэсць байт H-E-L-L-О, зваротны слэш нуля. А потым гэта проста быць супер анальны. Выкажам здагадку, што я забыўся, што памер сімвалаў ёсць. Мы ўвесь час кажуць, што гэта адзін байт. І гэта звычайна. У тэорыі, гэта можа быць нешта рознымі, на іншым кампутары або іншы кампутар. Вось і атрымліваецца, што ёсць гэты аператар называецца SizeOf, што калі вы перадаеце яго імя тыпу дадзеных - як вугалю ці Інтэлект, або паплавок - ён скажа вам, дынамічна, колькі байт сімвал займае на гэтым канкрэтнага кампутара. Так што гэта проста эфектыўна як кажуць раз 1 або Не раз наогул нічога. Але я раблю гэта толькі, каб быць супер анал, , Што на ўсялякі выпадак сімвал адрозніваецца на ваш кампутар па параўнанні з маім, такім чынам, матэматыка заўсёды будзе праверыць. Нарэшце, тут я правяраць нулявыя, якая заўсёды добрая практыка - зноў жа, любы час мы маем справу з паказальнікамі. Калі Malloc не быў у стане даць мне шэсць развітанняў - што малаверагодна, але на ўсялякі выпадак - вярнуцца неадкладна. А цяпер, ісці наперад і скапіяваць радкі наступным чынам. І гэта знаёмы сінтаксіс хоць і ў іншай ролі. Я збіраюся ісці наперад і атрымаць радок даўжыня з і захоўваць яго на рускай мове. Я тады збіраўся я ад ітэрацыі роўная нуля аж да N, больш або роўна. Так што на кожнай ітэрацыі, я паставіў га характару з у га Характар ​​T. Так што ж на самай справе адбываецца пад капотам тут? Добра, калі гэта, напрыклад, у с - і я набраў у слове H-Е-Л-Л-О і ёсць зваротны слеш нуля. І зноў жа, гэта паказваюць тут. І вось зараз гэта т. І гэта паказвае зараз копію памяці, правільна? Malloc даў мне цэлую кавалак памяці. Я не ведаю, што першапачаткова У любым з гэтых месцаў. Так што я буду думаць пра іх як пра цэлую кучу пытальных знакаў. Але як толькі я пачынаю цыкл ад нуля далей, аж да даўжыні S, T Кранштэйн нуля і кранштэйнам 1 т - і я пакладу гэта цяпер на верхнім - T Кранштэйн нуля і з нулявым сярэднім кранштэйнам , Што я збіраюся быць капіяваннем итеративно г тут, E-L-L-O. Плюс, таму што я зрабіў плюс 1, зваротную касую рысу нуля. Так што цяпер у выпадку параўнаць-1с, У рэшце рэшт, калі я раздрукаваць Капіталізацыя т, мы павінны бачыць, што з не змяняецца. Дазвольце мне цяпер ісці наперад і рабіць гэта. Таму пераканайцеся, copy1. Dot слэш copy1. Я збіраюся ўвесці прывітанне, Enter. А цяпер звярніце ўвагу, толькі копію былі капіталізаваць. Таму што я сапраўды ёсць два участкаў памяці. На жаль, вы можаце зрабіць некаторыя даволі дрэннае і даволі небяспечныя рэчы. Дазвольце мне падцягнуць прыклад тут і цяпер, што дае нам прыклад некалькі розных ліній. Так што проста інтуітыўна тут, першая лінія кода, унутр зорку х, заяўляе зменную х. І тое, што тып дадзеных гэтай зменнай? Які тып дадзеных гэтай зменнай? Гэта не было захапляльным. Тып дадзеных дзесятковага зоркі. Дык што ж гэта значыць? X будзе захаваць адрас Int. Вось як усё проста. Y мы збіраемся захоўваць адрас Int. Што такое трэцяя лінія кода там робіць? Гэта размеркаванне, колькі байт, хутчэй за ўсё? Чатыры. З-за памеру дзесятковага гэта наогул чатыры, Malloc з чатырох дае мне назад адрас кавалак памяць, першы з якіх байт захоўваецца ў цяперашні час у х. Зараз мы рухаемся трохі хутчэй. Зорка X азначае, што? Гэта значыць, пайсці на гэты адрас і пакласці тое, што колькасць ёсць? , Колькасць 42 ёсць. Зорка Y азначае ісці да таго, што пры ў , А таксама нумар 13 там. Але пачакайце хвіліну. Што знаходзіцца ў Y на дадзены момант? Які адрас у захоўванні? Мы не ведаем, праўда? Мы ні разу не выкарыстоўваць прызначэнне аператар, які змяшчае у. Так у якое паказана на другой лініі код толькі некаторыя смецця значэнне, вялікі пытальнік, так бы мовіць. Яно можа паказваць выпадковым ні да чаго ў памяці, якая , Як правіла, дрэнна. Таму, як толькі мы патрапілі гэтую лінію там, зоркі Y роўна 13, нешта дрэннае, нешта вельмі дрэннае складае каля здарыцца з Бинки. Такім чынам, давайце паглядзім, што будзе ў канчатковым выніку адбываецца з Бинки тут, у гэтую хвіліну або так паглядзець. [Прайграванне відэа] -Гэй, Бинки. Прачнуцца. Гэта час для паказальніка весела. -Што гэта? Даведайцеся аб паказальнікі? О, станоўчы герой. -Ну, для пачатку, я думаю, мы спатрэбіцца пару паказальнікаў. -OK. Гэты код вылучае два паказальніка якія могуць паказваць на цэлыя лікі. -Добра, добра, я бачу два паказальніка. Але яны, здаецца, не быць паказваючы ні да чаго. -Гэта дакладна. Першапачаткова, паказальнікаў ня паказвае ні на што. Тое, што яны паказваюць на называюцца pointees, і іх стварэння з'яўляецца асобны крок. -Ах, так, дакладна. Я ведаў, што. Pointees паасобныя. Такім чынам, як вы размяркоўваеце pointee? -OK. Ну, гэты код стварае новы цэлыя pointee, і гэтая частка мноства Х , Каб паказаць на гэта. -Гэй, гэта выглядае лепш. Так што зрабіце гэта нешта рабіць. -OK. Я разыменовать х для захоўвання 42 чысла ў свой pointee. Для гэтага трука, мне спатрэбіцца мая магія Жазло разнаймення. -Ваша чароўная палачка разнаймення? Э-э, гэта выдатна. -Гэта тое, што код выглядае наступным чынам. Я проста ўсталяваць колькасць, і - -Гэй, паглядзі. Там яна ідзе. Так робяць разнаймення на X наступным стрэлкі для доступу да pointee. У гэтым выпадку, для захоўвання 42 у там. Гэй, паспрабуйце выкарыстоўваць яго, каб захаваць нумар 13 праз іншы паказальнік, у. -OK. Я проста пайду сюды, каб у і атрымаць лік 13 створана. А затым ўзяць палачку разнаймення і проста - Ух ты! -О, прывітанне. Гэта не спрацавала. Скажам, Бинки, я не думаю, разнаймення Y з'яўляецца добрай ідэяй, Паколькі налада pointee з'яўляецца асобнай стадыі. І я не думаю, што мы калі-небудзь рабілі гэта. -Хм. Добры пытанне. -Так, мы выдзелілі ў паказальніка. Але мы ніколі не ўсталяваць яго на паказваць на pointee. -Хм. Вельмі назіральныя. -Гэй, вы шукаеце Добра там, Бинки. Вы можаце гэта выправіць, так што ў пунктаў да таго ж, як pointee х? -Вядома. Я буду выкарыстоўваць маю чароўную палачку прысвойвання паказальніка. -Хіба што будзе праблема, як раней? -Не. Гэта не тычыцца pointees. Гэта проста мяняе адзін паказальнік, каб паказаць да таго ж, як іншы. -О, я бачу. Цяпер у паказвае на тым жа месцы, х. Так што чакайце. Цяпер у фіксавана. Яна мае pointee. Такім чынам, вы можаце паспрабаваць палачку разнаймення зноў адправіць па 13. -OK. Тут ідзе. -Гэй, паглядзі на гэта. Цяпер разнаймення работ па у. І таму, што паказальнікі дзеляцца што адзін pointee, яны абодва бачаць 13. -Так. Абмен. Якая розніца. Так што мы будзем цяпер мяняюцца месцамі? -О, глядзі. У нас няма часу. -Але - -Проста памятаеце, тры Паказальнік правілаў. Нумар адзін, асноўная структура з'яўляецца тое, што ў вас ёсць паказальнік. І ён паказвае да pointee. Але паказальнік і pointee паасобныя. А распаўсюджаная памылка заключаецца ў стварыць паказальнік, але забудзьцеся далі pointee. Нумар два, разнаймення паказальніка пачынаецца на паказальнік, прытрымліваючыся сваёй стрэлкай на доступ да яго pointee. Як мы ўсе ведаем, гэта працуе толькі, калі ёсць з'яўляецца pointee, якая вяртаецца да Правіла нумар адзін. Нумар тры, прысвойванне паказальніка адзін паказальнік і змяняе яго, каб паказаць на pointee жа як яшчэ адзін паказальнік. Такім чынам, пасля прызначэння, два паказальніка будзе паказваць на той жа pointee. Часам гэта называецца абмен. А ну, вось і ўсё, на самай справе. Бывай, бывай, цяпер. [КАНЕЦ ВИДЕОВОСПРОИЗВЕДЕНИЕ] DAVID малая: Так больш на паказальнікі, больш на Бинки на наступным тыдні. Убачымся ў панядзелак.