[Powered by Google Translate] [Седмица 4 Продължава]
[Дейвид Дж. Малан - Харвардския университет
[Това е CS50. - CS50.TV]
>> Това е CS50, и това е края на 4-та седмица.
Така някои добри новини и лоши новини.
Не лекция в понеделник, няма проблем, следващата седмица. [Студенти аплодисменти]
Ти няма да се харесва, когато това се случва.
Но ние имаме това, вместо следващата сряда,
има и на учебната програма 1 лекция петък следващия петък, така че можем да останем на пистата.
Но всичко ще бъде заснет, както обикновено, така че не се притеснявайте.
>> А що се отнася да разпитва 0 какво ще направим към края на седмицата
се публикува на началната страница cs50.net на курса обяснение
какви очаквания трябва да имат, когато става дума за първия тест.
Като цяло, той ще бъде многократно избор, вярно-невярно, кратък отговор, къси кодиране проблеми.
Вие не започваш да се очаква да изпълнява равностойността
на проблем, който ще видите на pset, за които имате компютър
дебъгер и други подобни, но няма да има малки кодиране проблеми.
>> И наистина, най-доброто ръководство, за да се получи усещане от това, което CS50 викторини са като
е да отидете на cs50.net, отидете на Викторини връзка,
и можете да видите последните няколко години на стойност викторини.
Просто осъзнаваш, че учебната програма не е винаги е била една и съща през годините.
Понякога ние, понякога изважда
така че ако видите някои темата на един от онези стари викторини
, че вие ​​нямате представа за какво говори, това е, че ние го покрие
или че не сме го покрие.
Но във формата на мнения, тази неделя, понеделник и вторник
както и целия курс на сесията преглед в неделя вечер -
време и място да бъдат обявени на интернет страницата на курса -
всички вие имате възможност да прегледат с преподаване на курса сътрудници
материал за тази година, както в раздел и като пълноправен клас,
и тези, които ще бъдат заснети, както обикновено, както добре.
>> Добре. Така че без повече приказки, един коментар за преминаване / отпадане и добавяне / падне.
Може да сте виждали моите бележки снощи, и това е наистина просто някаква допълнителна увереност
че ако сте сред тези, които са особено по-удобни или някъде по средата
и вие се чувствате само малко над главата си,
осъзнават, че наистина е съвсем нормално, и има достатъчно структура за подкрепа в
един от които работно време имаха намерение за подобряване на още по-на моя имейл снощи,
и осъзнаваш, че опция като мине / не за клас като този
наистина е замислено като механизъм, който да ръба на курс като този,
така че отново, ако сте харчат тези 10, 15, 20 часа
Просто се опитвам да получите някои pset да работят и да знаеш, че 90-95% от пътя
но не можете да намерите някаква проклета бъг, в един проход / не модел, който е нещо добре.
>> Идеята е, че с този механизъм може да отидете фокусира върху другите си psets
или сън или каквото и да е, че искате да се съсредоточи върху.
Така че осъзнават, че имате време до идния вторник - технически 5-ти понеделник,
но това е празник, така че идния вторник - за да превключвате от прохода / не успеят да калибровани или обратното.
И ако сте наистина на ръба и се мисли за отпадане изцяло,
моля да ме хване след лекция или пратете ми бележка.
Ще се радваме да поне чат, преди да наддават сбогом.
Добре. Така че ние започнахме обучение колела последния път.
По-специално, ние се фокусирахме върху низ.
String е нещо, което е обявено в библиотеката CS50,
специално в този файл, наречен cs50.h, които ние ще започнем да погледнете в тази и следващата седмица.
Но низ е наистина само опростяване на нещо
това е малко по-arcanely описан като знак *.
Чар сме запознати с. Това е просто един знак.
Но * от понеделник обозначава какво? >> [Ученик] показалеца.
Показалеца. И какво е указател? >> [Ученик] адрес.
>> Това е като адрес, място в паметта.
Какво е на адрес или място или памет?
Отново, всички от нас имат лаптопи с концерт или 2 гигабайта RAM, най-вероятно тези дни,
и това означава, че имате един милиард или 2 милиарда байта стойност на паметта.
И това всъщност няма значение какво физически прилича,
но се върху вярата, че може да изброи всички на отделните байтове, че вашият собствен лаптоп е -
това е байт 0, това е байт 1, това е байт 2 милиарда -
и това е точно какво е компютър.
Когато отделят място за един символ, например,
очевидно трябва да живеят някъде в паметта на компютъра ви,
и може би това е най-байт номер 12345,
и че е някъде тук, в паметта на компютъра ви.
И адреса на този характер е 12345.
>> Сега, през седмица 0, чрез сега този момент, ние не са наистина беше загрижен
където в памет нещата се съхраняват, защото ние обикновено се използват символи,
променливи и масиви действително да получите в нашите данни.
Но от понеделник и още повече днес, вие сега ще трябва
всички по-изразителни възможности с писане на програми
наистина да манипулира паметта на компютъра, обаче ти е удобно,
за двете добри намерения и лоши,
грешки е много общ резултат в този момент в изучаването на тези неща.
Но какво всъщност означава да бъдеш Чар *?
Нека вървим напред назад - и ние ще се върнем към Бинки като обеща днес.
Нека да отидем до един прост пример тук.
Позволете ми да запазите този файл като compare.c, и нека просто се шаблон някакъв код тук
така че да включва stdio.h, нека да отдам включват cs50.h. Ще я увеличите там.
Позволете ми да започнете да пишете INT, главната (свободен), а сега искам да направя нещо подобно:
ФОРМАТ ("Дай ми низ:") и след това аз ще използвам низ и получава GetString
да се получи низ от потребителя, тогава аз ще поиска от потребителя за друго.
("Дай ми друг низ:"), и аз отивам да ги питам чрез GetString да получите този.
Ще го наречем тон, защото т идва, след като и е хубаво име за низ, ако това е доста общи.
Така GetString и сега просто искам да се направи проверка на здрав разум и аз ще кажа
ако (а == т) тогава аз съм просто ще съобщите на потребителя, ФОРМАТ ("сте написали едно и също нещо \ N!");
иначе аз отивам да разпечатате нещо подобно ("сте написали нещо различно! \ N")
или каквото и присъда да бъде. Така че нещо подобно.
Тогава, както обикновено, ще се върна 0, което означаваше, че нищо лошо не се е случило,
и аз отивам да вървим напред и да компилирате и стартирате тази програма.
>> Но в понеделник ние се завтече тази програма,
и всъщност беше казано, че HELLO не е HELLO и довиждане не е сбогом.
Поведение, което видяхме беше малко по-така.
Нека отида в моя източник директория, мащабиране тук и да правят сравнение.
Съставител добре. Позволете ми да тичам сравнение. Дай ми низ: Здравейте.
Дай ми друг низ: Здравейте.
Сте написали нещо различно!
Е, нека опитаме нещо просто като 50, 50. Сте написали нещо различно!
здравей, здравей. Затова е ясно, нещо, което се случва тук.
Но какво е обяснението за това, защо?
Очевидно, линия 12 е напълно нефункционално.
Какъв е основният проблем тук? Да. >> [Ученик] сравняват адресите.
Да, точно така. Всъщност се сравняват адресите
HELLO и HELLO, в който се съхраняват.
Това не е сравнение буквите HELLO отново и отново,
защото това, което наистина се е случило, през цялото това време сме използвали GetString -
Дъската отново е паметта на нашия компютър,
и да кажем, че аз наричам GetString след обявяване на променлива и.
Какво означава паметта ми изглежда?
Да произволно се каже, че и изглежда по този начин. Това е квадрат.
И почти всеки път, когато сте извадили част от паметта на екрана
ако е 32 бита съм рисувал квадрати като този, защото наистина в уреда,
указател, адрес, е 32 бита. Това е същото като вътр.
Това може да варира въз основа на компютърната система.
Тези от вас, които са смътно запознати с факта, че вашия Mac или PC е 64 бита,
, което всъщност означава, че това компютърът ви използва 64-битови указатели,
64-битови адреси и сред квит на това е вашите компютри
може да има много повече RAM, отколкото миналата година.
Дълга история Накратко, през деня, когато компютрите се използват само 32 бита
да представляват адреси, най-голям брой на байтовете, които бихте могли да представляват
в този случай е това, което, ако имате 32 бита?
Така че 4 млрд. евро, право, тъй като от 2 до 32 е 4 милиарда.
Този номер е повтарящи се в курса.
>> Така че, ако имате само 32 бита, най-голям брой можете да разчитате е около 4 млрд. евро.
Но това е основно ограничаване на компютрите, докато преди няколко години
защото, ако можете да се отчитат само по-високо, като 4 млрд.,
това няма значение, ако си купите 8 гигабайта RAM или дори 5 гигабайта RAM;
не можете да разчитате, че високите, така че е безполезно.
Може да има достъп само до първите три или четири гигабайта памет на вашия компютър.
Това е по-малко значение сега, и вие може да се купи MacBook Pros и Dells
с 8 гигабайта RAM или дори повече тези дни.
Но ако се разпределят просто в тази програма указател, указател,
тя може да изглежда като този на екрана, защото ние наистина трябва да кори обратно този слой.
Продължават да твърдят, стринг, но в понеделник, стринг е наистина Чар *,
адреса на някои характер.
Така че нека да вземем това колело обучение изключва, въпреки че ние ще продължим използване на GetString за сега.
Така че аз съм обявена, и това е парче от паметта, 32 бита.
Какво тук в памет по подразбиране? >> Чува студент отговор]
Какво е това? >> Студент Garbage. >> Garbage. Точно така.
Ако сте програмист не постави стойност в променлива, кой знае какво е то?
Понякога имаш късмет и това е 0, което е един вид на хубава и чиста стойност по подразбиране,
но както видяхме понеделник, понякога това е пълна глупост,
някои наистина голям положително или отрицателно число, което дойде от къде?
Да. >> [Ученик] функцията преди. >> Да.
>> Често функция, която се нарича преди, защото не забравяйте,
като ти се обадя функция в паметта, те заемат все повече място от долу на горе,
и веднага след като функцията връща получава използват повторно, че паметта
от следващия човек, който получава нарича, който използва същото парче от паметта.
Ако сте оставили боклука там, предишни стойности,
ние може да сбърка и като някаква стойност, когато наистина ние не са поставили нищо.
Така RAM ни в този момент изглежда така.
Сега от дясната страна на линия 7 се обаждате GetString,
които сме били прави за седмица, но това, което се GetString наистина правят?
GetString написана от CS50 персонал е малко по-интелигентен
че веднага след като потребителят стартира Пишещите клавиши и Хитове Въведете
GetString цифри, колко натискания на клавиши на потребителя хит,
колко знака трябва да се разпределят RAM.
И къде дойде този RAM, кой знае?
Това е някъде на вашия компютър 2 гигабайта или какво ли още не на паметта.
Но нека предположим, че компютърът намерили място за думата HELLO тук.
Думата написах е H-E-L-L-O.
И ако ние привличаме това като поредица от символи, бихме могли да го привлече по този начин.
Но аз трябва да направя 1 допълнително нещо. Какво принадлежи в края на всеки низ в C?
Нулевата характер, които пишем като \ 0.
Това е технически номер 0, но наклонена черта прави всичко ясно
че това е буквално номер 0, цяло число 0;
не е, например, цитирам цитата 0, които можете да въведете в клавиатурата.
Така че това е HELLO.
>> А какво да кажем в понеделник, че функция като GetString
всъщност е връщане на всички тези седмици?
Това не е връщане низ сама по себе си, защото това наистина не е по-точна
защото конците не съществуват. Те са вид производство в библиотеката CS50.
Какво наистина е низ, по-технически? >> [Ученик] Това е първият знак.
Точно така. Това е доста просто адреса на първия знак, че потребителят въвели инча
Така че, ако думата ми HELLO свършва до байт номер 123 и след това при байт номер 124,
125, 126 и т.н., ако аз просто броя на байтове ми от 0 нагоре,
това, което наистина GetString се връща, е буквално на номер 123.
Така че това, което се поставя в областта на науката, е номер 123, буквата H, а не думата HELLO,
просто адрес, на който мога да намеря първата буква на HELLO.
Но това не изглежда достатъчно. Попитах ви за низ, не е характер.
И така, как ние или компютър знае, че ELLO вид, заедно с H?
Какво е вид споразумение, което имаме? Да.
[Ученик] продължава да се казва да намерите повече символи. >> Точно така.
>> Има този човек-компютър конвенция, при която, когато се занимават със струни,
иначе известни сега като Чар звезди, просто трябва да разбера
края на всеки стринг в живота е наистина само итерации върху него за цикъла,
докато контур, каквото и да е, така че, когато се намери края на низа
сега можете да заключим от това, о, цялата дума е HELLO.
Онези от вас, преди опит в програмирането може да знае в Java
може просто да се обадя. дължина и на други езици можете да се обадите дължина или други подобни.
Това е така, защото в много езици, особено нещата, наречен обектно-ориентирани езици,
Дължината на нещо е вид на капсулирани вътрешността на част от самите данни,
като повечето капсулирани документи за самоличност и имена и къщи във вътрешността на един студент в понеделник.
Но C е много по-ниско ниво. Няма обекти или класове, ако сте чували тези условия, преди да.
Всичко, което трябва наистина е адреси от паметта.
Така че това е нещо по старомодния начин за представяне на интересни структури от данни.
Вие имате начална стойност като адрес на първия знак
и след това просто някаква произволна конвенция, която всеки е съгласен да се следват.
Е, как е низ дължина изпълнени, ние предлагаме?
Strlen, strlen, който някои от вас сега се използва няколко пъти. Това е доста проста, нали?
Това е като два реда код.
Това е доста много за верига от някакъв вид, може би с допълнителна локална променлива.
Но strlen просто трябва да вземе показалец и след това да започнете да търсите за \ 0.
>> И веднага след като той се намира, той може да се върне от общия брой на стъпките, които е предприела в този низ.
Така че можем да заключим от това какво се случва на следващия.
Да предположим, че след това заявявам тона, както съм направил в ред 10.
Това е някои боклук стойност. Кой знае най-напред?
Но от дясната страна на линията на 10 Обаждам GetString отново.
Кой знае къде завършва?
Да произволно казват, че операционната система стая за начина, по който тук.
Случайно се случи да въведете H-E-L-L-O отново,
и така може да се направи един и същи вид на картината.
Но фактът, че съм преначертани тази снимка е умишлено
защото това е различно HELLO от това.
Така че тук това може да бъде място 456, това е 457, и така нататък.
Така че това, което се поставя, когато веднъж въпросителен знак е?
В този случай 456.
Ние сме бране тези номера произволно, защото наистина след днешния ден
ние няма да се грижи толкова много за това, което е адреса на каквото и да било.
Всичко, от което се интересуваме е, че можем да разбера адреса на някаква част от данните като HELLO.
>> Така че наистина това, което правят повечето хора в областта на компютърните науки, когато говорим за адреси от паметта
и говори за указатели конкретно,
вместо да се притеснява, фигуриращ 123 - на кого му пука, когато тези неща всъщност е,
ние просто знаем, че е някои числени адрес -
опростяване на света и само да кажа, че и е насочена към този характер
и т е насочена към този характер.
А фактът, че това е една стрелка е съвсем умишлено
защото буквално сега и е насочена най-H и т е насочена в друга H
, защото в края на деня, не е от значение какъв е адреса,
но това няма значение, че имаме способността да изразиш този адрес с някаква част от кода.
Ние наистина не са манипулирани тези адреси още
така че ще видим къде можем да подхвърлям и някак да прави неща с указатели,
но за сега са в съответствие 12 буквално какви стойности се сравняват
в съответствие с тази история в линия 12?
Което казваш е 123 равен равна на 456? И това определено не е така.
И дори концептуално, този указател определено не е един и същ, тъй като това
защото сте се обадили GetString два пъти, а GetString не се опитва да бъде супер умен,
тя не се опитва да реализира, о, сте въвели HELLO 5 минути;
Нека ви дам същия показалеца, както Аз ви дадох преди,
просто заделя нова парче памет всеки път, когато го наричат.
>> И как ще решите този проблем?
Ако по-високо ниво, искам да се сравни струните Здравейте и HELLO -
Не ме интересува за указатели - как мога да отида за отговора на въпроса,
тип потребител на едно и също нещо? Какво е необходимо? Да.
[Ученик] Използвайте функция. >> Мога да използвам функция на кутията.
Мога да използвам функция, наречена strcmp, S-т-р-в-м-р,
само съкратения вариант каже низ сравнение.
И ако влезем в, например, да сравните 2, който е сред подаяния днес,
Аз правя точно това.
Държах всичко останало същото от ред 1 до 26, или така,
и сега забележите, тази част се е променил само малко.
Да се ​​игнорира линия 28 за момент и да се съсредоточи само върху това.
Какво да кажем понеделник, че ул. сравнения?
Той се справя с процеса на вземане на 2 указатели, и т в този случай,
вид на почти си пръст на тези две писма,
и това, което трябва да направите, е нещо като докато линия или за цикъл,
и то се казва, са тези едни и същи? Ако е така, тя се движи пръстите или указатели напред.
Това ли са едни и същи, те едни и същи, тези същите,
тези същите, те по същия начин? Ооо, аз съм в края на низа в а и т.
Аз не намерих никакви противоречия. Да, тези струни са едни и същи.
И какво ул. сравнение връщане, ако две струни са едни и същи, очевидно? Zero.
Така че 0 е добре в този случай, защото ако го връща -1 или +1,
това означава, че просто се случва да дойде преди тона по азбучен ред или след тон.
И защо, че ще бъде полезно да има функция, която ви казва кои низ идва преди
или след като в речник?
[Ученик] търсене. >> Търсене и сортиране.
>> Така че можете да направите неща, като двоично търсене или вид балон или да се слеят вид
, където трябва да се сравняват нещата.
До този момент ние сме вид на намаляване на някои ъгли и само говори за сортиране
в контекста на номера, защото това е хубаво и лесно да се говори,
но със сигурност може да се сравни струни, ябълка и банан,
защото ако ябълка е известно да дойде преди банан, подобно
може да се придвижвате струни из паметта точно като Роб с вид сливане във видеото
и ние направихме тук на сцената с вид на селекция, сортиране вмъкване и сортиране на балон.
Така че къде другаде можем да вземем това? Нека опитаме това.
Вид Нека на забравяме, че урок за момент и да се опитаме и копие 1.в да направите следното.
В съответствие 21 искам да кажа нещо за печат
тогава аз съм се низ от потребителя,
тогава аз съм проверка.
Ние наистина не са придобили в този навик още, но нека сега направим това.
Нека всъщност да свали този слой. Това е наистина Чар *. Този човек е наистина Чар *.
И така, какво означава да се проверява, ако == NULL?
Оказва се, че когато ти се обадя функция като GetString
или по-общо просто попитайте компютър, за да ви даде някакъв спомен,
нещо може да се обърка.
Вие може да бъде луд и да поиска от компютър за един терабайт памет
молба за трилиони байта памет, които просто не съществуват в компютъра,
но GetString и други функции трябва по някакъв начин крещи на вас
Ако сте поискали твърде много.
И начина, по който GetString прави това е, ако сте помолили за повече памет
отколкото е налична в компютъра, дори ако това е супер, супер малка вероятност
защото никой от нас не ще да въведете един трилион знака и след това натиснете Enter,
но малка вероятност, че тя може да бъде, аз все още искате да проверите за него само в случай,
и специална стойност GetString, отговор и други функции връща
ако нещо не е наред, е NULL във всички капачки.
>> И това, което е NULL? NULL просто така се случва да представляват показалеца. Това е памет адрес 0.
В света реши, че произволно, ако това е паметта на компютъра ми - знаете ли какво? -
отива да открадне само 1 байт от паметта на всеки компютър, а това е място 0.
Отиваме да го дадете псевдоним на NULL, и отиваме да обещае
, че ние никога няма да вложи реални данни има
защото ние просто произволно се нуждаят от специална стойност 0, известен още като NULL,
така че можем да крещи на потребителите, ако нещо се обърка.
В противен случай може би не знаете е 0 означава, сложи нещо тук
или значи нещо се е объркало?
Имаме всички са съгласни, че NULL нищо средство е върнато,
не е върнат настоящ адрес.
Сега, тук аз съм просто приемането на човешката ми Конвенцията от I върне един от главния
ако нещо се обърка.
Това е така, защото основната връщането конвенция е да се върне 0, ако е добър,
1 или някаква друга стойност, ако лошо.
Но GetString и всяка функция, която се занимава в паметта се връща NULL, ако има нещо лошо.
>> Добре. Така че, за съжаление, ред 27, супер проста, въпреки че е напълно не успява да копирате низ.
Защо? Можем да видим това, както следва.
Аз съм като твърди по линия 27 да се направи копие на S и го наричат ​​тон.
Така че аз не искам на потребителя за две струни този път, аз съм просто казвам стойност в S
трябва да бъдат поставени в тона, както добре.
Така че сега просто да демонстрира как това е счупен, в съответствие 29 нататък какво правя аз?
Първо аз съм проверка дали дължината на тон е по-голяма от 0.
Има някои низ там. Потребителят написали нещо инча
Какво е линия 32, очевидно?
[Чува отговор студент] >> десния. Вид Можете да го заключим от това, което каза, че прави.
Но технически, какво е това? [0] какво представлява?
[Ученик] zeroth характер. >> [Малан] характер zeroth.
Или, по-човешки като първия знак в тона, каквото и да е, H може би в този случай.
И toupper прави това, което казва. Той капитализира на zeroth характер на тон и го променя.
Така че това означава вземе zeroth характер на тон, да я направи главна,
и той се връща в това същото място.
Така че, ако напишете просто 'Здравей' с малки букви, това трябва да се промени малката часа до столицата H.
Но проблемът е, че в линиите 35 и 36, което аз съм на път да направя е да изписва за нас и т.
И какво е интуицията си?
Какво всъщност се случва да видя дали мога въвели в здравей във всички малки?
Какво се случва, за да отпечатат? >> Чува студент отговор] >> Какво е това?
[Ученик] Big H и останалите малки. >> Големият H и останалите малки, за които или тон?
[Ученик] Както. >> Двете. Точно така. Така че нека да видим какво става тук.
>> Нека вървим напред и събират. Това е copy1, така че се copy1. Добре.
Zoom инча Нека отида напред и да работи copy1, Enter, кажи нещо: Здравейте малки.
Главна копие, но той очевидно главна оригинала, както и,
защото това, което сега се случва в тази история?
В ред 27 аз всъщност не изглежда да се копиране на низ,
но въпреки че може да са интуитивно се надява, че това е така,
ако мислите за тази картина, това, което наистина съм направил?
Половината от картинката е същата.
Така че нека да се връщам във времето, така че не все още не съществува в историята.
S може да съществува в историята, но нека малки здравей това време.
Така че нека да се определи какво всъщност въвели инча
В този случай имаме з-д-л-л-о.
Ние ще го привлече като поредица от символи, сложи ми разделителни линии тук и ми \ 0.
Така че това е мястото, където ние сме веднага след като линия 1 през 24-Иш, или да даде, да е изпълнил.
Това е картината на паметта ми.
Когато стигна до ред 27, какво се случва?
Точно както преди, аз се указател, който ще привлече като този площад.
Тя се нарича тон. И каква е стойността му по подразбиране? Кой знае? Някои боклук стойност.
>> Така че аз ще абстрактно, че като въпросителен знак.
И веднага след като дясната страна на линията 27 изпълнява, какво съм пускането вътрешността на тона?
Същото нещо, което е в областта на науката.
Така че, ако за момент се премахне тази абстракция на стрелката и да кажем,
О, това е адрес от паметта натоварване 123, когато ви казват, т получава, точка и запетая,
сте буквално пускането 123.
Сега, ако ни се опрости нашия свят отново с картини,
това, което наистина сте готови просто добавя друга стрела във вашия свят
, която е насочена от тона на точно същата низ.
Така че, когато в линия 31 и 32 всъщност за промяна на тона [0],
какво е т [0] очевидно синоним сега? [0]
Така че това е всичко, което се случва.
И въпреки, че този вид чувства малко по-ниско ниво и тайнствена
и този вид се чувства като може би интуитивно това трябва просто да работи -
Съм направил копия на неща преди и той просто работи -
ако действително мислят за това, което наистина е низ, това е знак *.
Е, какво е това? Това е адресът на някои характер.
Тогава може би има повече смисъл, че когато се опитате да направите нещо
супер изглежда просто като това, всичко, което правите, е да копирате адреса от паметта.
Ти всъщност не си правите нищо със самия низ.
Така че, дори ако вие нямате представа как ще решим този проблем в кода,
високо ниво, концептуално, това, което ние трябва да направим, за да направи ТП "Вярно с оригинала" на S, очевидно?
Да. >> [Ученик] Дай го на ново място? >> Точно така.
>> Ние трябва да даваме тон чисто ново място.
Ние трябва по някакъв начин да се създаде свят, в който ние получаваме ново парче на паметта,
които само за голяма яснота ще изготви точно под тази, но тя не трябва да бъде там.
Но той трябва да бъде със същия размер, така че аз ще изготвят тези вертикални линии в едно и също място.
Това е добре, ако всичко това е боклук първоначално. Кой знае какво е там?
Но стъпка 1 ще трябва да ми се даде повече памет, тъй като имам нужда
да се поберат копие от здравей, а след това да разбера как да копирате часа тук, на електронната тук,
л тук и така нататък.
Но това вече трябва да се чувстват малко очевидно, дори и ако някои от детайлите все още са абстрактни.
За да копирате този низ в това, това е просто за линия или цикъл, докато
или нещо, с което сте станали по-запознати.
Така че нека опитаме това. Нека отида в copy2.c.
В copy2.c имаме почти същата програма с изключение на ред 27.
Той изглежда малко сложна, но ако ние го съборят парче по парче,
лявата страна е същото.
Чар * т създава това нещо в паметта, макар и с въпросителен знак
защото ние нямаме идея какво е там по подразбиране.
От дясната страна ние сме вече въведе нова функция, изчистване,
за паметта разпределят, дай ми памет,
и той очевидно колко аргументи, колко много неща в скобите?
Чух роптанията на 1 и 2, но това е само едно.
Има няма запетая, което означава, че има само 1 нещо вътре в скобите.
Въпреки че има и други скоби, позволете ми да се подчертае
това, което е вътре в най-отдалечените скоби, и това е този израз:
(Strlen (а) + 1) * sizeof (Чар).
Така че, ако ние всъщност мисля, че това чрез това се казва, дайте ми дължината на S.
Защо съм, все пак, добавяйки едно върху дължината? >> Чува студент отговор]
Точно така. Имаме нужда от място за този човек на опашката, шести знак, който не е английски значение
но няма специален програмен смисъла.
>> Така че ние се нуждаем от + 1 за това, защото strlen връща човешко очакване на дължина,
здравей или 5, той не ви даде допълнителен герой за нищожно.
Така че аз добавите ръчно с + 1.
И тогава този, * размер на (Чар), ние не са виждали преди.
Това не е технически функция.
Това е специална ключова дума, която току-що ви казва каква е големината на някакъв тип данни на компютър
защото в действителност, някои от нас имат 32-битови компютри.
Имам доста стар компютър у дома, и да го използва само 32 бита да представляват указатели.
И така, ако аз го направих размера на тип данни, може да е 32 бита.
Но ако аз съм с новата ми фантазия компютър, мога да се върна на стойност 64 бита
нещо като адрес.
Така че в този случай, просто да бъде супер сейф, ние не отиваме на твърдия код нещо подобно -
добре, какъв е размерът на знак в съответствие с това, което казах досега?
Ние сме почти казали с думи, че това е 1 байт, а това е почти вярно повсеместно.
Но отново, предположенията са склонни да бъде лошо.
Те водят до бъгав софтуер, ако хората използват софтуера си по начини, които не възнамеряват.
Така че нека абстрактно това, а просто по-родово каже
Имам нужда от толкова много парчета на паметта
и всяко парче на паметта трябва да бъде равна на размера на герой,
което е всъщност е равна на 1 в този случай, но това е по-общ начин от него писмено.
Така че, ако думата е здравей, колко байта изчистване очевидно разпредели за здравей?
[Ученик] Six. >> Six. Точно толкова, колкото имаме въпросителни знаци на екрана.
И след това да вземе Предполагам, че сега на базата на вашето разбиране за GetString
какво означава изчистване сигурно ще се върне? >> [Ученик] адрес.
Адрес на какво? От първото парче на паметта.
>> Ние нямаме представа какво е там, защото някои други функции
би могъл да използва тази памет по-рано.
Но изчистване, като GetString, връща адреса на първия байт от паметта
, че е заделил за вас.
Въпреки това, това, което не прави е да попълните това поле празно с характер наклонена черта нула
защото се оказва, можете да използвате изчистване да се разпределят всичко: интеджър, низове, масиви,
поплавъци, студентски структури.
Можете да използвате изчистване напълно генерични.
Тя не се интересува или трябва да знаете какво разпределяне на памет за.
Така че би било нахално за изчистване, за да се сложи \ 0
в края на всяко парче от паметта ви дава
защото това \ 0 е само спогодба за струни.
Тя не е използван за цели числа, той не е използван за плувки, той не е използван за студенти.
И така, нещо, за което с изчистване е, че тежестта е изцяло от вас програмист
да си спомня колко байта разпределени, а не някога да се използва за контур
или докато линия и покрай границата на парче памет сте били дадени.
Казано по друг начин, тъй като веднага след като се заделя памет,
не може да поиска от операционната система, о, между другото, колко голямо парче от паметта е това?
Това е изцяло от вас да си спомни дали имате нужда от тази стойност.
>> Така че нека да видим как да продължа да се използва тази памет.
В линии 28 и 29 защо правя това?
Просто проверка здрав разум.
Само в случай, че нещо се обърка, аз питам за някои луди размера на паметта
или съм толкова много неща, инсталиран на компютъра, че там просто не е достатъчно памет,
нещо подобно, аз най-малко искате да проверите за нищожна.
В действителност, повечето компютри ще ви даде илюзията, че всяка програма
да използвате цялост на вашия RAM,
но дори и така, когато потребителят видове в някои луди дълъг низ може би, защото те са лош човек
и те всъщност се опитва да срине вашата програма или проникна в нея,
искате най-малко проверка на връщаната стойност от изчистване и дали то се равнява на нула.
И ако е така, нека просто да се откажат точно сега, защото аз не знам какво да правя в този случай.
Как мога да копирам низ? Има няколко начина да направите това.
Има ул. копирате функции в C, но е супер лесно за нас да го направим по старомодния начин.
>> Първо, позволете ми да разбера какво и е с дължина.
Можех да в течение, но вместо това просто да го постави тук за по-голяма яснота.
Така н съхранява дължината на първоначалния низ, който изглежда е 5.
След това за моята линия съм итерации от 0 до N,
и на всяка итерация Слагам [] вътрешността на тон [I].
Така че това е, което аз подразбиращи се с моите две пръсти, сочещи към струните преди.
Тъй като това за цикъла повтаря по този начин, аз отивам да се копиране ч в тук,
Е в тук, аз до тук, защото това е, това е тон.
И после накрая, в 35, защо правя това?
Трябва да съм сигурен, че аз съм се сложи край на низ тон.
И аз го направих по този начин да бъде супер изрично.
Но предложи някой, ако може, друг начин за това.
Аз наистина не се нуждаят от линия 35. Има и друг начин да направите това.
Да. >> Чува студент отговор] >> Кажи го силно.
[Ученик] По-малко или равно на. >> Точно така.
Ние може просто да се каже, по-малка или равна на N, което по принцип е лошо
защото почти винаги, когато отидем до равен на нещо, което ние броим
отиваме 1 стъпка твърде далеч.
Не забравяйте обаче, колко байта се разпределят?
Разпределени strlen ите, така че 5 + 1 за общо 6.
Така че в този случай бихме могли да направим нещо подобно
, така че ние сме копиране не само на здравей, но също така \ 0 в самия край.
Освен това, бихме могли да използвате функция, наречена ул. копие, strcpy,
но това не би било почти толкова забавно.
Но това е всичко, което прави под капака.
Тогава накрая, ние правим същото, както преди.
Да се ​​възползва тон и след това аз твърдя, че оригинала изглежда това и копието изглежда, че.
Така че нека се опитаме сега. Нека тук. Направете copy2. Ще се увеличат и тичам copy2.
Отивам да въведете Здравейте малки, и наистина малки здравей като оригинала
но капитал Здравейте за копието.
Но аз не съм направил, просто все още. Аз трябва да направя 1 последното нещо, което тук.
46 и 47 е ясно освобождава памет, но какво всъщност означава?
Какво правя, смятате ли, като се обадите на линията 46 и линия 47?
Какво влияние оказва, че има? Да.
[Чува студент отговор] >> Точно така.
>> Вие просто казва на операционната система, хей, благодаря за тази памет.
Сега можете да я използвате за някой друг.
И тук е идеален пример за смет стойности.
Току-що използва тази памет да напише думата здравей две места,
тук, тук, тук и тук.
Така че това е з-е-л-л-о-\ 0.
Но тогава аз наричам линия 46 и линия 47, и вие знаете какво се случва там по отношение на картината?
Всъщност, чакай, тази снимка е старият.
След като направи копие, този човек всъщност е насочена тук,
така че нека да премахнете номера и просто абстрактно, тъй като нашите стрели отново.
Какво се случва в тази картина, когато се обаждате безплатно?
[Чува отговор студент >> Не е дори.
Ако аз наричам безплатно и тон - вид е подвеждащ въпрос - тази картина не се променя изобщо
защото се обадите и призовава просто казва на операционната система,
хей, можете да използвате тази памет отново, но това не променя това на нула
или някакъв специален символ, той не се променя това,
това не променя часа или електронна или L или L или о или място за нищо друго.
По отношение на картината, веднага след като се обаждате безплатно, нищо не се променя.
И точно тук се крие произхода за смет стойности, защото, ако след това по-късно в тази програма
поиска от операционната система за повече памет с GetString или изчистване или нещо подобно, че
и операционната система се казва, разбира се, аз имам 12 байта памет, току-що освободени,
използвате това, какво ще бъде предаден?
Вие ще трябва да се подаде парче на паметта, която бихме обикновено се изготвя
с въпросителни знаци, но какви са тези въпросителни знаци?
Те се случи да бъде з-д-л-л-о, з-д-л-л-о.
Това са нашите нови стойности за боклук веднага след като се освободи тази памет.
>> Тук има реално отражение върху света.
Това се случва, да се направи с RAM, но вашите компютри
всъщност правят едно и също нещо с диск.
Ще говорим за това по-специално с бъдещ проблем, който се фокусира върху криминалистите.
Но какво всъщност се случва, ако имате някаква чувствителна финансова файла на вашия работен плот
или някаква бегла JPEG и го плъзнете в кошчето
какво се случва, когато го плъзнете в кошчето или в кошчето?
Ти знаеше за какво говоря. [Смях]
Какво се случва, когато сте влачат тези доказателства в кошчето или кофа за боклук?
[Чува студент отговор]
Е, толкова предпазлива. Какво се случва, когато правиш така?
Краткият отговор е нищо, нали?
Sketchy или чувствителни файл е все още само седи там някъде в твърдия ви диск.
Повечето от нас поне да научи по трудния начин, че трябва да изпразните кошчето
или кошче за изтриване на файлове.
И наистина, когато кликнете с десния бутон на мишката или контрол, кликнете върху вашия боклук може да
или изберете File (Файл), Empty Trash или каквото
и всъщност изпразните кошчето за боклук или кошчето, какво всъщност се случва след това на тази картина?
Повече нищо. Така че нищо не се случва в действителност на диска.
>> И ако ние просто временно да се отклоня и да пишат - Ще просто използвайте гърба на този.
Така че сега историята се променя от RAM, която е мястото, където съществуват програми
докато ги изпълнява, на диск, който е мястото, където те се съхраняват в дългосрочен план
дори когато захранването излиза, за сега и ние ще се върнем към това в бъдеще -
нека просто да се преструваме, че това представлява вътрешността на твърдия диск на вашия компютър
защото в деня, в който да бъде използван циркулярни дискове, подобно на дискети.
Така че, ако имате някои чувствителни файл на Excel, може да отнеме това парче на паметта
диск на вашия компютър, и аз съм просто изготвяне същия произволна 1s и 0s.
Когато плъзнете файл, като това в кошчето ви или кошчето,
буквално нищо не се случва, защото Apple и Microsoft току-що реши
кофа за боклук и кошчето наистина е само временно контейнер.
Може би в крайна сметка OS ще го изпразни за вас, но обикновено, тя не прави нищо,
поне докато сте наистина ниски пространство.
>> Въпреки това, когато отидеш да изпразните кошчето или празни кошчето,
по същия начин, нищо не се случва на тази картина.
Всичко, което се случва, е някъде другаде на вашия компютър, има някакъв вид на таблица.
Това е нещо като малък лист измама, която казва, че, да речем, resume.doc,
така че вашето резюме в Microsoft Word файл, свикнал да живея на място 123 на вашия твърд диск,
не в паметта, а не в RAM, но на твърдия ви диск,
и схематични живота JPEG 456, и Excel файлове живее на 789 или там, където
Когато изтривате файлове от изпразване на кошчето или в кошчето,
тази картина не се променя. 0s и 1s на вашия твърд диск, не ходи никъде.
Но тази таблица, тази малка база данни на видове, не се променя.
При изтриване на автобиографията си, това е все едно, че файлът е изтрит в известен смисъл,
но всички на компютъра се забравя, когато това нещо живее на вашия твърд диск.
0s и 1s, че съставяте автобиографията си или някой от тези файлове са все още непокътнати.
>> Така че, ако си направил това случайно, все още има ненулева вероятност
че да можете да възстановите данните си, като използвате Norton Utilities или някакъв комерсиален софтуер
цел, чиято в живота е да се намери 0s и 1s, които са вид сираци,
забравена тук, но остави тук, така че можете да получите данните си обратно.
Или съдебни следователи с полицията или ФБР всъщност ще вземе твърд диск
и действително изглежда за модели на 0s и 1s, че прилича на JPEG, изглежда Excel файлове,
и да ги възстанови по този начин, дори ако компютърът ги е забравил там.
Така че единственият начин наистина да изтрие данни, тъй като ние ще обсъдим в бъдеще,
е да търкат или избършете файл или твърд диск от -
Вие наистина не може да се отърве на 0s и 1s
защото в противен случай ще започне с един гигабайт твърд диск
и ти ще свърши, с един мегабайт твърд диск, ако постоянно са изтриване,
буквално 0s и 1s.
И така, какво бихте направили, ако наистина искате да покрие песните си
и основният проблем е, че има все още 0s и 1s на диска?
Виждам някой, който жестикулираше, че ще прекъсне физически устройството. Това ще работи.
[Смях] Но ако това е вид скъпо решение, какво би било по-разумно?
Да. >> Студент ги замените. >> Ги замените с какво? >> [Ученик] Други данни.
Други данни. Можете да замените вашия диск с 0s 1s или всички 0s, всички 1s.
>> И това е наистина това, което някои от софтуера прави.
Можете да си купите софтуер или дори да получите безплатен софтуер,
и дори построен в Mac OS тези дни, но не толкова в Windows
е способността да изтрие сигурно.
Всъщност, ако искате да всички хоумрън днес, ако имате Mac и да направите това,
ако имаш някои неща в кошчето, можете да направите Secure Empty Trash
което прави точно това.
Вместо само изтрива файлове тук, то не изтрива 0s и 1s тук,
Вместо това, тя просто променя всички тях, например, да 0s и точка, точка, точка.
Така че една на бъдещите си psets ще бъдат реално умишлено възстановяване на данни -
снимки, които ние сме взели на хора, места и неща, на територията на колежа
, за които ние ще направим съдебномедицински образ на картата с памет, цифров фотоапарат,
което е точно същата идея - и вие ще трябва да бъдат изправени пред предизвикателството да намерят
модели, които представляват JPEG файлове на вашия хард диск,
много подобен на този бивш ученик, чийто имейл прочетох преди няколко седмици
да се възстанови снимки на сестра си.
Защо не вземем 5-минутна почивка тук, и ние ще се прегрупират с повече от обема на паметта.
Така че тук е мястото, където нещата стават малко оказващ влияние, но това е много мощна стъпка
към разбирането на всичко това повече.
Ето програма, наречена pointers.c.
Тя е сред примерен код днес.
Забележете, че в първите няколко реда, 19 до 22, всичко, което правим, е нещо като GetString
и връщане на един адрес, да го приберете в областта на науката.
Отсега нататък за pset дори три, ако искате но pset 4 и на
, където можете да започнете да приемате тези обучения колелата себе си,
няма причина да се преструвам, че струните съществува вече.
Това със сигурност е добре да се започне да се Чар *.
>> Като настрана, в онлайн препратки и в книгите често може да видите звезда до променливата.
Може би дори пространствата около двете му страни.
Всички, които са функционално правилно.
За сега, обаче, ние ще стандартизиране на този подход да се направи супер ясно
че Чар * е като да кажеш, характер показалеца.
Това е тип данни.
И след това името на променливата и в този случай.
Така че ние сме придобили низ и ние сме го наричат ​​и.
И тогава тук забележите, че правя малко хитрост.
Това се нарича показалеца аритметика, която е нещо супер проста.
Това просто означава, събира и изважда номера на указатели.
Но това всъщност работи.
Тази програма изглежда отпечатва 1 характера на низ на линия такава, че крайният резултат -
Само така можем да развали когато това се случва, да указатели, стартирайте указатели, нека ми я увеличите инча
Сега ме пусне тип в нещо като HELLO и вида Enter
и го отпечатва един характер на линия.
До преди секунда, щеше да направи това с квадратна скоба нотация.
Ще имаме за цикъл и ние ще направим ФОРМАТ на S [I] и ние ще го направим отново и отново и отново
с наклонена черта N в края на всеки ред.
Но тази програма е различна. Тази програма се използва, буквално, аритметика.
И така, какво става тук?
На първо място, преди този цикъл дори изпълнява, какво, само да е ясно, е всъщност?
S? >> [Ученик] адрес. >> Адрес.
>> И това е адресът на първия знак, в случай на Здравейте, в тази дума, която е ч.
Така е, в този конкретен пример, адрес на з.
И така, какво означава да го направим +?
Е, аз започва от 0 в тази линия. Ние сме направили, че много пъти.
Аз ще отида до дължината на низа, очевидно.
Така на първата итерация на този цикъл, аз очевидно е 0.
Така че този израз се казва + I - по-скоро, +0-, че е очевидно просто е.
Така че това, което е * е тук?
Сега ние използваме звездата в малко по-различен начин.
Позволете ми да отида напред и да се отървете от тон, защото сме готови да говорим за тона и копия от S.
Сега ние просто искаме да разкажа една история, включващи и.
И така, в този момент, след като тип низ, нашият свят изглежда съвсем като преди
само с и съхраняване на адреса на час и по-общо посочи низ Здравейте.
Ако аз сега направете линия като * (S + I), нека опитаме това.
Така * (+ I). Позволете ми да се опрости тази процедура, защото това е 0, така че това е * (0).
Е, чакай малко. Допълнително опростяване. Това е * (а).
Е, сега скоби са много глупаво, така че нека сега просто правя * S.
Така в първата итерация на тази линия, тази линия, която се откроява, 26,
е почти еквивалентна на печата на тази.
Какъв е типът данни * е?
В този контекст, защото звездата се случва да бъде до себе си и,
но по-специално, защото ние вече не се обявява,
ние не сме създаване на променлива вече, няма споменаване на Чар * в ред 26,
има не споменава дума низ, ние сме само с помощта на променлива, наречена S,
Оказва се, сега звездата има малко по-различен и, разбира се, обърквайки смисъла.
* Е тук означава, отидете на адрес и печат, каквото и да е там.
Така че и тук, и е нещо като Улеи и стълби, следвайте стрелката - тук.
Така че това е * а.
>> Така че това, което се отпечатва върху първата итерация на тази линия в линия 26?
Печатам% C, която е контейнер за герой,
\ N за нова железопътна линия. * (+ I), където 0 е само това.
Така че това, което Чар мога да поставя в% в? H.
В следващата итерация на цикъла - вероятно можете да видите, когато това се случва -
следващата итерация е очевидно едно, така че това означава и една,
и след това сега трябва скобите, защото сега звездата трябва да каже
отидете на адреса в паметта и една.
Какво е? Да се ​​връщам във времето и да каже тази стрелка сега не е всъщност ни прави някакви услуги.
Нека по-конкретно да се каже, че това е съхраняване на номер 123
, тъй като началото на тази струна Здравейте, Това е адрес 123, това е 124, и така нататък.
Така на втората итерация, когато аз казвам, е един, това е като да кажеш, сто двайсет и три един милион,
иначе известни като 124, така че това, което се отпечатва на втората итерация Чар?
Е в памет адрес 124.
Тогава + отново, 125, 126, 127, и този цикъл за щастие спира, преди да стигнем тук
защото аз съм с strlen да се уверите, че аз не се брои твърде висока.
Така че твърде е то.
Отново, това е точно както, когато беше направил преди седмица.
Нека го напиша на линия по-долу, въпреки че ние не искаме да правим и двете.
Това вече е идентично с това.
>> Така че, макар и е низ, както сме го призовават за седмица, и наистина е знак *.
Така че, ако искаме да бъде супер анален, наистина е правилно да се напише специфичен характер
ItH място, използването на тези цифровите адреси и тази звезда оператор,
но честно казано, това е толкова много чисти. Така че това не е лошо.
Няма причина да спрем да правим ред 27, но 26 е функционално същото,
и това е функционално същото точно причините, поради които ние обсъждаме този момент.
И накрая, 29 е просто добра практика.
Разговори безплатно и означава, че сега сте като паметта че GetString ти даде
защото отново, както споменах понеделник, GetString за седмица
е въвеждането на бъг в кода си.
Код за седмица е имало изтичане на памет
която сте били питам GetString за паметта, но никога не сте го върнат.
И това е съзнателно избран от нас педагогически
защото това е просто твърде много да се мисли за началото на деня.
Но сега имаме нужда от по-добра симетрия.
Ако попитате компютър за паметта, както е делото за GetString,
както е в случая очевидно за изчистване,
Сега трябва да за pset 4 нататък също такава памет.
Забележете, това е различно от това да кажа INT N.
Вие не трябва да освободите това, защото не се обади GetString
и не се обади изчистване.
>> И дори ако сте се обадили GetInt, тъй като в крайна сметка ние ще видим,
GetInt не заделя памет за вас, защото всъщност можете да преминават около числа
и поплавъци и символа само начина, по който ние сме били прави в продължение на седмици.
Strings, обаче, са специални, защото наистина те са конкатенация на няколко символа.
Така че те са просто различни от символа и плавници и интеджър и други подобни.
Но ние ще се върнем, че не след дълго.
Всички въпроси по този началото на указатели? Да.
[Чува студент въпрос]
Ах, много добър въпрос.
Едно от малкото неща, C всъщност се прави за вас, което е удобно,
се разбира каква е големината на типа данни
и след това прави този вид на размножаване за вас.
Това е без значение в случая от символи, тъй като почти винаги Чар е 1 байт,
така че това просто работи.
Но в името на дискусията, ако са били действително печат числа
и вие се опитвате да печатате някаква стойност, която сочеше цяло число,
също не би трябвало да направи + 4 * само защото число е 4 байта.
Pointer аритметика означава, че C и компилатор, че математиката за вас.
Всичко, което трябва да се грижи за преброяването в нещо на човешкия смисъл. Да.
[Ученик] Ако декларирате низ вътре за цикъл, не трябва да го освободи по-късно?
Добър въпрос.
>> Ако обявен за низ вътрешността на линия за, ще трябва да го освободи по-късно?
Трябва само да освободите памет, които разпределят с GetString или с изчистване.
Така че, ако просто кажете нещо подобно - нека ме фигурни скоби, така че всички код е свързано.
Ако си направил нещо, макар и buggily, като този, Чар * т =
не е нужно безплатни тон, защото не става дума за всяко споменаване на изчистване или GetString.
Ако за разлика от това, GetString, тогава да, ще трябва да се безплатни тон.
И в действителност, единственият ви шанс да направите това е вътре в този цикъл, за същия брой на обхвата
че сме обсъждали в миналото.
В противен случай ще бъде разпределяне на памет, заделянето на памет, заделянето на памет,
и в края на програмата, защото сте извън тази линия,
т не съществува, но никога не е казвал операционна система
, че вече не се нуждае от този спомен.
И не след дълго, за pset 4 или 5 ще ви снабди с програма, наречена Valgrind
която е подобна по дух GDB в това, че има известна степен на тайнствена интерфейс,
но своята цел в живота е да ви помогне.
И Valgrind е програма, която в бъдеще ще търсите програми
търси изтичане на памет, независимо дали от GetString или изчистване,
които ние ще започнете да използвате толкова повече, колкото ние спрете да използвате CS50 библиотеката, както много.
Ние най-накрая има нещо от речника и вид мисловен модел на теория
, с която да се реши този счупен програма.
>> Така че в този счупен програма, суап работи вътрешността на суап
но всъщност той никога не е работил в основната защото основният приет през X и Y, изземване,
и тези, които бяха приети в от ценности, така да се каже.
Копия от тях са били дадени, за да се разменят.
До края на суапа, а и б, наистина е бил подменен,
но разбира X и Y, както говорихме в понеделник, не са били.
Така че аз предлагам в зелено тук, че това е всъщност решение тук.
И всъщност, нека да си мърдам звезди само за да бъде в съответствие
въпреки че, отново, функционално това не е от значение.
В бъдеще седмица ще обясним кога и защо това има значение.
Така в зелено в момента е решение.
Честно казано, това изглежда много мръсно, защото имам всички тези звезди.
Нека отбележа едно нещо.
Най-горният ред тук, където се казва, вътр * а и вътр * б
е фундаментално прави едно и също нещо, тъй като винаги има.
Декларира 2 аргументи и параметри, за да сменяте
първото от които е INT показалеца нарича
вторият от които е INT показалеца, наречено "б".
Единственото нещо, което е ново в този момент е фактът, че там има звезда.
>> Какво означава това? А не е едно цяло число, б не е вътр.
А е адресът на вътр и б е адресът на различни вътр.
Тук, това е мястото, където Признавам В получава объркващо.
Сега с помощта на звезда, но има различно значение в този контекст.
Защото не сме деклариране на указатели, тъй като ние сме тук,
ние сме тук, dereferencing неща.
Така че технически, звездата в този контекст на първа, втора и трета линия вътрешността на суап
е сочен оператор, което просто означава, отидете там.
Така че просто ми пръст следваше стрелката ч,
* Средство отидете на този адрес и да ме намерите вътр, че е там.
* Б средства отидете на адреса и да ми мине, какво е там.
Така че нека да преначертае картината от понеделник с помощта на купчина рамки,
долната един от които ще бъде основната,
горната част на един от които ще бъде суап,
така, че нашият свят изглежда, точно като понеделник, като този.
Ето парче от паметта, че основната ще се използват.
>> Спомнете си как в понеделник, че програмата има две променливи,
една, наречена Х и една, наречена г., а аз бях поставен номера 1 и 2 има.
Сега, когато аз наричам суап като аз го направих в понеделник,
по-рано, когато се използва червената версия на тази програма, която прилича на това,
Имам две параметри, А и Б, и какво пишете тук и тук?
Само 1 и 2, буквално копира на х и у.
Днес ние променяме това.
Днес, вместо да преминава в цели числа А и Б, че ще премине в два адреса.
Тези адреси се случи да се отбележи цели числа, но тези адреси не се интеджър.
Те са адреси. Това е като пощенски адрес.
Така че сега ние трябва просто да се даде малко по-подробно на екрана.
Това е моя компютър с памет, както това е било през целия ден.
Сега имаме нужда от произволна схемата за номериране.
Така че нека просто кажем, просто случайно, че това е адресът в паметта 123, 124.
Нека просто кажем, че това е 125, това е 126, и т.н., но това е напълно произволно.
Ние просто трябва някои схемата в паметта ми.
Така че сега, когато аз всъщност преминават в х и у, аз не отивам да премине в х и у;
Отивам да премине в пощенския адрес, така да се каже, на х и на у
, така че това, което се съхраняват тук и тук не е един и два,
но ако можете да видите моята малка текст, това, което се премина тук и тук?
[Чува студент отговор] >> Точно така. 123 получава тук и 124 получава слагам тук.
>> Сега, тъй като се използва звездата в тази първа линия чак тук на върха,
моята програма просто знае, че 123 и 124, въпреки че те очевидно са числа
, че всеки човек може да забележи, те трябва да се тълкува като адреси, цифровите адреси.
Те не са сами по себе си цели числа, те са адреси,
и това е така, защото аз изрично са звездите там.
Така че сега в моя първа, втора и трета линия на действителният код, какво се случва тук?
Нека да привлекат останалата част от картината.
ПТУ е точно както беше и в понеделник. Нищо особено за малки.
Той е само на местни 32 бита променлива, и вътре, че аз съм очевидно съхраняване на стойността на един.
Сега, ако току-що каза TMP = а, какво ще слагам тук? >> [Ученик] 123.
123. Но това не е това, което правя.
Казвам TMP = * а. Star средства отиват там.
Така че тук е 123. Как да отида там? Преструваме, че има стрелка.
Е, там е едно. Така че това, което се съхранява в ПТУ, очевидно? Само 1.
С други думи, TMP е *, * средство отидете на адреса, на който в момента е в
който изглежда е 123.
>> Добре, ние сме тук на място 123, виждам, номер 1,
така че аз отивам там да се сложи номер 1.
Сега какво да правя в съответствие два, а = * б?
Това е малко по-ангажирани, защото сега какво е? Това е 123.
Така че * е къде? Точно там, където бях преди. Така че отивам там. Добре.
Сега, накрая, и накрая това ще започне да има смисъл, да се надяваме,
* Б означава това, което е в б? 124. Така че аз трябва да отида там, което е с 2.
И така, какво да сложа къде?
2 отива в тук, защото отива в * а * б. Така че аз ще го направя.
И вече можете да видите, може би, че ние сме много по-близо
за решаването на този глупав, прост проблем правилно за първи път
защото сега ние все още имаме спомен от това, което х е,
имаме две копия, разбира се, г.,
но ред 3 казва * б.
Така че тук е б. * Б средства отиват там. Е, къде е местоположението 124?
Това е очевидно. И така, какво да сложа тук? Очевидно е, че ПТУ.
Така че сега правя това. Така че аз имам една тук и 2 тук.
И сега какво ще кажеш за всичко това, 123, 124, и 1?
Веднага като суап връща, тази памет е толкова добър, колкото губи
тъй като веднага след като суап се връща, операционната система
е свободен да използва тази памет отново в бъдеще.
Памет само за основната в дъното на тази така наречена стак заседява.
>> И така, най-накрая имаме сега е работен вариант.
Нека отида в swap.c, и забележите следното.
В горната част на програмата съм се променил прототип да ми Int * а и вътр * б.
Така че единственото нещо, което променя от червено, което е лошо, зелено, което е добро,
се добавя тези звезди днес.
Но тогава тук, в самия суап аз трябваше да копирате, поставите това, което е само на слайда.
Имам звезда тук, звезда тук - че съвпада с прототип -
и след това всички тези неща сега имаме звезди с изключение на малки
защото използването на временна променлива, няма нищо ново.
Просто имам нужда от временен склад за вътр.
Така че ние не се нуждаем звезда там.
Ние просто трябва звезда, така че ние може да премине този вид за произволна граница
между тези два кадъра в памет на моя компютър.
Но едно последно нещо трябва да се промени, а вие може да го зърнал вече.
Какво другата линия е очевидно различен сега? >> [Ученик] и х.
>> Да, така че 25 е последния ред на кода трябва да се промени за тази работа.
Преди седмица и дори в понеделник линия 25 приличаше на това, суап х и у,
и това е само счупени, защото ако ти кажа суап (X, Y)
вие давате копия на Х и Y да се сменят, а след това прави нещо,
но вие никога няма да бъдете действително се променя х и у себе си.
Така че, дори ако никога не съм виждал този герой преди с амперсанд код,
просто да предположите. Какво амперсанд, очевидно?
[Ученик] Счита адреса. >> Счита, адрес.
Така че амперсанд казва да ми даде адреса на х.
Кой знае къде е тя? Това се случва да бъде 123. Не ми пука. Просто ми дай адреса на х.
И у означава, дай ми адрес на у.
И в този момент, историята е напълно съвместим с картината направихме преди малко.
>> Така че аз ще призная, указатели, разбира се за мен, когато за първи път започнах да уча това,
определено са един от най-трудните неща, които трябва да приключи съзнанието ми около.
Но реализират, особено след като продължа да играя с тези неща,
ако го съборят тези супер прост вид интелектуално безинтересно проблеми
просто се движат номера наоколо, отговорът на много от объркване с указатели
наистина могат да бъдат получени от тези много основни механика.
Ето един адрес. Отидете там със звездата.
Или обратно, тук е амперсанд. Разбера какво всъщност е адреса.
Добре.
Е, къде е цялата тази памет?
Ние сме привлечени тази снимка на няколко пъти, и държа обещаващ ние ще се върнем към него,
но тук е представителство на паметта на вашия компютър
, която е малко по-етикетирани от нашата Черна тук.
Текстът сегмент на върха представлява това, което по отношение на вашата програма?
[Чува студент отговор] >> Съжаляваме? Кажете отново.
[Ученик] реалната програма. >> Реалната програма.
>> Така 0s и 1s, че сте компилирали след писмено C код и след това работи звъня
и генериране на 0s и 1s краищата да сгушено в паметта
защото, когато щракнете два пъти върху иконата на вашия Mac или PC
или изпълнявате команда като Марио си бърз, 0s и 1s от диска
се зарежда в паметта така, че компютърът може да ги манипулира
и да ги изпълнява по-бързо.
Така инициализирани данни и неинициализирани данни, ние няма да говоря много за тези,
но това са само глобални променливи.
Инициализация означава глобални променливи, които показват стойности;
неинициализирана означава, че все още не дават стойности на глобални променливи.
Тогава там е тези околната среда променливи, които ще напълно вълна ръката ми,
но те са там и че съхранява неща като вашето потребителско име
и друг вид на по-ниски детайли.
Но най-сочните парчета на оформлението на вашата памет е това нещо, наречено стека и на куп.
Стак отново, за да е ясно, е паметта, която се използва, когато функции се наричат
, когато са налице локални променливи
и всеки път, когато има параметри, които се преминали около.
Всичко това се случва в стека.
Купчина ние не сме говорили за това, но да предположите, който използва куп.
Само различно парче на паметта.
Това се случва да бъде изготвен в горната част, но това е произволно изобразителното конвенция.
Кой е очевидно използва памет от куп за седмица?
Това е технически, но косвено. >> Студент GetString.
GetString и изчистване. Така че тук е основната разлика.
>> Знаеш, че за последните няколко седмици, че ако имате нужда от памет, просто декларираме променлива.
Ако имате нужда от много памет, декларира масив вътрешността на вашата функция.
Но проблемът сме държат изправени, е, ако се декларират променливи локално във функцията,
веднага след като функцията връща, какво се случва с паметта и тези променливи?
Просто на него вече не е твоя, нали? Той просто изчезва вид концептуално.
Тя все още е физически там, очевидно, но тя вече не е правото Ви да използвате.
Това очевидно е проблем, ако искате да напишете функции в живота
че всъщност заделя памет и не го върна веднага.
Дело в точка: Целта на GetString в живота е да има никаква представа предварително
колко голям низ Отивам да пишете на клавиатурата,
но тя трябва да бъде в състояние да разпредели памет за Давид или здравей
или цяло есе, което потребителят може да сте въвели.
Така GetString е използвал изчистване.
Изчистване затова трябва да се използва не стека;
вместо това използва това нещо, наречено на куп.
Няма нищо различно паметта. Тя не е по-бързо или по-бавно или нещо подобно.
Това е само физически, на различно място.
>> Но правилото е, че паметта, която е алокира
никога няма да бъде отнета от вас, докато ти се обадя - да предположите - безплатно.
От друга страна, всяко паметта ви помоля за в стека само с обявяване масив
или за обявяване на променлива като ние сме били прави в продължение на седмици,
че по подразбиране се озовава на стека.
И това работи чудесно и 90% от времето, но на тези редки поводи
там, където искате да бъде заделена памет и я държи около
тогава ще трябва да се използва функция като изчистване.
Или сме използвали функция като GetString, което от своя страна използва изчистване.
Да видим, когато това може да се счупи и след това да вземе един поглед на Бинки.
Ние ще се върнем към това в бъдеще.
Тук е супер проста програма, която в първите два реда какво прави?
На английски език, какво правят тези първи два реда код в рамките на основната?
[Чува студент отговор]
Внимателно. Той не ми даде адреса на Х или Y.
[Ученик] дава насоки за цели числа. >> Добре. Дайте ми две указатели към цели числа.
С други думи, дай ми две парчета памет, която държа рисунка днес,
въпреки че аз го изтри сега, като квадрати.
Дайте ми две парчета памет, наречена X, единият наречен Y -
по-рано бях ги нарича и тон - и какъв е вида на това парче на паметта?
Тя ще се съхранява на адрес.
Това е * тип Int.
>> Така адрес на Int в крайна сметка ще живеят в х
адреса на Int в крайна сметка ще живеят в години,
но първоначално, това, което е вътре на х и у? Кой знае? Боклук стойности.
Той има нищо общо с указатели.
Ако не сме се сложи нещо, кой знае какво е всъщност има?
Сега, х. Какво се случва тук? Това вече е легитимно защото х е показалеца. Това е INT *.
Така че, това означава, че мога да сложа в х адрес на известно парче на паметта.
Какво означава изчистване се върне? Perfect, той се връща адреси,
адреса на първия байт в едно цяло парче от паметта.
Колко байта е очевидно отпускане, например, в уреда?
Какъв е размера на Int? 4.
Ако смятате, че до седмица 1, това не е супер важно винаги да се помни, че,
но в този случай е полезно да знаете, 4 байта.
Така че това е разпределението на натрупаш 4 байта
и това е връщането на адреса на първия за мен произволно.
Сега, това, което се х правиш?
A * х = 42 с какво се занимава?
Ако в този момент в историята имаме Х, който прилича на това с някои боклук стойност,
Сега това е Y с някои боклук стойност, в съответствие три съм заделени 4 байта.
Тази картина по същество изглежда така.
Или по-точно, ако това е произволен адрес 123, това е, което историята ни сега прилича.
* Х = 42 сега какво означава? Това означава, че отидете на 123 адреса и номер 42 там.
Не трябва да се направят тези редове, защото ние не правим струни.
>> Трябваше да пише по този начин, и само заради демонстрация на
42 като INT вид на заема много място, 4 байта.
Така че това е това, което се е случило там, но има проблем сега.
* Y = 13. Какво ще се случи тук?
Проблемът е * г. в опростена нашия свят, просто означава, отидете на адреса в г..
Какво има в г? Това е някакъв боклук стойност.
Така че нека да предположим, че този боклук стойност е 5551212, нещо толкова луд.
* Y средства отиват за справяне с 5551212.
Това е като тук. Той не съществува, например.
Така * Y получава 13 означава, че аз съм се опитва да привлече 13 тук. Той не съществува.
Съм превишил сегмента на дъската. Какво мога да получа?
Това загадъчно съобщение за грешка сегментация, защото аз съм се опитва да сложи в паметта
стойност, като 13 на място, което не съществува.
Останалата част от програмата може да работи добре, но до този момент не.
Така че, нека се опитаме да разкажем тази история.
Ще се върнем, че след като сме говорили за шестнадесетичен.
Нека се върнем към това и да завърша с това нещо, наречено Бинки,
изземване е професор в Станфорд седи у дома си играе с глинената анимация,
за да разкаже историята на точно същата програма.
Това е само около 3 минути. Тук имаме Бинки.
[Мъж говорител на видео] Хей Бинки, събуди се. Това е време, за показалеца забавно.
Бинки] Какво е това? Научете повече за указатели? О, лакомство!
[Мъж говорител] Е, да започнете, предполагам, че ще трябват няколко указатели.
>> [Binky Добре. Този код разпределя 2 указатели, които могат да посочат до цели числа.
[Мъж говорител] Добре. Е, виждам две указатели, но те не изглежда да бъде насочен към нещо.
Бинки] Точно така. Първоначално указатели не подсказват с нищо.
Неща, които те посочват, са наречени pointees, и установяването им е отделна стъпка.
[Мъж говорител] О, надясно, надясно. Знаех това. Pointees са отделни.
Er, така че как да ви отпусне pointee?
[Binky Добре. Този код заделя нова цяло число pointee, и тази част определя за да посочите.
[Мъж говорител] Хей, това изглежда по-добре.
Така че, да се направи нещо. >> [Binky] Добре.
Аз ще показалеца х сочен за да съхраните номер 42 в своята pointee.
За този трик ще имам нужда от моята магическа пръчка dereferencing.
[Мъж говорител] магическа пръчка на dereferencing? Това е страхотно.
Бинки] Това е, което код изглежда така. Аз просто ще се създаде броя и ... [Пукащ звук]
[Мъж говорител] Хей погледнете, там тя отива.
Така прави и сочен за х стрелка, за да достъп до pointee си,
в този случай да се съхранява 42 там.
Хей, опитайте да го използвате, за да съхраните номера от 13 до показалеца, г.
[Binky Добре. Просто ще отида тук, за да г. и да получите номер 13
и след това се дюзата на dereferencing и просто ... [Бръмчащ звук] Уау!
[Мъж говорител] О, хей, това не е работа.
>> Кажи, Бинки, аз не мисля, че е добра идея dereferencing г.
, тъй като създаването на pointee е отделна стъпка
и аз не мисля, че някога го е направил.
[Binky] Хм, добра точка.
[Мъж говорител] Да. Разпределени показалеца г., но ние никога няма да го настроите да се отбележи на pointee.
[Binky] Хм, много наблюдателен.
[Мъж говорител] Хей, ти изглежда добре там, Бинки.
Мога ли да го оправиш, така че Y точки към един и същи pointee като х? >> [Binky] Разбира се.
Ще използвам моята магическа пръчка на показалеца задача.
[Мъжки говорител] е, че ще бъде проблем както преди?
[Binky] Не, това не засяга на pointees.
Тя просто променя един показалеца, за да сочат към едно и също нещо като друг. [Пукащ звук]
[Мъж говорител] О, аз виждам. Сега у точки на същото място като х.
Така че, изчакайте. Сега г. е фиксиран. Има pointee.
Така че можете да опитате дюзата на dereferencing отново да изпрати над 13.
[Binky] Ух, добре. Тук върви. [Пукащ звук]
[Мъж говорител] Хей, виж това. Сега dereferencing произведения на годишна.
И тъй като указатели се споделят, че един pointee, и двамата 13.
[Binky Да, споделяне. Както и да е.
>> Така че ние ще си разменят местата?
[Мъж говорител] О, виж, ние сме извън времето. >> Бинки Но -
[Мъж говорител] Само не забравяйте, 3 показалецът правила.
Номер 1 в основната структура е, че имате показалец и го посочва на pointee.
Но показалеца и pointee са отделни, и честа грешка е да се създаде указател
а за да забравиш да му се даде pointee.
Номер 2, показалецът dereferencing започва от показалеца и следва стрелката върху
да достъп до pointee си.
Както всички знаем, това работи само ако има pointee,
какъв вид се върне към Правило номер едно.
Номер 3, показалецът задача отнема един показалеца и се променя
да сочи към една и съща pointee като друг показалеца.
Така че след прехвърлянето, 2 указатели ще посочи със същия pointee.
Понякога това се нарича споделяне.
>> И това е всичко, за да го има наистина. Чао-чао.
Това е Binky. Това е CS50. Ще се видим следващата седмица. [Аплодисменти]
>> [CS50.TV]