[Powered by Google Translate] [Недела 4, Продолжува]
[Дејвид Џ Malan - Универзитетот Харвард]
[Ова е CS50. - CS50.TV]
>> Ова е CS50, и ова е крајот на 4 недели.
Па некои добри вести и некои лоши вести.
Нема предавање во понеделникот, нема проблем постави следната недела. [Студенти навива]
Вие не сте ќе се допаѓа кога тоа се случува.
Но, ние не ја имаат оваа, наместо следната среда,
и таму е исто така на наставната програма 1 Петок предавање следниот петок, така што ќе може да остане на вистинскиот пат.
Но, сè ќе биде снимен како и обично, па не се грижи.
>> И во однос на квизот 0 она што ние ќе направиме кон крајот недела
е пост на почетната страница од пребарувачот cs50.net на курсот објаснување
на она што вид на очекувањата треба да имаат кога станува збор за првиот квиз.
Во принцип, тоа ќе биде повеќе избор, точно-неточно, краток одговор, кратко кодирање проблеми.
Вие не ќе треба да се очекува да го спроведат еквивалент
на проблемот што ќе видите на pset, за кои имате компјутер
и дебагерот и слично, но ќе има мала кодирање проблеми.
>> И навистина, најдобар водич да се добие чувство на она што CS50 квизови се како
е да отидете на cs50.net, одете на квизови линк,
и можете да видите во изминатите неколку години во вредност од квизови.
Само сфатат дека наставната програма не е секогаш ист во текот на годините.
Понекогаш ние го додадете, понекогаш одземаат,
па ако видите некои тема на една од оние стари квизови
дека немате поим што го зборува, тоа е или што ние не се покрие
или дека ние не се покрие.
Но, во форма на критика, ова недела, понеделник и вторник
како и се разбира-широк преглед сесија во неделата вечер -
Времето и локацијата ќе бидат објавени на почетната страница на курсот -
ќе имаат можност да се видат со настава соработници на курсот
материјалот за оваа година, и во дел и како полноправна класа,
и оние кои ќе се снима како и обично, како и.
>> Во ред. Значи без натамошно одложување, еден коментар на Поминете / не и да го додадете / капка.
Може да се види моите ноти минатата ноќ, и ова е навистина само некои дополнителни успокојување
дека ако сте меѓу оние особено помалку удобно или некаде помеѓу
и ти си чувствувајќи се само малку во над вашата глава,
сфатите дека е навистина сосема нормално, и има обилна поддршка структура во место,
од кои една канцеларија часа беа намера за подобрување сè повеќе и повеќе на мојот е-мејл минатата ноќ,
и ќе сфати дека премногу опција како Поминете / не за класа вака
навистина е замислена како механизам да се на работ надвор од курсот, како таков,
така што повторно ако сте трошење на тие 10, 15, 20 часа
само се обидува да добие некои pset да работат и да знаете дека сте 90-95% од пат таму
но не можете да најдете некои проклети бубачки, во Поминете / не модел кој е еден вид на ред.
>> Идејата е дека со тој механизам тогаш може да оди фокус на другите psets
или спијат или што е тоа што сакате да се фокусираме.
Така сфаќаат дека имаат рок до ова доаѓа вторник - технички 5 Понеделник,
но тоа е празник, така што ова доаѓа вторник - да се префрлат од Поминете / не успеваат да оценето или обратно.
И ако сте навистина на пропаст и се размислува за напуштање целосно,
Ве молиме фати мене по предавање или мене капка белешка.
Ние би сакале да барем разговор пред вас предлог Збогувајте.
Во ред. Значи почнавме преземање на обука тркала надвор последен пат.
Конкретно, ние се фокусиравме на стрингот.
Стринг е нешто што е прогласена во библиотеката CS50,
конкретно во таа датотека се нарекува cs50.h која ќе започне да се погледне во оваа недела и следната.
Но стринг е навистина само поедноставување на нешто
тоа е малку повеќе arcanely опиша како знак *.
Char ние сме запознаени со. Тоа е само еден лик.
Но, * од понеделник означена што? >> [Студент] покажувач.
А покажувач. И, што е покажувач? >> [Студент] Еден адреса.
>> Тоа е како адреса, локација во меморијата.
Што е адреса или локација или меморија?
Повторно, сите од нас имаат лаптопи со свирка или 2 гигабајти RAM меморија, најверојатно, овие денови,
и тоа значи дека има милијарди денари или 2 милијарди бајти во вредност од меморија.
И тоа не е важно она што физички личи,
но ги преземе за вербата дека може да нумерира сите индивидуални бајти кои свој лаптоп има -
ова е бајт 0, тоа е бајт 1, ова е бајт 2 милијарди -
и тоа е токму она компјутер го прави тоа.
Кога ќе одвои простор за еден лик, на пример,
очигледно треба да живеат некаде во меморијата на вашиот компјутер,
а можеби и тоа е во бајт број 12345,
и тоа е некаде тука во меморијата на вашиот компјутер.
И адресата тогаш дека карактерот е 12345.
>> Сега, во недела од 0 до сега засега, не сме навистина се грижи
каде во меморијата работите се чуваат, бидејќи ние обично користат симболи,
променливи, и низи да всушност во нашите податоци.
Но, од понеделник и сè повеќе и повеќе денес, ти си сега се случува да имаат
сè повеќе и повеќе експресивна способности со пишување програми
навистина да се манипулира меморијата на компјутерот сепак ви одговара,
за добри цели и лоши,
грешки се многу честа резултат во овој момент во учењето на овој материјал.
Но, она што значи тоа навистина значи да се биде char *?
Ајде да одиме напред назад - и ние ќе се врати на Binky како што вети денес.
Ајде да одиме во еден едноставен пример тука.
Дозволете ми да ја зачувате оваа датотека како compare.c, и дозволете ми да се добијат некои дефиниција код овде
така вклучуваат stdio.h, дозволете ми, исто така, си даде вклучуваат cs50.h. Јас ќе зумирате до таму.
Дозволете ми да започнете со пишување главната int, главната (празно), и сега сакам да направам нешто како ова:
printf ("Дај ми стринг:"), а потоа јас ќе ја користи низа на добива GetString
да се добие стринг од корисникот, а потоа јас ќе одам да побара од корисникот за друг.
("Дај ми уште еден стринг:") и јас ќе одам да ги прашате преку GetString да се добие тоа.
Јас ќе го наречеме т бидејќи т доаѓа откако ги и S е убаво име за низа ако тоа е прилично генерички.
Значи GetString, и сега сакам само да се направи здрав разум чек и јас одам да се каже
ако (а == t) тогаш јас сум само ќе кажам на корисникот printf ("Внесовте истото \ n!");
друго јас ќе одам да се печати нешто како ("Внесовте нешто различно! \ n")
или што казната ќе биде. Значи такво нешто.
Тогаш, како и обично, јас ќе се врати 0, кои само значеше дека ништо лошо се случи,
и јас одам да се оди напред и компајлирајте и извршете оваа програма.
>> Но, во понеделникот ние трчаше оваа програма,
и всушност беше кажано дека ЗДРАВО не е здраво и ЗБОГУМ не е збогум.
Однесувањето видовме беше малку повеќе вака.
Дозволете ми да одам во мојата изворниот директориум, зум во тука, и нека го прават споредуваат.
Составувач ред. Дозволете ми да се кандидира споредуваат. Дај ми стринг: ЗДРАВО.
Дај ми уште еден стринг: ЗДРАВО.
Сте ја внеле нешто различно!
Па, дозволете ми да се обиде нешто поедноставно како 50, 50. Сте ја внеле нешто различно!
Здраво, здраво. Па јасно, нешто се случува тука.
Но, она што е објаснување зошто?
Очигледно, линија 12 е целосно нефункционален.
Што е фундаментален проблем тука? Да. >> [Студент] Тоа е споредување на адреси.
Да, точно. Тоа е всушност споредување на адреси
во која Здраво и ЗДРАВО се чуваат.
Тоа не е споредување на писма Здраво повторно, и повторно,
затоа што навистина се случило, сето ова време ние сме биле користење GetString -
Оваа табла е повторно меморија нашиот компјутер,
и да речеме јас го нарекувам GetString по прогласувањето променлива s.
Што значи моето сеќавање изгледа?
Да произволно да се каже дека е изгледа вака. Тоа е плоштад.
И доста секое време сум подготвен парче меморија на екранот
ако тоа е 32 бита сум бил цртеж плоштади како тоа затоа што навистина во апаратот,
покажувач, адреса, е 32 бита. Тоа е исто како int.
Тоа може да се разликуваат врз основа на компјутерски систем.
Оние од вас кои се нејасно запознаени со фактот дека вашиот Mac или PC е 64 бита,
кои, всушност, означува дека вашиот компјутер е користење на 64-битна покажувачи,
64-битна адреси, а меѓу квит сум за тоа е вашите компјутери
може да има многу повеќе RAM меморија од недалечното минато.
Скратам приказната, назад во денот, кога компјутерите се користи само 32 бита
да претставуваат адреси, најголемиот број на бајти може да претставуваат
во тој случај е што ако имате 32 бита?
Значи 4 милијарди долари, право, бидејќи 2 до 32 изнесува 4 милијарди долари.
Овој број е повторуваат во текот.
>> Значи, ако имате само 32 бита, најголем број може да смета на е околу 4 милијарди долари.
Но тоа беше основен ограничување на компјутери до пред неколку години
затоа што ако може само да се смета како високо како 4 милијарди долари,
тоа не е важно ако ги купите 8 гигабајти RAM или дури и 5 гигабајти RAM меморија;
не може да смета дека високите, па тоа беше бескорисно.
Вие само може да пристапите на првите 3 или 4 гигабајти на меморија на вашиот компјутер.
Тоа е помалку од еден проблем сега, и може да се купи MacBook професионалци и Долчинка
со 8 гигабајти RAM или дури и повеќе, овие денови.
Но, ако јас одвои сосема едноставно во оваа програма покажувач, покажувач наречен с,
тоа може да изгледа вака на екранот, бидејќи навистина треба да лупам назад овој слој.
Продолжувам да велејќи стринг, но од понеделник, стринг е навистина char *,
адресата на некои карактер.
Значи, да се земе дека обуката велосипед иако ние ќе продолжиме со користење GetString за сега.
Значи јас сум прогласена е, и ова е парче меморија, 32 бита.
Што е тука во меморија по дифолт? >> [Нечујни студент одговор]
Што е тоа? >> [Студент] ѓубре. >> Ѓубре. Точно.
Ако на програмерот не стави вредност во променлива, кој знае што е тоа?
Понекогаш ќе имаат среќа и тоа е 0, кој е вид на убаво, чисто стандардната вредност,
но како што видовме Понеделник, понекогаш тоа е целосна глупост,
некои навистина голем позитивен или негативен број, кои дојдоа од каде?
Да. >> [Студент] Функцијата порано. >> Да.
>> Често функција која доби наречена порано, бидејќи се сеќавам,
како да ти се јавам функции во меморијата, тие заземаат повеќе простор од дното нагоре,
и штом функцијата се враќа, дека меморија добива пренаменети
од следниот дечко што се нарекува, кој е со користење на вашиот исто парче на меморија.
И ако сте лево ѓубре таму, претходните вредности,
ние би можеле грешка е што има некои вредност, кога навистина не можеме да се стави нешто таму.
Така, нашето RAM меморија во овој момент изгледа вака.
Сега на десната страна на линијата 7 ние сме повикувајќи GetString,
кој го прави сега со недели, но она што е GetString навистина прави?
GetString напишани од страна на CS50 персонал е малку интелигентни
во таа штом корисникот ќе почне пишување клучеви и хитови Enter,
GetString фигури колку тастатурата не на корисникот хит,
колку знаци ми е потребно за да се распредели RAM меморија за.
И каде што RAM меморија доаѓа од, кој знае?
Тоа е некаде во 2 гигабајти на вашиот компјутер или какво ли на меморија.
Но, ајде да претпоставиме дека компјутерот се најде простор за зборот ЗДРАВО овде.
Зборот ми чука беше H-Е-Л-Л-О.
И ако ние се подготви ова како секвенца од знаци, можеби ќе го нацрта тоа како оваа.
Но јас треба да направите 1 екстра работа. Она што му припаѓа на крајот на која било низа во C?
На нула карактер, што ние пишуваме како \ 0.
Тоа е технички бројот 0, но обратна коса црта прави сите појасна
дека ова е буквално бројот 0, број 0;
тоа не е, на пример, цитат-unquote 0 што може да пишувате на тастатурата.
Значи ова е здраво.
>> И што велиме во понеделникот изјави дека некоја функција како GetString
е всушност враќање на сите овие недели?
Тоа не е враќање низа по себе, бидејќи тоа навистина не имаат значење
бидејќи жиците не постојат. Тие се вид на измислица во CS50 библиотека.
Она што е навистина низа, повеќе технички? >> [Студент] Тоа е првиот лик.
Точно. Тоа е сосема едноставно адресата на првиот знак дека корисникот внеле внатре
Значи, ако мојот збор ЗДРАВО тој завршува во бајт број 123, а потоа во бајт број 124,
125, 126, и така натаму, ако јас само бројот мојот бајти од 0 на горе,
она што навистина GetString се враќа е буквално на бројот 123.
Значи она што добива се стави во с е бројот 123, а не на буквата Н, а не збор Здраво,
едноставно адресата на која може да се најде на првата буква од Здраво.
Но, тоа не изгледа доволно. Те прашав за низа, а не карактер.
Така како ние или компјутерот знае дека ello вид на дојде заедно со H?
Што е вид на договор имаме? Да.
[Студент] Се држи кажувам себе да се најдат некои повеќе карактери. >> Токму така.
>> Има оваа човековите-компјутер согласност со која кога ќе се занимаваат со жици,
инаку позната сега како знак ѕвезди, кои едноставно мораш да дознаам
каде што на крајот на секој стринг во животот е од навистина само процесирањето над неа со за телефонска линија,
време јамка, без разлика, така што кога ќе се најде на крајот од стрингот
сега може да заклучиме од тоа, о, целиот збор е здраво.
Оние од вас со претходно програмирање искуство може да знае во Јава
можете само да се јавам. должина и на други јазици можете да се јавите должина или слично.
Тоа е затоа што во многу јазици, особено нешта наречени објектно-ориентирани јазици,
должината на нешто не е во вид на внесен во внатрешноста на парче на податоци себе,
многу како што врзуваат лични карти и имиња и куќи во внатрешноста на еден студент во понеделникот.
Но, C е многу пониско ниво. Нема предмети или класи, ако сте слушнале овие услови порано.
Се што треба е навистина мемориски адреси.
Па ова е вид на старомоден начин на претставување на интересни структури на податоци.
Имате почеток вредност како адресата на првиот карактер
а потоа само некои произволни конвенцијата дека сите се согласуваат да го следат.
Па, како е стринг должина спроведува, не ние предлагаме?
Strlen, strlen, што некои од вас сега се користи неколку пати. Тоа е прилично едноставно, нели?
Тоа е како 2 линии на код.
Тоа е доста за телефонска линија на некој вид, можеби со дополнителни локални променливи.
Но strlen едноставно мора да се земе покажувач, а потоа почнете да барате \ 0.
>> И штом го најде, тоа може да се врати од вкупниот број на чекори што е донесена во таа низа.
Значи можеме да заклучиме од ова што се случува понатаму.
Да претпоставиме дека потоа Изјавувам т како што го направив во линија 10.
Ова е некои ѓубре вредност. Кој знае во првиот?
Но, од десната страна на линија на 10 јас го повикувам GetString повторно.
Кој знае каде овој завршува?
Да произволно да се каже дека на оперативниот систем се најде простор за тоа начин овде.
Јас се случи да случајно тип В-Е-Л-Л-О, повторно,
и така ние може да нацрта на ист вид на сликата.
Но, фактот дека сум сменет оваа слика е намерно
бидејќи тоа е друга ЗДРАВО од оваа.
Па еве ова може да биде локација 456, ова е 457, и така натаму.
Значи она што добива се стави каде што прашалник некогаш беше?
Во овој случај 456.
Ние сме подигање овие бројки произволно, бидејќи навистина после денес
ние нема да се грижат толку многу за она што на адреса на ништо е.
Сите ние сме загрижени за е дека можеме да дознаам адресата на некои парче на податоци како ЗДРАВО.
>> Па навистина она што повеќето луѓе прават во компјутерската наука, кога зборуваме за мемориски адреси
и зборуваме за совети конкретно,
наместо мачат да пронајдат 123 - кој се грижи каде овој материјал всушност е,
ние само знам дека тоа е во некои нумерички адреса -
ние поедноставување на светот и само велат дека е се укажува на тоа карактер
и т е покажувајќи на тој лик.
И фактот дека тоа е стрела е сосема намерно
бидејќи буквално сега s е покажувајќи кон H и т е да се покажува на другите H
бидејќи на крајот на денот, тоа не е важно она што адресата е,
но тоа не е важно што имаме можност да ја изразат таа адреса со некои парче код.
Не сме навистина манипулира овие адреси само уште
па ќе видиме каде можеме да interject и сортирање на не работи со покажувачи,
но сега за сега во линија 12 буквално она вредности сме споредување
според оваа приказна во линија 12?
Ние сме велејќи дека е 123 еднаков еднаков на 456? И тоа е дефинитивно не е случај.
Па дури и концептуално, овој покажувачот дефинитивно не е исто како во овој
затоа што се нарекува GetString двапати, и GetString не се обидува да биде супер паметни,
таа не се обидува да се реализира, ох, сте ја внеле ЗДРАВО 5 минути;
дозволете ми да ви даде истиот покажувач како што ви даде пред,
тоа само алоцира нов дел од меморија секој пат кога ќе го наречеме.
>> Така како ние да го надминете овој проблем?
Ако повисоко ниво Сакам да се споредат жици ЗДРАВО и здраво -
Не ми е гајле за совети - како можам да се обратите за одговарање на прашањето,
не на корисникот напишете иста работа? Што е потребно овде? Да.
[Студент] Користете функција. >> Јас се користи некоја функција надвор од кутијата.
Јас може да се користи функција наречена strcmp, S-т-р-в-м-p,
само скратена верзија на велејќи стринг споредуваат.
И ако ние одиме во, на пример, да ги споредиме 2, кој е меѓу материјалите денес,
Јас го прават токму тоа.
Продолжив сè друго на истиот од алинеја 1 на одредување на 26 или така,
и сега забележите овој дел се промени само малку.
Да се ​​игнорира линија 28 за момент и да се фокусира само на оваа.
Што велиме понеделникот изјави дека ул Споредете не?
Тоа се справува со процесот на преземање 2 покажувачи, S и T во овој случај,
вид на практично стави својот прст на оние 2 букви,
и она што треба да направите е нешто како додека јамка или за телефонска линија,
и вели дека се овие исти? Ако е така, што се движи прстите или совети напред.
Дали овие исти, овие исти, овие исти,
овие исти, овие исти? И ooh, јас сум на крајот на низата на двата s и t.
Јас не сум нашол некое противречности. Да, овие низи се исти.
И она што го прави ул спореди враќањето ако 2 жици се исти, очигледно? Нула.
Значи 0 е добро во овој случај, бидејќи ако го враќа -1 или 1,
тоа значи дека е само случува да дојде пред т по азбучен ред или по т.
И зошто тоа би било корисно да се има функција која ти го кажува кој стринг доаѓа пред
или после во речникот?
[Студент] Пребарување. >> Пребарување и подредување.
>> Па можете да ги правите нештата како бинарен за пребарување или меурот вид или спои вид
каде што треба да се споредуваат работите.
Досега ние сме вид на намалување на некои делови и само зборуваше за сортирање
во контекст на броеви, бидејќи тоа е убаво и лесно да се зборува за,
но сигурно може да се спореди жици, јаболко и банана,
бидејќи ако јаболко е познат да дојде пред банана, слично на тоа,
можете да се движите жици околу во меморијата како Роб не со спојување вид во видео
и ние го сторивме тука на сцената со изборот вид, вметнување вид, и меур вид.
Значи каде на друго место може да се земе ова? Да се ​​обидеме ова.
Ајде вид на заборавиме дека лекција за момент и обидете се сега и ископирајте 1.в да го направите следново.
Во линија 21 сакам да кажам дека печати нешто,
тогаш јас сум добивање на стринг од корисникот,
тогаш јас сум проверка ова.
Не сме навистина добивано и во оваа навика сеуште, но ајде сега го направите тоа.
Да, всушност, лупам назад овој слој. Ова е навистина char *. Овој човек е навистина char *.
Па што значи тоа да се провери дали е == NULL?
Излегува дека кога ќе се јавите на функција како GetString
или поопшто само побарајте на компјутерот да ви даде некои меморија,
нешто може да тргне наопаку.
Вие би можеле да бидат луди и го прашуваат компјутерот за Terabyte на меморија
барајќи трилиони бајти од меморија, која едноставно не постојат во компјутерот,
но GetString и други функции треба некој начин на вика на тебе
ако сте праша за премногу.
И начинот GetString го прави ова е ако се побара повеќе меморија
отколку што е на располагање во компјутер, дури и ако тоа е супер, супер ниска веројатност
бидејќи никој од нас не се случува да напишете трилиони карактери, а потоа притиснете ентер,
но ниска веројатност иако тоа може да биде, јас се уште сакате да се провери за тоа само во случај,
и посебна вредност која GetString, одговор, и други функции се враќа
ако нешто не е во ред е NULL во сите настапи.
>> И она што е NULL? NULL само така се случува да ја претставува покажувач. Тоа е меморија адреса 0.
Светот одлучи дека произволно, ако ова е меморија на компјутерот ми е - знаеш што? -
ние ќе украдат само 1 бајт од меморија секој компјутер, и ова е локација 0.
Ние ќе го даде прекарот NULL, и ние ќе ветување
дека ние всушност никогаш не ќе се стави реални податоци таму
бидејќи ние само произволно треба посебна вредност, 0, ака NULL,
така што можеме да се развикам на корисниците ако нешто тргне наопаку.
Инаку може да не знам е 0 значи стави нешто тука
или значи тоа нешто не беше во ред?
Ние треба да сите се согласуваат дека NULL не значи ништо се врати,
Нема вистинската адреса се врати.
Сега, еве јас сум само донесување мојот човечки конвенцијата на вратам 1 од главната
ако нешто тргне наопаку.
Тоа е затоа што враќањето конвенција главните е да се врати 0, ако добро,
1 или некоја друга вредност, ако лошо.
Но GetString и секоја функција која се занимава во меморијата враќа NULL ако нешто тргне лошо.
>> Во ред. Така, за жал, линија 27, супер едноставен покрај тоа што е, потполно не успее да ја копирате на стрингот.
Зошто? Можеме да видиме ова како што следува.
Јас сум тврдејќи дека во линија 27 да се прави копија на s и нарекувајќи го т.
Па јас не барам на корисникот за 2 жици овој пат, јас сум само велејќи вредноста во с
треба да се стави во т, како и.
Па сега само да се покаже како скршени ова е, во линија 29 па наваму што правам?
Прво јас сум проверка, ако должината на т е поголем од 0.
Има некои стринг таму. Корисникот внесе нешто внатре
Што е линија 32 прави, очигледно?
[Нечујни студент одговор] >> Право. Можете вид на може да го заклучиме од она што го рече тоа го прави.
Но технички, она што е оваа правиш? → [0] претставува она?
[Студент] Ликот 0.. >> [Malan] Ликот 0..
Или, повеќе човечко-како, првиот карактер во т, што и да е, H можеби во овој случај.
И toupper го прави она што го кажува. Тоа капитализира на 0. карактер на T и тоа се менува.
Значи ова значи преземат 0. карактер на T, го прават тоа големи букви,
и го стави назад во истата локација.
Значи, ако јас внесете здраво со мали букви, ова треба да се менува на мали часот на капитал Х
Но, проблемот е во тоа што во линии 35 и 36 што јас сум за да направите е да испечатите за нас s и t.
И она што е вашето комат?
Што сум јас, всушност, ќе видиме, ако јас ја внеле во здраво во сите мали букви?
Што се случува да се печатат? >> [Нечујни студент одговор] >> Што е тоа?
[Студент] Биг H и останатите мали. >> Големите H и останатите мали за кое s или t?
[Студент] И. >> Двете. Точно. Па ајде да видиме што се случува овде.
>> Дозволете ми да оди напред и да ги собере тие. Ова е copy1, така бидете copy1. Во ред.
Зумирате внатре Дозволете ми да оди напред и да ја стартувате copy1, Внесете, Кажи нешто: hello со мали букви.
Тоа капитализирани копија, но тоа очигледно капитализирани на оригиналот,
затоа што она што сега се случува во оваа приказна?
Во согласност 27 Јас всушност не се чини дека се копирање на стринг,
но иако можеби сте интуитивно се надева дека за да биде случај,
ако мислиш за оваа слика, она што навистина сум направил?
Половина од сликата е иста.
Значи, да се тркалаат назад во времето, така што т сеуште не постои во приказната.
С може да постои во приказната, но ајде мали букви Здраво ова време.
Па нека ме поправи она што јас всушност внесе внатре
Во овој случај, тука имаме ж-е-л-л-о.
Ние ќе го нацрта како секвенца од знаци, ставам сепаратор линии тука и мојот \ 0.
Значи ова е местото каде што ние сме во најкраток линија од 1 до 24-носталгичната, или дава да потрае, се егзекутирани.
Ова е слика на моето сеќавање.
Кога ќе стигнете до линијата 27, што се случува?
Исто како и пред тоа, јас се добие покажувач, што ќе привлече како овој плоштад.
Таа се вика т. И, што е неговата вредност по дифолт? Кој знае? Некои ѓубре вредност.
>> Затоа јас ќе апстрактни дека далеку како знак прашалник.
И штом десната страна на линијата 27 извршува, што зборувам ставање во внатрешноста на Т?
Истото тоа е во с.
Значи, ако ние за момент го отстраните овој апстракција на стрелката и ние велиме,
ох, ова е меморија оптоварување адреса 123, кога ќе се каже т добива с, запирка,
сте буквално ставајќи 123 овде.
Сега ако ние вид на поедноставување на нашиот свет повторно со слики,
она што сте навистина направено е само додаде уште стрелката за да вашиот свет
тоа е посочувајќи од т на истиот точната низа.
Значи, кога во согласност 31 и 32 Јас всушност се обратите за менување на т [0],
што е т [0] очигледно синоним сега? Кликнете [0]
Значи тоа е сето она што се случува.
И иако овој вид на се чувствува малку ниско ниво и таинствени
и овој вид на чувствувам како можеби интуитивно ова треба да имаат само работеше -
Јас направив копии на нештата пред и само работеше -
ако навистина размислува за она што низа навистина е, тоа е знак *.
Па, што е тоа? Тоа е адресата на некои карактер.
Тогаш можеби тоа го прави повеќе смисла дека кога ќе се обидат да сторат нешто
супер навидум едноставна, како таков, се што правиш е копирање на мемориска адреса.
Вие не сте всушност прави ништо со низа себе.
Па дури и ако немаат идеја како ќе се реши овој проблем во кодот,
високо ниво, концептуално, она што ние треба да се направи со цел да се направи ta верна копија на с, очигледно?
Да. >> [Студент] Дајте нова локација? >> Токму така.
>> Ние треба да се даде т сосема нова локација.
Ние треба некако да се создаде свет во кој ние се добие нов дел од меморијата,
кои само заради јасност е јас ќе привлече веднаш под овој, но тоа не треба да биде таму.
Но, тоа треба да биде со иста големина, па ќе се нацрта овие вертикални линии на истото место.
Тоа е во ред, ако тоа е за сите ѓубре на почетокот. Кој знае што е таму?
Но, чекор 1 ќе треба да се ми даде колку меморија како што треба
за да ги собере копија од здраво, а потоа дознаам како да го копирате ж тука, е тука,
на л тука и така натаму.
Но, ова веќе треба да се чувствуваат малку очигледно дури и ако некои од деталите се уште апстрактна.
За да копирате оваа низа во ова, тоа е само за јамка или додека јамка
или нешто со кое сте стане сè повеќе и повеќе познати.
Значи, да се обидат ова. Дозволете ми да одат во copy2.c.
Во copy2.c имаме речиси иста програма, освен за линијата 27.
Тоа изгледа малку комплексна, но ако ние го срушат парче по парче,
на левата страна е иста.
Char * т создава оваа работа во меморијата, иако со прашалник
затоа што немаат идеја што е таму од стандардните.
На десната страна ние сме сега за воведување на нова функција, Примерок,
за мемориски одвои, дај ми меморија,
и тоа очигледно зема како многу аргументи, колку многу нешта во заграда?
Слушнав мрморења на 1 и 2, но тоа е само 1.
Нема запирка, што значи дека има само 1 работа внатре во заградите.
Иако има други загради, дозволете ми да се потенцира
она што е внатре на најоддалечените загради, и тоа е тоа израз:
(Strlen (а) + 1) * sizeof (знак).
Значи, ако ние всушност мислам дека ова преку, ова е велејќи ми даде должината на пријавите.
Зошто сум јас, иако, додавајќи 1 кон должина? >> [Нечујни студент одговор]
Точно. Ние треба простор за овој човек на опашката, шестиот карактер што нема Македонски значење
но не имаат посебни програмски значење.
>> Значи ние треба + 1 за тоа, бидејќи strlen враќа човечкиот очекување на должина,
здраво или 5, не ви даде дополнителни null карактер.
Па јас рачно да додадете ова со + 1.
А потоа и оваа, * големината на (char), не сме виделе досега.
Ова не е технички функција.
Тоа е посебен клучен збор, која само ти кажува она што големина е на некои податочен тип на компјутер
затоа што во реалноста, некои од нас имаат 32-битни компјутери.
Имам прилично стар компјутер дома, и тоа само користи 32 битови да претставуваат покажувачи.
И така ако сум го правела големина на тип на податоци, тоа може да биде 32 бита.
Но, ако јас сум користење на мојот нов фенси компјутер, би можел да се вратам во вредност од 64 бита
за нешто како адреса.
Значи во овој случај, само за да биде супер безбедно, ние нема да тешко код нешто како -
Па, што е со големина на знак, според она што рековме досега?
Ние сме доста изјави усно дека тоа е 1 бајт, и тоа е доста точно во одборот.
Но, повторно, претпоставки имаат тенденција да бидат лоши.
Тие водат до кабриолет софтвер, ако луѓето го користите вашиот софтвер во начини на кои можете не планираат.
Па ајде апстрактни оваа далеку и само повеќе генерички каже
Ми треба оваа многу делови од меморијата
и секој дел од меморија треба да биде еднаква на големината на еден лик,
која е всушност еднаква на 1, во овој случај, но тоа е повеќе генерички начин на пишување неа.
Значи, ако зборот е здраво, колку бајти е Примерок очигледно одвои за здраво?
[Студент] Шест. >> Шест. Точно колку што имаме прашалници на екранот.
А потоа ги погоди сега врз основа на вашето разбирање на GetString
што значи Примерок веројатно се врати? >> [Студент] Еден адреса.
Адреса на што? На првиот дел од меморијата.
>> Немаме поим што е таму, бидејќи некои други функција
може да се користи оваа меморија претходно.
Но Примерок, како GetString, се враќа адресата на првиот бајт од меморија
дека ги издвои за вас.
Сепак, она што не го направите е да се пополни во празно со обратна коса црта null карактер
бидејќи излегува можете да го користите Примерок да одвои нешто: ints, стрингови, низи,
плови, студентски структури.
Можете да ги користите Примерок целосно генерички.
Таа не се грижи или треба да знаете што сте доделување меморија за.
Значи тоа ќе биде претенциозно за Примерок да се стави \ 0
на крајот на секој дел од меморијата тоа е ви даваат
бидејќи ова \ 0 работа е само конвенција за стрингови.
Тоа не се користи за ints, тоа не е се користи за плови, тоа не е се користи за студентите.
И така gotcha со Примерок е дека товарот е целосно сте програмер
да се сетам колку бајти можете доделени и да не некогаш користите за телефонска линија
или додека јамка и одат минатото границата на дел од меморијата сте биле дадени.
Стави некој друг начин, веднаш штом ќе алоцира меморија,
не можете да побарате на оперативниот систем, ох, патем, колку е голема на парче меморија беше ова?
Тоа е целосно зависи од вас да се сеќавам ако ви треба таа вредност.
>> Да видиме како јас да продолжи да ја користите оваа меморија.
Во согласност 28 и 29 зошто правам ова?
Само вкупниот разумност проверка.
Само во случај нешто не беше во ред, го прашувам за некои луди сума на меморија
или имам толку многу работи работи на компјутер кој има само не е доволно меморија,
нешто слично на тоа, јас барем сакате да се провери за ништовни.
Во реалноста, повеќето компјутери ќе ви даде илузија дека секоја програма
можете да го користите на интегритет на вашата RAM меморија,
но дури и така, ако на корисникот видови во некои луди долга низа можеби затоа што тие се лошо момче
и тие всушност се обидува да сруши вашата програма или пробие во неа,
дека сакате да барем се провери повратната вредност на Примерок и дали тоа е еднакво на нула.
И ако го прави тоа, ајде само да престанам токму сега, бидејќи не знам што да правам во тој случај.
Како да го ископирате стринг? Има неколку начини да го направите тоа.
Постојат ул копирајте функции во C, но тоа е супер едноставен за нас да го направите тоа на старомоден начин.
>> Прво дозволете ми да дознаам што должината на пријавите е.
Јас можев да се стави ова во јамка, но наместо тоа само да го стави овде за јасност.
Значи n сега продавници должината на оригиналната низа, што е очигледно 5.
Тогаш според мое за јамка јас сум процесирањето од 0 на до n,
и на секоја итерација Јас сум ставање на [i] внатрешноста на т [i].
Значи тоа е она што се подразбира со моите 2 прстите посочувајќи на жици порано.
Како ова за јамка iterates вака, јас одам да се копирање часот во тука,
е во тука, л во тука, бидејќи ова е с, ова е т.
А потоа на крај, во согласност 35 зошто правам ова?
Јас треба да бидете сигурни дека јас сум крај на стрингот t.
И јас го направив тоа на овој начин да биде супер експлицитни.
Но, предложи, некој, ако може, на поинаков начин да се направи ова.
Јас навистина не треба линија 35. Има уште еден начин да го направите тоа.
Да. >> [Нечујни студент одговор] >> Велат дека тоа погласно.
[Студент] Помалку од или еднакво на. >> Токму така.
Ние може само да се каже помалку од или еднакво на n, кој воопшто е лоша
бидејќи скоро секогаш кога одиме до еднаква на нешто ние сме броење
одиме 1 чекор предалеку.
Но запомнете, колку бајти не ни одвои?
Ние распределени strlen на s, така 5 + 1 за вкупно 6.
Значи во овој случај би можеле да направите нешто како ова
така што ние сме копирање не само здраво, но исто така и \ 0 на самиот крај.
Алтернативно, би можеле да ги користат функција наречена ул копија, strcpy,
но тоа не би било речиси како многу забавно.
Но тоа е сè тоа го прави под хауба.
Тогаш на крај, ние го прават истото како порано.
Јас профитираат т а потоа тврдам дека оригиналниот изгледа вака и копија личи тоа.
Значи, да се обидат на оваа сега. Дозволете ми да одат во тука. Направете copy2. Ние ќе зумирате и да ја стартувате copy2.
Одам да напишеш во здраво со мали букви, и навистина ми се мали букви здраво како и оригиналот
но капитал Здраво за копија.
Но, јас не сум сторил само уште. Јас треба да направите 1 последното нешто тука.
46 и 47 е јасно ослободи меморија, но што всушност значи?
Што правам, дали мислите дека, со повикување линија 46 и линија 47?
Каков ефект не дека имаат? Да.
[Нечујни студент одговор] >> Токму така.
>> Вие сте само кажува на оперативниот систем, еј, благодарение на оваа меморија.
Сега можете да го користите за некој друг.
И тука е совршен пример на ѓубре вредности.
Јас само се користи оваа меморија за да се запишам на зборот здраво за 2 места,
тука, тука, тука и тука.
Значи ова е ж-е-л-л-о-\ 0.
Но, тогаш јас го нарекувам линија 46 и линија 47, а вие знаете што се случува таму, во смисла на сликата?
Всушност, чекај, оваа слика е стар една.
Откако ќе се направи копија, овој човек е, всушност, посочувајќи тука,
па ајде отстрани броеви и само апстрактни далеку како нашите стрели повторно.
Што се случува во оваа слика кога ќе се јавам слободен?
[Нечујни студент одговор] >> Ни.
Ако јас го нарекувам бесплатно s и t - вид на трик прашање - оваа слика не се менува воопшто
бидејќи повикувајќи ги и повикувајќи т само му кажува на оперативниот систем,
еј, можете да го користите оваа меморија повторно, но тоа не се смени ова на нула
или некои посебни карактер, тоа не го менува тоа,
тоа не го менува h или на e или l или на l или о или во место за ништо друго.
Во смисла на сликата, веднаш штом ќе се јавите бесплатно, ништо не се менува.
И во него лежи потеклото на ѓубре вредности, бидејќи ако јас потоа подоцна во оваа програма
побара од оперативниот систем за повеќе меморија со GetString или Примерок или нешто слично
и на оперативниот систем, вели, сигурни, имам 12 бајти од меморија само се ослободува,
ги користат овие, она што ви се случува да се предаде?
Сте ќе биде предаден парче на меморија што ние обично ќе привлече
со прашалници, но она што се оние прашалници?
Тие се случи да биде ж-е-л-л-о, ж-е-л-л-о.
Овие се нашите нови ѓубре вредности веднаш штом ќе се ослободи дека меморијата.
>> Има импликација на реалниот свет тука.
Ова се случува да се направи со RAM меморија, но вашите компјутери
всушност го прават истото со диск.
Ќе зборуваме за тоа особено во иднина проблем сет кој се фокусира на науки.
Но, она што всушност се случува ако имате некои чувствителни финансиски датотека на вашиот десктоп
или некои површни JPEG и ќе го повлечете во вашиот ѓубре,
што се случува кога ќе се повлечете во ѓубрето или во ѓубрето?
Ти знаеше дека она што јас го зборувам. [Смеа]
Што се случува кога сте вовлечени дека доказите во вашиот ѓубрето или корпата за ѓубре?
[Нечујни студент одговор]
Па, толку внимателни. Што се случува кога ќе го направите тоа?
На кратко одговорот е ништо, нели?
Површни или чувствителни датотеки се уште само седи таму некаде на вашиот хард диск.
Повеќето од нас барем научиле на потешкиот начин дека треба да го испразните ѓубрето
или вашиот Recycle Bin да всушност избришете фајлови.
И навистина, кога ќе десен клик или контрола клик на вашиот корпата за ѓубре
или изберете Датотека, празни ѓубрето или што
и ти всушност го испразните корпата за ѓубре или ѓубрето, што всушност се случува потоа оваа слика?
Повеќе ништо. Така всушност ништо не се случува на дискот.
>> И ако ние само привремено отплесвам и пишуваат - I'll само користење на задниот дел од ова.
Па сега приказната се менува RAM меморија, која е местото каде програми постојат
додека си ги трчање, на дискот, кој е местото каде што се чуваат долгорочна
дури и кога моќта излегува, за сега - а ние ќе се вратам на ова во иднина -
ајде да се преправаме дека ова претставува хард диск во внатрешноста на вашиот компјутер
бидејќи во тоа време тие се користат да биде кружни дискови, слично како флопи дискови.
Значи, ако имате некои чувствителни Excel датотеката, тоа би можело да потрае до овој дел од меморијата
на дискот на вашиот компјутер, а јас сум само цртање исто произволни 1S и 0-ти.
Кога ќе повлечете датотека како тоа да го ѓубрето или да Recycle Bin,
буквално ништо не се случува, бидејќи Apple и Microsoft имаат само одлучи
корпата за ѓубре и ѓубрето е навистина само привремени случаеви.
Можеби на крајот на оперативниот систем ќе го испразните за вас, но обично, таа не прави ништо,
барем додека сте навистина ниско на простор.
>> Сепак, кога ќе отидете на празни ѓубрето или празни ѓубрето,
Слично на тоа, ништо не се случува да се оваа слика.
Сите што се случува е на друго место на вашиот компјутер, тука е некој вид на табела.
Тоа е вид на како мала измамник лист кој се вели дека, да речеме, resume.doc,
па вашата биографија во Мајкрософт Ворд користат да се живее на локацијата 123 на вашиот хард диск,
не е во меморија, а не во RAM меморија, но на вашиот хард диск,
и вашиот површни JPEG животи во 456, и вашиот Excel датотеката живее во 789 или каде.
Кога ќе ги избришете фајлови од всушност празнење на ѓубрето или во ѓубрето,
оваа слика не се менува. На 0-ти и 1S на вашиот хард диск не оди никаде.
Но, оваа табела, оваа мала база на сорти, се менува.
Кога ќе ги избришете вашата биографија, тоа е како да на датотеката е избришан во извесна смисла,
но сите компјутер не е заборавите каде што нешто живее на вашиот хард диск.
На 0-ти и 1S кои ја сочинуваат вашата биографија или било кој од овие други датотеки се уште недопрени.
>> Значи, ако го направи тоа случајно, има уште не-нулта веројатност
дека можете да закрепне вашите податоци користење Norton Utilities или некој комерцијален софтвер
чија цел во животот е да се најде 0-ти и 1S кои се вид на е сираче,
заборавени тука, но остави тука, така што можете да добиете на вашите податоци назад.
Или форензичар иследниците со полицијата или на ФБИ всушност ќе се хард диск
и всушност барате модели на 0-ти и 1S кои личат на JPEG слики, изгледа како Excel фајлови,
и ги врати на тој начин, дури и ако компјутерот ги заборавил таму.
Значи единствен начин навистина да ги избришете податоците, како ние ќе разговараме во иднина,
е да мелез или избришете ја датотеката или хард диск со -
Вие навистина не може да се ослободи од 0-ти и 1S
затоа што во спротивно ќе почне со GIGABYTE хард диск
и сакате да се заокружи со една мегабајти хард диск, ако постојано се бришење,
буквално, 0-ти и 1S.
Така што ќе направиш ако навистина сакаше да ги покрие вашите песни
и основниот проблем е во тоа што има уште 0-ти и 1S на дискот?
Гледам некој gesticulating дека физички ќе се скрши на уредот. Дека ќе работат.
[Смеа] Но, ако тоа е вид на скапо решение, што ќе биде повеќе разумни?
Да. >> [Студент] Запиши нив. >> Нив Запиши со што? >> [Студент] Други податоци.
Други податоци. Вие само може да го изгубите Вашиот диск со 0-ти или 1s или сите 0-ти, сите 1S.
>> И тоа е навистина она што некои од софтвер го прави тоа.
Можете да ги купите софтвер или дури и да добие слободен софтвер,
па дури и изградена во Mac OS овие денови, помалку во Windows,
е способноста да се безбедно избрише.
Всушност, ако сакате да сите работи дома денес ако имате Mac и го направите ова,
ако имаш некои нешта во вашиот ѓубре може, можете да направите безбедна Празна ѓубрето,
што го прави токму тоа.
Наместо само избрише датотеките тука, тоа не се избрише 0-ти и 1S тука,
напротив, тоа само ја менува сите нив, на пример, да 0-ти и точка, точка, точка.
Значи една од вашите идни psets всушност, ќе биде намерно да поврати податоци -
Фотографиите дека ние сме направени од луѓе, места и нешта на кампусот
за кои ние ќе се направи форензички сликата на мемориската картичка дигитална камера,
која е иста идеја - и ќе мора да се соочат со предизвикот да всушност најдете
на моделите кои ги претставуваат JPEG слики на вашиот хард диск,
многу сличен на оној поранешен студент чија е-мејл читав пред неколку недели не
за враќање на фотографии на сестра си.
Зошто не можеме да ги 5-минутна пауза тука, а ние ќе се регрупираат со повеќе меморија.
Значи тука е местото каде што нештата се малку ум-свиткување, но ова е многу моќен чекор
кон разбирањето на ова сè повеќе и повеќе.
Тука е програма наречена pointers.c.
Тоа е меѓу мостра кодот денес.
Забележете дека во првите неколку линии, 19 преку 22, сите ние сме прави е нешто како GetString
и враќање на адреса, складирање на тоа во с.
Отсега за pset дури и 3 ако сакате, но pset 4 и на
каде што може да почнат да ги преземат овие обука тркала исклучи себе,
не постои причина да се преправаме дека стрингови постои повеќе.
Тоа е сигурно во ред само да почнеме да ја кажуваме char *.
>> Како настрана, во онлајн референци и во книгите често може да се види ѕвезда до променливата.
Можете дури и може да се види простори околу двете страни на него.
Сите тие се функционално точни.
За сега, сепак, ќе се стандардизираат на овој приод да се направи супер јасен
дека char * е како да кажеш карактер покажувачот.
Тоа е тип на податок.
И тогаш името на променливата е и во овој случај.
Значи ние сме добиле стринг и ние го нарече s.
А потоа надолу тука забележите дека јас го правам, всушност, малку на измама.
Ова се нарекува покажувачот аритметика, која е вид на супер едноставен.
Тоа само значи додаде и одземе броеви на покажувачи.
Но, ова всушност работи.
Оваа програма очигледно отпечатоци 1 карактер на стрингот е по линија, така што крајниот резултат -
Само така можеме да ги расипат кога тоа се случува, бидете совети, работи совети, дозволете ми да зумирате внатре
Сега дозволете ми да напишете нешто како ЗДРАВО и видот Влези
и тоа отпечатоци 1 карактери во линија.
До втор пред, ние би го направиле тоа со квадратни загради нотација.
Би имале за телефонска линија и ние ќе го стори printf на е [i] и ние ќе го стори тоа повторно и повторно и повторно
со обратна коса црта n на крајот на секој ред.
Но оваа програма е поинаква. Оваа програма е користење, буквално, аритметика.
Значи она што се случува овде?
Прво на сите, пред овој циклус дури извршува, што, само за да биде јасно, е е всушност?
S е? >> [Студент] Еден адреса. >> Адреса.
>> И тоа е адресата на, во случај на здраво, првиот карактер во тој збор, која е часот.
Така и е, во овој конкретен пример, адреса на час.
Значи она што значи тоа да ги направи + i?
Па, јас започнува од 0 во овој за телефонска линија. Ние го направивме тоа многу пати.
Јас се случува да одам до должината на стрингот, очигледно.
Така, на првата итерација на овој циклус, јас очигледно е 0.
Значи овој израз е велејќи дека е + i - напротив, ги +0--тоа е очигледно само s.
Значи она што е * е тука?
Сега ние сме со користење на ѕвезда во малку поинаков начин.
Дозволете ми да оди напред и да се ослободи од т затоа што ние сме направиле зборуваме за т и копии од е.
Сега ние само сакаме да се раскаже приказна, вклучувајќи ги.
И така во овој момент, откако типот стринг, нашиот свет изгледа доста како тоа го правеше пред
со само на чување на адресата на час и поопшто посочувајќи на низа здраво.
Ако јас сега се направи една линија како * (а + i), да се обидат ова.
Значи * (а + i). Дозволете ми да се поедностави ова, бидејќи ова е 0, така што ова е * (и 0).
Па, почекајте една минута. Поедноставување понатаму. Ова е * (а).
Па, сега заградите се вид на глупави, па сега ајде да направите * s.
Значи во првата итерација на овој циклус, таа линија која е обележано, 26,
е доста еднакво на печатење ова.
Што е податоци за видот на * а?
Во овој контекст, бидејќи ѕвездата се случува да биде до Кликнете себе,
но поконкретно, затоа што ние веќе не се наведува с,
ние не сме создавање на променлива повеќе, нема спомнување на char * во линија 26,
нема споменување на клучни зборови стринг, ние сме само со користење на променлива наречена с,
излегува сега е ѕвезда има малку поинаков и, очигледно, збунувачки значење.
* Кликнете тука значи одат на адреса на и печатење на она што е таму.
Значи s е тука, * s е - вид како Улеи и скали, следете ги стрелките - тука.
Значи ова е * е.
>> Значи она што добива отпечатена на првата итерација на тој циклус во согласност 26?
Јас испечатите% c, која е застапник за лик,
тогаш \ n за нов ред. * (А + i) каде што е 0 е само тоа.
Значи она знак можам да се одржи во за% c? Х
Во следниот повторување на јамка - што веројатно може да се види таму каде што тоа се случува -
следниот повторување i е очигледно 1, па ова значи е 1,
и тогаш сега јас треба на загради бидејќи сега е ѕвезда треба да се каже
одат на мемориската адреса на 1.
Што е е? Ајде да се тркалаат назад во времето и велат дека ова стрелка сега не е, всушност, ни прават какви било услуги.
Да поточно да се каже дека ова е чување на бројот 123
бидејќи на почетокот на овој стринг Здраво, ова е адресата 123, ова е 124, и така натаму.
Така, на втората итерација кога сакам да кажам дека е 1, тоа е како да кажеш 123 1,
инаку позната како 124, така што char добива печатено на втората итерација?
Е на мемориската адреса 124.
Потоа + повторно, 125, 126, 127, и овој циклус за среќа престане пред да го добие тука
бидејќи јас сум со користење strlen да бидете сигурни дека јас не се брои премногу висока.
Па и тоа е тоа.
Повторно, ова е исто како да сме го направиле пред една недела.
Дозволете ми да го напишете на линија подолу иако ние не сакаме да ги работам и двете.
Ова е идентична сега на ова.
>> Значи иако е е стринг, како ние сме биле нарекувајќи за неколку недели, а е навистина char *.
Значи, ако сакаме да бидеме супер анален, тоа е навистина правилно да се напише специфичниот карактер
на ith локација со користење на овие нумерички адреси и оваа ѕвезда оператор,
но искрено, тоа е толку многу почист. Значи ова не е лошо.
Нема причина да престане да прави линија 27 тука, но 26 е функционално иста,
и тоа е функционално исто токму за причините што ние сме дискутирање досега.
И на крај, 29 е само добра пракса.
Повикувајќи без Кликнете значи дека сега си даваат назад меморија која GetString ви даде
бидејќи повторно, како што споменав Понеделник, GetString недели
е воведување на бубачка во вашиот код.
Твојот код за неколку недели имаше меморија протекување
при што баравте GetString за меморија, но никогаш не сум бил давајќи назад.
И тоа беше намерно избран од нас педагогичен
бидејќи тоа е само премногу да размислува за рано.
Но, сега ни треба повеќе симетрија.
Ако побарате компјутер за меморија, како што е случај за GetString,
како што е случај очигледно за Примерок,
мора да сега за pset 4 наваму исто така бесплатно секоја таква меморија.
Забележите ова е различно од велејќи int n.
Вие не треба да се ослободи ова затоа што не си се јавите GetString
и не се јавите Примерок.
>> Па дури и ако се нарекува GetInt како што ние на крајот ќе видиме,
GetInt не алоцира меморија за вас, бидејќи вие всушност може да помине околу броеви
и плови и карактери само начинот на кој ние се прави за неколку недели.
Жици, сепак, се специјални бидејќи навистина тие се сплет на повеќе карактери.
Значи тие се само различни од знаци и плови и ints и слично.
Но ние ќе се вратам на тоа пред долго.
Било какви прашања тогаш на почетокот на покажувачи? Да.
[Нечујни студент Прашање]
Ах, многу добро прашање.
Еден од ретките нешта Ц всушност прави за вас, што е погодно,
е тоа, фигурира за вас што големина е од тип на податоци
а потоа прави тој вид на множење за вас.
Тоа е неважно во случај на карактери, бидејќи скоро секогаш знак е 1 бајт,
па ова едноставно работи.
Но за доброто на дискусија, ако сте биле всушност печатење цели броеви
и ќе се обидуваат да се печати некои вредност на кои се укажува во цел број,
можете слично не би треба да направите + 4 * Јас само затоа што int е 4 бајти.
Покажувачот аритметички значи дека C и компајлерот направи сето она што математика за вас.
Се што треба да се грижи за е пребројување во вид на човечка свест. Да.
[Студент] Ако се изјасни за низа внатре за телефонска линија, не мора да го ослободи подоцна?
Добро прашање.
>> Ако прогласи низа внатрешноста на за телефонска линија, не ви треба за да се ослободи подоцна?
Вие само треба да ослободите меморија што ќе одвои со GetString или со Примерок.
Значи, ако речеме нешто како - дозволете ми да се стави големи загради, па сега сите го кодот е поврзана.
Ако сте направиле нешто, иако buggily, како оваа, char * t = с,
не треба да се ослободи т бидејќи т не се однесуваат на било споменување на Примерок или GetString.
Ако пак сте направиле ова, GetString, тогаш да, ќе треба да се слободно т.
И всушност, вашата единствена шанса да се направи тоа е сега во овој циклус, за истото прашање од делокругот
дека ние сме се дискутира во минатото.
Инаку ќе бидете доделување меморија, доделување меморија, доделување меморија,
и на крајот на програмата, бидејќи ти си надвор од тоа јамка,
т не постои, но никогаш не кажа на оперативниот систем
дека не треба тоа сеќавање повеќе.
И пред долго време, за pset 4 или 5 ќе ви овозможат со програма наречена Valgrind,
која е слични во духот со GDB по тоа што доби нешто на arcane интерфејс,
но неговата цел во животот е да ви помогнеме.
И Valgrind е програма со која во иднина ќе пребарување вашите програми
барате меморија протекување, без разлика дали од GetString или Примерок,
кои ќе почнат да го користат сè повеќе и повеќе како што престане со користење на CS50 библиотека толку многу.
Ние конечно сега имаат вид на речник и вид на ментална модел во теорија
со која треба да се реши овој скршени програма.
>> Така што во овој скршени програма, swap работи во внатрешноста на swap,
но никогаш всушност работел во главниот бидејќи главните донесен во x и y, отповикување,
и оние кои беа донесени од страна вредности, така да се каже.
Копии од нив беа дадени да се разменуваат.
До крајот на swap, a и b се навистина биле разменети,
но се разбира x и y, како што се дискутира во понеделникот, не биле.
Па јас предлагам во зелено тука дека ова е всушност решение тука.
И всушност, дозволете ми да се движи мојот ѕвезди само за да бидат во согласност
иако, повторно, функционално, тоа не е важно.
Во иднина недели ќе објасни кога и зошто тоа не е важно.
Значи во зелена сега е решение.
Искрено, тоа изгледа во целина многу Messier бидејќи имам сите овие ѕвезди.
Дозволете ми да истакнам една работа.
Горниот ред тука, каде што вели int * а и int * b
е фундаментално го прават истото како што секогаш има.
Тоа е прогласување 2 аргументи или параметри да се разменуваат,
од кои првата е int покажувачот нарекува,
Вториот од кои е int покажувач кој се нарекува б.
Единственото нешто што е ново во овој момент е фактот дека има ѕвезда таму.
>> Што значи тоа? А не е int, б не е int.
А е адресата на int и б е адресата на различни int.
Овде, ова е местото каде што јас си признаам C добива збунувачки.
Сега ние сме со користење на ѕвезда, но има различно значење во овој контекст.
Бидејќи ние не сме прогласување совети како ние сме се тука,
тука сме dereferencing работи.
Значи технички, ѕвездата во овој контекст на првата, втората и третата линија во внатрешноста на swap
е Dereference оператор, кој едноставно значи одиме таму.
Па само како прст следи на стрелката за да часот,
* Средство одат на таа адреса и ме најде int дека е таму.
* Б средства одат на адресата и помине мене она што е таму.
Значи, да ја прецрта на сликата од понеделник сега се користи магацинот на рамки,
на дното од кои една ќе биде главен,
горниот еден од нив ќе биде swap,
така што нашиот свет изгледа, исто како и во понеделникот, како оваа.
Еве парче меморија која главни се случува да го користите.
>> Потсетиме од понеделник дека програмата само имаше 2 променливи,
еден вика x и еден вика y, и јас го стави на броеви 1 и 2 не.
Сега кога ќе се јавам разменуваат како што го направив во понеделникот,
претходно кога јас се користи црвена верзија на оваа програма, која изгледа вака,
Добив параметри 2, a и b, и она што го пишуваме тука и тука?
Само 1 и 2, буквално копии на x и y.
Денес ние го промени тоа.
Денес наместо да се донесува во ints a и b ние ќе помине во 2 адреси.
Тие адреси се случи да се укаже ints, но тие адреси не се самите ints.
Тие се адреси. Тоа е како поштенска адреса, наместо.
Па сега ние треба само да си даде малку повеќе детали на екранот.
Ова е меморија на компјутерот ми е како што беше целиот ден.
Сега ние треба некои произволни броеви шема.
Значи, да речеме, само со шанса, дека ова е мемориска адреса 123, 124.
Да речеме ова е 125, ова е 126, и така натаму, но тоа е сосема произволна.
Ние само треба некои нумерирање шема во моето сеќавање.
Па сега кога јас всушност помине во x и y, јас не одам да се помине во x и y;
Одам да помине во поштенска адреса, така да се каже, на x и y
така што она што добива чуваат тука и тука не е 1 и 2,
но ако може да се види мојот мал текст, што ќе поминуваат тука и тука?
[Нечујни студент одговор] >> Токму така. 123 добива стави тука и 124 добива стави тука.
>> Сега, бидејќи јас се користи на ѕвезда во оваа многу првата линија пат до тука во врвот,
мојата програма е само знае дека 123 и 124, иако тие се очигледно броеви
дека секој човек може да забележите, тие треба да се толкува како адреси, нумерички адреси.
Тие не се сами по себе ints, тие се адреси,
а тоа е затоа што сум експлицитно стави ѕвезди таму.
Па сега во мојот прв, втор и трет линија на реалните код она што се случува тука?
Да се ​​подготви остатокот од сликата.
Tmp е исто како што беше во понеделникот. Ништо посебно за мали.
Тоа е само локално 32 бита променлива, и внатре во тоа јас сум очигледно чување на вредноста на * a.
Сега, ако јас само рече tmp = a, она што јас ќе ја стави овде? >> [Студент] 123.
123. Но, тоа не е она што јас го правам.
Сакам да кажам дека tmp = * a. Ѕвезда средства одат таму.
Па овде е, 123. Како можам да одам таму? Преправам како има стрела.
Па, таму е, 1. Значи она што добива чуваат во мали, очигледно? Само 1.
Значи со други зборови, мали е * а, * средство одат на адреса која во моментов е во,
што е очигледно 123.
>> Океј, тука сме на локација 123, гледам број 1,
па ќе одам да се стави број 1 таму.
Сега што да правам во алинеја 2, * a = * б?
Ова е малку повеќе вклучени, бидејќи сега што е? Тоа е 123.
Значи * a е каде? Таму каде што беше пред. Па оди таму. Во ред.
Сега, на крај, а потоа конечно ова ќе почне да се направи смисла, се надевам,
* Б значи она што е во Б? 124. Па јас треба да одам таму, што е 2.
Значи она што можам да се стави каде?
2 оди во тука, бидејќи * б оди во * a. Па јас ќе го направи тоа.
И веќе може да се види, можеби, дека ние сме толку многу поблиску
за решавање на овој глупав, едноставен проблем правилно, за прв пат
бидејќи сега имаме уште сеќавање на она што x е,
имаме 2 копии, очигледно, на y,
но алинеја 3 сега вели * b.
Па овде е б. * Б средства одат таму. Значи, каде е место 124?
Тоа е очигледно тука. Значи она што не го ставам овде? Очигледно, мали.
Па сега јас го направите тоа. Значи имам 1 тука и 2 тука.
И сега што за сето ова, на 123, 124 и 1?
Штом swap враќа, оваа меморија е добра како изгубени
бидејќи штом swap враќа, оперативниот систем
е слободен да го користат меморија повторно во иднина.
Само меморија главниот е на дното на оваа т.н. стек држи околу.
>> И така ние конечно имаат сега работна верзија.
Дозволете ми да одат во swap.c, и забележиме следниве.
На врвот на програмата Се променив мојот прототип да биде int * а и int * b.
Значи единственото нешто што се промени за да одат од црвена, која беше лошо, во зелена, што е добро,
е Јас додадов овие ѕвезди денес.
Но, тогаш тука долу во себе разменуваат морав да го копирате, паста што беше само на слајд.
Имам ѕвезда тука, ѕвезда тука - тоа се совпаѓа со прототип -
а потоа сите овие работи сега има ѕвезди, освен за мали
бидејќи употребата на привремена променлива, нема ништо ново таму.
Јас само треба привремено чување за Инт.
Значи ние не треба ѕвезда таму.
Ние само треба ѕвезда, така што можеме да премине овој вид на произволни граница
помеѓу овие 2 рамки во меморијата на компјутерот ми е.
Но, едно последно нешто мора да се промени, а вие може да го крие веќе.
Што другата линија е очигледно различни сега? >> [Студент] и x.
>> Да, па 25 е на последната линија на кодот што треба да се промени за ова да работи.
Пред една недела, па дури и во понеделникот линија 25 изгледа вака, разменуваат x и y,
и ова е само скршен бидејќи ако се каже swap (x, y)
ќе се даваат копии на x и y да се разменуваат, тогаш таа го прави нејзината работа,
но никогаш не сме всушност менување на x и y себе.
Па дури и ако никогаш не сум видел ваков карактер пред со симболот во кодот,
само да се погоди. Што значи симболот се направи, очигледно?
[Студент] зема адреса. >> Зема адреса.
Па симболот е велејќи ми даде адресата на x.
Кој знае каде е тоа? Се случува да биде 123. Не ми е гајле. Само ми даде адресата на x.
& Y значи ми даде адресата на y.
И во тој момент на приказната е совршено се совпаѓа со сликата што ние привлече момент пред.
>> Па јас ќе признаам покажувачи, сигурно за мене кога јас прв пат започна учење ова,
беа дефинитивно една од најтешките работи кои треба да заврши мојот ум наоколу.
Но сфати, особено затоа што ние ги играте со овие видови на нештата,
ако го срушат овие супер едноставен вид на интелектуално неинтересен проблеми
само се движат брои околу, одговорот на многу конфузија со покажувачи
навистина може да се изведе од овие многу основни механика.
Еве еден адреса. Оди таму со ѕвезда.
Или обратно, тука е симболот. Дознаам што адресата навистина е.
Во ред.
Значи каде е сето ова меморија доаѓаат од?
Ние сме подготвени оваа слика неколку пати, и јас ги ветува ние ќе се вратам на тоа,
но тука е застапеноста на меморијата на вашиот компјутер
тоа е малку повеќе означени од нашите таблата тука е.
Текстот сегмент на врвот претставува она што во врска со вашата програма?
[Нечујни студент одговор] >> Извини? Кажам уште еднаш.
[Студент] Вистинските програма. >> Вистинските програма.
>> Значи 0-ти и 1S дека сте собрани по пишување C код, а потоа работи ѕвекот
и генерирање на 0-ти и 1S завршува добивање сместена таму во меморијата
затоа што кога ќе кликнете два пати на иконата на вашиот Mac или PC
или извршувате командата како Марио во вашата линија, твојот 0-ти и 1S од дискот
се вчитани во меморија, така што компјутерот може да манипулира со нив
и ги изврши побрзо.
Значи иницијализира податоците и деиницијализира податоци, ние нема да зборуваме многу за оние,
но тие се само глобални променливи.
Иницијализиран значи глобални променливи што ви го дал вредности;
деиницијализира значи глобални променливи кои се 'уште не даде вредности.
Потоа, тука е овие животната средина променливи кои јас целосно ќе се бранува мојата рака,
но тие се таму и дека продавници работи како вашето корисничко име
и друг вид на пониско ниво детали.
Но juiciest парчиња распоред вашата меморија е ова нешто наречено магацинот и грамада.
Магацинот повторно, да биде јасно, е меморија што се користи секогаш кога функции се нарекуваат,
секогаш кога постојат локални променливи
и секогаш кога има се параметри кои се раздавани наоколу.
Сето тоа се случува во оџак.
Грамада не сме зборуваше, но претпоставете кој го користи грамада.
Само различен дел од меморијата.
Тоа се случува да се извлечат тука на врвот, но тоа е произволна сликовно конвенција.
Кој очигледно бил со користење меморија од грамада за неколку недели?
Тоа е технички вас, но индиректно. >> [Студент] GetString.
GetString и Примерок. Значи тука е фундаментална разлика.
>> Знаете во изминатите неколку недели дека ако треба меморијата, само декларирате променлива.
Ако ви треба многу меморија, објави низа право во внатрешноста на вашиот функција.
Но, проблемот што го чуваат со кои се соочува е ако декларираат променливи локално внатрешноста на функции,
штом функција се враќа, што се случува со меморијата и оние променливи?
Само вид на тоа е веќе твое, нели? Тоа едноставно исчезнува вид на концептуално.
Тоа е уште физички таму, очигледно, но тоа веќе не е Ваше право е да го користите.
Ова очигледно е проблематично ако сакате да напишете функции во животот
кои, всушност, алоцира меморија и не го даде назад веднаш.
Случај во точка: Целта GetString во животот е да немаат идеја однапред
колку е голема на низа Одам да напишеш на тастатура,
но тоа е мора да биде во можност да алоцира меморија да се одржи Давид или здраво
или цела есеј што корисникот може да внесе внатре
Значи GetString е користење Примерок.
Примерок мора да биде со користење на не магацинот;
наместо тоа е со користење на овој нешто што се нарекува куп.
Нема ништо различни за меморија. Тоа не е побрзо или побавно или нешто слично.
Тоа е само физички во различна локација.
>> Но правило е дека меморијата што е распределени на грамада
никогаш нема да бидат одземени од вас, додека вие го викате - претпоставете - бесплатно.
Спротивно на тоа, било која мемориска ве замолам за на магацинот од само прогласување низа
или декларирање на променлива како што го правеле со недели,
дека по дифолт завршува на магацинот.
И дека работи одлично 90% од времето, но за оние поретки прилики
каде што сакате да алоцира меморија и чувајте го околу себе,
тогаш треба да се користи некоја функција како Примерок.
Или ние се користи некоја функција како GetString, кои за возврат го користи Примерок.
Ајде да видиме каде тоа може да се прекине, а потоа да погледнеме Binky.
Ние ќе се вратам на тоа во иднина.
Овде е супер едноставен програма која во првите 2 линии што прави?
На англиски, она што овие првите 2 линии на код се направи во внатрешноста на главниот?
[Нечујни студент одговор]
Внимателни. Тоа не ми даде адресата на x или y.
[Студент] Дава совети како да ints. >> Добро. Дај ми 2 покажувачи на цели броеви.
Со други зборови, дај ми 2 парчиња на меморија што јас го задржи цртеж денес,
иако јас го избриша сега, како плоштади.
Дај ми 2 парчиња на меморија, наречен X, еден вика y -
порано јас ги повика S и T - и она што е од типот на кој дел од меморијата?
Тоа се случува да ја запази адреса.
Тоа е од тип int *.
>> Значи адреса на int крајот ќе живеат во X,
адресата на некоја int крајот ќе живеат во y,
но на почетокот, она што е внатре на x и y? Кој знае? Ѓубре вредности.
Тоа нема никаква врска со покажувачи.
Ако не сме се стави нешто таму, кој знае што е всушност таму?
Сега, х. Што се случува овде? Ова е legit сега, бидејќи x е покажувач. Тоа е int *.
Па тоа значи дека можам да се стави во х адресата на некои парче на меморија.
Што значи Примерок се врати? Совршена, таа се враќа адреси,
адресата на првиот бајт во целина дел од меморијата.
Колку бајти е ова очигледно распределба, на пример, во апаратот?
Што е со големина на int? 4.
Ако мислите назад кон недела 1, тоа не е супер важно секогаш да се сеќавам дека,
но во овој случај тоа е корисно да се знае, 4 бајти.
Значи ова е распределба на грамада 4 бајти
и тоа е враќање на адресата на првиот мене произволно.
Сега, она што е х прави?
A * x = 42 што прави?
Ако во овој момент во приказната имаме X, кој изгледа вака со некои ѓубре вредност,
ова е сега y со некои ѓубре вредност, сега во алинеја 3 Сум доделени 4 бајти.
Оваа слика суштина изгледа вака.
Или поконкретно, ако ова е произволна адреса 123, тоа е она што нашата приказна сега изгледа како.
* X = 42 сега значи што? Тоа значи одат на адреса 123 и ставете број 42 таму.
Јас не треба да се подготви овие редови затоа што ние не правиме жици.
>> Јас треба да имаат само напишано вака, и само заради демонстрација на,
42 како int вид на зазема многу простор, 4 бајти.
Значи тоа е она што се случило таму, но има еден проблем сега.
* Y = 13. Што ќе се случи тука?
Проблемот е * y во нашата поедноставен светот само значи одат на адреса во y.
Што е во y? Тоа е некои ѓубре вредност.
Значи, да претпоставиме дека ѓубрето вредност е 5551212, нешто лудо како што.
* Y средства одат за решавање на 5.551.212.
Тоа е како овде. Таа не постои, на пример.
Значи * y добива 13 значи јас се обидувам да се подготви 13 тука. Тоа не постои.
Сум го надмина сегмент на табла. Што можам да добијам?
Тоа криптичната порака сегментација грешка, бидејќи јас се обидувам да се стави во меморија
вредност како 13 на место кое не постои.
Остатокот од програмата би можеле да работат во ред, но до тој момент не постои.
Па ајде да се обидеме да кажам оваа приказна.
Ние ќе се вратам на тоа еднаш ние разговаравме за хексадецимален.
Да се ​​вратиме на ова и да склучува со оваа работа наречена Binky,
кој се потсетиме е професор Стенфорд седат дома игра со claymation,
да ја раскаже приказната за точно истата програма.
Тоа е само околу 3 минути. Тука имаме Binky.
[Машки говорник на видео] Еј Binky, разбудам. Тоа е време за покажувачот забава.
[Binky] Што е тоа? Учат за покажувачи? О, стрина!
[Машки звучник] Па, да започнеме, претпоставувам дека ние ќе треба неколку совети.
>> [Binky] Во ред. Овој код доделува 2 совети кои може да укажуваат на цели броеви.
[Машки звучник] Во ред. Па, гледам 2 покажувачи, но тие не се чини дека се укажува на ништо.
[Binky] Дека е во право. Првично, показалки не упатуваат на ништо.
Работите што се укаже се нарекуваат pointees, и поставување на нив е посебен чекор.
[Машки звучник] Ох, нели, нели. Знаев дека. На pointees се одвоени.
Ир, па како да одвои pointee?
[Binky] Во ред. Овој код доделува нов број pointee, и овој дел поставува на X да укажуваат на тоа.
[Машки звучник] Еј, што изгледа подобро.
Така осигурајте се да го направи тоа нешто. >> [Binky] Во ред.
Јас ќе Dereference на покажувачот на X да ја запази бројот 42 во своето pointee.
За овој трик ќе ми треба моето магично стапче на dereferencing.
[Машки звучник] Вашиот магично стапче на dereferencing? Тоа е одлично.
[Binky] Ова е она што го кодот личи. Јас само ќе се постави на бројот и ... [Пукање звук]
[Машки звучник] Еј погледнете, оди.
Значи прави Dereference на х следи стрелката за да пристапите до своите pointee,
во овој случај за да ја запази 42 во таму.
Еј, обидете се да го користите за чување на број 13 преку други покажувач, г.
[Binky] Во ред. Јас само ќе поминат тука на Y и да добијат број 13 се постави
а потоа да стапот на dereferencing и само ... [Зуењето на звукот] Леле!
[Машки звучник] О еј, тоа не функционира.
>> Да речеме, Binky, јас не мислам дека dereferencing y е добра идеја
бидејќи поставување на pointee е посебен чекор
и јас не мислам дека ние некогаш го направив тоа.
[Binky] Хм, добра поента.
[Машки звучник] Да. Ние доделени на покажувачот y но ние никогаш не го постави да се укаже на pointee.
[Binky] Хм, многу капацитет.
[Машки звучник] Еј, ти си изгледа добро таму, Binky.
Можете да го поправам така што y поени на истиот pointee како х? >> [Binky] Секако.
Ќе се користи моето магично стапче на покажувачот задача.
[Машки звучник] е дека ќе биде проблем како и пред тоа?
[Binky] Не, ова не допре pointees.
Тоа само ја менува еден покажувачот да се укаже на една иста работа како на друг. [Пукање звук]
[Машки звучник] О, гледам. Сега y поени на истото место како x.
Па почекајте. Сега y е фиксна. Таа има pointee.
Па може да се обидете стапот на dereferencing повторно да се испрати на 13 завршена.
[Binky] Ух, добро. Овде оди. [Пукање звук]
[Машки звучник] Еј, види го тоа. Сега dereferencing дела на y.
И бидејќи покажувачи се делат дека еден pointee, тие и двете се види 13.
[Binky] Да, споделување. Сеедно.
>> Значи одиме да се префрлиш места сега?
[Машки звучник] О изглед, ние сме надвор од времето. >> [Binky] Но -
[Машки звучник] Само сети се на 3 покажувачот правила.
Број 1, основната структура е дека имате покажувач и тоа укажува текот на pointee.
Но покажувач и pointee се одвоени, а честа грешка е да се постави покажувач
но да се заборави да го даде pointee.
Број 2, покажувачот dereferencing почнува на покажувачот и го следи неговото стрелката над
да пристапите до своите pointee.
Како што сите знаеме, ова работи само ако постои pointee,
кој вид на се врати да владее број 1.
Број 3, покажувачот задача трае еден покажувач и менува тоа
да се укаже на истиот pointee како уште еден покажувач.
Значи, по задача, 2 покажувачи ќе укаже на истиот pointee.
Понекогаш тоа се нарекува споделување.
>> И тоа е сè што постои на неа навистина. Bye-bye сега.
Ова е Binky. Ова е CS50. Ние ќе се видиме следната недела. [Аплауз]
>> [CS50.TV]