[ТЕМА MUSIC] SPEAKER 1: Здравейте, всички. Добре дошли отново в раздел. Прекрасен ден out-- поради което, сигурен съм, Разбира се, има само четирима от вас тук а не обичайните нашия пакет. Аз съм бил болен този уикенд. Така че не е нужно Starburst за вас, момчета. И аз може да започне кашлица ужасно през това. Така че просто се носят с мен. Отивам наистина да опитате и да преминем през това първо, все пак, преди да имам кашлица атака. Но просто да е лесно за мен малко bit--, че е всичко, което поиска. Така че нашата програма за today-- просто reminder-- си викторина е следващата седмица. Казах ти, че това миналата седмица, така че няма да те хвана неподготвен. Така че аз съм ви напомня отново. Следваща седмица ви тест. За тази цел през следващата седмица раздел ще бъде много по- of-- аз ще се опитам и да работят по някакъв преглед. Така че, ако вие може да да ми помогне като ми изпратите неща, които сте доволни с това, че сте притеснен за, теми, които бихте искали за ми да обхване, че ще бъде страхотно. Така че мога да се опитам и да ги работи в нашия раздел за следващата седмица или ви изпратим допълнителен материал или подготвям че може да не получите другаде. Да! Все повече хора идват! Мислех, че съм направил лошо последно седмица, че никой не иска да се върне? Аз съм уплашен. Така че другите три неща че ние ще отидем са пренасочване, файл I / O, и След указатели и динамична памет. Сигурен съм, че всички сте супер развълнувани pointers-- любимата тема на всички, Толкова е просто да се разбере. Сигурен съм, че момчетата имат всичко това, нали? Така че първите неща, на първо място, redirection-- това е основно само един начин да контролира начина, по който вход неща във вашата програма, Как си изходни неща от вашата програма. Основните начини, които можете момчета са взаимодействали с него е само чрез стандартната навън с печат на екрана тук. Но има начини да се pipe-- както виждаме тук е един от нашите words-- вид на тръба, която информация или, че данните във файл от файл. Това е просто различен начин на все неща във вашата програма и от вашата програма, вместо просто да ги печатате на този екран или въвеждане на нещата от командния ред. Така че първият е малко по-голяма от каретата. Така output-- просто отпечатва на изхода във файл, вместо на вашия екран. Така че, ако има нещо, което отпечатва "Здравей, свят!" на екрана, Ако го сложите вместо да output.text, че създава този файл, наречен output.text. И когато го отворите, ще кажете "Здравей, свят!" там. Това може да бъде супер полезна ако имате тон на грешки всъщност, както виждаме в това. Ако го направите две карета, тя ще отпечатване на съобщения за грешки. Така че, ако имате проблем с съставяне, той има много грешки и сте затъването в опитите за да преминете през вашия команден ред през всички тях, можете да просто да ги отпечатате файл, отвори този файл, така че да да преминете през тях по-лесно. Аз всъщност се използва, че много, когато бях дебъгване ми 181 psets за машинно обучение. Така че тя може да бъде супер полезно по-късно. То също е полезно, ако имате програма че може би е създаване на библиотека или генериране на някакъв набор струни, а вие трябва да бъде в състояние да се види, че това е да ги генерира правилно. Това е начин да се направи това. Така че, ако сте ги отпечатате файл, вие могат по-лесно да ги разгледа, нали? Versus опитва да превъртите чрез вашия команден ред. И тогава едно нещо да се отбележи, е, че само с по-голяма от каретата, ако пишете към файл, който вече exists-- така като, ако ние се завтече това първо време, ние го сложи да output.text, и след това имахме втора програма печатното това като програма двама и не по-голяма, отколкото да output.text, тя ще презапише that-- така презапишете какво беше някога в този файл, за да започнем с това. Така че, ако искате да добавите във файл, както виждаме тук, просто направи две-голяма от знаци. И това ще добави към него. Тя няма да го презапишете. Така че, ако ви се наложи да работите с множество програми и вид пазят следите на това, което всички от тях са връщане към вас във файл, това е начин да го направя. Ако не ви е грижа какво е във вашия файл и това е позволено да бъде заменена, можете просто да използвате една-единствена по-голяма от. Това прави ли смисъл за всички? АУДИТОРИЯ: Като точка наклонена черта здравей-голяма от изхода точка текст, като на два пъти, тя просто ще се показват само на изхода точка текст втори time-- SPEAKER 1: Точно така. Така че би основно само напълно презапишете какво беше там, за да започнем с това. Ако този файл и тук, output.text вече съществува, общо взето каквото и да ти се обадя това отново с една по-голяма отколкото просто да мисля за него тъй като той заменя файла. Както, когато сте спестяване на Word документ и се запишете като, и да поддържате едно и също име, и тя напълно it-- презаписва това е един и същи вид на нещо. Всеки, който има някакви въпроси относно просто генериране на файл? Awesome. Така че, очевидно, ако се обърне стрелка посока, той може да направи вход. Така че, когато вие трябваше като Цезар или Visioneer и трябваше да въведете нещо, сте имали аргумент на командния ред че всъщност вход. Това е още един начин да се направи това. Така че, вместо да се чака за командния ред като, когато попита за съобщение в Цезар или Visioneer, ако сте имали текстов файл които са имали своето съобщение, Можете просто да го напишете в това. Така че, ако това беше като точка наклонена черта Caesar 3 по-малко от стрелката за въвеждане на текст, който е вашето послание, че ще работи добре. Когато вашата програма Цезар всъщност попита за вход от потребителя, тя вече ще го има, защото сте въвели в този файл. Това е просто още един начин. Точно обратно на output-- само вход за вашите данни. И след това последното е тръба. Така че това е доста готино. Тъй като това ви позволява да вземат на изхода на един програма и я сложи като вход към друга програма. Аз не знам дали някой от вас играе с дешифрира че CS50 може да има ви се даде, но ще ви позволи да отнеме известно проба подаде, я въведете във вашия криптиране, и оттам тип че във вашия декриптиране да се уверите, че се оказа същото. Така че това е нещо като три-лентов контур. Отидете за него. АУДИТОРИЯ: Ако дадена програма има няколко входа, има ли начин да го кажа кой вход да се използва текстов файл или изхода за? SPEAKER 1: Той има много входове. Каквото и да подадете input--, когато това е питам за вход, който за първи път, това е Ще приемем, мисля, че това е ще тръба в цялата преписка. Така че, ако имате няколко входа, вие сте ще бъде тръбопроводи в множество файлове. Така че, ако питате за съобщения три пъти в кода си, ти започваш да бъде въвеждането на в три различни файлове. И той получава луд. И вие не трябва да се се тревожи за това точно сега. Но това е идеята. Така че да, тръбата е просто изход от една програма използва вход в друга. Всеки добър там? Cool. OK. Най-вероятно няма да има да се направи твърде много с него. Но трябва да се разбере начини, можете да използвате това. И има някои случаи, които може да искате да го използвате. Така подаде I / О- Знам какво сте saying-- сме свикнали да четат от и писане на нашия екран там, което е стандарт в и стандартна навън. И това е, което вие сте били прави от началото на клас тук. Но можете също да четат и пишат на файлове, който е всичко файл I / О- така подаде вход, изход е всичко това означава. Така че това по същество означава, че можете да съхранявате вашите данни в момента. Когато просто го отпечатва на на екрана, това е в общи линии няма, нали? Веднага след като направите "Hello свят "и писта" Здравей, свят " отпечатва "Hello World" на екрана. Но не мога да направя нещо с него от там. Ако държите в текстово файл, а след това изведнъж имате тази информация, която ти е позволено да манипулира или да го поставите във файл, или да го поставите в една програма по-късно. Една от причините защо правим това е просто като начин за съхраняване на данни за по-нататъшна употреба. Имам няколко стъпки тук просто се разхождах из стандарт I / O. През първия етап, можете трябва да се създаде референтна до файла с всички капачки файл звезда файл. Така че създава указател към файл. Така че след това искате да го отворите. И вие казвате, буквално, просто файл равнява fopen. И това ще се върне указател към файла, който току-що отвори. Видях няколко от вас момчета в работно време. Но едно от нещата, е remember-- указатели може да бъде някакъв адрес или нула, нали? Ако някога има случай, в който нещо може да върне нула, какво трябва да направим още преди да го използвате? Трябва да се провери дали това е нищожно или не, нали? Тъй като някои от вас може би са имали въпросът къде каквото обект е да бъдат върнати в пробив беше нищожна. Опитвате се да извършите някои функции върху него. И вашия компютър сайт обвиняван. Така ли е? Обзалагам се, че няколко от вас може да са имали този проблем. Така че с fopen, fopen или ще връща указател към файл, или, ако нещо се обърка, че ще се върне за нищожна. Така че винаги трябва да се провери че той не се е върнал нула преди да се опитате да направите нещо друго. Това е като стандартна парадигма че ти започваш да се нуждаят от тук. Ако има още един шанс нещо може да се върне нула, проверка, за да се уверите, че не, преди да продължите. В противен случай, вие ще за да получите прекрасни грешки сайта. И никой не обича да се занимава с тях. Така че, както виждаме тук, първият аргумент е само на пътя до файла. Ако този файл не съществува, това ще създаде този файл. И това е просто щеше да бъде празен. И след това на втория аргумент е режим, който искате. Искаме ли да се чете от този файл? Искате ли да се напише от него? Искате ли да добавите? Така че всъщност това, което аз просто said-- ако файлът не съществува а вие се опитвате да се чете от нея, тя ще хвърли грешка. Ако файлът name-- хареса, ако file.text все още не съществува и искате да напишете да, то ще създаде празен файл, наречен file.text за вас. А ако искате да добавите, което трябва да направите същото. Това прави ли смисъл? Ако се опитвате да се чете от файл, който все още не съществува, тя ще хвърли грешка. В противен случай, тя ще създадете файл за да направите това, което искате с него. Cool. Сега можем да се чете от файла. И това е само един вид ще чрез различните функции че ние имаме за файла I / O. Тази воля да бъде необходимо в pset тази седмица, ако си спомням правилно. Да, абсолютно ще бъде необходимо в pset тази седмица. Така fgetc връща следващия символ. fgets просто връща ред текст. Той ще се върне всичко до нов ред, и то ще се счупи. Така fread чете определена брой байтове и ги поставя в масив, който е нещо, което може да искате да правите с повторно size-- може да бъде полезно. Колко хора са чели на pset спец, между другото? OK. [Недоловим] SPEAKER 1: OK. Добре. Определено прочетете that-- е забавно pset. Може да се възстанови изтрита памет card-- наистина вълнуващо, когато тя работи. Но определено, започнете да четете това. Хайде говори с мен, ако имате имате въпроси за него. ОК, така че както казах, fread чете определен брой байтове. Това е някакъв произволен брой че ти започваш да се втвърди. И тогава fseek само ходове до определена позиция. Така че може би не ми пука за следващите 10 байта. Вие просто искате да прескочите напред. Не ми пука за тях. Вие искате да прочетете, започвайки от байт 11. fseek ви позволява да направите това. Така че ви позволява да бъде селективна за това, което четете. Защото fgetc, fgets и fread прочетено от определено място във файла. Един от начините да се мисли за това е, ако тази е нашият файл, когато за първи път го отворите, имате тази позиция в файл който започва в началото. Всеки път, когато ти се обадя fgetc, fgetf или fread, тя ще започне от тази позиция маркер. Да речем, че просто искате да прочетете това парче на паметта тук. Не може просто да се обадя. Трябва да се търси тук и след това се чете от там или чете, получава или getc, в зависимост от това какво искате. Така че търси само ви позволява да прескачане на части от паметта. И това е единственият начин можете да пропуснете неща без да ги четат във вашия буфер. Това прави ли смисъл за всички? Очевидно е, че има много паралелно here-- нашата продукция, или въвеждане на пренасочване, сте четат и пишат. Така fputc просто пише символ във файла. fputs пише линия. Fprintf отпечатва форматиран изход. Така че, ако имате табове, или пространство, или какво ли не. И след това неуспешно пише някои масив от байтове във файл. Така че това е по същия начин неуспешно и fread са аналогични opposites-- fgets, fputs и след fputc и fgetc-- много луди, бързи неща. Просто вид запази тази handy-- вие ще имате различни времена където може би просто искате един символ в даден момент. Може би искате цялата линия. С вашия речник pset-- който се състои от две psets, Вярвам, че ние ви даваме цяло речник в текстов формат който има всяка дума разделени с линия. Така че, ако искате да прочетете с една дума в даден момент, това, което може да използвате, ако сте четене и всички те са разделени на нови линии, и просто искате една дума в даден момент? Публика: Fgets SPEAKER 1: Точно така. Fgets-- защото това се връща каквото и да е на една линия. И ако всяка дума е неговата собствена линия, можем да използваме fgets. Cool. Това прави ли смисъл, всеки? Cool? Да, ние ще стигнем до забавната част с указатели много скоро, когато сте се да се направят някои по математика. И това ще бъде страхотно. Последно step-- затворете файла. С толкова много неща тук, един от нашите парадигми е, ако може да се върне нищожна, проверете за нищожна. Ако отворите нещо, по-добре ще го затвори. ОК, така че не сте направили, докато сте направи освен ако не сте я затвори. Нещо като това не е свършило докато дамата мазнини пее. Това е като затваряне на файла. Както се казва тук, просто да повторя, винаги отворете файла, преди да сте четене или писане в него. И винаги го затворите, ако сте го отвори. Добре? Cool. Така че тук е един пример. Така tiny-- Аз не знам дали сте момчета може да се види, че много добре. Ако само ние може да се увеличи осветеността по някакъв начин. Нека наистина да направите това, ако мога. Добре, вие наистина не може да се види, че на всички, може ли? ОК, ние ще направим това, тогава. [Недоловим] Предполагам, че това е много по-добре да се види. Може ли някой да види къде ми мишката отиде е въпросът? А, ето го is-- какво се бори! OK. По принцип, вие трябва да имат вид на представа за какво се прави. Това не е съвършен. Но аз предпочитам да го обясня, отколкото прекарват повече време, опитвайки се да го форматирате правилно. По принцип, както виждате тук, ние започваме с отворен файл. И ние имаме някои файла на базата данни, че ние сме отвор, който казва, че е нашите ученици. И ние отиваме да пиша за него. Така че, разбира се, върнете нула. Така че ние трябва да се провери за нищожна. И след това, ако това не е нищожна, ние преминеш. И както виждате, ние сме примка от тук. Има студенти. Студентите е хеш определя като три. И това, което правим е, че ние сме отпечатване на файл, нали? Така че това, което сме отпечатване в нашия файл? АУДИТОРИЯ: Оценките които са в масива? SPEAKER 1: Да. Резултатите, които са в на array-- точно. Така че ние отваряме тази файла на базата данни, която Предполагам, че е някакъв вид на база данни класове. И ние просто отпечатване на резултати на всеки ученик на този файл. Cool? Добре. Awesome. OK. Нека се върнем to-- АУДИТОРИЯ: Имам един бърз въпрос. Дали не ФОРМАТ В за цикъл? Това е само в случай контур? SPEAKER 1: Не, тя е в за линия. Не мога да видя моята мишката много добре тук. Така че аз съм се борят да формат, който правилно. Тази скоба трябва да се отиде. Тя трябва да бъде тук. Това е това, което е във вашата за контур. Има. Сега това е доста. Така че това е начина, по който трябва да be-- освен за последната конзола, че е отхвърлил. OK. Това прави ли смисъл за всички? OK. Отиваме, за да преминете до следващото нещо then-- които, всъщност, ти започваш да трябва да видите кода. Така че аз съм просто ще копирате, че през точно сега. OK. Така че аз ще ви покажа момчета този код. И аз искам да се опитам да разбера какво е трябвало да направи. Така даден that-- отнеме минута или така. Опитайте и да разбера какво се случва тук. Някакви идеи? Ние знаем, че имаме най-малко две аргументи в командния ред, нали? Предполагам, че единият от които ще бъде че [недоловим] на нашата програма е и след това нещо друго. Защото, ако [недоловим] е по-малко от двама души, ние крещи по тях. Така ли е? И от употреба, тя изглежда като това ще бъде някакъв файл. Всички сме съгласни с това? Така че сега, какво е на линия правиш? Какво го преживява? АУДИТОРИЯ: Всички файлове. SPEAKER 1: Точно така. Това се случва през цялото файлове, че сме вход там. Така че за всеки файл, той е отваряне на някои низ там. Това е отваряне на този файл. Така ли е? И това е четене от него. Разбира се, да провери дали това е нищожна. И тогава това е печат. Ако това е нищожна, това е просто ни казва, че това не е файл, който съществува. Защото не забравяйте, с прочетете нашите файл трябва да съществува. Така ли е? С писане и за добавяне, може да се размине с него. Но с четене, нашият файл трябва да съществува. И тогава, ако тя не съществува, какво правим тук? Нека просто да започнете от тук. Какво е това do-- тази първа характер. Какво прави той? Той получава един знак, нали? И така, какво е това, правиш? Става първият знак. Някой знае ли EOF? АУДИТОРИЯ: Край на файл? SPEAKER 1: Край на file-- точно. Така че това ще мине през цялата преписка, нали? И тогава ще се актуализира от получаване на всеки следващ характер. Така ли е? И какво да го прави? АУДИТОРИЯ: Поставянето че in-- SPEAKER 1: Putchar отпечатъци да си скрийнсейвър. [Недоловим] характер. И тогава, когато той [недоловим] това ще прекрати преписката. АУДИТОРИЯ: Не ви е необходима [? друго? ?] SPEAKER 1: Не е задължително. Искам да кажа, това е вид мълчалив в това. Тъй като това се връща, че, доколкото тъй като това не хване това, вие сте наред. Искам да кажа, това е може би добър практика, за да се направи един друг. Но един друг не е винаги необходимо особено ако имате нещо като връщане, които означава, че в този случай, ако я хваща това, вашата програма ще приключи и никога не ще стигнем до това. Това е повече за случая, когато сте не е задължително да се върне нещо. Защото ако това не е връщане нищо, това би означавало, че ако това е вярно, останалата част на този все пак ще тече. И в този случай, би искал фалшиво. Ако това е връщане, и завършек на вашата програма, на друг, не е необходимо всички времето, в зависимост от контекста. Яков, имахте ли един въпрос? АУДИТОРИЯ: Да. Същото прави и fgetc получи следващия знак? Как се увеличи характер? SPEAKER 1: Да. Така fgetc получава следващия знак. Можете да мислите за него като C ++ в известен смисъл. АУДИТОРИЯ: И така, какво е EOF? SPEAKER 1: EOF е край на файла. Това е просто един маркер, който ви позволява да знаете че сте в края на файла. Така че това се случва, за да отпечатате към стандартната си навън. И тогава то се случва, за да затворите файла, когато това е направено. И след това нека да отидем следващия файл, нали? Така че като цяло, това, което се тази програма да направя? [Недоловим] SPEAKER 1: Да. Тя просто отпечатва всичко, което има. Така че, ако вие някога са използвали CAT и след това името на някаква file-- Аз не знам дали някой от вас има някога, че на вашия терминал. Но ако някога използвате команда CAT-- C-A-T-- и след това каквото файл сте го there-- го отпечатва на вашия терминал, който може да бъде супер удобен за някои неща. Аз го много работа. Това прави ли смисъл за всички? Cool? ОК, така че вашата задача now-- или чрез себе си или с хората около you-- е просто да напиша една проста програма, че просто ще напиша "Здравей, свят!" , за да файл. [Недоловим] [Недоловим] SPEAKER 1: аз бях като, нали Да направя, че зле миналата седмица? Аз не мисля, че е толкова зле. Радвам се, че всички сте тук. Това наистина ме прави щастлив. Аз съм момиче на прости удоволствия. Просто обичам, когато моята секция посещава. Така че аз съм просто се това започна за вие, момчета, така че можем да кодират заедно. Аз не обичам пускането всеки в на място, освен ако не искаш да бъдеш. АУДИТОРИЯ: За теста, направете ние трябва да се напише програма? SPEAKER 1: Може да се наложи да пишат прости програми на ръка. Мда. АУДИТОРИЯ: Тестът е следващата седмица, нали? SPEAKER 1: Тестът е следващата сряда. Това означава, че има прекрасен [? CSE?] класификация парти след това, което означава, че ще получите вашите резултати обратно, че night-- по кое време? Кой знае? Но това ще бъде онази нощ. Добре. Как искаме да започнем това? Аз ще ви дам hint-- започва с това. АУДИТОРИЯ: Вие трябва да отворите файла. SPEAKER 1: Да. И така, какво искаш да се обадя това? Смятате ли, просто искам да го наричам "файл"? Нека да я направи лесно. Така fopen-- какво е нашето изходен тест щеше да бъде? Наречете го "Hello". И каква е нашата режим? Какво правим, за да този файл? АУДИТОРИЯ: Четене. Писане. SPEAKER 1: Пишем Ви към него. Lovely. ОК, така че ние имаме този файл сега. Какво трябва да направя? АУДИТОРИЯ: Проверете дали това е нищожна. SPEAKER 1: Проверете дали това е null-- точно. Това е, което исках да чуя. Това трябва да бъде автоматично, особено голяма степен от този момент нататък. Ако започнете segfaulting, най-вероятно не проверява за нула някъде. Девет от десет пъти, че е ще ви бъде грешка. Така че, ако можете просто да получите в навик, винаги проверявайте дали е нула, животът ви ще бъде хубаво и easy-- или по-лесно. Така че проверете, за да видите дали това е нищожна. Така че, ако това не е нула, което е това, което се равнява на взрив means-- не null-- е валиден. Какво искате да направите? Ние просто искаме да отпечатате на този файл, нали? Така че какво ще се използва? АУДИТОРИЯ: Fprintf SPEAKER 1: Fprintf-- прекрасно. И fprintf отнема две arguments-- където то се случва и какво искаме отпечатани. Така че това, което е първият? Когато се върви? АУДИТОРИЯ: File. SPEAKER 1: Той ще подаде. И това, което искаме, отпечатан? "Здравей, свят!" Добре. Имаме един последен thing-- друг голям парадигма тук. АУДИТОРИЯ: Close. SPEAKER 1: Close. Има и да отидете. АУДИТОРИЯ: Е това да се случи ако файлът е нула? SPEAKER 1: Не, това е, ако това не е нищожна. АУДИТОРИЯ: О, ако това е not-- OK. За fopen и след това два аргумента, които излизат вътре, какво прави първият аргумент означава отново? SPEAKER 1: Аргументът е, точно като името на файла която искате да отидете. Така че след това работи, бихте има някакъв файл, наречен "здравей" че е "Здравей, свят" в него. Това е всичко. Само името. АУДИТОРИЯ: И тъй като това е писане на файл не трябва вече да съществува. Е, че това, което каза? SPEAKER 1: Точно така. Точно така. Ако "Hello" като файл не съществува все още, това е Ще създадете файл, наречен Hello "и пише на него за вас. АУДИТОРИЯ: Когато казвате програмата да пише във файла, защо ти пиша "файл", вместо името на файла и fprintf-- SPEAKER 1: Тъй като в този случай, ние имаме че голяма FILE-- всички в caps-- звезда, файл. Така че това е указател към файл това, за което говориш. Това е начинът, по който ние просто се отнасят към него. Така че в този случай, може да се мисли за file-- аха, можем да използваме this-- файл тук се отнася до откриването на "Hello" и отдаване под наем го напиша. АУДИТОРИЯ: Може ли да се сложи "Hello" вместо [? просто?] е файл? SPEAKER 1: Не, защото "Hello" трябва да бъде отворена и достъпна за писане. File тук е като обозначение, което казва ОК, ние имам този file-- hello-- че ние не търсим в. Тя е била открита. И ние няма да пиша за него. Ако просто използвайте "Hello", че е капсулирана в него. Така че ще се побърквам. Искам да кажа, може да са го нарекли. Ти би могъл да направи файл, звезда, "Hello", се равнява на това. Но цялата работа е, че трябва файл звезда показалеца по ред за да можете да използвате тези функции. АУДИТОРИЯ: Може ли да се направи файл, звезда, файл, "Hello" или имате ли да сложите подаде звезда, файл от него? SPEAKER 1: Вие може направя файл, звезда, "Hello". Можете да промените това каквото име искате. Това е напълно произволна какво име е. Можете да го наречете нещо. Назовете го летящи спагети, ако искаш. АУДИТОРИЯ: Какво е "w" в кавички, за? SPEAKER 1: "W" е само режим. Така че ние сме за написването на този файл. Всеки добър? Ясно ли е? Да. АУДИТОРИЯ: Така че, когато го пише това файл, където да можем след това да откриете файл? SPEAKER 1: Той ще бъде в една и съща директория, която сте в момента вътре. Ако сте в pset три и стартирате това, в рамките на вашата pset три папка ще бъде Този файл се нарича "Hello". Cool? Всеки добър? Имам чувството, че всички вие сте тя става, което е страхотно. OK. Така че обратно към моя слайд show-- Обичам, когато нещата работят. OK, pointers-- развълнувани ли сте, момчета? Показалки са големи. Те вземат малко да приключи главата си наоколо. Това е втората ми година преподаване указатели. И аз мисля, че най-накрая го. Така че, ако ви е трудно, това е ОК. Както казах и преди, рисуване помага много с нещата в CS, толкова, колкото аз мисля, че хората са склонни да мисля, о, ние сме пред компютъра. Ние просто трябва код. No-- тираж снимки наистина ще ви помогне. И аз наистина ви препоръчваме да се включи в детската градина си страна и донесе пастели или маркери и равенство. Тъй като това ще ви помогне. И ако ме види в работно време, аз ще бъдат носеща купища хартия с химикалки за рисуване нещата. Така че, по-специално с pointers-- рисувате картинки. И аз съм сигурен, че ние всъщност ще е изготвянето на някои снимки тук. Така че вие, момчета, всички дойдоха да видят Binky, тази готина claymation нещо. И смятаме, че това е наистина смешно, когато той избухва в един куп парчета. Това е някакъв комично облекчение за клас. C [недоловим] тази велика способност да бъде в състояние да контролира паметта. И това е едно от нещата, които наистина го прави такъв мощен език. Но с голяма сила идва голяма отговорност. И луди неща могат да се случат ако не сте внимателни. Така че, когато използвате указатели, които искате да направите Сигурни ли сте, наистина разбирам точно това, което правиш. Надяваме се следващата малко късче време ще ви помогне да разберем наистина указатели, как да ги използват, и как да ги манипулира. Така memory-- Сигурен съм, че ние сме виждал тази схема преди. Така че това е само една проста схема на как нещата могат да се съхраняват паметта. Така че в общи линии имат тези огромни масиви от един байт блокове е това, което имаме here-- леко на стъпки от по един път. Това е в шестнадесетичен [недоловим] така осем-битови блокове. И всеки блок е свързан с някои шестнадесетичен адрес. Така че, ако някога видят 0x, че е просто notating че това е шестнадесетичен адрес. Може да се предположи, това означава, някакъв адрес в паметта. Става дума за адреси на паметта всеки път, когато те видя в шестнадесетичен вид. Ние имаме цели числа са променливи, плувки са променливи, които съхраняват. Така целочислени магазин цели числа. Плувки магазин плува. Така че ние също имаме указатели които съхраняват паметта адреси. Това е един вид карти. Показалки са изключително за адреси на паметта. Така че това е като вашия тип там. Вашият уред е 32-битова, което означава, че вашият адрес памет е четири байта. Така че всяка показалка, че имате също ще бъде четири байта. Или пък, ако това е четири байта, памет е четири байта. Указатели памет магазин. Следователно, те са четири байта. Cool-- просто искате да се засили това. Трябва да получите тази комична сега. Не знам колко от вас са xkcd фенове, но аз обичам xkcd. Това е страхотно. Добре. Така че създаването pointers-- както казах, това е почти точно като нещо друго. Имате вид. Трябва да има име. Така ли е? Това е, което имаме там. [? Hex?] Звезда означава, че е указател, и след това каквото и да искате да го наречете. Така вида представлява това, което може да се съхранява. Добре? По същия начин, ако ние правим цели числа, ние знаем, ние сме съхраняване на инт там. С показалеца, той притежава адрес на паметта. Но какво означава това е that-- тук е мястото, където чертеж, ще дойде по-удобно. Така че в този случай, ние имаме някои value-- да кажем четири. Четири е на адрес едно. OK? Това първият тук означава, че това е указател 2x. Така ли е? Това е някаква показалка х. х може да бъде нещо, независимо. Каквото х is-- каже х е четири. Това се случва, за да съхраните памет адрес тук. Така INT, звезда, x-- това е някой друг слот в memory-- кой знае какво е това. Но това ще се съхранява на адрес тук. Така че това ще бъде like-- в този случай, и да е, се съхранява при 0x1-- каквото се съхранява на адреса, който ни държи показалеца, трябва да съвпадат с какво сме назначени. Така че в 0x1, в този случай, това е х. Това може само да бъде INT, докато ние използваме това. По същия начин, ако имаме друг 1год, независимо адрес се съхранява с Y има да бъде char-- едно и също нещо с Z. По същия начин, когато опитам да направя intx равнява на 0,4, то се случва да крещи на вас и да като не, ти каза, че иска един Int. Това е трябвало да бъде едно цяло число. Престани да се опитваш да го поплавък направи. Така че нека нещата да са това, което те искат да бъде. Нека нещата да бъдат себе си. Така че, голямо нещо е просто независимо от вида на показалеца е, че това е единственият нещо, което може да се съхранява там. OK? С практиката, както и с миналата седмица, всичко Изглежда наистина вид на абстрактни. Отиваме да се направят някои практика. Тя трябва да направи по-дълбок смисъл. Така съотнасяне и dereferencing-- е наистина е важно, за да получите тези права. Аз все още трябва да обновите всеки сега и тогава. И аз съм като засада, кой искам? Така амперсант всъщност ще даде можете позоваването или адреса на. Така че той се връща на адрес в памет от които променлива се съхранява. Така че това се случва наистина да се върна при теб шестнадесетичен, докато го dereferencing всъщност ще ви дам данните, които се съхраняват там. OK? Така че ние ще разгледаме един пример много по-бързо, или по-скоро на следващия. OK. Така че ние трябва да помислим наистина внимателно за това. Така че тук имаме някои число х. Отивам да се опита да направи това , за да най-доброто от моите способности. Така че ние ще имаме този слот х. И това е съхраняване на пет. Неговият адрес е 0x4. Cool? Всичко добро. Така че сега ние имаме това показалка. Той беше тук. И амперсант ни дава адреса на нещо. Така че, в този случай, това е адресът на х. Какъв е адресът на х? 04-- и тази показалка е 0x08. Cool? Така че може да се мисли за това показалка, 04, просто посочва тук. И те се наричат ​​указатели тъй като ние получаваме повече в това, ти започваш да се види, сочещи към нещата. И един блок, сочещи към друг блок ще направи много по-дълбок смисъл. Така че тук са две. И след това ние имаме някои копие, което е what-- 0x0c. И това ще сочен нашия показалка. Така че това, което тя казва, е Добре, тук е нашата показалка. Стойността го съхранява е 0x04, и какво той казва е да отидете на този адрес и ми кажи какво има в него. Така че това е ефективно какво тази стрелка се прави. Можете да мислите за това като си звезда. Така OK, когато правим звезда, това означава, че се следват. Отидете на този адрес. И това е основно само след тази стрелка на тази памет парче. И да ни даде това, което е в него, което е с 5. Това е защо нашият копие е равно на пет. Това прави ли смисъл? Има ли някой нужда от мен да мине през че отново, или по-бавно? Искаш ли да отидем през него още един път? OK. Отиваме да го прехвърлите отново. Когато започнем, всички сме съгласни, ние имаме известно парче на паметта, която е променлива х, че ние се равнява на 5. Ние не контролираме, когато това е в паметта. Така че това място е просто произволно определен. Добър там? OK. Тогава ние се инициализира указател към Int. Ето защо е позволено да сочи към х, защото имаме инт тук. Ние имаме друга парче памет, защото това показалка е променлива, точно като всичко останало. Това е произволно определен малко място в паметта. И това, което той съхранява е адресът на х. Ampersand означава адрес на х. Така че това, което е адресът на х? АУДИТОРИЯ: Това е zero-- SPEAKER 1: 0x04. Така then-- последният. Ние имаме някои copy-- отново просто още една променлива. Така че нека да зададете някои произволно място. И ние сочен нашия показалка. Звездата означава, отидете до адрес се съхранява в моя указател. Кажи ми какво е там. Така че на адреса се съхраняват в нашата показалка е 0x04. Така че отидете на този адрес. Това сочи към този адрес. Какво има вътре в тази памет блок? Това е пет. Така че това е, което ние присвоите ни копие. Всеки добър? Cool. Again-- снимки. Така проследяване на стойностите here-- аз съм няма да позволя вие мислите за това. Ние може да се направи още една снимка. Но аз искам да се опита и разума чрез този на собствения си за една минута. Тъй като те не дават ни например адрес, Аз съм просто ще направи амперсанд x-- който трябва да помогне да го закара вкъщи. Ampersand означава адрес. Така в първия един, всеки отида с първия ред. Някои х набор на five-- някои случаен слот памет. Int звезда показалеца е равна на адреса на х, нали? Int показалеца звезда създава този блок, го нарича показалеца, и го възлага на адреса на х. Аз съм ужасен в амперсанди. Сега това, което правим е да кажем OK, сочен нашия показалка. Така че отиваме OK, това, което е в нашия указател? Това е амперсанд х. Отидете на амперсанд х и я прехвърли. Така че сега, амперсанд х ще бъде 35. Така че основно, когато сте dereferencing, отидете OK. Ти започваш да се рисунка снимки като тази. Ти започваш да се рисунка стрелите си върху това къде е. Така че отидете на този слот за памет и или ми даде тази стойност обратно, или да го променят. В този случай, защото ние сме в този стойност, ние сме го определили към 35. Докато през последните един, ако забележите, ние бяха възлагане на това, което беше тук за нещо друго. Така че те имат тази страхотна маса. Това не е толкова лошо. Вие, момчета, да работят по него. Отивам да го извади на дъската. Отиваме да го попълните заедно, нали? Затова вземете някои хартия, грайфер партньор, започне да работи. Отивам да се получи голямо парче тебешир. Тъй като това ще бъде много. OK. ПРОФЕСОР: OK. Да започнем с първия ред. Ние ще започнем там, тогава вие, момчета, може би може да работи чрез някои повече. OK. а е равно на б пъти в толкова какво е? Това не е подвеждащ въпрос, обещавам. STUDENT: 4 пъти 5. ПРОФЕСОР: 4 пъти с по 5. 20. Така че това, което е б? STUDENT: 4. ПРОФЕСОР: И в? STUDENT: 5. ПРОФЕСОР: 5. И тогава това е просто ще се Амперсант а, амперсанд б, амперсанд в, нали? Не е зле. Това е достатъчно проста. OK. Така че следващия. А е равен пъти С, в случай някой беше запознати с това. Дали всеки запознат с времето се равнява? Добре, всичко това means-- това е стенограмите за равнява пъти в. Можете да го направите с разделение, с добавка, с изваждане. Можете да направите равни, или както се равнява в означава равнява плюс С минус равен в ще бъде равнява на минус в. Това е просто синтактична захар. Така че, в този случай е равна на пъти в какво ще ни дават? Отново, не е подвеждащ въпрос. STUDENT: 100. ПРОФЕСОР: 100. Има ли нещо друго се промени? Не. Може би най-накрая ще се получи по-добре на моите амперсанди. STUDENT: ОК, съжалявам, как успяхте да получите 100? ПРОФЕСОР: OK. Така че е равна на пъти в, така че в пъти. STUDENT: О, ти, който използвате А за previous-- ПРОФЕСОР: Да. Така че това са нашите най-нови стойности. Те са това, което трябва да бъде използване както ние се движат надолу, OK. Така че, б е единственото нещо, което се променя, нали? Така че нека да попълните всичко останало. B. Какво е б щеше да бъде? Да бъде или да не бъде. И така, какво е това, правиш? Какво е звездата годишно правиш? STUDENT: Код за местоположението на годишна база. Студентът: Не, не съвсем. Така че това е препратка г. STUDENT: Значи б е ръка стойност на годишна база. ПРОФЕСОР: Да, така е, па на адреса на, нали? Така казва отиват там, където а е съхранява и да го даде на тази стойност. Така че това, което е б? STUDENT: 100. ПРОФЕСОР: 100. Perfect. ОК, така че компютър е това, което се променя. Всичко останало остава същото. Какво е компютър щеше да бъде? Лесна задача. Pc е равно на БКП, и това, което е годишно? STUDENT: Амперсант а. ПРОФЕСОР: Perfect. Сега ние сме става интересно. ОК, нека да се разбие един надолу. Първо, това, което е б пъти в, защото това е най-лесната част от този един, нали? В пъти в is-- STUDENT: 500. ПРОФЕСОР: Да, така какво е това прави, ако това е звезда Pb, какво се променя? STUDENT: Какво има в the-- ПРОФЕСОР: Какво има в б? STUDENT: Какво има в пространството че Pb се посочи. ПРОФЕСОР: И Pb сочи to-- STUDENT: B. ПРОФЕСОР: B. Така че единственият нещо променя, е б, нали. Така б пъти в, 500. Така че това е, което се променя в момента. Cool. Lovely. Вие, момчета, които правят големи. Добре, да се счупи този надолу. C се променя, нали? Така че ние можем да попълните всичко останало. Нека да видим. OK. Ние знаем, че в ще бъде на продукт на две числа, нали? Какво два номера, все пак? STUDENT: A и C? ПРОФЕСОР: Така е точно за първия. Така че ние сме По- съотнасяне р а, нали? P на един сочи към, така че ние знаем, че това ще бъде 100 пъти по какво? Times какво прави бр точка за? Точки на. Така 100 пъти 100 е 10,000. Ли, че има смисъл? Cool. Начало участък, момчета, последния ред. OK. Какво се променя тук? STUDENT: A. ПРОФЕСОР: A. Perfect, така всичко друго може да остане същата. OK. И това, което е? Така че това е пъти какво? Това е звезда Pb. Така звезда Pb означава ето Pb, Pb точки до точка Б. STUDENT: 500. ПРОФЕСОР: 500. Така че ние имаме 500 100 пъти. Това е 50,000. Уф! Виж това. STUDENT: Защо имаме на & C за last-- ПРОФЕСОР: Съжалявам. STUDENT: О, OK. ПРОФЕСОР: Моя грешка. Много писане. Всеки добър? Не е толкова зле, нали? Просто отнема малко време, за да работи сам. Ако го съборят, разбера какво всяка част се позовава to-- като с всичко това е, yes-- го съборят на малкото проблеми и след това наново, и можете да направите някои страхотни неща. Това са отговорите, но ние сме го направили. Pointer аритметика. Ah. Ръцете ми са тебеширени. Така че, добавяне или изваждане INT настройва показалеца от размера на вида на показалеца. Помните ли как всеки тип има различен размер? Така че като двойна или дълго време е осем и INT е четири, но Чар е един. Така че това, което искате да направите, is-- едно нещо да се помни, е точно това, колко си указател стойност всъщност променя ще зависи от тип показалка е то. Всеки добър с това? Мога ли да го изтриете? Ние сме добри? Awesome. Така че, ако имаме някои показалка that-- това ще be-- съм ще го пад показалка направи. Тя съхранява това. Ако ви се налага да се каже показалка плюс един, какво ще правим е, че ще се актуализира това от размера на инт защото това е най- тип показалка е то. С C, всичко е много строга и регламентирана. Показалецът на инт ще се актуализира от размера на пространството пад ще отнеме. Един INT е четири байта. Така че това, което ще се превърне в това? Вие сте просто добавяне на четири върху това. Сега стрелката ще be-- OK. Така че, ако това е Чар и направихме показалка плюс един, каква би била тя в момента? Ако started-- преструва ние started-- точно сега това е 0x08. Нека сега да кажа, че това е Чар показалеца, и ще добавя една. Какво ще се промени? Колко байта е знак? АУДИТОРИЯ: One. SPEAKER 1: One. АУДИТОРИЯ: Така 0x09. SPEAKER 1: Така че това ще бъде девет. Така че просто нещо да си спомня. Точно когато си добавите един, това не е добавяне на един човек, ако това е знак. Тя добави колко байта от типа, който и да е, поради което ние имаме това уравнение тук. Така че това е INT пъти размера от вида на показалеца. Така че ние имаме примера тук. г е назначен за тази стойност, 0x4, когато направихме у плюс равнява на една. Какво има в него, какво е в х, не се променя. Какво прави промяна е това, което е в ш. Адресът съхраняват в база актуализиран с четири защото има четири байта в инт и това е инт показалка. Добре. Така че сега ние имаме друг упражнение. Така че въпросът е какво ще се отпечата. Някакви идеи? АУДИТОРИЯ: Броят на символи в щастлива котка? SPEAKER 1: Точно така. Така искал с низ. Всички ли се това? Искаме ли да минеш през нея? Да, OK. Така че това, което имаме here-- I по този начин много повече. Не е нужно да [Недоловим] абсурдно. Така че ние имаме низ тук, щастлив котка. Lovely. Ние имаме някои брояч, който ние сме следене на. Така че ние имаме някаква Чар * показалеца че просто се определя като равна на ул. Това, което се прави е, че е възлагане на някои показалка до началото на низ. Защото аз съм сигурен, тъй като тя се споменава в лекция, ние сме ви дали момчета това тип данни, наречена низ. Но наистина струни са само масив of-- като Чар *. Това е указател към един куп герои които са съседни в паметта. Така че това просто го определя равен на всеки низ е идентифицирани от къде Първият му характер е. Така че това е просто създаване някакъв момент равна на началото на низ. Всеки добър там? Cool. Така че това е нашата dereferencing показалка. Така че това всъщност ще да ни даде някаква ценност тук, в нашата поредица, че ние не говорим за. И ние да кажеш толкова дълго, колкото това не е нула терминатор. Така че, продължавай, докато не получите до края на низа. Актуализиране на показалеца по един. Така R, то действително ще се актуализира с един всеки път, защото това е знак, на Чар *. Така че ще преминеш. Тя ще се актуализира. Така за първи път това се изпълнява, тя ще бъде тук, в з. Тя ще се актуализира. Това ще бъде една. Тя ще бъде р, у, и така нататък и така нататък. Ние ще се актуализира брояч. Когато достигне до края, тя просто отпечатва колко далеч е намерила. Да. АУДИТОРИЯ: Така че това има значение пространството като един, нали? OK. SPEAKER 1: Мислете така. Е, че question-- АУДИТОРИЯ: [недоловим]. SPEAKER 1: Не се тревожете. Това мога да направя това. Добре, така че едно нещо, което разбирам, е, че с масив, можете също така да се отнасяме към него като показалка, защото масиви са просто непрекъснати петна в паметта. Така че можете да се отнасяме към него по същия начин. Можете да ги манипулира с указатели, също. Така че, вместо да правиш в този случай, аналогичен нещо ще бъде масив 0 е равна на 1. Но по същия начин, по който низ се определя от началото на където Първият му характер е, масив се определя от където първият елемент е. Защото знаем, че сме гарантирано, че те ще бъде непрекъснат блокове памет. Това е, което ни позволява да направите това. Ние знаем, че те са постоянно блокове памет. Така че в този случай, от dereferencing само масив, който ни казва, OK, отидете в началото на си масив, който е тук. Така че можете да го настроите, равна на една. И в този случай, каквото и да си масив тип е, когато го актуализирате по един, това е точно като актуализирането да следващия индекс. Можете да направите това, защото вие знам какво е в масив. Така че не знае колко да актуализира показалеца от, какъв адрес да така актуализира че сте в следващия слот. Така че това е просто различен начин на писане масив 0 равен на 1, масив 1 е равно на 2, масив скоба 2 е равно на три. Това е просто още един начин да се мисли за това. Тъй като те са непрекъснати блокове в паметта, можете да се обърнете към тях или от масива notation-- които аз лично намерите easier-- но може би трябва да го манипулира стриктно от адреси на паметта. И това е начина, по който би го направил. Нещо повече като готино нещо, което можех да направя срещу може би не е нещо, което сте всъщност ще се приложи. Аз го използвам в 61. Вие, момчета, най-вероятно не се нуждаят от да се притеснявате твърде много за това. Но ако сте заинтересувани, вземе 61 през следващата година. Ние сме в момчетата дома участък. Знам, че е дълго. Dynamic Memory Allocation-- така че ние знаем, че един на нещата, когато си говорихме по време на нашата първа част заедно, разгледахме суап функция, в която е извън обхвата на нашата основна функция. И ние минавахме през тези стойности които са били ефективно копия. И след като завърши суап изпълнява, той просто е оставил стак. Не забравяйте, че ние имаме стека рамка за суап. Той оставя и тези, ценности оставят с него. И те са си отишли. Ние не може да направи нищо с тях и ние бяхме тъжни защото не можем да си разменим стойности. Но с C, както споменах, вие има много власт над памет. И така, какво можете да направите вие, е да разпределят неща на куп тук че ще остане там, докато можете да им кажа друго. Те са като добри деца. Те остават там. Те не напускат. Те ще останат там, докато не сте като, добре, можете да си отиде. Като има предвид, неща на стека, who-- те са като непослушни деца. Те просто ще избяга, когато искате да бъда там и след това те няма. Вие не можете да ги получите обратно. Така че купчината is-- отиваме да говорим за изчистване и безплатно, което Сигурен съм, че вие, момчета, чували за в лекция. И това е в основата на пътя да има много устойчиви данни. Така че можете да запазите данните около като дълго, колкото искате. MHM. АУДИТОРИЯ: Можете ли да определите купчина и стека? Дали те обичам места, за да поставят нещата? SPEAKER 1: Така че те са основно just-- те са начина, по който се отнасят само за памет. Така купчина е само на места, където памет се разпределя динамично, като има предвид, стека отнася повече, за да стека рамки които са по-централно място в функции, които са действително работещи. Вие наистина не трябва контрол. Голямата разлика, че имате контрол над купчината, ако искате да. Имате по-малко контрол над комина. Стекът зависи от функции, които се изпълняват, и реда, в който те са тичам, и как нещата се връщат. Като има предвид, с купчината, като ще видим, може да се каже, ОК, аз искам тази стойност да бъде около докато не ти кажа друго. Не е позволено да се отървете от него. Не ти е позволено да го замени. Ти започваш да се запази около за толкова дълго, колкото мога да ти кажа. Можете да получите, за да бъде шеф в купчината, като има предвид, stack-- може би ако като измъквам пътя си може да бъде шеф. Но не съвсем. И това е наистина само спомен. Това е просто различен начин се позова на паметта. Cool. Така че с това, как да се контролира паметта си. Това е с изчистване, които вие ще получите да се използва. Така че това е просто кратко за заделяне на памет. Това е всичко. Има един куп други готини функции, които имат АПос в края, и те са валидни за различни неща. Така че, когато имате нужда от съхранение, която се нуждае от да надживее текущата си функция, така че че при сегашната си функция бяга, все още имате данните, които получих от него, която искате да използвате изчистване. Това ще го инициализира на куп. И както казах и запази каза, че ще го държи там докато не го кажа по друг начин, което е най-важното нещо тук. Така че едно е да забележите, и това е обикновено много важно, е, че това sizeof е изключително полезно да се използва защото, в зависимост от вида на машината, което работи, може да има различни количества памет, която го отнема. Така че, вие винаги искате да използвате размер на толкова че не сте зависими машина, така, че кодът ще работят на всяка машина. И това е само част на писане добър код. Ако тя работи на една машина, но никой от другите, колко полезна е вашата програма? Така че винаги искам да уверете се, че и използвайте sizeof. АУДИТОРИЯ: Така е, че подобни на размер от 10 инча [недоловим]? SPEAKER 1: Това е размерът от 10 цели числа. Да. Така размерът на цели числа ще се върне Колко струва един инт предприеме. Или размера на Чар, как Колко струва един Чар предприеме. И тогава колко блокове на които искаш? Така че в този случай, ние искаме нещо че ние може да съхранява 10 цели числа до. И тя ще работи независимо на машината, което е готино. Така че колко байта ще които всъщност ви даде? Бързо математика. АУДИТОРИЯ: 40. SPEAKER 1: 40. Точно така. Така че друг голям нещо. Pointer или изчистване може да се върне нула. Така че отново, винаги проверявайте за да видим дали тя се връща нула преди да се опитам да направя нещо с него. Ако се опитате и сочен Този показалец сега, това е просто ще segfault защото отиде и се опита да се докоснат до нула, когато не трябва да има. Затова винаги проверявайте за нищожна. Отново, всичко, което мога да направя. Той може да върне нула. Той ще се върне нула, ако сте или от пространството, или по някаква причина тя се блъсна в някакъв бъг памет. Понякога просто се връща нула. Така че просто трябва да се провери за него. Това е всичко, този слайд се казва. И след това, което имаме Тук е нужно да се освободи. Така че в един и същи начин, че ако отворете файла, който трябва да се затваря файл, ако изчистване на паметта, вие Трябва да ви освободи, че паметта. И вие ще получите да се направи наистина готини неща. И има една програма, която може да работи за виж, ако сте някога изтича памет. Но вие не искате да изтича памет. Това е много лошо. Само обърквам нещата. Това е лошо да се направи точно като програмиране мъдър за проектиране ефективност. Но тя също е просто вид лошо за вашия компютър. Така че просто безплатни неща когато ги изчистване. Вие, момчета, вижте симетриите тук. Супер проста. Само безплатно и след това каквото и показалеца, независимо от наименованието на показалеца е, и го Ще се погрижа за това освобождаване за вас. Cool. Тогава ние имаме това. Така че ние просто ще ходи чрез тази програма. И тогава вие се правят. Така [недоловим] само основното. Така че ние имаме някаква INT * показалка. Така че ние имаме указател че ще държи цели числа. И колко цели числа е, че ще се проведе? Само един. Размер на инт. Ние проверяваме дали указател е нищожна, тъй като е, което искаме да кажем не правя нищо. Това е лошо. Така че ние разпечатате някаква грешка от памет, най-често се връщат 1, както вие сте свикнали. И след това, което имаме тук, ние сочен нашия показалка. Така че това означава, че започваш да се съхранява нещо на мястото, даден ни. Int * показалеца, или изчистване, връща адрес на мястото, където го отмени това памет за вас. Така че това е основно който ви дава like-- ако мисли за куп къщи в квартал че искате да поставите Вашите мебели в, изчистване е като OK, можете да получите да отиде в къщата на три. И това ви дава адрес на къща с три. Така че това точно сега, това показалеца магазини адрес, съхранява адреса на къщата си. * PTR средства, ОК, аз съм в къщата ми. Cool. Трябва да получите някои число. Значи питам за някой да ви дам мебели сега. Така че можете да получите някои Int. И това го поставя в показалеца където се посочи. И след това само разпечатки , вие влезе там, където. И отново, препратката. Така че това е като да отидеш на този адрес и сте видели какво е там. Cool? И след това, разбира се, ние освобождаваме показалка. Не забравяйте да освободи показалеца. Не забравяйте да проверите за нищожна. Не забравяйте да освободи показалеца. Имате две неща, които помня от това, или че трябва да се помни. Да. АУДИТОРИЯ: [недоловим] неща като това, Чар * S. Как така никога не сме освободи тези? SPEAKER 1: Hm? АУДИТОРИЯ: Това ли са като струни? Казахте струни са точно като Чар * е, нали? Така че защо да не освободи струни? SPEAKER 1: Трябва само да безплатно, ако сте mallocing. АУДИТОРИЯ: О, ако сте mallocing. SPEAKER 1: Така изчистване и свободно са две неща че винаги трябва да имате заедно. е отворен, е близо, две неща трябва да имате заедно. В тези два случая, проверете за нищожна. Да. АУДИТОРИЯ: Значи безплатно е само позволявайки нещо друго трябва да се съхранява там, след тази програма е да го използва? SPEAKER 1: Тя е просто казвам, ОК, аз съм направил с това. Вие не трябва да го пазя. В противен случай компютърът ще Точно както се опита и да я държи там. И тогава can't-- той работи в памет въпроси по-късно. Винаги искам да го освободи, защото тя разказва вашия компютър, ОК, аз съм прави с това място на паметта. Можете да го върна за мен да се използва по-късно. Cool? Да. АУДИТОРИЯ: Така че ние използвахме% D просто защото два пъти се връща, или защо is-- [недоловим]. АУДИТОРИЯ: Можете ли да използвате% аз? SPEAKER 1: Можете да използвате% аз. Всички в последната минута въпроси? Давай напред. АУДИТОРИЯ: Имам само един бърз въпрос. Така че променливата на PTR, that's-- като с INT * PTR = изчистване, това е просто казвам, че е сочещи към място в memory-- SPEAKER 1: Искате ли [недоловим]? АУДИТОРИЯ: --that е размер of-- не, това е ОК. Но това е просто сочещи към място в памет, която е точно като четири байта. SPEAKER 1: Точно така. Така изчистване на размера на INT казва, Добре, аз ще отида да избяга, намерите четири байта памет за вас. Когато установи, че четири байта памет него, ви дава обратно на адреса на мястото, където тя започва, и това е, което се съхранява в показалеца, или PTR. Добре. Вие, момчета, изглежда по-малко объркан от най- хора, когато говорят за показалеца, така че аз се чувствам доста добре в момента. Добре. Както винаги, вие трябва да имат всички намерила си pset2 класове от сега. Знам, че е имало някои деформирани неща, където се казва, формула не е валидна или нещо подобно. Ако сте се, че всички Вашите класове са валидни на моя страна. Така че мога да ви изпрати скрийншотове на вашите класове. Само да ме уведомите, както и ако сте липсват всички класове или нещо не изглежда да има смисъл. Ела при мен. Аз бях супер горди от вас момчета вече, така че да се справи. И да имат добра почивка на седмицата. Аз съм сигурен, че ще видите някои от вас в работно време.