>> [Musikken afspilles]
>> Davin: Okay, gutter.
Så dette er gennemgangen for den første quiz.
Er alle klar til quiz på onsdag?
ALLISON: Woo!
STUDENT: Woo!
Davin: Ja.
ALLISON: Yeah!
Davin: Den fyr er klar.
Denne fyr, to hænder, nice.
Så quiz gennemgang i dag, går det til at være omkring en time og en halv.
Vi kommer til at gå over alle de store begreber, du bør vide for quizzen.
Vi kommer til at gå over nogle kodning af hånd eksempler, som på hver quiz.
Og hvis du har spørgsmål, er du velkommen at hæve din hånd og alt
som.
Well, logistik omkring quizzen er online.
Så vi kommer til at opdele folk op i forskellige rum.
Det er baseret på deres navn.
Så hvis du har spørgsmål om, hvor at gå eller om, hvad materialet er, ligesom,
den officielle ord på, hvad der foregår at være på den quiz, tjekke online.
Og det er alt ajour.
Så hvis der er nogen spørgsmål til begynde med, vi kommer til at starte.
Og her er Allison.
>> [Klapper]
>> ALLISON: OK, tak, Rob.
Sætter pris på det.
Davin skulle have vendt til dette.
Det er den ikke-udtømmende liste over emner, som altid, som Davin lige sagde.
Se dokumentationen online om quiz nul.
Men dette er temmelig much-- det er på pensum
er alt, hvad vi har gået over hidtil.
Alt her er fair spil, samt noget andet
der kan have været nævnt i foredraget.
>> Min sektion, her, er bare en masse gennemgang.
Der er et par øvelser At du fyre kan arbejde på.
Men for det meste, vi virkelig ønsker at komme til Davin med de kode
ved hånden øvelser.
>> Så jeg vil til at flyve gennem dette.
Hvis du har spørgsmål, stoppe mig.
Løft din hånd.
Jeg lover jeg vil sandsynligvis se dig.
Hvis ikke, bare vinke den rundt.
Jeg har tænkt mig at tale hurtigt.
Jeg håber, at alle er OK med det.
>> OK, særligt ord, Davin tydeligvis glemte at bladre gennem disse dias.
[Griner] Du er i problemer, mand.
Så tips til quiz nul, øve kodning på papir.
Du fyre kommer til at få nogle øve med det nu med Davin,
så vil du ikke være helt af dig selv.
Jeg tror, ​​vi er faktisk i gang gennem disse to funktioner.
Så vil du være godt forberedt der.
>> Være fortrolig med dit problem sæt.
Der har været spørgsmål på tidligere quizzer
der vil bede dig, for eksempel, til at kode op noget meget ligner Mario.
Så bliver meget fortrolig med Deres problem sæt, samt
som de spørgsmål, beder vi dig i begyndelsen på formularen
at du udfylder, vil tjene dig meget godt.
>> Har en tidligere quiz under tidspresset.
Disse quizzer er lange.
Tiden går virkelig hurtigt.
Og ofte, behøver du ikke klar over, hvordan hurtigt det går indtil du rent faktisk
sætte dig selv under disse begrænsninger.
Så hvis du kan bare skære ud, du ved, 75 minutter enten i aften eller i morgen
at tage en af ​​disse quizzer under det, vil du være i langt bedre form.
>> Og også skabe din reference ark.
Husk, du får en side foran og bagpå
som reference for din quiz på onsdag.
Oprettelse af det er en fantastisk måde at studere.
Alt, hvad der du har problemer med du ønsker at inkludere på der.
Alt, hvad der dine TF'er har været, ligesom, det er virkelig vigtigt.
Du skal vide dette, er måske ting, du har på der
hvis du ikke har dem i hukommelsen.
Selv hvis du kender dem virkelig godt, nogle gange at have det på, at der
er bare form for komfort for dig, som jeg kender quizzer er stressende.
Så nogen trøst får du kan hjælpe.
Okay, også få søvn og spise og kan lide de normale ting
at vi fortæller jer for quizzer.
>> Så starter ud let, datatyper og størrelser.
Som jeg sagde, er det bare at gå at mig at smide en masse ting
op her, at du bør vide.
Så vi har vores chars der er én byte, int'er
der er fire bytes, lang lang, hvilket er otte bytes.
Dybest set, det er bare dig ønsker at holde større heltal.
Flydere, som er fire, doubler, som er otte.
Igen giver bare dig mere plads til dine flåd.
Og skriv derefter stjerne, så enhver pointer på en 32-bit maskine,
som er alle du fyre skal at vide, er fire bytes.
>> Så alt i alt bør du kender, måske ting
du ønsker at have på din reference ark.
OK, binær konvertering til binær, konvertering
til hexadecimal, frem og tilbage, alle ting, du bør vide.
Så fra binær til decimal.
Du fyre ønsker at tage en hurtig minut og forsøge at finde ud hver af disse
og så fortælle mig, hvad de er?
>> Jeg har også slik i min taske, så alle der besvarer får slik, ved den måde.
Og jeg har masser af det.
Lad mig få fat i dette.
Jeg har tænkt mig at give denne til Gabe.
Så du kan uddele slik til hvem er rart og samarbejdsvillig.
>> OK, så jeg en hånd der i ryggen.
>> STUDENT: Ja, den første er 42.
>> ALLISON: Ja, første er 42, korrekt.
STUDENT: [uhørligt].
[Latter]
ALLISON: Second én, der tilbage i gul?
STUDENT: 110010.
ALLISON: Korrekt, og dette sidste, hernede på bunden?
Også, ja, kender du?
Bare smide slik.
Hvordan omkring slik for alle?
>> STUDENT: [uhørligt], når vi er færdig.
>> ALLISON: Shh.
Og så den sidste.
Hvem ønsker at svare?
Lige der.
>> STUDENT: 11100.
>> ALLISON: 11100, se på det.
Tillykke, stort stykke arbejde, alle sammen.
OK, alle slags forstå processen for at gøre dette?
Du har, går fra binær til decimal den måde, jeg har tendens til at gøre det, er at skrive ud
beføjelser 2.
Så jeg siger, OK, 0 gange 2-0, så der er 0, 1 gange 2 til den første,
er 2 går frem på den måde.
Er der nogen der vil have mig til eksplicit gå gennem et eksempel på binær?
OK, cool.
>> Decimal til binær er meget ens.
Jeg har tendens til at skrive ud beføjelser 2.
Start med en, der er den største, men ikke gå forbi decimal
at du leder efter.
Og så slags arbejde din vej baglæns addere ting som nødvendigt.
>> Og derefter med Derudover er det ligesom normal tilsætning.
Hvis du nogensinde får det tilfælde, hvor du er tilføje to 1s, det naturligvis bliver 2.
2 i binær er nu 1 0, så du har brug for at bære din 1 ind i den næste kolonne.
Cool.
>> Hexadecimal, kan dette være noget der er lidt mindre velkendt.
Så som Rob lige fortalte mig forhånd, hans trick for dette
er bare at splitte det op i fire byte bidder, OK?
Bits, beklager.
See?
Tak Rob.
Det er derfor, du er her. [NOISE] OK, så vi bare bryde det op
i fire bits bidder.
Så med binære filer til hexadecimal, vi ser på de første 4,
som er, hvis vi har fire 1s i en række, hvilket nummer betyder det symboliserer?
>> STUDENT: F.
>> ALLISON: Så i dette tilfælde, hvad er 11111111 eller-- ja?
STUDENT: FF.
ALLISON: Perfekt, FF.
Så stor, slik for dig.
Nu, for hvordan hexadecimal til binær, vi bare tænke på den slags i bakgear.
For hvert tal eller bogstav, der vi har i vores hexadecimal,
blot konvertere det til sine fire bit [Griner] til dets fire bit konvertering.
Så 5, i dette tilfælde, hvad er 5, hvis vi repræsenterer det med fire bit?
>> STUDENT: 010?
Mm-hm.
Og derefter A, som er faktisk 10, ville være?
1010.
Så vi har det her.
Så konvertering mellem hexadecimal og binær er faktisk ikke så slemt.
Hvis man ser på det i fire bit bidder, bliver gyldne.
Everyone-- ja?
>> ROB: Dette er fjollet, men jeg altid huske
A, da A er meningen at være 10.
Og binær er bare 10 10, so--
>> ALLISON: Ah, der vi gå.
>> ROB: Hey.
>> ALLISON: Hey, slik til Rob.
Der er ikke-chokolade ting derinde.
Så du kan have nogle.
Så ASCII matematik.
Opfører sig.
Så ASCII matematik, som du fyre sandsynligvis godt huske
p sæt 2 med Visioneer og Caesar, du gjorde en masse af dette.
Husk, at tegnene er fundamentalt bare tal.
Så vi kan lave matematik med dem, ligesom vi gør matematik med int'er.
>> Så vi har bare en lille smule simpel ting her.
Vi har nogle i A, som er initialiseres til 65.
Og B svarende til ASCII værdien af ​​A plus 1, char C svarende til D minus 1,
og char D lig med 68.
Så vi kommer til at udskrive alle dem, som vi ser her.
Og kan nogen fortælle mig hvad det vil udskrive?
STUDENT: [uhørligt].
ALLISON: Præcis, så én ting at bemærke er
at vi udskriver ud tegn hver gang, her.
Vi udpegning selvom A og B er ints når vi erklærede dem ovenfor.
Vi udskriver dem som tegn ved procent C og vores printf erklæring,
så de vil alle udskrive som tegn.
Og selvfølgelig ASCII værdien 65 vilje udskrives som A. ASCII værdien af ​​A plus 1
ville være 66, hvilket ville stolt til B. Så i virkeligheden, vi
få A B C D Alle godt der?
Eventuelle spørgsmål?
Awesome.
>> OK, omfang.
Så rækkevidde er naturligvis en meget vigtige ting at forstå, her.
En masse af jer, hvis I har kompilering fejl,
og det siger du ikke har adgang til nogle variable,
er det sandsynligvis fordi du defineret det i en løkke
og derefter forsøgte at få adgang til det ud af det, eller visa versa.
>> Så rækkevidde på sin kerne, det blot bestemmer, hvor
vi sige en variabel findes, hvor vi kan ændre det, hvor vi kan få adgang til det.
Det er bare lidt at sige disse er de eneste steder, hvor du har adgang
til denne variabel.
>> Så de to anvendelsesområder, som vi taler om under klasse er globalt og lokalt.
Så globale variabler vi taler om når du definerer dem over main.
Det betyder, at hele din program har adgang til det,
og det eksisterer, så længe som programmet kører, OK?
Lokalt betyder, at det er mere begrænset til et område.
Så når du har specifikke funktioner ligesom swap, vi taler altid om.
Vi taler altid om swap med A og B. A og B findes i denne funktion.
De findes ikke andre steder.
>> Samt, når du har, hvis erklæringer eller efter sløjfer.
Når vi for eksempel i en for-løkke, vi har int jeg lig 0.
Vi har nogle tilstand, og vi opdatere den.
I eksisterer kun inden for seler i denne for-løkke.
Hvis du forsøger at få adgang til det andre steder, din compiler ville råbe på dig.
Det ville være ligesom, hvad er du prøver at gøre?
Dette findes ikke.
Så det er de to forskellige typer af rækkevidde.
Giver det mening for alle?
>> Så for eksempel her, det er blot nogle enkle program.
Hvad tror du fyre tror er kommer til at ske på hvert punkt
at vi forsøger at udskrive?
Så denne ene her, hvad der kommer til at ske?
STUDENT: Det vil udskrive tre.
ALLISON: Right.
Det vil tre udskrive.
Hvad med her?
STUDENT: Det vil ikke fungere.
ALLISON: Det vil ikke fungere.
Du er ude af rækkevidde, right?
Lokal variabel ikke findes uden for disse seler, okay?
Og hvad så om her?
>> STUDENT: [uhørligt].
>> ALLISON: Hvad?
Rob, gå.
>> ROB: Jeg har lige sagt.
Globale variabler bør være global understreg variabel.
>> ALLISON: Ak ja, undskyld.
Tak, Rob.
Robs ligesom vores bopæl compiler.
Han vil bare råbe på os, når vi har brug for det. [Griner] Ja, det
bør være global understregning variabel.
Så under forudsætning af, at der var global understreg
variabel, hvad der kommer til at ske her?
STUDENT: Det vil fungere.
ALLISON: Det vil virke.
Så det vil printe, så bare et meget simpelt eksempel.
OK, prototyper.
Så selvfølgelig, vi virkelig understrege for jer
at gøre funktioner, hvis det give mening i dine programmer.
Men selvfølgelig, når du lave dine egne funktioner,
typisk vil du definere dem efter main.
Og du vil forsøge at ringe til dem i main.
Og hvis du ikke bruger en prototype, din compiler vil råbe på dig.
>> Prototype er dybest set bare fortælle din compiler
at jeg har denne funktion under main.
Jeg har tænkt mig at kalde det, før jeg definere det.
Bare holde på.
Jeg lover, at det er defineret, og du vil have alt det, du har brug for.
>> Så den måde, vi gør det er bare dit afkast type din funktion navn, dit input
listen.
Det er dybest set den første linje af din funktion erklæring.
Det er virkelig alt, hvad det er.
Men dette er blot en generelle form for format.
>> Så i vores eksempel her, som du fyre bør
har set i afsnit på et tidspunkt, har vi
nogle int kube, tager nogle int af input.
Og vi har vores vigtigste funktion, hvilket kræver terning.
Og terning er defineret efter den kendsgerning.
>> Så hvis vi ikke har int terning input i toppen, når vi kaldes terning
inden vigtigste, vores compiler ville blive vred på os.
Det ville være ligesom, hvad taler du om?
Cube findes ikke.
Jeg ved ikke, hvad du beder om.
Og jeg bare stop.
>> Men fordi vi gjorde vores prototype øverst, har vi sagt,
du ved, når du ser terning, skal du ikke bekymre dig om det.
Jeg lover det er defineret senere.
Og det vil lade dig gøre hvad du vil.
Så hvis du nogensinde har en funktion der er erklæret efter du kalder det
for første gang, skal du har det prototype på toppen.
>> Ja?
>> ROB: Det er kvadreret, ikke cubing.
>> ALLISON: Åh min Gud.
Jeg har ikke have-- Gabe, tænkte jeg du var vores korrekturlæser.
OK gutter, bære over med mig, her.
Jeg håber, at alle er ved at blive ideen.
OK, så det bør have hugget, ikke kubik.
Men ideen forbliver den samme.
Enhver funktion, som vi kalder efter det faktum, bør have en prototype.
Alle godt med det?
Enhver anden slåfejl?
OK.
Eventuelle stavefejl her, før vi starter, Rob?
[Griner] OK, så structs.
Dybest set, structs giver dig at oprette din egen datatype.
Så meget som en int eller en char eller en float, det er bare en anden type.
Jeg kan lide at tænke på det som, ligesom, oprette din egen datatype.
Så det giver dig mulighed for at gøre det.
Og det besidder forskellige typer af data.
>> Så hvis du husker, i et array, vi kan kun holde ting af lignende type.
Structs tillade os at holde multiple ting af forskellige typer.
Så i dette tilfælde her, vi har en struct kaldet Student,
nævnes her nederst.
Og vi har nogle int id og nogle string navn.
Så dette er blot en anden datatype.
Vi har nu en datatype kaldet Student.
>> Så fordi vi kan tænke på det som blot endnu datatype,
vi kan erklære variabler som vi ville enhver anden.
Så i stedet for bare at have, ligesom en int student, vi bare have en elev,
studerende 1.
Åh, se.
Det er Rob.
Så her er vi erklære en struct eller en variabel
kaldet student 1 af typen studerende.
Så det kommer til at have id og navn forbundet med den.
>> Og den måde, vi få adgang til disse elementer i vores struct
er med dot operatør, her.
Så i dette tilfælde, vi erklærede nogle studerende 1.
Vi tildelt ID til at være 1.
Og vi tildelt navnet til at være Rob.
OK, alle godt med det?
Brug det bare like-- ja?
>> STUDENT: Ja, typedef-- når har vi brug for at bruge typedef?
>> ALLISON: Så typedef bare siger at-- Rob, du
kan korrigere mig om dette, hvis jeg er wrong-- men typedef er bare faktisk erklære
det som en type, som du kan bruge, right?
>> ROB: Ja, det er dybest set, så det er bare at skabe
et alias, eller et kaldenavn for en type.
Så du kan skrive, at [uhørligt].
Så [uhørligt] findes, og nu skal vi bare have
[Uhørligt] betyder nøjagtig det samme.
Og så her, vi har skrevet, tror jeg, nogle struct type 2 [uhørligt].
Så det er bare et kaldenavn for en given type.
>> STUDENT: String [uhørligt] bibliotek blev skrevet op ligesom char stjerne.
>> ALLISON: Til vores formål her, hvis du erklære en struct,
bare gøre typedef struct.
OK, så på forhånd, er dette bare en normal variabel her.
Vi adgang til det med en prik.
hvis vi har en pointer til en struct, kan vi faktisk
bruge en pil, som er temmelig cool.
>> Så i dette tilfælde, har vi en pointer til en elev 1, der er af typen studerende.
Husk, med din pointer konstruktion,
du ønsker uanset skrive dit pointer peger på at være i begyndelsen.
Så vi har nogle studerende 1, her.
Og da denne elev 1 er nu en spids,
vi kan faktisk gå student 1 arrow navn i stedet for dot, fordi det er en pointer,
og tildele Rob.
Og nu, hvis vi ønsker at ændre Rob til Davin,
Dette er blot viser dig en anden måde at gøre det.
>> Så i stedet for at bruge pilen, du kan also-- Jeg vil afslutte dette og derefter
tage at question-- du kunne også gøre henvisningen studerende 1.
Det siger ligesom gå til hvad der er på student 1, som
ville være vores studerende struct.
Adgang til det med en prik og elementet som du ønsker, og derefter overflytte det.
Der var et spørgsmål.
STUDENT: Ja, så hvordan kommer du har at bruge [uhørligt], når du er
gør student stjerne uden [Uhørligt] elev?
ALLISON: Fordi dette skaber en pointer.
ROB: Vi kommer til at tale om det.
ALLISON: Vi kommer til at tale om det senere i gennemgangen.
Så bare holde på den tanke.
Hvis det stadig generer dig på ende, kommer tale med en af ​​os.
>> Så disse gør præcis det samme.
Vi er lige vise jer to forskellige måder at gøre det.
Elev 1 er nu en pegepind, så du kan få adgang til Name element
i struct med en pil.
Eller du kan dereference markøren, og derefter få adgang til det, som du normalt ville.
Er det fornuftigt at hver enkelt?
Hvis hele pointer tingene lidt forvirrende, vil Gabe tale om det,
og så måske dette vil give mere mening.
Ja?
>> STUDENT: Ja, så hvordan er denne forskellig fra?
ALLISON: Den tidligere ene?
Så eleven 1 i dette sagen er ikke en pegepind.
Det er bare din faktiske struct.
>> STUDENT: OK.
>> ALLISON: denne ene er en pointer til en struct.
>> STUDENT: OK, men gør den slags ender med at arbejde det samme [uhørligt].
>> ALLISON: Det effektivt fungerer på samme.
Din syntaks er bare anderledes.
STUDENT: OK.
>> ALLISON: Ja, de er i virkeligheden det samme.
Det er bare afhængig af kontekst, kan du ene over den anden.
Ja?
>> STUDENT: Når du gør henvisninger til 1--
ALLISON: Mm-hm?
STUDENT: Hvorfor gør du har parentes?
ALLISON: Fordi student 1 er markøren.
Så du skal sørge for, at du er bare dereferere markøren.
>> STUDENT: OK.
>> ALLISON: Så i dette tilfælde her, parenteserne omkring det
betyder, at du dereferere studerende 1.
Så du vil, hvor studerende 1 point, hvilket er din struct.
Så nu kan du tænke af det som struct,
så vi kan bruge vores normale dot drift.
Andre spørgsmål?
Cool, awesome.
>> Så sidste ting, tror jeg er min sidste slide, woo!
OK, så floating point unøjagtighed.
Vi talte kort om dette under foredraget.
Dybest set har vi uendeligt mange reelle tal.
Og hvis nogen af ​​jer elsker matematik, der er
alle mulige fede ting med os.
>> Men der er uendeligt mange reelle tal.
Men de er kun begrænset mange bits, vi har.
Så du vil altid har unøjagtighed, er alt.
Og det er det er bare sådan som noget, du bør vide.
At ligesom vi kan spørge dig, hvorfor gør floating point Unøjagtighed eksisterer?
Så bare noget, du bør vide.
Og med det, jeg vender det til pegepinde.
>> Binky: Hej, gutter.
Mit navn er Binky.
Jeg har tænkt mig at tale om pointere.
Yeah, så pointers er faktisk min favorit del i dette kursus.
Så bare for at gøre det klart, hvad Allison talte om her, så grunden
why-- den eneste forskel her, den store forskel var den måde
vi erklærer ting.
Så studerende stjerne betyder er en pointer til en elev.
Hvorimod dias før, studerende er en faktiske struct, ligesom en egentlig studerende,
indeholder nogen af ​​disse ting.
>> Og grunden til at vi ønsker at-- ja, Davin?
>> Davin: Hvad betyder pilen betyde?
>> Binky: Pilen midler nøjagtigt det samme som dette.
Så du behøver ikke virkelig har brug for pilen.
Ligesom, hvis du kun program i C, kan du bare bruge dette.
Undskyld, jeg gør ikke, hvad det er.
Du kan bare bruge denne syntaks.
>> Men nogle mennesker, når de designe C,
de regnede med, at folk anvendt denne syntaks så meget,
at de vil kunne lide lige kommet op med en syntaks struktur for det.
Og dette fandt sted i i form af denne pil.
Og det er virkelig rart, fordi det symboliserer noget
ligesom vi faktisk efter denne pil, denne pointer,
mod noget plads i hukommelsen.
Og når vi får der, vi ønsker at se til navnet på den pågældende elev,
hvis det giver mening.
OK?
>> Så dette er nøjagtig det samme.
Det er præcis det samme som dette.
De bliver kompileret nøjagtig det samme, OK?
Og grunden her hvorfor vi malloc noget, er fordi der i dette tilfælde,
vores variabel er faktisk blot en pointer variabel.
Så vi kun har nogle plads i hukommelse, der er i besiddelse af en pointer.
Vi har ikke rigtig har nogen plads der holder den faktiske struct.
>> Så dette skal gøres i to trin.
Vi er nødt til at skabe den hukommelse at sætte struct i.
Og vi er nødt til at skabe den hukommelse til at sætte markøren i.
Så de er dybest set to forskellige variabler, her.
En af dem er af typen studerende, bortset fra at det ikke rigtig har et navn.
Og den anden er af typen studerende stjerne.
Og så student 1 point der, hvis det giver mening.
OK?
>> Så grunden til, at vi bruger pejlemærker er fordi alt
i en computer, hver variabel i en computer har to ting.
Det har sin værdi.
Og det har sin adresse.
Og en god måde at konceptualisere dette er der er
mange problemer, når du prøv at bruge funktioner.
Og vi vil forsøge at se på en af ​​dem.
Nemlig, det kommer til at tænke på hukommelsen som kasser.
>> Du har altid tænkt på variabler når du siger na lig 5.
Du tror at sætte 5 ind i en kasse.
Så hvad nu hvis du ønsker at videregive at int i en funktion?
Du skal bare pass-- jeg ikke know-- x i en funktion.
Men hvad der sker, er normalt som mennesker, du
ville tænke noget som jeg er at føre boksen til en person.
Og det gør ikke rigtig ske i computere.
Hvad der sker, er du kopierer værdien af boksen til den person æske.
>> Så hvad jeg prøver at sige er, at hvis du har en function-- sorry-- her,
hvis vi har en funktion som til fem op der, hvis du forsøger at passere en variabel,
det bare at gå til at kopiere.
Hvis en initialiseringsmenu nx lig med 3, går det at kopiere denne værdi op til variablen a
deroppe.
OK, og dette er slags grunden hvorfor vi ønsker at bruge pointere.
Fordi i stedet for giver blot værdien,
i stedet for blot passerer bare værdien til en funktion,
vi ønsker at passere ved reference.
Hvad vi kalder pasning af henvisning er venlig give boksen til funktion,
så funktionen kan også ændre værdierne i denne boks.
>> OK, så bare nogle grundlæggende pointer ting er at skabe pegepinde,
du bare erklære det en type, og du sætte en stjerne lige efter det.
Og typen er lige hvad du peger på.
Så hvis det er en int stjerne, du peger på en int.
Hvis det er en char stjerne, du peger på et diagram.
Og hvis det er en student stjerne, du peger på en elev.
OK?
>> Og de er alle 4 bytes lange.
Fordi denne variabel det faktisk ikke
nødt til at holde en char, en int, eller en studerende.
Det behøver kun at holde en adresse.
Det er derfor, de er alle 4 bytes længe i en normal 32-bit maskine.
OK?
Så her, x er en variabel, der peger til en int. y peger på en char. z punkter
til en svømmer.
Eventuelle spørgsmål her?
Cool.
Og der er to forskellige symboler de har
at huske på, når kommer til markøren.
Så refererer og dereferere er de store.
Så tegnet af variabelnavn giver dig?
STUDENT: Adresse.
Binky: Adresse.
Så hvis du erklærer int a lig med 5, og derefter tegnet
af en vil give dig adressen.
Og du kan faktisk prøve at printe og se
hvilken adresse i hukommelsen din variabel har.
Og så dereferencing-- så var henvisninger,
få address-- dereferere er det stik modsatte.
OK, ligesom tider er modsatte af en division,
stjerne er det modsatte af tegnet.
Så dereferere midler derned.
Så hvis du giver star-- jeg ikke know-- 50, der er
vil forsøge at gå til adresse nummer 50 indersiden af ​​din computer.
OK, og hvorfor ser vi at de er modsætninger?
For hvad sker der, hvis du gør noget lignende stjerne Ampersand en?
Nå, tegnet en giver dig adressen af en variabel, adressen på en.
Men stjerne betyder derned.
>> Så hvad sker der, hvis du gå til adressen på en?
Du skal bare komme til en, right?
Så gå til adressen på a er det samme som en.
Det er derfor, de er som regel henvist til same-- dette
og dette omtales som modsatte aktører.
OK?
Så cool.
>> Under hætten, for eksempel, hvis vi erklære int x lig 5,
vi har en variabel.
Og husk, at jeg sagde hver variable-- og dette er en god ting
at holde mind-- det har to forskellige ting forbundet med.
Det har en behandlet, og en værdi.
OK?
>> Så værdien i dette tilfælde er 5.
Og adressen is-- lad os sige, jeg er lave noget up-- det er 0x04.
Og den eneste grund til, at vi normalt repræsenterer adresser i hexadecimal
er én, fordi det er ligesom god.
Det går godt med binær.
Det er nemt at konvertere til og fra binær.
Og det ikke bliver for store, hvis du har en meget stor antal.
Så vi kan lide at bruge hexadecimal i trykning adresser.
Men jeg kunne repræsentere dette som et heltal.
Det er fint.
>> Og så det har en adresse 4 og en værdi på 5.
Og så sagde jeg int stjerne pointer.
Så dette er en anden type, varsel.
Int stjerne pointer lig adressen af ​​x.
Så, hvad der vil være værdien af ​​PTR?
Det kommer til at være den adresse x, hernede.
OK, så værdien kommer til at være den samme som adressen.
Det er den opgave betjene jeg laver.
Og så PTR vil have sin egen adresse, som viser sig,
i dette tilfælde 8, OK?
>> Og så vil jeg oprette en ny heltal kopi.
Og jeg siger int kopi lig derned.
Så gå til hvad PTR peger på.
Nå, hvad denne PTR have?
PTR har 0x04.
Hvad sker der, hvis jeg forsøger at gå der?
Jeg vil finde den fyr, der har adresse x og som har adresse 4.
Og hvem har fat fire er x.
Giver det mening?
Ja?
>> STUDENT: I ​​dette tilfælde er markøren i en stak?
>> Binky: I dette tilfælde, it's-- godt spørgsmål.
Jeg har ikke rigtig tænke over dette når du foretager op disse adresser.
Men hvis dette er, ligesom alle disse er lokale variable,
så er X kommer til at leve in-- alt kommer til at leve i stakken.
Så alt går at pege at stable.
Du skal kun komme til bunke når du begynder at bruge malloc, right?
>> Så hvis du husker stakken er hver gang du kalder en funktion i dit program,
lignende, vigtigste for eksempel, eller en hvilken som helst anden funktion, ligesom printf.
Alle de lokale variable er kommer til at blive sat i en stabel ramme.
Og de kommer til at få som stablet op i stakken.
Det er, hvad der kaldes en stak.
Og alle de lokale variable kommer til at være der.
Og heap-- og vi vil at tale mere om dette later--
den bunke er hvor alle dynamisk allokeret hukommelse liv.
Cool?
>> Vi gå til dette dias.
Ja?
>> STUDENT: Hvorfor er ikke int kopi returnering 0x04?
>> Binky: Hvorfor er ikke int kopi returnering 0x04?
>> STUDENT: Hvorfor er det ikke [uhørligt]?
>> Binky: For hvad er en værdi af PTR?
>> STUDENT: 0x04.
>> Binky: 0x04.
Hvad sker der, hvis du går til 0x04?
Hvad får du?
>> STUDENT: Åh, OK.
Binky: Du ser?
STUDENT: Ja.
Binky: Så du får 5.
Så kopi vil have 5, hvis det giver mening.
Ja?
>> STUDENT: Kunne vi have fået 5 i værdi feltet [uhørligt]
hvis vi sætter int kopierer [uhørligt].
>> Binky: Int-- vi ville, ja.
Det ville have gjort temmelig de samme ting.
Men på denne måde, kan vi passere adresse til funktioner.
Og det er det cool ting vi kommer til at gøre lige nu.
>> Så denne form for motion altid kommer op on-- meget normalt kommer op på quizzer.
Så det er virkelig godt at forsøge at gøre den slags ting selv.
Så prøv at holde styr på, hvad adressen er og vil værdierne af de variable
er i hvert punkt.
Så det er præcis hvad vi skal gøre.
Her har vi trin et, to, tre, fire, fem.
En, to, tre, fire, fem.
Og vi kommer til at holde styr af værdierne af x og a.
>> Så hvad det gør, hvis dette er et buggy kode, vi forsøger at gøre til fem.
Så vi forsøger at få i en variabel og ændre værdien til 5.
Og husk min analogi for at have en Box og rakte boksen til nogen?
Så main har denne boks kaldet x.
Og det indeholder værdien 3.
Og jeg forsøger at aflevere dette felt for til fem.
>> Og jeg vil gerne fem til at ændre værdien af ​​denne boks til 5.
Og så vil jeg bare udskrive værdien af ​​x.
Dette er, hvad min function-- dette er, hvad jeg forsøger at gøre.
Jeg forsøger bare at opdatere værdien af ​​x til 5.
Er det klart, hvad funktionen gør?
>> OK, så hvad vil være den værdierne af x og en ret her,
den første linje, lige før den første line-- Jeg vil say-- af programmet?
>> STUDENT: Sandsynligvis skrald.
>> Binky: Just skrald stuff.
Så jeg bare sætte N / A. Så vi ikke rigtig kender.
Ligesom, gør en ikke engang eksisterer endnu, fordi vi ikke har kaldt til fem.
Int a er ikke erklæret.
Og x vil eksistere her, men vi har ikke rigtig
tildelt nogen værdi til det, så OK?
>> Og så, hvad der vil være den værdier af x og en i nummer to?
>> STUDENT: [uhørligt].
>> Binky: Så x vil være 3.
Det er nemt, fordi vi tildele 3 til det.
Og en endnu ikke eksisterer fordi en blot bor i til fem.
Så jeg har tænkt mig at have 3 og ingenting.
eller lignende skrald, uanset, egentlig ikke defineret.
Og nu, det er det vigtige linje.
Her vil vi faktisk kalde til fem.
Og huske, hvad jeg sagde.
Vi har aldrig passere i kassen.
Vi skal bare kopiere værdien af boksen til en anden kasse.
Det er alle computere har, kopiere ting fra ét sted til et andet.
>> Så til fem, hvad det faktisk gør er den kopierer værdien af ​​x til en.
Så, hvad der vil være her?
Værdierne af x og a.
3 og 3, vil vi bare kopiere det over fra x til en.
Cool.
>> Nu er vi her.
Og nu vil vi at opdatere et lig 5.
Hvad kommer til at ske på linje fire?
>> STUDENT: [uhørligt].
>> Binky: a bliver opdateret, men x ikke bliver opdateret.
Fordi x stadig bor i main, det er en helt anden blok af hukommelse.
Det er en anden variabel.
a er en anden variabel.
De tilfældigvis har den samme værdi, fordi jeg
kopieret over værdien af ​​x til en.
Men nu når jeg gør et lig 5, det ikke rigtig påvirke x på nogen måde.
Dette er den tricky del.
Giver det mening for alle?
Ja?
STUDENT: Endnu et spørgsmål, har du 3.
Hvorfor er en already-- åh, nej, det er 3.
Beklager, pyt.
Jeg læste 5.
>> Binky: Ja, 3, 3.
>> STUDENT: [uhørligt], ja.
Binky: Og så skal vi tildele 5 til en, men ikke virkelig ændre x.
Godt?
STUDENT: Ja.
Binky: Ja?
Kan du forklare igen hvordan a bliver kopieret [uhørligt]?
>> Binky: OK, så når du ringer til fem af x, og denne linje af kode.
til fem af x, hvad er x?
x er kun 3 på dette tidspunkt, right?
Så du kan bare tænke på at sætte en 3 i her og glemme alt om x.
Bare sætte en 3 her.
Ligesom, vi kommer til at kopiere over værdi af x til int a, der er deroppe.
OK?
>> Så værdien af ​​x er 3.
Vi kommer til at kopiere 3 over til en.
Og alt dette andet blok af hukommelse, denne anden variabel
kaldes en skal 3, samt.
Giver det mening?
Ja?
>> STUDENT: Hvis du giver til fem ligesom have det som heltal x i stedet for en,
ville det ordne alt?
>> Binky: Hvis det er en integer-- nej, der ikke ville ordne alt.
Så det er et meget godt spørgsmål.
Det er virkelig ligegyldigt hvad du kalder disse variabler.
Igen vil det være et spørgsmål om anvendelsesområdet, fordi de ikke er det samme x.
De er fuldstændigt forskellige rum i hukommelsen.
STUDENT: [uhørligt].
Binky: Så det gør ikke rigtig ligegyldigt hvad du kalder dem.
Det betyder ikke fastsætte ting, OK?
Flere spørgsmål?
Ja?
>> STUDENT: Hvordan er det tilbage til nummer fem [uhørligt]?
Binky: OK, har vi ikke gjort det endnu.
Lad os gå til nummer fem, da.
>> STUDENT: [uhørligt]?
>> Binky: Hvad?
>> STUDENT: Har du et afkast på alle?
Binky: Vi har ikke et afkast, ikke af main.
Men vigtigste returnerer 0 automatisk Hvis du ikke returnerer noget.
Ja?
>> STUDENT: Kan du gøre main-- eller kan du gøre til fem tilbagevenden a?
>> Binky: Vi kunne have til fem returnere en, ja.
Men så ville vi nødt til at tildele x er det afkast værdi til fem,
hvilket ville være en smule andet program.
Det ville fungere.
Men hvad vi ønsker at gøre, er, hvad der er kaldet ændre noget på plads.
Så vi ønsker rent faktisk at ændre den kasse og ikke bekymre sig
om at skulle vende tilbage værdier eller noget.
OK?
>> Det er ligesom swap-funktion David viste i foredrag, medmindre jeg
kun beskæftiger sig med én variabel.
Og han brugte to, så int a og b og derefter midlertidig variabel og whatnot.
OK?
Så hvad er den sidste linje?
Efter at fem afkast, er det blot en kommer til at gå væk.
Vi vil ikke have en længere, og kun x vil stadig leve på.
>> Og gæt hvad? x ikke ændre sin værdi,
trods alt, fordi vi er kun at ændre værdien af ​​a.
Det er derfor x var 3 i hele.
OK?
Godt.
Så dette program ikke opnå, hvad vi ønskede.
Lad os ordne det.
>> Og fix program er ved hjælp af pointere.
Hvad vi gør, er at vi har tre linjer, der er forskellige.
De første er vi ikke passerer x.
Vi passerer adressen på x.
Så i stedet for at kopiere mere end værdien af ​​feltet
Jeg er stadig kommer til at kopiere over noget.
Men jeg kopierer løbet adressen af ​​kassen.
>> Så hvis jeg passerer adressen på den boksen til til fem, derefter til fem
vil være i stand til at finde, at der i hukommelse og ændre dens værdi.
>> Så og så deroppe, jeg har at en ikke er en int længere.
a er en int stjerne.
Det er en pointer til et heltal.
Og så, da jeg passerer den adresse her, og så hvad jeg gør
er ikke lig med 5, fordi en holder en adresse.
Så hvad jeg ønsker at gøre, er at gå der og opdatere indholdet af denne adresse
med 5.
>> OK, så lad os gå igennem alle linier én efter én.
Så når jeg starter her, jeg stadig har N / A, N / A, N / A
for alt i den første linje, fordi jeg har ikke rigtig
erklæret ting endnu.
Og derefter linje to, jeg har x lig med 3.
En int stjerne a ikke eksisterer, samme som før.
>> Nu bliver det interessant.
Så jeg har tænkt mig at passere.
Og lad os antage, at adressen af x er 12 i hexadecimal.
Lad os bare antage dette.
Jeg gjorde det op.
Så hvad skal jeg passerer her er en til fem.
Jeg passerer 12.
>> Så hvad værdi betyder en have?
>> STUDENT: [uhørligt].
>> Binky: Beklager?
>> STUDENT: [uhørligt].
Binky: Ja, ligesom, at lad os antage, at vi er her, nu.
Jeg spørger.
>> STUDENT: [uhørligt].
>> Binky: Det er blevet igangsat.
>> STUDENT: [uhørligt].
Binky: Fordi vi passeret noget til funktionen.
Ja?
>> STUDENT: Adresse af x.
Binky: Det kommer til at har adressen af ​​x.
Og adressen på x er 12, godt.
Så x vil være 3, fordi vi har ikke rigtig ændret sig x endnu.
Og så en vil være 0x12, så adressen på x, fordi det er
hvad vi videre til til fem.
>> Og hvad sker der så hvis vi forsøger at gå der?
Hvad skal vi finde?
Så hvis du prøver at udskrive stjerne en, vi kommer til at følge denne adresse
og få værdien inde.
Og værdien er lige den samme værdi som x
har fordi det er den adresse x, som vil være 3.
Er vi gode?
>> OK, og så nu, vi faktisk derned.
Og vi opdaterer uanset er i denne adresse 12.
Vi gør det 5.
Så nu både x- og stjerne a er 5.
>> Hvorfor er det?
Fordi adressen på x er 12.
Og a har også 12 som sin værdi.
Så hvis vi følger 12, er vi bare at finde x.
Så uanset hvad vi gør med stjerne en kommer til at ske
til x, fordi en indeholder adressen af ​​x.
OK?
>> Og det er ligesom kernen i fix.
Så nu er vi i stand til, fra til fem, faktisk
access memory, der levede i main.
Så denne hukommelse ikke lever i til fem, som før, denne adresse 12.
Og vi var i stand til at gå der og ændre værdien til 5.
>> Og så når vi vender tilbage, vi glemme alt om en.
Vi glemmer stjerne a.
Og x er stadig fem.
Så hvis du ønsker at gennemføre en swap-funktion,
ville du bare gøre præcis de samme ting, medmindre du har brug for at int stjerner her,
og så videre og så videre.
OK?
Er vi gode?
Cool.
>> Så pointer aritmetik.
Dette er en smule vanskelige emne.
Så det viser sig, at pointers er blot heltal.
Du kan tænke på dem som heltal.
Fordi i hukommelsen, du har ligesom hukommelse adresse nul, en, to, tre,
fire, fem.
Så vi kan opsummere hukommelse adresser.
>> Og det er normalt, hvad du gør, når du er i og array, for eksempel.
Et array er ligesom en sammenhængende blok af hukommelse, af partier af tegn,
for eksempel masser af int'er.
Så hvis du ønsker at gå til anden int eller tredje int,
du kan bare opsummere noget til den første adresse, og du vil komme dertil.
Så dette er virkelig nyttigt for.
>> Og de ting til at holde i tankerne, er imidlertid
at det ikke er ligesom normal aritmetik i den forstand,
at hvis du beskæftiger sig med, siger, en int stjerne, og du tilføje 1 til det,
så du ikke kommer at tilføje 1 til den adresse,
du vil tilføje 4 til adressen.
Fordi en int er 4 byte.
>> Så dette er ligesom gå på et array.
Hvis vi har en bred vifte af partier af int'er og så vi forsøger at gå til den anden,
Det er dybest set bare summen af adresse på den første plus 1.
Men der vil ikke være-- bare lad os sige at adressen på den første er 4.
Her, i dette tilfælde.
Og hvis vi opsummere, så dette er, hvad der sker.
Vi har en int.
Int x lig 5.
X har en værdi på 5.
Og vi initialisere denne pointer, int y int stjerne y lig adressen på x.
>> Lad os antage, at adressen på x er 4.
Hvad kommer til at ske nu, hvis jeg sum tilføje 1 til y?
Det kommer til at faktisk sum 4 i stedet for blot en.
Så jeg tilføje et 1, men det faktisk tilsat 4, fordi computerens smart.
Så det kommer til at faktisk tilføje ved I tider størrelsen af ​​den type af markøren.
OK?
>> Så hvis det var en char, for eksempel, Hvis dette var en char stjerne y,
og hvis vi tilsat 1 så ville være 5, fordi char er 1 byte lang.
Godt?
>> Og endelig fik vi til pointere og arrays.
Det viser sig, at hver gang du har at gøre med et array,
du faktisk beskæftiger sig med en pegepind.
Den meget flot begrebsmæssige grund til dette er, at arrays er meget store.
Så husk, at jeg sagde, at hver gang du passerer ting omkring,
du kopiere alt.
Så hvis du har et array det er virkelig, virkelig stor,
du virkelig ikke ønsker at kopiere alt hver gang
du passerer den rundt til en anden funktion, fordi det er bare
massive mængder af arbejde.
Så hvad du skal gøre er bare fortid adressen på den første byte.
Og så funktionen vil have adgang til alle elementer i det array.
Så du har bestået array ved dens adresse, så adressen på den første byte.
>> Så hvis vi erklærer int matrix 3, her, vi kender
hvordan man kan få adgang til den første element ved hjælp af beslag notation.
Hvis du kan huske beslaget notation, matrix beslag 0 er lig med 1.
Nå, ville det være præcis den samme som bare gå der og sætte 1.
OK, er nøjagtig det samme.
Så beslaget notation her vil være den samme som denne linje.
>> Og gæt hvad beslaget notation for opstilling beslag 1 vil være?
Det vil bare være det samme som dette.
Så tilføje en til array.
Flyt en sammen i hukommelsen.
Derned, og sætte en 2.
OK?
Og denne linje er den samme ting.
Vi ønsker at gå til den tredje kasse, så matrix plus 2.
Derned, og sætte en 3.
Så i hukommelsen, hvad er kommer til at ske, er vi er
vil have 1, 2 og 3 som tre elementer i dette array.
>> Vi kunne have gjort dette ved hjælp vores velkendte beslag notation.
Jeg vil bare have jer til at vide at de er de samme ting.
OK, spørgsmål om dette?
Nice.
Nu, jeg har tænkt mig at aflevere det over til Hannah,
>> HANNAH: Yay, Yee-haw.
>> Binky: At tale om hukommelse og artiklen stuff.
[Applaus]
>> HANNAH: Hej, cool, så vi er kommer til at snakke lidt mere
om hukommelse, som vi bare adresseres via pointere.
Så der er to vigtigste dele af hukommelse, som vi er interesseret med.
Vi har stakken, der vokser op i bunden, og bunke, som
går ned fra toppen.
Og stablen vil holde alle vores instansvariabler.
Så hver opkald til en funktion får sin egen lille ramme på stakken.
Så da Gabe nævnte tidligere, hvis vi kalder funktionen igen og igen,
vi kommer til at stable ting op på stakken.
>> Og på samme måde, den bunke, som begynder ved toppen
kommer til at holde alt hukommelse at vi dynamisk tildeles.
Og så vi dynamisk allokere hukommelse,
dette vil komme ned mod bunden.
Par ting at være opmærksom på, når vi bruger stakken og den bunke,
med stakken, hvis vi har for many-- lad os say-- rekursive kald,
og vi kalder en funktion igen, og igen og igen og igen,
og det er at stable op, stabling op, stabling op.
Og det kommer til at gå ned i den bunke.
Vi kommer til at løbe tør for hukommelse.
Det kommer til at forårsage en problem for computeren.
Og det hedder stakken overløb.
Så det er helt sikkert noget, du bør være opmærksom på og forsøge at undgå.
Og den bunke, nødt til at huske ikke at uheld siver hukommelse.
Hver gang du bruger malloc, ikke glemmer at frigøre denne hukommelse.
Ellers vil det bare være på den bunke spildt,
og computeren vil ikke vide, at Det er gratis at bruge denne hukommelse.
Så dem er et par ting at være meget forsigtig med, når
du har at gøre med stakken og den bunke.
Eventuelle spørgsmål med dette?
Awesome.
>> OK, cool.
Så denne type har den samme idé som stack overflow, hvor
vi går ud over grænserne for, hvad hukommelse
er vi formodes at være i stand til at bruge.
Så tage, for eksempel en buffer, eller du kunne bare tænke på det som et array.
Og vi sagde, OK, vil vi skabe denne nice little array.
Det kommer til at være en streng.
Eller det vil gemme tegn.
Og det bare at gå at sige hej.
Og det er ubestemt.
Det er det.
>> Men hvis jeg var nogen onde og ønskede at gøre noget dårligt med dette array, hvad
Jeg kunne gøre, er at forsøge at skrive forbi enden af ​​strengen.
Og som du kan se, hvis Jeg skriver langt nok,
Jeg kan faktisk påvirke afsenderadressen.
Og hvis jeg begynder at påvirke afsenderadressen,
Jeg indflydelse på, hvordan programmet rent faktisk kører.
Og i stedet for at vende tilbage, du ved, en lykkelig streng som hej, jeg
kunne gøre noget dårligt, ligesom at gå til et andet sted på din computer, stadig
hukommelse, ændre det, hvad jeg ønsker at gøre.
Så det er, hvad dette ville se ud er, hvis jeg bare slags fyldte det op
med tilfældig skrald værdi, i dette tilfælde blot en.
Og da jeg faktisk fik til hukommelsen adresse,
Jeg begyndte at fylde det med noget der gjorde, hvad jeg ønskede at gøre.
Eventuelle spørgsmål med buffer overflow?
Awesome, flyvende ret gennem denne stuff.
>> OK, så vi snakkede en masse om pointer med Gabe.
Hvordan får vi rent faktisk får en pointer?
Hvordan får vi en adresse i hukommelsen?
Nå, kan vi bruge denne nice funktionskald malloc, som
kommer til at få et lille stykke af hukommelse,
specifikt i bunke, som vi diskuterede,
og det kommer til at give dig tilbage en pointer til den pågældende adresse i hukommelsen.
Og argumentet om, at vi nødt til at give til malloc
er, hvor meget plads i hukommelsen, vi ønsker.
>> Så du kan se størrelsen i byte.
Lad os sige, for eksempel, eller faktisk, i dette eksempel,
vi afsætter nok plads til 10 heltal.
Så sandsynligvis, hvad vi vil have at sætte her er en matrix af 10 heltal.
Så vi giver den størrelse ints, som vi lærte var, hvor mange bytes?
STUDENT: 4.
HANNAH: 4, smuk, og vi ønsker 10 af dem i en række,
så vi har plads nok til at gemme alle 10 heltal, i dette tilfælde.
Noget super vigtigt, enhver tid du kalder malloc,
du er nødt til at tjekke for null.
Hvis du ikke tjekke for null, godt, malloc, hvis den løber tør for plads
og kan ikke længere give dig nogen mere hukommelse, vil den vende tilbage null.
Så hvis du ikke kontrollere, malloc kan returnere null.
Og derefter, hvis vi forsøger at dereference en null pointer,
vi kommer til at få en segmentering fejl, som vi vil tale om lige nu.
Awesome.
>> OK, spørgsmål med malloc?
Ja?
>> STUDENT: Er tjekker null [Uhørligt] ikke gøre det på den quiz?
>> HANNAH: Sure, var spørgsmålet betyder det matter-- på quizzen,
vil du få point fra, hvis behøver du ikke tjekke for null?
Ja, du vil få point fra hvis du ikke tjekke for null.
Hver gang du kalder malloc, både på quiz og dine psets og i det virkelige liv,
du er nødt til at tjekke for null.
Godt spørgsmål.
>> GABE: Hvad hvis jeg ikke slippe?
HANNAH: Gabe ønsker at vide hvad hvis vi ikke gør fri.
Så vil vi have en hukommelseslækage i vores bunke.
Andre spørgsmål?
Ja?
>> STUDENT: Kan du-- gå over buffer overflow virkelig hurtig igen?
>> HANNAH: Selvfølgelig.
Spørgsmålet var, kan vi gå over buffer overflow virkelig hurtig.
Lad os gå tilbage til de dias.
Så en buffer, kan du bare Tænk på det som et array, right?
Du har noget plads i hukommelsen.
Og når vi først skabe vores array, vi ved arrays har faste størrelse,
eller vores buffer har en fast størrelse.
>> Så lad os sige i denne sag, har vi netop plads nok til at skrive strengen hej.
Hvis vi går forbi den bundne, hvis vi går forbi hvad vores matrix vi sagde, at det kunne holde,
vi kunne faktisk begynde skriftligt i hukommelsen
at computeren ikke vil have os til at skrive ind.
Og specielt hvis vi rammer noget som afkastet
adresse på den funktion, som, som enhver anden del af hukommelsen,
er bare et eller andet sted i din computer, kan du faktisk
ændre det og begynder at gøre onde ting.
Besvare dit spørgsmål?
Awesome, noget andet?
Ja?
>> STUDENT: Så stak [uhørligt], du sagde gå fra bunden går op.
Inden stack rækkevidde, gør hukommelsen gå fra lignende,
top down vedrørende hver pause?
>> HANNAH: Hvordan du-- udskyde til Rob på denne ene.
>> ROB: Den vil vokse i samme retning som stablen vokser.
HANNAH: OK.
ROB: Så jeg bliver forvirret.
Dette vil være abstraktion.
HANNAH: OK.
ROB: Dette er korrekt.
Så hvis stakken vokser op, og derefter generally-- det
behøver ikke at være sådan. men du kan erklære int x.
Så du erklærer int y.
Derefter int x vil generelt være lavere på stakken end int y.
Men det er bare en kendsgerning.
Det er ikke ligesom en vigtig frø ting.
>> ROB: Så spørgsmålet var igen bare hvad der sker hver ramme opbygges.
Så hver funktion får en lille stykke af stablen.
Og som du gå op inden for denne lille stykke, inden for denne ramme,
vil vi sige, at variabler inden for denne ramme også flytte op.
Spørgsmål?
>> ROB: Bare for at være på mic.
HANNAH: Oh, yeah.
ROB: Jeg vil tale ind i dig.
HANNAH: Oh, yeah, OK.
ROB: Undtagelsen er for arrays og structs,
hvor arrays, en lavere indeks i arrayet,
og i structs ved højere felt i structs
er garanteret at være ved lavere adresser end en senere værdi i array.
Så dem er garanteret.
Men nogen særlige variabler i, ligesom int x og y int i en funktion,
der er ingen nødvendig sammenhæng mellem deres adresser.
HANNAH: Et andet spørgsmål herovre?
STUDENT: Så i buffer flow, kun buffer overflow
kun skete, da du har, ligesom, tildeles
en mængde af et array der så er større?
Ligesom, kan du?
Så hvis du beder om noget fra user--
>> HANNAH: Mm-hm.
STUDENT: Kan de med magt give dig noget tilbage
der er større end hvad du har afsat til dem?
HANNAH: Sure, så Spørgsmålet var dybest set,
kan brugeren give dig mere end du beder om?
STUDENT: Ja.
HANNAH: Nå, du kunne forhindre brugeren fra at gøre det.
Du kunne specifikt sige ikke give mig mere end x antal af bytes
Jeg har kun givet dig plads til x antal af bytes, x antal tegn.
Så det er noget, du ønsker at forhindre.
Ja?
Hvad er forskellen mellem stak overflow og buffer overflow?
>> HANNAH: OK, så stakken overflow-- åh, hvad
er forskellen mellem stakken overløb og buffer overflow?
Så vi ønsker at tænke på stakoverløb sker, når vi er faktisk
stabling op disse funktionstaster opkald.
Lad os sige du har en rekursiv funktion, fordi vi ved, at hver gang du
kalder en funktion, er det får sin egen ramme på stakken.
>> Så vi stak for højt op, og så vi begynder at flyde over.
Og vi bruger for meget hukommelse og Vi har ikke nogen steder forladt.
Vi får denne fejl.
>> Buffer overflow er inden for et program.
Vi vil måske ikke nødvendigvis har løbe tør for hukommelse på samme måde
at vi kunne, hvis vi stabling op, så mange funktionskald,
men vi skriver forbi hukommelsen at vi ved, vi kan bruge.
Og det giver os mulighed for at gøre onde ting.
Ja?
>> ROB: Ja, du måske ønsker bare gentage dette,
men du kan også tænke af en stak overflow
som som en bestemt type af buffer overflow.
Eller du bare tænke på din stable så en rigtig stor buffer.
Så når du overløb du stak, det er lidt ligesom en buffer overflow.
Men en stak overflow er bare en specifikke udtryk anvendes, når stakken
selv overflow.
>> HANNAH: Right, så at gentag for den video,
det du kan tænke på stack overflow som en bestemt type af buffer overflow.
Cool?
Flere spørgsmål før vi går på?
Awesome.
>> OK, cool, så lad os tale om nogle almindelige fejlmeddelelser.
Dette er noget, der har vist op på flere quizzer,
så noget, der er værd tage et andet kig på.
Jeg er sikker på du er stødt på i det mindste nogle af disse
som du laver dit problem sæt.
Så sørg for at du kan tale om dem på quizzen.
>> Så den første er en segmentering fejl.
Og det er helst vi forsøger at få adgang hukommelse
at vi ikke får lov til at få adgang.
Så du migh har set denne, for eksempel i breakout.
Hvis afsløre kollision returnere null, og så er du
forsøgt at gøre noget med nulværdi,
computeren ville give du en segmentering fejl.
Så en, en vigtig ting at gøre for at forsøge at undgå denne
er altid at tjekke for null.
>> Du har måske også set underforstået erklæring af funktionen.
Så dette er hvad der sker når Allison viste dig
hvordan vi laver en prototype, right?
Så lad os sige, at vi har nogle funktion, som vi definerer.
Lad os sige terning.
Og der går i bunden af vores funktion, under main.
>> Hvis vi glemmer at fortælle computeren om terning, når main forsøger at ringe terning,
computeren vil være ligesom, åh min gosh.
Jeg har ingen idé om, hvad det betyder.
Jeg ved ikke, hvad de skal gøre, her.
Så prototypen siger fortvivl ikke.
Jeg har tænkt mig at fortælle dig.
>> Det vil komme.
Må ikke råbe på mig.
Må ikke give mig en implicit erklæring af funktionen.
Så hvis du får denne fejl, den ene ting du vil ønsker at gøre
er at sikre du har din prototype.
OK?
>> Og sidst men ikke mindst, sort identifikator
er væsentlige, når du forsøger at bruge en variabel, du ikke har erklæret.
Så pludselig du begynder siger ligesom n plus plus.
Og computeren siger, hvad der er n?
Du har aldrig fortalt mig n var en ting.
>> Så en ting du skal sørge for du gjorde, er at fortælle computeren, hvad n er.
Så for eksempel kan n være et heltal.
Og så vil du undgå denne fejl.
Eventuelle spørgsmål om almindelige fejl?
Ja?
>> STUDENT: Til den implicitte erklæring af funktionen,
kunne det også være, at du udeladt en af bibliotekerne du skulle
omfatte, snarere end prototype?
>> HANNAH: Right, så Spørgsmålet var, kunne du
også får denne fejl, hvis du glemte at inkludere et bibliotek.
>> STUDENT: Ja.
>> HANNAH: Absolut, fordi på samme måde
at vi ønsker at sætte vores prototyper før den vigtigste funktion,
hvis vi har et bibliotek, er dem, der går i det væsentlige omfatter prototyper,
omfatter definitionerne af funktionerne.
Store spørgsmål.
>> STUDENT: For en segmentering skyld, ville det også
ske, hvis vi, ligesom, forsøgte at få adgang til en variabel,
lignende, i en anden [uhørligt] end det blev erklæret i?
HANNAH: Sure, så ville vi få en segmentering fejl
hvis vi forsøgte at få adgang til et variabel uden for rækkevidde?
Var det et spørgsmål?
STUDENT: Ja.
HANNAH: Beautiful.
Så sandsynligvis, er du nødt til at få en sort identifikator fejl i stedet.
Så det er bare at sige Jeg ved ikke, hvad det er.
Cool, noget andet?
Ja, OK, smukke.
>> Alt righty, så rekursion.
Så jeg nævnt et par gange at vi kan få en stak overflow
fordi vi kalder vores rekursiv funktion så mange gange.
Vi får alle disse stakken rammer, bla, bla, bla.
Hvad selv er en rekursiv funktion?
Tja, en rekursiv funktion er enhver funktion, der kalder sig selv.
>> Nogle ting at være opmærksom på, når du gennemfører rekursiv funktion,
glem ikke at inkludere en base case.
En base case er den punkt, hvor vi ender.
Så for eksempel, hvis vi kodning, Siger, Fibonacci rekursivt,
Vi ønsker at sikre, at når vi får til 0 eller første Fibonacci nummer,
disse to tal har disse tilfælde fordi dem er ikke afhængige
på ting, der kom før.
Dem har deres egne værdier.
>> Nogle fordele til rekursion, hvilket er en spørgsmål, vi har set på tidligere quizzer.
De kan føre til mere kortfattet, elegant kode.
Og en masse funktioner, en masse forskellige algoritmer,
faktisk egner sig til rekursion.
Deres definition kunne være rekursiv i sig selv.
Så Fibonacci er én.
Fakultet er ét.
Mergesort sige en-- alle ting, som du kan se på.
OK, nogen spørgsmål?
Ja?
>> STUDENT: Er et hjørne sag ligner en base case?
Eller er det for nogle andre slags [uhørligt]?
>> HANNAH: Sure, så en hjørne tilfælde er any-- så
er hjørne tilfælde det samme som base case?
Et hjørne sag er noget, din kode kan opføre sig lidt anderledes.
Basisscenariet er slags relaterede, i at de er ligesom særlige tilfælde
at du ønsker at se på.
Men ideen om en base case er, at du vil have din rekursiv funktion
at stoppe på et tidspunkt.
Det kan ikke holde kalder sig for evigt.
Det er nødvendigt at stoppe på et tidspunkt.
>> ROB: Ja, ofte din base sager kunne være eksempler på hjørne baser.
>> HANNAH: Right, cool, noget?
>> STUDENT: Kan du forklare baserer en lille smule mere?
Jeg forstår ikke helt, [Uhørligt] base-tilfælde.
>> HANNAH: Af uædle tilfælde?
>> STUDENT: Base tilfælde, ja.
>> HANNAH: Oh yeah, helt sikkert.
Lad os se.
Må vi har kridt herovre?
Ja, det gør vi.
OK, så virkelig hurtigt, vil jeg forsøger at skrive stor nok
så du kan se på skærmen.
Lad os tale om, virkelig hurtigt, Fibonacci.
Så jeg vil give dig Fibonacci sekvensen.
Du kan se op på definitionen.
>> Væsentlige hvert nummer i sekvensen er summen af ​​de to foregående tal.
OK, så den måde, at jeg netop beskrevne Fibonacci,
du kunne høre rekursion, right?
Da jeg sagde hvert nummer er den summen af ​​de to foregående tal,
vi kunne sige OK.
Nå, det n'te Fibonacci number-- så lad os
siger, at vi har denne funktion kaldet fib-- fib af n
vil være lig med fib af n minus 1 plus-- sorry,
vi går videre til næste linje løbet her-- fib af n minus 2.
>> OK, så dette virker fantastisk, hvis du er ser på, for eksempel nul, en,
to, tre, fire, femte Fibonacci nummer,
hvor man kan sige, at 5 er lig med 2 plus 3.
Men hvad nu, hvis du er i starten?
Hvad hvis du bare rammer disse to første værdier?
>> For at få denne 1, kan du ikke siger tilføje de to foregående,
fordi at nul og-- jeg ikke kender.
Så på et tidspunkt, er vi nødt til at stoppe.
På et tidspunkt er vi nødt til at sige, at disse to bare har deres egne definitioner.
0 Fibonacci-tal er 0.
Og første Fibonacci nummer 1.
>> Så den måde, jeg kunne kode det, jeg ville sige, hvis n er mindre end to,
så bare returnere n.
Og det ville være min base case.
Det er, hvordan jeg kender til at stoppe med en rekursiv funktion.
Er det klart?
Awesome.
Noget andet på rekursion?
Beautiful.
>> Lad os hurtigt snakke om Søg og sortere køre tider.
Og så vil jeg give Davin nogle tid til at tale om kodning eksempler.
Så her er de vigtigste søgning og slags, som du bør vide om.
Guarantee-- Jeg kan ikke garantere, fordi jeg ikke har set quiz--
men dette kommer op quiz efter quiz efter op.
Så helt sikkert bruge dette skema.
Ligesom, tage dette skema.
Sætte det på din snyde ark.
Du vil være en glad person.
>> Dette fortæller os Kør tidspunkter af hver af den slags og søgealgoritmer.
Så lineær søgning, kan du se run tid, og samme med binær søgning.
Gå over, hvad disse algoritmer gøre den generelle idé.
Kig på nogle pseudokode, hvis ikke selve koden.
>> Du vil se, at Boblesortering har en øvre bundet i de værste tilfælde af n potens.
Så hvis vores matrix var helt bagud før vi ønskede at sortere det,
ville vi sige, at det er vil tage n kvadratiske trin.
Men i bedste fald, så nedre grænse for den bedste sag
vil være, hvis det er allerede perfekt sorteret.
Så alt, hvad vi skal gøre, er kontrollere, at det er sorteret.
Er der et spørgsmål herovre?
>> STUDENT: Hvornår ville du ønsker at bruge slags?
Den slags.
Jeg er bare nysgerrig.
>> HANNAH: Hvornår vil du ønsker at bruge udvælgelse slags?
Denne ene?
Den ene, der er n kvadreret i begge tilfælde?
>> STUDENT: [uhørligt].
>> HANNAH: Så det er meget anderledes.
Hvis du har specifikke krav til dit program,
ligesom ting som hvis vi lige har sagt gennemføre en search-- sorry--
gennemføre en slags, vil du sandsynligvis ønsker at gå
for en af ​​dem, har et bedste tilfælde af n,
eller en nedre grænse i bedste fald n.
Men der kan være visse ting som f.eks,
swaps er virkelig dyrt for en eller anden grund.
Så du ønsker at gøre boble sortere, fordi du
nødt til at gøre så mange swaps, ting som.
Enhver other-- ja?
>> STUDENT: Ville det være [uhørligt] at sige, at [uhørligt]?
HANNAH: Det er én ting der vil fortælle dig
hvis du kigger på implementeringen.
Den måde, jeg ville faktisk tænke over, hvorfor det er n
squared er, at vi er nødt til at køre gennem vores vifte af længde n,
hver gang gør på de fleste, n swaps.
Og vi er nødt til at gøre denne proces n gange.
>> Så når du nødt til at gøre på de fleste, n swaps og for n løber gennem array,
Der kommer til at være n potens.
Men ja, dette vil blive afsløret gennem denne dobbelte for loop,
som spørgsmålet asked-- eller indlejret for løkke, skulle jeg sige.
OK?
>> Og derefter flette sortere, som er den hurtigste slags vi nu,
eller at vi har dækket i CS50, ved, at den vigtigste algoritme er
denne idé om at bryde ind i sorterede stykker og derefter
fusionerende sammen disse sorterede bits.
Og får os log n log n.
Eventuelle spørgsmål vedrørende søgninger og slags, før jeg give det videre?
Lad os se.
>> Åh, der er knyttet lister.
Undskyld, jeg har endnu et emne.
OK, awesome, hægtede lister.
Problem med arrays, de har en fast størrelse.
Så hvis du ikke ved, hvor stor dit input vil være,
du ikke ønsker at oprette et array.
Fordi hvis vi skaber en array, der er for lille,
vi kan løbe ind i buffer overflow.
>> Så i stedet, kunne vi gøre noget med hægtede lister, som
tillader os at have en dynamisk størrelse datastruktur
der vil tillade os at gemme en mere fleksibel mængde data.
Så i hvert knudepunkt i vores linkede liste, vi har to stykker.
Vi har den faktiske værdi, som den gemmer.
Så det er lige den ting du ville se i array, for eksempel.
Og så har vi også holde styr på en pointer til den næste ting i hukommelsen.
>> I modsætning til arrays, som vi ved alle at gå
at være-- array elementer er alle én efter den anden i memory-- forbundet
lister kunne være hvor som helst i hukommelsen.
De er tilfældige placeringer.
Så hvis vi skulle faktisk gå finde dem, vi
nødt til at holde styr på næste ting i vores liste.
>> Og derefter for at vide hvor denne liste som helhed,
alt, hvad vi nødt til at holde styr på, er den første element i vores linkede liste.
Og der vil tillade os at følge igennem.
>> Så dette er, hvordan du kan definere en tilstand.
Dette er en stor mulighed at drage fordel af structs.
Fordi du har denne idé, ja, for en given knude, jeg har to stykker.
Jeg har den faktiske værdi i sig selv.
Og så har jeg en pegepind til næste element i den linkede liste.
Så du kan se, har vi et heltal n, som vil være den faktiske værdi,
og derefter en pegepind til en knude, kaldet næste.
Så det kommer til at være den næste element i vores linkede liste.
STUDENT: Ja?
Har du nødt til at angive, at stjernen er som en struct?
>> HANNAH: Ja, så da dette er næsten som en slags,
det virker som en rekursiv definition, at vi
brug for at vide, hvad en node er inde til at finde en node.
Da det faktisk ikke vide, hvad en node er fuldstændig
indtil vi kommer til slutningen af ​​denne-- og efter dette kan vi bare kalde det
en node-- indersiden af ​​denne definition, vi nødt til at kalde det en struct node.
Store spørgsmål.
Noget andet?
Ja?
>> STUDENT: Hvorfor gør vi nødt til at sige node to gange?
Fordi da vi var i [uhørligt] havde vi blot at gøre det i semikolon,
men nu er vi nødt til at finde, at struct node? [Uhørligt].
HANNAH: Så tror jeg i det sidste eksempel,
vi var blot at skabe når du ønskede at bruge en studerende efter det, du
måtte bruge struct node-- Jeg sorry-- struct elev.
Dette tillod os at, efter den kendsgerning, bare brug node tilføje en ny type, hovedsagelig.
Det mening?
Så vi er nødt til at gå tilbage og se på koden før.
Men jeg vil gætte på, at vi ikke bruge typedef.
Og vi stillede spørgsmålet, hvorfor har vi brug for at bruge typedef?
Typedef giver os mulighed for at undgå ord struct i begyndelsen.
Ja?
STUDENT: Hvilken slags spørgsmål ville komme op
i form i form af noder og hægtede lister?
>> HANNAH: Så én ting er, vi kunne sige, hvordan kan du søge gennem et sammenkædet liste?
OK, fordi det er en lidt mere kompliceret
end hvis vi søger gennem et array.
Vi kan bare se på element nul, element én, element to, bla, bla,
bla.
Hvis vi ønsker at søge gennem en sammenkædet liste,
ville vi faktisk nødt til at følge denne lille labyrint af pointere.
Så lad os faktisk gå gennem dette virkelig hurtigt.
Hvad vi kunne gøre i bestille at-- lad os sige, at vi
bare ønsker at gentage gennem vores helt forbundet liste.
Vi ville starte på hovedet.
Og så for at flytte til det næste element,
i stedet for bare at inkrementere med en ligesom vi måske i at gå gennem et array,
vi faktisk kommer til at følge den næste pointer,
så vi kan finde, hvor i hukommelse næste element er.
Så jeg ved, det er ikke nok at tage alt dette i lige nu,
men du har disse dias.
Så du kan gå igennem dette lidt langsommere.
Men det væsentlige, hvad vi ønsker at gøre er at følge disse pejlemærker
gennem hele den linkede liste.
Så det er et spørgsmål du måske blive spurgt.
>> Noget at bemærke med indsættelse, lad os sige
vi ønskede at sætte et nyt element på forsiden af ​​vores linkede liste.
Vi er nødt til at være meget forsigtige om den rækkefølge, som vi
omfordelt pointerne.
Fordi lad os sige, jeg lige har sagt OK.
Gør hoved punkt til dette nye element.
Bare gøre det pege på 1 Så vi har væsentlige tabt resten af ​​vores liste,
fordi jeg ikke kan huske hvor 2 liv.
>> Så vi er nødt til at gøre i en meget bestemt rækkefølge.
Først, vi gøre den nye element peger på hovedet.
Og så har vi gøre hovedet peger på det nye element.
Så lad os se, hvad der ligner med arrows-- ligesom det.
Så du først have den nye element punkt til den gamle hoved.
Og nu har vi hovedet pege på den nye første element.
Eventuelle spørgsmål med dette?
>> OK her er nogle kode igen, noget at se på et lidt senere.
Og nu vil jeg slå den over til Davin for GDB og en lille smule af praksis
kodning på papir.
Beautiful.
>> ROB: Og Rob.
>> HANNAH: Åh, Davin og Rob.
Jeg er ked af.
>> STUDENT: Woo!
>> ROB: Tak.
>> Davin: Ønsker du at sige alt virkelig hurtig?
ROB: Ja, ja.
Davin: Når jeg op.
OK, mens Rob sætter mikrofon på, så hvad er GDB?
Alle bør have set GDB i klasse og også ved kontortid.
Og du skal bruge den.
Så hvad er GDB?
Anybody?
>> STUDENT: Det er en debugger.
>> Davin: Det er en debugger.
Og hvad betyder det tillader dig at gøre?
Ligesom, hvorfor vi gerne GDB?
STUDENT: At bremse program ned.
Davin: Right, så du kan gå gennem det som en menneskelig tempo.
Og så hvad er nogle kommandoer du kan gøre?
Nå, pause er sandsynligvis din favorit kommando.
Fordi der lader dig bryde program og faktisk gå gennem det
linje for linje.
>> Run giver dig mulighed for at køre den.
Dernæst ligesom stepping igennem.
Hvad er mellem næste og skridt?
Vent, sige højt.
Det var korrekte.
>> STUDENT: [uhørligt].
>> Davin: Ja, awesome.
Så ligesom, næste og trin, hvis you're-- lad os sige du har en funktion, du
definere.
Lad os sige nogle i din primære funktion, og du bare trykke næste, næste,
næste.
Du faktisk kommer til at udføre denne funktion,
men du kommer til at springe over den.
Hvis du rammer skridt, eller s eller hvad, er du
vil faktisk hoppe ind i denne funktion,
og derefter kan du slå næste at se de forskellige opkald
indenfor den pågældende funktion.
Ja?
>> STUDENT: Er der en måde at hoppe, ligesom, bakke ud?
Davin: Finish, yeah, slut af med at springe dig ud.
Så det kommer til at afslutte det funktion, og så er du
vil være tilbage i main, for eksempel.
Print vil printe det ud én gang.
Noget jeg altid bruger, er display.
Display vil printe det ud konstant hele enkeltheder
af dit program.
>> For eksempel, hvis du er i en for-løkke, og man
ønsker at se, hvordan noget er under forandring, og du ikke ønsker at, ligesom, konstant
gøre ligesom print, print, print, display
vil vise, at variablen kontinuerligt, hver gang du trykker på Næste.
Og fortsætte.
Så GBD, det er GDB.
>> STUDENT: Hvad er den ene hvor du [uhørligt]?
Davin: Hvad er det?
>> STUDENT: Hvad er til-- de lokale variable.
ROB: Der er noget faktisk ligesom lokalbefolkningen eller noget.
Jeg can't--
>> Davin: Det kan være noget lignende, ja.
>> HANNAH: I de lokale?
>> Davin: Det er det.
Det er den ene.
ROB: Beautiful.
>> Davin: Ja.
>> STUDENT: Hvad betyder fortsætte gøre?
>> Davin: Det continues-- så det er bare vil fortsætte dine programmer.
Så hvis du bryde og slå fortsætte, går det
at bare køre dette program indtil det rammer at pause igen.
Så for eksempel, hvis du brød i en funktion,
og du kommer til at gøre lignende for sløjfe eller noget lignende,
og du rammer fortsætte, det vil fortsætte og gå tilbage til pause.
Eller der er ingen pause, det kommer til at fortsætte og afslutte programmet.
>> ROB: Så bare gerne køre stop på det allerførste breakpoint
du rammer, hvis du så hit fortsætte, vil det holde
går, indtil det er det næste breakpoint.
Og derefter fortsætte vil gå til næste breakpoint.
Davin: Eventuelle andre spørgsmål om GDB?
Så jeg tror i fortiden, vi har bedt dig om, hvad
GDB er og give et eksempel på nogle ting, du
kan gøre med GDB, så Real Simple, men ja.
Der kan du gå.
Og knuder?
>> ROB: Ja, så hvilken retning var det?
STUDENT: Det var det.
Davin: Vent.
ROB: Denne fyr?
Davin: At man.
ROB: Denne fyr, åh, jeg var ikke klar.
Så vi ikke var klar om hvad til-- jeg ikke
vide, hvem det was-- men spørgsmålet.
Vi ved ikke præcis, hvad du spurgte om det, så bare
at afklare noget.
Så det første, som jeg sagde før, typedef du altid bruger bare
oprette et kaldenavn for en type.
Så lige her, kaldenavn vi er skaber, er for denne type struct node.
>> Så først, ignorerer denne node i typedef, så denne struct node krøllet
afstive ned til næste krøllet tandbøjle er struct node type.
Og vi er nødt til at node deroppe, fordi vi
nødt til at referere node her.
Så med denne form for rekursive struct, du nødt til at give denne konstruere et navn,
ellers ikke kunne du sige struct node i her.
Hvor der før med studerende da vi blev indtastet, tror jeg,
vi behøvede ikke at sige student deroppe, fordi vi
behøvede ikke at sige struct studerende inde i struct selv.
Så det er den rekursive at tvinger os til at sige node der.
>> Denne node er blot navnet er vi giver knudepunkt for typedef.
Således at knuden er ikke den samme som node.
Men denne struct knudepunkt er samme som struct node.
Davin: Så når du ringer, lignende, node i din primære funktion,
du ikke kommer til nødt til at sige struct node.
Du kan bare sige node, fordi knudepunkt er en different-- er dybest set
du siger, OK.
I stedet for at skulle ringe struct node i min kode,
Jeg ønsker blot at omdøbe det som knudepunkt for at gøre det lettere.
>> ROB: Hvis du altid bruge typedef, så dette
er det eneste sted, du vil have at erklære en variabel med struct node
stjerne, ja.
>> Davin: OK, så den sidste del er svært at undervise because--
ROB: Hvad?
>> Davin: Fordi det er kodning på papir.
Så hvert år har vi kode på papir spørgsmål.
Så jeg tror, ​​sidste år, 12 ud af 80 point var kode på papir.
År før, at 10 ud af 80, år før, at 20 ud af 100,
så en hel del af disse.
Så du bliver nødt til at være i stand til til at kode disse funktioner i hånden.
>> Så jeg regnede med at vi kunne gå gennem en par af dem, og se, hvordan folk gør,
slags gåtur gennem dem langsomt med mennesker.
Så generelt strlen og atoi har været meget populære.
Sidste år, jeg tror, ​​vi havde GetPositiveInt og RandomInt.
Men pow, så magt, også en positiv også.
Lad os bare gå gennem måske en eller to af disse sammen.
Hvad gør folk ønsker at se?
>> STUDENT: Atoi.
STUDENT: Ja.
Davin: Atoi?
STUDENT: [uhørligt].
Davin: OK, jeg har tænkt mig at gøre det på tavlen.
Har du har en præference hvis jeg gør det her eller der?
Der, siger Gabe der.
>> ROB: Og dette er generelle tanker disse koder spørgsmål.
Prøv at skrive noget.
Må ikke lade det stå tomt.
>> Davin: Ja.
ROB: Hvis du kan få den returtype korrekt,
eller måske vi kunne give det til dig, men hvis du kan, ligesom,
skrive den generelle funktion signatur, Hvis du kan få basen sager korrekt,
eller et hjørne tilfælde, eller huske afkrydsningsfeltet for null,
så længe du har nogle ting, så måske vi
kan give dig et par peger på problemet.
Må ikke bare lade det stå tomt.
>> Davin: Ja, og hvis du er bare helt
snuble på, hvordan man faktisk bliver til kode.
Hvis du skriver pseudokode, det er temmelig godt.
Så det er ligesom, det er en seks point spørgsmål, og du skriver den korrekte pseudokode,
du får mindst to punkter.
Så du skal ikke bare lade dem stå tomme.
Prøv at sætte noget.
>> ROB: Det skal være den korrekt pseudokode, selvom.
>> Davin: Ja.
ROB: Så vi er generelt mindre lempelig med bugs i pseudokode.
Davin: OK, så du fyre ønskede at se atoi.
OK, så bare really-- så hvad du vil gøre
er du kommer til at være givet en slags nummer.
Men dette antal er ikke kommer til at være en int, right?
Hvad det kommer til at være?
>> STUDENT: [uhørligt].
>> Davin: Det kommer til at være en streng, right?
Så hvis du fik a string-- lad os say--
>> ROB: Skal jeg trække en redaktør?
Jeg kan trække up--
>> Davin: Åh, du ønsker at gøre det on--
>> ROB: Ville du foretrække bestyrelsen?
>> Davin: Hvad vil du gøre?
Jeg mener, du ønsker at gøre det i hånden?
Eller har du lyst til at gøre det ved computer?
>> ROB: Gør det med hånden.
>> Davin: [griner]
ROB: Gør det med hånden.
>> Davin: OK, så det kommer til at være atoi.
Så hvad er det-- Jeg mener, vi får sandsynligvis give dette til dig.
Men hvad det kommer til at vende tilbage?
>> STUDENT: Int.
>> Davin: Det kommer til at vende tilbage int, right?
So-- Jeg ønsker ikke at gøre det der.
Jeg vil gøre det her.
>> ROB: Du kan trække det ned og tryk derefter på den.
>> Davin: ja.
[Griner] Spil forandring.
OK, så det kommer til at være int atoi, og hvad det kommer til at tage?
En char stjerne, så bare en snor, stjerne s, som.
>> ROB: Nice stjerne, nice.
Davin: Det er måske ikke være der, OK.
ROB: Ja.
Davin: OK, så den første ting du ønsker at do-- jeg
ved ikke, hvis nogen kiggede i praksis solutions--
men hvad du vil ønsker at gøre, er at du er
lyst til at have en løkke, fordi du er
lyst til rent faktisk gå gennem denne streng.
Så helpful-- så lad os sige vi skal til en for-løkke,
og vi kommer til at gå gennem hvert element af strengen.
Hvor længe er det?
Hvor mange gange skal vi at gentage, at der til loop?
STUDENT: Sterln?
Davin: Sterln, ja.
Så lad os sige int længde er lig sterln s.
Og bare nysgerrig, hvorfor er det altid venlig bedre at gøre dette uden for loops?
Ligesom, hvorfor er det bedre at kalde denne funktion uden for en løkke?
Bare en hurtig sanity check?
Ja?
STUDENT: Så du ikke gøre er nødt til at holde kontrol det.
Du kan bare [uhørligt].
>> Davin: Præcis, så ja, præcis, hvad hun sagde.
Så vi behøver ikke at holde øje med det.
Så for eksempel, hvis jeg ringer denne funktion inde i et loop,
så jeg har tænkt mig at holde kræver denne funktion flere gange.
Og det kommer til at falde effektiviteten af ​​dit program.
Så det er altid nyttigt at erklære den udenfor.
>> ROB: Det er sagt, på nogle af disse problemer,
temmelig meget, så længe du får en arbejder løsning, får du fuld kredit.
Så du skal ikke bekymre dig, hvis dit design er absolut forfærdelige.
Det kan gøre os forstyrret læse din kode.
Men så længe det fungerer, du får de point.
>> Davin: Ja.
OK, så så jeg har tænkt mig at erklære nogle variabel.
Det er bare vil kalde int sum.
Og jeg har tænkt mig at sætte denne lig med nul, som.
Og det er bare at gå at være en pladsholder.
Så det kommer til at være hvad jeg har tænkt mig at vende tilbage.
Så jeg har tænkt mig at i sidste ende returnere summen af ​​dette program.
Så jeg har disse to variabler.
Jeg har længde.
Jeg har sum.
Og lad os nu hoppe ind i vores streng.
>> Så lad os få vores for-løkke.
Så fire int I lig 0 w, mens Jeg er mindre end længden jeg plus plus.
Og nu--
ROB: Nice.
Davin: OK, og nu her kommer kødet af vores kode.
Så du kan faktisk gøre dette dybest set på én linje.
Så nogen har en idé af, hvad vi vil gøre næste?
OK, så det er OK.
Så vi gør for at sige sum equals-- lad mig scoot denne over-- sum
lig sum gange 10 plus-- vi er kommer til at tage s I minus én
citat 0 et citat gjort, ligesom det.
ROB: Meget intuitiv.
>> Davin: Knuste det.
OK, så someone-- jeg fik det, jeg fik det.
OK, så det er helt klart på vej op.
Hvad betyder dette?
Så Er der nogen vide, hvad det betyder?
Kan alle se det?
Nej, ingen kan se dette, OK.
Jeg har tænkt mig at--
>> ROB: Jeg har tænkt mig at skrive formel bare lige her.
Davin: OK, Rob kommer til at gøre det på computeren, som er sjovt.
ROB: Åh min Gud.
Eller jeg vil ikke.
Davin: Stand by.
STUDENT: Jeg har et spørgsmål.
Davin: Ja, helt sikkert.
STUDENT: [uhørligt]?
Davin: OK, så det faktisk, lignende, blot i almindelighed,
hvis du skulle sætte, ligesom, i denne erklæring int
I lig 0 komma længde lig sterln, at--
>> STUDENT: [uhørligt].
>> Davin: Det er fint, fordi at--
STUDENT: Hvorfor ville du selv nødt til at bruge længde?
Hvorfor kunne vi ikke bare [uhørligt] sterln s, ligesom hele tiden [uhørligt]?
>> Davin: Du mener lige her?
>> STUDENT: Ja.
Davin: Fordi hver gang for loop kørsler,
det kommer til at vurdere denne betingelse.
STUDENT: Right.
Davin: Og hvis du har sterln der, så er det
nødt til at faktisk kalde denne funktion hver eneste gang.
Så i stedet for bare sammenligne det med en int,
du kommer til at kalde en funktion og derefter sammenligne den
til returværdien.
Yeah, så det er bare, ja.
>> Nice, OK, så nu alle kan se det.
Hvad does-- dette er ligesom, det er det.
Dette er den marmelade, lige her.
Hvad betyder det?
Hvad laver jeg?
Ja, en idé?
Ja?
>> STUDENT: Nå, så når du indtaster et array,
du kommer til at gå fra venstre mod højre,
så du kommer til at gå i decimal nede fra [uhørligt].
Davin: Præcis.
STUDENT: Så hver enkelt du er nødt til at formere sig
hvad du så som værdien af ​​den int ved den tid, du kommer til at flytte, at over én.
>> Davin: Perfekt, perfekt, så for eksempel, lad os
siger jeg gav dig-- jeg vil skrive herovre.
Nej, jeg er ikke.
Jeg har tænkt mig at skrive her.
Lad os sige, at jeg gav dig 76, right?
Lad os sige, at jeg giver dig 76.
Det er en streng til at begynde med, OK?
>> Så længde er hvad?
2, right?
Sum er 0.
Så hopper vi i vores for-løkke.
OK, den første iteration af dette, hvad det kommer til at være?
Det kommer til at være summen er 0.
Så opsummere gange 10 0.
Det er meningsløst.
Så hvad betyder dette gøre?
STUDENT: [uhørligt].
>> Davin: Det kommer til at dreje det karakter i et heltal, right?
Det er lidt ligesom med din problem set-- denne light--
det er lidt ligesom med problem indstillet til Visioneer.
Du beskæftiger sig med ASCII-værdier.
Så hvis jeg giver dig, ligesom, en syv, men det er et tegn,
og du ønsker at vide, OK, hvad ciffer er det?
Ja, du kunne, ja.
Så hvad ciffer er det?
Du kunne trække 0 fra det, men du nødt til at trække 0, tegnet.
>> Og hvor nogle mennesker bliver udløst op, de er
ligesom, OK, godt, jeg er nødt til at kende ASCII værdier for denne quiz?
Nej, du absolut ikke brug for at kende ASCII
værdier for, ligesom, små bogstaver a, store bogstaver A, nul.
>> ROB: Der er ingen grund til at nogensinde sætte dette på snyde ark.
>> Davin: do Bestemt ikke spilde din plads med dette.
Du kan literally-- bare i stedet sige 48, ligesom højre op
der, som svarer til sige en, en apostrof,
lignende, nøjagtig det samme.
>> ROB: Man kunne næsten tro af det som if-- Gud, jeg har brug for min,
oops-- du kunne næsten tænke på det som hvis vi har sådan noget hash
definere 0. 48.
Det vil ikke fungere.
Men tænk på det som enkelt citat 0 enkelt tilbud, og for alle tegn.
Tænk på det som en konstant, repræsenterer det ASCII værdi.
>> Davin: Ja.
OK, så den første gang igennem, så med 76-- så den første gang igennem,
det er bare tegn 7 minus tegnet 0,
og de er syv integers-- godt, de
er syv rum væk fra hinanden anden på ASCII diagram eller whatever.
Så det kommer til at returnere en int 7.
Så nu, sum er lig med 7.
>> OK, ja, lad os hoppe i dette for loop igen.
OK, nu er det beløb gange 10.
Så du er effektivt flytte 7 til venstre.
Giver det mening?
Du er effektivt flytte den til venstre.
>> Og så skal du add-- dette vil være 6 minus 0.
Det er 6.
Så det kommer til at være 70 plus 6.
76, det er dit nummer.
Så uanset hvad nummer Jeg gav dig, det er langsomt bare
kommer til at flytte større værdier til venstre, 1 faktor 10
hver gang i for-løkken, og tilføj derefter som nødvendigt.
>> I ryggen?
STUDENT: Vi har ikke at gøre enhver kontrol i programmet?
>> ROB: Så så langt som at kontrollere går til programmet,
vi ville fortælle dig temmelig meget, hvad du har brug for at kontrollere.
Hvis vi ikke fortælle dig noget, så generelt
antage, at du er nødt til at kontrollere de fleste ting.
Ligesom du måske, bare for at være sikker, du bør nok tjekke hey, er s null?
Så jeg har ingen idé om, hvad de skal vende tilbage.
Men vi vil fortælle dig denne slags ting.
0, ved jeg ikke.
>> Davin: Og hvorfor skulle du ønsker at kontrollere igen, hvis s er lig nul?
STUDENT: [uhørligt].
Davin: På grund af char stjerne.
Det er en pointer.
Så en helt acceptabel erklæring, jeg kunne sige, OK,
s er lig nul, fordi det kunne være en pegepind til null.
Så når du har pointers i din vej i som dette,
bør du nok tjekke.
Fordi hvis du ikke kontrollere, og så du derefter gå ind i din for-løkke,
og du doing-- scoot ned.
Scoot ned.
>> ROB: Beklager, det er det.
>> Davin: Og så, ligesom, hvis det er nul, og så er du
gøre dette, hvad fejl vil du få?
STUDENT: Du vil få et sæt fejl.
Davin: Du kommer til at sætte fejl, højre, fordi du er
forsøger at indekset i null.
Så du vil forsøge at indeksere i hukommelsen, som du ikke ejer.
Så dette, hvis det er nul, og du gør dette, vil du cyklus.
>> ROB: Jeg tror også på den eksamen, hvor vi stillede dette spørgsmål, vi fortælle dig
at du bare kan antage Det er et positivt tal.
Fordi atoi også forventes at håndtere negative tal,
så du ville have til særtilfælde.
Hey, er det første tegn en bindestreg, i hvilket tilfælde, OK,
nu er det en negativt heltal.
Vi vil fortælle dig den slags ting.
Vi vil fortælle dig, hvad du har brug for at håndtere.
Davin: Ja.
Så jeg er sikker på, at nogle mennesker måske have-- Hvis du begyndte at kigge på gamle eksamen,
du har set sterln.
Det er en populær en.
Og jeg tror i sterln, skulle du gøre denne kontrol for null, tilbagevenden
0 eller noget lignende.
Ligesom, du havde til at tjekke for null.
Og hvis du ikke gjorde det, at var peger ud på quizzen.
Så alligevel gør alle føler OK med atoi?
Er der nogen ønsker at gå over dele igen?
ROB: Oh yeah, tror jeg vi også fortælle dig, at du
kan antage, at alt is-- det de er faktisk indtaste et nummer,
at du ikke behøver at bekymre sig om, lignende, breve er i strengen, så.
Davin: Ja.
Ja?
STUDENT: Kan du gå over en gang mere, når
du bruger dobbelt citat og enkelt citat?
>> Davin: Sure, så dobbelt anførselstegn, meget simpelthen, er dobbelte anførselstegn er strenge.
Så hvis du dobbelt citat noget, det er en streng.
Så, ligesom, hvis jeg havde denne 0 herovre, og jeg gjorde det, det er en streng.
Det er ikke længere et tegn.
Så jeg kan ikke finde denne værdi på min ASCII diagram, fordi det er en streng, ja.
>> OK, alle andre spørgsmål?
Ja?
>> STUDENT: Så du har allerede besvaret dette,
men ligesom, når vi er faktisk skriver dette på quizzen,
vil du have os til at skrive med skråstreger nuller [uhørligt]?
Davin: Nej.
Spørgsmålet var, bør du sætte en skråstreg igennem nullerne
at angive, om de er nuller?
Nej, vi finder ud af det.
Ja, tak, de er gode.
OK, noget andet?
Er der nogen ønsker at-- så jeg tror vi har kørt en lille smule over tid.
Ønsker du at se en anden, eller?
STUDENT: RandomInt.
>> Davin: RandomInt, OK, nøjagtigt.
Så lad os gøre RandomInt.
Jeg vil gøre det herovre.
Så RandomInt er faktisk meget enklere.
Jeg tror atoi er sandsynligvis den sværeste ene at vi har bedt i de foregående år.
STUDENT: [uhørligt].
>> Davin: Hvad?
ROB: Jeg ser, om det er sådan af synlig fra herovre.
Davin: Er det?
ROB: Jeg tror ikke, det er going-- jeg tror det kommer til at køre ud til højre.
Davin: OK, så jeg vil gøre denne ene.
Og så skal du bare sætte det på skærmen.
>> ROB: Okay.
>> Davin: Du ønsker at være min skriftklog?
>> ROB: Ja.
>> Davin: Nice.
OK, jeg kan slette det?
>> STUDENT: Ja.
>> Davin: Det er så hårdt.
(Sang) Du laver hvad du laver.
Og gør, hvad du ikke skal gøre.
Ok.
>> OK, hvis jeg husker rigtigt, om quizzen den RandomInt var ligesom,
OK, jeg har tænkt mig at give dig to tal, som en a og b.
Og jeg vil have dig til at give mig en RandomInt mellem disse numre.
Så RandomInt går at tage to numbers--
så RandomInt-- og det er vil returnere en int.
>> Så hvad er returværdien?
Jeg har lige fortalt dig.
Int, right?
Ligesom dette, og så er det kommer til at tage to int'er.
Så det kommer til at tage int a og int b, som.
Så hvad RandomInt er kommer til at gøre, er at det går
til at returnere nogle tilfældige værdi mellem disse to værdier.
Så det kommer til at være større end en mindre end b.
Så jeg tror, ​​du kan sikkert antage, at a er den mindste af de to værdier.
Så hvis vi har at gøre med tilfældighed, hvilken funktion
Vi har set, at giver os tilfældige ting?
STUDENT: Drand.
Davin: Drand, nøjagtigt.
Så du vil sandsynligvis ønsker at bruge din drand.
Så du kan sige int tilfældig, og vi vil bare sige det er lig 0 lige nu.
Og de er, vi kommer til at sige, OK, tilfældige ligemænd drand 48.
Og hvad betyder dette tilbage?
Hvad betyder denne funktion giver dig?
>> STUDENT: Mellem 0 og 1.
>> Davin: Ja, mellem 0 og 1.
Så det kommer til at være--
>> ROB: Og det is-- jeg tror vi ville fortælle dig dette.
Ligesom, kan du bruge drand 48.
Du kan kontrollere dette på fortiden eksamen.
Men vi ville nok sige dig kan bruge drand 48, som
returnerer en float mellem 0 og 1.
>> Davin: Ja, ja, jeg er temmelig sikker på eksamen
det siger du nok ønsker at bruge drand, ja.
Så det kommer til at vende tilbage vis værdi mellem 0 og 1.
Og så hvad er du lyst til at gøre?
Nå, du ønsker at formere by-- vent, jeg tror, ​​det er ligesom det, undskyld.
Jeg vil bare gøre dette.
Jeg ved det ikke.
>> Så b minus en.
Så hvorfor b minus en?
Så lad os sige drand giver dig tilbage en int-- OK, vil jeg bare gøre resten,
så plus en.
Så hvad does-- y er b minus en.
Så lad os sige, at drand giver dig tilbage den maksimale værdi det eventuelt kunne
give dig.
Hvad er det kommer til at være?
STUDENT: 1.
>> Davin: 1, right?
Så hvis dette er 1, og du er multiplikation med b minus en,
godt, det er bare Forskellen mellem minus A.
Og hvis du så tilføje, at tilbage på en, det er hvad?
Det er dybest set b.
Giver det mening?
>> STUDENT: Ja.
>> Davin: Så hvis dette er den maksimale værdsætter det eventuelt kunne være,
det kommer til at være 1.
Og så er det bare forskellen mellem de to.
Tilføj på en, så dette er vil vende tilbage tilfældig.
Og i hjørnet tilfælde af, at drand giver dig tilbage 1,
tilfældig vil bare være effektivt være b.
Men det er den maksimale det kan være.
Så hvis det kommer til at være mindre end det, så lad os sige, at dens ligesom 0,9,
så derefter 0,9 gange B minus en vil være mindre
end forskellen mellem b minus en.
>> Og så hvis du tilføjer, at på en, så denne værdi er
vil være større end en, fordi du tilføjer noget på det,
men det vil være mindre end b.
Så du kommer til at få en tilfældig nummer, fordi du ringer drand.
Og det rand, at tilfældige tal er kommer til at være et sted i mellem et
b.
Giver det mening?
>> ROB: Bare for at sætte det i konkrete tal, så
Lad os sige at vi vil vælge en tilfældigt tal mellem 7 og 10.
Så B minus en er vores sortiment.
Så der er et udvalg af tre numre, vi ønsker at vælge fra.
Og derefter gange at mellem 0 og 1 1,
hvis der derefter giver os some-- lad os sige det giver os 1.5.
>> Derefter 1.5, vi ønsker at gå fra 7 til 10.
Så 1.5 plus 7 bringer os tilbage i vores 7 til 10 rækkevidde.
Og så er vi opbevare det inde i et helt tal, så det afkortet ned til 8.
Og så har vi bare returnere det.
Så B minus en er vores sortiment.
en skifter det op i numrene at vi ønsker inden for dette område.
Så mellem 7 og 10, og så vi kan vende tilbage, hvad vi ender med.
>> Davin: Yeah, nice.
>> ROB: Tak.
>> Davin: Ja, hvad sker der?
>> STUDENT: Skal vi køre det til nogen form for ASCII fejl, når we're-- hvis drand er
returnerer en float [uhørligt].
>> ROB: Så ligesom Rob sagde, fordi tilfældig er ikke en int,
så drand vil være en float.
Så og så ganger ud.
Og du kan få nogle slags float numre.
Og så det kommer til at afkorte.
>> STUDENT: OK.
Davin: Ja.
ROB: Og hvis compiler skulle advare dig om, ligesom, tab af præcision,
bare smidt en int i der, og så er det godt.
Davin: Ja?
>> STUDENT: Ville det have den samme sandsynlighed for at få,
lignende, b eller en [uhørligt]?
>> ROB: Så is-- Jeg er faktisk wondering-- er RandomInt nu troede
at være et nummer fra et til mindre end b?
Ligesom, hvis det er mellem 7 og 10, hvad er mulighederne?
7, 8 og 9, eller 7, 8, 9, 10?
Davin: Jeg glemmer.
På problemet set--
>> ROB: Jeg tror, ​​det er 7, 8, 9.
>> Davin: Det specifikt siger éns inkluderende og ens eksklusiv.
>> ROB: Ja.
>> Davin: Men jeg don't-- jeg not--
>> ROB: Så jeg tror, ​​disse er ikke medtaget, i hvilket tilfælde,
der er en lige sandsynligheden for 7, 8 og 9.
Der er ingen sandsynlighed på 10.
Davin: Ja?
STUDENT: Jeg har et spørgsmål.
Vi ønsker at definere en funktion returnerer ikke en værdi, men et array.
Så hvad ville være syntaks efter at vende tilbage?
>> Davin: OK, så du derefter would-- efter hjemkomst?
Så lad os sige du havde erklæret et array eller andet sted deroppe.
Så du ville bare tilbage navn array.
>> STUDENT: OK, tak.
Så skal du bare vende tilbage med en--
Davin: Åh vent, så ked af det.
Spørgsmålet var, hvordan kommer du tilbage et array.
>> ROB: Selv om det ikke kunne være et array erklæres
på stakken eller noget lignende.
Det skulle være noget malloced, fordi malloc
er, hvordan du får omkring automatisk allokering af hukommelse.
>> Davin: Ja.
ROB: Hvordan du får omkring lokal rækkevidde.
>> Davin: Men du ville bare returnere sin name--
>> STUDENT: [uhørligt] det er ikke en værdi, for eksempel to tal, så
[Uhørligt].
>> Davin: Du kan ikke vende tilbage flere numre.
Du kan ikke, ligesom, return--
>> STUDENT: Jeg talte om at vende tilbage et array eller noget lignende.
>> Davin: Ja, så spørgsmålet er kan jeg returnere flere værdier.
Du kan ikke returnere flere værdier.
Du kan ikke, ligesom, returnere en så returnere b eller noget lignende.
Fordi efter du vender tilbage, du tilbage ud af funktionen.
Og så funktionen er færdig, og ligesom Rob sagde, er på stakken.
>> Så alt, at hukommelsen bliver bare tilbage til computeren.
Alt bliver glemt, dybest set.
Så hvis du ønsker at vende tilbage flere værdier, er du nødt til at returnere et array,
Og den måde du gør det er mallocing.
Og så ville du returnere x som.
Dybest set, du bare returnere navnet.
Og når du vender tilbage noget som dette, er du
faktisk ikke returnere værdi.
>> Så lad os sige du har gemt værdierne i et array.
Du er faktisk ikke returnere disse værdier.
Ligesom, hvis jeg vendte tilbage en int, jeg er virkelig returnere kopier af værdierne.
Men hvis jeg skulle vende tilbage noget som dette,
Jeg tilbage en reference til disse værdier.
Så jeg vender tilbage, dybest set, en lageradresse til værdierne.
Giver det mening?
STUDENT: Ja.
Davin: Nice.
Ja?
>> STUDENT: Når du er hjælp drand herovre,
har du nødt til at sætte srand før det?
>> Davin: Nej, nej, jeg tror det ikke.
>> ROB: Ja, så har du at sige noget om srand?
Standarden af ​​jer aldrig sige srand overhovedet er at bare gøre srand nul.
Så drand på sin egen vilje arbejde.
Og det vil automatisk frø med den aktuelle tid, er, hvad det bruger.
Davin: Ja?
STUDENT: Har du [uhørligt] med tallene?
Davin: Ja, du kan.
STUDENT: Så du kunne sige, ligesom, 4 gange 2.
Sagen er den, du kan ikke påtage sig så en int er fire bytes.
Den only--
>> Davin: Jeg mener, for quizzen du kan.
[Griner]
>> ROB: Mm, nej.
Davin: Ja, ja du kan.
Hvis de spørger dig, hvor stor en int er, du kan ikke være, ligesom, fire eller otte.
ROB: Åh, så hvis Spørgsmålet er specifikt
lignende, hvis det er en kodende problem, du skal sige størrelse af int.
Hvis det er en tabel, eller det siger, hvor mange bytes,
du skal ikke udfylde størrelse int'er.
>> STUDERENDE: [griner]
>> Davin: Right, så hvorfor er størrelse int vigtigt her?
Så ligesom, hvis vi skal til 32-bit processor eller noget lignende,
så det kommer til at være fire bytes.
Men på nogle af de nyere stuff, kunne det være hvad?
Det kunne være otte, right?
Så denne-- hvis du bare svært kode fire, så på nogle maskiner, vil det fungere.
Nogle maskiner, vil det ikke fungere.
Men hvis den quiz vi er ligesom hvor stor er en int?
Sætte fire.
ROB: Right.
Davin: Ja?
STUDENT: Så fordi vi erklære [Uhørlig] inde i en funktion,
bør vi sætte 3 inde denne funktion?
Eller kan vi bruge det udenfor?
Davin: Du kan bruge det uden for denne funktion.
Så han beder om gratis.
>> STUDENT: miste overblikket hvor [uhørligt].
>> ROB: Åh, er det gratis ikke happen-- der er en del af magien i malloc
er, at du ikke er begrænset til lokale rækkevidde.
Du har fuld kontrol over hvor længe dine variabler bor.
Så vi kalder malloc her, det måske være en helt separat funktion.
Det kan være 10 timer senere at vi endelig ringe gratis.
>> Davin: Altså for eksempel, ligesom et par uger fra nu, når du endelig
gøre din ordbog speller psets, du vil
at have en funktion, som skaber tonsvis af knudepunkter.
Så du mallocing tons af knudepunkter i denne funktion.
Og senere i en separat funktion, er du
lyst til at befri alle de noder.
Så du kan bogstavelig talt lige gå til frigøre en pointer, så en hukommelse adresse
til, hvad du malloced.
Og det vil være fint.
Du behøver ikke at befri, lignende, i samme funktion.
Ja?
>> STUDENT: Så en malloc variabel [uhørligt] udenfor?
Er det hvad du siger?
Davin: Vent, sige det?
Undskyld.
>> STUDENT: Hvis en malloc variabel kan være fri overalt i koden,
så de kan tilgås overalt i koden?
Kan du holde dem lokalt?
>> Davin: Åh, spurgte hun, lignende, variable, like--
>> ROB: Så du stadig nødt til at have en form for henvisning
til malloc blok af hukommelse.
Så her, vi vender tilbage x.
STUDENT: Oh.
ROB: Hvis vi ikke returnerede x her, og det var bare ugyldig
så ville vi ikke have adgang til markøren, der blev malloced,
og det er lækket hukommelse.
>> STUDENT: OK.
>> Davin: Så ligesom, lad os sige, at du har dette, ligesom, lige her.
ROB: Nej.
Davin: I min vigtigste funktion, kan jeg ikke bare kalde denne x og være ligesom, OK,
i denne funktion, jeg gjorde det.
>> ROB: Right.
>> Davin: Så jeg har tænkt mig at ringe til x, lignende, hoved- eller noget lignende.
Du kan ikke gøre det.
Du kommer til at returnere noget.
Men hvad vil du vende tilbage?
Du kommer til at returnere en hukommelse adresse.
Og fordi du returnerer en hukommelse adresse, der kan tilgås andetsteds.
Flere spørgsmål?
Ja?
>> STUDENT: Er ovennævnte funktion være check på [uhørligt]?
>> Davin: Hvorfor behøver jeg ikke at gøre det?
STUDENT: [uhørligt].
Davin: Fordi du er ikke mallocing noget.
Så det er not-- ja, det er ikke kan lide en streng s.
Det er en pointer sted.
Disse er blot værdier.
STUDENT: OK.
Davin: Ja.
Noget andet?
ROB: Yep?
STUDENT: Men når du [uhørligt]?
>> ROB: Så for at frigøre hukommelse, ville vi sige her.
Så x er vores pointer til blokken hukommelse.
Vi gratis at pointer.
Og vi ville ikke nødvendigvis gøre det her.
Vi kan gøre det overalt.
Men du kun ringe gratis på noget der malloc afkast.
Så malloc, her, returneres hvad der bliver gemt i x.
Så vi kan ringe gratis på x.
Eventuelle sidste spørgsmål?
>> Davin: Eventuelle sidste spørgsmål?
Ja?
>> STUDENT: Beklager, kan du igen forklare hvorfor du vil frigøre derinde?
Hvorfor [uhørligt]?
>> Davin: For her?
>> STUDENT: Ja, som lige efter.
Davin: Du har sikkert ønsker ikke en gratis her.
ROB: Du vil sandsynligvis ikke.
Davin: Ja, at dette ville gøre noget.
Dette vil, ligesom, skabe hukommelse, gøre ting for det,
og derefter straks glemme alt om det, ja.
>> ROB: Men vi kan gøre, ligesom, i her for nogle grund.
Vi kan sige int stjerne y lig tilbagevenden array.
Har nogle ting med y, måske udskrive indholdet.
Og så, endelig, vi er færdige.
Vi kan gratis å.
STUDENT: [uhørligt].
Davin: Skal jeg rulle ned?
Tak.
ROB: Nice.
>> Davin: OK, det er det.
ROB: Okay, godt.
Held og lykke.
>> Davin: Hvis du har spørgsmål, email os.
Held og lykke.