>> DAVID MALAN: Hei, og velkommen tilbake til CS50.
Så dette er slutten av uke fire.
Bare en kunngjøring først.
Så den såkalte femte mandag er kommer opp førstkommende mandag.
Dette er muligheten til å endre fra SAT / unsat til en bokstavkarakter, eller fra
bokstavkarakter SAT / unsat.
Grammatikken, gjør at prosessen krever en signatur, fordi du må fylle
ut en av de rosa add / dråpe former.
>> Fordi teknisk, SAT / unsat versjonen og bokstavkarakter versjon
har forskjellige katalognummer.
Men ingen big deal.
Bare komme opp til meg eller til Rob eller til Lauren på noe punkt.
Eller send oss ​​hvis du ikke har den type papirarbeid må du i dag, og vi
vil være sikker på å hjelpe deg å ta vare på det før mandag.
>> Greit, så i dag -
faktisk, det er litt av et ekko.
Kan vi tone meg ned litt?
OK.
Så i dag introduserer vi et emne kjent som pekere.
Og jeg skal innrømme at dette er en av de mer komplekse temaer som vi pleier å
dekke i denne klassen, eller egentlig noen introduksjonskurs som bruker C.
>> Men ta mitt ord for det, særlig hvis ditt sinn føles litt mer bøyd
i dag og i ukene som kommer.
Det er ikke representativt for at du får noe verre på dette det betyr bare at
det er en spesielt sofistikert emne som jeg lover, noen uker
dermed vil virke altfor påfallende grei i ettertid.
>> Jeg husker fortsatt den dag i dag.
Jeg ble sittende i Elliott Dining Hall, sitter ved siden av min TF Nishat Mehta,
som var bosatt i Elliott huset.
Og en eller annen grunn, denne Temaet klikker bare.
Som er å si at jeg også slet med det i noen tid, men jeg
vil gjøre mitt beste for å bidra til å unngå slike sliter med et tema som til slutt
er ganske kraftig.
>> Faktisk et av temaene vi skal diskutere i ukene som kommer, er at
av sikkerhet, og hvordan du faktisk kan utnytte maskiner på måter
som ikke var tiltenkt.
Og disse exploitations er typisk et resultat av feil, feil som vi
folk gjør ved å ikke forstå noen på det underliggende gjennomføring
detaljer via hvilke programmer er gjort.
>> Nå for å gjøre dette synes hele mer brukervennlig vennlig, jeg trodde jeg skulle spille en 10
sekunders forhåndsvisning av en liten claymation Figuren heter Binky som ble brakt til
livet av en venn av oss ved Stanford, professor Nick Parlante.
Så la meg gi deg dette teaser av Binky her.
>> [VIDEOAVSPILLING]
>> -Hei, Binky.
Våkn opp.
Det er tid for pekeren moro.
>> -Hva er det?
Lær om pekere?
Oh, goodie.
>> [END VIDEOAVSPILLING]
>> DAVID MALAN: Det er Stanford informatikk.
Så mer på det som kommer.
>> [APPLAUSE]
>> DAVID MALAN: Beklager, Nick.
>> Så husker at forrige gang vi endte på dette virkelig spennende cliffhanger
der denne funksjonen bare fungerte ikke.
Minst intuitivt, det føltes som det skal fungere.
Bare bytte verdiene av to heltall.
Men husker at når vi skrevet ut opprinnelige verdiene i hovedsak ett og
to, var de fremdeles en og to og to, og ikke en.
>> Så la meg faktisk slå over til apparatet.
Og jeg skrev opp litt av skjelett-kode i avansere her, hvor jeg hevder at x
vil være en, vil y være to.
Jeg deretter skrive ut både av deres verdier med print f.
>> Jeg så hevder her nede at vi kommer til å bytte dem.
Jeg forlot en blank flekk her for oss å fylle ut i dag på bare et øyeblikk.
Deretter kommer jeg til å hevde at to variabler er blitt byttet.
Så jeg kommer til å skrive ut dem ut igjen.
Og så forhåpentligvis, skal jeg se 1, 2.
2, 1.
Det er super enkelt Målet akkurat nå.
>> Så hvordan går vi om å bytte to variabler?
Vel, hvis jeg foreslår her er at disse koppene kan representere minne i en datamaskin.
Dette er noen få biter, dette er enda et par biter.
Kunne vi ha en frivillig komme fram og blande oss noen drinker, hvis det kjent ut?
Kom opp.
Hva heter du?
>> JESS: Jess.
>> DAVID MALAN: Jess?
Kom opp, Jess.
Hvis du ikke har noe imot, må vi sette Google Glass på deg så vi kan
forevige dette.
OK, glass.
Spill inn en video.
Og OK, vi er godt å gå med Jess her.
OK.
Hyggelig å treffe deg.
>> Så det jeg ønsker dere gjør her - hvis du kunne, ganske raskt -
bare øser oss et halvt glass appelsin juice og et halvt glass melk,
representerer effektivt tallene 1 i en kopp og 2 i den annen kopp.
>> Dette kommer til å bli bra opptakene.
>> JESS: Beklager.
>> DAVID MALAN: Nei, nei.
Det er OK.
Nice.
Ok, så vi har fire bytes verdt av appelsinjuice.
Vi kalte det verdien 1.
Nå ytterligere fire bytes verdt av melk.
Vil kalle det verdsetter to.
Slik at x og y, henholdsvis.
>> Ok, så nå hvis oppgaven - for deg, Jess, foran alle
av dine klassekamerater -
er å bytte de verdiene av x og y slik at vi vil at appelsinjuice i
andre kopp og melk i denne koppen, hvordan kanskje du - før du faktisk gjør
det - gå om du gjør dette?
>> OK, klok beslutning.
Så du trenger litt mer minne.
Så la oss sette av en midlertidig cup, hvis du vil.
Og nå fortsette å bytte x og y.
>> Utmerket.
Så veldig godt gjort.
Takk så mye, Jess.
Vær så god.
En liten souvenir.
>> OK, så åpenbart, super enkel idé.
Helt intuitivt at vi trenger litt mer lagringsplass - i dette skjemaet,
en cup - hvis vi faktisk ønsker å bytte disse to variablene.
Så la oss gjøre akkurat det.
Her oppe i mellom der jeg hevder jeg er kommer til å gjøre noen bytter, vil jeg
gå foran og erklære temp.
Og jeg skal sette den lik, si, x.
>> Så jeg kommer til å endre verdien av x akkurat som Jess gjorde her med
melk og appelsinjuice å være lik y.
Og jeg kommer til å endre y å være lik å ikke x, fordi nå ville vi være
fast i en sirkel, men heller temp.
Der jeg midlertidig - eller hvor Jess midlertidig sette appelsinjuice
før clobbering at kopp med melken.
>> Så la meg gå videre nå og gjøre dette.
Det kalles noswap.c.
Og nå la meg kjøre uten swap.
Og ja jeg skjønner, hvis jeg utvide vinduet litt, at
x er 1, y er 2.
Og da x er 2, y er 1..
>> Men husker at på mandag gjorde vi ting litt annerledes der jeg
i stedet implementert en hjelper funksjon, om du vil, var at faktisk ugyldig.
Jeg kalte det bytte.
Jeg ga det to parametre, og jeg ringte dem en og jeg ringte dem b.
>> Oppriktig, jeg kunne kalle dem x og y.
Det er ingenting som hindrer meg fra å gjøre det.
Men jeg vil hevde det er så litt tvetydig.
Fordi tilbakekalling for mandag som vi hevdet at disse parametrene var
kopier av verdiene gått i.
Slik at det bare søl med din tankene, tror jeg, hvis du bruker
nøyaktig de samme variablene.
>> Så jeg vil i stedet kaller dem en og b, bare for klarhet.
Men vi kan kalle dem mest noe vi ønsker.
Og jeg kommer til å kopiere og lime effektivt denne koden fra der oppe
ned i her.
Fordi jeg bare så at det fungerer.
Så det er i ganske god form.
Og jeg vil endre min x til a, x min til en, min y til b og min y til b.
>> Så med andre ord, nøyaktig samme logikk.
Akkurat det samme som Jess gjorde.
Og så er det én ting jeg har å gjøre opp her selvsagt er påkalle nå denne
funksjon, eller kalle denne funksjonen.
Så jeg vil kalle denne funksjonen med to innganger, x og y, og trykk Lagre.
>> Greit, så fundamentalt det samme.
Faktisk har jeg trolig gjort programmet unødvendig komplisert ved
skrive en funksjon som bare tar noen seks linjer med kode, mens jeg
tidligere hadde gjennomført dette i bare tre.
>> Så la meg gå videre nå og remake dette, gjør ingen swap.
All right, skrudd jeg opp her.
Dette bør være en feil som du kanskje se stadig mer vanlig som din
programmer blir mer komplekse.
Men det er lett å fikse.
La meg bla tilbake her.
>> Og hva er den første feilen jeg ser?
Implisitt erklæringen.
Hva som vanligvis indikerer?
Oh, jeg glemte prototypen.
Jeg glemte å undervise kompilator som swap kommer til å eksistere selv om han
ikke eksisterer helt i begynnelsen av programmet.
Så jeg skal bare si tomrom, swap, int, en int b, semikolon.
>> Så jeg kommer ikke til å reimplement det.
Men nå det stemmer med det er her nede.
Og legg merke til, fravær av et semikolon her, er der ikke nødvendig når
implementere.
>> Så la meg remake dette, gjør ingen swap.
Mye bedre form.
Kjør ingen swap.
Og faen.
Nå er vi tilbake der vi var på mandag, hvor ting ikke bytte.
>> Og hva er den intuitive forklaring for hvorfor dette er tilfelle?
Yeah?
>> STUDENT: [uhørlig].
>> DAVID MALAN: Nettopp.
Så a og b er kopier av x og y.
Og faktisk, hver gang du har vært kalle en funksjon så langt at
passerer variabler som ints -
akkurat som swap venter her -
dere har vært passerer på kopier.
>> Nå som betyr at det tar litt av tid, en brøkdel av et sekund, for
PC for å kopiere biter fra ett variabel inn i biter av en annen.
Men det er ikke så big deal.
Men de er likevel en kopi.
>> Og så nå, i sammenheng med swap, Jeg er faktisk vellykket
endring a og b.
Faktisk, la oss gjøre en rask tilregnelighet sjekk.
Skriv ut f en er% i, ny linje.
Og la oss koble til en.
Nå la oss gjøre det samme med b.
Og la oss gjøre det samme her.
>> Og nå, la meg kopiere de samme linjene igjen på bunnen av funksjonen
etter tre mine linjer med interessant kunne ha utført, og
skrive ut a og b ennå igjen.
Så nå la oss gjøre dette, gjør ingen swap.
La meg gjøre terminalvinduet en litt høyere, slik at vi kan se
mer av det på en gang.
>> Og kjøre uten swap.
x er 1, y er 2. a er 1, b er 2.
Og så, er en 2, er b en.
Så det virker, akkurat som Jess gjorde her inne i swap.
Men selvfølgelig, det har ingen effekt på variablene i main.
>> Så vi så et triks der vi kunne fikse dette, ikke sant?
Når du står overfor denne scoping problemet, du kan bare punt og gjøre x
og y hvilke variabler i stedet?
>> Du kan gjøre dem globale.
Sett dem på toppen av filen som vi gjorde, selv i spillet 15 år.
Vi bruker en global variabel.
Men i forbindelse med et spill 15, det er fornuftig å ha en global
variabel som representerer styret, fordi helheten av 15.c er alt
om å implementere det spillet.
Det er hva filen finnes å gjøre.
>> Men i dette tilfellet her, er jeg å kalle en funksjon swap.
Jeg ønsker å bytte to variabler.
Og det bør begynne å føle seg like slurvete hvis løsningen til alle vår
problemer når vi kjører inn i omfang problemene er at det globale.
Fordi svært raskt vårt program er kommer til å bli ganske rotete.
Og vi gjorde det svært sparsomt som et resultat i 15.c.
>> Men det viser seg at det er en bedre måte helt.
La meg faktisk gå tilbake og slette skrive ut f-tallet, bare for å forenkle denne koden.
Og la meg foreslå at dette faktisk er dårlig.
Men hvis jeg i stedet legge inn noen stjernene og stjerner, kan jeg i stedet slå denne
Funksjonen til en som er faktisk drift.
>> Så la meg gå tilbake hit og innrømme å si stjernene er alltid vanskelig,
så jeg vil si stjerner.
Jeg vil bare fess opp til den.
OK.
Og nå, hva jeg skal å gjøre i stedet?
>> Så først av alt, jeg kommer til å spesifisere at i stedet for å bestå en int inn
swap-funksjonen, er jeg i stedet av kommer til å si int stjerne.
Nå, hva stjernen indikerer?
Dette er at tanken om en peker som Binky, den claymation karakter, var
henviser til et øyeblikk siden.
>> Så hvis vi sier int stjerne, betydningen av dette nå er at en ikke kommer til å være
vedtatt i av sin verdi.
Det kommer ikke til å bli kopiert i.
Snarere er adressen til en kommer til å bli gått i.
>> Så husker at innsiden av maskinen din er en hel haug med minne, ellers
kjent som RAM.
Og at RAM er bare en hel haug med bytes.
Så hvis din Mac eller PC-en to gigabyte, har du to
milliard byte minne.
>> Nå la oss bare anta at bare for å holde ting rent og ryddig, vi
tildele en adresse -
et tall -
til hver byte RAM i datamaskinen.
Den aller første byte av de to milliarder er av tallet null.
Den neste er byte nummer en, antallet to, hele veien opp, dot dot
dot, om lag 2 milliarder.
>> Slik at du kan antall byte minnet i maskinen din.
Så la oss anta at det er det vi mener med en adresse.
Så når jeg ser int stjerners en, hva som skjer skal sendes inn swap nå er
adressen til en.
Ikke dens verdi, men uansett postvesenet Adressen er, så å si -
sin plassering i RAM.
>> Og tilsvarende for b, jeg skal for å si det samme.
Int, stjerne, b.
Som en side, teknisk stjernen kunne gå andre steder.
Men vi vil standardisere på stjernen blir rett ved siden av datatype.
>> Så bytte signatur betyr nå, gi meg adressen til en int, og samtalen
den adressen en.
Og gi meg en annen adresse for en int og kaller den adressen b.
>> Men nå er min kode her må endres.
Fordi hvis jeg erklærer int temp -
som fremdeles er av typen int -
men jeg lagre i det, hva slags verdi?
For å være klar, jeg setter en en med koden som er skrevet på akkurat nå?
>> Jeg setter plasseringen i en.
Men jeg bryr meg ikke om plassering nå, ikke sant?
Temp finnes bare Jess 'tredje cup eksistert, hva er formålet?
For å lagre en verdi.
Melk eller appelsinjuice.
Ikke å faktisk lagre adressen noen av disse tingene, føles som en
lite nonsens i denne virkelige verdenssammenheng uansett.
>> Så egentlig, hva jeg ønsker å sette i temp er ikke adressen til en, men
innholdet i en.
Så hvis a er et tall som 123, er denne det 123. byte minne at en rettferdig
skjer for å være opptar, at verdien i en skjer for å være opptar.
>> Hvis jeg ønsker å gå til den adressen, Jeg må si stjerners en.
Tilsvarende, hvis jeg skulle endre hva som er på adressen en, endrer jeg
dette for å starte en.
Hvis jeg ønsker å lagre på hva som står på den Beliggenheten en med hva som er på stedet
på b, star b stjerne.
>> Så kort sagt, selv om dette ikke er helt synke inn enda - og jeg ville ikke forvente
at det ville så fort -
innse at alt jeg gjør er prefixing disse stjernene til mine variabler,
ordtaket ikke hente verdiene.
Ikke endre verdiene.
Men heller gå til disse adressene og få verdien.
Gå til denne adressen og endring verdien der.
>> Så nå la meg bla tilbake til toppen, bare å fikse denne linjen her, til
endre prototype å matche.
Men jeg nå trenger å gjøre en annen ting.
Intuitivt, hvis jeg har endret typer argumenter som swap venter,
hva annet trenger jeg å endre i koden min?
>> Når jeg kaller swap.
Fordi akkurat nå, hva er Jeg passerer å bytte likevel?
Verdien x og verdien av y, eller melk og appelsinjuice.
Men jeg ønsker ikke å gjøre det.
Jeg i stedet ønsker å passere på hva?
Plasseringen av x og plasseringen av y.
Hva er deres postadresser, så å si.
>> Så for å gjøre det, det er en ampersand.
Ampersand slags lyder som adresse.
så n, tegnet, adressen av x, og adressen til y.
Så det er bevisst at vi bruker -tegn når man ringer til funksjonen,
og stjerner når erklære og når gjennomføring av funksjonen.
>> Og bare tenk på ampersand som adressen til operatør, og stjerne som
gå dit operatør -
eller, mer riktig, dereference operatør.
Så det er en hel masse ord bare for å si at nå, forhåpentligvis, er swap kommer
å være korrekt.
>> La meg gå videre og gjøre -
la oss faktisk endre navn på filen, lest dette programmet fortsatt bli kalt ingen swap.
Jeg hevder at vi kaller det swap.c nå.
Så gjør, bytte.
Dot, slash, bytte.
>> Og nå faktisk, x er 1, y er 2.
Og deretter, x er 2, y er en.
Vel la oss se om vi ikke kan gjøre dette til en litt annerledes på hva som er
skjer her.
Først, la meg zoome inn på vår tegning skjermen her.
Og la meg foreslå et øyeblikk - og når jeg tegner her vil speilvendes
der oppe nå - la meg foreslå at her er en hel haug med minne, eller
RAM, innsiden av datamaskinen min.
>> Og dette vil være bit nummer, la oss si, en.
Dette vil være byte nummer to.
Og jeg skal gjøre en hel haug mer, og deretter en haug med dot dot prikker
tyder på at det er 2 milliarder av disse tingene.
4, 5 og så videre.
>> Så er det de første fem bytes av datamaskinens minne.
Greit?
Svært få ut av 2 milliarder kroner.
Men nå skal jeg til å foreslå følgende.
Jeg kommer til å foreslå at x kommer til å lagre tallet 1, og Y er tenkt
for å lagre nummeret to.
Og la meg gå videre nå, og representerer disse verdiene som følger.
>> La oss gjøre dette som følger.
Gi meg bare ett sekund.
Ett sekund.
OK.
Jeg ønsker å gjøre dette litt -
la oss gjøre dette igjen.
Ellers skal jeg til og bruker samme tallene, utilsiktet,
flere ganger.
>> Så bare så vi har forskjellig antall å snakke om, la oss kalle dette byte
nummer 123, 124, 125, 126, og dot dot dot.
Og la meg hevder nå at jeg kommer til å sette verdien 1 her, og verdien 2
her, også kjent som x og y.
Så det bare skjer, slik at dette er x, y er dette.
>> Og bare ved noen tilfeldige, den datamaskinen, operativsystemet,
skjedd å sette x på stedet nummer 123.
Og y endte opp på plassering 124 -
faen.
Jeg burde ha fikset dette.
Oh man, jeg virkelig ønsker å gjøre dette?
Ja, jeg ønsker å fikse dette og b skikkelig om dette i dag.
Sorry, ny på dette.
>> 127, 131, og jeg ønsket ikke å være dette kompleks, men hvorfor gjorde jeg endre
tall der?
Fordi jeg vil at ints til faktisk være fire byte.
Så la oss være super anal om dette.
Slik at hvis en tilfeldigvis rettes 123, er to kommer til å være i det adresse
127 fordi det er bare 4 byes unna.
Det er alt.
Og vi vil glemme alle andre adresser i verden.
>> Så x er på stedet 123, y er på stedet 127.
Og nå, hva gjør jeg faktisk ønsker å gjøre?
Når jeg kaller swap nå, hva faktisk skjer?
Vel, når jeg kaller swap, jeg har bestått i adressen til x og adressen til y.
Så for eksempel, hvis disse to stykker av papir nå representerer to
argumenter a og b for å bytte, hva er jeg kommer til å skrive på den første av disse,
som jeg kommer til å kalle refererer til som en?
>> Akkurat, 123.
Så dette jeg hevder er en.
Dette er parameteren en.
Jeg legger inn adressen x der inne.
>> Hva er det?
>> Nei, nei.
Det er OK.
Fortsatt god, fortsatt god.
Dette er altså en.
Og nå på den andre arket, dette kommer til å være b, og hva er jeg
kommer til å skrive på dette stykke papir?
127.
>> Så det eneste som har forandret seg siden vår forrige telling i denne historien er,
heller enn bokstavelig 1 og 2, er jeg kommer til å passere i 123 og 127.
Og jeg nå kommer til å sette disse inne av denne boksen, ok?
Slik at svarte boksen representerer nå swap-funksjon.
>> I mellomtiden, la oss nå ha noen gjennomføre swap-funksjon.
Ville noen opp her liker å jobbe frivillig?
Kom opp.
Hva heter du?
Charlie.
Greit, Charlie.
Kom opp.
>> Så Charlie kommer til å spille rollen som vår black box.
Og Charlie, hva jeg vil at du skal gjøre nå er å gjennomføre swap på en slik måte
at, gitt de to adressene, du var faktisk kommer
å endre verdiene.
Og jeg skal hviske i øret hvordan å kjøre TV her.
>> Så gå videre, og du er den svarte boksen.
Nå i det.
Hvilke verdier ser du for en, og hvilke verdier ser du for b?
>> CHARLIE: en er 123 og b er 127.
>> DAVID MALAN: OK, akkurat.
Nå stopper det for bare et øyeblikk.
Det første du skal gjøre nå, i henhold til koden - hvilken
Jeg skal nå dra opp på skjermen -
kommer til å være å allokere litt litt minne kalt temp.
Så jeg kommer til å gå videre og gi deg som minne.
>> Så dette kommer til å være en tredje variabel at du har tilgang til
du ringte temp.
Og hva har du tenkt å skrive på temp stykke papir?
>> CHARLIE: Pekere, ikke sant?
>> DAVID MALAN: OK, vel ikke nødvendigvis pekere.
Så linjen med kode som jeg har markert på høyre side,
la oss starte der.
Det sier stjerners en.
Så en er i ferd med å lagre nummer 123.
Og akkurat intuitivt, hva gjorde stjerners 123 betyr?
>> Men spesielt, hvis en er 123, betyr stjerne en hva?
Verdien av en.
Eller mer uformelt, gå dit.
Så la meg foreslå at du holder en i hånden din, gå videre og behandle som
som om det er et kart.
Og gå selv over til datamaskinens hukommelse, og finne oss hva som er
på plassering 123.
Nettopp.
>> Så vi ser på plassering 123 er det åpenbart?
OK, så hva verdien nå er du kommer til å sette inn temp?
Nettopp.
Så gå videre og gjøre det.
Og skrive tallet 1 på stykke papir som er i dag med tittelen temp.
>> Og nå det neste trinnet som du kommer til å implementere
kommer til å være det.
Vel, på høyre side av neste linje av koden er stjerne b. b, av
Selvfølgelig lagrer en adresse.
Som tar 127.
Stjerners b betyr hva, casually snakker?
>> Gå til denne plasseringen.
Så gå videre og finne oss hva som er på plassering 127.
OK.
Naturligvis, ved plassering 127, er fortsatt verdien 2.
Så hva skal du nå butikken på det som er det stedet i en?
Så stjerne en del gå til plasseringen en.
Hva er plasseringen en?
>> Nettopp.
Så nå, hvis du vil endre hva som står på det stedet -
Jeg skal gå videre og kjøre viskelæret er her.
Og nå sette den tilbake på børsten.
Hvilket nummer skal du skrive i den tomme boksen nå?
>> Nettopp.
Så denne linjen med kode, for å være klar - la meg pause hva Charlies gjør og
påpeke her, hva han nettopp har gjort er skrive inn den boksen på stedet 123
verdien som tidligere var på b.
Og så har vi nå implementert faktisk denne andre linje med kode.
>> Nå dessverre, det er fortsatt en linje som gjenstår.
Nå hva er i temp, bokstavelig talt?
Det er åpenbart nummer én.
Det er ikke en adresse.
Det er bare et tall, liksom en variabel fra uke én.
>> Og nå når du sier stjerners b, som betyr gå til adressen B, er av hvilken
kurs her.
Så når du kommer dit -
Jeg skal gå foran og slette det som faktisk der - og hva er du
kommer til å skrive nå på plassering 127?
>> CHARLIE: Temp, som er en.
>> DAVID MALAN: Temp, som er en.
Og hva skjer med temp til slutt?
Vel, vi egentlig ikke vet.
Vi vet egentlig ikke bryr seg.
Hver gang vi har implementert en funksjon så langt, alle lokale variabler du har
er faktisk lokale.
Og de bare forsvinner.
De er gjenerobret av drift systemet etter hvert.
>> Så det faktum at temp fremdeles har de Verdien 1 er liksom fundamentalt
uinteressant for oss.
Ok, så en runde med applaus hvis vi kunne for Charlie.
Veldig godt gjort.
>> Greit, så hva mer tid dette mener vi kan gjøre?
Så det viser seg at vi har vært fortelle noen hvite løgner
for en stund.
Faktisk viser det seg at en streng, hele denne tiden, er egentlig ikke en
tegnsekvens per se.
Den slags er det intuitivt.
>> Men teknisk sett er streng en datatype som vi erklært innsiden av
den CS50 biblioteket for å forenkle verden for de første ukene av klassen.
Hva en streng egentlig er er adressen av en karakter eller annet sted i RAM.
En streng er egentlig et tall, som 123 eller 127, som skjer for å avgrense
hvor en streng begynner i datamaskinens minne.
>> Men det ikke representerer den streng, per se,. selv
Og vi kan se dette som følger.
La meg gå videre og åpne opp noen kode som er blant
dagens kildekode eksempler.
Og jeg kommer til å gå foran og åpne opp, la oss si, sammenligne-0.c.
Dette er en buggy program som kommer skal gjennomføres på følgende måte.
>> Først.
Jeg kommer til å si noe.
Så jeg kommer til å gå videre og få en streng fra brukeren
i det neste linje.
Så jeg kommer til å si det igjen.
Så jeg kommer til å få en annen strengen fra brukeren.
>> Og legg merke til, viser jeg en av de strenger i en variabel kalt s, og
en annen av disse strengene i en variabel kalt t.
Og nå skal jeg til å kreve, veldig rimelighet, at hvis s er lik lik t,
strengene er de samme.
Du skriver det samme.
Else, strengene er ikke det samme.
>> Tross alt, hvis vi innspill to ints, to tegn, to flyter, to dobbeltrom, noen av
datatypene vi har snakket om så langt å sammenligne dem -
husker vi gjort veldig klart for en stund siden at du ikke gjør dette, fordi en
enkelt likhetstegn er selvfølgelig tilordningsoperatoren.
Så det ville være en feil.
>> Vi bruker lik likhetstegnet, som sammenligner faktisk
ting for ekte likestilling.
Men jeg hevder dette er buggy.
Hvis jeg går videre og gjøre sammenligne null, og deretter sammenligne dot slash gjør null.
Og jeg skriver i, la oss si, hallo.
Og så la oss si hei igjen.
Bokstavelig talt det samme, datamaskinen hevder jeg skrev forskjellige ting.
>> Nå kanskje jeg bare skrevet feil noe.
Jeg skal skrive navnet mitt denne gangen.
Jeg mener, hallo.
Hei.
Det er forskjellig hver eneste gang.
>> Vel, hvorfor er det?
Hva som egentlig skjer under panseret?
Vel, hva er det egentlig som skjer under panseret er strengen da
Jeg skrev i det første gang for eksempel er ordet hallo, selvfølgelig.
Men hvis vi representerer dette under panseret, husker at en
strengen er i en matrise.
Og vi har sagt så mye i det siste.
>> Så hvis jeg trekke denne matrisen som dette, er jeg kommer til å representere noe helt
ligner på det vi gjorde for et øyeblikk siden.
Og det er faktisk noe spesielt her, også.
Hva gjorde vi fastslå ble på På slutten av hver streng?
Ja, dette skråstrek null, som er bare måte å representere,
bokstavelig talt, 00000000.
Åtte 0 bits i rekke.
>> Jeg vet ikke, ærlig, hva er etter dette.
Det er bare en haug mer RAM innsiden av datamaskinen min.
Men dette er en matrise.
Vi snakket om arrays før.
Og vi vanligvis snakker om arrays som plassering null,
så en, så to.
Men det er bare for bekvemmelighet.
Og det er helt slektning.
>> Når du faktisk får minne fra datamaskinen, er det selvfølgelig noen
2 milliarder noen merkelige bytes, potensielt.
Så egentlig under panseret, hele denne tiden, ja.
Dette kan meget vel være brakett null.
Men hvis du graver enda dypere under panseret, det er virkelig
adressere nummer 123.
Dette er adressen 124.
Dette er adressen 125.
>> Og jeg har ikke skru opp denne gangen.
Dette er nå en byte hverandre for hvilken grunn?
Hvor stor er en røye?
En røye er bare én byte.
En int er vanligvis fire byte.
Så det er derfor jeg gjorde det 123, 127, 131 og så videre.
Nå kan jeg holde regnestykket enklere og bare gjøre pluss en.
Og dette er nå hva som virkelig foregår på under panseret.
>> Så når du erklærer noe sånt som dette, string s, dette er faktisk -
det viser seg -
røye stjerne.
Star, selvfølgelig, betyr adresse, aka pekeren.
Så det er adressen til noe.
Hva er det adressen?
>> Vel -
Jeg er den eneste som kan se veldig viktig poeng jeg gjør, eller tror
Jeg gjør.
Så string -
den triste ting er at jeg har en skjerm akkurat der hvor jeg
kunne ha sett det.
>> Greit, så streng s er hva Jeg erklærte tidligere.
Men det viser seg, takket være en liten magi i CS50 bibliotek, alt dette
tid strengen har bokstavelig talt vært røye stjerne.
Stjernen betyr igjen pekeren eller adresse.
Det faktum at det er flankerer Ordet røye betyr at det er den
adressen til en karakter.
>> Så hvis få strengen kalles, og jeg skriver i H-E-L-L-O, foreslår nå hva som har få
string bokstavelig talt vært tilbake alle denne gangen, selv om vi har heller
unyansert verden?
Hva får streng faktisk returnere som sin returverdi?
>> 123 i dette tilfellet, for eksempel.
Vi har tidligere sagt at få strengen bare returnerer en streng, en sekvens av
tegn.
Men det er litt av en hvit løgn.
Underveis får streng virkelig fungerer under panseret er det blir en
strengen fra brukeren.
Det plops tegnene som han eller hun typer i minnet.
Det setter en skråstrek null ved utgangen av de som sekvens av tegn.
>> Men hva får streng bokstavelig talt tilbake?
Den returnerer bokstavelig adressen til aller første byte i RAM som
det brukt for denne styrken.
Og det viser seg at bare ved å returnere en enkelt adresse
første tegnet i strengen, er at tilstrekkelig for å finne helheten av
strengen.
>> Med andre ord får strengen ikke har å returnere 123 og 124 og 125..
Det trenger ikke å gi meg en lang liste over alle byte som
min string bruker.
Fordi en, er de alle tilbake til.
Og to, basert på den første adresse, jeg kan finne ut hvor strengen slutter.
Hvordan?
>> Den spesielle null karakter, Backslash null ved utgangen.
Så med andre ord, hvis du passerer rundt -
innsiden av variabler -
adressen til en røye, og du påtar at ved slutten av enhver streng, noe
sekvens av tegn som vi mennesker tenke på strenger, hvis du antar at
på slutten av en slik streng det er en skråstrek null, du er gull.
Fordi du kan alltid finne i enden av en streng.
>> Nå hva er egentlig så kommer på i dette programmet?
Hvorfor er dette programmet, sammenligne-0.c, buggy?
Hva som faktisk blir sammenlignet?
Yeah?
>> STUDENT: [uhørlig].
>> DAVID MALAN: Nettopp.
Det er å sammenligne steder av strengene.
Så hvis brukeren har skrevet inn hallo en gang, som jeg gjorde, kan minne ende opp
ser ut som dette.
Hvis brukeren deretter typer i Hello again, men ved å ringe får strengen igjen, er c
ikke spesielt flink med mindre du lære det å være smart ved å skrive kode.
>> C -
og datamaskiner mer generelt -
Hvis du skriver inn ordet hei igjen, du vet hva du kommer til å få.
Du er bare nødt til å få en ny matrise minne at, ja, det skjer være
lagring av H-E-L-L-O og så videre.
>> Det kommer til å se det samme til oss mennesker, men denne adressen
kanskje ikke 123.
Det kan bare skje slik at operativsystem har noen tilgjengelig
plass for eksempel ved plassering -
la oss si noe vilkårlig, som dette er stedet 200.
Og dette er stedet 201.
Og dette er stedet 202.
Vi har ingen anelse om hvor det er kommer til å være i minnet.
>> Men hva dette betyr, er at det som er skal lagres til slutt i s?
Tallet 123.
Hva kommer til å bli lagret i t, i dette vilkårlig eksempel?
Tallet 200.
Og alt som betyr da er åpenbart, 123 er ikke lik 200.
Og så dette hvis tilstanden aldri evalueres til sant.
Fordi get streng bruker forskjellig biter av minnet hver gang.
>> Nå kan vi se dette igjen I et annet eksempel.
La meg gå videre og åpne opp kopi-0.c.
Jeg hevder at dette eksemplet skal prøve - men mislykkes - til å kopiere to strenger
som følger.
>> Jeg kommer til å si noe til brukeren.
Jeg deretter kommer til å få en string og kaller det s.
Og nå, jeg gjør denne sjekken her.
Vi nevnte dette for en stund tilbake.
Men da kan få streng retur null, en annen spesiell karakter, eller spesielle
symbol la oss si.
Hvis det er for lite minne.
>> For eksempel, dersom brukeren er virkelig være vanskelig og typer en fryktelig
antall tegn på tastatur og treff Enter.
Hvis det antall tegn kan bare ikke plass i RAM uansett gal
Derfor godt få streng kan godt returnere null.
>> Eller hvis programmet selv gjør mye av andre ting, og det er bare
ikke nok minne for get string å lykkes, kan det ende
opp med å returnere null.
Men la oss være mer presis om hva dette er.
Hva er s datatype egentlig?
Char stjerne.
>> Så det viser seg nå vi kan skrelle rygge lag av null.
Slår ut, er null - Ja, selvsagt et spesielt symbol.
Men hva er det egentlig?
Virkelig, er null bare et symbol på at vi mennesker bruk til å representere null i tillegg.
>> Så forfatterne av C og datamaskiner mer generelt, bestemte år siden
det, vet du hva.
Hvorfor kan ikke vi sikre at ingen brukere data er aldri, aldri, noensinne
oppbevares ved bye null?
Faktisk, selv i min vilkårlig eksemplet før, jeg visste ikke starte nummereringen på
bytes på null.
Jeg begynte på en.
Fordi jeg visste at folk i verden har besluttet å reservere null
byte i noens RAM som noe spesielt.
>> Årsaken er, når du vil signalisere at noe har gått galt
med hensyn til adresser, returnerte deg null - også kjent som null -
og fordi du vet at det er ingen legit data på adressen null, tydelig
det betyr en feil.
Og det er derfor vi, etter konvensjonen, sjekk for null og retur noe
som en i disse tilfellene.
>> Så hvis vi bla nedover nå, dette er bare deretter noen feil merke, bare i tilfelle
noe gikk galt med [? kausjon?]
helt og avslutte programmet ved å returnere tidlig.
Denne linjen nå kunne bli omskrevet som dette, noe som betyr at det?
På venstre side, gi meg en annen pekeren til et tegn, og kaller det t.
Hva skal jeg lagre innsiden av t, basert på dette en linje med kode?
>> Jeg lagrer et sted.
Nærmere bestemt plasseringen som var i s.
Så hvis brukeren har skrevet inn hei, og det første som skjer hei til ende opp
her og deretter nummeret 123 er kommer til å komme tilbake fra å få
streng og lagres -
som vi sa tidligere -
i s.
>> Når jeg nå erklærer en annen pekeren til en røye og kaller det t, hvilket nummer er
bokstavelig talt kommer til å ende opp i t henhold til historien?
Så 123.
>> Så teknisk nå både s og t peker til den eksakte
samme biter av minnet.
Så merke til hva jeg skal gjøre nå for å bevise at dette programmet er buggy.
>> Først skal jeg påstå, med en print f, utnytte
kopien av strengen.
Så jeg kommer til å gjøre litt feilsjekking.
Jeg kommer til å være sikker.
La oss sørge for at strengen t er på minste er større enn null i lengde,
så det er noen tegn der å faktisk utnytte.
>> Og så kan du huske dette fra tidligere eksempler.
2 øvre - som er i den ctype.h filen.
T brakett null gir meg null tegnet i strengen t.
Og to øverste av samme verdi, for Selvfølgelig konverterer den til store bokstaver.
>> Så intuitivt, dette markerte linjen av koden er å utnytte den første
brev it.
Men det er ikke utnytte, intuitivt, den første bokstaven i s.
Men hvis du tenker fremover, hva er jeg i ferd med å se når jeg kjører dette programmet
og skrive ut både den opprinnelige, s, og den såkalte kopi, t?
>> De er faktisk kommer til å være den samme.
Og hvorfor de kommer til å være den samme?
De er begge peker til akkurat det samme.
Så la oss gjøre dette.
>> Lage kopi null.
Det kompilerer OK.
La meg kjøre kopi null.
La meg skrive noe sånt hei på små bokstaver trykk Enter.
Og det hevder at både den opprinnelige s og kopien er faktisk identisk.
>> Så hva skjedde egentlig her?
La meg tegne dette bildet bare å fortelle historien på en
litt annen måte.
Hva som egentlig skjer under hette når jeg erklærer noe sånt
røye start s, eller streng s, Jeg får en peker -
som skjer for å være fire byte i CS50 apparatet
og i en rekke datamaskiner.
Og jeg kommer til å kalle dette s.
Og dette har i dag noen ukjent verdi.
>> Når du deklarerer en variabel, med mindre du selv sette en verdi der, som
vet hva som er der.
Det kan være noen tilfeldig sekvens av biter fra forrige utførelsen.
Så når jeg, i min linje av koden får strengen, og deretter lagre retur
verdi i s får streng eller annen måte -
og vi vil til slutt skallet tilbake hvordan får string fungerer, tildeler en eller annen måte en
array som sannsynligvis ser litt som dette.
H-E-L-L-O, null skråstrek.
>> La oss anta at dette er adressen 123 bare første konsistens.
Så får streng avkastning, i markerte linjen der, returnerer den
nummer vi sa, 123.
Så hva går egentlig innsiden av s her?
>> Vel, hva går egentlig innsiden av s er 123.
Men ærlig talt, jeg får litt forvirret av alle disse adressene,
alle disse vilkårlige tall.
123, 124, 127..
Så la oss faktisk forenkle verden litt.
>> Når vi snakker om pekere, ærlig, til oss mennesker, hvem pokker bryr seg hvor
ting er i minnet?
Det er helt vilkårlig.
Det kommer til å avhenge av hvordan mye RAM brukeren har.
Det kommer til å avhenge av når på dagen du kjører programmet, kanskje, og
hva innspill brukeren gir deg.
Vi er dvele ved uviktige detaljer.
>> Så la oss abstrakt bort og si at, når du kjører en linje med kode som dette,
røye stjerners s blir avkastningen Verdien av get streng.
Hvorfor kan ikke vi i stedet bare tegne hva vi holde ringer en peker som om det er
peker på noe?
Så jeg hevder nå at s opp det er en peker -
under panseret er det en adresse.
Men det er bare å peke på første byte i
strengen som er blitt returnert.
>> Hvis jeg nå tilbake til koden her, hva som skjer på denne linjen?
Vel, i dette markerte linjen nå, Jeg erklære tydeligvis en annen
variabel kalt t.
Men det er også en peker, så jeg kommer å trekke det som, i teorien, er den nøyaktige
samme størrelse boks.
Og jeg kommer til å kalle det t.
>> Og nå går vi tilbake til koden på nytt, når jeg lagrer s innsiden av t,
hva er jeg teknisk sette innsiden av t?
Vel teknisk sett, dette var antallet 123..
Så egentlig jeg burde skrive nummer 123 der.
Men la oss ta det høyere nivå.
t, om det er bare en peker, intuitivt, er nettopp det.
Det er alt det er å være lagret der.
>> Så nå i de siste interessante linjer av koden, når jeg faktisk gå om
utnytte null karakter i t, hva skjer?
Vel, t brakett null nå peker i hvilken karakter, formodentlig?
>> Den peker til h.
Fordi t brakett null -
husker, er dette gamle syntaks. t brakett null betyr bare hvis t er en streng, t
brakett null betyr å få null karakter i denne styrken.
Så hva som virkelig betyr er å gå til denne array -
og ja, dette kan være 123, dette kan være 124.
Men det er alle forhold, huske.
Når du snakker om en matrise, har vi fordelen av å snakke om
relative indekser.
>> Og så nå kan vi bare anta at t brakett null er h.
Så hvis jeg kaller to øverste på det, hva som er egentlig gjør er å utnytte
små bokstaver h til store bokstaver H. Men selvfølgelig, det er s?
Den peker til den samme darn streng.
>> Så dette er alt som har skjedd i denne koden så langt.
Så hva er da konsekvensen?
Hvordan løser vi disse to problemene?
Hvordan sammenligner vi til faktiske strenger?
>> Vel intuitivt, hvordan ville du går om å sammenligne to
strenger for ekte likestilling?
>> Hva betyr det hvis to strenger er like?
Åpenbart ikke at deres adresser er lik i minnet, fordi det er en lav
nivå implementering detaljer.
Alle karakterene er de samme.
Så la meg foreslå, og la meg introdusere i en versjon av compare.c
her, så sammenligne-1.c.
>> La meg foreslå at vi fortsatt får en pekeren kalt s, og butikk i det
returnere verdien av get streng.
La oss gjøre det samme med t.
Så ingen av koden er forskjellig.
Jeg kommer til å legge litt mer feilsjekking nå.
Så nå som vi er liksom peeling tilbake dette lag i CS50 av hva en streng
faktisk er, må vi være mer anal om å gjøre at vi ikke misbruker
ugyldige verdier som null.
>> Så jeg skal bare sjekke.
Hvis s er ikke lik null og t ikke lik null, betyr at vi er OK.
Får streng ikke skru opp med å få noen av disse strenger.
Og du kan kanskje gjette nå, hva ikke STR CMP antagelig gjøre?
String sammenligne.
>> Så hvis du har program i java før, dette er som tilsvarer metoden i
string klassen.
Men for de av dere som ikke har programmert før,
dette er bare en c-funksjon.
Det skjer for å komme i en fil som heter string.h.
Det er der den er deklarert.
>> Og streng sammenligne -
Jeg glemmer faktisk at bruken, men aldri tankene som.
Husker at vi kan gjøre mann, rør sammenligne.
Og dette kommer til å få opp Linux programmerere manuell.
Og det er, ærlig, litt kryptisk.
Men jeg ser her at, ja.
Jeg må inkludere string.h.
>> Og det står her i henhold til beskrivelse, "the string Sammenligningsfunksjon sammenligner
de to strengene S1 og S2. "Og S1 og S2 er tilsynelatende de to
argumenter gått i.
Jeg vet egentlig ikke huske hva konst er, men nå merker -
og du har kanskje sett dette allerede når du har bruker man-sidene hvis du
få alt -
at røye stjernen er bare synonymt med hyssing.
>> Så det sammenligner de to strenger, S1 og S2, og den returnerer et heltall mindre
enn eller lik eller større enn null hvis S1 blir funnet, henholdsvis, for å være
mindre enn, eller like, eller være større enn S2.
Det er bare en veldig kompleks måte å si strengen sammenligne avkastning
null hvis to strenger er intuitivt identiske, tegnet for
tegn for tegn.
>> Den returnerer et negativt tall hvis s, alfabetisk, er ment
å komme før t.
Eller returnerer et positivt tall hvis s er ment å komme etter t
alfabetisk.
Så med denne enkle funksjonen, kan du for eksempel sortere en
hel haug med ord?
>> Så i denne nye versjonen, kommer jeg til å gå videre og gjøre compare1.
Dot slash sammenligne en.
Jeg skal skrive hei på alle små bokstaver.
Jeg kommer til å skrive hei i små bokstaver igjen.
Og heldigvis nå det innser Jeg skrev det samme.
>> I mellomtiden, hvis jeg skriver i Hallo i nedre saken og HELLO stor bokstav og
sammenligne dem, skrev jeg forskjellige ting.
Fordi ikke bare er adressene forskjellige, men vi sammenligner
forskjellige tegn igjen og igjen.
>> Vel la oss gå og fikse en andre problemet nå.
La meg åpne opp en versjon av kopi, som nå adresserer
dette problemet følger.
Og dette kommer til å se litt mer komplisert.
Men hvis du tenker på hva problemet vi trenger for å løse, forhåpentligvis vil dette være
klart i løpet av et øyeblikk nå.
>> Så denne første linjen, røye start t, i lekmann vilkår kan noen foreslå
hva denne linjen her betyr?
Char stjerners t, hva er det du gjør?
>> Bra.
Lage en peker til noen plass i minnet.
Og la meg avgrense det litt.
Deklarere en variabel som vil lagre Adressen noen char i minnet, men bare
å være litt mer riktig.
>> OK, så nå på høyre side, har jeg aldri sett én av disse funksjonene
før, malloc.
Men hva kan det bety?
Tildeling av minne.
Minnetildelingen.
>> Så det viser seg, frem til nå, vi har egentlig ikke hatt en effektiv måte
spør operativsystemet, gi meg noe minne.
Snarere har vi nå en funksjon som heter malloc som gjør akkurat det.
Selv om dette er litt av en distraksjon akkurat nå, merker at i
mellom de to parenteser bare kommer til å være ett nummer.
Der jeg har skrevet i spørsmålet merker kan være et tall.
>> Og at antallet betyr, gi meg 10 bytes.
Gi meg 20 bytes.
Gi meg 100 bytes.
Og malloc vil gjøre sitt beste for å spør operativsystemet -
Linux, i dette tilfellet -
hei, er deres 100 bytes RAM tilgjengelig?
I så fall returnere disse byte til meg av returnere adressen til hvilken av
disse bytes, kanskje?
Den aller første.
>> Så her også - og dette er dominerende i C, helst du er
arbeider med adresser?
Du er nesten alltid arbeider med først slik adresse, uansett hvor stor
en del av minnet du blir leveres tilbake, så å si.
>> Så la oss dykke inn her.
Jeg prøver å fordele hvordan mange bytes, egentlig?
Vel.
String lengden på s - la oss gjøre et konkret eksempel.
Hvis s er hallo, H-E-L-L-O, hva er hyssinglengde på s, selvsagt?
Så det er fem.
Men jeg gjør et pluss en på det, hvorfor?
Hvorfor ønsker jeg seks bytes i stedet for fem?
Den null tegn.
>> Jeg ønsker ikke å forlate av dette spesiell null tegn.
Fordi hvis jeg lager en kopi av Hei og bare gjøre H-E-L-L-O, men jeg legger ikke
den spesielle karakter, datamaskinen kanskje ikke har, ved en tilfeldighet, en skråstrek
null der for meg.
Og så hvis jeg prøver å finne ut av lengden på kopien, kan jeg tenke at
det er 20 tegn, eller en million tegn hvis jeg bare aldri skje
å treffe en omvendt skråstrek null.
>> Så vi trenger seks bytes til å lagre H-E-L-L-O, null skråstrek.
Og så dette er bare å være super anal.
Anta at jeg glemmer hva på størrelse med en røye er.
Vi holder å si det én byte.
Og det er vanligvis.
I teorien kan det være noe forskjellige, på en annen Mac eller en
annen PC.
>> Så det viser seg at det er denne operatøren kalt sizeof at hvis du passerer den
navnet på en datatype - som røye, eller int eller float -
den vil fortelle deg, dynamisk, hvor mange byte en røye tar opp dette
bestemt datamaskin.
>> Så dette er effektivt bare som å si ganger en eller
ganger ingenting i det hele tatt.
Men jeg gjør det bare for å være super anal, at bare i tilfelle en røye skiller seg
på datamaskinen versus mine, på denne måten regnestykket er alltid kommer til å sjekke ut.
>> Til slutt, her nede jeg sjekke for null, som alltid er god praksis - igjen,
helst vi har med pekere.
Hvis malloc var ikke i stand til å gi me seks byes - som er
usannsynlig, men bare i tilfelle -
tilbake en gang.
Og nå, gå videre og kopiere strengen som følger.
Og dette er kjent syntaks, om enn i en annen rolle.
>> Jeg kommer til å gå videre og få strengen lengden på s og lagre den i n.
Jeg deretter skal iterere fra i lik null opp til og med n,
større enn eller lik.
Slik at på hver iterasjon, satte jeg ed karakter av s i den i-te
karakter av t.
>> Så hva som egentlig skjer under panseret her?
Vel hvis dette for eksempel er s -
og jeg har skrevet i ordet H-E-L-L-O og det er en omvendt skråstrek null.
Og igjen, dette er s peker her.
Og her er nå t.
>> Og dette peker nå til en kopi av minne, ikke sant?
Malloc har gitt meg en hel del av minnet.
Jeg vet ikke i utgangspunktet hva som er i noen av disse stedene.
Så jeg kommer til å tenke på disse som en hel haug med spørsmålstegn.
>> Men så snart jeg starter looping fra null på opp gjennom lengden av S, T
brakett null og t trinn 1 -
og jeg skal sette dette nå på overhead -
t brakett null og s brakett null betyr at jeg kommer til å bli kopiert
iterativt t på her, E-L-L-O. Plus, fordi jeg gjorde pluss
1, null backslash.
>> Så nå når det gjelder sammenligne-1.c, til slutt, hvis jeg skrive ut
kapitalisering av t, bør vi se at s er uendret.
La meg gå videre nå og gjøre dette.
Så gjør Kopi1.
Dot slash Kopi1.
Jeg kommer til å skrive hallo, Enter.
Og nå legger merke til, bare kopien er balanseført.
Fordi jeg virkelig har to biter av minnet.
>> Dessverre kan du gjøre noen ganske dårlige og ganske farlig ting her.
La meg trekke opp et eksempel her nå, som gir oss et eksempel på et par
forskjellige linjer.
Så bare intuitivt her, den første linjen av koden, er int stjerne x, erklærte
en variabel kalt x.
Og hva er datatype av denne variabelen?
Hva er data type som variabel?
Det var ikke cliffhanger.
>> Datatypen er int stjerne.
Så hva betyr det? x vil lagre adressen til en int.
Enkelt som det.
Y kommer til å lagre adressen til en int.
Hva er den tredje linjen av koden gjør det?
Det er tildeling av hvor mange bytes, mest sannsynlig?
Fire.
På grunn av størrelsen på en int er vanligvis fire, gir malloc av fire
meg tilbake adressen til en del av hukommelse, er den første av hvis byte
lagres nå i x.
>> Nå beveger vi oss litt raskt.
Stjerners x betyr hva?
Det betyr gå til den adressen og sette hvilket nummer det?
Sett nummer 42 der.
Stjerners y betyr gå til hva som står på y og sette nummer 13 der.
>> Men vent litt.
Hva er i y for øyeblikket?
Hvilken adresse er y lagring?
Vi vet ikke, ikke sant?
Vi har aldri en gang bruke oppdraget operatør involverer y.
Så y som erklærte på den andre linjen på Koden er bare noen søppel verdi, en stor
spørsmålstegn så å si.
Det kan peke tilfeldig til noe i minne, som
er generelt dårlig.
>> Så så snart vi treffer den linjen der, stjerners y er lik 13, noe dårlig,
noe veldig dårlig er i ferd å skje med Binky.
Så la oss se hva som kommer til å ende opp skjer med Binky her i dette øyeblikk
eller så ser.
>> [VIDEOAVSPILLING]
>> -Hei, Binky.
Våkn opp.
Det er tid for pekeren moro.
>> -Hva er det?
Lær om pekere?
Oh, goodie.
>> -Vel, for å komme i gang, tror jeg vi er kommer til å trenge et par pekere.
>> -OK.
Denne koden tildeler to pekere som kan vise til heltall.
>> -OK, vel, jeg ser de to pekere.
Men de synes ikke å være peke på noe.
>> -Det er riktig.
I utgangspunktet pekere ikke peke på noe.
De tingene de peker til er kalt pointees, og sette dem opp er en
separat trinn.
>> -Oh, høyre, høyre.
Jeg visste det.
De pointees er atskilt.
Så hvordan du øremerke en pointee?
>> -OK.
Vel, tildeler denne koden ny heltall pointee, og denne delen setter x
å peke på det.
>> -Hei, ser at bedre.
Så gjør det ikke noe.
>> -OK.
Jeg skal dereference pekeren x for å lagre nummer 42 i pointee sin.
For dette trikset, jeg trenger min magi tryllestav av dereferencing.
>> -Din tryllestav av dereferencing?
Uh, det er flott.
>> -Dette er hva koden ser ut.
Jeg skal bare sette opp nummeret, og -
>> -Hei, se.
Det det går.
Så gjør en dereference på x følger pilen for å få tilgang til pointee.
I dette tilfellet, for å lagre 42 i der.
Hei, prøv å bruke den til å lagre nummeret 13 gjennom den andre pekeren, y.
>> -OK.
Jeg skal bare gå over her til y og får nummer 13 satt opp.
Og deretter ta staven av dereferencing og bare -
Jøss!
>> -Oh, hey.
Som ikke fungerte.
Si, Binky, jeg tror ikke det dereferencing y er en god idé,
fordi sette opp pointee er et separat trinn.
Og jeg tror ikke vi noen gang gjorde det.
>> -Hmm.
Godt poeng.
>> -Ja, bevilget vi pekeren y.
Men vi har aldri sett den til peke på en pointee.
>> -Hmm.
Veldig observant.
>> -Hei, du ser bra der, Binky.
Kan du fikse det slik at y poeng til den samme pointee som X?
>> -Jada.
Jeg skal bruke min tryllestav av pekeren oppdrag.
>> -Er det kommer til å bli en problem som før?
>> -Nei.
Dette berører ikke de pointees.
Det endrer bare én pekeren å peke til det samme som et annet.
>> -Oh, ser jeg.
Nå y peker til samme sted som x.
Så vent.
Nå y er fast.
Den har en pointee.
Så du kan prøve tryllestaven av dereferencing igjen
å sende den 13 over.
>> -OK.
Her går.
>> -Hei, se på det.
Nå dereferencing fungerer på y.
Og fordi pekere deler at en pointee, de
både se 13.
>> -Ja.
Deling.
Uansett.
Så skal vi bytter plass nå?
>> -Å, se.
Vi har ikke mer tid.
>> -Men -
>> -Bare husk de tre pekeren regler.
Nummer en, den grunnleggende struktur er at du har en peker.
Og den peker over til en pointee.
Men pekeren og pointee er separate.
Og den vanligste feilen er å sette opp en peker, men til
glem å gitt en pointee.
>> Nummer to, begynner pekeren dereferencing på pekeren og følger sin
pilen over for å få tilgang til pointee.
Som vi alle vet, dette fungerer bare hvis det er en pointee, som kommer tilbake til
regel nummer én.
>> Nummer tre, tar pekeren oppdrag én pekeren og endringer det å peke på
samme pointee som en annen pekeren.
Så etter oppdraget, de to pekere vil
peke på den samme pointee.
Noen ganger som heter deling.
Og det er alt som skal til, egentlig.
Bye bye nå.
>> [END VIDEOAVSPILLING]
>> DAVID MALAN: Så mer på pekere, mer på Binky neste uke.
Vi ser deg på mandag.