>> [MUSIK SPELA]
DAVID J. MALAN: Okej.
Detta är CS50, och detta är slutet på vecka fyra.
Och ett av ämnena i dag är det av digital kriminalteknik,
konsten att återvinna information.
Och faktiskt, även om du är mitt
just nu om fred på tre och Breakout, nästa vecka,
Man kommer att fokusera på just detta område.
>> Så en av de coolaste jobb jag någonsin hade var tillbaka i forskarskolan,
när jag arbetade för den lokala Middlesex County District Attorney: s
kontor, gör kriminalteknik fungerar.
Så i huvudsak, Massachusetts Statliga polisen, ibland,
när du arbetar med ärenden skulle ta in saker som hårddiskar
och disketter och minneskort och liknande.
Och de skulle lämna dem till mig och min mentor,
och vårt mål var att hitta bevis, om det fanns någon på dessa medier.
Nu kanske du har sett glimtar i denna värld av kriminalteknik
i media, tv och film.
Men det jobb jag hade, och daresay den världen,
inte riktigt som du skulle se den.
Låt oss ta en titt på vad Du har säkert sett.
[VIDEOAVSPELNING]
-OK.
Nu, låt oss få en bra titt på dig.
>> [MUSIK SPELA]
>> -Vänta Den.
Kör det tillbaka.
>> -Vänta.
Gå höger.
-Där.
Frysa det.
-Full Skärmen.
>> -OK.
Frysa det.
-Tighten Upp på det, kommer du?
>> -Vector In på att killen av bakhjulet.
>> -ZOOM In just här på denna plats.
>> -Med Rätt utrustning, det Bilden kan förstoras och skärpas.
>> Vad är det?
>> -Det Är ett Enhancement Program.
>> Kan du klart att upp någon?
>> Jag vet inte.
Låt oss förbättra den.
>> -Enhance Avsnitt A6.
Jag förbättrade detaljerna, och--
Jag tror att det finns tillräckligt för att förstärka.
Släpp det till min skärm.
>> Jag förbättrade reflektionen i ögat.
-Låt Drivs detta genom videoförbättring.
>> -Edgar Kan du förbättra detta?
>> -Hang På.
>> -Jag Har arbetat med detta reflektion.
>> -Det Finns någons reflektion.
>> -Reflection.
-Det Finns en återspegling av mannens ansikte.
>> -The Reflektion!
-Det Är en reflektion.
-ZOOM I på spegeln.
Du kan se en reflektion.
>> Kan du förbättra bilden härifrån?
Kan du förbättra den?
-Kan Vi förstärka denna?
Kan du förbättra den?
-Vänta En sekund.
Jag ska öka.
-ZOOM I på dörren.
-Tider 10.
-ZOOM.
-Flytta I.
-Mer.
Vänta, sluta.
Stopp.
-Pause Den.
-Rotate Oss 75 grader runt den vertikala, tack.
>> Stopp.
Gå tillbaka till den del om dörren igen.
>> -Har En bildförstärkare som kan bitmapp?
>> -Kanske Vi kan använda Pradeep Singh metod för att se in i fönstren.
>> -Den Programvara är state of the art.
>> -The Egenvärde är av.
>> -Med Höger kombination av algorithms--
>> -Han Taken belysning algoritmer till nästa nivå,
och jag kan använda dem för att förstärka detta fotografi.
>> -Lock På och förstora den z-axeln.
>> -Enhance.
Förbättra.
-Enhance.
-Freeze Och förbättra.
[END VIDEOAVSPELNING]
DAVID J. MALAN: Så de är alla ord, men de var inte
används i meningar på rätt sätt.
Och faktiskt i framtiden, helst snälla, hör du någon säga ordet,
"Öka", skrocka bara lite.
Därför att när du försöker förbättra, till exempel, är det vad som händer.
>> Så här är en underbar bild.
Detta är CS50 egen Daven.
Och anta att vi ville fokusera på glimten i ögat,
eller reflektion av skurk som var klart
fångas av övervakningskamera.
Detta är vad som händer när du zoomar in på en bild som
har endast ett ändligt antal bitar som är förknippade med den.
>> Det är vad du skulle få.
Och faktiskt, i Daven öga är men fyra, kanske sex pixlar
att komponera exakt vad var glimmande där.
Så Problem Set Fyra i slutändan kommer att ha du utforska denna värld, i synnerhet
som på grund av något vi kallar fil I / O, där
i / o är bara ett finare sätt att säger ingång och utgång.
>> Så hittills samtliga interaktioner Vi har haft med en dator
har i stort sett med tangentbordet och skärmen,
men inte så mycket med hårddisken, eller spara filer utöver de som du
själv skriver.
Dina program hittills har inte att skapa och spara,
och uppdatera sina egna filer.
>> Tja, vad är en fil?
Tja, ungefär som en JPEG.
Detta är en bild som du kanske har eller ladda upp till Facebook,
eller se någonstans på webben.
I själva verket, det fotot vi bara Sågen av Daven var en JPEG.
Och vad som är intressant om filer som JPEG-bilder
är att de kan identifieras, typiskt, genom vissa mönster av bitar.
>> Med andra ord, vad är det som skiljer en JPEG från en GIF
från en PING från ett Word dokument från en Excel-fil?
Tja, det är bara annorlunda mönster av bitar.
Och dessa olika mönster är vanligtvis i början av dessa filer.
>> Så att när datorn öppnar ett Word doc eller när en dator öppnar en JPEG,
det ser typiskt vid första flera bitar i filen.
Och om den känner igen ett mönster, den säger, åh, det här är en bild.
Låt mig visa det till användaren som grafik.
Eller, åh, det här ser ut som ett Word-dokument.
Låt mig visa det för användaren som en uppsats.
>> Så till exempel JPEG, visar det sig, är
ganska sofistikerad under huven.
Men de tre första byte i mest varje JPEG börja med dessa tre nummer.
Så byte noll, ett och två är i mest varje JPEG, 255, sedan antalet
216, sedan antalet 255.
>> Och vad kommer du att kunna att börja göra nästa vecka
faktiskt peta nedanför huven på filer som JPEG-bilder
och liksom bitmapp-filer, och ser vad alltid funnits där så länge
som ni har varit med hjälp av en dator.
>> Men vad är det inte normalt skriven som decimaltal som denna.
Datavetare inte tenderar att tala i decimal.
De inte riktigt tala i binärt.
Typiskt, när vi vill att uttrycka siffror,
vi faktiskt använder hexadecimal, som ni kanske minns
från, säg, Problem Set En, som utmanade
dig att tänka på ett annat system.
>> Vi, naturligtvis, känner med decimal, noll till nio.
Vi pratade om binärt.
Och vi har egentligen inte att använda det mycket här
på ut, eftersom datorer kommer att använda den.
Men programmerare kommer mycket Ofta, men inte alltid,
använder hexadecimal, som just innebär du har 16 bokstäver i ditt alfabet,
i motsats till två eller 10.
>> Så hur du räknar till högre än nio i hexadecimal?
Du går 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, bara genom konventionen.
Men vad är nyckeln är att varje av dessa är en enda symbol.
Det finns ingen 10.
Det finns ingen 11, per se, eftersom varje av dina siffror, precis som i decimal
och precis som i binär, bör bara vara en enda karaktär, enligt konvention.
>> Så att då är alfabetet vi har till vårt förfogande för hexadecimal.
Så vad gör en JPEG se ut om du skulle skriva ut dem första tre
bytes inte som decimala men, exempelvis som hexadecimal?
Och varför är hex ens allt det användbart?
>> Tja, en snabb titt på ett exempel.
Så om jag skriver ut de bitar som representera dessa decimal numbers--
detta kan vara lite rostig nu från ett par veckor tillbaka,
men vänster en och rätta är ganska lätt.
255 var det största antalet som vi kunde representera med åtta bitar.
Det var alla ettor.
Så det enda som är milt intressant är den i mitten.
Och om du typ av gör ut math, kommer du dra slutsatsen att, ja,
att mönstret av en och nollor representerar 216.
Så låt oss bara föreskrivas för nu att dessa är korrekta.
Men varför är detta intressant?
>> Tja, ett byte, naturligtvis, är åtta bitar.
Och det visar sig att om du tror av en byte som två bitar av fyra bitar,
så här.
Låt mig bara lägga till lite utrymme.
Så innan, efter.
Jag har precis lagt till några blank för visualisering skull här.
Hur kan vi nu står i, säg, hexadecimal varje quad bitar,
varje uppsättning av fyra bitar?
>> Så till exempel, på den vänstra Nu har vi 1111 i binär.
Vad är det numret i decimal, om du gör ut matten?
Du har de plats, tvåor platsen, de fyra rum, och åttor platsen.
>> PUBLIKEN: 15.
DAVID J. MALAN: Det är 15.
Så om vi gör åtta plus fyra plus två plus ett, får vi 15.
Så jag skulle kunna skriva ner 15 nedan 1111, men hela poängen här
är hexadecimal, inte decimal.
Så istället för att skriva ner 15, 1-5, Jag kommer att skriva det i hex,
som om du tänker tillbaka, om du har noll till f, det som 15 kommer att bli?
PUBLIKEN: f.
DAVID J. MALAN: Så det visar sig att det är f.
Och du kan arbeta ut det genom att säga, Tja, om en är 10, så OK, f 15.
Så ja, kan vi skriva denna samma uppsättning nummer som f f.
Och om vi gör lite matte, vi dra slutsatsen att det är d.
Åtta är ganska lätt, eftersom vi har en i åttor plats.
Och sedan har vi ett par mer f f-talet.
>> Så vad människor tenderar att göra av konvention när de använder hexadecimal är de bara
skriver detta lite mer kortfattat, bli av de flesta som blank.
Och bara för att vara super klart för läsare att detta är hexadecimal,
den enkla konventionen bland människa är du skriver noll
x, som inte har någon annan betydelse än en visuell identifierare,
här kommer en hex nummer.
>> Och sedan sätta dig de två siffrorna, f f i detta fall, då d en, sedan f f.
Så lång historia kort, hexadecimalt bara tenderar
för att vara användbar, eftersom var och en av dess siffror, noll genom f, perfekt linjer
upp med ett mönster av fyra bitar.
>> Så om du har två hexadecimala siffror, noll till F, och om igen,
som ger dig perfekt åtta bitar eller en byte.
Så det är därför den tenderar att vara konventionellt användbara.
Det finns ingen intellektuell innehåll verkligen utöver det,
annat än dess faktiska användbarhet.
>> Nu JPEG är inte den enda filformat för grafik.
Du kanske kommer ihåg att det finns filer så här i världen,
åtminstone från ett par år tillbaka.
>> Så detta var faktiskt installeras i Windows XP
på miljontals datorer världen runt.
Och detta var en bitmapp-fil, BMP.
Och en bitmap-fil, som du ser bredvid vecka, betyder bara ett mönster av prickar,
bildpunkter som de kallas, En karta i bitar, verkligen.
>> Så vad är intressant, dock, om det här filformatet BMP är
att under huven, det har mer än bara tre bytes
att komponera sin header, så att tala, de första bites.
Det ser faktiskt lite komplicerat vid första anblicken.
Och du kommer att se detta i P set.
Och få något särskilt ur detta nu
är inte så viktigt, eftersom bara det faktum att i början av varje bitmap
fil, ett grafiskt format, det finns en massa siffror.
>> Nu Microsoft, författare till detta format,
tenderar att kalla dem saker inte Ints och tecken
och flyter utan ord och d ord och längtar och bytes.
Så de är bara olika datatyper.
De är olika namn för samma sak.
Men du kommer att se att i P Set Four.
>> Men detta är bara för att säga att om en människa dubbelklickar vissa .BMP fil på hans
eller hennes hårddisk, och ett fönster öppnas upp att visa honom eller henne den bilden,
som hände eftersom operativsystemet systemet förmodligen märkte inte bara
den BMP filändelsen i filnamnet,
men också det faktum att det finns en del konvention till mönstret av bitar
i början av denna bitmap-fil.
>> Men låt oss nu fokusera på sådan komplicerad fil,
utan i stället på något sånt här.
Antag här i GEdit jag bara början
av ett program som är ganska enkelt.
Jag har lite ingår upp överst.
Nu har jag # include "structs.h" men Jag ska återkomma till detta strax.
Men detta är användbart för nu.
Så det här är ett program som kommer att genomföra
som registrar databas.
Så en databas av studenter, och varje elev i världen
har ett namn och ett hus och troligen några andra saker, men vi ska hålla det enkelt.
Varje student har ett namn och ett hus.
>> Så om jag ville skriva en program vars syfte i livet
var bara att iterera från noll på upp till tre,
om det finns tre elever vid Harvard University.
Och jag vill bara få hjälp GetString, varje elevs namn och hus,
och sedan bara skriva dem ut.
>> Detta är ungefär som vecka Ett, Vecka två saker nu,
där jag vill bara ha en för loop eller något liknande.
Och jag vill ringa GetString några gånger och sedan skriva ut f några gånger.
Så hur kan jag göra detta, dock, när både ett namn och ett hus
är involverade för varje elev?
>> Så min första instinkt kanske vara att göra något liknande.
Jag skulle först säga, ja, ge mig, säga en array med strängar som kallas namn.
Och jag vill inte ha en hårdkoda tre här.
Vad vill jag sätta dit?
Så att eleverna, eftersom det är bara en konstant deklareras vid toppen,
bara så jag inte behöver hårdkoda tre på flera ställen.
På så sätt kan jag ändra det ett ställe, och det påverkar en förändring överallt.
Och då kanske jag gör sträng inrymmer STUDENTER.
>> Och nu kan jag göra något liknande for (int i = 0; i <STUDENTER, i ++.
Så jag skriver snabbt, men det är förmodligen bekant syntax nu.
>> Och nu, detta var nyare.
Om jag vill sätta i det i: te studentens namn, jag tror att jag gör det här.
Och sedan, inte namn men husen bracket jag.
Jag gör detta, GetString, och låt mig gå tillbaka och rätta till denna linje.
Överens?
Håller inte med?
Det är inte mycket användarvänligt.
Jag har inte berättat för användaren vad som ska göras.
>> Men nu, om jag också ville senare, låt oss
säg, skriva ut dessa saker out-- så TODO senare.
Jag kommer att göra mer med detta-- detta utan tvekan säga
ett korrekt genomförande av få namn och hus, tre
av dem totala antalet av varje, från en användare.
>> Men det är inte mycket bra design, eller hur?
Vad händer om en elev har inte bara ett namn och ett hus, utan även ett ID-nummer,
och ett telefonnummer, och en e-postadress,
och kanske en hemsida, och kanske en Twitter handtag,
och ett antal andra detaljer associerad med en student eller en person,
mer allmänt.
Hur skulle vi börja lägga funktionalitet till det här programmet?
>> Tja, jag känner mig som det enklaste sättet kanske vara att göra något liknande, låt oss säga,
int ids STUDENTER.
Så jag kan lägga alla deras ID där.
Och sedan, efter något som telefonnummer,
Jag är inte säker på hur man representerar det riktigt än.
Så låt oss gå vidare och bara samtal detta twitters STUDENTER, vilket
är lite konstigt, men-- och ett gäng mer områden.
>> Jag har börjat att effektivt kopiera och klistra in här.
Och detta kommer att växa ganska otymplig ganska snabbt, eller hur?
Skulle det inte vara trevligt om det fanns i världen en datastruktur känd
inte som en int eller en sträng, men något högre nivå, en abstraktion, så
att tala, känd som student?
C kom inte med inbyggd funktionalitet för studenter,
men vad händer om jag ville ge det en sådan?
>> Tja, det visar sig, jag ska öppna en fil som heter structs.h här,
och du kan göra just det.
Och vi kommer att börja göra det nu.
Och under huven på P Set Tre, du har redan gjort detta nu.
Det finns inget sådant som en g rect eller en g oval i programspråket C.
>> Folks vid Stanford genomfört de datatyper med hjälp av denna metod här,
förklara sina egna nya uppgifter typer med ett nytt sökord
kallas struct och en annan en som heter typedef.
Och faktiskt, även om syntaxen ser lite annorlunda saker
vi har sett tidigare, principen, det är super enkelt.
>> Det betyder bara "definiera en typ."
Det kommer att bli en struktur och en struktur
är precis som en container för flera saker.
Och den strukturen kommer att ha en sträng som heter namn,
och en sträng som kallas hus.
Och låt oss kalla, bara för bekvämlighet, denna hela datastrukturen student.
>> Så fort du kommer till semikolonet, har du nu
skapat en egen uppgifter typ kallas studenten
som nu står vid sidan av int, och flyta, och röding, och snöre,
och g rekt, och g oval, och valfritt antal av annat folk har uppfunnit.
>> Så vad är nyttigt om det här nu är att om jag går tillbaka
att struct 0 och avsluta detta genomförande, som jag skrev
i förväg här, märker att alla av den oundvikliga messiness att
var på väg att börja hända som jag lagt telefonnummer och kvittrar och allt
dessa andra saker till en elevs definition,
nu är det kortfattat insvept som bara en samling av elever.
>> Och var och en av de studenter nu har flera saker i den.
Så att bara lämnar en fråga.
Hur får man vid namn, och huset, och ID,
och allt annat är insidan av studenten?
Super enkelt, liksom.
Ny syntax, men en enkel idé.
>> Du kan helt enkelt index i gruppen, som vi gjorde förra veckan och det här.
Och vad är klart ny bit av syntax?
Bara., Som betyder "gå in i struktur och få fältet kallas
namn, får fältet kallas huset, få fältet kallas student. "
>> Så i P Set tre, om du är arbetar fortfarande på det,
och de flesta människor fortfarande är, inse att du
börja använda saker som g rättar och G ovaler
och annat som inte verkar kommer från vecka noll, ett eller två,
inser att det är för att Stanford förklarade några nya datatyper.
>> Och faktiskt, det är precis vad vi ska gör, liksom, i P Set Four, då
vi börjar ta itu med saker och ting som bilder, bitmappar och mer.
Så det är bara en teaser och en mental modell för vad som komma skall.
Nu procrastinated jag lite i morse.
Jag var lite nyfiken på vad Microsoft tapeten faktiskt
ser ut idag.
Och det visar sig att någon under 2006 faktiskt gick till nästan exakt
samma plats för att fotografera i verkligheten vad som ser ut som att dessa dagar.
Fältet är nu lite övervuxen.
>> Så talar nu av bilder, Låt oss föra tillbaka Daven hit
på skärmen och Nicholas, och bara påminna dig
att om du vill gå med oss ​​för lunch denna fredag, chef till vår vanliga webbadress
här.
>> Så där gjorde vi lämnar ut på måndag?
Vi införde det här problemet, eller hur?
Det var till synes en korrekt genomförande av swap,
där du tar två Ints, man kallas, som kallas B,
byta dem, precis som Laura gjorde här på scen med mjölken och vattnet,
genom att använda en temporär variabel, eller en tom kopp,
så att vi kunde sätta b på en och en i b utan att göra en enda röra av saker.
Vi använde en variabel.
Det kallas temp.
>> Men vad var det grundläggande Problemet med denna kod på måndag?
Vad var problemet här?
Yeah.
>> PUBLIK: Det tar mer plats.
>> DAVID J. MALAN: Tar mer utrymme, eftersom jag använder en variabel,
och det är OK.
Det är sant, men jag är kommer att säga det är OK.
Det är bara 32 bitar i den stora tingens ordning, så inte en stor sak.
Andra tankar?
PUBLIK: Det byter bara variablerna lokalt.
DAVID J. MALAN: Exakt.
Den byter bara variablerna lokalt.
Eftersom varje gång du ringer ett function-- när jag hade magasinen från Annenberg
förra gången, har du huvud på botten.
Så fort du kallar en funktion som kallas swap innebär swap inte x och y,
de ursprungliga värdena.
Vad swap get, vi påstår?
Publik: Kopior.
DAVID J. MALAN: Så kopior av dem.
Så det blir ett och två, om du minns exemplet från förra gången,
men en kopia av en och två som framgångsrikt bytt.
Men tyvärr i slutändan, dessa värden är fortfarande samma.
Så vi kan se det med våra nya vän, förhoppningsvis GDB,
att du eller TF och Ca oss ha varit vägledande dig mot enligt följande.
>> Så ingen swap minns ser like-- låt oss öppna upp detta-- ser ut så här.
Vi initierade x till en, y till två.
Hade en massa utskrifts f-talet.
Men sedan, samtalsknappen här var att byta, vilket
är precis den kod som vi såg bara en stund sedan.
Vilket är korrekt vid första anblicken, men funktionellt,
Programmet fungerar inte, eftersom den inte permanent byta x och y.
>> Så låt oss se detta, en snabb varm upp här med GDB, en ./noswap.
Ett gäng överväldigande information som Jag ska bli av med kontroll L för nu.
Och nu ska jag gå vidare och köra den.
Och tyvärr, det var inte så användbart.
Det körde programmet insidan av denna program som heter GDB, en debugger,
men det gjorde inte låta mig rota runt.
>> Så hur kan jag faktiskt pausa exekvering inne här programmet?
Så sönder.
Och jag kunde bryta på någon radnummer, en, 10, 15.
Men jag kan också bryta symbol genom att säga break.
Och det kommer att ställa in en paus punkt, som synes på rad 16 i huvud.
Och var är linje 16?
Låt oss gå upp till koden och gå upp till noswap.
Och faktiskt är linje 16 den allra första i programmet.
>> Så nu, om jag går vidare och typ köra den här gången, Enter, pausade den.
Så låt oss rota runt.
Skriv x-- varför är x noll?
Och ignorera dollartecken.
Det är bara för snyggare användning av programmet.
Varför är x noll just nu?
Yeah.
>> PUBLIK: Det pausade precis innan linje 16, i själva verket inte på ledningen 16.
DAVID J. MALAN: Exakt.
GDB, som standard, har pausat utförande precis innan linjen 16.
Så det har inte utföras och vilka betyder x är av något okänt värde.
Och vi hade tur att det är något rent som noll.
Så nu om jag skriver nästa, nu det exekveras 16.
Det väntar på mig att köra 17.
Låt mig gå vidare och skriva ut x.
Det är en.
Låt mig gå vidare och skriva ut y.
Vad ska jag nu?
>> PUBLIK: [ohörbart]
>> DAVID J. MALAN: Lite högre.
>> PUBLIK: [ohörbart]
DAVID J. MALAN: Inte riktigt samförstånd.
Så ja, vi ser några sopor värde.
Nu, y är 134514064 där.
Tja, det är bara några sopor värde.
Mitt program använder RAM för olika ändamål.
Det finns andra funktioner.
Andra människor skrev i min dator.
Så dessa bitar har använts för andra värden, och vad jag ser
är resterna av en del före användning av detta minne.
>> Så ingen big deal, för så fort när jag skriver nästa och sedan skriva ut y,
det initieras till det värde som jag vill ha.
Så nu, låt oss gå vidare lite snabbare.
N för nästa.
Låt oss göra det igen.
Men jag vill inte träffa det här, för om jag
vill se vad som händer inuti av swap, vad är kommandot?
>> PUBLIKEN: steg.
>> DAVID J. MALAN: steg.
Så detta steg mig till en funktion, snarare än över den.
Och nu, det är lite kryptiskt ärligt, men detta är bara
säger jag är i linje 33 nu.
Och låt oss göra detta igen.
Tryck temp.
Garbage värde, negativt den här gången, men det är bara ännu en soptunna värde.
Så låt oss göra härnäst, skriv ut temp.
Det initieras till 1, vilket var värdet av x, aka en.
>> Nu, var är vår A och X kommer från?
Tja, varsel viktigaste, vi kallas dessa värden x och y.
Vi passerade dem sedan att byta enligt följande.
X kom först, kommatecken y.
Och då kunde swap kalla dem x och y.
Men för tydlighetens skull, det är kalla dem a och b.
Men a och b ska nu bli kopior av x och y, respektive.
>> Så om jag går tillbaka till GDB, temp är nu ett och ett är nu en.
Men om jag gör nästa och nu gör print a, har en redan flyttats över.
Har hällt Mjölken till fd apelsinjuice glas, eller vice versa.
>> Och om jag gör nästa gång, och nu Om jag skriver ut som en sanity check,
a är fortfarande två, men b är nu en.
Ärligt talat, det är fortfarande där.
Jag bryr mig inte vad temp är.
Men så fort jag nu skriver, låt oss säga, fortsätta att gå tillbaka, nu är jag i slutet
programmet.
Och tyvärr, är x fortfarande ett och y är fortfarande två.
>> Så vad var nyttan av GDB där?
Det hjälpte inte mig att fixa problemet i sig,
men förhoppningsvis hjälpa mig förstå det genom att inse
att ja, min logik rätt, men min kod är inte senare få
en permanent effekt.
Så det är ett problem vi är ska nu lösa idag.
>> Men låt oss komma dit med hjälp av detta.
String är en lögn.
Det också, inte en datatyp som existerar i C. Det är
varit en synonym för vissa tid för något annat,
och vi kan avslöja att såsom följer.
>> Låt mig gå vidare och öppna upp ett program som kallas jämför-0.
Och i stället för att skriva det här ett ut, vi börjar gå igenom koden
Jag skrev redan, men det är bara några få rader.
Så detta är jämför-0.
Och det första jag gör är att få en textrad.
>> Men lägg märke till vad jag är gör för första gången.
Vad är annorlunda helt klart om linjen 21?
Faktiskt, vänta lite.
Det här är kopia två.
Det är inte ens rätt program.
Okej, spoiler alert.
Okej, så strunt i det.
Det är svaret på en framtida fråga.
>> Här är jämför-0, och jag är på väg att få en textrad.
Programmets mycket enklare.
Så detta är enkel.
Detta är som vecka ett, Vecka två saker tillfället. string s = GetString.
Nu, jag säger det igen här nere.
string t = GetString.
Och sedan, det sista i denna Programmet, som namnet antyder,
är jag ska försöka jämföra dem.
>> Så om s, den första strängen, lika = t, så jag är
kommer att säga att du skriver samma sak.
Annars kommer jag att säga du skriver olika saker.
Så låt oss kompilera och köra programmet.
Så gör jämför noll.
Ser bra ut.
Inga kompileringsfel.
>> Låt mig gå vidare nu och skriv ./compare-0.
Låt mig gå vidare och säga något : Daven och något: Rob.
Och jag skriver olika saker.
Så långt är allt väl.
Programmet verkar vara korrekt.
>> Men låt oss köra den igen.
Säg något: Gabe.
Okej.
Kanske slog mellanslag eller något funky.
Låt oss göra det igen.
Så Zamyla.
Zamyla.
Olika saker.
Så vad är det som händer?
>> Så vi har dessa två linjer i kod, GetString kallas två gånger.
Och då är jag helt enkelt försöker jämföra s och t.
Men det som verkligen då som händer?
Tja, min handstil är på väg att slakta detta exempel något.
Och låt oss faktiskt kasta upp detta här, liksom.
>> Så vi har en rad som string s = GetString.
Så det är helt enkelt den första intressant linje från det programmet.
Men vad hela denna tid har varit händer under huven?
Jo, på vänster sida är sträng, som är någon typ av variabel,
och det kallas är.
Så jag vet att detta är att använda minnet, eller RAM i min dator på något sätt.
Så jag ska abstrakt rita det som en kvadrat.
32 bitar, visar det sig, men mer om det i framtiden.
Och sedan, är det som händer här?
>> Tja, uppenbarligen getString blir en sträng från användaren.
Och GetString fick Zamyla eller Gabe eller Daven.
Så låt oss välja det första av dem, som var Daven.
Så effektivt, fick vad GetString mig i det första fallet var D-a-v-e-n.
Och sedan, vad gjorde Det ger mig i hemlighet?
PUBLIK: [ohörbart]
DAVID J. MALAN: Ja, på / 0 eller null karaktär.
Så det effektivt gav mig en sträng.
Men vi vet redan från tidigare ser att en sträng är bara en array
tecken, och det sägs upp av denna speciella sentinel karaktär / 0.
>> Men om detta är sant och detta är en kvadrat,
Detta är helt klart en mycket större rektangel.
Och faktiskt, det här, Jag hävdar, endast 32 bitar.
Och det är klart mer än 32 bitar, eftersom detta är förmodligen
åtta plus åtta plus åtta plus åtta plus åtta,
bara på grund av byte i ASCII.
Hur sjutton ska vi passa Daven in i denna lilla ruta här?
>> Nå, vad GetString egentligen gör?
Tja, här är detta galler datorns minne eller RAM.
Så låt oss godtyckligt säga att om var och en av dessa representerar en byte,
då kan vi tänka på varje byte som har en adress,
som 33 Oxford Street, eller 34 Oxford Street, eller 35 Oxford Street.
>> Så precis som hem har adresser och byggnader har adresserna,
så gör enskilda byte av minne har adresser eller nummer
som unikt identifierar dem.
Nu är det godtyckligt.
Men för att hålla det enkelt, jag ska använder hexadecimal bara genom konventionen,
men 0x betyder ingenting annat än "det här är hexadecimal."
och jag kommer att hävda att "D" hamnar på byte One i minnet.
>> Jag har inget annat händer i minne, så Daven fick första plats
vid byte One.
Detta är alltså kommer att vara 0x2.
Det här kommer att 0x3.
Detta kommer att vara 0x4.
Det här kommer att 0x5.
Detta kommer att vara 0x6.
>> Men när du börjar tänka om vad datorns görandet
under huven, du kan börja att sluta
hur ni, för några år sedan, skulle har genomfört C själv.
Vad är GetString förmodligen returning-- eftersom det
känns som det inte är vänder Daven, per se,
för att han säkert inte kommer att passa in i denna lilla box--
så vad är GetString förmodligen återvänder?
>> PUBLIK: [ohörbart]
>> DAVID J. MALAN: Placeringen av Daven.
Och det har varit att göra detta ända sedan Vecka One.
Vad GetString är verkligen vänder inte är en sträng, per se.
Det är en av de små vita lögner.
Det är att returnera adressen för sträng i minnet, den unika adressen.
Daven bor på 33 Oxford Street.
Men mer koncist, Gavin lever på 0x1, Adress Number One.
>> Så vad får sätta in detta liten låda då, att vara tydlig,
är bara adressen till den strängen.
Så hela den här tiden, det här har pågått.
Men vad detta antyder nu är att om alla s har
är ett tal inne i det, som är att stoppa dig, programmerare,
från att sätta någon siffra i eventuell rörlig och bara hoppa
till den del av minnet?
Och faktiskt, vi får se det är ett hot nästa gång.
>> Men för tillfället känns det inte tillräckligt.
Om jag säger, ge mig ett sträng, du ger mig Daven.
Men du vet inte riktigt ge mig Daven.
Allt du ger mig är Daven adress.
Hur vet jag då säkert där Daven börjar och ends--
berättelsen börjar bli weird-- där Daven börjar och slutar,
och sedan, nästa sträng i minnet börjar?
>> Tja, om du lämna mig i början av Daven,
huvudsak, hur vet jag där i slutet av hans namn är?
Denna särskilda null karaktär, som är desto viktigare nu
Om strängarna på undersidan av huven helt enkelt identifieras
unikt genom sitt läge i minnet.
Så hela den här tiden, det är vad som har pågått.
>> Så när vi tittar nu på koden här, förklarar
Om du skulle buggen i linje 26.
Varför är Zamyla och Zamyla annorlunda?
Varför är Gabe och Gabe annorlunda?
Ja, i ryggen.
>> Publik: De har olika adresser.
>> DAVID J. MALAN: Helt enkelt därför att de har olika adresser.
För när du ringer GetString igen, vilket jag ska göra snart här,
om detta är den andra raden, sträng t, som jag gjorde i det programmet,
lika annat samtal till GetString.
Nästa gång jag ringer GetString, jag ska
att få en annan bit av minnet.
>> GetString tillåts att fråga den operativa
systemet för mer och mer minne.
Det kommer inte att återanvända samma sex bytes varje gång.
Det kommer att få en ny bit av minnet, vilket
innebär t kommer att få något annat värde här.
>> Så när jag gör er lika = t, du är inte att jämföra
D mot detta och A mot detta och V mot detta.
Du jämför det här mot detta, vilket
sagt är ganska useful-- useless-- är ganska meningslöst, eftersom som verkligen
bryr sig om strängarna är i minnet?
>> Och faktiskt, det har vi inte.
Och vi kommer inte att börja särskilt omtänksam.
Endast i den mån fel kan uppstå och säkerhetshot kan uppstå vilja
vi faktiskt börjar bry sig om detta.
Så låt oss fixa detta problem.
Det visade sig, att du fixa det super enkelt.
>> Och låt oss faktiskt, innan jag avslöjar det igen, vad skulle
du göra om i ett CS50 klass, och du var tvungen att genomföra
en jämförelse mot två strängar.
Du tydligt kan inte bara använda er lika = t.
Men bara logiskt, hur skulle du jämföra den här strängen
mot denna sträng med C-kod?
Yeah.
>> PUBLIK: Bara gör det för återkoppling [ohörbart]
DAVID J. MALAN: Perfect.
PUBLIK: [ohörbart]
DAVID J. MALAN: Ja.
Bara använda en for-loop eller ett while-slinga eller något annat.
Men bara att tillämpa den grundläggande tanken att om Detta är en bit av minne eller en matris
och detta är, iterera över båda på samma gång.
Och bara jämföra bokstäverna.
>> Och du måste vara en lite försiktig, eftersom du
vill inte ha ett finger att gå förbi den andra
eftersom en sträng är längre än den andra.
Så du kommer att vilja kontrollera detta särskilt värde i slutet, null.
Men det är verkligen, i slut, så enkelt är det.
Och ärligt talat, behöver vi inte uppfinna det hjulet.
Här är version två.
Och vad jag ska säga här är att stället för att jämföra er lika = t,
Jag stället ska säga, om sträng jämförelse av s kommatecken t är lika med = 0.
Nu, vad sträng jämföra?
>> Det visar sig, det är en funktion som kommer med C, vars syfte i livet
är att jämföra två strängar.
Och rör jämföra, om vi läser det man-sidan eller dokumentation eller CS50
referens, kommer det helt enkelt säga att uppståndelse
jämföra avkastningen antingen en negativ nummer eller ett positivt tal eller noll,
där noll betyder att de är lika.
>> Så bara gissningar.
Vad kan det betyda om omröras jämför avkastning
negativt värde eller positivt värde?
Publik: Större än eller mindre än.
DAVID J. MALAN: Ja, större än eller mindre än.
Så om du vill sortera en hel gäng strängar i en dictionary--
som vi kommer så småningom ner road-- perfekt funktion att använda potentiellt,
eftersom det kommer att göra det jämförelse av strängar för dig, och berätta
du gör ett kommer före b, eller gör b kommer före ett alfabetiskt.
Vi kan göra just det.
>> Och märker att jag gjorde en annan sak i det här exemplet.
Vad har förändrats högre upp i denna huvudfunktion?
Char *.
Och detta är den andra vit lögn.
Hela denna tid, när du har skrivit sträng,
Vi har i hemlighet skriva sträng som char * så att klang faktiskt
förstår dig.
>> Med andra ord, i CS50.h och som vi så småningom får se,
Vi gjorde en synonym heter sträng det är samma sak som char *.
Och nu, vet bara att den *, I detta sammanhang åtminstone
betyder adressen.
>> Adressen till vad?
Jo, det faktum att jag sa char *, och inte int * eller flyta *,
innebär att char * är adressen till en röding.
Så denna lilla ruta här, aka sträng, är verkligen av typen char *,
som helt enkelt är ett finare sätt att säga, i den här rutan kommer att gå en adress.
Och vad betyder den adressen hänvisar till?
Tydligen en röding.
>> Men vi kunde absolut har int * och andra saker.
Men för tillfället är char * verkligen den mest okomplicerad och en av intresse.
Så detta problem går att stiga, men, återigen.
>> Anta att jag öppnar programmet.
Låt oss se om nu kan vi förutsäga Vad är fel med denna kod.
Så i det här programmet, kopiera-0, jag är kommer att gå vidare och åter ringa
GetString och lagra värdet i er.
>> Och sedan, varför gör jag detta, precis som en påminnelse från veckor tidigare?
Vi gjorde säga att GetString ibland returnerar null.
Vad betyder det om GetString returnerar null?
Något gick fel.
Det betyder förmodligen strängen är för stora, datorns ur minnet.
Det händer super, super, super sällan, men det kan hända.
Vi vill kontrollera om det, och det är allt vi gör.
>> Eftersom vi får se nu, om du inte börja kontrollera vanliga saker
som null, kanske du faktiskt börjar gå
till adresser i minnet som är ogiltiga.
Och du kommer att börja att framkalla fler och fler segmenteringsfel.
Eller i en Mac eller en PC, precis att bringa en dator att hänga
eller ett program för att frysa, potentiellt.
>> Så nu, jag hävdar i kopierings 0.c, att jag tänker kopiera dessa strängar genom
i linje 28.
Och då kommer jag krav på botten
här att jag ska att byta en av dem.
>> Så märker detta.
Jag ringer vår gamle vän strlen.
Och bara förklara på engelska vad denna linje 34 gör?
Vad t fäste 0 representerar till vänster.
Yeah.
>> PUBLIK: Första karaktär t?
DAVID J. MALAN: Första tecknet på t.
Det är allt.
Första tecknet på t, jag vill ha att tilldela versaler version
för det första tecknet i t.
Så detta är kapitalisera den första bokstaven.
Och sedan, det allra sista jag gör i detta program är att jag påstår här är
originalet, s, och här är kopian, t.
>> Men baserat på berättelsen vi bara berättade om vilka strängar egentligen är,
vad som är linje 28 egentligen gör, och vad som är
den erhållna bug gå att vara på skärmen?
>> Så först, den första frågan, 28.
Vad string t = s egentligen gör?
Om vi ​​har på den vänstra sida här string t = s;
det ger mig en låda här och en låda här.
Och anta denna adress är 0x, låt oss säga, 50 den här gången, godtyckligt.
Vad string t = s gör under huven?
>> PUBLIK: [ohörbart]
>> DAVID J. MALAN: Den lagrar minnet adress där, så 0x50 går där.
Så om nu, jag går till den första karaktär i t och versaler den,
vad ska jag göra på ett effektivt sätt att s?
Jag är verkligen gör samma sak, eller hur?
För om Adress 0x50-- och bara jag har inte mycket utrymme på bordet här,
men antar att det är 0x50 här nere, någonstans i datorns minne.
>> Och jag har, till exempel, Gabe i gemener här, som den här.
Och jag har sagt t fäste 0 blir aktiverade.
Tja, t fäste 0 den första bokstaven i t.
Så lite g ska blivit big G. Men problemet
är, vad betyder s också peka på?
>> Publik: Samma.
>> DAVID J. MALAN: Samma exakta sak.
Så en enkel förklaring kanske, även om syntaxen är lite konstigt.
Så låt oss göra det här.
Gör copy-0 och sedan ./copy-0.
Säg något: Gabe.
Och tyvärr, båda dem har nu aktiverats,
men för det underliggande Anledningen till att vi är helt enkelt
Nu behandlar adresser.
>> Så hur ska vi börja address-- no pun intended--
hur börjar vi ta itu med detta problem?
Tja, i copy1.c, går det för att få lite mer komplicerat.
Men jag skulle göra anspråk på en konceptuellt enkel lösning.
>> Så svårt att få vid första anblicken.
Kommer inte att bli lätt för den första gång du skriver ut det, kanske,
men om problemet är att helt enkelt göra t = s bara
kopierar adressen, vad, igen om jag kan plocka på dig,
kommer att vara lösningen för att faktiskt kopiera en sträng?
>> PUBLIK: Vi kommer förmodligen använda en loop igen.
>> DAVID J. MALAN: Ja.
Så vi kommer att behöva en slinga igen.
Och för om vi vill kopiera en sträng s in i en annan sträng,
vi förmodligen vill göra det tecken för tecken.
Men problemet är, om detta är ursprungligen s,
Nu måste vi explicit starta allokera minne för t.
>> Med andra ord, låt oss rita ut en sista gång.
Om detta är sträng s = GetString.
Och låt oss sätta upp detta här, liksom.
Detta är GetString.
Och sedan, bilden för något så där kommer att bli som förut,
g-a-b-e / 0.
Det ser lite ut så här.
Och s Därför kallar vi det 0x50, och det kommer att bli 51, 52.
>> Så det här är 0x50.
Och sedan, jag sträng ton.
Till minne, är det bara att ge mig ett litet torg som denna.
Så vad är nyckeln steget nu?
Om jag vill kopiera s in t, vad tom behöver vi för att fylla i här?
Eller vad behöver vi gör på en hög nivå?
Yeah?
Någon?
Yeah.
>> PUBLIK: Vi måste [ohörbart].
DAVID J. MALAN: Ja, vi behöver fylla i det här ämnet.
Jag kan inte kopiera och sedan kapitalisera Gabe namn
tills jag ber operativsystemet för en annan bit av minnet
som är minst lika stor som originalet.
Så det lämnar oss med en fråga.
>> Hur får jag be operativsystemet inte bara för en enkel liten pointer--
som det kallas, en adress, ett pointer-- inte
för en enkel liten låda som detta kallas ett snöre?
Hur får jag be operativsystemet system för en stor bit av minnet?
Hittills har jag bara fått det tillbaka indirekt genom att ringa GetString.
Så hur är GetString även få sitt minne?
>> Tja, det visar sig att det finns denna andra funktion här
att vi nu ska börja använda.
Nu ser det mycket mer kryptiska than-- och jag är den enda som kan se den--
denna linje ser mycket mer kryptisk då det ska vid första anblicken.
Men låt oss retas isär.
>> På den vänstra sidan, jag har char * t.
Så i engelska, låt oss börja att formulera ordentliga meningar i teknisk jargong.
Så detta avsätter en variabel av typen char * kallas t.
Nu, vad betyder det egentligen?
>> Jo, det betyder, vad ska jag att sätta in denna variabel kallas t?
En adress för en röding.
Så det är bara enklare, rimligare sätt
att beskriva den vänstra sidan.
Så det skapar rutan här bara.
Så den högra sidan, förmodligen, kommer
att fördela det större bit av minnet hur?
Så låt oss retas här isär.
>> Den överväldigande vid första anblicken, men vad som händer här inne?
Först är det malloc, vilket är tydligen vår nya vän,
"Minne fördela."
Så detta är det argument som passerat in i den, så det är ett ganska stort argument.
Så låt oss retas här isär.
>> strlen av ar, naturligtvis, representerar i--
Publik: Antalet tecken.
DAVID J. MALAN: Bara antalet tecken i er.
Så längden s, den ursprungliga strängen.
Så G-a-b-e.
Så det är nog fyra i det här fallet.
Varför gör jag en efter ringa strlen av s?
PUBLIK: [ohörbart]
David J. MALAN: För att speciell nolltecken.
Om du frågar mig vad är längden på Gabes namn, ska jag säga fyra.
Under huven, men, jag behöver det femte byte för null karaktär.
Så det är därför jag gör en.
>> Nu i fall du kör det här program på en annan än dator, säger,
den CS50 apparaten, där storleken på en röding
kan vara olika från min egen computer--
visar sig att jag kan kalla detta operatörs sizeof, fråga bara datorn,
vad som är storleken på en char på den här datorn?
>> Och genom att multiplicera fem i detta exempel av storleken på en röding, som
på de flesta datorer kommer bara vara en, malloc
kommer att fördela för mig den här stora bit av minnet över här till höger.
Och det kommer att return-- det är en function-- så det är
kommer att återvända till mig vad?
PUBLIK: Adressen?
DAVID J. MALAN: Adressen till vad?
PUBLIK: Av minnet det fördelas?
DAVID J. MALAN: Av minnet är tilldelade.
Så jag har ingen aning, ärligt talat, när detta kommer att sluta.
Jag kommer att föreslå att det kommer att hamna på 0x88.
Helt godtyckligt, men andra än 0x50 någonstans,
eftersom operativsystemet, vad Windows och Mac OS gör för mig, är
se till att det ger mig olika bitar av RAM.
>> Så detta är värdet där denna bit av minnet kan hamna.
Så det här är vad som hamnar här, 0x88.
Så nu klart, jag kan förstå att detta inte är samma som det,
eftersom de är riktade mot olika bitar av minnet.
Så om jag nu verkligen vill kopiera i, låt oss göra din föreslagna lösning.
>> Låt oss bara gå, skapa en for-loop, och gör t fäste jag blir s fäste i.
För nu kan jag använda denna matris-liknande notation,
för även om malloc mycket generiskt allokerar mig minne,
minnet är bara angränsande bitgrupper.
Byte, byte, byte, rygg mot rygg mot rygg.
>> Jag kan säkert som programmerare behandla det som en array, vilket
betyder att jag kan använda det här till slut bekant notation av bara några hakparenteser.
>> Så låt mig göra en paus där, eftersom detta är ett mycket allt på en gång, till och med
men den grundläggande idén att sammanfatta är att strängen, hela tiden,
är inte en ny datatyp per se.
Det är bara en så kallad pekare, en adress för ett tecken,
vilket bara betyder att det är ett nummer att genom mänsklig konvention
vi tenderar att skriva som 0x något.
>> Men det är bara en siffra, som 33 Oxford Street,
som råkar vara den CS byggnadens adress.
Eventuella frågor om dessa uppgifter?
Yeah?
>> PUBLIK: Varför måste vi kolla för t lika med noll?
>> DAVID J. MALAN: Varför måste vi kontrollera om t är lika med noll?
Om vi ​​läser documentation-- stor question-- för malloc,
det kommer att säga i finstilta, ibland malloc kan returnera null,
precis som GetString.
Och faktiskt, återvänder GetString null om det i sin tur returnerar malloc null,
eftersom GetString använder malloc.
>> Och som skulle kunna hända om OS Mac OS, Windows, vad som helst, är helt enkelt
slut på minne för dig.
Så det är vad som hände där.
>> Och låt mig avslöja en annan sak som kanske bara blåsa dig
eller helt vara alltför långt över linjen.
Men låt mig dra upp samma för slinga för kopiering,
som nyss var återkallande detta. t fäste jag blir s fäste i.
>> Trevligt och användarvänliga.
Känns som Vecka två igen.
Men denna version kan faktiskt vara skrivas om som detta, som ser kryptisk.
Det är en teknik som kallas pekare aritmetik, adress aritmetik.
Men varför fungerar det?
>> Nu irriterande, den författarna C beslutat att använda
symbolen * för olika ändamål.
Vi har sett det användas en gång redan, char *, som betyder "ge mig en variabel
som kommer att innehålla adressen till en röding. "
Så char * i det sammanhanget betyder "ge mig en variabel."
>> Tyvärr, om du använder * utan ett ord på framsidan av det, som röding,
det nu kallas dereference operatör.
Och vi får se mer av detta inom kort.
Men det betyder bara "gå dit."
Det är som att säga, om någon gav mig på ett papper "33 Oxford Street,"
om jag gör "* 33 Oxford Street," det betyder "Gå vägen till CS byggnaden."
>> Så * betyder bara åka dit om det finns inget ord framför den.
Så vad är t, att vara tydlig?
t är adressen för den bit av minne som gavs tillbaka till mig.
s är adressen till vilken, för att vara tydlig, i exemplet som vi har diskuterat,
av gemener gabe?
s är den adress of--
AUDIENCE: Strängen.
DAVID J. MALAN: Av Gabe ursprungliga namn.
Så det är adressen till denna bit av minnet.
Så om jag säger t + Jag-- i, varsel, är bara vår gamla vän.
Det är bara en indexvariabel som är iteration från noll om upp
till längden på strängen ar.
Så det kommer att bli noll, då man, sedan två, sedan tre, sedan fyra.
Så låt oss sätta ihop dessa nya Scratch-liknande pusselbitar, om ni så vill,
trots att, återigen, syntaxen är mycket mer svårbegripliga än Scratch.
Så t är en adress + Jag kommer att ge mig
ett nummer, eftersom dessa är alla siffror som vi har teckning som hex.
Men de är bara siffror.
>> Så om adressen t vi sagt var 0x88, vad är 0x88 plus noll.
Även om du inte är bekväm med hex ännu, ta en gissning.
>> PUBLIK: Det ursprungliga.
>> DAVID J. MALAN: Fortfarande 0x88.
Så vad betyder * 0x88 detta?
Det betyder, "gå dit", vilket innebär effektivt, "sätta fingret här."
Och nu på höger sida av detta uttryck, * och sedan i parens,
s + i betyder s, vilket är den adressera upp här i den lilla g.
s + 0 är, naturligtvis, s, oavsett s är.
>> Så nu är det * s, vilket precis som * 33 Oxford Street betyder gå till adressen
ar.
Så här är det finger, höger hand.
Så vad ska jag kopiera i vad?
Grejen till höger, vilket är gabe, lilla g här, in på här.
>> Och så effekten av detta första iteration av slingan,
som ni föreslog, även om det ser galen mer komplicerat än vad som helst
vi har sett tidigare, är helt enkelt att säga gå hit och kopiera tecknet här.
Det ger dig en karta till båda platserna.
>> Och vi får se mycket mer av det här.
Men för tillfället är hoppet bara för att introducera några av dessa grundläggande idéer.
Och faktiskt, låt oss titta på en sista program här,
och sedan den utlovade claymation, vilket kommer att göra allt bra.
Okej.
Så låt mig öppna up-- där vi går.
Så låt mig-- vi ska återkomma till den här bilden snart.
Låt mig öppna upp denna sista exemplet här.
>> Så här är en super, super program som åstadkommer
ingenting i livet som gör följande.
Den förklarar först två variabler, x och y, som inte är siffror den här gången,
per se.
De är inte heltal, per se.
De är tydligen int *.
Så vem som helst, vad betyder det om din datatyp, din variabel,
är av typen int * stjärna?
Det är adressen till en int.
>> Så jag har ingen aning om var det är än.
Det betyder bara "sätta, så småningom, adressen till en int här. "
0x50, 0x88, oavsett var det är i minne, är en adress kommer det.
Och det är vad y är kommer att bli, liksom.
>> Om jag nu säger x = malloc (sizeof (int)), Detta är ett finare sätt att säga,
hey operativsystem, via malloc, ge mig tillräckligt med minne för storleken
av en int, vilket förmodligen kommer att vara 32 bitar eller fyra byte.
>> Så vad betyder malloc tillbaka?
Malloc returnerar en adress.
Så vad som kommer att få lagras i x?
Adressen till bit av minne, de fyra byte, malloc som
just hittat för mig genom att fråga operativsystemet.
>> Nu under tiden, linje fyra här, * x = 42.
Bara för att vara tydlig, vad som händer där nere?
På vänster sida, * x.
det är som * 33 Oxford Street.
Så * x betyder vad?
>> PUBLIK: Gå till.
>> DAVID J. MALAN: Gå till den adressen.
Varhelst denna bit av minnet är, gå till det.
Och sätta vad där, självklart?
Publik: 42.
David J. MALAN: 42.
Okej, * y, samma idé.
Gå till adressen i y.
Sätt nummer 13 där, men vad är y just nu?
PUBLIK: Det finns inget minne för y.
David J. MALAN: Det är inget minne för y.
Så vad gör y förmodligen innehåller, som vi har sagt?
>> PUBLIKEN: sopor.
>> DAVID J. MALAN: Vissa sopor värde.
Nu är skräp värde fortfarande ett antal.
Det kan fortfarande misstas för en adress.
Det är som om någon klottrat något nedåt,
och jag misstolkat det på så sätt vissa byggnad på gatan.
Och om du bara försöka att gå in vissa byggnad som du inte äger,
eller någon bit av minne du har inte varit given, kan dåliga saker hända.
Dator kan krascha, eller någon annan obestämd beteende kan hända.
>> Så introt då att Binky är här.
Jag minns fortfarande, 20 några udda år senare,
där jag var när jag äntligen förstod pekare.
>> Vilket betyder att om du lämna här på tre minuter
och tror att jag inte förstå pekare, inser
Jag har ihågkommen för 20 år för någon galen anledning
när och varför det äntligen sjunkit i, sitter med min undervisning
karl, Nishat Mehta i baksidan av Eliot Dining Hall.
Nu har jag mindes detta eftersom detta var
ett av de ämnen jag, i Särskilt kämpade med.
Och sedan, det äntligen klickade, som jag vågar säga en massa ämnen
så småningom kommer.
Och nu, för att göra det känner alla gladare och desto mer övertygande,
låt oss ta en sista titt i vår sista tre minuter här på Binky,
från vår vän, Nick Parlante från Stanford.
>> [VIDEOAVSPELNING]
>> Hej, Binky.
Vakna!
Det är dags för pekaren kul.
>> Vad är det?
Lär dig mer om pekare?
Åh, goody!
>> -Tja, För att komma igång, jag antar att vi är kommer att behöva ett par pekare.
>> -OK.
Denna kod tilldelar två pekare, vilket kan peka på heltal.
-OK.
Tja, jag ser de två pekare, men de verkar inte vara riktad till något.
>> -Det Är rätt.
Inledningsvis, pekare tyder inte på någonting.
De saker de pekar på kallas pointees, och ställa upp dem för
ett separat steg.
>> -Oh, Höger, höger.
Jag visste det.
De pointees är separata.
Er, så hur ska du tilldela en pointee?
>> -OK.
Tja, allokerar denna kod ett nytt heltal pointee,
och Denna del innehåller x att peka på den.
>> Hej, ser det bättre.
Så gör det gör något.
>> -OK.
Jag ska avreferera pekaren x till lagra numret 42 i sin pointee.
För detta trick, jag behöver min Trollstaven i dereferencing.
>> -Din Trollstaven för Namnåtergång?
Det-- det är bra.
>> Det här är vad koden ser ut.
Jag ska bara ställa in numret och [POP]
>> Hej, titta.
Där det går.
>> -Så Gör en dereference på x följer pilen för att komma åt dess pointee.
I detta fall är en butik 42 därinne.
Hej prova att använda den för att lagra numret 13 genom den andra pekaren, y.
>> -OK.
Jag ska bara gå hit till y, och få nummer 13 inrättas.
Och sedan, ta Wand av Namnåtergång och bara [BUZZ]
>> -Oh!
>> -Oh, Hey!
Det fungerade inte.
Säg, Binky, jag tror inte dereferencing y är en bra idé, eftersom du vet,
inrättande av pointee är ett separat steg.
Och jag tror inte att vi någonsin gjorde det.
>> -Bra Punkt.
Ja.
Vi tilldelade pekaren y, men vi aldrig ställa in den att peka på en pointee.
>> -Väldigt Observant.
Hej, du ser bra ut där, Binky.
Kan du fixa det så att y punkter till samma pointee som x?
>> Visst.
Jag använder min Trollstav av Pointer Uppdrag.
>> -Är Det kommer att bli ett problem som förut?
Nej.
Detta berör inte de pointees.
Det förändrar bara en pekare till pekar på samma sak som en annan.
>> -Oh, Ser jag.
Nu y pekar på samma plats som x.
Så vänta.
Nu är y fixerad.
Den har en pointee.
Så du kan prova Wand av Namnåtergång igen för att skicka den 13 över.
>> -Uh, OK.
Här går. [POP]
>> Hej, titta på det.
Nu dereferencing arbeten på y.
Och eftersom pekarna delar att en pointee, de båda ser 13.
Ja.
Att dela, vad som helst.
Så ska vi byta plats nu?
>> Åh, titta.
Vi är för sent.
>> -But--
>> -Bara Ihåg de tre pekarreglerna.
Number One, den grundläggande strukturen är att du har en pekare,
och det pekar över till ett pointee.
Men pekaren och pointee är separata,
och vanligt fel är att inrätta en pekare,
utan att glömma att ge det en pointee.
>> Number Two, pekare dereferencing börjar vid pekaren
och följer dess pilen över för att komma åt dess pointee.
Som vi alla vet, det här fungerar bara om det finns
en pointee, vilken typ av kommer tillbaka till regel nummer ett.
>> Number Three, pekare Uppdraget tar en pekare
och ändrar den till att peka på samma pointee som en annan pekare.
Så efter överlåtelsen, de två pekarna
kommer att peka på samma pointee.
Ibland är det som kallas delning.
Och det är allt som finns till den, verkligen.
Bye-bye nu.
[END VIDEOAVSPELNING]
DAVID J. MALAN: Det är det för CS50.
Vi ses nästa vecka.