DAVID Malan: Hello, dhe mirëpritur mbrapa për CS50. Pra, kjo është fundi i javës së katër. Vetëm një Njoftimi i parë. Pra, e ashtuquajtura pestë hëna është vijnë deri të hënën e ardhshme. Kjo është mundësi për të ndryshuar nga SAT / UNSAT te nje klasën letër, ose nga klasën letër SAT / UNSAT. Annoyingly, se procesi i bën të kërkojë një nënshkrim, sepse ju duhet të plotësoni nga një prej këtyre Shto / Drop forma trëndafili. Sepse teknikisht, SAT / UNSAT version dhe klasa letër version kanë numra të dallueshme katalog. Por asnjë marrëveshje e madhe. Vetëm të dalë për mua ose për të vjedh ose për Lauren në çdo pikë. Ose na dërgoni email në qoftë se ju nuk keni lloj shkresa keni nevojë për sot, dhe ne do të jetë i sigurt për të ju ndihmojë të marrë kujdes se para hënën. Të gjithë të drejtë, kështu që sot - në fakt, ka pak e një jehonë. Mund të kemi ton mua poshtë një grimë? OK. Pra, sot, ne kemi prezantuar një temë njohur si pointers. Dhe unë do të pranoj që kjo është një nga tema më të ndërlikuara se ne priren të mbulojë në këtë klasë, apo me të vërtetë ndonjë kurs hyrës që përdor C. Por të marrë fjalën time për të, veçanërisht Nëse mendja juaj ndjehet një prirje pak më shumë sot dhe në javët që do të vijnë. Kjo nuk është përfaqësuese e keni marrë çdo e keqe në këtë ai thjesht do të thotë se kjo është një temë e veçanërisht të sofistikuar Unë ju premtoj se, disa javë kështu, të gjithë do të duket shumë e habitshme drejtpërdrejtë në retrospektivë. Unë ende kujtohet në këtë ditë. Unë isha ulur në Elliott Dining Hall, ulur pranë TF tim Nishat Mehta, i cili ishte një banor i shtëpisë Elliott. Dhe për disa arsye, kjo topic vetëm klikimeve. Cila është të them se edhe unë luftuar me atë për disa sasinë e kohës, por unë do të bëj çmos për të ndihmuar të shmangur ndonjë të tillë luftë me një temë që në fund të fundit është mjaft i fuqishëm. Në fakt, një nga temat që ne do të diskutuar në javë tek vijnë eshte se të sigurisë, dhe se si ju mund të vërtetë shfrytëzojnë makina në mënyra të që nuk ishin të destinuara. Dhe ato janë zakonisht eksploatimet rezultat i bugs, gabime që ne njerëzit bëjnë duke mos kuptuar disa i zbatimit themelor Detajet nëpërmjet programeve të cilat janë bërë. Tani për të bërë këtë duket të gjithë përdoruesit më shumë miqësore, unë mendova se do të luajë një 10 preview dytë e një claymation pak figurë emrin Binky i cili u soll në jeta nga një mik i yni në Stanford, Profesor Nick Parlante. Pra më lejoni të ju jap këtë teaser e Binky këtu. [Video playback] -Hej, Binky. Zgjoheni. Është koha për argëtim akrep. -Çfarë është ajo? Mësoni rreth pointers? Oh, goodie. [VIDEO END rishikim] DAVID Malan: Kjo është e Stanford shkenca kompjuterike. Pra, më shumë që do të vijnë. [Duartrokitje] DAVID Malan: Na vjen keq, Nick. Pra, kujtojnë se herën e fundit ne përfundoi në kjo cliffhanger vërtetë emocionuese ku ky funksion thjesht nuk keni punuar. Së paku intuitivisht, ajo ndjehet si ajo duhet të punojnë. Thjesht shkëmbejnë vlerat të dy integers. Por kujtoj se kur ne shtypura jashtë Vlerat fillestare në njërën kryesor, dhe dy, ata ishin ende një dhe dy dhe jo dy dhe një. Pra më lejoni të vërtetë kaloni mbi te pajisjes. Dhe ju shkrova në një grimë e kodit skeletik në avancojë këtu, ku unë pretendojnë se x do të jetë 1, y do të jetë 2. Unë pastaj të shtypura nga dy prej tyre Vlerat me f shtypura. Unë pastaj pretendojnë se këtu poshtë ne jemi duke shkuar për të bie në ujdi tyre. Kam lënë një vend bosh këtu për ne plotësoni në sot në një moment të vetëm. Pastaj, unë jam duke shkuar për të pretendojnë se dy variabla janë swapped. Atëherë unë jam duke shkuar për të shtypur ato jashtë përsëri. Dhe kështu që shpresojmë se, unë duhet të shihni 1, 2. 2, 1. Kjo është e thjeshtë super Qëllimi tani. Pra, si do të shkojmë në lidhje shkëmbejnë dy variabla? E pra, nëse unë propozoj këtu se këto gota mund të përfaqësojnë kujtesën në një kompjuter. Kjo është një kafshon pak, kjo është një tjetër kafshon pak. Mund të kemi një vullnetar të vijë në UP dhe përzierje disa pije na, nëse i njohur? Come on up. Cili është emri juaj? Jess: Jess. DAVID Malan: Jess? Come on up, Jess. Nëse ju nuk e mendjes, ne kemi për të vënë Glass Google për ju në mënyrë që ne mund të përjetësoj këtë. OK, qelqi. Regjistro një video. Dhe OK, ne jemi të mirë për të shkoni me Jess këtu. Dakord. Gëzohem që u njohëm. Pra, ajo që unë do të doja që ju bëni këtu - në qoftë se ju mund të, mjaft shpejt - vetëm na derdh gjysmën e një gotë portokalli lëng dhe gjysmën e një gotë qumësht, përfaqësojnë efektivisht numrat 1 në një filxhan dhe 2 në Kupën e tjera. Kjo do të jetë mirë pamjet. Jess: Më vjen keq. DAVID Malan: Jo, jo. Është në rregull. Bukur. Të gjithë të drejtë, kështu që ne kemi katër bytes vlerë të lëng portokalli. Ne do quajti atë vlerën 1. Tani një tjetër katër bytes vlerë e qumështit. Do të thërrasë atë vlerë 2. Pra, x dhe y, respektivisht. Të gjithë të drejtë, kështu që tani në qoftë se detyrë në dorë - për ju, Jess, në frontin e të gjitha e shokëve tuaj - është që të bie në ujdi vlerat e x dhe y të tillë se ne duam lëng portokalli në kupa-tjetrin dhe qumësht në këtë kupe, si mund ti - para se të bëjë në fakt ajo - shkoni për të bërë këtë? OK, vendim i mençur. Pra, ju keni nevojë për një memorie pak më shumë. Pra, le të ndajë një të përkohshme filxhan, nëse ju do. Dhe tani të vazhdojë të bie në ujdi x dhe y. Excellent. Pra, shumë mirë bërë. Thank you so much, Jess. Urdhëro. Një suvenir pak. OK, kështu që natyrisht, ide super e thjeshtë. Plotësisht intuitiv që ne kemi nevojë për një grimë më shumë hapësirë ​​e magazinimit - në këtë formë, një filxhan - në qoftë se ne të vërtetë duan të bie në ujdi këtyre dy variablave. Pra, le të bëjë pikërisht këtë. Deri këtu në mes ku unë pretendojnë unë jam do të jetë bërë disa shkëmbejnë, unë do të shkojnë përpara dhe të deklarojë temp. Dhe unë do të vënë atë të barabartë me, të themi, x. Atëherë unë jam duke shkuar për të ndryshuar vlerën e x vetëm si Jess bëri këtu me qumësht dhe lëng portokalli të jetë e barabartë me y. Dhe unë jam duke shkuar për të ndryshuar y të jetë e barabartë të mos x, sepse tani ne do të jetë mbërthyer në një rreth, por më tepër Temp. Ku kam përkohësisht - ose ku Jess përkohësisht të vënë lëng portokalli para se clobbering filxhan me qumësht. Pra më lejoni të shkoj përpara dhe të bëjë këtë tani. Ajo që quhet noswap.c. Dhe tani më lejoni të kandidojë asnjë shkëmbim. Dhe me të vërtetë unë shoh, nëse unë të zgjeruar dritare pak, se x eshte 1, y eshte 2. Dhe pastaj është 2 x, y është 1. Por kujtojmë se të hënën ne e bëmë gjëra pak më ndryshe ku unë implementuar në vend një funksion ndihmëtar, në qoftë se ju do, që në fakt ishte e pavlefshme. Unë e quajti atë të bie në ujdi. I dha asaj dy parametra, dhe unë e quajti atyre një dhe kam thirrur ata b. Sinqerisht, unë mund të telefononi ata x dhe y. Nuk ka asgjë ndalimin e mua nga duke bërë që. Por unë do të argumentoja se është atëherë një pak i paqartë. Sepse kujtojnë për të hënën se ne pohoi se këto parametra ishin kopjet e vlerave kaluar in Kështu që vetëm messes me tuaj Mendja, unë mendoj se, në qoftë se ju përdorni saktësisht të njëjtat ndryshore. Kështu që unë do të thërrasë atyre një vend dhe b, vetëm për qartësi. Por ne mund të quajmë ato më të çdo gjë që ne duam. Dhe unë jam duke shkuar për të kopjoni dhe ngjisni efektivisht ky kod nga atje lart poshtë në këtu. Sepse unë vetëm pashë se ajo punon. Pra, kjo është në formë mjaft të mirë. Dhe unë do të ndryshojë x tim për një x tim, për një, y ime për të b dhe y tim në b. Pra, me fjalë të tjera, logjika e saktë të njëjtën. Saktë të njëjtën gjë që bëri Jess. Dhe pastaj një gjë që unë duhet të bëni deri Këtu, natyrisht, tani është adhurojnë këtë funksioni, ose telefononi këtë funksion. Kështu që unë do të thërrasë këtë funksion me dy inputet, x dhe y, dhe hit Save. Të gjithë të drejtë, kështu që rrënjësisht e njëjta gjë. Në fakt, unë kam bërë ndoshta programin panevojshme kompleks nga shkruar një funksion që është vetëm duke marrë disa gjashtë rreshta të kodit, kurse unë më parë kishte zbatuar këtë në vetëm tre. Pra më lejoni të shkoj përpara dhe tani xhirim këtë, të bëjë asnjë shkëmbim. Të gjithë të drejtë, unë screwed up këtu. Kjo duhet të jetë një gabim që ju mund të shohim gjithnjë e më shumë si zakonisht tuaj Programet merrni më komplekse. Por ka një fix lehtë. Më lejoni të lëviz mbrapa deri këtu. Dhe çfarë është gabimi i parë që unë jam duke parë? Deklarata nënkuptuar. Çfarë do që zakonisht tregojnë? Oh, kam harruar prototip. Kam harruar për të mësuar përpilues që swap do të ekzistojë edhe pse ai nuk ekziston në fillim i programit. Kështu që unë jam vetëm duke shkuar për të thënë, swap pavlefshëm, int, a b int, pikëpresje. Kështu që unë nuk jam duke shkuar për reimplement atë. Por tani ajo përputhet çfarë është këtu poshtë. Dhe njoftimi, mungesa e një pikëpresje këtu, e cila nuk është e nevojshme kur zbatimit. Pra më lejoni të ribërë këtë, bëjë asnjë shkëmbim. Formë shumë të mirë. Run asnjë shkëmbim. Dhe mallkonte atë. Tani ne jemi kthyer aty ku ishim të hënën, ku gjë nuk bie në ujdi. Dhe çfarë është shpjegimi intuitiv se pse ky është rasti? Po? STUDENT: [padëgjueshme]. DAVID Malan: Pikërisht. Kështu a dhe b janë kopjet e x dhe y. Dhe në fakt, në çdo kohë ju keni qenë duke e quajtur një funksion deri më tani që kalon variablave si ints - ashtu si swap është duke pritur këtu - ju djema kanë kaluar në kopje. Tani që do të thotë ajo merr një pak e kohës, një ndarje të dytë, për kompjuter të kopjoni copa nga një ndryshueshme në copa të një tjetër. Por kjo nuk është e tillë një punë e madhe. Por ata janë megjithatë një kopje. Dhe kështu tashmë, ne kuadrin e swap, Unë jam në të vërtetë sukses ndryshimi A dhe B. Në fakt, le të bëjë një të shpejtë kontrolloni mendje e shëndoshë. F Printo a eshte% i, linjë e re. Dhe le të plug në një. Tani le të bëjmë të njëjtën gjë me b. Dhe le të bëjë të njëjtën gjë këtu. Dhe tani, më lejoni të kopjoni ato linja të njëjta përsëri në fund të funksionit pas linjave të tre mia të interesante mund të ketë ekzekutuar, dhe printoni një b dhe përsëri. Pra, tani le të bëjë këtë, bëjë asnjë shkëmbim. Më lejoni të bëjë një dritare terminali bit shtatlartë, kështu që ne mund të shohim më shumë nga ajo në të njëjtën kohë. Dhe të kandidojë asnjë shkëmbim. x eshte 1, y eshte 2. a eshte 1, b është 2. Dhe pastaj, a është 2, b eshte 1. Pra, ajo është duke punuar, ashtu si Jess e bëri këtu në brendësi të swap-it. Por sigurisht, ajo që nuk ka efekt mbi ndryshoret në kryesore. Pra, ne pamë një mashtrim të cilës ne mund të rregullojmë këtë, të drejtë? Kur ju jeni ballafaquar me këtë Studimit , çështje që ju mund vetëm të vë bast dhe të X dhe y çfarë lloj variabla vend? Ju mund të bëjnë ato globale. Vënë ato në krye të dosjes siç bëmë, madje edhe në ndeshjen e 15. Ne përdorim një ndryshore globale. Por ne kuadrin e nje lojës 15, është e arsyeshme që të ketë një globale ndryshueshme në përfaqësimin e bordit, sepse 15.c është tërësia e të gjitha lidhje me zbatimin e se lojë. Kjo është ajo që ekziston për të bërë fotografi. Por në këtë rast këtu, unë jam i duke e quajtur një shkëmbim funksion. Unë dua të bie në ujdi dy variablave. Dhe kjo duhet të fillojnë të ndjehen vetëm lëngshëm nëse zgjidhja për të gjithë e tona probleme kur kemi drejtuar në fushën e Çështjet është të bëjë atë globale. Sepse shumë shpejt është programi ynë do të bëhet mjaft e një rrëmujë. Dhe ne e bëmë atë shumë me masë si rezultat në 15.c. Por kjo rezulton se ka një mënyrë më të mirë krejt. Më lejoni të vërtetë të shkuar mbrapa dhe fshini print së F, vetëm për të lehtësuar këtë kod. Dhe më lejoni të propozoj që kjo, me të vërtetë, është e keqe. Por në qoftë se unë në vend që të shtoni në disa asterisks dhe yjet, në vend të kësaj unë mund të kthehet këtë Funksioni në një thats në të vërtetë operacional. Pra më lejoni të kthehem këtu dhe pranoj duke thënë se asterisks është gjithmonë e vështirë, kështu që unë do të thonë yjet. Unë vetëm do të rrëfejë deri në atë një. Dakord. Dhe tani, çfarë jam unë do të bëni në vend? Pra, para së gjithash, unë jam duke shkuar për të specifikojë se në vend të kalimit në një int Funksioni swap, unë jam vend për të shkuar për të thënë yllin int. Tani, çfarë do të tregojnë yll? Kjo është se kuptimi i nje tregues asaj Binky, karakteri Claymation, ishte duke iu referuar një moment më parë. Pra, nëse ne themi yll int, kuptimi i kjo tani është se nuk do të jetë duke kaluar në vlerën e saj. Kjo nuk do të jenë të kopjohet in Përkundrazi, adresa e një është duke shkuar për të kaluar in Pra, kujtojnë se brenda e kompjuterit tuaj është një bandë e tërë e kujtesës, përndryshe i njohur si RAM. Dhe kjo RAM është vetëm një bandë e tërë e bytes. Pra, nëse tuaj Mac ose PC juaj ka Dy gigabajt, ju keni 2 miliardi bytes e kujtesës. Tani le të vetëm të supozojmë se vetëm për të të mbajtur gjërat e bukur dhe të rregullt, ne të caktojë një adresë - një numër - për çdo bajt RAM në kompjuterin tuaj. Bajt i parë i atyre 2 miliardë është nga zero numrave. Një tjetër është numër një bajt, numri i dy, të gjitha mënyra më lart, dot dot dot, për afërsisht 2 miliard dollarë. Kështu që ju mund Numri i bytes e kujtesës në kompjuterin tuaj. Pra, le të supozojmë se kjo është ajo që ne do të thotë nga një adresë. Pra, kur unë shoh një yll të int, çfarë po ndodh për të kaluar në swap tashmë është adresa e një. Jo vlera e tij, por çdo gjë e saj postar adresa është, kështu që të flasin - vendndodhjen e saj në RAM. Dhe në mënyrë të ngjashme për b, unë jam duke shkuar për të thënë të njëjtën gjë. Int, yll, b. Si një mënjanë, teknikisht yllit mund të shkojnë në vende të tjera. Por ne do të standardizohet në yllin qenë të drejtë tjetër për llojin e të dhënave. Kështu bie në ujdi nënshkrimi tani do të thotë, më jepni adresa e një int, dhe thirrja se adresa a. Dhe jepni një adresë tjetër të një int dhe thirrje që b adresave. Por tani kodi im këtu ka për të ndryshuar. Sepse në qoftë se unë deklaroj temp int - e cila është ende e tipit int - por kam ruajtur atë në një, çfarë lloj të vlerës së? Për të qenë të qartë, unë jam vënë një një me Kodi shkruar si të drejtë tani? Unë jam vënë vendin në një. Por unë nuk e kujdesit në lidhje lokacioni tani, të drejtë? Temp ekziston vetëm kupën e tretë Jess ' ekzistuar, për çfarë qëllimi? Për të ruajtur një vlerë. Qumësht ose lëng portokalli. Jo në fakt të ruajtur adresën e ose nga ato gjëra, të cilat ndihet një pak absurd në këtë të vërtetë Konteksti botëror anyway. Pra, me të vërtetë, ajo që unë dua të vënë në temp nuk është adresa e një, por Përmbajtja e një. Pra, në qoftë se një është një numër si 123, kjo është 123 byte e kujtesës që vetëm një ndodh të jetë pushtuese, që vlera e ne nje ndodh të jetë i zënë. Nëse dua të shkoj në atë adresë, Unë duhet të them një yll. Në mënyrë të ngjashme, në qoftë se unë ishin të ndryshojë atë që është në adresën e një, unë të ndryshojë kjo për të filluar një. Nëse unë dua për të ruajtur në atë që është në një vend me atë që është në vendin e në b, b yll yll. Pra me pak fjalë, edhe nëse kjo nuk është mjaft në fundosje akoma - dhe unë nuk do të presim se ajo do të në mënyrë të shpejtë - kuptojnë se të gjitha unë jam duke bërë është prefixing këto yje të variablave të mi, thënie nuk e kap vlerat. Mos e ndryshoni vlerat. Por më tepër, shkoni tek ato adresat dhe të marrë vlerën. Shko në atë adresë dhe ndryshim vlera atje. Pra, tani më lejoni të lëviz mbrapa deri në majë, vetëm për të rregulluar këtë linjë këtu, për të ndryshojë prototip të ndeshjes. Por unë tani duhet të bëjë një gjë tjetër. Intuitivisht, në qoftë se kam ndryshuar tipet e e argumenteve që swap-i pritur, çfarë tjetër nuk kam nevojë për të ndryshim në kodin tim? Kur unë e quaj shkëmbim. Sepse tani, çfarë jam Kam kaluar të bie në ujdi ende? X vlera dhe vlera e y, ose qumësht dhe lëng portokalli. Por unë nuk dua të bëj këtë. Unë në vend që doni të kalojë në atë? Vendndodhjen e X dhe vendndodhja e y. Cilat janë adresat e tyre postare, kështu që të flasin. Pra, për të bërë këtë, ka një simbol. Lloj simbol i tingëllon si adresë. kështu n, simbol, adresa e x, dhe adresa e y. Pra, kjo është e qëllimshme që ne përdorim ampersands Kur e quan funksionin, dhe yjet kur deklarimit dhe kur zbatimin e funksionit. Dhe vetëm të mendoj për simbolin komercial si adresa e operatorit, dhe si yll shkoni atje Operatori - ose, më mirë, Operatori dereference. Pra, kjo është një shumë e tërë e fjalëve të vetëm për të thonë se tani, me shpresë, swap po shkon të jenë korrekte. Më lejoni të shkojnë përpara dhe të bëjë - le të vërtetë të ndërrojë emrin e file, që të mos ky program nuk ka ende të quhet swap. Unë pretendojnë se ne do të thërrasë atë swap.c tani. Pra, të bëjë, të bie në ujdi. Dot, plagë, të bie në ujdi. Dhe tani me të vërtetë, është 1 x, y është 2. Dhe pastaj, x eshte 2, y është një. E pra, le të shohim nëse ne nuk mund të bëjmë këtë një pak më ndryshe si për atë që është ndodh këtu. Së pari, më lejoni të zoom në në tonë vizatim ekran këtu. Dhe më lejoni të propozojnë për një moment - dhe sa herë që kam nxjerrë këtu do të pasqyrohen deri atje tani - më lejoni të propozoj që këtu është një bandë e tërë e kujtesës, ose RAM, brenda e kompjuterit tim. Dhe kjo do të jetë numri i kafshoj, le të themi, 1. Kjo do të jetë bytes numër 2. Dhe unë do të bëj një bandë e tërë më shumë, dhe pastaj një bandë e dots dot dot për tregojnë se ka 2 miliard dollarë nga këto gjëra. 4, 5, dhe kështu me radhë. Pra, nuk janë para pesë bytes e kujtesën e kompjuterit tim. Të gjithë të drejtë? Shumë pak prej 2 miliardë. Por tani unë jam duke shkuar për të propozojë në vijim. Unë jam duke shkuar për të propozojë që x është duke shkuar për të të ruajtur numrin 1, dhe y po shkon për të ruajtur numrin 2. Dhe më lejoni të shkoj përpara dhe tani përfaqëson këto vlera si më poshtë. Le ta bëjmë këtë si më poshtë. Më jepni vetëm një sekond. Një sekondë. OK. Unë dua të bërë këtë një pak - le të bëjë këtë përsëri. Përndryshe unë jam duke shkuar për të përdorur dhe Numrat e njëjta, pa dashje, herë të shumta. Pra, vetëm kështu që ne kemi numra të ndryshëm për të folur rreth, le ta quajmë këtë bajt numër 123, 124, 125, 126, dhe dot dot dot. Dhe më lejoni të pohojnë tani që unë jam duke shkuar për të vënë vlerën 1 këtu, dhe vlerën 2 këtu, i njohur ndryshe si x dhe y. Pra, kjo ndodh pikërisht kështu që kjo është x, y kjo është. Dhe vetëm nga disa rastësisht, kompjuter, sistemit operativ, ndodhur për të vënë në vend të x numër 123. Dhe y përfundoi në lokacionin 124 - mallkonte atë. Unë duhet të ketë fiksuar këtë. Oh njeri, nuk kam me të vërtetë doni ta bëni këtë? Po, unë dua për të rregulluar këtë dhe b duhur në lidhje me këtë sot. Na vjen keq, reja në këtë. 127, 131, dhe unë nuk dua të jem ky komplekse, por pse nuk kam ndryshuar Numrat atje? Sepse unë dua që të ints të jetë në fakt katër bytes. Pra, le të jetë super anal në lidhje me këtë. Kështu që, nëse ndodh 1 të adresohen 123, 2 do të jetë në adresën 127, sepse ajo është vetëm 4 byes larg. Kjo është e gjitha. Dhe ne do të harrojmë për të gjithë adresat e tjera në botë. Pra, x është në vend të 123, y është në vend të 127. Dhe tani çfarë po bëj unë në fakt doni të bëni? Kur unë e quaj swap tani, çfarë është në të vërtetë ndodh? E pra, kur unë e quaj shkëmbim, unë jam duke kaluar në adresa e x dhe adresa e y. Kështu për shembull, në qoftë se këto dy copa i letrës tani përfaqësojnë dy Argumentet a dhe b të bie në ujdi, çfarë jam unë do të shkruaj më parë i tyre, të cilën unë jam duke shkuar për të thirrur referohen si një? Pikërisht, 123. Kështu që kjo I pretendim eshte nje. Ky eshte nje parametri. Unë jam vënë adresën e x në atje. Çfarë është ajo? Çfarë është ajo? Jo, nuk ka. Kjo është në rregull. Ende e mirë, ende e mirë. Pra, kjo është një. Dhe tani në pjesë e dytë të letrës, kjo do të jetë b, dhe çfarë jam unë do të jenë të shkruar në kjo copë letër? 127. Pra, e vetmja gjë që ka ndryshuar që tregimi ynë i mëparshëm i kësaj historie është, jo fjalë për fjalë 1 dhe 2, unë jam do të kalojë në numrin 123 dhe 127. Dhe unë tani jam duke shkuar për të vënë këto brenda i kësaj kutize, të gjithë të drejtë? Kështu që tani përfaqëson kuti e zezë Funksioni swap. Ndërkohë, tani le të ketë dikush zbatojë funksionin swap. Dikush do deri këtu të doja të vullnetare? Come on up. Cili është emri juaj? Charlie. Të gjithë të drejtë, Charlie. Come on up. Pra, Charlie është duke shkuar për të luajtur Roli i kutisë tonë të zi. Dhe Charlie, ajo që unë do të doja që ju të bëni tani është zbatuar swap në një mënyrë të tillë se, duke pasur parasysh këto dy adresa, ju ishin në fakt duke shkuar për të ndryshuar vlerat. Dhe unë do të pëshpëritë në veshin tuaj si për të drejtuar TV këtu. Pra shkoni përpara, dhe ju jeni kuti e zezë. Arrijnë në atje. Çfarë janë vlerat e shihni ju për një, dhe çfarë janë vlerat e shihni ju për b? CHARLIE: a është 123 dhe b është 127. DAVID Malan: OK, saktësisht. Tani pauzë atje për vetëm një moment. Gjëja e parë që ju jeni do të bëni tani, sipas kodit - cilin Unë tani do të tërheqë deri në ekran - do të jetë që të ndajë pak bit e kujtesës quajtur temp. Kështu që unë jam duke shkuar për të shkuar përpara dhe ju jap se kujtesës. Pra, kjo do të jetë një variabël i tretë që ju keni në dispozicion për të ju thirri temp. Dhe çfarë po ju do të shkruani në copë temp e letrës? CHARLIE: Pointers, e drejtë? DAVID Malan: OK, edhe jo domosdoshmërisht pointers. Pra, linjë e kodit që unë kam theksuar në anën e djathtë, le të fillojë atje. Ajo thotë se një yll. Pra, a është aktualisht ruajtjen numri 123. Dhe vetëm intuitive, çfarë yll ka 123 do të thotë? Por, konkretisht, në qoftë se një është 123, një yll do të thotë çfarë? Vlera e një. Ose më rastësisht, të shkojnë atje. Pra më lejoni të propozojnë që, duke mbajtur në një dora jote, të shkojnë përpara dhe të trajtojnë se sikur kjo është një hartë. Dhe ecin mbi veten në kompjuterin e kujtesës, dhe të na gjeni atë që është e në vend të 123. Saktësisht. Pra, ne shohim në lokacionin 123 është ajo, padyshim? OK, kështu që çfarë tani vlera jeni duke shkuar për të vënë në temp? Saktësisht. Pra shkoni përpara dhe të bëjë atë. Dhe shkruaj numrin 1 në copë letër që është titulluar aktualisht temp. Dhe tani hapi tjetër që ju jeni duke shkuar për të zbatuar do të jetë ajo. E pra, në anën e djathtë të Linja tjetër e kodit është yll b. b, i Kursi, ruan një adresë. Që adreson 127. B Star thotë se çfarë, rastësisht duke folur? Shko në atë vend. Pra shkoni përpara dhe të na gjeni se çfarë është në vend të 127. OK. Sigurisht, në vend të 127, është ende vlera 2. Pra, çfarë po ndodh tani në dyqan çdo gjë është në vend në një? Pra, një yll të thotë të shkojnë në një vend. Çfarë është një vend? Saktësisht. Deri tani, në qoftë se ju doni të ndryshoni çfarë është në atë vend - Unë do të shkoj përpara dhe të drejtuar gomë janë këtu. Dhe tani e vënë atë përsëri në furçë. Çfarë numri jeni duke shkuar për të shkruar në atë kuti bosh tani? Saktësisht. Pra, kjo linjë e kodit, të jetë i qartë - le mua pauzë çfarë të bëjnë dhe Charlie theksoj këtu, se çfarë ai është bërë vetëm është shkruajnë në atë kutinë në lokacionin 123 vlera që ishte më parë në b. Dhe kështu që ne kemi zbatuar tani në të vërtetë kjo linjë e dytë e kodit. Tani për fat të keq, nuk ka ende një linjë të mbetura. Tani ajo është në temp, fjalë për fjalë? Kjo është padyshim një numër. Kjo nuk është një adresë. Është vetëm një numër, lloj një ndryshore nga një javë. Dhe tani, kur ju thoni yll b, që do të thotë shkojnë për të b adresave, i cili eshte i Kursi këtu. Pra, një herë ju merrni atje - Unë do të shkoj përpara dhe fshihet se çfarë është në të vërtetë atje - dhe çka jeni do të shkruaj tani në 127? CHARLIE: temp, e cila është një. DAVID Malan: temp, e cila është një. Dhe çfarë ndodh me temp në fund? E pra, ne nuk të vërtetë e di. Ne nuk e kujdesit të vërtetë. Çfarëdo kohe ne kemi zbatuar një funksion deri më tani, çdo ndryshore lokale që ju keni janë me të vërtetë lokale. Dhe ata vetëm të zhduket. Ata janë bonifikuar nga veprojnë Sistemi përfundimisht. Pra, fakti që ende ka temp vlera 1 është lloj i rrënjësisht jointeresant për ne. Të gjithë të drejtë, kështu që një raund i duartrokitje në qoftë se ne mund të për Charlie. Very well done. Të gjithë të drejtë, kështu që çfarë e bën më të kjo do të thotë që ne mund të bëjmë? Pra, del se ne kemi qenë Tregimi i një pak gënjeshtra të bardha për mjaft kohë. Në të vërtetë, ajo rezulton se një varg, të gjithë këtë kohë, nuk është me të vërtetë një Sekuenca e karaktereve në vetvete. Kjo lloj është se intuitivisht. Por duke folur teknikisht, string është një Lloji i të dhënave që kemi deklaruar në brendësi të CS50 bibliotekë të thjeshtojë botën për javët e para të klasës. Çfarë është me të vërtetë një varg është adresa e nje karakter diku në RAM. Një varg është me të vërtetë një numër, si 123 ose 127, që ndodh për të caktoj kufijtë ku një varg fillon në memorie kompjuteri juaj. Por kjo nuk paraqet string, në vetvete, në vetvete. Dhe ne mund të shohim këtë si më poshtë. Më lejoni të shkojnë përpara dhe të hapur disa kodin që është në mesin e kodi burim sotme shembuj. Dhe unë jam duke shkuar për të shkuar përpara dhe të hapur lart, le të themi, krahasuar-0.c. Ky është një program që do buggy për të realizuar si më poshtë. Së pari. Unë jam duke shkuar për të thënë diçka. Atëherë unë jam duke shkuar për të shkuar përpara dhe të marrë një varg nga përdoruesi në atë linjë të ardhshëm. Atëherë unë jam duke shkuar për të thonë se ai përsëri. Atëherë unë jam duke shkuar për të marrë një tjetër string nga përdoruesi. Dhe vini re, unë jam duke treguar një vargjet në një ndryshore të quajtur s, dhe një tjetër i këtyre frazave në një ndryshore të quajtur t. Dhe tani unë jam duke shkuar për të kërkuar, shumë arsyeshme, se në qoftë se s barabartë barabartë me t, vargjet janë të njëjta. Ju shtypni të njëjtën gjë. Tjetër, vargjet janë të nuk e njëjta gjë. Pas të gjitha, në qoftë se ne dy input ints, dy chars, dy gjithandej, dy dyshe, çdo i llojet e të dhënave që kemi biseduar rreth deri më tani për të krahasuar ato - kujtoj kemi bërë shumë të qartë një kohë më parë se ju nuk e bëni këtë, sepse një shenjë e vetme është e barabartë natyrisht operatori detyrë. Kështu që do të jetë një bug. Ne përdorim shenjën barabartë të barabartë, të cilat vërtet krahason gjëra për barazinë e vërtetë. Por unë pretendojnë se kjo është buggy. Nëse unë shkoj përpara dhe të bëjë krahasimin zero, dhe pastaj të bëjë dot slash krahasoni zero. Dhe unë lloji në, le të themi, përshëndetje. Dhe pastaj le të thonë hello përsëri. Fjalë për fjalë të njëjtën gjë, kompjuter pretendimet I shtypur gjëra të ndryshme. Tani ndoshta unë vetëm diçka të gabuar. Unë do të shkruash emrin tim këtë kohë. Unë do të thotë, përshëndetje. Hello. Është e ndryshme çdo herë të vetme. E pra, pse është kjo? Çfarë ndodh në të vërtetë nën kapuç? E pra, çfarë ndodh në të vërtetë nën individualitet është string pastaj I shtypur në atë kohë parë, për shembull është fjala hello, natyrisht. Por nëse ne përfaqësojmë këtë nën individualitet, kujtojmë se një varg eshte ne nje rrjet. Dhe e kemi thënë sa më shumë në të kaluarën. Pra, nëse unë tërheqë atë grup si ky, unë jam duke shkuar për të përfaqësuar diçka mjaft ngjashme me atë që ne e bëmë një moment më parë. Dhe nuk ka diçka të vërtetë të veçantë këtu, too. Çfarë u kemi përcaktuar në fundi i çdo varg? Po, kjo zero backslash, e cila eshte vetëm mënyra e përfaqësimit, fjalë për fjalë, 00000000. 0 Tetë BITS në një rresht. Unë nuk e di, sinqerisht, çfarë është pas kësaj. Kjo është vetëm një bandë RAM më shumë brenda e kompjuterit tim. Por kjo është një koleksion. Ne folëm rreth vargjeve të para. Dhe ne zakonisht flasim rreth vargjeve si vendndodhja zero, pastaj një, pastaj dy. Por kjo është vetëm për lehtësi. Dhe kjo është krejtësisht relative. Kur ju jeni në të vërtetë duke marrë kujtesës nga kompjuteri, kjo është sigurisht çdo 2 miliard disa bytes rastësishëm, potencialisht. Pra, me të vërtetë nën kapuç, të gjithë këtë kohë, po. Kjo mund të jetë shumë mirë zero kllapa. Por në qoftë se ju gërmoj edhe më thellë nën kapuç, se me të vërtetë adresuar numrin 123. Kjo është adresa 124. Kjo është adresa 125. Dhe unë nuk e vidhos deri në këtë kohë. Këto janë tani një byte përveç për çfarë arsye? Sa i madh është një char? Një char është vetëm një bajt. Një int zakonisht është katër bytes. Pra, kjo është arsyeja pse unë e bëri atë 123, 127, 131 dhe kështu me radhë. Tani unë mund të mbani matematikë të thjeshtë dhe vetëm të bëjë plus 1. Dhe tani kjo është ajo që është me të vërtetë ndodh në nën kapuç. Pra, kur ju të deklarojë diçka si kjo, string s, kjo është në fakt - ajo rezulton jashtë - yll char. Star, natyrisht, do të thotë adresa, akrep aka. Pra, kjo është adresa e diçkaje. Çfarë është ajo adresa e? Well - Unë jam i vetmi që mund të shihni shumë Pika e rëndësishme që unë jam duke bërë, ose mendojnë Unë jam duke e bërë. Pra string - Gjëja e trishtuar është që unë kam një monitor ka të drejtë ku unë mund të ketë parë se. Të gjithë të drejtë, kështu që string s është ajo Kam deklaruar më parë. Por kjo rezulton, në sajë të një pak magji në bibliotekë CS50, e gjithë kjo string koha ka fjalë për fjalë qenë yll char. Yll përsëri do të thotë akrep ose adresa. Fakti që ajo është flanking Fjala char do të thotë se është adresa e një karakteri. Pra, nëse merrni string thirret, dhe unë lloji në H-E-L-L-O, të propozojë tani ajo ka marrë string qenë fjalë për fjalë kthimit të të gjithë këtë herë, edhe pse ne kemi më tepër thjeshtëzuar botën? Çfarë ka marrë string në të vërtetë kthehet si vlera e saj e kthimit? 123 në këtë rast, për shembull. Ne kemi thënë më parë se të marrë string kthehet thjesht një varg, një sekuencë e karaktere. Por kjo është pak e një gënjeshtër të bardhë. Mënyra të marrë string vërtetë punon nën kapuç është ajo merr një string nga përdoruesi. Ajo plops karaktere që ai ose ajo lloje në kujtesë. Ajo vë një zero backslash në fund e atyre sekuencë të karaktereve. Por atëherë çfarë ka marrë string fjalë për fjalë të kthehen? Është fjalë për fjalë e kthen adresën e bytes më shumë para në RAM që ajo përdoret për atë forcë. Dhe kjo rezulton se vetëm duke u kthyer një adresë e vetme e karakter i parë në varg, që është të mjaftueshme për të gjetur tërësinë e string. Me fjalë të tjera, marrë string nuk kanë për t'u kthyer 123 dhe 124 dhe 125. Ajo nuk duhet të jepni një kohë të gjatë listë e të gjitha bytes që string ime është duke përdorur. Për shkak se një, ata janë të gjithë të kthehet prapa. Dhe dy, bazuar në adresën e parë, unë mund të kuptoj se ku përfundon string. Si? Karakter të veçantë null, backslash zero në fund. Pra, me fjalë të tjera, në qoftë se ju të kalojë përreth - brenda variablave - adresa e një char, dhe ju supozojmë që në fund të çdo varg, çdo Sekuenca e karaktereve si ne njerëzit të mendojnë për vargjet, nëse ju supozojmë se në fund të çdo varg të tillë nuk e një zero backslash, ju jeni të artë. Sepse ju gjithmonë mund të gjeni fundi i nje varg. Tani çfarë po ndodh me të vërtetë, atëherë në këtë program? Pse është ky program, krahasoni-0.c, buggy? Çfarë është në të vërtetë duke u krahasuar? Po? STUDENT: [padëgjueshme]. DAVID Malan: Pikërisht. Ajo është krahasuar vendndodhjet nga vargjet. Pra, nëse përdoruesi ka shtypur në përshëndetje herë, si unë e bëri, kujtesës mund të përfundojnë në kërkim si kjo. Nëse përdoruesi pastaj në lloje Përshëndetje përsëri, por duke telefonuar merrni varg sërish, c është nuk është veçanërisht i zgjuar nëse ju mësoni që ajo të jetë i zgjuar duke shkruar kodin. C - kompjutera dhe më në përgjithësi - në qoftë se ju shkruani në fjalën Përshëndetje përsëri, ju e dini se çfarë ju jeni do të merrni. Ju jeni vetëm do të merrni një rrjet të dytë e kujtesës që, po, ndodh të jetë ruajtjen H-E-L-L-O dhe kështu me radhë. Ajo do të shikojmë të njëjtën gjë na njerëzit, por kjo adresë nuk mund të jetë 123. Kjo mund të ndodhë vetëm në mënyrë që sistem operativ ka disa në dispozicion hapësirë ​​për shembull në vend - le të themi diçka arbitrar, si ky vend është 200. Dhe kjo është vendndodhja 201. Dhe kjo është vendndodhja 202. Ne nuk kemi asnjë ide se ku thats do të jetë në kujtesën. Por çfarë do të thotë kjo është se çfarë është do të ruhen në fund të fundit në s? Numri 123. Çfarë do të ruhen në t, në këtë shembull arbitrare? Numri 200. Dhe të gjithë që do të thotë, atëherë është e qartë, 123 nuk bën të barabartë 200. Dhe kështu kjo nëse kurrë kusht evaluohet në true. Sepse string merrni është duke përdorur të ndryshme chunks e kujtesës çdo kohë. Tani ne mund të shohim këtë përsëri Në një shembull tjetër. Më lejoni të shkojnë përpara dhe të hapur-up kopje 0.c. Unë pohojnë se ky shembull do të provoni - por dështojnë - ta kopjoni dy vargjet si më poshtë. Unë jam duke shkuar për të thënë diçka te te perdoruesit. Atëherë unë jam duke shkuar për të marrë një string dhe e quajti atë s. Dhe tani, unë jam duke bërë këtë kontroll këtu. Ne kemi përmendur këtë përsëri një kohë. Por kur mund të merrni të kthimit null string, një tjetër karakter të veçantë, ose të veçanta Simboli le të themi. Nëse kjo është jashtë kujtesës. Për shembull, në qoftë se përdoruesi është me të vërtetë qenë e vështirë dhe llojet një mizor Numri i karaktereve në tastierë dhe hitet Enter. Në qoftë se numri i karaktereve thjesht nuk mund të përshtaten në RAM për çfarëdo çmendur arsye, mund të merrni edhe string shumë mirë të kthehen null. Ose në qoftë se programi juaj në vetvete është bërë shumë gjëra të tjera dhe nuk është vetëm nuk është kujtesë të mjaftueshme për të marrë string të ketë sukses, Ajo mund të përfundojë up kthyer null. Por le të jenë më të saktë si për të çfarë është kjo. Cili është lloji dhënat e S me të vërtetë? Yll Char. Pra, del tani ne mund të zhvishem mbështesë shtresën e null. Rezulton, null është - po, natyrisht një simbol të veçantë. Por çfarë është ajo me të vërtetë? Really, null është vetëm një simbol që ne njerëzit përdorin për të përfaqësuar zero si. Pra, autorët e C, dhe kompjutera më në përgjithësi, vendosi vjet më parë se, ju e dini se çfarë. Pse nuk kemi siguruar që asnjë përdorues dhënave është kurrë, kurrë, kurrë ruhen në zero mirupafshim? Në fakt, edhe në shembullin tim arbitrare para, unë nuk ka filluar që numëron bytes zero. Unë fillova në një. Sepse e dija që njerëzit në botë kanë vendosur që të rezervoj zero bajt në RAM askujt si diçka e veçantë. Arsye që, në çdo kohë që ju doni të sinjal se diçka ka shkuar keq në lidhje me adresat, ju kthye null - i njohur ndryshe si zero - dhe për shkak se ju e dini se nuk ka asnjë legit të dhëna në adresën zero, në mënyrë të qartë që do të thotë një gabim. Dhe kjo është arsyeja pse ne, nga Konventa, kontrolloni for null diçka dhe kthimi si një në ato raste. Pra, nëse ne lëvizni poshtë për tani, kjo është vetëm pastaj disa kontrolluar gabim, vetëm në rast diçka shkoi keq me [? dorëzani?] krejt dhe mbaro programin duke u kthyer në fillim. Kjo linjë tani mund të rishkruhet si kjo, që do të thotë çfarë? Në anën e majtë, jepni një tjetër tregues për një karakter, dhe e quajti atë t. Çfarë jam unë ruajtjen brenda t, bazuar në këtë vijë një e kodit? Unë jam magazinimin një vend. Konkretisht vend që ishte në s. Pra, nëse përdoruesi ka shtypur në hello, dhe që së pari përshëndetje ndodh të përfundojnë këtu, atëherë numri është 123 do të kthehen nga marrë string dhe të ruhen - siç kemi thënë më parë - në s. Kur unë deklaroj tani një tjetër tregues për një t char dhe e quajti atë, se çfarë numri është fjalë për fjalë do të përfundojë deri në T sipas tregimit? Pra, 123. Pra, teknikisht dhe tani të dy s t janë treguar të saktë chunks e njëjta të kujtesës. Pra, njoftim se çfarë unë jam duke shkuar për të bëni tani për të të provojë se ky program është buggy. Së pari unë jam duke shkuar për të kërkuar, me një f shtypura, kapitalizimin kopje të vargut. Atëherë unë jam duke shkuar për të bërë një pak Error checking. Unë jam duke shkuar për të bërë të sigurt. Le të sigurohemi që t string është në pak më i madh se zero në gjatësi, kështu që ka disa karakter atje që në fakt germa. Dhe pastaj ju mund të kujtojnë këtë nga shembujt e mëparshëm. 2 sipërme - cila eshte ne fotografi ctype.h. T kllapa jep mua zero zero Karakteri i t string. Dhe 2 sipërme të atij të njëjtën vlerë, e Sigurisht, ajo konverton të uppercase. Pra intuitive, kjo theksuar linjë e kodit është kapitalizuar parë letër në t. Por kjo nuk është kapitalizuar, intuitive, shkronja e parë në s. Por nëse ju jeni duke menduar përpara, çfarë jam unë gati për të parë kur kam drejtuar këtë program dhe të shtypura nga të dy origjinale, S, dhe ashtuquajturi kopje, T? Ata janë në të vërtetë do të jetë i njëjtë. Dhe pse janë ata do të jenë të njëjta? Ata janë të dy duke treguar për saktësisht e njëjta gjë. Pra, le ta bëjmë këtë. Bëni kopje zero. Ai përpilon OK. Më lejoni të kandidojë zero kopje. Më lejoni të shkruani diçka si përshëndetje në të gjitha vogle pastaj goditi Enter. Dhe ajo pretendon se të dy s origjinale dhe me të vërtetë janë kopje identike. Pra, çfarë ndodhi me të vërtetë këtu? Më lejoni shlyen këtë foto vetëm për të treguar historinë në një mënyrë paksa të ndryshme. Çfarë ndodh në të vërtetë nën individualitet kur unë deklaroj diçka si nisje s, apo string s, Unë jam duke marrë një pointer - i cili ndodh të jetë katër bytes në aplikim CS50 dhe në një shumë prej kompjuter. Dhe unë jam duke shkuar për të thirrur këtë s. Dhe kjo ka aktualisht disa vlera panjohur. Kur ju të deklarojë një ndryshore, nëse ju veten të vënë një vlerë atje, i cili e di se çfarë është atje. Kjo mund të jetë disa sekuenca të rastit të bit nga ekzekutimi mëparshëm. Pra kur unë, në linjën time të kodit do të merrni string, dhe pastaj dyqan kthimin Vlera në s merrni varg disi - dhe ne përfundimisht do të zhvishem mbrapa se si të merrni Punimet varg, disi alokon një array që ndoshta duket pak si kjo. H-E-L-L-O, backslash zero. Le të supozojmë se kjo është adresa 123 vetëm qëndrueshmëri të parë. Pra, të marrë të kthimit string, në theksuar linjë atje, ajo kthehet Numri i thamë, 123. Pra, çfarë me të vërtetë shkon brenda s këtu? E pra, çfarë me të vërtetë shkon brenda S eshte 123. Por, sinqerisht, unë jam duke marrë një pak hutuar nga të gjithë këto adresa, të gjithë këtyre numrave arbitrare. 123, 124, 127. Pra, le të vërtetë të thjeshtojë botën një pak. Kur ne flasim për pointers, sinqerisht, për të ne njerëzit, i cili dreq kujdeset ku gjërat janë në kujtesën? Kjo është krejtësisht arbitrare. Ajo do të varet nga sa sa RAM përdorues ka. Ajo do të varet kur në ditën e ju drejtuar programin, ndoshta, dhe çfarë input përdorues ju jep. Jemi ndalur në detaje të parëndësishme. Pra abstrakte le larg dhe thonë se, kur ju drejtuar një linjë e kodit si kjo, char yll s merr kthimin Vlera e vargut të merrni. Pse nuk kemi vend vetëm barazim ajo që ne mbani duke e quajtur si një tregues pse kjo është duke vënë në diçka? Kështu që unë tani që pretendojnë s up nuk eshte nje kursori - nën kapuç është një adresë. Por kjo është vetëm për të treguar bajt parë në string që është kthyer. Nëse unë tani kthehet në kodin këtu, çfarë po ndodh në këtë linjë? E pra, në këtë linjë theksuar tani, Unë jam deklaruar me sa duket një tjetër ndryshore të quajtur T. Por kjo është gjithashtu një tregues, kështu që unë jam duke shkuar për të nxjerrë atë si, në teori, e saktë kuti të njëjtën madhësi. Dhe unë jam duke shkuar për të thirrur atë t. Dhe tani, nëse ne do të shkojmë përsëri në kodin përsëri, kur kam ruajtur brenda s t, Çfarë jam unë teknikisht vënë brenda t? E pra teknikisht, kjo ishte numri 123. Kështu që unë me të vërtetë duhet të jetë me shkrim 123 numri atje. Por le të marrë atë nivel më të lartë. t, në qoftë se ajo është vetëm një akrep, intuitivisht, është vetëm se. Kjo është e gjitha kjo është të jesh ruhen në atje. Deri tani në linjat e fundit interesante e kodit, kur unë në fakt të shkuar në lidhje kapitalizimin karakterin zero në t, çfarë po ndodh? E pra, t kllapa zero tani është vënë në për çfarë karakteri, me sa duket? Është treguar për h. Sepse t kllapa zero - kujtoj, kjo është sintaksa e vjetër. T kllapa zero thjesht do të thotë në qoftë se është një varg t, t parantezë zero do të thotë marrjen zero karakteri në atë forcë. Pra, ajo që me të vërtetë do të thotë është të shkoni në këtë grup - dhe po, kjo mund të jetë 123, kjo mund të jetë 124. Por kjo është e gjitha relative, mos harroni. Sa herë që flasim për një grup, ne kemi Përparësia e duke folur rreth Indekset e të afërm. Dhe kështu që tani që ne vetëm mund të supozojmë se zero grupim t eshte h. Pra, nëse unë e quaj 2 sipërme në atë, se çfarë është vërtetë duke bërë është kapitalizuar h vogle të uppercase H. Por sigurisht, çfarë është s? Është vënë në vargun e njëjtë mallkuar. Pra, kjo është e tëra që është duke ndodhur në këtë kod deri tani. Pra, çfarë është atëherë implikimi? Si nuk kemi zgjidhur këto dy probleme? Si nuk kemi të krahasohet me vargjet aktuale? E pra intuitive, si do ju shkoni në lidhje me krahasimin e dy strings për barazinë e vërtetë? Çfarë do të thotë në qoftë se dy vargjet janë të barabartë? Në mënyrë të qartë nuk është se adresat e tyre janë barabartë në kujtesë, sepse kjo është një ulët Zbatimi nivel detaji. Të gjitha personazhet janë të njëjta. Pra më lejoni të propozojnë, dhe më lejoni të prezantoj në versionin e një compare.c këtu, kështu që krahasojnë-1.c. Më lejoni të propozoj që ne ende të marrë një pointer quajtur s, dhe dyqan në atë kthejë vlerën e vargut të merrni. Le të bëjmë të njëjtën gjë me t. Pra, asnjëri prej kodit është e ndryshme. Unë jam duke shkuar për të shtuar një pak më shumë error checking tani. Pra, tani që ne jemi lloj lëkurë mbrapa kjo shtresat në CS50 të asaj që një varg në të vërtetë është, ne duhet të jetë më anal lidhje me bërjen e sigurt se ne nuk e abuzimit vlerat e pavlefshme si null. Kështu që unë jam vetëm duke shkuar për të kontrolluar. Nëse s nuk nul barabartë dhe t nuk null barabartë, që do të thotë ne jemi OK. Get string nuk vidhos deri në marrjen e secila prej këtyre frazave. Dhe ju mund ndoshta me mend tani, çfarë STR CMP nuk duket të bëjë? String krahasuar. Pra, nëse ju keni programin në Java përpara, kjo është si të metodës barabartë në klasa string. Por për ato prej jush që nuk kanë programuar më parë, kjo është vetëm një funksion c. Kjo ndodh për të ardhur në një file i quajtur string. Kjo është ku është deklaruar. Dhe string krahasoni - Unë në fakt harroj përdorimin e saj, por mos u mërzit se. Kujtojnë se ne mund të bëjmë Njeriu, llokoçis krahasuar. Dhe kjo do të sjellë deri Linux programuesit manual. Dhe kjo është, sinqerisht, pak fshehtë. Por unë mund të shoh këtu se, yep. Unë duhet të përfshijë string. Dhe ai thotë se këtu sipas përshkrimit, " Krahaso string funksion krahason dy vargjet S1 dhe S2. "Dhe S1 dhe S2 janë me sa duket dy Argumentet kaloi in Unë vërtetë nuk e mbani mend se çfarë const është, por tani vini re - dhe ju mund të keni parë këtë tashmë kur ju keni përdorur faqet e njeri në qoftë se ju kanë të gjitha - se ylli char është vetëm sinonim me vargun. Pra, ajo krahason dy vargjet, S1 dhe S2, dhe ajo kthen një numër të plotë më pak se ose e barabartë me ose më e madhe se zero nëse S1 është gjetur, gjegjësisht të jetë më pak se, ose përputhen, ose të jetë më i madh se S2. Kjo është vetëm një mënyrë shumë kompleks i thënë: se string krahasoni kthimit zero nëse dy vargjet janë intuitive identike, karakteri për karakter për karakter. Ajo kthen një numër negativ, nëse s, sipas renditjes alfabetike, është menduar që do të vijnë para t. Ose kthen një numër pozitiv nëse s është menduar të dalë pas t sipas rendit alfabetik. Pra, me këtë funksion të thjeshtë, mund të ju, për shembull, një lloj bandë e tërë e fjalëve? Pra, në këtë version të ri, unë jam duke shkuar të shkojnë përpara dhe të bëjë compare1. Dot slash krahasoni një. Unë do të shkruani në përshëndetje në të gjithë rastin më të ulët. Unë jam duke shkuar për të shkruani në përshëndetje në të gjitha shkronja jokapitale përsëri. Dhe fatmirësisht tani ajo realizon I shtypur të njëjtën gjë. Ndërkohë, në qoftë se unë të shkruani në përshëndetje në më të ulët Rasti dhe HELLO në rast sipërme dhe krahasojnë ato, unë shtypur gjëra të ndryshme. Sepse jo vetëm që janë adresat të ndryshme, por ne jemi të krahasuar karaktere të ndryshme përsëri dhe përsëri. E pra le të shkojë dhe të rregullojmë një Problemi tjetër tani. Më lejoni të hapë një version të kopje, e cila tani drejtohet kjo çështje si më poshtë. Dhe kjo po ndodh që të shohim pak më komplekse. Por në qoftë se ju mendoni se çfarë problemi ne nevojë për të zgjidhur, shpresojmë se kjo do të jetë qartë në një moment të vetëm tani. Pra, kjo linjë e parë, char fillim t, në kushtet e laik dikush mund të propozojë Çfarë kjo do të thotë vija këtu? Char yll t, çfarë është se duke bërë? Mirë. Krijo një tregues për disa spot në kujtesë. Dhe më lejoni të përsosin atë pak. Deklarojë një ndryshore që do të shtie adresa e disa char në kujtesë, vetëm të jetë pak më e duhur. OK, kështu që tani në anën e djathtë, unë kam parë kurrë një prej këtyre funksioneve para, malloc. Por çfarë mund të thotë kjo? Ndarja e kujtesës. Memory ndarja. Pra, ajo rezulton, deri tani, ne nuk kanë me të vërtetë kishte një mënyrë e fuqishme për duke i kërkuar sistemit operativ, jepni disa kujtesës. Përkundrazi, ne tani kemi një funksion të quajtur malloc që bën pikërisht këtë. Edhe pse kjo është pak e një çmenduri tani, vini re se në mes dy kllapa është vetëm do të jetë një numër. Ku e kam shtypur në fjalë Shenjat mund të jetë një numër. Dhe ky numër do të thotë, më jepni 10 bytes. Më jepni 20 bytes. Më jep 100 bytes. Dhe malloc do të bëjë çmos për të pyesni e sistemit operativ - Linux, në këtë rast - hej, janë 100 bytes tyre e RAM në dispozicion? Nëse është kështu, kthehen ato bytes për mua nga kthimin adresën e së cilës e ato bytes, ndoshta? Shumë të parë një. Pra, edhe këtu - dhe kjo është mbizotërues C, në çdo kohë që ju jeni që kanë të bëjnë me adresat? Ju jeni pothuajse gjithmonë kanë të bëjnë me adresa e parë e tillë, pa marrë parasysh sa e madhe një copë e kujtesës që ju janë duke u dorëzoi prapa, kështu që të flasin. Pra, le të zhyten në diskutim këtu. Unë jam duke u përpjekur të ndajë se si bytes shumë, saktësisht? Well. Gjatësia e String s - le të bëjë një shembull konkret. Nëse s eshte Përshëndetje, H-E-L-L-O, ajo eshte Gjatësia e string s, natyrisht? Pra, kjo është pesë. Por unë jam duke bërë një plus 1 në atë, pse? Pse nuk dua gjashtë bytes në vend të pesë? Karakteri null. Unë nuk dua të lë jashtë kësaj karakter të veçantë null. Sepse në qoftë se kam bërë një kopje të Përshëndetje dhe vetëm të bëjë H-E-L-L-O, por unë nuk e vënë që karakteri i veçantë, kompjuter nuk mund të ketë, rastësisht, një backslash zero aty për mua. Dhe kështu që në qoftë se unë jam duke u përpjekur të kuptoj se Gjatësia e kopjes, unë mund të mendojnë se kjo është 20 karaktere të gjatë, ose një milion karaktere të gjatë në qoftë se unë kurrë nuk ndodhë vetëm për të goditur një zero backslash. Pra, ne kemi nevojë për gjashtë bytes për të ruajtur H-E-L-L-O, backslash zero. Dhe pastaj kjo është vetëm të jetë super anal. Le të supozojmë se unë të harrojmë se çfarë madhësinë e një char eshte. Ne mbajmë duke thënë se ajo e një bajt. Dhe ajo zakonisht është. Në teori, kjo mund të jetë diçka ndryshëm, në një Mac ndryshëm ose një PC të ndryshme. Pra, ajo rezulton se ka ky operator quajtur sizeof se në qoftë se ju të kalojë atë të emri i një lloji të dhënave - si char, ose int, ose float - ajo do të ju them, dinamike, sa bytes një char merr deri në këtë kompjuter veçanti. Pra, kjo është në mënyrë efektive vetëm si duke thënë herë 1 apo herë asgjë në të gjitha. Por unë jam duke bërë atë vetëm të jetë super anal, vetëm në rast se një char ndryshon në kompjuterin tuaj kundrejt minave, në këtë mënyrë matematikë është gjithmonë do të shikoni. Së fundi, këtu poshtë unë kontrolloni for null, e cila është gjithmonë një praktikë e mirë - përsëri, çdo herë që ne jemi që kanë të bëjnë me pointers. Nëse malloc nuk ishte në gjendje të japin mua gjashtë byes - e cila është nuk ka gjasa, por vetëm në rast - kthehen një menjëherë. Dhe tani, të shkojnë përpara dhe kopje string si më poshtë. Dhe kjo është sintaksë e njohur, megjithëse në një rol të ndryshëm. Unë jam duke shkuar për të shkuar përpara dhe për të marrë string Gjatësia e s dhe ruajtur atë në n. Atëherë unë jam duke shkuar për të iterate nga i barabartë zero deri tek e përfshirë n, më e madhe se ose e barabartë me. Kështu që në çdo përsëritje, kam vënë Karakteri i ith s në ith Karakteri i t. Pra, çfarë ndodh në të vërtetë nën individualitet këtu? E pra, nëse këtë, për shembull, është s - dhe kam shtypur ne fjale H-E-L-L-O dhe ka një backslash zero. Dhe përsëri, kjo është s vënë këtu. Dhe tani këtu është t. Dhe kjo është treguar tani për një kopje e kujtesës, e drejtë? Malloc ka dhënë mua një e tërë copë e kujtesës. Unë nuk e di fillimisht se çfarë është në ndonjë nga këto vende. Kështu që unë jam duke shkuar për të menduar këto si një bandë e tërë e pikëpyetjesh. Por, sa më shpejt që unë të fillojë looping nga zero on deri me gjatësinë e ve, t parantezë zero dhe t kllapa 1 - dhe unë do të vënë këtë tani në të sipërm - t parantezë zero dhe s kllapa zero do të thotë që unë jam duke shkuar për të kopjimit iteratively h këtu, E-L-L-O. Plus, sepse unë e bëri plus 1, backslash zero. Deri tani në rastin e krahasoni-1.c, në fund, në qoftë se unë të shtypura nga kapitalizimi i t, ne duhet shihni se s është i pandryshuar. Më lejoni tani të shkojnë përpara dhe të bëjë këtë. Pra, të bëjë copy1. Dot slash copy1. Unë jam duke shkuar për të shkruani në hello, Enter. Dhe tani vini re, vetëm një kopje e është kapitalizuar. Sepse unë me të vërtetë kam dy chunks e kujtesës. Për fat të keq, ju mund të bëni disa goxha gjëra të këqija dhe shumë e rrezikshme këtu. Më lejoni të tërheq lart një shembull këtu tani, që na jep një shembull të një pakice linja të ndryshme. Pra, vetëm intuitive këtu, rreshti i parë e kodit, int x yll, është deklaruar një ndryshore të quajtur x. Dhe çfarë është lloji i të dhënave e asaj variable? Çfarë është lloji i të dhënave që variable? Kjo nuk ishte cliffhanger. Lloji i të dhënave është ylli int. Pra, çfarë do të thotë kjo? X do të ruajtur adresën e një int. Thjeshtë si ajo. Y është duke shkuar për të ruajtur adresa e një int. Çfarë është linjë e tretë e kodit bërë atje? Është e ndarjes sa bytes, ka shumë të ngjarë? Katër. Për shkak të madhësisë së një INT përgjithësisht katër, malloc nga katër jep mua mbrapa adresën e një copë të kujtesës, e parë e të cilit është bytes ruajtur tani në x. Tani ne jemi duke lëvizur pak më shpejt. Star x çfarë do të thotë? Kjo do të thotë të shkojnë në atë adresë dhe e vënë atë numër atje? Vendos numrin 42 atje. Star y do të thotë të shkojnë në atë që është në y dhe të vënë numrin 13 atje. Por, prit një minutë. Çfarë është në y në këtë moment? Cila është adresa ruajtjen y? Ne nuk e dimë, e drejtë? Ne kurrë nuk kanë përdorur një herë detyrën Operatori përfshin y. Pra, si y deklaruar në rreshtin e dytë të Kodi është vetëm disa vlera plehrash, një i madh pikëpyetje në mënyrë që të flasin. Kjo mund të jetë duke treguar rastësisht me çdo gjë në memorie, e cila është përgjithësisht e keqe. Pra, sa më shpejt që ne e goditi atë vijë atje, yll y barabartë me 13, diçka të keqe, diçka shumë e keqe është në lidhje të ndodhë me Binky. Pra, le të shohim se çfarë do të përfundojë deri ndodh me Binky këtu në këtë minutë ose kështu duket. [Video playback] -Hej, Binky. Zgjoheni. Është koha për argëtim akrep. -Çfarë është ajo? Mësoni rreth pointers? Oh, goodie. -E pra, për të filluar, unë mendoj se ne jemi do të duhet një pointers çift. -OK. Ky kod ndan dy pointers cilat mund pikë të numrave të plotë. -OK, mirë, unë shoh dy pointers. Por ata nuk duket të jetë duke treguar për asgjë. -Kjo është e drejtë. Fillimisht, pointers nuk tregojnë për ndonjë gjë. Gjërat që ata tregojnë për të quhen pointees, dhe vendosjen e tyre up është një Hapi i veçantë. -Oh, e drejtë, e drejtë. Unë e dinte se. Të pointees janë të ndara. Pra, si mendoni ju akordojë një pointee? -OK. E pra, ky kod alokon një integers reja pointee, dhe kjo pjesë përcakton X të tregojnë për atë. -Hej, ajo duket më mirë. Pra, të bëjë atë të bëjë diçka. -OK. Unë do dereference x pointer për të ruajtur numri 42 në pointee saj. Për këtë mashtrim, unë do të duhet magjinë time shkop magjik i dereferencing. -Juaj shkop magjik i dereferencing? Uh, kjo është e madhe. -Kjo është ajo që duket si kodi. Unë vetëm do të ngritur numrin, dhe - -Hej, shikoni. Ka ajo shkon. Pra, duke bërë një x dereference në vijim arrow për të hyrë pointee saj. Në këtë rast, për të ruajtur 42 në atje. Hej, provoni duke e përdorur atë për të ruajtur numrin 13 përmes treguesin tjetër, y. -OK. Unë do të shkoj vetëm mbi këtu për y dhe marrë numrin 13 ngritur. Dhe pastaj të marrë shkopin e dereferencing dhe vetëm - Whoa! -Oh, hej. Që nuk punojnë. Thuaj, Binky, unë nuk mendoj dereferencing y është një ide e mirë, sepse ngritjen e pointee është një hap i veçantë. Dhe unë nuk mendoj se ne ndonjëherë e bëri atë. -Hmm. Mirë pikë. -Po, ne kemi ndarë y akrep. Por kurrë nuk kemi vënë atë në pikës te nje pointee. -Hmm. Shumë i vëmendshëm. -Hej, ju jeni në kërkim mirë atje, Binky. Mund të ma rregulloni atë në mënyrë që pika y për të pointee njëjtë si X? -Sigurisht. Unë do të përdorin shkop magjik e mia pointer detyrë. -Është se do të jetë një problem si më parë? -Nr. Kjo nuk do të prekë pointees. Ajo ndryshon vetëm një tregues për pikë të njëjtën gjë si një tjetër. -Oh, unë shoh. Tani pika y në të njëjtin vend si x. Pra, të presim. Tani y është fikse. Ajo ka një pointee. Kështu që ju mund të përpiquni të shkop magjik i dereferencing përsëri për të dërguar më shumë se 13. -OK. Këtu shkon. -Hej, shikoni në atë. Tani dereferencing punimet për y. Dhe për shkak se janë për ndarjen e pointers se një pointee, ata të dyja shihni 13. -Po. Sharing. Çfarëdo. Pra jemi duke shkuar vende ndërroni tani? -Oh, shikoni. Ne jemi jashtë kohës. -Por - -Vetëm mos harroni të tre Rregullat akrep. Numri një, struktura bazë është se ju keni një pointer. Dhe ajo tregon mbi te nje pointee. Por, akrep dhe pointee janë të ndara. Dhe gabim i përbashkët është që të ngritur një tregues, por për të harrojnë për të dhënë një pointee. Numri dy, dereferencing akrep fillon në treguesin e saj dhe ndjek mbi shigjetë për të hyrë pointee saj. Siç e dimë të gjithë, kjo punon vetëm në qoftë se ka eshte nje pointee, që merr mbrapsht tek sundojnë një numër. Numri tre, caktimi akrep merr një akrep dhe ndryshimet që ajo të çojnë tek pointee njëjtë si një tjetër tregues. Pra, pas cedimit, dy pointers do pikë të pointee njëjtë. Ndonjëherë kjo quhet sharing. Dhe kjo është e gjitha nuk është për atë, me të vërtetë. Bye bye tani. [VIDEO END rishikim] DAVID Malan: Pra, më shumë pointers, Binky më shumë në javën e ardhshme. Ne do të shohim ju në hënën.