>> [TEMA MUSIK]
>> TALARE 1: Hej, alla.
Välkommen tillbaka till avsnitt.
Härlig dag out-- varför, jag är säker, det finns bara fyra av er här
och inte vår vanliga förpackningen.
Jag har varit sjuk i helgen.
Så jag har inte Starburst för er.
Och jag kan börja hosta fruktansvärt hela denna.
Så bara bära med mig.
Jag ska verkligen försöka och ta sig igenom denna första,
Men innan jag har en hostattack.
Men bara att vara lätt på mig lite bit-- det är allt jag begär.
>> Så vår agenda för today-- bara en reminder-- din frågesport är nästa vecka.
Jag sa ju att det här förra veckan så det skulle inte fånga dig utanför vakt.
Så jag påminna dig igen.
Nästa veckas din frågesport.
Därför nästa veckas avsnitt kommer att vara mycket mer
of-- Jag ska försöka och arbeta i någon recension.
Så om ni kunde hjälpa mig genom att skicka mig
saker som du är bekväm med, att du är orolig,
ämnen som du skulle vilja för mig att täcka, det skulle vara bra.
Så jag kan försöka arbeta dem in i vårt avsnitt nästa vecka
eller skicka dig extra material eller prep att du inte kan få någon annanstans.
>> Yeah!
Fler människor kommer!
Jag tänkte, gjorde jag det dåligt förra vecka, att ingen vill komma tillbaka?
Jag är rädd.
Så de andra tre saker att vi kommer att gå över
är omdirigering, fil-I / O, och då pekare och dynamiskt minne.
Jag är säker på att du är alla super upphetsad om pointers-- allas favorit ämne,
så enkelt att förstå.
Jag är säker på att ni alla fick det, eller hur?
>> Så det viktigaste först, redirection-- Detta är i grunden bara ett sätt
att kontrollera hur du matar saker i ditt program,
hur du matar ut saker från ditt program.
De viktigaste sätten att ni har att interagera med det
är bara genom vanlig ut med din print screen här.
Men det finns sätt att pipe-- som vi ser här
är en av våra words-- slag av röret att information
eller att uppgifter i en fil från en fil.
Det är bara olika sätt att få saker i ditt program
och ut ur ditt program, i stället för bara skriva ut dem till den här skärmen
eller att skriva in saker från kommandoraden.
>> Så första är liten större än cirkumflex.
Så output-- det bara skriver ut resultatet till en fil istället för din skärm.
Så om du hade något som skrivs ut "Hej världen!" till skärmen,
om du lägger den i stället att output.text, att
skapar denna fil som heter output.text.
Och när du öppnar det, det ska säger "Hej världen!" där.
Detta kan vara super bra om du har massor av fel
faktiskt, som vi ser i detta en.
Om du gör två cirkumflex, det ska skriva ut felmeddelanden.
>> Så om du har problem med kompilering, den har en hel del fel
och du att fastna i att försöka för att bläddra igenom i din kommandorad
genom alla dem, kan du bara skriva ut dem till en fil,
öppna upp den filen så att du kan bläddra igenom dem lättare.
Jag använde faktiskt att en mycket när jag debugging
mina 181 psets för maskininlärning.
Så det kan vara super bra senare.
Det är också bra om du har ett program som kanske genererar ett bibliotek
eller generera lite set av strängar, och du
måste kunna se att det genererar dem ordentligt.
Detta är sättet att göra det.
>> Så om du skriver ut dem till en fil, som du lättare kan undersöka dem, eller hur?
Versus försöka rulla via kommandoraden.
Och så en sak att notera är att med bara större
än cirkumflex, om du skriver till en fil som redan exists--
så som om vi körde det första tid, sätter vi den till output.text,
och sedan hade vi ett andra program som tryckt detta som program två
och gjorde en mer än till output.text, det kommer att skriva över that-- så
skriva över det som var någonsin i filen till att börja med.
>> Så om du vill lägga till till en fil, som vi ser här,
du bara göra två större än tecken.
Och det kommer att lägga till den.
Det kommer inte att skriva över den.
Så om du behöver för att köra flera program och typ av hålla
reda på vad alla av dem är återvänder till dig i en fil,
det är ett sätt att göra det.
Om du inte bryr dig vad som finns i filen och det är tillåtet att skrivas över,
Du kan bara använda en enda större än.
Betyder det vettigt för alla?
>> PUBLIK: Liksom dot slash hej större än produktionen dot text, som två gånger,
det ska bara bara visa på utgång dot text en andra time--
>> TALARE 1: Rätt.
Så det skulle i princip bara helt skriva vad var det till att börja med.
Om denna fil här, output.text redan
finns, i princip vad du kallar det igen med en enda större
än du bara kan tänka på det så som det ersatte filen.
Som när du sparar ett Word dokument och du behöver spara som,
och du behåller samma namn, och det helt skriver över det--
Detta är samma typ av sak.
Någon som har några frågor om bara mata till en fil?
Grymt.
>> Så uppenbarligen, om du vända arrow riktning, kan det göra input.
Så när ni hade som Caesar eller Visioneer
och du var tvungen att ingångs något, du hade en Kommandoradsargumentet
som faktiskt ingång den.
Detta är ett annat sätt att göra det.
Så istället för att vänta för en kommandotolk,
som när du bad om din meddelande i Caesar eller Visioneer,
om du hade en textfil som hade ditt meddelande,
du bara kunde skriva in det i det.
>> Så om detta var som pricken snedstreck Caesar 3 mindre än pilen mata in text, som
är ditt budskap, att skulle springa fint.
När Caesar programmet faktiskt bad om input från användaren,
Det skulle redan ha det eftersom du har skrivit i den här filen.
Det är bara ett annat sätt.
Bara en omvänd av output-- bara ingång för dina data.
>> Och så den sista är röret.
Så den här är ganska coolt.
Eftersom det gör att du kan ta utsignalen från en
program och uttrycka det som ingång till ett annat program.
Jag vet inte om någon av er spelat med dechiffrera
att CS50 kan ha gett dig, men det skulle
gör att du kan ta lite prov fil, skriva in det i din kryptering,
och sedan därifrån skriver det i din dekryptering
att se till att det blev lika.
Så det är ungefär som trevägs slinga.
Gå för det.
>> PUBLIK: Om ett program har flera ingångar,
finns det något sätt att berätta det vilken ingång att använda textfilen eller utgången för?
>> TALARE 1: Det har flera ingångar.
Oavsett in din input-- när det är ber om ingång som första gången, det är
kommer att anta, tror jag, det är går till rör i hela filen.
Så om du har flera ingångar, du kommer att rörsystem i flera filer.
Så om du frågar efter meddelanden tre gånger i koden,
du kommer att vara att sätta i tre olika filer.
Och det blir galet.
Och du ska inte behöva oroa sig just nu.
Men det är tanken.
>> Så ja, är röret bara produktionen av ett Programmet använder inmatas i den andra.
Alla bra där?
Cool.
OK.
Du har förmodligen inte kommer att ha göra för mycket med den.
Men du bör förstå hur du kan använda denna.
Och det finns några fall som du kanske vill använda den.
>> Så fil I / O-- jag vet vad du är saying-- vi är vana vid att läsa från
och skriva till vår skärm där, vilket är standard i och standard ut.
Och det är vad ni har gör sedan början av klassen här.
Men du kan också läsa och skriva filer, vilket är fil I / O-- så filen input,
utgången är allt det står för.
Så detta innebär i princip att du kan lagra dina data nu.
>> När du bara skriva ut det till skärmen, det är i princip borta, eller hur?
Så fort du gör "Hej världen "och kör" Hello world "
den skriver "Hello world" på skärmen.
Men du kan inte riktigt göra något med det därifrån.
Om du lagrar i en text fil, sedan plötsligt
du har denna information som du är tillåtet att manipulera eller sätta den i en fil,
eller sätta den i ett program senare.
En av orsakerna varför vi gör detta är bara
som ett sätt att lagra data för senare användning.
>> Jag har ett par steg här bara gå igenom standard
I / O. I steg ett, du måste skapa en referens
till filen med alla caps FIL stjärn fil.
Så som skapar en pekare till en fil.
Så då du vill öppna den.
Och du säger, bokstavligen, bara filen motsvarar fopen.
Och detta kommer att returnera en pekaren till filen som du just öppnat.
Jag såg ett par av er killarna på kontorstid.
>> Men en av de saker är remember-- pekare
kan vara någon adress eller null, eller hur?
Om vi ​​någonsin har ett fall där något kan returnera null,
Vad har vi att göra innan vi någonsin använda den?
Vi måste kontrollera om Det är null eller inte, eller hur?
Eftersom en del av er kanske har haft frågan om vad objektet
höll på att återlämnas i utbrytning var null.
Du försökte utföra någon funktion på den.
Och din dator sajt kritiseras.
Rätt?
Jag slår vad om ett par av er kan ha haft den frågan.
>> Så med fopen, kommer fopen antingen returnera en pekare till filen,
eller om något går fel, det kommer att returnera null.
Så du alltid måste kontrollera att det inte har återvänt null
innan du försöker göra något annat.
Detta är som en vanlig paradigm att du kommer att behöva här.
Om det någonsin en chans att något kunde återvända null,
kontrollera att det inte innan du fortsätter.
Annars, du kommer att få fina site fel.
Och ingen tycker om att ta itu med dem.
>> Så som vi ser här, det första argumentet är bara sökvägen till filen.
Om det inte finns den filen, det kommer att skapa den filen.
Och det kommer bara att bli tomt.
Och sedan det andra argumentet är det läge som du vill ha.
Vill vi läsa från den här filen?
Vill du skriva av det?
Vill du lägga till?
Så egentligen vad jag just said-- om filen inte finns
och du försöker läsa från det, det kommer att kasta ett fel.
Om filen name-- vilja om file.text finns inte ännu
och du vill skriva till det, kommer det att skapa
en tom fil som heter file.text för dig.
Och om du vill lägga till, du bör göra samma sak.
Är det vettigt?
Om du försöker läsa från en fil som inte finns ännu,
det ska kasta ett fel.
Annars kommer det att skapa filen för du gör vad du vill det.
Cool.
Nu kan vi läsa från filen.
Och detta är bara typ att gå genom de olika funktionerna
att vi har för fil-I / O. Detta kommer vara nödvändigt i denna veckas pset,
om jag minns rätt.
Ja, det absolut kommer att bli nödvändigt i denna veckas pset.
Så fgetc returnerar nästa tecken.
fgets bara returnerar en textrad.
Den återgår allt upp till en ny linje, och det kommer att bryta.
Så fread läser en viss antal byte och placerar dem
i en matris, som är något du kan
vill göra med re-size-- kan vara användbart.
>> Hur många människor har läst den pset spec, förresten?
OK.
[OHÖRBAR]
>> TALARE 1: OK.
Okej.
Definitivt läsa that-- det är en rolig pset.
Du får återställa ett raderat minne card-- riktigt spännande när det fungerar.
Men definitivt, börja läsa det.
Kom och prata med mig om du har frågor om det.
>> OK, så som jag sade, fread läser ett visst antal bitgrupper.
Det är några godtyckligt antal att du kommer att ställa.
Och sedan fseek bara flyttar till en viss position.
Så kanske du inte bryr dig om de nästa 10 bytes.
Du vill bara att hoppa framåt.
Du bryr dig inte om dem.
Du vill läsa början vid byte 11.
fseek tillåter dig att göra det.
Så det gör att du kan vara selektiv om vad du läser.
Eftersom fgetc, fgets och fread läs- från en viss plats i filen.
>> Ett sätt att tänka på detta är om detta är vår fil, när du öppnar den,
du har denna position i filen som startar i början.
När du ringer fgetc, fgetf eller fread,
det kommer att börja från denna position markör.
Låt oss säga att du bara vill läsa denna bit av minnet här.
Du kan inte bara ringa.
Du måste söka hit och sedan läsa däri
eller läsa, får, eller getc, beroende på vad du vill.
Så söker bara gör att du kan hoppa över delar av minnet.
Och det är det enda sätt kan du hoppa över saker
utan att läsa dem i din buffert.
Betyder det vettigt för alla?
>> Uppenbarligen finns det en massa parallell här--
vår produktion, eller ingångs omdirigering, du har läst och skriva.
Så fputc bara skriver en tecknet i filen.
fputs skriver en linje.
Fprintf skriver ut en formaterad utdata.
Så om du har flikar, eller utrymme, eller whatnot.
Och sedan skriver fwrite några array med byte i en fil.
Så detta är på samma sätt fwrite och fread är analoga
opposites-- fgets, fputs, och sedan fputc och fgetc-- massor
av galna, snabba saker.
>> Bara typ av hålla detta handy-- du kommer att ha olika tider
där kanske du bara vill ett tecken i taget.
Kanske du vill ha en hel linje.
Med din ordlista pset-- som är i två psets,
Jag tror, ​​att vi ger dig en helhet dictionary i ett textformat
som har varje ord åtskilda av en linje.
Så om du ville läsa i ett ord i taget,
Vad kan du använda om du läser och de är alla åtskilda på nya linjer,
och du bara vill ha ett ord i taget?
>> Målgrupp: fgets
>> TALARE 1: Rätt.
Fgets-- eftersom som returnerar allt som är på en rad.
Och om varje ord är dess egen linje, kan vi använda fgets.
Cool.
Betyder det vettigt, alla?
Cool?
Ja, vi kommer att komma till det roliga med pekare
mycket snart, där man får göra lite matte.
Och det ska vara bra.
>> Senaste step-- stänger din fil.
Med så många saker här, en av våra paradigm
är om den kan återgå null, kontrollera null.
Om du öppnar något, du är bäst att stänga den.
OK, så du inte är klar förrän du är gjort om du inte har stängt det.
Ungefär som det är inte över tills feta damen sjunger.
Det är som att stänga filen.
Som det står här, bara upprepa, alltid
öppna filen innan du är läser eller skriver till den.
Och alltid stänga den om du har öppnat den.
Okej?
Cool.
>> Så här är ett exempel.
Så tiny-- jag vet inte om du killar kan se att mycket väl.
Om bara vi kunde öka ljusstyrkan på något sätt.
Låt mig faktiskt göra det om jag kan.
OK, ni kan inte riktigt se det alls, kan du?
OK, vi kommer att göra det, då.
[OHÖRBAR]
>> Jag antar att det är mycket bättre att se.
Kan någon se var min mus gick är frågan?
Ah, där det är-- vad kämpar!
>> OK.
Egentligen bör ni ha snäll av en idé om vad detta gör.
Det är inte perfekt.
Men jag vill hellre förklara det än att spendera mer tid på att försöka formatera det ordentligt.
I grund och botten, som ni ser här, vi börjar med filen öppen.
Och vi har några databasfilen som vi är
öppning som säger att det är våra elever.
Och vi kommer att skriva till den.
Så naturligtvis, returnera null.
Så vi måste kontrollera null.
Och sedan om det inte är null, vi går igenom.
Och som du ser, vi är looping igenom här.
Det finns studenter.
Studenter är hash definieras som tre.
Och det vi gör är att vi är tryckning till filen, eller hur?
Så vad ska vi skriva ut till vår fil?
>> PUBLIK: Poängen som finns i arrayen?
>> TALARE 1: Ja.
Poängen som finns i den array-- exakt.
Så vi öppnar detta databasfilen, vilket
Jag antar är något slags av betyg databas.
Och vi bara skriva ut betyg för varje elev till den filen.
Cool?
Bra.
Grymt.
OK.
Låt oss gå tillbaka att--
>> PUBLIK: Jag har en snabb fråga.
Är det printf inte i loopen?
Det är bara i om slingan?
TALARE 1: Nej, det är i loopen.
Jag kan inte se min mus väldigt bra här uppe.
Så jag kämpar för att format som korrekt.
Detta fäste ska vara borta.
Det borde vara här nere.
Detta är vad som finns i din for-loop.
Där.
Nu är det ganska.
Så det är så det ska be-- utom för det sista fäste som jag ogillade.
OK.
Betyder det vettigt för alla?
OK.
Vi kommer att gå vidare till nästa sak then--
som, faktiskt, du kommer att behöva se koden.
Så jag ska bara kopiera det över just nu.
OK.
Så jag ska visa er denna kod.
Och jag vill att du ska försöka siffra reda på vad det är tänkt att göra.
>> Så med tanke that-- ta en minut eller så.
Försöka lista ut vad som händer här.
>> Några idéer?
>> Vi vet att vi har minst två argument i kommandoraden, eller hur?
Jag antar varav en kommer att vara att [OHÖRBAR] i vårt program är
och sedan något annat.
För om [OHÖRBAR] är mindre än två, vi skrika på dem.
Rätt?
Och från användning, ser det ut som det kommer att bli någon form av fil.
Vi är alla överens om det?
Så nu, vad är slingan med?
Hur är det att gå igenom?
>> PUBLIK: Alla filer.
TALARE 1: Exakt.
Det kommer igenom alla filer som Prisjakt ingång där.
Så för varje fil, det är öppnar upp några sträng där.
Det öppnar upp den filen.
Rätt?
Och det är att läsa från den.
Naturligtvis kontrollera om det är null.
Och då är det att skriva ut.
Om det är null, det är bara att berätta att det inte är en fil som existerar.
Eftersom minns, med Läs vår fil måste finnas.
Rätt?
Med skriv och append, du kan komma undan med det.
Men med läsning, har vårt fil att existera.
>> Och sedan om det existerar, Vad gör vi här?
Låt oss bara börja här.
Vad är detta do-- denna första tecknet.
Vad gör den?
Han får ett tecken, eller hur?
Så vad är detta gör?
Det börjar bli det första tecknet.
Någon som vet EOF?
>> PUBLIK: Slut på filen?
>> SPEAKER 1: Slut på exakt file--.
Så det kommer att gå igenom hela filen, eller hur?
Och då det kommer att uppdateras med få varje efterföljande tecken.
Rätt?
Och vad gör den?
PUBLIK: Att sätta det in--
>> TALARE 1: putchar utskrifter till din skärmsläckare.
[OHÖRBAR] tecknet.
Och sedan när det [OHÖRBAR] Detta kommer att avsluta ärendet.
>> PUBLIK: Har du inte behöver en [? annat? ?]
>> TALARE 1: Inte nödvändigtvis.
Jag menar, det är typ av underförstått i detta.
Eftersom detta tillbaka, men så länge detta inte fånga denna, du är bra.
Jag menar det är nog bra träna på att göra en annan.
Men ett annat är inte alltid nödvändigt särskilt
om du har något som en återgång, vilket
betyder att i detta fall, om den fångar det, är ditt program kommer att sluta
och det kommer aldrig komma till denna.
Det är mer för det fall du är inte nödvändigtvis returnera något.
För om detta inte var vänder något,
Det skulle innebära att om detta vore sant, resten av detta skulle fortfarande köra.
Och i så fall, du skulle ha en falsk.
Om det är att återvända, och ditt programmets slut,
ett annat är inte nödvändigt alla tiden, beroende på sammanhanget.
Jacob, har du en fråga?
PUBLIK: Ja.
Det gör fgetc få nästa tecken?
Hur ökar karaktär?
TALARE 1: Ja.
Så fgetc blir nästa tecken.
Du kan tänka på det som C ++ i en mening.
>> PUBLIK: Så vad var EOF?
>> TALARE 1: EOF är slutet av filen.
Det är bara en markör som gör att du vet att du är i slutet av din fil.
Så detta kommer att skriva ut med din vanliga ut.
Och då det kommer att stänga filen när det är gjort.
Och sedan ska vi gå till nästa fil, eller hur?
Så totalt, vad gör det här programmet göra?
>> [OHÖRBAR]
>> TALARE 1: Ja.
Den skriver bara ut allt där.
Så om ni någonsin har använt CAT och sedan namnet på någon file--
Jag vet inte om någon av er har någonsin gjort det på din terminal.
Men om du någonsin använder kommando CAT-- C-A-T--
och sedan vad fil du har there-- det
skriver ut det till din terminal, vilket kan vara super praktiskt för vissa saker.
Jag använder det mycket.
Betyder det vettigt för alla?
Cool?
>> OK så din uppgift now-- antingen genom själv eller med människor runt dig--
är att bara skriva ett enkelt program som kommer att bara skriva "Hej världen!"
ut till en fil.
>> [OHÖRBAR]
>> TALARE 1: Jag var som gjorde Jag gör som dåligt förra veckan?
Jag trodde inte att det var så illa.
Jag är glad att du är här.
Det gör mig verkligen glad.
Jag är en tjej på enkla nöjen.
Jag gillar bara när min avdelning deltar.
Så jag bara få detta började för ni så att vi kan koda ihop.
Jag gillar inte att sätta någon på plats om du inte vill vara.
>> PUBLIK: För frågesport, göra vi måste skriva ett program?
>> TALARE 1: Du kan bli ombedd att skriva enkla program för hand.
Japp.
>> PUBLIK: Testet är nästa vecka, eller hur?
>> SPEAKER 1: Testet är nästa onsdag.
Det innebär att det finns en härlig [? CSE?] gradering parti efteråt, vilket
innebär att du får dina poäng tillbaka som night-- vid vilken tidpunkt?
Vem vet?
Men det kommer att bli den natten.
>> Okej.
Hur vill vi att starta denna?
Jag ska ge er en hint-- börjar med detta.
>> PUBLIK: Du måste öppna en fil.
>> TALARE 1: Ja.
Så vad du vill kalla det här?
Vill du bara vill kalla det "file"?
Låt oss göra det enkelt.
Så fopen-- vad är vår utgångstest kommer att bli?
Kalla det "Hej."
Och vad är vårt läge?
Vad gör vi till den här filen?
>> PUBLIK: Läs.
Skriva.
TALARE 1: Vi skriver till den.
Lovely.
OK, så vi har den här filen nu.
Vad behöver vi göra?
PUBLIK: Kontrollera om det är null.
TALARE 1: Kontrollera om det är null-- exakt.
Det är vad jag vill höra.
Det borde vara automatisk, särskilt ganska mycket från denna punkt på.
Om du börjar segfaulting, du förmodligen inte kontrollera null någonstans.
Nio gånger av tio, det är kommer att vara din fel.
Så om du bara kunde få i vana, alltid kontrollera om det är null,
ditt liv kommer att bli trevlig och easy-- eller lättare.
>> Så kolla för att se om det är null.
Så om det inte är null, vilket är vad bang lika
means-- inte null-- det är giltigt.
Vad vill vi göra?
Vi vill bara skriva ut till den filen, eller hur?
Så vad ska vi använda?
>> PUBLIK: fprintf
>> SPEAKER 1: Fprintf-- lovely.
Och fprintf tar två arguments-- där det kommer och vad vi vill skriva ut.
Så vad är den första?
Var är det?
>> PUBLIK: Fil.
>> TALARE 1: Det kommer att lämna.
Och vad vill vi trycka?
"Hej världen!"
Okej.
Vi har en sista thing-- en annan stor paradigm här.
PUBLIK: Stäng.
SPEAKER 1: Stäng.
Där du går.
>> PUBLIK: Är detta händer om filen är null?
TALARE 1: Nej, det är om det inte är null.
Publik: O, om det är inte-- OK.
För fopen och därefter två argument som går inne,
vad innebär det första argumentet menar igen?
>> SPEAKER 1: Argumentet är precis som namnet på den fil
som du vill åka till.
Så efter detta går, skulle du har någon fil som heter "Hej"
som hade "Hej världen" i den.
Det är allt.
Bara namnet.
>> PUBLIK: Och eftersom det är att skriva, det fil behöver inte redan finns.
Är det vad du säger?
>> TALARE 1: Rätt.
Exakt.
Om "Hello" som en fil finns inte ännu, det är
kommer att skapa en fil som heter Hej "och skriva till det för dig.
>> PUBLIK: När du säger programmet skrev till filen,
varför skriver du "file" i stället för namnet på filen och fprintf--
>> TALARE 1: Eftersom i detta fall, vi har att stora FILE-- alla i caps-- stjärna,
fil.
Så det är en pekare till filen att du pratar om.
Detta är det sätt som vi bara hänvisa till den.
Så i detta fall, du kan tänka file-- aha,
Vi kan använda this-- filen här hänför sig till öppnandet av "Hej"
och låta den skriver.
>> PUBLIK: Kan vi sätta ett "Hej" istället [? på bara?] f-fil?
TALARE 1: Nej, eftersom "Hej" måste vara öppen och skrivbar.
Arkiv här är som en designator som säger OK, vi
har denna file-- hello-- att vi tittar på.
Det har öppnats.
Och vi kommer att skriva till den.
Om du bara använder "Hej", som är inkapslad i den.
Så det kommer att flippa ut.
Jag menar, du kunde ha döpt den.
Du kunde ha gjort fil, stjärna, "Hej", är lika stor som.
Men hela poängen är att du behöver en fil stjärna pekare för
för att kunna använda dessa funktioner.
PUBLIK: Kan du göra fil, stjärna, fil, "Hello"
eller har du att sätta fil stjärna, fil genom det?
SPEAKER 1: Du kunde gör fil, stjärna, "Hej."
Du kan ändra detta till vilket namn du vill.
Det är helt godtyckligt vad det heter.
Du kan kalla den vad som helst.
Namnge den flygande spaghetti, om du ville.
>> PUBLIK: Vad är "w" inom citationstecken för?
>> SPEAKER 1: "w" är bara läget.
Så vi skriver till denna fil.
Alla bra?
Klar?
Ja.
>> PUBLIK: Så när det skriver detta fil, var har då finner vi den filen?
>> TALARE 1: Det ska vara i samma katalog som du är just nu i.
Om du är i pset tre och du kör den här, i din pset
tre mappen kommer att vara denna fil som heter "Hello."
Cool?
Alla bra?
Jag tycker du är allt få det, vilket är bra.
OK.
Så tillbaka till min slide show-- Jag älskar när saker och ting fungerar.
OK, pointers-- Är ni glada?
Pointers är stora.
De tar en liten bit att svepa huvudet runt.
Detta är mitt andra år undervisnings pekare.
Och jag tror att jag äntligen fick det.
Så om du kämpar, det är OK.
Som jag sade tidigare, rita bilder hjälper mycket med saker i CS,
lika mycket som jag tror att människor tenderar att tänka åh, vi är vid en dator.
Vi bör bara kod.
No-- rita bilder kommer verkligen att hjälpa dig.
Och jag uppmuntrar dig verkligen till utnyttja din kindergartner sida
och ta fram kritor eller markörer och oavgjort.
Eftersom det kommer att hjälpa dig.
Och om du ser mig på kontorstid, jag kommer att bära omkring på högar av papper
med pennor rita ut saker.
>> Så särskilt med pointers-- rita bilder.
Och jag är säker på att vi faktiskt kommer att att dra några bilder här också.
>> Så ni alla fick se Binky, denna coola claymation sak.
Och vi tycker det är väldigt roligt när han exploderar i ett gäng bitar.
Det är lite komisk lättnad för klassen.
C [OHÖRBAR] denna stora förmåga att kunna kontrollera minne.
Och det är en av de saker som verkligen gör det så kraftfullt språk.
Men med stor makt kommer stort ansvar.
Och galna saker kan hända Om du inte är försiktig.
Så när du använder pekare, du vill göra
säker på att du verkligen förstår exakt vad du gör.
Förhoppningsvis nästa lite tid kommer att hjälpa dig verkligen förstå
pekare, hur man använder dem, och hur man manipulerar dem.
>> Så memory-- Jag är säker på att vi har sett detta diagram innan.
Så det här är bara en enkel skiss över hur det kan lagras minnet.
Så du i princip har dessa stora matriser av ett byte block
är vad vi har här-- svag inkrement efter ett varje gång.
Detta är i hex [OHÖRBAR] så åttabitarsblock.
Och varje block är associerad med några hexadecimal adress.
Så om du någonsin se 0x, det är bara notating
att det är en hexadecimal adress.
Du kan anta detta innebär viss adress i minnet.
Vi pratar om minnesadresser när du ser hexadecimal.
>> Vi har ints är variabler, flottörer är variabler som lagrar.
Så ints butiks ints.
Flyter butiken flyter.
Så vi har även referenser att lagra minnesadresser.
Det är en slags kartläggning.
Pointers är uteslutande för minnesadresser.
Så det är som din typ där.
Apparaten är 32-bit, vilket innebär att ditt minne adress är fyra byte.
Så någon pekare som du har kommer också att vara fyra byte.
Annars om det är fyra byte, minnet är fyra byte.
Pekare ringsminnet.
Därför är de fyra byte.
Cool-- vill bara förstärka det.
>> Du bör få denna serie nu.
Jag vet inte hur många av er är xkcd fans, men jag älskar xkcd.
Det är bra.
>> Okej.
Så skapar pointers-- som sagt, det är ganska mycket precis som allt annat.
Du har en typ.
Du har ett namn.
Rätt?
Det är vad vi har där. [? Hex?] Stjärna betyder att det är en pekare,
och sedan vad du vill kalla det.
Så den typ representerar vad du kan lagra.
Okej?
På samma sätt som om vi gör ints, Vi vet att vi lagrar en int där.
Med en pekare, det rymmer en minnesadress.
Men vad det betyder är that-- här är där en ritning kommer att komma till hands.
Så i detta fall har vi några value-- låt oss säga fyra.
Fyra är på adress ett.
OK?
>> Denna första en här betyder att det är en pekare 2x.
Rätt?
Det är en del pekare x.
x kan vara något, vad som helst.
Oavsett x är-- säga x är fyra.
Det kommer att lagra minnesadress här.
Så int, stjärna, är x-- här någon annan slits i memory--
som vet vad detta är.
Men det kommer att lagra en adress här.
Så detta skulle vara like-- i detta fall, Oavsett,
lagras vid 0x1-- oavsett lagras på den adress som vår pekare håller,
måste matcha upp med vad vi har utsetts.
Så vid 0x1, i det här fallet, är detta x.
Detta kan alltid bara vara en int medan vi använder detta.
>> Likaså om vi har annan 1y, oavsett
adress sparas med en y har att vara en char-- samma sak med z.
På samma sätt, när du försöka göra intx lika 0.4,
det kommer att skrika på dig och vara som ingen, du sa att du ville ha en int.
Detta är tänkt att vara en int.
Sluta försöka göra det till en flottör.
>> Så låt det vara vad de vill vara.
Låt saker vara sig själva.
Så stora grej är bara oavsett vilken typ av pekare
det är, det är den enda man kan lagra där.
OK?
Med övning, som med förra veckan, allt
verkar verkligen slags abstrakt.
Vi kommer att göra lite övning.
Det borde vara bättre.
>> Så referera och dereferencing-- det är verkligen viktigt att få dessa raka.
Jag har fortfarande att uppdatera då och då.
Och jag gillar vänta, vilken vill jag ha?
Så et-tecknet faktiskt kommer att ge Du referens- eller adress.
Så det returnerar adressen i minne varav rörlig lagras.
Så det kommer att faktiskt komma tillbaka till dig en hexadecimal, medan Återgång det
faktiskt kommer att ge dig de data som lagras där.
OK?
Så vi kommer att titta på ett exempel riktigt snabbt, eller egentligen upp bredvid.
>> OK.
Så vi måste tänka riktigt noga på detta.
Så här har vi något heltal x.
Jag ska försöka dra denna ut till det bästa av min förmåga.
Så vi kommer att ha denna slot x.
Och det är att lagra fem.
Dess adress är 0x4.
Cool?
Alla bra.
>> Så nu har vi denna pekare.
Det var här borta.
Och et-tecknet ger oss adressen till något.
Så i det här fallet, det är adressen till x.
Vad är adressen för x?
04-- och detta pekaren är på 0x08.
Cool?
Så du kan tänka på detta pekare, 04, bara pekar hit.
Och de kallas pekare för som vi får mer in i detta,
du kommer att se att peka på saker.
Och ett kvarter som pekar på en annan blocket kommer att göra mycket mer känsla.
Så här är två.
Och sedan har vi några exemplaret, som är what-- 0x0c.
Och det kommer att dereference vår pekare.
>> Så vad det säger är OK, här är vår pekare.
Värdet lagrar är 0x04, och vad det säger är att gå till den här adressen
och berätta vad som finns i den.
Så det är ett effektivt sätt vad denna pil gör.
Du kan tänka på detta som din stjärna.
Så OK, när vi gör stjärnan, betyder det att följa.
Gå till denna adress.
Och det är i princip bara efter denna pilen till denna minnes bit.
Och ge oss vad som finns i den, vilket är 5.
Det är därför som vårt exemplar är lika med 5.
Är det vettigt?
Finns det någon som behöver mig för att gå igenom det igen, eller långsammare?
Du vill att jag ska gå igenom det en gång till?
OK.
Vi kommer att rita om den igen.
När vi börjar, vi är alla överens om att vi har viss del av minnet som är en variabel
x som vi satt lika med 5.
Vi kontrollerar inte om det är i minnet.
Så denna plats är bara godtyckligt tilldelad.
Bra där?
OK.
Sedan initierar vi en pekare till en int.
Det är därför det är tillåtet att peka på x eftersom vi har en int här.
Vi har en annan bit av minnet eftersom denna pekare
är en variabel precis som allt annat.
Det är godtyckligt tilldelad lite utrymme i minnet.
Och vad det lagrar är adressen för x.
Ampersand innebär adress x.
Så vad är adressen till x?
>> PUBLIK: Det är zero--
TALARE 1: 0x04.
Så then-- sista.
Vi har en del copy-- igen bara en annan variabel.
Så låt oss ge någon godtycklig plats.
Och vi avreferera vår pekare.
Stjärnan betyder gå till adress som lagras i min pekare.
Säg mig vad som finns där.
Så adressen lagrad I vår pekaren är 0x04.
Så vi går till den adressen.
Det pekar på den adressen.
Vad finns inuti detta minnesblock?
Det är en fem.
Så det är vad vi tilldelar vårt exemplar.
Alla bra?
Cool.
Igen-- bilder.
>> Så spåra värden här-- Jag är kommer att låta er tänka på detta.
Vi kan dra en annan bild.
Men jag vill att du ska försöka anledning genom detta på egen hand under en minut.
>> Eftersom de inte gav oss ett exempel adress,
Jag kommer bara att göra-tecken x-- vilket bör hjälpa till att driva den hem.
Ampersand innebär adress.
>> Så i den första, alla gå med den första raden.
Några x-apparatens five-- vissa slumpmässig slits i minnet.
Int stjärniga pekaren är lika till adressen för x, eller hur?
Int stjärna pekare skapar detta block, kallar det pekaren,
och tilldelar den till adress x.
Jag är fruktansvärt på et-tecken.
>> Nu vad vi gör är att vi säger OK, dereference vår pekare.
Så vi går OK, vad som finns i vår pekare?
Det är et-tecken x.
Gå till et-x och omfördela det.
>> Så nu är et-x kommer att bli 35.
Så i princip, när du är Namnåtergång, går du på OK.
Du kommer att kunna dra bilder som denna.
Du kommer att kunna dra dina pilar över var det är.
Så gå till denna plats i minnet och antingen ge mig detta värde tillbaka eller ändra det.
I det här fallet, eftersom vi är på detta värde, vi koppla den till vara 35.
Medan det i det sista en, om du märker, vi
var att tilldela det var här till något annat.
>> Så de har denna enorma bord.
Det är inte så illa.
Ni jobbar på det.
Jag kommer att dra ut på tavlan.
Vi kommer att fylla ut det tillsammans, okej?
Så ta några papper, grab en partner, börja arbeta.
Jag kommer att få en större bit av krita.
Eftersom det kommer att bli en hel del.
OK.
PROFESSOR: OK.
Låt oss börja med den första raden.
Vi ska börja där, då ni kan kanske gå igenom lite mer.
OK.
en lika b gånger c så vad är en?
Det är inte en kuggfråga, jag lovar.
>> STUDENT: 4 gånger 5.
>> PROFESSOR: 4 gånger 5.
20.
Så vad är b?
STUDENTEN 4.
>> Professor: och C?
STUDENTEN 5.
PROFESSOR: 5.
Och då detta bara kommer att vara ampersand en, et-tecken b,
ampersand c, eller hur?
Inte illa.
Det är enkelt nog.
OK.
Så nästa.
A är lika med en gånger c, i det fall någon var obekant med det.
Är alla känner med tiden lika?
OK, means-- allt detta är förkortning för en lika med en gånger c.
Du kan också göra det med division, med tillsats, med subtraktion.
Du kan göra en jämlikar, eller ett plus lika c innebär en lika ett plus c, ett minus lika
c skulle vara en lika med ett minus c.
Det är bara syntaktisk socker.
>> Så i det här fallet är en som är lika med a gånger c skulle ge oss vad?
Återigen, inte en kuggfråga.
>> STUDENTEN 100.
>> Professor: 100.
Gör allt annat förändras?
Nej.
Kanske kommer jag äntligen få bättre på mina et-tecken.
>> STUDENT: OK, sorry, hur fick du 100?
PROFESSOR: OK.
Så ett är lika med ett gånger c, så en gånger c.
STUDENT: Åh, du använder en för previous--
PROFESSOR: Ja.
Så här är våra senaste värderingar.
Det är vad du bör vara att använda när vi går ner, OK.
Så, b det enda förändras, eller hur?
Så låt oss fylla i allt annat.
B. Vad b kommer att bli?
Att vara eller inte vara.
Så vad är detta gör?
Vad är stjärnan pa med?
>> STUDENT: Kod till platsen för pa.
>> STUDENT: Nej, inte riktigt.
Så det här är en d referens.
>> STUDENTEN Så b är handed värde pa.
>> PROFESSOR: Ja, så pa är adressen till en, eller hur?
Så det säger gå till där a är lagras och ge den det värdet.
Så vad är b?
STUDENTEN 100.
Professor: 100.
Perfect.
OK, så pc är vad som förändras.
Allt annat förblir densamma.
Vad pc kommer att bli?
Enkel uppdrag.
Pc är lika med pa, och vad är pa?
>> STUDENT: Ampersand a.
PROFESSOR: Perfect.
Nu vi får intressant.
OK, låt oss bryta denna nedåt.
Först, vad är b gånger c, eftersom det är den enkla delen av det här, eller hur?
B gånger c är--
>> STUDENTEN 500.
>> PROFESSOR: Ja, så vad detta gör,
Om det är stjärn pb, vad förändras?
>> STUDENT: Vad är i the--
PROFESSOR: Vad är ib?
STUDENTEN Vad finns i rymden att pb pekar på.
PROFESSOR: Och pb pekar att--
STUDENTEN B.
Professor: B. Så den enda ting förändras är b, höger.
Så b gånger c, 500.
Så det är vad förändras nu.
Cool.
Lovely.
Ni gör bra.
Okej, att bryta denna nedåt.
C förändras, eller hur?
Så vi kan fylla i allt annat.
Låt oss se.
OK.
Vi vet att c kommer att bli det produkten av två tal, eller hur?
Vilka två siffror, men?
>> STUDENT: A och c?
>> PROFESSOR: Så en är rätt för den första.
Så vi dagarna refererar p av en, eller hur?
P av en pekar på en, så vi vet att Detta kommer att bli 100 gånger vad?
Gånger vad gör pc peka på?
Pekar på en.
Så 100 gånger 100 är 10.000.
Är det vettigt?
Cool.
Upploppet, grabbar, sista raden.
OK.
Vad har ändrats här?
>> STUDENTEN A.
PROFESSOR: A. Perfekt, så allt annat kan förbli densamma.
OK.
Och vad är en?
Så det är en gånger vad?
Detta är stjärnan pb.
Så stjärna pb betyder här är pb, pb punkter till b.
>> STUDENTEN 500.
>> Professor: 500.
Så vi har 500 gånger 100.
Det är 50.000.
Puh!
Titta på det.
>> STUDENT: Varför har vi i & c för last--
PROFESSOR: Förlåt.
STUDENT: Åh, OK.
PROFESSOR: Min dåliga.
Massor av skrivande.
Alla bra?
Inte så illa, eller hur?
Tar bara lite tag att arbeta sig igenom.
Om man bryter ner det, förstå vad varje del
hänvisar att-- som med allt det,
yes-- bryta ner det till den lilla problem och sedan rekombinerar,
och du kan göra några fantastiska saker.
Det finns svaren, men vi gjorde det.
Pointer aritmetik.
Ah.
Mina händer är alla kalkhaltig.
Så att lägga till eller dra ifrån int justerar pekaren
av storleken på den typ av pekare.
Kom ihåg hur alla typer har en annan storlek?
Så som en dubbel eller en lång lång säga åtta och int är fyra men röding är en.
>> Så vad du vill göra är-- en sak att komma ihåg
är bara det att hur mycket din pekarvärde faktiskt förändras
kommer att bero på den typ av pekare är det.
Alla bra med detta?
Kan jag radera det?
Vi är bra?
Grymt.
>> Så om vi har några pekare that-- detta kommer att be-- jag är
kommer att göra det till en int pekare.
Den lagrar detta.
Om du skulle säga pekare plus ett, vad det kommer att göra
är att det kommer att uppdatera det av storleken på en int
eftersom det är det typ av pekare är det.
>> Med C, är allt mycket strikt och reglerad.
Den int pekare kommer att uppdatera med hur mycket utrymme en int skulle ta.
En int är fyra byte.
>> Så vad skulle det bli?
Du bara lägger till fyra på detta.
Nu pekaren skulle be-- OK.
>> Så om det var en röding och vi gjorde pekare plus en, vad skulle det vara nu?
Om det started-- låtsas vi started-- just nu är det 0x08.
Låt oss nu säga att detta var en char pekare, och vi lagt till en.
Vad skulle det ändra till?
Hur många byte är en röding?
>> PUBLIK: One.
>> TALARE 1: One.
PUBLIK: Så 0x09.
TALARE 1: Så det skulle vara nio.
Så bara något att minnas.
Just när du lägger till en, det är inte lägga till en om inte det är en röding.
Det är att lägga hur många bytes den typ som den är,
vilket är anledningen till att vi har denna ekvation här uppe.
Så det är int gånger storleken av den typ av pekare.
>> Så vi har exemplet här.
y tilldelades till det värdet, 0x4, när vi gjorde y plus lika med ett.
Vad betyder det, vad är i x, ändras inte.
Vad innebär förändring är vad som finns i y.
Adressen lagras i y uppdateras av fyra eftersom det finns fyra byte i en int
och det är en int pekare.
>> Okej.
Så nu har vi en annan övning.
Så frågan är vad som kommer att skrivas ut.
Några idéer?
>> AUDIENCE: Antalet tecken i glad katt?
TALARE 1: Exakt.
Så gillar med din sträng.
Kan alla få det?
Vill vi gå igenom det?
>> Ja, OK.
Så vad vi har här-- jag såhär så mycket mer.
Jag behöver inte [OHÖRBAR] löjligt.
>> Så vi har vår sträng här, glad katt.
Lovely.
Vi har några räknare som vi hålla reda på.
Så vi har några char * pekare som bara sätts lika med str.
Vad detta gör är att det är tilldela några pekare
till början av din sträng.
För jag är säker på, eftersom det nämndes i föreläsning,
vi har gett er här datatyp som kallas sträng.
>> Men egentligen strängar är bara en array of-- liknande char *.
Det är en pekare till en massa tecken som är angränsande i minnet.
Så det här bara ställer den lika med varje sträng är
identifieras med hjälp av där sin första tecknet är.
Så det här är bara att sätta någon gång lika med början av strängen.
Alla bra där?
Cool.
>> Så detta är Återgång vår pekare.
Så det är faktiskt kommer att ge oss lite värde här,
I vår sträng som vi pratar om.
Och vi säger så länge det är inte null terminator.
Så fortsätt tills du får till slutet av strängen.
Uppdatera din pekare med ett.
Så r, kommer det faktiskt att uppdatera med en varje gång eftersom det är en röding,
char *.
>> Så det kommer att gå igenom.
Det kommer att uppdateras.
Så den första gången detta körs, det kommer att vara här på h.
Det kommer att uppdateras.
>> Det blir en a.
Det blir en p, y, och så vidare och så vidare.
Vi kommer att uppdatera räknaren.
När den når slutet, det bara skriver hur långt det har blivit.
Ja.
>> PUBLIK: Så det räknas utrymmet som en, eller hur?
OK.
>> TALARE 1: Tänk så.
Är det en question--
>> PUBLIK: [OHÖRBAR].
>> TALARE 1: Inga bekymmer.
Detta gör jag det.
Okej, så en sak jag förstå är att med en array,
Du kan också behandla det som en pekaren eftersom arrayer är bara
kontinuerliga fläckar av minnet.
>> Så du kan behandla det på samma sätt.
Du kan manipulera dem med pekare, också.
Så istället för att göra, i detta fall den analoga sak
vore array 0 är lika med 1.
>> Men på samma sätt som en sträng bestäms
vid början av där sin första tecknet är,
en array bestäms genom där dess första elementet är.
För vi vet, vi är garanterad, dessa som
kommer att vara kontinuerlig minnesblock.
Det är vad tillåter oss att göra detta.
Vi vet att de är kontinuerlig minnesblock.
>> Så i detta fall, genom att Återgång bara array, som berättar,
OK, gå till början av matrisen, som är här.
Så du kan ställa in den lika med ett.
Och i detta fall, oavsett din array typ är, när du uppdaterar den med en,
det är precis som att uppdatera det till nästa index.
Du kan göra det eftersom du vet vad som finns i din samling.
Så det vet hur mycket uppdatera din pekare med,
vilken adress för att uppdatera den till så att du är på nästa lucka.
>> Så det här är bara ett annat sätt att skriva array 0 är lika med 1,
array 1 är lika med 2, array fästet 2 är lika med 3.
Det är bara ett annat sätt att tänka på det.
Eftersom de är kontinuerliga block i minnet,
du kan hänvisa till dem heller genom arrayen notation--
som jag personligen hitta easier-- men kanske
du behöver för att manipulera det strikt av minnesadresser.
Och detta är det sätt som du skulle göra det.
Typ av mer av som en cool sak du kan göra
kontra kanske inte något du är faktiskt går att genomföra.
>> Jag använder det i 61.
Ni behöver antagligen inte att oroa sig för mycket.
Men om du är intresserad, ta 61 nästa år.
Vi är i upploppet killarna.
Jag vet, det är länge.
Dynamiskt minne Allocation-- så vi vet att en
av saker när vi pratade under vår första avsnittet tillsammans,
vi tittade på en swap funktion där det var
utanför vår huvuduppgift.
Och vi passerar på dessa värden som effektivt var kopior.
>> Och när swap klar exekvera, bara lämnade det en stack.
Kom ihåg att vi har en stack ram för swap.
Det lämnar och dem värden lämnar med det.
Och de var borta.
Vi kunde inte göra något med dem och vi var ledsna
eftersom vi inte kan byta våra värderingar.
>> Men med C, som jag nämnde, du har en hel del makt över minnet.
Så vad du kan göra är att du kan fördela saker på högen här
som kommer att stanna där tills du berätta något annat.
>> De är som snälla barn.
De stannar där.
De vill inte lämna.
De kommer att stanna där tills du är liknande, OK, du kan gå bort.
>> Medan saker på stacken, who-- de är som busiga barn.
De kommer bara springa iväg när du vill att vara där och sedan är de borta.
Du kan inte få tillbaka dem.
>> Så högen är-- vi ska prata om malloc och gratis, vilket
Jag är säker på att ni hört talas om i föreläsning.
Och det är i grunden ett sätt att ha mycket beständiga data.
Så du kan hålla data runt så länge du vill.
Mhm.
>> PUBLIK: Kan du definiera heap och stack?
Är de tycker om ställen att sätta saker och ting?
>> TALARE 1: Så de är princip bara-- de är
hur vi hänvisar bara till minnet.
Så hög är bara platser där minne allokeras dynamiskt,
medan stapeln hänvisar mer att stapla ramar
som är mer centrala för funktioner som faktiskt körs.
Du behöver verkligen inte kontroll.
>> Den stora skillnaden, har du kontroll över högen om du vill.
Du har mindre kontroll över stapeln.
Stapeln beror på funktioner som är igång,
och i vilken ordning de är kör, och hur saker och ting tillbaka.
Medan med högen, som vi får se, man kan säga,
OK, jag vill att detta värde är runt tills jag säger något annat.
Du får inte bli av med den.
Du är inte tillåtet att åsidosätta den.
Du kommer att hålla det runt så länge som jag säger.
Du får vara chef i högen, medan stack-- kanske om du
som finagle ditt sätt Du kan vara chef.
Men inte riktigt.
Och det är egentligen bara minnet.
Det är bara olika sätt att hänvisa till minnet.
>> Cool.
Så med det, hur man kontrollera ditt minne.
Det är med malloc, vilket du kommer att få använda.
Så det är bara kort för minnesallokering.
Det är allt det är.
Det finns en massa andra coola funktioner som har alloc i slutet,
och de står för olika saker.
>> Så när du behöver lagring som behöver att överleva din nuvarande funktion så
att när din nuvarande Funktionen springer iväg,
du fortfarande har data som du fick av det, vill du använda malloc.
Det kommer initiera den på högen.
Och som jag sa och hålla sade du ska hålla det där
tills du berättar det något annat, som är det viktiga här.
>> Så en sak att lägga märke till, och det är oftast riktigt viktigt,
är att detta sizeof är super användbart att använda
eftersom beroende på vilken typ av maskin du kör,
den kan ha varierande mängder minne som krävs.
Så du alltid vill använda storlek så att du inte är maskinberoende,
så att din kod kommer köras på alla datorer.
>> Och det är bara en del för att skriva bra kod.
Om det fungerar på en maskin, men inte någon av de andra,
Hur användbar var ditt program?
Så du alltid vill se till och använda sizeof.
>> PUBLIK: Så är det som storlek av 10 inches [ohörbart]?
>> TALARE 1: Detta är storleken på 10 ints.
ja.
Så storleken av ints återgår Hur mycket ska man int ta.
Eller storleken på röding, hur mycket kostar en röding ta.
Och sedan hur många block av detta vill du ha?
>> Så i detta fall, vi vill ha något att vi kan lagra 10 ints till.
Och det kommer att fungera oavsett av maskin, vilket är coolt.
Så hur många bytes kommer som faktiskt ge dig?
Snabb matematik.
>> PUBLIK: 40.
TALARE 1: 40.
Exakt.
Så en annan stor sak.
Pointer eller malloc kan returnera null.
>> Så återigen, alltid kontrollera att se om det återvände null
innan du försöker göra något med det.
Om du försöker och dereference denna pekare nu,
det bara kommer att segfault eftersom du gick och försökte
röra null när du inte ska ha.
Så alltid kontrollera null.
Återigen, kan allt du gör.
>> Det kan returnera null.
Det kommer att returnera null om du är antingen slut på utrymme, eller av någon anledning
den sprang in i en del av minnet bugg.
Det ibland bara returnerar null.
Så är det bara att kontrollera det.
Det är allt det här glid säger.
Och vad vi har här är en uppmaning att befria.
Så på samma sätt som om du öppna en fil som du måste stänga en fil,
om du malloc minne, du måste du frigöra det minne.
Och ni kommer att få att göra riktigt coola grejer.
>> Och det finns ett program som du kan köra till se om du någonsin läcker minne.
Men du vill inte läcka minne.
Det är verkligen illa.
Bara röra upp saker.
>> Det är illa att göra precis som programmering klokt för design effektivitet.
Men det är också bara typ för dåligt för din dator.
Så bara gratis saker när du malloc dem.
>> Ni ser symmetrier här.
Super enkel.
Bara gratis och sedan oavsett pekaren,
oavsett namn pekaren är, och det
tar hand om att befria det åt dig.
Cool.
>> Sedan har vi det här.
Så vi ska bara gå igenom det här programmet.
Och då ni är klar.
>> Så [OHÖRBAR] bara main.
Så vi har en del int * pekare.
Så vi har en pekare det kommer att hålla ints.
Och hur många ints kommer det att hålla?
Bara en.
Storlek på en int.
>> Vi kontrollerar om Pekaren är null eftersom det
är, vi vill säga inte göra någonting.
Det är illa.
Så vi skriva något fel ur minne, oftast återgå 1,
som ni är vana vid.
>> Och så har vi här, vi dereference vår pekare.
Så det betyder att vi kommer att lagra något på den plats som ges till oss.
Int * pekare eller malloc returnerar adress där det avsatt här
minne för dig.
Så det är i princip ger dig like-- om du
tänka på ett gäng hus i en stadsdel
som du vill lägga dina möbler i, malloc
är som OK, du får att gå till hus tre.
Och det ger dig adress hus tre.
>> Så här just nu, detta Pekaren lagrar en adress,
lagrar adressen till ditt hus.
* PTR medel, OK, jag är hemma hos mig.
Cool.
Jag behöver få lite heltal.
>> Så du frågar efter någon för att ge dig möbler nu.
Så du får lite int.
Och det sätter den i pekaren vart det pekar på.
>> Och då är det bara utskrifter ut, in dig vart.
Och återigen, referensen.
Så det här är som att du gick till denna adress och du såg vad som fanns där.
Cool?
>> Och sedan naturligtvis vi befria vårt pekare.
Glöm inte att befria pekaren.
Glöm inte att kontrollera för null.
Glöm inte att befria pekaren.
Du har två saker som du minns från detta, eller att du bör komma ihåg.
Ja.
PUBLIK: [OHÖRBAR] grejer så där, char * s.
Hur kommer det sig att vi aldrig befria dem?
>> TALARE 1: Hm?
>> PUBLIK: Är de som strängar?
Du sa strängar är precis som char * s, eller hur?
Så varför inte vi befria strängar?
>> SPEAKER 1: Du bara gratis om du mallocing.
PUBLIK: Åh, om du mallocing.
SPEAKER 1: Så malloc och fri är två saker
att du alltid ska ha tillsammans.
f öppna, f nära, två saker du bör ha tillsammans.
I båda dessa fall kontrollera null.
Ja.
>> PUBLIK: Så fria är bara tillåter något annat
som skall lagras där efter detta program har använt den?
>> TALARE 1: Det är bara att säga, OK, jag är klar med det här.
Du behöver inte hålla det runt.
Annars datorn kommer precis som försöka hålla den där.
Och sedan can't-- det körs till minnesproblem senare.
Du vill alltid att befria det eftersom det talar om datorn, OK, jag är
gjort med denna plats i minnet.
Du kan ha det tillbaka för mig att använda senare.
Cool?
Ja.
>> PUBLIK: Så vi använde% d bara eftersom en dubbel som kommer tillbaka,
eller varför är-- [OHÖRBAR].
>> PUBLIK: Kan man använda% i?
>> TALARE 1: Du kan använda% i.
Alla sista minuten frågor?
Varsågod.
PUBLIK: Jag har bara en snabb fråga.
Så ptr variabel, that's-- liknande, med int * PTR = malloc,
det är bara att säga att det är pekar på en plats i memory--
SPEAKER 1: Vill du [OHÖRBAR]?
PUBLIK: --that är storlek of-- nej, det är OK.
Men det är bara att peka på en plats i minne som är precis som fyra byte.
TALARE 1: Rätt.
Så malloc storleken på int säger, OK, jag ska gå avrinning,
hitta fyra byte minne för dig.
När det konstateras att fyra byte av minne, det
ger du säkerhets adressen av där det börjar,
och det är vad som lagras i pekare eller PTR.
Bra.
Ni ser mindre förvirrade än de flesta människor när jag talar om pekare,
så jag känner mig ganska bra just nu.
>> Okej.
Som alltid bör ni ha alla fått dina pset2 betyg nu.
Jag vet att det har förekommit en del wonky saker där det står, formel inte giltigt
eller något.
Om du får det, alla dina betyg är giltiga på min sida.
Så jag kan skicka dig skärmdumpar av dina betyg.
Bara låt mig veta och om du är missa några betyg eller något
verkar inte vettigt.
Kom till mig.
>> Jag har varit super stolt över dig killar redan, så fortsätt med det.
Och ha en bra resten av din vecka.
Jag är säker på att jag får se några av dig på kontorstid.