[Speel van musiek] David J. Malan Alle regte. Dit is CS50, en dit is die einde van die week Vier. En een van die onderwerpe vandag is dié van digitale forensiese, die kuns van die herstel van inligting. En inderdaad, selfs al jy in die midde nou van Vrede by Three en Breakout, volgende week, Die fokus sal wees op juis hierdie domein.
So een van die coolste werk wat ek ooit gehad het, was terug in die nagraadse skool, toe ek besig was om die plaaslike Middlesex County Distrik Prokureur se kantoor, doen forensiese werk. So in wese, die Massachusetts Staat polisie, op die geleentheid, wanneer op gevalle sou bring in dinge soos hardeskywe en diskettes en geheue kaarte en dies meer. En hulle sal hulle oorhandig aan my en my mentor, en ons doel was om getuienis te vind, As daar enige, op hierdie media. Nou, kan jy dit gesien het 'n kykie van hierdie wêreld van forensiese in die media, TV en films. Maar die werk wat ek gehad het, en daresay daardie wêreld is nie heeltemal soos jy dit sal sien. Kom ons neem 'n blik op wat jy het waarskynlik gesien. [Video speel] -OK. Nou, laat ons kry 'n goeie blik op jou.
-Hold Dit. Begin dit terug.
Hoekom mag 'n minuut. Gaan regs. -Daar. Vries dit. -Volledig-skerm.
-OK. Vries dit. -Tighten Op, sal jy?
Vector in daardie man deur die agterwiel.
-Zoom In reg hier op hierdie plek.
-Met die regte toerusting, die beeld kan vergroot word en geslyp.
-Dit Is 'n verbetering program.
-Kan Jy duidelik dat tot enige?
-Ek Weet nie. Kom ons verbeter dit.
Verbeter Artikel A6. Ek versterk die detail, and-- -Ek Dink daar is genoeg om te verbeter. Stel dit aan my skerm.
-Ek Versterk die weerspieëling in haar oë. -Laat Se loop dit deur video verbetering.
-Edgar, Kan jy dié?
-I've Werk op die besinning.
Hulle vernietig iemand se besinning.
-Reflection. -Daar Is 'n weerspieëling van die man se gesig.
-Die weerspieëling! -Daar Is 'n weerspieëling. -Zoom In die spieël. Jy kan sien 'n weerspieëling.
-Kan Jy verbeter die beeld van hier af? -Kan Jy dit verbeter? -Kan Jy dit verbeter? -Kan Ons verbeter dit? -Kan Jy dit verbeter? -Hold Op 'n tweede. Ek sal verbeter. -Zoom Op die deur. -Times 10. -Zoom. -Move In. -Meer. Hoekom mag, stop. -Stop. -Pause Dit. -Rotate Ons 75 grade rondom die vertikale, asseblief.
-Stop. Gaan terug na die gedeelte oor die deur weer.
-Got 'N beeld verbete wat bitmap?
-Maybe Ons kan gebruik om die Pradeep Singh metode om te sien in die vensters.
-Die sagteware is die staat van die kuns.
-Die eiewaarde af.
-Met die regte kombinasie van algorithms--
-He Se geneem verligting algoritmes na die volgende vlak, en ek kan gebruik om hulle te verbeter die foto.
-Lock Op en vergroot die z-as.
Verbeter. Verbeter. Verbeter. -Freeze En te verbeter. [Einde video speel] David J. Malan So dit is al die woorde, maar hulle was nie gebruik in sinne korrek. En inderdaad in die toekoms, enige tyd, asseblief, jy hoor iemand sê die woord, "Verbeter," giggel net 'n bietjie. Want wanneer jy probeer om te verbeter, byvoorbeeld, dit is wat gebeur.
So hier is 'n pragtige foto. Dit is CS50 se eie Daven. En veronderstel dat ons wou fokus op die vonkel in sy oog, of die weerspieëling van die slegte ou wat duidelik gevang deur die sekuriteit kamera. Dit is wat gebeur wanneer jy zoom in op 'n beeld wat het slegs 'n beperkte aantal bisse wat verband hou met dit.
Dit is wat jy sou kry. En inderdaad, in Daven se oog is maar vier, miskien ses pixels wat komponeer presies wat is daar flikkering. So Probleem Stel Vier uiteindelik sal jy verken die wêreld, veral deur die aard van iets ons noem lêer I / O, waar i / o is net 'n fancy manier sê toevoer en afvoer.
So tot dusver al die interaksies ons met 'n rekenaar gehad het het grootliks met jou klawerbord en die skerm, maar nie so baie met die hardeskyf, of spaar van lêers buite die mense wat jy jouself skryf. Jou programme dusver het nie skep en spaar, en afhangende van hul eie lêers.
Wel, wat is 'n lêer? Wel, iets soos 'n JPEG. Dit is 'n beeld wat jy mag het of oplaai na Facebook, of sien op enige plek op die web. Trouens, die foto het ons net saag van Daven was 'n JPEG. En wat is interessant oor lêers soos JPEG is dat hulle geïdentifiseer kan word, Tipies, deur sekere patrone van stukkies.
Met ander woorde, wat is dit wat onderskei 'n JPEG van 'n GIF van 'n PING van 'n Woord dokument van 'n Excel-lêer? Wel, dit is net verskillende patrone van stukkies. En die verskillende patrone is gewoonlik aan die begin van die lêers.
Sodat wanneer jou rekenaar 'n Woord oopmaak Doc, of wanneer 'n rekenaar 'n JPEG oopmaak, dit lyk tipies by die eerste paar stukkies in die lêer. En as dit erken 'n patroon, dit sê, o, dit is 'n beeld. Laat my vertoon dit te die gebruiker as 'n grafiese. Of, o, dit lyk soos 'n Word doc. Laat my toe om dit vir die gebruiker as 'n opstel.
So byvoorbeeld, JPEG, dit blyk, is redelik gesofistikeerde onder die enjinkap. Maar die eerste drie grepe in die meeste elke JPEG begin met hierdie drie nommers. So byte nul, een, en twee is, in die meeste elke JPEG, 255, dan is die aantal 216, dan is die getal 255.
En wat sal jy in staat wees om om te begin doen volgende week is eintlik skeer onder die kap van lêers soos JPEG en soos bitmap lêers, en sien wat altyd daar vir so lank as jy het al met behulp van 'n rekenaar.
Maar wat is daar gewoonlik nie geskryf soos desimale getalle soos hierdie. Rekenaar wetenskaplikes doen nie geneig om te praat in desimaal. Hulle het nie regtig praat nie in binêre. Tipies, wanneer ons wil getalle uit te druk, ons eintlik gebruik heksadesimale, wat jy kan onthou van, sê, Probleem Stel Een, wat uitgedaag om te dink oor 'n ander stelsel.
Ons, natuurlik, is bekend met desimale, zero deur nege. Ons het gepraat oor binêre. En ons het nie regtig om dit te gebruik veel hier uit, want rekenaars sal gebruik nie. Maar programmeerders sal baie dikwels, maar nie altyd nie, gebruik heksadesimale, wat net beteken jy het 16 letters in jou alfabet, teenoor twee of 10.
So hoe reken jy na hoër as nege in heksadesimaal? Jy gaan van 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, net deur konvensie. Maar wat is die sleutel is dat elke hierdie is 'n enkele simbool. Daar is geen 10. Daar is geen 11 per se nie, want elke van jou syfers, net soos in desimale en net soos in binêre, moet net 'n enkele karakter, deur konvensie.
So, wat dan is die alfabet ons het tot ons beskikking vir heksadesimaal. So, wat nie 'n JPEG lyk as jy was daardie eerste drie uit te skryf grepe nie as desimale maar byvoorbeeld as heksadesimale? En hoekom is Hex al wat nuttig?
Wel, 'n vinnige blik op 'n voorbeeld. So as ek skryf uit die stukkies wat stel hierdie desimale numbers-- hierdie dalk 'n bietjie verroes wees nou van 'n paar weke terug, maar die linker een en regte een is redelik maklik. 255 was die grootste getal wat ons kon stel met agt stukkies. Dit was al kinders. Dus is die enigste een wat effens interessant is, is die middelste een. En as jy soort van doen uit die wiskunde, sal jy aflei dat, wel, dat patroon van een en nulle verteenwoordig 216. So laat ons net bepaal vir nou dat dit korrek is. Maar hoekom is dit interessant?
Wel, 'n greep, natuurlik, is agt stukkies. En dit blyk dat as jy dink van 'n greep as twee stukke van vier stukkies, soos hierdie. Laat my net 'n bietjie ruimte. So voor, na. Ek het net bygevoeg 'n paar wit spasie ter wille van hier visualisering se. Hoe kan ons nou in te stel, sê, heksadesimale elke quad van stukkies, elke stel van vier stukkies?
So byvoorbeeld, aan die linkerkant Nou, ons het 1111 in die program nie. Wat is dat die getal in desimale, As jy dit doen uit die wiskunde? Jy het die mense plek, die twee-twee plek, die viere plek, en die agts plek.
Publiek: 15. David J. MALAN: Dit is 15. So as ons dit doen agt plus vier plus twee plus een, kry ons 15. So kan ek hier neer te skryf 15 1111, maar die hele punt hier is heksadesimaal, nie desimaal. So in plaas van af te skryf 15, 1-5, Ek is van plan om dit te skryf in blok is, wat as jy dink terug, as jy ' zero deur f, wat 15 gaan wees? Publiek: f. David J. Malan So dit blyk dit se f. En jy kan uitwerk wat deur te sê, Wel, as 'n 10, dan is OK, f is 15. So ja, kan ons herskryf dieselfde stel van die nommers as f f. En dan as ons 'n bietjie van wiskunde, ons sal aflei dat dit is d. Agt is redelik maklik nie, want ons het 'n mens in die agts plek. En dan het ons nog 'n paar f f se.
So, wat mense geneig is om te doen deur die konvensie wanneer hulle heksadesimaal is hulle net skryf dit 'n bietjie meer saaklik, ontslae te raak van die meeste van die wit spasie. En net super duidelik te wees lesers dat dit heksadesimaal, die eenvoudige konvensie onder mens is jy nul skryf x, wat geen betekenis ander as 'n visuele identifikasie van, hier kom 'n blok is nommer.
En dan, jy sit die twee syfers f f in hierdie geval is, dan d a, dan is f f. So lang storie kort, heksadesimale net geneig nuttig te wees, want elkeen van sy syfers, zero deur f, perfek lyne met 'n patroon van vier stukkies.
So as jy twee heksadesimale syfers, zero deur F, weer en weer, wat gee jou volkome agt stukkies of een byte. So dit is waarom dit is geneig om te wees konvensionele nuttig. Daar is geen intellektuele inhoud regtig verder as dit, anders as die werklike nut.
Nou JPEG is nie die enigste Lêerformaat vir grafiese. Jy sal onthou dat daar lêers soos dié in die wêreld, ten minste 'n paar jaar terug.
So dit was eintlik geïnstalleer in Windows XP op miljoene rekenaars regoor die wêreld. En dit was 'n bitmap lêer, BMP. En 'n bitmap lêer, as jy die volgende sien week, beteken net 'n patroon van punte, pixels as hulle geroep het, 'n kaart op stukkies, regtig.
So, wat is interessant, al is, oor hierdie formaat, BMP, is dat onder die enjinkap, dit het meer as net drie grepe dat sy kop komponeer, so te spreek, het die eerste paar byt. Dit lyk eintlik 'n bietjie ingewikkeld met die eerste oogopslag. En jy sal sien dit in die P stel. En om iets veral uit die nou is nie so belangrik nie, as net die feit wat aan die begin van elke bitmap lêer, 'n grafiese formaat, Daar is 'n hele klomp van die nommers.
Nou Microsoft, die skrywer van hierdie formaat, geneig diegene te roep dinge nie ints en karakters en dryf, maar woorde en d woorde en verlang en grepe. So hulle is net verskillende datatipes. Hulle is verskillende name vir dieselfde ding. Maar jy sal sien dat in P Stel Vier.
Maar dit is net om te sê dat as 'n mens dubbel-kliek 'n paar .BMP lêer op sy of haar hardeskyf, en 'n venster oop up wat hom of haar dat die beeld, wat gebeur het, omdat die bedryfstelsel stelsel vermoedelik opgemerk nie net die .BMP lêer uitbreiding in die naam, maar ook die feit dat daar is 'n paar konvensie na die patroon van stukkies aan die begin van daardie bitmap lêer.
Maar laat ons nou fokus op so 'n ingewikkelde lêer, maar op iets soos hierdie. Veronderstel hier in gedit, ek net die begin van 'n program wat is redelik maklik. Ek het 'n paar sluit tot bo-op. Nou het ek include "structs.h", maar Ek sal terug kom in 'n oomblik. Maar dit is nuttig vir nou. So dit is 'n program wat gaan om te implementeer soos die registrateur se databasis. So 'n databasis van studente, en elke student in die wêreld het 'n naam en 'n huis en waarskynlik 'n paar ander dinge, maar ons sal dit eenvoudig hou. Elke student het 'n naam en 'n huis.
So as ek wou 'n te skryf program wie se doel in die lewe was net te Itereer van nul tot drie, As daar is drie studente aan die Harvard Universiteit. En ek wil net te kry, met behulp van GetString, elke student se naam en huis en dan net druk diegene wat nie.
Dit is soort van soos Week Een, Week Twee dinge nou, waar ek wil net 'n vir lus of iets soos dit. En ek wil GetString te roep 'n paar keer, en dan druk f 'n paar keer. So, hoe kan ek dit doen, al is, wanneer beide 'n naam en 'n huis betrokke is vir elke student?
So my eerste instink mag wees om so iets te doen. Ek kan sê eers goed, gee my, sê, 'n verskeidenheid van snare name genoem. En ek wil nie 'n Kodeer drie hier. Wat wil ek nie daar te vestig? So STUDENTE, want dit is net 'n konstante verklaar by die top, net sodat ek nie hoef te hardcode drie in verskeie plekke. Op hierdie manier, kan ek dit verander een plek, en dit raak 'n verandering oral. En dan, kan ek doen string huisves studente.
En nou, kan ek iets soos doen for (int i = 0; i <studente; i ++. So ek vinnig tik, maar dit is waarskynlik vertroud sintaksis nou.
En nou, dit was meer onlangs. As ek wil om te sit in die i-de student se naam, ek dink ek doen dit. En dan, nie name maar huise hakies-i. Ek doen dit, GetString, en laat my terug te gaan en op te los hierdie lyn. Stem jy saam? Stem nie saam nie? Dit is nie baie gebruikersvriendelik. Ek het nie die gebruiker wat om te doen het.
Maar nou, as ek ook wou later, laat sê, druk hierdie dinge out-- so TODO later. Ek gaan more met doen this-- hierdie waarskynlik IS 'n korrekte implementering van om name en huise, drie van hulle totaal van elkeen, van 'n gebruiker.
Maar dit is nie baie goed ontwerp, reg? Wat as 'n student nie net 'n naam en 'n huis nie, maar ook 'n ID-nommer, en 'n telefoonnommer, en 'n e-posadres, en miskien 'n tuisblad, en miskien 'n Twitter hanteer, en 'n aantal ander besonderhede wat verband hou met 'n student of 'n persoon, meer in die algemeen. Hoe sal ons begin by te voeg funksie van hierdie program?
Wel, ek voel soos die eenvoudigste manier om die iets wil doen, kom ons sê, int ids studente. So ek kan al hul ID's daar. En dan, vir iets soos telefoonnommers, Ek is nie seker hoe om te verteenwoordig wat net nog nie. So laat ons gaan voort en net noem hierdie Twitters studente wat hulle is 'n bietjie vreemd, but-- en 'n klomp meer velde.
Ek het begin om effektief kopieer en plak hier. En dit gaan mooi groei lomp redelik vinnig, reg? Sou dit nie lekker wees as daar in die wêreld 'n data struktuur bekend nie as 'n int of 'n string, maar iets 'n hoër vlak, 'n abstraksie, so te praat, bekend as 'n student? C het nie kom met 'n ingeboude funksies vir studente, Maar wat as ek wou dit so te gee?
Wel, dit blyk, ek gaan 'n lêer genaamd structs.h hier oop te maak, en jy kan presies dit te doen. En ons gaan om te begin doen dit nou. En onder die kap van P van drie, jy reeds doen dit nou. Daar is nie so iets soos 'n g rect of 'n g ovaal in die programmeertaal C.
Mense by Stanford geïmplementeer diegene data tipes deur die gebruik van hierdie benadering hier verklaar hul eie nuwe data tipes gebruik om 'n nuwe navraag genoem struct en 'n ander een wat geroep is typedef. En inderdaad, selfs al is die sintaksis lyk 'n bietjie anders as dinge ons reeds gesien het, in beginsel, dit is super eenvoudig.
Dit beteken net "'n soort definieer." Dit gaan 'n te wees struktuur, en 'n struktuur is net soos 'n houer vir verskeie dinge. En dat struktuur gaan 'n string genoem naam te hê, en 'n string genoem huis. En laat ons noem, net vir gerief, hierdie hele data struktuur student.
So die oomblik wat jy kry om te die kommapunt, jy het nou geskep jou eie data tipe genoem student wat nou staan ​​langs int, en float en char en tou, en g rect, en g ovaal, en 'n aantal ander dinge wat mense het uitgevind.
So, wat is nuttig oor hierdie nou is dat as ek gaan terug te STRUKT 0 en klaar is met hierdie implementering, wat ek geskryf vooraf hier, sien dat al van die onvermydelike messiness wat was om te begin gebeur as ek bygevoeg telefoonnommers en gekwetter en al hierdie ander dinge te 'n student se definisie nou is dit saaklik toegedraai as net 'n verskeidenheid van studente.
En elkeen van die studente nou het verskeie dinge binnekant van dit. Sodat net laat 'n vraag. Hoe kry jy by die naam, en die huis, en die ID, en alles anders is binnekant van die student? Super eenvoudige, as well. Nuwe sintaksis, maar 'n eenvoudige idee.
Jy hoef net indeks in die skikking, soos ons gedoen het verlede week en hierdie. En wat is duidelik die nuwe stuk van die sintaksis? Net., Wat beteken "gaan binne die struktuur en kry die veld met die naam naam, kry die veld genaamd huis, kry die veld genoem student. "
So in P van drie, as jy nog besig met wat, en die meeste mense steeds is, besef dat as jy begin gebruik dinge soos g rects en g ovale en ander dinge wat lyk nie te vandaan Week Zero, Een of twee, besef dat dit is omdat Stanford verklaar 'n paar nuwe data tipes.
En inderdaad, dit is presies wat ons sal doen, asook, in P Stel Vier, wanneer ons begin om te gaan met dinge soos beelde, bitmaps, en nog baie meer. So dit is net 'n teaser en 'n geestelike model vir wat aan die kom is. Nou, ek procrastinated 'n bietjie vanoggend. Ek was soort van nuuskierig om te sien wat die Microsoft gallery eintlik lyk soos vandag. En dit blyk iemand in 2006 eintlik het byna presies dieselfde plek te neem in die werklikheid wat lyk soos dat hierdie dae. Die gebied is nou 'n bietjie toegegroei.
So praat nou van beelde, laat ons terug te bring Daven hier op die skerm en Nicholas, en net herinner u dat as jy wil ons aan te sluit vir middagete Vrydag, hoof aan ons gewone URL hier.
So waar het ons laat af op Maandag? Ons het hierdie probleem, reg? Dit was skynbaar 'n korrekte implementering van ruil, waardeur jy neem twee ints, die een het 'n een genoem b, ruil hulle, net soos Laura het hier op die verhoog met die melk en die water, deur die gebruik van 'n tydelike veranderlike, of 'n leë koppie, sodat ons kan sit in 'n b en in b sonder om 'n gemors van dinge. Ons het 'n veranderlike. Dit is bekend as temp.
Maar wat was die fundamentele probleem met hierdie kode op Maandag? Wat was die probleem hier? Ja.
Publiek: Dit neem meer ruimte.
David J. Malan Neem meer ruimte, want ek is met behulp van 'n veranderlike, en dit is OK. Dit is waar, maar ek is gaan om te sê dit is OK. Dit is slegs 32 stukkies in die groot skema van dinge, so nie 'n groot deal. Ander gedagtes? Publiek: Dit ruil net die veranderlikes plaaslik. David J. Malan Presies. Dit ruil net die veranderlikes plaaslik. Omdat enige tyd wat jy noem 'n function-- toe ek die bak van Annenberg laaste keer, jy het groot op die bodem. Sodra jy noem 'n funksie genoem ruil, beteken ruil nie x en y kry, die oorspronklike waardes. Wat beteken ruil kry, het ons eis? Publiek: Afskrifte. David J. Malan So afskrifte van hulle. So raak dit een en twee, as jy onthou die voorbeeld van die laaste keer, maar 'n afskrif van een en twee wat suksesvol verruil. Maar ongelukkig in die einde, daardie waardes is nog steeds dieselfde. Sodat ons kan sien met ons nuwe vriend, hopelik GDB, dat jy of die TFS en Ca se het is om u te lei na die volgende.
So nie omruil onthou lyk se like-- laat oopmaak this-- lyk. Ons geïnisialiseer x aan die een, y aan twee. Het 'n klomp van die gedrukte f se. Maar dan, die sleutel oproep hier was om te ruil, wat is presies die kode wat ons net gesien 'n oomblik gelede. Wat is korrek ten eerste oogopslag, maar funksioneel, hierdie program nie werk nie, want dit nie permanent ruil x en y.
So laat ons sien, 'n vinnige warm hier met GDB, 'n ./noswap. 'N klomp van die oorweldigende inligting wat Ek sal ontslae te raak van met beheer L vir nou. En nou, ek gaan om te gaan voort en voer dit uit. En ongelukkig, wat was nie dat nuttig. Dit het die program in hierdie program genaamd GDB, 'n debugger, maar dit het my nie laat sak rond.
So, hoe kan ek eintlik breek uitvoering binne hierdie program? So breek. En ek kon breek op enige reël nommer een, 10, 15. Maar ek kan ook simbolies breek deur te sê breek hoof. En dit gaan 'n breek te stel punt, blykbaar by lyn 16 in die belangrikste. En waar is lyn 16? Kom ons gaan na die kode en optrek na noswap. En inderdaad, lyn 16 is die heel eerste in die program.
So nou, as ek gaan voort en tipe hardloop hierdie tyd, Tik, dit gestop. So laat sak rond. Druk x-- hoekom is x nul? En ignoreer die dollar-teken. Dit is net vir liefhebber gebruik van die program. Hoekom is X nul op die oomblik? Ja.
Publiek: Dit onderbreek reg voor lyn 16, nie eintlik op die lyn 16. David J. Malan Presies. GDB, by verstek, het gestop uitvoering net voor lyn 16. So is dit nie uitgevoer word, wat beteken x is van 'n onbekende waarde. En ons het gelukkig dat dit iets skoon, soos nul. So nou as ek tik die volgende, nou is dit uitgevoer word 16. Dit is vir my gewag om uit te voer 17. Laat my voor en druk x gaan. Dit is een. Laat my voor en druk y gaan. Wat moet ek nou?
David J. Malan 'n bietjie harder.
Publiek: [onhoorbaar] David J. Malan Nie heeltemal 'n konsensus. So ja, sien ons 'n paar vullis waarde. Nou, y is 134514064 daar. Wel, dit is net 'n paar vullis waarde. My program maak gebruik van geheue vir verskillende doeleindes. Daar is ander funksies. Ander mense in my rekenaar geskryf. So daardie stukkies is gebruik vir ander waardes, en wat ek sien is die oorblyfsels van 'n paar voor gebruik van daardie geheue.
So geen groot deal, want sodra as ek tik die volgende en druk dan y, dit geïnisialiseer te die waarde wat ek wil hê. So nou, laat ons gaan voort 'n bietjie vinniger. N vir volgende. Kom ons doen dit weer. Kom ons doen dit weer. Maar ek wil nie te tref dit hier, want as ek wil om te sien wat binne aangaan van ruil, wat is die opdrag?
David J. Malan stappe. So hierdie stappe my in 'n funksie, eerder as om daaroor te skryf. En nou is dit 'n bietjie kripties eerlik, maar dit is net vertel my ek is in lyn 33 nou. En laat ons doen dit weer. Print temp. Vullis waarde, negatiewe hierdie tyd, maar dit is net nog 'n gemors waarde. So laat ons nou doen, druk temp. Dit is geïnisialiseer tot 1, wat was die waarde van x, aka a.
Nou, waar is ons 'n X vandaan? Wel, kennis belangrikste, ons het hierdie waardes x en y. Ons het toe geslaag het hulle soos volg te ruil. X het eerste gekom, komma y. En dan, ruil hulle kon x en y noem. Maar vir duidelikheid, dit is noem hulle a en b. Maar A en B gaan nou wees afskrifte van x en y, onderskeidelik.
So as ek gaan terug na GDB, tydelike is nou een en 'n is nou een. Maar as ek volgende doen en nou doen druk 'n, 'n reeds verskuif. Die melk is in die vorige uitgestort lemoensap se glas, of andersom.
En as ek nou doen weer, en nou As ek druk as 'n gesonde verstand tjek, 'n nog twee, maar b is nou een. Om eerlik te wees, dit is nog steeds daar. Ek gee nie om wat temp is. Maar so gou as ek tik nou, kom ons sê, voortgaan om terug te gaan, nou is ek aan die einde die program. En ongelukkig, x is steeds een en y is nog twee.
So wat was die nut van GDB is daar? Dit het my nie help nie los die probleem per se, maar dit hopelik my help verstaan ​​deur die besef dat ja, my logika is reg, maar my kode is nie uiteindelik met 'n permanente impak. So dit is 'n probleem wat ons is gaan vandag nou op te los.
Maar laat ons daar te kom deur middel van hierdie. String is 'n leuen. Dit is ook nie 'n data tipe wat bestaan ​​in C. Dit is is 'n sinoniem vir 'n paar tyd vir iets anders, en ons kan toon dat soos volg.
Laat my voort te gaan en maak 'n program genaamd vergelyk-0. En eerder as tik hierdie een uit, Ons sal begin deur die kode om te loop Ek het reeds geskryf, maar dit is net 'n paar lyne. So dit vergelyk-0. En die eerste ding wat ek doen is om 'n lyn van die teks.
Maar let op wat ek doen vir die eerste keer. Wat is die verskil duidelik oor reël 21? Eintlik, wag 'n minuut. Dit is afskrif twee. Dit is nie eens die regte program. Alle reg, spoiler waarskuwing. Alle reg, sodat never mind dat. Dit is die antwoord op 'n vraag toekoms.
Hier is vergelyk-0, en ek is om 'n lyn van die teks te kry. Program se baie makliker. So dit is eenvoudig. Dit is soos die week een Week Twee dinge op die oomblik. string s = GetString. Nou, ek sê dit weer hier. string t = GetString. En dan, die laaste ding wat in hierdie program, soos sy naam suggereer, is ek gaan om te probeer om hulle te vergelyk.
So as s, die eerste string, gelyk = t, dan is ek gaan om te sê jy dieselfde ding tik. Anders, ek gaan om te sê jy tik verskillende dinge. So laat opstel en uitvoering van hierdie program. So maak vergelyk nul. Lyk goed. Geen samestelling foute.
Laat my voort te gaan nou en tik ./compare-0. Laat my gaan voort en sê iets : Daven en iets: Rob. En ek tik verskillende dinge. So ver, so goed. Program blyk korrek te wees.
Maar laat ons hardloop dit weer. Sê iets: Gabe. Sê iets: Gabe. Alle regte. Miskien het ek getref space bar of iets funky. Kom ons doen dit weer. So Zamyla. Zamyla. Verskillende dinge. So, wat gaan aan?
So ons het hierdie twee lyne van kode, GetString word twee keer genoem. En dan, ek is bloot probeer s en t te vergelyk. Maar wat werklik dan aan die gang is? Wel, my handskrif se oor te slagter hierdie voorbeeld ietwat. En laat ons eintlik gooi hierdie up hier, as well.
So het ons 'n lyn soos string s = GetString. So dit is net die eerste interessante lyn van die program. Maar wat al hierdie tyd was gaan op onder die enjinkap? Wel, op die linkerkant is string, wat is 'n soort van 'n veranderlike, en dit genoem is. So ek weet dat dit is die gebruik van die geheue, of geheue, in my rekenaar of ander manier. So ek gaan 'n abstrakte teken dat as 'n vierkant. 32 stukkies, dit blyk, maar meer inligting oor wat in die toekoms. En dan, is wat gaan aan hier?
Wel, GetString natuurlik kry 'n string van die gebruiker. En GetString het Zamyla of Gabe of Daven. So laat ons kies om die eerste van diegene wat Daven. So effektief, wat GetString het my in die eerste geval was D-'n-v-e-N. En dan, wat anders het dit gee my die geheim? Publiek: [onhoorbaar] David J. Malan Ja, die / 0 of nul karakter. So dit effektief vir my 'n string. Maar ons weet reeds uit die vorige lyk dat 'n string is net 'n skikking van die karakters, en dit is beëindig deur hierdie spesiale brandwag karakter / 0.
Maar as dit waar is en dit is 'n vierkant, Dit is duidelik 'n veel groter reghoek. En inderdaad, dit is, Ek eis nie, slegs 32 stukkies. En dit is duidelik meer as 32 stukkies, want dit is waarskynlik agt plus agt plus agt plus agt plus agt, net omdat grepe in ASCII. Hoe die hel gaan ons aan te pas Daven in hierdie klein blokkie hier?
Wel, wat is eintlik GetString doen? Wel, hierdie rooster hier verteenwoordig my rekenaar se geheue of RAM. So laat ons arbitrêr sê dat indien elk van hierdie verteenwoordig 'n greep, dan kan ons dink van elke byte as wat 'n adres, soos 33 Oxford Street, of 34 Oxford Street, of 35 Oxford Street.
So net soos huise het adresse en geboue adresse, doen individuele grepe geheue hê adresse of nommers wat uniek te identifiseer. Nou, dit is arbitrêr. Maar om dit eenvoudig te hou, ek gaan gebruik heksadesimale net deur die konvensie, maar die 0x beteken niks anders as "dit is heksadesimale." en ek gaan om te beweer dat die "D" eindig by Byte Een in die geheue.
Ek het niks anders aan die gang in geheue, so Daven het die eerste plek by Byte Een. Dit is dan, gaan 0x2 te wees. Dit gaan 0x3. Dit gaan 0x4 te wees. Dit gaan 0x5. Dit gaan 0x6 te wees.
Maar as jy begin dink oor wat die rekenaar se toedoen onder die enjinkap, jy kan begin om af te lei hoe jy 'n paar jaar gelede, sou het C self geïmplementeer. Wat is GetString waarskynlik returning-- omdat dit voel soos dit is nie terugkeer Daven, per se, omdat hy sekerlik nie gaan te pas in hierdie klein box-- So, wat is GetString waarskynlik terugkeer?
David J. Malan Die ligging van Daven. En dit is hierdie doen sedert Week Een. Wat GetString is regtig terugkeer is nie 'n string, per se. Dit is een van die min wit leuens. Dit is die terugkeer van die adres van die string in die geheue, die unieke adres. Daven woon op 33 Oxford Street. Maar meer saaklik, Gavin woon by 0x1, adres nommer een.
So wat kry sit in hierdie boksie dan duidelik wees, is net die adres van die string. So al hierdie tyd, hierdie is aan die gang. Maar wat hierdie sinspeel op nou is dat as al s is 'n aantal binnekant van dit, wat is om jou te stop, die programmeerder, uit om enige getal in enige veranderlike en net spring aan daardie deel van die geheue? En inderdaad, sal ons sien dit is 'n bedreiging volgende keer.
Maar vir nou, dit voel onvoldoende. As ek sê, vir my 'n string, jy gee my Daven. Maar jy het nie regtig gee my Daven. Al wat jy my gee is Daven se adres. Hoe weet ek dan vir seker waar Daven begin en ends-- die storie se om weird-- waar Daven begin en eindig, en dan die volgende string in die geheue begin?
Wel, as jy die uitdeel vir my die begin van Daven, wese, hoe weet ek waar die einde van sy naam is? Dit spesiale null karakter, wat is al hoe meer nou belangrik As snare onder die kap eenvoudig geïdentifiseer uniek aan hul plek in die geheue. So al hierdie tyd, dit is wat aan die gang is.
So wanneer ons nou kyk die kode hier, verduidelik As jy wil die fout in lyn 26. Hoekom is Zamyla en Zamyla anders? Hoekom is Gabe en Gabe anders? Ja, in die rug.
Publiek: Hulle het verskillende adresse.
David J. Malan Net omdat hulle het verskillende adresse. Want as jy GetString noem weer, wat ek sal gou hier te doen, As dit is die tweede lyn, string t, soos ek gedoen het in daardie program, gelyk ander oproep om GetString. Die volgende keer wat ek noem GetString, ek gaan 'n ander deel van die geheue te kry.
GetString word toegelaat die bedryfstelsel te vra stelsel vir meer en meer geheue. Dit gaan nie om dieselfde te onthou ses grepe elke keer. Dit gaan 'n nuwe te kry stuk van die geheue, wat beteken t gaan kry 'n ander waarde hier.
So wanneer ek s gelyk aan = t, is jy nie te vergelyk D teen hierdie en 'n teen hierdie en V teen hierdie. Jy vergelyk dit teen hierdie, wat eerlik is redelik useful-- useless-- is redelik nutteloos, want wat werklik omgee waar die snare is in die geheue?
En inderdaad, ons het nie. En ons is nie van plan om begin veral omgee. Slegs tot die mate dat foute kan ontstaan en veiligheid bedreig kan opstaan ons eintlik begin omgee oor hierdie. So laat ons die probleem kan oplos. Turns out, jy dit regmaak super eenvoudig.
En laat ons eintlik, voordat ek openbaar dat die weer, wat sou jy doen as in 'n CS50 klas en jy het om te implementeer 'n vergelyking teen twee stringe. Jy kan duidelik nie net gebruik is gelyk aan = t. Maar net logies, hoe sou jy hierdie string vergelyk teen hierdie string met behulp van C-kode? Ja.
Publiek: Net doen die lus vir [onhoorbaar] David J. Malan Perfect. Publiek: [onhoorbaar] David J. Malan Ja. Net gebruik om 'n lus vir of 'n while lus of wat ook al. Maar net die toepassing van die basiese idee dat indien dit is 'n stuk van die geheue of 'n skikking en dit is, Itereer oor beide op dieselfde tyd. En net vergelyk die letters.
En jy het 'n te wees bietjie versigtig, want jy wil nie 'n vinger om te gaan verby die ander want die een string is langer as die ander. So jy gaan om te wil om te kyk vir hierdie spesiale waarde aan die einde, nietig. Maar dit is werklik, in die einde, so eenvoudig soos dit. En eerlik, het ons nie nodig dat die wiel te herontwerp. Hier is weergawe Twee. En wat gaan ek hier sê, is dat in plaas van die vergelyking s = t gelyk, Ek plaas gaan om te sê, as string vergelyking van s komma t gelyk aan = 0. Nou, wat is string vergelyk?
Dit blyk uit, dit is 'n funksie wat kom met C, wie se doel in die lewe is twee snare te vergelyk. En roer dit vergelyk, as ons lees sy man bladsy of dokumentasie of CS50 verwysing, sal dit eenvoudig vertel dat opskudding opbrengste óf 'n negatiewe vergelyk nommer of 'n positiewe getal of nul, waar nul beteken hulle is gelyk.
Dus net bespiegeling. Wat kan dit beteken as roer vergelyk opbrengste negatiewe waarde of positiewe waarde? Publiek: groter as of minder as. David J. Malan Ja, groter as of minder as. So as jy wil 'n geheel te sorteer n klomp van die snare in 'n dictionary-- Soos ons sal uiteindelik teen die road-- perfekte funksie potensieel gebruik, want dit gaan om dit te doen vergelyking van snare vir jou, en vertel jy nie 'n kom voor b, of nie b kom voor 'n alfabeties. Ons kan presies dit te doen.
En kennis van wat ek gedoen het een ander ding in hierdie voorbeeld. Wat anders het hoër in hierdie belangrikste funksie? Char *. En dit is dat ander wit leuen. Al hierdie tyd, wanneer jy is die skryf van string, ons het die geheim is herskryf string as char * sodat klang eintlik verstaan ​​jy.
Met ander woorde, in CS50.h en as ons uiteindelik sien, ons het 'n sinoniem genoem string dit is dieselfde ding as char *. En nou, weet net dat die * In hierdie konteks, ten minste, n beteken die adres.
Die adres van wat? Wel, die feit dat ek gesê char *, en nie int * of * dryf, beteken dat char * is die adres van 'n kar. So hierdie klein blokkie hier, alias string, is regtig van die tipe char *, wat is bloot 'n fancy manier om te sê, in hierdie boks sal 'n adres te gaan. En wat beteken die adres verwys na? Blykbaar 'n kar.
Maar ons kon absoluut het int * en ander dinge. Maar vir nou, char * is regtig die mees eenvoudig en een van rente. So hierdie probleem gaan om te styg, al is, weer.
Dink ek maak hierdie program. Kom ons kyk of ons nou kan voorspel Wat is verkeerd met hierdie kode. So in hierdie program, kopieer-0, ek is gaan om voort te gaan en weer 'n beroep GetString en die stoor van die waarde in s.
En dan, waarom doen ek dit, net as 'n herinnering van weke verlede? Ons het gesê dat GetString soms terugkeer null. Wat beteken dit as GetString terug nul? Iets het skeefgeloop. Dit beteken waarskynlik die string te groot, die rekenaar se geheue. Dit gebeur super, super, super selde, maar dit kan gebeur. Ons wil om te kyk vir dit, en dit is al wat ons doen.
Omdat ons nou sal sien, as jy dit nie doen nie begin nagaan gewoonlik vir dinge soos nul is, kan jy eintlik begin om te gaan om adresse in die geheue wat ongeldig. En jy gaan om te begin induserende meer en meer segmentering foute. Of in 'n Mac of 'n rekenaar, net veroorsaak dat 'n rekenaar op te hang of 'n program te vries, potensieel.
So nou, ek eis in kopie-0.C, dat ek ek gaan die snare te kopieer deur middel lyn 28. En dan, ek gaan te eis aan die onderkant hier waar ek gaan een van hulle te verander.
So dit agterkom. Ek bel ons ou vriend strlen. En net in Engels uit wat hierdie lyn 34 doen? Wat beteken t bracket 0 verteenwoordig op die linkerkant. Ja.
Publiek: eerste karakter van t? David J. Malan eerste karakter van t. Dit is dit. Eerste karakter van t, ek wil die hoofletters weergawe te wys van die eerste karakter in t. So dit is kapitaliseer die eerste letter. En dan, die laaste ding wat ek doen in hierdie program is Ek eis hier is die oorspronklike, s, en hier is die afskrif, t.
Maar op grond van die storie het ons net vertel wat snare werklik is, wat lyn 28 regtig doen, en wat is die gevolglike fout gaan te wees op die skerm?
So die eerste, die eerste vraag, 28. Wat is string t = s regtig doen? As ons op die linker-hand kant hier string t = s; wat gee my 'n boks hier en een box hier. En veronderstel is hierdie adres 0x, kom ons sê, 50 hierdie tyd, arbitrêr. Wat doen string s t = doen onder die enjinkap?
David J. Malan Dit slaan die geheue daar spreek, so 0x50 gaan daar. So as nou, ek gaan na die eerste karakter in t en hoofletters nie, wat ek doen effektief te s? Ek is regtig dieselfde ding doen, reg? Want as Adres 0x50-- en net ek het nie baie ruimte op die bord hier maar aanvaar dat dit is 0x50 hier, iewers in my rekenaar se geheue.
En ek het, byvoorbeeld, Gabe met klein hier, soos hierdie. En ek het gesê t bracket 0 kry gekapitaliseer. Wel, t bracket 0 is die eerste letter in t. So min g gaan word groot G. Maar die probleem word, wat beteken s ook verwys na?
Publiek: Die dieselfde.
David J. Malan presies dieselfde ding. So 'n eenvoudige verduideliking miskien, selfs al is die sintaksis is 'n bietjie vreemd. So laat ons dit doen. Maak kopie-0 en ./copy-0 dan. Sê iets: Gabe. En ongelukkig, beide van hulle het nou gekapitaliseer maar om die onderliggende Daarom dat ons net nou die hantering van adresse.
So hoe begin ons te address-- geen woordspeling intended-- hoe begin ons aan te spreek hierdie spesifieke probleem? Wel, in copy1.c, dinge gaan om 'n bietjie meer ingewikkeld. Maar ek sou beweer 'n konseptueel eenvoudige oplossing.
So moeilik om te kry op die eerste oogopslag. Gaan nie maklik vir die eerste wees tyd wat jy dit uit tik, miskien, maar as die probleem is dat eenvoudig doen t = s net afskrifte van die adres, wat, weer as ek kan kies op jou, gaan die oplossing wees vir eintlik kopiëring van 'n string?
Publiek: Ons sal waarskynlik Gebruik 'n lus weer.
David J. Malan Ja. So ons gaan 'n lus om weer nodig het. En omdat as ons wil kopieer 'n string s in 'n ander string, ons waarskynlik wil om dit te doen karakter deur karakter. Maar die probleem is, as Dit is oorspronklik s, nou moet ons uitdruklik begin toekenning van geheue vir t.
Met ander woorde, laat Teken hierdie 'n laaste keer. As dit is n string s = GetString. En laat ons hierdie hier, as well. Dit is GetString. En dan, die foto vir iets soos dit gaan as voorheen, g-'n-b-e / 0. Dit lyk 'n bietjie iets soos hierdie. En is dus ons noem dit 0x50, en wat gaan wees 51, 52.
So dit is 0x50. En dan, ek doen string t. In die geheue, wat net gaan gee my 'n bietjie vierkante soos hierdie. So, wat is die sleutel stap nou? As ek wil s in t te kopieer, wat leeg moet ons hier te vul? Of wat moet ons doen op 'n hoë vlak? Ja? Iemand? Ja.
Publiek: Ons moet [onhoorbaar]. David J. Malan Ja, ons moet in hierdie leeg te vul. Ek kan nie kopieer en dan kapitaliseer Gabe se naam totdat ek vra die bedryfstelsel vir 'n ander deel van die geheue dit is ten minste so groot soos die oorspronklike. Sodat ons met 'n vraag.
Hoe vra ek die bedryfstelsel nie net vir 'n eenvoudige klein pointer-- as dit genoem word, 'n adres, 'n pointer-- nie vir 'n eenvoudige klein boks soos hierdie sogenaamde string? Hoe vra ek die bedryfstelsel stelsel vir 'n groot deel van die geheue? So ver, het ek net dit terug gekry indirek deur die roeping van GetString. So, hoe is GetString selfs om sy geheue?
Wel, dit blyk dat daar hierdie ander funksie hier dat ons nou sal begin om te gebruik. Nou, dit lyk manier om meer kriptiese than-- en ek is die enigste een wat kan sien it-- hierdie lyn lyk manier om meer kripties dan met die eerste oogopslag dit moet. Maar laat ons terg dit uitmekaar.
Op die linkerkant, ek het kar * t. So in Engels, laat ons begin te formuleer behoorlike sinne in die tegniese jargon. So dit is die toekenning van 'n veranderlike van tipe char * genoem t. Nou, wat beteken dit werklik?
Wel, dit beteken, wat gaan ek te sit in hierdie veranderlike genoem t? 'N adres van 'n kar. So dit is net die eenvoudiger, meer redelike manier van die beskrywing van die linkerkant. So wat skep hierdie boks hier net. So die regterkant, vermoedelik, gaan toe te ken wat groter stuk van die geheue hoe? So laat se terg hierdie uitmekaar.
Dit is oorweldigend op die eerste oogopslag, maar wat binne aangaan hier? Eerstens, daar is malloc, wat is glo ons nuwe vriend, "Geheue toeken." So dit is die argument wat geslaag in dit, so dit is 'n mooi groot argument. So laat se terg hierdie uitmekaar.
strlen van s, natuurlik, verteenwoordig the-- Publiek: Die aantal karakters. David J. Malan Net die aantal karakters in s. So het die lengte van s, die oorspronklike string. So G-'n-b-e. So is dit waarskynlik vier in hierdie geval. Hoekom doen ek 1 na roep strlen van s? Publiek: [onhoorbaar] David J. Malan Vir daardie spesiale null karakter. As jy my vra wat is die lengte van Gabe se naam, ek gaan om te sê vier. Onder die enjinkap, alhoewel, ek nodig het die vyfde byte vir die null karakter. So dit is waarom ek doen die 1.
Nou net in geval jy is besig om hierdie program op 'n ander as die rekenaar, sê, die CS50 toestel, waar die grootte van 'n kar dalk anders wees uit my eie computer-- blyk dat ek dit kan noem operateur sizeof, vra net die rekenaar, Wat is die grootte van 'n char op hierdie rekenaar?
En vermenigvuldig vyf in hierdie byvoorbeeld deur die grootte van 'n kar, wat op die meeste rekenaars sal net een wees, malloc gaan wys vir my 'n groot stuk van die geheue hier aan die regterkant. En dit gaan return-- dit is 'n function-- so dit is gaan om terug te keer na my wat? Publiek: Die adres? David J. Malan Die adres van wat? Publiek: Van die geheue dit toegeken? David J. Malan Van die geheue dit toegeken is. So ek het geen idee, eerlik, waar dit gaan eindig. Ek is van plan om dit te stel dit gaan eindig by 0x88. Heeltemal arbitrêre, maar iewers anders as 0x50, omdat die bedryfstelsel, wat Windows en Mac OS vir my doen, is seker te maak dat dit wat my verskillende stukke van die geheue.
So dit is die waarde waar dit stuk van die geheue kan beland. So dit is wat eindig in hier, 0x88. So nou duidelik, ek kan verstaan dat dit nie dieselfde is as dit, omdat hulle te wys op verskillende dele van die geheue. So as ek nou eintlik wil dit kopieer in, laat ons doen om jou voorgestelde oplossing.
Kom ons loop net, skep 'n lus vir die, en doen t bracket i kry s bracket i. Want nou kan ek hierdie reeks-agtige notasie, want selfs al malloc baie generies ken my geheue, geheue is net aangrensende grepe. Byte, byte, byte, rug aan rug aan rug.
Ek kan sekerlik as 'n programmeerder hanteer dit as 'n skikking, wat beteken dat ek kan gebruik om die finaal bekend notering van net 'n paar vierkante hakies.
So laat my daar breek, want dit is 'n baie op een slag, selfs Hoewel die basiese idee om herhaling is dat string, al hierdie tyd, is nie 'n nuwe datatipe per se. Dit is net 'n sogenaamde wyser, 'n adres van 'n karakter, wat net beteken dit is 'n aantal wat deur menslike konvensie ons geneig as 0x om iets te skryf.
Maar dit is net 'n nommer, soos 33 Oxford Street, wat gebeur met die wees CS gebou se adres. Enige vrae oor hierdie inligting? Ja?
Publiek: Hoekom doen ons kyk vir t gelyk aan NULL?
David J. Malan Hoekom doen ons gaan vir t gelyk aan NULL? As ons lees die documentation-- groot question-- vir malloc, dit gaan om te sê in fynskrif, soms malloc kan terugkeer null, net soos GetString. En inderdaad, GetString terugkeer null As, op sy beurt, malloc terugkeer null, omdat GetString gebruik malloc.
En dit kan gebeur as die bedryfstelsel, Mac OS, Windows, wat ook al, is eenvoudig geheue vir jou. So dit is wat daar gebeur het.
En laat my openbaar 'n ander ding wat dalk net jou verstand te blaas of heeltemal te ver oor die lyn wees. Maar laat my toe om die Dieselfde geld vir lus vir die kopiëring, wat 'n oomblik gelede, onthou was hierdie. t bracket i kry s bracket i.
Nice en gebruikersvriendelik. Voel soos Week Twee weer. Maar hierdie weergawe eintlik kan wees herskryf as hierdie, wat kriptiese lyk. Dit is 'n tegniek genoem wyser rekenkundige, adres rekenkundige. Maar hoekom werk dit?
Nou lastig, die skrywers van C besluit om te gebruik die * simbool vir verskillende doeleindes. Ons het gesien dat dit reeds gebruik een keer, char *, wat beteken "gee my 'n veranderlike wat gaan om te bevat die adres van 'n kar. " So kar * in hierdie konteks beteken "gee my 'n veranderlike."
Ongelukkig, as jy gebruik maak van die * sonder 'n woord in die voorkant van dit, soos kar, dit is nou bekend as die dereference operateur. En ons sal meer hiervan sien voor lank. Maar dit beteken net "daar gaan." Dit is soos om te sê, as iemand my oorhandig op 'n stuk papier "33 Oxford Street," as ek dit doen "* 33 Oxford Street," wat beteken "Gaan op die pad na die CS gebou."
So * net beteken dat daar as gaan daar is geen woord in die voorkant van dit. So, wat is t, duidelik te wees? t is die adres van die stuk van geheue wat terug gegee is aan my. s is die adres van wat, om duidelik te wees, in die voorbeeld wat ons het bespreek, van klein Gabe? s is die adres of-- Publiek: Die string. David J. Malan Van Gabe se oorspronklike naam. So dit is die adres van hierdie stuk van die geheue. So as ek sê t + i-- i, kennisgewing, is net ons ou vriend. Dis net 'n indeks veranderlike dit is iterating van nul op tot die lengte van die string s. So dit gaan wees nul is, dan een, dan twee, dan drie, dan vier. So laat ons vergader om hierdie nuwe Kras soos legkaart stukke, as jy wil, selfs al is, weer, die sintaksis is veel meer arcane as nuuts af. So t is 'n adres + Ek gaan my te gee 'n groot aantal, omdat hulle is almal getalle wat ons het is die tekens as blok. Maar hulle is net nommers.
Dus, as die adres van t ons gesê was 0x88, wat is 0x88 plus nul. Selfs al is jy nie gemaklik met Hex nog, neem 'n raaiskoot.
Publiek: Die oorspronklike.
David J. Malan Nog 0x88. So wat beteken * 0x88 beteken? Dit beteken, "gaan daar", wat beteken effektief, "Bring jou vinger hier." En nou op die regterkant van die hierdie uitdrukking, * en dan in parens, s + i beteken s, wat is die spreek hier van die min g. s + 0 is, natuurlik, is, wat s is.
So nou, dit is * s, wat net soos * 33 Oxford Street beteken gaan na die adres s. So hier is die vinger regterhand. So wat gaan ek te kopieer in wat? Die ding op die regte wat Gabe, min g hier, in hier.
En so het die uitwerking van daardie eerste iterasie van die lus, as jy voorgestel het, selfs al is dit lyk gek meer ingewikkeld as enigiets ons reeds gesien het, is eenvoudig te sê hier en kopieer daardie karakter hier. Dit gee jou 'n kaart vir beide plekke.
En ons sal baie meer van hierdie sien. Maar vir nou, die hoop is net te stel sommige van hierdie basiese idees. En inderdaad, laat ons kyk na een finale program hier, en dan die beloofde claymation, wat alles reg sal maak. Alle regte. So laat my daar gaan ons oop up--. So laat sy tweeën sal ons terugkom na hierdie prentjie voor lank. Laat my oopmaak hierdie laaste voorbeeld hier.
So hier is 'n super, super program wat accomplishes niks in die lewe wat nie die volgende. Dit verklaar die eerste twee veranderlikes, x en y, wat nie nommers hierdie tyd, per se. Hulle is nie heelgetalle, per se. Hulle is blykbaar int *. So net iemand, wat beteken dit As jou data tipe, jou veranderlike, is van die tipe int * ster? Dit is die adres van 'n int.
So ek het geen idee waar dit is nie. Dit beteken net "sit, uiteindelik, die adres van 'n int hier. " 0x50, 0x88, waar dit in geheue, is 'n adres gaan daar. En dit is wat y is gaan wees, as well.
As ek sê nou x = malloc (sizeof (int)), dit is 'n fancy manier om te sê, hey bedryfstelsel, via malloc, gee my genoeg geheue vir die grootte van 'n int, wat waarskynlik gaan wees 32 stukkies of vier grepe.
So wat beteken malloc terugkeer? Malloc gee 'n adres. So wat gaan gestoor kry in x? Die adres van die stuk van geheue, die vier grepe, wat malloc net gevind vir my deur te vra die bedryfstelsel.
Nou intussen lyn vier hier, die * x = 42. Net om duidelik te wees, wat af gaan daar? Op die linkerkant, * x. dit is soos * 33 Oxford Street. So * x beteken wat?
Publiek: Gaan na.
David J. Malan Gaan na daardie adres. Waar wat deel van geheue is, gaan na dit. En dit wat daar is, natuurlik? Publiek: 42. David J. Malan 42. Alle reg, * y, dieselfde idee. Gaan na die adres in y. Plaas die nommer 13 is daar, maar wat is y op die oomblik? GEHOOR: Daar is geen geheue vir y. David J. Malan Daar geen geheue vir y. So, wat doen y waarskynlik bevat, soos ons het gesê?
David J. Malan Sommige vullis waarde. Nou, vullis waarde is nog steeds 'n aantal. Dit kan nog steeds verkeerd vir 'n adres. Dit is asof iemand gekrap iets neer, en ek verkeerd dit as betekenis paar gebou in die straat af. En as jy net probeer om te gaan in sommige gebou wat jy nie het nie, of 'n stuk van die geheue wat jy nie het nie gegee is, kan slegte dinge gebeur. Rekenaar kan crash, of 'n ander onbepaalde gedrag kan gebeur.
So het die intro, dan, te Binky is dit. Ek onthou nog, 20 'n paar vreemde jaar later, waar ek was toe ek uiteindelik verstaan ​​wysers.
Dit wil sê, as jy verlaat hier in drie minute en ek dink ek doen nie wysers verstaan, besef Ek onthou 20 jaar vir 'n paar gek rede wanneer en waarom dit uiteindelik gesink in, sit met my onderrig mede, NISHAT Mehta in die agterkant van Eliot eetsaal. Nou het ek gedink want dit was een van die onderwerpe wat ek in veral gesukkel het. En dan is dit uiteindelik gebruik het, soos ek waag om te sê 'n baie onderwerpe Uiteindelik sal. En nou, te maak dat al die voel gelukkiger en al hoe meer oortuigend, Kom ons neem 'n finale blik in ons laaste drie minute hier by Binky, van ons vriend, Nick Parlante van Stanford.
Hey, Binky. Wakker te word! Dit is tyd vir wyser pret.
-Wat Is dit? Meer inligting oor die riglyne? O, goody!
-Goed, Om te begin, ek dink ons ​​is gaan 'n paar wenke om te nodig het.
-OK. Hierdie kode ken twee wysers, wat kan verwys na heelgetalle. -OK. Wel, ek sien die twee wysers, maar hulle nie blyk te wees verwys na enigiets.
-Dat is reg. Aanvanklik, wysers nie wys nie enigiets. Die dinge wat hulle wys te word genoem pointees, en die opstel van hulle op se 'n aparte stap.
-OH, Regs, regs. Ek het geweet dat. Die pointees geskei. Daar, so hoe ken jy nie 'n pointee?
-OK. Wel, die kode ken 'n nuwe heelgetal pointee, en hierdie deel stelle x te wys om dit te.
Hey, wat lyk beter. So maak dit iets te doen.
-OK. Ek sal dereference die wyser x slaan die nommer 42 in sy pointee. Vir hierdie truuk, sal ek moet my Towerstaffie van Dereferencing.
Your towerstaffie van Dereferencing? That-- dit is groot.
Nie, dit is wat die kode lyk. Ek sal net die opstel van die aantal, en [POP]
Hey, kyk. Daar gaan dit.
-So doen 'n dereference op x volg die pyl om toegang te verkry om sy pointee. In hierdie geval, 'n winkel 42 in daar. Hey probeer om dit te gebruik om die getal te stoor 13 deur die ander wyser, y.
-OK. Ek sal net gaan hier aan y, en kry die nommer 13 ingestel. En dan, neem die Wand van Dereferencing en net [BUZZ]
-OH, Hey! Dit het nie gewerk nie. Sê Binky, ek dink nie dereferencing y is 'n goeie idee nie, want jy weet, die opstel van die pointee is 'n aparte stap. En ek dink nie ons ooit gedoen het.
-goeie Punt. -Yeah. Ons toegeken die wyser y, maar ons nooit sit dit om te wys op 'n pointee.
-Baie Oplettend. Hey, jy lyk goed daar, Binky. Kan jy dit regmaak so dat y punte dieselfde pointee as x?
-Sure. Ek sal my towerstaffie gebruik van Pointer Opdrag.
-Is Wat gaan wees 'n probleem soos tevore? -Geen. Dit beteken nie raak die pointees. Dit verander net een wyser na verwys na dieselfde ding as 'n ander.
-OH, Sien ek. Nou y punte na dieselfde plek as x. So wag. Nou, is y vasgestel. Dit het 'n pointee. So jy kan probeer om die Wand van Dereferencing weer die 13 oor te stuur.
-Uh, OK. Hier gaan dit. [POP]
Hey, kyk na dit. Nou dereferencing werke op y. En omdat die wysers deel dat een pointee, het hulle albei sien die 13. -Yeah. Deel, wat ook al. So gaan ons plekke nou oorskakel?
O, kyk. Ons is uit die tyd.
-Just Onthou die drie wyser reëls. Nommer een, die basiese struktuur is dat jy 'n muis, en dit wys na 'n pointee. Maar die wyser en pointee is afsonderlike, en die algemene fout is om 'n wyser, maar om te vergeet om dit te gee 'n pointee.
Nommer twee, wyser dereferencing begin by die wyser en volg die pyl bo om toegang te verkry om sy pointee. Soos ons almal weet, is dit net werk as daar 'n pointee, watter soort kry terug artikel nommer een.
Nommer drie, wyser opdrag neem een ​​wyser en verander dit om te verwys na die dieselfde pointee as ander wyser. So na die opdrag, die twee wysers sal wys na dieselfde pointee. Soms, dit is bekend as die deel. En dit is al wat daar is om dit, regtig. Bye-bye nou. [Einde video speel] David J. Malan Dit is dit vir CS50. Ons sal u sien volgende week.