[Powered by Google Translate] [Недеља 4, наставак]
[Давид Ј. Малан - Универзитет Харвард]
[Ово је ЦС50. - ЦС50.ТВ]
>> Ово је ЦС50, и то је крај недеље 4.
Дакле, неке добре вести и неке лоше вести.
Не предавање у понедељак, није проблем поставити следеће недеље. [Студенти навијали]
Нећеш да воле где ово иде.
Али ми немамо ово уместо следеће среде,
а ту је и наставни план и програм по 1 Петак предавању следећег петка, тако да можемо остати на правом путу.
Али све ће бити снимљен као и обично, тако да се не бринем.
>> А у вези са квизом 0 шта ћемо урадити према краја недеље
је пост на почетну цс50.нет је курс за разјашњење
о каквим очекивањима требало би да имате када је у питању први квизу.
У принципу, то ће бити више избора, истина-нетачно, кратак одговор, кратке кодирања проблеми.
Нећеш да се очекује да спроведе еквивалент
проблема који би сте видели на псет, за које имате рачунар
и дебагер и слично, али ће бити мали кодирање проблема.
>> И заиста, најбољи водич да добијете осећај шта ЦС50 тестови су као
се иде у цс50.нет, идите на квизове линка,
и можете видети у протеклих неколико година у вредности од квизова.
Само схватите да наставни план и програм није увек била иста током година.
Понекад смо додали, понекад одузимају,
па ако видите неку тему на један од оних старих тестови
да немаш појма шта је то причао, то је или да ми је то покрити
или да нисмо то покрити.
Али форма коментара, ово Недеља, понедељак, уторак и
као и курс се широм седнице у недељу увече -
Време и место да се објави на почетној страници се курс је -
сви ви имате прилику да погледате са наставним се курс је стипендиста
материјал за ову годину, како у делу и као потпуно класе,
и они ће бити снимљен по обичају као добро.
>> У реду. Дакле, без даљег одлагања, један коментар о пролазу / неуспех и адд / дроп.
Можда сте видели моје белешке синоћ, и то је заиста само неки додатни уверавање
да, ако сте међу онима нарочито мање удобна, или негде између
и осећате само мало у преко главе,
схватите да је заиста сасвим нормално, и нема довољно подршке структура у месту,
од којих је један радно време биле намере о побољшању све више по мом емаил прошле ноћи,
и схватите да превише опција као прошао / није прошао за час овако
Заиста је замишљена као механизам да преузме предност искључивање курса овако,
тако да опет ако трошите те 10, 15, 20 сати
Само покушавам да донесем псет да раде, а ви знате да сте тамо 90-95% од начина
али не можете да пронађете неку проклету грешку, у пролазу / не модел који је некако у реду.
>> Идеја је да са тог механизма онда можете ићи фокус на другим псетс
или спава, или шта год да је то што желите да се фокусирате на.
Дакле, схватите да имате до овог наредном уторка - технички 5. понедељак,
али то је празник, тако да ово долази Уторак - да бисте се пребацили из пролаза / не оцењен, или обрнуто.
А ако си стварно на литици и размишљате падају потпуно,
молим ухвати ме после предавања или дроп ме белешку.
Ми бисмо волели да најмање разговор пре него што понудите адио.
У реду. Тако смо почели да се обуку точковима искључен последњи пут.
Конкретно, ми смо фокусирани на ниске.
Стринг је нешто што је изјавио у ЦС50 библиотеци,
конкретно у том фајлу под називом цс50.х што ћемо почети да погледате ове недеље и следећег.
Али стринг је заиста само поједностављење нешто
То је мало више арцанели описати као цхар *.
Знак да смо упознати са. То је само један лик.
Али * од понедељка означава шта? >> [Ученик] показивач.
Показивач. А шта је показивач? >> [Ученик] адреса.
>> То је као адресу, локацију у меморији.
Шта је адреса или локација или сећање?
Опет, сви ми имамо лаптоп са концерта или 2 гигабајта меморије највероватније ових дана,
а то значи да имате милијарде или 2 милијарде бајтова вредне памћења.
И није битно шта је то физички изгледа,
али будите на вери да можете пребројати све појединачне бајтова који свој лаптоп има -
ово је бајт 0, ово је бајт 1, ово је бајт 2 милијарде -
и то је управо оно што рачунар ради.
Када доделити простор једне карактера, на пример,
очигледно је да негде живи у меморији рачунара,
а можда је у бите број 12345,
а то је негде овде у меморији рачунара.
А онда адресу тог лика је 12345.
>> Сада, у недељу 0 до сада тако далеке, нисмо баш брига
где у меморији ствари се чувају, јер ми обично користе симболе,
променљиве, и низови да заиста добити на нашим подацима.
Али, као и све од понедељка више данас, сада ћемо имати
све израженије могућности са писањем програма
да стварно манипулише меморију рачунара, међутим видите стане,
за обе добре и лоше сврхе,
бубе као веома чест резултат у овом тренутку у учењу ове ствари.
Али шта то заиста значи бити цхар *?
Идемо напред назад - и ми ћемо се вратити на Бинки као што је обећано данас.
Идемо на једноставан пример овде.
Дозволите ми да сачувате ову слику као цомпаре.ц, и дозволите ми само да се овде мало код шаблона
тако укључују стдио.х, дозволите ми да предам укључују цс50.х. Ја ћу увећали тамо.
Дозволите ми да почнем да пишем главни инт, маин (), а сада желим да урадим нешто овако:
принтф ("Дај ми низ:"), а онда ћу користити стринг с добија ГетСтринг
да би добили низ од корисника, а онда ћу да питам корисника за другу.
("Дај ми још једну ниску:"), а ја ћу их питати преко ГетСтринг да се тога.
Ја ћу га звати т т јер долази после с и с је лепо име за ниску ако је прилично општи.
Дакле ГетСтринг, а сада само желим да урадим проверу разум и ја ћу да кажем
иф (а == т), онда ћу само да кажем кориснику принтф ("Ти откуцао исту ствар \ н");
друго ћу да одштампате нешто попут ("сте уписали нешто другачије \ н!")
или шта год казна ће бити. Тако нешто.
Тада, као и обично, ја ћу вратити 0 само што је значило да се ништа лоше десило,
и ја ћу ићи напред и компајлирати и покренути овај програм.
>> Међутим, у понедељак смо трчали овај програм,
и заправо је речено да ЗДРАВО није здраво и пријатно није збогом.
Понашање смо видели била је мало више овако.
Пусти ме да идем у мој изворни директоријум, зум овде, и хајде да правимо поређење.
Приредила реду. Дозволите ми да покренете поредити. Дај ми ниску: ЗДРАВО.
Дајте ми још једну ниску: ЗДРАВО.
Откуца нешто другачије!
Па, дозволите ми да покушам нешто једноставније попут 50, 50 година. Откуца нешто другачије!
здраво, здраво. Па јасно, нешто се дешава овде.
Али, оно што је било објашњење зашто?
Очигледно, линија 12 је потпуно нефункционалан.
Шта је основни проблем овде? Да. >> [Ученик] То је у односу на адресе.
Да, баш тако. То је заправо у односу адресе
у којој ЗДРАВО ЗДРАВО и чувају.
Није упоређивањем писма ЗДРАВО поново и поново,
јер оно што се стварно догодило, све ово време смо користили ГетСтринг -
Ова табла је поново наш рачунар меморија,
и рецимо зовем ГетСтринг након проглашења променљиве с.
Шта моје сећање изгледа?
Хајде да кажемо да произвољно а изгледа овако. То је квадрат.
И прилично сваки пут сам извући комад меморије на екрану
ако је 32 бита сам цртање квадрата овако, јер заиста у апарату,
показивач, адреса, је 32 бита. То је исто као инт.
То може да варира у зависности од рачунарског система.
Они од вас који су слабо упознати са чињеницом да је ваш Мац или ПЦ је 64 бита,
да заправо означава да је ваш рачунар користи 64-битне показиваче,
64-битне адресе, и међу упсидес из које је ваше рачунаре
може имати много више РАМ него прошла.
Да скратимо причу, назад у дану када су компјутери користе само 32 бита
да представљају адресе, највећи број бајтова сте могли представљати
у том случају био, шта ако имате 32 бита?
Дакле 4 милијарде евра, у реду, јер је 2 до 32 је 4 милијарде.
Овај број је понављају током.
>> Дакле, ако имате само 32 бита, највећи број можете рачунати да је отприлике 4 милијарде.
Али то је био основни ограничење рачунара до пре неколико година,
јер ако можете само рачунати као висок као 4 милијарде евра,
није битно ако купите 8 гигабајта меморије, или чак 5 гигабајта РАМ-а;
Ви не можете рачунати да је висока, тако да је било бескорисно.
Можете само да приступите прва 3 или 4 гигабајта меморије рачунара.
То је мањи проблем сада, и можете купити МацБоок Про и Делс
са 8 гигабајта РАМ меморије, или чак и више ових дана.
Али, ако сам издвојити једноставно у овом програму показивач, показивач се зове ова,
она може да изгледа овако на екрану, јер заиста морамо да одлепите овом слоју.
Стално каже жицу, али од понедељка, стринг је заправо знак *
адресу неког карактера.
Па хајде да скинемо тај волан тренинг иако ћемо наставити да користи ГетСтринг за сада.
Тако сам прогласио с, а то је комад меморије, 32 бита.
Шта је овде у меморији по дефаулту? >> [Нечујан ученик одговор]
Шта је то? >> [Ученик] Смеће. >> Смеће. Управо тако.
Ако сте програмер не стављају вредност у променљивој, ко зна шта је то?
Понекад ћете имати среће и то је 0, што је нека врста леп, чист подразумевану вредност,
али као што смо видели понедељак, понекад је потпуна бесмислица,
неки заиста велики позитиван или негативан број који је дошао одакле?
Да. >> [Ученик] Функција раније. >> Да.
>> Често функција који је добио назвао раније, јер се,
како ви називате функције у меморији, они заузимају више простора и више од дна нагоре,
и чим функција враћа, да меморија поново користи добија
до следећег човека који бива позван, ко користећи свој исти комад меморије.
И ако сам оставио смеће тамо, претходне вредности,
можемо погрешити с као да неку вредност када се заиста нисмо ставили тамо нешто.
Дакле, наша РАМ у овом тренутку изгледа овако.
Сада на десној страни линије 7 зовемо ГетСтринг,
што смо сада радили недељама, али оно што је заиста ГетСтринг ради?
ГетСтринг написао ЦС50 особља је мало интелигентан
у томе чим корисник почне куцање тастери и хитова Ентер,
ГетСтринг фигуре оут колико откуцамо урадили корисник хит,
колико карактера морам да издвоји РАМ за.
А где је тај РАМ долази, ко зна?
То је негде у 2 вашег рачунара гигабајта или ситница меморије.
Али, хајде да претпоставимо да је компјутер нашао простор за реч ЗДРАВО овде.
Реч сам откуцао је Х-Е-Л-Л-О.
И ако скрећемо ово као низ знакова, можда ћемо га извући овако.
Али морам да урадим 1 додатни ствар. Оно припада на крају сваког низа у Ц?
Поништеног лик који пишемо као \ 0.
То технички је број 0, али инверзно чини све јасније
да је ово буквално број 0, цео 0;
није, на пример, цитирам-завршити цитат 0 да би сте укуцате на тастатури.
Дакле, ово је ЗДРАВО.
>> А шта смо рекли у понедељак да функционишу као ГетСтринг
заправо враћа све ове недеље?
Није се враћа стринг по себи, јер то заиста не значи да
јер жице не постоје. Они су нека врста справљања у ЦС50 библиотеци.
Оно што је заиста ниска, више технички? >> [Ученик] То је први знак.
Управо тако. То је прилично једноставно адреса првог карактера који корисник унесе
Дакле, ако моја реч ЗДРАВО га завршава на бајтова број 123, а затим у бите броја 124,
125, 126, и тако даље, ако сам само број моје бајтове од 0 горе,
оно што је заиста ГетСтринг враћа буквално број 123.
Дакле, оно што се стави у с је број 123, а не слово Х, а не реч ЗДРАВО,
једноставно је адреса на којој могу пронаћи прво слово ЗДРАВО.
Али то не изгледа као довољно. Ја сам вас питао за серију, а не карактер.
Па како ћемо или рачунар зна да Елло врста долазе заједно са Х?
Шта је врста споразума имамо? Да.
[Ученик] То говори чува се наћи још неке знакове. >> Тачно.
>> Постоји тај људски компјутер конвенција којом када се баве жице,
иначе познатом као знак звезда, једноставно морате да схватите
где је сваки крај стринга у животу је тако заиста само итератинг преко њега са фор петљи,
вхиле петље, шта год, тако да када вам је крај стринга
Сада можете закључити из тога, ох, цела реч је ЗДРАВО.
Они од вас са претходног програмирања искуством можда знате у Јави
само може назвати дужина и на другим језицима можете позвати дужину или слично..
То је зато што у многим језицима, посебно ствари назива објектно-оријентисани језици,
дужина нечега је врста зачаурен унутрашњости комад података самих,
Као што смо много капсулиране личних карата и имена и кућа унутар студента у понедељак.
Али, Ц је много нижи ниво. Нема објеката или одељења, да ли сте чули те термине пре.
Све што треба је стварно меморијске адресе.
Значи, ово је нека врста старински начин представљања занимљивих података структуре.
Имате почетну вредност као на адресу првог знака
и онда само неке произвољне конвенције које се сви слажу да прате.
Дакле, како се жица дужине спроводи, зар предлажемо?
Стрлен, стрлен, што су неки од вас су сада користи неколико пута. То је прилично једноставно, зар не?
То је као 2 линије кода.
То је прилично много за петља неке врсте, можда са додатним локалним променљиве.
Али стрлен има само да се показивач и онда почнете да тражите \ 0.
>> И чим га нађе, може да врати укупан број корака које је предузела је у том низу.
Дакле, можемо закључити из овога шта се дешава даље.
Претпоставимо онда ја изјављујем т као што сам урадио у реду 10.
Ово је нека смеће вредност. Ко зна на први?
Али, на десној страни линије 10 Зовем ГетСтринг поново.
Ко зна где ово завршава?
Хајде да кажемо да произвољно оперативни систем нашао простора за то пут овде.
Ја се десити да случајно откуцате Х-Е-Л-Л-О опет,
па можемо извући исту врсту слике.
Али чињеница да имам прекраја ову слику је намерна
јер је другачији ЗДРАВО од овог.
Дакле, овде то може бити локација 456, то је 457, и тако даље.
Дакле, оно што се ставља знак питања где је некада био?
У овом случају 456.
Ми смо брање ове бројеве самовољно јер заиста после данашњег
нећемо да брину толико о томе шта је адреса шта је.
Све нам је стало је да смислимо адресу неког дела података као ЗДРАВО.
>> Дакле стварно оно што већина људи ради у компјутерској науци, када говоримо о меморијским адресама
и говори о показивача конкретно,
а не смета схватите 123 - кога је брига где је то ствар заправо,
ми само знамо да је у неком нумеричком адресу -
смо поједноставили свет и само да кажем да је с указује на то карактера
и т указује на то карактера.
А чињеница да је стрелица је сасвим намерна
јер буквално сада с је показујући на Х и Т окренут на другу Х
јер на крају крајева, није битно шта је адреса,
али није свеједно да ми имамо могућност да изразе ту адресу са неким комадом кода.
Нисмо баш изманипулисани ове адресе још увек
па ћемо видети где можемо да убацим и некако радим ствари са показивачима,
али за сада у складу 12 буквално шта су вредности можемо поређењем
према овој причи, у складу 12?
Ми говориш је 123 једнак једнак 456? И то дефинитивно није случај.
А чак и концептуално, то показивач дефинитивно није иста као ова
зато што се зове ГетСтринг два пута, а ГетСтринг не покушавају бити супер паметан,
не покушавају да схвате, ох, ЗДРАВО откуцали пре 5 минута;
дозволите ми да вам дати исти показивач као што сам ти дао пре,
то је само издваја нови комад меморије сваки пут када га позовете.
>> Па како да решите овај проблем?
Ако виши ниво желим да упореде конце здраво и здраво -
Брига о показивачима - како идем око одговора на питање,
није корисник упишите исту ствар? Шта је потребно овде? Да.
[Ученик] Користите функцију. >> Ја могу да користим функцију из кутије.
Ја могу да користе функцију зове стрцмп с-т-р-ц-м-п,
само скраћена верзија каже стринг поредити.
А ако одемо у, на пример, упоредите 2, која је међу милостињу данашњим
Ја управо то.
Наставио сам да све остало исто од линије 1 на доле до 26 или тако нешто,
и сада приметити тај део није променило само мало.
Хајде да игноришемо линију 28 за тренутак и фокусирати се само на овом једном.
Шта смо рекли у понедељак да ул упоређивање ради?
Она управља процес узимања 2 тројке, С и Т у овом случају,
врста практично ставља свој прст на тим 2 слова,
и шта мора да уради нешто попут вхиле петље или за петље,
и она каже да је ово исто? Ако је тако, помера прсте Или показиваче напред.
Да ли су то исти, они исти, то исто,
ово исто, то исто? И оох, ја сам на крају стринга у оба С и Т.
Нисам нашао никакве контрадикције. Да, ови критеријуми су исти.
И шта ул поредити повраћај уколико 2 жице су исти, очигледно? Нула.
Дакле, 0 је добро у овом случају, јер ако се врати -1 или +1,
То значи да је само догоди да дође пред т абецедном реду или после т.
А зашто би то било корисно да имају функцију која вам говори која жица долази до
или после у речнику?
[Ученик] Сеарцхинг. >> Тражење и сортирање.
>> Дакле, можете да урадите ствари као бинарне претраге или мехурићима поређати или спајање врсту
где морате да упоредите ствари.
Тако сада имамо врсту сече неке углове и само причали о сортирању
у контексту бројева јер је лепо и лако причати о томе,
али свакако може упоредити ниске, јабуку са бананом
јер ако јабука је познато да дође до банане, исто тако,
да се крећете конце около у меморији, баш као Роб урадио са врстом стапања у видеу
а ми смо овде урадили на позорници са избора врсте, уметања сортирате, а мехурићима раси.
Па где другде можемо узети ово? Хајде да пробамо ово.
Идемо некако заборавимо ту лекцију за тренутак и покушајте сада и копирање 1.ц да урадите следеће.
У складу 21 Кажем принт нешто,
онда сам све низ од корисника,
онда сам ово проверите.
Нисмо баш увалио ову навику још, али хајде сада да радимо ово.
Идемо у ствари одлепите овом слоју. Ово је стварно знак *. Овај момак је стварно знак *.
Дакле, шта то значи да се провери да ли с == НУЛЛ?
Испада да, када позовете функцију као ГетСтринг
или више уопште само питајте рачунар да вам дати неке меморије,
нешто може да крене наопако.
Можете бити луд и питам рачунар за терабајта меморије
тражећи трилиона бајта меморије који једноставно не постоје на рачунару,
али ГетСтринг и друге функције треба неки начин да виче на вас
ако сте тражили превише.
И начин на који то ради је ГетСтринг ако сте тражили више меморије
него је доступан на рачунару, чак и ако је то супер, супер ниске вероватноће
јер нико од нас ће да откуцате трилион знакове, а затим притисните Ентер,
али ниске вероватноће, иако то може бити, ја још увек желим да проверим за њега само у случају,
а посебна вредност која ГетСтринг, одговор и друге функције враћа
ако нешто није у реду је НУЛЛ у свим капе.
>> А шта је НУЛЛ? НУЛЛ само тако се дешава да представља показивач. То је сећање адреса 0.
Свет је одлучио да самовољно, ако је мој рачунар меморија - знаш шта? -
идемо да краду само 1 бајт меморије сваког рачунара, а то је локација 0.
Ми ћемо му дати надимак НУЛЛ, а ми ћемо да обећају
да никада нећемо заиста ставио тамо праве податке
зато сто самовољно треба посебну вредност, 0, нулл, звани
тако да можемо да вичеш на кориснике, ако нешто крене наопако.
У супротном, можда не знаш не значи 0 пут нешто овде
или то значи нешто кренуло наопако?
Морамо да се сви слажемо да је НУЛЛ значи ништа није вратио,
нема јавних адреса је вратио.
Сада, овде сам само усвајањем своје људско конвенцију И врати 1 од главног
ако нешто крене наопако.
То је зато што је повратак Главног конвенција је да се врати 0 ако добро,
1 или нека друга вредност ако је лоше.
Али ГетСтринг и било функција која се бави меморијским повратка НУЛЛ ако нешто крене лоше.
>> Ок. Дакле, нажалост, линија 27, супер једноставан, иако је то, сасвим не копира стринг.
Зашто? То се може видети на следећи начин.
Ја тврдим, у складу 27 да прави копије с и назвавши је Т.
Дакле, ја не питам корисника за 2 жице овај пут, ја само кажем вредност у с
треба да се стави у Т, као добро.
Дакле, сада само да покаже колико је сломљена је то у складу 29 надаље шта ја то радим?
Прво сам проверава да ли је дужина т је већа од 0.
Ту је неки стринг тамо. Корисник откуца нешто унутра
Шта је линија 32 раде, очигледно?
[Нечујан ученик одговор] >> реду. Можете да га некако закључити из онога што сам рекао да ради.
Али технички, шта се ово ради? т [0] представља шта?
[Ученик] Нулта карактер. >> [Малан] Нулта карактер.
Или, још човека као, први лик у т, шта год да је, БиХ можда у овом случају.
А тоуппер ради оно што каже. Она профитира на Нулта карактер тона, а он га мења.
Дакле, то значи узети нулте карактер тона, чине велико слово
и ставио га назад у тој истој локацији.
Дакле, ако сам здраво упишите малим словима, ово би требало да промените малим х до капитала Х.
Али проблем је у томе што се у редовима 35 и 36 шта ћу да урадим је одштампате за нас с и т.
А шта је твој предосећај?
Шта сам заправо ћу да видим да ли сам откуцао у здраво у свим малим словима?
Шта се дешава да се штампа? >> [Нечујан ученик одговор] >> Шта је то?
[Ученик] Велики Х и остали мали. >> Велики Х и остали мали за које с или т?
[Ученик] И. >> Оба. Управо тако. Дакле, хајде да видимо шта се дешава овде.
>> Дозволите ми да иде напред и саставити ово. Ово је цопи1, тако да цопи1. У реду.
Зоом ин Пусти ме напред и покрените цопи1, Ентер, Реци нешто: здраво малим.
Она капитализован копију, али то очигледно капитализован оригинал као и,
јер оно што се сада дешава у овој причи?
У складу 27 Ја стварно не изгледа да се копира стринг,
али чак иако сте можда интуитивно надао да је то случај,
Ако мислите о овој слици, оно што је заиста сам урадио?
Половина слике је исти.
Дакле, хајде да врати у прошлост, тако да је т још увек не постоји у причи.
С може постојати у причи, али хајде мала здраво овај пут.
Дакле, дозволите ми да поправим оно што сам заправо унесе
У том случају овде имамо х-е-л-Л-О.
Ми ћемо га извући као низ знакова, ставим линије сепаратора овде и мој \ 0.
Дакле, ово је место где смо чим линије 1 до 24-исх, дати или узети, су погубљени.
Ово је слика мог сећања.
Када дођем на ред 27, шта се дешава?
Баш као и пре, ја добијем показивач, што ћу извући као овај трг.
То се зове Т. А шта је њена вредност по дефаулту? Ко зна? Неки смеће вредност.
>> Тако да сам апстрактни ћу да даље као знак питања.
И чим је десна страна линије 27 извршава, шта ја унутра стављање т?
Иста ствар је у с.
Дакле, ако смо за тренутак уклоните ову апстракције стрелице и кажемо,
Ох, ово је меморија оптерећења адреса 123, када кажете Т добија с, зарез,
буквално си ставио 123 овде.
Сада, ако се некако поједностави наш свет поново са сликама,
шта стварно урадио је само додао још један стрелицу вашем свету
који је од т указујући на исти тачним ниске.
Дакле, када у складу 31 и 32 сам заправо иде о промени Т [0],
шта је Т [0] изгледа синоним за сада? с [0]
Дакле, то је све што се дешава.
И иако је ова врста осећа мало низак ниво и тајанствени
и ова врста изгледа као можда интуитивно ово би требало да су управо радили -
Направио сам копије ствари пре и то само радио -
Ако сте заиста мисле о томе шта стринг заиста јесте, то је знак *.
Па, шта је то? То је адреса неког карактера.
Онда можда има више смисла да када покушате да урадите нешто
супер наизглед једноставно овако, све што радиш је копирање меморијска адреса.
Нећеш заправо ради ништа са самог низа.
Дакле, чак и ако немате појма колико би решили овај проблем у коду,
високом нивоу, концептуално, шта треба да урадимо да би та верна копија с, очигледно?
Да. >> [Ученик] Дај нову локацију? >> Тачно.
>> Морамо да т потпуно нову локацију.
Морамо некако да створи свет у коме смо добили нови комад меморије,
који је само ради јасноће је да ћу извући одмах испод ове, али то не треба да буде тамо.
Али то мора да буде исте величине, тако да ћу извући ове вертикалне линије на истом месту.
То је у реду ако је то у почетку све смеће. Ко зна шта је тамо?
Али корак 1 ће морати да се ми дају онолико сећању као морам
да стане копију здраво, а онда схватим како се овде копирате х, е овде,
Ја овде и тако даље.
Али ово је већ требало да се осећају помало очигледно, чак и ако су неки од детаља још увек апстрактна.
Да бисте копирали ову жицу у ово, то је само за петљу или вхиле петље
или нешто са чиме сте постали све више познато.
Дакле, хајде да пробамо ово. Пусти ме да идем у цопи2.ц.
У цопи2.ц имамо скоро исти програм, осим на линији 27.
Изгледа мало комплекс, али ако га разбити комад по комад,
лева рука страна је иста.
Цхар * т ствара ову ствар у меморији, додуше са знаком питања
јер ми немамо појма шта је тамо по дефаулту.
На десној страни ми смо сада уводи нову функцију, маллоц,
за памћење издвојити, дај меморије,
и то је очигледно потребно колико аргумената, колико се ствари унутар заграда?
Чуо сам мрмљање од 1 и 2, али то је само 1.
Нема зарез, што значи да је само 1 ствар унутар заграда.
Иако постоји друга заграда, дозволите ми да истакне
шта је унутар крајних заграда, и то је то израз:
(Стрлен (с) + 1) * сизеоф (цхар).
Дакле, ако смо заиста мислимо о овоме, ово говори да ми дужину с.
Зашто сам, ипак, додаје 1 на дужину? >> [Нечујан ученик одговор]
Управо тако. Морамо простор за овог момка на реп, шести карактер који нема енглеског значење
али нема посебан програмски значење.
>> Зато нам је потребан + 1 за то, јер стрлен враћа људско очекивања дужине,
здраво или 5, не дати додатни карактер нулл.
Тако да сам ручно додати ово са + 1.
А онда, * величина (цхар), нисмо видели раније.
Ово није технички функција.
То је посебна кључна реч која нам говори шта је величина неког типа података на рачунару
јер у стварности, неки од нас имају 32-битне рачунаре.
Имам прилично стари рачунар код куће, и то само користи 32 бита за представљање показиваче.
И тако, ако сам величину типа података, то може бити 32 бита.
Али ако ја користим мој нови фенси рачунар, можда ћу да се вратим вредност од 64 бита
за нешто попут адресе.
Дакле, у овом случају, само да буде супер безбедни, ми не идемо на хард нешто слично код -
добро, шта је величина карактер у складу са оним што смо до сада рекао?
Ми смо прилично је рекао усмено да је 1 бајт, и то је прилично тачно преко одбора.
Али опет, претпоставке имају тенденцију да буду лоше.
Они доводе до бугги софтвер ако људи користе софтвер на начине нисте намеравали.
Дакле, хајде да апстрактно ово далеко и мало више уопштено рећи
Треба оволико комаде меморије
и сваки комад меморије треба да буде једнака величини карактера,
који је у ствари једнак 1 у овом случају, али то је више генерички начин писања.
Дакле, ако је реч здраво, колико бајтова се маллоц очигледно издваја за здраво?
[Ученик] Шест. >> Шест. Тачно онолико колико смо упитнике на екрану.
И онда се погоди сада се заснива на разумевању ГетСтринг
шта маллоц вероватно вратити? >> [Ученик] адреса.
Адреса цега? Од првог комад меморије.
>> Немамо појма шта је тамо, јер нека друга функција
могло претходно користили ову меморију.
Али маллоц, као ГетСтринг, враћа адресу првог бајта меморије
да је издвојено за вас.
Међутим, оно што не урадите је да попуните овај празан са карактером обрнуте косе нулл
јер испада можете користити маллоц да издвоји ништа: Интс, стрингови, низови,
плута, студентске структуре.
Можете користити маллоц потпуно уопштено.
То не занима, или морате да знате шта сте доделу меморије за.
Дакле, било би претенциозно да маллоц ставити \ 0
на крају сваког комад меморије вас то даје
јер ово \ 0 ствар је само конвенција за гудаче.
То не користи за Интс, није коришћен за сплавова, то је не користи за студенте.
И тако готцха са маллоц је да је терет је у потпуности на вама програмер
да се сетите колико сте додељени бајтова, а не да се икада користе за петљу
или док петља и проћи граници комад меморије сте дали.
Ставите други начин, чим доделити меморију,
Ви не можете питати оперативни систем, ох, успут, колико је велик комад меморије је то било?
То у потпуности зависи од вас да се сетите да ли је потребно ту вредност.
>> Дакле, хајде да видимо како да наставим да користите ову меморију.
У складу 28 и 29 зашто ја ово радим?
Само укупно разум чек.
Само у случају да се нешто кренуло наопако, тражим неке луде количине меморије
или сам толико ствари ради на рачунару који има једноставно није довољно меморије,
тако нешто, ја бар желим да провери нулл.
У стварности, већина рачунара ће вам дати илузију да сваки програм
могу да користе целину вашег РАМ,
али чак и тако, ако корисник упише у неком лудом дугог низа можда зато што су лоши момак
и они заправо покушавају да сруши свој програм или хацк у њу,
желите да макар провери вредност повратка маллоц и да ли је то једнако нула.
А ако се то деси, хајде да престане сада, јер ја не знам шта да радим у том случају.
Како да копирате тетиве? Постоји неколико начина да се то уради.
Постоје ул копирате функције у Ц, али то је супер једноставно за нас да урадимо ово на старомодан начин.
>> Прво дозволите ми да схватим шта је дужина с је.
Могао сам да ставим ово у петљи, али уместо тога сам га ставио овде због јасноће.
Дакле, н сада чува дужину оригиналног низа, што је очигледно 5.
Онда у мом за петљу сам итератинг од 0 о до н,
и на свакој итерацији ја постављам с [и] унутар т [и].
Дакле, то је оно што сам подразумевао са мојим прстима 2 указују на жицама раније.
Што ово за петљу понавља овако, ја ћу да се копирање х на овамо,
Е у овде, ја у овде, јер је ово с ово је Т.
И онда на крају, у складу 35 зашто ја ово радим?
Морам да се уверите да сам окончање ниске Т.
И ја то урадио на овај начин бити супер експлицитан.
Али предлажу, некога, ако би могао, другачији начин раде.
Ја стварно не треба линије 35. Постоји још један начин да се то уради.
Да. >> [Нечујан ученик одговор] >> Реци гласније.
[Ученик] Мање од или једнака. >> Тачно.
Ми смо само могли рећи мање или једнако н, која је у целини је био лош
јер скоро увек кад одемо до једнак ствари смо бројање
Идемо корак 1 предалеко.
Али запамтите, колико бајтова смо издвојити?
Ми издвојила стрлен С, па 5 + 1 за укупно 6.
Дакле, у овом случају нисмо могли да урадимо овако нешто
тако да ми копира не само здраво, али такође и \ 0 на самом крају.
Алтернативно, могли бисмо да користимо функцију зове ул копија, стрцпи,
али то не би скоро толико забавно.
Али то је све што ради испод хаубе.
Онда на крају, радимо исту ствар као и пре.
Ја капитализује т и онда ја тврдим да је оригинал изгледа овако и копија изгледа тако.
Дакле, хајде да пробамо ово. Пусти ме унутра. Направите цопи2. Ми ћемо повећати и покрените цопи2.
Идем да откуцате здраво малим словима, и заиста сам се мала здраво као оригинал
али капитал Поздрав за копију.
Али ја нисам урадио још увек. Морам да урадим овде 1 Последња ствар.
46 и 47 се јасно ослобађање меморије, али шта то заправо значи?
Шта ја то радим, да ли мислите, позивајући линије 46 и 47 линију?
Какав ефекат то имати? Да.
[Нечујан ученик одговор] >> Тачно.
>> Ви само говорите оперативни систем, хеј, хвала за ову меморију.
Сада можете да га користите за неког другог.
И овде је савршен пример за смеће вредности.
Управо сам користио ову меморију да напише реч здраво на 2 места,
овде, овде, овде и овде.
Дакле, ово је х-е-л-л-о-\ 0.
Али онда зовем линију 46 и линију 47, а знате шта се дешава тамо у погледу на слици?
Заправо, чекај, ова слика је стара.
Када направимо копију, овај момак је стварно указује овде,
па хајде да уклоните бројеве и само апстрактна даље као наше стрелама поново.
Шта се дешава на овој слици кад зовем бесплатно?
[Нечујан ученик одговор] >> Ни.
Ако зовем бесплатно на С и Т - врста трика питање - ова слика се не мења уопште
зато позива и позивање с т само говори оперативни систем,
хеј, можете користити поново ову меморију, али то не мења то нулл
или неки специјални карактер, то не промени,
то не мења х или е или л или л или о У сваком месту на било шта друго.
У погледу слици, чим позовете бесплатно ништа се не мења.
И ту лежи порекло смећа вредности, јер ако сам онда касније у овом програму
питајте оперативни систем за више меморије са ГетСтринг или маллоц или нешто слично
и оперативни систем, каже, сигурно, имам 12 бајта меморије само ослобођени,
користите ово, шта ће бити предат?
Ти ћеш бити предат комад меморије која се обично бих да скренем
са упитницима, али оно што су они упитници?
Они се деси да буде х-е-л-л-о, х-е-л-л-о.
Ово су наши нови смеће вредности чим ослободите тог меморију.
>> Постоји стварни свет импликација овде.
Ово се дешава у вези са РАМ меморије, али ваши рачунари
заправо раде исту ствар са диска.
Причаћемо о томе посебно у будућем проблем сету који се фокусира на форензике.
Али шта се заправо дешава ако имате неку осетљиву финансијску датотеку на радној површини
или неки непотпуни ЈПЕГ и ви га повући у свој смећа,
шта се дешава када га превучете у смеће или отпатке?
Знао си шта сам причао. [Смех]
Шта се дешава када сте увучени у тај доказ за отпатке или канта за смеће?
[Нечујан ученик одговор]
Па, пажљив. Шта се дешава када сте то урадили?
Кратак одговор је ништа, зар не?
Скетцхи или осетљиве фајл још само седи тамо негде на вашем хард диску.
Већина од нас барем научили на тежи начин да је потребно да испразните смеће
или ваш бин рециклирамо да стварно брисање датотеке.
И заиста, када кликнете десним тастером миша кликните на Цонтрол или вашег канту
или изаберите Филе, Испразни смеће или било шта друго
а ви у ствари испразните канте за ђубре или отпатке, шта се заправо догађа онда овој слици?
Више ништа. Дакле, ништа се заправо дешава на диску.
>> А ако можемо привремено само дигресију и пише - ја ћу само користите леђа томе.
Тако сада прича се мења из РАМ меморије, што је, где постоје програми
док сте их користите, на диску, где се они чувају дугорочне
чак и када нестане струје, за сада - и ми ћемо се вратити на то у будућности -
хајде да се претварамо да је ово представља хард диск унутрашњост рачунара
јер назад у дан они су користили да буду кружни дискови, баш као флопи дискова.
Дакле, ако имате неку осетљиву Екцел фајл, то би могло да се овај комад меморије
на диску вашег рачунара, а ја сам само цртање произвољне исту 1с и 0с.
Када превучете фајл као да је то иоур смеће може или отпатке,
Буквално ништа не дешава зато што Аппле и Мицрософт су само одлучио
канта за смеће и отпатке је заиста само привремено чувар места.
Можда на крају ОС ће то испразнити за вас, али обично то не раде ништа,
барем док си стварно ниско на простор.
>> Међутим, када одете на празан смеће или празно корпу за отпатке,
Слично, ништа се дешава са овом сликом.
Све што се дешава је на другом месту на вашем рачунару, постоји нека врста табеле.
То је нешто као мало преварити лист који каже да је, рецимо, ресуме.доц,
тако да ваш резиме у Мицрософт Ворд датотеци живели на локацији 123 на вашем хард диску,
није у меморији, а не у РАМ, већ на вашем хард диску,
и твоји скетцхи ЈПЕГ живи на 456 и ваш Екцел фајл живи на 789 или где год.
Када избришете фајлове заправо пражњења отпада или отпатке,
ова слика не мења. 0с и 1с на вашем хард диску не иде нигде.
Али ово сто овај мали база сорти, ради промене.
Када избришете свој ЦВ, то је као да се брише фајл у неком смислу,
али све је то рачунар заборавити где је та ствар живи на вашем хард диску.
0с и 1с да саставите свој ЦВ или било ових других датотека још увек нетакнута.
>> Дакле, ако сте то урадили случајно, и даље постоји не-нула вероватноћа
да можете да се опорави податке на Нортон Утилитиес или неки комерцијални софтвер
чија сврха у животу је да пронађе 0с и 1с који су на неки начин биле сирочад,
заборавио овде, али оставио овде, тако да можете да вратите податке.
Или форензички истражитељи са полицијом или ФБИ би заправо узети хард диск
и заправо траже обрасце 0с и 1с да изгледа као ЈПЕГ, изгледају као Екцел фајлове,
и да им на тај начин поврати чак и ако рачунар има их заборавио тамо.
Дакле, једини начин да заиста брисање података, као што ћемо разговарати у будућности,
је да се рибати или обришите датотеку или хард диску -
Ви стварно не могу отарасити 0с и 1с
јер у супротном ћеш почети са гигабајта хард диск
а ти ћеш завршити са мегабите хард диск, ако сте стално били брисање
буквално, 0с и 1с.
Дакле, шта би ти урадио да си заиста желео да покрију своје нумере
а основни проблем је у томе што још увек постоји 0с и 1с на диску?
Видим некога гестицулатинг да сте физички ће сломити уређај. То ће радити.
[Смех] Али, ако је то нека врста скупих решења, што ће бити више разумно?
Да. >> [Ученик] Замени их. >> Оверврите их шта? >> [Ученик] Остали подаци.
Остали подаци. Можете само да замени диск са 0с или 1с или 0с све, све 1с.
>> И то је заиста оно што неки од софтвера ради.
Можете купити софтвер или чак и добити бесплатан софтвер,
па чак и уграђена у Мац ОС ових дана, нешто мање у оперативном систему Виндовс,
је способност да безбедно избрисати.
Заправо, ако желите да све рун куће данас, ако имате Мац и урадили,
ако имаш неке ствари у вашем смеће може, можете да урадите Сецуре Испразни смеће,
који ради управо то.
Уместо само брисања фајлова овде, то не брише 0с и 1с овде,
уместо тога, она само мења их, на пример, да 0с и тачка, тачка, тачка.
Дакле, једна од ваших будућих псетс ће заправо бити намерно опорави податке -
фотографије које смо узети људи, места и ствари на кампусу
за који ћемо направити форензичку слику меморијске картице дигиталног фотоапарата је,
што је тачно иста идеја - а ви ћете морати да се изазов да пронађу ствари
обрасци који представљају ЈПЕГ на вашем хард диску,
налик тој бившој студента чије е-маил Прочитао сам пре неколико недеља није
да се опорави фотографије своје сестре.
Зашто не узмемо овде 5-минута паузе, па ћемо прегруписавање са више меморије.
Дакле, овде је место где се ствари мало ума савијања, али ово је веома моћан корак
ка разумевању све ово више.
Овде је програм који се зове поинтерс.ц.
То је међу узорка код данашњег.
Приметимо да је у првих неколико редова, 19 до 22, а све што радимо је нешто попут ГетСтринг
и враћање адресу, складиштење у С.
Убудуће за псет чак 3 ако желите, али псет 4 и на
где можете почети да предузме ове точкове обуку ван себе,
не постоји разлог да се претварам да ниске постоји.
Свакако је добро да почнем говорећи цхар *.
>> Као на страну, у онлине референци и у књигама често може видети звезду поред променљиве.
Можете чак да видите простор око обе стране њега.
Сви они који су функционално исправна.
За сада, међутим, ми ћемо стандардизују на овом приступу би супер јасно
да цхар * је као да кажете знакова показивач.
То је тип података.
А онда име променљиве с је у овом случају.
Тако смо стечен стринг и ми смо га звали с.
А онда овде приметити да сам заправо ради мало лукавства.
Ово се зове показивача аритметику, која је нека врста супер једноставан.
То само значи да сабира и одузима бројеве до тројке.
Али ово стварно ради.
Овај програм је очигледно штампа 1 карактер по линији тако да крајњи резултат стринга с -
Само тако можемо да поквари где ово иде, да показиваче, трчи тројки, пусти ме унутра увећали
Сада ми дозволите тип у нечему као што је здраво и тип Ентер
и штампа 1 карактер по линији.
До пре друго, ми бисмо то урадили са квадратном брацкет нотацији.
Ми би имали за петље и да ћемо урадити принтф од с [и] и да ћемо то опет и опет и опет
са обрнуте косе н на крају сваког реда.
Али овај програм је другачији. Овај програм се користи, буквално, аритметике.
Дакле, шта се овде дешава?
Пре свега, пре него што се ова петља извршава чак шта, само да буде јасно, с је у ствари?
С? >> [Ученик] адреса. >> Адреса.
>> И то је адреса, у случају здраво, први знак у том речју, која је х.
Тако е, у овом конкретном примеру, адреса х.
Дакле, шта то значи с до + и?
Па, почиње у 0 у ово за петљу. Урадили смо то много пута.
Ја се да идем до дужине стринга, очигледно.
Дакле, на првој итерацији ове петље, и је очигледно 0.
Дакле, овај израз говори с + и - а, с +0--то је очигледно само с.
Дакле, шта је с * овде?
Сада смо помоћу звезду на мало другачији начин.
Дозволите ми да иде напред и ослободити од т, јер смо урадили говори о т и копије с.
Сада само желимо да испричају причу укључује е.
И тако, у овом тренутку, пошто типа стринг, наш свет изгледа сасвим као што је било раније
са само с складиштење адресу х и генерално указује на ниску здраво.
Ако ја сада линију као * (а + и), хајде да пробамо ово.
Дакле * (а + и). Дозволите ми да поједностави јер то је 0, тако да је ово * (а +0).
Па, чекај мало. Поједноставите даље. Ово је * (с).
Па, сад заграде су некако глупи, па сад хајде да уради * е.
Дакле, у првој итерацији ове петље, да линија која је истакнута, 26,
је прилично еквивалент штампа ово.
Шта је тип података * с?
У том контексту, јер је звезда се дешава да се поред самог с,
али конкретно, јер ми се више не декларисање с,
нећемо више ствара променљиву, нема ни помена о цхар * у линији 26,
нема помена о кључној речи ниске, ми само користимо променљиву зове с
Испоставило се сада звезда има мало другачији и, признајем, збуњује значење.
* И овде значи ићи на адресу у с и штампани год је тамо.
Тако је овде је * е је - нешто као Цхутес и лестве, следите стрелицу - овде.
Дакле, ово је * е.
>> Па шта буде одштампан на првој итерацији те петље у складу 26?
Ја штампати% Ц, који је чувар места за карактера,
онда \ н за нову линију. * (А + и) где је ја 0 је управо то.
Па шта знак да поставите у за% ц? Х.
У наредном итерацији петље - вероватно можете да видите где ово иде -
следећа итерација и очигледно је 1, па то значи с +1,
и онда сад не требају јер сада заграде звезда мора да каже
идите на меморијску адресу с +1.
Шта је с? Хајде да врати у прошлост и рећи ово стрелица сада није стварно нам раде све услуге.
Нека је тачније рећи да је ово чување броја 123
јер почетак овог низа здраво, ово је адреса 123, то је 124, и тако даље.
Дакле, на другој итерацији када кажем с +1, то је као да кажеш 123 +1,
иначе познат као 124, па шта буде знак одштампан на другој итерацији?
Е на меморијску адресу 124.
Онда опет +, 125, 126, 127, и то петља срећу зауставља пре него што смо дошли овде
зато ја користим стрлен да се уверите да ја не рачуна превише висока.
Дакле, и то је то.
Опет, ово је само као да смо урадили пре недељу дана.
Пусти ме да пишем на линији испод иако не желимо да обоје.
Ово је идентична сада ово.
>> Дакле, иако је с стринг, као што смо то звали недељама, а стварно је знак *.
Дакле, ако желимо да будемо супер анални, то је заиста прави писати специфичан карактер
на-тог места коришћењем ове нумеричке адресе и овај стар оператера,
али искрено, ово је тако много чистији. Дакле, ово није лоше.
Нема разлога да престанем да радим овде линију 27, али 26 је функционално исти,
и то је функционално иста за тачно разлога које смо до сада расправљали.
И на крају, 29 је само добра пракса.
Позивање без с значи да сада сте враћању меморију коју ти је дао ГетСтринг
јер опет, као што сам поменуо понедељак, ГетСтринг недељама
је увођење буба у свој код.
Ваш код за недеља је имала меморије цурења
где сте били питате ГетСтринг за меморију, али никада нисам био то враћању.
И то је намерно изабрала нас педагошки
само зато што је превише да размишљају о томе рано.
Али сада нам треба више симетрију.
Ако питате рачунар за меморију, као што је случај са ГетСтринг,
као што је случај очигледно за маллоц,
Сада морате да псет 4 па надаље, такође бесплатно таква меморија.
Обратите пажњу да је ово другачије од казивања инт н.
Не треба да се ослободи јер нисте звати ГетСтринг
и није назвао маллоц.
>> А чак и ако се зове ГетИнт као што смо на крају ћемо видети,
ГетИнт не издваја меморију за вас, јер ви заправо може да прође око бројеве
и пловци и слова само начин на који смо радили недељама.
Жице, иако су посебна јер заиста они спајање више карактера.
Дакле, они су само другачији од цхарс и флоатс и Интс и слично.
Али ми ћемо се вратити на то пре дуго.
Сва питања онда на овом почетку тројке? Да.
[Нечујан ученик питање]
Ах, веома добро питање.
Једна од ретких ствари Ц заправо за вас, што је згодно,
се она схвати шта је за тебе величина је од типа података
и онда то ради некако мултипликације за вас.
То је небитно у случају цхарс, јер готово увек знак је 1 бајт,
па то само ради.
Али зарад дискусије, ако сте заиста били штампање целих бројева
а ви сте покушавали да одштампате неке с вредност која је показујући на цео број,
не слично би требало да урадите + 4 * и само зато инт је 4 бајта.
Показивач аритметика значи да Ц и преводилац учинити све да математику за вас.
Све што треба да брине о томе је пребројавање у врсти људском смислу. Да.
[Ученик] Ако прогласи низ унутра фор петљи, не морате да га ослободи касније?
Добро питање.
>> Ако прогласио стринг унутар за петљу, да ли треба да га ослободи касније?
Потребно је само да се ослободи меморија да издвоји са ГетСтринг или маллоц.
Дакле, ако сте рекли нешто као - пусти ме да витичасте заграде сада толико сви код односи.
Ако сте урадили нешто, мада буггили, овако, цхар * т = с
не треба да ослободе т т јер није укључивало било какво помињање маллоц или ГетСтринг.
Ако насупрот томе што је ово урадио, ГетСтринг, онда да, ви би требало да ослободе Т.
А у ствари, ваша једина шанса да се то уради је сада унутар ове петље, за исто питање обима
да смо разговарали у прошлости.
Иначе ћеш се додељује меморију, додељује меморију додељивања меморије,
и на крају програма, јер си изван тог петље,
Т не постоји, али никада није рекао оперативни систем
да ниси висе треба тај меморију.
И пре него што дуго, за псет 4 или 5 ћемо вас опремити са програмом под називом Валгринд,
који је сличан у духу да ГДБ у томе што је донекле има неког тајно интерфејса,
али његова сврха у животу је да вам помогне.
И Валгринд је програм који ће у будућности тражити своје програме
у потрази за меморијске цурења, било из ГетСтринг или маллоц,
што ћемо почети користите све више као што престану да користе библиотеку ЦС50 толико.
Ми сада коначно имамо неку врсту речника и врсти менталног модела у теорији
са којима се реши овај сломљену програм.
>> Дакле, у овом сломљеном програму, своп ради унутар свап,
али је заправо никада није радио у главни јер главни прошао у Кс и И, бележења,
и они су усвојени у вредностима, да тако кажем.
Копије њих су добили замене.
До краја свап, и б су заиста били размењени,
али наравно к и и, као што смо разговарали у понедељак, није било.
Зато предлажем у зелено да ово је заправо овде решење.
И заправо, дозволите ми да померим моје звезде само да буде у складу
иако, опет, функционално то није битно.
У наредним недељама ћемо објаснити када и зашто је то битно.
Дакле, у зеленом сада је решење.
Искрено, то изгледа много гадније, јер имам све ове звезде.
Дозволите ми да истакнем једну ствар.
Горња линија овде где пише инт * а инт * б
фундаментално раде исту ствар као што је увек има.
То је прогласио 2 аргументе или параметре да замени,
први који је инт показивач зове,
Други који је инт показивач зове б.
Једина ствар која је нова у овом тренутку је чињеница да ту нема звезда.
>> Шта то значи? Није инт б није инт.
Је адреса једног инт и б је адреса другог инт.
Овде доле, ово је место где сам признајем Ц добија збуњујуће.
Сада смо помоћу звезду, али има другачије значење у овом контексту.
Зато нећемо проглашења тројке као што смо ми овде,
Овде смо дереференцинг ствари.
Дакле технички, звезда у овом контексту првог, другог и трећег реда унутар своп
је дереференце оператера, што само значи да одем тамо.
Дакле, баш као и мој прст пратили на стрелицу х,
* Средство ићи на ту адресу и наћи ми инт која је тамо.
* Б средства иду на адресу и донесе ми шта је тамо.
Дакле, хајде да прекраја слику од понедељка сада користи гомилу оквире,
дно од којих ће бити главни,
горњи од којих ће бити замењени,
тако да је наш свет изгледа, баш као и понедељак, овако.
Овде је комад меморије да је главни ће користити.
>> Подсетимо, од понедељка да програм управо имао 2 променљиве
једна се зове к и један под називом год, а ја сам ставио бројевима 1 и 2 тамо.
Сада када зовем замене као што сам урадио у понедељак,
раније када сам користио црвену верзију овог програма, који изгледа овако,
Имам 2 параметра, и Б, а шта ми пишемо овде и овде?
Само 1 и 2, буквално копије кии.
Данас смо то променити.
Данас, уместо доношења у Интс и б ћемо проћи у 2 адресе.
Те адресе се деси да се укаже на Интс, али те адресе нису сами Интс.
Они су адресе. То је као поштанску адресу уместо.
Зато сада морамо да само себи дају мало више детаља на екрану.
Ово је мој рачунар меморија као што је био цео дан.
Сада нам је потребно мало произвољно нумерисања шему.
Дакле, хајде да кажемо, само случајно, да је ово сећање адреса 123, 124.
Рецимо да је ово 125, ово је 126, и тако даље, али то је потпуно произвољна.
Ми само треба мало шему нумерисања у мом сећању.
Дакле, сада када сам прошао у кии, ја нећу да прође у кии;
Идем да прође у поштанску адресу, да тако кажемо, од к и и
тако да оно што добија складишти овде и овде није 1 и 2,
али ако можете да видите мој мали текст, оно бива донет овде и овде?
[Нечујан ученик одговор] >> Тачно. 123 добија се овде стави и 124 добија ставити овде.
>> Сада, пошто сам користио звезду у овој првој линији начин се овде на врху,
мој програм једноставно зна да је 123 и 124, иако су очигледно су цели бројеви
да би свако људско примете, требало би да се тумачи као адреса, нумеричке адресе.
Они нису по себи Интс, они су адресе,
а то је зато што сам изричито тамо ставио звезде.
Дакле, сада у свом првом, другом, трећем и линије актуелног кода шта се дешава овде?
Хајде да скрене остатак слике.
Тмп је баш као што је било у понедељак. Ништа посебно о тмп.
То је само локални 32 бита променљива, а унутар тога сам очигледно ја складиштење вредност *.
Дакле, ако сам само рекао тмп =, шта бих ја овде ставио? >> [Ученик] 123.
123. Али то није оно што ја радим.
Кажем тмп = *. Звезда значи ићи тамо.
Дакле, овде је, 123. Како да одем тамо? Претварај као да је стрела.
Па, то је то, 1. Па шта буде ускладиштена у тмп, очигледно? Само 1.
Другим речима, тмп је * а, * средство идите на адресу која је тренутно у,
што је очигледно 123.
>> Ок, овде смо на локацији 123, видим број 1,
па ћу тамо стави број 1.
Шта сада да радим у линији 2, * = * б?
Ово је један мало више укључе, јер сада шта је? То је 123.
Дакле * је где? Баш тамо где сам раније био. Па иди тамо. Ок.
Сада, на крају, и коначно ће почети да има смисла, надам се,
* Б значи оно што је у Б? 124. Зато морам да идем тамо, што је за 2.
Па шта сам ставио где?
2 иде у овде, јер * б * иде у. Па ја ћу то да урадим.
И већ се види, можда, да смо толико много ближе
решавању овог глупог, једноставан проблем исправно први пут
јер сада имамо још један сећате шта је било к,
имамо 2 примерка, додуше, и,
али ред 3 сада каже * б.
Дакле, овде је б. * Б значи ићи тамо. Па где је локација 124?
То очигледно је овде. Па шта сам овде ставио? Очигледно, тмп.
Дакле, сада радим ово. Дакле, имам овде 1 и 2 овде.
И шта сада о свему овоме, 123 је 124, а 1?
Чим своп повратка, ова меморија је добра као изгубљена
јер чим своп повратка, оперативни систем
је слободан да користи ту меморију поново у будућности.
Само сећање Главног је на дну ове такозване гомилу лепи около.
>> И тако коначно имамо сада радну верзију.
Пусти ме да идем у свап.ц и приметити следеће.
На врху програма сам променио мој прототип бити инт * а инт * б.
Дакле, једино што сам променио да одем из црвеног, који је био лош, до зелене, што је добро,
је да сам додао ове звезде данас.
Али онда овде доле у ​​себи свап сам морао да копирате, налепите оно што је само на слајду.
Имам звезду овде, звезда овде - који одговара прототип -
и онда све те ствари сада имају звезде, осим за тмп
јер употреба привремене променљиве, ту нема ништа ново.
Треба ми само привремено складиште за инт.
Дакле, ми тамо не треба звезду.
Ми само треба звезду тако да можемо прећи ову врсту произвољне границе
између ове 2 фрејмова у меморији мог рачунара.
Али једна ствар мора да се промени, а можда сте то већ осврнуо.
Шта друга линија је очигледно другачије? >> [Ученик] & к.
>> Да, па 25 је последња линија кода морам да променим за то да раде.
Пре недељу дана, па чак и у понедељак лине 25 изгледала овако, замени Кс и И,
и ово је само сломљена јер ако кажете свап (к, и)
дајете копије кии да мењате, онда ради свој посао,
али никада се заправо мења Кс и И саму.
Дакле, чак и ако никада нисте видели овај лик раније са амперсанд у коду,
Само да претпоставим. Шта амперсанд уради, изгледа?
[Ученик] Узима адресу. >> Такес адресу.
Дакле амперсанд говори дајте ми адресу к.
Ко зна где је? Дешава се да 123. Не занима ме. Само ми дај адресу к.
& И значи дај адресу и.
И у том тренутку прича је савршено у складу са сликом ми нацртао пре тренутак.
>> Тако ћу признати тројки, свакако за мене када сам први пут почео да учим ово,
су дефинитивно једна од најтежих ствари на око замотајте памет.
Али схвати, поготово што чувамо играо са оваквим стварима,
ако га разбити овим супер једноставан врстом интелектуално незанимљив проблема
да само кретање бројева, одговор на много конфузије са показивачима
заиста могу бити изведене из ових основних веома механике.
Ево адреса. Иди тамо са звездом.
Или обрнуто, ево амперсанд. Схватим шта је заправо адреса.
У реду.
Па где је све ове меморије долази?
Сте нацртали смо ову слику неколико пута, а држим обећава да ћемо се вратити на њега,
али овде је репрезентација меморије рачунара
То је мало више од наше означени табли овде.
Текст сегмент на врху представља шта у вези са вашим програмом?
[Нечујан ученик одговор] >> Извини? Реци поново.
[Ученик] Стварни програм. >> Стварни програм.
>> Тако 0с и 1с да сте саставили након писања Ц кода и онда ради кланг
и генерисање до 0 и 1с крајеве стићи ушушкан у меморији
јер када двапут кликнете на икону на вашем Мац или ПЦ
или покрените команду као Марио на ваш брз, ваш 0с и 1с са диска
се учита у меморију, тако да рачунар може да их манипулише
и изврши их брже.
Дакле иницијализују подаци и подаци неиницијализоване, нећемо много говорити о онима,
али они су само глобалне променљиве.
Иницијализују значи глобалне варијабле које сте дали вредности;
неиницијализоване значи глобалне варијабле које нисте још дају вредности.
Затим, ту је ова средина варијабле које сам потпуно ћу таласу моју руку у,
али су ту и да чува ствари попут вашег корисничког имена
и других врста нижих нивоа детаља.
Али јуициест комада распоред вашем сећању је то ствар која се зове стек и хеап.
Стек опет, да буде јасно, је меморија која се користи кад год функције зову,
кад год постоје локалне променљиве
и кад год постоје параметри који се доноси око.
Све што се дешава у стеку.
Гомила нисмо разговарали о томе, али је потребно погодити ко користи гомилу.
Само другачији комад меморије.
То се дешава да се овде извући на врху, али то је произвољна сликовна конвенција.
Ко је наводно користио меморију из гомиле недељама?
То технички ти, али индиректно. >> [Ученик] ГетСтринг.
ГетСтринг и маллоц. Дакле, овде је основна разлика.
>> Знате за последњих неколико недеља да ако вам треба меморије, само прогласити променљиву.
Ако вам је потребно доста меморије, прогласи низ право унутар вашег функције.
Али проблем смо држали пред јесте ако прогласе променљиве локално унутар функција,
чим функција враћа, шта се дешава у меморију и тих варијабли?
Само нека од њега више није твоје, зар не? То је само нестане врсту концептуално.
И даље је физички тамо, очигледно, али то више није ваше право да користите.
Ово је очигледно проблематична ако желите да пишете функције у животу
да заправо додели меморију и не врати одмах.
Случај у тачки: ГетСтринг сврха у животу је да немају појма унапред
колики у низу ћу да куцате на тастатури,
али то мора бити у стању да издвоје меморију држите Давида или здраво
или цео есеј да би корисник је унесе
Дакле ГетСтринг је користио маллоц.
Маллоц стога мора да користи а не гомилу;
уместо тога је користи ову ствар зове крнтија.
Нема ништа другачије меморије. То није брже или спорије, или нешто слично.
То је само физички на другој локацији.
>> Али правило је да меморија која се додељују на гомили
никада неће бити одузета од тебе док не зову - узети гуесс - бесплатно.
Насупрот томе, свако сећање тражиш на стек за само проглашење низ
или декларисање променљиве као што смо радили недељама,
који по дефаулту завршава на стеку.
И то ради велики 90% времена, али на тим ређим приликама
где желите да доделите меморију и задржати га около,
онда морате да користите функцију као маллоц.
Или смо користили функцију као ГетСтринг, који заузврат користи маллоц.
Хајде да видимо где ово може да се пробије и онда завирити у Бинки.
Вратићемо се на то у будућности.
Овде је супер једноставан програм који у прва 2 реда ради шта?
У енглеском језику, шта ове прве 2 линије кода уради унутар главни?
[Нечујан ученик одговор]
Пажљиво. То ми не даје адресу Кс или И.
[Ученик] Даје смернице за Интс. >> Добро. Дај ми 2 показивачи на целе бројеве.
Другим речима, ми 2 комаде меморије које сам задржати цртеж данас,
иако сам га избрисати сада, као квадрата.
Дај ми 2 комаде меморије, један се зове к, и једна се зове -
раније сам их звали с и т - и оно што је тип тог комад меморије?
То ће сачувати адресу.
То је од * типа инт.
>> Дакле, адреса на инт ће на крају живети у к,
адреса једног инт ће на крају живети у и,
али у почетку, шта је унутар кии? Ко зна? Смеће вредности.
То нема никакве везе са тројке.
Ако нисмо ставили нешто тамо, ко зна шта је заправо тамо?
Сада, к. Шта се овде дешава? То је легитиман сада јер је к показивач. То је инт *.
Значи ја могу ставити у к адресу неког комад меморије.
Шта маллоц вратити? Савршено, враћа адресе,
адреса првог бајта у целом комад меморије.
Колико бајтова је ово очигледно додељује, на пример, у апарату?
Шта је величина једног инт? 4.
Ако мислите назад у недељу 1, то није супер важно да се увек сетите да,
али у овом случају то је корисно знати, 4 бајта.
Дакле, ово је додељивање на гомилу 4 бајта
и то се враћа адресу првог ми произвољно.
Сада, шта је к радиш?
* Кс = 42 ради шта?
Ако у овом тренутку у причи имамо Кс, који изгледа овако са неким смеће вредности,
ово је сада и неким смећа вредности, сада у линији 3 сам издвојила 4 бајта.
Ова слика суштини изгледа овако.
Или прецизније, ако је ово произвољна адреса 123, то је оно што наша прича сада изгледа.
* Кс = 42 сада значи шта? То значи отићи на адресу 123 и ставио број 42 тамо.
Не морам да скренем ове редове, јер ми не радимо жице.
>> Требао сам само написао овако, и само ради демонстрационих а,
42 као инт врста заузима много простора, 4 бајта.
Дакле, то је оно што се тамо догодило, али сада постоји проблем.
* И = 13. Шта се дешава овде десити?
Проблем је * и у нашем поједностављеном свету само значи отићи на адресу у и.
Шта је у и? То је нека смеће вредност.
Дакле, хајде да претпоставимо да је то смеће вредност 5551212, нешто лудо тако.
* И средства иду на адресу 5551212.
То је као овде. То не постоји, на пример.
Дакле * и добија 13 средства покушавам да скренем 13 овде. То не постоји.
Сам премашила сам сегмент табле. Шта ја добијам?
То шифровану поруку сегментација крив што ја покушавам да ставим у меморији
вредност као 13, на месту које не постоји.
Остатак програма можда неће радити добро, али до тог тренутка не.
Дакле, хајде да покушамо да испричам ову причу.
Ми ћемо се вратити на то када смо причали о хек.
Хајде да се вратимо на ово и закључи са овим стварима се зове Бинки,
што је присећање Стенфорд професор седи код куће игра са цлаиматион,
да исприча причу о управо тог истог програма.
То је само око 3 минута. Овде имамо Бинки.
[Мушко говорник на видео] Хеј Бинки, пробуди се. То је време за забаву показивача.
[Бинки] Шта је то? Сазнајте више о тројке? О, снаша!
[Мушки говорник] Па, за почетак, мислим да ћемо требати пар тројки.
>> [Бинки] Ок. Овај код издваја 2 тројке које могу указати на целе бројеве.
[Мушки говорник] Ок. Па, ја видим 2 тројке, али не изгледа да указују на било шта.
[Бинки] То је тачно. У почетку, показивачи не указују ни на шта.
Оно што указују на зову поинтеес и постављање их је посебан корак.
[Мушки говорник] Ох, у реду, у реду. Знао сам то. У поинтеес су одвојене.
Ер, па како ти додели поинтее?
[Бинки] Ок. Овај код издваја нову цео поинтее, и тај део поставља к да укаже на то.
[Мушки говорник] Хеј, то изгледа боље.
Тако да је то нешто урадити. >> [Бинки] Ок.
Ја ћу дереференце показивача к да меморишете број 42 у својој поинтее.
За овај трик ћу морати свој чаробни штапић за дереференцинг.
[Мушки говорник] Ваш чаробни штапић за дереференцинг? То је одлично.
[Бинки] Ово је оно што код изгледа. Ја ћу поставити број и ... [Пуцкетања]
[Мушки говорник] Хеј, погледајте, ево га иде.
Дакле, ради се о дереференце к следи стрелица за приступ свој поинтее,
у овом случају за складиштење 42 унутра.
Хеј, покушајте да користите га да меморишете број 13 кроз друге показивача, и.
[Бинки] Ок. Ја ћу само отићи овамо, и и добити број 13 поставили
и онда узети штапић за дереференцинг и само ... [Зујање звук] Вау!
[Мушки говорник] О хеј, то се не ради.
>> Рецимо, Бинки, ја не мислим да дереференцинг год је добра идеја
јер постављање поинтее је посебан корак
а ја не мислим да смо икада урадили.
[Бинки] Хм, добра ствар.
[Мушки говорник] Да. Ми издвојила показивача и али ми никада није постављен да укаже на поинтее.
[Бинки] Хм, добро запазам.
[Мушки говорник] Хеј, ти изгледаш добро тамо, Бинки.
Можеш ли да поправиш како год указује на истом поинтее као Кс? >> [Бинки] Наравно.
Ја ћу користити свој чаробни штапић за показивач задатка.
[Мушки говорник] Да ли ће то бити проблем као и раније?
[Бинки] Не, то не дирајте поинтеес.
То је само један мења показивач да укаже на исто као и други. [Пуцкетања]
[Мушки говорник] О, видим. Сада и указује на истом месту као и к.
Чекај. Сада год је фиксна. Има поинтее.
Дакле, можете пробати штапић за дереференцинг поново да пошаље 13 Овер.
[Бинки] Ух, добро. Ево иде. [Пуцкетања]
[Мушки говорник] Хеј, погледај то. Сада дереференцинг радове на И.
И зато што се показивачи деле тај један поинтее, обојица виде 13.
[Бинки] Да, дељење. Год.
>> Тако ћемо заменити места сада?
[Мушки говорник] О види, ми смо ван времена. >> [Бинки] Али -
[Мушки говорник] Само запамтите 3 правила показивач.
Број 1, основна структура је да имате показивач и то указује више на поинтее.
Али показивач и поинтее су одвојени, а честа грешка је да подесите показивач
али да заборавимо да га дају поинтее.
Број 2, показивач дереференцинг почиње у показивача и прати његову стрелу у
да приступите свој поинтее.
Као што сви знамо, ово функционише само ако постоји поинтее,
која врста враћа на Правило број 1.
Број 3, показивач додела траје један показивач и мења га
да укаже на исти поинтее као друга показивачем.
Дакле, после уступања, 2 показивачи ће указати на исту поинтее.
Понекад то се зове дељење.
>> И то је све што је до њега заиста. Ћао сада.
Ово је Бинки. Ово је ЦС50. Видимо следеће недеље. [Аплауз]
>> [ЦС50.ТВ]