[Muzika] DAVID J. Malan: Kjo është si një seminar fillestar sot. NE RREGULL. Pra, shumë shi jashtë. Kjo ka tendencë të ndodhë të mërkurën, por të gjithë më shumë mundësi e për pyetje sot. Pra, le të vihem në fakt me filmin në një moment të vetëm. Por ne do të fillojmë grandly si gjithmonë. Kjo është CS50, dhe kjo është fundi i javës 4. Pra, nëse ju keni shikuar ndonjëherë TV ose një film ku ka disa ekspertë të kompjuterit dhe policia, apo FBI, ose ndonjë agjenci është duke u përpjekur për të kapur disa kundërshtar, pra, ju keni ndoshta dëgjuar shprehjen "të rritur" ku se tekniku disi magjike zooms në pafundësisht larg për të parë kriminelët identitetit ose numrin targë në edhe shimmer e një pasqyre ose shkëlqim i syrit dikujt. Pra me të vërtetë, le të marrin një vështrim në disa skena të tilla nga Hollywood. [VIDEO rishikim] -OK, Tani le të marrë një sy të mirë në ju. -Mbaje. Run atë prapa. -Prit një minutë. Shkojnë drejtë. -Nuk, Ngrijë atë. -Ekran i plotë. -OK, Ngrijë atë. -Tighten Deri në atë, do ju? -Vector Në më se djalë nga rrota e pasme. -Zoom Në të drejtë këtu në këtë vend. -Me Pajisje të drejtë, imazhi mund të zgjerohet dhe të mprehur. -Cfare eshte kjo? -Ajo Është një program zgjerimin. -A Mund të qartë se deri ndonjë? -Une nuk e di. Le të rritur atë. Seksioni A6 -Enhance. -Unë Zgjeruara detaje, and-- Unë mendoj se ka të mjaftueshme për të rritur, lirimin e tij në ekranin tim. -Unë Zgjeruara reflektimin në sytë e saj. -Le E drejtuar këtë përmes zgjerimin Video. -Edgar, Mund të rrisë këtë? -Mbahu. -Ve Qenë duke punuar në këtë reflektim. Reflektim -Someone së. -Reflection. -Nuk Është një pasqyrim i fytyrës së njeriut. Reflektim -The. -Nuk Është një reflektim. -Zoom Në në pasqyrë. -Ju Mund të shihni një reflektim. -Mund Të përmirësuar imazhin nga këtu? -Mund Të rritur atë të drejtë këtu? -Mund Të rritur atë? Mund ta rritur atë? -Mund Kemi rritur kjo? -Mund Të rritur atë? Qëndroj në një të dytë, unë do të rritur. -Zoom Në në derë. -Times 10. -Zoom. -Leviz. -Më Shumë. -Wait, Të ndaluar. -stop. -Pause Atë. Na -Rotate 75 gradë rreth vertikale, ju lutem. -stop. Kthehu mbrapa në pjesën përpara derës, përsëri. -Got Një enhancer imazhit që mund të bitmap? Hej, ndoshta ne mund të përdorni Pradeep Metodë sen për të parë në dritare. Software -Kjo është shtet i artit. -The Eigenvalue është off. -Me Të djathtë Kombinimi i algorithm-- Eliminimi marrë -Ai-së algoritme në nivelin e ardhshëm, dhe unë mund t'i përdorë ato për të rritur këtë fotografi. -Lock Mbi dhe zgjeruar aks-z. -Enhance. -Enhance. -Enhance. -Freeze Dhe të rritur. [END rishikim] DAVID J. Malan: Të gjithë të drejtë, kështu që të gjithë ata në të vërtetë janë fjalë. Ata janë vetëm duke lidhur së bashku në një mënyrë që nuk është në të vërtetë të ndjeshme. Dhe, në fakt, CS50 dhe kurse si ajo tenton të prish një shumë të TV dhe filma për ty. Sepse kur këto ekspertët e kompjuterave janë të vrullshëm jashtë termat dhe duke thënë: gjëra të dashuroj si eigenvectors, dhe z-aks, dhe çdo numër të tjetër në fakt terma më teknike, ata janë me të vërtetë vetëm stringing fjalë së bashku të gjithë shumë shpesh. Është se një nga shpresat tona është se, si një efekt anësor i kurseve të marrjes si kjo, do të më shumë njerëz në Bota në fakt të jetë në gjendje për të peshojnë në dhe vetëm ndonjëherë në mënyrë pak të ndikojnë në cilësia dhe saktësia e këtyre filmave? Në fakt, le të marrin një vështrim në realitet. Kështu që këtu është foto stafi i Mary, një nga miqtë tanë të mësimdhënies. Dhe mendoj se ajo është dyshuar për diçka. Dhe megjithatë, ka një dritëz e disa pjesë të provave në sytë e saj, ose në reflektimin e syze të saj. E pra, në qoftë se ne bëjmë pikërisht si filmat propozojë, ku ne zoom dhe "rritur", kjo është se si shumë informacion është në fytyrën e Marisë kur ju të kapur një imazh me këtë rezolutë origjinale. Dhe, në fakt, ju mund të shihni këto pika. Dhe këto janë ato që janë quajtur pixels, P-I-X-E-L-S, e cila është vetëm një katror në mënyrë tipike kjo është një pikë që përbënë një imazh. Dhe mbrapa në ditë, dhe në fakt edhe sot me disa nga LED TV sotme ose TV LCD, në qoftë se ju keni marrë një në dhomën tuaj ose në shtëpi, në qoftë se ju shkoni deri super të afërt me të, dhe sidomos nëse është një TV disi më të vjetër, ju ndoshta mund të shihni edhe këto pika dhe kjo është ajo që kompozoj një imazh. Dhe nuk ka më informacion se sa kjo. Ne mund të "rritur", në kuptimin e zbutjen gjëra mbi dhe lloj inferring lloj, lloj i asaj që ngjyra duhet të jetë tjetër për syrin e Marisë në mënyrë që ajo nuk është në fakt aq pixelated. Por në qoftë se unë mbaj zooming në, atje është djalë i keq në sytë e saj. Si kjo është e gjitha informacion ne kemi. Ju nuk mund të krijoni informacion nga asgjëja. Ka vetëm një i caktuar Numri i bit atje. Pra, në problemit Set 4, ku ju keni një mundësi për të luajtur me këtë lloj bote. Në Problem Set 4, ju do të eksplorojnë Bota e grafika, dhe mjekësinë ligjore, dhe në fakt shkruani kodin që rimëkëmbet imazhe humbur. Ju do të shkruani kodin që manipulon imazhe ekzistuese dhe në fund të fundit e kuptojnë se çfarë është ndodh nën kapuç. Dhe, ajo rezulton, është e vërtetë jo të gjitha që e komplikuar. Për shembull, në qoftë se ne të kërkuar për përfaqësojnë një fytyrë smiley ku me këto pixels zeza, ose këto pika të zeza, mirë, ne mund thjesht të përfaqësojë ata si të vërtetë një bitmap. Dhe në qoftë se ju kishte dëgjuar ndonjëherë që bitmap shprehje, ndoshta ajo tani fillon për të bërë një pak më shumë kuptim sot. Ne tashmë e dimë se çfarë është pak. Kjo është 0 ose 1. Dhe një hartë është vetëm diçka si një copë letër që ju jep udhëzime dhe ka ndoshta një rrjet i x- dhe Y-koordinatat. Kështu që këtu është një bitmap. Kjo është një hartë e BITS ku një 1 është me sa duket do të përfaqësojnë një piksel bardhë dhe a 0 do të përfaqësojë një pixel zi. Por ne me siguri mund të rrokullisje atë rreth. Kjo nuk ka rëndësi aq përderisa ne jemi në përputhje. Dhe këtu është se si, në binary-- brenda e kujtesës një kompjuter, apo edhe brenda e një skedar në hard tuaj drive-- mund të ruajë thjeshte e imazheve fytyrë smiley. Por ne çfarë jemi, natyrisht, mungon në këtë imazh? Ngjyra, e drejtë? Është një hap i qartë tjetër ose zgjerimin për të përmirësuar këtë me ngjyra. Pra, për fat të keq me vetëm një të vetme bit, 0 ose 1, ne mund të përfaqësojë ngjyrë. Kjo mund të jetë e kuqe, ose blu, ose zi, ose të bardhë, ose të gjelbër, apo rozë, ose ndonjë palë e ngjyrave. Por, për hir të thjeshtësisë, ne do të vetëm të supozojmë zezë dhe e bardhë. Pra, ajo që logjikisht nuk kemi nevojë në qoftë se ne duan të zbatojnë ngjyrë në një imazh? Çfarë duhet të bëjmë? Ashtu si në qoftë se faktor kufizues këtu është se me një pak ju mund vetëm përfaqësojnë dy shtete, 0 ose 1, e bardhë apo i zi, çfarë ju doni të bëni? Audienca: Më shumë të dhëna. DAVID J. Malan: Më bit, vërtet më shumë të dhëna, shumë bit. Dhe, me të vërtetë, kjo është pikërisht se si Imazhet ngjyra janë të përfaqësuara. Në vend se të përdorin një grimë të vetme, një 0 ose 1 për çdo piksel, secili pikë, ju vetëm përdorni shumëfish. Ndoshta përdorin 8, ndoshta, më së shpeshti përdorin 24, dhe në të vërtetë, në problemit Set 4, do të luajë me një fotografi format që përdor 24 bit në mënyrë tipike. Por shumica prej jush ndoshta janë njohur me JPEG. Nëse ju keni marrë ndonjëherë një foto në telefonin tuaj, ose ngarkuar apo parë diçka në Facebook, apo Flickr, ndonjë numër faqet e internetit foto-bazuar, ju keni ndoshta shihet një imazh JPEG para. Dhe kjo rezulton, ky është skedari format ne jemi duke shkuar për të përdorur në pset 4, ku ju do të jeni duhet të shërohen imazhe që unë e kam fshirë aksidentalisht nga një kartën e kujtesës korruptuar në kamera, nëse ju do. Dhe kjo rezulton se edhe pse JPEG është shumë sophisticated-- është shumë më e sofistikuar se pika të zeza dhe të bardha ne pamë një moment më parë, sepse nuk ka Algoritme fakt dashuroj se janë përdorur për të compress një JPEG, kështu që ju mund të ketë një të vërtetë e bukur, foto cilësisë por duke përdorur relativisht pak bit. Dhe ne do të kthehen në compression para se të gjatë. Ajo rezulton se i pari tre bytes në një image-- JPEG pa marrë parasysh se çfarë ju keni marrë një fotografi of-- janë vlerat 255, 216, 255. Me fjalë të tjera, në qoftë se ju vetëm shohim se modeli i bit, përfaqësuar këtu si tre bytes, ose 24 bit gjithsej, me probabilitet të lartë ju mund të konkludoj se jeni duke kërkuar në të këtë tre e parë bytes e një JPEG. Dhe kjo është ajo që është e njohur si nënshkrimin e një JPEG. Një shumë e file formats atje kanë tendencë për të filluar me modele të caktuara të 0s dhe 1s, kështu që Windows dhe Mac OS, dhe iOS, dhe Android di se çfarë lloj të dosjes ata janë, përveç të ashtuquajturës fotografi extension se një shumë e dosjeve kanë. Nëse keni .jpg, kjo është një tjetër çelës në kompjuter. Pra, le të shohim tani në këtë pak më teknikisht. Ne e dimë decimal Sistemi është 0 deri 9. Ne e dimë binar është 0 dhe 1. Dhe në qoftë se ju mendoni përsëri në pset 0, kemi pasur të luftoj me të, për një pak, diçka quajtur heksadecimal, ku ju keni 16 shifra, në vend të 10, ose në vend të 2. Dhe këto shifra, nga konventa, janë 0 deri 9 dhe pastaj a përmes f, ku f përfaqëson çfarë Numri dhjetor, ashtu si një mendje e shëndoshë të shpejtë kontrolloni? Pra, 15. Dhe një duhet të përfaqësojë 10, vetëm nga Natyra e urdhërimin që unë kam dhënë. Kjo është vetëm një konventë arbitrare, por kjo është mjaft standarde. Pra, nëse ne shikojmë në këtë model e tre bytes-- le sapo të fillojë për të parë atë në mënyrë të pajtueshme me sa Shkencëtarët kompjuter në përgjithësi shikoni në dhe të mendojnë për fotografi. Ju me siguri mund të mendoni për fotografi në 0s dhe 1s, dhe dhjetore, por në realitet, ne priren të përdorin binar ose më shumë zakonisht hexadecimal-- prapa nga pset 0. Pra më lejoni të propozojnë se 255, 216, dhe 255 janë vetëm këto modelet e 0s dhe 1s. Dhe ju mund të kontrolloni këtë në qoftë se ju dua të bëjë matematikë nga Javës 0. Por, tani për tani, vetëm të supozojmë se kjo është me të vërtetë e saktë. Kam rishkruar vetëm tre decimal Numrat si tre vlerat binare. Tani ajo që unë jam duke shkuar për të bërë është vetëm të shtoni një hapësirë ​​të bardhë, vetëm për hir të lehtësi leximi së. Dhe vini re, unë jam vetëm duke shkuar për të lëvizur gjërat përveç. Pra, para, pas, para, pas. Unë jam duke bërë asgjë interesante tjetër se vetëm përhapjen gjëra jashtë në mënyrë se njoftimi secili grup i tetë bit është tani dy grupe të katër copa. Kjo është e dobishme për shkak se heksadecimal është veçanërisht në modë sepse çdo shifër heksadecimal 0 përmes f, ose më konkretisht 0 deri 15, mund të përfaqësohet me tamam katër copa. Me fjalë të tjera, në qoftë se ju heksadecimal duan të përfaqësojnë një 0, kjo është vetëm 0000, katër zero. Dhe në qoftë se ju doni për të përfaqësuar 15, është 1111, e cila është katër bit. Dhe në qoftë se ju bëni matematikë, në qoftë se ky është vendi ato, ky është vendi 16s, që do të japë ju, duke filluar në vend që po ndodh to-- keq, në binar, që do të ju jap 15, ato vend, twos vend, katër këmbët dhe tetë vend. Pra më lejoni të propozojë që kjo të vendosur nga katër bit në të majtë është ajo që ne jemi duke shkuar për të thirrur f. Është numri më i madh që mund të përfaqësojnë me katër copa. Dhe ne tashmë e dimë nga heksadecimal, f është shifra më e madhe në heksadecimal. Ne kemi marrë një f atje, dy më shumë atje. Dhe tani për tani, vetëm të marrin në besim që i kam bërë të drejtë të matematikës dhe se gjysma e majtë nga ato pjesë, 1101, është e njëjta gjë si d në heksadecimal. Dhe dora e djathtë, 1000, është vetëm 8. Dhe se një e lehtë për të parë, apo jo? 8 represents-- është e drejtë nën atë vend tetë. Pra, ne kemi një në kolonën e tetë dhe asgjë në katërkëmbëshe, twos apo ato. Deri tani më konvencionale, njerëzit priren për të shkruar shifra heksadecimal si kjo, ju vetëm pllaquris ato së bashku, dhe pastaj ju prefiksit ato me 0x. Kjo do të thotë asgjë tjetër përveç një çelës vizuale në një human-- këtu vjen një value-- heksadecimal sepse ajo nuk mund të ndryshe të jetë e qartë. Që do të thotë, në fund të fundit, që modeli i zero dhe ato, ose modeli i heksadecimal shifrat ekuivalente që ju jeni do të fillojmë të shikojmë për në problemit Set 4 është this-- dhe Problem Set 4 spekulim do të ecin ju përmes kësaj në shumë detail-- por e kupton si lloj misterioze si kjo mund të duket në shikim të parë, ju jeni do të fillojmë të shohim këtë shumë. Dhe në fakt, edhe në GDB, The Rregullues ne kemi prezantuar të hënën dhe Dan fut në pset 3, po shkon për të shpesh të ju tregojnë vlerat heksadecimal vetëm për shkak se ata kanë tendencë të jenë më të konvencionale se dhjetore ose binar në botën e kompjuterëve. Tani le të vënë këtë në kontekst. Shumë nga ju mund të mbani mend këtë foto këtu, i cili erdhi nga çfarë? Vista, kështu që edhe më herët se se, Windows XP e bëri këtë debutimin. Pra, kjo është një peizazh i bukur. Dhe në fakt, në qoftë se ju thes rreth online-- Unë mendoj se është një artikull Wikipedia, ku dikush shumë amazingly doli gjetur këtë vend në botë të ngritur e tij ose të saj në kamera pikërisht place-- drejtë dhe kjo sot duket like-- por kjo është saktësisht e njëjtë vendosjen. Ky imazh, megjithatë, është në një skedar format i quajtur bitmap, b-m-f. Dhe ne jemi duke shkuar për të marrë një super vështrim i shpejtë në çfarë do të thotë. Por bitmap është vetëm një mënyrë të ndryshme të Imazhet përfaqësojnë ende duke përdorur piksele në 0s dhe 1s, në fund të fundit. Por në shikim të shpejtë, ajo ka një nënshkrim më interesante në fillim të file. Kjo nuk është vetëm tre bytes, në vend ka një bandë e tërë e modeleve të bytes që kanë paracaktuara kuptim. Për shembull, diku në Disa bytes para të një imazhi bitmap do të jetë madhësia e image, gjerësia e imazhit, lartësia e imazhit, kështu metadata dobishme, nëse ju do. Informacione të dobishme se Photoshop ose ndonjë grafikë programi ju jeni duke përdorur në fakt mund të intereson. Pra, më shumë për këtë në Problem Set 4, por kjo është vetëm për të thënë se ne fund te ditës të gjitha formatet e skedarëve që ju keni qenë duke përdorur për years-- fotografi Microsoft Word, Numrat fotografi, fotografi Excel, çdo numër i file formats që mund të ketë disa njohur file extension janë vetëm 0s dhe 1s nën kapuç. Dhe njerëzit kanë vendosur çfarë konventat janë, çfarë modelet e 0s dhe 1s përfaqësojnë një Word file kundrejt një file Excel, kundrejt çdo numër të formate të tjera fotografi. Pra, në pset 4, ju do të keni një mundësi për të luajtur me atë. Por çfarë do të thotë të ketë një e strukturës. Kjo është në fakt një Segue bukur tani në C, e cila ka vetëm një çift Karakteristika të tjera që ne nuk kemi shikuar ende. Kjo është një gjuhë mjaft të vogël dhe një nga karakteristikat e bukur rreth C është një struct. Për shembull, në qoftë se ju të kërkuar për represent-- le thonë se ju të kërkuar për të ketë një ndryshore që përfaqëson një student në ndonjë program. Ndoshta ju jeni duke shkruar një kurs programi regjistrimi, ose pazar thelbi mjet, ose diçka të tillë. Cilat janë pjesë e të dhënave të lidhura për një student që vjen në mendje? Si një student është përfaqësuar me çfarë vlerat? Po? Ju keni një emër si një student. Çfarë tjetër bën një student tipik të ketë? Audienca: [padëgjueshme] DAVID J. Malan: Pra, sorry. Audienca: Age. DAVID J. Malan: Një moshë apo ditëlindjen ekuivalente, yep. Çfarë tjetër? Audienca: Numri ID? DAVID J. Malan: Pra, një numër ID, ndoshta një numër telefoni, ndoshta një konvikt, apo shtëpi, apo kolegj, ose diçka të tillë. Çdo numër i pjesëve të dhënave që ju mund të keni në listën tuaj të kontakteve është ajo që mund të përcaktojë një student. Pra, nëse ne të kërkuar për të bërë këtë, në kod, ne mund të bëjmë diçka të thjeshtë si kjo. Ne mund të kemi një program në mënyrë që ka le të themi, int kryesor (i pavlefshëm). Dhe në qoftë se unë dua të përfaqësoj një Studenti unë mund të ketë, për shembull, një varg quajti për këtë student, një varg të quajtur konvikt për këtë student, ndoshta një int quajtur ID për atë student. Dhe për shkak se unë jam duke përdorur string, unë duhet të kthehemi dhe të vënë CS50.h. Ndoshta unë jam duke shkuar për nevojë stdio.h. Pra më lejoni të bëj preemptively ata dhe unë jam do të thërrasë këtë student.c për tani dhe për të shpëtuar këtë. Dhe tani unë mund të bëjë diçka me këto variabla. Dhe ne jemi vetëm duke shkuar për të shkruar se si një koment në pseudo kodi, sepse kjo nuk është interesante çfarë të bëjmë tani për tani. OK, kështu që ky është një program që disi ruan një student. Çfarë unë dua të bëj në qoftë se unë duan për të ruajtur dy studentë? Pra instinkti im i parë do të jetë në rregull, prit një minutë, në qoftë se unë kam një tjetër nxënës pse nuk kam vetëm të bëjë emër string 2, string fjetore 2, id2 int. Dhe ne kemi bërë Gone poshtë këtë rrugë para dhe çfarë ishte zgjidhja jonë për atë që duket të jetë lloj i një paste hackish kopje punë këtu? Audienca: Një grup. DAVID J. Malan: Yeah, ne mund të përdorni një rrjet. E drejtë kjo shumë shpejt bëhet i ngathët. Ju keni për të zgjidhur në mënyrë arbitrare të fillojnë emërtimin gjitha këtyre variablave. Dhe ti, njerëzore, duhet të mbajnë udhë, që korrespondon OK name2 me dorm2 korrespondon me id2. Ajo vetëm bëhet një rrëmujë. Pra, kjo është një shumë më e lehtë, kujtojnë nga disa javë më parë, për të vetëm ka për të quajtur emrat string dhe ndoshta na japin tre prej atyre. Dhe pastaj ndoshta ne kemi dorms string dhe kanë tre nga ata, ose me një konstante, int IDS dhe kanë tre prej atyre. Por edhe tani kjo ndjehet pak i lëngshëm, e drejtë. Ne jemi duke folur për studentët dhe ende Unë jam me të vërtetë u ndalur në nivelin e ulët Detajet e zbatimit. Studenti është një emër dhe një fjetore dhe ID. Pse nuk mundem vetëm të deklarojë një ndryshore quajtur nxënës dhe e quajti ajo s. Dhe në qoftë se unë dua një tjetër student, pse nuk e kam vetëm e quajti atë t. Ose në qoftë se unë dua një bandë e tërë e studentëve, pse nuk e bëjmë unë vetëm thonë se unë kam një klasë të tërë të studentëve, dhe kjo është tre prej tyre. Me fjalë të tjera, pse nuk mund të vij me vetë llojin tim të të dhënave, të quajtur Studentët, brenda së cilës është një emër, është një ID, është një konvikt, është ndonjë numër të fushave të tjera. Dhe kjo rezulton nga ju mund të bëjë pikërisht këtë. Pra, C e ka këtë funksion të quajtur struct. Kjo është një tipar gjuhë që na lejon të bëjmë pikërisht këtë. Unë jam duke shkuar për të shkuar përpara dhe të hapë structs.h ku ne jemi duke shkuar për të parë pas përkufizimit të një studenti. Ajo rezulton - dhe kjo është edhe thjeshtë se ai përfshin një ID një moment më parë. Nëse ju doni të dalë me shtëpi lloji juaj e të dhënave, dhe përveç int, dhe char dhe noton dhe të gjitha këto të tjerët që ekzistojnë, ju mund ta bëni këtë duke fjalë për fjalë shkrim typedef e strukturës, pastaj disa formatimin e teksteve kaçurrel, brenda të cilave ju lista e variablave që ju doni të të lidhen me këto të dhëna të re me porosi shkruani si një emër dhe një konvikt, dhe pastaj pas formatimin e teksteve kaçurrel ju jepni një emër për llojin e ri të të dhënave. Kështu, për shembull, student. Dhe çfarë është e mirë për këtë është se tani nëse ne shikojmë në kodin përkatës, kongresi, i parë së gjithash, është për të vënë këtë në një skedar të quajtur diçka dot h, një header file, të cilat ne nuk kemi filloi duke përdorur veten shumë. Por ne jemi duke shkuar për të filluar duke përdorur mjaft tani. Dhe çfarë mund të bëjmë me këtë, në fund të fundit, në këto pak rreshta të kodit është pikërisht deklaroj se llojin e të dhënave, një student. Dhe tani le të përdorin atë. Unë jam duke shkuar për të shkuar tani në një file i quajtur structs1.c. Dhe le të marrin një vështrim në një Disa karakteristika këtu. Pra gjëra deri këtu është kryesisht të njohur, dhe ne do të të kthehen në atë që nuk është i njohur në një moment të vetëm. Kjo natyrisht është përfshirë timen header file, e cila është e re, si dhe, me përjashtim të pset 3 ku, Recall, ne kemi helpers.h. Kështu që ju mund të kujtojnë helpers.h #include. Pse pse jam unë duke përdorur kuotat në vend të kllapa angled? Kur të zgjedh mes tyre? Pothuajse gjithmonë I duket për t'u përdorur kllapa angled. Dhe pastaj, të gjithë një e papritur për Linja e gjashtë Unë jam duke përdorur kuotat e dyfishtë. Pse mund që të jetë? Po? Audienca: [padëgjueshme] DAVID J. Malan: Kjo është një aktuale, çfarë? Audienca: Kjo është në IDE tuaj. DAVID J. Malan: Yeah, kjo është në IDE time aktuale. Dhe le të mos ndalem në IDE, sepse kjo është vetëm një mjet që unë jam duke përdorur. Kjo është në rrymën e mia Lista, në veçanti. Pra structs.h është dosja ime nuk instaluar në IDE, në sistemin operativ vetvete, por ajo është në directory time aktuale. Pra, konventa është në qoftë se ju doni për të përfshirë vetë dosjen tuaj header, ju vetëm përdorni kuotat e dyfishtë. Çfarë ne e quajmë këtë gjë në Linja 8, në përgjithësi? Kjo është ajo? diçka #define. Kjo paraqet konstanta, e drejtë? Në qoftë se ju dëshironi të keni një Vlera në programin tuaj se ju përdorni një të tërë bandë e herë, kjo është Konventa e mirë për të faktor atë, shpallin atë, me simbolin hash përcaktuar, atëherë, nga konventa, në të gjitha uppercase word-- pse kjo nuk është shumë e nevojshme, por është konventë e njeriut për të përfituar konstante në mënyrë që ata të hidhen jashtë në ju visually-- hapësirë ​​dhe atëherë vlera e ju doni të jetë ekuivalente me emër që konstante së. Jo pikëpresje, por ju thjesht ndjekin këtë model atje. Pra, çfarë jam unë duke bërë në këtë kod aktuale. Pra, le të marrin një vështrim në Programi kryesor këtu. Në përputhje 12 sepse kanë përfshirë structs.h, Unë tani kam magjike në tim dispozicion një tip të ri të dhënave. Unë nuk do të vetëm kanë qasje në int, dhe char, dhe noton, dhe string, dhe blu dhe të tjerët. Unë tani kanë qasje në një lloj i të dhënave të studentëve. Pra, në përputhje 12, unë jam duke kombinuar dy ideas-- një një lloj të dhënave doganore dhe dy, duke përdorur një rrjet. Dhe kështu në këtë program, nëse Unë dua të mbështetur në fakt tre studentë të ndryshme në programin tim, unë thjesht mund të them më jepni një variabël quajtur i studentëve, secila prej të cilave është e studentëve të tipit, të cilat is my lloj të dhënave doganore. Dhe, në veçanti, më jep mua tre prej atyre në grup tim. Pra, tani çfarë bëjmë ne në këtë program? Këtu është vetëm një për lak iterating nga 0 deri në 3, që është për shkak çfarë vlera e studentëve është. Unë jam vetëm duke bërë që përdoruesit më jep emrin e studentit. Dhe pastaj në linjë 17, ne kanë një linjë më së shumti të njohur. Ne kemi mikun tonë të vjetër GetString në të djathtë. Dhe çfarë pjesë e sintaksës është me sa duket i ri, në qoftë se ju nuk keni programuar në C përpara, dhe kurrë nuk kanë përdorur structs? Po? AUDIENCA: The .name. DAVID J. Malan: The .name. Por kjo nuk është shumë e një kërcim, sepse tani studentët kllapa I ju jep studenti i-th. Dhe në qoftë se ju doni të zhyten brenda kësaj strukture, ju përdorni vetëm një periudhë të vetme dhe atëherë emri i variablit brenda, ose prona që brenda ju doni të merrni qasje në. Në mënyrë të ngjashme, atëherë, në qoftë se unë atëherë e nxit përdorues, jepni konvikt e studentit, ju në mënyrë të ngjashme mund të ruajë atë string në variablin konvikt brenda e kësaj strukture studentore. Dhe tani gjërat të merrni një dashuroj pak. Dhe kjo do të shikojmë në ndoshta një shumë shumë shpejt. Por ju do të shihni këtë shumë më tepër në pset 4, kështu që le të vetëm të të shikoj në atë tani. Ajo rezulton se në përputhje me 23 38, çfarë mendoni se unë jam ndoshta duke bërë? Unë e kam hequr komentet për sot, por versioni e kodit online për referencë ka të gjitha komentet. Çfarë mund të duket të jetë bërë? Audienca: Ruajtja skedarin me të gjitha informacioni që përdoruesi ka hyrë. DAVID J. Malan: Yeah, pikërisht, kjo është një mënyrë të re që ne jemi duke parë dy, Një tjetër tipar i C, ku unë mund të krijojë fotografi mia. Deri më tani, pothuajse çdo program ju keni shkruar është pa shtetësi. Sa më shpejt që është bërë punë, kjo është ajo. Nuk ka asnjë kujtim apo kujtesë e saj. Nuk ka asnjë skedar ruajtur. Por në qoftë se ju nuk doni të ruani të dhëna që ka ndodhi, si në një lojë ose një program si kjo, rezulton ne mund të bëjmë kështu. Dhe ju do të shihni këtë më shumë në pset 4 dhe në nenin. Por kjo linjë 23 thelb krijon një skedar të quajtur students.csv. Dhe ju mund të keni parë këtë më parë. Edhe në qoftë se ju kurrë nuk kam studiuar CS më parë, CSV është Variablat presje-të ndara. Është si një njeriu shumë të varfër version i një file Excel, që do të thotë se ajo mund të jetë e hapur në Excel dhe në Numrat Apple, dhe ajo ka rreshtave dhe kolonave. Por kjo nuk është një pronarit format si Microsoft apo Apple. Kjo është vetëm presje ndarjen e Vlerat që ne do të shohim në një moment. Dhe vetëm të marrë një guess. Në linjë 23, në fund të fundi, argumenti im i dytë për këtë funksion të ri të quajtur f hapur për fotografi të hapur është w. Çfarë mund w treguar? Po? Audienca: Kjo ju lejon të shkruani në dosjen? DAVID J. Malan: Kjo ju lejon ju shkruani në dosjen. Pra, ka disa variante që ne mund të vihet në prizë këtu. Por vetëm nëse ju doni të lexoni fotografi, që është të shikoni në atë dhe lexoni atë në kujtesë, ju vetëm përdorni quote mbyll thonjëzat "r". Nëse ju doni të shkruani të skedar, ju përdorni kuotë mbyll thonjëzat "w". Ka edhe append dhe disa gjëra të tjera në qoftë se ju dëshironi të modifikoni skedarët ekzistues. Tani ne jemi duke shkuar për të mbajtur duke parë këtë gjë, atëherë ne do të kthehen të vijë 24. NULL, ajo rezulton, është një vlerë të veçantë që mund të kthehen nga disa funksione nëse diçka ka shkuar wrong-- Nëse skedari nuk ekziston, në qoftë se ju keni dalë jashtë kujtesës, ose një bandë e gabimeve të tjera. Por tani për tani, le të supozojmë se kjo është kontrolluar vetëm konvencionale gabim. Këtu në linjë 26, unë jam iterating nga 0 deri ne 3 mbi të gjithë nxënës mi. Dhe kjo është lloj i lloj i funksionit të ri, fprintf, por vetëm të marrë një guess. Nëse printf është vetëm të shtypura një varg formatuar, çfarë do të fprintf ndoshta do të thotë? Audienca: Printo në një skedar. DAVID J. Malan: Print një varg i formatuar në një skedar. Kjo është ajo shtesë f mjeti është skedar. Dhe argumenti i ri i parë duhet të jetë ndryshorja që përfaqëson dosjen tuaj. Atëherë ne vetëm duhet një format string ashtu si printf. Dhe, edhe pse kjo Sintaksa është e re, kjo vetëm do të thotë plug në emër të studentit, plug-në konvikt të studentëve, dhe pastaj me fclose, të mbyllur dosjen. Dhe pastaj lastly-- kjo është e re dhe ne do të kthehen në këtë para long-- unë jam liruar studenti për arsye që ka ndodhur deri më lart atje. Por ne do të kthehem në se para long-- kjo është për shkak të asaj se si është getString në fakt duke punuar nën kapuç. Pra, le të marrin një vështrim të shpejtë këtu. Nëse unë lloji ls në directory time, vëreni se unë nuk e bëj të ketë një skedar të quajtur students.csv, jo vetëm atje, nuk ekziston. Pra, nëse unë tani hartojnë këtë program, bëjnë structs-1,. / structs-1, dhe unë jam duke shkuar për të shkuar përpara dhe shkruani Andi, i cili jeton në Berkeley në Yale. Ne do të kemi Rob i cili jeton në Thayer këto ditë. Dhe le të dalë me ku është, unë mendoj se, Maria është në Mather, në qoftë se kam mend saktë. Pra, asgjë nuk duket të ndodhë. Por në qoftë se unë lloji ls tani, ka students.csv. Le të shkojnë përpara dhe të students.csv hapur. Kjo është përsëri një shumë format lehtë skedar. Por unë e kam miratuar thjesht një konventë që unë kam dy rreshtave dhe kolonave këtu. Kolona e parë është emrat e parë Popullit. Kolona e dytë është studentit fjetore, apo kolegj, apo shtëpi, apo gjësend. Dhe tani unë e kam ruajtur këtë të përhershme në një skedar. Pra, kjo nuk është e gjitha se interesante. Por kjo është vetëm një gur shkelën tani për të qenë në gjendje të vazhdojnë informacione përgjithmonë. Pra, le të shohim tani se çfarë më shumë që ne mund të të bëjë me këto dhe të tjera karakteristika. Por së pari, ndonjë pyetje? Kjo ishte një shumë, dhe se ishte i shpejtë. Por ju do të shihni një shumë më shumë në pset 4, si. Po? Audienca: A ka ndonjë mënyrë për të vazhdojë duke shtuar emra për këtë dosje? DAVID J. Malan: Pyetje e mirë. A ka ndonjë mënyrë për të vazhduar duke shtuar emra për këtë dosje? Po. Dhe, në fakt, në qoftë se ju të përfundojë up ri-hapur dosjen, ju do të përdorni kuotë mbyll thonjëzat "një" për bashkangjit, e cila vetëm do të shtojë një linjë të re, një Linja e re përsëri dhe përsëri, pikërisht. Pyetje e mirë. Pyetje të tjera? Po? Audienca: Nëse ju u Programi përsëri tani, do të mbajë duke shtuar emra të fotografi apo do të hapë një skedë të re? DAVID J. Malan: Ah, pyetje e mirë. Në qoftë se ju u zhvillua programin përsëri djathtas tani, shtypur ndoshta në emra të rinj, do të shtojë në dosjen ose të prishësh file? Ky i fundit, sepse unë jam i jo duke përdorur mënyrën append. Dhe për shkak se unë jam vetëm verbërisht hapjes së kartelës për shkrim, ajo është vetëm do të prishësh file. Kështu që unë me të vërtetë do të duhet të bëni është append, në qoftë se unë dua që në fakt të ketë një afat të gjatë bazës së të dhënave. Tani CSV është e dobishme, sinqerisht, madje për si në qoftë se ju jeni writing-- dhe ne do të shohim përfundimisht këtë më vonë në semestrin kur ne përdorim CSVs për qëllime të tjera. Nëse ju doni për të ruajtur të gjithë njerëzit të cilët janë regjistruar për një ngjarje, ose nënshkruar për nxënësin tuaj grup, ose diçka të tillë, ruajtjen e të dhënave në këtë lloj i formatit është super i përshtatshëm. Sepse fjalë për fjalë, në qoftë se unë ishin për të shkarkuar këtë skedar. Unë mund të double-- dhe le të vërtetë të provoni këtë në qoftë se unë kam Excel ose numrat në këtu. Unë jam duke shkuar për të right-click ose kontroll-klikoni dosjen time. Uh. Djathtas-klikoni ose kontroll-click dosjen time. Come on, miu im nuk është duke bashkëpunuar. Download-- unë jam duke shkuar për shkarko të gjitha dosjet këtu kështu vetëm kështu që unë mund të rrëmbej këtë një të tillë. Dhe le të shohim nëse kjo punon hera e parë students.csv-- Unë e kam aktivizuar. Tani ata duan të shohin kontaktet e mia. Tani, unë duhet të regjistroheni. Shih se sa e lehtë është për t'u përdorur CSVs? Po, të mbajtur atë deri në datën. OK, tani ne jemi gati për klasë. OK, oh, çfarë ka të re? OK, afër. Kjo ishte magjike. OK, tani ne kemi për të rinovuar. Dhe tani, ajo harruan çfarë paraqesë Kam hapur fillimisht, por ajo që a-- atje ne do të shkojmë. OK, kështu që tani kemi një file Excel. Faleminderit. OK, kështu që ajo që unë bëra ishte pjesa më e lehtë. Sigurisht unë mund të ketë para-instaluar Excel, ose numrat, apo çfarëdo programi. Por kjo është e bukur, sepse tani unë mund të manipulojë të dhënat në një format standard. Konteksti Pra, tani le të kaloni në ku ne u ndërpre Herën e fundit, e cila ishte për të filluar për të marrë off rrota trajnimit. Por së pari, ju nuk e keni shihni këtë drekë më parë po ndodh prapë këtu në zjarr dhe Akull në Kembrixh, Sitar në New Haven. Sign up në faqen CS50s ASAP për t'u bashkuar me studentët CS50 dhe stafin. Pra, ne e mori rrota trajnimit off të hënën si follows-- string është deklaruar në Biblioteka CS50s për disa kohë. Dhe kjo është e bukur, sepse ai ua mundëson ne që të flasim për variablat si Fjalët plotë dhe fjali dhe më shumë. Por kjo rezulton string nuk ekziston. Kjo është vetëm një sinonim, ose një pseudonim, që kemi krijuar për diçka që në fakt është një pak më shumë teknik quhet char *. Dhe me të vërtetë, ne pamë një shembull e një programi të hënën që nuk sillen si mjaft kemi pritur. Kjo ishte skedar, krahasoni-0. Dhe kujtoj se krahasojnë-0, në qoftë se I përpiluar programin e së hënës dhe drejtuar krahasojnë-0 dhe shkruani mom në vogle, dhe nëna në Fjala përsëri. Programi këmbënguli I shkruani gjëra të ndryshme, edhe pse mom, të gjitha në Fjala, është identike me sy. Pra, çfarë ishte përgjigja e shkurtër pse kompjuteri mendon këto dy vargjet janë të ndryshme? Po? Audienca: [padëgjueshme] DAVID J. Malan: E drejta. Pra, nëna, hera e parë I shkruani atë në, është duke u ruhet diku në kompjuterin My kujtim por në një vend tjetër sesa të dytën herë unë lloji në mom. Tani ajo sigurisht mund të jetë i optimizuar. Kompjuteri mund të jetë i zgjuar dhe realizuar këto dy vargje, hej, ata janë identike. Më lejoni të mos redundantly ruajtur atë. Por kompjuterat nuk e bëjmë atë optimization nëse ju tregoni atyre për të. Pra, si parazgjedhje, ata janë vetëm do të përfundojë deri në dy vende të ndryshme në kujtesë. Dhe në mënyrë që të jetë më i qartë, kur ne krahasim me dy vargjet, I pari ishte quajtur s, e dytë u quajt t, çfarë konkretisht isha unë krahasuar këtu on line 13? Po. Audienca: Është vendi në kujtesën se variabli do të tregojë për. DAVID J. Malan: Pikërisht, unë kam qenë krahasuar vend në kujtesën e që këto variabla vuri në dukje. Pra konkretisht, në qoftë se nëna ishte në numër bajt 1 dhe 2, dhe 3, dhe 4-- sepse kujtohet backslash 0 duhet të jetë mbi të gjitha rrugën në fund. Dhe shembull tjetër i Mami, m-o-m, ishte në adresën 10, 11, 12, dhe 13. Unë u krahasuar 1, që adresa, që lokacioni në kujtesë, kundër 10, i cili është natyrisht që nuk është e njëjtë. 1 nuk është 10. Pra, kjo është e bukur në atë kjo është goxha e drejtpërdrejtë. Por kjo është problematike për aq sa ne nuk mund të duket për të krahasuar vargjet. Pra fundamentally-- dhe në këtë nivel të ulët, në qoftë se ju të kërkuar për të zbatuar një program për të krahasuar dy fjalë të veçanta që përdoruesi ka shtypur në për cilësinë, ata vargoj char për char, vetëm në terma të përgjithshme, çfarë duhet të bëjmë, me sa duket? Kjo nuk është e mjaftueshme vetëm për të shikoni në këto dy adresa. Çfarë duhet të bëjmë? Po? Audienca: Iterate përmes string [e padëgjueshme]. DAVID J. Malan: Po, le të iterate përmes vargut. Le të përdorim një për lak, një lak, ndërsa, ose Çfarëdo që ju jeni më të rehatshme me. Dhe në qoftë se ne kemi marrë dy vargjet diku në kujtesë, le të shohim në çdo-së karakteri i parë, atëherë çdo e dytë karakter, pastaj të tretë, dhe të katërt, dhe të pestë, derisa ne goditi çfarë vlere të veçantë rojtar? Audienca: [padëgjueshme] DAVID J. Malan: Yeah, backslash zero, në të cilën pikë në secilin varg ne mund të vendosë se është ajo. A e kemi përputhet çdo karakter të vetëm? Nëse jo, kthimit të rreme. Nëse është kështu, kthimi i vërtetë. Dhe kështu kjo është pikërisht ajo që ky version i programit të krahasuar-1.c bën. Kjo është identike me atë që ne shikoi hënën përveç që unë e kam gotten shpëtoj e fjalës string-- pse që nuk ka impact-- funksionale të gjithë Unë jam duke bërë tani është hequr disa rrota vizuale trajnimit, por për të parë qartë se s dhe t janë adresat. Dhe kjo është ajo që ylli, asterisk, përfaqëson është një adresë, i njohur ndryshe më shumë teknikisht si një tregues. Kështu që kur unë deklaroj s në Linja 9 dhe them char * s, kjo nuk do të thotë më jepni një varg. Kjo do të thotë më jepni një variabël të cilit qëllimi në jetë është për të ruajtur një adresë. Sepse unë jam gati për të vënë adresa e një varg në të. Dhe me të vërtetë, getString, të jetë i qartë, nuk do të kthehet një varg. Ajo nuk kthehet mom backslash zero, në vetvete. Çfarë do getString specifike dhe pikërisht të kthehet? Audienca: [padëgjueshme] DAVID J. Malan: një adresë, Adresa e karakterit parë në disa varg ajo ka marrë. Dhe kështu që tani që ne jemi duke parë një fjalen veçantë përsëri. Dhe, unë përmendur tërthorazi këtë më herët. Kjo do të jetë konventa e mirë se ne do të shohim përsëri dhe përsëri tani. Unë jam duke kontrolluar për të siguruar që s nuk është i pavlefshëm dhe t nuk është i pavlefshëm. Sepse bazuar në tim të vërtetë Përmendja shpejtë më herët, çfarë mund të thotë nëse getString nuk kthehet një adresë por N-U-L-L, e cila është një herë, disa vlera të veçanta? Audienca: Gabim. DAVID J. Malan: Kjo është një gabim. Dicka shkoi keq. Dhe çfarë mënyrë tipike mund të ndodhë, sidomos me strings-- që mund të jetë e gjatësisë panjohur në advance-- ndoshta kompjuterët ' jashtë kujtesës, ndoshta ju shtypur në një të tillë fjalë të gjatë ose fjali ose ngjit një ese të tillë të madh ka jo vetëm kujtesë të mjaftueshme. Dhe kështu getString nuk mund të kthehen adresa e të gjithë gjë, kështu që vetëm të kthehet asgjë. Dhe ai thotë se një gabim ka ndodhur duke u kthyer në vlerë të veçantë null. Kjo është adresa zero, kështu që të flasin. Tani del C vjen me një funksion që e bën këtë përsëritje. Ne nuk duhet të zbatojnë këtë me një për lak ose një lak, ndërsa veten. Ne mund të përdorim një funksion, quajtur shkurtimisht, llokoçis comp, ose varg të krahasuar, të cilit qëllimi në jetë është që të bëjë pikërisht këtë. Ju jepte dy pointers, dy adresa, dhe ai do të shkojë në këto adresa dhe pastaj krahasoni letër për letër për letër për cilësinë, ndalur vetëm kur ajo është e vërtetë? Kur intuitive duhet ndezur comp ndaluar iterating, vetëm të jetë i qartë? Kur ajo godet një backslash 0 në ose string, në të cilën pikë ajo mund të vendosë ka gjithçka përputhet, ose ka qenë atje një mospërputhje? Pra, në qoftë se kemi drejtuar këtë tani dhe provoni lojë tonë të vogël kapitalizimin, kështu që e bëjnë të krahasuar-1, ./compare-1, dhe shkruani mom në Fjala dy herë. Tani kjo është e njëjta gjë. Dhe në qoftë se unë të bëjë atë përsëri me vogle dhe pastaj ndoshta uppercase. Tani ajo me të vërtetë e dallon në mes të sipërme dhe të vogla. Pra, jo të gjitha se e vështirë ose magjike, por kjo nuk shpjegoj tani çfarë po ndodh nën kapuç. Pra, ajo që më shumë mund të ekstrakt nga ky lloj të mësimit? Pra, le të marrin një vështrim në këtë. Unë jam duke shkuar për të shkuar përpara dhe të shkruajnë një Programi i shpejtë këtu quhet kopje-0. Dhe tani le të shkojnë përpara dhe në fakt le të bëjmë this-- me kopje-0, hidhini një sy në atë që unë kam marrë këtu. Unë së pari them përdorues, thonë diçka. Pastaj unë të marrë një varg dhe kam ruajtur atë në s. Pastaj unë kontrolloj nëse s barabartë barabartë NULL, vetëm të kthehet 1. Pra, kjo është vetëm kontrolluar standarde gabim. Asgjë interesante ka ndodhur. Dhe në fakt, në qoftë se ne të shpëtoj prej gabimit kontrolluar, kjo duket si javë 1 Kodi momentin. Por unë kam filluar të marrë një pak më të mirë për këtë. Tani në linjë 16, një javë më parë, ndoshta ditë edhe një çift ose minuta më parë, ju mund të thoni linja 16 është duke krijuar një ndryshore të quajtur t dhe kopjimi s në të. Dhe kjo është një mënyrë të përkryer takeaway arsyeshme. Por të jenë më të saktë tani. Çfarë po ndodh në linjë 16? Çfarë është duke u kopjuar nga djathta në të majtë? Po? Audienca: është t duke marrë një adresë të s? DAVID J. Malan: Pikërisht, t është duke adresën e s. Pra, të jetë i qartë tani, nëse unë shkoj përsëri për këtë shembull më parë dhe unë të nxjerr gjë unë kam shtypur në. Dhe ajo që unë kam shtypur in-- këtu është s, dhe këtu është ajo që unë kam shtypur në diku në kujtesës, mom dhe pastaj një backslash 0 që është shtuar për mua. Ajo që unë ruhet në këtu, kujtoj, kjo është në vendin e 1, 2, 3, 4, kjo është ajo që është aktualisht në s. Pra, nëse on line 16, unë them më jep mua një tjetër variabël i quajtur t dhe dyqan në të vlerë prej s, ajo merr ruajtur këtu nuk do të mom por vetëm numri 1. Pra, nëse ne shikojmë përpara në këtë program tani, çfarë do të ndodhë? Pra, vini re se nuk ka ky funksion ju fuqi e kanë përdorur këtë disa kohë më parë për Cezarit, ose Vigenere, apo ndoshta aspak. Unë pretendojnë me printf tim, unë jam duke shkuar për të përfituar kopja t. Së pari në linjë 19, mendje e shëndoshë të shpejtë kontrolloni, kontrolle strlen gjatësinë e t. Sepse unë nuk dua të përpiqen për të përfituar diçka në qoftë se nuk ka asnjë varg atje. Nëse shfrytëzuesi vetëm hit Enter, nuk ka asgjë për të përfituar. Kështu që unë nuk dua të bëj linjë 21. Pra, linja 21 është kapitalizuar e cila letër, me sa duket, në t? Audienca: m? DAVID J. Malan: Ajo duket si ajo e kopjimit të cilën një? Audienca: m. DAVID J. Malan: Uh, M. OK, kështu që m parë, sepse njoftim që unë jam duke kaluar në toupper, e cila në qoftë se ju kurrë nuk kam parë atë është vetëm një funksion të germa të mëdha si input saj. t kllapa zero do të thotë të dhënë mua karakteri zero t. Dhe kështu si e bën këtë ndryshim foto, të jetë i qartë? Çfarë duhet të marrë rishkruar apo ndryshuar në lidhje me s dhe t dhe mom zero backslash. Audienca: [padëgjueshme] DAVID J. Malan: Yeah, kështu që kjo këtu thjesht nevojë për të marrë ndryshuar to-- rregulluar this-- nevojë për të marrë ndryshuar për një m kapitalit. Por tani, të shohim më vonë në Programi, në qoftë se unë të shtypura nga s dhe t si unë të pastër këtu, të shikojnë se çfarë është do të ndodhë shtypjen nga s dhe t. Pra, të bëjë kopje-0, ./copy-0. Më lejoni të shkoj përpara dhe të shtypni në mom në të gjitha Fjala. Vini re dy origjinale dhe kopja janë kapitalizuar. Përse? E pra, s dhe t janë të dyja të treguar, në qoftë se ju do, e njëjta copë e kujtesës. Dhe sinqerisht, kjo është duke u me të vërtetë uninteresting-- faktin që ne jemi duke përdorur adresën zero këtu. Unë do të thotë, unë nuk e kujdesit të vërtetë ku stuff është në kujtesën. Na vjen keq Unë jam duke fshirë një shumë pak. Por unë nuk e kujdesit të vërtetë ku gjërat janë në kujtesën. Dhe kështu, me të vërtetë, çfarë programuesit kanë tendencë të mendojnë për është se kur ju flisni për një adresë, apo një tregues, kush kujdeset ku ajo është në kujtesë. Unë nuk e kujdesit në qoftë se është në byte një ose një miliard. Unë vetëm kujdes se kjo variabël është efektivisht duke treguar në atë copë e kujtesës. Dhe kështu, tani e tutje, në vend se bejne lojera fjalesh mbi kujtesës adresat arbitrare, le të sapo të fillojë të nxjerrë pointers si pointers, si shigjeta. Pra, çfarë s dhe t vërtetë janë, sipas këtij programi, për shkak të asaj se si kam krijuar t, kjo është vetëm dy variablave të veçanta vënë në të njëjtën copë të memories. Dhe ne nuk e kujdesit se ku janë ata. Pra, ne mund abstrakte larg asaj detaje. Pra, si mund ta fix this? Nëse unë dua të shkruaj një version të kopjes program që në fakt kopje string dhe kapitalizon vetëm kopje, vetëm intuitive, ajo e mori të jetë një përbërës të zgjidhje tonë? Audienca: [padëgjueshme] DAVID J. Malan: Ne kemi nevojë për çfarë? Audienca: copë e kujtesës. DAVID J. Malan: Ne kemi nevojë për një tjetër copë e kujtesës, e drejtë? Ne nuk e dimë se si për të bëjë atë ende, domosdoshmërisht. Por unë lloj i duhet kjo të ndodhë kështu se nëna origjinal në rastin më të ulët përfundon në atë copë shtesë e kujtesës. Dhe pastaj kur unë të ndryshojë kopje, unë nuk duan të ndryshojnë këtë kopje këtu. Unë në vend që dua të ndryshojë vetëm këtë kopje në mënyrë që origjinali është i pandryshuar. Pra, le të shohim se si ne mund të bëjmë këtë. Në kopje-1, e cila ka tashmë është zhveshur nga komenti, por është komentuar online. Ne vend bëjmë të following-- këto Linjat janë identike, të merrni mua një varg dhe e quajti atë s. Por tani le të shohim në një nga më të tona komplekse por e fundit e kompleksitetit për pak kohë, linja 16 e bën pikërisht këtë. Pra, nëse i qetë juaj me foto ne vetëm drew-- më jepni një copë e re e kujtesës, kopjoni çdo gjë në të, le të shohim se si ne të përkthehet se të kodit. Pra linjë 16, në anën e majtë, char * t ma jep këtë kuti mbi këtu. Kjo është e gjitha ajo ka. Në anën e djathtë, m alloc, ose malloc, është kujtese, super të dashuroj, një mënyrë e fshehtë e vetëm duke thënë më jepni një copë e kujtesës. Sa memorie nuk kemi nevojë? E pra, është lloj i një shprehje të madhe. Por le të shohim se çfarë do të thotë këtu. Pra kjo, natyrisht, është të japë mua gjatësia varg s. Pra, nëna ajo duhet të jetë ajo? Pra, vetëm tre, apo jo? nëna është tre karaktere. Ju nuk numëroni backslash zero kur ju flasin për gjatësinë e një varg kjo është Aktualisht letra dukshme njerëzore. Pra nëna, kështu që kjo më jep 3. Por prisni një minutë, unë jam tani duke shtuar 1. Përse të vërtetë duan të ndajë 4 bytes dhe jo vetëm 3? Po? Audienca: Për vlerën sentinel? DAVID J. Malan: Pikërisht, për këtë vlerë sentinel. Për backslash zero, Unë kam nevojë për 4 bytes gjithsej. Kështu që kam nevojë për gjatësinë e vargut plus 1. Dhe pastaj vetëm për measure-- mirë edhe pse në këtë sistem, ajo gjithmonë do të jetë 1-- unë jam duke thënë shumohen kjo nga madhësia e një char. Rezulton se sizeof është një operator në C që vetëm ju e tregon Numri i bytes kjo është e nevojshme për një lloj të caktuar të të dhënave. Ajo nuk punon për vargjeve, në mënyrë tipike, nganjëherë ajo bën. Por në rastin e përgjithshëm, nr. Por kjo do të më thoni se sa bytes një char është, që rezulton është gjithmonë 1. Pra, kjo është si të shumëzuar me 1. Linja Pra, super i fshehtë në kërkim të kodit. Por e gjithë kjo nuk është e jep mua një copë e kujtesës. Por nuk duket të jetë kopjimin çdo gjë në atë kujtim? Ende. Dhe kështu çfarë unë on line 22, dhe 23, 24, 25, mirë, unë thjesht bëj këtë. Dhe kjo është lloj i sende të vjetër e shkollës tani. Kjo është si pset 2, ku ju jeni vetëm duke lëvizur gjërat rreth në kujtesë, ose më mirë në vargjet. Kështu që unë jam iterating nga 0 deri në gjatësia e vargut s. Dhe unë jam kopjimi karakterin i-th në s në karakterin i-të në t. Dhe për shkak se unë, programues, bëri Sigurohuni që të ndajë saktësisht sa më shumë bytes si kam nevojë, është e përsosur një-për-një marrëdhënie. Dhe unë kopje mom në vogle për një të ri. Dhe pastaj në fund, unë e bëj këtë linjë. Dhe kështu që efekti është vetëm për të përfituar këtë t këtu. Pra, shumë për të absorbuar, por në qoftë se ju vetëm të marrin në konsideratë çfarë po ndodh në nën kapuç është vetëm duke lëvizur këto bytes përreth, të gjithë që është e nevojshme për të zgjidhur këtë problem është vetëm për të na dhënë këtë copë e kujtesës. Tani në rrezikun e madhe, më lejoni të tregoj Një shembull tjetër që është pothuajse identik, përveç për këtë një linjë e kodit. Pra, ky është versioni hacker e këtij programi, nëse ju do. Por le të vetëm të gjej ajo në çfarë po ndodh. Linja 24 përdoret për të jetë kjo t kllapa i merr s kllapa unë. Tani, unë jam duke ndryshuar këtë për aq shumë të më fshehtë t yll plus 1 barabartë yll s plus 1. Pra, çfarë po ndodh dhe pse nuk kemi një karakter yll? Ne e kemi parë yllin më parë, dhe ajo është duke u përdorur në mënyra të ndryshme këtu. Ne më parë pamë char *, tani unë jam duke parë Një yll në fillim, dhe kjo është në rregull. Sepse ajo rezulton ne lloj frymërash nuk mund të konkludoj vetëm nga ato parë Parimet çfarë po ndodh. Pra, vetëm të jetë i qartë, ajo që është s? Javën e kaluar, ajo ishte një varg. Kjo nuk mjafton më. Çfarë është s, konkretisht? Audienca: [padëgjueshme] DAVID J. Malan: Kjo është një akrep. Kjo është adresa e karakteri i parë ne shtypur në. OK, ajo që është t? Audienca: [padëgjueshme] DAVID J. Malan: The adresën e bajt parë në t, atë copë e kujtesës rialokuar. Pra, rezulton se kur ne iterate nga 0 deri në vargun length-- para së gjithash, unë fillon në 0, sepse e kësaj shkolle të vjetër për një gjë të loop. Pra, vetëm për thjeshtësi, le të supozojmë se rreshtin e parë të kodit është me të vërtetë vetëm kjo, e drejtë. Nëse i është zero, duke shtuar zero diçka me sa duket nuk do të ketë një efekt. Pra, çfarë është kjo thënie? Ajo rezulton se ylli operator në këtë kontekst është dereference operator, i cili është vetëm një mënyrë e sofistikuar për të thënë të shkojë në adresën e mëposhtme. Pra, nëse s është adresa e parë karakter në këtë copë e kujtesës, * s do të thotë të shkojë atje. Dhe për shkak se ne kemi tërhequr fotografia në këtë mënyrë, ju mund të miratojë duke ndjekur modelin mendor. Nëse kjo është s, dhe ju thoni * s, * s lloj si Chutes dhe Ladders, në qoftë se ju kujtohet lojë nga fëmijëria, është si të ndjekin atë shigjetë dhe shkoni në adresën. * t është e njëjta gjë. Pra, fillojë këtu, shkoni në copë të saj. Unë nuk mund të nxjerrë në ky ekran në këtë mënyrë. * t do të thotë për të shkuar këtu. Dhe pastaj, për lak është vetëm duke thënë lëvizur këtë karakter këtu, lëvizur këtë karakter këtu, lëvizur këtë karakter këtu. Por si mund ta bëj këtë Incrementation? Unë kam nevojë për të ndrequr atë që unë sapo fshihet. Kjo është ajo që quhet përgjithësisht aritmetike akrep, e cila nënkupton matematikë me adresat. Nëse, në këtë për lak, Unë mbaj bën rritjen I, dhe s është një adresë dhe t është një adresa, në qoftë se unë vetëm i mbajnë duke shtuar 1, që vetëm do të thotë të mbajtur lëvizur përpara, dhe përpara, dhe përpara në kujtesën. Është si Oxford Street, rrugë se ndërtesa CS është në. Ndërtesat CS është në 33 Oxford Street. Pra, nëse ju do të bëni 33 Oxford Street plus 1, që ju sjell në 34 Oksford Rruga, atëherë 35 Oxford Street, pastaj 36 Oxford Street, çfarëdo që ata Ndërtesat në fakt janë - në qoftë se ato ekzistojnë. Dhe kështu, kjo është e gjitha ne jemi duke bërë këtu me akrep aritmetikë. Pra, kjo është një mënyrë super misterioze të shprehur veten. Por e gjithë kjo po ndodh nën kapuç është vetëm ndjekur këto adresa, si pas një hartë, në qoftë se ju do të, ose pas shigjeta si ne kemi tërhequr në ekran. OK, një shumë për të tretet. Çdo pyetje në sintaksë, konceptet, pointers, malloc, ose si. Po, këtu për herë të parë. Audienca: Pra, ku që thotë se * t barabartë toupper * t, është se duke shkuar për të përfituar të gjitha letrat apo just-- DAVID J. Malan: Ah, pyetje me të vërtetë mirë. Pra, në këtë linjë këtu, 31, është kjo do të kapitalizojë Letra e parë ose të gjitha letrat. Pra, le të përgjigjen se duke shkuar Mbrapsht në parimet e parë. Dhe parimet e para këtu dua të them thjesht shkoni përcaktimeve themelore e çfarë është e përfshirë. Pra toupper është një funksion që kontribuon një char. Kjo eshte e gjitha. * t do të thotë të shkojnë në first-- shkoni në adresën në t. Pra, në foto, në qoftë se kjo është copë e kujtesës kemi ndarë me malloc, dhe kjo është t, * t do të thotë shkoni këtu. Ndërkohë, ju jeni duke kaluar që vlera, M vogle për toupper, ju jeni duke u kthyer Kapitali M, ku ju vënë atë? Ju jeni duke e vënë atë në të njëjtin lokacion. Dhe kështu nga kjo logjikë e atyre përkufizimet themelore kjo është vetëm kapitalizuar letrën e parë nëse ju iterate me I ose një për lak ose një lak, ndërsa, kjo nuk po ndodh për të bërë asgjë më shumë se ju kërkoni atë. Pyetje e mirë. Po? Audienca: Pse ju përdorni dereference metodë jo array? DAVID J. Malan: Ah, pyetje e mirë. Pse do të ju përdorni dereference Metoda vend të metodës vektorit? Nuk ka arsye të veçantë, të jetë i sinqertë. Dhe, në fakt, për këtë lloj shembull, të drejtë, Unë jam vetëm duke argumentuar duke e bërë Programi më të komplikuara, më shumë sytë janë mbi lustrim, njerëzit janë të kontrolluar nga sepse kjo duket super misterioze, por edhe pse ajo është duke bërë të njëjtën gjë. Dhe kështu, sinqerisht, ky është një zgjidhje të panevojshme vizualisht kompleks për problemin. Është ende dizajn të mirë, pesë nga pesë për dizajn, nëse kjo është në kllapa simbol apo simbol pointer. But-- sidomos kur marrim më vonë gjatë në pset 5 kur ne zbatimin që fjalorin që Unë e kam përmendur disa Times-- ne fakt do të kujdesen për nivelit të ulët adresat e kujtesës që ne me të vërtetë e kuptojmë Çfarë po ndodh. Por, tani për tani, rezulton se ky linjë e kodit kllapa katrore këtu të vërtetë nuk ekzistojnë. Ata janë atë që quhet sheqer sintaktik, e cila është vetëm një mënyrë të çuditshme të ftohtë e duke thënë se përpilues konverton kllapa katrore të jetë kjo shprehje matematikore. Pra, kjo është një konventë e njeriut të jenë në gjendje për të vetëm të shkruar këto shumë user-friendly kllapa. Por ajo që përpiluesit, tingëllimë, është me të vërtetë duke bërë në çdo kohë ju shkruani se çfarë është theksuar në linjë 24, nën kapuç është e vërtetë konvertimin e tij në këtë. Është vetëm më të pëlqyeshëm si një njeri të lexojnë dhe shkruajnë kod si linjë 24. Por në fund ata rrota trajnimit shumë të vijnë off kur dikujt ngushëllim vetë merr të fortë. Të gjithë të drejtë, kështu kujtohet atëherë që kjo ishte lloj i problemit më të madh ne u përplas. Dhe kjo është ajo që shkaktoi këtë tërësi bisedë mallkim për pointers, dhe adresat, dhe kopjimi gjëra. Kjo ishte për shkak se ne morën mbi kjo budalla, budalla çështje, ku I zbatuar logically-- me Lauren deri këtu në demo dhe lëng portokalli në milk-- një mënyrë të përkryer Funksioni algoritmikisht e saktë për shkëmbejnë dy variabla ' Vlerat, por gjëja mallkuar nuk ka pasur asnjë të vazhdueshme, ose i përhershëm, efekti në kodin tim. Dhe pse ishte ajo? Në pak fjalë, pse është kjo zbatimi i swap logjikisht e saktë, por nuk ka asnjë ndikim mbi variablat që janë kaluar me të, si x dhe y për kryesor? Cili ishte thelbi i çështjes? Po? Audienca: Sepse ndryshueshme bërë kopje të ndryshueshme në të kalojë përmes funksionit. DAVID J. Malan: Pikërisht, kur ju të kalojë Ndryshoret në një funksion, apo argumentet në një funksion, ata janë miratuar nga kopje, të cilat do të thotë që ju të merrni një identik kërkim model i bit për të dy X dhe Y, quajtur këtu a dhe b. Dhe ju mund të bëni asgjë ju doni me këto kopje, por ata do të kenë asnjë efekt në funksionin e quajtur. Dhe, në fakt, ne tërhoqi atë fotografia në ekran, risjell Herën e fundit, ku në qoftë se ju me të vërtetë mendoni se çka është ndodh nën hood-- nëse kjo është memorie kompjuteri juaj, dhe këtu poshtë është copë e kujtesës duke u përdorur për kryesor, kjo është copë e kujtesës duke u përdorur për shkëmbim, dhe kështu që edhe nëse kryesor ka dy variablat, x dhe y, shkëmbim mund të ketë identike kërkim vlerat, dy nga të cilat janë 1 dhe 2, por ata janë plotësisht chunks të ndryshme të kujtesës. Pra, ne kemi nevojë për një zgjidhje për këtë. Dhe sinqerisht, kjo do të duket se ne tani kanë një zgjidhje për këtë problem, e drejtë. Në qoftë se ne tani kemi aftësinë për manipuluar gjërat me anë të adresave dhe, lloj Chutes dhe Shkalle stil, ndiqni këto shigjeta dhe shkoni kudo ne duam në kujtesë, nuk mund të kemi zgjidhur këtë problem duke duke kaluar nga kryesore të bie në ujdi jo vlerat që ne duam të shkëmbim, por vetëm intuitive çfarë mund të kalojë të bie në ujdi në vend? [Ndërhynte ZËRA] DAVID J. Malan: Pse nuk vetëm kalojë ajo adresat, e drejtë? Pse nuk japin shkëmbim një Harta thesar, në qoftë se ju do të, që të çon atë në vlerat x dhe y. aktuale Le të bie në ujdi, në të vërtetë të ndryshojë ato pjesë origjinale, në vend se vetëm duke kaluar kopjet e copa. Dhe kështu, në fakt, kjo është ajo që është do të jetë zgjidhje. Ky version këtu është në mënyrë të qartë e keqe dhe me të meta. Dhe tani, në shikim të parë, ajo vetëm duket si kemi shtuar një bandë e yjeve rastësisht dhe kaloi gishtat tonë se ai do të hartojnë. Por, ajo tani do të hartojnë. Por le të shohim se çfarë kuptimi kanë këto gjëra. Dhe, për fat të keq, autorët e C mund të kishte zgjedhur një tjetër simbol për të bërë këtë pak qartë, por operatori ylli ka kuptim të ndryshëm në dy kontekste të ndryshme. Dhe ne kemi parë të dy, por le të dalluar. Pra, deri në krye atje, kur unë kam ndryshuar dhe b nga të qenit int në të këqija version të int yje, a dhe b, më parë, ishin të integers. Cilat janë A dhe B tani në e mira version, të gjelbër? Ata janë adresat. Adresat e çfarë, që të jetë i qartë? Adresat e integers. Pra, fakti që unë jam duke thënë se do të thotë yll int kjo është adresa e një numër të plotë, në mënyrë të veçantë. Deri tani vini re në rreshta të kodit, diçka tjetër ka ndryshuar shumë. TMP qëndron e njëjtë, sepse kjo është vetëm numër i plotë i përkohshëm, nuk ka magji kujtim atje. Por një tani ka nevojë për një yll. Dhe, në fakt, çdo përmendje të tjera të A dhe B, vini re se të gjitha që është e ndryshon nga e kuqe në të gjelbër është se unë jam prefixing këto variabla me yjet. Sepse unë nuk dua të kopjoni a dhe b. Sepse në qoftë se unë thjesht kopjoni një dhe b dhe swap a dhe b, çfarë jam unë në fakt shkëmbejnë? Vetëm adresat, unë dua të bie në ujdi çfarë është në ato adresa. Dua te shkoj atje. Dhe kështu operatori yll brenda funksionit tim, jo brenda listës së parametrave, do të thotë që ju të shkoni në këto adresa dhe në fakt të ndryshojë këto vlera. Pra, çfarë e bën foton tani duken si në vend. E pra, në qoftë se në vend të kësaj unë jam duke kaluar në për një dhe B nuk 1 dhe 2-- Unë në fakt duhet të shtoni një përkufizim tjetër këtu. Pra, mendoj se këtë copë e kujtesës është në vend të 10. Kjo është në vend të 11, por kjo është pak e një thjeshtësim, Unë tani kanë dy zgjedhje bëj unë kaloj x dhe y ose mund ta kaloj adresat e tyre? Nëse unë të kalojë adresat e tyre si kjo, unë vetëm tani duhet të zbatojë swap sipas kodit të gjelbër kështu që kur ajo e sheh një dhe kur ajo sheh b, ai nuk ka vetëm të kopjoni a dhe b dhe lëvizur qumësht dhe lëng portokalli. Qumësht dhe lëng portokalli metaforë tani prishet, sepse ato janë gota e hartave të lëngshme dhe jo. Ne kemi në vend të kësaj duhet të shkoni për të adresuar 10 dhe duhet të shkoni për të adresuar 11, dhe pastaj të kryejë këtë logjikë shkëmbejnë. Pra, logjika është e njëjtë, por ne kemi nevojë për një mënyrë pak më të ndryshme e qasjes atyre variablave. Dhe kështu në fund, çfarë Programi ka për të parë si është kjo. Në swap.c kopjuar fjalë për fjalë dhe ngjit versionin e gjelbër. Por kam nevojë për të bërë një ndryshim. Kjo nuk është e mjaftueshme vetëm për të ndryshuar swap. Çfarë linja të tjera të kodit nuk kam nevojë për të ndryshuar? Po? Audienca: Aty ku ajo merr argumentet. DAVID J. Malan: Ku ajo merr argumentin e saj. Pra, nëse unë lëviz deri në kryesor, unë nuk mund vetëm të kalojë në x dhe y, dhe, unë premtoj, i fundit pjesë e sintaksë të re sot. Unë kam nevojë për të kaluar në jo x dhe y por adresa e x dhe y. Dhe kjo rezulton, simbolin se autorët e C zgjodhi është në qoftë se ju përdorni një 'e këtu, për të mos të ngatërrohet me simbolin komercial bitwise, në qoftë se ju përdorni një 'e këtu dhe një simbol këtu, kjo kupton për ju, çfarë është adresa e X, ndoshta kjo është 10, çfarë është adresa e y, ndoshta është 11, dhe kalon ato në vend. Pra, shumë për të absorbuar të gjitha përnjëherë. Por le të shohim tani shpejt në tona katër minuta të mbetura ku gjërat mund të shkojnë shtrembër. Dhe si një mënjanë, në të vërtetë Mora këtë foto, TF mori këtë foto një vit apo dy më parë. Pra, kjo është këndi prapa i Eliot Dining Hall. Pointers janë ndoshta më të vështirat temë që ne të mbuluar në CS50. Pra, nëse keni merak lloj i pjerrësisë është si ndoshta është më shumë një shkop hokej si kjo, të kuptojë ne jemi lloj i afrohet një kulm në kushtet e kompleksitetit konceptuale. Dhe nxjerr këtë foto, sepse unë betohem Perëndia, në vjeshtë të vitit 1996, kur mora CS50 me shokët time të mësimdhënies, Nishat Mehta, ai u ul më poshtë në qoshe e Eliot D. Sallën gjatë drekës, apo darkë, apo diçka të provoni për të ndihmuar mua të kuptoj pointers. Dhe ky është vendi ku unë kam qenë javë pas ajo u prezantua në leksion kur është Unë më në fund e kuptoi pointers. Dhe unë jam me shpresë se kjo do të klikoni larg më shpejt për ju. Por e kuptojnë këtë absolutisht ndër temat më të sofistikuara ne kemi shikuar. Por kjo është ndër më të fuqishme. Dhe kur ju të merrni atë, kjo është me të vërtetë të gjithë vetëm do të në fund të vijnë së bashku. Pra, pjesa tjetër e siguroi se nuk ka nevojë për të gjitha lavaman në sot. Kështu që këtu është programi i fundit ne jemi duke shkuar për të parë. Dhe ne jemi duke shkuar për t'i dhënë fund me një shpejtë tre minuta e claymation bërë nga miku ynë, Nick Parlante. Këtu ka një program, që në dy krye Linjat e deklaron një x ndryshueshme dhe y. Dy prej të cilave janë adresat e integers, AKA pointers. Ne pastaj të ndajë të mjaftueshme kujtesës për të ruajtur një int dhe ruajtur adresën i atij kujtesës në x. Pra, kjo është edhe më të thjeshta se shembullin e para. Më jep katër byte memorje, kjo është madhësia e një int, dhe të vënë atë adresë në x. Kjo linjë do të thotë këtu shkoni në adresën në x dhe vënë në kuptimin e jeta, numri 42 atje. Por kjo linjë shqetëson mua. Star y do të thotë të shkojnë në adresën në y, dhe të vënë numrin pafat 13 atje. Pse është e rrezikshme, në këtë pikë në story-- megjithëse tha shpejt në minutat tona te zbehta here-- pse është e keqe për mua të them, shkoni në adresën në y? Audienca: Nuk Keni [e padëgjueshme]. DAVID J. Malan: Unë nuk kam vënë asgjë në y. Pra, çfarë është vlera e y, në këtë pikë në histori? Ne nuk kemi asnjë ide. Kjo është disa vlera mbeturina dhe as nuk e di Binky. Në qoftë se ne mund të përfundojë në këtë shënim. [VIDEO rishikim] Hej, Binky, zgjoheni. Është koha për argëtim akrep. -Cfare eshte kjo? Mësoni rreth pointers? Oh, Goody. Paj, për të filluar, unë mendoj që ne jemi do të ketë nevojë për një çift pointers. -NE RREGULL. Ky kod ndan dy pointers të cilat mund të tregojnë për integers. -OK, Edhe unë shoh dy pointers, por ata nuk duket të jetë duke treguar për çdo gjë. -Kjo Është e drejtë. Fillimisht pointers nuk tregojnë asgjë. Gjërat që ata tregojnë për të quajtur pointees dhe vendosjen e tyre deri është një hap i veçantë. -Oh, E drejtë, e drejtë. E dija. Të pointees janë të ndara. Pra, si ju akordojë një pointee? -OK, Pra ky kodi sistemimin një pointee ri numër i plotë, dhe kjo pjesë përcakton x të tregojnë për të. Hej, kjo duket më mirë. Kështu që e bëjnë atë të bëjë diçka. -OK, Unë do dereference x tregues për ruajtur numrin 42 në pointee saj. Për këtë mashtrim, unë do të duhet tim shkop magjik e dereferencing. Shkop magjik sa I përket të dereferencing? Uh, kjo, kjo është e madhe. -Kjo Është ajo që kodi duket si. Unë do të vendosur vetëm numrin and-- [POP SOUND] Hej, shikoni atje ajo shkon. Pra, duke bërë një dereference në x poshtë shigjeta për të hyrë në 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. -NE RREGULL. Unë do të shkoj vetëm mbi këtu për y, dhe për të marrë numrin 13 ngritur. Dhe pastaj të marrin shkop magjik e dereferencing dhe just-- [Sirenë të shëndoshë] -Oh, Hej se nuk keni punuar. Thuaj, uh, Binky, unë nuk e bëj mendoj dereferencing y është një ide e mirë, sepse vendosjen deri në pointee është një hap i veçantë. Dhe unë nuk mendoj se ne ndonjëherë e bëri atë. -Hmm, Pikë e mirë. -Yeah, Ne ndarë treguesin, y, por ne kurrë nuk e vendosi atë në tregojnë për një pointee. -Hmm, Shumë i vëmendshëm. Hej, ju jeni në kërkim të mira atje, Binky. Mund të rregullohet në mënyrë që pikat y në të njëjtin pointee si x. -Sigurisht, Unë përdorin shkop magjik e mia e caktimit akrep. -A Është se do të jetë një Problemi, si më parë? -Jo, Kjo nuk prek pointees. Ajo thjesht ndryshon një akrep për pikë në të njëjtën thing-- [Popping SOUND] --as tjetër. -Oh, Unë shoh. Tani pikë y në të njëjtin vend si x. Pra, prisni, tani y është fikse. Ajo ka një pointee. Kështu që ju mund të provoni shkop magjik e dereferencing përsëri për të dërguar 13 gjatë. -Oh, OK, këtu shkon. Hej, shikoni në atë. Tani dereferencing punimeve në y. Dhe për shkak pointers janë të ndarë se një pointee, ata të dy e shohin 13. -Yeah, Ndarjen, uh, çfarëdo. Pra, do të shkojmë për të kaluar vende tani? -Oh, Shikoni ne jemi jashtë kohe. -But-- -Vetëm Mbani mend tre rregullat akrep. Numër 1, struktura bazë është se ju keni një tregues, dhe kjo tregon mbi një pointee. Por tregues dhe pointee janë të ndara. Dhe gabim i zakonshëm është për të ngritur një akrep por për të harruar për të dhënë atë një pointee. Numri 2, dereferencing akrep fillon në treguesin dhe ndjek shigjetën e saj mbi për të hyrë në pointee saj. Siç e dimë të gjithë, kjo punon vetëm nëse ka është një pointee, cili lloj i merr përsëri për të sunduar numrin 1. Numri 3, akrep Detyra merr një akrep dhe ndryshon atë për pikë në njëjtë pointee si një tjetër tregues. Pra, pas detyrës, dy pointers do pikë të njëjtin pointee, nganjëherë kjo quhet ndarja. Dhe kjo është e gjitha nuk është për atë, me të vërtetë. Bye-bye tani. [END rishikim] DAVID J. Malan: Kjo është ajo për CS50. Falë Profesor Nick Parlante. Ne do të shihemi javën e ardhshme. [Duke luajtur elektronike Muzikë]