[Музички] Дејвид Џ MALAN: Во ред. Ова е CS50, и тоа е крајот на недела четири. И една од темите за денес е дека на дигитални криминолошки науки, уметноста на наплата на информации. И навистина, иако ти си во средината сега на мирот на три и Збег, следната недела, фокусот ќе биде на Токму овој домен. Па една од најкул работни места што некогаш сум имаше се врати во дипломиран училиште, кога работев за локалните Middlesex Каунти Окружниот правобранителство канцеларија, го прават криминолошки науки работи. Значи во суштина, во Масачусетс Државната полиција, по повод, кога се работи за случаи би донесе во работи како хард дискови и флопи дискови и мемориски картички и слично. И тие ќе ги предаде мене и мојот ментор, и нашата цел е да се најдат докази, дали има било, на овие медиуми. Сега, може да се види глетка на овој свет на криминолошки науки во медиумите, ТВ и филмови. Но работата морав, и daresay дека светот, не е сосема како ќе го видите. Ајде да ги погледнеме во она што Веројатно сте виделе. [Видео репродукција] -OK. Сега, ајде да се добие добар поглед на вас. [Музички] Чекај тоа. Се кандидира тоа назад. Чекај една минута. Одат право. -Нема. Замрзнување тоа. -Full Екранот. -OK. Замрзнување тоа. -Tighten Врз тоа, ќе ви? -Vector Во на таа дечко од страна на задното тркало. -Zoom Во право тука на ова место. -Со право опрема, сликата може да се зголемени и изострен. Што е тоа? -Тоа е програма за подобрување. Може ли ќе јасно дека која било? -Јас Не знам. Ајде да го подобрат. -Enhance Дел А6. Јас подобрена детали, and-- -Мислам Има доволно да се зголеми. Ослободете ја на мојот екран. -Јас Подобрена одраз во нејзините очи. -Ајде Се кандидира тоа преку засилувач на видео. -Edgar, Може да се подобри ова? -Hang Натаму. -I've Работи на ова размислување. Одраз на нечиј Таму е. -Reflection. Таму е одраз на лицето на човекот. -На Одраз! Таму е рефлексија. -Zoom Во на огледалото. Може да се види одраз. Може ли да се подобри сликата од тука? Може ли да го подобрат? Може ли да го подобрат? Може ли ние подобри ова? Може ли да го подобрат? Чекај една секунда. Ќе се зголеми. -Zoom Во на вратата. -Times 10. -Zoom. -Move Во. -Повеќе. Чекај, да престане. -Stop. -Pause Тоа. -Rotate Ни 75 степени околу вертикалната, ве молам. -Stop. Врати се на дел за врата повторно. -Got Слика подобрувач кои можат да bitmap? -Можеби Може да се користат Pradeep Синг метод за да се види во Windows. -На Софтвер е држава на уметноста. -На Eigenvalue е исклучено. -Со право комбинација на algorithms-- Земени осветлување -Тој на алгоритми за да на следното ниво, и можам да ги користите за да подобрување на оваа фотографија. -Lock На и зголемување на z-оската. -Enhance. Подобрување. -Enhance. -Freeze И подобрување. [END видео репродукција] Дејвид Џ MALAN: Значи тоа се сите зборови, но тие не беа се користи во реченици правилно. И навистина во иднина, во секое време, Ве молиме, ќе слушнете некој каже зборот, "Подобрување", насмевка само малку. Затоа што кога ќе се обидуваат да ги подобрат, На пример, тоа е она што се случува. Значи тука е згодна слика. Ова е свој Daven CS50 е. И да претпоставиме дека сакавме да се фокусираат на сјај во окото, или одраз на лошо момче кој беше јасно заробен од страна на безбедноста камера. Тоа е она што се случува кога зумирате на сликата, кој има само ограничен број на битови поврзани со неа. Тоа е она што ќе добиете. И навистина, во очите на Daven е само четири, можеби шест пиксели кои ја сочинуваат точно беше glimmering таму. Па Проблем постави четири на крајот ќе имаат да истражуваат овој свет, особено од природата на нешто што ние го нарекуваме датотека I / O, каде што I / O е само стилизиран начин велејќи влез и излез. Па досега, на сите интеракции имавме со компјутер во голема мера со тастатура и екран, но не толку многу со хард диск, или спасување на датотеки надвор од оние што се пишува. Вашите програми досега имаат не е создавање и спасување, и ажурирање на своите датотеки. Па, она што е датотека? Добро, нешто како JPEG. Ова е слика што може да имаат или испратите на Фејсбук, или види никаде на интернет. Всушност, таа слика ние само видов на Daven беше JPEG. И она што е интересно за датотеки како JPEG слики е дека тие можат да се идентификуваат, обично, од страна на одредени модели на битови. Со други зборови, што е тоа што разликува JPEG од GIF од пинг од Word документ од Excel датотеката? Па, тоа е само различни шеми на битови. И оние кои се различни модели се обично на почетокот на овие датотеки. Така што кога вашиот компјутер се отвора Збор doc, или кога компјутерот отвора JPEG, изгледа обично на Првите неколку битови во датотека. И ако тоа го препознава шема, што се вели, ох, ова е сликата. Дозволете ми да го прикаже корисникот како графички. Или, ох, ова изгледа како Word doc. Дозволете ми да го покаже на корисникот како есеј. Така на пример, JPEG слики, што се испоставува, се прилично софистициран под хауба. Но првите три бајти во повеќето секој JPEG почне со овие три броја. Па бајт нула, еден, а двајца се во повеќето секој JPEG, 255, потоа бројот 216, тогаш бројот 255. И она што ќе биде во можност да се започне следната недела е, всушност, ѕиркаа под хаубата на датотеки како JPEG слики и како bitmap датотеки, и при гледањето она што отсекогаш била таму за колку како сте биле со користење на компјутер. Но, она што е таму не е типично напишано вака децимални броеви како оваа. Компјутерски научници не имаат тенденција да се зборува во децимални. Тие навистина не зборува во бинарна. Обично, кога сакаме да го изразат броеви, ние всушност ги користат хексадецимален, кој може да се сети од, да речеме, Проблем Постави Еден, што предизвика да се размислува за друг систем. Ние, се разбира, се запознаени со децимален, нула преку девет. Ние разговаравме за бинарни. И ние навистина не треба да го користите дека многу тука на надвор, бидејќи компјутери ќе ги користат тие. Но, програмерите ќе многу често, но не секогаш, користете хексадецимални, кој едноставно значи имате 16 букви во вашата азбука, за разлика од две или 10. Па како не ви смета на повисоки од девет во хексадецимален? Одиш 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, само по конвенција. Но, она што е клучот е во тоа што секој на овие е еден симбол. Нема 10. Нема 11, сам по себе, бидејќи секоја на вашиот бројки, исто како и во децимална и исто како и во бинарна, треба само да биде еден лик, со конвенција. Така што потоа е азбука имаме на располагање за хексадецимален. Значи она што не е JPEG изгледа ако беа да се напише оние првите три не бајти како децимална но, на пример, како хексадецимални? И зошто е хексадецимален дури сето тоа корисно? Па, еден брз поглед на пример. Значи, ако јас се напише на битови кои претставуваат овие децимална numbers-- ова може да биде малку 'рѓосан сега од неколку недели наназад, но левата и вистинскиот се прилично лесно. 255 е најголем број се би можеле да претставуваат со осум бита. Сето тоа е оние. Па само оној кој е благо Интересно е средината една. И ако вид на прават на математика, ќе се заклучи дека, навистина, дека шемата на една и нули претставува 216. Па да предвидува за сега дека тие се точни. Но, зошто е тоа интересно? Па, еден бајт, се разбира, е осум бита. И излегува дека ако мислите на бајт како две парчиња од четири бита, вака. Дозволете ми само да додадете некои простор. Значи пред, после. Јас сум само додава некои белиот простор заради визуелизација тука. Како може сега ние ги претставуваме во, да речеме, хексадецимален секој quad на битови, секој сет на четири битови? Така на пример, на левата страна сега, имаме 1111 во бинарен. Што е тоа број во децимали, ако се направи надвор од математика? Имате оние место, twos место, на четири место, и Eights место. ПУБЛИКАТА: 15. Дејвид Џ MALAN: Тоа е 15. Значи, ако правиме осум плус четири плус два плус еден, да добиеме 15. Па можев да запишам 15 подолу 1111, но целата поента тука е хексадецимален не, децимала. Така, наместо на пишување на одредување на 15, 1-5, Одам да се напише дека во хексадецимален, што ако мислите назад, ако имате нула преку ѓ, што е 15 ќе биде? ПУБЛИКАТА: ѓ. Дејвид Џ MALAN: Значи излегува тоа е ѓ. И можете да работите дека надвор со зборовите: и, ако е 10, тогаш во ред, f е 15. Па навистина, би можеле да ја преработи истиот сет на броеви, како ѓ ѓ. А потоа ако се направи малку математика, ние ќе се заклучи дека тоа е г. Осум е прилично лесно, затоа што имаат еден во осмици место. И тогаш, имаме уште неколку ѓ ѓ е. Значи она што луѓето имаат тенденција да се направи од страна на конвенцијата кога тие ги користат хексадецимален е тие само пишувам ова малку повеќе посочно, се ослободи од повеќето од тоа белиот простор. И само за да биде супер јасно читателите дека ова е хексадецимален, едноставна конвенција меѓу луѓето е да се напише нула x, која нема значење други од визуелен идентификатор, тука доаѓа хексадецимален број. И тогаш, ќе се стави на две цифри, ѓ f во овој случај, тогаш d a, тогаш f f. Па скратам приказната, хексадецимален само има тенденција да биде корисно, бидејќи секој од своите бројки, нула преку ѓ, совршено линии со модел на четири бита. Значи, ако имате два хексадецимални цифри, нула преку Ф, повторно и повторно, кој ви дава совршено осум битови или еден бајт. Па тоа е зошто тоа се стреми да биде конвенционално корисни. Нема интелектуална содржината навистина надвор од тоа, освен нејзиниот вистински корист. Сега JPEG слики не се единствените формати на датотеки за графика. Вие би можеле да се потсетиме дека постојат вака слики во светот, барем од неколку години назад. Значи ова е всушност инсталиран во Windows XP на милиони компјутери низ целиот свет. И ова беше bitmap датотека, BMP. И bitmap датотека, како што ќе видите следната недела, исто како модел на точки, пиксели што тие се нарекува, мапа на битови, навистина. Значи она што е интересно, сепак, за овој формат на датотека, BMP, е дека под хаубата, тоа има повеќе од само три бајти кои ја сочинуваат неговата насловот, па да се каже, првите неколку убоди. Тоа всушност изгледа малку комплициран на прв поглед. И ќе видите ова во П сет. И добивање на нешто особено од ова сега не е толку важно, како што само фактот дека на почетокот на секоја bitmap датотеки, графички формат, има еден куп на броеви. Сега Microsoft, Авторот на овој формат, има тенденција да се јавите на оние работите не ints и знаци и плови но зборовите и г зборови и копнее и бајти. Па тие се само различни типови на податоци. Тие се различни имиња за истото. Но, ќе видиме дека во Р постави четири. Но, ова е само да се каже дека ако човекот двојно кликне некои .BMP датотека на неговиот или нејзиниот хард диск, и се отвора панел се прикажува на него или неа таа слика, што се случи, бидејќи на оперативниот систем веројатно забележал не само продолжување .BMP датотека во името на датотеката, но исто така и фактот дека има некои конвенција на моделот на битови на самиот почеток тоа bitmap датотека. Но, ајде сега се фокусира на таква комплицирана датотека, но наместо на нешто како ова. Претпоставувам дека тука во gedit, јас само треба почетоците на програмата што е прилично едноставна. Имам некои вклучува до врвот. Сега имам # Include "structs.h", но Ќе се вратам на тоа во еден момент. Но, ова е корисно за сега. Значи ова е програма што се случува да се имплементираат како база на податоци на Секретарот. Па на база на податоци на учениците, и секој студент во светот има име и куќа и веројатно некои други работи, но ние ќе го задржи едноставна. Секој ученик има име и куќа. Значи, ако сакав да напишам програма чија цел во животот Само да iterate од нула на до три, ако има тројца студенти на Универзитетот Харвард. И сакам само да добие, користење GetString, секој студент име и куќа, а потоа само печати оние надвор. Ова е вид на како недела Еден, недела две работи сега, каде што само сакаат за јамка или нешто слично. И сакам да се јавам GetString неколку пати, а потоа печати ѓ неколку пати. Па, како би можел да го направите ова, иако, кога и име и куќа се вклучени за секој ученик? Значи мојот прв инстинкт би можеле да биде да се направи нешто како ова. Јас прв пат може да се каже, добро, дај ми, кажам, низа од стрингови се нарекува имиња. И јас не сакам hardcode три тука. Што сакам да се стави таму? Така што студентите, бидејќи тоа е само постојана прогласи на врвот, само така јас не мора да hardcode три во повеќе места. На овој начин, можам да го промени едно место, и тоа влијае на промена насекаде. И тогаш, би можел да го направи низа сместени студенти. И сега, би можел да направи нешто како за (int i = 0; i <студентите; јас ++. Па јас сум пишување брзо, но тоа е веројатно запознаени синтакса сега. И сега, ова е понов. Ако сакам да се стави во i-тиот име на студентот, мислам дека го направите тоа. И тогаш, не имиња но куќи заградата јас. Јас го направите ова, GetString, и нека се навратам и да ја поправите оваа линија. Се согласувате? Не се согласувате? Тоа не е многу пријателски за корисниците. Не сум изјави корисникот што да прави. Но, сега, ако јас, исто така, сакаше да подоцна, да да речеме, печати овие работи out-- па НАПРАВИ подоцна. Јас ќе одам да направите повеќе со this-- ова веројатно применува правилна примена на добивање на имиња и куќи, три од нив вкупното на секој, од корисник. Но тоа не е многу добар дизајн, нели? Што ако студентот има не само името и куќа, но, исто така, матичен број, и телефонски број, и е-мејл адреса, а можеби и почетната страница, и можеби рачка Твитер, и било кој број на други детали поврзани со студент или лице, поопшто. Како ќе почнат да се додаде функционалноста на оваа програма? Па, јас се чувствувам како наједноставен начин би можеле да биде да се направи нешто како, да речеме, int ИД студенти. Така што може да се стави сите свои лични карти во таму. А потоа, за нешто како телефонски броеви, Не сум сигурен како да се претставуваат дека само уште. Па ајде да одиме напред и само повик овој Чурлика студенти, што е малку чудно, but-- и еден куп повеќе полиња. Почнав да се ефикасно копирајте го и ставете тука. И ова се случува да расте прилично тежок прилично брзо, нели? Зарем не би било убаво ако имаше во светот на податоци структура позната не како int или стринг, но нешто повисоко ниво, апстракција, па да се каже, познат како студент? Ц не доаѓаат со вграден во функционалност за студентите, но што ако сакав да го даде како? Па, што се испоставува, јас ќе одам да отворите датотека наречена structs.h тука, и можете да го направите токму тоа. И ние си оди за да се започне тоа сега. И под хаубата на Р постави три, веќе сте правеле тоа сега. Не постои такво нешто како е rect или Г овална во програмскиот јазик С Луѓе во Стенфорд имплементирани оние типови на податоци со користење на овој пристап тука, прогласувајќи свои нови податоци видови користење на нова клучен збор наречен struct и друг еден вика typedef. И навистина, иако синтаксата изгледа малку различен од нешто видовме претходно, во принцип, тоа е супер едноставен. Ова само значи "се дефинира тип." Тоа ќе биде структура, и структура е исто како сад за повеќе работи. И дека структурата се случува да имаат низа наречен име, и низа наречен куќа. И да ја наречеме, само за погодност, целата оваа податочна структура студент. Значи во моментот кога ќе се стигне до точка-запирка, имаш сега создаде свој податоци тип наречен студент што сега стои рамо до рамо со int, и плови, и знак, и стринг, и g rect, и g овална, и било кој број други работи луѓето измислиле. Значи она што е корисно за оваа сега е дека ако се вратам да struct 0, а заврши овој имплементација, која ја напишав однапред тука, забележите дека сите на неизбежен messiness дека беше за да почнат да се случуваат, како што додаде телефонски броеви и Чурлика и сите овие други работи кои треба да дефиниција на студентот, сега тоа е посочно заврши како само една низа на студентите. И секоја од оние студенти кои сега има повеќе нешта во него. Така што само остава едно прашање. Како да добиете на името, и куќата, и проект, и што друго е внатрешноста на студентите? Супер едноставен, како и. Нова синтакса, но едноставна идеја. Вие едноставно индекс во низа, како што беше минатата недела и тоа. И она што е јасно нова фигура на синтакса? Само., Што значи "оди во внатрешноста на структура и се од областа наречена име, се на областа наречена куќа, добиете областа наречена ученик ". Па во P постави три, ако сте уште работат на тоа, и повеќето луѓе се уште се, да сфатат дека како што започнете да го користите работи како g rects и е ovals и други работи кои не се чини дека доаѓаат од недела нулта, еден, или два, сфатат дека тоа е затоа што на Стенфорд прогласена за некои нови типови на податоци. И навистина, тоа е токму она што ќе направи, како и, во P постави четири, кога ние почнуваме да се занимаваат со работи како слики, bitmaps, и многу повеќе. Па тоа е само навестување и ментална модел за она што е да дојде. Сега, јас одолговлекува малку ова утро. Бев вид на љубопитни да видиме што позадина Microsoft всушност Изгледа денес. И излегува некој во 2006 всушност отиде на речиси точно на истото место да се фотографираат во реалноста она што изгледа како тоа овие денови. Теренот е сега малку обрасната. Значи се зборува сега за слики, ајде да се врати Daven тука на екранот и Никола, и само да ве потсетам дека ако би сакале да ни се придружат за ручек овој петок, од глава до нашите вообичаени рачно овде. Значи каде се остава во понеделник? Воведовме овој проблем, нели? Ова беше навидум точно имплементација на swap, при што земајќи две ints, еден вика, еден вика б, разменуваат со нив, исто како и Лаура не тука на сцената со млеко и вода, со користење на привремен променлива, или празен чаша, така што можеме да го стави б во а во б без да се прави хаос на нештата. Ние се користи променлива. Таа се вика Темп. Но, што е од фундаментално значење проблем со овој код во понеделник? Што беше проблемот тука? Да. ПУБЛИКАТА: Тоа зафаќа повеќе простор. Дејвид Џ MALAN: зазема повеќе простор, бидејќи јас сум со користење на променлива, и тоа е во ред. Тоа е вистина, но јас сум одам да се каже дека е во ред. Тоа е само 32 бита во големата шема на нештата, па не е голема работа. Други мисли? ПУБЛИКАТА: Тоа само свопови променливи на локално ниво. Дејвид Џ MALAN: Токму така. Тоа само свопови променливи на локално ниво. Бидејќи секој пат кога ќе се јавите на function-- кога имав коцки од Annenberg последен пат, ќе мора главните на дното. Штом ќе се јавите на функција наречена swap, swap не добие x и y, на оригинални вредности. Она што го прави трампа ГЕТ, не тврдиме? ПУБЛИКАТА: Копиите. Дејвид Џ MALAN: Значи копии од нив. Па тоа добива еден и два, ако потсетиме на пример од последниот пат, но копија од еден и два кои успешно се заменети. Но, за жал, на крајот, тие вредности се уште е иста. Па ние може да се види со нашите нов пријател, се надевам GDB, дека или TFS и Ca имаат те водечки кон како што следи. Па нема трампа потсетиме изгледа like-- ајде отвори this-- изгледа вака. Ние се иницијализира х до еден, у две. Имаше еден куп на печатење на f. Но, тогаш, клучот повик тука е да се разменуваат, кој Токму кодот ние само видов пред една момент. Што е точно во првиот поглед, но функционално, оваа програма не работи, бидејќи тоа не трајно разменуваат x и y. Да видиме ова, брз топло тука со GDB, а ./noswap. Еден куп на огромна информации кои Ќе се ослободи од со контрола на L за сега. И сега, јас ќе одам да оди напред и да ја стартувате неа. И, за жал, дека Не беше толку корисни. Тоа траеше програмата внатрешноста на оваа програма наречена GDB, дебагер, но тоа не ми дозволи да ѕиркаат наоколу. Па како можам да всушност пауза извршување во внатрешноста на оваа програма? Па се скрши. И јас може да се скрши на било кој линија број, еден, 10, 15. Но, јас, исто така, може да се скрши симболично велејќи пауза главни. И што се случува да се постави пауза точка, очигледно на линијата 16 во главниот. И каде е линијата 16? Ајде да одиме до кодот и да си одат до noswap. И навистина, линија 16 е прв во програмата. Па сега, ако јас одам напред и видот ја извршите оваа време, Внесете, тоа паузира. Значи, да ѕиркаат наоколу. Печати x-- зошто е х нула? И да го игнорира знакот за долар. Тоа е само за познавач користење на програмата. Зошто е х нула во моментот? Да. ПУБЛИКАТА: Тоа пауза право пред линија 16, всушност, не се на линија 16. Дејвид Џ MALAN: Токму така. GDB, по дифолт, го паузира извршување пред линијата 16. Па тоа не е извршена, кои значи x е на некоја непозната вредност. И добивме среќна поради тоа што тоа е нешто како чиста нула. Па сега ако сум тип следната, сега извршува 16. Тоа ме чека да се изврши 17. Дозволете ми да оди напред и да печати х. Тоа е една. Дозволете ми да оди напред и да печати y. Што треба да се види сега? ПУБЛИКАТА: [Беззвучен] Дејвид Џ MALAN: А малку погласно. ПУБЛИКАТА: [Беззвучен] Дејвид Џ MALAN: Не баш консензус. Така да, можеме да видиме некои ѓубре вредност. Сега, y е 134514064 таму. Па, тоа е само некои ѓубре вредност. Мојата програма користи RAM меморија за различни намени. Има други функции. Други луѓе, пишува во мојот компјутер. Па оние битови се користат за други вредности, и она што го гледам е остатоци од некои пред користењето на тоа сеќавање. Па не е голема работа, бидејќи штом како што типот следната, а потоа печати y, тоа е иницијализиран на вредноста што сакам. Па сега, ајде да одиме напред малку побрзо. N за следната. Да го направиме тоа повторно. Да го направиме тоа повторно. Но, јас не сакам да ја погоди тука, затоа што ако јас сакате да видите што се случува во внатрешноста на swap, што е команда? ПУБЛИКАТА: чекори. Дејвид Џ MALAN: чекори. Значи ова ме чекори во функција, наместо над неа. И сега, тоа е малку криптичната искрено, но ова е само ми кажува јас сум во линија 33 сега. И да го направиме тоа повторно. Печати Темп. Ѓубре вредност, негативни ова време, но тоа е само уште ѓубре вредност. Значи, да правите следно, печатење Темп. Тоа е иницијализиран на 1, која беше на вредноста на x, aka a. Сега, каде се нашите а и х доаѓаат од? Па, известување во главната, ние наречен овие вредности x и y. Ние тогаш помина нив да се разменуваат како што следи. X прво, y запирка. И тогаш, swap можеле да ги наречеме x и y. Но, за да биде појасно, тоа е нарекувајќи ги a и b. Но, a и b сега се случува да биде копии на x и y, соодветно. Значи, ако јас се вратиме на GDB, Temp сега е еден и сега е еден. Но, ако го направам следниот и сега го прават печатење а, веќе се пресели во текот. Млекото е влегоа во поранешната стакло сок на портокал, или обратно. И ако го направам следната еднаш, и сега ако јас испечатите како разумност проверка, a е уште двајца, но б сега е еден. Искрено, тоа е уште таму. Не ми е гајле што е температура. Но, штом јас сега пишувате, да речеме, продолжи да оди назад, сега сум на крајот програмата. И, за жал, x е уште еден и y се уште две. Значи она што е на полезноста на GDB таму? Тоа не ми помогне да го поправи проблемот сам по себе, но се надевам да ми помогне сфатам тоа преку реализирање дека Да, мојата логика е во право, но мојот код не е во крајна линија има трајна влијание. Па тоа е проблем ние сме случува сега реши денес. Но, ајде да стигнеме таму по пат на ова. Стринг е лага. Тоа, исто така, не е тип на податок која постои во C. Тоа е е синоним за некои време за нешто друго, и ние може да се открие дека на следниов начин. Дозволете ми да оди напред и да се отворат програма наречена спореди-0. И наместо да пишувате оваа надвор, ќе почнеме да одиме низ кодот Јас веќе пишувавме, но тоа е само неколку линии. Значи ова е споредба на-0. И првото нешто што го правам е добивање на една линија на текст. Но се забележи она што сум прави за прв пат. Она што е различно јасно за линија 21? Всушност, почекајте една минута. Ова е копија два. Тоа не е дури и правото програма. Добро, спојлер алармирање. Добро, па не е важно тоа. Тоа е одговорот на иднината прашање. Тука се спореди-0, а јас сум за да се добие една линија на текст. Програмата е многу поедноставно. Значи ова е јасна. Ова е како недела Еден, недела две нешта во моментот. низа s = GetString. Сега, јас го кажам уште еднаш овде долу. низа t = GetString. И тогаш, последното нешто што во овој програма, како што сугерира името, е јас ќе одам да се обиде да ги споредите. Значи, ако с, првата низа, еднаква = t, тогаш јас сум одам да се каже што пишувате истото. Друго, јас ќе одам да се каже што пишувате различни нешта. Значи, да ги собере и да ја стартувате програмата. Така осигурајте се споредуваат нула. Изгледа добро. Не компилација грешки. Дозволете ми да оди напред сега и напишете ./compare-0. Дозволете ми да оди напред и да каже нешто : Daven и нешто: Роб. И јас внесете различни нешта. Досега, толку добар. Програма се чини дека е точно. Но, ајде да се кандидира повторно. Кажи нешто: Габе. Кажи нешто: Габе. Во ред. Можеби и јас хит простор бар или нешто фанки. Да го направиме тоа повторно. Па Zamyla. Zamyla. Различни нешта. Значи она што се случува? Па ние имаме овие две линии на код, GetString се нарекува двапати. И тогаш, јас сум едноставно обидувајќи се да се споредат s и t. Но, она што навистина се случува тогаш? Па, мојот ракопис е за да се месар овој пример на некој начин. И ајде да всушност фрли ова до овде, како и. Значи имаме една линија како низа s = GetString. Па тоа е само првата интересна линија од таа програма. Но, она што сето ова време е се случува под хаубата? Па, на левата страна е стринг, кој е некој вид на променлива, и се вика ОК. Па знам дека ова е користење на меморијата, или RAM меморија во компјутерот ми некако. Па јас ќе одам да апстрактно подготви дека како плоштад. 32 бита, што се испоставува, но повеќе за тоа во иднина. И тогаш, што се случува овде? Па, очигледно GetString добива низа од корисникот. И GetString доби Zamyla или Габе или Daven. Значи, да го изберат првиот на оние, што беше Daven. Толку ефикасно, што GetString доби мене дека првиот случај беше Д-а-с-е-n. И тогаш, што друго не го даде мене тајно? ПУБЛИКАТА: [Беззвучен] Дејвид Џ MALAN: Да, ликот / 0 или нула. Така што ефикасно ми даде стринг. Но, ние веќе знаеме од претходните Изгледа дека стрингот е само низа на карактери, и тоа е раскинат од страна на оваа специјална стража карактер, / 0. Но, ако ова е вистина и ова е плоштад, ова е јасно многу поголеми правоаголник. И навистина, ова е, Тврдам, само 32 бита. И тоа е јасно повеќе од 32 битови, бидејќи ова е веројатно осум плус осум плус осум плус осум плус осум, само затоа што на бајти во ASCII. Како е грижам одиме да се вклопи Daven во кутивчето тука? Па, она што е GetString всушност прават? Па, ова решетка тука претставува меморија мојот компјутер или RAM меморија. Значи, да произволно велат дека ако секоја од овие претставува бајт, тогаш можеме да размислуваме за секоја бајт како што имаат на адреса, како 33 Оксфорд Стрит, или 34 Оксфорд Стрит, или 35 Улица Оксфорд. Значи исто како и домови имаат адреси и згради имаат адреси, затоа направете индивидуални бајти од меморија имаат адреси или броеви , кои еднозначно ги идентификуваат. Сега, ова е произволен. Но, за да биде едноставно, јас ќе одам да користете хексадецимални само со конвенцијата, но 0x значи ништо друго од "ова е хексадецимален". и јас одам да се тврди дека "Д" завршува на Бајт Еден во меморијата. Добив ништо друго случува во меморија, па Daven го доби првиот спот на Бајт Еден. Ова, тогаш, е и ќе биде 0x2. Ова се случува да 0x3. Ова се случува да биде 0x4. Ова се случува да 0x5. Ова се случува да биде 0x6. Но штом ќе почнам да размислувам за тоа што го прават на компјутерот под капакот на моторот, можете да почнете да заклучиме како вас, пред неколку години, би имаат имплементирано Ц себе. Што е GetString веројатно returning-- поради тоа се чувствува како тоа не е враќање Daven, само по себе, бидејќи тој сигурно нема да се вклопат во оваа мала box-- Значи она што е GetString веројатно се враќа? ПУБЛИКАТА: [Беззвучен] Дејвид Џ MALAN: Локацијата на Daven. И тоа е тоа оттогаш недела Еден. Што GetString е навистина враќање не е стринг, сама по себе. Тоа е една од малиот бели лаги. Тоа е враќање на адреса на стринг со меморија, уникатната адреса. Daven живее на 33 Оксфорд Стрит. Но повеќе посочно, Гавин живее на 0x1, адреса Број Еден. Значи она што добива се стави во ова мала кутија, тогаш, да биде јасно, е само адресата на таа низа. Така што сите тоа време, овој се случува. Но, она што ова навестува сега е дека ако сите е има е број во него, кој е да ви запре, програмер, од ставање било кој број во секоја променлива и само скокање на тоа парче меморија? И навистина, ќе видиме тоа е закана следниот пат. Но, за сега, ова се чувствува недоволно. Ако кажам, да ми стринг, дај ми Daven. Но ти навистина не ми даде Daven. Сите што ми го дадат адреса Daven е. Како да тогаш знам за сигурно каде Daven почнува и ends-- на приказната добивање weird-- каде Daven почнува и завршува, а потоа, следниот низа во меморијата почнува? Па, ако сте предавање ме почетокот на Daven, во суштина, како да знам каде што на крајот од неговото име е? Тој посебен null карактер, која е сега сите поважни Ако жици под хауба едноставно се идентификувани уникатно од нивната локација во меморијата. Така што сите тоа време, тоа е она што се случува. Па кога гледаме сега во го кодот овде, објасни ако сакате бубачка во согласност 26. Зошто е Zamyla и Zamyla различни? Зошто е Габе Габе и различни? Да, во грбот. ПУБЛИКАТА: Тие имаат различни адреси. Дејвид Џ MALAN: Едноставно затоа што тие имаат различни адреси. Затоа што кога ќе се јавите GetString повторно, јас ќе се направи брзо тука, ако ова е втора линија, стринг т, како што го направив во таа програма, е еднаква на друг повик за GetString. Следниот пат кога ќе се јавите GetString, јас одам да се добие различни парче на меморија. GetString е дозволено да побара од оперативни систем за повеќе и повеќе меморија. Тоа нема да повторна употреба на истиот шест бајти секој време. Тоа се случува да добиете нова парче меморија, која значи т се случува да се некои други вредност овде. Па кога ќе го направите на еднаква = т, вие не сте споредување Д против овој и против ова и V против тоа. Ќе бидете споредување на оваа против ова, што искрено е прилично useful-- useless-- е прилично бескорисни, затоа што навистина се грижи каде конците се во меморијата? И навистина, ние не го имаат. И ние нема да започне особено се грижат. Само до степенот до кој можат да се појават грешки и закани за безбедноста може да се појават ќе ние всушност почне да се грижи за тоа. Значи, да го надминете овој проблем. Излезе, ќе го поправам супер едноставно. И ајде, всушност, пред да откриваат дека повторно, што би да направите ако во CS50 класа, и ти мораше да се спроведе споредба против две жици. Можете јасно не само да ги користите на еднаква = t. Но само логично, како ќе се спореди оваа низа против овој стринг со користење на C код? Да. ПУБЛИКАТА: Едноставно направете за телефонска линија [Беззвучен] Дејвид Џ MALAN: Совршена. ПУБЛИКАТА: [Беззвучен] Дејвид Џ MALAN: Да. Само користи за телефонска линија или додека јамка или whatever. Но само се однесуваат на основната идеја дека ако ова е парче на меморија или низа и ова е, iterate во текот на и двете во исто време. И само споредете букви. И имаш да се биде малку внимателен, затоа што не сакаат еден прст да одат минатото на другите затоа што еден стринг е подолго од другите. Значи сте ќе сакате да се провери за овој специјален вредност на крајот, нула. Но тоа е навистина, во крај, како и едноставно како што. И искрено, не ни треба да го откриеме дека тркалото. Тука е верзија Две. И она што јас ќе одам да кажам тука е дека наместо споредување на еднаква = t, Јас наместо случува да се каже, ако стрингот споредба на ОК запирка т е еднакво = 0. Сега, она што е низа споредуваат? Излегува, тоа е функција која доаѓа со C, чија цел во животот е да се споредат две жици. И мешајте се споредуваат, ако ги читаме неговите Човекот страница или документација или CS50 референца, тоа ќе едноставно ви кажам дека возбуда споредуваат враќа или негативен број или позитивен број или нула, каде нула значи дека тие си еднакви. Па само претпоставка. Она што би можело да значи ако се промешува споредуваат враќа негативна вредност или позитивна вредност? ПУБЛИКАТА: Поголема или помала од. Дејвид Џ MALAN: Да, поголема или помала од. Значи, ако си сакал да се најде во целина куп на жици во dictionary-- како што на крајот ќе одредување на road-- совршен функцијата се користи потенцијално, затоа што тоа се случува да го направи тоа споредба на жици за вас, и кажете ќе прави доаѓа пред б, или не б доаѓаат пред азбучен ред. Ние можеме да го прават токму тоа. И ќе забележите што го направив една друга работа во овој пример. Што друго се смени повисоки во оваа основна функција? Char *. И ова е тоа што другите бела лага. Сето ова време, кога сте Пишувам стринг, ние сме биле тајно препишување стринг како char *, така што ѕвекот, всушност, разбира вас. Со други зборови, во CS50.h и како што на крајот ќе видиме, ние направивме синоним наречен низа тоа е истото како char *. И сега за сега, знам само дека *, Во овој контекст, во најмала рака, значи адреса. Адресата на што? Па, тоа што реков char *, а не int * или * плови, значи дека char * е на адресата на знак. Па кутивчето тука, ака стринг, навистина е од типот char *, кој едноставно е фенси начин да се каже, во ова поле ќе се оди адреса. И што таа адреса се однесуваат? Очигледно, char. Но, ние би можеле апсолутно имаат int * и други работи. Но, за сега, char * е навистина повеќето јасна и една од интерес. Па овој проблем се случува да се зголеми, иако, повторно. Претпоставувам дека се отвори оваа програма. Ајде да видиме дали сега може да се предвиди она што е во ред со овој код. Значи во оваа програма, копи-0, јас сум ќе одиме напред и повторно се јавите GetString и чување на вредноста во с. И тогаш, зошто го правам ова, Само за потсетување од неколку недели минатото? Ние не се каже дека GetString понекогаш се враќа NULL. Што значи тоа ако GetString враќа NULL? Нешто не беше во ред. Ова најверојатно значи стрингот е премногу голем, надвор на компјутерот на меморија. Тоа се случува супер, супер, супер ретко, но тоа би можело да се случи. Ние сакаме да се провери за тоа, и тоа е се што го правиме. Бидејќи ќе видиме сега, ако не започне проверката вообичаено за работи како нула, може да всушност почнуваат да одат на адресите во меморија што се невалидни. И ви се случува да започне поттикнување се повеќе и повеќе сегментација грешки. Или во Mac или PC, само предизвикува компјутер да се откажам или програма за замрзнување, потенцијално. Па сега, тврдам во копија 0.c, дека јас Одам да го копирате овие жици по пат на линијата 28. И тогаш, јас ќе одам барањето на дното тука дека јас ќе одам да се промени еден од нив. Така забележуваат тоа. Апелирам нашиот стар пријател strlen. И само се објасни на англиски јазик она што оваа линија 34 прави? Што значи т заградата 0 претставуваат лево. Да. ПУБЛИКАТА: Прво карактер на т? Дејвид Џ MALAN: Прво карактер на т. Тоа е тоа. Првиот карактер на T, сакам да му ја додели големи верзија на првиот карактер во т. Значи ова е Капитализиране првата буква. И тогаш, на самиот крај, нешто што го правам во оваа програма е тврдам тука е оригиналот, е, и тука е примерок, т. Но, врз основа на приказната ние само изјави за тоа што конците навистина се, она што е навистина линија 28 прави, а што е како резултат на грешки ќе да биде на екранот? Значи прво, на првото прашање, 28. Што е низа t = е навистина прави? Ако имаме на левата рака страна тука низа t = s; што ми дава една кутија тука и една кутија тука. И претпоставувам оваа адреса е 0x, да речеме, 50 овој пат, произволно. Она што го прави низа т = s направи под хаубата? ПУБЛИКАТА: [Беззвучен] Дејвид Џ MALAN: Тоа продавници меморија решавање таму, па 0x50 оди таму. Значи, ако сега, одам до првата карактер во т и големи букви тоа, што сум ефективно прави да е? Јас сум навистина го прават истото, нели? Бидејќи ако Адреса и 0x50-- само, јас немаат многу простор на табла тука, но се претпостави дека ова е 0x50 долу тука, некаде во меморијата на компјутерот ми е. И јас, на пример, Gabe во мали букви тука, вака. И јас се рече т заграда 0 добива капитализирани. Па, т заградата 0 е на првата буква во т. Толку малку g се случува да се стане голем Г Но, проблемот е, она што не е, исто така укажуваат на? ПУБЛИКАТА: На истата. Дејвид Џ MALAN: Истото точната работа. Па едноставно објаснување, можеби, дури и ако синтаксата е малку чудно. Значи, да го направите тоа. Направи копи-0, а потоа ./copy-0. Кажи нешто: Габе. И, за жал, и двете од нив сега се капитализирани, но за тоа лежи во основата причина што ние сме едноставно сега се занимаваат со адреси. Така како ние да почнат да address-- не каламбур intended-- како да се почне да се обрати овој посебен проблем? Па, во copy1.c, се одвиваат работите да се добие малку посложена. Но, јас би тврди концептуално едноставно решение. Толку тешко да се добие на прв поглед. Нема да биде лесно за прв пат кога ќе го внесете надвор, можеби, но ако проблемот е во тоа едноставно прави t = ОК само копии на адреса, што, повторно, ако можам да ги собереш на вас, се случува да биде решение за всушност копирање на стринг? ПУБЛИКАТА: Ќе веројатно користете јамка повторно. Дејвид Џ MALAN: Да. Значи ние се случува да треба циклус повторно. И бидејќи ако сакаме да го копирате низа на во друга низа, веројатно сакате да го направи тоа карактер по карактер. Но, проблемот е, ако ова е првично с, сега ние треба да започне експлицитно доделување меморија за т. Со други зборови, да прецрта овој последен пат. Ако ова е низа s = GetString. И да се стави ова овде, како и. Ова е GetString. И тогаш, на сликата за нешто како што се случува да биде како порано, g-a-b-е-/ 0. Тоа изгледа малку нешто како ова. И на тоа, ние го нарекуваме овој 0x50, и дека ќе биде 51, 52. Значи ова е 0x50. И тогаш, јас низа т. Во меморијата, тоа е само случува да се ми даде малку квадратни вака. Значи она што е клучен чекор сега? Ако сакате да ја копирате на во т, што празно ние треба да го пополните тука? Или она што ние треба да се направи на високо ниво? Да? Некој? Да. ПУБЛИКАТА: Ние треба да се [Беззвучен]. Дејвид Џ MALAN: Да, ние треба да се пополни во празно. Не можам да го копирате и потоа капитализира име Габе на додека не побарате на оперативниот систем за друга парче на меморија тоа е барем толку големи како оригиналот. Така што ни остава со прашањето. Како да поставам оперативниот систем не само за едноставна мала pointer-- како што тоа се нарекува, е адреса, не pointer-- за едноставна мала кутија вака се нарекува стринг? Како да поставам оперативниот систем за голем дел од меморијата? Досега, јас сум само добивано и дека назад индиректно со повик GetString. Па, како е GetString дури и добивање својата меморија? Па, излегува дека има оваа друга функција овде дека сега ќе почнат да ја користат. Сега, ова изгледа начинот на кој повеќе криптичната than-- и јас сум единствениот кој може да се види it-- оваа линија изгледа начинот на кој повеќе криптичната тогаш тоа треба на прв поглед. Но, ајде да го одгатнат. На левата страна, имам char * т. Па на англиски јазик, да почнеме да се формулира соодветна казна во технички жаргон. Значи ова е доделување на променлива од типот char * наречен т. Сега, она што не значи дека навистина? Па, тоа значи, она што сум јас ќе да се стави во оваа променлива наречена т? Адреса на знак. Па тоа е само поедноставно, повеќе разумен начин на опишување на левата страна. Така што се создава на ова поле овде само. Па десната страна, веројатно, ќе да се доделат поголеми парче меморија како? Значи, да се закачам оваа разлика. Тоа е големо на прв поглед, но она што се случува во внатрешноста тука? Прво, има Примерок, која очигледно е нашиот нов пријател, "Меморија распредели." Значи ова е аргументот се пренесува во неа, така што е прилично голема аргумент. Значи, да се закачам оваа разлика. strlen на и, се разбира, претставува the-- ПУБЛИКАТА: Бројот на карактери. Дејвид Џ MALAN: Само бројот на карактери во с. Па должината на коментарите, оригиналниот стринг. Па G-a-b-e. Така што е веројатно четири во овој случај. Зошто правам 1 по повикувајќи strlen на ОК? ПУБЛИКАТА: [Беззвучен] Дејвид Џ MALAN: За што специјални null карактер. Ако мене ме прашувате што е должината на Име Габе, јас идам да се каже четири. Под капакот на моторот, иако, јас треба дека петтиот бајт за нула карактер. Па тоа е зошто јас го правам на 1. Сега само во случај да се работи овој програма на компјутер, освен, да речеме, на CS50 апаратот, каде што со големина на знак може да биде различна од моето computer-- Излегува дека можам да се јавам оваа Операторот sizeof, само побарајте на компјутер, она што е големината на знак на овој компјутер? И со множење пет во оваа пример, со големина на знак, кој на повеќето компјутери ќе само да биде еден, Примерок се случува да ги распредели за мене овој голем парче од меморијата овде десно. И тоа се случува да return-- тоа е function-- така што е ќе се врати при мене што? ПУБЛИКАТА: Адресата? Дејвид Џ MALAN: Адресата на што? ПУБЛИКАТА: Од меморијата тоа распределени? Дејвид Џ MALAN: Од меморија тоа распределени. Па јас немам идеја, искрено, кога тоа се случува да се заокружи. Одам да предложи тоа се случува да се заокружи на 0x88. Сосема произволна, но некаде различна од 0x50, затоа што оперативниот систем, што Windows и Mac OS направи за мене, е бидете сигурни дека тоа е давање на ме различни делови на RAM меморија. Значи ова е вредноста каде што оваа парче на меморија може да заврши. Значи ова е она што завршува овде, 0x88. Па сега јасно, можам да ги разберам дека тоа не е исто како во овој, бидејќи тие се покажувајќи кон различни делови од меморијата. Значи, ако јас сега всушност сакаат да ја копирате на оваа во, да направите вашиот предложеното решение. Ајде само оди, се создаде за телефонска линија, и направи т заградата јас добива на заградата јас. Бидејќи сега јас да го користите оваа низа како нотација, бидејќи иако Примерок многу генерички ме издвојува меморија, меморија е само соседни бајти. Бајт, бајт, бајт, да се врати назад кон назад. Можам сигурно како програмер се третираат како низа, која значи јас да го користите ова конечно запознаени нотација на само некои квадратни загради. Па да ми се откажеш таму, бидејќи ова е многу одеднаш, дури и иако основната идеја да повториме е дека низа, сето ова време, не е нов тип на податок сам по себе. Тоа е само т.н. покажувач, адреса на карактер, што само значи дека голем број дека од човечки конвенција Ние настојуваме да се напише како 0x нешто. Но, тоа е само еден број, како 33 Оксфорд Стрит, кој се случува да биде Адреса CS зградата. Било какви прашања во врска со овие детали? Да? ПУБЛИКАТА: Зошто ни се провери за т еднаков на нула? Дејвид Џ MALAN: Зошто ни проверете за т еднаков на нула? Ако го читаме documentation-- голема question-- за Примерок, тоа се случува да се каже во ликовната печати, понекогаш Примерок може да се врати нула, исто како GetString. И навистина, GetString враќа NULL ако, пак, Примерок враќа нула, бидејќи GetString користи Примерок. И дека може да се случи ако на оперативниот систем, Mac OS, Windows, што е едноставно на меморија за вас. Значи тоа е она што се случи таму. И дозволете ми да се открие една друга работа што само може удар вашиот ум или целосно да биде премногу далеку над линијата. Но, дозволете ми да се повлечат до исто за телефонска линија за копирање, кој пред една момент, да се потсетиме беше ова. т заградата јас добива на заградата јас. Убаво и пријателски за корисниците. Се чувствува како недела Две повторно. Но оваа верзија, всушност, може да биде препишува и повторно како овој, кој изгледа криптичната. Тоа е техника наречена покажувачот аритметика, адреса аритметика. Но, зошто го прави ова дело? Сега annoyingly, на автори на C одлучи за на * симбол за различни намени. Видовме што се користи еднаш веќе, char *, што значи "да ми даде една променлива тоа ќе ги содржи на адресата на знак. " Па char * во тој контекст значи "да ми даде променлива." За жал, ако користите * без зборот пред него, како знак, тоа е сега се нарекува dereference оператор. И ние ќе видите повеќе од ова пред долго. Но, тоа само значи "одат таму." Тоа е како да кажеш, ако некој ми го подаде на парче хартија "33 Оксфорд стрит" ако го направам "* Оксфорд стрит 33", тоа значи дека "Одат по патот на зградата CS". Така * само значи се оди таму ако нема збор во пред него. Значи она што е т, да биде јасно? т е адресата на парче меморија која беше дадена назад кон мене. е адресата на она што, да биде јасно, во примерот ние сме во дискутирање, на мали Габе? е на адреса of-- Публика: стринг. Дејвид Џ MALAN: Се оригинално име Габе е. Така што е на адреса на ова парче на меморија. Значи, ако јас кажам Т + i-- јас, известување, е само нашиот стар пријател. Тоа е само индекс променлива тоа е процесирањето од нула до за должината на низа s. Па тоа ќе биде нула, тогаш, потоа две, а потоа три, а потоа четири. Значи, да се соберат овие нови Нула-како загатка парчиња, ако сакате, иако, повторно, синтаксата е далеку повеќе arcane од гребење. Па т е адресата + јас се случува да ми даде голем број, бидејќи тие се сите броеви кои ние сме биле цртеж како хексадецимален. Но тие се само бројки. Па ако адресата на т рековме беше 0x88, 0x88, што е плус нула. Дури и ако не сте задоволни со хексадецимален сепак, ги погоди. ПУБЛИКАТА: Првична. Дејвид Џ MALAN: Сепак 0x88. Значи она што не * 0x88 значи? Тоа значи "оди таму", што значи ефикасно ", ги ставаш прстот овде." А сега на десната страна на овој израз, *, а потоа во parens, s + i значи s, кое е решавање тука на малку g. S + 0 е, се разбира, е, без разлика е. Па сега, тоа е * s, што исто како * 33 Оксфорд Стрит значи одат на адресата ОК. Значи тука е овој прст, десната рака. Па што сум јас ќе копирате во што? Она на десната страна, која е Габе, малку е тука, во тука. И така ефектот од тоа првата итерација на јамка, како што предложи, дури и покрај тоа што изгледа луди многу покомплицирано отколку што видовме порано, едноставно велејќи оди тука и копирате дека карактерот тука. Тоа ви дава карта за двете локации. И ќе видиме многу повеќе од тоа. Но, за сега, надежта е само да се се воведат некои од овие основни идеи. И навистина, ајде да погледнеме една конечна програма тука, и тогаш вети claymation, кој ќе направи сè што е во ред. Во ред. Па да ми се отвори up-- таму одиме. Значи, да me-- ќе се вратиме на оваа слика пред долго. Дозволете ми да се отвори оваа последна пример тука. Па овде е супер, супер програма која остварува ништо во животот, кој го прави следново. За прв пат објави две променливи, x и y, кои не се броеви ова време, сама по себе. Тие не се цели броеви, сама по себе. Тие се очигледно int *. Па само некој, што значи ако вашиот тип на податоци, вашите променлива, е од тип int * ѕвезда? Тоа е адресата на некоја int. Па јас не знам каде е уште. Тоа само значи "да се стави, на крајот, на адреса на int тука. " 0x50, 0x88, каде и да е во меморија, адреса ќе има. И тоа е она што y е ќе биде, како и. Ако јас сега велат дека x = Примерок (sizeof (int)), ова е фенси начин да се каже, еј оперативен систем, преку Примерок, ми даде доволно меморија за големината на int, што е веројатно ќе биде 32 бита или четири бајти. Значи она што не Примерок врати? Примерок враќа адреса. Значи она што се случува да се чуваат во X? Адреса на парче меморија, четири бајти, што Примерок само се најде за мене со поставување оперативниот систем. Сега меѓувреме, линија четири тука, * x = 42. Само за да бидат јасни, она што се случува таму долу? На левата страна, * x. тоа е како * 33 Оксфорд Стрит. Така * x значи што? ПУБЛИКАТА: Премини во. Дејвид Џ MALAN: Оди на таа адреса. Секаде каде што тоа парче меморија е, одете на неа. И го стави она таму, очигледно? ПУБЛИКАТА: 42. Дејвид Џ MALAN: 42. Добро, * y, истата идеја. Оди на адресата во y. Стави број 13 таму, но она што е y во моментот? ПУБЛИКАТА: Нема меморија за y. Дејвид Џ MALAN: Не Нема меморија за y. Значи она што не y веројатно содржи, како ние сме биле велејќи дека? ПУБЛИКАТА: ѓубре. Дејвид Џ MALAN: Некои ѓубре вредност. Сега, ѓубре вредност е уште еден број. Таа се уште може да биде бележан за некоја адреса. Тоа е како некој напиша нешто нешто надолу, и јас го погрешно го протолкува како значење некои градење по улица. И ако само се обидуваат да влезат во некои зграда не поседуваат, или некои парче на меморија не сте е дадена, лоши работи може да се случи. Компјутер може да се сруши, или некои други неодредена однесување може да се случи. Па интро, а потоа, да се Binky е ова. Јас уште се сеќавам, 20 некои чудни години подоцна, каде што бев кога конечно сфати совети. Кој е да се каже, ако оставам тука во три минути и мислам дека не се разбере совети, реализира Имам запаметен по 20 години за некои луди причина кога и зошто конечно потонат во, седејќи со мојот настава колеги, Nishat Мехта во назад на Елиот Јадење сала. Сега, јас сум запаметен тоа затоа што тоа е една од темите што, во Особено, се бореше со. А потоа, конечно кликнато, како јас се осмелувам да кажам многу теми на крајот ќе. И сега, да се направи што се чувствуваат сите посреќни и сите поубедливо, ајде да ги конечен изглед во нашата последните три минути тука во Binky, од нашиот пријател, Ник Parlante од Стенфорд. [Видео репродукција] Еј, Binky. Се разбудам! Тоа е време за покажувачот забава. Што е тоа? Учат за покажувачи? Ох, стрина! Па, за да започнете, претпоставувам дека ние сме ќе треба неколку совети. -OK. Овој код доделува две покажувачи, кои можат да укажуваат на цели броеви. -OK. Па, јас се видат двете насоки, но тие не се чини дека се покажува кон ништо. -Тоа Право. Првично, показалки не укажуваат на ништо. Работите што се укаже се нарекуваат pointees, и поставување на нив за посебен чекор. О, во ред, во ред. Го знаев тоа. На pointees се одвоени. Er, па како да ги распредели pointee? -OK. Па, овој код доделува нова цел број pointee, и овој дел сета x да се укаже на тоа. Еј, кој изгледа подобро. Така осигурајте се да го направи тоа нешто. -OK. Јас ќе dereference на покажувачот на X да ја чување на број 42 во својата pointee. За овој трик, ќе ми треба мојот Магично стапче на Dereferencing. Ваше магично стапче на Dereferencing? That-- тоа е одлично. 'Ова е она што го кодот личи. Јас само ќе се постави на број, и [POP] Еј, погледнете. Таму оди. -Па Прави dereference на X следува на стрелката за да пристапите до своите pointee. Во овој случај, во продавница 42 во таму. Еј обиде да го користи за чување на број 13 преку други покажувач, y. -OK. Јас само ќе одат над тука за да y, и да добијат број 13 поставеност. А потоа, да ги преземе Стап на Dereferencing и само [ЏАГОРНИ] -OH! О, еј! Тоа не се работи. Велат, Binky, јас не мислам дека dereferencing y е добра идеја, бидејќи знаете, поставување на pointee е посебен чекор. И јас не мислам дека ние некогаш го направив тоа. Добра поента. -Да. Ние распределени покажувачот y, но ние никогаш не го постави за да се укаже на pointee. -Многу Капацитет. Еј, ти си изгледа добро таму, Binky. Може да ви го поправам така што y поени на истиот pointee како x? Секако. Ќе го користам мојот магично стапче на покажувачот Доделување. -Дали Дека ќе биде проблем како и пред тоа? Не. Ова не допре pointees. Тоа само се менува за еден покажувач на укажуваат на истото како друг. О, јас го гледам. Сега y укажува на истото место како и х. Па да чекаат. Сега, y е фиксна. Таа има pointee. Па можете да се обидете Стап на Dereferencing повторно да се испрати на 13 завршена. -Uh, ОК. Тука оди. [POP] Еј, погледнете во тоа. Сега dereferencing работи на y. И затоа што се делат совети дека еден pointee, тие и двете се види 13. -Да. Споделување, сеедно. Значи одиме да се префрлиш места сега? О, погледнете. Ние сме надвор од времето. -But-- -Едноставно се сеќавам на три правила покажувач. Број еден, основната структура е дека имате покажувач, и тоа укажува текот на pointee. Но на покажувачот и pointee се одвоени, и честа грешка е да се постави покажувач, но да се заборави да го даде pointee. Број два, покажувачот dereferencing започнува на покажувачот и го следи нејзиното стрелка над пристап до своите pointee. Како што сите знаеме, ова работи само ако постои на pointee, кој вид на се врати на Правило број еден. , Број Три покажувачот задача трае еден покажувач и таа се менува да се укаже на исто pointee како уште еден покажувач. Па по задача, двете насоки ќе укажуваат на исти pointee. Понекогаш, тоа се нарекува споделување. И тоа е сè што постои на неа, навистина. Спане сега. [END видео репродукција] Дејвид Џ MALAN: Тоа е тоа за CS50. Ние ќе се видиме следната недела.