DAVID Malan: Здравейте, и Добре дошли отново в CS50. Така че това е края на четвъртата седмица. Само една обява на първо място. Така че така наречената пета понеделник е идва идния понеделник. Това е възможност да се промени от SAT / Ненасит на писмо клас, или от буквена оценка сб / Ненасит. Дразнещо е, че процесът се нуждае от подпис, защото трябва да попълните едно от тези розови Добавяне / капка форми. Поради технически казано, SAT / Ненасит версия и версията писмо клас имат различни каталожни номера. Но не е голяма работа. Просто ела при мен или да ограби или да Lauren във всеки един момент. Или ни пишете, ако не разполагат с вид на документи, което трябва днес, и ние със сигурност ще ви помогне да вземете грижат за това преди понеделник. Добре, така че днес - Всъщност, има малко ехо. Може ли да ме смекчи малко? OK. Така че днес, ще се въведе една тема известен като указатели. И аз ще призная, че това е един от най- по-сложни теми, които са склонни да обхващат в този клас, или наистина всеки уводен курс, който използва C. Но да вземат думата си за него, по-специално Ако вашият ум се чувства малко по-огъната днес и в идните седмици. Това не е представител на вас се е по-зле в това просто означава, че това е особено сложна тема Обещавам, че след няколко седмици по този начин, ще ви се стори твърде поразително ясно в ретроспекция. Все още помня и до днес. Седях в Elliott трапезарията, седи до мен TF Nishat Мета, който е местно лице на Elliott къща. И по някаква причина, тази тема просто кликвания. Което ще рече, че аз също се бореше с него за известно време, но аз ще направя всичко възможно, за да помогне да се избегнат такива борба с една тема, която в крайна сметка е доста мощен. Всъщност, една от темите ще обсъдим в идните седмици, е, че на сигурността, и как всъщност можете използват машини по начини, които не са били предназначени. И тези разработки са обикновено в резултат на бъгове, грешки, които ние хората правят от неразбиране на някои на базисния изпълнението детайли, чрез които програмите са приведени. Сега, за да направи това изглежда още по-потребителя приятелски, аз мислех, че ще играя на 10 втори преглед на малко глинената анимация фигура, наречена Binky, който бе доведен до живот, като наш приятел в Станфорд, професор Ник Parlante. Така че позволете ми да ви дам това закачка на Binky тук. [VIDEO PLAYBACK] -Хей, Binky. Събудете се. Това е време, за показалеца забавно. -Какво е това? Научете повече за указатели? О, Goodie. [END възпроизвеждане на видео] DAVID Malan: Това е Stanford компютърни науки. Така че повече за това да дойде. [APPLAUSE] DAVID Malan: Съжалявам, Ник. Така се припомни, че последния път, когато завърши на това наистина вълнуващо Катерачът с което тази функция просто не се получи. Най-малко интуитивно, се чувствах като тя трябва да работи. Просто смяна на ценностите на две цели числа. Но припомни, че когато се отпечатва на първоначалните стойности в основния, една и две, те все още са едно и два, а не две и една. Така че нека действително превключите към уреда. И аз написах малко код в скелетната премина тук, където се твърди, че х ще бъде 1, у ще бъде 2. Аз след това да отпечатате и двете им стойности с печат F. След това твърдят тук, че ние ще ги разменят. Оставих празно място тук за нас, за да попълнете днес в един момент. След това, аз отивам да се твърди, че две променливи са били разменени. Тогава аз отивам да отпечатате ги отново. И така, надявам се, че трябва да виждате 1, 2. 2, 1. Това е супер проста Целта в момента. Е, как да отидем за смяна две променливи? Ами ако аз предлагам тук, че тези чаши може да представлява памет в компютъра. Това е няколко хапки, това е още няколко хапки. Можехме ли да си доброволец качвай се и смесват нас някои напитки, ако познато? Хайде нагоре. Как се казваш? ДЖЕС: Джес. DAVID Malan: Джес? Ела, Джес. Ако нямате нищо против, ние трябва да се постави Google Glass на вас, така можем да увековечат това. OK, стъкло. Запис на видеоклип. И OK, ние сме добре да отида с Джес тук. Добре. Приятно ми е да се запознаем. Така че това, което искам да направя тук - ако можеше, доста бързо - просто ни се налива половин чаша портокалов сок и половин чаша мляко, представлява ефективно номера 1 в една чаша и 2 в другата чаша. Това ще бъде добър кадри. ДЖЕС: Извинете. DAVID Malan: Не, не. Всичко е наред. Ница. Добре, така че ние имаме четири байта стойност на портокалов сок. Ще го нарича стойност 1. Сега още четири байта стойност на млякото. Ще го наречем Стойност 2. Така че х и у, съответно. Добре, така че сега, ако задачата в ръка - за теб, Джес, пред всички от съучениците си - е за размяна на стойностите на х и у такива че искаме портокалов сок в друга чаша и млякото в тази чаша, как може да ви - преди да всъщност правят той - го направим? OK, мъдро решение. Така че ще трябва малко повече памет. Така че нека да разпредели временно чаша, ако щете. А сега продължи да сменяте х и у. Excellent. Така че много добре направено. Благодаря ви много, Джес. Заповядайте. Малко сувенир. ОК, така че явно, супер проста идея. Напълно интуитивно, че ние се нуждаем от малко повече пространство за съхранение - в тази форма, чаша - ако действително искате да суап тези две променливи. Така че нека да направим точно това. До тук в между това къде аз твърдя, че съм ще се прави някаква смяна, аз ще отидете напред и да декларират темп. И аз ще го настроите равна на, да речем, х. Тогава аз отивам да промените стойността на х точно като Джес е тук с мляко и портокалов сок да бъде равна на у. И аз няма да променям г. за равен да не х, защото сега ние ще бъдем остана в кръг, а по-скоро темп. Къде ли временно - или когато Джес временно вкара портокалов сок преди опитва да се докара, че чаша с мляко. Така че позволете ми давай сега и ще я направи. Тя се нарича noswap.c. А сега нека да тече не по суап. И наистина виждам, ако се разшири прозореца малко, че х е 1, у е 2. И тогава х е 2, у е 1. Но припомни, че в понеделник направихме неща малко по-различно, при I вместо да изпълнява помощник функция, ако щете, това всъщност беше нищожен. Извиках го сменяте. Дадох го на два параметъра, и се обадих тях и аз ги нарича б. Честно казано, бих могъл да ги наричаме х и у. Нищо не пречи ми от това, че. Но бих казал, че е след това малко неясно. Тъй като изземване за понеделник, че ние Твърди се, че тези параметри са копия на стойностите преминал инча Така че просто закача си ума, мисля, че, ако използвате точно същите променливи. Така че аз ще се обадя вместо тях и б, само за яснота. Но бихме могли да ги наречем най- нещо, което искаме. И аз отивам да копирате и поставяте ефективно този код от там надолу в тук. Защото аз просто видях, че тя работи. Така че това е в доста добра форма. И аз ще променя х до, моя х на, у мен да б и у мен да б. Така че с други думи, точно същата логика. Точно същото нещо, че Джес е направил. И тогава единственото нещо, което трябва да направите до Тук, разбира се, сега се позовават на тази функция, или се обадете на тази функция. Така че аз ще се обадя на тази функция с две входове, х и у, и натиснете Save. Добре, така фундаментално едно и също нещо. Всъщност, вероятно съм направил програмата ненужно усложнени от написването на функция, която просто като около шест реда код, а аз преди това са приложили това само три. Така че позволете ми давай сега и римейк това, не правят суап. Добре, аз прецаках тук. Това трябва да е грешка, че може да виж все по-често като си програми получите по-сложни. Но има един лесен оправя. Позволете ми да превъртите обратно тук. И каква е първата грешка виждам? Скритият декларация. Какво означава, че обикновено се показват? О, забравих на прототипа. Забравих да преподават на компилатора, че суап ще съществуват, въпреки че той не съществува в самото начало на програмата. Така че аз съм просто ще кажа нищожен, суап, Int, а вътр б, точка и запетая. Така че аз няма да го reimplement. Но сега тя отговаря на това, което е тук. И забележете, липса на точка и запетая Оттук която не е необходима, когато прилагане. Така че нека този римейк, не правят суап. Много по-добра форма. Run не суап. И дявол да го вземе. Сега сме там, където бяхме в понеделник, когато нещо не сменяте. И каква е интуитивно обяснение защо това е така? Да? Студентът: [недоловим]. DAVID Malan: Точно така. Така че А и В са копия на х и у. И в действителност, всеки път, когато съм бил Извикването на функциите до този момент, че преминава променливи, като цели числа - точно както суап очаква тук - момчета са преминаване в копия. Сега това означава, че е необходимо известно от време, за част от секундата, за компютър за копиране на бита от един променлива в бита на друга. Но това не е толкова голям проблем. Но те са все пак копие. И така, сега, в контекста на суап, Аз съм в действителност успешно промяна а и б. Всъщност, нека да направи бърза здрав разум проверите. Принтирай е а е% I, нов ред. И нека щепсела в. Сега нека да направи същото нещо с б. И нека да направи същото нещо тук. А сега, нека да копирате същите тези линии отново в долната част на функцията след моите три реда на интересен би могъл да извърши и отпечатате и б пореден път. Така че сега нека направим това, не правят суап. Позволете ми да направя прозореца на терминала на малко по-висок, така че ние можем да видим повече от него наведнъж. И не тече суап. х е 1, у е 2. а е 1, В е 2. И след това, а е 2, В е 1. Така че това е работа, точно като Джес е тук вътре на суап. Но, разбира се, това е като няма ефект за променливите в основната. Така видяхме един трик, чрез което може да се определи това, нали? Когато сте изправени пред този обхват проблем, можеш да шута и да х и у какви променливи, а? Можете да ги направят глобални. Сложете ги в самото началото на файла както направихме, дори в мача от 15. Ние използваме глобална променлива. Но в контекста на срещата на 15, това е разумно да имат глобално променлива представляваща борда, защото цялост на 15.c е всичко за прилагане на този мач. Това е, което съществува файл да се направи. Но в този случай тук, аз съм Извикването на функциите суап. Искам да разменят две променливи. И това трябва да започнете да се чувствате просто помия Ако разтвор на всички наши проблеми, когато се движат в обхвата въпроси е да я направите глобална. Защото много бързо нашата програма е Ще стане доста бъркотия. И ние сме го направили много пестеливо в резултат на 15.c. Но се оказва, че има по-добър начин напълно. Нека действително се върна и да изтриете принтиране е, само да се опрости този код. И нека да предложи това наистина е лошо. Но ако вместо да добавите в някои звездички и звездите, вместо да мога да се превърне това функция в едно, че е всъщност експлоатация. Така че нека да се върна тук и да признаем, казвайки звездички винаги е трудно, така че аз ще кажа звезди. Ще призная, че до един. Добре. И сега, какво ще да се направи, а? Така че, на първо място, аз отивам да се уточни че вместо да преминават едно цяло число в суап функция, аз съм вместо на ще каже Int звезда. Сега, какво означава звездата показват? Това е, че идеята за показалеца, че Binky, на глинената анимация характер, беше отнасящи се до преди малко. Така че, ако кажем, вътр звезда, смисъла на това сега е, че няма да бъде преминал в стойността му. Това няма да бъде копиран инча По-скоро, адреса на е ще бъдат прехвърлени инча Така се припомни, че вътрешността на вашия компютър е един куп памет, в противен случай известен като RAM. И това е само на RAM цял куп байта. Така че, ако си Mac или компютър има два гигабайта, имате две милиард байта памет. Сега нека предположим, че само за да пазят нещата хубаво и нормално, ние зададете адрес - редица - на всеки байт на RAM в компютъра. Първият байт на тези две млрд. е от числото нула. Следващият е байт номер едно, номер две, по целия път нагоре, точка точка точка, до около 2 милиарда. Така че можете да броя на байтове на паметта на вашия компютър. Така че нека да приемем, че това е, което имаме предвид под един адрес. Така че, когато виждам Int звезда, какво става да бъдат вкарани в суап сега е адреса на. Не му стойност, но независимо от неговата пощенска адрес е, така да се каже - си място в RAM. И по същия начин за б, аз ще да се каже едно и също нещо. Int, звезда, б. Като настрана, технически звездата може да отиде и на други места. Но ние ще се стандартизират на звездата е в непосредствена близост до типа данни. Така че сменяте подпис сега означава, дай ми адреса на едно цяло число, и покана това е адресът на. И ми даде друг адрес на INT и се обадете, че б адрес. Но сега ми код тук трябва да се промени. Защото, ако декларират вътр температура - която все още е от тип Int - но аз се съхранява в нея, каква стойност? За да бъде ясно, съм се сложи един с кода, както е записано в момента? Слагам на разположение в. Но аз не се грижи за В момента, нали? Temp съществува само третата чаша Джес " съществували, с каква цел? За да съхраните стойността. Мляко или портокалов сок. Не действително да се съхранява адреса на нито едно от тези неща, които се чувства малко безсмислено в този недвижим света контекста така или иначе. Така че наистина, това, което искате да поставите в темп не е адреса на, но Съдържанието на. Така че, ако е число като 123, това е 123-ото байт от паметта, че само се случва да бъде заема, че стойността в се случва да бъде окупатор. Ако искате да отидете на този адрес, Аз трябва да кажа, звезда. По същия начин, ако трябва да се промени това, което е на адреса, а, да променя това, за да започнете. Ако искам да се съхранява в това, което е в локация с това, което е на мястото най-б, б звезден звезда. Така че по-кратко, дори ако това не е съвсем потъва в още - и аз не можеше да се очаква че би толкова бързо - осъзнават, че всичко, което правя е префикс тези звезди на моите променливи, поговорка не вземете стойностите. Не променяйте стойностите. Но скоро, отидете на тези адреси и да получите стойността. Отидете на този адрес и промяна стойността там. Така че сега нека да превъртите обратно до върха, само за да определят този ред тук, за да промяна на прототипа да съвпадат. Но сега трябва да се направи още нещо. Интуитивно, ако съм се променила вида аргументи, суап очаква, какво друго трябва да се промените в моя код? Когато аз наричам суап. Защото точно сега, това, което съм I минаваща за размяна все още? Стойността х и стойността на Y, или на мляко и портокалов сок. Но аз не искам да правя това. Аз, вместо да премине в какво? Местоположението на х и местоположението на у. Какви са техните пощенски адреси, така да се каже. Така че, да се направи това, има един амперсанд. Ampersand вид звучи като адрес. така п, амперсанд, адреса на X и Y адрес. Така че това е умишлено, че ние използваме амперсанди Когато се обаждате на функция, и звездите при декларирането и при прилагане на функция. И само помислете амперсанд като адрес на оператора, и звезда като отида там оператор - или по-точно, на сочен оператор. Така че това е един куп думи, само за да се каже, че сега, надявам се, ще суап да бъде вярна. Нека да вървим напред и да направи - нека действително да преименувате файла, за да не тази програма все още да се нарича не суап. Аз твърдя, че ние ще го наричаме swap.c сега. Така че се уверете, суап. Dot, наклонена черта, суап. И сега наистина, х е 1, у е 2. И тогава, х е 2, Y е един. Ами нека да видим дали не можем да направим това с малко по-различен начин на това, което е става тук. Първо, позволете ми да се фокусирам върху нашата изготвяне екрана тук. И нека да предложи за миг - и когато рисувам тук ще се отрази там сега - нека да предложи ето един куп памет, или RAM, вътрешността на компютъра ми. И това ще бъде номер захапка, да речем, 1. Това ще бъде байта номер 2. И аз ще направя цял куп още, и след това един куп точки дот точка, за да показват, че има 2 милиарда от тези неща. 4, 5, и така нататък. Така че има първите пет байта на паметта на компютъра ми. Ясно ли е? Много малко от 2 млрд. евро. Но сега аз ще предложи следното. Ще предложа х ще съхраните номера 1 и Y ще за да съхраните номера 2. И нека да вървим напред сега и представлява тези стойности, както следва. Да го направим както следва. Дай ми само една секунда. Една секунда. OK. Аз искам да направя това малко по - да го направим отново. В противен случай аз ще и с помощта на същите номера, неволно, няколко пъти. Така че просто така че ние имаме различни номера да се говори за, да го наречем този байт номер 123, 124, 125, 126, и точка точка точка. И нека да твърдят сега, че аз отивам да постави стойност един тук, и стойността 2 Оттук иначе известни като х и у. Така че той просто така се случва, че това е X, това е г. И само от някои случайност, на компютъра, операционната система, случи да се сложи х в населено място номер 123. И у крайна сметка на място при 124 - Дявол да го вземе. Трябваше да определя това. О, човече, наистина ли ми искате да направите това? Да, искам да поправя това и б правилното за това днес. Съжаляваме, нова в това. 127, 131, и аз не искам да бъда този Комплексът, но защо да променя номера там? Защото аз искам да целочислени всъщност е четири байта. Така че нека да бъде супер анален за това. Така че, ако един се случва да се обърне внимание 123, на 2 ще бъде на адрес 127, защото това е само на 4 сбогуванията далеч. Това е всичко. И ние ще забравите за всички други адреси в света. Така че х е в населено място 123, у е в населено място 127. И сега, какво правя всъщност искате да направите? Когато аз наричам суап сега, това, което е всъщност се случва? Е, когато аз наричам суап, аз съм минаваща през адреса на X и Y адрес. Така например, ако тези две части на хартия сега представляват две аргументи А и Б да сменяте, това, което съм ще напиша на първия от тях, което аз ще се обадя отнасят до като? Точно така, 123. Така че това аз твърдя е. Това е параметър. Слагам адреса на х там. Какво е това? Какво е това? Не, не. Това е добре. И все пак добре, все още е добро. Така че това е. И сега на втория лист хартия, това ще бъде б, и това, което съм ще бъдат писмено на това парче хартия? 127. Така че единственото нещо, което се е променило, тъй като предишната ни разказваше тази история е, вместо действително едно и две, аз съм ще премине през 123 и 127. И аз сега ще сложа вътре на това поле, нали? Така, че черната кутия сега представлява суап функция. В същото време, нека сега някой изпълнение на функцията за размяна. Дали някой тук искали да работят като доброволци? Хайде нагоре. Как се казваш? Чарли. Добре, Чарли. Хайде нагоре. Така че Чарли ще играе ролята на нашето поле. И Чарли, това, което бих искал да направиш сега се прилагат суап по такъв начин, че предвид тези два адреса, всъщност сте се ще за промяна на стойностите. И аз ще шепна в ухото как да стартирате TV тук. Така че продължавайте напред, и ти си черна кутия. Излез там. Какви ценности виждаш за и какви стойности виждаш за б? CHARLIE: а е 123 и В е 127. DAVID Malan: OK, точно така. Сега има пауза за момент. Първото нещо, което ще направим сега, Според Кодекса - които Сега ще спра на екрана - ще бъде да се разпредели малко малко памет нарича темп. Така че аз ще отида напред и ви, че паметта. Така че това ще бъде трета променлива , че имате достъп до ви призова темп. И какво смяташ да пишат на температура лист хартия? CHARLIE: Указатели, нали? DAVID Malan: Добре, добре, не непременно указатели. Така линията на код, които съм маркира на дясната страна, нека да започнем от там. Той казва звезда. Така че в момента съхраняване на номер 123. И просто интуитивно, това, което е звезда 123 кажеш? Но специално, ако е 123, звезда означава какво? Стойността на. Или по-небрежно, отидете там. Така че позволете ми да предложа, държи на в ръката си, давай напред и лечение, които като че ли е карта. И да се разходим до компютъра памет, и нас ще разберете какво е в населено място 123. Точно така. Така ние виждаме в населено място 123 е това, което, очевидно? Значи, каква е стойността сега сте ще пуснат в температурата? Точно така. Така че продължавайте напред и да го направя. И напишете номера 1 на парче хартия, която е в момента озаглавена темп. И сега следващата стъпка, която ти започваш да се прилагат ще бъде това, което. Е, от дясната страна на следващия ред на кода е звезда б. б, на Разбира се, съхранява един адрес. Който да обхваща 127. Star б означава това, небрежно говори? Отидете на това място. Така че продължавайте напред и да ни разберете какво е в населено място 127. OK. Разбира се, на място 127, все още е на стойност 2. Така че какво ще сега да се съхранява при каквото и населено място в? Така звездни средство отидете на местоположението на. Какво е мястото на? Точно така. Така че сега, ако искате да промените това, което е на това място - Аз ще отида напред и да тичам гумата се тук. И сега той се връща на четката. Какъв номер ще си пиша в тази празна кутия сега? Точно така. Така че този ред код, за да бъде ясно - нека ме спрете това, което правите и Чарли посочват тук, това, което той направи, е просто пиша в тази кутия в населено място 123 стойността, която преди е била в б. И така, сега сме изпълнени наистина този втори ред код. Сега за съжаление, има все още остава един ред. Сега това, което е за температура, буквално? Очевидно е номер едно. Това не е адрес. Това е просто един номер, вид променлива от една седмица. И сега, когато ти казват звезден б, това означава, че отидете на адрес б, който е на Разбира се тук. Така че това на едно място - Аз ще отида напред и да изтриете това, което е в действителност има - и това, което са щях да пиша сега в локализация 127? CHARLIE: Temp, който е един. DAVID Malan: Temp, който е един. И какво се случва с темп в крайна сметка? Е, наистина не знам. Ние не ми пука. Всеки път въведохме функция До този момент всички локални променливи имате наистина са местни. И те просто изчезват. Те са възстановени от операционната система в крайна сметка. Така, че все още има температура на стойност 1 е нещо фундаментално безинтересни за нас. Добре, така че аплодисменти ако можехме за Чарли. Много добре направено. Добре, така че това, което прави по- това означава, че може да направи? Така се оказва, че ние сме били казва няколко благородни лъжи от доста време. Всъщност се оказва, че низ, всичко това време, не е истински поредица от символи, сами по себе си. Някакси е, че интуитивно. Но технически погледнато, низ е тип данни, които ние декларирахме вътрешността на CS50 на библиотеката, за да се опрости света през първите няколко седмици на класа. Какво низ наистина е е адресът на герой, някъде в RAM. Низ е наистина много, като 123 или 127, което се случва, да разграничават където низ започва в на компютъра ви памет. Но това не представлява низ, сам по себе си, себе си. И ние можем да видим това по следния начин. Нека да вървим напред и да се отворят някакъв код, който е сред днешните примери изходния код. И аз ще отида напред и да отворите до, да речем, за сравнение-0.c. Това е лоша програма, която ще да се прилага, както следва. Първо. Отивам да кажа нещо. Тогава аз ще отида напред и получите низ от потребителя с това, че следващия ред. Тогава аз ще го кажа отново. Тогава аз ще намеря друга низ от потребителя. И забележете, аз ви показвам един от низове в променлива наречена S, и още един от тези струни в променлива наречена тона. И сега аз ще твърдят, много основателно, че ако и равен равен тон, конците са същите. Можете въведете едно и също нещо. Иначе, конците са не е същото. В края на краищата, ако входа две цели числа, две символа, две поплавъци, две двойни, всички от типовете данни, за които се говори за до този момент да ги сравни - Спомням си направихме много ясно преди известно време че не направите това, тъй като единен знак за равенство, разбира се оператора за присвояване. Така че би било грешка. Ние използваме равен знак за равенство, които наистина сравнява неща за истинско равенство. Но аз твърдя, че това е бъги. Ако отида напред и да направи сравнение нула, и след това направете точка наклонена черта сравнение нула. И напишете в, да кажем, здравей. И след това нека да кажа здрасти отново. Буквално едно и също нещо, на компютъра претенции аз напечатани различни неща. Сега може би аз просто погрешно написан нещо. Ще въведете името ми този път. Искам да кажа, здравейте. Здравейте. Това е различно всеки път. Е, защо е така? Какво всъщност се случва под предния капак? Е, това, което наистина се случва под качулката е низ след това Аз написах, че първи път например е думата, здравей, разбира се. Но ако ние представляваме този отдолу качулката, припомни, че низ е в масив. И си казахме, колкото в миналото. Така че, ако си правя този масив по този начин, аз съм ще представляват нещо съвсем подобно на това, което направихме преди малко. И там е всъщност нещо, специално тук. Какво сме се определи най- в края на всеки низ? Да, тази нула наклонена черта, която е само начин за представяне, буквално, 00000000. Осем 0 бита в един ред. Не знам, честно казано, това, което е след това. Това е просто един куп повече RAM вътрешността на компютъра ми. Но това е масив. Ние говорихме за масиви преди. И ние обикновено говорим за масиви като място нула, след това, а след това два. Но това е само за удобство. И това е напълно относително. Когато сте всъщност да е с памет от на компютър, това е разбира се всеки 2 милиарда някои странни байта, потенциално. Така че наистина под предния капак, през цялото това време, да. Това може много добре да бъде нула скоба. Но ако копаем още по-дълбоко под предния капак, това е наистина справяне с номер 123. Това е адрес 124. Това е адрес 125. И аз не се притеснявам този път. Това са сега един байта освен поради каква причина? Колко голяма е Чар? A Чар е само един байт. Едно цяло число обикновено е четири байта. Значи затова го направих 123, 127, 131 и така нататък. Сега мога да продължа по математика прости и просто правя плюс 1. И това е сега това, което наистина се случва на под предния капак. Така че, когато декларират нещо подобно, низ и това всъщност - Оказва се - Чар звезда. Star, разбира се, означава адрес, известен още като показалка. Така че това е адресът на нещо. Какво е това на адреса на? Е - Аз съм единственият, който може да види много важен момент правя, или смятате, че Правя. Така низ - Тъжното е, че имам монитор точно там, където може да се види, че. Добре, така низ и е това, което I обявена преди това. Но се оказва, благодарение на малко магия в библиотеката CS50, всичко това време низ буквално Чар е звезда. Звездата отново означава показалеца или адрес. Фактът, че това е фланкиращ Чар дума означава, че това е адрес на герой. Така че, ако получите низ се нарича, и въведете в Н-Е-Л-Л-О, да предложи това, което сега е да се низ буквално се връща всички този път, въпреки че ние сме по-скоро опростени света? Какво означава да низ всъщност завърне като неговото връщане стойност? 123 в този случай, например. Ние преди това каза, че взимането на просто връща низ, поредица от героите. Но това е доста голяма бяла лъжа. Начинът, по който се низ наистина работи под капака е тя получава низ от потребителя. Той Plops знаците, които Той или тя видове в паметта. Тя поставя наклонена черта нула в края на тези поредица от знаци. Но след това, което се получи низ буквално се върне? Той буквално връща адрес на първите байта в RAM, че го използва за тази сила. И се оказва, че само чрез връщане един адрес на Първият знак в низа, който е достатъчно за намиране на цялост на низа. С други думи, да низ не трябва за да се върнете 123 и 124 и 125. Тя не трябва да ми даде дълго списък на всички байтове, които ми низ се използва. Защото едно, всички те са успоредно. И второ, на базата на първия адрес, I мога да разбера, когато низ завършва. Как? Особеният характер нула, на наклонена черта нула в края. Така че с други думи, ако Заобикаля - вътрешността на променливите - адреса на Чар, като вие поемате че в края на всеки низ, нито поредица от символи, като ние, хората, мисля за низове, ако се предположи, че в края на всеки такъв низ има нулева наклонена черта, ти си златен. Защото винаги можете да намерите края на низ. Сега какво всъщност тогава ще в тази програма? Защо е тази програма, сравни-0.c, бъги? Какво всъщност се сравняват? Да? Студентът: [недоловим]. DAVID Malan: Точно така. Това е сравняване на места на струните. Така че, ако потребителят е въвел в здравей веднъж, както направих аз, паметта може да се свърши изглеждам така. Ако това потребителят видове в Здравейте отново, но като се обадите получите низ отново, с е не е особено умно, освен ако те науча тя да бъде умна като пишете код. C - и компютри, по-общо - Ако напишете думата Здравейте отново, Знаете ли, че това, което ще получите. Вие просто ще получите втори масив памет, която, да, случва се съхраняване на H-E-L-L-О и така нататък. Това ще изглежда по същия начин нас, хората, но този адрес може да не е 123. Той може просто да се случи така, че операционна система, има някои разположение пространство, например в населено място - нека да кажа нещо произволно, , като това е място 200. А това е място 201. А това е място 202. Нямаме представа къде е ще бъде в паметта. Но какво означава това е, че това, което е ще бъдат съхранявани в крайна сметка в S? Броят 123. Какво ще се съхраняват в тон, в този произволен пример? Броят 200. И всичко това означава, че след това е очевидно, 123 не е равно на 200. И така, това, ако никога състояние Проверява. Защото взимането използва различен блокове памет всеки път. Сега можем да видим това отново В друг пример. Нека да вървим напред и да се отворят копиране 0.c. Аз твърдя, че този пример ще опита - но не успяват - да копирате две струни както следва. Отивам да кажа нещо на потребителя. Аз след това ще получите низ и го наричат ​​лидер. И сега, аз правя тази проверка тук. Споменахме това малко назад. Но когато може да получи нулева възвръщаемост низ, друг специален знак или специален символ Да речем. Ако е от паметта. Например, ако потребителят е наистина е трудно и вида на брутален броя на символите в клавиатура и хитове Enter. Ако броят на знаците, просто не мога побере в RAM за каквото и луд Причината, както се низ може много добре се върнете нула. Или ако си самата програма се прави много за други неща и има само Няма достатъчно памет за взимането на за да успее, той може да свърши до връщане нула. Но нека да бъдем по-точни за това какво е това. Какво е и типа на данните наистина? Char звезда. Така се оказва, сега можем да кори подкрепят слой на нула. Оказа се, нищожна е - да, очевидно специален символ. Но какво е това наистина? Наистина, нищожна е просто символ, че ние хората използват, за да представляват нула, както добре. Така авторите на C и компютри по-общо, реши години че, знаеш ли какво. Защо не се гарантира, че нито един потребител данни е никога, никога, никога съхраняват при чао нула? В действителност, дори и в моята произволно например преди, аз не започна номерационния байта на нула. Започнах в една. Защото знаех, че хората в света са решили да запазят нула байт в RAM никого като нещо специално. Причината е, че по всяко време искате сигнализира, че нещо не е наред по отношение на адреси, да се върна нула - иначе известни като нула - и защото знаеш, че няма легитимни данни на адрес нула, ясно това означава, че грешка. И затова ние, по силата на споразумение, проверете за нищожна и връщане нещо като един от тези случаи. Така че, ако ние превъртете надолу сега, това е само след това някои проверка за грешки, за всеки случай нещо се обърка с [? спасяват?] напълно и спиране на програмата , като се върнете по-рано. Тази линия сега може да бъде пренаписана тъй като това, което означава какво? От лявата страна, дай ми още един показалец към символен, и го наричат ​​тон. Какво съм аз съхраняване вътрешността на тон, на базата на този един ред код? Аз съм съхраняване на място. Конкретно населено място който беше в S. Така че, ако потребителят е въвел в здравей, и че първо здравей случва да свърши Оттук след това номер 123 е ще се върне от получите канапи и да се съхранява - както казахме по-рано - в лидер. Когато предприятието декларира друга показалеца на Чар и го наричат ​​т, кой номер е буквално ще свърши в тона според историята? Така 123. Така че технически вече ите, така и т са насочени към точното същите блокове памет. Така че забележите това, което аз ще направя сега, за да докаже, че тази програма е бъгав. Първо аз ще твърдят, с за печат е, капитализиране копие от низ. Тогава аз ще направя малко проверка за грешки. Отивам да се уверите. Да се ​​уверите, че низ тон е най- малко по-голяма от нула в дължина, така че има някои характер има действително да се възползва. И тогава може да се припомни това от предишните примери. 2 горната - което е в на ctype.h файл. T скоба нула ми дава нула характер на низ тон. И 2 горната на същата стойност, на Разбира се, превръща го в главни букви. Така интуитивно, това подчерта линия с код е капитализиране на първия писмо, в т. Но това не е капитализиране, интуитивно, първата буква в лидер. Но ако се мисли в перспектива, това, което съм за да се види, когато стартирате тази програма и отпечатване както на оригинала, S, и т. нар. копие, нали? Те всъщност ще бъде една и съща. И защо са те ще бъдат същите? И двамата, сочещи към точно същото нещо. Така че нека да направим това. Направи нула копие. Той съставя OK. Нека да тече нула копие. Позволете ми да объркате нещо като 'Здравей' в са с малки букви след това натиснете Enter. И той твърди, че както първоначалната S и копието наистина са идентични. Така че това, което наистина се е случило тук? Позволете ми да преначертае тази снимка просто за да разкажат историята в малко по-различен начин. Какво всъщност се случва под качулка, когато декларират нещо подобно Чар началото ите, или низ S, Аз съм се показалка - който се случва да бъде четири байта в CS50 уреда и в много компютри. И аз ще се обадя на този лидер. А това в момента има някаква неизвестна стойност. Когато Вие декларирате променлива, освен ако не сте се поставите на стойност там, които знае какво е там. Това може да бъде някаква случайна последователност на бита от предишния изпълнение. Така че, когато, в съответствие моя код се получи низ и след това се съхранява на връщане стойност в S получите низ по някакъв начин - и ние в крайна сметка ще Отлепете как се струнни произведения, някак Заделя масив, който вероятно изглежда малко като този. H-E-L-L-O, наклонена черта нула. Нека предположим, че това е адрес 123 само първата последователност. Така че се връща низ, в подчерта линия там, връща номер казахме, 123. Така че това, което наистина отива вътре е тук? Е, това, което наистина отива вътрешността на S е 123. Но честно казано, аз съм се малко объркани от всички тези адреси, всички тези произволни числа. 123, 124, 127. Така че нека действително опростяване света по-малко. Когато говорим за указатели, честно казано, да нас, хората, които, по дяволите, му пука къде нещата са в паметта? Това е напълно произволно. Всичко ще зависи от това как е оперативната памет потребителят има. Всичко ще зависи от това кога през деня стартирате програмата, може би, и какво вход на потребителя, ти дава. Ние сме жилище на маловажни детайли. Така че нека да се абстрахирам от и казват, че, когато стартирате ред код, подобен на този, Чар звезда и получава възвръщаемост стойността на взимането. Защо не, вместо просто да изготви това, което ние да наричаш показалеца, като че ли е сочеше нещо? Така че аз твърдя, че сега и до има указател - под капака е на адрес. Но това е просто посочи първият байт в низ, който е бил върнат. Ако сега се върнем към код тук какво става в тази линия? Е, в този подчерта линия сега, Аз съм обявяване явно друг променлива наречена тон. Но тя също е показалеца, така че аз ще да го изготви, както на теория, точната същия размер кутия. И аз ще го наричат ​​тон. И сега, ако се върнем към кода отново, когато се съхранява и във вътрешността на тон, това, което съм технически пускането вътрешността на тона? Ами технически погледнато, тази е номер 123. Така че наистина трябва да се пише броя 123 там. Но нека да го по-високо ниво. Т, ако това е само показалеца, интуитивно, е точно това. Това е всичко, което се е съхраняват там. Така че сега, през последните интересни линии на код, когато действително отида за капитализиране на нула характер в тон, какво се случва? Е, т скоба нулата сега се сочи до каква характер, вероятно? Тя посочи з. Защото тона скоба нула - спомняте, това е стар синтаксис. т винкел нула просто означава, че ако т е низ, т скоба нула означава получаване на нула герой в тази сила. Така че това, което всъщност означава, че е да отидете на този масив - и да, това може да е 123, това може да бъде 124. Но всичко е относително, не забравяйте. Когато говорим за масив, имаме предимството да говорим за относителните показатели. И така, сега можем само да поеме , че Т е Н скоба нула. Така че, ако аз наричам 2 горната върху него, какво е това наистина прави се капитализират малката ч до главни H. Но разбира се, това, което е лидер? Тя сочи към един дяволски низ. Така че това е всичко, което се случва в този код досега. И така, какво е тогава изводът? Как да се определи тези два проблема? Как да се сравни с реалните струни? Е интуитивно, как ще отида за сравняване на два Струни за истинско равенство? Какво означава, ако двама струни са равни? Ясно е, че не им адреси са равни по памет, защото това е ниска подробно ниво изпълнение. Всички герои са едни и същи. Така че позволете ми предложи, и нека представим във версия един от compare.c тук, така че сравни-1.в. Позволете ми да предложа ние все още се получи показалеца наречен S, и магазин в него върне стойността на взимането. Нека да направим същото и с тона. Затова никой от код е различен. Отивам да добавите малко допълнителна проверка за грешки сега. Така че сега, че ние сме нещо като пилинг обратно тези слоеве в CS50 на това, което низ всъщност е, че трябва да бъдем по-анален за вземане, че ние не злоупотребяват невалидни стойности като нула. Така че аз съм просто ще проверя. Ако не е е равно на нула и т не равен нула, това означава, че си добре. Връща низовата не се притеснявам да нито един от тези струни. И вие можете да предполагам, може би сега, това, което се STR CMP вероятно да направя? String сравнение. Така че ако сте програма в Java и преди, това е като равен метод в низ клас. Но за тези от вас, които не са програмиран преди, това е само функция в. Това се случва, да се предлагат в файл, наречен string.h. Това е, когато тя е обявена. И низ сравнение - Аз всъщност забравят използването му, Но да оставим това. Припомнете си, че можем да направим мъж, разбърква се сравни. И това става, за да изведете Linux програмисти на потребителя. И това е, честно казано, малко загадъчен. Но мога да видя тук, че Да. Аз трябва да включват string.h. И тук пише, че по описание "на функция низ сравни сравнява на два низа S1 и S2. "И S1 и S2 са очевидно двете аргументите, подадени инча Аз наистина не помня какво Конст е, но сега забелязвам - и вие може да сте виждали това вече, когато сте използвате Мъжът страници, ако има всичко - Чар, че звездата е просто синоним с канап. Така че тя сравнява две струни, S1 и S2, и го връща цяло число по-малко малка или равна на или по-голяма от нула S1, ако се установи, съответно, да бъде по-малко от, или мач, или да бъде по-голяма от S2. Това е просто един много сложен начин да се каже че низ сравнение връща нула, ако две струни са интуитивно идентични, характер за характер за характер. Тя връща отрицателно число, ако ите, по азбучен ред, се предполага, че да дойде пред тон. Или се връща положително число, ако а е трябвало да дойде след т по азбучен ред. Така че с тази проста функция, може да можете, например, да подреждате цял куп думи? Така че в тази нова версия, ще да вървим напред и да compare1. Dot наклонена черта сравнение на един. Ще напишете просто 'Здравей' във всички малки букви. Отивам да напишете просто 'Здравей' във всички малки букви отново. И за щастие сега той осъзнава, Въведох едно и също нещо. В същото време, ако напишете просто 'Здравей' в долната случай и HELLO с главна буква и да ги сравните, аз напечатани различни неща. Защото не само са адресите различни, но ние сме сравняване различни герои отново и отново. Ами да вървим и да определи една Другият проблем сега. Позволете ми да се отворят версия един от копие, което сега адреси този въпрос по следния начин. А това ще изглежда малко по-сложна. Но ако си мислите за това, което ние проблем трябва да се реши, надявам се това ще бъде ясно в един момент сега. Така че този първи ред, знак началото т, в гледна точка на лаик може някой да предложи какво означава тази линия тук? Char звезда тон, това, което е, че правиш? Добре. Създаване на показалеца на някои място в паметта. И нека да се прецизира за малко. Декларира променлива, която ще съхранява адрес на някакъв знак в паметта, просто да бъде малко по-правилното. ОК, така че сега от дясната страна, съм никога не е виждал една от тези функции преди, изчистване. Но какво може да означава това? Разпределение на паметта. Memory разпределение. Така се оказва, до сега, ние не са наистина имаше мощно средство за иска от операционната система, дайте ми малко памет. Вместо това, сега ние имаме функция, наречена изчистване, че прави точно това. Въпреки че това е доста голяма разсейване точно сега, забелязвам, че в между двете скоби е Просто ще бъде число. Къде сте написали въпросната марка може да бъде число. И този номер означава, дайте ми 10 байта. Дай ми 20 байта. Дай ми 100 байта. И изчистване ще направи всичко възможно да поиска от операционната система - Linux, в този случай - хей, са си 100 байта от RAM на разположение? Ако е така, да ги върне байтове за мен от връщане на адрес, който на тези байтове, може би? Най-първата. Така че тук също - и това е преобладаващата в C, всеки път, когато сте справяне с адреси? Вие почти винаги се занимават с Първият такъв адрес, без значение колко е голям парче памет се е върна, така да се каже. Така че нека да се потопите в тук. Аз се опитвам да се разпределят как много байта по-точно? Добре. Дължина на тетивата на лидер - да направи конкретен пример. Ако S е здравей, H-E-L-L-О, каква е низ дължина и, очевидно? Така че това е пет. Но аз правя един плюс 1 върху този, защо? Защо искам шест байта вместо пет? Нулевата характер. Аз не искам да оставим това специален нула характер. Защото, ако направите копие на Здравейте и просто правя H-E-L-L-О, но аз не слагам че специален символ, на компютъра не може да има, по случайност, наклонена черта нула до мен. И така, ако аз се опитвам да разбера дължината на копието, аз може би си мислите, че това е 20 символа, или един милион символа, ако просто никога не съм се случи да удари нула обратно наклонена черта. Така че имаме нужда от шест байта за съхранение H-E-L-L-O, наклонена черта нула. И тогава това е само да бъде супер анален. Да предположим, че забравям какво размера на Чар е. Продължаваме да повтаряме, че е един байт. И обикновено е така. На теория, това може да бъде нещо различни, на друг Mac или различни PC. Така се оказва, че е този оператор нарича sizeof, че ако го преминете името на типа данни - като Чар, или средно, или поплавък - тя ще ви каже, динамично, колко байта на Чар заема по този определен компютър. Така че това е ефективно само все едно да кажеш пъти един или пъти нищо. Но го правя само за да бъде супер анален, че само в случай, че се различава Чар на компютъра в сравнение с мината, по този начин по математика винаги ще проверя. На последно място, тук долу да проверя за нищожна, което винаги е добра практика - отново всяко време да си имаме работа с указатели. Ако изчистване не е в състояние да даде ми шест сбогуванията - което е малко вероятно, но за всеки случай - върнете една веднага. И сега, давай напред и да копирате низ, както следва. И това е запознат синтаксис, макар и в различна роля. Аз ще отида напред и да получите низ Дължината на лидер и да го съхранява в п. Аз тогава ще обхождане от I равен нула до и включително N, по-голямо или равно на. Така, че на всяка итерация, сложих Ith характер на лидер в Ith характер на тон. Така че това, което наистина се случва под качулката тук? Ами ако това, например, е лидер - и аз напечатани в думата H-E-L-L-O и има наклонена черта нула. И отново, това е и посочи тук. И тук вече е тон. И това се сочи сега, за да копие от паметта, нали? Изчистване ми е дал цяло парче на паметта. Аз не знам какво е първоначално всяка от тези места. Така че аз ще ги мислим като цял куп въпросителни знаци. Но веднага след като започна примка от нула нагоре по дължината на S, T скоба нула и Т скоба 1 - и ще сложа това сега на въздушната - т скоба нула и S скоба нула означава че аз отивам да се копира итеративно ч. в тук, E-L-L-O. Плюс това, защото аз направих плюс 1, наклонена черта нула. Така че сега, в случая на сравнение-1.В, в края на краищата, ако разпечатате капитализация на тон, трябва да се се види, че и е непроменена. Позволете ми давай сега и това. Така че се copy1. Dot наклонена черта copy1. Отивам да напишете просто 'Здравей', Enter. И сега забелязвам, само копие е главна. Защото аз наистина имам две блокове памет. За съжаление, можете да направите някои доста лоши и доста опасни неща тук. Позволете ми да спра един пример тук, сега, които ни дава пример за няколко различни линии. Така че просто интуитивно тук, на първа линия на код, вътр звезден х, се обявява променлива наречена х. И какъв е типът на данните на тази променлива? Какъв е типа данни на тази променлива? Това не беше Катерачът. Типът на данните е Int звезда. И така, какво означава това? х ще съхраняване на адреса на Int. Просто. Y ще се съхранява адрес на вътр. Какво е третият ред на код правиш там? Той е разпределяне колко байта, най-вероятно? Четири. Поради размера на едно цяло число е обикновено четири, изчистване на четири дава ме подкрепи на адрес на парче памет, първият от чиито байтове съхранява сега в х. Сега се движим малко по-бързо. Star х означава какво? Това означава, отидете на този адрес и сложи какъв номер там? Поставете номер 42 там. Star Y означава отидете на това, което е най-г и да изложат на номер 13 има. Но почакайте. Какво е в Y в момента? Какво адрес е у съхранение? Ние не знаем, нали? Ние никога не сме веднъж използвайте задача оператор, включващи база. Така, както е обявена г. на втора линия на код е просто някакъв боклук стойност, голяма въпросителен знак така да се каже. Може да се посочи произволно с нищо в паметта, която обикновено е лошо. Така че веднага след като удари тази линия там, звезден г. се равнява 13, нещо лошо, нещо много лошо е около да се случи на Binky. Така че нека да видим какво ще се окажете случва с Бинки тук, в тази минута или поне така изглежда. [VIDEO PLAYBACK] -Хей, Binky. Събудете се. Това е време, за показалеца забавно. -Какво е това? Научете повече за указатели? О, Goodie. -Добре, за да започнете, предполагам, че сме ще се нуждаят от няколко насоки. -OK. Този код се отпускат две насоки който може да посочи числа. -Добре, добре, виждам две насоки. Но те не изглежда да е сочи към нищо. -Точно така. Първоначално указатели не сочи към нищо. Нещата, те изтъкват, се наричат pointees и установяването им е отделен етап. -О, да, точно така. Знаех, че. На pointees са отделни. Е, как да разпредели pointee? -OK. Е, този код отделя нови числа pointee, и тази част са х точка към него. -Хей, това изглежда по-добре. Така че не го направим нещо. -OK. Ще сочен х показалеца, за да съхранявате 42 броя в своята pointee. За този трик, аз ще трябва ми магия пръчка на dereferencing. -Вашият магическа пръчка на dereferencing? Ами, това е чудесно. -Това е това, което изглежда като код. Аз просто ще създаде броя, и - -Хей, виж. Ето как става. Така прави и сочен за х следва стрелката, за да получите достъп до своята pointee. В този случай, за да се съхранява 42 там. Хей, опитайте да го използвате, за да съхраните номера 13 през другата показалеца, у. -OK. Аз просто ще отида тук, за да у и Вземете номер 13 се създаде. И тогава се взема пръчка на dereferencing и просто - Уау! -О, здравей. Това не е работа. Кажи, Binky, аз не мисля, че dereferencing Y е добра идея, защото създаването на pointee е отделен етап. И аз не мисля, че някога го е направил. -Хм. Добър въпрос. -Да, разпределени показалеца г. Но ние никога не сме го настроите да сочи към pointee. -Хм. Много наблюдателен. -Хей, което търсите добре там, Binky. Можеш ли да го оправя, така че у точки със същия pointee като X? -Разбира се. Ще използвам магическа пръчка на показалеца задача. -Е, че ще бъде проблем като преди? -No. Това не докосвайте pointees. Тя просто променя една показалка точка за едно и също нещо като друг. -О, разбирам. Сега у посочва на същото място като х. Така че чакаме. Сега Y е фиксиран. Той има pointee. Така че, можете да опитате с магическата пръчка на dereferencing отново да изпрати над 13. -OK. Тук върви. -Ей, виж това. Сега dereferencing работи на база. И тъй като указатели са споделяне че един pointee, те както виждате 13. -Да. Споделяне. Все едно. Така че отиваме разменят местата сега? -О, виж. Нямаме време. -А - -Само не забравяйте трите Показалецът правила. Първо, основната структура е, че имате показалеца. И той посочва към един pointee. Но показалеца и pointee са отделни. И общата грешка е да създаване на показалеца, но да забравяйте да даде pointee. Номер две, показалеца dereferencing започва на показалеца и следва своята стрелка, за да получите достъп своята pointee. Както всички знаем, това работи само ако има е pointee, който се връща към Правило номер едно. Номер три, показалеца задача отнема една показалка и промените, които той да сочи към същото pointee като друг показалеца. И така, след прехвърлянето, двете насоки ще за едни и същи pointee. Понякога това се нарича споделяне. И това е всичко там е до него, наистина. Чао чао сега. [END възпроизвеждане на видео] DAVID Malan: Така повече на указатели, повече на Binky следващата седмица. Ще се видим в понеделник.