SPEAKER 1: Hej alla. Vi kommer att komma igång. Jag tror att folk fortfarande kommer vara filtrering i. Men till förmån för tiden, så vi kan får ni ut härifrån i tid, vi ska börja. Så välkommen till CS50 Quiz 0 omdöme. För er som inte har insett men har du en fråga på onsdagen. Woo-hoo. Om du inte har börjat plugga ännu, eller har inte insett att det finns ännu, tidigare frågesporter och all information om din frågesport är på cs50.net/quizzes. Det finns några ganska bra grejer där, senaste frågesporter från de senaste 10 åren samt information om detta quiz och ämnen som kommer att omfattas. Så låt oss komma igång. Så ni kanske minns, den första dagen i klassen David hade dessa lampor på. Så i huvudsak, allt som går på under huven på en dator är göras i binärt. Binär betyder vad det låter liknande, 0 s och 1 s. Den har två värden som kan representeras. Så precis som i den första dagen av avsnitt då David vände på en ljus glödlampa att företräda den, eller 1, vår dator förstår binära som 0: s och 1: s, på eller av. Grunderna i binärt. Varje plats är representerad i basen två. Så du lägger 2 till 0 till 1 till 2 hela vägen upp. För att beräkna vad din binärt är att decimal, du bara följa denna ekvation typ sak. Om du har en 1 i någon av dessa platser, du multiplicera det med allt vad basera det är i, lägga upp den, och du får decimal. Så detta är hur du räknar till 5 i binärt. Precis vad vi gjorde på sista bilden, det är så du skulle representerar 1 till 5. På samma sätt, precis som du kan lägga till och subtrahera i decimal eller basera 10, eller verkligen någon bas, på kan lägga och subtrahera i binär. Exakt vad du kan förvänta dig när du lägga till två upp, om det är lika med större än 1, du bär en 1, gör det en 0, och gör det dessutom på det sättet, bara som du kan förvänta dig med regelbunden decimal eller någon annan bas. Cool. Så som jag sa tidigare, allt som pågår under huven på vår dator sker i 0 s och 1 s, eller binärt. Så hur vi uttrycker till exempel bokstäver eller siffror eller tecken? Och svaret på det är ASCII. ASCII är en mappning mellan tecken som vi normalt skulle se i Engelska språket som A: s, B: s, C: s, understreck, bindestreck, och något liknande. Och den visar att till en ASCII-värde. Ett ASCII-värdet är bara ett nummer som kan förstås av datorn. Och precis som du kan göra tillägg och subtraktion med siffror, kan du göra dem med ASCII-värden. Så i detta exempel, vad kommer detta att skriva ut? Ja, så bara ett utrymme B space C space D. Vart tog min mus vägen? Lägg märke till att du kan definiera en int vid 65. Och när du skriver ut det med hjälp av procent C, det ska tolka det som en karaktär och kommer att skriva ut A. På samma sätt kan du deklarera det som ett tecken. Och när du sedan skriva ut med procent C, det ska tolka det som procent D. Och precis som du kan lägga till en nummer, kan du lägga till tecken är ASCII-värden, i detta fall. Så lite pekare för alla. 5, som en sträng, inte faktiskt lika 5. Så hur kan vi omvandla sträng 5 till heltalet 5? Några idéer? Yeah. Så om vi har 5 som en sträng, Vi kan subtrahera 0. Och det ger oss 5. Och på samma sätt, om vi har 5 som ett heltal, lägga det till strängen 0. Och det ger oss strängen 5. Cool. Nu minns tillbaka att föreläsa en där vi pratade om algoritmer. Så hur gör vi egentligen vill ha en dator att göra intressanta saker? Du vet, bara att lägga till och dra ifrån siffror och utskrift saker ut är inte så spännande. Vanligtvis vi vill att vår dator till utföra någon typ av algoritm. Något lite mer komplex än bara enkel aritmetik. En algoritm är bara ett steg för steg set av instruktioner för hur du utför en viss task-- precis som ett recept. Du kanske minns den första dagen av klass där David hade vi räknar ett rum människor och hur många som var i rummet. Du kan användas för att räkna en av en. 1, 2, 3, 4. I det fallet en linjär tidsalgoritm. Men David presenterade en algoritm för dig att räkna människorna i rummet där alla står upp, säger du ditt nummer till en annan person, tillägga att nummer upp, och en person sätter sig. Och du upprepa det. Det är en typ av algoritm. Vi kan analysera hur effektiv en Algoritmen bygger på det körs tid. Men vi ska prata lite mer om det senare. Så alla algoritmer kan också skrivas i pseudokod. Pseudokod är bara en engelska som syntax används för att representera ett programmeringsspråk. Till exempel, om vi ville ställa en användare gissa min favoritnummer, vi kan ha pseudokod som sådan. Få en användare gissa. Om gissning är korrekt, berätta för dem de är korrekt, annars berätta de är inte korrekt. Och pseudokod är ett sätt att enkelt representerar en idé eller en algoritm. Så nu vi kanske vill faktiskt skriva detta på det språk som datorn kanske förstå. Så vi kunde skriva våra pseudokod och tolka det i källkoden. Hittills måste källkod följa till en viss syntax ett programmeringsspråk. Och hittills i CS50, vi har använt mestadels c. Så det här kan vara källkoden för c. Senare under loppet, du natten kom i kontakt med andra program språk som PHP. Eller om du även ta andra klasser, du kan göra Java, Python, eller till och med OCML. Men i vår c programspråk, detta hur vi kan skriva källkoden för pseudokoden algoritm som Jag just beskrivit tidigare. Så hur gör din dator faktiskt förstå det? Som jag sa tidigare, det enda riktigt förstår nollor och ettor. Så hur det kommer från källan kod till något som kan vara förstått? Tja, vi har något kallas en kompilator. Om ni minns tillbaka i de flesta av dina psets, du hade någon form av program skriven på en punkt c-fil. Sen skriver du make. Så vad gör det? Du kan skriva gör att kompilera programmet eftersom someone-- den som skrev din p set; förmodligen David-- skapas en make-fil. Och som berättar att veta för att köra kompilator, som kallas klang, vilja som sedan kompilera källkoden till objekt koden, som är nollor och ettor att datorn förstår. Men lite senare kommer vi att gå mer på djupet om kompilatorer. Så minns pset 0, where-- ja, Har du en fråga? PUBLIK: [ohörbart]? SPEAKER 1: Ja. Jag tror att de faktiskt borde vara online. Yeah. PUBLIK: Är det som [ohörbart]? TALARE 1: Det är inte. Det är på cs50.net/quizzes. PUBLIK: Slash frågesporter, snedstreck 2013 slash 0, och bara klicka sig frågesporter 2013 och frågesport 0, granska sektions diabilder. SPEAKER 1: Ja, så om ni vill Dra upp den och titta på den på din egen dator, det är bra för. Säg det igen. PUBLIK: [ohörbart]. SPEAKER 1: Ja, [ohörbart] är den dummyvariabel. Åh, ja? PUBLIK: [ohörbart]? Högtalare 1: Nej, strejk inte på tentan. Tyvärr, hennes fråga var, var slag på tentan. Och det är inte. Så pset 0, ska ni ha alla genomfört något med scratch. Och vi lärde oss en del grundläggande programmering byggstenar som använder scratch. Så låt oss ta en titt på några av dessa byggstenar att göra upp ett program. Först är Booleskt uttryck. Booleska uttryck är sådana och 0: s eller något som har två möjliga värden. I detta fall är sant eller falskt, på eller av, och ja eller nej. Ett exempel på en enkel, mycket enkel, program som använder ett booleskt uttryck här uppe. Så för booleska uttryck till vara användbart, har vi booleska operatorer. Dessa aktörer som kan användas att jämföra vissa värden. Så vi har och eller inte lika med, mindre än eller lika med, större än eller lika med och mindre än eller större än. Men dessa aktörer inte är mycket användbara om vi inte kan kombinera dem till villkor. Så ni kanske minns från grunden och från din p sätter att vi hade förhållanden. De är i huvudsak som gafflar i logiken i ditt program som exekverar beroende på om ett villkor är uppfyllt. Så en av de förutsättningar som vi hade används många gånger i den här kursen är den om annat, om och annat villkor. Här är ett exempel på hur du kan använda det. Någon som vet skillnaden mellan bara använda om uttalanden alla vägen ner verser om, annars, om, och annars kombineras? Ja? PUBLIK: [ohörbart]. SPEAKER 1: Exakt. Så om jag haft om hela vägen ner här sätt, även om detta, återgår sant, kommer det fortfarande att fortsätta testa nästa två. För med ett annat-om, ett annat uttalande, om man returnerar true, de andra är inte testat. Eventuella frågor om detta? Cool. Så du använder en if-else av ett annat uttalande om du vet att det bara kan vara ett av dessa fall. Så vi vet om x är mindre än 0, det är definitivt inte att vara större än 0. Härnäst annan byggsten att vi lärt oss är slingor. Vi har tre typer av slingor. För loopar, medan slingor, och göra medan slingor. Och generellt, när du sitter ner till skriva något, måste du bestämma vilken av de tre som du vill använda. Så hur ska vi avgöra vilken som? Vi använder i allmänhet en för loop om vi vet hur många gånger vi vill iterera igenom något eller hur många gånger vi vill utföra en uppgift. Vi använder medan loopar om vi behöver lite förutsättning för att vara sant att hålla igång. Och vi använder gör samtidigt mycket lik tag, men vi vill att vår kod körs på minst en gång. Så gör samtidigt, det som finns i gör kommer alltid köra åtminstone en gång. För med tiden, det kan inte köra alls om villkor inte är uppfyllt. Eventuella frågor med det? Så strukturen i en for-loop. Ni har alla sett det. Du initiera den. Du har någon form av tillstånd. Så, till exempel, kan vi initiera som för mig är lika med 0. i är mindre än 10. Och i ++. Mycket enkelt en som vi har gjort. För en while-slinga, på liknande sätt, har du att ha någon form av initiering, någon typ av tillstånd, och någon typ av uppdateringen. Så kan vi implementera vår för loop också som en while-slinga använder denna. Och på liknande sätt med en gör while-slinga, Vi kanske har lite initiering, exekvera något, uppdatera den och sedan kontrollera tillståndet. Så nu fungerar. Vi sätter ihop allting. Vi kanske vill skriva lite typ av funktion. Gemensam funktion som du kanske har sett redan är främsta. Main är en funktion. Den har en returtyp, int. Den har ett funktionsnamn, huvud. Och den har argument, argc och argv. Så huvud är bara en funktion. Andra funktioner som du kan ha använt, printf-- printf är en function-- GetInt, TOUPPER. Men dessa råkar ha varit genomfört för oss av någon typ av bibliotek. Om ni minns inklusive Detta CS50.h biblioteket eller standard I / O-bibliotek. Ja, fråga? PUBLIK: Är huvud bara inneboende i c? Är det bara typ av [ohörbart]? TALARE 1: Frågan är Om huvud är inneboende i c. Och ja, alla funktioner har en huvudfunktion. Det är typ av nödvändig för att datorn att veta var man ska börja kör koden. PUBLIK: Så du skulle inte [ohörbart]? SPEAKER 1: Nej Fler frågor? Cool. Så precis som du kan använda en funktion som är skriven för dig, kan du också skriva en egen funktion. Detta är en funktion som någon kanske har skrivit att beräkna volymen av en q, till exempel. Det finns en typ avkastning här, i detta fall int, vårt funktionsnamnet q och vår lista med parametrar. Och observera att du måste skriva data typ av parameter du vill Använd annars funktionen inte vet vilken typ av parameter ska jag acceptera. Så i detta fall, vi vill ett heltal som vår ingång. Så varför skulle vi vill använda funktioner? Först av allt, bra för organisationen. De hjälper bryta upp din kod i mer organiserade bitar och göra det lättare att läsa. Förenkling. Detta är bra för design. När du läser en bit kod och den viktigaste funktionen är riktigt, riktigt lång, kan det vara svårare att resonera om vad som händer. Så om du dela upp det i funktioner, Det kan vara lättare att läsa. Och åter-förmåga. Om du har en bit av kod som är att vara heter eller köra flera gånger, istället för att skriva den koden 10 gånger i huvudfunktion, kanske du vill återanvända den. Och sedan varje gång du behöver använda den bit kod, anropa funktionen. Så nu om vi minns tillbaka till grunden, Vi pratade också om några begrepp, en av vilken är threading. Tråd är begreppet multipla sekvenser av kod exekvera samtidigt. Så tänker tillbaka på dag ett där David hade ni räkna antalet av personer i rummet. I huvudsak vad som pågick på är alla ni var köra separata trådar. Och dessa trådar kom tillsammans att få något slags svar. Även i Scratch, när man har flera sprites, kanske du har en katt och en hund. Och de skulle vara samtidigt kör sina egna manus. Det är ett exempel på gängning. Och den andra begrepp som var introducerades i början var händelser. Och händelser är när flera delar av koden kommunicera med varandra. I Scratch, var detta när du använde broadcast kontroll och när jag Mottag block. Och även i Problem Set 4, såg vi lite av evenemang också. Ni kanske har använt den Gevent biblioteket. Och det fanns en funktion waitForClick där du väntade för användaren att klicka. Och din klick, i detta fall skulle vara händelsen och vänta på klick är ditt händelsehanterare. Och även under kör dina psets och arbetar på dina psets, du kan ha kommit i kontakt med vissa av dessa kommandon. Detta är vad du skrev i din terminalfönster eller vad fönster som dyker upp på din g edit till, huvudsak, navigerar din dator. Så till exempel, listar LS på innehållet i en katalog. Gör katalog skapar en ny mapp. CD, ändra katalog. RM, ta bort, tar bort en fil eller någon katalog. Och sedan ta bort katalog avlägsnar en katalog. PUBLIK: [ohörbart]? SPEAKER 1: Ja, visst. Tyvärr, var frågan om du skulle föreslå att sätta detta på fusklapp. Det skulle kunna hjälpa till. Om du har plats kan du lägga den på. Det är också bara allmänt bra nog att komma ihåg att när du använder den kanske du vill bara ha det i minnet. Det kommer att göra ditt liv mycket enklare. Har jag svara på din fråga? Så nu, pratade vi lite kort om biblioteken. Men de två viktigaste som vi har varit använder så långt i kursen är standard I / O och CS50. Vilka saker är inkluderade i standard I / O-bibliotek? Ja, så långt vi har använt printf. I CS50 har vi använt getInt och GetString. Och datatypen sträng händer också deklareras i denna CS50 biblioteket. Vi pratar lite mer på djupet om hur biblioteken fungerar och hur de interagera med resten av din kod. Men de är de två viktigaste som vi har kommit i kontakt med den del i kursen. Typer. Dessa är bra att komma ihåg hur mycket varje typ representeras av eller hur många bytes vardera typen requires-- int, 4 byte; röding, 1 byte. Float är fyra byte. Vad är en dubbel? PUBLIK: [ohörbart]. SPEAKER 1: Ja, så en flottör men dubbelt så stor. Vad sägs om en lång tid? PUBLIK: [ohörbart]. SPEAKER 1: OK. Vad är en lång tid? PUBLIK: [ohörbart]. SPEAKER 1: Ja, dubbla en int. Ja. PUBLIK: [ohörbart]. SPEAKER 1: Lång [ohörbart]. Och sedan en lång lång är dubbla. PUBLIK: Nej, nej. En lång är bara en int. Det beror på arkitekturen innan [ohörbart] och int har samma storlek. [Ohörbart]. SPEAKER 1: Så en lång och en int är desamma. Och sedan en lång lång är dubbelt så int. Cool. Och sedan, vad som är den sista typen? PUBLIKEN: Pointer. SPEAKER 1: Ja, så vi lärde oss lite om pekare. Och oavsett vad en pekare är pekar att-- det kan vara en char stjärna eller en int star-- det är alltid 4 byte för en pekare. Har du frågor om detta? Ja? PUBLIK: [ohörbart]? SPEAKER 1: Så en lång och en int är samma i detta CS50 apparat. PUBLIK: Apparaten är helt utbytbara. SPEAKER 1: Ja. Så sedan en lång lång är dubbelt en int. Publik: Detta är det 32 ​​bitars? TALARE 1: 32 bitars, ja. PUBLIK: Så [ohörbart]? SPEAKER 1: Ja, om det inte uttryckligen säger, du bör ta en 32 bitars. PUBLIK: Det skulle säga något som att man antar en arkitekturen som apparaten. För 64 bit, det enda som förändring är långa och pekare. De båda [ohörbart]. SPEAKER 1: Ja? PUBLIKEN: Fråga. Så på en av övningsfrågesporter, det ber om en osignerad int. Så hur skulle det avgöras från en int [ohörbart]? SPEAKER 1: En osignerad i är också 4 byte. Men det som är annorlunda med en signerad int och en osignerad int? PUBLIK: [ohörbart]. SPEAKER 1: Rätt. Man kan representera negativa värden. Men hur går det göra det? PUBLIK: [ohörbart]. SPEAKER 1: Ja, det sparar 1 bit för att representera tecknet. Den undertecknade har en bit att representerar tecknet. Och osignerade bara är alla positiva. PUBLIKEN: OK. Så du säger att en dubbel är två gånger storleken på en flottör? SPEAKER 1: Double är dubbelt storleken av en flottör, ja. PUBLIK: Hur fungerar en pekare till en lång lång [ohörbart]? SPEAKER 1: Så frågan är hur fungerar pekaren till en lång long-- hur är det endast fyra byte när en lång lång sina 8 byte. Så kom ihåg vad som är en pekare, väsentligen åtmin basvärdet. PUBLIK: [ohörbart]. SPEAKER 1: Ja, så en pekare är bara en minnesplats. Så det spelar ingen roll hur mycket utrymme att pekaren pekar på. Den behöver endast fyra byte för att hålla reda av denna minnesplats. Fler frågor? Cool. Så det sista jag har är standard ut. Du bör använda dem ofta nog att du kan komma ihåg. Men det är när vi använder printf, till exempel. Och vi har dessa platshållare som kallades formatkoder. Så procent c röding, procent i för int, och vi kan också använda procent d. Det är samma sak. Men, generellt, i CS50 vi försöker använda procent i. Procent f för float. Procent ld under lång lång och procent är för sträng. På samma sätt har vi använt några av dessa escape-sekvenser. Exempelvis bakstreck n för ny rad. Detta är bara för när du forma din kod för utskrift f. Ja? PUBLIK: Vad är procent d för? SPEAKER 1: Så frågan är det som är procent d för? Procent d är för Ints. Procent d och procent i är det samma. PUBLIK: Vad är skillnaden mellan snedstreck n och omvänt snedstreck r? SPEAKER 1: Så frågan är vad är det Skillnaden mellan dödgång n och motreaktion r? Jag tror att backslash r är-- PUBLIK: Så backslash r bara innebär återvänder till början av raden utan att faktiskt gå till en ny rad. Så om du skriver ut ett bakstreck r och du gå tillbaka till början av raden då du skriver ut mer saker, du skriver över de saker som redan finns på [Ohörbart]. För n faktiskt går till en ny linje och går till [ohörbart]. SPEAKER 1: Tja, några andra frågor? Okej. Jag kommer att lämna det till Dan som kommer att fortsätta. [Applåder] DAN: Alla righty. Så jag kommer att prata om en annan stor utbud av idéer från den klass som är ungefär representativ för vecka två och början av vecka tre man börjar med gjutning, vilket är bara ett sätt att behandla ett värde av en viss typ som ett värde av en annan typ. Så vi kan göra detta med tecken till ints, flöten till ints, och långa längtar till det dubbla. Alla dessa saker kan användas som sätt att behandla vissa numeriskt värde minus röding som vissa andra numeriskt värde. Så det finns vissa problem med detta, om kurs, som kommer när du kastade saker som float till Ints. Så det här är lite konstigt. Vi har en flottör som är 1,31. Vi multiplicera det med 10.000. Och då kan vi skriva ut den som en int. Vad denna utgång? 10.000 gånger 1.31. Så 13.000, är ​​att gissa? PUBLIK: Jag tror det är 10.000. DAN: Så jag multipliceras med 10.000 innan jag kastar den. PUBLIKEN: Åh. Skulle inte det vara en 9 och några 0 siffror? DAN: Du kanske har några konstiga siffror. Så rätt, det är 1,3 gånger 10.000. Så det är 13.000. Och denna extra weird-- PUBLIKEN: 13,100. DAN: 13.100. Tack, Rob. Och denna extra weirdness-- detta 9,9-- är helt enkelt därför att denna gjutning hamnade avrundning där Det ska inte ha. Yeah. PUBLIK: Gjutningen sker efter något annat? DAN: Så eftersom jag har det i tryck, det gör denna multiplikation innan det gör denna gjutning. PUBLIK: [ohörbart]. DAN: Jag tror att det skulle kasta först, ja, vilket skulle vara 10.000. Något annat? Cool. Så det här är 13,099. Varför händer detta? Vaghet. Flyter är inte perfekta. De kan bara representera nummer till en visst antal signifikanta siffror. Så om vi skriver ut åtta signifikanta siffror på denna flottör, får vi en typ av ful ser nummer. Och det beror på 1,31 kan inte exakt representeras av enkla tvåpotenser i maskinen. Så det slutar med den närmaste gissa, som hamnar att vara lite låg. Vettigt? OK. Nu slås är ett annat sätt att gör villkorssatser där alla vi bryr oss om är en enda variabel. Så i detta exempel, vi är få ett heltal från användaren. Och så tittar vi på vad det heltal är. Förmodligen är det antal mellan ett och fyra. Det är det vi ber om. Så du gör ett byte av variabelnamnet. Då du ställa in fall av möjligt värderar det kan vara. Så skift en, säger att det är lågt. Och sedan bryta för att få ut omkopplarens tillstånd så du behöver inte hålla på. I nästa case-- så fall två och fall tre-- om det är fallet två det bara sjunker ner till den första kodrad den ser som med skift tre tills den ser en paus. Så anledningen till att du får fråga en till bara skriva ut lite är att jag har denna paus här. Om jag, säg, ignorerade detta break-- om jag kastade här breakaway-- Det skulle skriva ut låg, och då skulle skriva ut mitt, och då skulle det gå sönder. Så raster är en viktig del av växlar förhållanden och De borde vara där. Alla ärenden som inte uttryckligen anges hanteras av standard fallet i strömbrytaren och skall gjutas. Publik: So 1, 2, 3, och 4 skulle vara n? DAN: Värden som n kan vara. Ja. Yeah? PUBLIK: Så när du har att [ohörbart]? DAN: Du skulle skriva lite, och sedan Det skulle skriva ut mitt och då det skulle bryta. PUBLIK: Varför skulle det skrivas ut mitten om [ohörbart]? DAN: Så allt under ett fall innan en paus faller under. Så fall ett tryck är nedanför fallet en som är här efter utskrift. Yeah? PUBLIK: [ohörbart]? DAN: Så det här numret är bara en viss värde som denna variabel kan ta, eller hur? Är det vettigt? Yeah. PUBLIK: [ohörbart]? DAN: Ja, fråga två skulle skriva ut mitten och sedan bryta. PUBLIK: [ohörbart]? DAN: Jag tror någon? Vilka andra datatyper kan du växla över? PUBLIK: Du kan byta över alla datatyper. Men det betyder bara något över tecken och Ints och sånt, för om du byter över en pekare som egentligen inte rimligt, växla laster, om det lät s du gör det, på grund av flyttal i precision, skulle du inte riktigt vill göra det ändå. Så ganska mycket, bara Ints och tecken och sånt. DAN: Ja, det är när man har explicit värden som du vet, jag tror, ​​kan vara att en omkopplare är faktiskt användbara. Bra? OK. Scope är det område som deklarerat variabel sträcker sig. Så i denna lilla bit av kod jag har, det skulle vara full av fel. Och anledningen är att jag förklarade detta int Jag inom ramen för detta för slinga. Och så försöker jag att referera till att Jag utanför det för loop omfattning. Så i princip kan du tänka på omfattningen som något som du deklarerar med i en uppsättning klammerparentes endast finns inom dessa klammerparenteser. Och om du försöker och använda den variabeln utanför dessa klammerparenteser, du ska får ett felmeddelande från kompilatorn. Yeah? PUBLIK: Så här inte fungerar? DAN: Detta fungerar inte, ja. Strängar. String en char *. De är exakt samma. De är bara pekare till tecken. Och alla strängar som du har ska avslutas med omvänt snedstreck noll, vilket är precis a c konvention. Det kallas NULL terminator. Och NULL-- huvudstaden N, huvudstad U, huvudstad L, kapital L-- inte är samma som den NULL terminator. Detta är en pekare. Detta är ett tecken. De är mycket distinkt. Kom ihåg det. Det kommer att vara på frågesport, förmodligen. Jag har inte sett testet. Yeah? PUBLIK: Så NULL är, säg, pekaren? DAN: Ja. PUBLIK: Vad [ohörbart]? DAN: Om, säg, malloc anropas när du har inte tillräckligt med minne för att få vilken storlek du ber om, malloc returnerar NULL. Det är i grund och botten, när en funktion är tänkt att returnera en pekare, du måste kontrollera mot NULL eftersom NULL är en ganska good-- Det är, liksom, sopor värdet. Det är en nolla så långt som pekare går. När du ringer en funktion, som returnerar en pekare. Du kommer att vilja kolla vara Se till att det pekaren inte är NULL eftersom NULL är mycket vanligt. Det blir liksom ett skräp avkastning. Så om något inte gick rätt, bara tillbaka NULL istället. PUBLIK: [ohörbart]? DAN: Ja, och det är det. PUBLIK: [ohörbart]? DAN: Stava det som denna. Det är NULL terminator. Det är gement N-U-L-L, om du stava det. PUBLIK: Och jag gick bara tillbaka och testade den. Och om du försöker sätta ett flyttal värde i en växel, det ska skrika på dig sade kräver uttalande uttryck av heltal typ. DAN: Sådär. Men ja, vad var frågan nu igen? PUBLIK: [ohörbart]? DAN: Så huvudstad N, huvudstad U, huvudstad L, kapital L är en verklig c sak. Det är NULL-pekare och kommer endast behandlas som sådana. Du kommer aldrig försöka stava NULL karaktär och se någon annat sätt än detta. Yeah? PUBLIK: Så återvänder till char max eller något i noterna, skulle det förkroppsligar samma funktion som [ohörbart]? PUBLIK: Så är du hänvisar till åter röding max från getchar, eller vad det nu är? PUBLIKEN: Ja. PUBLIK: Ja, så det allmänna begrepp för alla dessa saker är indikatorvärden. Så som återvänder int max från getInt och röding max från getchar, det är tänkt att vara som, okej, om dessa saker återvänder till oss, något gick fel. För tips, vi råkar bara ha denna sentinel värde som alla håller med om. Och detta är vad du kommer tillbaka när saker går fel. Så röding max är vad vi använder att representera något som NULL eller getchar. PUBLIK: Så om du testar getchar, kan du bara sätta NULL? Skulle det göra någon skillnad? DAN: Du kan inte bara kolla NULL. Du skulle behöva kontrollera char max eftersom returvärdet från funktionen är en karaktär inte en pekare. Yeah? PUBLIK: Denna fråga ställer för stränglängd. Betyder det inkluderar NULL karaktär? DAN: Nej Och det är faktiskt hur stränglängd vet att sluta eftersom det går igenom din samling av tecken tills den ser en NULL karaktär. Och då är det som om alla rätt, jag är klar. PUBLIK: [ohörbart] fem? DAN: Hej skulle bli fem. Japp. Så arrayer är kontinuerliga minnesblock. De har omedelbar tillgång genom att säga namn i matrisen och sedan, i lockigt hängslen, oavsett index du vill gå till, de är indexerade från noll till längden av arrayen minus 1. Och de som deklarerats av den typ av sak som du lagrar i array, namnet på arrayen, och sedan oavsett storlek är i samma matris. Så det här är en char array med längden sex som har dessa värden. Yeah? PUBLIK: [ohörbart]? DAN: Ja. PUBLIK: [ohörbart]? DAN: Om du har vad som händer i arrayen som redan gjorts. Så du kan ange detta i stället som, säg, röding, oavsett namnet på din array är, tom parentes är lika lockigt brace H kommatecken E kommatecken L kommatecken L kommatecken O kommatecken NULL karaktär och klammerparentes. Det skulle också fungera som en förklaring. PUBLIK: [ohörbart]? DAN: Då måste du ha storleken som redan gjorts. PUBLIK: [ohörbart]? DAN: Ja. Alla righty. Kommandoradsargumenten är ett sätt att få input från användaren som argument till main. Huvud tar två argument. Antalet argument som är att vara passerade längs kommandoraden och strängvektor eller en sträng array av alla argument. Så om jag, säg, som kallas en funktion som en punkt ut 1 rum, 2 utrymme, tre, argc skulle vara 4. Och argv 0 skulle vara en prick ute. Argv1 skulle vara 1. argv2 vore 2. argv3 skulle vara 3, i det specifika fallet. Yeah? PUBLIK: [ohörbart]? DAN: Det sista elementet i arrayen eftersom matrisen är längden argc plus en av ARGB, det sista elementet är NULL-pekare. Det är argc plus ett. Så i det fall som jag sa, det skulle argv 0 är en prick ut. argv 1 är 1. argv2 är 2. argv 3 är tre. argv 4, som är ett större än argc skulle vara NULL. Och det är NULL-pekare. Ja. Och det beror på att strängen är en röding stjärna är en pekare. Så det måste vara av samma typ. Yeah? PUBLIK: Två frågor. Så en, vad är skillnaden mellan Detta och annat än en typ GetString i användar motor? Och två, lagras inom ditt senaste minne? Så som, GetString skulle vara [ohörbart]? DAN: Var lagras den? Jag vet inte var den finns. PUBLIK: Så, egentligen, du vet hur något fungera du kallar det är argument lagras i stapeln? Så argc och argv är argument till huvud och de är på stacken, eller egentligen strax över vad du tycker så starten av stapeln. Vad var den andra av frågan? PUBLIK: Så vad är [ohörbart]? DAN: Ja, det är bara ett annat sätt att få input från användaren. Den här är något mer effektiva och det är smidigare för skript eftersom du kan bara passera argument till din huvudsakliga funktion i stället för att vänta för användare, om du inte har någon användare. PUBLIK: Och ja, få strängar skulle vara [ohörbart]. Det skulle spara det du behöver. DAN: Yeah? PUBLIK: [ohörbart]? DAN: Ja, argv 0 innefattar alltid dot slash av funktionsanrop. Yeah? PUBLIK: [ohörbart]? DAN: Ja, var och en av argumenten är slutade i NULL karaktär eftersom de är strängar. PUBLIK: [ohörbart]? DAN: Ja, argv argc en NULL-pekare. PUBLIK: [ohörbart]? DAN: Oh yeah. Ja, förlåt. PUBLIK: Så [ohörbart]? DAN: Så frågan är om du hade kommandorad dot slash en punkt ut 1, 2, skulle antalet kommandoraden argumenten vara två eller skulle det vara tre? PUBLIK: Jag tror att det inte verkligen betyder. Jag brukar säga, oh, gjorde du inte passera eventuella kommandoradsargument när, självklart, ringde dig funktionen. Så jag brukar vokalt utesluta funktionen från kommandoraden argument även om det är ingår i argv. DAN: Men om det var på test-- yeah-- och även om du säger något liknande argc lika 3, du är i säkert stående. Yeah? PUBLIK: [ohörbart]? DAN: Jag tror att om istället för att ringa det i argc och stråk argv fästen men höll samma typer och bara kallas dem något annat som en b, skulle det ändå fungera? Och det skulle ändå fungera, skulle du bara-- istället för att använda argc-- du skulle använda a och b. Yeah? PUBLIK: [ohörbart]? DAN: Så frågan är GetString är kommer att lagra minne i högen eftersom GetString är char *. Den lagrar minne i högen eftersom det uppmanar nu malloc inom själva genomförande av GetString. OK, vi går vidare. Säkerhet. Så för att vara riktigt säker, du lita på någon en och du tillåter ingen tillgång till någon av din information, varför alla bygger sina egna maskiner, sina egna operativsystem, all deras program från scratch, och självklart Anslut inte till några andra maskiner via Internet. Så datorer är osäkra. De är verkligen. Vi måste lita på andra människor. Och tanken på att säkerheten är att du är försöker att begränsa mängden förtroende som du behöver. Och ett av de medel du gör det är genom kryptering. Kryptografi är, i huvudsak, vi har hemligheter. Ibland måste vi passera våra hemligheter tillsammans med, säg, Internet eller andra saker. Och vi vill inte att folk känna dessa hemligheter. Så vi krypterar våra hemligheter till ett sätt att vi hoppas att ingen kan räkna ut. Så vi used-- genom loppet av denna class-- saker som Caesar chiffer och [Ohörbart], som båda är mycket, mycket osäkra sätt att kryptera saker. De är lätt att räkna ut vad de är och vad dina hemligheter är. Den verkliga världen använder mycket mer komplicerade krypteringsprogram. Och vi kommer inte att komma in mycket mer än så. Debugging. GDB är bäst. Jag kommer att betona detta igen. Använd GDB hela tiden varje gång du har ett problem. Kommandon som är användbara i GDB är bryta, vilket du passerar antingen en linje nummer, ett funktionsnamn, i huvudsak var i koden du vill sluta, och kunna ta kontroll. Skriv ut tar en variabel och skriver ut vad den variabeln är det punkt i ditt utförande. Nästa flyttar ditt utförande längs ett steg. Och steg steg inuti en funktion i ditt utförande. Andra saker sköts, vilket är hur du faktiskt köra din kod. Fortsätt tar alla steg som behövs för att komma till nästa brytpunkt. Och det finns många, många andra. Slå upp dem. De är stora. Yeah? PUBLIK: [ohörbart]? DAN: Ja, som är en debugger. Så en debugger är ett program som kan du felsöka ditt program. Det är inte ett program som hittar buggar för du skulle även vara bra. Och sist för mig är sökning. Så vilka typer av sökningar som vi talat om i den här klassen är linjär sökning, som är precis som du tittar igenom varje elementet av sökrymden, en element i taget, tills du hittar det du letar efter, eller tills du når I slutet av din sökning utrymme där pekar du säger att du inte kunde hitta det element som du letade efter. Och detta tar i bästa fall konstant tid, vilket är 0 av 1 och i värsta linjär tid, vilket är 0 på n. Binär sökning, som behöver smutsiga element. Du går till mitten av dina element, se om det element du söker är större eller mindre än det element att du är i mitten. Det är det större, säger du att botten av din sökning utrymme är din nuvarande plats, mitt, och du startar processen. Om det är mindre, ser du säger att i-- ja, vad är det? PUBLIK: [ohörbart]? DAN: Ja. Någon slags sort som har undervisats i klassen är lovligt byte för testet. [LAUGHTER] DAN: Och det faktum att du inte har haft att göra det för ett problem som, det är rättvist spel för testet. PUBLIK: Kan vi gå över den hur att-- DAN: Det kommer att vara borta över. TALARE 2: Själva koden för [Ohörbart] är på study.cs50.net. Så om du tittar på praxis problemet i sammanslagnings slags sida study.cs50.net, det är koden för att genomföra samman sort. Så du behöver inte genomföra det själv ikväll. Men se till att du förstår det ganska än att bara memorera det. PUBLIK: [ohörbart]? TALARE 2: merge sort sida på study.cs50.net, det finns en praxis problem som, om du klickar igenom problem, i slutet finns en lösning, som är sammanfogningen sorterings genomförande. Men se till att du förstår det snarare än att bara memorera det eller kopiera den. PUBLIK: Och ett fullvärdigt problem för testet skulle vara något som här är en lista. Vad innebär denna lista se ut efter ett steg av markeringar sortera eller insättnings sortera eller vad som helst. En fullständig upprepning av listan. Så även om du inte slutar att behöva kod för det, måste du förstå det tillräckligt för att veta hur det går att ändra denna matris. DAN: Det är det för mig. [Applåder] LUCAS: Hej alla. Jag heter Lucas. Jag ska tala om rekursion, alla den typ som vi har lärt oss, och en lite av alla pekare. OK? Så först av allt, rekursion. Vad innebär det att säga att en funktion är rekursiv? PUBLIK: Kallar sig. LUCAS: OK, kallar sig, ja. Så gillar den här bilden, till exempel. Det är som på bilden inuti av en bild och så vidare. Så till exempel kan du have-- som Dan som talade om binär sökning. Ett sätt på vilket binär sökning är rekursiva är det faktum att du är försöker hitta ett nummer. Så du går till mitten. Och sedan kontrollera om siffrorna där i den vänstra och i den högra. Och sedan om du ta reda på numret är kommer att vara till vänster, det är samma sak som gör sökningen igen men precis till vänster i listan. Så det är hur det låter som det är rekursiv. Så det är därför ni har rekursiva lösning för merge sort. OK, så här är ett exempel. Så låt oss säga att jag vill välja alla nummer från 1 till n. Jag kan inse att summan av n nummer är n plus n minus 1 till 1. Men sedan, om jag tittar på n minus 1 plus n minus 2 plus 1, är att samma sak som summerings siffror upp till n minus 1. Så jag kan säga att summan av en lika stor summa är lika med n plus summan av n minus 1. Är det vettigt? Och jag också skulle ha något annat kallade basfallet, nämligen att summan av talen upp till noll skulle vara noll. Så fort jag får till det antal noll, jag sluta räkna. Är det vettigt? Så här är ett exempel på hur Jag kan genomföra det. Så jag har denna funktion på något. Det tar ett heltal n. Så här har jag kolla först om n är mindre eller lika med noll. Så om det är mindre eller lika med noll, jag returnera noll, vilket är vår bas fallet. Annars kan jag bara gå tillbaka n plus summan av talen från en till n minus ett. Vettigt? OK. Så här är vad det ser ut. Du har summan av två jämlikar 2 plus ett belopp på 1. Och en del av 1 är 1 plus summan av 0, som är 0. Vettigt? Så om vi tittar på högen av din program, det är vad det ser ut. Först har vi den viktigaste funktionen. Och så den viktigaste funktionen kallas summa 2. Och sedan summan 2 kommer att säga, oh, summa 2 lika med 2 plus summan av en. Så jag lägger till summan av 1 till stacken. Och summan av 1 kommer att ringa summan av 0, vilken också kommer att tillsättas till stacken. Och sedan var och en av dessa de som är ovanpå varandra måste återvända innan de andra kan fortsätta. Så till exempel, här, summan av 0, först, kommer att återvända 0. Och välj sedan summan av 1. Då summan av 1 kommer att återgå 1 att summera 2. Och slutligen, är summan av 2 går att återvända 3 till huvud. Är det vettigt? Det är verkligen viktigt att förstå hur stacken fungerar och försöka se om det är vettigt. OK, så sortering. Så varför är sortering viktigt, först av allt? Varför ska vi bry oss? Någon? Ge mig ett exempel? Yeah? PUBLIK: [ohörbart]. LUCAS: Ja, OK. Så du kan söka mer effektivt. Det är ett bra sätt. Så, till exempel, har vi en hel del saker, faktiskt, i våra liv som sorteras. Exempelvis ordböcker. Det är väldigt viktigt att ha alla de ord något slags ordning som vi kan komma åt lätt. Så det är vad han sade. Du kan söka mer effektivt. Tänk på hur svårt det skulle vara att ha en ordbok där orden är i slumpmässig ordning. Du måste titta på, ganska mycket, varje ord tills du hittar den ord som du letar efter. Om du använder Facebook också, när du tittar på dina vänner, du kommer att se att Facebook sätter din närmare vän är på toppen av de att du inte pratar med så mycket. Om man går hela vägen till botten av din vänlista, du kommer att se människor som du gör antagligen inte ens kom ihåg att du är vän med. Och det beror på att Facebook sorterar dina vänner utifrån hur nära du är till dem. Så organisera data. Också Pokemon. Så du ser att alla Pokemons har siffror. Och det är som en lätt sätt att komma åt data. PUBLIK: Åtkomst Pokemon. LUCAS: Ja. PUBLIK: [ohörbart]. LUCAS: Japp. OK, så valet sort. Urval sort kommer att välja minsta osorterade värde på en lista varje tid i varje iteration. Det är ungefär som den typ som du gör i ditt huvud när du försöker sortera en lista till hands. I grunden är allt du gör att du ser för det minsta antalet. Du sätter den i den sorterade listan. Och då du leta efter näst minsta antalet. Och sedan hålla gör det och så vidare. Så valet slag är i princip du Välj varje gång den minsta osorterat värde. Sätt i slutet av den sorterade del av listan. Och fortsätta att göra det. Så låt oss snabbt se vad detta ser ut. Så här är sorterade och osorterade listan. Så för den sorteras i listan, det är initialt tomma. Och sedan ska jag välja minsta antal här, vilket är 2. Så jag få nummer 2 och jag satte i den främre delen av listan. Och då ser jag för nästa mindre element, vilket är 3. Så jag satte den i slutet av den sorterade listan. Och då jag fortsätter att göra det. Jag finner 4 och lägga den i slutet. Hitta 5 och lägga den i slutet. Och titta på hur alla dessa tider som Jag säger lägga den i slutet är, i grund och botten, byta två värden. OK? Och så den sista, du bara har ytterligare en faktor. Så det är redan sorterade. OK, så inför slag. Insticks sort du ska ha också det där med att ha en sortering och en osorterad lista. Det enda är att varje gång du lägger ett element till den sorterade lista, du bara välja det element som är framför den osorterade listan. Och då du kommer att hitta vad ställning bör det vara i den sorterade del av listan. Låt oss se vad detta är så det är mer förnuftigt. Så till en början, till exempel, jag försöker att för in nummer tre i sorterad del av listan. Så listan inte har något. Så jag kan bara sätta siffran 3. Nu vill jag lägga till numret 5 till den sorterade delen av listan. Så jag tittar på antalet 5. Jag märker att det är större än 3. Så jag vet att det måste vara efter 3. Så jag satte 3 och 5. Då vill jag in nummer 2. Jag märker att antalet 2 är faktiskt varar då både 3 och 5. Så jag har faktiskt sätta det hela sätt i början av listan. Så jag måste, typ av, flytta alla element i den sorterade listan så jag kan göra plats för antalet två. Då ska jag se hur många 6. Jag ser att det bör vara efter 5. Så jag satte den där. Och slutligen, jag tittar på nummer 4. Och jag märker det ska vara mellan 3 och 5. Och då jag lagt det där och skift alla andra element. Vettigt? Bubble Sort. Så bubbla slag är i princip vad du är kommer att do-- vi kallar det bubblan sortera eftersom du går igenom list-- det är faktiskt bättre om jag visar bara du gillar detta-- och du kommer att jämföra angränsande nummer. Och du kommer att byta sin positioner om de inte är i rätt ordning. Så i princip, vad som kommer att hända är här, till exempel, du har 8 och 6. Du vet att den sorterad ordning kommer faktiskt vara 6 och 5, eller hur? Så du kommer att byta order. Sedan ser jag 8 och 4 här. Och jag gör samma sak. Jag byter igen. Och slutligen, 2 och 8. Jag byta dem också. Det kallas Bubble Sort för efter var och en av dessa upprepningar, faktiskt, det största antalet i listan blir allt vägen till slutet av listan. Är det vettigt? Eftersom det håller byta det och flytta den till höger. OK, så det här är den andra iterationen. Det skulle vara samma sak. Jag ska göra en swap och då den sista. Jag att det finns inga swappar och listan sorteras. Så i Bubble Sort, vi i princip hålla gå igenom listan och byta saker tills jag märker att jag inte gjorde eventuella swappar gör att iteration, vilket innebär att listan redan sorteras. Vettigt? Låt oss tala lite om att köra tid. Så gör ni minns Big O, Omega och Theta? Yeah? OK, vad är Big O, först av allt? PUBLIK: [ohörbart]. LUCAS: Ja, det kallas ett värsta runtime, som just innebär att det är hur mycket du räknar med att programmet att vidta för att köra. Liksom i fråga of-- i detta case-- n. Antalet element i listan i det värsta fallet. Liksom, i värsta möjliga fallet. Så för Bubble Sort, till exempel, vi har Big O n kvadrat. Varför har vi det? Varför är Bubble Sort Big O n torget? PUBLIK: [ohörbart]. LUCAS: Ja, så det värsta kommer att vara att jag måste göra n iterationer. Så var och en av iterationer kommer att bringa det största elementet till slutet på listan. Så det värsta fallet är att jag har att göra det där n gånger. Och för var och en av dessa gånger, måste jag gör n swappar för att jag har att jämföra vardera två element. Så det är därför det är n kvadrat eftersom det är n gånger n. Då är valet sort också n torget eftersom det av varje iteration, måste jag titta på varje enskilt element i listan. Och sedan hitta den minsta, vilket betyder att jag måste titta igenom n element. Och jag måste göra det n gånger eftersom Jag måste välja alla n element. En insättnings sort är också n torg eftersom det värsta scenariot kommer vara, en, jag måste sätta in n siffror, eller hur? Så jag vet redan att jag kommer att ha n iterationer. Men för var och en av dessa siffror, om jag hade att titta på alla nummer i den sorterade listan och lägga den hela vägen i fronten, kommer att bli n kvadrat eftersom det kommer att bli n gånger n igen. Vettigt? Hur är det med omega? PUBLIK: [ohörbart]. LUCAS: Det är det bästa scenariot. Så det är som i en massa gånger för sortering, det bästa scenariot är när listan är redan sorterade. Så du behöver verkligen inte att göra någonting. Bubbla Sortera har den bästa scenariot av n. Har ni varför? PUBLIK: [ohörbart]. LUCAS: Ja, om du håller koll på om data ranson hade några swappar eller inte, om du har något som satt till sant om det fanns en iteration, om den Listan är redan sorterade, i princip, vad som kommer att hända är jag ska Försök att byta varje två intilliggande element. Jag ska se till att det finns inga swappar. Och jag återvänder bara en gång. Så det betyder att jag bara var tvungen att gå igenom listan en gång. Så det är n eftersom jag ser vid n element. Varför urval sortera n Square? Ja, även om listan är sorterad, för varje iteration av urvals sortera, jag måste välja det minsta elementet. Så det betyder att jag måste ut för att titta på alla delar i osorterat listan och hitta den minsta för varje iteration. Är det vettigt? Och inför svärd är N grund i så att jag försöker sätta in nummer och alla nummer, när jag Försök att sätta in dem, ser jag att de är i rätt position. Jag behöver inte gå kolla alla andra Numren i osorterade listan. Så det är därför det blir n. Vettigt? Och vad är theta? PUBLIK: [ohörbart]. LUCAS: Vad, sorry? Säg det igen. PUBLIK: [ohörbart]. LUCAS: Exakt. Så du kan se att det bara val lagras i Merge sortera har thetas. Och det beror på att du bara har theta om både Big O och Omega är desamma. OK. Och slutligen, slå ihop sortera säga i log n. Och sedan, när Dan sa, Merge sort är ungefär som på samma sätt som du gör binär sökning. Så du får en lista. Och du kommer att halveras. Och då du skär dem i mindre halvor. Och sedan slå ihop dem. Ni minns det, eller hur? OK, som han sa. OK, pekare. Så vad är en pekare? PUBLIK: [ohörbart]. LUCAS: En adress. OK. Jag vet att David visar ett gäng videor av binky och saker som pekar varandra. Men jag gillar att tänka på pekare som enbart en adress. Så det är en variabel som kommer att lagra en adress. Så det är bara denna speciella variabel som är fyra byte lång. Kom ihåg att pekare till något är alltid fyra byte lång för våra 32-bitars maskin så är fallet med apparaten. Och det har bara plats av en variabel i den. OK, så det är det här minnet, i princip. Så varje block av minne som faktiskt har en etikett, som är adressen för den slotty minne. Så det betyder att jag kan ha en pekare som pekar på någon av dessa adresser. Så anledningen till att vi kommer att använda pekare är om jag måste komma ihåg platsen att en specifik variabel är ett minne. Och ni kommer ihåg att en av dem fall var om jag har en funktion om jag har faktiskt vill att du ska swap för reals, jag faktiskt måste skicka en pekare. Inte variabeln. Har ni ihåg det? Skillnaden between-- Vad är namnet? Ringa med värde och ringa genom hänvisning, eller hur? OK, ja. Så kallar i värde. När du bara skicka en variabel fungera du bara skicka ett värde. Så du verkligen skickar en kopia av variabeln. Och ditt program inte kunde bry sig mindre om om samma variabel faktiskt gör en kopia. Och ringer genom hänvisning innebär att Jag är faktiskt att skicka en kopia av pekaren till den variabeln. Så det betyder att jag skickar det Platsen för denna variabel. Så känner jag platsen för variabel, när jag ringer funktionen med pekare, jag kan faktiskt ändra uppgifter som var i huvud. Vettigt? Även är pekaren en kopia, den pekaren fortfarande den riktiga adressen till variabeln som jag vill ändra. Vettigt? Så skapar pekare. Kom ihåg att pekaren alltid den typ som den pekar till och sedan en stjärna. Och sedan sätta namn. Så kom ihåg att när du har oavsett stjärna, det är som en pekare till att oavsett variabel skriver att du hade. Så här i stjärna, till exempel, är det en pekare och ett heltal. Och sedan char stjärnan är en pekare char stjärna och så vidare. Yeah? PUBLIK: Vad händer om vi har en pekare till n till stjärna x. Jag vet att det skapar en pekare till x. Är det också deklarera x ett heltal? LUCAS: OK, så när du säger n stjärna x, du är inte att skapa en pekare till en variabeln x. Du skapar en pekare som heter x. PUBLIK: [ohörbart]. LUCAS: Så när jag säger n stjärnan x, jag är säga, hej, i minnet, kommer jag att få en av dessa tre lådor. Och jag kommer att säga att det kommer att vara x, vilket är kommer att bli en pekare. Och något intressant om pekare är att vi säger att de har 4 byte för en 32-bitarsmaskin. Och anledningen till detta är att 4 bytes är 32-bitar. Och maskiner som är 64 bitar faktiskt har pekare adresser som är 64 bitar långa. Så det betyder bara att storleken på adresser i maskinen är annorlunda. Så Referera och Namnåtergång. Det finns två operatörer som ni bör komma ihåg. Den första är et-tecken. Den andra är stjärna. Bli inte förvirrad av den stjärnan och detta stjärna eftersom ihåg att, i det här fallet, har du n stjärna. Det är som en hela saken tillsammans. Det finns ingen n Space Star. Så det betyder att det är den typen. Kom ihåg att när du har variabeln stjärnan, du talar om typen. När du har just stjärna och sedan namnet på variabeln, innebär det att du dereferencing pekaren, vilket innebär att du tittar på den pekare, hitta adressen är det pekar på, går till den adressen, och tittar på när du har där. Så jag säger till mina elever att när du har stjärna, bör du tänka på att det är förkortning av innehåll. Så om du har en pekare och du gör stjärniga pekare, det är innehållet i pekaren. Så du går till vad det pekar på och titta på den konstanta innehåll. Och et-tecknet är samma sak som adress. Så om jag har en variabel en-- som, låt oss säga att jag gjorde int ett lika 3-- om jag vill hitta adressen till det variabel ett minne, jag kan bara göra et-tecken en. Så det är adressen till en. Vettigt? Så här är ett exempel. Detta saknas int b och int c. Så int en lika 3 innebär att Jag kommer att gå till minnet. Och jag kommer att hitta ett spår och uppskattar antalet 3 här. Och då int b är lika med 4. Jag kommer att göra samma sak. Gå till minnet och sätta ett nummer 4 i en av rutorna. Och int lika 5. Hitta en annan låda och sätta ett nummer 5. Så vad är denna linje gör ut? n stjärna pa lika-tecken a. Så först av allt, n stjärna pa. Vad gör det? PUBLIK: [ohörbart]. LUCAS: Ja, så n stjärna pa, första, deklarerar en pekare som heter pa. Och då är det tilldelar värdet av som pekare för att vara adressen till ett. Så et-tecken en. Sedan, om jag gör stjärnan pb, vad som är en stjärna pb? Åh, förlåt. Det saknas också. n stjärna pb. Jag menar stjärn pc. Jag är så ledsen. Det är samma sak. Men nu är jag bra ar att skapa en pekare till b och sedan en pekare till c. Yeah? PUBLIK: [ohörbart]? LUCAS: Ja. Så om du går till minnet och du går till rutan som är beteckning för pa, du faktiskt kommer att se en adress till en. OK? Yeah? PUBLIK: [ohörbart]? LUCAS: Ja, det är en adress pekare. Glöm aldrig det. Det är som det viktigaste delen om pekare. Det finns förvaring och adress till viss variabel. Något annat? Fler frågor? OK. Så Pekare och arrayer. Kom ihåg att när jag gör int array 3, i grund och botten, det jag gör är att jag är, typ av, förklarar i en pekare. Så array är ungefär som en pekare till en särskild plats i minnet där jag tilldelats tre kortplatser för heltal. Är det vettigt? Så när jag gör int array 3, vad jag är gör, i princip, är att skapa tre slitsarna i minnet. Så jag tycker bara tre spår i minnet. Så om jag gör det, då, en stjärna array, det i princip innebär att innehållet i arrayen, vilket betyder att jag raderar pekaren, jag går till den plats som det pekar på, och jag satte nummer ett. Och sedan, om jag gör stjärn array plus 1, det är samma sak som att göra array konsoler en, vilket betyder bara att jag går till den plats som det pekar på. Och sedan plus ett fabrikat mig att flytta en position. Så jag går till denna ståndpunkt, faktiskt, och sätta nummer två. Och, slutligen, när jag gör array plus 2, jag går dit arrays pekar på. Och då jag flyttar till minnesblock. Och sedan satte jag nummer tre här. Yeah? PUBLIK: Så stjärniga array är helt enkelt säga den allra första punkten. Och du kan lägga till en, bara för att vi är egentligen bara refererar den första adressen. LUCAS: Ja. Varför vi, till exempel, säger array 0, array 1 och array 2? Jag säger, varför gör 0, 1, 2, 3 i stället för 1, 2, 3? En av anledningarna är, en, dator programmerare föredrar att starta räknat från 0. Två beror på att när du gör array 0, det är samma sak som att göra array plus 0, vilket betyder att jag går till den positionen, och det gör jag inte hoppa några minnesblock. Så jag inte flytta några minnesblock. Yeah? PUBLIK: [ohörbart]? LUCAS: Så hon frågar vad som är skillnaden mellan att göra detta eller gör malloc. En av skillnaderna är att int array 3 är att skapa en array på stacken. Och när jag gör malloc, det skapar på högen. Är det vettigt? Så hur malloc egentligen? Så varför behöver vi ens använda malloc? Din kompilator typ av siffror ut alla de variabler som du deklarerat. Och han skapar utrymme för alla av dem i stacken. Så alla dina variabler kommer att vara någonstans i stapeln. Så här är de miljövariabler. Så i princip utrymme för de variabler i minnet allokeras på kompilera tid. Så det betyder att datorn har känna alla dessa variabler förhand. Det behöver inte veta vilket värde du ska sätta in dem. Men det behöver veta hur mycket minne du behöver. Men nu ska vi säga att, till exempel, du skapar en array eller ta en sträng som du tar från användaren. Du vet inte hur länge strängen kommer att bli, till exempel. Så du vet inte exakt hur många minnesblock du fördela, eller hur? Så det spelar egentligen ingen vettigt för dig att säga sätta 100 tecken. Och vad händer om användaren skriver 150? Du kommer att skruvas. Så i princip kan du inte vara säker på hur mycket minne du behöver allokera när du kompilerar programmet. Du vet bara att om körtid. Så det är därför du har högen. Så högen kommer att ha minne att du fördela under tid programmet körs. Så i princip, när du gör malloc, vad du gör är att fördela minnet vid runtime, vilket innebär att du är beslutar rätten i det ögonblicket som du bör ha som minne. Så det är när man fördela det. Är det vettigt? Så kom ihåg, stapeln har variablerna som skapas på kompileringen. Och sedan högen har variablerna som skapas när du går med malloc, till exempel. PUBLIK: [ohörbart]? LUCAS: Så GetString är kommer att kalla malloc. Låt mig tala om malloc, och Jag ska förklara GetString. Så malloc är samma sak som minnesallokering. Så det kommer att fördela minne på högen. Och det kommer att returnera en pekare till när detta minne tilldelades vid. Så när du do-- för example-- här n stjärnpekaren. Och sedan pekaren lika malloc storlek tum gånger 10. Jag skapar en pekare. Och då jag tilldela det pekare till värdet av den pekare som malloc ger mig. Så jag ber malloc kan du tilldela utrymme för 10 heltal. Det är vad det säger. Och malloc ger mig tillbaka en pekaren till den platsen. Vettigt? OK. Jag Och GetString är, i princip, gör en ringa till malloc så att du kan tilldela minne under körning. Kom ihåg att alltid kontrollera för null eftersom malloc kommer att återvända null om den inte kan allokera minne. Låt oss säga att du ber om en löjlig mängd minne. Datorn kommer inte att bli kunna fördela så mycket. Så malloc är bara att gå att returnera null. Så kom ihåg att alltid kontrollera om pekare som du fick från malloc är null eller inte, för om det är, kanske du vara dereferencing en pekare och orsakar sido fel. Och slutligen, glöm inte din lediga minnet. Malloc skapar minne i högen. Och du måste frigöra minnet innan programmet avslutas. OK, det är allt för mig. Tyvärr, Rob. Tack. [Applåder] LUCAS: Några sista frågor innan Rob kommer? Nej? Yeah? PUBLIK: Jag såg inte här på nätet. Har du laddat upp den än? LUCAS: Jag tror Dave är ladda upp det snart. Dave: Det kommer att läggas upp. LUCAS: Det ska vara på nätet. PUBLIK: Det är upp. LUCAS: Det är upp? OK. Yeah? PUBLIK: [ohörbart]? LUCAS: Ja, ska du frigöra alla minne som sätts i högen. PUBLIK: [ohörbart]? LUCAS: Ja. Varje gång du har en kultur malloc, du bör ha en kultur fri efter att du slutar använda den variabeln. Så malloc och free är alltid tillsammans. Deras bästa vänner. Yeah. Rob? ROB: I go snabbt. Och även videon kommer att sättas upp. Jag har mic på. OK, så vecka fem grejer. Första var vi har är stacken. Så kom ihåg att det finns bara en stapel frame per samtal aktiv funktion. Vi ser att i ett andra. Och också komma ihåg vad som faktiskt går i varje stapel ramen kommer att vara lokala variabler av våra funktioner, de argument som skickas in i vår funktioner, tillsammans med ett par annat du egentligen inte behöver oroa dig. Så här är ett exempel program där, varsel, viktigaste är printfing avkastningen värdet av foo 4. foo är bara att returnera värdet av bar 4 comma 6. Och bar kommer att ställa vissa lokala variabeln n är lika med 4 gånger 6. Och sedan tillbaka n. Så låt oss titta på stapeln under hela själva upprepningen av detta program. Så det finns ner på vår stack. Kom ihåg att stapeln växer upp. Så i botten av vår stack vi har en stack ram för main. När programmet startas, huvud kommer alltid att vara på botten av vår stack. Och vad som är inne i vår stack ram för main? Så även om det finns ingen lokal variabler till main, som jag sa tidigare, Vi har argc och rgv tar upp plats insidan av huvud stackram. Så huvud kommer nu att anropa funktionen foo. Och det betyder foo kommer att få en egen stack ram. Så nu är vi inne i funktionen foo. Och vad som behöver gå in foo stack ram? Tja, har foo ett argument n. Och n är lika med 4, eftersom det är vad Huvud passerar som foo argument. Så nu foo kommer att ringa bar. Vad bar kommer att ha inne av dess "stack ram? Den har x lika med 4 y är lika med sex. Det är inte allt som vi ska ha i stacken ramen eftersom bar också har en lokal variabel n. Och n vi ska vara lika med 24. Så nu bar kommer att återvända n. Så bar återvänder 24 till stacken ramen foo. Och eftersom baren är nu återvänder, att betyder att vi poppar stacken ramen för bar off av stapeln. Så allt det minne som baren hade varit använder är nu utanför stacken. Nu är foo också gå för att återgå 24 till huvud. Så nu när foo är tillbaka, minnet att foo använde i sin " stackram är också borta. Och nu, huvud ska ringa printf. Så printf är bara en annan funktion. När vi kallar printf, det kommer att bli annan stack ram för printf funktionsanrop. Vad är det vi passerar printf? Det är vad som kommer att gå på sin stack ram. Åtminstone, vi passerar som procent i bakstreck n och argumentet 24. Det kanske har mer i sin stack ram Om printf råkar vara att använda en del lokala variabler. Vi vet inte. Men allt som går i printf s stack ram. Det kommer att verkställa printf. Då printf är gjort. Den kommer tillbaka. Slutligen viktigaste är gjort. Huvud kommer tillbaka. Och så vårt program görs. Yeah? PUBLIK: Ser du [ohörbart] argument [ohörbart] parametrar? ROB: Så det finns en subtil skillnad mellan argument och parametrar. Och egentligen, gemensamt tala, människor tenderar att bara blanda upp dem hela tiden. Men parametrarna är de formella NAMN saker. Så argc och argv är de parametrar till main. Argument är vad du faktiskt passera som dessa parametrar. Så det när jag ringer foo av 4, 4 är argumentet jag passerar in. Och parametern n, insidan av foo, tar på värdet 4 sedan 4 var argumentet. PUBLIK: [ohörbart]? ROB: n är en lokal variabel till bar. n är fortfarande lokal foo, men det är en parameter till foo. Det är inte en lokal variabel. Yeah? PUBLIK: [ohörbart]? ROB: foo är bara ringa bar och vänder oavsett bar avkastning. PUBLIK: [ohörbart]? ROB: Ja, bara för att se flera stapla ramar. Yeah? PUBLIK: Varför var foo kallades innan printf? ROB: Varför var foo kallades innan printf? Så jag kunde ha i stället gjort något som int x är lika foo av 4 och därefter skrivas x. Men i stället, jag kombinerade funktionen ringa till printf argument. Men märker att vi inte kan faktiskt exekvera samtalet till printf tills vi räkna ut vad foo av 4 är. Så vi kommer att utvärdera detta. Och bara en gång det är gjort går att komma tillbaka och utvärdera detta. Yeah? PUBLIK: Eftersom både bar [ohörbart] värde, varför har vi inte [ohörbart]? ROB: De bör helt vara int. Det var inte fångas över flera passager. Så det borde vara int bar och int foo eftersom båda dessa återvänder heltal. Void är bara om de inte tänker att återvända ärvärden. Yeah? PUBLIK: Om du hade en rad ovanför avkastningen, [ohörbart]? ROB: En linje över returen? PUBLIKEN: Ja. Som om du gjorde printf och [ohörbart], skulle det skrivas ut två gånger? ROB: Så insidan av foo? Om vi ​​hade en printf här? PUBLIKEN: Ja. ROB: Så om vi hade en printf rätt Här skulle det skrivas ut en gång. Eftersom vi kallar foo gång rätt här, då ska vi träffa printf. Sedan ska vi kalla bar. Och sedan foo kommer tillbaka. Och det är det. Vi bara skulle stöta printf gång. Yeah? PUBLIK: [ohörbart] printf ringer foo för att vi är först ringer printf och sedan vi passerar argumenten. ROB: Så i teorin, inte printf ringer foo? Så nej. Bara den ordning c ska verkställa dessa saker är, innan vi kan anropa en funktion, alla av argumenten till funktionen måste vara fullständigt utvärderats. Så är det helt utvärderas? Ja, det är bara en sträng. Det är bara ett värde. Då måste vi helt utvärdera detta. När detta är gjort, nu alla argumenten utvärderas. Och nu kan vi göra ringa till printf. Yeah? PUBLIK: En fråga. Om du har ett tomrum funktion, måste du har retursemikolon? ROB: Du behöver inte en retursemikolon om du har ett tomrum funktion. OK. Så nu några högen grejer. Så heap är hur vi ska hantera med dynamisk minneshantering. Och detta kontrasterar direkt med stack som vi skulle kalla automatisk minneshantering. Så på stacken, du aldrig riktigt har att ta itu med hur den lokala variabler skjuts och flög av alla Dessa stack ramar och allt det där. Du behöver inte oroa dig för det. Den är automatisk. Så högen är manuell. Och det [ohörbart] kommer från dessa funktioner malloc och gratis. Så här är ett annat program. Allt vi gör är mallocing ett heltal. Vi lagrar den i stjärn x. Naturligtvis måste vi kontrollera för att se om x är noll. Då ska vi bara sätta det som x pekar på att 50. Skriv vad x pekar på, print x, och därefter fri x. Så hur är det egentligen kommer att se om vi tittar på vår stack och heap? Så vi ska börja igen. I botten av vår stack som tidigare. Kom ihåg att thee heap direkt motsätter stapeln? Så vi kommer att ha upp på vår högen uppe. Så ner på vår stack, vi har vår stack ram för main. Den har plats för argc, argv, och vi nu har en lokal variabel x, vilket är en int stjärna. Så vi kommer att iterera genom detta program. Första vi har är ett samtal till malloc. Så vi gör ett anrop till malloc. Malloc är en funktion. Det kommer att få en stack ram. Vad är det vi går till malloc? Det kommer att gå in av stapeln ramen. Vi passerar storlek n, vilket är 4. Så att skickas till malloc. Vad gör malloc göra? Det tar tag i oss lite utrymme på högen. Så vi kommer att gå till högen. Och vi kommer att ta 4 byte från högen. Så låt oss bara ge det en godtycklig adress. 0x123 låtsas Bara det är en adress som är på högen. Så vad är faktiskt inne på att regionen i minnet på adress Ox123? Sopor. Så vi har inte lagrat något i den. Så så vitt vi vet, det kan vara allt. Du ska inte tro att det är noll. Det är sannolikt inte noll. Så nu malloc avkastning. Och vad gör vi när malloc returnerar? Vi sätter vad den returnerar. Vi satt x lika med det som det återvänder. Så vad är det att återvända? Det åter 0x123 eftersom det är den adressen för blocket i minnet att det bara fördelas i högen. Så tillbaka 0x123 x kommer nu att ställas in lika med 0x123 som, pictorially, vi drar ofta som x har en verklig pil som pekar på det blocket. Men x är bara lagra den adressen. Så nu måste vi kolla om x är noll. Det är inte null. Vi låtsas att det malloc lyckats. Så nu stjärnan x är lika med 50. Så stjärnan minns det innebär går till den adressen. Så 0x123 Vi ska till går till den adressen. Så att för oss där uppe. Vad gör vi på den adressen? Vi lagrar 50. Så efter denna linje, är vad som saker kommer att se ut. Så nu är det inte längre skräp där uppe. Nu vet vi att 50 är i det viss adress eftersom vi ställa in den till det. OK? Så nu ska vi skriva f. Så först ska vi skriva ut stjärn x. Så vad är stjärn x? Återigen, stjärna x betyder gå till sak som x pekar på. Så x lagrar 0x123 Gå till det. Vi får 50. Så ut f det. Och det betyder att det kommer att skriva ut 50. Och då återvänder. Och så har vi den andra printf. Vi är nu procent p. Om du inte har sett det, det är hur du skriver ut en pekare. Så vi har procent i, procent f, och alla de som redan. Så procent p, skriva ut en pekare. Så x är en pekare. Så om vi ska skriva ut x självt, Vi skriver ut vad som faktiskt inne x, vilket är 0x123 Så den första print f kommer att skriva ut 50. Det andra trycket f går skriva ut 0x123 Yeah? PUBLIK: Använder ni procent x för att skriva ut en pekare? ROB: Så använder du procent x för att skriva ut en pekare? Så du kan men procent x är bara, generellt, för som om du har lite heltal och du vill skriva ut det som ett hexadecimalt. Det är bara hur man gör det. I procent d skulle ut som decimala. Det är var vi får procent d. i är bara heltal. procent p är specifikt för pekare. Så x är en pekare. Vi vill använda procent p. Men procent x skulle kunna fungera. Yeah? PUBLIK: [ohörbart]? ROB: Ja. Åtminstone för den här call-- så jag inte inkludera det i här. Men dessa två argument är nödvändigtvis insidan av denna stackram tillsammans med eventuella lokala variabler printf råkar använda. Och sedan nästa samtal till printf nu insidan av printf stackram är procent p backslash n och oavsett värdet på x är, som är 0x123. Yeah? PUBLIK: [ohörbart]? ROB: Det ska skriva ut något som ser ut så här. PUBLIK: [ohörbart]. ROB: Så det skriver den i adressformuläret. Det ser ut som en adress. Yeah? PUBLIK: [ohörbart]? ROB: Varför är det? PUBLIK: [ohörbart]? ROB: Varför är detta pekaren 4 byte? Så det finns en hel massa av 0-talet i framför denna. Så det är verkligen 0x0000000123. På ett 64-bitars system, skulle det finnas en hel massa fler nollor. Yeah? PUBLIK: [ohörbart]. ROB: Så den första printf kommer att print-- PUBLIK: [ohörbart]. ROB: Ja, det kommer att skrivas ut vad x pekar på. Star säger vad är detta sak som pekar på. Ta det. Så vad är det som pekar på? 50. Ta det. Det är vad vi ska skriva ut. I nästa, vi är bara skriver ut x självt. Vad är inne i f? 0x123. OK. Och sedan, äntligen, har vi den gratis. Vad är det vi går för att frigöra? Vi passerar x. Den gången jag faktiskt visas det i stapeln ramen. Så vi passerar värdet 0x123 att befria. Så nu gratis vet, okej, Jag måste gå upp till högen och fri att minnet. Det är inte längre använda vad är på adress 0x123. Så fri kommer att släppa att från högen. Nu har vår heap är tom igen. Vi har inga minnesläckor. Nu fri kommer att återvända. Lägg märke till att x är fortfarande 0x123. Men det är nu inte giltig minne. Vi bör inte längre dereference x. Yeah? PUBLIK: Är tillbaka 0 överflödig? ROB: Är Returen 0 överflödig? Ja. Vi sätter bara att det på grund vi har en avkastning en för luft. Så det är som, ja, låter inkluderar avkastningen 0. Yeah? PUBLIK: [ohörbart]? ROB: Så efter fria x, vad som händer om vi försöker avreferera pekaren? Det är möjligt att ingenting går fel. Det är möjligt att vi fortfarande får 50. Det är möjligt, också, att det minnet är nu används för något annat. Så det är odefinierat beteende. Och undefined betyder något kan hända. Yeah? PUBLIK: [ohörbart]? ROB: Nej, så om du tilldelar x till något annat. Så om just här vi sa x är lika med malloc något else-- malloc storlek event-- sedan att ursprungliga blocket minne är inte befriad. Och vi har officiellt förlorat den. Det är en minnesläcka. Vi har förlorat alla referenser till det minnesblock. Så det finns inget sätt vi någonsin kan frigöra den. OK, så då återvänder 0 betyder gjort. Okej, så stack overflow. Vad är tanken här? Så kom ihåg, är hög på väg ner. Stack går upp. Så detta var exemplet från föreläsningen, Jag tror, ​​när huvud är bara att kallar denna funktion foo, som kommer att kalla sig rekursivt över och om igen. Så stack ramar kommer att fungerar exakt samma. Så vi kommer att börja med huvud som botten stackram. Sedan huvud ska ringa foo, vilket kommer att få en stack ram. Sen foo kommer att ringa foo igen, vilket kommer att få en annan stapel ramen. Och sedan igen, och igen, och igen, och igen tills, slutligen, vi kör in i högen. Så detta är hur vi får en stack overflow. Och vid denna punkt, SEG du fel. Eller du skulle verkligen seg fel innan denna punkt men ja. PUBLIK: Är kärn dumpa samma som seg fel? ROB: Så ser du segmente fel core dumpad. Du får en core dump när du seg fel. Och det är som en dumpning av alla de Innehållet i din nuvarande minnet så att du kan försöka identifiera varför du seg klandras. Yeah? PUBLIK: [ohörbart]? ROB: Så en segmentering fel sätt det finns en stack overflow. Så inte nödvändigtvis. En segmentering fel innebär att du är gripande minne på ett sätt Du bör inte vara. Så ett sätt att det ska hända är när du stack overflow, vi börjar röra minne på ett sätt som vi inte borde vara. Yeah? PUBLIK: [ohörbart]? ROB: Så inne i en oändlig slinga. Liksom, detta är som en rekursiv oändlig loop och så vi får en annan stack rama varje gång. Men precis innanför en regelbunden oändlig medan en-- ja, låt oss inte ens skriva ut F-- göra något. Oavsett. Vi kommer inte att få en annan stapel ramen. Vi ska bara hålla looping över denna instruktion. Stapeln växer inte. Det är det faktum att varje rekursiv Samtalet ger oss en stack ram. Det är därför vi får en stack overflow. Yeah? PUBLIK: Så om du sa att få while-slinga och sedan [ohörbart]? ROB: Så om insidan av while-slinga det fanns en printf, du fortfarande skulle inte seg fel. Jag bara inte vill blanda ihop saker och ting. Det skulle slingan. Du skulle få en enda stapel ram för printf. Då skulle printf återvända. Då du skulle loop igen. Du skulle få en enda stapel ram för printf. Det skulle återvända. Single stack ram. Så du inte får denna oändliga tornar stackramar. PUBLIK: [ohörbart]? ROB: Ja. Så här spill inträffar eftersom ingen av dessa samtal till foo återvänder. Så om vi återvänder, då skulle vi börjar förlora stackramar. Och då skulle vi inte stapla spill. Och det är därför du behöver en basfall för dina personliga uppgifter. Yeah? PUBLIK: Är den potentiella storleken och stapla för högen samma för alla program? ROB: Ungefär. Är den potentiella storleken på stacken och högen lika för alla program? Ungefär. Det finns en viss randomisering till där stack börjar och där högen startar. Om du råkar ha en hel del globala variabler och saker, kanske du ta ifrån utrymme för hög. På ett 64-bitars system, du nästan har oändligt minne. Det är bara så mycket. Mellan 32 bitar och 64 bitar, att är en signifikant skillnad. Du kommer att få en hel del mer stapla och heap utrymme på en 64-bitars systemet för det finns bara mer adresser som de kan använda. Men om ett enskilt system, kommer det vara ungefär samma mängd stacken och heap-utrymme. Okej. Så sista är sammanställning. Så du bör känna denna process. Det finns fyra stora steg. Så det första man bör vara lätt att komma ihåg. Pre-behandling. Den har prefixet pre i den. Så det kommer före allt annat. Det sak att komma ihåg är hash. Så hash definierar och hash innehåller i alla dessa. De är alla pre-processor direktiven. Dessa är de saker som de pre-processor tar hand om. Så vad gör en pre-processor gör? Det är en riktigt dum sak. Allt det är i stånd att är alla dessa kopiera och klippa och klistra. Så hash innehåller standard i0 dot h. Vad är att göra? Det ta tag standard i0 dot h fil och klistra in den i toppen varhelst det står hash innehåller standard i0 dot h. Och varje hash definierar att vi har sett, vad det gör? Dess kopiera det värde som hash definierad definieras som och klistra in som var du än är med hjälp av värdet. Så preprocessorn gör bara riktigt enkla textbaserade verksamheter. Det gör inget smart. Så allt annat är mer komplicerat. Så nu när preprocessorn gjort, vi faktiskt kompilera. Så vad betyder sammanställa detta? Nu ska vi från C-kod till assemblerkod. Yeah? PUBLIK: [ohörbart]? ROB: Ja, fångade vi det. Så sammanställningen. Vi ska från c till montering. Så det här är en verklig förändring språk. Kompilera själv innebär att gå från en högre språknivå till ett språk lägre nivå. Och c är ett högnivåspråk jämfört med monteringen. Vad är monteringen? Dess instruktioner som, ganska mycket, gjord för din CPU. Men datorn fortfarande gör inte förstå montering. Den förstår bara ettor och nollor. Så nästa steg är montering, vilket tar oss från dessa instruktioner som din CPU förstår och faktiskt översätter dem, till ettor och nollor. Så C till montering till binärt. Men jag har inte en körbar än. Så tänk på CS50 biblioteket. Vi har försett er med en binär för detta CS50 bibliotek, som har GetString och getInt och allt det där. Men CS50 library-- i och för itself-- är inte körbar. Den har inte en huvudfunktion. Det är bara en massa binärt som du kan använda. Så länka är hur vi sammanför alla av dessa olika binära filer till en verklig körbar. En som du kan skriva dot slash en punkt ut. Så det här är som den fil som du skrev - oavsett ditt program är-- Ceaser dot c. Men nu är det sammanställts ner till binärt. Så Ceaser dot o. Och detta är vår CS50 bibliotek binärt. Och de kombineras till en enda körbar. Yeah? PUBLIK: [ohörbart]? ROB: Så först inkludera, kom ihåg, hash innehålla är faktiskt en pre-processorn steg. Men det är separata. Om du inte använder några funktioner som är utanför din enda fil då, nej, behöver du inte koppla något eftersom du har allt. Som sagt, printf är länkade i. Om du någonsin använder printf, det är något som måste länkas i eftersom du inte skriva det. Och, i själva verket är printf automatiskt länkade i. Du vet hur på kommandoraden eller när du skriver gör, du ser det har streck l CS50, som har koppling i CS50 biblioteket? Printf, och sånt, kommer ska kopplas in automatiskt. Alla andra frågor om vad som helst? PUBLIK: [ohörbart]? ROB: Länka? Vi har en hel massa olika binära filer. Detta är den kanoniska exemplet som vi använder är CS50 bibliotek. Vi har sammanställt och ges till dig binär för CS50 biblioteket. Du vill använda GetString i ditt program. Så du går och använda GetString. Men utan min binär kod för GetString när du bygger din kod ner, kan du faktiskt inte köra programmet eftersom GetString String är ännu inte är helt definierade. Det är bara när du länkar i mitt binära som innehåller GetString att nu, allt Okej, jag kan faktiskt exekvera GetString. Min fil är klar. Och jag kan köra detta. Yeah? PUBLIK: Har länkning konvertera det binära att körbara? Så även om du inte har andra bibliotek, inte skulle det fortfarande vara krävs för att översätta det [ohörbart]? ROB: Så en körbar är fortfarande i binärt. Det är bara att kombinera en helhet gäng binärer. PUBLIK: Tack så mycket. ROB: Inga problem. Fler frågor? Annars är vi redo. Okej. Tack. [Applåder] PUBLIK: Tack. ROB: Ja.