>> [TEMA MUSIC]
>> SPEAKER 1: Hei, alle sammen.
Velkommen tilbake til del.
Lovely day out-- som er grunnen, jeg er sikker, det er bare fire av dere her
og ikke vår vanlige pakken.
Jeg har vært syk denne helgen.
Så jeg har ikke Starburst for dere.
Og jeg kan begynne å hoste fryktelig gjennom dette.
Så bare bære over med meg.
Jeg skal virkelig prøve og komme seg gjennom denne første,
skjønt, før jeg har en hostende angrep.
Men bare være lett på meg en Litt bit-- det er alt jeg ber om.
>> Så vår agenda for today-- bare en reminder-- din quiz er neste uke.
Jeg fortalte deg dette i forrige uke så det ville ikke ta deg av vakt.
Så jeg minner deg igjen.
Neste ukes quiz.
For dette formål, neste ukes delen vil være mye mer
of-- Jeg skal prøve og arbeide i noen vurdering.
Så hvis dere kunne hjelpe meg ved å sende meg
ting som du er komfortabel med, at du er bekymret,
emner som du ønsker for meg å dekke, det ville være flott.
Så jeg kan prøve og jobbe dem inn i vår seksjon neste uke
eller sende deg ekstra materiale eller prep at du kanskje ikke får andre steder.
>> Yeah!
Flere folk kommer!
Jeg tenkte, gjorde jeg det dårlig sist uke, som ingen ønsker å komme tilbake?
Jeg er redd.
Så de andre tre tingene at vi kommer til å gå over
er omdirigering, fil I / O, og deretter pekere og dynamisk minne.
Jeg er sikker på at dere alle er super begeistret pointers-- alles favoritt tema,
så enkel å forstå.
Jeg er sikker på at dere alle fikk det, ikke sant?
>> Så første ting først, redirection-- Dette er i utgangspunktet bare en måte
å kontrollere hvordan du innspill ting i programmet,
hvordan du skriver ut ting fra programmet.
De viktigste måtene som du fyrene har vært i samspill med det
er bare gjennom standard ut med print screen her.
Men det finnes måter å pipe-- som vi ser her
er en av våre words-- slag av rør som informasjon
eller at data i en fil fra en fil.
Det er bare ulike måter å å få ting inn i programmet
og ut av programmet, i stedet for bare å skrive dem ut på denne skjermen
eller å sette inn ting fra kommandolinjen.
>> Så første er lite større enn innskuddstegn.
Så output-- det skrives bare utgangs til en fil i stedet for skjermen din.
Så hvis du hadde noe som trykte "Hei, verden!" til skjermen,
hvis du setter den i stedet å output.text, at
skaper denne filen som heter output.text.
Og når du åpner den, det vil si "Hei, verden!" der inne.
Dette kan være super nyttig hvis du har massevis av feil
faktisk, som vi ser i denne.
Hvis du gjør to caret, det vil skrive ut feilmeldinger.
>> Så hvis du har et problem med kompilering, den har en masse feil
og du bli sugd ned i å prøve for å bla gjennom i kommandolinjen
gjennom alle dem, kan du bare skrive dem til en fil,
åpne opp filen slik at du kan bla gjennom dem lettere.
Jeg har faktisk brukt som en mye når jeg var debugging
mine 181 psets for maskinlæring.
Så det kan være super nyttig senere.
Det er også nyttig hvis du har et program at kanskje genererer et bibliotek
eller generere noen sett av strenger, og du
må være i stand til å se at det genererer dem riktig.
Dette er måten å gjøre det.
>> Så hvis du skriver dem ut til en fil, du kan lettere undersøke dem, ikke sant?
Versus prøver å bla gjennom kommandolinjen.
Og så en ting å merke seg er at det bare med større
enn innskuddstegn, hvis du skriver til en fil som allerede exists--
så ut som om vi kjørte denne første tid, satte vi den til output.text,
og da vi hadde en andre program som trykte dette som programmet to
og gjorde en større enn å output.text, det vil overskrive at-- så
skrive hva som var noensinne i den filen til å begynne med.
>> Så hvis du ønsker å tilføye til en fil, som vi ser her,
du bare gjøre to større enn tegn.
Og det vil føye til det.
Det vil ikke overskrive den.
Så hvis du trenger å kjøre flere programmer og hva slags holde
oversikten over hva alle av dem er tilbake til deg i en fil,
det er en måte å gjøre det.
Hvis du ikke bryr seg hva som er i filen og det er lov å bli overskrevet,
du kan bare bruke en enkelt større enn.
Betyr det fornuftig for alle?
>> PUBLIKUM: Som dot slash hei større enn produksjonen dot tekst, som to ganger,
det vil bare bare vises på produksjonen dot tekst en annen tid--
>> SPEAKER 1: Høyre.
Så det ville i utgangspunktet bare helt skrive hva som var der til å begynne med.
Hvis denne filen her, output.text allerede
eksisterer, innerst inne hva du kaller som igjen med en enkelt større
enn du kan bare tenke på det så ut som det erstattet filen.
Som når du lagrer et Word dokument og du lagre som,
og du beholde samme navn, og det helt overskriver it--
Dette er den samme typen ting.
Noen som har noen spørsmål om bare sender ut til en fil?
Awesome.
>> Så åpenbart, hvis du reversere pilens retning, kan det gjøre innspill.
Så når dere hadde som Caesar eller Visioneer
og du måtte innspill noe, du hadde en kommandolinje argument
som faktisk inngang det.
Dette er en annen måte å gjøre det.
Så i stedet for å vente for en ledetekst,
som når du bedt om å oppgi melding i Caesar eller Visioneer,
hvis du hadde en tekstfil som hadde meldingen,
du kan bare skrive det inn i det.
>> Så hvis dette var som dot slash Caesar 3 mindre enn pilen skrive inn tekst, som
er budskapet ditt, at ville kjøre helt fint.
Når Caesar programmet faktisk bedt om innspill fra brukeren,
det ville allerede ha det fordi du har skrevet i denne filen.
Det er bare en annen måte.
Bare en omvendt av output-- bare inngang for dine data.
>> Og deretter den siste er røret.
Så dette er ganske kult.
Fordi det tillater deg å ta utgangen fra ett
program og sette det som input til et annet program.
Jeg vet ikke om noen av dere spilt med dechiffrere
at CS50 kan ha gitt deg, men det ville
tillate deg å ta noen eksempler fil, skriver du det inn i kryptering,
og deretter derfra skriver det inn dekryptering din
å sørge for at det viste seg det samme.
Så det er litt som tre-veis loop.
Gå for det.
>> PUBLIKUM: Hvis et program har flere innganger,
er det en måte å fortelle det hvilken inngang å bruke tekstfilen eller utgang for?
>> SPEAKER 1: Den har flere innganger.
Uansett filen din input-- når det er ber om innspill som første gang, er det
kommer til å anta, tror jeg, det er kommer til å pipe i hele filen.
Så hvis du har flere innganger, er du kommer til å være sanitæranlegg i flere filer.
Så hvis du spør etter meldinger tre ganger i koden din,
du kommer til å være å sette i tre forskjellige filer.
Og det blir gal.
Og du skal ikke behøve å bekymre deg for det akkurat nå.
Men det er tanken.
>> Så ja, er røret bare produksjonen av en Programmet benytter inngang til den andre.
Alle bra det?
Cool.
OK.
Du vil sannsynligvis ikke ha å gjøre for mye med det.
Men du bør forstå måter du kan bruke dette.
Og det er noen saker som kan det være lurt å bruke den.
>> Så fil I / O- jeg vet hva du er saying-- vi er vant til å lese fra
og skrive til vår skjerm der, som er standard i og standard ut.
Og det er det dere har vært gjort siden begynnelsen av klasse her.
Men du kan også lese og skrive filer, som er alt fil I / O- så fil input,
utgang er alt det står for.
Så dette betyr i utgangspunktet at du kan lagre dine data nå.
>> Når du bare skrive det ut til skjermen, er det i utgangspunktet borte, ikke sant?
Så snart du gjør "Hello verden "og kjør" Hello world "
det skrives "Hello world" til skjermen.
Men du kan egentlig ikke gjøre noe med det derfra.
Hvis du lagrer i en tekst fil, så plutselig
du har denne informasjonen som du har lov å manipulere eller sette den i en fil,
eller sette den i et program senere.
En av grunnene hvorfor vi gjør dette er bare
som en måte til å lagre data for senere bruk.
>> Jeg har et par skritt her bare vandre gjennom standard
I / O. I trinn en, trenger for å lage en referanse
til filen med alle caps FIL stjerners fil.
Slik som skaper en peker til en fil.
Så da du ønsker å åpne den.
Og du sier, bokstavelig talt, bare filen tilsvarer fopen.
Og dette kommer til å returnere en Peker til filen du nettopp åpnet.
Jeg så et par av dere Gutta på kontortid.
>> Men en av de tingene er remember-- pekere
kan være noen adresse eller null, ikke sant?
Hvis vi noen gang har en sak der noe kan returnere null,
hva har vi å gjøre før vi noen gang bruke det?
Vi må sjekke om det er null eller ikke, ikke sant?
Fordi noen av dere kan ha hatt problemet der uansett objekt
ble returnert i avslapnings var null.
Du prøvde å utføre noen funksjon på den.
Og datamaskinen nettstedet ugyldig.
Høyre?
Jeg vedder på at et par av dere kan ha hatt dette problemet.
>> Så med fopen, vil fopen enten returnere en peker til filen,
eller hvis noe går galt, det kommer til å returnere null.
Så du må alltid sjekke at det ikke har returnert null
før du prøver å gjøre noe annet.
Dette er som en standard paradigme at du kommer til å trenge her.
Hvis det er noen gang en mulighet for at noe kunne returnere null,
sjekk for å sørge for at det ikke før du fortsetter.
Ellers, du kommer å få nydelig område feil.
Og ingen liker å forholde seg til disse.
>> Så som vi ser her, det første argumentet er bare banen til filen.
Hvis denne filen ikke finnes, det kommer til å lage denne filen.
Og det er bare kommer til å være tom.
Og så det andre argumentet er den modusen du ønsker.
Ønsker vi å lese fra denne filen?
Ønsker du å skrive fra det?
Ønsker du å tilføye?
Så egentlig hva jeg nettopp said-- hvis filen ikke eksisterer
og du prøver å lese fra det, det kommer til å kaste en feil.
Hvis filen name-- liker hvis file.text ikke finnes ennå
og du ønsker å skrive til det, vil det skape
en tom fil som heter file.text for deg.
Og hvis du ønsker å legge til, du bør gjøre det samme.
Betyr det fornuftig?
Hvis du prøver å lese fra en fil som ikke finnes ennå,
det vil kaste en feil.
Ellers vil det skape filen for du gjør hva du vil det.
Cool.
Nå kan vi lese fra filen.
Og dette er bare slags kommer gjennom de forskjellige funksjonene
at vi har for fil I / O. Dette vil være nødvendig i denne ukens PSet,
hvis jeg husker riktig.
Ja, det absolutt vil være nødvendig i denne ukens PSet.
Så fgetc returnerer neste tegn.
fgets bare returnerer en tekstlinje.
Det vil returnere noe opp til en ny linje, og det vil bryte.
Så fread leser en viss antall byte og plasserer dem
inn i en matrise, hvilke er noe du kan
ønsker å gjøre med re-size-- kan være nyttig.
>> Hvor mange mennesker har lest den PSet spec, forresten?
OK.
[Uhørbart]
>> SPEAKER 1: OK.
OK.
Definitivt lese at-- det er en morsom PSet.
Du kommer til å gjenopprette en slettet minne card-- veldig spennende når det fungerer.
Men definitivt, begynner å lese den.
Kom snakke med meg hvis du har spørsmål om det.
>> OK, så som jeg sa, fread leser et visst antall byte.
Det er litt vilkårlig antall at du kommer til å stille.
Og så fseek bare trekk til en viss stilling.
Så kanskje du ikke bryr seg om de neste 10 byte.
Du ønsker bare å hoppe fremover.
Du bryr deg ikke om dem.
Vil du lese starter på byte 11.
fseek lar deg gjøre det.
Så det tillater deg å være selektiv om hva du leser.
Fordi fgetc, fgets, og fread lese fra et bestemt sted i filen.
>> En måte å tenke på dette er hvis dette er vår fil, når du først åpne den,
du har denne posisjonen i filen som starter i begynnelsen.
Når du ringer fgetc, fgetf eller fread,
det kommer til å starte fra denne posisjonen markør.
La oss si at du bare ønsker å lese denne del av minnet over her.
Du kan ikke bare ringe.
Du må søke over her og deretter lese derfra
eller lese, blir, eller getc, avhengig av hva du ønsker.
Så søker bare lar deg hoppe over deler av minnet.
Og det er den eneste måten du kan hoppe over ting
uten å lese dem inn i buffer.
Betyr det fornuftig for alle?
>> Selvfølgelig, det er en Mange parallelle her--
produksjonen vår, eller innspill omdirigering, du har lese og skrive.
Så fputc bare skriver en tegnet inn i filen.
fputs skriver en linje.
Fprintf skriver ut en formatert utgang.
Så hvis du har faner, eller plass, eller whatnot.
Og så fwrite skriver noen rekke bytes i en fil.
Så dette er på samme måte fwrite og fread er analoge
opposites-- fgets, fputs, og deretter fputc og fgetc-- massevis
sprø, raske ting.
>> Bare slags holde denne handy-- vil du ha forskjellige tider
der kanskje du bare vil ett tegn om gangen.
Kanskje du vil ha en hel linje.
Med ordboken pset-- som er i to psets,
Jeg tror, ​​vi gir deg en hel ordbok i et tekstformat
som har hvert ord adskilt av en linje.
Så hvis du ønsker å lese i ett ord om gangen,
hva kan du bruke hvis du leser og de er alle skilt på nye linjer,
og du bare vil ha ett ord om gangen?
>> Målgruppe: fgets
>> SPEAKER 1: Høyre.
Fgets-- fordi som returnerer det som er på én linje.
Og hvis hvert ord er dens egen linje, kan vi bruke fgets.
Cool.
Betyr det fornuftig, alle?
Cool?
Ja, vi kommer til å få til den morsomme delen med pekere
veldig snart, der du komme til å gjøre litt matematikk.
Og det vil være stor.
>> Siste step-- lukke filen.
Med så mange ting her, en av våre paradigmer
er om det kan komme tilbake null, se etter null.
Hvis du åpner noe, du får heller lukke den.
OK, så du ikke er ferdig før du er gjort med mindre du har lukket den.
Typen som det er ikke over inntil feite dama synger.
Det er som å stenge filen.
Som det står her, bare å gjenta, alltid
åpne filen før du er leser eller skriver til den.
Og alltid lukke det hvis du har åpnet den.
All right?
Cool.
>> Så her er et eksempel.
Så tiny-- Jeg vet ikke om du gutta kan se det veldig bra.
Hvis bare vi kunne øke lysstyrken eller annen måte.
La meg faktisk gjøre dette hvis jeg kan.
OK, dere kan egentlig ikke se at i det hele tatt, kan du?
OK, vi kommer til å gjøre dette, da.
[Uhørbart]
>> Jeg antar at dette er mye bedre å se.
Kan noen se hvor min mus gikk er spørsmålet?
Ah, der det er-- hva sliter!
>> OK.
I utgangspunktet bør dere ha kind av en idé om hva dette gjør.
Det er ikke perfekt.
Men jeg vil heller forklare det enn å bruke mer tid på å prøve å formatere den riktig.
I utgangspunktet, som du ser her, vi starter med fil åpen.
Og vi har noen databasefil at vi er
åpning som sier det er våre studenter.
Og vi kommer til å skrive til den.
Så selvfølgelig, returnere null.
Så vi må sjekke for null.
Og så hvis det ikke er null, vi går gjennom.
Og som du ser, vi er looping gjennom her.
Det er studenter.
Studenter er hash definert som tre.
Og det vi gjør er at vi er skrive til filen, ikke sant?
Så hva skal vi skrive ut til vår fil?
>> PUBLIKUM: Poengene som er i array?
>> SPEAKER 1: Yeah.
Resultatet som er i den array-- nøyaktig.
Så vi åpner dette database fil, som
Jeg antar er en slags karakterer database.
Og vi er bare å skrive ut scorene til hver elev til denne filen.
Cool?
Good.
Awesome.
OK.
La oss komme tilbake to--
>> PUBLIKUM: Jeg har en rask spørsmål.
Er printf ikke i for loop?
Det er bare i hvis loop?
SPEAKER 1: Nei, det er i for loop.
Jeg kan ikke se min musen veldig godt her oppe.
Så jeg sliter med å format som det skal.
Denne braketten skal være borte.
Det bør være her nede.
Dette er hva som er i for loop.
There.
Nå er det pen.
Så det er slik det skal be-- unntatt for at siste brakett som jeg avvist.
OK.
Betyr det fornuftig for alle?
OK.
Vi kommer til å gå videre til neste ting then--
som, faktisk, du kommer til å trenge å se koden.
Så jeg skal bare kopiere at over akkurat nå.
OK.
Så jeg kommer til å vise dere denne koden.
Og jeg vil at du skal prøve og figur ut hva det er ment å gjøre.
>> Så gitt at-- ta et minutt eller så.
Prøve og finne ut hva som skjer her.
>> Noen ideer?
>> Vi vet at vi har minst to argumenter i kommandolinjen, ikke sant?
Jeg antar hvorav den ene kommer til å bli at [uhørbart] av vårt program er
og så noe annet.
Fordi hvis [uhørbart] er mindre enn to, vi kjefte på dem.
Høyre?
Og fra bruk, ser det ut som det kommer til å være en slags fil.
Vi er alle enige i det?
Så nå, hva er loopen gjør?
Hva er det å gå gjennom?
>> PUBLIKUM: Alle filene.
SPEAKER 1: Nettopp.
Det kommer gjennom alle filer som vi har innspill der.
Så for hver fil, er det åpne opp noen streng der.
Det åpner opp den filen.
Høyre?
Og det er å lese fra den.
Selvfølgelig, sjekke om det er null.
Og så er det å skrive ut.
Hvis det er null, er det bare å fortelle oss at det er ikke en fil som eksisterer.
Fordi husk, med Les vår fil har å eksistere.
Høyre?
Med skrive- og append, du kan komme unna med det.
Men med lese, har vår fil å eksistere.
>> Og så hvis den ikke finnes, hva gjør vi her?
La oss bare begynne her.
Hva er dette do-- dette første tegnet.
Hva gjør den?
Han får en karakter, ikke sant?
Så hva er dette å gjøre?
Det blir det første tegnet.
Noen som vet EOF?
>> PUBLIKUM: End of file?
>> SPEAKER 1: Slutt på file-- nøyaktig.
Så det kommer til å gå gjennom hele filen, ikke sant?
Og så kommer det til å oppdatere ved få hver påfølgende karakter.
Høyre?
Og hva er det du gjør?
PUBLIKUM: Å sette det in--
>> SPEAKER 1: putchar utskrifter til din skjermsparer.
[Uhørbart] tegnet.
Og så når det [uhørbart] Dette vil lukke filen.
>> PUBLIKUM: Har du ikke trenger en [? annet? ?]
>> SPEAKER 1: Ikke nødvendigvis.
Jeg mener, det er slags underforstått i dette.
Fordi dette kommer tilbake, skjønt, så lenge da dette ikke fange dette, du er fin.
Jeg mener det er sannsynligvis bra praksis å gjøre et annet.
Men et annet er ikke alltid nødvendig spesielt
hvis du har noe som en retur, som
betyr at i dette tilfelle hvis den fanger det, er at programmet kommer til å ende
og det vil aldri komme til dette.
Det er mer for tilfellet der du er ikke nødvendigvis tilbake noe.
For hvis dette ikke var tilbake noe,
det ville bety at hvis dette var sant, resten av dette ville fortsatt kjøre.
Og i så fall, du ønsker en falsk.
Hvis det er tilbake, og programmets avslutning,
et annet er ikke nødvendig alle tid, avhengig av sammenhengen.
Jacob, hadde du et spørsmål?
PUBLIKUM: Yeah.
Så gjør fgetc få neste tegn?
Hvordan øke karakter?
SPEAKER 1: Yeah.
Så fgetc blir neste tegn.
Du kan tenke på det som C ++ i en forstand.
>> PUBLIKUM: Så hva var EOF?
>> SPEAKER 1: EOF er slutt på fil.
Det er bare en markør som lar deg vite at du er på slutten av filen.
Så dette kommer til å skrive ut til standard ut.
Og så kommer det til å lukke filen når den er ferdig.
Og så la oss gå til neste fil, ikke sant?
Så samlet, hva betyr dette programmet gjøre?
>> [Uhørbart]
>> SPEAKER 1: Yeah.
Den skriver bare ut alt det.
Så hvis dere noen gang har brukt CAT og deretter navnet på noen file--
Jeg vet ikke om noen av dere har gang gjort det på terminalen.
Men hvis du noen gang bruke den kommando CAT-- C-A-T--
og deretter uansett fil du har det-- det
skrives det ut til terminalen, som kan være super nyttig for noen ting.
Jeg bruker det mye.
Betyr det fornuftig for alle?
Cool?
>> OK, så din oppgave now-- enten ved selv eller med folk rundt you--
er å bare skrive et enkelt program som vil bare skrive "Hei, verden!"
ut til en fil.
>> [Uhørbart]
>> SPEAKER 1: Jeg var som gjorde Jeg gjør det dårlig i forrige uke?
Jeg trodde ikke det var så ille.
Jeg er glad du er alle her.
Det gjør meg virkelig glad.
Jeg er en jente på enkle gleder.
Jeg liker bare når min seksjon deltar.
Så får jeg bare dette startet for dere slik at vi kan kode sammen.
Jeg liker ikke å sette noen på flekken med mindre du ønsker å være.
>> PUBLIKUM: For quiz, gjør vi må skrive et program?
>> SPEAKER 1: Du kan bli bedt om å skrive enkle programmer for hånd.
Yup.
>> PUBLIKUM: Quizen er i neste uke, ikke sant?
>> SPEAKER 1: Quizen er neste onsdag.
Det betyr at det er en nydelig [? CSE?] gradering fest etterpå, som
betyr at du vil få din score tilbake som kvelden-- til hvilken tid?
Hvem vet?
Men det vil være den kvelden.
>> OK.
Hvordan ønsker vi å starte denne?
Jeg skal gi deg et hint-- starter med dette.
>> PUBLIKUM: Du må åpne en fil.
>> SPEAKER 1: Yeah.
Så hva vil du kalle dette?
Har du bare ønsker å kalle det "file"?
La oss gjøre det enkelt.
Så fopen-- hva som er vår utgang test kommer til å være?
Kall det "Hello".
Og hva er vår modus?
Hva gjør vi til denne filen?
>> PUBLIKUM: Les.
Skrive.
SPEAKER 1: Vi skriver til den.
Lovely.
OK, så vi har denne filen nå.
Hva trenger vi å gjøre?
PUBLIKUM: Sjekk om det er null.
SPEAKER 1: Sjekk om det er null-- nøyaktig.
Det er det jeg liker å høre.
Det burde være automatisk, spesielt ganske mye fra dette punktet.
Hvis du starter segfaulting, har du sannsynligvis ikke sjekke for null et sted.
Ni av ti ganger, det er kommer til å være din feil.
Så hvis du bare kunne komme i vane, alltid sjekke om det er null,
livet ditt kommer til å bli fin og easy-- eller enklere.
>> Så sjekk for å se om det er null.
Så hvis det ikke er null, noe som er hva bang lik
means-- ikke null-- det er gyldig.
Hva ønsker vi å gjøre?
Vi bare ønsker å skrive ut til den filen, ikke sant?
Så hva skal vi bruke?
>> PUBLIKUM: fprintf
>> SPEAKER 1: Fprintf-- nydelig.
Og fprintf tar to arguments-- der det kommer og hva vi ønsker skrevet ut.
Så hva er det første?
Hvor er det hen?
>> PUBLIKUM: Fil.
>> SPEAKER 1: Det kommer til fil.
Og hva er det vi ønsker skrevet ut?
"Hei, verden!"
OK.
Vi har en siste thing-- en annen stor paradigme her.
PUBLIKUM: Lukk.
SPEAKER 1: Lukk.
Der du går.
>> PUBLIKUM: Er dette skjer hvis filen er null?
SPEAKER 1: Nei, dette er hvis det ikke er null.
PUBLIKUM: Å, om det er not-- OK.
For fopen og deretter to argumenter som går på innsiden,
hva betyr det første argumentet betyr igjen?
>> SPEAKER 1: Argumentet er akkurat som navnet på filen
at du ønsker å gå til.
Så etter dette går, ville du har noen fil som heter "Hei"
som hadde "Hello, world" i den.
Det er alt.
Bare navnet.
>> PUBLIKUM: Og siden det er å skrive, det Filen trenger ikke å allerede finnes.
Er det det du sa?
>> SPEAKER 1: Høyre.
Nettopp.
Hvis "Hello" som en fil ikke finnes ennå, er det
kommer til å lage en fil som heter Hello "og skrive til det for deg.
>> PUBLIKUM: Når du forteller programmet for å skrev til filen,
Hvorfor skriver du "file" i stedet for navnet på filen og fprintf--
>> SPEAKER 1: Fordi i dette tilfellet, har vi at store FILE-- alt i caps-- stjerne,
fil.
Så det er en peker til filen at du snakker om.
Dette er den måten at vi bare referere til det.
Så i dette tilfellet deg kan tenke på file-- aha,
vi kan bruke dette-- fil her refererer til åpningen av "Hallo"
og la den skrive.
>> PUBLIKUM: Kan vi sette en "Hello" stedet [? for bare?] f fil?
SPEAKER 1: Nei, fordi "Hello" må være åpen og skrivbar.
Fil her er som en benevnelse som sier OK, vi
har denne file-- hello-- at vi ser på.
Det har blitt åpnet.
Og vi kommer til å skrive til den.
Hvis du bare bruker "Hallo", som er innkapslet i det.
Så det kommer til å frike ut.
Jeg mener, du kunne ha kalt det.
Du kunne ha gjort fil, stjerne, "Hello", lik det.
Men hele poenget er at du trenger en fil stjerners pekeren for
for å kunne bruke disse funksjonene.
PUBLIKUM: Kan du gjøre filen, stjerne, fil, "Hello"
eller trenger du å sette fil stjerne, fil ved det?
SPEAKER 1: Du kunne gjøre filen, stjerne, "Hello".
Du kan endre dette til det navnet du ønsker.
Det er helt vilkårlig hva det heter.
Du kan kalle det noe.
Name it flying spaghetti, hvis du ville.
>> PUBLIKUM: Hva er "w" i anførselstegn for?
>> SPEAKER 1: Den "w" er akkurat den modusen.
Så vi skriver til denne filen.
Alle gode?
Clear?
Ja.
>> PUBLIKUM: Så når den skriver dette fil, hvor går så finner vi at filen?
>> SPEAKER 1: Det vil være i samme katalog som du er i for øyeblikket.
Hvis du er i PSet tre og du kjører denne, innenfor din PSet
tre mappen kommer til å være denne filen som heter "Hello".
Cool?
Alle gode?
Jeg føler at du er alt få det, og det er flott.
OK.
Så tilbake til min lysbilde show-- Jeg elsker når ting fungerer.
OK, pointers-- Er dere spent?
Pekere er stor.
De tar en liten bit å vikle hodet rundt.
Dette er mitt andre år undervisnings pekere.
Og jeg tror jeg endelig fikk den.
Så hvis du sliter, er det OK.
Som jeg sa tidligere, tegne bilder hjelper mye med ting i CS,
så mye som jeg tror folk har en tendens å tenke oh, er vi på en datamaskin.
Vi burde bare kode.
No-- tegnebilder vil virkelig hjelpe deg.
Og jeg oppfordrer deg til å trykke inn din kindergartner side
og hente ut fargestifter eller markører og uavgjort.
Fordi det vil hjelpe deg.
Og hvis du ser meg på kontortiden, jeg skal frakte rundt stabler av papir
med penner tegne ting ut.
>> Så spesielt med pointers-- tegne bilder.
Og jeg er sikker på at vi faktisk kommer til å være å tegne noen bilder her også.
>> Så dere alle fikk se Binky, denne kule claymation ting.
Og vi synes det er veldig morsomt når Han eksploderer i en haug med brikker.
Det er litt komisk lettelse for klassen.
C [uhørbart] denne stor evne å være i stand til å styre minnet.
Og det er en av de tingene som virkelig gjør det så kraftig språk.
Men med stor makt følger stort ansvar.
Og sprø ting kan skje hvis du ikke er forsiktig.
Så når du bruker pekere, ønsker du å gjøre
sikker på at du virkelig forstår nøyaktig hva du gjør.
Forhåpentligvis neste litt tiden vil hjelpe deg virkelig forstår
pekere, hvordan du bruker dem, og hvordan du kan manipulere dem.
>> Så memory-- jeg er sikker på at vi har sett dette diagrammet før.
Så dette er bare et enkelt diagram over hvordan ting kan være lagret i minnet.
Så du i utgangspunktet har disse store matriser av én byte blokker
er hva vi har her-- svak trinn med en hver gang.
Dette er i hex [uhørbart] så åtte-bits blokker.
Og hver blokk er tilknyttet med noen heksadesimal adresse.
Så hvis du noen gang se 0x, det er bare å notere
at det er en heksadesimal adresse.
Du kan anta at dette betyr noen adresse i minnet.
Vi snakker om minneadresser når du ser heksadesimale.
>> Vi har ints er variabler, flyter er variabler som lagrer.
Så ints butikk ints.
Flyter butikken flyter.
Så vi har også pekere at butikken minneadresser.
Det er en slags kartlegging.
Pekere er utelukkende for minneadresser.
Så det er som din type der.
Apparatet er 32-bit, noe som betyr at minne adresse er fire byte.
Så noen peker som du har er også kommer til å være fire byte.
Ellers hvis det er fire bytes, minnet er fire byte.
Pekere butikken minne.
Derfor er de fire byte.
Cool-- bare vil forsterke det.
>> Du bør få denne tegneserien nå.
Jeg vet ikke hvor mange av dere er xkcd fans, men jeg elsker xkcd.
Det er flott.
>> OK.
Så skaper pointers-- som jeg sa, det er ganske mye bare liker noe annet.
Du har en type.
Du har et navn.
Høyre?
Det er det vi har der. [? Hex?] Stjerne betyr at det er en peker,
og deretter hva du vil kalle det.
Så den typen representerer hva du kan lagre.
All right?
På samme måte som hvis vi gjør ints, vi vet at vi lagrer en int der.
Med en peker, det holder en minneadresse.
Men hva det betyr er at-- her er der en tegning kommer til å komme godt med.
Så i dette tilfellet, har vi noen value-- la oss si fire.
Fire er ved adresse en.
OK?
>> Denne første her betyr at det er en peker 2x.
Høyre?
Det er noen pekeren x.
x kan være noe, uansett.
Uansett x er-- si x er fire.
Det kommer til å lagre minneadresse her.
Så int, stjerne, er X- dette noen andre sporet i memory--
som vet hva dette er.
Men det kommer til å lagre en adresse her.
Så dette ville være like-- i dette tilfellet, uansett,
er lagret på 0x1-- det som er lagret til den adressen vår pekeren holder,
har å matche opp med hva vi har utpekt.
Så på 0x1, i dette tilfellet, er dette x.
Dette kan bare noensinne være en int mens vi bruker dette.
>> Tilsvarende, hvis vi har annen 1y, uansett
adressen lagres med en y har å være en char-- samme med z.
På samme måte, når du prøve og gjøre intx lik 0,4,
det kommer til å kjefte på deg og være som ingen, du sa du ønsket en int.
Dette er ment å være en int.
Slutt å prøve å gjøre det til en float.
>> Så la ting være det de ønsker å være.
La ting være seg selv.
Så store tingen er bare uansett type peker
det er, det er den eneste ting du kan lagre det.
OK?
Med praksis, som med forrige uke, alt
synes virkelig slags abstrakt.
Vi kommer til å gjøre noen praksis.
Det bør være mer fornuftig.
>> Så Klassifisering og dereferencing-- det er veldig viktig å få disse rett.
Jeg har fortsatt å oppdatere nå og da.
Og jeg er like vente, som en vil jeg?
Så tegnet faktisk vil gi du referansen eller adressen til.
Så det returnerer adresse i hukommelse av hvilke variable er lagret.
Så det kommer til å faktisk komme tilbake til deg en heksadesimal, mens dereferencing det
faktisk kommer til å gi deg dataene som er lagret der.
OK?
Så vi kommer til å se på et eksempel veldig fort, eller faktisk opp neste.
>> OK.
Så vi må tenke virkelig nøye om dette.
Så her har vi noen heltall x.
Jeg kommer til å prøve og trekke dette ut til den beste av mine evner.
Så vi kommer til å ha dette sporet x.
Og det er lagring av fem.
Sin adresse er 0x4.
Cool?
All good.
>> Så nå har vi denne pekeren.
Det var over her.
Og tegnet gir oss adressen til noe.
Så, i dette tilfellet, er det adressen til x.
Hva er adressen til X?
04-- og denne pekeren er på 0x08.
Cool?
Så du kan tenke på dette pekeren, 04, peker litt over her.
Og de heter pekere fordi som vi får mer inn i dette,
du kommer til å se peker til ting.
Og ett kvartal peker til en annen blokken vil gjøre mye mer fornuftig.
Så her er to.
Og så har vi noen kopi, som er what-- 0x0C.
Og det kommer til å dereference vår pekeren.
>> Så hva det er å si er OK, her er vår pekeren.
Verdien den lagrer er 0x04, og hva det er å si er å gå til denne adressen
og fortelle meg hva som er i den.
Så det er effektivt hva denne pilen gjør.
Du kan tenke på dette som din stjerne.
Så OK, når vi gjør stjerne, betyr det følge.
Gå til denne adressen.
Og det er i utgangspunktet bare å følge denne pilen til dette minnet blings.
Og gi oss hva som er i den, noe som er fem.
Det er derfor vårt eksemplar er lik fem.
Betyr det fornuftig?
Er det noen som trenger meg til å gå gjennom det igjen, eller saktere?
Du vil ha meg til å gå gjennom det en gang til?
OK.
Vi kommer til å tegne den på nytt.
Når vi starter, vi alle er enige om vi har noen del av minnet som er en variabel
x som vi satt lik 5.
Vi kontrollerer ikke hvor det er i minnet.
Så dette stedet er bare vilkårlig tildelt.
Bra det?
OK.
Så vi initialisere en peker til en int.
Det er derfor det er lov til å peke på x fordi vi har en int i her.
Vi har en annen del av minnet fordi denne pekeren
er en variabel akkurat som alt annet.
Det er vilkårlig tildelt noen plass i minnet.
Og hva den lagrer er adressen til x.
Ampersand betyr adressen til x.
Så hva er adressen til x?
>> PUBLIKUM: Det er zero--
SPEAKER 1: 0x04.
Så then-- siste.
Vi har noen copy-- igjen bare en annen variabel.
Så la oss tildele noen vilkårlig sted.
Og vi dereference vår pekeren.
Stjernen betyr gå til adresse lagret i min pekeren.
Fortell meg hva som er der.
Så adressen lagret i vår pekeren er 0x04.
Så vi går til denne adressen.
Den peker til denne adressen.
Hva er inni denne minneblokk?
Det er en fem.
Så det er det vi tilordner vår kopi.
Alle gode?
Cool.
Igjen-- bilder.
>> Så sporing verdiene her-- jeg er kommer til å la dere synes om dette.
Vi kan tegne et annet bilde.
Men jeg vil at du skal prøve og grunn gjennom dette på egen hånd i et minutt.
>> Siden de ikke gi oss et eksempel adresse,
Jeg bare kommer til å gjøre tegnet X- som skal bidra til å drive den hjem.
Ampersand betyr adresse.
>> Så i den første, alle gå med den første linjen.
Noen x settet five-- noen tilfeldig sporet i minnet.
Int stjerners pekeren er lik til adressen til x, rett?
Int stjerners pekeren skaper denne blokken, kaller det peker,
og tildeler den til adressen til x.
Jeg er forferdelig på ampersand.
>> Nå hva vi gjør er at vi sier OK, dereference vår pekeren.
Så vi går OK, hva som er i vår peker?
Det er tegnet x.
Gå til Ampersand x og overføre den.
>> Så nå er tegnet x kommer til å være 35.
Så i utgangspunktet, når du er dereferencing, går du OK.
Du kommer til å være tegning bilder som dette.
Du kommer til å være tegning pilene enn hvor det er.
Så gå til denne spalten i minne og enten gi meg denne verdien tilbake, eller endre det.
I dette tilfellet, fordi vi er på dette verdi, vi tilordne den til å være 35.
Mens det i den siste en, hvis du legger merke til, vi
ble tilordne hva som var her til noe annet.
>> Så de har denne awesome tabellen.
Det er ikke så ille.
Dere jobber på den.
Jeg kommer til å trekke den ut på brettet.
Vi kommer til å fylle det ut sammen, OK?
Så grip litt papir, grip en partner, begynne å jobbe.
Jeg kommer til å få en større stykke kritt.
Fordi det kommer til å bli mye.
OK.
PROFESSOR: OK.
La oss starte med den første raden.
Vi begynner der, så dere kan kanskje virke gjennom litt mer.
OK.
a er lik b ganger c så hva er en?
Det er ikke et lurespørsmål, jeg lover.
>> STUDENT: 4 ganger 5.
>> PROFESSOR: 4 ganger 5.
20.
Så hva er b?
STUDENT: 4.
>> PROFESSOR: Og c?
STUDENT: 5.
PROFESSOR: 5.
Og så dette er bare kommer til bli tegnet en, ampersand b,
ampersand c, ikke sant?
Ikke dårlig.
Det er enkelt nok.
OK.
Så den neste.
A er lik en ganger c, i tilfelle noen var ukjent med det.
Er alle kjent med tiden er lik?
OK, alt dette means-- dette er forkortelse for en lik en ganger c.
Du kan også gjøre det med divisjon, med tillegg, med subtraksjon.
Du kan gjøre et likemenn, eller et pluss lik c betyr a er lik en pluss c, lik en minus
c ville være lik en minus c.
Det er bare syntaktisk sukker.
>> Så, i dette tilfellet, er lik a en ganger c ville gi oss det?
Igjen, ikke et lurespørsmål.
>> STUDENT: 100.
>> PROFESSOR: 100.
Har noe annet endre?
Nei.
Kanskje vil jeg endelig få bedre på mine-tegn.
>> STUDENT: OK, sorry, hvordan fikk du 100?
PROFESSOR: OK.
Slik at a er lik a ganger c, så en ganger c.
STUDENT: Åh, du bruker en for previous--
PROFESSOR: Ja.
Så disse er våre nyeste verdier.
Dette er hva du bør være bruker når vi beveger oss ned, OK.
Så, er b det eneste endring, ikke sant?
Så la oss fylle ut alt annet.
B. Hva er b kommer til å være?
Å være eller ikke å være.
Så hva er dette å gjøre?
Hva er stjernen pa gjør?
>> STUDENT: Kode til plasseringen av pa.
>> STUDENT: Nei, ikke helt.
Så dette er en d referanse.
>> STUDENT: Så b er handed verdien av pa.
>> PROFESSOR: Ja, så pa adressen til en, ikke sant?
Så det er å si gå til hvor en er lagret og gir den verdi som.
Så hva er b?
STUDENT: 100.
PROFESSOR: 100.
Perfect.
OK, så pc er det som er i endring.
Alt annet forblir den samme.
Hva er pc kommer til å være?
Enkel oppgave.
Pc er lik pa, og hva som er pa?
>> STUDENT: Ampersand en.
PROFESSOR: Perfect.
Nå får vi interessant.
OK, la oss bryte dette ned.
Først, hva er b ganger c, fordi det er den enkle delen av denne, ikke sant?
B ganger c er--
>> STUDENT: 500.
>> PROFESSOR: Ja, så hva er dette en gjør,
hvis det er stjerne pb, hva endring?
>> STUDENT: Hva er i the--
PROFESSOR: Hva er i b?
STUDENT: Hva er i rommet at pb peker til.
PROFESSOR: Og pb peker to--
STUDENT: B.
PROFESSOR: B. Så den eneste ting endring er b, ikke sant.
Så b ganger c, 500.
Så det er det endrer seg nå.
Cool.
Lovely.
Dere gjør stor.
All right, bryte dette ned.
C er i endring, ikke sant?
Så vi kan fylle ut alt annet.
La oss se.
OK.
Vi vet at c kommer til å være den produktet av to tall, ikke sant?
Hvilke to tall, skjønt?
>> STUDENT: A og c?
>> PROFESSOR: Så en er rett for den første.
Så vi d refererer p av en, ikke sant?
P av en peker til en, så vi vet at dette kommer til å være 100 ganger hva?
Ganger hva gjør pc peker på?
Peker på en.
Så 100 ganger 100 er 10.000.
Betyr det fornuftig?
Cool.
Oppløpssiden, folkens, siste raden.
OK.
Hva endres her?
>> STUDENT: A.
PROFESSOR: A. Perfect, så alt annet kan forbli den samme.
OK.
Og hva er en?
Så det er en ganger hva?
Dette er stjerne pb.
Så stjerners pb betyr her er pb, til pb punkter b.
>> STUDENT: 500.
>> PROFESSOR: 500.
Så vi har 500 ganger 100.
Det er 50.000.
Puh!
Se på det.
>> STUDENT: Hvorfor har vi den & c for last--
PROFESSOR: Beklager.
STUDENT: Oh, OK.
PROFESSOR: My bad.
Masse skriftlig.
Alle gode?
Ikke så ille, ikke sant?
Bare tar litt stund å jobbe seg gjennom.
Hvis du bryter det ned, forstå hva hver del
henviser to-- som med alt det er,
yes-- bryte det ned til den lille problemer og deretter sette sammen,
og du kan gjøre noen awesome ting.
Det er svarene, men vi gjorde det.
Pointer aritmetikk.
Ah.
Hendene mine er alle kalkholdig.
Så legge til eller trekke int justerer pekeren
av størrelsen av den type av pekeren.
Husk hvordan hver type har en annen størrelse?
Så ut som en dobbel eller en lang lenge er åtte og int er fire, men røye er ett.
>> Så hva du ønsker å gjøre er-- én ting å huske
er bare at hvor mye din pekeren verdi faktisk endrer
vil avhenge typen peker det er.
Alle bra med dette?
Kan jeg slette den?
Vi er bra?
Awesome.
>> Så hvis vi har noen peker at-- dette kommer til å be-- jeg er
kommer til å gjøre det en int pekeren.
Den lagrer dette.
Hvis du skulle si pekeren pluss en, hva det kommer til å gjøre
er det kommer til å oppdatere den ved størrelsen av en int
fordi det er den typen peker det er.
>> Med C, alt svært strenge og regulert.
Den int pekeren kommer til å oppdatere etter hvor mye plass en int ville ta.
En int er fire byte.
>> Så hva ville dette bli til?
Du bare legge fire på dette.
Nå pekeren ville be-- OK.
>> Så hvis det var en røye og vi gjorde pekeren pluss en, hva ville det være nå?
Hvis det started-- late vi started-- akkurat nå er det 0x08.
La oss nå si at dette var en char peker, og vi har lagt en.
Hva ville det endre til?
Hvor mange byte er en char?
>> PUBLIKUM: One.
>> SPEAKER 1: One.
PUBLIKUM: Så 0x09.
SPEAKER 1: Så det ville være ni.
Så bare noe å huske.
Akkurat når du legger til en, er det ikke legge en mindre det er en char.
Det er å legge til hvor mange bytes den typen som det er,
det er derfor vi har denne ligningen her oppe.
Så det er int ganger størrelsen av den type pekeren.
>> Så vi har eksempel her.
y ble tildelt denne verdien, 0x4, når vi gjorde y pluss er lik én.
Hva det betyr, hva som er ix, endres ikke.
Den største forandringen er hva som er i y.
Adressen som er lagret i y oppdatert av fire fordi det er fire bytes i en int
og det er en int pekeren.
>> OK.
Så nå har vi en annen øvelse.
Så spørsmålet er hva som vil skrive ut.
Noen ideer?
>> PUBLIKUM: Antall tegn i glad katt?
SPEAKER 1: Nettopp.
Så liker med streng.
Har alle får det?
Ønsker vi å gå gjennom det?
>> Ja, OK.
Så det vi har her-- jeg som dette så mye mer.
Jeg trenger ikke å [Uhørbart] latterlig.
>> Så vi har vår streng her, lykkelig katt.
Lovely.
Vi har noen teller som vi å holde styr på.
Så vi har noen char * pekeren som bare er satt lik Str.
Hva dette gjør er at det er tildele noen pekeren
til begynnelsen av strengen.
Fordi jeg er sikker på, da det ble nevnt i foredraget,
vi har gitt dere denne datatype kalt streng.
>> Men egentlig strenger er bare en rekke of-- som char *.
Det er en peker til en haug med karakterer som er sammenhengende i minnet.
Så dette bare setter det lik noen streng er
identifisert ved der sin første tegnet er.
Så dette er bare å sette et tidspunkt lik begynnelsen av strengen.
Alle bra det?
Cool.
>> Så dette er dereferencing vår pekeren.
Så det er faktisk kommer til å gi oss noen verdi her,
i vår streng som vi snakker om.
Og vi sier så lenge det er ikke null terminator.
Så fortsett til du får til slutten av strengen.
Oppdater pekeren etter én.
Så r, vil det faktisk oppdatere ved én hver gang fordi dette er en røye,
char *.
>> Så det kommer til å gå gjennom.
Det kommer til å oppdatere.
Så det første gang dette går, det kommer til å være her på h.
Det kommer til å oppdatere.
>> Det vil være en a.
Det vil være en p, y, og så videre og så videre.
Vi vil oppdatere telleren.
Når den når enden, det bare skriver ut hvor langt det er kommet.
Ja.
>> PUBLIKUM: Så Det teller plassen som en, ikke sant?
OK.
>> SPEAKER 1: Tenk det.
Er det en question--
>> PUBLIKUM: [uhørlig].
>> SPEAKER 1: Ingen grunn til bekymring.
Dette gjør jeg det.
All right, så en ting jeg forstå er at med en matrise,
du kan også behandle det som en pekeren fordi arrays er bare
kontinuerlige flekker av minne.
>> Så du kan behandle det på samme måte.
Du kan manipulere dem med pekere, også.
Så i stedet for å gjøre, i dette tilfellet er analog tingen
ville være matrise 0 er lik 1.
>> Men på samme måte som en streng bestemmes
ved starten av der sin første tegnet er,
en oppstilling bestemmes av der det første elementet er.
Fordi vi vet, er vi garantert, at disse
kommer til å være kontinuerlig minneblokker.
Det er det som gjør det mulig for oss å gjøre dette.
Vi vet de er kontinuerlige minneblokker.
>> Så i dette tilfellet, ved å dereferencing bare array, som forteller oss,
OK, gå til starten av klyngen, som er her.
Så du kan sette den lik en.
Og i dette tilfellet, uansett utvalg typen er, når du oppdaterer den etter en,
det er akkurat som å oppdatere den til neste indeks.
Du kan gjøre det fordi du vet hva som er i array.
Så det vet hvor mye du skal oppdatere pekeren ved,
hvilken adresse å oppdatere den til så at du er på neste spor.
>> Så dette er bare en annen måte å skrive matrise 0 er lik 1,
matrise en lik 2, array brakett 2 er lik 3.
Det er bare en annen måte å tenke på det.
Fordi de er kontinuerlige blokker i minnet,
du kan referere til dem heller av rekken notation--
som jeg personlig finne easier-- men kanskje
du trenger for å manipulere det strengt av minneadresser.
Og dette er måten du ville gjøre det.
Kind of mer som en kule ting du kan gjøre
versus kanskje ikke noe du er faktisk kommer til å gjennomføre.
>> Jeg bruker det i 61.
Dere trenger sannsynligvis ikke å bekymre seg for det for mye.
Men hvis du er interessert, ta 61 neste år.
Vi er på oppløpssiden gutta.
Jeg vet, det er lenge.
Dynamic Memory Allocation-- slik at vi vet at en
på ting når vi snakket under vår første delen sammen,
vi så på en swap funksjon hvor det var
utenfor rammen av våre viktigste funksjon.
Og vi passerer i disse verdiene som var effektivt kopier.
>> Og når swap ferdig utføring, det bare igjen en stabel.
Husk, vi har en stable ramme for swap.
Det etterlater og de verdier la med det.
Og de var borte.
Vi kunne ikke gjøre noe med dem, og vi var trist
fordi vi ikke kan bytte våre verdier.
>> Men med C, som jeg nevnte, du har mye makt over minnet.
Så det du kan gjøre er at du kan fordele ting på haugen her
som vil bo der til du forteller dem noe annet.
>> De er som gode barn.
De bo der.
De forlater ikke.
De vil bli der til du er lignende, OK, kan du gå bort.
>> Mens ting på stakken, who-- de er som uskikkelige barn.
De vil bare stikke av når du vil å være der og da de er borte.
Du kan ikke få dem tilbake.
>> Så haugen er-- vi kommer til å snakke om malloc og gratis, som
Jeg er sikker på at dere hørt om i forelesningen.
Og det er i utgangspunktet en måte å ha svært vedvarende data.
Så du kan holde dataene rundt så lenge du vil.
Mhm.
>> PUBLIKUM: Kan du definere haug og stable?
Er de liker steder å sette ting?
>> SPEAKER 1: Så de er utgangspunktet just-- de er
måten vi refererer bare til minnet.
Så heap er bare steder der minnet er tildelt dynamisk,
mens stabelen henviser mer å stable rammer
som er mer sentralt i funksjoner som faktisk kjører.
Du trenger egentlig ikke har kontroll.
>> Den store forskjellen, har du kontroll over haugen hvis du vil.
Du har mindre kontroll over bunken.
Stabelen avhenger funksjoner som kjører,
og i hvilken rekkefølge de er løpe, og hvordan ting er returnert.
Mens med haugen, som vi får se, kan du si,
OK, jeg vil at denne verdien skal være rundt før jeg fortelle deg noe annet.
Du har ikke lov til å bli kvitt det.
Du har ikke lov til å overstyre den.
Du kommer til å holde den rundt for så lenge jeg fortelle deg.
Du kommer til å være sjefen i haugen, mens stack-- kanskje hvis du
som finagle din vei du kan være sjefen.
Men ikke helt.
Og det er egentlig bare minne.
Det er bare forskjellige måter å henvise til minne.
>> Cool.
Så med det, hvordan kontrollere hukommelsen.
Det er med malloc, som du kommer til å få til å bruke.
Så det er bare kort for minnetildeling.
Det er alt det er.
Det er en haug med andre kule funksjoner som har alloc på slutten,
og de står for forskjellige ting.
>> Så når du trenger lagringsplass som trenger å vare lenger enn din nåværende funksjon slik
at når den nåværende Funksjonen går bort,
du har fortsatt dataene du fikk fra det, ønsker du å bruke malloc.
Det vil initialisere den på haugen.
Og som jeg sa og holde sier, vil du holde den der
før du forteller det ellers, som er det viktige her.
>> Så en ting å legge merke til, og det er vanligvis veldig viktig,
er at dette sizeof er super nyttig å bruke
fordi, avhengig av typen av maskinen du kjører,
den kan ha varierende mengder minne som det tar.
Så du alltid vil bruke størrelsen på slik at du ikke er maskinavhengig,
slik at koden vil kjøre på hvilken som helst maskin.
>> Og det er bare en del med å skrive god kode.
Hvis det fungerer på en maskin, men ikke noen av de andre,
Hvor nyttig var programmet ditt?
Slik at du alltid vil sørg for og bruke sizeof.
>> PUBLIKUM: Så er det som størrelse på 10 inches [uhørbart]?
>> SPEAKER 1: Dette er på størrelse med 10 ints.
ja.
Så størrelsen på ints vil returnere hvor mye tar en int.
Eller størrelse på røye, hvordan mye koster en char ta.
Og så hvor mange blokker av det du vil?
>> Så i dette tilfellet ønsker vi noe at vi kan lagre 10 ints til.
Og det vil fungere uansett av maskinen, noe som er kult.
Så hvor mange byte vil som faktisk gir deg?
Rask matematikk.
>> PUBLIKUM: 40.
SPEAKER 1: 40.
Nettopp.
Så en annen stor ting.
Pointer eller malloc kan returnere null.
>> Så igjen, sjekk alltid se om det returnerte null
før du prøver og gjøre noe med det.
Hvis du prøver og dereferanse denne pekeren nå,
det bare kommer til å segfault fordi du gikk og prøvde
å røre null når du ikke skal ha.
Så alltid sjekke for null.
Igjen, kan alt du gjør.
>> Det kan returnere null.
Det vil returnere null hvis du er enten tom for plass, eller uansett grunn
det kjørte inn i noen minne bug.
Det noen ganger bare returnerer null.
Så du må bare se etter det.
Det er alt dette lysbildet sier.
Og så det vi har her er en oppfordring til å frigjøre.
Så på samme måte som hvis du åpne en fil du må lukke en fil,
hvis du malloc minne, du må du frigjøre dette minnet.
Og dere vil få å gjøre virkelig kule ting.
>> Og det er et program du kan kjøre til se om du noen gang lekker minne.
Men du ikke ønsker å lekke minne.
Det er virkelig ille.
Bare rotet opp ting.
>> Det er ille å gjøre akkurat som programmering lurt for utforming effektivitet.
Men det er også bare snill av dårlig for datamaskinen.
Så bare gratis ting når du malloc dem.
>> Dere ser symmetriene her.
Super enkel.
Bare gratis og deretter uansett pekeren,
uansett navnet pekeren er, og det
vil ta seg av å frigjøre den for deg.
Cool.
>> Så har vi dette.
Så vi skal bare gå gjennom dette programmet.
Og så dere er ferdig.
>> Så [uhørbart] bare main.
Så vi har noen int * pekeren.
Så vi har en peker som kommer til å holde ints.
Og hvor mange ints er det kommer til å holde?
Bare en.
Størrelsen på en int.
>> Vi sjekker for å se om pekeren er null fordi det
er, vi ønsker å si ikke gjør noe.
Det er ille.
Så vi skrive ut noen feil ut av hukommelse, som oftest tilbake 1,
som dere er vant til.
>> Og så har vi her, vi dereference vår pekeren.
Så det betyr at vi kommer til å lagre noe på det stedet gitt til oss.
Int * pekeren, eller malloc, returnerer Adressen der det satt av dette
minne for deg.
Så det er i utgangspunktet noe som gir deg like-- hvis du
tenk om en haug med hus i et nabolag
at du ønsker å sette møbler i, malloc
er som OK, får du å gå for å huse tre.
Og det gir deg adressen til huset tre.
>> Så dette akkurat nå, dette peker lagrer en adresse,
lagrer adressen til huset ditt.
* PTR midler, OK, jeg er i mitt hus.
Cool.
Jeg trenger å få noen heltall.
>> Så du ber for noen å gi deg møbler nå.
Så du får noen int.
Og det setter den i pekeren der den peker til.
>> Og da er det bare utskrifter ut, har du tastet der.
Og igjen, referansen.
Så dette er som du gikk til denne adresse og du så hva som var der.
Cool?
>> Og så selvfølgelig frigjøre vi vår pekeren.
Ikke glem å frigjøre pekeren.
Ikke glem å sjekke for null.
Ikke glem å frigjøre pekeren.
Du har to ting du husker fra dette, eller at du bør huske.
Ja.
PUBLIKUM: [uhørlig] stuff sånn, char * s.
Hvordan kommer vi aldri frigjøre dem?
>> SPEAKER 1: Hm?
>> PUBLIKUM: Er de like strenger?
Du sa strenger er akkurat som char * s, ikke sant?
Så hvorfor ikke vi frigjøre strenger?
>> SPEAKER 1: Du bare til gratis hvis du mallocing.
PUBLIKUM: Oh, hvis du mallocing.
SPEAKER 1: Så malloc og fri er to ting
at du alltid bør ha sammen.
f åpne, f tett, to ting du bør ha sammen.
I begge disse tilfellene, se etter null.
Ja.
>> PUBLIKUM: Så gratis er bare tillater noe annet
skal lagres der etter dette programmet har brukt det?
>> SPEAKER 1: Det er bare å si: OK, jeg er ferdig med dette.
Du trenger ikke å holde den rundt.
Ellers datamaskinen vil akkurat som prøver og holde den der.
Og så can't-- det går inn minneproblemer senere.
Du ønsker alltid å frigjøre det fordi det forteller datamaskinen, OK, jeg er
ferdig med dette stedet i minnet.
Du kan ha den tilbake for meg å bruke senere.
Cool?
Ja.
>> PUBLIKUM: Så vi brukte% d bare fordi en dobbel som kommer tilbake,
eller hvorfor er-- [uhørbart].
>> PUBLIKUM: Kan du bruke% i?
>> SPEAKER 1: Du kan bruke% i.
Noen siste minutt spørsmål?
Gå fremover.
PUBLIKUM: Jeg har bare en rask spørsmål.
Så ptr variabel, that's-- aktig, med int * ptr = malloc,
det er bare å si det er peker til et sted i memory--
SPEAKER 1: Ønsker du [uhørbart]?
PUBLIKUM: --that er størrelse of-- nei, det er OK.
Men det er bare å peke på et sted i minne som er akkurat som fire byte.
SPEAKER 1: Høyre.
Så malloc størrelsen på int sier OK, jeg kommer til å gå løpe vekk,
finne fire byte med minne for deg.
Når den finner at fire bytes minne, det
gir deg tilbake den adressen av hvor den starter,
og det er det lagret i pekeren, eller ptr.
Good.
Dere ser mindre forvirret enn de fleste folk når jeg snakker om pekeren,
så jeg føler meg ganske bra akkurat nå.
>> OK.
Som alltid bør dere ha alle fått dine pset2 karakterer nå.
Jeg vet det har vært noen wonky ting der det står, formel ikke gyldig
eller noe.
Hvis du får det, alle karakterene dine er gyldige på min side.
Så jeg kan sende deg skjermbilder av dine karakterer.
Bare gi meg beskjed så godt hvis du er mangler noen karakterer eller noe
ser ikke ut til å gi mening.
Kom til meg.
>> Jeg har vært super stolt av deg gutta allerede, så fortsett med det.
Og har en god resten av uken.
Jeg er sikker på at jeg vil se noen av dere i kontortiden.