>> SPEAKER 1: Hi everyone.
Vi kommer til å komme i gang.
Jeg tror folk fortsatt kommer å være filtrering i.
Men av hensyn til tid, så vi kan få dere ut herfra i tide,
vi kommer til å starte.
Så velkommen til CS50 Quiz 0 anmeldelse.
For de av dere som ikke har innsett ennå, har du et spørsmål på onsdag.
Woo-hoo.
>> Hvis du ikke har begynt å studere ennå, eller har ikke innsett at dette finnes ennå,
siste spørrekonkurranser og all informasjon om din quiz er på cs50.net/quizzes.
Det er noen ganske gode ting på der, siste quizer fra de siste 10
år, så vel som informasjon om denne quizen og emner
som vil bli dekket.
Så la oss komme i gang.
>> Så dere kanskje husker, den første kursdag David hadde disse lampene på.
Så egentlig, alt som går på under panseret på en datamaskin er
gjort i binær.
Binary betyr det det høres ut liker, 0 og 1-ere.
Den har to verdier som kan være representert.
>> Så akkurat som i den første dagen av seksjon når David skrudd på en lett
pære til å representere på, eller 1, vår datamaskin forstår binært som 0 og
1-ere, på eller av.
Grunnleggende om Binary.
Hvert sted er representert i basen to.
Så du legger 2 til 0-til 1 til 2 hele veien opp.
>> For å beregne hva din binære er å desimal, du bare følger denne ligningen
type ting.
Hvis du har en 1 i noen av disse stedene, du multiplisere det med uansett
basere det er i, legge det opp, og du får desimal.
Så dette er hvordan du teller til 5 i binær.
Akkurat som hva vi gjorde på siste lysbilde, dette er hvordan du ville
representerer 1 til 5.
>> Tilsvarende, akkurat som du kan legge til og trekke i desimal eller basere 10, eller
egentlig noen base, på kan legge og trekker i binær.
Nøyaktig hva du kan forvente når du legg til de to opp, hvis det tilsvarer større
enn 1, bære deg en en, gjør det et 0, og gjøre tillegg på den måten, bare
som du ville forvente med vanlig desimal eller en hvilken som helst annen base.
Cool.
>> Så som jeg sa tidligere, alt som foregår under panseret på vår datamaskin
er gjort i 0 og 1-ere, eller binær.
Så hvordan skal vi uttrykke, for eksempel, bokstaver eller tall, eller tegn?
Og svaret på det er ASCII.
>> ASCII er en mapping mellom tegn som vi normalt ville se i
Engelsk språk som A, B, C-tallet, understrek, bindestrek, og
noe sånt.
Og det kart som til en ASCII-verdi.
En ASCII-verdi er bare et tall som kan forstås av datamaskinen.
Og akkurat som du kan gjøre addisjon og subtraksjon med tall, kan du gjøre
dem med ASCII-verdier.
>> Så i dette eksempelet, hva vil dette skrive ut?
Ja, så bare en plass B plass C space D. Hvor ble min mus gå?
Legg merke til at du kan definere en int på 65 år.
Og når du skriver det ut ved hjelp prosent C, det vil tolke det som en
karakter og vil skrive ut A.
>> På samme måte kan du erklære det som en røye.
Og når du skrive den ut ved hjelp av prosent C, vil det tolke det som
prosent D. Og akkurat som du kan legge til en nummer, kan du legge til tegn er
ASCII-verdier, i dette tilfellet.
>> Så litt pekeren for alle.
5, som en streng, ikke gjør faktisk lik fem.
Så hvordan kan vi konvertere string 5 i heltall 5?
Noen ideer?
Yeah.
>> Så hvis vi har 5 som en streng, vi kan trekke fra 0.
Og det vil gi oss fem.
Og på lignende måte, dersom vi har 5 som en heltall, legger det til strengen 0.
Og det gir oss strengen fem.
Cool.
>> Nå husker tilbake å forelese en der vi snakket om algoritmer.
Så hvordan skal vi egentlig ønsker en datamaskin å gjøre interessante ting?
Du vet, bare legge til og trekke tall og utskrift ting ut er ikke
så spennende.
Vanligvis vi vil vår datamaskin til utføre noen slags algoritme.
Noe som er litt mer komplisert enn bare enkel aritmetikk.
>> En algoritme er bare en trinnvis sett med instruksjoner for hvordan man utfører
en viss task--
Akkurat som en oppskrift.
Du husker kanskje den første dagen av klasse der David hadde oss telle et rom
av mennesker og hvor mange mennesker var i rommet.
Du kan bli brukt til telling en etter en.
1, 2, 3, 4.
I det tilfellet, en lineær tids algoritme.
>> Men David innførte en algoritme for du å telle mennesker i rommet
der alle står opp, sier du din nummeret til en annen person, legge til at
tall opp, og en person setter seg ned.
Og du gjenta det.
Det er en type algoritme.
Vi kan analysere hvor effektivt en algoritmen er basert på det kjøres tid.
Men vi skal snakke litt mer om det senere.
>> Så alle algoritmer kan også være skrevet i pseudokode.
Pseudokode er bare en engelsk som syntaks brukes til å representere
et programmeringsspråk.
For eksempel, hvis vi ønsket å be en bruker å gjette min favoritt nummer, vi
kan ha pseudokode som sådan.
>> Få en brukere gjette.
Dersom gjetning er riktig, fortelle dem de er riktige, andre fortelle dem
de er ikke riktig.
Og pseudokode er en måte lett representerer en idé eller en algoritme.
Så nå er vi kanskje ønsker å faktisk skrive dette i språket at datamaskinen
kanskje forståelse.
Så vi kan skrive våre pseudo og tolke det inn i kildekoden.
>> Så langt må kildekoden følge til en bestemt syntaks
et programmeringsspråk.
Og så langt, i CS50, vi har brukt hovedsakelig c.
Så dette kan være kildekoden for c.
Senere i kurset, du natten kommer i kontakt med andre programmerings
språk som PHP.
Eller hvis du selv ta andre klasser, du kan gjøre Java, Python, eller enda OCML.
Men i vår c programspråk, er dette hvordan vi kan skrive kildekoden for
den pseudo algoritme som Jeg nettopp beskrev tidligere.
>> Så hvordan datamaskinen faktisk forstå det?
Som jeg sa tidligere, det eneste virkelig forstår nuller og enere.
Så hvordan få det fra kilden kode til noe som kan være
forstått?
Vel, har vi noe kalt en kompilator.
>> Hvis du husker tilbake på de fleste av dine psets, hadde du noen form for program
skrevet i en prikk c fil.
Og så ville du skriver make.
Så hva er gjøre å gjøre?
>> Du kan skrive make å kompilere programmet fordi someone--
hvem skrev din p sett; sannsynligvis David--
opprettet en make-fil.
Og som forteller at å vite for å kjøre din kompilator, kalt klang, som vil
deretter kompilere kildekoden til objekt koden, som er nuller og enere
at datamaskinen forstår.
Men litt senere, vil vi gå mer i dybden om kompilatorer.
>> Så husker PSet 0, where-- ja, Har du et spørsmål?
>> PUBLIKUM: [uhørlig]?
>> SPEAKER 1: Ja.
Jeg tror de faktisk bør være online.
Yeah.
>> PUBLIKUM: Er det som [uhørbart]?
>> SPEAKER 1: Det er det ikke.
Den er på cs50.net/quizzes.
>> PUBLIKUM: Slash spørrekonkurranser, slash 2013, slash 0, og klikker du bare gjennom
quizer 2013 og quiz 0, gjennomgang delen lysbilder.
>> SPEAKER 1: Ja, så hvis dere ønsker å Trekk den opp og se på det på din
egen datamaskin, er det helt greit også.
Si det igjen.
>> PUBLIKUM: [uhørlig].
>> SPEAKER 1: Ja, [uhørbart] er den dummy variabel.
Oh, yes?
>> PUBLIKUM: [uhørlig]?
>> SPEAKER 1: Nei, streik er ikke på eksamen.
Beklager, spørsmålet hennes var, var streik på eksamen.
Og det er det ikke.
Så PSet 0, bør dere ha alle implementert noe ved hjelp scratch.
Og vi har lært noen grunnleggende programmering byggeklosser som bruker scratch.
>> Så la oss ta en titt på noen av disse byggeklosser
som utgjør et program.
Først er boolsk uttrykk.
Boolske uttrykk er de og 0 er eller noe som har
to mulige verdier.
I dette tilfellet er sant eller usant, på eller av, og ja eller nei.
Et eksempel på et enkelt, meget enkel, program som bruker en boolsk
uttrykk her oppe.
>> Så for at boolske uttrykk til være nyttig, har vi boolske operatorer.
Disse er torer som kan benyttes å sammenligne visse verdier.
Så vi har og eller ikke lik, mindre enn, eller lik, større enn eller
lik, og mindre enn eller større enn.
Men disse aktørene er ikke veldig nyttig med mindre vi kan kombinere dem i
forhold.
>> Så dere kanskje husker fra scratch og fra p din setter at vi
hadde forhold.
De er, i hovedsak, som gafler i logikken i programmet som
eksekverer avhengig av hvorvidt en betingelse er oppfylt.
Så en av de forholdene som vi hadde brukt mange ganger i dette kurset er
Dersom annet, hvis, og Else forhold.
>> Her er et eksempel på hvordan du kan bruke det.
Er det noen som vet forskjellen mellom bare å bruke hvis uttalelser alle
veien ned versene hvis, Else, hvis, og ellers kombinert?
Ja?
>> PUBLIKUM: [uhørlig].
>> SPEAKER 1: Nettopp.
Så hvis jeg hadde hvis hele veien ned dette måten, selv om denne tilstanden avkastning
sant, vil det fortsatt fortsette testing av de to neste.
Mens, med en else-if, et annet uttalelse, hvis man returnerer true,
de andre er ikke testet.
Eventuelle spørsmål om det?
Cool.
>> Så du bruke en if-else av et annet setningen hvis du vet at det bare kan
være en av disse sakene.
Så vi vet om x er mindre enn 0, er det definitivt ikke kommer til å være
større enn 0.
>> Neste, en annen byggestein at vi har lært er løkker.
Vi har tre typer sløyfer.
For løkker, mens sløyfer, og gjøre mens sløyfer.
Og generelt, når du setter deg ned for å skrive noe, må du bestemme
hvilken av de tre du ønsker å bruke.
Så hvordan skal vi bestemme hvilken?
>> Vi bruker vanligvis en for løkke hvis vi vet hvor mange ganger vi ønsker å iterere
gjennom noe eller hvor mange ganger vi ønsker å utføre en oppgave.
Vi bruker mens sløyfer hvis vi trenger noen betingelse for å være sant å holde i gang.
Og vi bruker gjøre mens svært lik stund, men vi ønsker vår kode for å kjøre på
minst en gang.
>> Så gjør stund, alt som er i den gjør vil alltid kjøre minst en gang.
Mens, med samtidig, det kan ikke kjøre i det hele tatt hvis
Tilstanden er ikke fornøyd.
Eventuelle spørsmål med det?
>> Så strukturen til en løkke for.
Dere har alle sett dette.
Du initialisere den.
Du har en slags tilstand.
Så, for eksempel, kan vi initial som for jeg er lik 0.
i er mindre enn 10.
Og i ++.
Veldig enkel en som vi har gjort.
>> For en stund loop, på samme måte, må du å ha noen form for initialisering,
en slags tilstand, og en slags oppdatering.
Så vi kan implementere vår for loop også som en stund løkke ved hjelp av denne.
Og på samme måte med en gjør mens loop, vi kan ha noen initialisering,
utføre noe, oppdatere den, og deretter sjekke tilstanden.
>> Så nå funksjoner.
Vi setter alt sammen.
Vi ønsker kanskje å skrive noen slags funksjon.
Felles funksjon som du kanskje har sett allerede er viktigste.
Hoved er en funksjon.
Den har en returtype, int.
Den har en funksjon navn, hoved.
Og det har argumenter, argc og argv.
Så hoved er bare en funksjon.
>> Andre funksjoner du kanskje har brukt, printf-- printf er en function--
GetInt, toupper.
Men disse tilfeldigvis har vært implementert for oss ved
en slags bibliotek.
Hvis dere husker inkludert dette CS50.h biblioteket eller
standard I / O-bibliotek.
Ja, spørsmålet?
>> PUBLIKUM: Er hoved bare iboende i c?
Betyr det bare slags [uhørbart]?
>> SPEAKER 1: Spørsmålet er hvis viktigste er iboende i c.
Og ja, alle funksjoner har en hovedfunksjon.
Det er slags nødvendig for datamaskinen å vite hvor du skal begynne
kjøre koden.
>> PUBLIKUM: Så du ville ikke [uhørbart]?
>> SPEAKER 1: Nei
Eventuelle andre spørsmål?
Cool.
Så akkurat som du kan bruke en funksjon som er skrevet for deg, kan du også
skriv din egen funksjon.
Dette er en funksjon som noen kanskje er skrevet for å beregne volumet
av et q, for eksempel.
Det er en returtype her, i dette tilfellet int, vår funksjonsnavn q og vår
liste over parametere.
>> Og merk at du må skrive data type parameteren du vil
bruke eller annet funksjonen ikke vite hva slags
parameter bør jeg akseptere.
Så, i dette tilfellet, vi ønsker et heltall som våre innspill.
Så hvorfor kan vi ønsker å bruke funksjoner?
>> Først av alt, flott for organisasjonen.
De bidra til å bryte opp koden din inn mer organisert biter og gjøre
det lettere å lese.
Forenkling.
Dette er bra for design.
Når du leser et stykke kode og den viktigste funksjonen er virkelig,
veldig lang, kan det være vanskeligere å grunn om hva som skjer.
Så hvis du bryte det ned i funksjoner, det kan være lettere å lese.
Og gjenbruk-evne.
Hvis du har en mengde koder det er å være heter eller kjøre flere ganger,
i stedet for å måtte skrive den koden 10 ganger i hovedfunksjonen, kan du
ønsker å gjenbruke det.
Og deretter hver gang du trenger å bruke den stykke kode, kaller funksjonen.
>> Så nå hvis vi husker tilbake til scratch, Vi snakket også om noen begreper,
hvorav den ene er threading.
Gjenger er begrepet multippel sekvenser av koden
gjennomføring på samme tid.
Så tenker tilbake til dag én der David hadde dere telle antallet av
personer i rommet.
>> Hovedsak, hva som foregikk på er alle av dere var
kjører separate tråder.
Og disse trådene skulle komme sammen å få noen form for svar.
Tilsvarende, i Scratch, når du har flere sprites, kan du
har en katt og en hund.
Og de ville være samtidig kjører sine egne skript.
Det er et eksempel på threading.
>> Og den andre konsept som var introdusert i grunnen var hendelser.
Og hendelser er når flere deler av koden din kommuniserer med hverandre.
I Scratch, dette var da du brukte kringkasting kontroll og når jeg
Motta blokker.
>> Og også, i Problem Set fire, så vi en liten bit av arrangementer i tillegg.
Dere kan ha brukt den Gevent biblioteket.
Og det var en funksjon waitForClick der du ventet
for brukeren til å klikke.
Og din klikk, i dette tilfellet, ville være arrangementet og vente på klikk er ditt
hendelseshåndterer.
>> Og også, gjennom publiseringen psets og arbeider på dine psets, du
kan ha kommet i kontakt med noen av disse kommandoer.
Dette er hva du skrev i din terminalvindu eller hva vindu
som dukker opp på g edit til, hovedsak, navigere på datamaskinen.
>> Så for eksempel, viser LS den innholdet i en katalog.
Gjør katalogen oppretter en ny mappe.
CD, endre katalogen.
RM, fjerne sletter en fil eller en katalog.
Og deretter fjerne katalogen fjerner en katalog.
>> PUBLIKUM: [uhørlig]?
>> SPEAKER 1: Ja, sikkert.
Sorry, var spørsmålet om du ville foreslå å sette dette
på jukselapp.
Det kan hjelpe.
Hvis du har plass, kan du sette den på.
Det er også bare generelt god nok å huske fordi når du bruker det
vil du kanskje bare har det i minnet.
Som vil gjøre livet mye enklere.
Sa jeg svare på spørsmålet ditt?
>> Så nå, snakket vi litt kort om bibliotekene.
Men de to viktigste de som vi har vært hjelp så langt i kurset er
standard I / O og CS50.
Hva slags ting er inkludert i standard I / O-bibliotek?
>> Ja, så langt vi har brukt printf.
I CS50, har vi brukt GetInt og GetString.
Og datatypen string også skjer å bli erklært i denne CS50 biblioteket.
Vi skal snakke litt mer i dybden om hvordan bibliotekene fungerer og hvordan de
samhandle med resten av koden din.
Men de er de to viktigste de som vi har kommet i kontakt med så langt i
kurset.
>> Typer.
Dette er greit å huske hvor mye hver type er representert ved eller hvor
mange byte hver av type requires--
int, 4 byte; røye, 1 byte.
Float er 4 byte.
Hva er en dobbel?
>> PUBLIKUM: [uhørlig].
>> SPEAKER 1: Ja, så en dupp men doble størrelsen.
Hva med en lang?
>> PUBLIKUM: [uhørlig].
>> SPEAKER 1: OK.
Hva er en lang?
>> PUBLIKUM: [uhørlig].
>> SPEAKER 1: Ja, doble en int.
Ja.
>> PUBLIKUM: [uhørlig].
>> SPEAKER 1: Long [uhørbart].
Og deretter en lang lang er det dobbelte.
>> PUBLIKUM: Nei, nei.
En lang er bare en int.
Det avhenger av arkitektur før [uhørbart]
og int har samme størrelse.
[Uhørbart].
>> SPEAKER 1: Så en lang og en int er de samme.
Og deretter en lang lang er dobbelt int.
Cool.
Og så, hva er den siste typen?
>> PUBLIKUM: Pointer.
>> SPEAKER 1: Ja, så vi har lært litt om pekere.
Og uansett hva en peker er peker til-- det kunne være en char stjerne
eller en int star--
det er alltid 4 byte for en peker.
Spørsmål om det?
Ja?
>> PUBLIKUM: [uhørlig]?
>> SPEAKER 1: Så en lang og en int er det samme i denne CS50 apparatet.
>> PUBLIKUM: Apparatet er helt utskiftbare.
>> SPEAKER 1: Yeah.
Så da en lang lang er dobbelt en int.
>> PUBLIKUM: Dette er den 32 bit?
>> SPEAKER 1: 32 bit, ja.
>> PUBLIKUM: Så [uhørbart]?
>> SPEAKER 1: Ja, hvis det ikke gjør det eksplisitt sier, du
bør ta en 32 bit.
>> PUBLIKUM: Det ville si noe som forutsatt et
arkitektur som apparatet.
For 64 bit, det eneste som Endringen er lengter og pekere.
De begge [uhørbart].
>> SPEAKER 1: Ja?
>> PUBLIKUM: Spørsmål.
Så på den ene av de praktiske tester, den ber om en usignert int.
Så hvordan ville det bli bestemt fra en int [uhørbart]?
>> SPEAKER 1: En usignert i er også 4 bytes.
Men hva er annerledes med en signert int og en usignert int?
>> PUBLIKUM: [uhørlig].
>> SPEAKER 1: Høyre.
Man kan representere negative verdier.
Men hvordan gjør den det?
>> PUBLIKUM: [uhørlig].
>> SPEAKER 1: Ja, det sparer en bit for å representere tegn.
Den signerte har en smule at representerer tegnet.
Og usignerte er bare alle positive.
>> PUBLIKUM: OK.
Så du sier at en dobbel er dobbelt så stort som en dupp?
>> SPEAKER 1: Dobbelt er dobbelt størrelsen av en flottør, ja.
>> PUBLIKUM: Hvordan virker en peker til en lang lang [uhørbart]?
>> SPEAKER 1: Så spørsmålet er hvordan gjør pekeren til en lang long--
Hvordan er det bare fire byte når en lang lang sine 8 byte.
Så husk hva som er en peker, essensielt, i det grunnverdi.
>> PUBLIKUM: [uhørlig].
>> SPEAKER 1: Ja, så en peker er bare en minneplassering.
Så det spiller ingen rolle hvor mye plass at pekeren peker til.
Den trenger bare 4 byte for å holde orden av den minnelokasjon.
Eventuelle andre spørsmål?
Cool.
>> Så det siste jeg har er standard ut.
Du bør bruke dem ofte nok til at du kan huske.
Men dette er når vi bruker printf, f.eks.
Og vi har disse plassholdere som ble kalt formatkoder.
>> Så prosent c røye, prosent i for int, og vi kan også bruke prosent d.
Det er det samme.
Men, generelt, i CS50 vi prøver å bruke prosent i.
Prosent f for float.
Prosent ld for lang lang og prosent s for streng.
>> Tilsvarende har vi brukt noen av disse escape-sekvenser.
For eksempel backslash n for ny linje.
Dette er bare for når du formaterer koden for print f.
Ja?
>> PUBLIKUM: Hva er prosent d for?
>> SPEAKER 1: Så spørsmålet er hva som er prosent d for?
Prosent d er for ints.
Prosent d og i prosent, er de samme.
>> PUBLIKUM: Hva er forskjellen mellom backslash n og backslash r?
>> SPEAKER 1: Så spørsmålet er hva som er den Forskjellen mellom tilbakeslag n og
tilbakeslag r?
Jeg tror backslash r er--
>> PUBLIKUM: Så skråstrek r bare innebærer returnerer til begynnelsen av linjen
uten å faktisk gå til en ny linje.
Så hvis du skriver ut en backslash r og du gå tilbake til begynnelsen av linjen
så du skriver ut flere ting, du overskrive ting du allerede har på
[Uhørbart].
Mens, n faktisk går til en ny linje og går til [uhørbart].
>> SPEAKER 1: Vel, noen andre spørsmål?
Greit.
Jeg kommer til å levere den til Dan som vil fortsette.
>> [APPLAUSE]
>> DAN: All righty.
Snakker så jeg skal være om en annen bredt spekter av ideer fra den klassen som er
omtrent representant for uke to og starten av uke tre starter
med casting, som er bare en måte å behandling av en verdi av en bestemt type som
en verdi av en annen type.
Så vi kan gjøre dette med tegn til ints, flyter til ints, og
lange lengter å doble.
>> Alt dette kan anvendes som måter behandle noen numerisk verdi
minus røye som noen annen numerisk verdi.
Så det er noen problemer med dette, kurset, som kommer når du kaster
ting som flyter til ints.
Så dette er litt merkelig.
Vi har en flåte som er 1.31.
Vi multipliserer det med 10.000.
Og da er vi skrive det ut som en int.
Hva gjør denne produksjonen?
10.000 ganger 1,31.
Så 13.000, er at gjetning?
>> PUBLIKUM: Jeg tror det er 10.000.
>> DAN: Så jeg multiplisere det med 10 000 før jeg kaster den.
>> PUBLIKUM: Oh.
Ville ikke det være ett 9 og noen 0 tall?
>> DAN: Du har kanskje noen rare sifre.
Så rett, det er 1,3 ganger 10.000.
Så det er 13.000.
Og denne ekstra weird--
>> PUBLIKUM: 13.100.
>> DAN: 13.100.
Takk, Rob.
Og denne ekstra weirdness--
dette 9,9--
er rett og slett fordi dette casting endte opp med å runde nedover der
det skal ikke ha.
Yeah.
>> PUBLIKUM: Støpingen skjer etter noe annet?
>> DAN: Så fordi jeg har dette på trykk, det gjør dette multiplikasjon før det
gjør dette casting.
>> PUBLIKUM: [uhørlig].
>> DAN: Jeg tror det ville kaste først, yeah, som ville være 10.000.
Noe mer?
Cool.
Så dette er 13099.
Hvorfor skjer dette?
Unøyaktighet.
>> Flyter er ikke perfekt.
De kan bare representere tall til en visst antall signifikante sifre.
Så hvis vi skrive ut åtte sig fiken på denne flyte, får vi en slags
stygg leter nummer.
Og det er fordi 1.31 kan ikke nøyaktig være representert ved en enkel
makter to i maskinen.
Så det ender opp med å ta den nærmeste gjette, som ender opp
blir litt lav.
Fornuftig?
OK.
>> Nå, byttet er en annen måte å gjør betinget utsagn der alle
vi bryr oss om er en enkelt variabel.
Så i dette eksempelet, er vi får et heltall fra brukeren.
Og så ser vi på hva som heltall er.
Antagelig er det nummer mellom en og fire.
Det er det vi ber om.
>> Så du gjør en bryter av variabelnavnet.
Da har du satt opp tilfeller av mulig verdier det kunne være.
Så tilfelle en, sier det er lavt.
Og så du bryte å komme seg ut av brytertilstand så
du trenger ikke holde det gående.
>> I neste case--
så fall to og saken three--
hvis det er tilfelle to det bare synker ned til den første linjen med kode det ser som med
sak tre til den ser en pause.
Så grunnen til at du får saken en til bare utskrifts lav er fordi jeg
har denne pausen her.
Hvis jeg for eksempel ignorert dette break-- hvis jeg kastet denne breakaway--
det ville ut lavt, og da ville det skrive ut midten, og da ville det bryte.
>> Så pauser er en viktig del bryter forhold og
de skal være der.
Eventuelle saker som ikke fremgår eksplisitt håndteres av standard
tilfelle i bryteren og blir kastet.
>> PUBLIKUM: So 1, 2, 3, og 4 ville være n?
>> DAN: Verdier som n kan være.
Ja.
Yeah?
>> PUBLIKUM: Så når du har at [uhørbart]?
>> DAN: Du ville skrive ut lavt, og deretter det ville skrive ut midten, og
da det ville bryte.
>> PUBLIKUM: Hvorfor skulle det skrives ut midten hvis [uhørbart]?
>> DAN: Så alt under en sak før en pause faller inn under.
Så tilfelle en print er under sak en som er dette etter print.
Yeah?
>> PUBLIKUM: [uhørlig]?
>> DAN: Så dette tallet er bare en bestemt verdi at denne variabelen
kan ta, ikke sant?
Betyr det fornuftig?
Yeah.
>> PUBLIKUM: [uhørlig]?
>> DAN: Ja, sak to ville skrive ut midten og deretter bryte.
>> PUBLIKUM: [uhørlig]?
>> DAN: Jeg tror noen?
Hvilke andre datatyper kan du bytte over?
>> PUBLIKUM: Du kan bytte i løpet av noen datatyper.
Men det betyr bare noe over tegn og ints og ting som det, fordi
hvis du bytter over en peker som egentlig ikke gir mening,
bytter over belastninger, hvis det enda la oss du gjør det, på grunn av flyttall
i presisjon, ikke ville du virkelig ønsker å gjøre det likevel.
Så ganske mye, bare ints og chars og sånt.
>> DAN: Ja, det er når du har eksplisitt verdier som du vet, tror jeg, kan være
at en bryter er faktisk nyttig.
Bra?
OK.
>> Scope er det området som en erklært variabel strekker.
Så i denne lille mengde koder jeg har, det ville være full av feil.
Og grunnen er at jeg erklærte dette int I innenfor omfanget av denne for sløyfen.
Og så prøver jeg å referere til at Jeg utenom at for loop omfang.
>> Så i utgangspunktet, kan du tenke på omfanget som noe som du deklarerer
med inne i et sett av klammeparentes bare eksisterer innenfor disse klammeparentes.
Og hvis du prøver og bruke den variabelen Utenom disse klammeparentes, vil du
får en feilmelding fra kompilatoren.
Yeah?
>> PUBLIKUM: Så dette ikke virker?
>> DAN: Dette fungerer ikke, ja.
Strenger.
String en char *.
De er akkurat det samme.
De er bare pekere til tegn.
Og noen strenger som du har bør ende med backslash null, som er bare
en c-konvensjonen.
>> Det kalles NULL terminator.
Og NULL--
hovedstaden N, kapital U, kapital L, kapital L--
er ikke den samme som den NULL terminator.
Dette er en peker.
Dette er et tegn.
De er veldig tydelig.
Husk det.
Det vil være på quiz, sannsynligvis.
Jeg har ikke sett quizen.
Yeah?
>> PUBLIKUM: Så NULL er, si, pekeren?
>> DAN: Ja.
>> PUBLIKUM: Hva betyr [uhørbart]?
>> DAN: Hvis, sier, malloc kalles når du ikke har nok minne til å få
uansett størrelse du ber om, malloc returnerer NULL.
Det er, i utgangspunktet, når en funksjon er skal returnere en peker, du
må sjekke mot NULL fordi NULL er en ganske bra--
det er, liksom, søppel verdi.
Det er en null så langt som pekere gå.
>> Når du kaller en funksjon, som returnerer en peker.
Du kommer til å ønske å sjekke for å være sikker på at at pekeren er ikke NULL
fordi NULL er svært vanlig.
Det er liksom en søppel retur.
Så hvis noe ikke går som den skal, bare returnere NULL stedet.
>> PUBLIKUM: [uhørlig]?
>> DAN: Ja, og det er dette.
>> PUBLIKUM: [uhørlig]?
>> DAN: Stav det som dette.
Det er NULL terminator.
Det er små N-U-L-L hvis du stave det.
>> PUBLIKUM: Og jeg bare gikk tilbake og testet det.
Og hvis du prøver å sette et flyt verdien i en bryter, vil det kjefte på deg
sier, krever uttalelse uttrykk av heltall type.
>> DAN: Der du går.
Men ja, hva var spørsmålet igjen?
>> PUBLIKUM: [uhørlig]?
>> DAN: Så hovedstaden N, kapital U, kapital L, er kapital L en faktisk c ting.
Det er NULL-peker og vil bare bli behandlet slik.
Du vil aldri prøve å stave NULL karakter og se noen
annen måte enn dette.
Yeah?
>> PUBLIKUM: Så tilbake til char max eller noe i notatene, ville det
legemliggjøre den samme funksjonen som [uhørbart]?
>> PUBLIKUM: Så du henviser til retur røye maks fra getchar, eller
uansett hva det er?
>> PUBLIKUM: Yeah.
>> PUBLIKUM: Ja, så den generelle betegnelse for alle disse tingene
er fast punkt verdier.
Så som returnerer int max fra GetInt og røye maks fra getchar, er det
ment å være som, greit, hvis disse tingene er tilbake til oss,
noe gikk galt.
>> For pekere, vi bare tilfeldigvis har dette sentinel verdi at alle
samtykker på.
Og dette er ting du kommer tilbake når ting går galt.
Så røye max er hva vi bruker å representere noe
som NULL eller getchar.
>> PUBLIKUM: Så hvis du tester getchar, kan du bare sette NULL?
Ville det gjøre en forskjell?
>> DAN: Du kunne ikke bare sjekke NULL.
Du må sjekke røye maks fordi returverdien fra funksjonen er
et tegn som ikke en peker.
Yeah?
>> PUBLIKUM: Dette spørsmålet spør for strengen lengde.
Betyr det inkluderer NULL karakter?
>> DAN: Nei
Og det er faktisk hvordan strenglengde vet å stoppe fordi det går gjennom
din rekke tegn til den ser en NULL karakter.
Og da er det sånn, alt Greit, jeg er ferdig.
>> PUBLIKUM: [uhørlig] fem?
>> DAN: Hei ville være fem.
Jepp.
Så arrays er kontinuerlige minneblokker.
De har umiddelbar tilgang ved å si navnet på tabellen og da, i krøllete
bukseseler, uansett indeksen du vil gå å, de er indeksert fra null gjennom
lengden av matrisen minus en.
>> Og de er erklært av type ting som du lagrer i
array, navnet på tabellen, og deretter uansett størrelse er av denne matrisen.
Så dette er en røye array med lengde seks som har disse verdiene.
Yeah?
>> PUBLIKUM: [uhørlig]?
>> DAN: Yeah.
>> PUBLIKUM: [uhørlig]?
>> DAN: Hvis du har hva som skjer inn i matrisen som allerede er gjort.
Så du kan spesifisere dette i stedet som, si, røye, hva navnet ditt
matrise er, tomme parentes tilsvarer krøllete spenne H komma E komma L komma L komma
O komma NULL karakter og klammeparentes.
Det ville også fungere som en erklæring.
>> PUBLIKUM: [uhørlig]?
>> DAN: Da må du ha størrelsen allerede gjort.
>> PUBLIKUM: [uhørlig]?
>> DAN: Ja.
All righty.
Kommandolinjeargumentene er en måte å å få input fra brukeren som
argumenter til hoved.
Hoved tar to argumenter.
Antallet argumenter som blir ført langs kommandolinjen og en
string vektor eller en strengtabell av alt av argumentene.
>> Så hvis jeg for eksempel kalt en funksjon, for eksempel en prikk ut 1 plass, 2 plass, tre,
argc ville være fire.
Og argv 0 ville være en punktstedene.
Argv1 ville være en.
argv2 ville være 2. argv3 ville være 3, i det aktuelle tilfellet.
Yeah?
>> PUBLIKUM: [uhørlig]?
>> DAN: Det siste elementet i matrisen fordi matrisen er lengden argc pluss
en av ARGB, det siste element er NULL pekeren.
Det er argc pluss 1.
Så i tilfelle at jeg nettopp sa, det ville bli argv 0 er en prikk ut.
argv 1 er 1. argv2 er 2. argv 3 er tre.
argv 4, som er en større enn argc ville være NULL.
>> Og det er NULL-peker.
Ja.
Og det er fordi strengen er en char stjerne er en peker.
Så det må være av samme type.
Yeah?
>> PUBLIKUM: To spørsmål.
Så en, hva er forskjellen mellom denne og GetString annet enn en type
i bruker motor?
Og to, blir det lagret i din siste minnet?
Så like, ville GetString være [uhørbart]?
>> DAN: Hvor blir det lagret?
Jeg vet ikke hvor den er lagret.
>> PUBLIKUM: Så, faktisk, vet du hvordan noen fungere du kaller det er argumenter
er lagret i stakken?
Så argc og argv er argumenter til hoved og de er på stabelen, eller egentlig
like over hva du synes som starten av stabelen.
Det som var den andre delen av spørsmålet?
>> PUBLIKUM: Så hva er [uhørbart]?
>> DAN: Ja, det er bare en annen måte for å få input fra brukeren.
Denne er litt mer effektiv og det er smidigere for skript fordi du
kan bare passere argumenter til hovedsiden funksjon i stedet for å måtte vente
for brukerne hvis du ikke har noen brukere.
>> PUBLIKUM: Og ja, få strenger ville være [uhørbart].
Det ville lagre ting du trenger.
>> DAN: Yeah?
>> PUBLIKUM: [uhørlig]?
>> DAN: Ja, argv 0 inkluderer alltid den dot slash av funksjonskall.
Yeah?
>> PUBLIKUM: [uhørlig]?
>> DAN: Ja, hver av argumentene er endte i NULL karakter fordi de
er strenger.
>> PUBLIKUM: [uhørlig]?
>> DAN: Ja, er argv argc en NULL-peker.
>> PUBLIKUM: [uhørlig]?
>> DAN: Oh yeah.
Ja, beklager.
>> PUBLIKUM: Så [uhørbart]?
>> DAN: Så spørsmålet er om du hadde kommandolinje dot slash en prikk ut 1, 2,
ville antallet av kommandolinje argumenter være to eller ville det være tre?
>> PUBLIKUM: Jeg tror det ikke virkelig betyr noe.
Jeg pleier å si, oh, har du ikke forbi noen kommandolinjeargumentene da
åpenbart, kalt deg funksjonen.
Så jeg pleier å vokalt utelukke funksjon fra kommandolinjen
argumenter selv om det er inkludert i argv.
>> DAN: Men hvis det var på test--
yeah-- og også hvis du sier noe som argc er lik 3,
du er i trygge stående.
Yeah?
>> PUBLIKUM: [uhørlig]?
>> DAN: Jeg tror at hvis stedet for å ringe dette i argc og streng argv brak
men holdt samme type og bare kalt dem noe annet som en
og b, vil det fortsatt fungere?
Og det vil fortsatt fungere, du ville just--
stedet for å bruke argc-- du ville bruke a og b.
Yeah?
>> PUBLIKUM: [uhørlig]?
>> DAN: Så spørsmålet er GetString er skal lagre minne i haugen
fordi GetString er char *.
Den lagrer minne i haugen fordi det nå kaller malloc innenfor selve
gjennomføring av GetString.
OK, går videre.
>> Sikkerhet.
Så for å være virkelig sikker, stoler du på ingen en, og du tillater ingen tilgang til noen
av din informasjon, og det er derfor alle bygger sine egne maskiner,
sine egne operativsystemer, all deres programmer fra grunnen av, og selvsagt
ikke koble til andre maskiner via internett.
Så datamaskiner er usikre.
De egentlig er.
Vi må stole på andre mennesker.
>> Og ideen om sikkerhet er at du er forsøker å begrense mengden av
tillit som du trenger.
Og et av midlene du gjør det er gjennom kryptografi.
Kryptografi er, i hovedsak, vi har hemmeligheter.
>> Noen ganger må vi passere våre hemmeligheter sammen gjennom, si, internett eller
andre ting.
Og vi ønsker ikke folk å vite disse hemmelighetene.
Så vi kryptere våre hemmeligheter til en måte som vi håper ingen kan finne ut.
>> Så vi used--
gjennom i løpet av denne class--
ting som Caesar chiffer og [Uhørbart], som begge er veldig, veldig
usikre måter å kryptere ting.
De er lett å finne ut hva de er og hva dine hemmeligheter er.
Den virkelige verden bruker mye mer kompliserte kryptering ordninger.
Og vi vil ikke komme inn mye mer enn det.
>> Feilsøking.
GDB er den beste.
Jeg kommer til å understreke dette igjen.
Bruk GDB hele tiden hver gang du har et problem.
Kommandoer som er nyttige i GDB er stykker, noe som du passerer enten en linje
nummer, en funksjonsnavn, i hovedsak hvor i koden du ønsker å stoppe,
og være i stand til å ta kontroll.
>> Print tar en variabel og skriver ut uansett at variabelen er på det
punkt i utførelsen din.
Neste flytter utførelse din langs ett trinn.
Og gå skritt inne en funksjon i utførelsen din.
>> Andre ting blir drevet, som er hvordan du faktisk kjøre koden din.
Fortsett tar alle trinnene som trengs å komme til neste pause poeng.
Og det er mange, mange andre.
Slå dem opp.
De er store.
Yeah?
>> PUBLIKUM: [uhørlig]?
>> DAN: Ja, som er en debugger.
Så en debugger er et program som kan du feilsøke programmet.
Det er ikke et program som finner bugs for deg, selv om det ville være flott.
>> Og sist for meg er søk.
Så hvilke typer søk som vi snakket om i denne klassen er lineære søk,
som er akkurat som du ser gjennom hver element av søkeområde, en
element om gangen, til du finner det du leter etter, eller til du kommer
slutten av søket plass der peker du sier at du ikke kunne finne
elementet som du var ute etter.
Og dette tar i beste fall konstant tid, som er 0 på 1 og i verste fall lineære
tid, som er 0-n.
>> Binære søk, som trenger simpel elementer.
Du går til midten av dine elementer, se om elementet du leter etter
er større eller mindre enn elementets at du er på midten.
Det det er større, sier du at bunnen av søket plassen er din
gjeldende plassering, midt, og du starter prosessen.
Hvis det er mindre, ser du si at the-- ja, hva skjer?
>> PUBLIKUM: [uhørlig]?
>> DAN: Ja.
Enhver form for slag som er blitt undervist i klassen er fritt vilt for testen.
>> [Latter]
>> DAN: Og det faktum at du ikke har hatt å gjøre det for et problem sett, er det rimelig
spill for testen.
>> PUBLIKUM: Kan vi gå over det hvordan til--
>> DAN: Det vil bli gått over.
>> SPEAKER 2: Den faktiske koden for [Uhørbart] er på study.cs50.net.
Så hvis du ser på praksisen problem i flettingen slags side av
study.cs50.net, det er koden for gjennomføring flette slag.
Så du trenger ikke å implementere det selv i kveld.
Men sørg for at du forstår det heller enn bare memorere den.
>> PUBLIKUM: [uhørlig]?
>> SPEAKER 2: Flettingen slags side på study.cs50.net, er det et praksis
problem at hvis du klikker gjennom problem, helt til slutt er det en
løsning, som er flettingen Sorter gjennomføring.
Men sørg for at du forstår det snarere enn bare å memorere det
eller kopiere det ned.
>> PUBLIKUM: Og en helt gyldig problem for eksamen ville være
noe sånt her er en liste.
Hva betyr denne listen se ut etter ett skritt av valg sortere eller
innsetting hva slags eller.
En hel iterasjon av listen.
Så selv om du ikke ender opp med å måtte kode for det, må du forstå det
nok til å vite hvordan det går skal endre denne tabellen.
>> DAN: Det er nok for meg.
>> [APPLAUSE]
>> LUCAS: Hei alle sammen.
Mitt navn er Lucas.
Jeg kommer til å snakke om rekursjon, alt de former som vi har lært, og en
litt av alle pekere.
OK?
Så først av alt, rekursjon.
Hva betyr det å si at en funksjon er rekursiv?
>> PUBLIKUM: Kaller seg.
>> LUCAS: OK, kaller seg, ja.
Så som dette bildet, f.eks.
Det er som på bildet inne av et bilde, og så videre.
Så for eksempel, kan du have-- som Dan som snakket om binære søk.
En måte som binære søk er rekursiv er det faktum at du er
prøver å finne et nummer.
Så du går til midten.
Og så du sjekke om tallene der i venstre og høyre.
>> Og så hvis du finner ut hvor mange er kommer til å være på venstre side, er det det samme
ting som gjør søket på nytt, men bare på den venstre side av listen.
Så det er slik det høres ut som om det er rekursiv.
Så det er derfor dere har rekursive løsning for flettingen slag.
>> OK, så her er et eksempel.
Så la oss si at jeg ønsker å velge alle tallene fra 1 til n.
Jeg kan forstå at summen av de n nummeret er n pluss n minus 1 opp til 1.
Men så, hvis jeg ser på n minus 1 pluss n minus 2 pluss 1, som er det samme
ting som summere tall opp til n minus 1.
Så jeg kan si summen av en lik sum n er lik pluss summen av n minus en.
Betyr det fornuftig?
>> Og jeg ville også ha noe annet kalt base tilfelle, som er at
summen av tallene opp til null vil være null.
Så så snart jeg får til antall null, stopper jeg å telle.
Betyr det fornuftig?
>> Så her er et eksempel på hvordan Jeg kan implementere det.
Så jeg har denne funksjonen i noen.
Som tar et heltall n.
Så her jeg først sjekke om n er mindre eller lik null.
Så hvis det er mindre enn eller lik null, I returnere null, noe som er tilfelle vår base.
Ellers kan jeg bare gå tilbake n pluss summen av tallene fra
en til n minus én.
Fornuftig?
OK.
>> Så her er hva det ser ut som.
Du har summen av to likeverdige 2 pluss summen av 1..
Nogen av 1 er 1 pluss summen av 0, som er 0.
Fornuftig?
Så hvis vi ser på bunken med din program, dette er hva det ser ut som.
>> Først har vi den viktigste funksjonen.
Og da den viktigste funksjonen kalt sum to.
Og så sum 2 kommer til å si, oh, sum 2 er lik 2 pluss summen av en.
Så jeg legger summen av 1 til bunken.
Og summen av 1 kommer til å ringe sum 0, som også kommer til å bli lagt
av stabelen.
Og så hver av disse de som er på toppen av en annen må returnere
før de andre som kan holde det gående.
>> Slik at for eksempel her, summen av 0, først, kommer til å returnere 0.
Og velg deretter summen av en.
Da summen av 1 skal returnere en slik sum av 2.
Og til slutt, summen av 2 kommer for å gå tilbake 3 til hoved.
Betyr det fornuftig?
>> Det er veldig viktig å forstå hvordan stabelen fungerer og prøve å
se om det er fornuftig.
OK, så sortering.
Så hvorfor er sortering viktig, først av alt?
Hvorfor skal vi bry oss?
Anyone?
Gi meg et eksempel?
Yeah?
>> PUBLIKUM: [uhørlig].
>> LUCAS: Ja, OK.
Så du kan søke mer effektivt.
Det er en god måte.
Så, for eksempel, har vi mye ting, egentlig, i våre liv som
er sortert.
For eksempel ordbøker.
>> Det er veldig viktig å ha all ord i en slags orden at vi
kan få tilgang lett.
Så det er hva han sa.
Du kan søke mer effektivt.
Tenker på hvor vanskelig det er å ha en ordbok der ordene er i
tilfeldig rekkefølge.
Du må se på, ganske mye, hvert eneste ord til du finner
ord som du leter etter.
>> Hvis du bruker Facebook også, når du ser på dine venner, er du
kommer til å se at Facebook sette nærmere venn er på toppen av de
at du ikke snakker med så mye.
Hvis du går hele veien til bunnen av din venneliste, kommer du til å se
folk som du sannsynligvis ikke engang husk at du er venner med.
Og det er fordi Facebook slags dine venner basert på hvordan
nær du er til dem.
>> Så organisere data.
Også Pokemon.
Så du ser at alle Pokemons har tall.
Og det er som en enkel måte å få tilgang til data.
>> PUBLIKUM: Tilgang Pokemon.
>> LUCAS: Yeah.
>> PUBLIKUM: [uhørlig].
>> LUCAS: Yep.
OK, så utvalget slag.
Utvalg slags kommer til å velge minste usortert verdien av en liste hver
tid i hver iterasjon.
Det er typen som den typen som du gjør i hodet ditt når du prøver å
sortere en liste på hånden.
>> I utgangspunktet er alt du gjør du ser for det minste tallet.
Du setter den i den sorterte listen.
Og så du se etter neste minste tallet.
Og så du fortsette å gjøre at og så videre.
>> Så utvalget typen er i utgangspunktet du hver gang velger den minste
usortert verdi.
Sett på slutten av den sorterte del av listen.
Og fortsette med det.
Så la oss raskt se hva dette ser ut som.
Så her er sortert og usortert liste.
>> Så for sortert av listen, det er i utgangspunktet tom.
Og så kommer jeg til å velge minste tallet her, som er to.
Så jeg få nummer 2 og jeg satt på forsiden av listen.
Og så ser jeg for neste minste element, som er 3.
Så jeg satte den på slutten av den sorterte listen.
Og da jeg fortsette med det.
Jeg finner fire og sette den på slutten.
Finn fem og sette den på slutten.
>> Og se på hvordan alle de gangene Jeg sier sette den på slutten er,
utgangspunktet, bytte to verdier.
OK?
Og så den siste, du bare ha ett element.
Så det er allerede sortert.
>> OK, så innsetting slag.
Sortering ved innsetting du kommer til å ha også den tingen for å ha en sortert og
en usortert liste.
Det eneste er at hver gang du legger til et element i den sorterte
liste, du bare plukke elementet som er foran usortert liste.
Og så kommer dere til å finne hva stilling det skal være i den sorterte
del av listen.
>> La oss se hva dette er så dette er mer fornuftig.
Så i utgangspunktet, for eksempel, jeg prøver for å sette inn det nummer tre i
sorterte delen av listen.
Så listen ikke har noe.
Så jeg kan bare sette nummer tre.
>> Nå ønsker jeg å legge til nummer 5 til den sorterte delen av listen.
Så jeg ser på antall 5.
Jeg merker at det er større enn 3.
Så jeg vet at det må være etter tre.
Så jeg satte tre og fem.
>> Så jeg ønsker å sette inn nummer to.
Jeg merker at nummer 2 er faktisk vare så både 3 og 5.
Så jeg faktisk nødt til å sette det hele an i begynnelsen av listen.
Så jeg må, type, skifte alle elementer i sortert liste så jeg kan
gjøre plass til nummer 2.
>> Da ser jeg nummer 6.
Jeg ser at det skal være etter fem.
Så jeg satte den der.
Og til slutt, jeg ser på nummer 4.
Og jeg merker det skal være mellom 3 og 5.
Og da jeg satte den der og skift alle de andre elementene.
Fornuftig?
>> Bubble Sort.
Så boble slags er egentlig hva du er kommer til å gjøre-- vi kaller det boble
Sorter fordi du går gjennom list-- det er faktisk bedre hvis jeg bare vise
du liker dette--
og du kommer til å sammenligne tilstøtende tall.
Og du kommer til å bytte sin stillinger hvis de ikke er
i riktig rekkefølge.
>> Så i utgangspunktet, hva som kommer til skje er her f.eks
du har 8 og 6.
Du vet at den sorterte rekkefølgen vil faktisk være 6 og 5, ikke sant?
Så du kommer til å bytte ordrene.
Da ser jeg 8 og 4 her.
Og jeg gjør det samme.
Jeg bytte igjen.
Og til slutt, 2 og 8.
Jeg også bytte dem.
>> Det kalles Bubble Sorter fordi etter hver av disse iterasjoner, faktisk
det største tallet i listen får alle veien til enden av listen.
Betyr det fornuftig?
Fordi det holder å bytte den og flytte den til høyre.
>> OK, så dette er den andre iterasjon.
Det ville være det samme.
Jeg skal gjøre ett bytte og Da den siste.
Jeg at det ikke er noen bytteavtaler og listen er sortert.
Så i Bubble Sorter, vi i utgangspunktet holde å gå gjennom listen og bytte
ting til jeg merker at jeg ikke gjorde eventuelle bytteavtaler gjør at iterasjon, som
betyr at listen er allerede sortert.
Fornuftig?
>> La oss snakke litt om driftstid.
Så gjør dere husker Big O, Omega, og Theta?
Yeah?
OK, hva er Big O, først av alt?
>> PUBLIKUM: [uhørlig].
>> LUCAS: Ja, det heter et worst case runtime, som bare betyr at det er
hvor mye du forventer programmet å ta for å kjøre.
Som, i form of--
i denne case-- n.
Antallet av elementer i liste i verste fall.
Som, i den verst tenkelige tilfelle.
>> Så for Bubble Sorter, for eksempel, Vi har store O av n kvadrat.
Hvorfor har vi det?
Hvorfor er Bubble Sorter Big O n kvadrat?
>> PUBLIKUM: [uhørlig].
>> LUCAS: Ja, så det verste tilfellet vil være at jeg må gjøre n iterasjoner.
Så hver av gjentakelser kommer til å bringe den største del til enden
av listen.
Så verste fall er at jeg har å gjøre den tingen n ganger.
Og for hver av de gangene, jeg må gjøre n swaps fordi jeg har å sammenligne
hver to elementer.
Så det er derfor det er n squared fordi det er n ganger n.
>> Da er utvalget slags også n square fordi, for hver iterasjon, jeg må
se på hvert enkelt element i listen.
Og deretter finne den minste, noe som betyr at jeg må
se gjennom n elementer.
Og jeg må gjøre det n ganger fordi Jeg må velge alle n elementer.
>> Et innsettings typen er også n square fordi verste fall vil
være, en, må jeg sette inn n tall, ikke sant?
Så jeg vet allerede at jeg kommer å ha n iterasjoner.
Men for hvert av disse tall, hvis jeg hadde å se på alle tallene i
den sorterte listen og sette det hele veien i front, vil det være n square
fordi det vil være n ganger n igjen.
Fornuftig?
Hva om omega?
>> PUBLIKUM: [uhørlig].
>> LUCAS: Det er den best case scenario.
Så er det som, i en rekke ganger for sortering, den beste fall er
når listen er allerede sortert.
Så du har egentlig ikke å gjøre noe.
Bubble Sorter har den beste case scenario av n.
Vet dere hvorfor?
>> PUBLIKUM: [uhørlig].
>> LUCAS: Ja, hvis du holde oversikt over om data rasjon hatt noen bytteavtaler eller
ikke, hvis du har noe sånt som satt til sant hvis det var en iterasjon, hvis
Listen er allerede sortert, i utgangspunktet, hva kommer til å skje er at jeg kommer til å
prøv å bytte hver to tilstøtende elementer.
Jeg kommer til å se at det er ingen bytteavtaler.
Og jeg bare tilbake med en gang.
>> Så det betyr at jeg bare måtte går gjennom listen en gang.
Så det er n fordi jeg ser på n elementer.
Hvorfor utvalg slags n kvadrat?
>> Ja, selv om listen er sortert, for hver iterasjon av utvalget slag, jeg
må velge minimumselementet.
Så det betyr at jeg må ut for å lete på alle elementene i usortert
liste og finne minimum for hver iterasjon.
Betyr det fornuftig?
>> Og innsetting sverd er N fordi i sak som jeg prøver å sette inn
tall og alle tallene, da jeg prøve å sette dem, ser jeg at de
er i den riktige stilling.
Jeg trenger ikke å gå sjekk alle de andre Tallene i usortert listen.
Så det er derfor det vil være n.
Fornuftig?
Og hva er theta?
>> PUBLIKUM: [uhørlig].
>> LUCAS: Hva, beklager?
Si det igjen.
>> PUBLIKUM: [uhørlig].
>> LUCAS: Nettopp.
Så du kan se at bare utvalg lagres i Merge slags har thetas.
Og det er fordi du bare har theta hvis begge Big O og Omega er de samme.
OK.
Og til slutt, flette sort er i log n.
>> Og så, som Dan sa, Merge sort er typen som på samme måte som
du gjør binære søk.
Så du får listen.
Og du kommer til å halvert.
Og så kutte dem i mindre halvdeler.
Og så sette dem sammen.
Dere husker det, ikke sant?
OK, som han sa.
>> OK, pekere.
Så hva er en peker?
>> PUBLIKUM: [uhørlig].
>> LUCAS: En adresse.
OK.
Jeg vet at David viser en haug med Videoer av Binky og ting som peker
hverandre.
Men jeg liker å tenke på pekere som bare en adresse.
Så det er en variabel som kommer å lagre en adresse.
>> Så det er bare denne spesielle variabel som er fire byte.
Husk at pekeren til noe er alltid fire byte for vår 32-bit
maskin, slik tilfellet er med apparatet.
Og det har bare plasseringen av en variabel innsiden av den.
>> OK, så det er dette minnet, i utgangspunktet.
Så hver blokk med minne faktisk har en etiketten, som er adressen til
slotty minne.
Så det betyr at jeg kan ha en peker som peker til
en hvilken som helst av disse adresser.
Så grunnen til at vi vil bruke pekere er hvis jeg må huske plasseringen
at en bestemt variabel er et minne.
>> Og dere husker at en av dem tilfeller var hvis jeg har en funksjon
hvis jeg har faktisk lyst til å swap for Reals, jeg faktisk
må sende en peker.
Ikke variabelen.
Har dere husker det?
Forskjellen between--
Hva er navnet?
Ringe etter verdi og ringer ved henvisning, til høyre?
>> OK, ja.
Så ring etter verdi.
Når du bare sende en variabel fungere du bare sende en verdi.
Så du faktisk sender en kopi av den variable.
Og programmet kunne ikke bry seg mindre om hvis den samme variabelen faktisk
lager en kopi.
>> Og ringer ved referanse betyr at Jeg er faktisk å sende en kopi av
Peker til den variabelen.
Så det betyr at jeg sender den plasseringen av den variabelen.
Så avføle Jeg har plasseringen av variabel, når jeg kaller funksjonen
med pekere, er jeg i stand til å faktisk endre de data som var i hoved.
Fornuftig?
>> Selv om, er markøren en kopi, den pekeren fortsatt har den reelle adressen
den variabelen som jeg ønsker å endre.
Fornuftig?
>> Så lage pekere.
Husk, pekeren alltid ha den typen som den peker
til og deretter en stjerne.
Og så setter navnet.
Så husk at når du har Uansett stjerne, det er som en peker til
at uansett hva variabel skriver at du hadde.
>> Så her i stjerne, for eksempel, er det en peker og et helt tall.
Og så røye stjernen er en peker røye stjerne og så videre.
Yeah?
>> PUBLIKUM: Hva om vi har en pekeren til n til stjerne x.
Jeg vet som skaper en peker til x.
Betyr det også erklære x et heltall?
>> LUCAS: OK, så når du sier n stjerne x, du ikke å lage en peker til en
variabel x.
Du oppretter en peker som heter x.
>> PUBLIKUM: [uhørlig].
>> LUCAS: Så når jeg sier n stjerne x, jeg er sa hei, i minnet, kommer jeg til å
få en av disse tre bokser.
Og jeg kommer til å si at det kommer til å være x, som er
kommer til å være en peker.
Og noe interessant om pekere er at vi sier at de har
4 byte for en 32-bits maskin.
Og grunnen til det er fordi 4 byte er 32-bits.
>> Og maskiner som er 64 bits faktisk har pekere adresser
som er 64 bits lang.
Slik at det bare vil si at størrelsen på adresser i maskinen er annerledes.
>> Så Klassifisering og dereferencing.
Det er to operatører som dere bør huske.
Den første er ampersand.
Den andre er stjerne.
Ikke bli forvirret av at stjernen og dette stjerne fordi husk at i
dette tilfellet, har du n stjerne.
>> Det er som et hele sammen.
Det er ikke n Space Star.
Så det betyr at det er den typen.
Husk at når du har variabelen stjerne, er du
snakker om type.
>> Når du har bare stjerne og deretter Navnet på variabelen, betyr det at
du dereferencing pekeren, som betyr at du ser på den
pekeren, finne adressen det er peker til, kommer til den adressen,
og ser på når du har der.
Så jeg sier til mine studenter at når du har stjerne, bør du tenke på at det er
forkortelsen for innholdet.
>> Så hvis du har en peker og du Star pekeren, er det
Innholdet av pekeren.
Så du går til hva det peker til og se på konstant innhold.
Og-tegnet er det samme ting som adressen.
>> Så hvis jeg har en variabel en-- som, la oss si at jeg gjorde int en lik 3--
hvis jeg ønsker å finne adressen til at variabel et minne, jeg kan bare gjøre
Ampersand en.
Så det er adressen til en.
Fornuftig?
>> Så her er et eksempel.
Dette mangler int b og int c.
Så int a lik 3 betyr at Jeg kommer til å gå til minnet.
Og jeg kommer til å finne et spor og sette tallet 3 her.
>> Og så int b er lik fire.
Jeg kommer til å gjøre det samme.
Gå til minne og sette et tall 4 i en av boksene.
Og int tilsvarer fem.
Finne en annen boks og sette et nummer 5.
>> Så hva er denne linjen gjør ut? n stjerne pa lik-tegnet en.
Så først av alt, n stjerne pa.
Hva er det du gjør?
>> PUBLIKUM: [uhørlig].
>> LUCAS: Ja, så n stjerne pa, først, erklærer en peker som heter pa.
Og så er det å tildele verdien av at pekeren for å være adressen for en.
Så tegnet en.
Så, hvis jeg gjør stjerners pb, hva er en stjerne pb?
>> Oh, beklager.
Dette er også mangler. n stjerne pb.
Jeg mener stjerners pc.
Jeg er så lei meg.
Det er det samme.
Men nå er jeg godt ar skape en peker til b og deretter en peker til c.
Yeah?
>> PUBLIKUM: [uhørlig]?
>> LUCAS: Ja.
Så hvis du går til minne og du går til boksen som er betegnelse for pa,
du faktisk kommer til å se adressen til en.
OK?
Yeah?
>> PUBLIKUM: [uhørlig]?
>> LUCAS: Ja, er pekeren en adresse.
Aldri glemme det.
Det er som det viktigste del om pekere.
Det er lagring og adresse til en viss variabel.
Noe mer?
Eventuelle andre spørsmål?
OK.
>> Så Pekere og arrays.
Husk at når jeg gjør int matrise 3, utgangspunktet, hva jeg gjør er at jeg er, snill
av, erklærte i en peker.
Så matrise er typen som en peker til en bestemt sted i hukommelsen som jeg
tildelt tre plasser for heltall.
Betyr det fornuftig?
>> Så når jeg gjør int rekke tre, hva jeg er gjør, i utgangspunktet, er å skape tre
sporene i minnet.
Så jeg bare finne tre sporene i minnet.
Så hvis jeg gjør det, så, en stjerne array, det utgangspunktet betyr innholdet av matrisen,
som betyr at jeg slette pekeren, jeg går til det stedet som den peker til,
og jeg satte nummer én.
>> Og så, hvis jeg ikke gjør stjerners rekke pluss 1, det er det samme som å gjøre matrise
brak en, som bare betyr at jeg går til stedet at den peker på.
Og så pluss 1 merker meg skifte én posisjon.
Så jeg går til denne posisjonen, faktisk, og satte nummer to.
>> Og så, endelig, når jeg gjør matrise pluss to, jeg går til der
matrisen peker på.
Og da jeg flytter til minneblokker.
Og så satte jeg nummer tre her.
Yeah?
>> PUBLIKUM: Så stjerners matrise er rett og slett sier den aller første punktet.
Og du kan legge en, bare fordi vi er bare virkelig
refererer det første adressen.
>> LUCAS: Yeah.
Hvorfor gjør vi, for eksempel, sier matrise 0, array 1, og rekke 2?
Jeg sier, hvorfor gjør du 0, 1, 2, 3 i stedet for 1, 2, 3?
En av grunnene er, en, datamaskinen programmerere foretrekker å starte
telle fra 0.
To er fordi når du gjør matrise 0, det er det samme som å gjøre matrise
pluss 0, noe som betyr at jeg går til den posisjonen, og jeg gjør ikke
hoppe over noen minneblokker.
Så jeg ikke flytte noen minneblokker.
Yeah?
>> PUBLIKUM: [uhørlig]?
>> LUCAS: Så hun spør hva som er forskjellen mellom å gjøre
dette eller gjør malloc.
En av forskjellene er at int matrise 3 er å skape en
matrise på stakken.
Og når jeg gjør malloc, det skaper på haugen.
Betyr det fornuftig?
>> Så hvordan malloc faktisk fungerer?
Så hvorfor trenger vi selv å bruke malloc?
Kompilatoren slags tall ut alt variablene som du erklært.
Og han skaper rom for alle av dem i bunken.
Så alle variablene skal være et eller annet sted i stabelen.
Så her er miljøvariablene.
>> Så i utgangspunktet, plass for disse variablene i minnet er tildelt på
kompilering.
Så det betyr at datamaskinen har å vite alle disse variablene
på forhånd.
Det trenger ikke å vite hvilken verdi du kommer til å sette i dem.
Men det er behov for å vite hvordan mye minne du trenger.
>> Men la oss nå si at, for eksempel, du oppretter en matrise eller ta en
streng som du tar fra brukeren.
Du vet ikke hvor lenge strengen kommer til å være, for eksempel.
Så du vet ikke nøyaktig hvor mange minneblokker du fordele, ikke sant?
>> Så det gjør egentlig ikke fornuftig for deg å si sette 100 tegn.
Og hva hvis brukeren skriver 150?
Du kommer til å bli skrudd.
>> Så i utgangspunktet, kan du ikke være sikker på hvordan mye minne du trenger for å tildele
når du kompilere programmet.
Du bare vet at på kjøre tid.
Så det er derfor du har haugen.
Så haugen er nødt til minne at du er tildeling i løpet av
varigheten av programmet kjører.
>> Så i utgangspunktet, når du gjør malloc, hva du gjør er å fordele minnet
runtime, som betyr at du er avgjørelsen akkurat i det øyeblikket du
bør ha som minne.
Så det er når du fordele den.
Betyr det fornuftig?
>> Så husk, bunken har variabler som er opprettet på kompilering.
Og så haugen har variabler som er opprettet som du går
med malloc, f.eks.
>> PUBLIKUM: [uhørlig]?
>> LUCAS: Så GetString er kommer til å kalle malloc.
La meg snakke om malloc, og Jeg skal forklare GetString.
Så malloc er det samme som minnetildeling.
Så det kommer til å tildele minne på haugen.
Og det kommer til å returnere en peker til der som minne ble tildelt på.
>> Så når du gjøre--
her for example--
n stjerne pekeren.
Og deretter pekeren tilsvarer malloc Størrelsen tommers ganger 10.
Jeg oppretter en peker.
Og så er jeg tilordne som peker til verdien av pekeren som malloc
gir meg.
>> Så jeg ber malloc kan du fordele plass til 10 heltall.
Det er hva det sier.
Og malloc gir meg tilbake en Peker til det stedet.
Fornuftig?
OK.
Jeg Og GetString er, i utgangspunktet, gjør en ringe til malloc, slik at du kan tildele
minnet under kjøring.
>> Husk alltid å sjekke for null fordi malloc kommer til å returnere null
hvis det ikke kan tildele minne.
La oss si at du ber om en latterlig mye minne.
Datamaskinen er ikke til å være i stand til å fordele så mye.
>> Så malloc er bare kommer for å gå tilbake null.
Så husk alltid å sjekke om pekeren som du fikk fra malloc er
null eller ikke, fordi, hvis det er, kan du bli dereferencing en peker og
forårsaker sidefeil.
Og til slutt, ikke glem din ledig minne.
>> Malloc er å skape minne i haugen.
Og du må frigjøre minne før programmet avsluttes.
OK, det er alt for meg.
Beklager, Rob.
Takk.
>> [APPLAUSE]
>> LUCAS: Noen siste spørsmål før Rob kommer?
No?
Yeah?
>> PUBLIKUM: Jeg fikk ikke se dette en online.
Har du lastet det ennå?
>> LUCAS: Jeg tror Dave er laste den opp snart.
>> DAVE: Det vil bli lagt ut.
>> LUCAS: Det vil være online.
>> PUBLIKUM: Det er opp.
>> LUCAS: Det er opp?
OK.
Yeah?
>> PUBLIKUM: [uhørlig]?
>> LUCAS: Ja, du bør frigjøre alle minne som er satt i haugen.
>> PUBLIKUM: [uhørlig]?
>> LUCAS: Ja.
Hver gang du har en kultur malloc, du bør ha en kultur fri
etter at du slutter å bruke den variabelen.
Så malloc og gratis er alltid sammen.
Sine beste venner.
Yeah.
Rob?
>> ROB: Jeg skal gå raskt.
Og også videoen vil bli satt opp.
Jeg har mic på.
>> OK, så uke fem ting.
Første vi har er bunken.
Så husk at det er bare en stabel bilde per aktiv funksjon samtale.
Vi får se det i et sekund.
Og også huske hva som faktisk går i hver stabel ramme kommer til å være
de lokale variabler av våre funksjoner, argumentene som er gått inn i vår
funksjoner, sammen med et par andre ting du egentlig ikke
trenger å bekymre seg for.
>> Så her er et eksempel program der, varsel, hoved er printfing retur
Verdien av foo fire.
foo er bare kommer til å returnere Verdien av bar 4 komma seks.
Og bar kommer til å sette noen lokale variabelen n lik 4 ganger 6.
Og deretter gå tilbake n.
>> Så la oss se på bunken hele selve gjentakelse av dette programmet.
Så det er bunnen av stacken.
Husk at bunken vokser opp.
Så ved bunnen av stacken, vi har en stabel ramme for main.
Når programmet starter, hoved er alltid kommer til å være på
bunnen av stacken.
>> Og hva som er inne i vår stable ramme for hoved?
Så selv om det er ingen lokale variabler til hovedsiden, som jeg sa før,
vi har argc og rgv tar opp plass innsiden av hoved stabelen rammen.
Så hoved skal nå kaller funksjonen foo.
Og det betyr foo kommer til å få sin egen stabel rammen.
>> Så nå er vi inne i funksjonen foo.
Og hva som må gå i foo stabel ramme?
Vel, har foo et argument n.
Og n er lik 4, siden det er hva Hoved passerer som foo argument.
>> Så nå foo kommer til å ringe bar.
Hva er bar kommer til å ha inne av sin "stack ramme?
Det har x lik 4 y lik seks.
Det er ikke alt som vi kommer til å ha i bunken rammen fordi bar
har også en lokal variabel n.
Og n vi skal settes lik 24.
>> Så nå bar kommer til å returnere n.
Så bar det tilbake 24 til stabelen ramme foo.
Og fordi baren er nå tilbake, at betyr at vi spratt stabelen ramme
for bar ut av bunken.
Så alt minnet at baren hadde vært hjelp er nå av stabelen.
>> Nå er foo også kommer å returnere 24 til hoved.
Så nå at foo er tilbake, minnet at foo brukte i sin "
stabelen rammen er også borte.
Og nå, hoved kommer til å kalle printf.
Så printf er bare en annen funksjon.
Når vi kaller printf, kommer det til å være en annen stabel ramme for printf
funksjonskallet.
>> Hva er det vi passerer printf?
Det er det som kommer til å gå på sin stabel rammen.
I det minste, vi passerer som prosent i backslash n og
argumentet 24.
Det kan ha mer i det stabel ramme hvis printf skjer for å være ved hjelp av noen
lokale variabler.
Vi vet ikke.
>> Men alt som går i printf sin stable ramme.
Det kommer til å utføre printf.
Deretter printf er gjort.
Det kommer tilbake.
Endelig viktigste er gjort.
Hoved kommer tilbake.
Og da er vårt program er gjort.
Yeah?
>> PUBLIKUM: Er du sammen med [uhørbart]
argumenter [uhørbart]
parametere?
>> ROB: Så det er en subtil forskjell mellom argumenter og parametere.
Og virkelig, felles tale, folk har en tendens å bare blande dem opp hele tiden.
Men parametere er den formelle Navn på ting.
>> Så argc og argv er parametre til hoved.
Argumenter er hva du faktisk passere inn i disse parametrene.
Så det når jeg kaller foo på 4, 4 er argumentet jeg passert inn.
Og parameteren n, innvendig foo, tar på verdien 4
siden 4 var argumentet.
>> PUBLIKUM: [uhørlig]?
>> ROB: n er en lokal variabel til bar.
n er fortsatt lokale til foo, men det er en parameter til foo.
Det er ikke en lokal variabel.
Yeah?
>> PUBLIKUM: [uhørlig]?
>> ROB: foo er bare å ringe bar og retur Whatever Bar avkastning.
>> PUBLIKUM: [uhørlig]?
>> ROB: Ja, bare for å se flere stable rammer.
Yeah?
>> PUBLIKUM: Hvorfor ble foo kalt før printf?
>> ROB: Hvorfor ble foo kalt før printf?
Så jeg kunne ha, i stedet gjort noe som int x lik foo av 4
og deretter skrevet ut x.
Men i stedet, jeg kombinerte funksjonen ringe til printf argument.
>> Men legg merke til at vi ikke kan faktisk utføre kall til printf før vi
finne ut hva foo av fire er.
Så vi kommer til å vurdere dette.
Og bare en gang det er gjort går å komme tilbake og evaluere dette.
Yeah?
>> PUBLIKUM: Siden både bar [uhørbart]
verdi, hvorfor har vi ikke [uhørbart]?
>> ROB: De helt bør være int.
Det ble ikke fanget over flere pasninger.
Så det burde være int bar og int foo siden begge disse
er tilbake heltall.
Void er bare hvis de ikke kommer å returnere faktiske verdier.
Yeah?
>> PUBLIKUM: Hvis du hadde en strek over avkastningen, [uhørbart]?
>> ROB: En linje over avkastningen?
>> PUBLIKUM: Yeah.
Som hvis du gjorde printf og [uhørbart], ville det skrive ut to ganger?
>> ROB: Så innsiden av foo?
Hvis vi hadde en printf akkurat her?
>> PUBLIKUM: Yeah.
>> ROB: Så hvis vi hadde en printf rett her, ville det ut en gang.
Siden vi kaller foo gang rett her, så får vi treffer printf.
Så får vi kaller bar.
Og da vil foo tilbake.
Og det er det.
Vi bare måtte møte printf gang.
Yeah?
>> PUBLIKUM: [uhørbart]
printf kaller foo fordi vi er først ringer printf og da vi passerer
argumentene.
>> ROB: Så i teorien, er ikke printf kaller foo?
Så nei.
Akkurat den rekkefølgen c kommer til å utføre disse tingene er, før vi kan
kalle en funksjon, alt av argumentene til funksjonen måtte
være fullstendig evaluert.
Så er dette helt evalueres?
Ja, det er bare en streng.
Det er bare en verdi.
>> Så må vi helt vurdere dette.
Når dette er gjort, nå alle argumentene evalueres.
Og nå kan vi gjøre ringe til printf.
Yeah?
>> PUBLIKUM: Et spørsmål.
Hvis du har et tomrom funksjon, må du har retur semikolon?
>> ROB: Du trenger ikke en retur semikolon hvis du har et tomrom funksjon.
OK.
Så nå noen haug ting.
Så heap er hvordan vi skal håndtere med dynamisk minnehåndtering.
Og dette står i kontrast direkte med stack som vi vil kalle automatisk
minnehåndtering.
>> Så på stakken, du aldri egentlig har å forholde seg til hvordan de lokale variabler
blir dyttet og popped av alle disse stakkrammer og alt det der.
Du trenger ikke å bekymre deg for det.
Det skjer automatisk.
Så haugen er manuell.
Og [uhørbart]
kommer fra disse funksjonene malloc og gratis.
>> Så her er et annet program.
Alt vi gjør er mallocing et heltall.
Vi lagrer den i stjerne x.
Selvfølgelig må vi sjekke for å se om x er null.
Så skal vi bare angi hva x peker til til 50.
Skriv ut hva x peker til, print x, og deretter gratis x.
>> Så hvordan er dette faktisk kommer til å se hvis vi ser på vår stack og heap?
Så vi vil starte på nytt.
Bunnen av stacken som før.
Husk at dig heap direkte motsetter stabelen?
Så vi kommer til å ha den toppen av vår haug der oppe.
>> Så bunnen av stacken, har vi stacken ramme for main.
Den har plass til argc, argv, og vi nå har en lokal variabel x, som
er en int stjerne.
Så vi kommer til å reagere gjennom dette programmet.
Første vi har er et kall til malloc.
>> Så vi ringer til malloc.
Malloc er en funksjon.
Det kommer til å få en stabel ramme.
Hva er det vi passerer til malloc?
Det kommer til å gå inn av stabelen rammen.
Vi passerer størrelsen n, som er 4.
Så det er gått til malloc.
>> Hva malloc gjøre?
Det griper oss litt plass på haugen.
Så vi kommer til å gå til heap.
Og vi kommer til å ta tak 4 bytes fra haugen.
Så la oss bare gi den en vilkårlig adresse.
0x123 Bare late som er en adresse som er på haugen.
>> Så hva er egentlig innsiden av det regionen i minnet ved adresse Ox123?
Garbage.
Så vi ikke har lagret noe i den.
Så så vidt vi vet, det kunne være noe.
Du bør ikke anta at det er null.
Det er mest sannsynlig ikke null.
>> Så nå malloc avkastning.
Og hva gjør vi når malloc avkastning?
Vi setter hva den returnerer.
Vi setter x lik hva det er tilbake.
Så hva er det tilbake?
Det retur 0x123 siden det er den Adressen til minneblokk at den
bare tildelt i haugen.
>> Så tilbake 0x123 x nå kommer til å bli satt lik 0x123 som billedlig,
vi ofte trekke så x ha en faktisk pil som peker til den blokken.
Men x er bare å lagre denne adressen.
Så nå må vi sjekke om x er null.
Det er ikke null.
Vi later som at malloc lyktes.
>> Så nå stjerne x tilsvarer 50.
Så stjerners husker det betyr gå til denne adressen.
Så 0x123 Vi skal til gå til denne adressen.
Så det bringer oss opp der.
Hva gjør vi på denne adressen?
Vi lagrer 50.
>> Så etter denne linjen, er at det ting kommer til å se ut.
Så nå er det ikke lenger søppel der oppe.
Nå vet vi at 50 er i det bestemt adresse fordi
vi setter den til det.
OK?
Så nå skal vi ut f.
>> Så først skal vi skrive stjerners x.
Så hva er stjerne x?
Igjen betyr stjerne x går til ting som x peker til.
Så x er lagring 0x123 Gå til det.
Vi får 50.
Så ut f det.
Og det betyr at det kommer til å skrive ut 50.
Og så som returnerer.
>> Og så har vi den andre printf.
Vi er nå prosent p.
Hvis du ikke har sett det, det er akkurat hvordan du skriver ut en peker.
Så vi har prosent i, prosent f, og alle av dem allerede.
Så prosent p, skrive ut en peker.
>> Så x er en peker.
Så hvis vi kommer til å skrive ut x seg selv, vi skriver ut hva som er faktisk inne
x, som er slik at den første 0x123 print f kommer til å skrive ut 50.
Den andre print f kommer å skrive ut 0x123 Yeah?
>> PUBLIKUM: Bruker du prosent x å skrive ut en peker?
>> ROB: Så bruker du prosent x å skrive ut en peker?
Så du kan, men prosent x er like, generelt, for som om du har litt
heltall og du vil skrive ut det som en heksadesimal.
Det er bare hvordan du gjør det.
>> Mens prosent d ville skrive ut som desimaltall.
Det er var vi få prosent d. Jeg er bare heltall.
prosent p er spesifikt for pekere.
>> Så x er en peker.
Vi ønsker å bruke prosent p.
Men prosent x kunne fungere.
Yeah?
>> PUBLIKUM: [uhørlig]?
>> ROB: Yeah.
Minst for dette call-- så jeg ikke inkludere det i her.
Men disse to argumentene er nødvendigvis innsiden av denne stabel ramme
sammen med eventuelle lokale variabler printf skjer for å være bruker.
Og så den neste kall til printf nå innsiden av printf stabelen rammen er
prosent p backslash n og uansett verdien av x er, som er 0x123.
Yeah?
>> PUBLIKUM: [uhørlig]?
>> ROB: Det vil skrive ut noe som ser ut som dette.
>> PUBLIKUM: [uhørlig].
>> ROB: Så det skriver den ut i adresseskjemaet.
Det ser ut som en adresse.
Yeah?
>> PUBLIKUM: [uhørlig]?
>> ROB: Hvorfor er hva?
>> PUBLIKUM: [uhørlig]?
>> ROB: Hvorfor er denne pekeren 4 byte?
Så det er en hel haug av 0 er foran dette.
Så det er egentlig 0x0000000123.
På en 64-bits system, ville det være en hel haug med flere nuller.
Yeah?
>> PUBLIKUM: [uhørlig].
>> ROB: Så det første printf kommer til å print--
>> PUBLIKUM: [uhørlig].
>> ROB: Ja, det kommer til å skrive ut hva x peker til.
Stjerne sier hva er dette ting å peke på.
Grip den.
Så hva er det å peke på?
50.
Grip den.
Det er det vi kommer til å skrive ut.
Mens den neste, er vi bare skrive x seg selv.
Hva er innsiden av f?
0x123.
OK.
>> Og så, endelig, har vi fri.
Hva er det vi passerer å fri?
Vi passerer x.
Den tiden jeg faktisk vises den i stabelen rammen.
>> Så vi passerer verdien 0x123 å frigjøre.
Så nå gratis vet, all right, Jeg må gå opp til haugen
og kostnadsfri dette minnet.
Det er ikke lenger bruke det er ved adresse 0x123.
>> Så fri kommer til å frigi at fra haugen.
Nå er vår heap er tom igjen.
Vi har ingen minnelekkasjer.
Nå gratis kommer tilbake.
Legg merke til at x er fortsatt 0x123.
Men det er nå ikke gyldig minne.
Vi skal ikke lenger dereference x.
Yeah?
>> PUBLIKUM: Er tilbake 0 overflødige?
>> ROB: Er returen 0 overflødige?
Ja.
Vi bare sette det der fordi vi har en retur en for luft.
Så det er som, ja, lar inkludere avkastningen 0.
Yeah?
>> PUBLIKUM: [uhørlig]?
>> ROB: Så etter gratis x, hva skjer hvis vi prøver å deferanseoperasjon pekeren?
Det er mulig at ingenting går galt.
Det er mulig at vi vil fortsatt få 50.
>> Det er mulig, også, at det minnet er nå blir brukt til noe annet.
Så det er udefinert oppførsel.
Og udefinert betyr noe kan skje.
Yeah?
>> PUBLIKUM: [uhørlig]?
>> ROB: Nei, så hvis du tilordner x til noe annet.
Så hvis akkurat her vi sa x lik malloc noe else--
malloc størrelse event--
så det opprinnelige blokken minne er ikke frigjort.
Og vi har offisielt mistet den.
Det er et minnelekkasje.
Vi har mistet alle referanser til at minneblokk.
Så det er ingen måte vi noen gang kan frigjøre den.
OK, så da returnere 0 betyr gjort.
>> Greit, så stack overflow.
Hva er tanken her?
Så husk, er haug går ned.
Stack går opp.
Så dette var et eksempel fra forelesning, Jeg tror, ​​hvor hoved er bare kommer til
kaller denne funksjonen foo, som kommer å kalle seg rekursivt over og
om igjen.
>> Så stable rammer skal arbeide nøyaktig det samme.
Så vi kommer til å starte med hoved som den nederste stabel rammen.
Deretter hoved kommer til å ringe foo, som kommer til å få en stabel ramme.
>> Deretter foo kommer til å ringe foo igjen, som er tenkt å komme
en annen stabel ramme.
Og så igjen, og igjen, og igjen, og igjen før slutt, vi kjører
inn i haugen.
Så dette er hvordan vi får en stabel overløp.
Og på dette punktet, Seg du feil.
Eller du ville virkelig SEG feil før dette punktet, men ja.
>> PUBLIKUM: Er kjernen dumpe samme som SEG feil?
>> ROB: Så du vil se segmentering feil core dumpet.
Du får en kjerne dump når du SEG feil.
Og det er som en dump av alle innholdet i din nåværende minne så
at du kan prøve og identifisere hvorfor du Seg forkasta.
Yeah?
>> PUBLIKUM: [uhørlig]?
>> ROB: Så en segmentering feil måte det er en stakkoverflyt.
Så ikke nødvendigvis.
En segmentering feil betyr at du er rørende minnet på en måte
bør du ikke være.
Så en måte at det skjer er, når du stable overløp, vi starter rørende
minnet på en måte som vi ikke bør være.
Yeah?
>> PUBLIKUM: [uhørlig]?
>> ROB: Så innsiden av en uendelig løkke.
Som, er dette som en rekursiv uendelig løkke og så får vi en annen
stabel ramme hver gang.
Men bare innsiden av en vanlig uendelig mens one--
Vel, la oss ikke engang skrive ut f--
gjøre noe.
Uansett.
>> Vi kommer ikke til å være å få en annen stabel ramme.
Vi skal bare holde looping i løpet av denne enkelt instruksjon.
Stabelen ikke vokser.
Det er det faktum at hver rekursiv samtalen er å gi oss en stabel ramme.
Det er derfor vi får en stack overflow.
Yeah?
>> PUBLIKUM: Så hvis du sa for å få mens loop og deretter [uhørbart]?
>> ROB: Så hvis innsiden av mens loop det var en printf, har du fortsatt ville
ikke SEG feil.
Jeg hadde ikke bare ønsker å forvirre ting.
Det ville loop.
Du vil få en enkelt stabel Ramme for printf.
>> Deretter printf ville tilbake.
Så du hadde sløyfe igjen.
Du vil få en enkelt stabel Ramme for printf.
Det ville tilbake.
Enkelt stakk ramme.
Så du får ikke dette uendelig hope seg opp stack rammer.
>> PUBLIKUM: [uhørlig]?
>> ROB: Ja.
Så dette stack overflow skjer fordi ingen av disse
anrop til foo er tilbake.
Så hvis vi går tilbake, så ville vi begynner å miste stack rammer.
Og da vi ikke ville stable overløp.
Og det er derfor du trenger en base case for dine personlige funksjoner.
Yeah?
>> PUBLIKUM: Er potensiell størrelse og stable for haugen den samme for
alle programmer?
>> ROB: Grovt.
Er potensialet størrelsen av stabelen og haugen den samme for alle programmer?
Grovt.
Det er noen randomisering til hvor stabelen starter og
hvor haugen starter.
Hvis du tilfeldigvis har en hel masse globale variabler og ting, kan du
ta unna noen plass for din heap.
>> På en 64-bit system, du nesten har uendelig minne.
Det er bare så mye.
Mellom 32 bits og 64 bits, at er en betydelig forskjell.
>> Du kommer til å få en hel masse mer stable og heap plass på en 64-bit
system fordi det er bare mer adresser som de kan bruke.
Men på det enkelte system, vil det være omtrent den samme mengden av stabelen
og heap plass.
Greit.
>> Så siste ting er kompilering.
Så du bør vite denne prosessen.
Det er fire store trinn.
Så det første man bør være lett å huske.
Pre-prosessering.
Den har prefikset pre i det.
Så det kommer før alt annet.
>> Den ting å huske er hasj.
Så hash definerer og hash inkluderer i alle disse.
De er alle pre-prosessor direktiver.
Dette er de tingene som de pre-prosessoren tar vare på.
>> Så hva gjør en pre-prosessor gjøre?
Det er en veldig dum ting.
Alt det er i stand til er alle disse kopiere og kutt, og lim inn.
>> Så hash inkluderer standard i0 dot h.
Hva er det du gjør?
Det gripe standard i0 dot h fil og lime den inn i toppen
uansett hvor det står hash inkluderer standard i0 dot h.
>> Og noen hash definere at vi har sett, hva er det du gjør?
Dens kopiere verdien at hash defineres er definert som og lime som
uansett hvor du bruker verdien.
Så preprosessor bare gjør virkelig enkel tekstbaserte operasjoner.
Det gjør ingenting smart.
Så alt annet er mer komplisert.
>> Så nå at preprosessor er gjort, vi faktisk kompilere.
Så hva betyr kompilering mener?
Vi overvåker nå går fra C-kode til montering kode.
Yeah?
>> PUBLIKUM: [uhørlig]?
>> ROB: Ja, vi fanget den.
Så kompilering.
Vi kommer fra c til forsamlingen.
Så dette er en faktisk språkendring.
Kompilering seg selv betyr å gå fra et høyere nivå språk til
et lavere nivå språk.
>> Og c er et høynivåspråk i forhold til sammenstillingen.
Hva er montering?
Sin instruks som er, ganske mye, laget for din CPU.
Men datamaskinen fortsatt gjør ikke forstår montering.
Det forstår bare enere og nuller.
Så det neste trinnet er å sette sammen, som bringer oss fra disse instruksjonene som
CPU forstår og faktisk oversetter dem, til
de enere og nuller.
>> Så C til montering til binær.
Men jeg har ikke en kjørbar ennå.
Så tenk på CS50 biblioteket.
Vi har gitt deg en binær for dette CS50 biblioteket, som har GetString
og GetInt og alt det der.
>> Men CS50 library--
i og for itself-- er ikke kjørbar.
Det har ikke en hovedfunksjon.
Det er bare en haug med binær som du kan bruke.
Så linking er hvordan vi bringer sammen alle av disse ulike binære filer
til en faktisk kjørbar.
En som du kan skrive dot slash en prikk ut.
>> Så dette er som den filen som du skrev, - uansett program er--
Ceaser dot c.
Men nå er det blitt utarbeidet ned til binær.
Så Ceaser dot o.
Og dette er vår CS50 biblioteker binær.
Og de blir kombinert i en enkelt kjørbar.
Yeah?
>> PUBLIKUM: [uhørlig]?
>> ROB: Så først inkluderer husker, hash inkludere er faktisk en
pre-prosessor trinn.
Men det er separate.
Hvis du ikke bruker noen av funksjonene som er utenfor din enkelt fil da,
Nei, trenger ikke å koble noe du siden du har alt.
>> Når det er sagt, printf blir koblet inn.
Hvis du noen gang bruke printf, det er noe som må knyttes i
fordi du ikke skrive det.
Og, faktisk, er printf automatisk koblet på.
Du vet hvordan på kommandolinjen eller når du skriver gjør, du ser det har
dash l CS50, som har kobling i CS50 biblioteket?
Printf, og sånt, kommer skal knyttes inn automatisk.
Eventuelle andre spørsmål om noe?
>> PUBLIKUM: [uhørlig]?
>> ROB: Linking?
Vi har en hel haug med forskjellige binære filer.
Dette er den kanoniske eksempel som vi bruker er CS50 biblioteket.
Vi har samlet og gitt til deg binær for denne CS50 biblioteket.
>> Du ønsker å bruke GetString i programmet.
Så du gå og bruke GetString.
Men uten min binærkode for GetString, når du kompilere koden din
ned, kan du faktisk ikke kjøre programmet fordi GetString String er
ennå ikke er fullstendig definert.
>> Det er bare når du kobler i min binære som inneholder GetString som nå, alle
riktig, kan jeg faktisk utføre GetString.
Min fil er fullført.
Og jeg kan kjøre dette.
Yeah?
>> PUBLIKUM: Har lenking konvertere det binære til kjørbare?
Så selv om du ikke har andre bibliotekene, ville det ikke fortsatt være
nødvendig for å oversette på [uhørbart]?
>> ROB: Så en kjørbar er fortsatt i binær.
Det er bare å kombinere en hel haug med binærfiler.
>> PUBLIKUM: Takk så mye.
>> ROB: Ikke noe problem.
Eventuelle andre spørsmål?
Ellers er vi alle satt.
Greit.
Takk.
>> [APPLAUSE]
>> PUBLIKUM: Takk.
>> ROB: Yeah.