>> DAVID MALAN: Hello, og velkommen tilbage til CS50.
Så dette er slutningen af ​​ugen fire.
Bare en meddelelse først.
Så den såkaldte femte mandag er kommer op på mandag.
Dette er mulighed for at skifte fra SAT / unsat på et brev klasse, eller fra
bogstavkarakter SAT / unsat.
Annoyingly, denne proces kræver en signatur, fordi du er nødt til at udfylde
ud en af ​​disse lyserøde add / drop former.
>> Fordi teknisk, SAT / unsat version og bogstavet klasse versionen
har distinkte katalognumre.
Men nogen big deal.
Bare kom op til mig eller at røve eller Lauren på noget tidspunkt.
Eller send os en mail, hvis du ikke har den slags papirarbejde du har brug for i dag, og vi
vil være sikker på at hjælpe dig med at tage pleje af det før mandag.
>> Okay, så i dag -
faktisk, der er lidt af et ekko.
Kan vi tone mig lidt ned?
OK.
Så i dag, introducerer vi et emne kendt som pointere.
Og jeg vil indrømme, at dette er en af ​​de mere komplekse emner, som vi har tendens til at
dække i denne klasse, eller virkelig nogen introduktionskursus, der bruger C.
>> Men tage mit ord for det, især hvis dit sind føles lidt mere bøjet
dag og i de kommende uger.
Det er ikke repræsentativt for at du får værre på dette det betyder blot,
Det er et særdeles sofistikeret emne at jeg lover, et par uger
dermed vil synes alt for påfaldende ligetil i bakspejlet.
>> Jeg husker stadig den dag i dag.
Jeg sad i Elliott Dining Hall, sidder ved siden af ​​min TF Nishat Mehta,
der var hjemmehørende i Elliott hus.
Og en eller anden grund, er dette topic bare klikker.
Hvilket vil sige, at jeg også kæmpet med det til en vis mængde tid, men jeg
vil gøre mit bedste for at hjælpe med at undgå sådanne kæmper med et emne, der i sidste ende
er ganske kraftfuld.
>> Faktisk har vi et af de emner vil diskutere i de kommende uger, er, at
af sikkerhed, og hvordan du kan faktisk udnytte maskinerne på måder
der blev ikke beregnet.
Og de udnyttelser er typisk resultatet af bugs, fejl, vi
folk gør ved ikke at forstå nogle af den underliggende gennemførelse
detaljer via hvilke programmer er lavet.
>> Nu for at gøre dette synes alle de mere brugervenlig venlig, jeg troede, jeg ville spille en 10
andet eksempel på en lille claymation figur ved navn Binky som blev bragt til
livet af en ven af ​​vores på Stanford, professor Nick Parlante.
Så tillad mig at give dig denne teaser af Binky her.
>> [VIDEO AFSPIL]
>> -Hej, Binky.
Vågn op.
Det er tid til pointer sjov.
>> -Hvad er det?
Lær om pointers?
Åh, goodie.
>> [END VIDEOAFSPILNING]
>> DAVID MALAN: Det er Stanford datalogi.
Så mere om det at komme.
>> [Applaus]
>> DAVID MALAN: Beklager, Nick.
>> Så minde om, at sidste gang vi sluttede på dette virkelig spændende cliffhanger
hvorved denne funktion bare ikke virkede.
Mindst intuitivt, føltes det ligesom det bør fungere.
Blot at bytte værdierne af to heltal.
Men huske på, at når vi udskrives ud oprindelige værdier i hovedsagen, en og
to, var de stadig én og to og ikke to og én.
>> Så lad mig faktisk skifte over til apparatet.
Og jeg skrev lidt op af skelet kode i avancere her, hvor jeg hævder, at x
vil være 1, vil y være 2.
Jeg så udskrive både deres værdier med print F.
>> Jeg derefter hævder hernede, at vi kommer til at bytte dem.
Jeg forlod et tomt sted her for os at udfylde i dag i bare et øjeblik.
Så vil jeg hævde, at to variabler er blevet byttet.
Så jeg har tænkt mig at udskrive dem ud igen.
Og så forhåbentlig vil jeg kunne se henholdsvis 1, 2.
2, 1.
Det er den super simple mål lige nu.
>> Så hvordan kan vi gå om at bytte to variabler?
Tja, hvis jeg foreslår her, at disse kopper kan repræsentere hukommelsen i en computer.
Dette er et par bid, dette er endnu et par bites.
Kunne vi have en frivillig kommer på op og blande os nogle drikkevarer, hvis bekendt?
Kom op.
Hvad er dit navn?
>> JESS: Jess.
>> DAVID MALAN: Jess?
Kom op, Jess.
Hvis du ikke har noget imod, er vi nødt til at sætte Google Glas på dig, så vi kan
udødeliggøre dette.
OK, glas.
Optag en video.
Og OK, vi er gode til at gå med Jess her.
Ok.
Hyggeligt at møde dig.
>> Så hvad jeg gerne vil du gør her - Hvis du kunne, ganske hurtigt -
bare hælder os et halvt glas appelsin saft og et halvt glas mælk,
repræsenterer effektivt tallene 1 i en kop og 2 i den anden kop.
>> Dette vil være godt optagelser.
>> JESS: Undskyld.
>> DAVID MALAN: Nej, nej.
Det er okay.
Nice.
Okay, så vi har fire bytes værd af appelsinjuice.
Vi kaldte det værdien 1..
Nu yderligere fire bytes værd af mælk.
Vil kalde det værdi 2..
Så x og y, hhv.
>> Okay, så nu, hvis opgaven ved hånden - for dig, Jess, foran alle
af dine klassekammerater -
er at bytte værdierne af x og y sådan at vi ønsker appelsinjuice i
anden kop og mælk i denne kop, hvordan kan du - før du rent faktisk gør
det - gå om at gøre dette?
>> OK, klog beslutning.
Så du har brug for lidt mere hukommelse.
Så lad os tildele en midlertidig kop, hvis du vil.
Og nu videre til bytte x og y.
>> Excellent.
Så meget godt klaret.
Tak så meget, Jess.
Vær så god.
En lille souvenir.
>> OK, så naturligvis, super simpel idé.
Helt intuitivt, at vi har brug for lidt mere lagerplads - i denne form,
en kop - hvis vi rent faktisk ønsker at bytte disse to variable.
Så lad os gøre netop det.
Heroppe i mellem, hvor jeg hævder jeg kommer til at gøre nogle swapping, jeg vil
gå videre og erklære temp.
Og jeg vil sætte det lig, siger, x.
>> Så jeg har tænkt mig at ændre værdien af x ligesom Jess gjorde her med
mælk og appelsinsaft at være lig med y.
Og jeg har tænkt mig at skifte y at være lig ikke at x, fordi vi nu ville være
fast i en cirkel, men snarere temp.
Hvor jeg midlertidigt - eller når Jess midlertidigt sætte appelsinsaft
før clobbering at kop med mælken.
>> Så lad mig gå videre nu og gøre dette.
Det hedder noswap.c.
Og lad mig nu køre uden swap.
Og ja, jeg se, om jeg udvide vindue en lille smule, at
x er 1, y er 2.
Og så x er 2, y er 1.
>> Men huske på, at på mandag gjorde vi tingene lidt anderledes, hvorved jeg
i stedet gennemført en hjælpefunktion, hvis du vil, var der faktisk ugyldige.
Jeg kaldte det bytte.
Jeg gav det to parametre, og jeg kaldte dem en, og jeg kaldte dem b.
>> Helt ærligt, jeg kunne kalde dem x og y.
Der er ikke noget at stoppe mig fra at gøre det.
Men jeg vil hævde, det er så lidt tvetydig.
Fordi tilbagekaldelse for mandag, som vi hævdede, at disse parametre var
kopier af de værdier passerede i.
Så det bare messer med din sind, tror jeg, hvis du bruger
nøjagtig de samme variabler.
>> Så jeg vil i stedet kalde dem en og b, bare for klarhed.
Men vi kunne kalde dem mest noget, vi ønsker.
Og jeg har tænkt mig at kopiere og indsætte effektivt denne kode deroppe fra
ned i her.
Fordi jeg har lige set, at det virker.
Så det er i temmelig god figur.
Og jeg vil ændre min x til en, min x til en, min y b og min y til b..
>> Så med andre ord,. Nøjagtig samme logik
Den nøjagtige samme ting, som Jess gjorde.
Og så en ting jeg nødt til at gøre op her, er naturligvis nu påberåbe sig denne
funktion eller kalder denne funktion.
Så jeg vil kalde denne funktion med to input, x og y, og hit Gem.
>> Okay, så fundamentalt det samme.
Faktisk har jeg nok gjort det program unødigt kompliceret ved
skrive en funktion, der tager bare omkring seks linjer kode mens jeg
tidligere havde gennemført dette på bare tre.
>> Så lad mig gå videre nu og genskabe dette gør ingen swap.
Okay, jeg skruet op her.
Dette bør være en fejl, som du måske se mere almindeligt som din
programmer får mere komplekse.
Men der er en nem fix.
Lad mig rulle tilbage op her.
>> Og hvad er den første fejl jeg ser?
Implicit erklæring.
Hvad der typisk indikerer?
Åh, jeg glemte prototypen.
Jeg glemte at undervise compiler, swap vil eksistere, selvom han
findes ikke i begyndelsen af programmet.
Så jeg vil bare sige ugyldig swap, int, en int b, semikolon.
>> Så jeg har ikke tænkt mig at reimplement det.
Men nu det passer, hvad der er hernede.
Og varsel, fraværet af et semikolon her, hvilket ikke er nødvendigt, når
gennemførelse.
>> Så lad mig genindspilning dette gør ingen swap.
Meget bedre form.
Kør ikke swap.
Og helvede.
Nu er vi tilbage, hvor vi var på mandag, hvor ting ikke bytte.
>> Og hvad er den intuitive forklaring for, hvorfor dette er tilfældet?
Ja?
>> STUDENT: [uhørlig].
>> DAVID MALAN: Præcis.
Så a og b er kopier af x og y.
Og i virkeligheden, når du har været kalde en funktion hidtil at
passerer variabler som int'er -
ligesom swap forventer her -
du fyre har været forbi på kopier.
>> Nu, betyder, at det tager lidt af tid, et split sekund, for
computer til at kopiere bits fra ét variabel i bittene i en anden.
Men det er ikke sådan en big deal.
Men de er ikke desto mindre en kopi.
>> Og så nu, i forbindelse med swap, Jeg er faktisk lykkedes
ændre a og b.
Faktisk, lad os gøre en hurtig tilregnelighed kontrollere.
Print f a er% i, ny linje.
Og lad os tilslutte et.
Lad os nu gøre det samme med b.
Og lad os gøre det samme her.
>> Og nu, lad mig kopiere de samme linjer igen ved bunden af ​​funktionen
efter mine tre linjer af interessante kunne have udført, og
udskrive a og b igen.
Så lad os nu gøre dette, gør ingen swap.
Lad mig gøre terminalvinduet en bit højere, så vi kan se
mere af det på én gang.
>> Og køre uden swap.
x er 1, y er 2. a er 1, b er 2.
Og så en er 2, b er 1.
Så det er i orden, ligesom Jess gjorde her inde i swap.
Men selvfølgelig er det ikke har nogen effekt på de variable i main.
>> Så vi oplevede et trick, hvorved vi kunne løse dette, right?
Når du er konfronteret med dette scoping problem, du kunne bare punt og gøre x
og y hvilken slags variabler i stedet?
>> Du kan gøre dem globalt.
Sæt dem på toppen af ​​filen som vi gjorde, selv i spillet på 15.
Vi bruger en global variabel.
Men i forbindelse med spillet en 15, det er rimeligt at have en global
variabel repræsenterer bord, fordi helhed af 15.c er alle
om at gennemføre det spil.
Det er, hvad filen eksisterer for at gøre.
>> Men i dette tilfælde her, jeg kalde en funktion swap.
Jeg ønsker at bytte to variable.
Og det skulle begynde at føle sig lige sjusket hvis opløsningen til alle vores
problemer, når vi løber ind i anvendelsesområdet spørgsmål er at gøre det globalt.
Fordi meget hurtigt vores program er kommer til at blive en ganske rod.
Og det gjorde vi, at meget sparsomt som et resultat i 15.c.
>> Men det viser sig at der er en bedre måde helt.
Lad mig faktisk gå tilbage og slette print f s, bare for at forenkle denne kode.
Og lad mig foreslå, at dette, ja, er dårlig.
Men hvis jeg i stedet tilføje nogle asterisker og stjerner, kan jeg i stedet vende denne
funktion i en, der er faktisk i drift.
>> Så lad mig gå tilbage her og indrømme at sige asterisker er altid vanskeligt,
så jeg vil sige stjerner.
Jeg vil bare Fess op til.
Ok.
Og nu, hvad skal jeg at gøre i stedet?
>> Så først og fremmest, vil jeg specificere at i stedet for at passere en int i
swap-funktion, jeg er i stedet for at gå at sige int stjerne.
Nu, hvad stjernen indikerer?
Dette er, at begrebet pointer, Binky, den claymation karakter, var
henvise til et øjeblik siden.
>> Så hvis vi siger int stjerne, betydningen af det nu er, at en ikke vil være
bestået ved sin værdi.
Det er ikke til at blive kopieret i.
Snarere, adressen på a er kommer til at være bestået i.
>> Så minde om, at indersiden af ​​din computer er en hel bunke af hukommelse, ellers
kendt som RAM.
Og det RAM er bare en hel masse bytes.
Så hvis din Mac eller din PC har to gigabyte, har du 2
milliard bytes hukommelse.
>> Lad os nu bare antage, at bare at holde tingene pæn og velordnet, vi
tildele en adresse -
et tal -
til alle byte af RAM i din computer.
Den allerførste byte af disse 2 milliarder er ved tallet nul.
Det næste er byte nummer et, nummer to, hele vejen på op dot dot
dot, til 2 mia groft.
>> Så du kan antallet af bytes af hukommelse i din computer.
Så lad os antage, at det er, hvad vi mener med en adresse.
Så når jeg ser int stjerne a, hvad der foregår der skal videregives i swap nu er det
adresse på.
Ikke dens værdi, men uanset postale adresse er, så at sige -
dens placering i RAM.
>> Og tilsvarende for b, vil jeg at sige det samme.
Int, stjerne, b..
Som en sidebemærkning teknisk stjernen kunne gå andre steder.
Men vi vil standardisere på stjernen bliver lige ved siden af ​​datatype.
>> Så swap signatur betyder nu, giv mig adressen på en int, og kald
pågældende adresse a.
Og giv mig en anden adresse for et int og kalder denne adresse b..
>> Men nu er min kode her har til at ændre.
Fordi hvis jeg erklærer int temp -
som stadig er af typen int -
men jeg gemme i det, hvilken slags værdi?
For at være klar, jeg sætte en a med koden som skrevet lige nu?
>> Jeg sætte placering i en.
Men jeg er ligeglad om placering nu, right?
Temp eksisterer bare Jess 'tredje cup eksisterede, til hvilket formål?
For at gemme en værdi.
Mælk eller appelsinjuice.
Ikke til rent faktisk at gemme adressen på enten af ​​disse ting, der føles
lidt meningsløse i denne virkelige verdens sammenhæng alligevel.
>> Så virkelig, hvad jeg ønsker at sætte i temp er ikke adressen på en, men
indholdet af en.
Så hvis en er en række ligesom 123, dette er 123. byte hukommelse, som en retfærdig
sker for at være besætter, at værdien i en sker for at være besat.
>> Hvis jeg ønsker at gå til denne adresse, Jeg behøver at sige stjerne en.
Tilsvarende, hvis jeg skulle ændre, hvad der er på adressen a, jeg ændre
dette for at starte en.
Hvis jeg ønsker at gemme i, hvad der er på placering en med hvad der er på det sted
på B,. stjernede b stjerne
>> Så kort, selvom det ikke er helt synker i endnu - og jeg ville ikke forvente
at det ville så hurtigt -
indse, at alt hvad jeg gør, er at prefixing disse stjerner på mine variabler,
talemåde ikke fat i værdier.
Du må ikke ændre værdierne.
Men snarere, gå til disse adresser og få værdi.
Gå til denne adresse og forandring den værdi der.
>> Så lad mig rulle tilbage op til toppen, bare for at fastsætte denne linje her, for at
ændre prototypen at matche.
Men jeg nu nødt til at gøre en anden ting.
Intuitivt hvis jeg har skiftet de typer af argumenter, der swap forventer,
hvad skal jeg ændre i min kode?
>> Når jeg kalder swap.
Fordi lige nu, hvad er Jeg passerer at bytte endnu?
Værdien x og værdien af ​​y, eller mælk og appelsinsaft.
Men jeg ønsker ikke at gøre det.
Jeg stedet vil passere, hvad?
Placeringen af ​​x og placeringen af ​​y.
Hvad er deres postadresser, så at sige.
>> Så for at gøre det, er der et og-tegn.
Ampersand slags lyder som adresse.
så n, tegnet, adressen af x, og adressen på y.
Så det er bevidst, at vi bruger ampersands når du kalder funktionen,
og stjerner, når erklære, og når gennemførelse af funktionen.
>> Og tænk bare på tegnet som adresse på brugeren, og stjerne som
derned operatør -
eller, mere korrekt, dereference operatør.
Så det er en hel masse ord bare for at sige, at nu, forhåbentlig er swap går
at være korrekt.
>> Lad mig gå videre og gøre -
lad os faktisk omdøbe filen, lest dette program stadig blive kaldt nogen swap.
Jeg hævder, at vi vil kalde det swap.c nu.
Så gør, bytte.
Dot, skråstreg, bytte.
>> Og nu ja, x er 1, y er 2..
Og derefter, x er 2, y er én.
Jamen så lad os se om vi ikke kan gøre dette til en lidt forskelligt, hvad er
foregår her.
Først, lad mig zoome ind på vores tegning skærm her.
Og lad mig foreslå et øjeblik - og når jeg trækker her, vil blive spejlet
deroppe nu - lad mig foreslå, at her er en hel bunke af hukommelse eller
RAM, inde i min computer.
>> Og det vil være bid nummer, lad os sige, 1..
Dette vil være byte nummer 2.
Og jeg vil gøre en hel masse mere, og derefter en flok dot dot prikker
indikerer, at der er 2 milliarder af disse ting.
4, 5, og så videre.
>> Så er der de første fem bytes af min computers hukommelse.
Okay?
Meget få af 2 mia.
Men nu vil jeg foreslå følgende.
Jeg har tænkt mig at foreslå, at x kommer til at gemme nummeret 1, og y går
at gemme nummeret 2..
Og lad mig gå videre nu, og repræsenterer disse værdier som følger.
>> Lad os gøre det som følger.
Giv mig bare et sekund.
Et sekund.
OK.
Jeg ønsker at gøre dette til en lille -
lad os gøre det igen.
Ellers vil jeg og bruge samme numre, utilsigtet,
flere gange.
>> Så bare så vi har forskellige numre at tale om, så lad os kalde denne byte
nummer 123, 124, 125, 126, og dot dot dot.
Og lad mig hævder nu, at jeg har tænkt mig at sætte værdien 1 her, og værdien 2
her, ellers kendt som x og y.
Så er det bare så sker det, at dette er x, dette er y.
>> Og blot ved nogle tilfældige chance, de computer, operativsystemet,
sket at sætte x ved placering nummer 123.
Og y endte på placering 124 -
damn it.
Jeg skulle have fastsat dette.
Åh mand, jeg virkelig ønsker at gøre dette?
Ja, jeg ønsker at løse dette og b. egentlig om denne dag.
Beklager, ny på dette.
>> 127, 131, og jeg ønskede ikke at være denne kompleks, men hvorfor gjorde jeg ændre
tal der?
Fordi jeg ønsker ints til faktisk være fire bytes.
Så lad os være super anal om dette.
Så hvis 1 sker for at blive behandlet 123, er 2 vil være på adresse
127, fordi det er kun 4 byes væk.
Det er alt.
Og vi vil glemme alt om alle de andre adresser i verden.
>> Så x er ved stedet 123, y er på placering 127..
Og nu, hvad gør jeg faktisk ønsker at gøre?
Når jeg kalder swap nu, hvad er faktisk foregår?
Tja, når jeg kalder swap, jeg passerer adressen af ​​x og adressen på y.
Så for eksempel, hvis disse to stykker papir nu repræsenterer to
argumenter a og b til at bytte, hvad er jeg vil skrive på den første af disse,
som jeg har tænkt mig at kalde kalder en?
>> Præcis, 123..
Så dette jeg hævder er en.
Dette er parameteren en.
Jeg sætte adressen på x derinde.
>> Hvad er det?
>> Nej, nej.
Det er OK.
Stadig god, stadig god.
Så dette er en.
Og nu på det andet stykke papir, dette vil være b og hvad er jeg
kommer til at skrive på dette stykke papir?
127..
>> Så det eneste, der er ændret siden vores tidligere fortæller i denne historie er,
snarere end bogstaveligt 1 og 2, er jeg vil passere i 123 og 127.
Og jeg vil nu sætte disse ind af denne boks,? okay
Så sorte boks udgør nu swap-funktion.
>> I mellemtiden, lad os nu få nogen gennemføre swap-funktion.
Ville nogen heroppe gerne frivilligt?
Kom op.
Hvad er dit navn?
Charlie.
Okay, Charlie.
Kom op.
>> Så Charlie kommer til at spille rolle i vores sorte boks.
Og Charlie, hvad jeg vil gerne have dig til at gøre nu gennemføre swap på en sådan måde
at i betragtning af disse to adresser, du var faktisk kommer
at ændre værdierne.
Og jeg vil hviske i øret hvordan du kører TV her.
>> Så gå videre, og du er den sorte boks.
Nå derinde.
Hvilke værdier kan du se en, og hvilke værdier du se b?
>> CHARLIE: a er 123 og b er 127..
>> DAVID MALAN: OK, nøjagtigt.
Nu pause der for bare et øjeblik.
Den første ting du skal gøre nu, i henhold til koden - hvilket
Jeg vil nu trække op på skærmen -
vil være at afsætte lidt smule hukommelse kaldet temp.
Så jeg har tænkt mig at gå videre og give dig, at hukommelsen.
>> Så dette vil være en tredje variabel at du har adgang til
du kaldte temp.
Og hvad vil du skrive på temp stykke papir?
>> CHARLIE: Pointers, right?
>> DAVID MALAN: OK, godt ikke nødvendigvis pointere.
Så den linje kode, som jeg har fremhævet på den højre side,
lad os starte der.
Det siger stjerne a.
Så en i øjeblikket opbevaring det nummer 123.
Og lige intuitivt, hvad gjorde stjerne 123 betyder?
>> Men specifikt, hvis a er 123, stjerne a betyder hvad?
Værdien af ​​en.
Eller mere afslappet, derned.
Så lad mig foreslå, at du holder en i din hånd, gå videre og behandle det
som om det er et kort.
Og gå dig over til computerens hukommelse og finde os, hvad der er
ved placering 123..
Præcis.
>> Så vi ser på placering 123 er hvad, naturligvis?
OK, så hvad værdien nu er du vil sætte ind temp?
Præcis.
Så gå videre og gøre det.
Og skriv nummer 1 på det stykke af papir, der aktuelt titlen temp.
>> Og nu det næste skridt, at du kommer til at gennemføre
kommer til at være hvad.
Nå, på højre side af næste linje kode er stjernede b. b, for
Selvfølgelig lagrer en adresse.
Der omhandler 127..
Star B betyder, hvad, henkastet taler?
>> Gå til denne placering.
Så gå videre og finde os, hvad der er ved placering 127..
OK.
Selvfølgelig, ved stedet 127 er stadig værdien 2.
Så hvad vil du nu butik på hvad er det sted i en?
Så stjerne et middel gå til den placering en.
Hvad er placering en?
>> Præcis.
Så nu, hvis du ønsker at ændre hvad der er på det sted -
Jeg vil gå videre og køre viskelæderet er her.
Og nu sætte det tilbage på børsten.
Hvilket nummer vil du skrive i den tomme kasse nu?
>> Præcis.
Så dette linje kode, for at være klar - lad mig pause hvad Charlie laver og
påpege, hvad han netop gjort, er skrive ind i den boks i placering 123
den værdi, der tidligere var på b..
Og så har vi nu implementeret faktisk denne anden linje kode.
>> Nu desværre er der stadig en linie tilbage.
Nu hvad der er i temp, bogstaveligt?
Det er naturligvis nummer et.
Det er ikke en adresse.
Det er bare et nummer, en slags en variabel fra uge et.
>> Og nu når du siger stjernede b, der betyder gå til den adresse, b, som er af
kursus her.
Så når du får der -
Jeg vil gå videre og slette hvad der er faktisk der - og hvad er du
vil skrive nu på placering 127.?
>> CHARLIE: Temp, som er én.
>> DAVID MALAN: Temp, som er én.
Og hvad sker der med temp i sidste ende?
Nå, vi ikke rigtig kender.
Vi har ikke rigtig pleje.
Helst vi har implementeret en funktion hidtil, eventuelle lokale variabler, du har
er endog lokalt.
Og de bare forsvinder.
De er regenereret af operativsystemet systemet med tiden.
>> Så det faktum, at temp stadig har værdien 1 er en slags fundamentalt
uinteressant for os.
Okay, så en runde af bifald hvis vi kunne for Charlie.
Meget godt klaret.
>> Okay, så hvad mere gør dette betyder, at vi kan gøre?
Så det viser sig, at vi har været fortæller et par hvide løgne
i temmelig lang tid.
Faktisk viser det sig, at en streng, al den tid, er egentlig ikke en
sekvens af tegn per se.
Den slags er, at intuitivt.
>> Men teknisk set, string er en datatype, som vi erklæret inde i
Den CS50 biblioteket at forenkle verden for de første par uger af klassen.
Hvad en streng virkelig er den adresse af en karakter eller andet sted i RAM.
En streng er virkelig et nummer, som 123 eller 127, der sker for at afgrænse
hvor en streng begynder i computerens hukommelse.
>> Men det betyder ikke repræsenterer streng, per se, selv.
Og vi kan se dette som følger.
Lad mig gå videre og åbne op noget kode, der er blandt
nutidens kildekode eksempler.
Og jeg har tænkt mig at gå videre og åbne op, lad os sige, sammenligne-0.c.
Dette er en fejlbehæftet program, der går skal gennemføres som følger.
>> First.
Jeg har tænkt mig at sige noget.
Så jeg har tænkt mig at gå videre og få en streng fra brugeren
i det næste linje.
Så jeg har tænkt mig at sige det igen.
Så jeg har tænkt mig at få en anden streng fra brugeren.
>> Og varsel, jeg viser en af ​​de strenge i en variabel kaldet s, og
anden af ​​disse strenge i en variabel kaldet t..
Og nu vil jeg hævde, meget rimeligt, at hvis s er lig lig t,
strengene er de samme.
Du skriver det samme.
Else, strengene er ikke det samme.
>> Efter alt, hvis vi input to ints, to chars, to flåd, to doubler, kan enhver
de datatyper, vi har talt om hidtil at sammenligne dem -
husker vi gjort meget klart et stykke tid siden at du ikke gør dette, fordi en
single lighedstegn er selvfølgelig opgaven operatør.
Så det ville være en fejl.
>> Vi bruger lige lighedstegnet, der faktisk sammenligner
ting for reel ligestilling.
Men jeg hævde dette er buggy.
Hvis jeg gå videre og gøre sammenligne nul, og derefter gøre dot skråstreg sammenligne nul.
Og jeg skriver i, lad os sige, hej.
Og så lad os sige hej igen.
Bogstaveligt talt det samme, computeren krav jeg har skrevet forskellige ting.
>> Nu måske jeg bare skrevet forkert noget.
Jeg vil skrive mit navn denne gang.
Jeg mener, hej.
Hello.
Det er forskelligt hver eneste gang.
>> Tja, hvorfor er det?
Hvad der virkelig foregår under hætten?
Nå, hvad der virkelig foregår under emhætten er den streng, så
Jeg har skrevet i det første gang for eksempel er ordet hej, selvfølgelig.
Men hvis vi repræsentere denne under hætten, minde om, at en
streng er i et array.
Og vi har sagt så meget i fortiden.
>> Så hvis jeg trækker den opstilling som dette, er jeg kommer til at repræsentere noget helt
svarer til, hvad vi gjorde for et øjeblik siden.
Og der er faktisk noget specielt her, også.
Hvad gjorde vi bestemme blev ved i slutningen af ​​hver streng?
Ja, det backslash nul, hvilket er bare den måde at repræsentere,
bogstaveligt, 00000000.
Otte 0 bits i træk.
>> Jeg ved det ikke, helt ærligt, hvad er efter dette.
Det er bare en flok mere RAM inde i min computer.
Men dette er et array.
Vi talte om arrays før.
Og vi typisk tale om arrays som værende placering nul,
derefter en, så to.
Men det er kun for nemheds skyld.
Og det er helt relativ.
>> Når du faktisk får hukommelse fra computeren, er det selvfølgelig noget
2 milliarder nogle mærkelige bytes, potentielt.
Så virkelig under hætten, al denne tid, ja.
Dette kunne meget vel være beslag nul.
Men hvis du graver endnu dybere under hætten, der er virkelig
fat nummer 123.
Dette er adressen 124.
Dette er adressen 125.
>> Og jeg ikke skrue op denne gang.
Disse er nu en byte Bortset hvorfor?
Hvor stor er en char?
En char er blot én byte.
En int er typisk fire bytes.
Så det er derfor, jeg gjorde det 123 127, 131 og så videre.
Nu kan jeg holde math enklere og bare gøre plus 1.
Og det er nu, hvad der virkelig foregår på under hætten.
>> Så når du erklærer noget som dette, string s, det er faktisk -
viser det sig -
char stjerne.
Stjerne, betyder naturligvis adresse, alias pointer.
Så det er adressen på noget.
Hvad er den adressen?
>> Well -
Jeg er den eneste, der kan se meget vigtigt punkt jeg gør, eller tror
Jeg gør.
Så string -
det sørgelige er jeg har en skærm lige der, hvor jeg
kunne have set det.
>> Okay, så string s er, hvad Jeg erklærede tidligere.
Men det viser sig, takket være en lille magi i CS50 bibliotek, alt dette
tidsstreng har bogstaveligt været char stjerne.
Stjernen betyder igen pointer eller adresse.
Det faktum, at det er flankerer Ordet char betyder, at det er den
adresse af en karakter.
>> Så hvis få strengen kaldes, og jeg skriver i H-E-L-L-O foreslå nu, hvad der er at få
streng bogstaveligt været tilbage alle denne gang, selvom vi har snarere
forsimplede verden?
Hvad får strengen faktisk vende tilbage som dens returværdi?
>> 123 i dette tilfælde, for eksempel.
Vi har tidligere sagt, at få strengen blot returnerer en streng, en sekvens af
tegn.
Men det er lidt af en hvid løgn.
Den måde at få strengen virkelig fungerer under hætten er det får en
streng fra brugeren.
Det plops De tegn, han eller hun typer i hukommelsen.
Det sætter en omvendt skråstreg nul i slutningen af disse sekvens af tegn.
>> Men hvad betyder får strengen bogstaveligt tilbage?
Det bogstaveligt returnerer adressen på den allerførste bytes i RAM,
Det bruges til at styrke.
Og det viser sig, at bare ved at returnere en enkelt adresse
første tegn i strengen, der er tilstrækkelig til at finde sin helhed
strengen.
>> Med andre ord, få strengen ikke har at vende tilbage 123 og 124 og 125.
Det behøver ikke at give mig en lang liste over alle de byte,
min streng bruger.
Fordi en, de er alle tilbage til tilbage.
Og to, baseret på den første adresse, jeg kan regne ud, hvor strengen ender.
Hvordan?
>> Den særlige null karakter, bagstreg nul ved udgangen.
Så med andre ord, hvis du passerer rundt -
indersiden af ​​variabler -
adressen på en char, og du påtager dig at der ved udgangen af ​​enhver streng, kan enhver
sekvens af tegn som vi mennesker tænke på strenge, hvis man antager, at
ved afslutningen af ​​en sådan streng er der en omvendt skråstreg nul, er du gyldne.
Fordi du altid kan finde enden af ​​en snor.
>> Nu hvad der virkelig så gå om i dette program?
Hvorfor er dette program, sammenligne-0.c, buggy?
Hvad der faktisk sammenlignes?
Ja?
>> STUDENT: [uhørlig].
>> DAVID MALAN: Præcis.
Det sammenligne steder af strengene.
Så hvis brugeren har indtastet hej gang, som jeg gjorde, kan hukommelsen ender
ser ud som dette.
Hvis brugeren derefter typer i Hej igen, men ved at kalde få strengen igen, er c
ikke særlig smart, medmindre du underviser det at være klog ved at skrive kode.
>> C -
og computere mere generelt -
hvis du skriver i ordet hej igen, du ved, hvad du vil få.
Du vil bare få en anden matrix hukommelse, som, ja, der sker være
lagring H-E-L-L-O og så videre.
>> Det kommer til at se det samme på os mennesker, men denne adresse
måske ikke være 123.
Det kunne bare så ske, at operativsystem har nogle tilgængelige
plads for eksempel ved placering -
lad os sige noget vilkårligt, som dette er placering 200.
Og det er placering 201..
Og det er placering 202..
Vi har ingen idé om, hvor det er vil være i hukommelsen.
>> Men hvad det betyder er, at hvad der er skal oplagres i sidste ende i s?
Det nummer 123.
Hvad kommer til at blive gemt i t, i denne vilkårlige eksempel?
Nummeret 200.
Og alt det betyder så er naturligvis, 123 ikke er lig 200.
Og så dette hvis betingelse aldrig evalueres til sand.
Fordi get streng ved hjælp af forskellige bidder af hukommelsen hver gang.
>> Nu kan vi se det igen i et andet eksempel.
Lad mig gå videre og åbne op copy-0.c.
Jeg hævder, at dette eksempel vil prøv - men undlader - at kopiere to strenge
som følger.
>> Jeg har tænkt mig at sige noget til brugeren.
Jeg derefter gå til at få en snor og kalder det s.
Og nu, jeg gør denne kontrol her.
Vi nævnte dette et stykke tid tilbage.
Men når måske få strengen tilbage null, anden særlig karakter, eller særlige
symbol lad os sige.
Hvis det er ud af hukommelsen.
>> For eksempel, hvis brugeren er virkelig være vanskeligt og typer et afskyeligt
Antallet af tegn på tastatur og hits Enter.
Hvis dette antal tegn kan bare ikke passer i RAM uanset crazy
Derfor godt få strengen måske meget godt returnere null.
>> Eller hvis dit program i sig selv gør en masse andre ting, og der er bare
ikke nok hukommelse til get streng at lykkes, kan det ende
at returnere null.
Men lad os være mere præcise om, hvad dette er.
Hvad er s datatype egentlig?
Char stjerne.
>> Så det viser sig nu, kan vi skrælle bakke lag null.
Slår ud, null er - ja, selvfølgelig et særligt symbol.
Men hvad er det egentlig?
Virkelig, null er bare et symbol, som vi mennesker bruger til at repræsentere nul så godt.
>> Så forfatterne af C og computere mere generelt, besluttede år siden
der, ved du hvad.
Hvorfor vi ikke sikrer, at ingen brugere data er aldrig, aldrig, aldrig
opbevaret ved bye nul?
I virkeligheden, i selv min vilkårlig eksempel før, havde jeg ikke begynde nummereringen
bytes nul.
Jeg startede på en.
Fordi jeg vidste, at mennesker i verden har besluttet at reservere nul
byte i nogens RAM, som noget særligt.
>> Årsagen er, når som helst du ønsker at signalere, at noget er gået galt
med hensyn til adresser, returneres du null - ellers kendt som nul -
og fordi du ved, at der ikke er nogen legit data på adressen nul, klart
det betyder en fejl.
Og det er derfor vi efter sædvane tjek for ugyldige og returnere noget
som en i disse tilfælde.
>> Så hvis vi rulle ned nu, det er bare derefter nogle fejlkontrol, just in case
noget gik galt med [? kaution?]
helt og afslutter programmet ved at returnere tidligt.
Denne linje kunne nu blive omskrevet da dette betyder som hvad?
På venstre side, giver mig en anden pointer til et tegn, og kalder det t.
Hvad skal jeg gemme inde i t, baseret på denne ene linje kode?
>> Jeg gemmer et sted.
Specifikt placering der var i sek.
Så hvis brugeren har indtastet hej, og at første hej sker for at ende op
her, og det nummer 123 er kommer tilbage fra at få
snor og opbevares -
som vi sagde tidligere -
i sek.
>> Når jeg erklærer nu en anden pointer til en char og kalder det t, hvad nummer er
bogstaveligt kommer til at ende i t ifølge historien?
Så 123.
>> Så teknisk nu både s og t peger til den nøjagtige
samme bidder af hukommelsen.
Så mærke til, hvad jeg har tænkt mig at gøre nu for at bevise, at dette program er buggy.
>> Først vil jeg hævde, med en print f, kapitalisering
kopien af ​​strengen.
Så jeg har tænkt mig at gøre lidt fejlkontrol.
Jeg har tænkt mig at sørge for.
Lad os sørge for, at strengen t er mindst større end nul i længden,
så der er nogle tegn der faktisk udnytte.
>> Og så skal du måske husker dette fra tidligere eksempler.
2 øverste - som er i den ctype.h fil.
T bracket nul giver mig nul tegn i strengen t..
Og 2 øverste i samme værdi, Selvfølgelig konverterer det til store bogstaver.
>> Så intuitivt, det fremhævede linje kode er kapitalisere den første
bogstav i t.
Men det er ikke kapitalisering, intuitivt, det første bogstav i sek.
Men hvis du tænker fremad, hvad er jeg til at se, når jeg kører dette program
og printe både den oprindelige, s, og den såkaldte kopi, t?
>> De er faktisk kommer til at være den samme.
Og hvorfor er de kommer til at være det samme?
De er begge peger på nøjagtig det samme.
Så lad os gøre dette.
>> Gør kopi nul.
Det kompilerer OK.
Lad mig køre kopi nul.
Lad mig skrive noget lignende Hej i små bogstaver og derefter trykke på Enter.
Og det hævder, at både den oprindelige s og kopien rent faktisk er identiske.
>> Så hvad der virkelig skete her?
Lad mig gentegne dette billede bare at fortælle historien på en
lidt anden måde.
Hvad der virkelig foregår under hætte, når jeg erklærer noget lignende
char starte s eller streng s, Jeg får en pegepind -
hvilket sker for at være på fire bytes i CS50 apparat
og i en masse computere.
Og jeg har tænkt mig at kalde denne sek.
Og det har i øjeblikket nogle ukendt værdi.
>> Når du erklærer en variabel, med mindre du selv sætte en værdi der, som
ved, hvad der er der.
Det kunne være nogle tilfældige sekvens af bit fra den foregående udførelse.
Så da jeg efter min linje kode får streng, og derefter gemme afkastet
værdi i s får string eller anden måde -
og vi vil i sidste ende skrælle hvordan får string værker, en eller anden måde allokerer en
array, der formentlig ser lidt ligesom dette.
H-E-L-L-O, backslash nul.
>> Lad os antage, at dette er adressen 123 bare første konsistens.
Så får snor afkast i fremhævede linje der, det returnerer
Antallet vi sagde, 123..
Så hvad der virkelig går inde i s her?
>> Nå, hvad der virkelig går indersiden af ​​s er 123.
Men helt ærligt, jeg får lidt forvirret af alle disse adresser,
alle disse vilkårlige numre.
123, 124 og 127.
Så lad os faktisk forenkle verden en lille smule.
>> Når vi taler om pointere, helt ærligt, at os mennesker, hvem dælen bekymrer hvor
tingene er i hukommelsen?
Det er helt vilkårlig.
Det kommer til at afhænge af, hvordan meget RAM brugeren har.
Det kommer til at afhænge af, hvornår på dagen du kører programmet, måske, og
hvilken indgang brugeren giver dig.
Vi dvæle ved ubetydelige detaljer.
>> Så lad os abstrakte væk og sige, når du kører en linje kode som dette,
char stjerne s får afkastet Værdien af ​​get streng.
Hvorfor vi ikke i stedet blot tegne, hvad vi holde kalde en pegepind, som om det er
peger på noget?
Så jeg hævder nu, at s op der er en pegepind -
under hætten, det er en adresse.
Men det er bare at pege på den første byte i
streng, der er blevet returneret.
>> Hvis jeg nu tilbage til kode her, hvad der foregår på denne linje?
Tja, i denne fremhævede linje nu Jeg erklære tilsyneladende en anden
variabel kaldet t..
Men det er også en pointer, så jeg har tænkt mig at tegne den som i teorien, den nøjagtige
samme størrelse kasse.
Og jeg har tænkt mig at kalde det t.
>> Og nu, hvis vi går tilbage til koden igen, når jeg gemmer s inde i t,
hvad er jeg teknisk set sætte indersiden af ​​t?
Nå teknisk dette var nummer 123.
Så jeg virkelig skal skrive det nummer 123 der.
Men lad os tage det højere niveau.
t, hvis det er bare en pointer, intuitivt, er netop.
Det er alt, der er at være gemt derinde.
>> Så nu i de seneste interessante linjer kode, når jeg faktisk gå om
kapitalisere nultegnet i t, hvad der foregår?
Nå, er t beslag zero nu peger til hvilken karakter, formentlig?
>> Det peger på h.
Fordi t bracket zero -
husker, er dette gamle syntaks. t beslag nul betyder bare hvis t er en streng, t
beslag nul betyder at få nul karakter i denne styrke.
Så hvad der virkelig betyder er at gå til dette array -
og ja, dette kan være 123, dette kan være 124.
Men det er alle relativ, huske.
Når vi taler om et array, har vi den fordel at tale om
relative indeks.
>> Og så nu kan vi bare antage at t beslag nul er h.
Så hvis jeg kalder 2 øverste på det, hvad det er virkelig gør, er at kapitalisere
det lille h til store bogstaver H. Men selvfølgelig er det s?
Det fører til den samme darn streng.
>> Så dette er alt, der er foregået i denne kode hidtil.
Så hvad er så konsekvenserne?
Hvordan kan vi løse disse to problemer?
Hvordan kan vi sammenligne med de faktiske strings?
>> Nå intuitivt, hvordan ville du går om at sammenligne to
strenge til reel ligestilling?
>> Hvad betyder det, hvis to strings er lige?
Klart ikke at deres adresser er lig i hukommelsen, fordi det er en lav
niveau gennemførelse detalje.
Alle tegn er de samme.
Så lad mig foreslå og lad mig præsentere i version en af ​​compare.c
her, så sammenligne-1.c.
>> Lad mig foreslå, at vi stadig får en pointer kaldet s, og butik i det
returnere værdien af ​​get streng.
Lad os gøre det samme med t.
Så ingen af ​​koden er anderledes.
Jeg har tænkt mig at tilføje en lille mere fejlkontrol nu.
Så nu, at vi er en slags peeling tilbage dette lag i CS50 af, hvad en streng
egentlig er, vi skal være mere anal om at sikre, at vi ikke misbruger
ugyldige værdier som null.
>> Så jeg bare at kontrollere.
Hvis s ikke gør lige null og t ikke lige null, der betyder, at vi OK.
Få strengen ikke skrue op få en af ​​disse strenge.
Og du kan måske gætte nu, hvad betyder STR CMP formentlig gøre?
String sammenligne.
>> Så hvis du har programmet i java før, dette er ligesom lig metode i
streng klasse.
Men for dem af jer, der ikke har programmeret før,
dette er blot en C-funktion.
Det sker for at komme i en fil kaldet string.h.
Det er, hvor det er erklæret.
>> Og string sammenligne -
Jeg faktisk glemmer dens brug, men pyt det.
Husk på, at vi kan gøre mand, rør sammenligne.
Og det kommer til at opdrage Linux programmører manual.
Og det er helt ærligt, lidt kryptisk.
Men jeg kan se her, at, jep.
Jeg er nødt til at medtage string.h.
>> Og det står her under beskrivelsen "den string Sammenligningsfunktion sammenligner
De to strenge S1 og S2. "og S1 og S2 er tilsyneladende to
argumenter gik i.
Jeg kan ikke rigtig huske, hvad const er, men nu mærke til -
og du har måske set det allerede, når har du bruge mand sider, hvis du
har det hele -
at char stjerne er bare synonym med snor.
>> Så det sammenligner de to strygere, S1 og S2, og det returnerer et heltal mindre
end eller lig med eller større end nul hvis S1 er fundet, henholdsvis at være
mindre end eller matche eller være større end S2.
Det er bare en meget kompleks måde at sige denne streng sammenligne afkastet
nul, hvis to strenge er intuitivt identiske, tegn for
tegn for tegn.
>> Den returnerer et negativt tal, hvis s, alfabetisk, formodes
at komme før t.
Eller returnerer et positivt tal, hvis s formodes at komme efter t
alfabetisk.
Så med denne enkle funktion, kunne dig, for eksempel, sortere en
hel masse ord?
>> Så i denne nye version, vil jeg til at gå videre og gøre compare1.
Dot skråstreg sammenligne en.
Jeg skrive i Hej i alle små bogstaver.
Jeg har tænkt mig at skrive i hej i små bogstaver igen.
Og heldigvis nu indser Jeg har skrevet det samme.
>> I mellemtiden, hvis jeg skriver i Hej i lavere sag og HELLO i versaler og
sammenligne dem, jeg har skrevet forskellige ting.
Fordi ikke kun er adresserne forskellige, men vi sammenligner
forskellige karakterer igen og igen.
>> Jamen så lad os gå og løse en andet problem nu.
Lad mig åbne op udgave af en af eksemplar, som nu omhandler
dette spørgsmål som følger.
Og denne kommer til at se lidt mere kompliceret.
Men hvis du tænker over, hvad problem, vi brug for at løse, forhåbentlig vil dette være
klart på bare et øjeblik nu.
>> Så dette første linje, char starte t, i lægmandssprog kunne nogen foreslå
hvad denne linje her betyder?
Char stjerne t, hvad er, at gøre?
>> Godt.
Opret en pointer til nogle stedet i hukommelsen.
Og lad mig finpudse det en lille smule.
Erklær en variabel, der gemmer adresse nogle char i hukommelsen, bare
at være lidt mere korrekt.
>> OK, så nu er på højre side, har jeg aldrig set en af ​​disse funktioner
før, malloc.
Men hvad kunne det betyde?
Tildeling af hukommelse.
Allokering af hukommelse.
>> Så det viser sig, indtil nu, har vi har ikke rigtig haft en effektiv måde
beder operativsystemet, give mig nogle hukommelse.
Snarere har vi nu en funktion kaldet malloc, der gør netop dette.
Selv om dette er lidt af en distraktion lige nu, bemærke, at i
mellem de to parenteser er bare at være et tal.
Hvor jeg har indtastet den pågældende mærker kan være et tal.
>> Og det tal betyder, giv mig 10 bytes.
Giv mig 20 byte.
Giv mig 100 bytes.
Og malloc vil gøre sit bedste for at bede operativsystem -
Linux, i dette tilfælde -
hey, er deres 100 bytes RAM til rådighed?
Hvis ja, returnere disse bytes til mig ved returnering hvis adresse af
disse bytes, måske?
Den allerførste.
>> Så her også - og det er fremherskende i C, når du er
beskæftiger sig med adresser?
Du er næsten altid beskæftiger sig med første sådanne adresse, uanset hvor stor
en luns af hukommelse, du bliver afleveres tilbage, så at sige.
>> Så lad os dykke i her.
Jeg forsøger at afsætte hvordan mange bytes, helt præcist?
Well.
String længde s - lad os gøre et konkret eksempel.
Hvis s er hej, H-E-L-L-O, hvad er streng længde s, naturligvis?
Så det er fem.
Men jeg gør et plus 1 på det, hvorfor?
Hvorfor skal jeg have seks bytes i stedet for fem?
Den null-tegn.
>> Jeg ønsker ikke at forlade off denne særlige null-tegn.
Fordi hvis jeg lave en kopi af Hej og bare gøre H-E-L-L-O, men jeg kan ikke sætte
at specialtegn, computeren måske ikke har, ved en tilfældighed, en omvendt skråstreg
nul der for mig.
Og så hvis jeg forsøger at finde ud af Længden af ​​kopien, kunne jeg tror, ​​at
Det er 20 tegn lang, eller en million tegn, hvis jeg aldrig bare ske
at ramme en backslash nul.
>> Så vi har brug seks bytes til at gemme H-E-L-L-O, backslash nul.
Og så er det bare at være super anal.
Antag, at jeg glemmer, hvad størrelsen af ​​en char er.
Vi holder siger det er én byte.
Og det plejer at være.
I teorien kunne det være noget anderledes, på en anden Mac eller en
anden pc.
>> Så det viser sig der er denne operatør kaldet sizeof at hvis du passerer det
navnet på en datatype - ligesom char eller int eller float -
det vil fortælle dig, dynamisk, hvor mange bytes en char tager op på dette
særlig computer.
>> Så dette er faktisk bare ligesom at sige gange 1 eller
gange slet ingenting.
Men jeg gør det bare for at være super anal, der bare i tilfælde af en char adskiller
på din computer versus mine, på denne måde matematik vil altid tjekke.
>> Endelig hernede jeg tjekke for null, som altid er god praksis - igen,
helst vi har med pointere.
Hvis malloc ikke var i stand til at give me seks byes - som er
usandsynlig, men kun i tilfælde -
returnere en med det samme.
Og nu, gå videre og kopiere strengen som følger.
Og det er velkendt syntaks, end i en anden rolle.
>> Jeg har tænkt mig at gå videre og få snoren Længden af ​​s og opbevar det i n..
Jeg derefter gå til at gentage fra i lig nul til og med n,
større end eller lig med.
Så på hver iteration, satte jeg ed karakter si den i'te
karakter af t.
>> Så hvad der virkelig foregår nedenunder hætten her?
Tja, hvis dette, for eksempel, er s -
og jeg har indtastet ordet H-E-L-L-O og der er en backslash nul.
Og igen, det er s peger her.
Og her nu er t.
>> Og det peger nu en kopi af hukommelse, right?
Malloc har givet mig en hel luns af hukommelse.
Jeg kender ikke oprindeligt, hvad der er i nogen af ​​disse placeringer.
Så jeg har tænkt mig at tænke på disse som en hel masse spørgsmålstegn.
>> Men så snart jeg begynder at looping fra nul på op gennem længden af ​​s, t
beslag nul og t bracket 1 -
og jeg vil sætte dette nu over hovedhøjde -
t beslag nul og s beslag nul betyder at jeg har tænkt mig at kopiere
iterativt t på her, E-L-L-O. Plus, fordi jeg gjorde plus
1, backslash nul.
>> Så nu i tilfælde af sammenligne-1.c, i sidste ende, hvis jeg udskrive
kapitalisering af t, bør vi se, at s er uændret.
Lad mig gå videre nu, og gøre dette.
Så gør Copy1.
Dot slash Kopi1.
Jeg har tænkt mig at skrive i hallo, Enter.
Og nu mærke til, kun kopien er aktiveret.
Fordi jeg virkelig har to bidder af hukommelsen.
>> Desværre, kan du gøre nogle ret dårlige og temmelig farlige ting her.
Lad mig trække et eksempel her nu, der giver os et eksempel på et par
forskellige linjer.
Så bare intuitivt her den første linje kode er int stjerne x, erklære
en variabel kaldet x.
Og hvad er datatypen af denne variabel?
Hvad er datatypen for denne variabel?
Det var ikke cliffhanger.
>> Datatypen er int stjerne.
Så hvad betyder det? x vil gemme adressen på en int.
Simpelt er det.
Y vil gemme adressen på en int.
Hvad er den tredje linie kode gør der?
Det fordeling, hvor mange bytes, mest sandsynligt?
Four.
På grund af størrelsen af ​​en int er generelt fire, malloc af fire giver
mig tilbage adressen på en luns af hukommelse, den første hvis byte er
lagres nu i x.
>> Nu er vi er ved at flytte lidt hurtigt.
Stjerne x betyder hvad?
Det betyder at gå til denne adresse og sætte hvad nummer der?
Sæt nummer 42 der.
Stjerne y betyder at gå til hvad der er på y og sætte nummer 13 der.
>> Men vent et øjeblik.
Hvad der er i y i øjeblikket?
Hvilken adresse er y lagring?
Vi ved det ikke, vel?
Vi har aldrig engang bruge opgaven operatør involverer y.
Så y som angivet på den anden linje i kode er blot nogle skrald værdi, en stor
spørgsmålstegn så at sige.
Det kunne pege tilfældigt til noget i hukommelsen, hvilket
er generelt dårlig.
>> Så så snart vi ramte denne linje der, stjerne y lig 13, noget dårligt,
noget meget slemt er omkring at ske for Binky.
Så lad os se, hvad der kommer til at ende sker for Binky her i dette øjeblik
eller så se.
>> [VIDEO AFSPIL]
>> -Hej, Binky.
Vågn op.
Det er tid til pointer sjov.
>> -Hvad er det?
Lær om pointers?
Åh, goodie.
>> -Nå, for at komme i gang, jeg tror vi er vil få brug for et par pointers.
>> -OK.
Denne kode allokerer to pointere der kan pege på heltal.
>> -OK, godt, jeg ser de to pointere.
Men de synes ikke at være peger på noget.
>> -Det er rigtigt.
Oprindeligt pointers ikke pege på noget.
De ting, de peger på kaldes pointees, og indstille dem er en
separat trin.
>> -Oh, højre, højre.
Jeg vidste det.
De pointees er adskilt.
Så hvordan kan du allokere en pointee?
>> -OK.
Nå, denne kode tildeler en ny heltal pointee, og denne del sætter x
at pege på den.
>> -Hey, det ser bedre ud.
Så gør det gøre noget.
>> -OK.
Jeg vil dereference markøren x for at gemme nummeret 42 i sin pointee.
For dette trick, vil jeg brug for min magi tryllestav af dereference.
>> -Din tryllestav af dereferere?
Uh, det er fantastisk.
>> -Det er, hvad koden ser ud.
Jeg vil bare oprette nummeret, og -
>> -Hey, se.
Der det går.
Så gør en dereference på x følger pilen for at få adgang til dets pointee.
I dette tilfælde opbevares til 42 derinde.
Hey, prøv at bruge den til at gemme nummeret 13 gennem den anden pointer, y.
>> -OK.
Jeg vil bare gå over her y og får nummer 13 oprettet.
Og derefter tage staven af dereferere og bare -
whoa!
>> -Oh, hej.
Det fungerede ikke.
Sig Binky, tror jeg ikke det dereferere y er en god idé,
fordi oprettelsen af ​​pointee er et separat trin.
Og jeg tror ikke, vi nogensinde gjorde det.
>> -Hmm.
God pointe.
>> -Ja, vi tildelt markøren y.
Men vi har aldrig indstille den til pege på en pointee.
>> -Hmm.
Meget opmærksomme.
>> -Hey, du ser godt der, Binky.
Kan du ordne det, så y point til samme pointee som x?
>> -Sure.
Jeg vil bruge min tryllestav af pointer opgave.
>> -Er det vil være en problem som før?
>> -Nr.
Dette betyder ikke røre pointees.
Det bare ændrer én pointer til at pege til det samme som en anden.
>> -Åh, jeg ser.
Nu y peger på det samme sted som x.
Så vent.
Nu y er fast.
Det har en pointee.
Så du kan prøve staven af dereferere igen
at sende 13 over.
>> -OK.
Her går.
>> -Hey, se der.
Nu dereferere værker på y.
Og fordi pointers deler at én pointee, de
både se 13..
>> -Ja.
Deling.
Uanset hvad.
Så skal vi skifte steder nu?
>> -Åh, se.
Vi har ikke mere tid.
>> -Men -
>> -Bare husk de tre pointer regler.
Nummer et, den grundlæggende struktur er, at du har en pointer.
Og den peger hen til en pointee.
Men markøren og pointee er adskilt.
Og almindelig fejl er at oprette en pegepind, men
glemmer at givet et pointee.
>> Nummer to, pointer dereference starter ved markøren og følger
pil for at få adgang sin pointee.
Som vi alle ved, virker kun, hvis der er en pointee, der kommer tilbage til
regel nummer et.
>> Nummer tre, pointer opgave tager én pointer og ændrer det til at pege på
samme pointee som en anden pointer.
Så efter opgaven, De to pointere vil
peger på samme pointee.
Nogle gange er hedder deling.
Og det er alt der er til det, virkelig.
Bye bye nu.
>> [END VIDEOAFSPILNING]
>> DAVID MALAN: So mere på pegepinde, mere på Binky næste uge.
Vi vil se dig på mandag.