>> [Musik spiller]
David J. MALAN: Okay.
Dette er CS50, og dette er i slutningen af ​​uge fire.
Og et af de emner i dag er, at digitale retsvidenskab,
kunsten at inddrive oplysninger.
Og ja, selv om du er midt
lige nu Freds på Three og Breakout, i næste uge,
vil fokus være på netop dette domæne.
>> Så en af ​​de fedeste job, jeg nogensinde havde var tilbage i graduate skole,
da jeg arbejdede for den lokale Middlesex County District Attorney
kontor, laver retsvidenskab virker.
Så det væsentlige, Massachusetts Statspolitiet lejlighedsvis
ved arbejde på sager ville bringe i ting som harddiske
og disketter og hukommelseskort og lignende.
Og de ville udlevere dem til mig og min mentor,
og vores mål var at finde beviser, hvis der var nogen, om disse medier.
Nu har du måske set glimt af denne verden af ​​retsvidenskab
i medierne, tv og film.
Men jobbet havde jeg, og daresay denne verden,
er ikke helt som du ville se det.
Lad os tage et kig på, hvad Du har sikkert set.
[VIDEOAFSPILNING]
-OK.
Lad os nu få et godt kig på dig.
>> [Musik spiller]
>> -Hold Det.
Kør den tilbage.
>> -Vent Et minut.
Gå til højre.
-Der.
Frys det.
-Fuld Skærmen.
>> -OK.
Frys det.
Stramme op op på dette, vil du?
>> -Vector Ind på at fyr ved baghjulet.
>> -Zoom I lige her på dette sted.
>> -Med Det rigtige udstyr, den Billedet kan forstørres og slibes.
>> Hvad er det?
>> -Det er en forbedring program.
>> Kan du klare det op nogen?
>> Jeg ved det ikke.
Lad os forbedre det.
>> -Enhance Afsnit A6.
Jeg forbedrede detaljer, og--
Jeg tror, ​​der er nok til at forbedre.
Slip det til min skærm.
>> Jeg forbedret refleksion i hendes øjne.
Lad os køre dette gennem video ekstraudstyr.
>> -Edgar, Kan du forbedre dette?
>> -Hang På.
>> -Jeg Har arbejdet på denne refleksion.
>> -Der Er nogens refleksion.
>> -Reflection.
-Der Er en afspejling af mandens ansigt.
>> -Den Refleksion!
-Der Er en refleksion.
-Zoom Ind på spejlet.
Du kan se en refleksion.
>> Kan du forbedre billedet fra her?
Kan du forbedre det?
Kan vi forbedre dette?
Kan du forbedre det?
Vent lige et sekund.
Jeg vil forbedre.
-Zoom I på døren.
-Times 10.
-Zoom.
-Flyt I.
-Mere.
Vent, stop.
Hold op.
-Pause Det.
-Rotate Os 75 grader rundt om den lodrette, tak.
>> Hold op.
Gå tilbage til den del om døren igen.
>> -Har Et billede forstærker, der kan bitmap?
>> Måske kan vi bruge Pradeep Singh metode til at se ind i vinduerne.
>> -Den Software er state of the art.
>> -Den Egenværdi er slukket.
>> -Med Højre kombination af algorithms--
>> Han er taget belysning algoritmer til det næste niveau,
og jeg kan bruge dem til forbedre dette fotografi.
>> -Lock På og forstørre z-aksen.
>> -Enhance.
Forbedre.
-Enhance.
-Freeze Og forbedre.
[END VIDEO PLAYBACK]
David J. MALAN: Så dem er alle ord, men de var ikke
anvendes i sætninger korrekt.
Og faktisk i fremtiden, når som helst, venligst, du hører nogen sige ordet,
"Forbedre", klukle bare en lille smule.
Fordi når du forsøger at forbedre, for eksempel, det er hvad der sker.
>> Så her er en smuk foto.
Dette er CS50 egen Daven.
Og formoder, at vi ønskede at fokusere på det glimt i øjet,
eller refleksion af skurken, der var klart
fanget af den sikkerhed kamera.
Dette er, hvad der sker, når du zoomer ind på et billede,
har kun et begrænset antal af bits, der er forbundet med det.
>> Det er, hvad du ville få.
Og ja, i Daven øje er men fire, måske seks pixels
at komponere præcis hvad var glimtende der.
Så Problem opstillet fire i sidste ende vil have du udforske denne verden, især
af arten af ​​noget vi kalder fil I / O, hvor
I / O er bare en fancy måde siger input og output.
>> Så hidtil alle interaktioner vi har haft med en computer
har været stort set med din tastatur og skærm,
men ikke så meget med harddisken eller gemme filer ud over dem, du
selv skrive.
Dine programmer hidtil har ikke været at skabe og gemme,
og ajourføring af deres egne filer.
>> Nå, hvad er en fil?
Nå, noget som en JPEG.
Dette er et billede, som du måske har eller uploade til Facebook,
eller se overalt på nettet.
Ja, det foto vi bare sav af Daven var en JPEG.
Og hvad er interessant om filer som JPEG
er, at de kan identificeres, typisk ved visse bitmønstre.
>> Med andre ord, hvad er det, adskiller en JPEG fra en GIF
fra en ping fra et Word dokument fra en Excel-fil?
Tja, det er bare anderledes bitmønstre.
Og de forskellige mønstre er normalt ved starten af ​​disse filer.
>> Så når computeren åbner et Word doc, eller når en computer åbner en JPEG,
det ser typisk på første adskillige bits i filen.
Og hvis det genkender et mønster, det siger, åh, det er et billede.
Lad mig vise det til brugeren som en grafik.
Eller, åh, det ligner et Word dok.
Lad mig vise det til brugeren som et essay.
>> Så for eksempel, JPEG, det viser sig, er
temmelig sofistikeret under hætten.
Men de første tre bytes i de fleste hver JPEG starte med disse tre numre.
Så byte nul, en og to er i mest hver JPEG, 255, så antallet
216, så antallet 255.
>> Og hvad du vil være i stand at begynde at gøre i næste uge
er faktisk stikke nedenunder hætten af ​​filer som JPEG
og ligesom bitmap-filer, og se hvad der altid har været der så længe
som du har brugt en computer.
>> Men hvad er der er ikke typisk skrives som decimaltal som denne.
Dataloger ikke tendens til at tale i decimal.
De har ikke rigtig tale i binær.
Typisk, når vi ønsker at udtrykke tal
vi rent faktisk bruger hexadecimal, som du måske husker
fra, siger, Problem Sæt En, der udfordrede
du til at tænke på et andet system.
>> Vi naturligvis er bekendt med decimal, nul til ni.
Vi talte om binær.
Og vi har ikke rigtig har at bruge så meget her
på ud, fordi computere vil bruge den.
Men programmører vil meget ofte, men ikke altid,
bruge hexadecimal, som netop betyder du har 16 bogstaver i dit alfabet,
i modsætning til to eller 10.
>> Så hvordan kan du tælle til højere end ni i hexadecimal?
Du går 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, blot ved konvention.
Men hvad er afgørende er, at hver af disse er et enkelt symbol.
Der er ingen 10.
Der er ingen 11, i sig selv, fordi hver af dine cifre, ligesom i decimal
og ligesom i binær, bør kun være et enkelt tegn, efter sædvane.
>> Så da er alfabetet vi til rådighed til hexadecimal.
Så hvad gør en JPEG se ud, hvis du skulle skrive ud de første tre
bytes ikke som decimal, men for eksempel som hexadecimal?
Og hvorfor er hex selv alt det nyttigt?
>> Tja, et hurtigt kig på et eksempel.
Så hvis jeg skriver de bits, der repræsentere disse decimal numbers--
dette kan være lidt rusten nu fra et par uger tilbage,
men den venstre og rigtige er temmelig let.
255 var det største antal, vi kunne repræsentere med otte bits.
Det var alle dem.
Så den eneste, der er mildt interessant er den midterste.
Og hvis du slags gøre ud matematik, vil du udlede, at, ja,
dette mønster af en og nuller repræsenterer 216.
Så lad os bare lægger for nu, at de er korrekte.
Men hvorfor er det interessant?
>> Tja, en byte, selvfølgelig, er otte bits.
Og det viser sig, at hvis du tror af en byte som to stykker af fire bit,
som denne.
Lad mig lige tilføje noget plads.
Så før, efter.
Jeg har lige tilføjet nogle hvide rum til visualisering skyld her.
Hvordan kan vi nu repræsenterer i, siger, hexadecimal hver quad af bits,
hvert sæt af fire bit?
>> Så for eksempel til venstre nu har vi 1111 i binær.
Hvad er det tal i decimal, hvis du gør ud af matematik?
Du har dem sted, det toere sted, det Fours sted, og ottere sted.
>> Publikum: 15.
David J. MALAN: Det er 15..
Så hvis vi gør otte plus fire plus to plus en, får vi 15.
Så jeg kunne skrive ned 15 nedenfor 1111, men hele pointen her
er hexadecimal, ikke decimal.
Så i stedet for at skrive ned 15, 1-5, Jeg har tænkt mig at skrive, at i hex,
som hvis du tænker tilbage, hvis du har nul gennem f, hvad der 15 kommer til at være?
Publikum: f.
David J. MALAN: Så det viser sig det er f.
Og du kan arbejde ud af ved at sige, Tja, hvis en er 10, så OK, f er 15.
Så ja, vi kunne omskrive dette samme sæt af numre som f f.
Og så hvis vi gør en smule matematik, vil vi udlede, at det er d.
Otte er temmelig let, fordi vi har en i ottendedele sted.
Og så har vi et par mere F F er.
>> Så hvad mennesker har tendens til at gøre med konvention når de bruger hexadecimal er de bare
skrive det lidt mere kortfattet, slippe af med de fleste af denne hvide rum.
Og bare for at være super klar til læsere, at dette er hexadecimal,
den simple konvention blandt mennesker er du skriver nul
x, som ikke har nogen anden betydning end en visuel identifikation af,
her kommer en hex nummer.
>> Og så, du sætter de to cifre, f f i denne sag, så d et, så F F.
Så lang historie kort, hexadecimal bare en tendens
være nyttigt, fordi hver af dets cifre, nul gennem f receptioenen linjer
med et mønster af fire bit.
>> Så hvis du har to hexadecimale cifre, nul gennem F, igen og igen,
der giver dig perfekt otte bits eller en byte.
Så det er derfor, det har en tendens til være konventionelt nyttig.
Der er ingen intellektuel indholdet virkelig ud over det,
andet end den faktiske nytte.
>> Nu JPEG er ikke den eneste filformater til grafik.
Du husker muligvis, at der er filer som dette i verden,
i det mindste fra et par år tilbage.
>> Så det var faktisk installeret i Windows XP
på millioner af pc'er i hele verden.
Og dette var en bitmap-fil, BMP.
Og en bitmap-fil, som du vil se næste uge, betyder bare et mønster af prikker,
pixel som de kaldes, et kort på bits, virkelig.
>> Så hvad er interessant, selv om, om dette filformat, BMP, er
at under kølerhjelmen, det har mere end blot tre bytes
at sammensætte sin header så til at tale, de første par bites.
Det faktisk ser lidt kompliceret ved første øjekast.
Og du vil se dette i P sæt.
Og få noget særligt ud af det nu
er ikke så vigtig, som bare det faktum, at der ved begyndelsen af ​​hvert bitmap
fil, en grafisk format, der er en hel masse tal.
>> Nu Microsoft, Forfatteren af ​​dette format,
tendens til at kalde de tingene ikke int'er og tegn
og flåd, men ord og d ord og længes og bytes.
Så de er bare forskellige datatyper.
De er forskellige navne for den samme ting.
Men du vil se, at i P Angiv Four.
>> Men dette er kun at sige, at hvis et menneske dobbelt-klikker nogle .BMP sagsakter om hans
eller hendes harddisk, og et vindue åbnes op vise ham eller hende, at billedet
der skete, fordi operativsystemet systemet formentlig bemærket ikke kun
.bmp filtypenavnet i filnavnet,
men også det faktum, at der er nogle konvention til mønster af bits
i begyndelsen denne bitmap-fil.
>> Men lad os nu fokusere på sådan en kompliceret fil,
men i stedet på noget som dette.
Antag her i gedit, jeg bare have begyndelsen
af et program, der er ret simpelt.
Jeg har fået nogle omfatter op toppen.
Nu har jeg # include "structs.h", men Jeg vil vende tilbage til om et øjeblik.
Men dette er nyttigt for nu.
Så dette er et program det kommer til at gennemføre
ligesom registratoren database.
Så en database over studerende, og alle studerende i verden
har et navn og et hus og sandsynligvis nogle andre ting, men vi vil holde det simpelt.
Hver elev har et navn og et hus.
>> Så hvis jeg ønskede at skrive en program, hvis formål i livet
var bare for at skifte fra nul på op til tre,
hvis der er tre studerende ved Harvard University.
Og jeg ønsker blot at få hjælp getString, den enkelte studerendes navn og hus,
og så bare printe dem ud.
>> Det er lidt ligesom uge En, Uge to ting nu,
hvor jeg bare vil have en til sløjfe eller noget lignende.
Og jeg vil ringe til getString et par gange, og derefter udskrive f et par gange.
Så hvordan kan jeg gøre dette, selv om, når både et navn og et hus
er involveret til hver elev?
>> Så min første indskydelse måske være at gøre noget som dette.
Jeg kunne først sige, ja, giv mig, sige, en vifte af strenge kaldet navne.
Og jeg vil ikke have en papirkopi tre her.
Hvad ønsker jeg at sætte der?
Så de studerende, fordi det er bare en konstant erklæret i toppen,
bare så jeg ikke behøver at hardcode tre flere steder.
På denne måde kan jeg ændre det ét sted, og det påvirker en ændring overalt.
Og så kan jeg gøre streng huser studerende.
>> Og nu, kan jeg gøre noget lignende for (int i = 0; i <STUDERENDE, jeg ++.
Så jeg skriver hurtigt, men det er formentlig bekendt syntaks nu.
>> Og nu, dette var mere for nylig.
Hvis jeg ønsker at sætte i det i'te elevens navn, jeg tror, ​​jeg gør det.
Og så ikke navne men huse beslag jeg.
Jeg gør dette, getString, og lad mig gå tilbage og rette denne linje.
Enig?
Uenig?
Det er ikke meget brugervenligt.
Jeg har ikke fortalt brugeren, hvad de skal gøre.
>> Men nu, hvis jeg også ville senere, lad os
siger, udskrive disse ting out-- så TODO senere.
Jeg har tænkt mig at gøre mere med denne-- dette velsagtens sige
en korrekt gennemførelse af få navne og huse, tre
af dem samlede antal af hver, fra en bruger.
>> Men det er ikke meget godt design, ikke?
Hvad hvis en studerende har ikke bare et navn og et hus, men også et id-nummer,
og et telefonnummer, og en e-mailadresse,
og måske en hjemmeside, og måske en Twitter håndtag,
og et antal andre detaljer forbundet med en studerende eller en person,
mere generelt.
Hvordan ville vi begynde at tilføje funktionalitet til dette program?
>> Tja, jeg har lyst til den enkleste måde måske være at gøre noget lignende, lad os sige,
int IDS studerende.
Så jeg kan lægge alle deres id'er derinde.
Og så, for noget ligesom telefonnumre,
Jeg er ikke sikker på hvordan man repræsentere det bare endnu.
Så lad os gå videre og bare kald dette twitters studerende, som
er en smule mærkeligt, men-- og en masse flere felter.
>> Jeg er begyndt at effektivt kopiere og indsætte her.
Og det kommer til at vokse temmelig uhåndterlig temmelig hurtigt, ikke?
Ville det ikke være rart, hvis der var i verden en datastruktur kendt
ikke som en int eller en streng, men noget højere niveau, en abstraktion, så
til at tale, kendt som en elev?
C kom ikke med indbygget funktionalitet til studerende,
men hvad hvis jeg ønskede at give det sådan?
>> Tja, det viser sig, jeg har tænkt mig at åbne en fil kaldet structs.h her,
og du kan gøre netop dette.
Og vi vil begynde at gøre det nu.
Og under kølerhjelmen af ​​P indstille tre, du allerede har gjort det nu.
Der er ikke sådan noget som en g rect eller en g oval programmeringssproget C.
>> Folk på Stanford gennemført dem datatyper ved hjælp af denne fremgangsmåde her,
erklære deres egen nye data typer ved brug et nyt søgeord
kaldet struct og en anden en kaldet typedef.
Og faktisk, selvom syntaksen ser lidt anderledes ting
vi har set før, i princip, det er super simpelt.
>> Det betyder blot "definerer en type."
Det kommer til at være en struktur og en struktur
er ligesom en container for flere ting.
Og denne struktur vil at have en streng kaldet navn,
og en streng kaldet hus.
Og lad os kalde, blot for nemheds skyld, hele denne datastruktur elev.
>> Så det øjeblik du kommer til semikolon, har du nu
oprettet din egen data type, der kaldes elev
at nu står sammen med int, og flyde, og fjeldørred, og snor,
og g rekt, og g ovale, og et antal af andre ting, folk har opfundet.
>> Så hvad er nyttigt om dette nu er, at hvis jeg går tilbage
at struct 0 og afslutte dette implementering, som jeg skrev
i forvejen her bemærke, at alle af den uundgåelige messiness at
var ved at starte sker som jeg har tilføjet telefonnumre og kvidrer, og alle
disse andre ting til en elevs definition
nu er det kortfattet indsvøbt som blot en vifte af studerende.
>> Og hver af de studerende nu har flere ting inde i den.
Så bare efterlader et spørgsmål.
Hvordan får du ved navn, og huset, og id'et,
og hvad der ellers er indersiden af ​​studerende?
Super simpelt, så godt.
Ny syntaks, men en simpel idé.
>> Du skal blot indeks i array, som vi gjorde i sidste uge, og dette.
Og hvad er klart nyt stykke syntaks?
Just., Som betyder "gå ind i struktur og få det felt, der kaldes
navn, få det felt, der kaldes huset, få felt, der kaldes elev. "
>> Så i P indstille tre, hvis du er arbejder stadig på det,
og de fleste folk stadig er, indse, at når du
begynde at bruge ting som g rects og G ovaler
og andre ting, der ikke synes at kommer fra uge nul, en eller to,
indse, at det er fordi Stanford erklæret nogle nye datatyper.
>> Og ja, det er præcis, hvad vi vil gøre, så godt, i P Angiv Four, når
vi begynder at beskæftige sig med ting såsom billeder, bitmaps og meget mere.
Så det er bare en teaser og en mental model for, hvad der skal komme.
Nu jeg tøvet lidt her til morgen.
Jeg var slags nysgerrig efter at se, hvad Microsoft tapet faktisk
ligner dag.
Og det viser sig nogen i 2006 faktisk gik til næsten nøjagtigt
det samme sted at fotografere i virkeligheden hvad ligner det i disse dage.
Feltet er nu lidt tilgroet.
>> Så taler nu billeder, lad os bringe tilbage Daven her
på skærmen og Nicholas, og bare minde dig
at hvis du gerne vil slutte sig til os til frokost denne fredag, leder til vores sædvanlige webadresse
her.
>> Så hvor vi forlade off på mandag?
Vi introducerede dette problem, ikke?
Dette var tilsyneladende en korrekt gennemførelse af swap,
hvor du tager to int'er, en kaldes en, der hedder B,
bytte dem, ligesom Laura gjorde her på scenen med mælk og vand,
ved hjælp af en midlertidig variabel eller en tom kop,
så vi kunne sætte bi en og en i B uden at gøre et rod af ting.
Vi brugte en variabel.
Det hedder temp.
>> Men hvad var det grundlæggende Problemet med denne kode på mandag?
Hvad var problemet her?
Ja.
>> PUBLIKUM: Det tager mere plads.
>> David J. MALAN: Fylder mere rum, fordi jeg bruger en variabel,
og det er OK.
Det er sandt, men jeg er vil sige det er OK.
Det er kun 32 bits i grand arrangement med ting, så ikke en big deal.
Andre tanker?
Publikum: Den har kun swaps variabler lokalt.
David J. MALAN: Præcis.
Der byttes kun de variable lokalt.
Fordi hver gang du kalder en function-- når jeg havde bakkerne fra Annenberg
sidste gang, du har main på bunden.
Så snart du kalder en funktion kaldet swap, er swap ikke får x og y,
de oprindelige værdier.
Hvad betyder swap get, vi påstår?
Publikum: Kopier.
David J. MALAN: Så kopier af dem.
Så det bliver et og to, hvis du huske eksemplet fra sidste gang,
men en kopi af en og to der med succes byttes.
Men desværre i sidste ende, disse værdier er stadig de samme.
Så vi kan se det med vores ny ven, forhåbentlig GDB,
at du eller TFS og Ca s har været at vejlede dig i retning som følger.
>> Så ingen swap tilbagekaldelse ser like-- lad os åbne op denne-- ligner dette.
Vi initialiseret x til en, å til to.
Havde en flok print F'er.
Men så, opkaldstasten her var at bytte, som
er præcis den kode, vi har lige set et øjeblik siden.
Hvilket er korrekte på første øjekast, men funktionelt
dette program ikke virker, fordi det ikke permanent bytte x og y.
>> Så lad os se det, en hurtig varm heroppe med GDB, en ./noswap.
En flok af overvældende informationer, Jeg vil slippe af med Kontrol L for nu.
Og nu, jeg har tænkt mig at gå videre og køre den.
Og desværre, at var ikke så nyttig.
Det løb programmet indersiden af ​​denne program kaldet GDB, en debugger,
men det gjorde ikke lade mig stikke rundt.
>> Så hvordan kan jeg faktisk holde pause udførelse indenfor dette program?
Så knække.
Og jeg kunne bryde på enhver linienummer, en, 10, 15.
Men jeg kan også bryde symbolsk ved at sige pause vigtigste.
Og det kommer til at sætte en pause punkt, tilsyneladende på linje 16 i main.
Og hvor er linje 16?
Lad os gå op til koden og gå op til noswap.
Og faktisk, linie 16 er den allerførste i programmet.
>> Så nu, hvis jeg gå videre og type køre denne gang, Enter, det standsede.
Så lad os stikke rundt.
Udskriv x-- hvorfor er x nul?
Og ignorere dollartegn.
Det er bare for avanceret brug af programmet.
Hvorfor er x nul i øjeblikket?
Ja.
>> PUBLIKUM: Det standsede lige før linie 16, faktisk ikke på linie 16.
David J. MALAN: Præcis.
GDB som standard er sat på pause udførelse lige før linie 16.
Så det har ikke udført, betyder x er af en ukendt værdi.
Og vi fik heldig, at det er noget rent lignende nul.
Så nu, hvis jeg skriver næste, nu udføres 16.
Det venter på mig at udføre 17.
Lad mig gå videre og udskrive x.
Det er en.
Lad mig gå videre og udskrive y.
Hvad skal jeg se nu?
>> Publikum: [uhørligt]
>> David J. MALAN: Lidt højere.
>> Publikum: [uhørligt]
David J. MALAN: Ikke helt enighed.
Så ja, vi ser nogle skrald værdi.
, Y er nu 134514064 der.
Tja, det er bare nogle skrald værdi.
Mit program bruger RAM til forskellige formål.
Der er andre funktioner.
Andre mennesker skrev inde i min computer.
Så disse bit er blevet anvendt til andre værdier, og hvad jeg ser
er resterne af nogle tidligere brug af denne hukommelse.
>> Så nogen big deal, fordi så snart mens jeg skriver næste og derefter udskrive y,
det er initialiseret til den værdi, som jeg ønsker.
Så nu, lad os gå videre lidt hurtigere.
N for næste.
Lad os gøre det igen.
Men jeg ønsker ikke at ramme det her, fordi hvis jeg
ønsker at se, hvad der foregår inde swap, hvad er kommandoen?
>> Publikum: trin.
>> David J. MALAN: trin.
Så dette trin mig ind i en funktion, snarere end over den.
Og nu, det er lidt kryptisk ærligt, men det er bare
fortæller mig, jeg er på linje 33 nu.
Og lad os gøre det igen.
Udskriv temp.
Garbage værdi negativ på dette tidspunkt, men det er bare stadig en skraldespand værdi.
Så lad os gøre næste, print temp.
Det er initialiseret til 1, som var værdien af ​​x, alias en.
>> Nu, hvor er vores et og X kommer fra?
Nå, meddelelse i main, vi kaldte disse værdier x og y.
Vi derefter passeret dem at bytte som følger.
X kom først, komma y.
Og så kunne bytte kalde dem x og y.
Men for klarhed, er det kalde dem a og b.
Men a og b skal nu være kopier af x og y, hhv.
>> Så hvis jeg gå tilbage til GDB, temp er nu en og en er nu én.
Men hvis jeg gøre næste, og nu gør print en har en allerede gået over.
Mælken er blevet hældt ind i det tidligere appelsinjuice glas, eller omvendt.
>> Og hvis jeg gøre næste gang, og nu hvis jeg udskrive som en tilregnelighed check,
a er stadig to, men b er nu en.
Helt ærligt, det er der stadig.
Jeg er ligeglad med hvad temp er.
Men så snart jeg nu skriver, lad os sige, fortsætte med at gå tilbage, nu er jeg i slutningen
programmet.
Og desværre er x stadig en og y er stadig to.
>> Så hvad var nytten af ​​GDB der?
Det hjalp mig ikke fastsætte problemet sig selv,
men det forhåbentlig hjælpe mig forstå det ved at realisere
at ja, min logik er ret, men min kode er i sidste ende ikke at have
en permanent indvirkning.
Så det er et problem, vi er vil nu løse dag.
>> Men lad os komme der ved hjælp af dette.
String er en løgn.
Det også ikke en datatype der findes i C. Det er
været et synonym for nogle tid til noget andet,
og vi kan afsløre, at som følger.
>> Lad mig gå videre og åbne op et program kaldet sammenligne-0.
Og i stedet for at skrive denne ene ud, vi vil begynde at gå gennem koden
Jeg skrev allerede, men det er kun et par linjer.
Så dette er sammenligne-0.
Og den første ting jeg gør er at få en tekstlinje.
>> Men bemærk, hvad jeg gør for første gang.
Hvad er anderledes klart om linje 21?
Faktisk, vent et øjeblik.
Dette er eksemplar to.
Det er ikke engang det rigtige program.
Okay, spoiler alarm.
Okay, så pyt det.
Det er svaret på en fremtidig spørgsmål.
>> Her er sammenligne-0, og jeg er ved at få en tekstlinje.
Programmets meget enklere.
Så dette er ligetil.
Det er ligesom uge One, Uge to ting i øjeblikket. string s = getString.
Nu siger jeg det igen hernede.
streng t = getString.
Og så den sidste ting i denne program, som navnet antyder,
er jeg har tænkt mig at prøve at sammenligne dem.
>> Så hvis r den første streng, lig = t, så er jeg
vil sige, at du skriver det samme.
Else, vil jeg sige du skriver forskellige ting.
Så lad os kompilere og køre dette program.
Så gør sammenligne nul.
Ser godt ud.
Ingen kompilering fejl.
>> Lad mig gå videre nu og skriv ./compare-0.
Lad mig gå videre og sige noget : Daven og noget: Rob.
Og jeg skriver forskellige ting.
Så langt, så godt.
Programmet, synes at være korrekt.
>> Men lad os køre det igen.
Sig noget: Gabe.
Okay.
Måske ramte jeg mellemrumstasten eller noget funky.
Lad os gøre det igen.
Så Zamyla.
Zamyla.
Forskellige ting.
Så hvad sker der?
>> Så vi har disse to linjer af kode getString bliver kaldt to gange.
Og så er jeg simpelthen forsøger at sammenligne s og t.
Men hvad der virkelig så sker der?
Nå, min håndskrift er ved at slagte dette eksempel noget.
Og lad os faktisk smide dette op herovre, så godt.
>> Så vi har en linje som string s = getString.
Så det er simpelthen den første interessant linje fra det pågældende program.
Men hvad i al denne tid har været foregår under kølerhjelmen?
Nå, på venstre side er streng, der er en vis form for variabel,
og det hedder sek.
Så jeg ved, at dette er ved hjælp af hukommelsen, eller RAM i min computer eller anden måde.
Så jeg har tænkt mig at abstrakt tegne det som en firkant.
32 bit, viser det sig, men mere om det i fremtiden.
Og så, hvad sker der her?
>> Nå, getString tydeligvis får en streng fra brugeren.
Og getString fik Zamyla eller Gabe eller Daven.
Så lad os vælge den første af dem, der var Daven.
Så effektivt, hvad getString fik mig i den første sag var D-a-v-e-n.
Og så, hvad der ellers gjorde det giver mig hemmeligt?
Publikum: [uhørligt]
David J. MALAN: Ja, den / 0 eller null-tegn.
Så det faktisk gav mig en streng.
Men vi allerede kender fra tidligere ser, at en streng er blot et array
tegn, og det opsiges af denne særlige sentinel karakter / 0.
>> Men hvis dette er sandt og dette er en firkant,
dette er helt klart en meget større rektangel.
Og ja, det er, Jeg hævder, kun 32 bit.
Og det er klart mere end 32 bits, fordi det er sandsynligvis
otte plus otte plus otte plus otte plus otte,
bare på grund af bytes i ASCII.
Hvordan dælen skal vi passe Daven ind i denne lille boks her?
>> Nå, hvad getString faktisk gør?
Nå, dette net her repræsenterer min computers hukommelse eller RAM.
Så lad os vilkårligt sige, at hvis hver af disse repræsenterer en byte,
så kan vi tænke på hver byte som havende en adresse,
ligesom 33 Oxford Street, eller 34 Oxford Street, eller 35 Oxford Street.
>> Så ligesom boliger har adresser og bygninger har adresser,
så gør individuelle bytes hukommelse har adresser eller numre
der entydigt identificere dem.
Nu, dette er vilkårlig.
Men for at holde det enkelt, jeg har tænkt mig at bruge hexadecimal blot ved konvention,
men 0x betyder intet andet end "dette er hexadecimal."
og jeg har tænkt mig at hævde, at "D" ender på Byte En i hukommelsen.
>> Jeg fik intet andet der foregår i hukommelse, så Daven fik den første plet
ved Byte One.
Dette, så bliver 0x2.
Dette vil 0x3.
Dette vil være 0x4.
Dette vil 0x5.
Dette vil være 0x6.
>> Men når du begynder at tænke om, hvad computerens værk
under kølerhjelmen, du kan begynde at udlede
hvordan du, for nogle år siden, ville har gennemført C selv.
Hvad er getString sandsynligvis returning-- fordi det
føles ligesom det er ikke returnering Daven per se
fordi han er sikkert ikke går at passe ind i denne lille box--
så hvad er getString sandsynligvis vende tilbage?
>> Publikum: [uhørligt]
>> David J. MALAN: Placeringen af ​​Daven.
Og det har gjort det siden Uge One.
Hvad getString er virkelig returnering er ikke en streng, per se.
Det er en af ​​de små hvide løgne.
Det returnere adressen på den streng i hukommelsen, den unikke adresse.
Daven lever på 33 Oxford Street.
Men mere kortfattet, Gavin lever på 0x1, Address Number One.
>> Så hvad bliver sat i dette lille boks så, at være klar,
er bare adressen på denne streng.
Så al den tid, dette har stået på.
Men hvad det antyder nu er, at hvis alle S har
er et tal inde i det, der er at stoppe dig, programmør,
fra at lægge et vilkårligt antal i enhver variabel og bare hoppe
til at luns af hukommelse?
Og ja, vil vi se det er en trussel næste gang.
>> Men for nu, det føles utilstrækkeligt.
Hvis jeg siger, få mig en streng, du giver mig Daven.
Men du behøver ikke rigtig give mig Daven.
Alt hvad du giver mig, er Daven adresse.
Hvordan kan jeg så vide med sikkerhed hvor Daven begynder og ends--
historien er ved at blive weird-- hvor Daven begynder og slutter,
og derefter den næste streng i hukommelsen starter?
>> Tja, hvis du afleverer mig i begyndelsen af ​​Daven,
væsentlige, hvordan kan jeg vide hvor afslutningen af ​​hans navn er?
Denne særlige null-tegn, som er så meget desto vigtigere nu
hvis strenge nedenunder hætte simpelthen identificeres
unikt ved deres placering i hukommelsen.
Så al den tid, der er hvad der er foregået på.
>> Så når vi ser nu på koden her forklare
hvis du ville fejlen i linje 26.
Hvorfor er Zamyla og Zamyla anderledes?
Hvorfor er Gabe og Gabe anderledes?
Ja, i ryggen.
>> AUDIENCE: De har forskellige adresser.
>> David J. MALAN: Simpelthen fordi de har forskellige adresser.
Fordi når du ringer getString igen, som jeg vil gøre hurtigt her,
hvis dette er den anden linje, streng t, som jeg gjorde i dette program,
lig et andet opkald til getString.
Næste gang jeg kalder GetString, jeg har tænkt mig
at få en anden luns af hukommelse.
>> GetString er tilladt at spørge operativsystemet
system for mere og mere hukommelse.
Det kommer ikke til at genbruge den samme seks bytes hver eneste gang.
Det kommer til at få en ny bid af hukommelse, som
betyder t kommer til at få en anden værdi herovre.
>> Så når jeg gør s lig = t, du er ikke at sammenligne
D mod dette og en imod dette og V imod dette.
Du sammenligner dette imod dette, som
helt ærligt er temmelig useful-- useless-- er temmelig ubrugelig, fordi der virkelig
bekymrer hvor strengene er i hukommelsen?
>> Og faktisk har vi ikke.
Og vi kommer ikke til at starte særligt omsorgsfulde.
Kun i det omfang, at fejl kan opstå og sikkerhedstrusler kan opstå vilje
vi faktisk begynde at bekymre sig om dette.
Så lad os løse dette problem.
Slår ud, du ordne det super enkelt.
>> Og lad os faktisk, før jeg afslører, at igen, hvad ville
du gøre, hvis i en CS50 klasse, og du havde at implementere
en sammenligning med to strenge.
Du tydeligt kan ikke bare bruge s lig = t.
Men bare logisk, hvordan vil du sammenligne denne streng
mod denne streng ved hjælp af C-kode?
Ja.
>> Publikum: Bare gør det for-løkke [uhørligt]
David J. MALAN: Perfect.
Publikum: [uhørligt]
David J. MALAN: Ja.
Bare bruge en for-løkke eller en mens løkke eller hvad.
Men bare anvende den grundlæggende idé, at hvis dette er et stykke af hukommelse eller et array
og dette er, gentage over begge dele på samme tid.
Og bare sammenligne bogstaver.
>> Og du har fået til at være en lidt forsigtig, fordi du
ønsker ikke en finger at snyde den anden
fordi en streng er længere end den anden.
Så du lyst til at kontrollere, om denne særlige værdi ultimo, null.
Men det er virkelig, i den ende, så simpelt er det.
Og helt ærligt, har vi ikke brug at genopfinde at hjulet.
Her er Version Two.
Og hvad jeg har tænkt mig at sige her, er, at stedet for at sammenligne s lig = t,
Jeg stedet kommer til at sige, at hvis strengen sammenligning af filtre komma t er lig med = 0.
Nu, hvad der er streng sammenligne?
>> Det viser sig, det er en funktion, der kommer med C, hvis formål i livet
er at sammenligne to strenge.
Og rør sammenligne, hvis vi læser dens man side eller dokumentation eller CS50
henvisning, vil det bare fortælle dig, at røre
sammenligne udbyttet enten en negativ nummer eller et positivt tal eller nul,
hvor nul betyder, at de er lige.
>> Så bare formodninger.
Hvad kan det betyde, hvis røre sammenligne afkast
negativ værdi eller positiv værdi?
PUBLIKUM: Større end eller mindre end.
David J. MALAN: Ja, større eller mindre end.
Så hvis du ønsker at sortere en hel bundt af strenge i et dictionary--
som vi vil i sidste ende ned road-- perfekt funktion til at bruge potentielt
fordi det kommer til at gøre det sammenligning af strenge for dig, og fortælle
du gør en kommer før b, eller gør b kommer før en alfabetisk.
Vi kan gøre netop det.
>> Og bemærk, jeg gjorde en anden ting i dette eksempel.
Hvad har ændret sig højere op i denne hovedfunktion?
Char *.
Og dette er, at andre hvide løgn.
Alt dette tidspunkt, når du har blevet skriftligt streng,
vi har været hemmeligt omskrivning streng som char * så klang faktisk
forstår dig.
>> Med andre ord, i CS50.h og da vi til sidst vil se,
vi gjort et synonym kaldet streng det er det samme som char *.
Og for nu, kun at vide *, I denne forbindelse, i det mindste
betyder adressen.
>> Adressen på hvad?
Nå, det faktum, at jeg sagde char *, og ikke int * eller flyde *
betyder, at char * er adressen på en char.
Så denne lille boks her, alias streng, er virkelig af typen char *,
der er simpelthen en fancy måde at sige, i denne boks vil gå en adresse.
Og hvad betyder denne adresse refererer til?
Tilsyneladende en char.
>> Men vi kunne absolut har int * og andre ting.
Men for nu, char * er virkelig den mest ligetil og en af ​​interesse.
Så dette problem går at stige, selv om igen.
>> Antag jeg åbner dette program.
Lad os se, om vi nu kan forudsige hvad er der galt med denne kode.
Så i dette program, kopi-0, er jeg kommer til at gå videre og igen kalder
GetString og gemme værdien i sek.
>> Og så, hvorfor jeg gør det, blot som en påmindelse fra uger tidligere?
Vi sagde, at getString undertiden returnerer null.
Hvad betyder det, hvis GetString returnerer null?
Noget gik galt.
Det betyder formentlig strengen er for store, computerens hukommelse.
Det sker super, super, super sjældent, men det kunne ske.
Vi ønsker at tjekke for det, og det er alt, vi laver.
>> Fordi vi vil se nu, hvis du ikke gør begynde at kontrollere sædvanligt for ting
Ligesom null, kan du faktisk begynder at gå
til adresser i hukommelsen, der er ugyldige.
Og du kommer til at begynde at inducere flere og flere segmentfejl.
Eller i en Mac eller en PC, bare forårsager en computer til at hænge
eller et program til at fryse, potentielt.
>> Så nu, jeg hævder i kopi-0.c, at jeg jeg kommer til at kopiere disse strenge ved hjælp
af linje 28.
Og så jeg har tænkt mig krav nederst
her, at jeg har tænkt mig at ændre en af ​​dem.
>> Så bemærke dette.
Jeg ringer vores gamle ven strlen.
Og bare forklare på engelsk hvad denne linje 34 gør?
Hvad betyder t beslag 0 repræsentere til venstre.
Ja.
>> Publikum: Første karakter t?
David J. MALAN: Første karakter t.
Det er det.
Første karakter t, jeg vil at tildele det store udgave
for det første tegn i t.
Så dette er kapitalisere det første bogstav.
Og så den allersidste ting jeg gør i dette program er jeg påstår her er
originalen, s, og her er kopien, t.
>> Men baseret på historien, vi bare fortalte om, hvad strenge virkelig er,
hvad er linje 28 virkelig gør, og hvad der er
den resulterende fejl går at være på skærmen?
>> Så først, det første spørgsmål 28.
Hvad der er streng t = s virkelig gør?
Hvis vi har på venstre hånd side her streng t = s;
der giver mig en kasse her og en kasse her.
Og formoder denne adresse er 0x, lad os sige, 50 denne gang, vilkårligt.
Hvad betyder streng t = s gøre under kølerhjelmen?
>> Publikum: [uhørligt]
>> David J. MALAN: Den gemmer hukommelsen tage fat der, så 0x50 går der.
Så hvis nu jeg går til den første tegn i t og store bogstaver det,
hvad jeg reelt gør for at s?
Jeg er virkelig at gøre det samme, ikke?
Fordi hvis Adresse 0x50-- og bare, jeg har ikke meget plads på tavlen her,
men antager, at det er 0x50 hernede, et eller andet sted i min computers hukommelse.
>> Og jeg har for eksempel Gabe med små bogstaver her, som denne.
Og jeg har sagt t beslag 0 bliver kapitaliseret.
Nå, t beslag 0 er det første bogstav i t.
Så lidt g vil bliver store G. Men problemet
er, hvad betyder s også pege på?
>> PUBLIKUM: Det samme.
>> David J. MALAN: Det samme nøjagtige ting.
Så en simpel forklaring måske selvom syntaksen er lidt underligt.
Så lad os gøre dette.
Lav kopi-0 og derefter ./copy-0.
Sig noget: Gabe.
Og desværre, både af dem er nu blevet aktiveret,
men for det underliggende grunden til, at vi er simpelthen
behandler nu adresser.
>> Så hvordan kan vi begynde at address-- ingen ordspil intended--
hvordan kan vi begynde at tage fat dette særlige problem?
Tja, i copy1.c, går det at få lidt mere kompliceret.
Men jeg vil hævde en konceptuelt enkel løsning.
>> Så svært at få ved første øjekast.
Ikke vil være let for den første gang du skriver det ud, måske,
men hvis problemet er, at blot at gøre t = s bare
kopier adressen, hvad igen, hvis jeg kan samle på dig,
kommer til at være løsningen for rent faktisk at kopiere en streng?
>> PUBLIKUM: Vi vil sandsynligvis anvende en løkke igen.
>> David J. MALAN: Ja.
Så vi kommer til at bruge en løkke igen.
Og fordi hvis vi ønsker at kopiere en streng er i en anden streng,
vi sandsynligvis ønsker at gøre det tegn for tegn.
Men problemet er, hvis dette er oprindeligt s,
Nu er vi nødt til at starte eksplicit allokering af hukommelse for t.
>> Med andre ord, lad os gentegne dette en sidste gang.
Hvis dette er streng s = getString.
Og lad os sætte dette op her, så godt.
Dette er getString.
Og så, på billedet for noget ligesom det vil være som før,
g-a-b-e / 0.
Det ser lidt noget som dette.
Og s derfor, vi kalder det 0x50, og det kommer til at være 51, 52.
>> Så dette er 0x50.
Og så gør jeg streng t.
I hukommelsen, er det bare at gå til give mig en lille firkant som denne.
Så hvad er den afgørende skridt nu?
Hvis jeg ønsker at kopiere s mod t, hvad blank behøver vi at udfylde her?
Eller hvad skal vi gøre på et højt niveau?
Ja?
Nogen?
Ja.
>> PUBLIKUM: Vi er nødt til [uhørligt].
David J. MALAN: Ja, vi nødvendigt at udfylde dette felt tomt.
Jeg kan ikke kopiere, og derefter kapitalisere Gabe navn
indtil jeg spørger operativsystemet et andet stykke af hukommelse
der er mindst lige så stor som originalen.
Så det efterlader os med et spørgsmål.
>> Hvordan kan jeg bede operativsystemet ikke bare for en enkelt lille pointer--
som det kaldes, en adresse, en pointer-- ikke
for en simpel lille boks som dette kaldes en streng?
Hvordan kan jeg bede operativsystemet system til en stor luns af hukommelse?
Hidtil har jeg kun fået det tilbage indirekte ved at ringe getString.
Så hvordan er getString selv at få sin hukommelse?
>> Tja, det viser sig, at der er denne anden funktion her
at vi nu vil begynde at bruge.
Nu, dette ser langt mere kryptiske than-- og jeg er den eneste der kan se det--
denne linje ser langt mere kryptiske så bør det ved første øjekast.
Men lad os drille det fra hinanden.
>> På venstre side, jeg har char * t.
Så i engelsk, så lad os begynde at formulere ordentlige sætninger i teknisk jargon.
Så dette er at tildele en variabel af typen char * kaldet t.
Nu, hvad betyder det egentlig?
>> Tja, det betyder, hvad skal jeg at sætte i denne variabel kaldet t?
En adresse på en char.
Så det er bare enklere, mere rimelig måde
beskrive den venstre side.
Så det skaber denne boks her alene.
Så den højre side, formodentlig vil
at tildele at større luns af hukommelse hvordan?
Så lad os drille det fra hinanden.
>> Det overvældende ved første øjekast, men hvad der foregår inde i her?
Først er der malloc, som er tilsyneladende vores nye ven,
"Memory tildele".
Så dette er argumentet væltes ind i det, så det er en temmelig stor argument.
Så lad os drille det fra hinanden.
>> strlen af ​​s, repræsenterer naturligvis det--
PUBLIKUM: Antallet af tegn.
David J. MALAN: Bare antal tegn i sek.
Så længde er den oprindelige streng.
So G-a-b-e.
Så det er sandsynligvis fire i dette tilfælde.
Hvorfor laver jeg en efter ringer strlen af ​​s?
Publikum: [uhørligt]
David J. MALAN: For det særlig null-tegn.
Hvis du spørger mig, hvad er længden af Gabe navn, jeg vil sige fire.
Under kølerhjelmen, selvom, jeg har brug for at femte byte for null-tegn.
Så det er derfor jeg gør +1.
>> Nu bare i tilfælde du kører dette program på en anden end computer, siger,
det CS50 apparat, hvor størrelsen af ​​en char
kan være anderledes fra min egen computer--
viser sig, at jeg kan kalde dette operatør sizeof, bare spørge computeren,
hvad der er på størrelse med en char på denne computer?
>> Og ved at multiplicere fem i dette eksempel af størrelsen af ​​et tegn, som
på de fleste computere vil bare være én, malloc
vil tildele for mig denne store luns af hukommelse herovre til højre.
Og det kommer til at return-- det er en function-- så det er
vil vende tilbage til mig hvad?
PUBLIKUM: Adressen?
David J. MALAN: Adressen på hvad?
Publikum: Af hukommelse det fordelt?
David J. MALAN: Af de hukommelse det fordelt.
Så jeg har ingen idé om, helt ærligt, hvor det kommer til at ende op.
Jeg har tænkt mig at foreslå, at det kommer til at ende på 0x88.
Helt vilkårlig, men et andet sted end 0x50,
fordi operativsystemet, hvad Windows og Mac OS gøre for mig, er
sørg for, at det er at give mig forskellige bidder af RAM.
>> Så dette er den værdi, hvor dette luns af hukommelse kan ende.
Så dette er hvad ender i her, 0x88.
Så nu tydeligt, kan jeg forstå at dette ikke er det samme som det,
fordi de peger på forskellige bidder af hukommelsen.
Så hvis jeg nu faktisk ønsker at kopiere denne i, lad os gøre din foreslåede løsning.
>> Lad os bare gå, skabe en for-løkke, og gøre t beslag jeg får s beslag jeg.
Fordi nu kan jeg bruge dette array-lignende notation
fordi selvom malloc meget generisk allokerer mig hukommelse,
hukommelsen er kun tilgrænsende byte.
Byte, byte, byte, ryg mod ryg mod ryg.
>> Jeg kan helt sikkert som en programmør behandle det som en matrix, som
betyder, at jeg kan bruge dette til sidst kender notation af blot nogle firkantede parenteser.
>> Så lad mig pause der, fordi dette er en masse på én gang, selv
selvom den grundlæggende idé at opsummere er denne streng, al denne tid,
er ikke en ny datatype per se.
Det er bare en såkaldt pointer, en adresse på en karakter,
hvilket blot betyder, at det er et nummer at ved menneskelig konvention
vi har en tendens til at skrive som 0x noget.
>> Men det er bare et nummer, ligesom 33 Oxford Street,
der sker for at være den CS bygningens adresse.
Eventuelle spørgsmål omkring disse detaljer?
Ja?
>> PUBLIKUM: Hvorfor skal vi kontrollere for t svarende til null?
>> David J. MALAN: Hvorfor gør vi tjek for t svarende til null?
Hvis vi læser documentation-- stor question-- til malloc,
det vil sige i småt, undertiden malloc kunne returnere null,
ligesom getString.
Og ja, getString returnerer null hvis gengæld malloc returnerer null,
fordi getString bruger malloc.
>> Og det kan ske, hvis OS, Mac OS, Windows, uanset hvad, er simpelthen
ud af hukommelse for dig.
Så det er hvad der skete.
>> Og lad mig afsløre en anden ting der kan bare blæse din hjerne
eller helt være for langt over linjen.
Men lad mig trække op samme for-løkke til kopiering,
som for et øjeblik siden, husker var dette. t beslag jeg får s beslag jeg.
>> Nice og brugervenligt.
Føles Uge to igen.
Men denne version kan faktisk være omskrives til dette, som ser kryptisk.
Det er en teknik kaldet pointer aritmetik, adresse aritmetik.
Men hvorfor gør dette arbejde?
>> Nu irriterende, den forfattere C besluttet at anvende
symbolet * til forskellige formål.
Vi har set det brugt én gang allerede, char *, som betyder "giv mig en variabel
der kommer til at indeholde adressen på en char. "
Så char * i denne sammenhæng betyder "giv mig en variabel."
>> Desværre, hvis du bruger * uden et ord foran det, ligesom char,
det nu kaldes dereference operatør.
Og vi vil se mere af denne inden længe.
Men det betyder bare "derned."
Det er ligesom at sige, hvis nogen rakte mig på et stykke papir "33 Oxford Street,"
hvis jeg gør "* 33 Oxford Street," det betyder "Gå ned vejen til CS bygningen."
>> Så * bare betyder gå der, hvis der er ingen ord i det foran.
Så hvad er t, for at være klar?
t er adressen på chunk hukommelse, der blev givet tilbage til mig.
s er adressen på det, for at være klar, i det eksempel, vi har diskuteret,
af små bogstaver gabe?
s er adressen af--
PUBLIKUM: Den streng.
David J. MALAN: Af Gabe oprindelige navn.
Så det er adressen på denne luns af hukommelse.
Så hvis jeg siger t + Jeg-- i, varsel, er bare vores gamle ven.
Det er bare et indeks variabel der er iteration fra nul på op
til længden af ​​strengen s.
Så det kommer til at være nul, så en, derefter to, så tre, så fire.
Så lad os samle disse nye Scratch-lignende puslespilsbrikker, hvis du vil,
selv om igen, syntaks er langt mere mystisk end Scratch.
Så t er en adresse + Jeg kommer til at give mig
et nummer, fordi disse er alle numre, som vi har været tegning som Hex.
Men de er bare tal.
>> Så hvis adressen på t vi sagde var 0x88, hvad er 0x88 plus nul.
Selv hvis du ikke er komfortabel med Hex endnu, tage et gæt.
>> PUBLIKUM: Den originale.
>> David J. MALAN: Stadig 0x88.
Så hvad betyder * 0x88 betyde?
Det betyder, "derned", hvilket betyder, effektivt, "sætte fingeren her."
Og nu på højre side af dette udtryk, * og derefter i Parens,
s + I betyder s, som er løse op her i den lille g.
r + 0 er naturligvis, s, uanset s er.
>> Så nu, det er * s, der ligesom * 33 Oxford Street betyder gå til adressen
sek.
Så her er denne finger, højre hånd.
Så hvad skal jeg til at kopiere ind i hvad?
De ting til højre, som er Gabe, lille g her, ind på her.
>> Og så effekten af ​​at første iteration af løkken,
som De foreslog, selvom det ser skøre mere kompliceret end noget
vi har set før, er blot at sige gå her og kopiere tegnet her.
Det er at give dig et kort til begge steder.
>> Og vi vil se langt mere af dette.
Men for nu, er håbet bare at indføre nogle af disse grundlæggende ideer.
Og ja, lad os se på en endelige program her,
og derefter lovede claymation, som vil gøre alt i orden.
Okay.
Så lad mig åbne up-- der vi gå.
Så lad mig-- vi vil komme tilbage til dette billede inden længe.
Lad mig åbne op denne sidste eksempel her.
>> Så her er en super, super program, der udretter
intet i livet, der gør følgende.
Det første erklærer to variabler, x og y, som ikke er tal denne gang,
per se.
De er ikke heltal, per se.
De er tilsyneladende int *.
Så bare nogen, hvad betyder det hvis din datatype, variablen,
er af typen int * stjerne?
Det er adressen på en int.
>> Så jeg har ingen idé om, hvor det er endnu.
Det betyder bare "sat i sidste ende, adressen på en int her. "
0x50, 0x88, hvor det er i hukommelse, en adresse vil der.
Og det er, hvad y er vil være, så godt.
>> Hvis jeg nu siger x = malloc (sizeof (int)), dette er en fancy måde at sige,
hey operativsystem via malloc, give mig nok hukommelse til størrelsen
af en int, hvilket formentlig kommer til at være 32 bit eller fire byte.
>> Så hvad betyder malloc tilbage?
Malloc returnerer en adresse.
Så hvad der kommer til at få gemt i x?
Adressen på chunk hukommelse, de fire bytes, at allokere
bare fundet til mig ved at spørge operativsystemet.
>> Nu mellemtiden, linie fire her, er * x = 42.
Bare for at være klar, hvad der foregår dernede?
På venstre side, * x.
det er ligesom * 33 Oxford Street.
Så * x betyder hvad?
>> PUBLIKUM: Gå til.
>> David J. MALAN: Gå til denne adresse.
Hvor denne luns af hukommelse er, gå til den.
Og lægge, hvad der, naturligvis?
Publikum: 42.
David J. MALAN: 42.
Okay, * y, samme idé.
Gå til adressen i y.
Sæt nummer 13 der, men hvad er y i øjeblikket?
PUBLIKUM: Der er ingen hukommelse for y.
David J. MALAN: Der er ingen hukommelse for y.
Så hvad gør y sandsynligvis indeholder, som vi har sagt?
>> Publikum: Garbage.
>> David J. MALAN: Nogle skrald værdi.
Nu skrald værdi er stadig et tal.
Det kan stadig være forveksles med en adresse.
Det er som om nogen intim noget ned,
og jeg misfortolket det således, nogle bygning ned på gaden.
Og hvis du bare forsøger at gå ind i nogle bygning, du ikke ejer,
eller nogle luns af hukommelse, du ikke har været givet, måske dårlige ting ske.
Computer kan gå ned, eller en anden ubestemt adfærd kunne ske.
>> Så intro, så til Binky er dette.
Jeg husker stadig, 20 nogle ulige år senere,
hvor jeg var, da jeg endelig forstod pointere.
>> Hvilket vil sige, hvis du forlader her på tre minutter
og tror, ​​at jeg ikke forstå pegepinde, indser
Jeg har husket for 20 år for nogle vanvittige grund
hvornår og hvorfor det endelig sunket i, sidde med min undervisning
fyr, Nishat Mehta i bagsiden af ​​Eliot Dining Hall.
Nu har jeg husket dette fordi det var
et af de emner, jeg, i især kæmpet med.
Og så er det endelig klikkede, ligesom jeg tør sige en masse emner
til sidst vil.
Og nu, for at gøre det føle alle de gladere og desto mere overbevisende,
lad os tage et sidste kig i vores sidste tre minutter her på Binky,
fra vores ven, Nick Parlante fra Stanford.
>> [VIDEOAFSPILNING]
>> Hey, Binky.
Vågn op!
Det er tid til pointer sjov.
>> Hvad er det?
Lær om pointers?
Åh, goody!
>> Tja, komme i gang, jeg tror vi er vil få brug for et par pointers.
>> -OK.
Denne kode tildeler to pegepinde, der kan pege på heltal.
-OK.
Tja, jeg se de to pegepinde, men de synes ikke at være at pege på noget som helst.
>> Det er rigtigt.
Oprindeligt pointers peger ikke på noget.
De ting, de peger på kaldes pointees, og sætte dem op s
et separat trin.
>> Åh, højre, højre.
Jeg vidste det.
De pointees er adskilt.
Er, så hvordan kan du tildele en pointee?
>> -OK.
Nå, denne kode allokerer en ny heltal pointee,
og denne del er x til at pege på den.
>> Hey, det ser bedre ud.
Så gør det gøre noget.
>> -OK.
Jeg vil dereference markøren x til gemme nummeret 42 i sin pointee.
Til dette trick, vil jeg brug for min Magic Wand af dereferere.
>> -Din Magic Wand af dereferere?
At-- det er fantastisk.
>> Det her er hvad koden ser ud.
Jeg vil bare sat op til nummeret, og [POP]
>> Hey, se.
Der det går.
>> -Så Laver en dereference på x følger pilen for at få adgang til dens pointee.
I dette tilfælde, en butik 42 der.
Hey du prøve at bruge det til at gemme nummeret 13 gennem den anden pointer, y.
>> -OK.
Jeg vil bare gå over her til y, og få nummer 13 sæt op.
Og så tage den Wand af Dereferere og bare [BUZZ]
>> Åh!
>> Åh, hej!
Det virkede ikke.
Sige, Binky, tror jeg ikke dereferere y er en god idé, fordi du ved,
opsætning af pointee er et separat trin.
Og jeg tror ikke, vi nogensinde gjorde det.
>> Godt punkt.
Ja.
Vi tildelte markøren y, men vi aldrig sat den til at pege på en pointee.
>> -Meget Observant.
Hey, du ser godt ud der, Binky.
Kan du lave det, så y punkter til samme pointee som x?
>> -Selvfølgelig.
Jeg vil bruge min Magic Wand af Pointer Overdragelse.
>> -Er Det vil være et problem som før?
Nej.
Dette betyder ikke røre pointees.
Det ændrer bare en pointer til peger på det samme som en anden.
>> Åh, jeg ser.
Nu y peger på det samme sted som x.
Så vent.
Nu er y fast.
Det har en pointee.
Så du kan prøve Wand af Dereferere igen for at sende 13 over.
>> Æh, OK.
Her går det. [POP]
>> Hey, se der.
Nu dereferere værker på y.
Og fordi pointerne deler at en pointee de begge ser 13.
Ja.
Deling, uanset hvad.
Så skal vi til at skifte steder nu?
>> Åh, se.
Vi har ikke mere tid.
>> -But--
>> Bare huske de tre pointer regler.
Number One, den grundlæggende struktur er, at du har en pegepind,
og den peger hen til en pointee.
Men markøren og pointee er adskilte,
og den fælles fejl er at oprette en pegepind,
men at glemme at give det en pointee.
>> Number Two, pegepind dereferere starter ved markøren
og følger sin pilen hen over at få adgang til sin pointee.
Som vi alle ved, er dette virker kun, hvis der er
en pointee, hvilken form for kommer tilbage til Regel nummer et.
>> Nummer tre, pegepind Opgaven har en pointer
og ændrer det til at pege på samme pointee som en anden pointer.
Så efter opgaven, de to pointere
vil pege på samme pointee.
Nogle gange, er der kaldte deling.
Og det er alt der er til det, virkelig.
Farvel nu.
[END VIDEO PLAYBACK]
David J. MALAN: Det er det for CS50.
Vi vil se dig i næste uge.