Малан ДАВИД: Поздрав, и добродошли назад у ЦС50. Дакле, ово је крај недеље четири. Само једна најава прво. Дакле, такозвана пета понедељак је долази овај долази понедељак. Ово је прилика да се промени од САТ / УНСАТ на словну оцену, или из Писмо разред САТ / УНСАТ. Досадно, тај процес не захтева потпис, јер морате да попуните из једне од тих ружичастих Адд / пад форме. Јер технички, САТ / УНСАТ верзија и верзија слово разред имају различите бројеве каталог. Али ништа страшно. Само дођи до мене или то Роб или да Лаурен у сваком тренутку. Или да нам пошаљете емаил ако немате ту врсту папирологије потребно данас, и ми будите сигурни да ће вам помоћи да се брига да пре понедељка. У реду, тако да данас - заправо, постоји мало ехо. Можемо тон ме мало? ОК. Тако данас, уводимо тему познат као курсор. И ја ћу признати да је ово један од сложеније теме које смо склони да покривају у овој класи, или стварно било Уводни курс који користи Ц. Али, да ми на реч, нарочито Ако је ваш ум осећа мало више склоности данас и у наредним недељама. То није представник вам иде ситуација бити још гора то само значи да то је посебно софистицирана тема Обећавам, да је неколико недеља Дакле, све ће изгледати превише упадљиво једноставно у ретроспективи. Још увек се сећам и данас. Ја сам седео у трпезарији Еллиотт, седео поред мог ТФ Нисхат Мехта, који је био становник Еллиотт куће. И из неког разлога, ово тема само кликне. Што ће рећи да сам и ја борила са њим за неки износ, али сам Учинићу све да се избегне било каква помоћ борба са темом која је на крају је веома моћан. У ствари, једна од тема ћемо разговарати у недељама које долазе да за безбедност, и како можете заправо експлоатишу машине на начин које нису биле намењене. А ти су обично експлоатисање резултат грешака, грешака које смо људи праве од не разумевање неких од основне имплементације Детаљи преко које програми су направљени. Сада изгледа да се то све више корисник пријатељски, мислио сам да игра 10 Други преглед мало цлаиматион фигура названа Бинки који је довео до живот по један наш пријатељ на Станфорду, професор Ник Парланте. Дакле, дозволите ми да вам дам ово Теасер од Бинки овде. [ВИДЕО РЕПРОДУКЦИЈА] -Хеј, Бинки. Пробудите се. Време је за забаву показивача. -Шта је то? Сазнајте више о тројке? О, Гоодие. [ЕНД ВИДЕО РЕПРОДУКЦИЈА] Малан ДАВИД: То је Стенфорд информатика. Дакле, више о томе да дођу. [Апплаусе] ДАВИД Малан: Извините, Ник. Дакле, подсетити да последњи пут смо завршили на ово стварно узбудљиво Цлиффхангер којим је та функција једноставно не ради. Најмање интуитивно, он осећа као да би требало да ради. Једноставно замене вредности два цела броја. Али, сећам се да када штампају оригиналне вредности у главном, и један два, они су ипак били једна и два и два, а не један. Тако да ме заиста пребацити преко на уређај. И написао сам се мало скелетних кода у напредовати овде, где ја тврдим да је к ће бити 1, 2 г ће бити. Ја онда одштампате обостране вредности са штампом ф. Ја онда тврдим овде да ћемо да их замене. Оставио сам празно место овде за нас да попуните данас за који тренутак. Затим, ја ћу да тврде да две варијабле су заменили. Онда ћу да одштампате их поново. И надам се, да треба да видите 1, 2. 2, 1. То је супер једноставно Циљ сада. Па како да идемо о премештају две променљиве? Па ако ја овде предлажем да ове шоље могу да представљају меморије у рачунару. Ово је неколико залогаја, ово је још неколико залогаја. Да смо волонтер дођи горе и мик нам неко пиће, ако познато? Хајде горе. Како се зовеш? Јесс: Јесс. ДАВИД Малан: Јесс? Хајде горе, Јесс. Ако вам не смета, морамо да уложимо Гоогле стакла на вас, тако да можемо овековече ово. У реду, стакло. Снимање видео. И у реду, ми смо добро идите са Јесс овде. У реду. Драго ми је што смо се упознали. Дакле, оно што желим да радим овде - ако можете, веома брзо - Само нам сипа пола чаше наранџе сок и пола чаше млека, представља ефикасан начин бројева 1 у једну шољу и 2 у другом купу. Ово ће бити добар снимак. Јесс: Извините. Малан ДАВИД: Не, не. То је у реду. Лепо. У реду, тако да имамо четири бајта вреди сока од наранџе. Ми ћемо га назвао вредност 1. Сада још четири бајта у вредности од млека. Да ли ће га зову вредност 2. Дакле, Кс и И, респективно. У реду, тако да сада, ако задатак при руци - за тебе, Џес, испред свих за својим друговима - је да мењате вредности кии такве да хоћемо да сок од наранџе у друга чаша и млека у овом купу, како могао да - пре него што заправо је - ићи ће то урадити? Ок, мудра одлука. Тако да је потребно мало више меморије. Па хајде да издвоји привремени шоље, ако хоћете. А сада наставите да мењате кии. Одлично. Дакле, врло добро урађено. Хвала ти пуно, Јесс. Изволите. Мали сувенир. ОК, очигледно, идеја супер једноставно. Потпуно интуитивно да нам је потребно мало више простора за складиштење - у овом облику, шоља - ако се заиста жели да свап ове две променљиве. Па хајде да уради управо то. Овде између где тврдим да сам ће радити неке замене, ја ћу само напред и прогласи темп. И ја ћу поставити оно једнако, рецимо, к. Тада ћу променити вредност к као што је овде са Јесс млеко и сок од наранџе да буде једнака са г. И ја ћу да се промени и бити једнака да не к, јер сада ће бити заглављени у кругу, већ темп. Где сам привремено - или где Џес привремено стави сок од наранџе пре цлобберинг да шоља са млеком. Па да иде напред и да то сада. То се зове носвап.ц. А сада допустите да радим никакву замену. И заиста ја видим, ако се прошири прозор мало, да к је 1, и 2. А онда је к 2, и 1. Но, сетимо се да је у понедељак смо урадили ствари мало другачије којим сам уместо да спроводи помоћни функцију, ако хоћете, то је у ствари празнина. Звао сам га мењате. Дао сам два параметра, и позвао сам их и позвао сам их б. Искрено, ја да их зовем к и и. Нема ништа заустављање ми у томе. Али, рекао бих да је то онда мало нејасна. Јер Подсетимо да смо за понедељак тврдио да су ови параметри су копије вредности прошло ин Па се само зеза са вашим ум, мислим да, ако користите потпуно исте променљиве. Тако да уместо да их називам и Б, само због јасноће. Али можемо назвати их највише шта желимо. И ја ћу да копирате и налепите ефикасно овај број од горе доле у ​​овде. Пошто сам видео да то ради. Дакле, то је у прилично добром стању. И ја ћу променити свој к, у мом к да, моја г у б и мој И да б. Дакле, другим речима, потпуно исти логика. Исту ствар је урадио Џес. И онда једна ствар коју треба да урадите горе Овде, наравно, ово је сада призивам функција, или позовите ову функцију. Зато ћу позвати ову функцију са два улаза, Кс и И, и погодак Саве. У реду, тако суштински иста ствар. У ствари, вероватно сам направио програм непотребно искомпликовали пишете функцију, то је само узимање неких шест линија кода, док сам раније имплементиран то у само три. Дакле, дозволите ми сада иде напред и преобликује овај, не праве замену. У реду, ја зајебао овде. То би требало да буде грешка која можда види све обично као ваш Програми се сложенији. Али, ту је лако поправити. Дозволите ми да се помицати овде. А шта је прва грешка видим? Имплицитна декларација. Шта то обично значи? Заборавио сам прототип. Заборавио сам да предајем компајлер који своп ће постојати и ако је он не постоји на самом почетку програма. Дакле, ја ћу само рећи празнина, замену, инт, инт б, тачка и зарез. Зато нећу да га реимплемент. Али сада се она подудара шта је доле. И запазите, одсуство зарезом Овде, који није неопходан када спровођење. Дакле, дозволите ми да ово римејк, не праве замену. Много бољем стању. Покрени нема замену. И, проклетство. Сада смо тамо где смо и били у понедељак, где ствар не мењате. А шта је интуитивно објашњење зашто је то тако? Да? СТУДЕНТ: [ИНАУДИБЛЕ]. ДАВИД Малан: Управо тако. Дакле, и б су копије к и и. А у ствари, сваки пут када сте били позивање функција које до сада неке променљиве као интс - као замена очекује се овде - Били сте у пролазу примерака. Сада то значи да је потребно мало времена, делић секунде, за рачунар да копирате из једног бита променљива у делићима другог. Али то није тако велика ствар. Али, они су ипак копија. И тако сада, у контексту замене, Ја сам, у ствари, успешно А и Б мења. У ствари, хајде да брзо разум провери. Штампа је ф% сам, нова линија. И хајде да се прикључите. Сада ћемо учинити исту ствар са б. И хајде да урадимо исту ствар. А сада, дозволите ми да копирате те исте линије поново на дну функције после моје три линије занимљиво могао да изврши, и одштампајте и б опет. Сада хајде да то, не праве замену. Дозволите ми да прозор терминала мало виши, тако да можемо да видимо више од тога одједном. И води никакву замену. к је 1, и 2. је 1, Б 2 је. И онда, је 2, Б 1. Тако се ради, баш као Јесс да ли овде унутар свап. Али, наравно, то има ефекта на променљиве у главни. Дакле, видели смо један трик којим смо могла поправити, зар не? Када сте суочени са овим одређивање оквира питање, само да немају одговор и да к и и какве променљиве уместо тога? Можете да их глобална. Ставите их на самом врху датотеке као што смо урадили, чак и у игри од 15 година. Ми користимо глобалну променљиву. Међутим, у контексту игре 15, да је разумно да се глобална променљива представља таблу, јер укупност 15.ц је све о спровођењу ту игру. То је оно што је датотека постоји да уради. Али у овом случају овде, ја сам позивање функција замену. Желим да замени две променљиве. И то би требало да почне да се осећа само збуњена ако је решење за све наше Проблеми кад наиђемо на обим питања је да га глобално. Јер врло брзо је наш програм постати прилично хаос. И ми смо то урадили веома штедљиво као резултат у 15.ц. Али испоставило се да постоји бољи начин заједно. Дозволите ми да се вратим у ствари и брисање принт двојки, само да поједноставе овај код. И дозволите ми да предложи то, заиста, није лоше. Али ако уместо тога додати у неким звездицама и звезде, уместо тога ја могу да укључим ово функција у једну која је заправо оперативан. Дакле, да се вратим овде и признати говорећи звездицу је увек тешко, па ћу рећи звезде. Само ћу признај на то. У реду. И сад, шта ћу да уместо тога? Дакле, као прво, ја ћу навести да уместо положен у инт свап функцију, ја сам уместо тога од рећи инт звезду. Сада, шта указује звезда? То је тај појам показивачем тог Бинки, цлаиматион лик, био је мислећи на тренутак пре. Дакле, ако кажемо инт звезду, значење ово сада је да неће бити донет од стране своје вредности. Неће да се копира унутра Уместо тога, адреса је ће бити донет унутра Дакле, подсетити да унутрашњост рачунара је гомила меморије, иначе познат као РАМ. А то је само РАМ гомила бајтова. Дакле, ако је ваш Мац или ПЦ рачунар има два гигабајта, имате 2 милијарду бајтова меморије. Сада хајде да претпоставимо да је само држати ствари лепо и уредно, ми доделити адресу - број - сваком бајту РАМ меморије на вашем рачунару. Први бајт од оних 2 милијарде је за број нула. Следећи је бајт број један, број два, скроз горе, дот дот тачка, на око 2 милијарде. Дакле, можете да број бајтова меморије у рачунару. Дакле, хајде да претпоставимо да је то оно што подразумевамо под адреси. Дакле, када видим инт звезда, шта се дешава да буде усвојен у замену сада је адресу. Није њена вредност, али без обзира на његов поштанска адреса је, да тако кажем - његова локација у РАМ. И слично за Б, ја ћу да кажу исту ствар. Инт, звезда, Б. Као страну, технички звезде може да иде на другим локацијама. Али, ми ћемо сада стандардизују на звезде одмах поред типа података. Тако свап потпис сада значи, ми адреса цео број, а позив то адреса. И дај ми још једну адресу инт и зовемо б адресу. Али сада ми код овде мора да се промени. Јер ако ја изјављујем инт темп - што је и даље типа инт - али ја у то складиште, какве вредности? Да буде јасно, ја стављање у код написан као сада? Ја постављам локацији у. Али ја не занима локација сада, зар не? Темп постоји само Јесс 'трећу шољу постојала, за коју сврху? Да бисте сачували вредност. Млеко или сок од поморанџе. Није да се заиста складиштење адресу било који од тих ствари, које осећа мало бесмислено у ово прави Свет контекст у сваком случају. И заиста, оно што желим да ставим у температури није адреса, али садржај. Дакле, ако је број као што је 123, ово је 123. бајт меморије да само се дешава да се окупаторски, да вредност у се дешава да се заузимају. Ако желим да идем на ту адресу, Морам да кажем звезду. Слично томе, ако би требало да промени оно што је на адресу, мењам ово за почетак. Ако желим да сачувате и шта је у локација са оним што је на локацији на Б, Б звезда звезда. Дакле укратко, чак и ако то није сасвим тоне у још - и ја не очекујем да би тако брзо - схвате да све што радим је префикс ове звезде из мојих променљивих, изрека не зграби вредности. Не мењајте вредности. Али радије, идите на те адресе и добила вредност. Идите на ту адресу и промене ту вредност. Тако да сада дозволите ми да поново помицати до врха, само да отклонимо ову линију, да промените прототип да одговара. Али ми сада треба да урадимо још нешто. Интуитивно, ако сам променио типове аргумената који своп очекује, шта још треба да се променити у мом коду? Када ја зовем замену. Зато сада, оно што сам Ја се још увек пролази замени? Вредност к и вредност и, или млеко и сок од наранџе. Али ја не желим то да урадим. Ја уместо тога желим да прође у шта? Локација к и локација и. Које су њихове поштанске адресе, да тако кажем. Тако да се то уради, постоји амперсанд. Амперсанд некако звучи као адресу. односно н, амперсендом, адреса за к, а адреса и. Дакле, то је намерно да користимо амперсандс приликом позива функције, и звездица када декларисање и када спровођење функцију. И замислите амперсанд као адреса оператера, а као звезда иди тамо оператер - или, тачније, дереференце оператера. Дакле, то је много речи само да кажу да је сада, надам се, замена ће да је тачна. Дозволите ми да иде напред и да - хајде да заправо преименовали датотеку, да не би Овај програм још увек не може назвати замена. Ја тврдим да ћемо га назвати свап.ц сада. Тако да, замени. Дот, коса црта, замените. А сада заиста, к је 1, и 2. И онда, је к 2, и је један. Па да видимо да ли можемо урадити мало другачије о томе шта је овде дешава. Прво, дозволите ми да зумирате на нашем цртање екран овде. И дозволите ми да предложи за тренутак - и кад год сам овде скренем се огледа тамо сада - дозволите ми да предложи Овде је читава гомила меморије, или РАМ-а, унутар мог рачунара. И то ће бити број залогај, рецимо, 1. То ће бити број 2 бајта. И ја ћу урадити гомилу више, и онда гомила дот дот тачака на указују да постоји 2 милијарде од ових ствари. 4, 5, и тако даље. Тако да су се првих пет бајтова меморије мог рачунара. У реду? Врло мало од 2 милијарде. Али сада ћу предложити следеће. Ја ћу да предложим да к ће меморишете број 1, а и иде да меморишете број 2. И дозволите ми да иде напред и сада представља ове вредности као што следи. Урадимо то на следећи начин. Дајте ми само једну секунду. Један други. ОК. Желим да се ово мало - Хајде да урадимо ово опет. Иначе ћу и коришћење Исти бројеви, ненамерно, више пута. Дакле, само тако имамо различите бројеве говорити о, назовимо ову бајт број 123, 124, 125, 126, и тачка тачка тачка. И дозволите ми да сада тврдим да ћу стави вредност 1 овде, и вредност 2 Овде, иначе познат као к и и. Дакле, то је само тако се дешава да ово је к, ово је г. И само по неким случајним случајно, рачунара, оперативни систем, догодило да стави Кс на локацији број 123. И година завршила на локацији 124 - проклетство. Требало је да то фиксно. Човече, да ли стварно желим да урадим ово? Да, желим да поправим ово и б правилно о овоме данас. Извини, нова у овоме. 127, 131, и није желео да се ово сложен, али зашто да променим Бројеви тамо? Зато што желим да се интс заправо бити четири бајта. Тако ћемо бити супер анални о томе. Тако да ако се деси да 1 решити 123, 2 ће бити на адреси 127 јер је удаљена само 4 бие. То је све. А ми ћемо заборавити све друге адресе у свету. Тако је к на локацији 123, година је на 127 месту. И сад, шта ја заправо желите да урадите? Када позовем замену сад, шта је заправо дешава? Па, кад ја зовем замену, ја сам у пролазу адреса к и и адресу. Тако на пример, ако се ова два комада папира сада представљају два аргументи и Б да мењате, шта сам ја Написаћу на први од њих, коју ћу позвати називамо? Тачно, 123. Дакле, ја тврдим јесте. То је параметар. Ја постављам адресу к унутра. Шта је то? Шта је то? Не, не. То је у реду. Ипак добро, и даље добро. Дакле, ово је. А сада на другом папиру, ово ће бити Б, а шта сам ја ће се на писање ово парче папира? 127. Дакле, једино што се променило од Наш претходни причање ове приче је, него буквално 1 и 2, ја сам ће проћи на 123 и 127. А сада ћу да ставим ово унутра на овом пољу, у реду? Тако да сада представља црна кутија свап функцију. У међувремену, хајде да сад имам неког имплементира функцију свап. Да ли би неко овде да као волонтер? Хајде горе. Како се зовеш? Чарли. У реду, Чарли. Хајде горе. Дакле, Чарли ће играти Улога наше црне кутије. А Чарли, шта желим да урадите Сада се спроводи замену на такав начин да, с обзиром те две адресе, ви у ствари ишли за промену вредности. И ја ћу шапнути на уво како да покрене ТВ овде. Зато само напред, а ти си црна кутија. Реацх тамо. Које вредности видиш за, и Које вредности видиш за Б? Цхарлие: је 123 и 127 б је. Малан ДАВИД: У реду, тачно. Сада застаните на тренутак. Прва ствар коју ћемо сада да радимо, према коду - што Сада ћу се попните на екрану - ће бити да се издвоји мало Мало меморије зове темп. Дакле, ја ћу ићи напред и дају вам то сећање. Дакле, ово ће бити трећа променљива да сте доступни ти звао темп. А шта ћеш написати на темп папиру? Цхарлие: Показивачи, зар не? Малан ДАВИД: У реду, па не нужно показиваче. Дакле, линија кода које сам ја означено на десној страни, Почнимо тамо. Каже звезда. Тако је тренутно складиштење број 123. И само интуитивно, оно је стар 123 значи? Али конкретно, ако је 123, звезда значи шта? Вредност. Или више лежерно, иди тамо. Па нека ми предложи да, држећи у руку, само напред и да се третира као да је то мапа. И хода да се преко рачунара меморије, а да нам оно што је на 123 локацији. Тачно. Дакле, видимо на локацији 123 је оно што, очигледно? У реду, па шта си ти сада вредност ће ставити у темп? Тачно. Зато само напред и урадите то. И унесите број 1 на комад папир који је тренутно под називом темп. А сада следећи корак који идете да спроведе ће бити оно. Па, на десној страни следећа линија кода је стар Б. Б, од Наравно, складишти адресу. 127 која се бави. Звезда Б значи шта, узгред говорећи? Иди на тој локацији. Зато само напред и да нам оно што је на 127 локацији. ОК. Наравно, на локацији 127, је и даље вредност 2. Па шта сада иде у продавницу све што је на локацији у? Дакле, звезда средства иду на локацију у. Шта је локација? Тачно. Па сад, ако желите да промените шта је на тој локацији - Ја ћу ићи напред и покрените гумица су овде. И сада га ставите назад на четком. Који број цес написати Сада у том празном пољу? Тачно. Дакле, ова линија кода, да буде јасна - нека ја паузирам шта раде и Чарли нагласим, што он управо урадио је писати у тој кутији на месту 123 вредност која је претходно била у б. И тако сада смо заиста спроводи ова друга линија кода. Сада, нажалост, постоји преостало још један ред. Сада оно што је у температури, буквално? Очигледно је број један. То није адреса. То је само број, врста варира од једне недеље. И сада, када кажете стар Б, то значи идите на адреси Б, што је од Курс овде. Дакле, кад сте тамо - Ја ћу ићи напред и избрисати оно што је у ствари тамо - и шта си сад да пишем на локацији 127? Цхарлие: темп, што је један. ДАВИД Малан: темп, што је један. А шта се дешава на температури на крају? Па, ми не знамо. Ми стварно не занима. Сваки пут смо имплементирали функцију до сада, било локалне променљиве имате заиста су локални. И они су само нестати. Они су се повратили од стране оперативног Систем крају. Дакле, чињеница да температура и даље има вредност 1 је врста фундаментално неинтересантна за нас. У реду, па аплауз ако бисмо могли за Цхарлие. Врло добро урађено. У реду, па шта више не то значи да може да уради? Тако испада да смо били говори неколико беле лажи дуже време. Заиста, испада да је стринг, све ово време, не баш низ знакова по себи. Некако је то интуитивно. Али технички гледано, ниска је тип података које смо прогласили унутар ЦС50 библиотека да поједностави свет за првих неколико недеља класе. Оно што је стварно ниска је адреса лика негде у РАМ. Стринг је заиста број, као што је 123 или 127, то се дешава да одредите где стринг почиње у меморија рачунара. Али то не представља стринг, по себи, сама. И можемо да видимо то на следећи начин. Дозволите ми да иде напред и отвори неки код који је међу данашњи изворни код примера. И ја ћу ићи напред и отворите се, рецимо, поредити-0.ц. Ово је луд програм који ће да се реализује на следећи начин. Прва. Ја ћу да кажем нешто. Онда ћу да наставим и добити низ од корисника у том новом реду. Онда ћу да поновим. Онда ћу добити још један стринг од корисника. И запазите, ја показати један од низови у променљиву зове ова, и још један од тих низова у променљивој под називом Т. А сада ћу да тврдим, веома разумно, да ако је с једнако т једнака, жице су исте. Упишете исту ствар. Иначе, жице су није иста ствар. На крају крајева, ако се два улаза, два Интс слова, два пловци, две дубл, било које типови података смо говорили до сада да их упореди - сећате да смо направили веома јасно пре док да не урадите ово, јер једним знак једнакости је, наравно, Оператор додељивања. Дакле, то би био грешка. Ми користимо исти знак једнакости, који заиста пореди ствари за истинске равноправности. Али ја тврдим да је луд. Ако ја идем напред и да упоредите нула, а онда коса црта тачка упоредите нулу. И ја укуцате, рецимо, здраво. А онда хајде да кажемо здраво поново. Буквално иста ствар, компјутер тврди да откуца различите ствари. Сада можда сам нешто мистипед. Ја ћу откуцате моје име овај пут. Мислим, здраво. Здраво. Другачије је сваки пут. Па, зашто је то тако? Шта се заиста дешава испод хаубе? Па, шта се заиста дешава испод хауба је ниска онда Откуцан у том први пут сам на пример је реч здраво, наравно. Али ако то представља испод хауба, сећам се да Стринг је у низу. А ми смо рекли колико у прошлости. Дакле, ако сам извући такав низ овако, ја сам ће представљати нешто сасвим слично ономе што смо малопре. А заправо нешто Посебан овде. Шта смо утврдили је у сваки крај низа? Да, ово обрнута коса црта нула, што је само начин представљања, буквално, 00000000. Осам 0 бита у низу. Не знам, искрено, шта је после овога. То је само гомила више РАМ унутар мог рачунара. Али ово је низ. Разговарали смо о низовима раније. А ми обично говоримо о низовима као локација нула, онда, онда два. Али, то је само због удобности. И то је сасвим релативна. Када сте заправо добијате памћење рачунар, то је наравно било 2 милијарде неке чудне бајтова, потенцијално. Дакле, заиста испод хаубе, све ово време, да. То може врло добро бити носач нула. Али ако копају још дубље испод хауба, то је стварно обрати број 123. Ова адреса је 124. То је 125 адреса. И нисам зезнуо овог пута. Ово је сада један бајта осим из ког разлога? Колика је знак? Чар је само један бајт. Инт је обично четири бајта. Зато сам га 123, 127, 131 и тако даље. Сада могу да наставим математика једноставнија и само до плус 1. И то је сада оно што се заиста догађа на испод хаубе. Дакле, када изјављујем овако нешто, стринг с, то је заправо - Испоставило се - Чар звезда. Звезда, наравно, значи адреса, звани показивач. Дакле, то је нешто адресу. Шта је адреса? Па - Ја сам једини који може да види врло Важно Правим, или мисле Правим. Тако ниска - тужна ствар је да имам монитор тамо где сам могао да види то. У реду, па шта је с стринг Сам раније изјавио. Али, испоставља се, захваљујући мало магија у ЦС50 библиотеци, све ово Време је буквално стринг био знак звезда. Звезда опет значи показивач или адреса. Чињеница да је то бочни Чар реч значи да је адреса лика. Дакле, ако се стринг се зове, и ја упишите у Х-Е-Л-Л-О, шта је сада предлаже се ниска буквално враћање свих овај пут, иако смо прилично смо упрошћени свет? Шта се заправо ниска повратак као своју повратну вредност? 123 у овом случају, на пример. Ми смо раније рекли да се стринг једноставно враћа стринг, низ карактера. Али то је мало беле лажи. Начин на који се стварно ради жица испод хаубе је што добија стринг од корисника. Она Плопс на знакове он или она типови у меморији. Он ставља нулу обрнуту косу црту на крају оних који низ знакова. Али, онда шта се стринг буквално вратити? То је буквално враћа адресу Прве бајта РАМ-а да у то се користи за ту снагу. И испоставило се да је само повратак једна адреса Први знак у низу, који је довољна за проналажење целину стринг. Другим речима, добити стринг нема да се врате 123 и 124 и 125. То не мора да ми дуго Списак свих бајтова које мој стринг се користи. Јер један, сви су ледја у ледја. И друго, на основу првог обраћања, ја да схватим где стринг завршава. Како? Посебан НУЛЛ карактер, Обрнута коса црта нула на крају. Другим речима, ако је прође око - унутар променљиве - адреса знак, и преузимате да је на крају било ниске, било низ знакова, као и ми људи мислим на стрингс, ако претпоставимо да на крају једног таквог низа постоји обрнута коса црта нула, ви сте златни. Зато што увек можете наћи крај опруге. Сада шта се стварно дешава онда у овом програму? Зашто је овај програм, сравни-0.ц, луд? Шта се у ствари у поређењу? Да? СТУДЕНТ: [ИНАУДИБЛЕ]. ДАВИД Малан: Управо тако. То је у односу на локације од жице. Дакле, ако је корисник откуцао у једном здраво, као и ја, меморија може завршити изгледа овако. Уколико корисник онда врсте у Хелло агаин, али позивајући се стринг, ц је није нарочито паметан ако научити да буде паметан писањем кода. Ц - и рачунари више уопште - ако откуцате у речи здраво опет, знаш шта ћеш добити. Само ћеш добити други низ меморије да, да, дешава се складиштење Х-Е-Л-Л-О и тако даље. То ће да изгледа исто нас људе, али ова адреса можда неће бити 123. То само може да се деси да оперативни систем има на располагању простор, на пример, на локацији - рецимо нешто произвољно, овако је 200 локација. А ово је 201 локација. А ово је 202 локација. Немамо појма где је то ће бити у меморији. Али, шта то значи да оно што је Биће на крају чувају у с? Број 123. Шта ће се складиштити у т, у овом произвољном примеру? Број 200. И све то онда значи да је очигледно, 123 200 није исто. И то ако је услов никада је труе. Пошто гет стринг се користи другачија комади меморију сваки пут. Сада можемо да видимо ово поново у другом примеру. Дозволите ми да иде напред и отвори цопи-0.ц. Ја тврдим да је овај пример ће покушајте - али не успевају - да копирате две жице на следећи начин. Ја ћу да кажем нешто кориснику. Ја ћу онда да се ниска и позвати га с. И сад, ја радим овде ову проверу. Поменули смо ово пре неког времена. Али када би се ништавним стринг повратка, још један специјални знак, односно посебне Симбол рецимо. Ако је без меморије. На пример, ако је корисник заиста бити тешка и врсте Злочест број карактера у тастатуре и притисне Ентер. Ако је број карактера једноставно не могу стане у РАМ из било лудо Разлог, па се можда ниска Веома добро вратити нулл. Или ако и сам програм ради много о другим стварима и само постоји Нема довољно меморије за Гет стринг да успе, може завршити се враћа нулл. Али будимо прецизнији о томе шта је то. Оно што је заиста С је тип података? Знак звезда. Тако испада да сада можемо пилинг подржати слој нулл. Испоставило се, нула је - да, очигледно посебан симбол. Али оно што је заиста? Заиста, нулл је само симбол који смо људи користе да представљају нулу, као добро. Тако аутори Ц и рачунара уопште, одлучили година да, знате шта. Зашто не можемо обезбедити да корисник не Подаци се никада, никада, никада складишти на збогом нуле? У ствари, чак иу мом примеру произвољном раније, нисам почне нумерисање бајтова на нули. Почео сам на једном. Зато што сам знао да ће људи у свету су одлучили да резервишу нула бајт у РАМ никоме као нешто посебно. Разлог за ово је, кад год желите сигнал да нешто није у реду у вези са адресама, ви сте се вратили нулл - иначе познат као нуле - и зато што знате да не постоји легитими податке на адреси нула, јасно то значи грешку. И зато смо, по обичају, проверите за поништење и повратак нешто попут оног у тим случајевима. Дакле, ако ми доле помицати сада, ово је само онда нека провера грешака, за сваки случај нешто није у реду са [? кауцију?] потпуно и напустио програм по повратку рано. Ова линија сада може бити преписан како то, што значи шта? На левој страни, дај ми још један показивач на карактер и назовете је Т. Шта ја складиштење унутар т, заснован на овој једној линији кода? Ја складиштење локацију. Конкретно локација да је био у с. Дакле, ако је корисник откуцао у здраво, и да прво здраво деси да заврше овде, онда је број 123 ће се вратити из добити обесити и да се складишти - као што смо рекли раније - у с. Када сам сада изјављујем други показивач Чар и зовем т, што је број буквално ће се завршити у Т према причи? Тако 123. Дакле, технички и сада и и Т указују на тачан Исти комади меморије. Дакле, обратите пажњу шта ћу сада да урадим доказују да је овај програм луд. Прво ћу тврдити, са принт Ф, капитализацијом копија у низу. Онда ћу да урадим нешто провере грешака. Идем да се уверите. Будимо сигурни да стринг т је у Најмање већи од нуле у дужини, тако да постоји неки лик да се заиста великим словом. А онда можда сећате из претходних примера. 2 горња - која је у цтипе.х датотека. Т конзола ми даје нула нула карактер стринг т. И 2 горњи те исте вредности, од Наравно, претвара се у велика слова. Дакле интуитивно, ово нагласио линију кода се искориштава први писмо у Т. Али то није капитализацијом, интуитивно, Прво слово с. Али ако размишљате унапред, шта сам ја о томе да се види кад сам покренути овај програм и одштампати и оригинал, е, и тзв копија, Т? Они заправо ће бити исти. И зашто ће они бити исти? Они се и указује на потпуно иста ствар. Дакле, хајде да урадимо то. Направите копије нулу. Он саставља реду. Дозволите ми да покренете нула копију. Дозволите ми да упишете нешто здраво у написани малим словима затим притисните Ентер. И он тврди да су и оригинални а и копија су заиста идентичне. Дакле, оно што се стварно десило овде? Дозволите ми да прекраја само ову слику да исприча причу у мало другачији начин. Шта се заиста дешава испод настрешнице Изјављујем нешто као Чар почетак а, или стринг с, Ја добијам показивач - што се дешава да се четири бајта у ЦС50 апарата и у много рачунара. И ја ћу да позовем тог С. И ово тренутно има нека непозната вредност. Када декларишете променљиву, осим ако себе ставио неку вредност, који зна шта је тамо. То може бити неки случајни редослед бита из претходног извршења. Дакле, када сам, у мом кода не добијете ниска, а затим складиште повратак вредност у стринг с Гет некако - и ми ћемо на крају одлепите како се стринг радови, некако издваја низ који вероватно изгледа Нешто као ово. Х-Е-Л-Л-О, инверзна коса црта нула. Претпоставимо да је адреса 123 само прво доследност. Тако се враћа стринг, у истакли линију тамо, враћа Број смо рекли, 123. Дакле, оно што се заиста дешава унутар с овде? Па, шта се заиста дешава Унутрашњост је 123 с. Али, искрено, ја сам све помало збуњени све ове адресе, све ове произвољних бројева. 123, 124, 127. Па хајде да ствари поједноставе свет мало. Када говоримо о показивача, искрено, да нас људе, који се сад брига где ствари које су у меморији? То је потпуно произвољна. То ће зависити од тога колико више радне меморије корисник има. То ће зависити од када се у току дана покренете програм, можда, и шта улаз корисник вам даје. Ми смо стан на неважним детаљима. Дакле, хајде да се издвојити и рећи да, када покренете линију кода овако, Чар звезда а добија повраћај вредност од доћи ниске. Зашто не бисмо уместо тога извући оно што ми стално зовем показивача као да је то показујући на нешто? Тако да сам сада тврде да се ова постоји показивач - Испод хаубе је адреса. Али, то је само указује на први бајт у стринг који је враћен. Ако се сада вратити код овде, шта се дешава у овој линији? Па, у овом истакнутом реду сада, Ја изјављујући очигледно други променљива се зове Т. Али, такође је показивач, па идем извући га као, у теорији, тачан исте величине кутија. И ја ћу да га зову Т. А сада, ако се вратимо на кода поново, када сам складиште а унутрашњост т, шта сам ја технички стављање унутар т? Па технички, ово је број 123. Па ја стварно треба да се писмено број 123 тамо. Али, хајде да се виши ниво. Т, ако је само показивач, интуитивно, је управо то. То је све што је био чувају тамо. Тако сада у последњих занимљивих линија кода, када сам се о капитализацијом знак нуле у т, шта се дешава? Па, Т носач нула се сада показује на шта лик, вероватно? То указује на х. Пошто Т носач нула - сећам, ово је стара синтаксе. Т носач нула само значи да ако је ниска Т, Т носач нула значи добијање нула лик у тој снази. Дакле, шта то заправо значи се иде у овај низ - и да, то може бити 123, ово може да буде 124. Али, то је све релативно, запамти. Кад год говоримо о низу, имамо Предност говори о релативни индекси. И тако сада можемо само да претпоставимо да је т носач нула је ч. Дакле, ако ја зовем 2 горњи на њему, како је то Заиста се ради капитализацијом слово ч у велика Х. Али, наравно, шта је с? То указује на истом проклетом ниске. Дакле, то је све што се дешава у овом коду до сада. Па шта је онда импликације? Како да решите ова два проблема? Како да се упореди са стварним жице? Па интуитивно, како би одете о односу два жице за истинске равноправности? Шта то значи, ако два жице су једнаки? Јасно је да не њихове адресе су једнаки у меморији, јер је то низак реализације на нивоу детаља. Сви ликови су исти. Дакле, дозволите ми да предложи, и дозволите ми да представим у верзији један од цомпаре.ц овде, па упореди-1.ц. Дозволите ми да предложи да се и даље показивач зове ова, а продавница у то Повратна вредност од доћи ниске. Хајде да урадимо исту ствар са т. Дакле, нико од кода је другачија. Ја ћу додати мало више провера грешака сада. Дакле, сада када смо врста пилинга леђа ово слојеви у ЦС50 онога ниска заправо, треба да буде више анални водећи рачуна о томе да не злоупотребљавају неважеће вредности као што су нула. Дакле, ја ћу само да проверим. Ако ова не зна једнак ништавним и Т не једнак нулл, што значи да смо у реду. Гет стринг није зезнуо све било који од тих низова. А ти можда сада могу погодити, што нема СТР ЦМП вероватно урадити? Стринг упоредите. Дакле, ако сте програм у Јави раније, ово је као једнакима метода у стринг класа. Али за оне који нису програмирао раније, ово је само Ц функција. То се дешава да дође у фајл под стринг.х. То је место где је то изјавио. И гудачки сравни - Ја стварно заборавити његову употребу, али нема везе то. Подсетимо се да можемо да урадимо човек, промешајте упоредите. И ово ће довести до Линук програмери употребу. И то је, искрено, помало загонетан. Али се види да, да. Морам да укључи стринг.х. И овде пише у опису, " ниска упоређивање функција пореди две жице С1 и С2 "и С1. и С2 су очигледно два аргументи прошло ин Не сећам се шта цонст је, али сада приметити - и можда сте то већ видели када сте користили ман страницу ако имају све - Чар је звезда је само синоним канапом. Тако да упоређује две жице, С1 и С2, а враћа цео број мање од или једнак или већи од нуле Ако је С1 је пронађен, односно, да се мање, или меч, или бити већи од С2. То је веома сложен начин да се каже ниска да упоредите повратак нулу ако две жице су интуитивно идентични, знак за знак за карактер. Она даје негативан број ако е, по абецедном реду, треба да дође пред т. Или даје позитиван број ако а требало да дође после т абецедном реду. Дакле, са овом једноставном функцијом, могу Ви, на пример, сортирање гомила речи? Дакле, у овој новој верзији, ја ћу да иде напред и да цомпаре1. Дот сласх сравни један. Ја ћу уписати здраво у свим малим словима. Идем да куцате у здраво опет све малим словима. И на срећу сада остварује Откуцао исту ствар сам. У међувремену, ако укуцамо у здраво у доњем случај и здраво у великим словима и упоредити их, сам откуцао различите ствари. Јер не само да су адресе другачије, али ми поређења различитих карактера изнова и изнова. Па идемо и поправити један други проблем сада. Дозволите ми да отворим једну од верзија примерак, који сада бави ово питање на следећи начин. А овај ће да изгледа мало сложенији. Али, ако мислите о томе шта смо проблем треба да се реши, надамо се да ће бити јасно за који тренутак сада. Дакле, овај први ред, знак почетак т, у лаике услови да неко предложи Шта значи ова линија овде? Знак звезда Т, шта је то ради? Добро. Креирање показивач на неки место у меморији. И дозволите ми да прецизирате да је мало. Декларишете променљиву која ће сачувати само адреса неки знак у меморији, да буде мало више правилно. У реду, тако да сада на десној страни, имам никада није видео једну од ових функција пре, маллоц. Али, шта би то значило? Алокација меморије. Заузимање меморије. Испоставља се, до сада, ми смо нису имали заиста моћан начин пита оперативни систем, дај ми мало меморије. Уместо тога, сада се позива функција маллоц да ради управо то. Иако је ово мало дистракција сада, приметити да у између два заградама је Управо ће то бити број. Где сам откуцао у питању марака може бити број. А то значи да број, Дај ми 10 бајтова. Дај ми 20 бајтова. Дај ми 100 бајтова. А маллоц ће учинити све да питајте оперативни систем - Линукс, у овом случају - Хеј, њихови су 100 бајта РАМ меморије на располагању? Ако је тако, вратите ти бајтови који ми је повратак на адресу на којој ти бајтови, можда? Први коме. Дакле, и овде - а то је преовлађујући у Ц, сваки пут када си баве адресама? Ви сте готово увек баве Прва таква адреса, без обзира колики комад меморије коју се враћен, да тако кажем. Дакле, хајде да зароните овде. Покушавам да издвоји како бајтова више, тачно? Добро. Стринг дужине с - хајде да уради конкретан пример. Ако је ова хелло је, Х-Е-Л-Л-О, шта је Дужина низа од с, очигледно? Дакле, то је пет. Али Радим плус 1 на то, зашто? Зашто желим шест бајтова уместо пет? Нулл карактер. Не желим да одем са овог специјални НУЛЛ карактер. Јер ако направим копију Поздрав и само до Х-Е-Л-Л-О, али ја не стављам да специјални знак, рачунар можда нема, случајно, обрнуте косе нула за мене. И тако, ако ја покушавам да схватим дужина копије, ја мислим да би то је 20 знакова, или милион знакова да ме никада није једноставно догоде да удари нулу обрнуту косу црту. Зато нам је потребно шест бајтова за складиштење Х-Е-Л-Л-О, инверзна коса црта нула. И онда је то само бити супер анални. Претпоставимо да ја заборавим шта величина Цхар је. Ми и даље рекавши да је један бајт. И то је обично. У теорији, то би могло бити нешто другачије, на другом Мац или други ПЦ. Тако испада да је овај оператор зове сизеоф да ако прође га на назив врсте података - као Чар, или инт или флоат - то ће вам рећи, динамично, колико бајтова цхар заузима на ово одређеном рачунару. Дакле, ово је практично само исто као и рећи пута 1 или пута ништа. Али, ја то радим само да буде супер анални, то само у случају да се разликује знак на рачунару у односу на моје, ово начин математика ће увек да проверите. На крају, овде сам проверите нулл, што је увек добра пракса - опет, сваки пут имамо посла са показивачима. Ако маллоц није био у стању да дају ме шест бие - што је вероватно, али за сваки случај - врати један одмах. А сада, само напред и копирање стринг на следећи начин. А ово је познато синтакса, иако у другачијој улози. Ја ћу ићи напред и добити низ Дужина с и одлажу га у Н. Ја ћу онда да бисте прелазили из И једнако нула до и укључујући Н, веће или једнако. Тако да на свакој итерацији, ја ставио ИТХ карактер с у ИТХ карактер т. Дакле, оно што се заиста дешава испод хауба овде? Па ако је то, на пример, је ова - и ја сам откуцао у речи Х-Е-Л-Л-О и ту је обрнута коса црта нула. И опет, то је ова овде указује. И ево сада је Т. А ово је сада указује на копију меморије, зар не? Маллоц ми је дао читав меморију. Ја не знам шта је у почетку у било којој од ових локација. Зато ћу да мислим од ових као гомила знакова питања. Али чим сам почети од нуле петље на кроз дужине с, т носач нула и Т конзола 1 - и ја ћу ставити ово сада на графоскоп - Т носач нула и нула значи ова конзола да ћу се копирање итеративно ч овде, е-Л-Л-О. Плус, јер сам плус 1, бацксласх нула. Тако да сада у случају Цомпаре-1.ц, на крају, ако сам одштампати капитализација т, ми треба видим да је ова непромењен. Пусти ме напред сада и ово. Тако да цопи1. Дот сласх цопи1. Идем да куцате у здраво, Ентер. Запазите сада, само копију је капитализован. Зато што заиста има два комади меморије. Нажалост, можете да урадите неке прилично лоше ствари и прилично опасно овде. Дозволите ми да се сада повуче пример овде, која нам даје пример неколико различитих линија. Дакле, само интуитивно овде, у првом реду кода, инт к звезда, изјављује променљива к се зове. А шта је тип података те променљиве? Шта је тип података те променљиве? То није Цлиффхангер. Подаци типа инт звезда. Дакле, шта то значи? Кс ће складиштење адресу цео број. Једноставно тако. И ће се чувати адреса цео број. Шта је трећа линија кода ради тамо? То је издвајање колико бајта, највероватније? Четири. Због величине цео број је обично четири, од четири маллоц даје ми врати адресу на комад меморије, први бајт чији је сада чувају у к. Сада идемо мало брже. Звезда к значи шта? То значи ићи на ту адресу и ставио шта број тамо? Стави број 42 тамо. Звезда г значи прелазак на шта је на И и да је број 13 тамо. Али, чекај мало. Оно што је у и у овом тренутку? Шта адреса је г складиштење? Ми не знамо, зар не? Никада нисмо некада користили задатак оператера који укључује г. Дакле, г је објављено на другој линији код неких је само смеће вредност, велика знак питања да тако кажем. Могло би се насумично показивање да било шта у меморији, који је генерално лоша. Дакле, чим стигнемо тамо ту линију, стар 13 година једнако, нешто лоше, нешто веома лоше ради о да се деси да Бинки. Па хајде да видимо шта ће се завршити дешава овде Бинки у овом тренутку или тако изгледају. [ВИДЕО РЕПРОДУКЦИЈА] -Хеј, Бинки. Пробудите се. Време је за забаву показивача. -Шта је то? Сазнајте више о тројке? О, Гоодие. -Па, за почетак, мислим да смо Требаће ми пар тројки. -У реду. Овај број додељује два показивача што може да укаже на целе бројеве. -Добро, добро, ја видим два савета. Али, они не изгледају указујући на било шта. -Тако је. У почетку, не показивачи указују на било шта. У ствари, они указују да се зову поинтеес, и припремајући их је посебан корак. -О, да, да. Знао сам то. У поинтеес су одвојене. Дакле, како да издвоје поинтее? -У реду. Па, овај број додељује нове бројеве поинтее, а овај део сета к да укаже на то. -Хеј, то изгледа боље. Тако да то уради нешто. -У реду. Ја ћу дереференце показивач к за складиштење број 42 у свом поинтее. За овај трик, ја ћу морати своју магију штапић за дереференцинг. -Ваш чаробни штапић од дереференцинг? Ух, то је супер. -То је оно што код изгледа. Само ћу поставити број, и - -Хеј, погледајте. Ту иде. Дакле, ради се о дереференце к следи стрелица за приступ свој поинтее. У овом случају, за чување 42 унутра. Хеј, покушајте да га користите да меморишете број 13 преко другог показивача, г. -У реду. Само ћу овде да и и се број 13 поставили. А онда узме штап од дереференцинг и само - вау! -Ох, хеј. То се не ради. Рецимо, Бинки, не мислим дереференцинг И је добра идеја, због постављања поинтее је посебан корак. И не мислим да смо икада урадили. -Хмм. Добро питање. -Да, ми смо издвојили показивача г. Али ми никада га поставили на указују на поинтее. -Хмм. Врло придржава. -Хеј, ти тражиш добро тамо, Бинки. Можеш ли то поправити тако да је и бодова на исти поинтее као Кс? -Наравно. Ја ћу искористити свој чаробни штапић за показивач задатак. -Да ли ће то бити Проблем као пре? -Не. Ово не дира поинтеес. То је само један показивач мења указати за исту ствар као и други. -О, видим. Сада и указује на истом месту где и к. Па чекај. Сада је фиксна г. Има поинтее. Дакле, можете да пробате штапић од дереференцинг поново да пошаље преко 13. -У реду. Ево иде. -Хеј, погледај то. Сада дереференцинг радова на г. И зато што су показивачи дељења да је један поинтее, они како види 13. -Да. Дељење. Како год. Зато ћемо сада заменити места? -Ох, види. Немамо више времена. -Али - -Само запамтите три поинтер правила. Прво, основна структура је да имате показивач. И то указује више на поинтее. Али показивач и поинтее су одвојени. И Уобичајена грешка је да се подесите показивач, али да заборавите да даје поинтее. Број два, показивач дереференцинг почиње на показивачу и прати његову стрелица за приступ преко своје поинтее. Као што сви знамо, то функционише само ако постоји је поинтее, која враћа у правило број један. Број три, показивач задатак узима један показивач и промене указују на то да се исти као други поинтее показивач. Дакле, после задатка, два показивачи ће указују на исту поинтее. Понекад то се зове дељење. И то је све што је на њега, заиста. Довиђења сада. [ЕНД ВИДЕО РЕПРОДУКЦИЈА] Малан ДАВИД: Па више на показивача, више о Бинки следеће недеље. Видимо се у понедељак.