[MUSIK SPELA] David J. MALAN: Detta är som en förstaårselev seminarium i dag. OK. Så mycket regniga ut. Detta tenderar att ske på onsdagar, men desto mer möjligheter för frågor i dag. Så låt oss börja faktiskt med filmen på bara ett ögonblick. Men vi börjar storslaget som alltid. Detta är CS50, och detta är slutet av vecka 4. Så om du någonsin har sett TV eller se en film, där det finns vissa dataexperter och polisen eller FBI, eller någon byrå försöker fånga några motståndare, ja, du har säkert hört uttrycket "förbättra" varvid att teknikern på något sätt magiskt zoomar in oändligt långt för att se brottslingar identitet eller registreringsnumret även i de skimmer av en spegel eller glimt av någons ögon. Så ja, låt oss ta en titt på några sådana scener från Hollywood. [VIDEOAVSPELNING] -Okej, Nu ska vi få en ordentlig titt på dig. -Stopp. Kör det tillbaka. -Vänta En minut. Gå höger. -Det, Frysa det. -Fullskärm. -Okej, Frysa det. -Tighten Upp på det, kommer du? -Vector In på den killen av bakhjulet. -ZOOM In här på denna plats. -Med Rätt utrustning, bilden kan förstoras och skärpas. -Vad är det? -Det Är en förbättring program. -Kan Du klart att upp någon? -Jag Vet inte. Låt oss förbättra den. -Förbättra Avsnitt A6. -Jag Förbättrade detalj, och-- Jag tror att det finns tillräckligt för att förbättra, Släpp det till min skärm. -Jag Förbättrade reflektion i hennes ögon. -Vi Kör detta genom videoförbättring. -Edgar, Kan du förbättra detta? -Vänta. -Jag Har arbetat med denna reflektion. -Någon Reflektion. -Reflection. -Det Finns en återspegling av mannens ansikte. -Den Reflektion. -Det Finns 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 honom just här? -Kan Du förbättra den? Kan du förbättra den? -Kan Vi förstärka denna? -Kan Du förbättra den? -Hold På en sekund, jag förbättra. -ZOOM I på dörren. -Tider 10. -ZOOM. -Flytta in. -mer. -Vänta, Sluta. -Sluta. -Pause Den. -Rotate Oss 75 grader runt den vertikala, tack. -Sluta. Gå tillbaka till den del om dörren, igen. -Got En bildförstärkare som kan bitmapp? -Hej, Kanske vi kan använda Pradeep Sen metod för att se in i fönstren. -detta Programvara är state of the art. -Den Egenvärde är avstängd. -Med Höger kombination av algorithm-- -Han Är tagen eliminering algoritmer till nästa nivå, och jag kan använda dem för att förstärka denna fotograferar. -Lock På och förstora z-axeln. -Förbättra. -Förbättra. -Förbättra. -Freeze Och förbättra. [END SPELA] DAVID J. MALAN: Okej, så alla av dem är faktiskt ord. De är bara uppträdda tillsammans i en sätt som är egentligen inte klokt. Och i själva verket, CS50 och kurser som det tenderar att förstöra en hel del TV och filmer för dig. För när de dataexperter är rabbla villkor och säger tjusiga saker som egenvektorer och z-axeln, och vilket som helst antal andra faktiskt mer tekniska termer, de är egentligen bara strängarna ord tillsammans alltför ofta. Är det en av våra förhoppningar är att som en bieffekt av att ta kurser gillar det här, fler kommer människor i värld faktiskt kunna väga in och bara någonsin så lite påverka kvalitet och noggrannhet av dessa filmer? I själva verket, låt oss ta en titt på verkligheten. Så här är personalen foto Maria, en av våra undervisnings medmänniskor. Och antar att hon är misstänkt för något. Och ändå finns det en strimma av några bevis i hennes ögon, eller i en återspegling av hennes glasögon. Tja, om vi gör precis som filmerna föreslå, där vi in ​​och "förbättra", detta är hur mycket information är i Marias ansikte När du tar en bild med den ursprungliga upplösningen. Och i själva verket kan du se dessa punkter. Och dessa är vad som kallade pixlar, p-i-X-E-L-S, vilket är bara en kvadrat typiskt det är en punkt som komponerar en bild. Och tillbaka i dag, och faktiskt även idag med några av dagens LED-TV eller LCD-TV, om du har en i ditt rum eller hemma, om du går upp super nära till den, och speciellt om det är en något äldre TV, kan du förmodligen även se dessa punkter och det är vad komponera en bild. Och det finns ingen mer information än detta. Vi kunde "öka", i betydelsen utjämning saker om och typ av frånhändas typ av, typ av vad Färgen ska vara intill Maria öga så att det är faktiskt inte så pixelated. Men om jag fortsätter zoomar in, det är den dåliga killen i hennes ögon. Som det är alla Information har vi. Du kan inte skapa uppgifter ur ingenting. Det finns bara en begränsad antal bitar där. Så i Problem Set 4, där du har en möjlighet att spela med den här typen av världen. I Problem Set 4, kommer du utforska värld av grafik, och kriminalteknik, och faktiskt skriva kod som återvinner förlorade bilder. Du kommer att skriva kod som manipulerar befintliga bilder och slutligen förstå vad som är pågår under huven. Och visar det sig, det är faktiskt inte så komplicerat. Till exempel, om vi ville representerar en smiley där med dessa svarta pixlar, eller dessa svarta prickar, Tja, vi kan helt enkelt representera dem som verkligen en bitmapp. Och om du hade någonsin hört att uttrycks bitmapp, kanske det börjar nu för att göra en lite mer meningsfullt i dag. Vi vet redan vad lite är. Det är 0 eller 1. Och en karta är bara något som ett papper som ger dig riktningar och har kanske ett rutnät av x- och y-koordinater. Så här är en bitmapp. Det är en karta över bitar varigenom en 1 är uppenbarligen kommer att representera en vit pixel, och en 0 kommer att representera en svart pixel. Men vi kan säkert vända runt. Det spelar egentligen ingen roll så länge vi är konsekventa. Och här är hur man i binary-- inne av en dators minne, eller till och med inne av en fil på din hårddisk drive-- kan du spara den enklaste av smiley ansiktsbilder. Men vad är vi, naturligtvis, saknas i den här bilden? Färg, eller hur? Det är ett självklart nästa steg eller förstärkning för att förbättra detta med färg. Så tyvärr med bara en enda bit, 0 eller 1, kan vi representerar färg. Det kan vara röd eller blå, eller svart, eller vit eller grön, eller rosa, eller några par av färger. Men för enkelhets skull kommer vi bara antar svart och vitt. Så vad logiskt behöver vi om vi vill implementera färg i en bild? Vad har vi att göra? Som om den begränsande faktorn här är att med en bit du bara kan representerar två stater, 0 eller 1, vit eller svart, vad vill du göra? Målgrupp: Mer data. DAVID J. MALAN: Fler bitar, Yeah mer data, fler bitar. Och, ja, det är exakt hur färgbilder är representerade. Hellre än att använda en enda bit, en 0 eller 1 för varje pixel, varvid varje prick, du bara använda flera. Kanske använder 8, kanske, mer vanligt använder 24, och faktiskt, i Problem Set 4, kommer du att spela med en fil format som använder 24 bitar typiskt. Men de flesta av er är förmodligen bekant med JPEG. Om du någonsin har tagit ett foto på din telefon, eller laddas upp eller sett något på Facebook eller Flickr, vilket som helst antal fotobaserade webbplatser, du har förmodligen sett en JPEG-bild innan. Och det visar sig, detta är filen format vi kommer att använda i PSET 4, där du kommer att måste återskapa bilder att jag av misstag har raderat från en skadade minneskort i kameran, om du vill. Och det visar sig att även om JPEG är ganska sophisticated-- det är mycket mer sofistikerade än de svarta och vita prickar vi såg för en stund sedan, eftersom det finns faktiskt snygga algoritmer som används för att komprimera en JPEG, så att du kan ha en riktigt trevlig, bildkvalitet men med användning av relativt få bitar. Och vi ska återkomma till kompression snart. Det visar sig att den första tre byte i en JPEG image-- oavsett vad du har tagit ett fotografi of-- är värdena 255, 216, 255. Med andra ord, om du bara se att mönstret av bitar, representerad här som tre byte, eller 24 bitar totalt, med stor sannolikhet kan du dra slutsatsen att du tittar på den här första tre bytes av en JPEG. Och detta är vad som är känt som undertecknandet av en JPEG. En hel del filformat ute tenderar att starta med vissa mönster av 0 och 1, så att Windows och Mac OS och IOS, och Android vet vilken typ av fil de är, förutom den så kallade fil tillägg som en hel del filer har. Om du har .jpg, det är en ledtråd till datorn. Så låt oss nu titta på detta lite mer tekniskt. Vi vet decimal Systemet är 0 till 9. Vi vet binärt är 0 och 1. Och om du tänker tillbaka på PSET 0, hade vi att du brottas med, för lite, något kallas hexadecimala, där du har 16 siffror, i stället för 10 eller i stället för två. Och dessa siffror, enligt konvention, är 0 till 9 och sedan en till f, där f representerar vad decimaltal, precis som en snabb sanity kolla? Så, 15. Och en måste representera 10, bara genom att typ av beställning som jag har gett. Det är bara en godtycklig konvention, men det är ganska standard. Så om vi ser på detta mönster av tre bytes-- låt oss bara börja att titta på det i ett sätt som är förenligt med hur datavetare allmänhet titta på och tänka på filer. Du kan säkert tänka filer i 0s och 1s och decimal, men i verkligheten, tenderar vi att använda binär eller mer typiskt hexadecimal-- tillbaka från PSET 0. Så låt mig föreslå att 255, 216 och 255 är just dessa mönster av 0 och 1. Och du kan kontrollera detta om du vill göra matten från vecka 0. Men för nu, bara anta att detta verkligen är korrekt. Jag har just skrivit om tre decimal nummer som tre binära värden. Nu vad jag ska göra är att bara lägga till lite vitt utrymme, bara för läsbarhet skull. Och varsel, jag bara gå att flytta isär saker. Så före, efter, före, efter. Jag gör inget intressant andra än bara utspridning saker så att kallelse varje uppsättning av åtta bitar är nu två uppsättningar av fyra bitar. Detta är användbart eftersom hexadecimalt är särskilt modet eftersom varje hexadecimal siffra 0 till f, eller mer specifikt 0 genom 15, kan representeras med exakt fyra bitar. Med andra ord, i hexadecimal om du vill representera en 0, det är bara 0000, fyra nollor. Och om du vill representera 15, det är 1111, vilket är fyra bitar. Och om du gör matten, om detta är ettor plats, detta är den 16s plats, som kommer att ge du-- snarare som kommer att-- ledsen, i binär, det kommer att ge dig 15, som plats, Twos plats, fyror och åttor plats. Så låt mig föreslå att det uppsättning av fyra bitar till vänster är vad vi kommer att kalla f. Det är det största antalet du kan representera med fyra bitar. Och vi vet redan från hexadecimal, f är den största siffran i hexadecimalt. Vi har en annan f där, ytterligare två borta. Och nu, bara ta på tro att jag har gjort matten rätt och att den vänstra halv av dessa bitar, 1101, är samma sak som d i hexadecimal. Och den högra, 1000, ligger bara 8. Och att man är lätt att se, eller hur? Den 8 represents-- är rätt därunder åttor plats. Så vi har ett i åttor kolumnen och ingenting i fours, tvåor och ettor. Så nu mer konventionellt, människor tenderar att skriva hexadecimala siffror som denna, man bara trycka ihop dem tillsammans, och sedan prefix dem med 0x. Det betyder inget annat än en visuell ledtråd till en human-- Här kommer en hexadecimal value-- eftersom det kanske inte annars vara uppenbart. Vilket betyder att i slutändan, att mönstret av ettor och nollor, eller mönstret för hexadecimal Siffrorna ekvivalent att du är kommer att börja leta efter i Problem Set 4 är this-- och problemet Set 4 spec kommer att gå dig igenom detta mer detail-- men inser som en slags svårbegripliga som Detta kan se ut vid första anblicken, du kommer att börja se detta en hel del. Och faktiskt, även i GDB, den debugger vi infört på måndag och Dan införs i PSET 3, går att ofta visa dig hexadecimalvärden bara för att de tenderar att vara mer konventionell än decimal eller binärt i världen av datorer. Nu ska vi sätta detta i sitt sammanhang. Många av er kanske kommer ihåg detta bild här, som kom från vad? Vista, så ännu tidigare än det gjorde Windows XP denna debut. Så det här är ett vackert landskap. Och i själva verket om du rota runt online-- Jag tycker det är en Wikipedia-artikel, där någon väldigt otroligt gick ut tyckte att det här platsen i världen som inrättats hans eller hennes kamera i exakt rätt plats-- och detta i dag ser like-- men Det är exakt samma inställning. Den här bilden är dock i en fil format som kallas bitmapp, b-m-p. Och vi kommer att ta en super snabbtitt på vad det betyder. Men bitmapp är bara ett annat sätt att företräder bilder fortfarande använder pixlar i 0 och 1, i slutändan. Men vid hastig blick, har det en mer intressant signatur i början av filen. Det är inte bara tre bitgrupper, snarare finns det en massa mönster av byte som har förutbestämda mening. Exempelvis någonstans i första byte i en bitmappsbild kommer att vara storleken på bild, bredden av bilden, höjden av bilden, så användbara metadata, om du kommer. Användbar information som Photoshop eller någon grafik programmerar du använder kan faktiskt bryr sig om. Så mer om detta i Problem Set 4, men detta är endast att säga att Vid slutet av dagen alla filformat du har använt för years-- Microsoft Word-filer, Numbers filer, Excel-filer, valfritt antal filformat som kan ha några känd filändelse är bara 0 och 1 under huven. Och människor har beslutat vad konventionerna, vilka mönster av 0 och 1 representerar en Word-fil jämfört med en Excel-fil, kontra ett antal andra filformat. Så PSET 4, har du en möjlighet att spela med det. Men vad betyder det att ha en struct. Detta är faktiskt ett trevligt SEGUE nu till C, som har endast ett par ytterligare funktioner som Vi har inte tittat på ännu. Det är en ganska liten språk och en av de trevliga funktioner om C är en struct. Till exempel, om du ville represent-- låt oss säga att du ville ha en variabel som representerar en student i något program. Kanske du skrev en kurs registreringsprogram, eller kärn shoppa verktyg, eller nåt sånt. Vad är bitar av uppgifter om till en student som kommer att tänka på? Som en student är representerad med vilka värden? Yeah? Du har ett namn som student. Vad betyder en typisk studenten? PUBLIK: [OHÖRBAR] DAVID J. MALAN: Så, tyvärr. PUBLIK: Age. DAVID J. MALAN: En ålder eller födelsedag ekvivalent, yep. Vad annars? PUBLIK: ID-nummer? DAVID J. MALAN: Så ett ID-nummer, kanske ett telefonnummer, kanske en sovsal eller hus, eller högskola, eller nåt sånt. Vilket som helst antal datadelar som du kan ha i din kontaktlista är vad som kan definiera en student. Så om vi ville göra detta i koden, vi kan göra något enkelt som här. Vi kanske har ett program så att har låt oss säga, int main (void). Och om jag vill representera en elev Jag kanske har, till exempel, en sträng som kallas namn för den studerande, en sträng som kallas sovsal för den studerande, kanske en int kallas ID för den studerande. Och eftersom jag använder sträng, jag behöver gå tillbaka och sätta upp CS50.h. Kanske jag kommer att behöva stdio.h. Så låt mig i förebyggande syfte göra dem och jag är kommer att kalla detta student.c nu och spara denna. Och nu kan jag göra något med dessa variabler. Och vi ska bara skriva det som en kommentar i pseudokod, eftersom det inte är intressant vad vi gör nu. OK, så det här är ett program som på något sätt lagrar en student. Vad vill jag göra om jag vill lagra två studenter? Så min första instinkt går att vara okej, vänta en minut, om jag har en annan student gör varför inte jag bara göra string name 2, sträng sovsal 2, int ID2. Och vi har gjort borta denna väg innan och vad som var vår lösning till vad som verkar att vara lite av en hackish kopiera klistra jobb här? Publik: En array. DAVID J. MALAN: Ja, vi skulle kunna använda en array. Höger detta mycket snabbt blir ohanterlig. Du måste sortera godtyckligt börja namnge alla dessa variabler. Och du som människa, måste hålla spåra att OK NAME2 motsvarar med dorm2 motsvarar ID2. Det blir bara en enda röra. Så det är mycket enklare, minns från ett par veckor sedan, att bara behöva kallas strängnamn och kanske ge oss tre av dessa. Och då kanske vi har sträng sovsalar och har tre av dessa, eller med en konstant, int ids och har tre av dem. Men även nu det känns lite slarvigt, höger. Vi pratar om studenter och ändå Jag är verkligen bostad på den låga nivån genomförandet detaljer. Studenten är ett namn och en sovsal och ID. Varför kan jag inte förklara bara en variabel kallas student och kallar det är. Och om jag vill ha en annan student, varför inte jag bara kalla det t. Eller om jag vill ha en hel drös av studenter, varför inte jag bara säga att jag har en hel klass av studenter, och det är tre av dem. Med andra ord, varför kan jag inte komma med min egen datatyp, som kallas Studenter, insida som är ett namn, är ett ID, är en sovsal, är ett antal andra områden. Och det visar sig att du kan göra just det. Så C har denna funktion som kallas struct. Det är ett språk funktion som tillåter oss att göra just detta. Jag kommer att gå vidare och öppna upp structs.h där vi kommer att se Följande definition av en student. Det visar sig - och detta är ännu enklare än den som inbegriper ett ID en stund sedan. Om du vill komma med din hemgjorda datatyp, och dessutom till int, och röding och flyter och alla dessa andra som finns, kan du göra det genom att bokstavligen skriver typedef struct, sedan några klammerparenteser, inuti vilken man lista de variabler som du vill associera med detta nya anpassade uppgifter skriver som ett namn och en sovsal, och sedan efter klammerparenteserna du ange ett namn för den nya datatypen. Så, till exempel, student. Och vad är trevligt om detta nu är att Om vi ​​tittar på motsvarande kod, konventionen först av allt, är att sätta detta i en fil som heter något dot h, en header-fil, som vi inte har började använda oss alltför mycket. Men vi kommer att börja med hjälp av en hel del nu. Och vad vi kan göra med detta, slutligen, i dessa få rader kod är förklara exakt som datatyp, en student. Och nu ska vi använda den. Jag ska nu gå in en fil som heter structs1.c. Och låt oss ta en titt på en Några egenskaper här. Så grejer här är mestadels bekant, och vi ska komma tillbaka till vad som inte är bekant på bara ett ögonblick. Detta är naturligtvis inklusive mitt eget header-fil, som är ny liksom, utom för PSET 3 där, minns, har vi helpers.h. Så du kanske kommer ihåg #include helpers.h. Varför om jag använder citat i stället för vinklade konsoler? När väljer jag mellan dem? Nästan alltid jag verkar att använda vinklade fästen. Och sedan, helt plötsligt på line sex Jag använder dubbla citattecken. Varför skulle det vara? Yeah? PUBLIK: [OHÖRBAR] DAVID J. MALAN: Det är en faktisk, vad? PUBLIK: Det är i IDE. DAVID J. MALAN: Ja, det är i min faktiska IDE. Och låt oss inte uppehålla mig vid IDE, eftersom det är bara ett verktyg som jag använder. Det är i min nuvarande katalog, specifikt. Så structs.h är min egen fil inte installerat i IDE, i själva operativsystemet, utan det är i min nuvarande katalog. Så konventionen är om du vill att inkludera din egen headerfil, du bara använda dubbla citattecken. Vad kallar vi den här saken i linje 8, generellt sett? Det här är vad? #define något. Detta representerar konstanter, eller hur? Om du vill ha en värde i ditt program att du använder en hel gäng gånger, det är bra konvention faktor ut, förklara den, med hash symbol definiera, då, enligt konvention, i alla versaler word-- om det inte absolut nödvändigt, men Det är mänskligt konvention att kapitalisera konstanter så att de hoppar ut på dig visually-- utrymme och då det värde du vill vara likvärdig med den som konstant namn. Ingen semikolon, men du helt enkelt följer detta mönster där. Så vad jag gör i denna faktiska koden. Så låt oss ta en titt på huvudprogrammet här. I linje 12 eftersom jag har inkluderat structs.h, Jag har nu magiskt på mitt förfogande en ny datatyp. Jag vill inte bara ha tillgång till int, och röding, och flyta, och snöre, och blått och andra. Jag har nu tillgång till en typ elev data. Så i linje 12, jag kombinera två ideas-- en en egen datatyp och två, med användning av en matris. Och så i detta program om Jag vill faktiskt stödja tre olika elever i mitt program, jag kan helt enkelt säga ge mig en variabel kallas studenter, som var och en är av typ studenter, som är min typ anpassad uppgifter. Och särskilt ge mig tre av de i mitt arrayen. Så nu vad gör vi i det här programmet? Här är bara en for-loop iteration 0-3, eftersom det är vad värdet av studenter är. Jag är bara att användaren tillfrågas ge mig studentens namn. Och sedan i linje 17, vi har en mestadels bekant linje. Vi har vår gamle vän GetString till höger. Och vad bit av syntax är uppenbarligen nya, Om du aldrig har programmerat i C innan, och har aldrig använt structs? Yeah? Publik: Den .name. David J. MALAN: Den .name. Men det är inte för mycket av ett språng, för nu eleverna fästet i ger dig den i: te student. Och om du vill dyka insidan av denna struktur, du bara använda en enda period och sedan namnet på variabeln inuti, eller egendom inuti som du vill få tillgång till. På samma sätt då, om jag då uppmana användaren, ge mig studentens studentrummet, kan på liknande sätt lagra den sträng i sovsal variabel inuti av detta elev struktur. Och nu det blir lite finare. Och detta kommer att se på kanske en hel del ganska snart. Men du ser så här långt mer i PSET 4, så låt oss bara blick på det nu. Det visar sig att i linje 23 genom 38, vad tror du att jag kanske gör? Jag har tagit bort kommentarer för idag, men version av koden online referensen har alla kommentarer. Vad gör jag verkar göra? PUBLIK: Spara filen med alla den information som användaren angett. DAVID J. MALAN: Ja, exakt, är detta ett nytt sätt att vi ser två, annat särdrag hos C, där jag kan skapa mina egna filer. Hittills, nästan alla program du har skrivit är statslös. Så snart det är gjort kör, det är det. Det finns inget minne eller minne av det. Det finns ingen fil sparas. Men om du vill spara ingång som har hände, som i ett spel eller ett program så här, visar det sig att vi kan göra det. Och du ser detta mer i PSET 4 och i avsnitt. Men denna linje 23 i huvudsak skapar en fil som heter students.csv. Och du kanske har sett det här förut. Även om du aldrig har studerat CS tidigare, CSV är kommaseparerade variabler. Det är som en mycket fattig mans version av en Excel-fil, vilket innebär att den kan öppnas i Excel och i Apples Numbers, och det har rader och kolumner. Men det är inte en patentskyddad format som Microsoft eller Apple. Det är bara kommatecken separerar värden som vi ser i ett ögonblick. Och bara ta en gissning. I linje 23, vid mycket ände, mitt andra argumentet till denna nya funktion kallas f öppen för filen öppen är w. Vad kan w betecknar? Yeah? PUBLIK: Det låter dig skriva till filen? DAVID J. MALAN: Det låter du skriver till filen. Så det finns ett par varianter att vi kan koppla in här. Men om du bara vill läsa filen är att titta på det och läsa den i minnet, du bara använda citat unquote "r". Om du vill skriva till fil, använder du citerar unquote "w". Det är också bifoga och ett par andra saker Om du vill ändra befintliga filer. Nu ska vi fortsätta att se detta sak, då vi ska komma tillbaka till linje 24. NULL, visar det sig, är ett speciellt värde som kan returneras av vissa funktioner Om något har gått wrong-- Om filen inte finns, om du har slut på minne, eller en massa andra fel. Men nu, låt oss bara anta att detta är bara konventionell felkontroll. Här i linje 26, jag iterera 0-3 över alla mina elever. Och detta är typ av sort av en ny funktion, fprintf, men bara ta en gissning. Om printf är bara print en formaterad sträng, vad betyder fprintf förmodligen innebära? PUBLIK: Skriv ut till en fil. DAVID J. MALAN: Skriva ut en formaterad sträng till en fil. Det är vad den ytterligare f organ är fil. Och den nya första argumentet måste vara variabeln som representerar din fil. Då har vi bara ett format sträng precis som printf. Och även om detta Syntaxen är nytt, detta bara betyder koppla in elevens namn, plug-in för studenthem, och sedan med fclose stänger du filen. Och sedan lastly-- detta är nytt och vi ska återkomma till detta innan long-- jag frigöra studenten skäl som hände upp ovan finns. Men vi kommer tillbaka till att innan long-- det är på grund av hur getString är faktiskt arbetar under huven. Så låt oss ta en snabb titt här. Om jag skriver ls i min katalog, märker att jag inte har en fil som heter students.csv, bara inte där, inte existerar. Så om jag nu sammanställa det här programmet, göra structs-1,. / structs-1, och jag kommer att gå vidare och skriva in Andi, som bor i Berkeley vid Yale. Vi kommer att ha Rob som bor i Thayer dessa dagar. Och låt oss komma med där är, tror jag, är Maria i Mather, om jag har mindes rätt. Så ingenting verkar hända. Men om jag skriver ls nu, det finns students.csv. Låt oss gå vidare och öppna students.csv. Detta är återigen en mycket lätt filformat. Men jag har bara antagit en konvention att jag har två rader och kolumner här. Den första kolumnen är folks förnamn. Den andra kolumnen är studentens sovsal, eller högskola, eller hus, eller allt. Och nu har jag sparat detta permanent i en fil. Så det är inte så intressant. Men detta är bara en språngbräda nu att kunna kvarstå uppgifter permanent. Så låt oss nu se vad mer vi kan göra med dessa och andra funktioner. Men först, några frågor? Det var en hel del, och det var snabb. Men du kommer att se en hel del mer PSET 4, liksom. Yeah? PUBLIK: Finns det något sätt att fortsätta att lägga namn till den filen? DAVID J. MALAN: Bra fråga. Finns det ett sätt att fortsätta lägga till namn till den filen? Ja. Och, faktiskt, om du avslutar up återuppta ärendet, du skulle använda citat unquote "a" för append, som bara skulle lägga till en ny rad, en ny linje om och om igen, exakt. Bra fråga. Övriga frågor? Yeah? PUBLIK: Om du körde program igen just nu, skulle det fortsätta att lägga namn till fil eller skulle det öppna upp en ny fil? DAVID J. MALAN: Ah, bra fråga. Om du körde programmet igen rätt nu, kanske skrev i nya namn, skulle man lägga till filen eller skriva över filen? Den senare, eftersom jag är inte använder bifogningsläge. Och eftersom jag är bara blint öppna filen för skrivning, det bara kommer att skriva över filen. Så jag skulle verkligen behöver göra är att lägga till, om jag vill faktiskt ha en långsiktig databas. Nu CSV är användbar, uppriktigt sagt, även för som om du är writing-- och vi kommer så småningom se denna senare i den termin då Vi använder CSVs för andra ändamål. Om du vill lagra alla människor som har anmält sig till någon händelse, eller registrerat dig för din student grupp, eller nåt sånt, lagring av data i denna typ av format är super bekvämt. Eftersom bokstavligen, om jag skulle ladda ned den här filen. Jag kunde double-- och låt oss faktiskt prova detta om jag har Excel eller Numbers här. Jag kommer att högerklicka eller kontrollklicka min fil. Hoppsan. Högerklicka eller kontrollklicka min fil. Kom igen, är min mus inte samarbetar. Download-- jag ska ladda ner alla filer här så bara så att jag kan ta det här. Och låt oss se om det fungerar students.csv-- första gången Jag har aktiverat. Nu vill de se mina kontakter. Nu måste jag registrera. Se hur enkelt det är att använda CSVs? Ja, hålla den aktuell. OK, nu är vi redo för klass. OK, åh, vad är nytt? OK, nära. Det var magisk. OK, nu måste vi uppdatera. Och nu, glömde det vad fil Jag ursprungligen öppnades, men vad A-- där vi går. OK, så nu har vi en Excel-fil. Tack. OK, så vad jag gjorde var den enkla biten. Naturligtvis kunde jag ha förinstallerat Excel eller Numbers, eller vad programmet. Men det är trevligt, eftersom Nu kan jag manipulera data i ett standardformat. Så nu ska vi sammanhang byta till där vi slutade förra gången, vilket var att starta att ta av stödhjul. Men först, det gjorde du inte se denna tidigare lunch återigen händer här på Fire och Is i Cambridge, Sitar i New Haven. Registrera dig på CS50s webbplats ASAP att gå CS50 studenter och personal. Så vi tog utbildning hjul rabatt på måndagen som follows-- sträng har försatts i CS50s bibliotek för en tid. Och det är trevligt, eftersom det tillåter oss att tala om variabler som fullständiga ord och meningar och mer. Men det visar sig sträng existerar inte. Det är bara en synonym, eller ett alias, att vi har skapat för något som faktiskt är lite mer tekniskt kallas en char *. Och faktiskt, såg vi ett exempel av ett program på måndag som inte beter sig helt som vi förväntade oss. Detta var filen jämföra-0. Och minns att jämföra-0, om Jag kompilera måndagens program och kör jämför-0 och skriv in mamma i gemener, och mamma i gemener igen. Programmet insisterade jag skriver olika saker, även om mamma, allt i gemener, är identisk visuellt. Så vad var det korta svaret till varför datorn tänker dessa två strängar är olika? Yeah? PUBLIK: [OHÖRBAR] DAVID J. MALAN: Rätt. Så, mamma, för första gången Jag skriver det är att vara lagras någonstans i datorns minne men i en annan plats än andra gången jag skriver i mamma. Nu säkert det skulle kunna optimeras. Datorn kan vara smart och förverkliga dessa två strängar, hej, de är identiska. Låt mig inte redundant lagra den. Men datorer inte gör det optimering om du berätta för dem att. Så som standard, de är bara kommer att hamna på två olika platser i minnet. Och så för att vara mer tydlig, när jämförde vi två strängar, de första kallades s, den andra kallades t, vad som specifikt var jag jämförelse här på rad 13? Yeah. PUBLIK: Det är den plats i minnet att variabeln kommer att peka på. DAVID J. MALAN: Just det, var jag jämföra den plats i minnet att dessa variabler pekade. Så specifikt, om mamma var på byte nummer 1, och 2 och 3, och 4-- eftersom ihåg backslash 0 måste vara hela vägen i slutet. Och den andra instans av mamma, m-o-meter, var vid adress 10, 11, 12, och 13. Jag jämförde 1, den adressen, den platsen i minnet, mot 10, som är uppenbarligen inte samma sak. 1 är inte 10. Så det här är trevligt att Det är ganska enkelt. Men det är problematiskt mån vi verkar inte kunna jämföra strängar. Så fundamentally-- och på denna låga nivå, om du ville genomföra ett program för att jämföra två separata ord som användaren har skrivit in för kvalitet, gör de rada upp röding för röding, bara i allmänna termer, Vad behöver vi göra, tydligen? Det är inte tillräckligt att bara titta på dessa två adresser. Vad behöver vi göra? Yeah? PUBLIK: iterera igenom strängen [OHÖRBAR]. DAVID J. MALAN: Ja, låt oss iterera igenom strängen. Låt oss använda en for-loop, en while-slinga, eller vad du är mest bekväm med. Och om vi har två strängar någonstans i minnet, låt oss titta på varje s första bokstaven och varje är andra karaktär, då tredje och fjärde, och femte, tills vi hit vilka särskilda sentinel värde? PUBLIK: [OHÖRBAR] DAVID J. MALAN: Ja, det omvända snedstrecket noll, vid vilken punkt i endera strängen Vi kan besluta att det är. Har vi matchade varenda karaktär? Om inte, returnera false. Om så är fallet, return true. Och så det är precis vad den här versionen av programmet jämföra-1.c gör. Den är identisk med vad vi tittat på måndag, förutom att jag har blivit av ordet string-- men som inte har någon fungerande impact-- alla Jag gör nu är att ta bort vissa visuella stödhjul, men att se tydligt att s och t är adresser. Och det är vad stjärnan, asterisken representerar är en adress, annars känd mer tekniskt som en pekare. Så när jag försäkrar er om linje 9 och säga char * s, det betyder inte att ge mig en sträng. Det innebär att ge mig en variabel vars syfte i livet är att lagra en adress. Eftersom jag är på väg att sätta adressen för en sträng i den. Och faktiskt, getString, att vara klart, inte returnerar en sträng. Det går inte tillbaka mamma omvänt snedstreck noll, i och för sig. Vad betyder getString specifikt och exakt tillbaka? PUBLIK: [OHÖRBAR] David J. MALAN: En adress, den adressen för det första tecknet i vissa strängen har fått. Och så nu ser vi en speciell sökord igen. Och hänvisade jag till detta tidigare. Detta kommer att vara bra konvention att vi får se om och om igen nu. Jag kollar att se till att s inte är noll och t är inte noll. Eftersom de baseras på min verkligen snabbt nämna tidigare, vad kan innebära om getString återvänder inte en adress men N-U-L-L, som är återigen, några speciella värde? PUBLIK: Fel. DAVID J. MALAN: Det är ett fel. Något gick snett. Och vad typiskt kan hända, särskilt med strings-- som kan vara av okänd längd i advance-- kanske datorerna " slut på minne, kanske du skrev på ett sådant långa ord eller en mening eller klistras sådan enorm uppsats det finns bara inte tillräckligt med minne. Och så getString kan inte återvända adressen till det hela, så det bara returnerar ingenting. Och det står ett fel har hänt genom att returnera den speciella NULL värde. Det är noll adress, så att säga. Nu visar det sig C levereras med en funktion som gör det iteration. Vi behöver inte genomföra detta med en for-loop eller en while-slinga själva. Vi kan använda en funktion, kallas kortfattat, rör comp, eller sträng jämföra, vars syfte i livet är att göra just detta. Du ger det två pekare, två adresser, och det kommer att gå till dessa adresser och sedan jämföra bokstav för bokstav för bokstav för kvalitet, stannar bara när det som är sant? När intuitivt Rör om komp stopp iteration, bara för att vara klart? När den träffar ett omvänt snedstreck 0 i antingen sträng, vid vilken punkt det kan bestämma har allt matchas, eller har det skett en avvikelse? Så, om vi kör detta nu och prova vår lilla kapitalisering spel, så att jämföra-1, ./compare-1, och skriver mamma med gemener båda gångerna. Nu är det samma sak. Och om jag gör det igen med gemener och sedan kanske versaler. Nu är det verkligen skiljer mellan övre och gemener. Så inte så svårt eller magiska, men det gör nu förklarar vad som händer under huven. Så vad mer kan vi utvinna från denna typ av lektion? Så låt oss ta en titt på detta. Jag kommer att gå vidare och skriva en snabb program här kallad copy-0. Och nu ska vi gå vidare och faktiskt låt oss göra this-- med kopia-0, ta en titt på vad jag har här. Jag först tala om för användaren, säga något. Då får jag en sträng och jag lagras det i s. Sedan kollar jag om s är lika med är lika med noll, bara tillbaka en. Så det här är bara vanlig felkontroll. Inget intressant har hänt. Och faktiskt, om vi blir av felet kontroll, ser detta som vecka 1 kod just nu. Men jag har börjat få en lite bättre om det. Nu i linje 16, för en vecka sedan, kanske även ett par dagar eller minuter sedan, du kan säga linje 16 är skapa en variabel som heter t och kopiering s in i den. Och det är en perfekt rimlig takeaway. Men vara mer exakt nu. Vad händer i linje 16? Vad är att få kopieras från höger till vänster? Yeah? PUBLIK: Är t få en adress till s? DAVID J. MALAN: Exakt, t blir adressen till s. Så för att vara tydlig nu, om jag går tillbaka till det tidigare exempel och jag dra ut det jag har skrivit in. Och vad jag har skrivit in-- här är s, och här är vad jag har skrivit i någonstans i minne, mamma och sedan ett omvänt snedstreck 0 som är till för mig. Vad jag lagras här, minns, detta är på plats 1, 2, 3, 4, Detta är vad som för närvarande i s. Så om på rad 16, säger jag ge mig en annan variabel som kallas t och lagra in på värdet på s, vad får lagras här kommer inte mamma utan snarare bara antalet 1. Så om vi blickar framåt i detta program nu, vad som kommer att hända? Så märker att det finns denna funktion kan du kanske har använt detta för en tid sedan för Caesar, eller Vigenère, eller kanske inte alls. Jag hävdar med min printf, jag kommer att kapitalisera kopierings t. Först i raden 19, snabb sanity kontrollera, strlen kontrollerar längden på t. Eftersom jag inte vill försöka kapitalisera något om det inte finns någon sträng där. Om användaren bara trycka Enter, det finns inget att kapitalisera. Så jag vill inte göra linjen 21. Så linje 21 kapitalisera vilken bokstav, tydligen, i t? PUBLIK: m? DAVID J. MALAN: Det ser som det är kopiering som ett? PUBLIK: m. DAVID J. MALAN: Öh, m. OK, så den första m, eftersom märker att jag är passerar till TOUPPER, vilket Om du aldrig har sett det är det bara en funktion för att kapitalisera som sin insignal. t bygel noll innebär ge mig noll karaktär t. Och så hur gör detta bild förändring, att vara tydlig? Vad behöver få skrivas om eller ändras med avseende på s och t och mamma snedstreck noll. PUBLIK: [OHÖRBAR] DAVID J. MALAN: Ja, så här här bara måste få ändrats att-- fixa this-- behöver få ändras till en kapital m. Men nu ser senare i program, om jag skriver ut s och t som jag städa här, titta på vad som är kommer att hända skriva ut s och t. Så gör copy-0, ./copy-0. Låt mig gå vidare och skriva i mamma i alla gemener. Lägg märke till både den ursprungliga och kopian har aktiverats. Varför? Tja, s och t båda pekar på, om ni så vill, samma bit av minnet. Och ärligt talat, det här är att få verkligen uninteresting-- det faktum att vi använder adress noll här. Jag menar, jag vet inte riktigt bryr där grejer är i minnet. Ledsen jag radera lite för mycket. Men jag bryr mig egentligen inte där saker är i minnet. Och så, ja vad programmerare tenderar att tänka på är att när man talar om en adress, eller en pekare, vem bryr sig om det är i minnet. Jag bryr mig inte om det är på byte av en eller en miljard. Jag bryr bara att detta variabel är effektivt pekar på att bit av minnet. Och så, hädanefter, snarare än käbbla över godtyckliga minnesadresser, låt oss bara börja dra pekare som pekare, som pilar. Så vad s och t verkligen är, enligt detta program, på grund av hur jag skapade t, Det är bara två separata variabler pekar på samma bit av minne. Och vi bryr oss inte var de är. Så vi kan abstrakt bort den detaljen. Så hur kan jag fixa det? Om jag vill skriva en version av kopian program som faktiskt kopierar sträng och aktiverar endast kopiera, bara intuitivt, vad måste vara en ingrediens till vår lösning? PUBLIK: [OHÖRBAR] DAVID J. MALAN: Vi behöver en vad? PUBLIK: Chunk minne. DAVID J. MALAN: Vi behöver en annan bit av minnet, eller hur? Vi vet inte hur man gör det ännu, nödvändigtvis. Men jag slags vill att detta ska ske så att den ursprungliga mamma i gemener hamnar i den extra bit av minnet. Och sen när jag byter kopian, jag vill inte ändra detta exemplar här. Jag stället bara vill ändra detta kopia så att originalet är oförändrad. Så, låt oss se hur vi kan göra detta. I copy-1, som redan har tagits kommentar men kommenteras på nätet. Vi istället göra following-- dessa linjer är identiska, få mig en sträng och kallar det är. Men nu ska vi titta på ett av våra mest komplex men den sista av komplexiteten ett tag, gör linje 16 just detta. Så om din bekväma med bild vi drew-- bara ge mig en ny bit av minnet, kopiera allt i det, Låt oss se hur vi översätter det till kod. Så linje 16, på vänster sida, char * t ger mig denna ruta hit. Det är allt den gör. På höger sida, m alloc eller malloc, är minnesallokering, super snygga, en kryptisk sätt att bara säga ge mig en bit av minne. Hur mycket minne behöver vi? Tja, är lite av en stor uttryck. Men låt oss se vad det står här. Så det här är naturligtvis är att ge mig stränglängd s. Så, mamma det borde vara vad? Så bara tre, eller hur? mamma är tre tecken. Du behöver inte räkna omvänt snedstreck noll när du tala om längden av en sträng är det faktiskt de mänskliga synliga bokstäver. Så mamma, så det här ger mig tre. Men vänta en minut, jag nu lägga till en. Varför jag verkligen vill fördela 4 byte och inte bara tre? Yeah? PUBLIK: För sentinel värdet? DAVID J. MALAN: Exakt, för att sentinel värde. För det omvända snedstrecket noll, Jag behöver 4 byte totalt. Så jag behöver längden av strängen plus ett. Och sedan bara för bra measure-- trots att på detta system, det kommer alltid att vara 1-- jag säger multiplicera med storleken på en röding. Det visade sig att sizeof är en operatör i C som bara berättar dig Antalet byte som är krävs för en viss datatyp. Det fungerar inte för matriser, typiskt, ibland den gör. Men i det allmänna fallet, nr. Men det kommer att tala om för mig hur många byte en röding är, som visar sig är alltid en. Så det här är som att multiplicera med 1. Så super kryptiska ser kodrad. Men allt den gör är ger mig en bit av minne. Men det verkar vara kopiering någonting i detta minne? Inte än. Och så vad gör jag på rad 22, och 23, 24, 25, ja, jag helt enkelt göra det. Och detta är typ av old school grejer nu. Detta är som PSET 2, där du bara ska flytta saker runt i minnet, eller snarare i strängar. Så jag iterera från 0 till längden av strängen s. Och jag kopierar den i: te karaktär is i den i: te karaktär i t. Och eftersom jag, programmeraren, gjort Var noga med att allokera exakt så många bytes som jag behöver, det är perfekt ett-till-ett förhållande. Och jag kopiera mamma i gemener till den nya. Och sedan slutligen gör jag den här raden. Och så effekten är endast att kapitalisera denna t här. Så mycket att absorbera, men Om du bara betrakta vad som verkligen händer på under huven är bara flytta dessa byte runt, alla som behövs för att lösa detta problem är bara för att ge oss denna del av minnet. Nu med risk för överväldigande, låt mig visa ett annat exempel som är nästan identiska, med undantag för detta kodrad. Så det här är hacker version av detta program, om man så vill. Men låt oss bara destillera det i vad som händer. Linje 24 brukade vara denna t fäste i får s fäste i. Nu, jag ändra detta till mycket mer kryptiska stjärna t plus en lika stjärna s plus ett. Så vad som händer och varför har vi en stjärna karaktär? Vi har sett stjärnan tidigare, och den används på olika sätt här. Vi såg tidigare char *, nu jag ser en stjärna i början, och det är OK. Eftersom det visar sig vi kan typ av sluta bara från de första principer vad som händer. Så bara för att vara tydlig, vad är er? Förra veckan var det en sträng. Det räcker inte längre. Vad är s, speciellt? PUBLIK: [OHÖRBAR] DAVID J. MALAN: Det är en pekare. Det är adressen för första tecknet vi skrev in. OK, vad är t? PUBLIK: [OHÖRBAR] David J. MALAN: Den adressen för den första bitgruppen it, att bit av minne omfördelas. Så visar det sig att när vi upprepa från 0 på upp till strängen length-- först av allt, jag börjar vid 0, eftersom i denna gamla skola för loop sak. Så bara för enkelhetens skull, låt oss anta att den första raden kod är egentligen bara detta, rätt. Om jag är noll, lägga till noll till något förmodligen kommer inte att ha någon effekt. Så vad är detta talesätt? Det visar sig att stjärnan operatör i detta sammanhang är dereference operatör, vilket är bara ett fint sätt att säga gå till följande adress. Så om s är adressen till den första karaktär i denna bit av minne, * s organ dit. Och eftersom vi har ritat bilden på detta sätt, Du kan anta efter mental modell. Om detta är er, och ni säger * s * s ungefär som rännor och stegar, om du kommer ihåg matchen från barndomen, är som följer den pilen och gå till den adress. * t är samma sak. Så börja här, gå till sin bit. Jag kan inte bara dra nytta av den här skärmen på det sättet. * t innebär att gå hit. Och då är det för loop bara säger flytta denna karaktär här, flytta denna karaktär här, flytta denna karaktär här. Men hur gör jag det inkrementering? Jag behöver ångra vad jag bort bara. Detta är vad som brukar kallas pekare aritmetik, som betyder matte med adresser. Om det i detta för en slinga, Jag fortsätter uppräkning i, och s är en adress och t är ett adress, om jag håller bara lägga 1 det betyder bara fortsätta framåt, och framåt, och framåt i minnet. Det är som Oxford Street, gata som CS byggnaden är på. CS byggnader på 33 Oxford Street. Så om du skulle göra 33 Oxford Street plus ett, som tar dig till 34 Oxford Street, sedan 35 Oxford Street, då 36 Oxford Street, oavsett de byggnader faktiskt är - om de finns. Och så, det är allt vi gör här med pekare aritmetik. Så det är en super mystiska sätt att uttrycka oss själva. Men allt som händer under huven bara följa dessa adresser, gilla att följa en karta, om ni så vill, eller följande pilar som Vi har ritat på skärmen. OK, mycket att smälta. Varje fråga om syntax, begrepp, pekare, malloc, eller liknande. Ja, här borta först. PUBLIK: Så var det säger * t lika TOUPPER * t, är att gå att kapitalisera alla bokstäver eller bara-- DAVID J. MALAN: Ah, riktigt bra fråga. Så i denna linje här, 31, Detta kommer att kapitalisera den första bokstaven eller alla bokstäver. Så låt oss svara på det genom att gå tillbaka till första principer. Och första principer här menar jag bara att gå till de grundläggande definitionerna av vad det innebär. Så TOUPPER är en funktion som aktiverar en röding. Det var allt. * t betyder gå till first-- gå till adressen i t. Så, på bilden, om detta är en stor bit minne vi tilldelades med malloc, och detta är t * t betyder gå hit. Under tiden, du passerar detta värde, gemener m till TOUPPER, du får tillbaka huvudstad M, där du lägger det? Du lägger den i samma läge. Och detta genom att logiken i de grundläggande definitioner det är bara kapitalisera den första bokstaven om du inte upprepa med i eller för slinga eller en while-slinga, det kommer inte att göra något mer än du ber den. Bra fråga. Yeah? PUBLIK: Varför du använder dereference metod snarare än arrayen? DAVID J. MALAN: Ah, bra fråga. Varför skulle du använda dereference metod i stället för arrayen metoden? Ingen särskild anledning, att vara ärlig. Och, faktiskt, för detta typ av exempel rätt, Jag bara argumentera att göra programmet mer komplicerat, fler ögon inglasning över, folk bläddrar i eftersom det ser super svårbegriplig, men även om det gör samma sak. Och så, uppriktigt sagt, är detta en onödigt visuellt komplex lösning på problemet. Det är fortfarande god design, fem av fem för design, oavsett om det är i hållaren notation eller pekaren notation. Men-- särskilt när vi får senare i kursen Pset 5 när vi genomföra denna ordbok som Jag har nämnt ett par times-- vi faktiskt bryr sig om lågnivå minnesadresser att vi verkligen förstår vad händer. Men nu visar det sig att detta kodrad här hakparenteser inte verkligen existerar. De är vad som kallas syntaktisk socker, som är bara en metallbit coolt sätt att säga kompilator omvandlar hakparenteser vara som matematiskt uttryck. Så det är en mänsklig konvention att kunna bara skriva Dessa mycket användarvänliga konsoler. Men vad kompilator, klang, verkligen gör helst du skriver vad som lyfts fram i linje 24, under huven är det verkligen omvandla den till detta. Det är bara mer angenäm som en människa att läsa och skriva kod som linje 24. Men så småningom de stödhjul lossnar också när ens egen bekvämlighet blir starkare. Okej, så minns då att detta var den sortens största problemet Vi sprang in. Och det är vad utlöste hela denna jävla samtal om pekare, och adresser, och kopiatorer saker. Det var därför vi trippade över denna dumma, dumma frågan, varvid Jag genomfört logically-- med Lauren upp här på demo och apelsinjuicen i milk-- en perfekt algoritmiskt korrekt funktion för pumpning två variabler värden, men den jävla sak inte har någon ihållande, eller permanent, effekt på min kod. Och varför var det? I ett nötskal, varför är detta genomförande av växlings logiskt korrekt, men har ingen inverkan på de variabler som skickas till den, som x- och y för main? Vad var kontentan av problemet? Yeah? PUBLIK: Eftersom variabel gjort kopior av variabel i passet genom funktion. DAVID J. MALAN: Just det, när du passerar variabler till en funktion, eller argument till en funktion, de är passerade genom att kopiera, vilket innebär att du får en identisk ser mönster av bitar för både x och y, kallas här a och b. Och du kan göra något du vill med dessa kopior, men de kommer att ha någon effekt på anropsfunktionen. Och i själva verket, drog vi att bild på skärmen, återkallelse förra gången, där om du verkligen tänka på vad som är pågår under hood-- om Detta är datorns minne, och här nere är en stor bit av minne som används för main, detta är den del av minne som används för swap, och så även om huvud har två variabler, x och y, swap kan ha identiska ser värden, som båda är ett och två, men de är helt olika bitar av minnet. Så vi behöver en lösning på detta. Och ärligt talat, verkar det som vi nu har en lösning på detta problem, höger. Om vi ​​nu har möjlighet att manipulera saker i form av adresser och, typ av rännor och stegar stil, följ pilarna och gå någonstans vi vill i minnet, kunde inte vi lösa detta problem genom övergång från huvud att byta inte de värden vi vill swap, men bara intuitivt vad kan vi gå att byta i stället? [Inplacering UTTRYCKER] DAVID J. MALAN: Varför inte vi bara passera den adresser, eller hur? Varför vi inte ge swap en skattkarta, om ni så vill, som leder den till faktiska värdena x och y. Låt oss swap, faktiskt ändra de ursprungliga bitar, snarare än bara passerar kopior av bitarna. Och så, i själva verket, det är vad är kommer att vara lösningen. Denna version här är klart dåligt och bristfällig. Och nu, vid första anblicken, bara ser det som vi lagt till en massa stjärnor slumpmässigt och korsade fingrarna att det skulle kompilera. Men, skulle det nu kompilera. Men låt oss se vad detta betyder. Och, tyvärr, författarna C kunde ha valt en annan symbol att göra det lite tydligare, men stjärnan operatören har olika innebörd i två olika sammanhang. Och vi har sett både, men låt oss urskilja. Så upp på toppen finns, när jag har bytt a och b från att vara int si dåliga version till int stjärnor, a och b, tidigare var heltal. Vilka är a och b nu i det goda, gröna versionen? De är adresser. Adresser till vad, att vara tydlig? Adresser till heltal. Så det faktum att jag är säga int stjärna organ detta är adressen till ett heltal, specifikt. Så nu märker i rader kod, något annat har förändrats också. tmp förblir densamma, eftersom det är bara tillfälligt heltal inget minne magi där. Men nu behöver en stjärna. Och, faktiskt, varje andra omnämnandet av a och b, märker att allt som är byte från rött till grönt är att jag prefix dessa variabler med stjärnor. Eftersom jag inte vill kopiera a och b. För om jag bara kopiera a och b och swap a och b, vad ska jag egentligen byta? Bara adresser, jag vill byta vad som står på dessa adresser. Jag vill åka dit. Och så stjärnan operatören insidan av min funktion, inte inne av parameterlistan, innebär att du går till dessa adresser och faktiskt ändra dessa värden. Så vad gör bilden nu ser ut som i stället. Tja, om istället jag passerar in a och b inte ett och 2-- Jag behöver faktiskt lägga en andra definitionen här. Så antar att denna bit minne är på plats 10. Detta är på plats 11, men detta är lite av en förenkling, Jag har nu två val att göra jag passerar x och y eller som jag passerar deras adresser? Om jag passerar deras adresser så här, jag bara Nu behöver för att genomföra swap per den gröna koden så att när den ser ett och när den ser B, att det inte bara kopiera a och b och flytta mjölk och apelsinjuice. Den mjölk och apelsinjuice metafor bryter nu ner, eftersom de är koppar flytande och inte kartor. Vi behöver i stället för att gå att ta itu med 10 och vi behöver gå till adress 11, och utför sedan att byta logik. Så logiken är densamma, men vi behöver ett något annorlunda sätt att få tillgång till dessa variabler. Och så i slutändan, vad Programmet har att se ut är det. I swap.c rally kopieras och klistrat in gröna versionen. Men jag måste göra en förändring. Det är inte tillräckligt att bara ändra swap. Vilka andra kodrad måste jag ändra? Yeah? PUBLIK: Om det tar argumenten. DAVID J. MALAN: Var Det tar sin argumentation. Så om jag bläddra upp till huvud jag kan inte bara passera i x och y, och jag lovar, det sista bit av ny syntax idag. Jag behöver skicka in inte x och y men adressen av x och y. Och det visar sig, symbolen att författarna till C valde är om du använder ett et-tecken här, inte förväxlas med bitvis et-tecken, om du använder ett et-tecken här och ett et-tecken här, Detta listar ut för dig, vad är adressen för x, kanske är det 10, vad är det adress y, kanske är det 11, och passerar de i stället. Så mycket att absorbera allt på en gång. Men låt oss se nu snabbt våra återstående fyra minuter där saker och ting kan gå snett. Och som en sidoreplik, faktiskt Jag tog den här bilden, TF tog den här bilden ett eller två år sedan. Så det här är det bakre hörnet av Eliot Dining Hall. Pekare är kanske det svåraste ämne som vi täcker i CS50. Så om du oroa sort lutning är som kanske är det mer av en hockeyklubba så här, inser vi typ av närmar sig en topp i när det gäller den begreppsmässiga komplexitet. Och jag tar upp detta foto, eftersom jag svär gud, hösten 1996, när jag tog CS50 med min undervisning karl, Nishat Mehta, satte han sig mig i hörnet av Eliot D. Hall under lunchen, eller middag, eller något att prova att hjälpa mig att förstå pekare. Och det är där jag var veckor efter det infördes föreläsning när Jag förstod äntligen pekare. Och jag är hoppfull om att detta klickar långt tidigare för dig. Men inser att detta absolut bland de mer sofistikerade ämnen Vi har tittat på. Men det är bland de mest kraftfulla. Och när du får det, det är verkligen allt bara att äntligen komma samman. Så lita på att det inte måste alla handfat i dag. Så här är det sista programmet vi kommer att titta på. Och vi kommer att sluta med en snabba tre minuter claymation gjord av vår vän, Nick Parlante. Här är ett program, som på de två översta linjer deklarerar en variabel x och y. Som båda är adresser av heltal, AKA pekare. Vi sedan allokera tillräckligt minne för att lagra en int och lagra adressen i nämnda minne i x. Så, är det ännu enklare än exemplet tidigare. Ge mig fyra byte minne, det är storleken på en int, och satte den adressen i x. Denna linje betyder här gå till adressen i x och sätta innebörden av liv, antalet 42 där. Men denna linje oroar mig. Star y betyder gå till adressen i y, och satte otursnummer 13 där. Varför är det farligt, vid denna tidpunkt i story-- om än snabbt berättade i våra avtagande minuter här-- varför är det dåligt för mig att säga, gå till adressen i y? PUBLIK: inte Du har [OHÖRBAR]. DAVID J. MALAN: Jag har inte sätta något i y. Så vad är värdet av y, vid denna tidpunkt i historien? Vi har ingen aning. Det är en del skräp värde och inte heller Binky vet. Om vi ​​kunde sluta på denna anmärkning. [VIDEOAVSPELNING] -Hej, Binky, vakna. Det är dags för pekaren kul. -Vad är det? Lär dig mer om pekare? Åh, karamell. -Ja, 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. -Okej, Och jag ser två pekare, men de verkar inte vara pekar på någonting. -Det är rätt. Initialt pekare inte peka på någonting. De saker som de pekar på är kallas pointees och bygga upp dem är ett separat steg. -Oh, Höger, höger. Jag visste att. De pointees är separata. Så hur kan du tilldela en pointee? -Ok, Väl detta kod allokerar ett nytt heltal pointee, och denna del uppsättningar x att peka på det. -Hej, Ser det bättre. Så gör det att göra något. -Okej, Jag avreferera pekaren x lagra numret 42 i sin pointee. För detta trick, jag behöver min trollspö av Återgång. -Din Trollspö av Återgång? Eh, det är så bra. Det här är vad koden ser ut. Jag ska bara ställa upp antalet och-- [POP SOUND] -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, för att lagra 42 där inne. 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 trollspö Namnåtergång och bara-- [Summerton] -Oh, Hej som inte fungerade. Säg, eh, Binky, det gör jag inte tror Återgång y är en bra idé, eftersom inställning upp pointee är ett separat steg. Och jag tror inte att vi någonsin gjorde det. -Hmm, Bra poäng. -Ja, Vi tilldelas pekaren, y, men vi aldrig satt det att peka på en pointee. -Hmm, Mycket observant. -Hej, Du ser bra ut där, Binky. Kan du fixa det så att y poäng till samma pointee som x. -Visst, Jag använder min trollstav av pekartilldelning. -Är Det kommer att bli en problem, som förut? -Nej, Detta inte vidrör pointees. Det förändrar bara en pekare att peka på samma thing-- [Knäppande ljud] --as annan. -Jag förstår. Nu y pekar på samma plats som x. Så, vänta, nu y är fast. Den har en pointee. Så du kan prova trollspö Namnåtergång igen för att skicka den 13 över. -Oh, OK, här går. -Hej, Titta på det. Nu Namnåtergång fungerar på y. Och eftersom pekarna delar att en pointee, de båda se 13. -Ja, Dela, eh, vad som helst. Så vi kommer att byta plats nu? -Oh, Vi ser är för sent. -But-- -Bara Ihåg de tre pekar reglerna. Nummer 1, den grundläggande strukturen är att du har en pekare, och det pekar upp till ett pointee. Men pekaren och pointee är separata. Och vanligt fel är att inrätta en pekare men att glömma att ge den en pointee. Nummer 2, pekare Återgång börjar vid pekaren och följer sin pil över att få tillgång till sin pointee. Som vi alla vet, detta fungerar bara om det är en pointee, vilken typ av får tillbaka att regel nummer ett. Nummer 3, pekare Uppdraget tar en pekare och ändrar det att peka på samma pointee som en annan pekare. Så efter överlåtelsen, de två pekarna kommer att peka på samma pointee, ibland som kallas delning. Och det är allt som finns att det, verkligen. Bye-bye nu. [END SPELA] DAVID J. MALAN: Det är det för CS50. Tack vare professor Nick Parlante. Vi ses nästa vecka. [ELEKTRONISK MUSIK SPELA]