[TEMA MUSIC] SPEAKER 1: Hej, alle sammen. Velkommen tilbage til afsnittet. Dejlig dag out-- hvilket er grunden til, jeg er sikker, er der kun fire af jer her og ikke vores sædvanlige pack. Jeg har været syg i denne weekend. Så jeg har ikke Starburst for jer. Og jeg kan begynde at hoste forfærdelig hele denne. Så bare bære over med mig. Jeg har tænkt mig at virkelig prøve og komme igennem denne første, Men før jeg har en hoste angreb. Men bare være let på mig lidt bit-- det er alt jeg beder om. Så vores dagsorden for today-- bare en reminder-- din quiz er næste uge. Jeg fortalte dig det i sidste uge, så det ville ikke fange dig ud vagt. Så jeg minde dig igen. Næste uges din quiz. Med henblik herpå næste uges afsnit vil være meget mere of-- Jeg vil prøve og arbejde i nogle revision. Så hvis du fyre kunne hjælpe mig ud ved at sende mig ting, som du har det godt med, at du er bekymret for, emner, som du gerne vil for mig til at dække, det ville være stor. Så jeg kan forsøge at arbejde dem ind i vores sektion næste uge eller sende dig ekstra materiale eller prep at du ikke kan få andre steder. Yeah! Flere mennesker kommer! Jeg tænkte, gjorde jeg det dårligt sidste uge, at ingen ønsker at komme tilbage? Jeg er bange. Så de tre andre ting at vi kommer til at gå over er omdirigering, fil I / O, og så pointere og dynamisk hukommelse. Jeg er sikker på du er alle super begejstrede pointers-- alles favorit emne, så nemt at forstå. Jeg er sikker på jer alle fik det, right? Så første ting først, redirection-- dette er dybest set blot en måde at kontrollere, hvordan du input ting i dit program, hvordan du output ting fra dit program. De vigtigste måder, hvorpå du fyre har interaktion med det er blot gennem standard ud med din print screen her. Men der er måder at pipe-- som vi ser her er en af ​​vores words-- art af rør, information eller at data i en fil fra en fil. Det er bare forskellige måder at få tingene ind i dit program og ud af dit program, i stedet for bare udskrive dem til denne skærm eller indlæsning ting fra kommandolinjen. Så første er lidt større end karet. Så output-- det bare udskriver output til en fil i stedet for din skærm. Så hvis du havde noget, der udskrives "Hej, verden!" til skærmen, hvis du sætter det i stedet at output.text, at opretter denne fil kaldet output.text. Og når du åbner den, det vil sige "Hej, verden!" derinde. Dette kan være super nyttig hvis du har et væld af fejl faktisk, som vi ser i dette ene. Hvis du gør to indskudsmærke, det vil udskrive fejlmeddelelser. Så hvis du har et problem med kompilering, det har en masse af fejl og du er at køre fast i forsøget for at rulle gennem i din kommandolinje gennem alle dem, kan du bare udskrive dem til en fil, åbne filen, så du kan rulle gennem dem lettere. Jeg faktisk bruges som en meget, når jeg var debugging mine 181 psets for machine learning. Så det kan være super nyttige senere. Det er også nyttigt, hvis du har et program at måske genererer et bibliotek eller generere nogle sæt af strygere, og du skal være i stand til at se, at det er at generere dem ordentligt. Det er den måde at gøre det. Så hvis du udskrive dem til en fil, du lettere kan undersøge dem, right? Versus forsøger at rulle gennem din kommandolinje. Og så en ting at bemærke er, at med blot større end caret, hvis du skriver til en fil, der allerede exists-- så gerne, hvis vi kørte dette den første tid, vi sætter det til output.text, og derefter havde vi et andet program den trykte dette som program to og gjorde en større end til output.text, det vil overskrive at-- så overskrive, hvad der var nogensinde i filen til at begynde med. Så hvis du ønsker at tilføje til en fil, som vi ser her, du bare gøre to større end tegn. Og det vil tilføje til det. Det vil ikke overskrive det. Så hvis du har brug for at køre flere programmer og art holde styr på, hvad alle af dem er vender tilbage til dig i en fil, det er en måde at gøre det. Hvis du er ligeglad med hvad der er i din fil og det er tilladt at blive overskrevet, kan du bare bruge en enkelt større end. Giver det mening for alle? PUBLIKUM: Ligesom dot skråstreg goddag større end produktionen dot tekst, som to gange, det vil bare kun vise på udgang dot tekst en anden time-- SPEAKER 1: Right. Så det ville egentlig bare helt overskrive hvad var der til at begynde med. Hvis filen her, den output.text allerede eksisterer, dybest set hvad du kalder der igen med et enkelt større end du kan bare tænke på det som ligesom det erstattet filen. Ligesom når du gemmer et Word dokument og du gem som, og du holder det samme navn, og det fuldstændigt overskriver it-- det er den samme slags ting. Nogen der har nogen spørgsmål om bare output til en fil? Awesome. Så selvfølgelig, hvis du vende pilens retning, kan det gøre input. Så når du fyre havde ligesom Cæsar eller Visioneer og du havde at indtaste noget, du havde en kommandolinje argument der faktisk input det. Dette er en anden måde at gøre det. Så i stedet for at vente for en kommandoprompt, ligesom når du bedt om dit besked i Cæsar eller Visioneer, hvis du havde en tekstfil der havde din besked kunne du bare skrive det ind. Så hvis dette var ligesom dot skråstreg Caesar 3 mindre end pil tekstinput, som er dit budskab, at ville køre fint. Når din Cæsar program faktisk bedt om input fra brugeren, ville det allerede har det, fordi du har skrevet i denne fil. Det er bare en anden måde. Bare en omvendt af output-- bare input til dine data. Og derefter den sidste er røret. Så denne ene er temmelig cool. Fordi det giver dig mulighed for tage outputtet af en program og sætte det som input til et andet program. Jeg ved ikke, om nogen af ​​jer spilles med dechifrere at CS50 kan have givet dig, men det ville tillader dig at tage nogle eksempler fil, skriv det ind i din kryptering, og så derfra skriv der ind i din dekryptering at sikre, at det viste sig det samme. Så det er lidt ligesom tre-vejs loop. Gå efter det. PUBLIKUM: Hvis et program har flere indgange, er der en måde at fortælle det som input at bruge tekstfil eller output til? SPEAKER 1: Det har flere indgange. Uanset indsende din input-- når det er beder om input, som første gang, er det kommer til at antage, tror jeg, det er gå til rør i hele filen. Så hvis du har flere indgange, er du vil være rørsystemer i flere filer. Så hvis du beder om meddelelser tre gange i din kode, du kommer til at lægge i tre forskellige filer. Og det bliver vanvittigt. Og du bør ikke have til bekymre sig om, at lige nu. Men det er den idé. Så yeah, rør er blot produktion af en Programmet anvender input i den anden. Alle godt der? Cool. OK. Du vil sandsynligvis ikke have at gøre for meget med det. Men du skal forstå måder, du kan bruge dette. Og der er nogle sager, der du måske ønsker at bruge det. Så fil I / O-- jeg ved, hvad du er saying-- vi er vant til at læse fra og skrive til vores skærm der, som er standard i og standard ud. Og det er, hvad du fyre har været gjort siden begyndelsen af ​​klassen her. Men du kan også læse og skrive filer, som er alle fil I / O-- så fil input, output er alt det står for. Så dette dybest set betyder, at du kan gemme dine data nu. Når du bare udskrive det til skærm, er det dybest set væk, right? Så snart du gør "Hello verden "og køre" Hej verden " det udskriver "Hello world" til skærmen. Men du kan ikke rigtig gøre noget med det derfra. Hvis du gemmer i en tekst fil, så pludselig du har denne data, som du er tilladt at manipulere eller sætte den i en fil, eller sætte den i et program senere. En af grundene hvorfor vi gør det er bare som en måde til at lagre data til senere brug. Jeg har et par skridt her bare gå gennem standard I / O. I første trin, du brug for at skabe en reference til filen med alle caps FILE stjerne fil. Så der skaber en pointer til en fil. Så du ønsker at åbne den. Og du siger, bogstaveligt talt, bare fil lig fopen. Og dette vil returnere en pointer til den fil, du lige har åbnet. Jeg så et par af jer fyre på kontortid. Men en af ​​de ting, er remember-- pointers kan være nogle adresse eller null, right? Hvis vi nogensinde får en sag, hvor noget kan returnere null, hvad har vi at gøre før vi nogensinde bruge det? Vi er nødt til at kontrollere, om det er null eller ikke, right? Fordi nogle af jer måske har haft det problem, hvor det objekt blev returneret i breakout var ugyldig. Du har forsøgt at udføre en funktion på det. Og computeren websted afbrudt. Right? Jeg vil vædde et par af jer kan have haft dette spørgsmål. Så med fopen, fopen vil enten returnerer en pointer til filen, eller hvis noget går galt, det kommer til at returnere null. Så du altid nødt til at tjekke at det ikke er vendt tilbage null før du forsøger at gøre noget andet. Det er ligesom en standard paradigme at du vil få brug for her. Hvis der nogensinde er en chance for, at noget kunne returnere null, kontroller, at det ikke før du fortsætter. Ellers er du nødt at få dejlige websted fejl. Og ingen kan lide at beskæftige sig med dem. Så som vi ser her, det første argument er bare stien til filen. Hvis filen ikke eksisterer, det kommer til at oprette denne fil. Og det er bare at være tom. Og så det andet argument er den tilstand, du ønsker. Ønsker vi at læse fra denne fil? Ønsker du at skrive fra det? Ønsker du at tilføje? Så faktisk, hvad jeg lige said-- hvis filen ikke eksisterer og du forsøger at læse fra det, det kommer til at kaste en fejl. Hvis filen name-- gerne hvis file.text eksisterer ikke endnu og du ønsker at skrive til det, vil det skabe en tom fil kaldet file.text for dig. Og hvis du ønsker at tilføje, du bør gøre det samme. Giver det mening? Hvis du prøver at læse fra en fil, der ikke eksisterer endnu, det vil kaste en fejl. Ellers vil det skabe filen for du gør, hvad du vil det. Cool. Nu kan vi læse fra filen. Og det er bare sådan går gennem de forskellige funktioner at vi har for fil I / O. Dette vil være nødvendigt i denne uges pset, hvis jeg husker rigtigt. Ja, det vil absolut være nødvendigt i denne uges pset. Så fgetc returnerer det næste tegn. fgets blot returnerer en tekstlinje. Det vil vende tilbage noget op til en ny linje, og det vil bryde. Så fread læser en vis antal bytes og placerer dem i et array, som er noget du måske ønsker at gøre med re-size-- kan være nyttigt. Hvor mange mennesker har læst den pset spec, ved den måde? OK. [Uhørligt] SPEAKER 1: OK. Ok. Absolut læse at-- det er en sjov pset. Du kommer til at gendanne en slettet hukommelse card-- virkelig spændende, når det fungerer. Men absolut, begynde at læse det. Kom tale med mig, hvis du har spørgsmål om det. OK, så jeg sagde, fread læser et bestemt antal bytes. Det er noget vilkårligt antal at du vil indstille. Og så fseek bare flytter til en bestemt position. Så måske du er ligeglad om de næste 10 bytes. Du ønsker bare at springe frem. Du behøver ikke bekymre sig om dem. Du ønsker at læse starter ved byte 11. fseek giver dig mulighed for at gøre det. Så det giver dig mulighed for at være selektive om, hvad du læser. Fordi fgetc, fgets, og fread read fra et bestemt sted i filen. En måde at tænke på dette er, hvis dette er vores fil, når du først åbne den, du har denne position i fil der starter i begyndelsen. Når du ringer fgetc, fgetf eller fread, det kommer til at starte fra denne position markør. Lad os sige, at du bare ønsker at læse denne luns af hukommelse herovre. Du kan ikke bare ringe. Du er nødt til at søge over her og derefter læse derfra eller læse, får eller getc, afhængigt af hvad du ønsker. Så søger bare giver dig mulighed for at springe dele af hukommelsen. Og det er den eneste måde kan du springe ting uden at læse dem i din buffer. Giver det mening for alle? Det er klart, der er en masse parallel her-- vores produktion, eller input omdirigering, du har læst og skrive. Så fputc bare skriver en tegn i filen. fputs skriver en linje. Fprintf udskriver en formateret output. Så hvis du har faner, eller rum, eller whatnot. Og så skriver fwrite nogle bytefeltet til en fil. Så det er på samme måde fwrite og fread er analoge opposites-- fgets, fputs, og derefter fputc og fgetc-- partier af skøre, hurtige ting. Bare slags holde denne handy-- har du forskellige tidspunkter hvor måske du bare vil et tegn ad gangen. Måske du ønsker en hel linje. Med din ordbog pset-- som er i to psets, Jeg tror, ​​vi giver dig en hel ordbog i en tekst format som har hvert ord adskilt af en linje. Så hvis du ønsker at læse i et ord ad gangen, hvad kan du bruge, hvis du læser og de er alle adskilt på nye strækninger, og du bare vil have et ord ad gangen? Publikum: fgets SPEAKER 1: Right. Fgets-- fordi der returnerer uanset er på én linje. Og hvis hvert ord er dens egen linje, kan vi bruge fgets. Cool. Giver det mening, alle? Cool? Ja, vi vil komme til den sjove del med pegepinde meget snart, hvor du komme til at gøre nogle matematik. Og det vil være stor. Sidste step-- lukke din fil. Med så mange ting her, en af ​​vores paradigmer er, hvis det kan vende tilbage null, så tjek for null. Hvis du åbner noget, du må hellere lukke det. OK, så du er ikke færdig, før du er gjort, medmindre du har lukket det. Lidt ligesom det er ikke slut indtil den fede dame synger. Det er ligesom at lukke din fil. Som det hedder her, bare at gentage, altid åbne din fil, før du er læser eller skriver til det. Og altid lukke den, hvis du har åbnet det. Okay? Cool. Så her er et eksempel. Så tiny-- Jeg ved ikke, om du fyre kan se, at meget godt. Hvis bare vi kunne øge lysstyrken eller anden måde. Lad mig faktisk gøre det, hvis jeg kan. OK, ikke kan du fyre virkelig se, at på alle, kan du? OK, vi kommer til at gøre dette, da. [Uhørligt] Jeg formoder, det er meget bedre at se. Kan nogen se, hvor min gik mus er spørgsmålet? Ah, der er det is-- hvad kæmper! OK. Grundlæggende bør du fyre har slags af en idé om, hvad dette gør. Det er ikke perfekt. Men jeg vil hellere forklare det end at tilbringe mere tid på at forsøge at formatere det ordentligt. Dybest set, som du ser her, vi starter med fil åben. Og vi har nogle databasefil, at vi er åbning, der siger, det er vores studerende. Og vi kommer til at skrive til den. Så selvfølgelig, returnere null. Så vi er nødt til at tjekke for null. Og derefter, hvis det ikke er null, vi går igennem. Og som du kan se, er vi looping igennem her. Der er studerende. Studerende er hash defineret som tre. Og hvad vi laver, er vi er udskrive til fil, right? Så hvad skal vi udskrive til vores fil? PUBLIKUM: Pointene der er i array? SPEAKER 1: Ja. De resultater, der er i den array-- nøjagtigt. Så vi er ved at åbne dette database fil, som Jeg formoder er en slags af kvaliteter database. Og vi bare udskrive snesevis af hver elev til den pågældende fil. Cool? Godt. Awesome. OK. Lad os komme tilbage at-- PUBLIKUM: Jeg har et hurtigt spørgsmål. Er printf ikke i for-løkken? Det er bare i hvis loop? SPEAKER 1: Nej, det er i for-løkken. Jeg kan ikke se min mus meget godt heroppe. Så jeg kæmper for at format, ordentligt. Dette beslag skal være væk. Det bør være ned her. Dette er, hvad der er i din for-løkke. Der. Nu er det temmelig. Så det er sådan det skal være-- undtagen for den sidste konsol, som jeg afviste. OK. Giver det mening for alle? OK. Vi kommer til at bevæge sig på til den næste ting then-- som, faktisk, du vil til brug for at se koden. Så jeg vil bare kopiere, at over lige nu. OK. Så jeg har tænkt mig at vise jer denne kode. Og jeg vil have dig til at prøve og figur ud af, hvad det er meningen at gøre. Så givet at-- tage et minut eller deromkring. Prøv og finde ud af, hvad der foregår her. Nogen idéer? Vi ved, at vi har mindst to argumenter i kommandolinjen, right? Jeg formoder, hvoraf den ene vil være at [uhørligt] af vores program er og derefter noget andet. Fordi hvis [uhørligt] er mindre end to, vi råber til dem. Right? Og fra brugen, det ligner det kommer til at være en slags fil. Vi er alle enige om det? Så nu, hvad er loop gør? Hvad går det igennem? PUBLIKUM: Alle filer. SPEAKER 1: Præcis. Det kommer gennem alle de filer, som vi har input der. Så for hver fil, det er åbner nogle streng der. Det åbner op den pågældende fil. Right? Og det er læst fra det. Selvfølgelig, kontrol, hvis det er nul. Og så er det udskrives. Hvis det er nul, er det bare at fortælle os at det ikke er en fil, der findes. Fordi huske, med læse vores fil har at eksistere. Right? Med write og append, du kan slippe af sted med det. Men med læse-, vores fil har at eksistere. Og derefter, hvis det eksisterer, hvad laver vi her? Lad os bare starte her. Hvad er det do-- denne første tegn. Hvad gør den? Han får en karakter, right? Så hvad er denne gør? Det bliver det første tegn. Enhver ved EOF? PUBLIKUM: Slutningen af ​​filen? SPEAKER 1: Slutningen af ​​file-- nøjagtigt. Så det kommer til at gå igennem hele filen, right? Og så det kommer til at opdatere ved få hver efterfølgende karakter. Right? Og hvad laver den? PUBLIKUM: Sætte det in-- SPEAKER 1: Putchar udskrifter til din screensaver. [Uhørligt] tegnet. Og når det så [uhørligt] Dette vil lukke filen. PUBLIKUM: Har du ikke brug for en [? andet? ?] SPEAKER 1: Ikke nødvendigvis. Jeg mener, det er lidt underforstået i dette. Fordi dette returnerer, selv om, så længe da dette ikke fange denne, du er fine. Jeg mener det er sikkert godt øve at gøre et andet. Men et andet er ikke altid nødvendigt især hvis du har noget som en tilbagevenden, som betyder, at i dette tilfælde, hvis den fanger det, er dit program kommer til at ende og det vil aldrig komme til dette. Det er mere for det tilfælde, hvor du er ikke nødvendigvis returnere noget. Fordi hvis dette ikke var returnere noget, det ville betyde, at hvis dette var sandt, resten af ​​dette vil stadig køre. Og i så fald, du ønsker en falsk. Hvis det er tilbage, og Deres programmets slutning, en anden er ikke nødvendigt alle den tid, afhængigt af konteksten. Jakob, havde du et spørgsmål? PUBLIKUM: Ja. Så gør fgetc få den næste karakter? Hvordan tegnet stige? SPEAKER 1: Ja. Så fgetc får det næste tegn. Du kan tænke på det som C ++ i en vis forstand. PUBLIKUM: Så hvad var EOF? SPEAKER 1: EOF er slutningen af ​​filen. Det er bare en markør, der lader dig vide, at du er i slutningen af ​​din fil. Så det kommer til at udskrive til din standard ud. Og så det kommer til at lukke filen, når det er gjort. Og så lad os gå til den næste fil, right? Så samlet hvad betyder dette program gøre? [Uhørligt] SPEAKER 1: Ja. Det bare udskriver alt der. Så hvis du fyre nogensinde har brugt CAT og derefter navnet på nogle file-- Jeg ved ikke, om nogen af ​​jer har nogensinde gjort det på din terminal. Men hvis du nogensinde brug kommando CAT-- C-A-T-- og hvad derpå fil du har there-- det udskriver det til din terminal, som kan være super praktisk for nogle ting. Jeg bruger det meget. Giver det mening for alle? Cool? OK, så din opgave nu-- enten ved dig selv eller med folk omkring dig-- er bare at skrive et simpelt program der vil bare skrive "Hello, world!" ud til en fil. [Uhørligt] [Uhørligt] SPEAKER 1: Jeg var ligesom, gjorde Jeg gør det dårligt i sidste uge? Jeg tror ikke, det var så slemt. Jeg er glad for du er her alle sammen. Det gør mig virkelig glad. Jeg er en pige på enkle fornøjelser. Jeg kan bare lide, når min afdeling deltager. Så jeg bare at få dette startede for jer, så vi kan kode sammen. Jeg kan ikke lide at sætte nogen på stedet, medmindre du ønsker at være. PUBLIKUM: For quiz, gøre vi nødt til at skrive et program? SPEAKER 1: Du kan blive bedt om at skrive simple programmer ved hånden. Yup. PUBLIKUM: Quizzen er i næste uge, right? SPEAKER 1: Quizzen er næste onsdag. Det betyder, at der er en dejlig [? CSE?] Vurdering part bagefter, som betyder at du får dine point tilbage at night-- på hvilket tidspunkt? Hvem ved? Men det vil være den aften. Ok. Hvordan ønsker vi at starte denne? Jeg vil give dig en hint-- starter med dette. PUBLIKUM: Du er nødt til at åbne en fil. SPEAKER 1: Ja. Så hvad vil du kalde det? Har du bare lyst til at kalde det "fil"? Lad os gøre det nemt. Så fopen-- hvad er vores output test kommer til at være? Kald det "Hello". Og hvad er vores mode? Hvad gør vi for at denne fil? PUBLIKUM: Læs. Skrivning. SPEAKER 1: Vi skriver til det. Dejligt. OK, så vi har denne fil nu. Hvad skal vi gøre? PUBLIKUM: Kontroller, om det er nul. SPEAKER 1: Kontroller, om det er null-- nøjagtigt. Det er, hvad jeg kan lide at høre. Det burde ske automatisk, især temmelig meget fra dette punkt på. Hvis du starter segfaulting, har du sandsynligvis ikke tjekke for null eller andet sted. Ni ud af ti gange, det er vil være din fejl. Så hvis du bare kunne få i vane, altid kontrollere, hvis det er nul, dit liv kommer til at være nice og easy-- eller lettere. Så tjek for at se om det er nul. Så hvis det ikke er null, som er, hvad bang lig means-- ikke null-- den er gyldig. Hvad ønsker vi at gøre? Vi ønsker blot at udskrive til denne fil, right? Så hvad skal vi bruge? PUBLIKUM: fprintf SPEAKER 1: Fprintf-- dejlige. Og fprintf tager to arguments-- hvor det går, og hvad vi ønsker udskrevet. Så hvad er den første? Hvor er det? PUBLIKUM: Fil. SPEAKER 1: Det kommer til at fil. Og hvad ønsker vi udskrives? "Hej, verden!" Ok. Vi har en sidste thing-- en anden stor paradigme her. PUBLIKUM: Luk. SPEAKER 1: Luk. Der kan du gå. PUBLIKUM: Er dette sker hvis filen er ugyldig? SPEAKER 1: Nej, det er, hvis det ikke er null. PUBLIKUM: Åh, hvis det er not-- OK. For fopen og derefter to argumenter, der går ind, hvad betyder det første argument betyder igen? SPEAKER 1: Argumentet er ligesom navnet på filen at du ønsker at gå til. Så efter dette kører, ville du har nogle fil kaldet "hello" der havde "Hello, world" i det. Det er alt. Bare navnet. PUBLIKUM: Og da det er at skrive, det Filen behøver ikke at allerede findes. Er det hvad du sagde? SPEAKER 1: Right. Præcis. Hvis "Hello" som en fil eksisterer ikke endnu, det er vil oprette en fil kaldet Hello "og skrive til det for dig. PUBLIKUM: Når du fortæller programmet til skrev til filen, Hvorfor skriver du "fil" i stedet for navnet på filen og fprintf-- SPEAKER 1: Fordi der i dette tilfælde har vi at store FILE-- alle i caps-- stjerne, fil. Så det er en pointer til filen at du taler om. Det er den måde, som vi blot henvise til det. Så i dette tilfælde, skal du kan tænke på file-- aha, vi kan bruge denne-- fil her refererer til åbningen af ​​"Hello" og lade det skrive. PUBLIKUM: Kan vi sætte et "Hello" i stedet [? af bare?] f fil? SPEAKER 1: Nej, fordi "Hello" skal være åben og skrivbar. Fil her er ligesom en designator der siger OK, vi har denne file-- hello-- at vi kigger på. Det er blevet åbnet. Og vi kommer til at skrive til den. Hvis du bare bruge "Hello", der er indkapslet i det. Så det kommer til at flipper ud. Jeg mener, du kunne have navngivet det. Du kunne have gjort fil, stjerne, "Hello", lig. Men hele pointen er, at du brug for en fil stjerne pointer for at kunne anvende disse funktioner. PUBLIKUM: Kan du gøre fil, stjerne, fil, "Hello" eller har du nødt til at sætte fil stjerne, fil ved det? SPEAKER 1: Du kunne do-filen, stjerne, "Hello". Du kan ændre dette til uanset navn, du ønsker. Det er helt vilkårlig hvad det hedder. Du kan kalde det noget. Name it flyvende spaghetti, hvis du ville. PUBLIKUM: Hvad er "w" i anførselstegn til? SPEAKER 1: "w" er bare mode. Så vi skriver til denne fil. Alle godt? Klar? Ja. PUBLIKUM: Så når det skriver dette fil, hvor skal vi så finde denne fil? SPEAKER 1: Det vil være i den samme mappe, du i øjeblikket i. Hvis du er i pset tre og du kører denne, inden for din pset tre folder vil være denne fil kaldet "Hello". Cool? Alle godt? Jeg føler, at du er alle at få det, som er stort. OK. Så tilbage til mit slide show-- Jeg elsker når tingene fungerer. OK, pointers-- Er du fyre ophidset? Pointere er stor. De tager en lille smule at ombryde dit hoved omkring. Dette er mit andet år undervisning pointere. Og jeg tror, ​​jeg endelig fik det. Så hvis du kæmper, det er OK. Som jeg sagde før, tegne billeder hjælper en masse med ting i CS, så meget som jeg tror, ​​at folk har en tendens til at tænke åh, vi er ved en computer. Vi skulle bare kode. No-- tegne billeder vil virkelig hjælpe dig. Og jeg virkelig opfordre dig til at indpasses i dit børnehavebarn side og bringe farveblyanter eller markører og draw. Fordi det vil hjælpe dig. Og hvis du ser mig i kontortid, jeg vil gennemføre omkring stakke af papir med penne tegning ting ud. Så især med pointers-- tegne billeder. Og jeg er sikker på, vi faktisk kommer til at være at tegne nogle billeder her. Så jer alle fik at se Binky, denne cool claymation ting. Og vi synes, det er virkelig sjovt, når han eksploderer i en flok stykker. Det er nogle comic relief for klassen. C [uhørligt] denne store evne at være i stand til at styre hukommelsen. Og det er en af ​​de ting, der virkelig gør det sådan et kraftfuldt sprog. Men med stor magt kommer stort ansvar. Og skøre ting kan ske hvis du ikke er forsigtig. Så når du bruger pegepinde, du ønsker at gøre at du virkelig forstår præcis, hvad du laver. Forhåbentlig næste lille smule tid vil hjælpe dig rigtig forstå pointere, hvordan man bruger dem, og hvordan man kan manipulere dem. Så memory-- Jeg er sikker på, vi har set dette diagram før. Så dette er blot en simpel diagram af hvordan tingene kan være gemt hukommelse. Så du dybest set har disse store arrays af en byte blokke er, hvad vi har her-- svag intervaller med én hver gang. Dette er i hex [uhørligt] så otte-bit blokke. Og hver blok er forbundet med nogle hexadecimal adresse. Så hvis du nogensinde ser den 0x, det er bare notating at det er en hexadecimal adresse. Du kan påtage sig dette betyder nogle adresse i hukommelsen. Vi taler om hukommelse adresser når du ser hexadecimal. Vi har ints er variabler, flydere er variabler, der gemmer. Så int'er butik int'er. Flyder butik flåd. Så vi har også pointers der lagrer hukommelse adresser. Det er en slags kortlægning. Pointers er udelukkende for hukommelse adresser. Så det er ligesom din type der. Apparatet er 32-bit, hvilket betyder, at din hukommelse adresse er fire bytes. Så enhver pointer, at du har også kommer til at være fire bytes. Eller andet, hvis det er fire bytes, hukommelse er fire bytes. Pointers butik hukommelse. Derfor er de fire bytes. Cool-- blot ønsker at styrke denne. Du bør få denne tegneserie nu. Jeg ved ikke, hvor mange af jer er xkcd fans, men jeg elsker xkcd. Det er dejligt. Ok. Så skaber pointers-- som jeg sagde, det er stort set bare gerne noget andet. Du har en type. Du har et navn. Right? Det er hvad vi har der. [? Hex?] Stjerne betyder, at det er en pointer, og derefter hvad du vil kalde det. Så type repræsenterer hvad du kan gemme. Okay? På samme måde som hvis vi gør int'er, vi ved, at vi gemmer en int der. Med en pegepind, det besidder en hukommelse adresse. Men hvad det betyder er at-- her er hvor en tegning vil komme i handy. Så i dette tilfælde, har vi nogle value-- lad os sige fire. Fire er på adressen én. OK? Denne første betyder her at det er en pointer 2x. Right? Det er nogle pointer x. x kan være noget, uanset hvad. Uanset x is-- siger x er fire. Det kommer til at gemme memory-adresse her. Så int, stjerne, x-- dette er nogle andre slot i memory-- hvem ved hvad det er. Men det kommer til at gemme en adresse her. Så det ville være like-- i dette tilfælde, uanset hvad, opbevares ved 0x1-- hvad der er lagret på den adresse, at vores pointer holder, har at matche op med hvad vi har udpeget. Så på 0x1, i dette tilfælde, det er x. Dette kan kun være en int, mens vi bruger dette. Tilsvarende, hvis vi har anden 1y, uanset adresse er gemt med et y har at være en char-- samme med z. På samme måde, når man forsøge at gøre intx lig 0,4, det kommer til at råbe på dig og være ligesom ingen, du sagde, du ville en int. Dette formodes for at være en int. Stop forsøger at gøre det en flyder. Så lad tingene være, hvad de ønsker at være. Lad tingene være sig selv. Så store ting er bare uanset hvilken type pointer det er, det er den eneste ting du kan gemme der. OK? Med praksis, som med i sidste uge, alt synes virkelig slags abstrakt. Vi kommer til at gøre nogle praksis. Det skal give mere mening. Så henvisninger og dereferencing-- det er virkelig vigtigt at få disse straight. Jeg har stadig til at genopfriske i ny og næ. Og jeg er ligesom ventetid, som man ønsker jeg? Så tegnet vil faktisk give du reference- eller adresse. Så det returnerer adressen i hukommelse, heraf variabel er gemt. Så det kommer til rent faktisk at vende tilbage til dig en hexadecimal, hvorimod dereferere det rent faktisk vil give dig de data, der er gemt der. OK? Så vi kommer til at se på et eksempel rigtig hurtigt, eller rent faktisk op næste gang. OK. Så vi er nødt til at tænke rigtig grundigt over dette. Så her har vi nogle heltal x. Jeg har tænkt mig at forsøge at trække dette ud til de bedste af mine evner. Så vi kommer til at have denne slot x. Og det er lagring af fem. Dens adresse er 0x4. Cool? Alle gode. Så nu har vi denne pointer. Det var herovre. Og tegnet giver os adressen på noget. Så i dette tilfælde er det adressen på x. Hvad er adressen på x? 04-- og denne pointer er på 0x08. Cool? Så du kan tænke over dette pointer, 04, bare peger herovre. Og de kaldes pointers fordi vi får mere ind i dette, du kommer til at se peger på ting. Og én blok peger på en anden blok vil gøre en masse mere mening. Så her er to. Og så har vi nogle kopi, som er hvad-- 0x0C. Og det kommer til at dereference vores pointer. Så hvad det siger, er OK, her er vores pointer. Værdien det gemmer er 0x04, Og hvad det er at sige er at gå til denne adresse og fortæl mig hvad der er i det. Så det er effektivt hvad denne pil gør. Du kan tænke på dette som din stjerne. Så OK, når vi gør stjerne, betyder det at følge. Gå til denne adresse. Og det er egentlig bare efter denne pil for at denne hukommelse luns. Og give os, hvad der er i det, som er 5. Det er derfor, vores eksemplar er lig med 5. Giver det mening? Er der nogen der har brug for mig til at gå igennem det igen, eller langsommere? Du vil have mig til at gå igennem det en gang til? OK. Vi kommer til at tegne det igen. Når vi starter, vi alle er enige, vi har nogle luns af hukommelse, som er en variabel x at vi sætter lig med 5. Vi kan ikke styre, hvor det er i hukommelsen. Så dette sted er bare vilkårligt tildelt. Godt der? OK. Så initialiserer vi en pointer til en int. Det er derfor, det er tilladt at pege på x fordi vi har en int i her. Vi har en anden luns af hukommelsen, da denne pointer er en variabel ligesom noget andet. Det er vilkårligt tildeles noget plads i hukommelsen. Og hvad det gemmer er adressen på x. Ampersand betyder adresse af x. Så hvad er adressen på x? PUBLIKUM: Det er zero-- SPEAKER 1: 0x04. Så then-- sidste. Vi har nogle copy-- igen bare en anden variabel. Så lad os tildele nogle vilkårlige sted. Og vi dereference vores pointer. Stjernen betyder gå til adresse er gemt i min pointer. Fortæl mig, hvad der er. Så adressen gemt i vores pointer er 0x04. Så vi går til denne adresse. Det peger på denne adresse. Hvad er der indeni denne hukommelse blok? Det er en fem. Så det er hvad vi tildeler vores kopi. Alle godt? Cool. Igen-- billeder. Så spore de værdier her-- jeg er vil lade jer tænke over dette. Vi kan tegne et andet billede. Men jeg vil have dig til at prøve og årsag gennem dette på egen hånd i et minut. Da de ikke gav os et eksempel adresse, Jeg vil blot gøre tegnet x-- som skal hjælpe køre den hjem. Ampersand betyder adresse. Så i den første, alle gå med den første linje. Nogle x sæt s five-- nogle random slot i hukommelsen. Int stjerne pointer er lig til adressen på x, right? Int stjerne pointer skaber denne blok, kalder det pointer, og tildeler den til adressen på x. Jeg er forfærdeligt-tegn. Nu, hvad vi laver, er vi siger OK, dereference vores pointer. Så vi går OK, hvad der er i vores pointer? Det er tegnet x. Gå i Ampersand x og overflytte det. Så nu er tegnet x kommer til at være 35. Så dybest set, når du er dereferere, du går OK. Du kommer til at være at trække billeder som dette. Du kommer til at være at trække dine pile over, hvor det er. Så gå til denne slot i hukommelsen og enten giv mig den værdi tilbage eller ændre det. I dette tilfælde, fordi vi er på dette værdi, vi tildele den til at være 35. Mens der i sidste én, hvis du bemærker, at vi blev tildele det var her til noget andet. Så de har denne awesome tabel. Det er ikke så slemt. Du fyre arbejde på det. Jeg har tænkt mig at trække det ud på brættet. Vi kommer til at fylde det ud sammen, OK? Så Grib nogle papir, grab en partner, begynde at arbejde. Jeg har tænkt mig at få en større stykke kridt. Fordi det kommer til at være en masse. OK. PROFESSOR: OK. Lad os starte med den første række. Vi starter der, så du fyre kan måske arbejde gennem nogle flere. OK. a er lig b gange c, så hvad er en? Det er ikke et trick spørgsmål, det lover jeg. STUDENT: 4 gange 5. PROFESSOR: 4 gange 5. 20. Så hvad er b? STUDENT: 4. PROFESSOR: og C? STUDENT: 5. PROFESSOR: 5. Og så er dette blot vil blive Ampersand a, tegnet B, -tegn c, right? Ikke dårligt. Det er simpelt nok. OK. Så den næste. A lig en gange c, i tilfælde nogen var uvant med at. Er alle kender med tiden lig? OK, alt dette means-- dette er synonym med en lig en gange c. Du kan også gøre det med division, med tilsætning, med subtraktion. Du kan gøre en ligemænd, eller et plus lig c betyder et lig med et plus c, a minus lig c ville være et lig med et minus c. Det er bare syntaktisk sukker. Så i dette tilfælde, en er lig med en gange c ville give os, hvad? Igen, ikke et trick spørgsmål. STUDENT: 100. PROFESSOR: 100. Er der noget andet ændre sig? Nej. Måske vil jeg endelig få bedre på mine ampersands. STUDENT: OK, undskyld, hvordan fik du 100? PROFESSOR: OK. Så en er lig med en gange c, så en gange c. STUDENT: Åh, du bruger en for previous-- PROFESSOR: Ja. Så det er vores seneste værdier. Det er, hvad du skal være bruger som vi bevæger os ned, OK. Så b er den eneste forandring, right? Så lad os udfylde alt andet. B. Hvad b kommer til at være? At være eller ikke at være. Så hvad er denne gør? Hvad er stjernen pa gør? STUDENT: Kode til placeringen af ​​pa. STUDENT: Nej, ikke helt. Så dette er en d reference. STUDENT: Så b er afleveret værdi pa. PROFESSOR: Ja, så pa er adressen på en, right? Så det siger gå til hvor a er opbevares og give det pågældende værdi. Så hvad er b? STUDENT: 100. PROFESSOR: 100. Perfect. OK, så pc er, hvad der er under forandring. Alt andet forbliver det samme. Hvad er PC kommer til at være? Simpel opgave. Pc er lig med pa, og hvad der er pa? STUDENT: Ampersand a. PROFESSOR: Perfect. Nu får vi interessant. OK, lad os bryde denne ene ned. Først, hvad er b gange c, fordi det er den nemme del af denne ene, right? B gange c is-- STUDENT: 500. PROFESSOR: Ja, så hvad er dette ene gør, Hvis det er stjerne pb, hvad forandring? STUDENT: Hvad er til-- PROFESSOR: Hvad er b? STUDENT: Hvad der er i rummet at pb peger på. PROFESSOR: Og pb peger at-- STUDENT: B. PROFESSOR: B. Så det eneste ting skiftende er b højre. Så b gange c, 500. Så det er, hvilke ændringer nu. Cool. Dejligt. Du fyre har det godt. Okay, bryde denne ene ned. C er under forandring, right? Så vi kan udfylde alt andet. Lad os se. OK. Vi ved, at c vil være produkt af to tal, right? Hvilke to tal, selvom? STUDENT: A og C? PROFESSOR: Så en er ret for den første. Så vi d henvisninger p en, right? P af en peger på en, så vi ved, at dette vil være 100 gange hvad? Gange, hvad gør pc point til? Peger på en. Så 100 gange 100 er 10.000. Giver det mening? Cool. Hjem stretch, gutter, sidste række. OK. Hvad ændrer sig her? STUDENT: A. PROFESSOR: A. Perfekt, så alt andet kan forblive den samme. OK. Og hvad er en? Så det er en gange hvad? Dette er stjerneformet pb. Så stjerne pb betyder her er pb, PB punkt b. STUDENT: 500. PROFESSOR: 500. Så vi har 500 gange 100. Det er 50.000. Puha! Kig på det. STUDENT: Hvorfor har vi den & c for last-- PROFESSOR: Undskyld. STUDENT: Åh, OK. PROFESSOR: Min dårlige. Masser af skriftligt. Alle godt? Ikke alt for dårlig, right? Tager bare lidt mens at arbejde igennem. Hvis du bryde det ned, forstå, hvad hver del hentyder at-- som med alt, hvad det er, yes-- bryde det ned til den lille problemer og derefter rekombinerer, og du kan gøre nogle awesome ting. Der er svarene, men vi gjorde det. Pointer aritmetik. Ah. Mine hænder er alle kalkholdig. Så tilføje eller fratrække int justerer pointer af størrelsen af ​​den type af markøren. Husk, hvordan enhver type har en anden størrelse? Så som en dobbelt eller en lang længe er otte og int er fire, men char er én. Så hvad du vil gøre is-- én ting at huske er bare, at hvor meget din pointer værdi faktisk ændrer vil afhænge af type pointer det er. Enhver god med dette? Kan jeg slette det? Vi er gode? Awesome. Så hvis vi har nogle pointer at-- dette vil være-- jeg kommer til at gøre det til en int pointer. Den gemmer dette. Hvis du skulle sige pointer plus en, hvad det kommer til at gøre det kommer til at opdatere det af størrelsen på en int fordi det er den type pointer det er. Med C, alt er meget streng og reguleret. Int pointer vil opdatere ved den mængde plads en int ville tage. En int er fire bytes. Så hvad ville det blive til? Du er blot at tilføje fire på dette. Nu er din pointer ville være-- OK. Så hvis det var en char, og vi gjorde pointer plus en, hvad ville det så være nu? Hvis det started-- foregiver vi started-- lige nu er det 0x08. Lad os nu sige, at dette var en char pointer, og vi tilføjede en. Hvad ville det ændre på? Hvor mange bytes er en char? PUBLIKUM: One. SPEAKER 1: One. PUBLIKUM: Så 0x09. SPEAKER 1: Så det ville være ni. Så bare noget at huske. Lige når du tilføjer en, er det ikke tilføje en medmindre det er en char. Det tilsætning hvor mange bytes den type, som det er, hvilket er grunden til vi har denne ligning op her. Så det er int gange størrelsen af arten af ​​markøren. Så vi har eksemplet her. y blev overdraget til denne værdi, 0x4, når vi gjorde y plus lig én. Hvad er der i det, hvad er i x, ændres ikke. Hvad betyder ændringen er hvad der er i y. Adressen lagres i y opdateres af fire fordi der er fire bytes i en int og det er en int pointer. Ok. Så nu har vi en anden øvelse. Så spørgsmålet er, hvad der vil udskrive. Nogen idéer? PUBLIKUM: Antallet af tegn i glad kat? SPEAKER 1: Præcis. Så ligesom med din streng. Skal alle få det? Ønsker vi at gå igennem det? Ja, OK. Så hvad vi har her-- jeg ligesom dette så meget mere. Jeg behøver ikke at [Uhørligt] latterligt. Så vi har vores snor her, glad kat. Dejligt. Vi har nogle tæller, vi holder styr på. Så vi har nogle char * pointer der bare sættes lig med Str. Hvad det gør, er det er tildele nogle pointer til begyndelsen af ​​din streng. Fordi jeg er sikker på, da det blev nævnt i foredrag, vi har givet jer denne datatype kaldet streng. Men virkelig strenge er bare et array of-- ligesom char *. Det er en pointer til en flok karakterer der er tilgrænsende i hukommelsen. Så dette blot sætter det svarende til en streng er identificeret ved hvor sin første tegn er. Så dette er blot indstille et tidspunkt svarende til begyndelsen af ​​strengen. Alle godt der? Cool. Så dette er dereferere vores pointer. Så det er faktisk kommer til at give os nogle værdi i her, i vores streng, som vi taler om. Og vi siger, så længe det er ikke null terminator. Så holde ud, indtil du får til slutningen af ​​strengen. Opdater din pointer med én. Så r, vil det faktisk opdatere med en hver gang, fordi dette er en char, char *. Så det kommer til at gå igennem. Det kommer til at opdatere. Så første gang løber, det kommer til at være her til h. Det kommer til at opdatere. Det vil være et a. Det vil være en p, y, og så videre og så videre. Vi opdaterer tæller. Når den når slutningen, det bare udskriver, hvor langt det er kommet. Ja. PUBLIKUM: Så det tæller pladsen som én, right? OK. SPEAKER 1: Tænk det. Er det en question-- PUBLIKUM: [uhørligt]. SPEAKER 1: Ingen bekymringer. Dette vil jeg gøre det. Okay, så én ting, jeg forstå er, at med et array, du kan også behandle det som en pointeren, fordi arrays er blot kontinuerlige pletter af hukommelse. Så du kan behandle det på samme måde. Du kan manipulere dem med pointere, også. Så i stedet for at gøre, i dette tilfælde analog ting ville være matrix 0 er lig med 1. Men på samme måde som en streng bestemmes ved starten af ​​hvor dens første tegn er, et array bestemmes ved hvor det første element er. Fordi vi ved, vi er garanteret, at disse kommer til at være kontinuerlig blokke af hukommelse. Det er, hvad giver os mulighed for at gøre dette. Vi ved, de er kontinuerlig blokke af hukommelse. Så i dette tilfælde, ved dereferere bare array, der fortæller os, OK, gå til starten af dit array, som er her. Så du kan sætte den lig med en. Og i dette tilfælde, uanset dit array type er, når du opdaterer det med en, det er bare ligesom at opdatere det til det næste indeks. Du kan gøre det, fordi du hvad der er i dit array. Så den ved, hvor meget at opdatere din pointer ved, hvad adresse for at opdatere den til så at du er på det næste slot. Så dette er blot en anden måde skrive opstilling 0 er lig med 1, række 1 er lig med 2, matrix beslag 2 lig med 3. Det er bare en anden måde at tænke på det. Fordi de er kontinuerlige blokke i hukommelsen, du kan henvise til dem enten af arrayet notation-- som jeg personligt finde easier-- men måske du nødt til at manipulere det strengt ved hukommelse adresser. Og det er den måde, du ville gøre det. Kind of mere ligesom en cool ting du kan gøre versus måske ikke noget, du er faktisk kommer til at gennemføre. Jeg bruger det i 61. Du fyre sandsynligvis ikke brug at bekymre dig om det for meget. Men hvis du er interesseret, tage 61 næste år. Vi er i hjemmet stretch fyre. Jeg ved, det er lang. Dynamic Memory Allocation-- så vi ved, at en af ting, når vi talte i løbet af vores første sektion sammen, vi kiggede på en swap funktion, hvor det var uden for vores hovedfunktion. Og vi passerer i disse værdier der var faktisk kopier. Og når swap færdig udførelse, er det netop forladt en stak. Husk, vi har en stable ramme til swap. Det efterlader og dem værdier forlader med det. Og de var væk. Vi kunne ikke gøre noget med dem, og vi var kede af fordi vi kan ikke bytte vores værdier. Men med C, som jeg nævnte, du har en masse magt over hukommelsen. Så hvad du kan gøre, er at du kan tildele ting på bunke her der vil bo der, indtil du fortælle dem ellers. De er som gode børn. De bo der. De behøver ikke forlade. De vil blive der, indtil du er ligesom, OK, kan du gå væk. Ud fra følgende betragtninger ting på stakken, who-- de er ligesom uartige børn. De vil bare køre væk, når du ønsker at være der, og så er de væk. Du kan ikke få dem tilbage. Så den bunke is-- vi vil tale om malloc og fri, som Jeg er sikker på du fyre hørt om i foredraget. Og det er dybest set en måde at have meget persistente data. Så du kan holde data rundt, så længe du ønsker. MHM. PUBLIKUM: Kan du definere bunke og stak? Er de gerne steder at sætte ting? SPEAKER 1: Så de er dybest set bare-- de er den måde, vi henviser blot til hukommelsen. Så bunke er bare steder, hvor hukommelse allokeres dynamisk, hvorimod stak refererer mere at stable frames der er mere centrale for funktioner, der faktisk kører. Du behøver ikke rigtig har kontrol. Den store forskel, har du kontrol over bunke, hvis du vil. Du har mindre kontrol over stakken. Stakken afhænger funktioner, der kører, og i hvilken rækkefølge de er løbe, og hvordan tingene er returneret. Hvorimod med den bunke, som vi vil se, kan du sige, OK, jeg vil have denne værdi at være rundt, indtil jeg fortælle dig noget andet. Du er ikke tilladt at slippe af med det. Du er ikke tilladt at tilsidesætte den. Du kommer til at holde det omkring så længe jeg fortælle dig. Du kommer til at være chef i den bunke, hvorimod stack-- måske hvis du ligesom finagle din vej du kan være den chef. Men ikke helt. Og det er egentlig bare hukommelse. Det er bare forskellige måder for at henvise til hukommelsen. Cool. Så med, hvordan styre din hukommelse. Det er med malloc, som du vil komme til at bruge. Så det er bare kort for allokering af hukommelse. Det er alt det er. Der er en masse andre cool funktioner, der alloc ved udgangen, og de står for forskellige ting. Så når du har brug for opbevaring, der skal til at overleve din nuværende funktion, så at når din nuværende Funktionen løber væk, du stadig har de data, du fik fra det, du ønsker at bruge malloc. Det vil initialisere den på den bunke. Og som jeg sagde, og holde siger, du vil holde det der indtil du fortælle det ellers, som er det vigtige her. Så én ting at bemærke, og det er typisk virkelig vigtigt, er, at dette sizeof er super nyttigt at bruge fordi afhængigt maskine du kører, det kan have varierende mængder hukommelse, som det tager. Så du altid vil bruge størrelse så at du ikke er maskinen afhængig, så din kode vil køre på enhver maskine. Og det er bare en del af at skrive god kode. Hvis det virker på en maskine, men ikke nogen af ​​de andre, Hvor nyttig var dit program? Så du vil altid Sørg og bruge sizeof. PUBLIKUM: Så er der ligesom størrelse på 10 inches [uhørligt]? SPEAKER 1: Dette er den størrelse på 10 int'er. ja. Så størrelse ints vil vende tilbage hvor meget koster en int tage. Eller størrelsen af ​​char, hvordan meget koster en char take. Og så hvor mange blokke af det vil du have? Så i dette tilfælde, vi ønsker noget at vi kan gemme 10 int'er til. Og det vil arbejde uanset maskine, som er cool. Så hvor mange bytes vil der faktisk give dig? Hurtig matematik. PUBLIKUM: 40. SPEAKER 1: 40. Præcis. Så en anden stor ting. Pointer eller malloc kan returnere null. Så igen, altid kontrollere, se, om det returnerede null før du prøver og gøre noget med det. Hvis du prøver og dereference denne pointer nu det bare at gå til segfault fordi du gik og forsøgte at røre null når du ikke bør have. Så altid tjekke for null. Igen, kan alt, hvad du gør. Det kan returnere null. Det vil returnere null, hvis du er enten ud af rummet eller anden grund det løb ind i noget hukommelse bug. Det nogle gange bare returnerer null. Så du bare nødt til at tjekke det. Det er alt dette dias siger. Og så hvad vi har her er en opfordring til at befri. Så på samme måde, som hvis man åbne en fil, skal du lukke en fil, hvis du malloc hukommelse, du skal du frigøre den hukommelse. Og du fyre får at gøre virkelig cool stuff. Og der er et program, du kan køre til se, hvis du nogensinde utæt hukommelse. Men du ønsker ikke at lække hukommelse. Det er virkelig dårlig. Bare rodet op ting. Det er slemt at gøre ligesom programmering klogt for design effektivitet. Men det er også bare lidt af dårligt for din computer. Så bare gratis ting når du allokere dem. Du fyre se symmetrier her. Super enkel. Bare gratis og derefter uanset din pointer, uanset navn markøren er, og det vil tage sig af at frigøre det for dig. Cool. Så har vi denne. Så vi bare gå til gå gennem dette program. Og så skal du fyre er færdig. Så [uhørligt] bare main. Så vi har nogle int * pointer. Så vi har en pegepind der kommer til at holde int'er. Og hvor mange int'er det kommer til at holde? Blot én. Størrelsen af ​​en int. Vi kontrollere, om pointer er null, fordi det er, vi ønsker at sige gør ikke noget. Det er slemt. Så vi udskriver nogle fejl ud af hukommelse, oftest returnere 1, som du fyre er vant til. Og så har vi her, vi dereference vores pointer. Så det betyder, at vi kommer til at gemme noget på det sted, givet til os. Int * pointer, eller malloc returnerer adresse hvor det afsat dette hukommelse for dig. Så det er dybest set giver dig like-- hvis du tænk på en flok huse i et kvarter at du ønsker at sætte Deres møbler i, malloc er ligesom OK, får du at gå til huse tre. Og det giver dig adresse hus tre. Så dette lige nu, dette pointer gemmer en adresse, gemmer adressen på dit hus. * PTR midler, OK, jeg er på mit hus. Cool. Jeg har brug for at få nogle heltal. Så du beder om en person at give dig møbler nu. Så du får nogle int. Og det sætter det i din pointer hvor det peger på. Og så er det bare udskrifter ud, du indtastede steder. Og igen, referencen. Så det er ligesom du gik til dette adresse og du så, hvad var der. Cool? Og så selvfølgelig vi befri vores pointer. Glem ikke at befri dit pointer. Glem ikke at tjekke for null. Glem ikke at befri dit pointer. Du har to ting, du husker fra dette, eller at du skal huske. Ja. PUBLIKUM: [uhørligt] stuff sådan, char * s. Hvordan kommer vi aldrig befri dem? SPEAKER 1: Hm? PUBLIKUM: Er dem, der ligesom strygere? Du sagde strenge er ligesom char * s, right? Så hvorfor gør vi ikke slippe strenge? SPEAKER 1: Du behøver kun at gratis, hvis du mallocing. PUBLIKUM: Åh, hvis du mallocing. SPEAKER 1: Så malloc og gratis er to ting at du altid skal have sammen. f åben, f tæt, to ting du skal have sammen. I begge disse sager, så tjek for null. Ja. PUBLIKUM: Så gratis er bare tillader noget andet skal lagres der efter dette program har brugt den? SPEAKER 1: Det er bare at sige, OK, jeg er færdig med dette. Du behøver ikke at holde det rundt. Ellers svarer computeren Ligesom forsøge at holde den der. Og så skal du can't-- det kører i hukommelsesproblemer senere. Du ønsker altid at frigøre det, fordi det fortæller din computer, OK, jeg er gjort med denne plet af hukommelse. Du kan have det tilbage for mig at bruge senere. Cool? Ja. PUBLIKUM: Så vi brugte% d bare fordi en dobbelt der kommer tilbage, eller hvorfor is-- [uhørligt]. PUBLIKUM: Kan du bruge% i? SPEAKER 1: Du kan bruge% i. Sidste minut spørgsmål? Gå fremad. PUBLIKUM: Jeg har bare et hurtigt spørgsmål. Så PTR variable, that's-- lignende, med int * ptr = malloc, der er bare at sige, det er peger på et sted i memory-- SPEAKER 1: Ønsker du [uhørligt]? PUBLIKUM: --that er størrelse of-- nej, det er OK. Men det er bare at pege på et sted i hukommelse, der er ligesom fire bytes. SPEAKER 1: Right. Så allokere størrelse int siger, OK, jeg har tænkt mig at gå løbe, finde fire bytes hukommelse for dig. Når den konstaterer, at fire bytes af hukommelse, giver du sikkerhedskopiere adressen hvor den starter, og det er, hvad gemt i pointer, eller PTR. Godt. Du fyre ser mindre forvirret end de fleste folk, når jeg taler om pointer, så jeg føler mig ret godt lige nu. Ok. Som altid, bør du fyre har alle fået dine pset2 kvaliteter ved nu. Jeg ved, der har været nogle wonky ting, hvor der står, formel ikke gyldig eller noget. Hvis du får det, som alle dine karakterer er gyldige på min side. Så jeg kan sende dig skærmbilleder af dine karakterer. Bare lad mig vide så godt, hvis du er mangler nogle kvaliteter eller noget synes ikke at give mening. Kom til mig. Jeg har været super stolt af dig fyre allerede, så holder det op. Og har en god resten af ​​din uge. Jeg er sikker på jeg vil se nogle af jer ved kontortid.