[Duke luajtur muzikë] DAVID J. Malan: E gjithë kjo është e drejtë CS50 dhe ky është fillimi i javës pesë. Pra sot, nën jastekë tuaj vend, ju nuk do të gjeni asgjë. Por më lart, ju duhet të gjeni këto, një shenjë e vogël e vlerësimit tonë për të gjithë punën që keni vënë në lojë prej pesëmbëdhjetë. Thjesht hiqni rrethin e vogël në Përfundimtar të fillojë të luajë për Pjesa e mbetur e klasës. Pra kujtoj se, ose e di atë problem të caktuar katër, e cila doli këtë fundjavë, përfshin shkrim një tjetër lojë. Por këtë herë ajo përfshin përdorimin e një aktuale grafik user interface, jo një ndërfaqe tekstuale si Loja e pesëmbëdhjetë ishte. Dhe loja që shtrihet përpara jush, në qoftë se ju nuk e keni parë ende kjo e ardhshëm, duket një diçka të vogël si kjo. Unë jam duke shkuar për të shkuar në terminalin e mia dritare këtu në GDB. Dhe unë jam duke shkuar për të shkuar përpara dhe të drejtuar zgjidhja e personelit, të cilat ju mund të hyni pas drejtimin përditësim 50 si zakonisht. Por unë jam duke shkuar për të vënë atë në një pak Mënyra e fshehtë, pak vezë të Pashkëve, ashtu-quajtur mënyra Perëndia, nga vënë Perëndinë në argv1. Dhe unë duhet të ndiqni udhëzimet e mi, atë në drejtimin e mi Problemi vendosur directory. Pra, tani që ju të shihni një version të plotë i lojës së Breakout. Në fakt, kjo nuk është duart-mode. Pra, kjo është në fakt - kënaqën edhe pse ju mund të jetë - goxha i parëndësishëm për të zbatuar mënyrën Perëndisë në Breakout, ndryshe nga pesëmbëdhjetë lojë, që disa prej jush mund të ketë prekur për edicionin e hacker. Në Breakout mjafton në Perëndinë Mënyra për të thjesht të bëjë çfarë, intuitivisht me pallë? Vetëm të bëjë atë të barabartë për çfarëdo pozita horizontale është e topit. Dhe për aq kohë sa ju të bëni këtë në analizohen përkrah me topin duke lëvizur Kjo lojë do të kurrë, kurrë, kurrë humbasë topin dhe ju do të fitojë çdo kohë. Por në edicionin e kësaj jave hacker ka më shumë se vetëm regjimin Perëndisë. Ka një numër të karakteristikave të tjera. Midis tyre, lasers. Kështu që nëse ju me të vërtetë të merrni të padurueshëm ju mund të fillojnë të shtënat poshtë tulla dhe disa të tjerë. Dhe për ata prej jush që do të doja të kalibruar standardin kundrejt Hacker edition, unë mund të shoh se kjo javës së Edicioni hacker qëllimisht është një pak më shumë që mund të bëhet, thonë se, përveç Perëndisë Regjimi ishte me lojë pesëmbëdhjetë. Pra, nëse ju jeni duke kërkuar për një shtrirje dhe ju jeni duke kërkuar për disa argëtim shtesë Karakteristika të bëni pikiatë në qoftë se të interesit. Tani më shumë praktikisht, më lejoni të theksoj nga një gjë si. GDB, të cilën disa prej jush nuk mund të ketë ende prekur personalisht, e cila është e mirë. Por tani është me të vërtetë koha për të marrë të përdoret për këtë dhe të rehatshme me këtë mjet sepse kjo do të bëjë jetën tuaj shumë më e lehtë, në të vërtetë. Per leksion Rob mbi GDB një çift javë më parë, e kujtojnë se GDB eshte nje debugger. Është një mjet që ju lejon të kandidojë tuaj Programi por të drejtuar atë hap pas hapi, linjë nga linjë, kështu që ju mund të thes rreth, në mënyrë që ju të shihni gjëra të ndodh, kështu që që ju mund të shtypura jashtë vlerat e variablave. Me pak fjalë, kjo ju jep shumë më shumë Fuqia se printDef bën. Tani pa dyshim, ndërfaqe është goxha misterioze. Ndërfaqja e zezë dhe e bardhë tekstual për pjesën më të madhe. Komandat janë disi të vështira për të kujtuar në fillim. Por edhe pse kjo mund të ju merr gjysmën e një orë, një orë, për të vënë atë upfront investimi i kohës në atë, besoni mua. Sigurisht që deri në fund të semestër ajo do të shpëtojë ju një urdhër të magnitudë më shumë Ora se kaq. Pra, në fillim të javës pikiatë in Dhe në aspektin e Breakout, e di se ju mund ta bëjë këtë për aq kohë sa ju keni Kodi shpërndarja ose kodin tuaj në progres në directory tuaj Pst4. E di se ju mund të kandidojë gdb. / Breakout. Kjo do të hapë deri një dritare si kjo. Më lejoni t'ju jap vetes më shumë e nje dritare terminali. Dhe pastaj çfarë unë jam duke shkuar për të shkuar përpara dhe të bëjë, ajo nuk është vetëm drejtuar atë. Unë jam duke shkuar për të parë të vendosur një pikë pushim Recall, e cila ju lejon të pauzë Ekzekutimi në një vend të veçantë. Vetëm për të mbajtur gjërat e thjeshta që unë jam duke shkuar për të thyer në një vijë vetëm nga shtypja numër një. Më lejoni të vërtetë të ri-hapur këtë dritare për shkak se ajo është duke marrë një pak e vogël atje. Pra, ajo që unë jam tani do të bëjmë këtu është në qoftë se unë të hapur dritaren time terminali. Come on, ne do të shkojmë atje. Deri tani, nëse unë kthehem në Dropbox, Pst4 dhe të drejtuar gdb. / Breakout hyjë, njoftim Unë jam duke shkuar për të thyer një për të vendosur një pikë pushim në një linjë. Dhe tani unë jam duke shkuar për të shkuar përpara dhe lloji kandidojë. Dhe kur unë bëj, asgjë njoftim duket të ndodhë. Nuk ka pop up. Nuk ka asnjë grafike Ndërfaqja e përdoruesit ende. Por kjo është e kuptueshme sepse unë jam fjalë për fjalë në një linjë në programin tim. Dhe vëreni se unë kam përcjellë të shpejtë, posaçërisht tani për 62, sepse të gjithë sende në krye të këtij file është gjëra të tilla si komente dhe konstantet dhe jointeresant gjëra për tani. Deri tani unë jam në brendësi të kryesore, me sa duket, në linjë 62. Dhe kjo është vetëm shpërndarja , kodi kujtojnë. Nëse kam hapur këtë ide duke shkuar, në mënyrë të ngjashme, në directory kutinë time të bjerë në Pst4, në breakout.c. Dhe në qoftë se unë lëvizni poshtë dhe poshtë dhe poshtë, dhe më lejoni të shkoj përpara dhe të kthehet në numrat e mi të linjës. Ajo që unë do të shohim, nëse unë lëvizni poshtë për të Linja 62, është pikërisht vija që ne kemi ndaluar në. Pra, kjo vijë këtu, 62 vjeç, është ku ne jemi gati të jetë. Deri tani në gdb, në qoftë se unë të shkojnë përpara dhe të shtypni tani e ardhshëm, ajo do të hyjë në ekzekutojë atë linjë. Dhe voila, ne kemi ashtuquajtura dritare g. Nëse panjohur me atë që një GWindow është jo te shqetësoni. Spekulim do ju prezantoj me të, si edhe një numër të videos Walkthrough ngulitur në spekulim. Por tani le të bëjnë këtë një pak më shumë interesante. Më lejoni të lëvizë mbi këtë dritare në anën pak. Më lejoni të bëjë një dritare pak madhe kështu që unë mund të shoh më shumë. Dhe tani më lejoni të shkoj përpara dhe të bëjë ardhshëm përsëri. Dhe nuk janë tulla e mi. Nëse unë lloji ardhshëm përsëri tani unë shoh topin. Dhe në qoftë se unë lloji ardhshëm përsëri tani unë shoh vozis. Dhe për fat të mirë kjo nuk është gedit bashkëpunuar me të vërtetë duke treguar mua çdo gjë që unë dua. Por tani, në qoftë se unë bëj ardhshëm përsëri, ardhshëm përsëri, unë jam vetëm deklaruar disa variablave. Dhe unë mund të shtypura çdo njëri nga këta njerëz jashtë. Tulla Print, printime jeton. Dhe tani, nëse unë të vazhdojmë të bëjmë ardhshëm, vëreni se unë do të jetë brenda asaj lak. Por kodi është duke shkuar për të ekzekutuar saktësisht si unë presin. Pra, kur kam goditur këtë funksion, Prisni Kliko për të, ajo do të bëjë ajo që fjalë për fjalë. Kështu që unë duket se kanë humbur kontrollin mbi programin. GDB nuk është dhënë mua një tjetër të shpejtë. Por jo për t'u shqetësuar. Shko tek lojës sime, klikoni diku. Dhe voila, tani ajo vazhdon të linjës 86. Pra, përsëri, kjo është e paçmueshme, në fund të fundit, për problemet debugging. Sepse ju mund të vërtetë të hap nëpër Kodi juaj, gjëra të shtypura jashtë dhe shumë, shumë, më shumë. Por tani për tani, vetëm ato mjete ju duhet të merrni goxha larg. Pra, ne jemi, natyrisht, duke marrë një vështrim në Graphics Tani, të gjithë një e papritur. Dhe tani bota jonë merr pak më interesante. Dhe ju e dini, ndoshta, nga disa prej videos online se ne kemi këto pantallona të shkurtra që ju keni qenë të shikuar si pjesë e përcakton problem. Dhe ata kanë qenë të qëlluar, qëllimisht, kundër një sfond të bardhë. Dhe disa prej tyre kanë mësimin Fellows tërhequr disa tekst në ekran që e veshi në anën e tyre. Por sigurisht, kjo nuk është e gjitha që interesante në botën reale. Kjo është vetëm një sallë leksion me një ekran të madh të bardhë dhe një sfond. Dhe mahnitshme tonë ekipi i prodhimit lloj e bën gjithçka duket e bukur pas faktit nga prodhues jashtë ose veshur asgjë ne bëjmë apo nuk duan. Tani vetëm për të motivuar këtë javë dhe me të vërtetë, ku ju mund të shkoni, në fund të fundit, me shkencën kompjuterike. Jo vetëm pas problemit të ngritur katër. Por, pas një tjetër kurs apo një të tërë Planprogrami Është e mahnitshme se çfarë ju mund të të bëjë këto ditë në drejtim të grafika në veçanti. Disa prej jush mund të keni parë këtë rrjedhin rreth online. Por unë mendova se do të ju tregojnë, për vetëm një Nja dy minuta, një paraqitje e shkurtër e asaj që teknologji kompjuterike dhe çfarë CGI, grafika kompjuterike mund të bëjë këto ditë me një këngë të njohur dhe ndoshta film. [MUSIC - LANA DEL RAY, "Rinj dhe të bukur] Kryetari 1: Kjo është vetëm pak mahnitshme, ndoshta, vetëm sa gjithëpranishëm - [Duartrokitje] Gjuha 1: Unë vetëm shkarkuar atë. Por kjo është me të vërtetë e mahnitshme, unë mendoj se, vetëm si software i gjithëpranishëm dhe kodin dhe mjete si kjo me të vërtetë janë. Pra, kjo është një shije të drejtimit në të cilën ju mund të shkoni. Oh, jo Appliance më sot. E pra, kjo është koha në të vërtetë tragjike duke pasur parasysh pikën Unë vetëm u përpoq të bëjë. Të gjithë të drejtë, kështu që le të fillojë Fusion përsëri. Kujtoj mua më vonë. Të gjithë të drejtë, dhe ju duhet të keni marrë një email si një mënjanë, nëse ju e bëri të marrë një vëreni si kjo. Të gjithë të drejtë, kështu që kujtojnë se javën e kaluar kemi filluar të zhvishem përsëri këtë i njohur më vonë si string. string kujton një lloj të të dhënave që është deklaruar në bibliotekë CS50. Dhe kjo është pjesë e rrotave të trajnimit që tani do të fillojë të marrë jashtë. Kjo ishte një koncept i dobishëm në fillim. Por tani ajo do të merrni më shumë interesante dhe më të fuqishme për në të vërtetë shohim se nën kapuç, një varg është vetëm ajo, nuk kemi thënë? Yeah, kështu që kjo është një e ashtuquajtura * char. * Dhe aty tregon se ka disa lloj adresën e përfshira. Dhe kështu, kur ju thoni * char ju vetëm do të thotë një ndryshore dhënat e të cilit është një lloj pointer tani. Fakti se ka yll atje thjesht do të thotë se ju jeni duke deklaruar një ashtuquajturat pointer. Dhe ky tregues do të duket ruajtur adresën e, i Natyrisht, një char. Tani pse e bën këtë kuptim? E pra, çfarë është një varg nën kapuç? E pra, për një farë kohe ne kemi qenë duke thënë se se një varg nën kapuç është vetëm h-E-l-l-o, per shembull. Por ne kemi biseduar në lidhje me këtë si qenë, në thelb, një koleksion. Dhe një koleksion pastaj do të shohim pak më shumë si kjo, me secilin prej këtyre duke marrë një pickim. Dhe pastaj ne kemi thënë se ka diçka e veçantë kthehen këtu, backslash 0, ose null Terminator. Pra, të gjithë këtë kohë, ky këtu ka qenë një varg. Por me të vërtetë, është një varg në fakt një adresë. Dhe adresat, siç do të shohim, janë shpesh të prefixed me 0x nga Konventa. Çfarë do 0x treguar? A e di ndokush? Pra, kjo thjesht do të thotë heksadecimal. Kështu që ju mund të kujtojnë, në fakt, nga PST 1, I besoj, njëra prej të ngrohtë-lart Pyetjet fakt pyetur rreth simbol heksadecimal përveç binare dhe dhjetore. Dhe këtu është se motivimi me heksadecimal ju keni 16 shifrat në dispozicionin tuaj. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, pasuar nga a, b, c, d, e, f. Dhe në qoftë se ju numërimin e të gjitha deri ato, që ju të merrni një total prej 16. Pra, kjo është në kontrast me decimal, ku ne kemi 10 0 shifra, përmes nëntë. Kjo është në kontrast me binar ku ne kemi vetëm 0 dhe 1. Por në fund të ditës ju mund të thjesht përfaqësojnë numrat e njëjtë, por disi më ndryshe. Dhe heksadecimal është e zakonshme sepse si ajo rezulton jashtë - dhe ne do të shohim këtë më vonë në rrjedhën - madje edhe kur marrim për programimin e web në kontekstin e HTML dhe kodet ngjyra, heksadecimal është e bukur. Sepse çdo shifra, rezulton, përfaqëson katër bit përkryer. Pra, vetëm ajo lloj e linjave deri bukur si ne përfundimisht do të shohim. Pra, kjo mund të jetë Ox123 apo diçka si kjo, 123 denoting adresë diku brenda e mia kujtesës kompjuterit. Por sigurisht, disa probleme lindin për shkak të kësaj themelor zbatimi. Dhe kujtojnë se unë mora një goditje me thikë në implementimit të një funksioni si kjo - krahasoni dash 0 dot c javën e kaluar, që edhe pse ajo dukej si ajo ishte drejtë, ai thjesht nuk krahasohen dy vargjet saktë. Unë e kam hedhur tutje kryesor, dhe unë e kam hedhur larg komentet vetëm për të përqëndrohet në në kodin që është me interes këtu. Dhe kjo është në të kuqe, sepse kjo është buggy. Për çfarë arsye? E pra, në krye atje kur kam deklaruar një varg, çfarë po ndodh në të vërtetë nën kapuç? E pra, më lejoni të shkoj mbi të ekran këtu dhe të tërheqë atë. Kështu që unë deklaruar, përsëri, getString varg s. Kështu që unë jam duke shkuar për të shkuar përpara dhe tani barazim s për atë që është me të vërtetë. Ajo do të jetë një shesh këtu. Dhe unë jam duke shkuar për të kërkuar se kjo është 32 bit. Të paktën ajo zakonisht është, të paktën në CS50 aplikim në një shumë të kompjuterëve. Unë jam duke shkuar për të thirrur atë s. Por tani kujtojnë se ne quajtur getString. Kthimet Pra getString, Natyrisht, një varg. Nëse lloje përdorues në h-e-l-l-o hyjë string përshëndetje merr kthyer. Dhe kjo string, si ne vetëm tha, përfundon deri diku në kujtesën e kompjuterit tuaj me nje 0 backslash në fund. Unë do të nxjerrë këtë si array - ose bllok puqur e karaktereve - se ajo në fakt është. Dhe tani, ajo që është getString në fakt kthehej? Çfarë ka qenë i kthyer getString të gjithë këtë kohë? E pra, të themi, në javët e para, ajo kthen një varg. Por më teknikisht, çfarë bën GetString kthimin duket? Audienca: Një adresë. Kryetari 1: Një adresë. Në mënyrë të veçantë ai kthehet adresën e kafshimit të parë, çfarëdo qoftë ajo. Unë vetëm i mbajnë duke përdorur një, dy, tre për shkak se është i përshtatshëm. Ajo kthen adresa e parë karakter në vargun. Dhe ne tha javën e kaluar se që është e mjaftueshme. Sepse ne gjithmonë mund të kuptoj se ku fundi i vargut thjesht duke iterating mbi të, ndoshta, me një për loop ose një lak, ndërsa ose diçka si se, vetëm në kërkim për "backslash 0", karakter të veçantë Sentinel. Dhe atëherë ne e dimë se string ndodh të jenë të gjatësisë - në këtë rast - pesë. Pra, teknikisht çfarë bën getString është ajo kthehet Ox123 në këtë rast. Dhe teknikisht se çfarë ndodh atëherë është se ne dyqan, brenda S, Ox123. Në fund të ditës, edhe pse kjo është koncept i ri, pointers, ata janë vetëm variablave. Por ato ndodhin për të ruajtur bit që kolektivisht përfaqësojnë një adresë. Pra, teknikisht të gjithë ata merr ruhen në s është Ox123. Por ne si njerëzit - përfshirë tutje sot - nuk janë me të vërtetë do të kujdesen, në mënyrë tipike, çfarë është adresa aktuale e disa copë e kujtesës. Kjo është vetëm për nivelin e ulët të detajuar për të jetë intelektualisht interesante. Kështu që unë jam duke shkuar për të ndrequr këtë. Dhe në vend, niveli më i lartë, vetëm të thonë se se kur ne jemi duke folur për pointers Unë jam duke shkuar të vetëm të tërheqë më shumë user-friendly shigjetë që përcjell Ideja e njëjtë dhe abstraktet larg Veçoritë e asaj aktuale Adresa themelor është. Tani në qoftë se ne do të shkojmë përsëri në kod, çfarë ndodhi javën e kaluar në qoftë se ne kemi string t barabartë getString? E pra, nëse unë përsëri, lloji në përshëndetje këtë herë unë jam duke shkuar për të marrë një tjetër copë e kujtesës. h-E-l-l-o backslash 0. Por për shkak se unë e quajti getString një herë të dytë - dhe unë e di këtë nga të shikuarit kodi burim për getString - edhe pse kjo është rastësi që ishte përshëndetje shtypen në dy herë, nuk është getString do të përpiqen për të optimizuar dhe të jetë i zgjuar. Është vetëm do të merrni një copë të memorie nga kompjuter, e cila është do të jetë në një adresë tjetër. Le të them vetëm arbitrarisht 456. Dhe pastaj çfarë është ajo do të kthehet? Ajo do të kthehen 456 dhe ruajtur atë në t. Pra, çfarë po ndodh në të vërtetë, në Ana e majtë është që unë kam një tjetër copë e kujtesës, 32 bit zakonisht. Dhe atje do të shkojë Ox456. Por përsëri, unë nuk jam i interesuar në këto Numrat më të veçanta. Unë jam vetëm duke shkuar për të abstrakte tërheqë atë si një shigjetë. Pra, kjo është tani një shpjegim të ri. Por kjo ide e njëjtë e saktë kjo është ndodhur gjithë këtë kohë. Dhe kështu, atëherë arsyeja, që kjo e parë version i Krahaso ishte buggy javën e kaluar është arsyeja pse? Kur ju bëni në qoftë se s barabartë barabartë t Çfarë jeni ju me të vërtetë nën kapuç krahasuar? Ju jeni duke krahasuar adresat. Dhe vetëm intuitive, në mënyrë të qartë, Ox123 nuk është duke shkuar për të Ox456 barabartë. Këto numra, ato bit janë vetëm të ndryshëm. Dhe kështu vazhdimisht, javën e kaluar ai tha se ju shkruani gjëra të ndryshme, madje edhe në qoftë se Fjalët ishin tekstualisht njëjtë. Pra, ne të rregullojmë këtë. Në terma laik, çfarë ishte fix? Audienca: Përdorni një funksion. Kryetari 1: Përdorni një funksion. Apo yjet janë të përfshirë patjetër, por përdorin një funksion për të bërë çfarë? Audienca: Për të krahasoni strings. Kryetari 1: Për të krahasoni strings. Pra, problemi themelor këtu ishte se unë isha vetëm duke pasur parasysh cilësinë e vargjeve te përcaktohet duke Krahasimi i adresat e tyre. Dhe padyshim kjo është vetëm memec tani dikur ju e kuptoni se çfarë po ndodh nën kapuç. Për të vërtetë krahasoni strings për të parë nëse ata janë të barabartë në mënyrë që një njeriut do të marrin në konsideratë dy vargjet të jetë e barabartë ne kemi nevojë për të krahasuar atyre karakterin për karakter për karakter. Tani unë mund të ketë bërë kjo shumë tediously. Por ceremoni, ne jemi duke përdorur një për lak. Dhe vetëm krahasoni parantezë s Unë kundër t kllapa i. s parantezë Unë plus 1 kundër t kllapa I plus 1, dhe kështu me radhë, brenda disa lloj lak. Dhe nëse kam ndonjë vend dy karaktere që ndryshojnë, ose në qoftë se unë të kuptojë se ooh, s është shkurtër se T ose më shumë se sa t Unë mund të them menjëherë të rreme, ata nuk janë të njëjtë. Por në qoftë se unë të marrë përmes s dhe t dhe thonë njëjta, të njëjtën, të njëjtën, të njëjtën, të njëjtën, fundi i të dy vargjet, unë mund të them Vërtetë, ata janë të barabartë. Well, fatmirësisht, vjet më parë dikush shkroi që kodi për ne. Dhe ata e quajti atë StrComp string për të krahasuar. Dhe, edhe pse kjo është një counter pak intuitive, StrComp returns 0, nëse ata dy vargjet, s dhe t janë të njëjta. Por ajo kthehet vlera negative nëse s duhet të vijë para se t alfabetikisht ose Vlera pozitive nëse ajo duhet të vijë pas t rendit alfabetik. Pra, nëse ju ndonjëherë të dëshironi për të zgjidhur diçka, kjo rezulton se StrComp është e dobishme. Për shkak se ajo nuk e them vetëm po ose jo, të barabartë ose jo. Kjo ju jep një ndjenjë të urdhërimin donte një fjalor fuqinë. Pra StrComp, s presje t barabartë është e barabartë me 0 do të thotë se vargjet janë me të vërtetë të barabartë. Sepse kushdo që e shkroi këtë funksion vjet më parë e përdorur me sa duket një për lak ose një lak, ndërsa ose diçka si kjo të integrojë mbi personazhet përsëri dhe përsëri dhe përsëri. Por problemi u ngrit dy here. Kjo ishte copy0.c. Dhe dy në të kuqe është sepse ajo është me të meta. Dhe, çka të bëjmë këtu? E pra, së pari kam thirrur getString. Dhe unë ruajtur vlerën e kthimit në S. Pra, kjo është shumë e shumë të njëjtë si kjo pjesë e lartë e foto. Por çfarë vjen pas kësaj? E pra, më lejoni të shkoj përpara dhe të shpëtoj i një bandë e tërë kjo. Ne do Rewind në kohë për të, ku ne vetëm kemi s, e cila tani është në përputhje me Linja një deri atje. I kontrolloni. Nëse është e barabartë s është e barabartë me 0. Tani, një shënim të shpejtë anë, kur mund të kthehen getString 0? Nuk ka kujtesë të mjaftueshme. E drejta? Është e rrallë që kjo do të ndodhë, sigurisht në një kompjuter që është mori qindra e Megs ose madje edhe koncerte e RAM. Por ajo mund, në teori, të kthehen 0, sidomos nëse përdoruesi nuk bashkëpunojnë. Ka mënyra të pretendojë sikur ju nuk e keni asgjë futur dhe mashtrim GetString në kthimin 0 në mënyrë efektive. Pra, kjo do të kontrolloni për këtë. Sepse në qoftë se ndonjëri prej jush kanë filluar të marrë, tashmë, gabimet e segmentimit - e cila ka qenë ndoshta një burim e disa frustrimit - ato janë pothuajse gjithmonë rezultat i lidhur kujtesës gabimit. Disi ju messed up në lidhje me një akrep, edhe në qoftë se ju nuk e kuptojnë atje ishte një akrep. Kështu që ju mund të keni detyruar segmentim gabimet si në fillim si një javë duke përdorur diçka si një lak ose për një kohë lak dhe një array duke shkuar shumë larg kaluar kufijtë e një grup që ju deklaruat, në dy javë në veçanti. Ju mund të keni bërë atë edhe në problemin vendosur me katër Breakout. Edhe pse ju ndoshta nuk e keni parë ndonjë yjet në Kodin e Shpërndarjes për Breakout, ajo rezulton se ata GRect dhe gjërat GOval dhe të tjera të tilla, ata në të vërtetë janë pointers nën kapuç. Por Stanford, si ne, lloj i fsheh se detajuar te pakten per te biblioteka qëllime, ashtu si bëjmë ne për vargun dhe * char. Por GRect dhe GOval dhe të gjithë ata që Gjërat që ju djema janë ose do të jetë duke përdorur këtë javë janë përfundimisht adresat e memories. Ju thjesht nuk e di atë. Pra, kjo nuk është për t'u habitur atëherë, ndoshta, që ju mund të udhëtim mbi disa gabimet segmentimit. Por ajo që është interesante këtu tani, nëse pas ne kontrolloni për 0 bëjmë string t merr s. E pra, më lejoni të deklaroj t. Unë jam duke shkuar për të nxjerrë atë si një shesh, 32 bit, e quajti atë t. Dhe atëherë unë jam duke shkuar për të bërë merr s. E pra, çfarë do të thotë kjo? E pra, kjo është pak e vështirë për të menduar në lidhje me atë foto e mençur. Por le të mendojmë për çfarë është brenda x? Çfarë është fjalë për fjalë brenda kësaj variable? Ox123 vlerë. Pra, kur unë them string t merr s, që vetëm fjalë për fjalë do të thotë të marrë numrin në s, e cila është Ox123 dhe e vënë atë Ox123. Ose në pikturë, në qoftë se unë lloj i abstract larg nga ajo detaje ajo ka Efekti i bërë fjalë për fjalë kjo si. Deri tani, mendoj se mbrapa me javën e kaluar, kur ne vazhduam për kapitalist T. I bëri T parantezë 0. E pra, T 0 parantezë, edhe pse kjo është një akrep, ju mund të trajtojë atë sikur kjo është një grup, me një shesh simbol kllapa. Pra, ku eshte T kllapa 0? E pra, kjo është h. Dhe kështu, kur ne e përdorim këtë linjë e kodit, dy sipërme, e cila është në atë type.h c fotografi header, se ku ajo është deklaruar. Ju jeni duke kapitalizuar këtë H. Por i Sigurisht, kjo është h njëjtë e saktë kjo është brenda s, kështu që të flasin. Dhe kështu që tani ju keni ndryshuar ose kapitalizohen si origjinale dhe ashtu-quajtur kopje. Sepse ju nuk keni bërë një kopje në Mënyra se si një njeri do të duan që ajo të jetë. Pra, çfarë ishte fix këtu, copy1.c në javën e kaluar? Funksionet, kështu që ne mund të vërtetë kopjoni string. Dhe rrënjësisht, çfarë nuk kemi nevojë për bëni në mënyrë që të kopjoni string? E pra, në këtë version gjelbër këtu unë jam do të bëni atë nivel mjaft të ulët. Ka të vërtetë janë funksionet ata mund të ndihmojë me këtë. Por një më themelor, dhe më e njohur, së paku, do të jetë së shpejti njohur për ne, është në vijim - kështu një në vijën e parë e kodit në të gjelbër tani. Unë thjesht rishkroi s si * char. Nuk ka asnjë funksionale Dallimi atje. Unë vetëm hodhën larg bibliotekën CS50 dhe Unë jam duke e quajtur atë se çfarë është ajo, një char *. Tani dot, dot, dot, sepse nuk ka pasur disa kontrolluar gabim që nuk është interesante për të folur rreth përsëri. Deri tani t është deklaruar. Ajo gjithashtu është një char *. Kështu që unë tërhoqi një shesh të vogël në ekran si më parë. Por, në anën e djathtë, malloc, kemi thënë është e kujtesës ndajë. Pra ndajë disa copë e kujtesës. Dhe sa bytes bëjmë ne fakt doni të ndajë, nuk duket? E pra, gjatësia varg s. Pra, nëse kjo është përshëndetje që është do të jenë pesë. Ne do të thotë h-E-l-l-o. Pra, pesë bytes. Por pastaj plus 1, pse 1? 0 karakteri. Nëse ne nuk lënë hapësirë ​​për këtë djalë ne mund të aksidentalisht krijuar një situatë ku vargu është h-E-l-l-o. Dhe pastaj getString herën tjetër është quajtur dhe unë lloji në, për shembull, David, D-nje-v-i-d, kompjuteri është duke shkuar të mendojnë se s është në fakt h-E-l-l-O-d-a-V-I-d pasi ka asnjë pushim në mes të këtyre fjalëve. Pra, ne kemi nevojë për këtë pushim. Pra, ne nuk duam pesë. Ne duam gjashtë bytes. Dhe unë them bytes. Por kjo është me të vërtetë koha madhësia e shkrumb. Teknikisht char është pothuajse gjithmonë një bajt vetme. Por vetëm për të bërë kodi ynë i lëvizshëm, kështu që të flasin, në mënyrë që ajo punon në kompjutera të ndryshme edhe në qoftë se ata mund të jetë disi të ndryshme nën individualitet, unë jam duke shkuar për generically thonë se madhësia e char në mënyrë që kodi im gjithmonë punë. Dhe unë nuk keni për të përpiluar atë vetëm sepse unë të përmirësuar kompjuterin tim ose përdorin disa platforma të ndryshme. Kështu që unë kam marrë 6 herë e madhësisë së nje char, e cila ndodh tek jenë 1. Kështu që do të thotë mund të malloc jepni gjashtë bytes. Çfarë është që në fakt duke bërë? E pra, më lejoni të rrokulliset prapa në kohë këtu ku ne jemi në histori. Pra, nëse unë kthehem këtu, unë kam deklaruar një * char quajtur t. Unë e kam quajtur tani malloc për gjashtë bytes. Dhe tani unë jam duke shkuar për të nxjerrë ato gjashtë bytes ashtu si array herët. Por unë në fakt nuk e di se çfarë është brenda këtij array. Nëse ju siguroj kujtesë rezulton se ju nuk mund të besojnë se ka disa Vlera e njohur atje. Ajo mund të ketë qenë përdorur nga diçka tjetër, disa funksion tjetër, disa të tjera linjë e kodit që ju ka shkruajtur. Pra, ne do të në përgjithësi quajmë këto mbeturina Vlerat dhe t'i tërheqim, ndoshta, si pikëpyetjet, vetëm duke treguar se ne nuk e di se çfarë është në të vërtetë atje. Dhe kjo nuk është punë e madhe për aq kohë sa ne janë të zgjuar të mjaftueshme për të prishësh ato Vlerat mbeturinash me numra ose chars se ne lidhje me kujdes. Pra, në këtë rast çfarë jam unë do të bëni? E pra, linjë e kodit ime tjetër, unë kam katër. int i merrni 0, n merr Gjatësia e string s. Pra, një të njohur për lak. Unë është më pak se ose e barabartë me n, cila zakonisht eshte sipër. Por këtë herë kjo është e qëllimshme. I + +, dhe atëherë unë thjesht të bëjë t simboli i merr s. Sepse fotografia ime duket si ky në ky moment, të ruhet në t është adresa e asaj copë të rastësishme të memories vlerat e të cilëve janë të panjohur. Por, sa më shpejt që të bëj unë t kllapa 0 që i vë mua këtu. Dhe çfarë përfundon duke u tërhequr atje? Ne deri në fund duke vënë h. Sepse kjo është ajo që është në kllapa 0 s. Dhe pastaj e njëjta gjë për E, dhe l, dhe l, dhe o. n, pse nuk kam shkuar deri me një të barabartë me n? Për shkak të karakter 0. Pra, vetëm të jetë i qartë, atëherë, në qoftë se unë në fakt fshihet çfarëdo këto mbeturina Vlerat janë dhe pastaj të vërtetë të tërheqë në ajo I presim, kjo është s grupim 1, 2, 3, 4, plus që është zvarritës Karakteri i ri. Dhe kështu që tani në qoftë se ne kemi vazhduar kaluara dot, dot, dot në këtë version korrekt kapitalizuar dhe kllapa 0 Unë do t, i kurs, të kapitalizuar vetëm këtë djalosh këtu, e cila konceptualisht, ishte në fund të fundit qëllimi. Pra, kjo është e gjitha akrep është. Dhe ju keni qenë duke përdorur ato për javë tani në kontekstin e strings. Por nën kapuç ata janë pak më komplekse. Por në qoftë se ju mendoni rreth tyre në këtë formë pikture Unë propozoj që ata janë të ndoshta jo të gjithë ata që e frikshme si parë mund të duket në shikim të parë, veçanërisht me sintaksë të tillë të re. Ndonjë pyetje mbi pointers, vargjet, ose karktereve? Po? Audienca: Mund të ju shkoni mbrapa për [padëgjueshme]? Kryetari 1: Sigurisht. Audienca: Deri sa të vijë në shumë të fundit tuaj line, ju nuk keni një linjë * T dhe një * s në linjë? A nuk e keni referencë ndaj - Kryetari 1: Ah, një pyetje me të vërtetë mirë. Pse nuk kam një T * dhe a * s? Sepse shkurtimisht, javën e kaluar, si në tonë bie në ujdi funksion, unë nuk them se kur ju keni marrë një pointer mjeti me anë të të cilat ju shkoni atje si ne e bëmë fizikisht në skenë, ishte në fakt përdorni operatorin yll. Ajo rezulton se ky kllapa katrore- simbol është ajo që ne do të thërrasë sintaktik sheqer, e cila është vetëm një mënyrë sexy duke thënë se është simbol stenografi për pikërisht ajo që ju jeni duke e përshkruar. Por kjo është një pak më shumë intuitiv. Dhe në rrezik për të bërë këtë të duken më komplikuar se ajo duhet të jetë, çfarë po ndodh në të vërtetë këtu eshte mëposhtme - Nëse unë them t * që do të thotë të shkojnë në Adresa e ruajtur në t. Pra, fjalë për fjalë, në qoftë se është t ruajtjen adresa e asaj h fillimisht, * do të thotë t shkoni këtu. Tani, çfarë do t kllapa 0 do të thotë? Të njëjtën gjë e saktë. Është vetëm një përdorues pak më shumë miqësore për të shkruar. Por unë nuk jam bërë ende. Unë nuk mund të them vetëm * t * s merr. Sepse çfarë do të jetë bërë atëherë? Unë do të vënë h, h, h, h, h gjatë gjithë gjë. E drejta? Sepse * t është të shkoni në adresën në t. Por ne jemi në brendësi të një lak. Dhe çfarë vlera jam unë rrisim, natyrisht, në çdo përsëritje? i. Por ka një mundësi këtu, e drejtë? Edhe pse kjo ndjehet si ajo është duke u pak më të sofistikuar se shënim sheshin-kllapa ne kemi përdorur për disa kohë - më lejoni të undo ndryshime time h atje - Edhe pse ky është tani duke marrë një pak njohës, ideja themelore, në qoftë se * t do të thotë këtu dhe * t është vetëm shkoni në adresën në t. Por ajo që ishte adresa në t? Numri i kemi mbajtur duke përdorur? Ashtu si Ox456, le të sjellë që mbrapa vetëm për hir të diskutimit. E pra, në qoftë se unë dua të merrni në e në t string, Unë vetëm dua të shkojë në, në thelb, 456. Ose më mirë, 457. Unë vetëm duhet të shtoni një të tillë. Por unë mund të bëjë atë, e drejtë? Sepse t, edhe pse unë mbaj vizatim ajo tani si një shigjetë, kjo është vetëm një numrin, Ox456. Dhe në qoftë se unë të shtoni një se, ose më shumë në përgjithësi, në qoftë se unë shtoj unë për të se unë mund të në fakt të merrni pikërisht aty ku unë dua. Pra, nëse unë në fakt e bëjnë këtë - dhe kjo është ajo që tani quhet aritmetike pointer - Unë mund të hiqni këtë linjë. Cila është, sinqerisht, unë mendoj se të qartë dhe një pak më shumë përdorues miqësore për të lexuar. Por kjo nuk është më pak i saktë. Kjo linjë e kodit tani është duke përdorur aritmetike pointer. Është thënë se të shkojnë për të adresën e mëposhtme - çfarëdo fillimi i T eshte, e cila eshte T plus I, që fillimisht eshte 0, e cila është e madhe. Sepse kjo do të thotë fillimi të t plus 1, 2 plus, plus 3, dhe kështu me radhë. Dhe marrëveshje të njëjtë me s. Pra, sheqeri sintaktik për këtë. Por të kuptuarit se çfarë ndodh në të vërtetë nën kapuç, unë do të argumentojnë, është në të vërtetë e dobishme në vetvete. Sepse kjo do të thotë tani nuk është magic shumë më tepër në vazhdim e sipër nën kapuç. Nuk do të jetë shumë më tepër Shtresat që ne mund të zhvishem mbrapa për ju. Kjo është c. Dhe kjo është programimi. Pyetja me të vërtetë mirë. Të gjithë të drejtë, kështu që kjo ishte se kaloshin Programi Unë isha duke iu referuar më herët. swap ishte me të meta. Nëse nuk duket për të punuar. Kujtojnë se ashtu si me qumësht dhe lëng portokalli - e cila kam filluar pijshëm demonstratën e sotme. Pra, ashtu si me lëng portokalli dhe qumësht, ne nuk duhet të përdorin një ndryshore të përkohshme, tmp, për të mbajtur një përkohësisht në mënyrë që ne të mund pastaj të ndryshojë vlerën e saj dhe pastaj përditësimin b. Por ky funksion, kemi thënë, ose ky program në të cilin ky funksion ishte shkruar ishte e gabuar dhe me të meta, pse? Po? Audienca: [padëgjueshme]. Kryetari 1: Pikërisht, kur ju telefononi swap - ose më në përgjithësi, kur ju thirrja më ndonjë funksion - nëse argumentet që funksionojnë janë primitiv, kështu që të flasin, ints dhe chars dhe dyshe dhe gjithandej, gjëra pa yjet, ju jeni duke kaluar në një kopje të argumenti. Pra, nëse ishte 1 x dhe y ishte 2, një është duke shkuar të jetë 1 dhe B është do të jetë 2. Por ata do të jenë të chunks të ndryshme të bit, chunks të ndryshme të memorie që të ndodhë të jetë ruajtjen Vlerat identike. Pra, ky kod është super i përsosur në një shkëmbimi dhe b. Ajo nuk është e mirë në të shkëmbejnë - në shembullin e javës së kaluar - x dhe y. Sepse përsëri, ata janë në fushën e gabuar. Tani, si nuk kemi shkuar në lidhje me fiksimin kjo? Ne kishim për të bërë funksionin duken shëmtuar pak. Por përsëri, e konsiderojnë atë kjo thjesht do të thotë. Dhe në fakt, më lejoni, për qëndrueshmëri, ndryshojë një gjë kështu që është identike me ajo që ne vetëm e bëri. Siç e përmenda javën e kaluar, ajo nuk e bën rëndësi se ku shkon. Në fakt, në mënyrë tipike ju do të vënë yll e ardhshme për emrin e ndryshueshme. Por unë mendoj se kjo do të jetë pak më e lehtë të marrin në konsideratë * e ardhshme për të Të dhënat tipi si do të thotë kjo është një akrep në një int në këtë rast. Pra, çfarë po bëj unë këtu? Unë jam duke thënë se nuk më jepni një int pasuar nga një tjetër int, quajtur ato a dhe b. Ma jep adresën e një int. Ma jep adresën e një tjetër int. Thirrni ata që adreson a dhe b. Dhe pastaj duke përdorur * simbol poshtë poshtë, të shkojë në secilën prej këtyre adresave si të nevojshme ose të marrë ose të ngritur vlerën e saj. Por ka një përjashtim këtu. Pse nuk kam një * tjetër për tmp? Pse nuk e bëj këtë, për shembull? Ajo ndjehet si unë duhet vetëm të shkojnë të gjithë jashtë dhe korrigjuar të gjithë gjë. Po? Audienca: [padëgjueshme]. Gjuha 1: Unë nuk e kanë deklaruar tmp si një varg. Pra, kjo do të deklarojnë, në këtë rast, a tmp të jenë adresa e nje int. Por kjo nuk është krejt ajo që unë dua, për disa arsye. Audienca: Ju nuk doni të bie në ujdi tyre. Kryetari 1: Pikërisht, unë nuk dua të bie në ujdi asgjë me tmp. tmp është vetëm Javën-një stuff. Të gjitha unë dua është një variabël për të ruajtur disa numrin. Edhe unë nuk e kujdesit në lidhje me adresat e në këtë moment. Unë vetëm nevojë për 32bits, ose në mënyrë për të ruajtur një int. Dhe unë dua të vënë në ato 32 bit çdo gjë që nuk është në një, kështu që të flasin, por çfarë është në një, vetëm për të qenë më të saktë. Sepse në qoftë se një është një adresë, * një do të thotë shkoni atje dhe të marrë vlerën 1. Për shembull, në shembullin e javës së kaluar ose në rastin e B-së, të marrë vlerën prej 2. Pra, çfarë ndodh në të vërtetë? Më lejoni të nxjerrë një foto këtu që do të vetëm vë në lojë përveç një pjesë të sotme. Por kjo do të vazhdojë të shfaqet për mjaft kohë. Këtë, unë pretendojnë, është ajo që kompjuteri juaj të kujtesës duket si kur ju drejtuar një Programi, çdo program. Kur ju drejtuar një program në krye e RAM kompjuterit tuaj - kështu që mendoj se i kjo drejtkëndësh, në të vërtetë, siç tuaj RAM kompjuterit ose memorie, të gjithë 101 miliardi bytes prej tij të gjithë dy bilion bytes, të gjitha dy gigabajt të saj, çdo gjë që ju keni është sasia, le të tërheqë atë si një drejtkëndësh. Dhe unë pretendojnë se kur ju drejtuar një program si Microsoft Word ose krom apo diçka të tillë, BITS që Microsoft apo Google që shkroi - në rastet e këtyre programeve - janë të ngarkuar në kujtesën e kompjuterit tuaj ku ata mund të ekzekutohet më shumë shpejt dhe ushqyer në CPU, e cila eshte trurin e kompjuterit. Dhe në TAM ata janë ruajtur në shumë Fillimi i programit tuaj, kështu që të flasin. Me fjalë të tjera, në qoftë se kjo është një copë e kujtesës, kur ju klikoni dy herë mbi Microsoft Word, BITS vijnë off hard drive. Ata të merrni ngarkuar në RAM. Dhe ne do të fus ato deri në shumë të lartë i këtij drejtkëndësh konceptualisht. Well, pjesa tjetër e kujtesës suaj është përdoret për gjëra të ndryshme. Në shumë të lartë që ju shihni nisja dhënave dhe uninitialize dhënave. Kjo ka të bëjë, për pjesën më të madhe, me konstanta ose variablave globale që kanë vlera. Por më shumë në ato kohë tjetër. Pastaj ju keni tog gurësh, i cili ne do të vijnë përsëri në. Por në fund është pjesa që është veçanërisht i përshtatshëm tani. Kjo është e ashtuquajtura rafte. Pra, ashtu si në çdo sallë më të madhe këtu në D kampus, ju keni ato tabaka që vetëm rafte në krye të njëri-tjetrit në të cilën ju mund të vënë ushqim dhe gjësend. Rafte në një sistem kompjuterik është shumë e ngjashme. Përveç ndërsa tabaka, si ne i përdorim në sallë ngrënie, natyrisht, është menduar për të kryer gjëra tabaka ose korniza - si ne do të thërrasë ato - në një kompjuter të memorie është përdorur për të mbajtur variablave dhe vlerat. Pra, çfarë me të vërtetë shkon më nën kapuç? E pra, më lejoni të rrokullisje mbi me ekran këtu. Dhe le të përqëndrohet vetëm në pjesa e poshtme për një moment. Nëse kjo është pjesa e poshtme e mia kujtesës kompjuterit ajo del kur unë telefononi Funksioni kryesor - që ndodh, sinqerisht, automatikisht për mua - Kam marrë një copë e kujtesës në Fundi i RAM tim kështu që të flasin. Dhe ky është vendi ku kryesor është Variablat lokale të shkojnë. Kjo është ku argc dhe argv ndoshta të shkojnë, dhe çdo ndryshore I deklarojnë brenda kryesore. Ata përfundojnë deri në fund e RAM kompjuterit tim. Tani mendoj se thirrjet kryesore një funksion si swap, si ajo e bëri javën e kaluar? E pra, ne thelb vënë një tabaka të re, një kornizë të re, mbi copë time të kujtesës. Dhe unë jam duke shkuar për të përshkruar këtë si që i përkasin funksionit swap. Tani çfarë ka brenda e swap-it? E pra, bazuar në programin e javës së kaluar dhe një ne vetëm e pa një ekstrakt nga, brenda kornizës swap-së, apo në swap-së tabaka, janë ato variabla? Mirë, a dhe b. Sepse ata ishin argumentet e saj lokale, plus një të tretë, tmp. Pra, me të vërtetë, unë mund të tërheqë këtë pak më të pastër. Më lejoni të shkojnë përpara dhe të prish etiketën. Dhe më lejoni të pretendojnë se ju e dini se çfarë? një është ndoshta do të përfundojnë këtu. B do të përfundojnë këtu. Dhe tmp do të përfundojnë këtu. Tani, renditja mund të jetë pak më ndryshe. Por konceptualisht kjo është ideja. Dhe vetëm kolektivisht, kjo është ajo që ne do të thërrasë kornizë SWAp-it, ose ngrënie-sallë tray. Dhe marrëveshje të njëjtë me kryesore. Por unë nuk e shlyen atë. Por kjo është ajo ku argc dhe argv dhe çdo e variablave të saj lokale si x dhe y mund të jenë si edhe. Pra, tani e konsiderojnë se çfarë po ndodh realisht kur ju telefononi shkëmbim. Kur ju telefononi swap, kodi ekzekutimin si kjo, ju jeni duke kaluar, në version buggy, a dhe b si kopjet e x dhe y. Pra, në qoftë se tani unë do të nxjerrë këtë në ekran - marrë për të marrë më të mirë në këtë - kështu që historia unë u thënë për veten time ishte në këtë version buggy, kur ne telefononi swap kalon në fjalë për fjalë a dhe b si integers, çfarë po ndodh me të vërtetë? E pra, çfarë po ndodh me të vërtetë është kjo. Më lejoni të shkojnë përpara dhe të zhbëjë vetëm për të pastruar disa hapësirë ​​këtu. Pra, kjo është e kujtesës kompjuterin tim. Pra, nëse unë kam, për shembull - në fakt, le të bëjë atë në këtë mënyrë - në qoftë se unë pretendojnë se kjo është x, ruajtjen Vlera e 1 ashtu si javën e kaluar. Dhe kjo është y, ruajtjen e vlerës 2 ashtu si javën e kaluar. Dhe kjo është kryesore, kur unë e quaj swap, duke i dhënë vetes një qasje për të dhe b dhe tmp, unë jam duke shkuar për të pretendojnë se kjo është një dhe kjo është 1. Kjo është b. Kjo është 2. Kjo është quajtur tmp. Dhe fillimisht, ajo ka disa vlera plehrash deri sa unë në fakt të ruajtur në atë, cila eshte 1. Pastaj unë të shkojnë përpara dhe për të ndryshuar një të jetë ajo? Vlera e B-së. Dhe kështu që tani unë kam dy ketu. Dhe atëherë ne i thamë b merr tmp. Përsëri, ashtu si një mendje e shëndoshë kontrolloni, tretë linjë e kodit këtu është thjesht kjo një, b merr tmp. Dhe kështu së fundi, çfarë të bëj? Unë shkoj përpara dhe të ndryshojë b të jetë çdo gjë vlera e TMP eshte, e cila eshte 1. Unë nuk prek tmp përsëri. Por tani, problemi është sa më shpejt swap kthimit, sepse ajo nuk është dorëzimin mbrapa disa vlera, nuk ka kthim deklaratë eksplicite në të. Çfarë është në të vërtetë ndodh? E pra, në thelb e gjithë kjo memorie - OK, me sa duket gomë pëlqen vetëm një gisht në një kohë - vetëm të zhduket. Tani në realitet ajo nuk është duke shkuar kudo. Por ju mund të mendoni për atë tani si pikëpyetjesh. Për shkak se ajo nuk është më aktualisht në përdorim. Dhe asgjë nuk është bërë me ato vlera. Pra, në rastin e versionit të gjelbër të ky kod, çfarë vend është duke u kaloi në shkëmbim? Pra trajton. Pra, adresa e X dhe adresa e y. Pra, nëse ne ri-them kjo histori e fundit kohë, dhe unë në fakt tërheq swap përsëri, por me pointers, kjo duke qenë një, kjo duke qenë b, dhe kjo tmp qenit, çfarë është ruhen në të vërtetë në një në këtë gjelbër version i kodit time, ku unë jam duke kaluar në adresat? Ajo do të jetë një tregues për x. Kështu që unë mund të tërheqë një shigjetë. Por, le të përdorim arbitrar njëjtë shembull si më parë. Le të thonë se kjo është diçka si Ox123. Dhe kjo do të jetë për shkak Ox127 kjo është katër bytes më larg, sepse kjo është një int, kështu Ox127. Dhe përsëri, unë jam duke marrë disa lirive me numrat. Ata janë shumë më të vogla se sa ata do të jetë në fakt dhe në një mënyrë të ndryshme. Por kjo është se si foto është tashmë e ndryshme. Por kur unë të përdorni këtë kod gjelbër dhe unë do të merrni tmp int * a. * Një mjet për të bërë në vijim, të marrë adresojë se është në një dhe të shkojnë në atë, cila eshte 1. Dhe kjo është ajo që unë pastaj të vënë në tmp. Ndërkohë, në rreshtin tjetër të kodit këtu, merr një * b, çfarë do të thotë kjo? E pra, * një, kështu që të shkojnë këtu merr * b, që do të thotë të shkojnë atje. Dhe kjo do të thotë për të vënë në vlerën atje. Së fundi, vija e fundit e kodit thjesht tha * b merr tmp. B Kështu thotë shkojnë atje dhe të prishësh atë me tmp e cila, në këtë rast, është duke shkuar që të jetë, përsëri, 1. Dhe kjo është arsyeja pse versioni i gjelbër Punimet tona kodi, ndërsa kuqe version kurrë nuk e bëri. Ajo të gjitha boils poshtë për të vetëm se si kujtesës është menaxhuar dhe ku është vendosur në të vërtetë në tuaj RAM kompjuterit. Dhe tani për tani, kjo është një nga gjërat se rafte është duke u përdorur për të. Pyetjet mbi layout? Në pointers? Ose në shkëmbim? Të gjithë të drejtë, kështu që malloc, risjell, bëri diçka si kjo. Ky ishte një shembull i thjeshtë super. Dhe kjo ishte ajo që Binky na futi në, megjithëse mjaft shpejt, në fund të klasës. Dammit, atje ne do të shkojmë përsëri. Pra, kujtojnë se ky ishte shembulli që Binky na futi në, megjithëse disi shpejt në fund të klasës. Dhe këtu kemi përdorur malloc vërtetë për herë të dytë. Sepse herë të parë ne kemi përdorur atë për të krijuar RAM të mjaftueshëm, ndajë RAM të mjaftueshëm për të ruajtur një varg. Këtë herë Binky mbajtur atë të thjeshtë. Pra, kjo është vetëm për të ruajtur një int, me sa duket. Dhe kjo është krejtësisht e mirë. Është pak i çuditshëm, sinqerisht, për të përdorni malloc të ndajë një int. Por pika e claymation Nick ishte me të vërtetë vetëm të tregojë historinë e asaj ndodh ose nuk ndodh kur ju keqtrajtojnë kujtesës. Pra, në këtë rast, ky program bëri disa gjëra. Në rastin e parë këtu, ajo deklaron një tregues i quajtur X për të një int. Ajo pastaj deklaron një pointer quajtur y në një int. Ajo pastaj ruan në x, çfarë? Dikush tjetër tani. Çfarë merr ruajtur në X sipas Linja e tretë e këtij programi? Audienca: [padëgjueshme]. Kryetari 1: E pra, jo fare bytes, per thonë. Jetë më i saktë tani. Çfarë merr ruajtur në X? Një adresë, unë mendoj se kam dëgjuar atë. Pra, çfarë do malloc kthehet? malloc sjellurit alokon një copë e kujtesës. Por si e bën atë të ju jap qasje në të? Ajo kthen çfarë? Adresën e bajt pare në copë e memories. Tani, kjo është e thjeshtë super. Është vetëm një bajt, që do të thotë adresuar ne jemi duke marrë përsëri është adresa e gjithë gjë. Pra ruhen në X atëherë, është adresa e asaj copë e kujtesës. Ndërkohë, çfarë ndodh më pas? Pra, në fakt, le të shkojnë përpara dhe të nxjerrë këtë të shpejtë të vërtetë jashtë. Pra, nëse ne kalojmë në ekranin këtu dhe luajmë this out int * x * y dhe int do të bëjë çfarë për mua? Unë pretendojnë se kjo është vetëm do të bëjë diçka si kjo dhe e quajti atë x, dhe këtë dhe e quajnë atë y. Ndërkohë, Linja e tretë e kodit është do të ndajë madhësinë e një int, i cili ndodh të jetë - sorry nëse kam thënë një para se unë do të thotë një int - katër bytes në një kompjuter tipike. Së paku me aplikim CS50. Pra, kjo do të ndajë ajo, kush e di? Diku këtu. Dhe kjo është ruajtur në disa Dem adresa, kush e di? Por çfarë do të merrni kthyer është se adresa. Por ne do të tërheqë këtë në pikturë si vetëm një shigjetë si kjo. Tani, në vijën e ardhshme merr 42 * x. Çfarë do të thotë * x në kushtet e laik? Vetëm të shkojnë atje. Shko në atë adresë. Ose me fjalë të tjera, ndiqni shigjetë dhe të vënë 42 atje. Por pastaj diçka e keqe ka ndodhur për Binky, e drejtë? Kujtojnë se vijë pesë këtu, * y merr 13, me të vërtetë një numër i pafat, e bëri atë për ne? E pra, do të thotë * y shkojnë atje. E pra, kjo nuk ka qenë e dhënë një vlerë ende, e drejtë? Kodi nuk kanë qenë y initialized për asgjë. Ne kishim x qenë initialized në adrese. Por y ishte shpallur deri të lartë. Por pastaj një pikëpresje, asnjë vlerë është vënë vërtetë në të. Pra, kjo është e drejtë për të thirrur këtë një vlerë e plehrave. Kush e di se çfarë është atje? Është mbetjet e copa që janë përdorur nga disa përputhje të mëparshëm të kodit në Programi im. Pra, nëse unë them të shkojnë atje, kjo është si, Unë nuk kam asnjë ide se ku kjo është shigjetë do të përfundojnë. Dhe kjo është kur ju zakonisht merrni një defekt segmentimit. Nëse ju aksidentalisht dereference, në mënyrë që të flasin, ose të shkojnë në një adresë që nuk është në fakt një adresë legjitime, ndodhin gjëra të këqija. Dhe kjo është pikërisht ajo që ndodhi të mendojnë Binky. Kështu që kujtojnë se historia se Nick ishte thënë këtu ishte ide e njëjtë si ajo Unë e kam tërhequr me iluzionin e shkumës në bordin atje. X dhe y janë deklaruar. Pastaj ne ndarë madhësinë e një int dhe ruajtur atë në x. Pastaj linjë tjetër që ne e bëmë * x. Kjo ishte shkop magjik Nick i dereferencing. Që vënë 42 në kujtesën vuri në dukje nga x. Por kjo është ajo ku gjërat shkoi tmerrësisht keq. E drejta? Ne u përpoq për të y dereference. Por kishte disa vlera y fals, e drejtë? Kjo shigjetë në pjesën e poshtme të majtë qoshe, nuk është në të vërtetë asgjë për të treguar. Kjo është lloj i bërë atë që unë bëri këtu në bord. Pra, ndodhin gjëra të këqija, segmentimit faji, apo Binky faji, në këtë rast. Por nëse ne pastaj të rregullojmë se duke bërë X merr y si e bën ndryshimin histori? E pra, në qoftë se unë bëj merr x y, që është efektivisht njëlloj si të thuash çka është kjo, dem-diçka do të jetë e njëjtë edhe këtu, Ox-diçka. Ose në pikturë ne do të nxjerrë një shigjetë. Kështu që këtu në bordin me Binky, me vijën e ardhshme të Kodi, * y do të thotë të shkojnë atje. Ku është atje? Kjo do të thotë mbi këtu. Dhe kur ne update që të jenë 13 ajo përfshin vetëm duke shkuar dhe shkrim 13 këtu tani. Pra, ndoshta jo plotësisht drejtpërdrejtë në shikim të parë. Por për radhitje dhe për të përdorur zhargonin e njëjtë Binky që ishte përdorur këtu, kështu që dy të parët ndajë pointers, x dhe y, por jo pointees. Dhe pointees nuk eshte nje në përgjithësi përdoret term. Por është absolutisht pointer. Por kjo është ajo që është duke u theksuar në në nomenklaturë Binky së. Kjo linjë e ardhshme, natyrisht, alokon një pointee int. Pra, një copë e kujtesës - si unë tërhoqi mbi të Ana e djathtë atje - dhe të vendosur x barabartë të tregojnë për atë. Kjo x 42 dereferences për të ruajtur në kujtesës që ajo është vënë në. Dhe pastaj kjo, natyrisht, ishte një gjë e keqe. Sepse y nuk ishte treguar në ende asgjë. Kjo fixes atë. Pra, kjo është ende program buggy. Vetëm për shkak se ne jemi defekt nëpërmjet Linja Kodi me vijën dhe duke thënë, oh mirë, le të rrëzimit atje. Kjo është një gjë e keqe. Shanset janë programi i vetëm do të abortojë krejt në atë linjë. Por në qoftë se keni qenë për të hequr rrëzua të vijë dhe ta zëvendësojë atë me dy të fundit Linjat atje ju caktojnë - duke përdorur detyrën akrep - y të tregojnë për x si t pikë. Dhe pastaj ju dereference y në një mënyrë shumë të sigurt. Pra, ku e bën këtë na lënë? E pra, rezulton se nën kapuç në bibliotekë CS50, pointers janë përdoret në të gjithë. Dhe ne fakt do të fillojë të zhvishem mbrapa se shtresa para se të gjatë. Por kjo rezulton edhe një shprehje që disa prej jush mund të jetë njohur me të, veçanërisht ato më të rehatshme, është fakt se e një shumë të popullarizuara website, apo rafte del nga shtrati, këto ditë. Por ky fakt ka shumë Kuptimi teknik. Ne tani e dimë se çfarë është një pirg. Është si një pirg e tabaka brendësi të një sallë ngrënies. Ose në brendësi të së kompjuteri juaj kujtesën e tij ato korniza që janë përdorur nga funksionet. E pra, ajo rezulton se për shkak të kësaj Zbatimi shumë e thjeshtë e kujtesës dhe korniza në të ashtuquajturat rafte, ju në fakt mund të marrë kontrollin e një sistemi kompjuterik mjaft lehtë. Ju mund të kollitem në një sistem në qoftë se njerëzit si ne nuk e keni shkruar kodin tonë veçanërisht mirë. Nëse njerëz si nesh përdorin chunks e kujtesës ose përdorimi i vargjeve - edhe më shpesh - por ndonjëherë harroni të kontrolloni kufijtë e array tona si ju mund kanë veten ndonjëherë, dhe rikonfirmoi mënyrë shumë larg kaluara fund një array. Në rastin më të mirë, programi juaj vetëm mund të rrëzimit. Faji segmentimit, lloj e turpshme. Jo e madhe, por kjo nuk është domosdoshmërisht një gjë jashtëzakonisht e keqe. Por në qoftë se programi juaj është në të vërtetë në të vërtetë kompjuterët e përdoruesve, nëse ajo është running në një faqe interneti që njerëzit aktuale të rastit në internet janë të goditur, duke i lënë njerëz të shkaktoj gjëra të këqija në kodin tuaj është në përgjithësi nuk është një gjë e mirë, sepse kjo do të thotë një mundësi për të marrë kontrollin e kompjuterit. Dhe kjo do të shikojmë pak fshehtë. Por unë mendova se do të trembë ju me ky shembull e fundit këtu. Ja një shembull të kodit. Dhe ka një të mirë Wikipedia artikull që ecën nëpër kjo më në detaje. Unë kam kryesor në thirrjen e poshtme foo, duke kaluar në argv e 1. Dhe kjo është vetëm mënyrë që ju mund të drejtuar programin dhe të kalojë një input arbitrare. Dhe pastaj foo është deklaruar deri të lartë siç pranuar nje varg, ose më shumë Pikërisht, një char *. Ajo pastaj deklaron një sërë chars. Tërhiqni vëmendjen se një tampon, më në përgjithësi, e madhësisë 12. Pra, 12 chars mund të përshtaten brenda e atij grup të quajtur c. Dhe pastaj ai e përdor këtë funksion të ri, e cila është e re, por jo e vështirë për të kuptuar, kopje e kujtesës. Kjo kopje kujtesën nga bar, i cili ishte n ndryshueshme kaluara, çfarëdo përdorues shtypen në argv 1 në c. Sa bytes? Gjatësia varg bar. Pra, me fjalë të tjera, në qoftë se përdoruesi lloje në h-E-l-l-o lloza, gjatësia vargu e përshëndetje është pesë. Pra, pesë prej këtyre bytes është duke shkuar për të marrë kopjuar në grup të quajtur c, e cila është e madhësisë 12. Por ajo që përdoruesi lloje në një shumë më të gjatë fjalë që është 13 karaktere ose 14 karaktere ose 100 karaktere apo më shumë? Ku janë ata do të shkojnë? E pra, kjo kornizë, që tabaka në rafte ngrënie-sallë, ata do të shkojnë atje. Dhe kjo është vetëm do të fillojë overwriting sende të tjera që është tashmë në atë rafte, tejmbushur rafte, kështu që të flasin. Pra, në pikturë, mendoj se në këtë mënyrë. Kjo është vetëm një version i gjallë i foto ne kemi qenë të tërhequr. Në fund, le të themi, është kryesore. Dhe në krye, çfarë ju jeni duke parë tani po, frame color kodifikua tani, për një funksion të quajtur foo. Por ajo që është interesante këtu në lidhje foo është se këtu është korniza e saj. Pra, kjo është përpiluar ashtu si unë bëri, por në ngjyrë blu të lehta. Dhe tani kjo është ajo ku c kllapa 0 shkon. Dhe ky është vendi ku c kllapa 11 do të përfundojë. Me fjalë të tjera, kjo ndodh për të përfaqësohet si një shesh. Por në qoftë se ju vetëm i mbajnë plopping bytes poshtë - ose chars - ata janë duke shkuar për t'i dhënë fund deri në lokacionin 0 të gjithë rrugën deri 11 për shkak se ajo është 0 indeksuar. Por, ku është karakteri 13 do të përfundojë? Ku është 14? Ku është karakteri 50 do të përfundojë? Ajo do të mbajë duke shkuar poshtë. Sepse edhe pse ne kemi tërhequr fotografia me rafte rritur, adresat, ajo rezulton, shkojnë nga Adresat e të vogla, të vogla pointers, në adresat e mëdha. Pra, vetëm ajo mban shkuar deri dhe deri. Pra, nëse përdoruesi lloje në hello, kjo është e madhe. Asnjë bug, nuk ka problem, të sigurt e të gjithëve. Por në qoftë se përdoruesi lloje në atë që ne do telefononi kodin kundërshtues, të përfaqësuara generically si një,, sulm sulm, sulm, sulm, çfarë mund të ndodhë? E pra, nëse të gjithë e kontributit që përdoruesi shtypur në nuk është vetëm disa miqësore ose varg i karaktereve ofenduese. Kjo është në fakt një sekuencë e karaktere se në qoftë se ju të hartuar atë, ai në fakt është kodi. Ndoshta kjo është kodin që fshin të gjitha fotografi në hard drive tuaj ose dërgon Spam ose diçka të tillë. Vini re se çfarë është çelësi këtu është se në qoftë se djalë i keq mori me fat të mjaftueshme për të prishësh copë të kuqe e kujtesës - të cilat unë nuk të nxjerrë në foton time, por kjo foto këtu Wikipedia ka - Adresa e ashtuquajtura saj kthimit. Kur të kthehet ushqimit, kur të kthehet swap, si e bën kompjuterin di për të shkuar nga deri këtu për këtu poshtë? Ose në segmentin e teknologjisë së lart, si ajo nuk e di për të shkuar nga swap-in Kodi - 0-së dhe e 1 që përbëjnë swap - Kthehu tek Qendrori? Ka një të ashtuquajtur Adresa e kthimit ruhet në atë kornizë të njëjtën rafte, në tabaka njëjtën mensë. Pra, në qoftë se djalë i keq është i mençur të mjaftueshme për të vënë kodin sulm, kodi sulm, sulm Kodi, dhe për të marrë me fat të mjaftueshme - shpesh përmes gjykimit dhe gabim - në prishësh atë adresë kuqe e kthimit, me adresën dhe njoftimi shumë të lartë. Njoftim 0835C080. Është e shkruar prapa deri të lartë për Arsyet ndoshta ne do të rishqyrtojnë. Kjo është se numri i. Pra, në qoftë se djalë i keq merr me fat të mjaftueshme ose është mjaft i zgjuar për të prishësh kuqe zhvesh e kujtesës me adresën e kodin që ai ose ajo ka disi injektuar në kompjuterin tuaj, me mend e të cilit Kodi është duke shkuar për t'u kthyer në sa më shpejt që foo është bërë ekzekutimin? Kodi djalë i keq e. Pra këtë kod sulm, AAA, përsëri, mund të dërgojnë spam, mund të fshini të gjitha dosjet në hard drive tuaj. Por kjo është ajo që me të vërtetë një stack overflow është, ose një tampon muar, ose një sulm tampon del nga shtrati. Dhe kjo është tepër, tepër e zakonshme në këtë ditë me programet e shkruara në C, C + +, dhe madje edhe disa gjuhë të tjera. Në atë shënim të frikshme, ne do të të përfundojë me një shaka. [Qeshura] Shihemi të mërkurën. Në CS50 e ardhshëm - Kështu që unë jam i të gjitha llambat nga disk sot, por prisni, pa yndyrë, qumështi gjysma telefon libër, lëng portokalli që unë piva sot. USB kabllo, një pikëllim. [Duke luajtur muzikë]