David Malan: Hallo, en Welkom terug na CS50. So dit is die einde van die week vier. Net een aankondiging eerste. So het die sogenaamde vyfde Maandag is kom eerskomende Maandag. Dit is die geleentheid om te verander van SAT / UNSAT 'n brief graad, of van brief graad SAT / UNSAT. Lastig, dat die proses verg 'n handtekening, want jy het om te vul uit een van daardie pienk add / drop vorms. Want tegnies is, die SAT / UNSAT weergawe en die brief graad weergawe het verskillende katalogus nommers. Maar nie 'n groot deal. Net kom na my of na Rob of om Lauren by enige punt. Of e-pos as jy nie die soort het van die papierwerk wat jy vandag nodig het, en ons sal seker wees om te help met die neem sorg dat voor Maandag. Alle reg, so vandag - Eintlik is daar 'n bietjie van 'n eggo. Kan ons toon my 'n bietjie? OK. So vandag, stel ons 'n onderwerp bekend as wysers. En ek sal erken dat dit een van die meer komplekse onderwerpe wat ons geneig is om te dek in hierdie klas, of eintlik enige inleidende kursus wat gebruik maak van C. Maar neem my woord vir dit, veral As jou gedagtes voel 'n bietjie meer gebuig vandag en in die komende weke. Dit is nie verteenwoordigend van wat jy kry 'n erger op hierdie beteken dit net dat dit is 'n besonder gesofistikeerde onderwerp dat ek belowe, 'n paar weke Dus, sal al te opvallend lyk eenvoudig in retrospek. Ek onthou nog tot vandag toe. Ek sit in Elliott eetsaal sit langs my TF NISHAT Mehta, wat 'n inwoner van Elliott huis. En vir een of ander rede, is hierdie onderwerp klik net. Dit is om te sê dat ek ook gesukkel met dit vir 'n geruime tyd, maar ek sal my bes doen om te help om enige sodanige vermy stryd oor 'n onderwerp wat uiteindelik is baie kragtig. Trouens, een van die onderwerpe wat ons sal bespreek in die komende weke is dat van veiligheid, en hoe kan jy eintlik ontgin masjiene in maniere wat nie bedoel is. En dié uitbuitery is tipies die gevolg van foute, foute wat ons mense maak deur nie die begrip van 'n paar van die onderliggende implementering besonderhede via watter programme gemaak word. Nou is dit te laat lyk al hoe meer gebruiker vriendelike, het ek gedink dat ek 'n 10 wil speel tweede voorbeeld van 'n bietjie Claymation figuur naam Binky wat gebring is lewe deur 'n vriend van ons op Stanford, professor Nick Parlante. So laat my toe om vir jou hierdie teaser van Binky hier. [Video speel] Hey, Binky. Wakker. Dit is tyd vir pret wyser. -Wat is dit? Meer inligting oor die riglyne? O, goodie. [Einde video-vertoning] David Malan: Dit is Stanford Rekenaarwetenskap. So meer oor dit te kom. [Applous] David Malan: Jammer, Nick. So onthou dat dit die laaste keer dat ons geëindig op hierdie baie opwindende fotonische lewe waardeur hierdie funksie net nie werk nie. Ten minste intuïtief, het dit gevoel soos dit moet werk. Bloot die uitruiling van die waardes van twee heelgetalle. Maar onthou dat wanneer ons gedruk uit die oorspronklike waardes in die belangrikste, een-en- twee, hulle was nog steeds een en twee en nie twee en een. So laat my eintlik skakel oor die toestel. En ek het 'n bietjie van skeletale kode in bevorder hier, waar ek beweer dat x 1 sal wees, sal y 2. Ek druk dan beide van hulle waardes met die druk f. Ek het toe beweer hier dat ons gaan om dit te ruil. Ek het 'n leë kol hier vir ons om te vul in vandag in net 'n oomblik. Dan, ek gaan om te beweer dat die twee veranderlikes is omgeruil. Dan gaan ek te druk hulle weer uit. En so hopelik, moet ek sien 1, 2. 2, 1. Dit is die super eenvoudige doel nou. So, hoe gaan ons oor uitruiling twee veranderlikes? Wel, as ek voor hier dat hierdie koppies kan verteenwoordig geheue in 'n rekenaar. Dit is 'n paar happies, hierdie is nog 'n paar happies. Kan ons 'n vrywilliger gekom het op en meng ons 'n paar drankies, as dit bekend? Kom up. Wat is jou naam? JESS: Jess. David Malan: Jess? Kom op, Jess. As jy nie omgee nie, het ons die te sit Google Glass op jou, sodat ons kan verewig hierdie. OK, glas. 'N video opneem. En OK, ons is goed om te gaan met Jess hier. Alle regte. Nice om jou te ontmoet. So wat ek wil julle hier doen - As jy kon, redelik vinnig - net gooi ons die helfte van 'n glas van oranje sap en 'n halwe glas melk, wat effektief die nommers 1 in 'n beker en 2 in die ander beker. Dit gaan 'n goeie materiaal wees. JESS: Jammer. David Malan: Nee, nee. Dit is OK. Nice. Alle reg, so ons het vier grepe waarde van lemoensap. Ons sal dit die waarde 1. Nou nog vier grepe waarde van melk. Sal noem dit waardeer 2. So x en y, onderskeidelik. Alle reg, so nou as die taak op hande - Vir jou, Jess, aan die voorkant van alle van jou klasmaats - is die waardes van x en y so te ruil dat ons wil hê dat die lemoensap in die ander beker en die melk in die beker, hoe kan jy - voordat jy eintlik doen dit - gaan om dit te doen? OK, wyse besluit. So moet jy 'n bietjie meer geheue. So laat ons ken 'n tydelike beker, as jy wil. En nou voortgaan x en y te ruil. Uitstekend. So baie goed gedoen. Baie dankie, Jess. Hier is jy. 'N bietjie aandenking. OK, so natuurlik, super eenvoudige idee. Heeltemal intuïtief dat ons 'n bietjie meer stoorplek - in hierdie vorm, 'n koppie - as ons werklik wil ruil die twee veranderlikes. So laat ons presies dit te doen. Hier in tussen waar ek beweer ek is gaan om te doen 'n paar uitruiling, ek sal gaan voort en verklaar temp. En ek sal stel dit gelyk aan, sê, x. Dan gaan ek die waarde van te verander x net soos Jess het hier met die melk en oranje sap gelyk aan y. En ek gaan y te verander om gelyk te wees om nie x nie, want nou is ons sou wees vas in 'n sirkel, maar eerder Temp. Waar ek tydelik - of waar Jess tydelik die lemoensap voor beuken wat beker met die melk. So laat my voort te gaan nou en maak hierdie. Dit is bekend as noswap.c. En nou, laat ek hardloop nie omruil. En ja, ek sien, as ek die uitbreiding van die venster 'n bietjie, wat x is 1, y is 2. En dan is x 2, y is 1. Maar onthou dat op Maandag het ons dinge gedoen het 'n bietjie anders waardeur ek plaas geïmplementeer 'n helper funksie, as jy wil, dit was eintlik nietig. Ek noem dit ruil. Ek het dit twee parameters, en ek het hulle 'n en Ek het hulle geroep b. Eerlik, kon ek noem dit x en y. Daar is niks stop my te doen nie. Maar ek sou argumenteer dit dan is 'n bietjie dubbelsinnig. Want onthou vir Maandag dat ons beweer dat hierdie parameters was afskrifte van die waardes wat in So dit is net gemors met jou gedagte, dink ek, as jy gebruik presies dieselfde veranderlikes. So ek sal plaas noem hulle 'n en b, net vir duidelikheid. Maar ons kan noem hulle die meeste enigiets wat ons wil hê. En ek gaan om te kopieer en plak effektief die kode van daar bo af in hier. Want ek het net gesien dat dit werk. So dit is in redelik goeie vorm. En ek sal my x verander na 'n, my x 'n, my y te b en my y te b. So met ander woorde, presies dieselfde logika. Presies dieselfde ding wat Jess het. En dan is die een ding wat ek moet doen om hier, natuurlik, is nou roep ons hierdie funksie, of bel hierdie funksie. So ek sal hierdie funksie noem met twee insette, x en y, en getref Slaan. Alle reg, so fundamenteel dieselfde ding. Trouens, ek het waarskynlik die program onnodig kompleks deur skryf van 'n funksie wat net neem sowat ses reëls van die kode terwyl ek voorheen geïmplementeer hierdie in net drie. So laat my voort te gaan nou en remake dit maak geen ruil. Alle reg, ek verfrommeld hier. Dit moet 'n fout wees dat jy dalk sien al hoe meer algemeen as jou programme kry meer kompleks. Maar daar is 'n maklike oplossing. Laat my terug blaai hier. En wat is die eerste fout wat ek sien? Implisiete verklaring. Wat beteken dit tipies aan? O, ek het vergeet om die prototipe. Ek het vergeet om die vertaler te leer dat omruil gaan bestaan, selfs al het hy bestaan ​​nie heel aan die begin van die program. So ek gaan net leemte, ruil om te sê, int, 'n int b, kommapunt. So ek is nie van plan om dit te reimplement. Maar nou is dit ooreenstem met wat is hier. En kennis, is die afwesigheid van 'n kommapunt hier, wat is nie nodig wanneer implementering. So laat my remake hierdie, maak nie ruil. Baie beter vorm. Hardloop nie omruil. En verdoem nie. Nou is ons terug waar ons was op Maandag, waar die ding het nie ruil. En wat is die intuïtiewe verduideliking waarom dit die geval is? Ja? STUDENT: [onhoorbaar]. David Malan: Presies. So A en B is afskrifte van x en y. En in die feit, enige tyd wat jy het al roep 'n funksie so ver dat gaan veranderlikes soos ints - net soos ruil is hier verwag het - julle ouens is verby in kopieë. Nou wat beteken dat dit neem 'n bietjie van die tyd, 'n split sekonde, vir die rekenaar om die stukkies te kopieer van een veranderlike in die stukkies van 'n ander. Maar dit is nie so 'n groot deal. Maar dit is nietemin 'n kopie. En so het nou, in die konteks van ruil, Ek is in die feit suksesvol veranderende a en b. Trouens, kom ons doen 'n vinnige gesonde verstand gaan. Print f a is% i, 'n nuwe lyn. En laat ons plug in 'n. Nou kom ons doen dieselfde ding met b. En laat die dieselfde ding se hier doen. En nou, laat ek kopieer diegene wat dieselfde lyne weer aan die onderkant van die funksie na my drie reëls van die interessante kon voltrek het, en druk A en B weer. So nou laat ons dit maak geen ruil. Laat my toe om die terminale venster 'n bietjie langer, sodat ons kan sien meer van dit in 'n keer. En loop nie omruil. x is 1, y is 2. 'n 1 is, b is 2. En dan, 'n is 2, b is 1. So dit werk, net soos Jess het hier binne-in ruil. Maar natuurlik, is die feit dat dit geen effek op die veranderlikes in die belangrikste. So het ons 'n truuk waardeur ons kon dit regmaak, reg? Wanneer jy gekonfronteer word met hierdie bestekopname kwessie, kan jy net punt en maak x en y watter soort veranderlikes plaas? Jy kan maak hulle globale. Sit hulle op die top van die lêer soos ons gedoen het, selfs in die spel van die 15. Ons gebruik 'n globale veranderlike. Maar in die konteks van die spel 'n 15, dit is redelik 'n globale te hê veranderlike wat die raad, want die geheel van 15.c is al oor die implementering van die spel. Dit is wat die lêer bestaan ​​om dit te doen. Maar in hierdie geval hier, ek is roep 'n funksie ruil. Ek wil twee veranderlikes te ruil. En dit moet begin om te voel net slordig As die oplossing vir al ons probleme wanneer ons loop in omvang kwessies is globaal te maak. Omdat baie vinnig ons program gaan nogal 'n gemors word. En ons het dit baie spaarsamig as 'n gevolg in 15.c. Maar dit blyk daar is 'n beter manier om geheel en al. Laat my terug eintlik gaan en verwyder die druk f's, net hierdie kode te vereenvoudig. En laat my stel voor dat hierdie, inderdaad, is sleg. Maar as ek in plaas voeg in 'n paar sterretjies en die sterre, ek kan plaas draai dit funksie in een wat eintlik in werking is. So laat my gaan terug hier en erken te sê Sterre is altyd moeilik, so ek sal sê sterre. Ek sal net gesny tot op daardie een. Alle regte. En nou, wat verwag ek gaan te plaas nie? So in die eerste plek, ek gaan om te spesifiseer dat in plaas van verby 'n int in die ruil-funksie, ek is in plaas van gaan int ster te sê. Nou, wat sê die sterre aan te dui? Dit is dat die idee van 'n muis wat Binky, die Claymation karakter, was verwys na 'n oomblik gelede. So as ons sê int ster, die betekenis van Dit is nou dat 'n is nie van plan om te wees geslaag het deur sy waarde. Dit gaan nie om gekopieer te word in Inteendeel, die adres van 'n is gaan word geslaag in So onthou dat die binnekant van jou rekenaar is 'n hele klomp van die geheue, anders bekend as RAM. En dit is net 'n geheue hele klomp van die grepe. So as jou Mac of jou rekenaar het twee gigagrepe, het jy 2 miljard grepe van die geheue. Nou laat ons net veronderstel dat net om te hou dinge mooi en ordelike, ons wys 'n adres - 'n nommer - elke byte van die geheue in jou rekenaar. Die heel eerste byte van die 2 miljard is deur die getal nul. Die volgende een is byte nommer een, die aantal twee, al die pad op tot, dot dot dot, tot ongeveer 2 miljard gestyg. So kan jy die aantal grepe van die geheue in jou rekenaar. So laat ons aanvaar dat dit is wat ons bedoel met 'n adres. So toe ek sien int ster a, wat gaan geslaag moet word in ruil nou is die adres van 'n. Nie die waarde daarvan nie, maar alles wat sy pos adres, om so te praat - sy plek in die geheue. En soortgelyk vir b, ek gaan dieselfde ding om te sê. Int, ster, b. As 'n eenkant, tegnies die ster kon gaan op ander plekke. Maar ons sal standaardiseer op die ster om reg langs die data tipe. So ruil handtekening nou beteken, gee my die adres van 'n int, en bel dat 'n adres. En gee my 'n ander adres van 'n int en noem dat die adres b. Maar nou is my kode het hier te verander nie. Want as Ek verklaar int temp - wat nog van tipe int - maar ek stoor in dit 'n, watter soort van waarde? Om duidelik te wees, ek is om 'n 'n met die kode soos dit geskryf is reg nou? Ek stel die plek in 'n. Maar ek gee nie om oor die plek nou nie, reg? Temp bestaan ​​net Jess 'derde koppie bestaan ​​het, vir watter doel? 'N waarde op te slaan. Melk of lemoensap. Nie eintlik die stoor van die adres van een van daardie dinge wat voel 'n bietjie nonsens in hierdie real wêreld konteks in elk geval. So regtig, wat ek wil om te sit in tydelike is nie die adres van 'n, maar die inhoud van 'n. So as 'n is 'n getal soos 123, is dit die 123 byte van geheue wat 'n regverdige gebeur om te wees besetting, wat die waarde in 'n gebeur om te wees besetting. As ek wil om te gaan na daardie adres, Ek het 'n ster te sê. Net so, as ek was om te verander wat is by die adres a, ek verander dit 'n te begin. As ek wil stoor in wat by die plek 'n met wat is op die plek by b, ster b ster. Dus, in kort, selfs al is dit nie heeltemal sink in nie - en ek sou nie verwag dat dat dit sou so vinnig - besef dat al wat ek doen is morfeem hierdie sterre aan my veranderlikes, gesegde gryp nie die waardes. Verander nie die waardes. Maar eerder, gaan na die adresse en kry die waarde. Gaan na daardie adres en verandering die waarde daar. So nou laat my terug blaai na die top, net hierdie lyn om hier te los, om te verander die prototipe te pas. Maar ek moet nou 'n ander ding om te doen. Intuïtief, as ek verander die tipes van die argumente wat ruil verwag, Wat anders moet ek verander in my kode? Toe ek noem ruil. Want nou, wat is Ek slaag om stil te ruil? Die waarde x en die waarde van y, of die melk en die oranje sap. Maar ek wil nie hê om dit te doen. Ek plaas wil om te slaag in wat? Die plek van x en die plek van y. Wat is hul posadresse, om so te praat. So om dit te doen, daar is 'n ampersand. Ampersand soort van klink soos adres. so n, teken, die adres van x, en die adres van y. So is dit doelbewuste wat ons gebruik amper sand wanneer ek die funksie, en die sterre wanneer verklaar en wanneer die uitvoering van die funksie. En dink net aan ampersand as die adres van die operateur, en as die ster gaan daar operateur - of, meer korrek, die dereference operateur. So dit is 'n hele klomp van die woorde net om te sê dat dit nou hopelik ruil gaan korrek te wees. Laat my gaan voort en maak - Kom ons eintlik die naam van die lêer, sodat hierdie program nog genoem word nie omruil. Ek eis dat ons sal noem dit swap.c nou. So maak, ruil. Dot, streep, ruil. En nou ja, x is 1, y is 2. En dan, x is 2, y is een. Wel, laat ons kyk of ons kan dit nie 'n doen bietjie anders as om te wat is hier aan die gang. Eerste, laat my Zoom in op die teken skerm hier. En laat my voorstel vir 'n oomblik - en wanneer ek hier maak sal weerspieël word daar nou - laat my stel voor dat hier is 'n hele klomp van die geheue, of Geheue, binnekant van my rekenaar. En dit sal byt nommer wees, kom ons sê, 1. Dit sal grepe nommer 2 wees. En Ek sal 'n hele klomp meer te doen, en dan 'n klomp van dot dot punte te dui daarop dat daar is 2000000000 van hierdie dinge. 4, 5, en so meer. So is daar die eerste vyf grepe van my rekenaar se geheue. Alle reg? Baie min van 2 miljard gestyg. Maar nou gaan ek te stel die volgende. Ek gaan om te stel dat X gaan slaan die nommer 1 en y gaan die nommer 2 te stoor. En laat my voort te gaan nou en verteenwoordig hierdie waardes soos volg. Kom ons doen dit soos volg. Gee my net 'n sekonde. Een sekonde. OK. Ek wil dit 'n bietjie te maak - Kom ons doen dit weer. Anders gaan ek en die gebruik van die dieselfde nommers, onbewustelik, verskeie kere. So net so ons het verskillende getalle om te praat oor, kom ons noem dit byte nommer 123, 124, 125, 126, en dot dot dot. En laat my nou beweer dat ek gaan het die waarde 1 hier, en die waarde 2 hier, andersins bekend as x en y. Daarom is dit net so gebeur dat Dit is X, dit is y. En net deur 'n paar toeval, die rekenaar, die bedryfstelsel, gebeur x te sit op plek nommer 123. En y beland op plek 124 - damn dit. Ek moet vasgestel het hierdie. Ag man, ek het nie regtig wil om dit te doen? Ja, ek wil dit en op te los b behoorlike hieroor vandag. Jammer, nuut op hierdie. 127, 131, en ek het nie wil wees van hierdie kompleks, maar hoekom het ek die getalle is daar? Want ek wil die ints te eintlik vier grepe. So laat ons super anale hieroor. Sodat as 1 gebeur aangespreek word 123, is die 2 gaan wees by die adres 127, want dit is net 4 byes weg. Dit is al. En ons sal vergeet van al die ander adresse in die wêreld. So x is by die plek 123, y is op plek 127. En nou, wat doen ek eintlik wil doen? Toe ek noem ruil nou, wat is eintlik gaan aan? Wel, as ek roep, ruil, ek is verby in die adres van x en die adres van y. So byvoorbeeld, as hierdie twee stukke papier verteenwoordig nou die twee argumente a en b te ruil, wat ek gaan skryf op die eerste van hierdie, wat ek gaan om te noem verwys na as 'n? Presies, 123. So het ek beweer is 'n. Dit is die parameter a. Ek plaas die adres van x in daar. Wat is dit? Wat is dit? Nee, nee. Dit is OK. Nog goed, nog steeds goed. So dit is 'n. En nou op die tweede stuk papier, dit gaan wees b, en wat is ek gaan skryf op hierdie stuk van papier? 127. Dus is die enigste ding wat sedertdien verander ons vorige vertel van hierdie verhaal is, eerder as letterlik 1 en 2, is ek gaan om te slaag in 123 en 127. En Ek gaan nou dit binne te sit van hierdie vak, alles reg? Sodat black box verteenwoordig nou die ruil-funksie. Intussen, laat ons nou het iemand implementeer om die ruil-funksie. Sal iemand hier graag om vrywillig? Kom up. Wat is jou naam? Charlie. Alle reg, Charlie. Kom up. So Charlie gaan speel die rol van ons swart boks. En Charlie, wat ek wil om te doen nou implementeer ruil in so 'n manier dat, gegewe die twee adresse, jy was eintlik gaan die waardes te verander. En ek sal fluister in jou oor hoe die TV hier om te hardloop. So gaan voort, en jy is die swart boks. Bereik in daar. Watter waardes sien jy vir 'n, en watter waardes sien jy vir b? CHARLIE: 'n 123 is en b is 127. David Malan: OK, presies. Nou breek daar vir net 'n oomblik. Die eerste ding wat jy nou gaan doen, volgens die kode - wat Ek sal nou trek op die skerm - gaan om 'n bietjie te ken bietjie van die geheue genoem temp. So ek gaan om voort te gaan en gee dat die geheue. So dit gaan 'n derde veranderlike wees dat jy toeganklik te jy genoem temp. En wat gaan jy om te skryf op die tydelike stuk papier? CHARLIE: Pointers, reg? David Malan: OK, goed nie noodwendig wysers. So het die reël van die kode wat ek uitgelig op die regterkant, Kom ons begin daar. Dit sê 'n ster. So 'n tans stoor die getal 123. En net intuïtief, wat het sterre 123 beteken? Maar spesifiek, as a 123, 'n ster beteken wat? Die waarde van a. Of meer terloops, daar gaan. So laat ek stel voor dat, wat die 'n in jou hand, voort te gaan en te behandel wat asof dit 'n kaart. En loop jouself oor aan die rekenaar se geheue, en ons vind wat op plek 123. Presies. So sien ons by die plek 123 is wat, natuurlik? OK, so wat waarde nou is jy gaan sit in temp? Presies. So gaan voort en doen. En skryf die nommer 1 op die stuk papier wat is tans temp titel. En nou is die volgende stap wat jy gaan om te implementeer gaan wees wat nie. Wel, op die regterkant van die volgende lyn van kode is ster b. b, van Natuurlik, slaan 'n adres. Wat fokus op 127. Star b beteken wat, terloops praat? Gaan na die plek. So gaan voort en ons vind wat is op plek 127. OK. Natuurlik, op plek 127, is nog steeds die waarde 2. So wat gaan jy nou winkel by alles is op die plek in 'n? So ster 'n manier om te gaan na die plek a. Wat is die plek 'n? Presies. So, as jy wil verander Wat is op die plek - Ek sal voort te gaan en uit te voer die uitveër is hier. En nou sit dit terug op die kwas. Watter getal is jy gaan om te skryf in daardie leë boks nou? Presies. So hierdie lyn van kode, duidelik te wees - laat my breek wat Charlie se doen en wys hier, wat hy gedoen het, is net skryf in daardie boks op plek 123 die waarde wat voorheen by b. En so het ons nou geïmplementeer inderdaad hierdie tweede reël van die kode. Nou Ongelukkig is daar nog een reël bly. Nou wat is in temp, letterlik? Dit is natuurlik die nommer een. Dit is nie 'n adres. Dit is net 'n nommer, soort 'n veranderlike vanaf week een. En nou wanneer jy sê ster b, wat beteken gaan na die adres B, wat van Natuurlik hier. So as jy daar te kom - Ek sal voort te gaan en vee wat eintlik daar is - en wat is jy nou gaan skryf op plek 127? CHARLIE: Temp, wat een. David Malan: Temp, wat een. En wat gebeur met temp in die einde? Wel, ons het nie regtig weet. Ons het nie regtig omgee. Enige tyd het ons geïmplementeer 'n funksie tot dusver, 'n plaaslike veranderlikes wat jy het is inderdaad plaaslik. En hulle het net verdwyn. Hulle is herwin deur die bedryfstelsel stelsel uiteindelik. So die feit dat temp nog steeds die waarde 1 is 'n soort van fundamenteel oninteressant vir ons. Alle reg, so 'n rondte van applous As ons kon nie vir Charlie. Baie goed gedoen. Alle reg, so wat meer doen dit beteken dat ons dit kan doen? So dit blyk dat ons het al vertel van 'n paar wit lê vir 'n geruime tyd. Inteendeel, dit blyk dat 'n string, al hierdie tyd, is nie regtig 'n volgorde van die karakters per se. Dit is 'n soort van daardie intuïtief. Maar tegnies gesproke, is 'n string data tipe wat ons verklaar binnekant van die CS50 biblioteek om die wêreld te vereenvoudig vir die eerste paar weke van die klas. Wat 'n string werklik is, is die adres van 'n karakter iewers in die geheue. 'N string is regtig 'n nommer, soos 123 of 127, wat gebeur te baken waar 'n string begin in jou rekenaar se geheue. Maar dit verteenwoordig nie die string, per se, self. En ons kan sien dit as volg. Laat my gaan voort en oop te maak kode wat is onder Vandag se bron-kode voorbeelde. En ek gaan om voort te gaan en maak up, kom ons sê, vergelyk-0.C. Dit is 'n karretjie program wat gaan geïmplementeer moet word as volg. Eerste. Ek gaan om iets te sê. Toe ek gaan om voort te gaan en kry 'n string van die gebruiker in die volgende reël. Toe ek gaan dit weer sê. Dan gaan ek 'n ander te kry string van die gebruiker. En kennis, ek is wat een van die snare in 'n veranderlike genoem is, en 'n ander van hierdie stringe in 'n veranderlike genaamd t. En nou gaan ek te eis, baie redelik, dat as s gelyk gelyk t, die snare is dieselfde. Jy tik dieselfde ding. Anders, die snare is nie dieselfde ding nie. Na alles, as ons insette twee ints, twee karakters, twee dryf, twee dubbels, enige van die data tipes ons gepraat het dusver om hulle te vergelyk - onthou ons het baie duidelik 'n ruk gelede dat jy dit nie doen nie, omdat 'n enkele gelyk teken is natuurlik die opdrag operateur. So wat sou 'n fout wees. Ons gebruik die gelyk teken is, Dit vergelyk inderdaad dinge vir ware gelykheid. Maar ek beweer dit is karretjie. As ek gaan voort en maak vergelyk nul, en dan vergelyk dot streep nie nul. En ek tik in, kom ons sê, hallo. En dan kom ons sê hallo weer. Letterlik dieselfde ding, die rekenaar eise wat ek getik verskillende dinge. Nou miskien is ek net verkeerd getik iets. Ek sal my naam tik hierdie tyd. Ek bedoel, hallo. Hello. Dit is verskillende elke keer. Wel, hoekom is dit? Wat is werklik aan die gang onder die enjinkap? Wel, eintlik wat aangaan onder die enjinkap is die string dan Ek getik in daardie eerste keer byvoorbeeld is die woord hallo, natuurlik. Maar as ons verteenwoordig dit onder die enjinkap, onthou dat 'n string is in 'n skikking. En ons het net soveel het gesê in die verlede. So as ek trek wat opgestel soos hierdie, is ek gaan iets heeltemal verteenwoordig soortgelyk aan wat ons het 'n oomblik gelede. En daar is eintlik iets spesiale ook hier. Wat het ons bepaal, is op die einde van elke string? Ja, dit agteroorskuisstreep nul, wat net die manier is, letterlik, 00000000. Agt 0 stukkies in 'n ry. Ek weet nie, eerlik, Wat is na hierdie. Dit is net 'n klomp meer geheue binnekant van my rekenaar. Maar dit is 'n skikking. Ons het gepraat oor skikkings voor. En ons gewoonlik praat oor skikkings as plek nul, dan een, dan twee. Maar dit is net vir die gerief. En dit is heeltemal relatief. Wanneer jy eintlik om die geheue van die rekenaar, dit is natuurlik 'n 2000000000 paar vreemde grepe, moontlik. So regtig onder die enjinkap, al hierdie tyd, ja. Dit kan baie goed wees bracket nul. Maar as jy grawe nog dieper onder die enjinkap, dit is regtig spreek nommer 123. Dit is adres 124. Dit is adres 125. En ek het nie skroef hierdie tyd. Dit is nou een grepe afgesien om watter rede? Hoe groot is 'n kar? 'N kar is net een byte. 'N int is tipies vier grepe. So dit is waarom ek het dit 123, 127, 131 en so meer. Nou kan ek hou die wiskunde makliker en doen net plus 1. En dit is nou wat regtig aangaan op onder die kap. So wanneer jy verklaar iets soos hierdie, string s, dit is eintlik - dit blyk - kar ster. Ster, natuurlik, beteken adres, aka wyser. So dit is die adres van iets. Wat is dit die adres van? Wel - Ek is die enigste een wat kan sien die heel belangrike punt wat ek maak, of dink Ek maak. So string - Die hartseer ding is ek het 'n monitor net daar waar ek kon gesien het nie. Alle reg, so string s is wat Ek verklaar voorheen. Maar dit blyk, te danke aan 'n bietjie magic in die CS50 biblioteek, al hierdie tyd string het letterlik gewees kar ster. Die ster beteken weer wyser of adres. Die feit dat dit die is aan weerskante woord char beteken dit is die adres van 'n karakter. So as jy string genoem word, en ek tik in H-E-L-L-O, nou stel wat kry string letterlik terugkeer al hierdie tyd, selfs al het ons eerder oorvereenvoudig die wêreld? Wat beteken string eintlik kry terug te keer as sy terugkeer waarde? 123 in hierdie geval, byvoorbeeld. Ons het voorheen gesê dat kry string eenvoudig 'n string, 'n ry karakters. Maar dit is 'n bietjie van 'n wit leuen. Die manier kry snaar regtig werk onder die enjinkap is dit kry 'n string van die gebruiker. Dit plops die karakters wat hy of sy vorme in die geheue. Dit plaas 'n agteroorskuisstreep nul aan die einde van die volgorde van die karakters. Maar wat beteken kry string letterlik terugkeer? Is dit terug letterlik die adres van die heel eerste grepe in die geheue wat dit gebruik word vir die krag. En dit blyk dat net deur die terugkeer 'n enkele adres van die eerste karakter in die string, wat voldoende vir die vind van die geheel van die string. Met ander woorde, kry string nie ' 123 en 124 en 125 om terug te keer. Dit hoef nie te gee vir my 'n lang lys van al die grepe wat my string word gebruik. Want 'n mens, hulle is almal terug na terug. En twee, wat gebaseer is op die eerste adres, ek kan uitvind waar die string eindig. Hoe? Die spesiale null karakter, die agteroorskuisstreep nul aan die einde. So met ander woorde, indien jy slaag om - binnekant van veranderlikes - die adres van 'n kar, en jy neem wat aan die einde van 'n string, enige volgorde van karakters soos ons mense dink van snare, as jy aanneem dat aan die einde van enige sodanige string daar 'n agteroorskuisstreep nul, jy is goue. Want jy kan altyd die einde van 'n string. Nou wat werklik dan gaan in hierdie program? Hoekom is hierdie program, vergelyk-0.C, karretjie? Wat is eintlik vergelyk word? Ja? STUDENT: [onhoorbaar]. David Malan: Presies. Dit is die vergelyking van die plekke van die snare. Dus, as die gebruiker getik het in hallo keer, soos ek gedoen het, kan die geheue beland soek soos hierdie. As die gebruiker dan tipes in hallo weer maar deur die roeping kry string weer, c is nie baie slim nie, tensy jy leer om dit te slim te wees deur te skryf kode. C - en rekenaars meer algemeen - As jy tik in die woord hallo weer jy weet wat jy gaan kry. Jy net gaan 'n tweede skikking te kry van die geheue, ja, dit gebeur te wees stoor H-E-L-L-O en so meer. Dit gaan om dieselfde te kyk na ons mense, maar hierdie adres dalk nie 123. Dit mag dalk net so gebeur dat die bedryfstelsel het 'n paar beskikbaar ruimte byvoorbeeld op plek - Kom ons sê iets arbitrêre, soos hierdie is plek 200. En dit is die plek 201. En dit is die plek 202. Ons het geen idee waar dit is gaan wees in die geheue. Maar wat dit beteken, is dat dit wat gaan uiteindelik gestoor in s? Die getal 123. Wat gaan word gestoor in t, in hierdie arbitrêre voorbeeld? Die getal 200. En alles wat beteken dan natuurlik, 123 is nie gelyk aan 200. En so gaan dit as voorwaarde nooit evalueer tot ware. Want get string is die gebruik van verskillende stukke van die geheue elke keer. Nou kan ons sien dit weer in nog 'n voorbeeld. Laat my gaan voort en oop te maak kopie-0.C. Ek beweer dat hierdie voorbeeld gaan probeer - maar versuim - twee snare te kopieer soos volg. Ek gaan om iets te sê aan die gebruiker. Ek is dan gaan 'n te kry string en noem dit 's. En nou, ek doen hierdie tjek hier. Ons het dit al 'n rukkie terug. Maar toe kan kry string terugkeer null, 'n spesiale karakter, of spesiale simbool Kom ons sê. As dit uit die geheue. Byvoorbeeld, as die gebruiker is regtig om moeilike en tipes 'n gruwelike aantal karakters op die klawerbord en treffers Tik. As dat die getal van die karakters kan net nie pas in die geheue vir alles wat mal rede, goed kry string mag baie goed terug null. Of as jou program self is besig met 'n baie van ander dinge, en daar is net nie genoeg geheue vir get string om suksesvol te wees, kan dit die einde up terugkeer null. Maar laat ons meer akkurate as wat dit is. Wat is s se data tipe regtig? Kar ster. So dit blyk nou kan ons skil terug laag null. Turns out, nietig is - ja, natuurlik 'n spesiale simbool. Maar wat is dit regtig? Regtig, nul is net 'n simbool dat ons mense gebruik zero so goed verteenwoordig. So het die skrywers van C en rekenaars meer in die algemeen, het besluit jaar gelede dat jy weet wat. Hoekom kan ons nie verseker dat geen gebruiker data is ooit, ooit, ooit gestoor bye nul? Trouens, selfs in my arbitrêre voorbeeld voor, ek het nie begin die nommers grepe op nul. Ek het begin by een. Want ek het geweet dat die mense in die wêreld het besluit om die nul te behou byte in iemand se geheue as iets besonders. Die rede hiervoor is, wanneer jy wil aandui dat iets verkeerd geloop het met betrekking tot die adresse, jy teruggekeer nul - andersins bekend as nul - en omdat jy weet dat daar is geen wettig data by adres nul, duidelik wat beteken dat 'n fout. En dit is die rede waarom ons, deur konvensie, kyk for null en terugkeer iets soos een van die gevalle. So as ons rol af nou, dit is net dan 'n paar foutopsporing, net in geval iets wat verkeerd geloop het met [? borgtog?] geheel en al en sluit die program deur terug te keer vroeg. Hierdie lyn kan nou herskryf word as hierdie, wat beteken wat? Op die linkerkant, gee my 'n ander wyser na 'n karakter, en noem dit t. Wat kan ek stoor binnekant van t, gebaseer op hierdie een lyn van kode? Ek is 'n stoor plek. Spesifiek die plek dit was in s. Dus, as die gebruiker getik het in hallo, en wat die eerste keer gebeur hallo aan die einde hier, dan is die getal 123 is gaan om terug te kom uit kry tou en gestoor word - soos ons vroeër gesê het - in s. Toe ek verklaar nou 'n ander verwysing na 'n kar en noem dit t, watter getal is letterlik gaan aan die einde in t volgens die storie? So 123. So tegnies nou beide s en t is wat dui op die presiese dieselfde stukke van die geheue. So sien wat ek nou gaan doen om te bewys dat hierdie program is karretjie. Eerste gaan ek te eis, met 'n afdruk f, kapitaliseer 'n afskrif van die string. Dan gaan ek 'n bietjie te doen foutopsporingstegniek. Ek gaan om seker te maak. Kom ons maak seker dat die string t is by minste groter as nul in lengte, So daar is 'n paar karakter daar om werklik te kapitaliseer. En dan kan jy dalk onthou hierdie van die vorige voorbeelde. 2 bo - wat in die ctype.h lêer. T bracket zero gee my die nul karakter van die string t. En 2 boonste van dieselfde waarde, van Natuurlik, vat dit na 'n hoofletter. So intuïtief, hierdie uitgelig lyn van die kode is kapitaliseer die eerste brief in t. Maar dit is nie kapitaliseer, intuïtief, die eerste letter in s. Maar as jy vooruit te dink, wat ek om te sien wanneer ek hierdie program en die druk van beide die oorspronklike, s, en die sogenaamde kopie, t? Hulle is eintlik gaan om dieselfde te wees. En hoekom is hulle gaan dieselfde wees? Hulle is albei verwys na presies dieselfde ding. So laat ons dit doen. Maak afskrif nul. Dit stel OK. Laat my toe hardloop kopie nul. Laat my tik iets soos hallo in al klein dan druk Enter. En dit beweer dat beide die oorspronklike s en die kopie is inderdaad identies. So wat regtig gebeur hier? Laat my teken hierdie foto net die storie in 'n te vertel effens ander manier. Wat is werklik aan die gang onder die kap toe ek verklaar iets soos kar begin is, of string s, Ek kry 'n wyser - wat gebeur om te wees vier grepe in die CS50 toestel en in 'n baie van rekenaars. En ek gaan hierdie s te bel. En dit het op die oomblik 'n onbekende waarde. Wanneer jy 'n veranderlike verklaar, tensy jy jouself sit 'n waarde daar, wat weet wat daar is. Dit kan 'n ewekansige volgorde van wees stukkies van die vorige uitvoering. So toe ek, in my lyn van die kode te doen kry string, en dan slaan die terugkeer waarde in s kry string een of ander manier - en sal ons uiteindelik terug skil hoe kry string werke, ken een of ander manier 'n skikking wat waarskynlik lyk 'n bietjie soos hierdie. H-E-L-L-O, agteroorskuisstreep nul. Kom ons veronderstel dat dit adres 123 net eerste konsekwentheid. So kry string opbrengste, in die uitgelig lyn daar, dit gee die die getal wat ons sê, 123. So, wat gaan regtig binnekant van s hier? Wel, wat gaan regtig binnekant van s is 123. Maar eerlik, ek kry 'n bietjie verwar deur al die adresse, al hierdie arbitrêre getalle. 123, 124, 127. So laat ons eintlik vereenvoudig die wêreld 'n bietjie. Wanneer ons praat oor die wysers, eerlik, te ons mense, wat die heck omgee waar dinge in die geheue? Dit is heeltemal arbitrêr. Dit gaan afhang van hoe veel ram die gebruiker. Dit gaan afhang van wanneer die dag jy die program, miskien, en wat die invoer van die gebruiker gee. Ons is woning op onbelangrike besonderhede. So laat se abstrakte weg en sê dat, wanneer jy 'n lyn van die kode soos hierdie, kar ster s kry die terugkeer waarde van get string. Hoekom doen ons nie in plaas daarvan net trek wat ons hou die roeping om 'n wyser as al is dit wys na iets? So ek eis nou dat s up daar is 'n wyser - onder die enjinkap is dit 'n adres. Maar dit is nie net verwys na die eerste byte in die string wat al teruggekeer. As ek nou terug te keer na die kode hier, wat gaan aan in hierdie lyn? Wel, in hierdie uitgelig lyn nou, Ek glo 'n ander verklaar veranderlike genoem t. Maar dit is ook 'n wyser, so ek gaan om dit te trek as, in teorie, die presiese dieselfde grootte boks. En ek gaan om dit te noem t. En nou as ons gaan terug na die kode weer wanneer ek slaan s binnekant van t, wat moet ek tegnies om die binnekant van die t? Wel, tegnies, hierdie was die getal 123. So regtig ek moet skryf die getal 123 is daar. Maar laat ons neem dit hoër vlak. t, al is dit net 'n wyser, intuïtief, is net dat. Dit is al wat kort gestoor in daar. So nou in die laaste interessante lyne van die kode, toe ek eintlik gaan oor kapitaliseer die nul karakter in t, is wat gaan aan? Wel, t bracket zero is nou te wys wat karakter, vermoedelik? Dit is wys om te h. Omdat t bracket nul - onthou, dit is die ou sintaksis. t bracket nul beteken net as t is 'n string, t bracket nul beteken om die nul karakter in die krag. So wat dit regtig beteken word na hierdie verskeidenheid - En ja, kan dit wees 123, hierdie dalk wees 124. Maar dit is alles relatief, onthou. Wanneer praat oor 'n skikking, ons het die voordeel van praat relatiewe indekse. En so nou kan ons net aanvaar dat t bracket nul is h. So as ek roep 2 bo op dit, wat dit is regtig doen, is kapitaliseer die klein h in groot letters H. Maar natuurlik, wat s? Dit is wys om dieselfde darn string. So, dit is al wat daar gebeur in hierdie kode so ver. So, wat is dan die implikasie? Hoe los ons hierdie twee probleme? Hoe vergelyk ons ​​met die werklike snare? Wel intuïtief, hoe sou jy gaan oor die vergelyking van twee snare vir ware gelykheid? Wat beteken dit as twee snare is gelyk? Duidelik nie dat hul adresse gelyk in die geheue, want dit is 'n lae vlak implementering detail. Al die karakters is dieselfde. So laat my stel, en laat my voer in die weergawe een van compare.c hier, so vergelyk-1.c. Laat my voor dat ons nog steeds 'n wyser genoem is, en die winkel in dit die terugkeer waarde van get string. Kom ons doen dieselfde ding met t. So geeneen van die kode is anders. Ek gaan 'n bietjie te voeg meer fout kontrole nou. So nou dat ons is soort van die skil terug hierdie lae in CS50 van wat 'n string eintlik is, ons moet meer anale oor die maak seker dat ons nie misbruik ongeldig waardes soos null. So ek gaan net om seker te maak. As s is nie gelyk aan nul en t nie gelyk nul, wat beteken ons is OK. Raak string nie skroef om een van daardie snare. En jy kan dalk nou dink, wat nie STR CMP vermoedelik te doen? String vergelyk. So as jy het program in Java voor, dit is soos die gelyk metode in die string klas. Maar vir dié van julle wat nog nie geprogrammeer voor, dit is net 'n C-funksie. Dit gebeur te kom in 'n lêer genaamd string.h. Dit is waar dit verklaar. En string vergelyk - Ek het eintlik vergeet die gebruik daarvan, maar never mind dat. Onthou dat ons dit kan doen man, roer vergelyk. En dit gaan om die ' Linux-programmeerders handleiding. En dit is, eerlik, 'n bietjie kripties. Maar ek kan hier sien dat, yep. Ek het string.h te sluit. En dit sê hier onder beskrywing, "het die string vergelyk funksie vergelyk Die twee stringe S1 en S2. "En S1 en S2 is glo die twee argumente geslaag in Ek het nie regtig onthou wat konst is, maar nou sien - en jy mag gesien het hierdie reeds toe jy gebruik om die man bladsye as jy het dit alles - dat kar ster is net sinoniem met 'n tou. So dit vergelyk die twee stringe, S1 en S2, en dit gee 'n heelgetal minder as of gelyk aan of groter as nul As S1 gevind is, onderskeidelik, te wees minder as of ooreenstem, of groter wees as S2. Dit is net 'n baie komplekse manier om te sê dat die snaar vergelyk opbrengste nul as twee stringe is intuïtief identies, karakter vir karakter vir karakter. Dit gee 'n negatiewe getal as s, alfabeties, is veronderstel om te kom voor t. Of stuur 'n positiewe getal as s veronderstel is om te kom na die t alfabeties. So met hierdie eenvoudige funksie, kon jy, byvoorbeeld, 'n sorteer hele klomp van die woorde? So in hierdie nuwe weergawe, ek gaan om voort te gaan en maak compare1. Dot streep vergelyk een. Ek sal tik in hallo in al laer geval. Ek gaan om te tik in Hello in al die klein weer. En gelukkig is dit nou besef Ek getik dieselfde ding. Intussen, as ek tik in hallo in laer geval en HELLO in hoofletters en vergelyk, ek getik verskillende dinge. Want nie net is die adresse anders, maar ons is te vergelyk verskillende karakters weer en weer. Wel, laat ons gaan en op te los een ander probleem nou. Laat my oopmaak weergawe een van afskrif, wat nou spreek hierdie kwessie soos volg. En hierdie een gaan om te kyk 'n bietjie meer ingewikkeld. Maar as jy dink oor die probleem wat ons nodig het op te los, hopelik sal dit duidelik in net 'n oomblik. So die eerste reël, teken begin t, in leketaal kan iemand voorstel wat hierdie lyn hier beteken? Kar ster t, wat gaan dit doen? Goed. Skep 'n verwysing na 'n paar plek in die geheue. En laat my verfyn dit 'n bietjie. Verklaar 'n veranderlike wat die stoor van die adres van 'n paar kar in die geheue, net om 'n bietjie meer behoorlike. OK, so nou op die regterkant, het ek nog nooit gesien dat een van hierdie funksies voor, malloc. Maar wat sou dit beteken? Toekenning van die geheue. Geheue toekenning. So dit blyk uit, tot nou toe, ons het nie regtig 'n kragtige manier vra die bedryfstelsel, gee my 'n paar geheue. Inteendeel, ons het nou 'n funksie genoem malloc wat doen presies dit. Selfs al is dit 'n bietjie van 'n afleiding op die oomblik, sien dat in tussen die twee hakies is net gaan om 'n getal wees. Waar ek getik in vraag punte kan 'n getal wees. En dat die getal beteken, gee my 10 grepe. Gee my 20 grepe. Gee my 100 grepe. En malloc sal sy bes doen om vra die bedryfstelsel - Linux, in hierdie geval - hey, is hul 100 grepe RAM beskikbaar? As dit so is, terug te keer dié grepe aan my deur die terugkeer van die adres van die wat van diegene grepe, miskien? Die heel eerste een. So ook hier - en dit is oorheersend in C, enige tyd wat jy hantering van adresse? Jy is byna altyd die hantering van die eerste sodanige adres, maak nie saak hoe groot 'n stuk van die geheue wat jy word terug oorhandig, om so te praat. So laat ons duik in hier. Ek probeer om te wys hoe baie grepe, presies? Goed. String lengte van s - laat se doen 'n konkrete voorbeeld. Indien s hallo, H-E-L-L-O, wat is die string lengte van s, natuurlik? So dit is vyf. Maar ek is besig met 'n plus 1 op daardie, hoekom? Hoekom wil ek ses grepe in plaas van vyf? Die nul karakter. Ek wil nie te laat uit hierdie spesiale null karakter. Want as ek 'n kopie van Hello and doen net H-E-L-L-O, maar ek het nie daardie spesiale karakter, die rekenaar miskien nie, deur die kans, 'n agteroorskuisstreep nul daar vir my. En so, as ek probeer om uit te vind die lengte van die kopie, sou ek gedink het dat Dit is 20 karakters lank wees, of 'n miljoen karakters lank as ek nooit net gebeur 'n agteroorskuisstreep nul te tref. Dus moet ons ses grepe te stoor H-E-L-L-O, agteroorskuisstreep nul. En dan is dit net te wees super anale. Veronderstel dat ek vergeet wat die grootte van 'n kar is. Ons hou aan sê dit is een byte. En dit is gewoonlik. In teorie, kan dit iets wees anders, op 'n ander Mac of 'n verskillende PC. So dit blyk daar is dié operateur genoem sizeof dat as jy verby dit die naam van 'n data tipe - soos kar, of int, of float - dit sal jou vertel, dinamiese, hoeveel grepe n kar neem op hierdie spesifieke rekenaar. So dit is net effektief soos om te sê tye 1 of keer niks. Maar ek doen dit net om te super anale wees, wat net in die geval 'n kar verskil op jou rekenaar teenoor my, op hierdie manier die wiskunde is altyd iets om te sien. Ten slotte, hier Ek is so for null, Dit is altyd 'n goeie praktyk - weer, enige tyd wat ons te doen het met wysers. As malloc was nie in staat om te gee my ses byes - wat onwaarskynlik, maar net in geval - terug een onmiddellik. En nou, voort te gaan en 'n afskrif die string soos volg. En dit is bekend sintaksis, al is dit in 'n ander rol. Ek gaan om voort te gaan en die string kry lengte van s en stoor dit in n. Ek is dan gaan Itereer van i gelyk nul tot en met n, groter as of gelyk aan. Sodat op elke iterasie, het ek die et karakter van s in die i karakter van t. So, wat is werklik aan die gang onder die enjinkap hier? Wel, as dit, byvoorbeeld, is 's - en ek het getik in die woord H-E-L-L-O en daar is 'n agteroorskuisstreep nul. En weereens, dit is s wys hier. En hier is nou t. En dit is nou verwys na 'n afskrif van die geheue, reg? Malloc het my 'n hele stuk van die geheue. Ek weet nie eers wat is in enige van hierdie plekke. So ek gaan om te dink van hierdie as 'n hele klomp van die vraagtekens. Maar so gou as ek begin herhaling van nul op om deur middel van die lengte van s, t bracket nul en t bracket 1 - en ek sal dit nou op die oorhoofse - t bracket nul en s bracket nul beteken wat ek gaan word kopiëring iteratief h in hier, E-L-L-O. Plus, want ek het die plus 1, agteroorskuisstreep nul. So nou in die geval van die vergelyk-1.c, in die einde, as ek die druk van die kapitalisasie van t, moet ons sien dat s is onveranderd. Laat my voort te gaan nou en doen dit. So maak copy1. Dot streep copy1. Ek gaan om te tik in hallo, Tik. En nou sien nie, net die kopie is gekapitaliseer. Omdat ek werklik het twee stukke van die geheue. Ongelukkig kan jy doen 'n paar mooi sleg en mooi gevaarlike dinge hier. Laat my toe om 'n voorbeeld hier en nou, Dit gee vir ons 'n voorbeeld van 'n paar verskillende lyne. Dus net intuïtief hier, die eerste reël van die kode, is int ster x, verklaar 'n veranderlike genaamd x. En wat is die data tipe van daardie veranderlike? Wat is die data tipe wat veranderlike? Dit was nie die fotonische lewe. Die data tipe is int ster. So wat beteken dit? x sal slaan die adres van 'n int. Eenvoudig soos dit. Y gaan die te stoor adres van 'n int. Wat is die derde lyn van die kode daar? Dit is die toekenning van hoeveel grepe, waarskynlik? Vier. As gevolg van die grootte van 'n int is algemeen vier, malloc van vier gee my teruggebring na die adres van 'n stuk van geheue, die eerste van wie grepe is gestoor word nou in x. Nou kan ons beweeg 'n bietjie vinniger. Star x beteken wat? Dit beteken dat na daardie adres en sit watter getal is daar? Plaas die nommer 42 is daar. Star y beteken na wat is op y en het die getal 13 is daar. Maar wag 'n minuut. Wat is in y op die oomblik? Wat adres is y stoor? Ons weet nie, reg? Ons het nog nie een keer gebruik om die opdrag operateur wat y. So y soos verklaar op die tweede lyn van kode is net 'n paar vullis waarde, 'n groot vraagteken so te praat. Dit kan lukraak wys om iets in die geheue, wat is oor die algemeen sleg. So gou as wat ons getref dat die lyn is daar, ster y is gelyk aan 13, iets wat sleg is, iets wat baie sleg is ongeveer om te gebeur met Binky. So laat ons sien wat gaan aan die einde gebeur hier Binky in hierdie minuut of so lyk. [Video speel] Hey, Binky. Wakker. Dit is tyd vir pret wyser. -Wat is dit? Meer inligting oor die riglyne? O, goodie. -Wel, om te begin, ek dink ons ​​is gaan 'n paar wenke te nodig het. -OK. Hierdie kode ken twee wysers wat kan verwys na heelgetalle. -OK, goed, ek sien die twee wysers. Maar dit lyk asof hulle nie te wees nie wys na iets. -Dit is reg. Aanvanklik, wysers doen nie wys na iets. Die dinge wat hulle wys te word geroep pointees, en die opstel van hulle op 'n aparte stap. -O, regs, regs. Ek het geweet dat. Die pointees is geskei. So, hoe ken jy 'n pointee? -OK. Wel, hierdie kode ken 'n nuwe heelgetalle pointee, en hierdie deel sit x om aan te dui nie. Hey, wat lyk beter. So maak dit iets te doen. -OK. Ek sal die wyser x dereference te stoor die getal 42 in sy pointee. Vir hierdie truuk, sal ek moet my magie muur van ontwysing. -Jou towerstaffie van ontwysing? Uh, dit is groot. -Dit is wat die kode lyk. Ek sal net die opstel van die aantal, en - Hey, kyk. Daar gaan dit. So doen 'n dereference op x volg die pyl sy pointee om toegang te verkry. In hierdie geval, na 42 stoor 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 om y en Kry die nommer 13 opgestel. En dan neem die muur van ontwysing en net - whoa! -O, hey. Dit het nie gewerk nie. Sê, Binky, dink ek nie die ontwysing y is 'n goeie idee, omdat die opstel van die pointee is 'n aparte stap. En ek dink nie ons sal ooit het dit gedoen. -Hmm. Goeie punt. -Ja, ons het toegeken die wyser y. Maar ons het nooit dit te verwys na 'n pointee. -Hmm. Baie oplettend. Hey, jy soek goed daar, Binky. Kan jy los dit so dat y punte aan dieselfde pointee as x? -Seker nie. Ek sal gebruik om my towerstaffie van wyser opdrag. -Is dit gaan 'n probleem soos voor? -No. Dit beteken nie raak die pointees. Dit verander net een wyser te wys na dieselfde ding as 'n ander. -O, ek sien. Nou y punte na dieselfde plek as x. So wag. Nou y is vasgestel. Dit het 'n pointee. Sodat jy kan probeer om die muur van ontwysing weer die 13 te stuur oor. -OK. Hier gaan ons. Hey, kyk na dit. Nou ontwysing werke op y. En omdat die wysers deel dat 'n mens pointee, het hulle albei sien die 13. -Ja. Deel. Wat ook al. So gaan ons skakelaar plekke nou? -O, kyk. Ons is uit die tyd. -Maar - -Net onthou om die drie wyser reëls. Nommer een, die basiese struktuur is dat jy 'n muis. En dit wys oor 'n pointee. Maar die muis en pointee is geskei. En die algemene fout is om te die opstel van 'n wyser nie, maar om vergeet om te kry 'n pointee. Nommer twee, wyser ontwysing begin op die muis en volg sy pyl oor sy pointee om toegang te verkry. Soos ons almal weet, dit werk net as daar is 'n pointee, wat kry terug na Reël nommer een. Nommer drie, wyser opdrag in beslag neem 'n wyser en veranderinge om dit te wys op dieselfde pointee as 'n wyser. So na die opdrag, die twee wysers sal wys na dieselfde pointee. Soms is die naam wat deel. En dit is al wat daar is om dit, regtig. Bye bye nou. [Einde video-vertoning] David Malan: So meer op wysers, Meer oor Binky volgende week. Ons sal sien dat jy op Maandag.