[Powered by Google Translate] [Java 4, vazhdoi] [David J. Malan - Universiteti i Harvardit] [Kjo është CS50. - CS50.TV] Kjo është CS50, dhe kjo është fundi i javës 4. Pra, disa lajme të mira dhe disa lajme të këqija. Asnjë leksion të hënën, nuk ka problem vendosur javën e ardhshme. [Studentët brohorisnin] Ju nuk do të jeni si kjo ku po shkon. Por ne nuk kemi këtë vend e mërkura e ardhshme, dhe ka edhe sipas 1 leksionin e premte planin mësimor të premten tjetër në mënyrë që ne mund të qëndrojnë në rrugën e duhur. Por çdo gjë do të jetë filmuar si zakonisht, në mënyrë që të mos shqetësohen. Dhe në lidhje me quiz 0 çka ne do të bëjmë në drejtim fundi i javës është postuar në cs50.net kursin e homepage një shpjegim e çfarë lloj të pritjeve që ju duhet të keni kur është fjala për të quiz e parë. Në përgjithësi, kjo do të jetë zgjedhja shumta, e vërtetë-false, Përgjigja e shkurtër, probleme të shkurtër kodim. Ju nuk do të jeni të pritet që të zbatojë ekuivalent e një problemi që ju do të shihni në një pset, për të cilën ju keni një kompjuter dhe një Rregullues dhe si, por nuk do të ketë probleme të vogla kodim. Dhe me të vërtetë, udhëzues të mirë për të marrë një kuptim të asaj CS50 kuize janë si është të shkoni në cs50.net, shkoni në linkun kuize, dhe ju mund të shihni disa vitet e fundit me vlerë të kuize. Vetëm të kuptojnë se planprogrami nuk ka qenë gjithmonë e njëjtë me kalimin e viteve. Ndonjëherë ne shtoni, zbres ndonjëherë, kështu që nëse ju shihni ndonjë temë në një nga ato të vjetra kuize që ju nuk kanë idenë se çfarë është duke folur rreth, ajo është ose që ne nuk do ta mbulojë apo se ne nuk kemi mbuluar atë. Por në formë të rishikimeve, kjo diel, hënë, dhe të martën si dhe një kurs-gjerë seancën shqyrtimit në natën e diel - kohën dhe vendin që do të shpallet në faqen e kursit së - të gjithë ju keni një mundësi për të shqyrtuar me miqtë e kursit të mësimdhënies materiale për këtë vit, si në seksionin dhe si një klasë të plotë, dhe ata që do të filmohet si zakonisht si. Dakord. Kështu, pa zhurmë më tej, një koment mbi të kalojë / dështojnë dhe të shtoni / rënie. Ju mund të keni parë shënimet e mia natën e kaluar, dhe kjo është me të vërtetë vetëm disa siguri shtesë se në qoftë se ju jeni në mesin e atyre pak veçanërisht të rehatshme apo diku në mes dhe ju jeni ndjeheni vetëm pak në mbi kokën tuaj, të kuptojë se është me të vërtetë mjaft normale, dhe ka një strukturë të mjaftueshme mbështetje në vend, njëra prej të cilave orarit të punës ishin të përqendruar në përmirësimin e të gjithë për një natë shumë-mail tim të fundit, dhe të kuptojë gjithashtu se një opsion si të kalojë / dështojnë për një klasë si kjo vërtet është menduar si një mekanizëm për të marrë buzë off e një kurs si kjo, kështu që përsëri nëse ju jeni të shpenzimeve ato 10, 15, 20 orë vetëm duke u përpjekur për të marrë disa pset për të punuar dhe ju e dini që ju jeni 90-95% të rrugës ka por ju nuk mund të gjeni disa bug mallkuar, në një të kalojë / dështojnë modelin që është lloj rregull. Ideja është që me këtë mekanizëm atëherë ju mund të shkoni të përqëndrohet në psets tuaja të tjera ose fle apo çfarëdo qoftë ajo është që ju doni të përqëndrohet në. Pra, të kuptojnë se ju keni deri në këtë e marta vjen - teknikisht të hënën 5, por kjo është një festë, kështu që kjo e marta vjen - për të kaluar nga të kalojë / dështojnë të kundërta vlerësohet apo zv. Dhe në qoftë se jeni të vërtetë në greminë dhe janë duke menduar të rënë krejt, ju lutem kapur mua pas leksionit, ose të më bjerë një shënim. Ne do të duan të paktën chat para se të ofertës lamtumirë. Dakord. Pra, kemi filluar duke marrë rrota trajnimit off herë të fundit. Në veçanti, ne u përqendruam në varg. String është diçka që është deklaruar në bibliotekë CS50, veçanërisht në atë dosje të quajtur cs50.h të cilat ne do të fillojmë të shikojmë në këtë javë dhe të ardhshëm. Por string është me të vërtetë vetëm një thjeshtësim i diçka kjo është pak më shumë arcanely përshkruar si char *. Char ne jemi njohur me të. Është vetëm një karakter të vetme. Por * nga e hëna pėrcaktuara çfarë? >> [Student] A pointer. Një tregues. Dhe çfarë është një akrep? >> [Student] Një adresë. Është si një adresë, një vend në kujtesë. Çfarë është një adresë apo vendndodhja ose memorie? Përsëri, të gjithë prej nesh kanë laptopë me një koncert apo 2 gigabajt të RAM më shumë gjasa këto ditë, dhe që do të thotë se ju keni një miliardë, ose 2 miliardë bytes vlerë e kujtesës. Dhe kjo nuk ka rëndësi se çfarë ajo duket si fizikisht, por të marrë mbi besimin që ju mund të numërojmë të gjitha bytes individuale që laptop tuaj ka - kjo është byte 0, kjo është bajt 1, kjo është 2 miliard byte - dhe kjo është pikërisht ajo që e bën një kompjuter. Kur ju japë hapësirë ​​për një karakter të vetëm, për shembull, ajo padyshim ka për të jetuar diku në kujtesë të kompjuterit tuaj, dhe ndoshta kjo është në numrin 12345 byte, dhe kjo është diku deri këtu në kujtesën e kompjuterit tuaj. Dhe adresa e atë karakter është 12345. Tani, në javën 0 deri tani deri tani, ne nuk kemi me të vërtetë kujdesej ku në gjërat e kujtesës janë ruajtur, sepse ne zakonisht përdorin simbolet, variablave, dhe vargjeve të vërtetë të marrë në të dhënat tona. Por, nga e hëna dhe të gjithë më sot, ju jeni tani do të ketë të gjitha aftësitë më ekspresive me programet e shkruar me të vërtetë të manipuluar kujtesën e një kompjuteri megjithatë ju e gjykojnë të arsyeshme, për të dy qëllime të mira dhe të këqija, mete qenë një rezultat shumë të zakonshme në këtë pikë në të mësuar këtë stuff. Por ajo që e bën atë të vërtetë do të thotë të jetë një * char? Le të shkojnë përpara përsëri në - dhe ne do të kthehen në Binky siç kishte premtuar sot. Le të shkojnë në një shembull të thjeshtë këtu. Më lejoni të ruaj këtë foto si compare.c, dhe më lejoni vetëm të marrë disa kodin template këtu kështu përfshijnë stdio.h, më lejoni të jap edhe veten përfshijnë cs50.h. Unë do të zoom në deri atje. Më lejoni të filloni të shkruani int kryesor, kryesor (i pavlefshëm), dhe tani unë dua të bëj diçka si kjo: printf ("Më jepni një varg:") dhe pastaj unë do të përdorë s String merr getString për të marrë një varg nga përdoruesit, atëherë unë jam duke shkuar për të kërkojë nga shfrytëzuesi për një tjetër. ("Më jep edhe një varg:") dhe unë jam duke shkuar për të kërkuar atyre nëpërmjet getString për të marrë atë. Unë do të thërrasë atë për shkak t t vjen pas s dhe s është një emër i bukur për një varg qoftë se kjo është goxha gjenerike. Pra getString, dhe tani unë vetëm dua të bëj një kontroll mendje e shëndoshë dhe unë jam duke shkuar për të thënë në qoftë se (== s t), atëherë unë jam vetëm duke shkuar për të treguar përdorues printf ("Ju shtypen njëjtën gjë \ n"); tjetër unë jam duke shkuar për të shkruar diçka si ("keni shtypur diçka të ndryshme! \ n") apo çfarëdo dënimi do të jetë. Pra, diçka si kjo. Pastaj si zakonisht, unë do të kthehen 0 cilat vetëm treguan se asgjë e keqe nuk ka ndodhur, dhe unë jam duke shkuar për të shkuar përpara dhe të përpilojnë dhe të drejtuar këtë program. Por të hënën kemi vrapoi këtë program, dhe në fakt u është thënë se nuk është HELLO HELLO dhe lamtumirë nuk është lamtumirë. Sjellja ne pamë ishte një pak më shumë si kjo. Më lejoni të shkoj në directory time burim, zoom në këtu, dhe le të bëjnë krahasimin. Përpiluar në rregull. Më lejoni të drejtuar krahasuar. Më jepni një varg: HELLO. Më jepni një tjetër varg: HELLO. Ju shtypur diçka të ndryshme! E pra, më lejoni të provoni diçka të thjeshtë si 50, 50. Ju shtypur diçka të ndryshme! hi, hi. Mënyrë të qartë, diçka po ndodh këtu. Por ajo që ishte shpjegim se pse? Me sa duket, linjë 12 është krejtësisht jofunksionale. Çfarë është problemi themelor këtu? Po. >> [Student] Është krahasuar adresat. Po, pikërisht. Është e vërtetë krahasuar adresat në të cilën PËRSHËNDETJE dhe PËRSHËNDETJE janë ruajtur. Kjo nuk është krahasuar letra PËRSHËNDETJE përsëri dhe përsëri, sepse ajo që ka ndodhur me të vërtetë, e gjithë kjo kohë ne kemi qenë duke përdorur getString - Kjo dërrasë e zezë është përsëri kujtesën e kompjuterit tonë, dhe le të thonë se unë e quaj getString pas shpalljes së një e ndryshueshme. Çfarë do kujtesën time duken si? Le të themi se në mënyrë arbitrare s duket si ky. Kjo është një katror. Dhe shumë e shumë çdo herë që unë kam tërhequr një pjesë të kujtesës në ekran në qoftë se ajo është 32 bit Unë kam qenë i tërhequr sheshet si kjo, sepse me të vërtetë në aplikim, një tregues, një adresë, është 32 bit. Është e njëjtë si një int. Kjo mund të ndryshojnë bazuar në sistemin kompjuterik. Ata prej jush që janë paksa të njohur me faktin se Mac apo PC tuaj është 64 bit, që në fakt tregon se kompjuteri juaj është duke përdorur 64-bit pointers, 64-bit adresat, dhe në mesin e upsides e që është kompjuterat tuaj RAM mund të ketë shumë më tepër se kaluar. Histori të gjatë të shkurtër, përsëri në ditën kur kompjuterat përdorur vetëm 32 bit për të përfaqësuar adresa, numri më i madh i bytes ju mund të përfaqësojë në këtë rast ishte, çfarë nëse ju keni 32 bit? Pra 4 miliardë, e drejtë, sepse 2 të 32 është 4 miliard dollarë. Ky numër ka qenë përsëritur në kurs. Pra, nëse ju keni vetem 32 bit, numri më i lartë ju mund të mbështeteni për të është rreth 4 miliardë. Por kjo ishte një kufizim themelore e kompjuterave deri disa vite më parë sepse në qoftë se ju mund të mbështeteni aq i lartë sa 4 miliardë, kjo nuk ka rëndësi nëse ju bleni 8 gigabajt RAM apo edhe 5 gigabajt të RAM; ju nuk mund të llogarisë që të lartë, kështu që ishte e kotë. Ju vetëm mund të hyni në të parë 3 ose 4 gigabajt të memories të kompjuterit tuaj. Kjo është më pak e një çështje tani, dhe ju mund të bleni Pro MacBook dhe Dells me 8 gigabajt RAM apo edhe më shumë këto ditë. Por në qoftë se unë ndajë fare thjesht në këtë program një tregues, një tregues i quajtur s, kjo mund të duket si ky në ekran, sepse me të vërtetë kemi nevojë për të zhvishem përsëri këtë shtresë. Unë mbaj duke thënë varg, por nga e hëna, string është me të vërtetë * char, Adresa e disa karakter. Pra, le të marrin atë rrota trajnimit jashtë, edhe pse ne do të vazhdojmë duke përdorur getString tani për tani. Kështu që unë kam deklaruar s, dhe kjo është një copë e kujtesës, 32 bit. Çfarë është këtu në kujtim by default? >> [Përgjigja e padëgjueshme Student] Çfarë është ajo? >> [Student] Garbage. Garbage. >> Saktësisht. Nëse ju programues nuk e vënë një vlerë në një variabël, që e di se çfarë është ajo? Ndonjëherë ju merrni me fat dhe kjo është 0, që është lloj i një vlerë të bukur, të pastër e parazgjedhur, por siç e pamë hënën, nganjëherë kjo është absurditet të plotë, disa Numri vërtetë e madhe pozitive apo negative që erdhi nga ku? Po. >> [Student] Funksioni parë. Po >>. Shpesh funksion që u bëri thirrje më parë për shkak të kujtuar, si ju telefononi funksionet në kujtesë, ata marrin shumë hapësirë ​​dhe më shumë nga poshtë lart, dhe sa më shpejt të kthimit funksionit, se kujtesa e merr ripërdoren nga djalë tjetër që merr quajtur, i cili është duke përdorur fetë tuaj e njëjtë të kujtesës. Dhe në qoftë se ju keni mbetur atje plehrat, vlerat e mëparshme, ne mund gabim s si ka disa vlera, kur me të vërtetë ne nuk e kemi vënë asgjë atje. Pra, RAM tonë në këtë pikë duket si ky. Tani në anën e djathtë të vijës 7 ne jemi duke bërë thirrje getString, të cilat ne kemi qenë duke bërë tani për disa javë, por ajo që është me të vërtetë duke bërë getString? GetString shkruar nga stafi CS50 është pak inteligjent në atë sa më shpejt si përdorues fillon çelësat shtypni dhe hits Enter, Shifrat getString se si shumë tasteve bëri hit përdoruesit, sa karaktere nuk kam nevojë të ndajë RAM për të. Dhe ku që vjen nga RAM, kush e di? Është diku në gigabajt 2 kompjuterit tuaj ose gjësend të kujtesës. Por le të supozojmë se kompjuteri gjeti hapësirë ​​për fjalën HELLO drejtë këtu. Fjala I shtypur ishte H-E-L-L-O. Dhe në qoftë se ne barazim këtë si një sekuencë të karaktereve, ne mund të tërheqë atë si kjo. Por unë duhet të bëni 1 gjë shtesë. Çka i përket në fund të çdo varg në C? Karakteri null, të cilat kemi shkruar sa \ 0. Kjo është teknikisht numrin 0, por backslash bën të gjitha më të qartë se kjo është fjalë për fjalë numri 0, 0 integer; nuk është, për shembull, të japin kuotën e 0-mbyll thonjëzat që ju mund të shkruani në tastierë. Pra, kjo është HELLO. Dhe çfarë u themi të hënën se një funksion si getString është në të vërtetë të gjitha këto kthehen javë? Kjo nuk është kthyer një varg në vetvete, sepse kjo nuk ka të vërtetë kanë kuptim sepse vargjet nuk ekzistojnë. Ata janë lloj i një trillim në bibliotekën CS50. Çfarë është me të vërtetë një varg, më teknikisht? >> [Student] Është karakteri i parë. Saktësisht. Kjo është mjaft e thjesht adresën e karakterit të parë që përdoruesi shtypen in Pra, nëse fjala ime PËRSHËNDETJE përfundon atë deri në 123 numri i bajt dhe pastaj në numrin 124 byte, 125, 126, dhe kështu me radhë, në qoftë se unë vetëm numrin bytes mia nga 0 deri në, ajo me të vërtetë është kthyer getString është fjalë për fjalë 123 numri. Pra, çfarë merr vënë në s është 123 numri jo, H letër, jo fjala HELLO, thjesht adresa në të cilën unë mund të gjeni shkronjën e parë të HELLO. Por kjo nuk duket si e mjaftueshme. I pyetur ju për një varg, jo një karakter. Pra, si nuk kemi, ose kompjuteri di se Ello lloj i ardhur së bashku me H? Çfarë është lloj i marrëveshjes kemi? Po. [Student] Ajo mban thënë vetë për të gjetur karaktere disa më shumë. Pikërisht >>. Nuk është kjo konventë njeriut-kompjuter ku, kur ju jeni që kanë të bëjnë me vargjet, njohur ndryshe tani si yje char, ju thjesht duhet të kuptoj se ku në fund të çdo varg në jetën është me të vërtetë vetëm iterating mbi atë me një për lak, një lak, ndërsa, çfarëdo, në mënyrë që kur ju të gjeni në fund të vargut tani ju mund të konkludoj nga kjo, oh, fjala ishte tërë HELLO. Ata prej jush me përvojë programimit paraprake mund të dini në Java vetëm ju mund të telefononi. gjatësia dhe në gjuhë të tjera që ju mund të telefononi ose gjatësi të ngjashme. Kjo për shkak se në shumë gjuhë, veçanërisht gjëra të quhet object-oriented gjuhë, gjatësia e diçka është lloj i encapsulated brenda e copë e të dhënave vetë, shumë si ne kartat e identitetit encapsulated dhe emrat dhe shtëpitë brenda një studenti të hënën. Por C është niveli shumë i ulët. Nuk ka objekte apo klasa, në qoftë se ju keni dëgjuar këto terma më parë. Të gjithë ju duhet të vërtetë është adresa e memories. Pra, kjo është lloj i modës së vjetër mënyrë të përfaqësojnë të dhënat interesante struktura. Ju keni një vlerë të fillojë si adresën e karakterit parë dhe pastaj vetëm disa konventa arbitrare që të gjithë janë dakord që duhet të ndiqni. Pra, si është gjatësia string zbatohet, nuk kemi propozuar? Strlen, strlen, që disa prej jush kanë përdorur tashmë disa herë. Është shumë e thjeshtë, apo jo? Është si 2 rreshta të kodit. Kjo është shumë e shumë një lak për të disa lloj, ndoshta me një ndryshore shtesë lokale. Por strlen vetëm ka për të marrë një tregues dhe pastaj të fillojmë të shikojmë për \ 0. Dhe sa më shpejt që ajo e gjen atë, ai mund të kthehet në numrin e përgjithshëm të hapave që ajo është marrë në atë varg. Pra, ne mund të konkludoj nga kjo ajo që shkon mbi të ardhshëm. Supozoni atëherë unë deklaroj t si unë kam bërë në përputhje 10. Kjo është një vlerë e mbeturinave. Kush e di në fillim? Por, në anën e djathtë të vijës së 10 Unë jam duke bërë thirrje getString përsëri. Kush e di se ku përfundon kjo? Le të themi se në mënyrë arbitrare të sistemit operativ gjeti hapësirë ​​për atë mënyrë mbi këtu. Unë të ndodhë që rastësisht tipit H-E-L-L-O përsëri, dhe kështu që ne mund të tërheqë të njëjtin lloj foto. Por fakti që unë kam ribërë këtë foto është e qëllimshme sepse kjo është një tjetër PËRSHËNDETJE se ky. Kështu që këtu kjo mund të jetë vendndodhja 456, kjo është 457, dhe kështu me radhë. Pra, çfarë merr vënë pikëpyetje ku dikur ishte? Në këtë rast 456. Ne jemi picking këto numra në mënyrë arbitrare, sepse me të vërtetë, pasi sot ne nuk jemi duke shkuar për t'u kujdesur aq shumë për atë që adresa e çdo gjë është. Gjithcka ne lidhje me kujdes është se ne mund të kuptoj se adresa e një pjesë të të dhënave si HELLO. Pra, me të vërtetë ajo që shumica e njerëzve bëjnë në shkenca kompjuterike, kur flasim për adresat e memories dhe duke folur për pointers në mënyrë specifike, në vend se të shqetësojë duke parafytyruar se 123 - i cili kujdeset, ku kjo stuff është fakt, ne vetëm e di se ajo është në një adresë numerike - ne thjeshtojë botën dhe vetëm thonë se s është vënë në atë karakter dhe t është treguar në atë karakter. Dhe fakti se ajo është një shigjetë është mjaft i qëllimshëm sepse fjalë tani s është treguar në H dhe t është treguar në H tjetër sepse në fund të ditës, kjo nuk ka rëndësi se çfarë është adresa, por ka rëndësi që ne kemi aftësinë për të shprehur atë adresë me një copë të kodit. Ne nuk kemi manipuluar me të vërtetë këto adresa vetëm ende kështu që ne do të shohim se ku mund ndërkall dhe lloj të bëjnë gjëra me pointers, por tani për tani në përputhje fjalë për fjalë atë 12 Vlerat jemi krahasuar sipas kësaj historie në linjë 12? Ne jemi duke thënë është e barabartë me 123 456 të barabartë? Dhe kjo nuk është patjetër kështu. Dhe madje edhe konceptuale, ky tregues nuk është aspak e njëjtë si kjo sepse ju thirri getString dy herë, dhe getString nuk përpiqet të jetë super i zgjuar, nuk përpiqet për të realizuar, oh, ju typed PËRSHËNDETJE 5 minuta më parë; më lejoni t'ju jap treguesin e njëjtë si unë ju dha më parë, ajo vetëm ndan një pjesë të re të memories çdo kohë që ju e quani atë. Deri sa nuk kemi rregullojmë këtë problem? Nëse unë dua të nivelit të lartë për të krahasuar vargjet Përshëndetje dhe HELLO - Unë nuk e kujdesit në lidhje me pointers - si do të shkoj në lidhje me duke u përgjigjur në pyetjen, e përdoruesit të tipit të njëjtën gjë? Çfarë është e nevojshme këtu? Po. [Student] Përdorni një funksion. >> Kam mund përdorim një funksion nga kutisë. Unë mund të përdorur një funksion quajtur strcmp, s-T-R-c-m-p, vetëm versioni i shkurtuar për të thënë string krahasuar. Dhe në qoftë se ne do të shkojmë në, për shembull, krahasoni 2, e cila është ndër lëmosha e sotme, Bëj pikërisht këtë. I mbajtur gjithçka tjetër njëjtë nga linjë 1 më poshtë për 26 apo më shumë, dhe tani vini re kjo pjesë ka ndryshuar vetëm pak. Le të injorojë linjë 28 për një moment dhe të përqëndrohet vetëm në këtë. Çfarë të themi të hënën se str Krahaso bën? Ajo trajton procesin e marrjes së 2 pointers, s dhe t në këtë rast, lloj praktikisht vënë gishtin e saj në këto 2 letra, dhe atë që duhet të bëni është diçka si një lak, ndërsa një për lak ose, dhe ai thotë se janë këto të njëjta? Nëse është kështu, ajo lëviz gishtat ose pointers përpara. Janë këto të njëjta, këto të njëjtën gjë, këto të njëjta, këto të njëjta, këto të njëjtën gjë? Dhe ooh, unë jam në fund të vargut në të dy s dhe t. Unë nuk e kam gjetur ndonjë kundërthënie. Po, këto vargje janë të njëjta. Dhe çfarë bën str krahasoni kthimin në qoftë se 2 vargjet janë të njëjta, me sa duket? Zero. Pra, 0 është e mirë në këtë rast, sepse në qoftë se ajo kthehet -1 ose +1, që do të thotë se është vetëm ndodh që të vijnë para apo pas t alfabetike t. Dhe pse do që të jetë e dobishme që të ketë një funksion që ju tregon që vargu vjen para ose pas në një fjalor? [Student] kërkuar. Kërkimi >> dhe klasifikim. Kështu që ju mund të bëni gjëra të tilla si kërkim binar apo lloj lloj flluskë apo bashkojë ku ju keni për të krahasuar gjëra. Deri tani ne kemi lloj të prerë disa qoshe dhe bisedoi vetëm për klasifikim në kontekstin e numrave për shkak se ajo është e bukur dhe e lehtë për të folur rreth, por ju me siguri mund të krahasohen vargjet, mollë dhe banane, sepse në qoftë se Apple është i njohur për të ardhur para banane, në mënyrë të ngjashme, ju mund të lëvizin nëpër vargjet në kujtesë vetëm si Rob bëri me lloj bashkojë në video dhe ne e bëmë këtu në skenë me lloj lloj përzgjedhjes, futje, dhe lloj flluskë. Pra, ku tjetër mund të marrim këtë? Le të provoni këtë. Lloj Le të harrojmë se mësim për një moment dhe të përpiqemi tani dhe kopje 1.c të bëjë në vijim. 21 Në përputhje unë jam duke thënë diçka të shtypura, atëherë unë jam duke marrë një varg nga përdoruesit, atëherë unë jam kontrolluar këtë. Ne nuk kemi marrë vërtetë në këtë zakon, por tani le të bëjmë këtë. Le të vërtetë zhvishem mbrapa shtresë këtë. Kjo është me të vërtetë * char. Ky djalë është me të vërtetë * char. Pra, çfarë do të thotë për të kontrolluar nëse s == NULL? Ajo rezulton se kur ju telefononi një funksion si getString ose më në përgjithësi kërkoni vetëm një kompjuter për të ju japin disa kujtesës, diçka mund të shkojnë keq. Ju mund të jetë i çmendur dhe të kërkojë kompjuterin për një terabyte e kujtesës duke kërkuar për triliona bytes e kujtesës që thjesht nuk ekzistojnë në kompjuter, por funksionet getString dhe të tjera kanë nevojë për disa mënyra të yelling në ju në qoftë se ju keni kërkuar shumë. Dhe mënyra getString e bën këtë është në qoftë se ju keni kërkuar për memorie më shumë se është në dispozicion në kompjuter, edhe në qoftë se është super, super probabilitet të ulët sepse askush prej nesh nuk do të shkruani një trilion karaktere dhe pastaj goditi Enter, por probabiliteti i ulët edhe pse ajo mund të jetë, unë ende dua të shikoni për atë vetëm në rast se, dhe vlera e veçantë që getString, përgjigje, dhe funksionet e tjera kthimit nëse diçka ka shkuar keq është NULL në të gjitha shkronja kapitale. Dhe çfarë është NULL? NULL ndodh pikërisht kështu që të përfaqësojë një akrep. Kjo është adresa e kujtesës 0. Bota vendosi që në mënyrë arbitrare, në qoftë se kjo është kujtesa e kompjuterit tim - ju e dini se çfarë? - ne jemi duke shkuar për të vjedhur vetëm 1 byte memorie të çdo kompjuter, dhe kjo është lokacioni 0. Ne jemi duke shkuar për të dhënë atë një pseudonim e NULL, dhe ne jemi duke shkuar për premtoj se ne kurrë nuk do të vërtetë të vënë të dhënat reale atje sepse ne vetëm arbitrarisht nevojë për një vlerë të veçantë, 0, NULL, aka kështu që ne mund të çirrem në përdoruesit, nëse diçka shkon keq. Përndryshe ju nuk mund të di do të thotë 0 vënë diçka këtu ose e bën atë të thotë diçka shkoi keq? Ne duhet të gjithë janë dakord se asgjë nuk do të thotë NULL u kthye, ka adresë aktuale u kthye. Tani, këtu unë jam vetëm miratimin konventën e mia njerëzore të kthehem nga 1 kryesore nëse diçka shkon keq. Kjo është për shkak se Konventa kryesor i kthimit është që Kthen 0 nëqoftëse mirë, 1 ose disa vlera të tjera, nëse e keqe. Por getString dhe çdo funksion që merret në kthimin e kujtesës NULL nëse diçka shkon keq. Rregull. Kështu për fat të keq, linja 27, e thjeshtë super edhe pse ajo është plotësisht dështon të kopjoni string. Pse? Ne mund të shohim këtë si më poshtë. Unë jam duke pretenduar në linjë 27 të bërë një kopje të ve dhe duke e quajtur atë t. Kështu që unë nuk jam duke kërkuar përdorues për 2 vargjet këtë kohë, unë jam vetëm duke thënë se vlera në S duhet të vihet në t si. Deri tani vetëm për të demonstruar se si kjo është e thyer, në përputhje 29 e tutje çfarë jam unë duke bërë? Së pari unë jam duke kontrolluar, nëse gjatësia e t është më e madhe se 0. Ka disa string atje. Përdorues shtypur diçka in Çfarë është duke bërë 32 linja, me sa duket? [Përgjigja e padëgjueshme Student] E drejta. >> Ju mund të lloj të konkludoj atë nga ajo që kam thënë se është duke bërë. Por teknikisht, çfarë është kjo duke bërë? t [0] përfaqëson çfarë? [Student] Karakteri 0. >> [Malan] Karakteri 0. Ose, më shumë njeriut-si, karakteri i parë në t, çfarëdo që është, H ndoshta në këtë rast. Dhe toupper bën atë që thotë. Ajo capitalizes karakterin 0 t dhe ajo ndryshon atë. Pra, kjo do të thotë të marrë karakterin 0 t, e bëjnë atë uppercase, dhe e vënë atë përsëri në atë vend të njëjtë. Pra, nëse unë lloji përshëndetje në Fjala, kjo duhet të ndryshojë h vogle me një kapital H. Por problemi është se në linjat 35 dhe 36 atë që unë jam gati të bëni është të shtypura jashtë për të na s dhe t. Dhe çfarë është fetë juaj? Çfarë jam unë në fakt duke shkuar për të parë nëse unë shtypur në përshëndetje në të gjitha Fjala? Çfarë do të merrni shtypur? >> [Përgjigja e padëgjueshme Studenti] >> Çfarë është ajo? [Student] Big H dhe pjesa tjetër e vogël. H >> mëdha dhe pjesa tjetër e vogël për të cilin, s apo t? [Student] Të dyja. Të dyja >>. Saktësisht. Pra, le të shohim se çfarë po ndodh këtu. Më lejoni të shkoj përpara dhe të përpilojnë këtë. Kjo është copy1, prandaj sigurohuni copy1. Dakord. Zoom in lejoni të shkojnë përpara dhe për të drejtuar copy1, Enter, Thuaj diçka: hello në Fjala. Ajo kapitalizuar kopje, por ajo duket kapitalizohen origjinal, si edhe, sepse ajo që tani ndodh në këtë histori? Në linjë 27 Unë në fakt nuk duket të jetë kopjimi string, por edhe pse ju mund të keni shpresuar intuitive që të jetë rasti, në qoftë se ju mendoni për këtë foto, ajo me të vërtetë kam bërë? Gjysma e foto është e njëjtë. Kështu që le të rrokulliset prapa në kohë në mënyrë që t ende nuk ekziston në histori. S mund të ekzistojë në histori, por le me të vogla përshëndetje këtë kohë. Pra më lejoni të zgjidhur atë që unë shtypur në fakt in Në këtë rast këtu kemi h-e-l-L-o. Ne do të tërheqë atë si një sekuencë të karaktereve, vendos linja e mia këtu dhe ndarës 0 \ tim. Pra, kjo është ajo ku ne jemi sa më shpejt të vijë 1 deri 24-ish, japin ose të marrë, e kanë ekzekutuar. Kjo është fotografia e kujtesës sime. Kur të shkoj në linjë 27, çfarë ndodh? Ashtu si më parë, kam marrë një tregues, të cilën unë do të të nxjerrë në këtë shesh. Është quajtur t. Dhe çfarë është vlera e tij by default? Kush e di? Disa vlera mbeturina. Kështu që unë do abstrakte që larg si një pikëpyetje. Dhe sa më shpejt të djathtë anën e linjës 27 ekzekuton, çfarë jam unë vënë në brendësi të t? E njëjta gjë që është në s. Pra, nëse ne për një çast të hequr këtë abstraksion e shigjetës dhe ne themi, oh, kjo është ngarkesa e kujtesës adresa 123, kur ju thoni t merr s, pikëpresje, ju jeni fjalë për fjalë vënë 123 here. Tani në qoftë se ne lloj të thjeshtojë botën tonë përsëri me fotografi, atë që keni bërë me të vërtetë është shtuar vetëm një shigjetë në botën tuaj që është treguar nga t në vargun e njëjtë e saktë. Pra, kur në pajtim 31 dhe 32 Unë në fakt shkoni në lidhje me ndryshimin t [0] çfarë është t [0] duket sinonim me tani? s [0] Pra, kjo është gjithçka që po ndodh. Dhe, edhe pse ky lloj i ndjen një nivel pak më të ulët dhe misterioze dhe ky lloj ndjehet si ndoshta kjo duhet intuitive kanë punuar vetëm - Unë kam bërë kopje të gjërave para dhe vetëm ajo ka punuar - në qoftë se ju në të vërtetë mendoni se çka me të vërtetë është një varg, kjo është një char *. E pra, çfarë është kjo? Kjo është adresa e disa karakter. Atëherë ndoshta kjo e bën më shumë kuptim se kur ju të përpiqet të bëjë diçka super në dukje e thjeshtë si kjo, të gjithë ju jeni bërë është kopjuar një adresë memorie. Ju nuk jeni në të vërtetë duke bërë diçka me vargun vetë. Pra, edhe në qoftë se ju nuk keni ide se si ju do të zgjidhë këtë problem në kod, nivelit të lartë, konceptualisht, çfarë ne duhet të bëjmë në mënyrë që ta kopje e vërtetë e ve, me sa duket? Po. >> [Student] T'i jepte një vendndodhje të re? Pikërisht >>. Ne duhet të japim t një vend krejt të re. Ne kemi nevojë për të krijuar disi një botë në të cilën ne të marrë një pjesë të re të memories, të cilat vetëm për hir të qartësisë unë do të nxjerrë të drejtë poshtë këtë, por kjo nuk duhet të jetë atje. Por ajo duhet të jetë të njëjtën madhësi, kështu që unë do të nxjerrë këto linja vertikale në të njëjtin vend. Kjo është në rregull në qoftë se kjo është e gjitha mbeturinave fillimisht. Kush e di se çfarë ishte aty? Por hapi i 1 do të duhet të japin mua si kujtim sa kam nevojë të përshtaten një kopje të hello, atëherë të kuptoj se si për të kopjuar h këtu, të e këtu, l këtu dhe kështu me radhë. Por kjo tashmë duhet të mendojnë pak më qartë edhe në qoftë se disa nga detajet janë ende abstrakt. Për të kopjuar këtë varg në këtë, kjo është vetëm një për lak ose një lak, ndërsa apo diçka me të cilën ju keni bërë të gjitha më të njohur. Pra, le të provoni këtë. Më lejoni të shkoj në copy2.c. Në copy2.c ne kemi gati programin e njëjtë me përjashtim të linjës 27. Ajo duket një kompleks pak, por në qoftë se ne e thyer atë copë me copë, majtë anë është e njëjtë. Char * t krijon këtë gjë në kujtesë, megjithëse me një pikëpyetje sepse ne nuk kemi ide se çfarë është atje by default. Në anën e djathtë ne jemi tani duke futur një funksion të ri, malloc, për memorie ndajë, jepni kujtesës, dhe kjo me sa duket merr sa argumente, sa shumë gjëra brenda kllapa? Kam dëgjuar murmuritjet e 1 dhe 2, por kjo është vetëm 1. Nuk ka asnjë presje, që do të thotë se ka vetëm 1 gjë brenda kllapa. Edhe pse nuk ka kllapa të tjera, më lejoni të theksoj çfarë është brenda e kllapa outermost, dhe kjo është kjo shprehje: (Strlen (s) + 1) * sizeof (char). Pra, nëse ne fakt mendoj se kjo anë, ky është thënë jepni gjatësinë e s. Pse jam unë, edhe pse, duke shtuar 1 mbi gjatësinë? >> [Përgjigja e padëgjueshme Student] Saktësisht. Ne kemi nevojë për hapësirë ​​për këtë djalë në bisht, karakter i gjashtë që nuk ka asnjë kuptim anglisht por nuk kanë domethënie të veçantë programatike. Pra, ne kemi nevojë për një + 1 per shkak se strlen kthimit pritje njerëzore të gjatësisë, Përshëndetje ose 5, kjo nuk ju japin karakter shtesë null. Kështu që unë shtuar manualisht këtë me + 1. Dhe pastaj kjo, madhësia e * (char), ne nuk e kemi parë këtë më parë. Kjo nuk është teknikisht një funksion. Kjo është një fjalen veçantë që vetëm ju tregon se çfarë madhësia është i disa lloj të dhënave në një kompjuter sepse në të vërtetë, disa prej nesh kanë 32-bit kompjutera. Unë kam një kompjuter mjaft të vjetër në shtëpi, dhe ajo vetëm përdor 32 bit për të përfaqësuar pointers. Dhe kështu që nëse kam bërë madhësinë e një lloji të dhënave, mund të jetë 32 bit. Por në qoftë se unë jam duke përdorur kompjuterin tim të ri dashuroj, unë mund të kthehet një vlerë prej 64 bit për diçka si një adresë. Pra, në këtë rast, vetëm të jetë i sigurt super, ne nuk jemi duke shkuar për diçka të vështirë koduar si - mirë, çfarë është madhësia e një char sipas asaj që kemi thënë deri më tani? Ne kemi shumë e shumë të thënë gojarisht se është 1 byte, dhe kjo është shumë e shumë të vërtetë në të gjithë bordit. Por përsëri, supozime priren të jenë të këqija. Ata të çojë në software buggy nëse njerëzit përdorin softuer tuaj në mënyra që ju nuk ndërmend. Pra, le abstrakte kjo larg dhe vetëm më generically thonë Unë kam nevojë për këtë shumë chunks e kujtesës dhe çdo copë e kujtesës duhet të jetë e barabartë me madhësinë e një karakter, e cila është në fakt e barabartë me 1, në këtë rast, por kjo është një mënyrë më të përgjithshme e të shkruarit atë. Pra, nëse fjala është përshëndetje, sa bytes i malloc duket akordojë për përshëndetje? [Student] Gjashtë. Gjashtë >>. Pikërisht aq sa kemi pikëpyetje në ekran. Dhe pastaj të marrë një guess tani bazohen në të kuptuarit e juaj e getString çfarë do të malloc ndoshta kthehet? >> [Student] Një adresë. Një adresë të kujt? Nga copë e parë të kujtesës. Ne nuk kemi asnjë ide se çfarë është atje për shkak se disa funksion tjetër mund të ketë qenë përdorur këtë memorie më parë. Por malloc, si getString, kthen adresën e bajt parë e kujtesës se ka vënë mënjanë për ty. Megjithatë, ajo nuk ka të bëni është të plotësoni në bosh këtë me një karakter null backslash sepse kjo rezulton nga ju mund të përdorni malloc të ndajë asgjë: ints, vargjet, vargjeve, gjithandej, strukturat studentore. Ju mund të përdorni malloc plotësisht përgjithësi. Ajo nuk kujdeset apo duhet të dini se çfarë ju jeni alokimin e kujtesës për të. Pra, kjo do të jetë mendjemadhe për malloc për të vënë një \ 0 në fund të çdo copë e kujtesës kjo është duke ju dhënë sepse kjo \ 0 gjë është vetëm një konventë për vargjet. Ajo nuk është përdorur për ints, ajo nuk është përdorur për gjithandej, nuk është përdorur për studentët. Dhe kështu Gotcha me malloc është se barra është tërësisht mbi ju programues për të kujtuar se sa shumë ju bytes ndarë dhe të mos e përdorin kurrë një për lak ose një lak, ndërsa dhe kaloj kufirin e copë e kujtesës që ju keni qenë të caktuar. Vendos një mënyrë tjetër, sa më shpejt që ju të kujtesës, ju nuk mund të kërkoni sistemin operativ, oh, nga rruga, si e madhe e një copë e kujtesës ishte kjo? Kjo është plotësisht deri në ju për të kujtuar nëse keni nevojë për atë vlerë. Pra, le të shohim se si unë të vazhdojë të përdorë këtë memorie. Në linjë 28 dhe 29 pse jam unë duke bërë këtë? Vetëm kontrolloni mendje e shëndoshë e përgjithshme. Vetëm në rast se diçka shkoi keq, unë kërkoj për disa sasi të çmendur e kujtesës ose unë kam kaq shumë gjëra në drejtimin e kompjuterit që ka vetëm nuk është kujtesë të mjaftueshme, diçka të tillë, unë të paktën të dëshironi të kontrolloni for null. Në realitet, shumica e kompjuterëve do t'ju japë iluzionin se çdo program mund të përdorni tërësinë e RAM tuaj, por edhe kështu, në qoftë se përdoruesi në disa lloje të vargut të gjatë të çmendur ndoshta për shkak se ata janë një djalë i keq dhe ata janë në fakt duke u përpjekur për të rrëzuar programin tuaj ose hack në të, ju doni që të paktën të kontrolloni vlerën e kthimit të malloc dhe nëse ajo është e barabartë null. Dhe nëse bën atë, le të vetëm të lë tani, sepse unë nuk e di se çfarë të bëjë në këtë rast. Si mund të kopjoni string? Ka disa mënyra për ta bërë këtë. Ka str kopjoni funksionet në C, por kjo është super e thjeshtë për ne për të bërë këtë mënyrë modës së vjetër. Së pari më lejoni të kuptoj se çfarë është gjatësia e s. Unë mund të ketë vënë këtë në lak, por në vend të kësaj unë vetëm vënë atë këtu për qartësi. Pra, n tani ruan gjatësinë e vargut origjinal, i cili është me sa duket 5. Pastaj në lak tim unë jam për iterating nga 0 deri në mbi n, dhe në çdo përsëritje unë jam duke s [i] në brendësi të t [i]. Pra, kjo është ajo që kam nënkuptuar me gishtat e mi 2 duke treguar në vargjet më parë. Si kjo për lak iterates si kjo, unë jam duke shkuar për të kopjuar h në këtu, e ne këtu, në l këtu sepse kjo është s, kjo është t. Dhe pastaj në fund, në përputhje 35 pse jam unë duke bërë këtë? Unë kam nevojë për të bërë të sigurtë që unë jam duke i dhënë fund t string. Dhe unë e bëri atë në këtë mënyrë të jetë super të qartë. Por propozojë, dikush, nëse ju mund të, një mënyrë të ndryshme për të bërë këtë. Unë vërtetë nuk kanë nevojë për linjë të 35. Nuk është një tjetër mënyrë për të bërë këtë. Po. >> [Përgjigja e padëgjueshme Studenti] >> Thuaj se louder. [Student] pak se ose e barabartë me. Pikërisht >>. Ne mund të them vetëm më pak se ose e barabartë me n, i cili në përgjithësi ka qenë e keqe sepse pothuajse gjithmonë kur të shkojmë deri në një të barabartë me gjë ne jemi të numërimit ne do të shkojmë 1 hap shumë larg. Por mos harroni, sa nuk kemi bytes ndajë? Ne e ndarë strlen s, kështu që 5 + 1 për një total prej 6. Pra, në këtë rast ne mund të bëjmë diçka si kjo kështu që ne jemi duke kopjuar jo vetëm përshëndetje, por edhe \ 0 në fund. Përndryshe, ne mund të përdorim një funksion të quajtur str kopje, strcpy, por që nuk do të jetë kënaqësi aq shumë. Por kjo është e gjitha ajo ka nën kapuç. Pastaj fundi, ne bëjmë të njëjtën gjë si më parë. Unë germa t dhe pastaj unë pretendojnë se origjinali duket si ky dhe kopja duket si kjo. Pra, le të provoni këtë tani. Më lejoni të shkoj në këtu. Bëni copy2. Ne do të zoom në dhe të drejtuar copy2. Unë jam duke shkuar të shkruani në përshëndetje në Fjala, dhe me të vërtetë kam marrë me të vogla përshëndetje si origjinale por kryeqyteti Përshëndetje për kopje. Por unë nuk jam bërë vetëm ende. Unë kam nevojë për të bërë 1 gjëja e fundit këtu. 46 dhe 47 është e qartë çlirimin e kujtesës, por çfarë do të thotë që në të vërtetë? Çfarë jam unë duke bërë, a mendoni se, duke e quajtur linjë 46 dhe 47 linjë? Çfarë efekti do të ketë kjo? Po. [Përgjigja e padëgjueshme Student] >> Pikërisht. Ju jeni vetëm duke u thënë të sistemit operativ, hej, faleminderit për këtë kujtesë. Ju tani mund të përdorni atë për dikë tjetër. Dhe këtu është një shembull i përsosur i vlerave mbeturinash. Unë kam përdorur vetëm këtë memorie të shkruani fjalën përshëndetje në 2 vende, këtu, këtu, këtu dhe këtu. Kështu kjo është h-E-l-l-O-\ 0. Por pastaj unë e quaj linjë dhe linjës 46 47, dhe ju e dini se çfarë ndodh atje në aspektin e foto? Në fakt, prisni, kjo foto është e vjetër. Pasi të kemi bërë kopje, ky djalë është në fakt duke treguar këtu, kështu që le të hiqni numrat dhe vetëm abstrakte larg si shigjeta tona përsëri. Çfarë ndodh në këtë foto, kur unë e quaj të lirë? [Përgjigja e padëgjueshme Studenti] >> As. Nëse bëj thirrje të lirë në ve dhe t - lloj i një pyetje mashtrim - kete foto nuk do të ndryshojë në të gjitha sepse duke bërë thirrje dhe duke bërë thirrje t s vetëm tregon sistemit operativ, hej, ju mund të përdorni këtë memorie përsëri, por kjo nuk do të ndryshojë këtë null ose disa karakter të veçantë, kjo nuk do të ndryshojë këtë, kjo nuk do të ndryshojë h ose E ose l ose L ose O në ose vend me asgjë tjetër. Në kushtet e foto, sa më shpejt që ju e quani të lira, asgjë nuk ndryshon. Dhe aty qëndron origjinën e vlerave plehrash, sepse në qoftë se unë pastaj më vonë në këtë program kërkoni sistemit operativ për më shumë memorie me getString ose malloc ose diçka si kjo dhe sistemit operativ thotë, i sigurt, unë kam 12 bytes të memories liruar vetëm deri, përdorni këto, çfarë po ju do të dorëzohet? Ju do të jeni të dorëzuar një pjesë e kujtesës që ne zakonisht do të nxjerrë me pikëpyetje, por çfarë janë ato pikëpyetje? Ato ndodhë të jetë h-E-l-l-O, h-E-l-l-O. Këto janë vlerat tona të reja plehrash sa më shpejt që ju të lirë deri kujtesës atë. Ka një implikim i vërtetë botërore edhe këtu. Kjo ndodh të bëjë me RAM, por kompjuterat tuaj të vërtetë të bëjë të njëjtën gjë me disk. Ne do të flasim për këtë në veçanti me një sërë problemeve të ardhshme që fokusohet në mjekësinë ligjore. Por çfarë ndodh në të vërtetë në qoftë se ju keni disa fotografi të ndjeshme financiare në tavolinën e punës tuaj JPEG ose disa hollësira dhe ju zvarrit atë në plehra tuaj, çfarë ndodh kur ju drag atë në plehra apo Recycle Bin? Ju e dinte se çfarë isha duke folur rreth. [Qeshura] Çfarë ndodh kur ju keni zvarritur atë dëshmi në bin tuaj riciklimi apo plehra mund? [Përgjigja e padëgjueshme Student] E pra, në mënyrë të kujdesshme. Çfarë ndodh kur ju bëni këtë? Përgjigja e shkurtër është asgjë, e drejtë? Fotografi paqarta ose të ndjeshme është ende vetëm ulur atje diku në hard drive tuaj. Shumica prej nesh së paku kanë mësuar rrugën e vështirë që ju duhet të zbrazët plehra tuaj ose Recycle Bin tuaj në fakt fshini fotografi. Dhe me të vërtetë, kur ju right click ose kontroll klikoni mbi plehra tuaj mund të ose zgjidhni, plehra bosh apo çfarëdo të imazhit dhe ju të vërtetë bosh plehra mund ose Recycle Bin, çfarë në të vërtetë ndodh, atëherë në këtë foto? Asgjë më shumë. Pra, asgjë nuk ndodh në të vërtetë në disk. Dhe nëse ne vetëm përkohësisht dal nga tema dhe shkruani - I'll përdorni vetëm pjesën e prapme të kësaj. Deri tani historia po ndryshon nga RAM, i cili është ku ekzistojnë programe ndërsa ju jeni drejtimin e tyre, në disk, i cili është ku ata janë ruajtur afat të gjatë edhe kur pushteti shkon jashtë, tani për tani - dhe ne do të kthehen në këtë në të ardhmen - le të vetëm të pretendojë se kjo paraqet brenda hard drive e kompjuterit tuaj sepse mbrapa në ditë ato përdoren për të disqe rrethore, ashtu si floppy disqe. Pra, nëse ju keni disa fotografi të ndjeshme Excel, ajo mund të marrë këtë copë e kujtesës në diskun e kompjuterit tuaj, dhe unë jam vetëm duke tërhequr 1s dhe 0s njëjtin arbitrare. Kur ju drag fotografi si kjo në plehra tuaj mund ose riciklimi bin, fjalë për fjalë asgjë nuk ndodh sepse Apple dhe Microsoft kanë vendosur vetëm plehra mund dhe Recycle Bin është me të vërtetë vetëm një placeholder përkohshme. Ndoshta përfundimisht OS do të zbrazin atë për ju, por në mënyrë tipike, kjo nuk ka të bëjë asgjë, së paku deri sa ju jeni me të vërtetë të ulët në hapësirë. Megjithatë, kur ju shkoni në plehra bosh ose bosh Recycle Bin, Në mënyrë të ngjashme, asgjë nuk ndodh në këtë foto. Gjithçka që ndodh është diku tjetër në kompjuterin tuaj, nuk është një lloj i tabelës. Kjo është lloj i si një fletë mashtrojnë pak që thotë se, le të themi, resume.doc, kështu rinisë tuaj në një skedar në Microsoft Word përdorur për të jetuar në vendin 123 në diskun tuaj të vështirë, jo në kujtesën dhe jo në RAM, por në diskun tuaj të vështirë, dhe jeta paqarta tuaja JPEG në 456, dhe fotografi Excel tuaj jeton në 789 ose kudo. Kur ju fshini fotografi me të vërtetë zbrazja e plehra apo Recycle Bin, kete foto nuk ndryshon. The 0s dhe 1s në hard drive tuaj nuk shkojnë kudo. Por kjo tabelë, kjo bazë të dhënash pak terezi, e bën ndryshimin. Kur ju fshini rinisë tuaj, kjo është sikur file fshihet në një farë mënyre, por të gjithë kompjuteri nuk është harruar se ku jeton gjë në hard drive tuaj. The 0s dhe 1s që përbëjnë rinisë tuaj ose ndonjë nga këto fotografi të tjera janë ende të paprekura. Pra, nëse ju e bëri këtë aksidentalisht, nuk ka ende një jo-zero probabiliteti që ju mund të shërohen të dhënat tuaja duke përdorur Norton Utilities ose ndonjë softuer komercial Qëllimi i të cilit në jetë është për të gjetur 0s dhe 1s që kanë lloj qenë jetimë, harruar këtu, por la këtu, në mënyrë që ju mund të merrni të dhënat tuaja prapa. Ose hetuesit mjeko-ligjorë me policinë ose FBI në fakt do të marrë një hard drive dhe në fakt të shikoni për modelet e 0s dhe 1s që duken si JPEG, duken si fotografi Excel, dhe të shërohen ato në këtë mënyrë edhe në qoftë se kompjuteri ka harruar ata atje. Pra, mënyra e vetme me të vërtetë për të fshirë të dhënat, si ne do të diskutojmë në të ardhmen, është për pastrim ose fshirë skedarin ose hard disk duke - Ju nuk mund të vërtetë të hequr qafe të 0s dhe 1s sepse përndryshe ju do të fillojë me një hard drive Gigabyte dhe ju do të përfundojë me një makinë megabyte vështirë në qoftë se ju vazhdimisht janë fshirë, fjalë për fjalë, 0s dhe 1s. Pra, çfarë do të bëni nëse ju me të vërtetë të kërkuar për të mbuluar gjurmët tuaja dhe problemi themelor është se ka ende 0s dhe 1s në disk? Unë po të shoh dikë që ju do të gesticulating fizikisht thyejnë pajisjen. Që do të punojnë. [Qeshur] Por nëse kjo është lloj i një zgjidhje të shtrenjtë, ajo do të jetë më e arsyeshme? Po. >> [Student] Mbishkruaj ato. Mbishkruaj >> ato me çfarë? >> [Student] Të dhëna të tjera. Të dhëna të tjera. Ju vetëm mund të prishësh diskun tuaj me 0s 1s ose ose të gjitha 0s, 1s gjitha. Dhe kjo është me të vërtetë atë që disa prej programeve bën. Ju mund të bleni software apo edhe të merrni free software, dhe ndërtuar edhe në të Mac OS këto ditë, më pak në Windows, është aftësia për të sigurt fshihet. Në fakt, në qoftë se ju doni të drejtuar të gjithë në shtëpi sot, nëse ju keni një Mac dhe e bëjnë këtë, në qoftë se ju keni marrë disa sende në plehra tuaj mund të, ju mund të bëni Secure Empty Trash, që bën pikërisht këtë. Në vend se vetëm fotografi fshihet këtu, kjo nuk do të fshihet 0s dhe 1s këtu, përkundrazi, ajo vetëm ndryshon të gjithë ata, për shembull, për të 0s dhe dot, dot, dot. Pra, një nga psets tuaja në të ardhmen do të jetë në fakt për qëllim të mbulojë të dhënave - fotografitë që ne kemi marrë të njerëzve, vendeve, dhe gjërat në kampus për të cilat ne do të bëjë një imazh mjeko-ligjore të kartës një aparat fotografik dixhital të kujtesës, cila është ideja e saktë njëjtë - dhe ju do të keni për të sfiduar në fakt të gjetur modelet që përfaqësojnë jpegs në hard drive tuaj, shumë si student i atij të cilit ish-mail kam lexuar disa javë më parë ka për të rimarrë fotografi motrës së tij. Pse nuk kemi marrë një pushim 5-minutëshe këtu, dhe ne do të rigrupohen me më shumë memorie. Kështu që këtu është ajo ku gjërat marrin pak mendje-bending, por ky është një hap shumë i fuqishëm drejt të kuptuarit këtë të gjithë shumë. Këtu është një program i quajtur pointers.c. Ajo është ndër kodin e sotme mostrës. Vini re se në linjat e para, 19 deri 22, të gjithë ne po bëjmë është diçka si getString dhe kthimin e një adresë, ruajtjen atë në s. Tani e tutje për pset edhe 3 qoftë se ju doni, por pset 4 dhe në ku ju mund të fillojnë të marrin këto rrota trajnimit jashtë vetes, nuk ka asnjë arsye që të pretendojë se vargjet ekzistojnë më. Kjo është me siguri në rregull për të vetëm të fillojnë duke thënë se char *. Si një mënjanë, në referencat online dhe në libra ju mund të shihni shpesh yllin e ardhshëm të ndryshueshme. Ju mund të shikoni edhe hapësira rreth dy anët e saj. Të gjithë ata janë funksionalisht të sakta. Për tani, megjithatë, ne do të standardizohet në këtë qasje për të bërë super të qartë se * char është si duke thënë treguesin karakter. Kjo është lloj të dhënave. Dhe pastaj emri i variablit është s në këtë rast. Pra, ne kemi marrë një varg dhe ne kemi quajtur atë s. Dhe pastaj këtu poshtë vëreni se unë jam duke bërë në fakt një pak dinakëri. Kjo quhet aritmetike akrep, e cila është lloj i thjeshtë super. Kjo thjesht do të thotë të shtoni dhe zbres numrat për pointers. Por kjo në të vërtetë punon. Ky program duket printime 1 karakterin e vargut s për linjë e tillë që rezultati në fund - Vetëm kështu që ne mund të prishin ku po shkon kjo, të bëjë pointers, drejtuar pointers, më lejoni të zoom in Tani, më lejoni lloji në diçka si HELLO dhe tipi Shkruani dhe printime 1 karakter për linjë. Deri një të dytë më parë, ne do të kemi bërë këtë me simbol kllapa katrore. Ne do të kemi një për lak dhe ne do të bëjmë printf të s [i] dhe ne do të bëjmë këtë përsëri dhe përsëri dhe përsëri me n backslash në fund të çdo rreshti. Por ky program është i ndryshëm. Ky program është përdorur, fjalë për fjalë, aritmetikë. Pra, çfarë po ndodh këtu? Para së gjithash, para se ky lak edhe ekzekuton, çfarë, vetëm të jetë i qartë, është në fakt? S është? >> [Student] Një adresë. Një adresë >>. Dhe ajo është adresa e, në rastin e përshëndetje, karakter parë në atë fjale, e cila është h. Pra s është, në këtë shembull të veçantë, adresa e h. Pra, çfarë do të thotë për të bërë s + i? E pra, unë fillon në 0 për në këtë lak. Ne kemi bërë shumë herë se. I është do të shkojnë deri në gjatësinë e vargut, duket. Kështu në përsëritje e parë të këtij loop, i është padyshim 0. Pra kjo shprehje është thënë s + i - jo, s +0--kjo është padyshim vetëm s. Pra, çfarë është * s këtu? Tani ne jemi duke përdorur yll në një mënyrë paksa të ndryshme. Më lejoni të shkojnë përpara dhe të shpëtoj prej t, sepse ne jemi duke folur për t bërë dhe kopjet e s. Tani ne vetëm dua të them një histori që përfshin s. Dhe kështu në këtë moment, pasi string lloji, bota jonë duket fare si ajo e bëri para me vetëm s ruajtjen adresën e h dhe më në përgjithësi duke treguar në vargun hello. If Unë tani bëni një rresht si * (s + i), le të provoni këtë jashtë. Pra * (s + i). Më lejoni të lehtësuar këtë, sepse kjo është 0, kështu që kjo është * (s +0). E pra, prit një minutë. Lehtësuar më tej. Kjo është * (s). E pra, tani parentheses janë lloj i trashë, kështu që tani le të bëjë vetëm * s. Pra, në përsëritje e parë të këtij lak, atë linjë që nxorri në pah, 26, është shumë e shumë të barabartë me shtypjen këtë. Çfarë është lloji i të dhënave * s? Në këtë kontekst, sepse ylli ndodh të jetë pranë S vetë, por në mënyrë më specifike, sepse ne nuk janë më declaring s, ne nuk jemi duke krijuar një ndryshore më, nuk ka asnjë përmendje të char * në linjë 26, nuk ka përmendur vargun e fjalen, ne jemi vetëm duke përdorur një ndryshore të quajtur s, ajo rezulton tani ylli ka pak të ndryshme dhe, pa dyshim, konfuze kuptim. * S këtu do të thotë shkoni në adresën në të dhe të shtypura çdo gjë është atje. Pra s është këtu, * s është - lloj si Chutes dhe Ladders, ndiqni arrow - këtu. Pra, kjo është * s. Pra, çfarë merr shtypura në përsëritje e parë e atij lak në linjë 26? Unë të shtypura nga% C, e cila është placeholder për një karakter, atëherë një \ n për një linjë të re. * (S + I) ku I eshte 0 është vetëm kjo. Pra, çfarë mund të char vendin në për% c? H. Në përsëritje e ardhshëm të lak - ju ndoshta mund të shihni se ku po shkon kjo - përsëritje e ardhshëm është padyshim i 1, kështu që kjo do të thotë s 1, dhe pastaj tani unë kam nevojë për kllapa sepse tani ylli ka nevojë për të thënë shkoni në adresën e kujtesës s +1. Çfarë është s? Le të rrokulliset prapa në kohë dhe thonë se kjo shigjetë tani nuk është në të vërtetë duke bërë çdo të mirë na. Le është më specifike thonë se kjo është ruajtjen e 123 numrin sepse fillimi i këtij vargut hello, kjo është adresa 123, kjo është 124, dhe kështu me radhë. Pra, në përsëritje të dytë, kur unë jam duke thënë s 1, që është si të thuash 123 1, njohur ndryshe si 124, kështu që atë që merr char shtypur në përsëritje të dytë? E në adresën e kujtesës 124. Pastaj përsëri +, 125, 126, 127, dhe ky lak fatmirësisht ndalet përpara se ne të merrni këtu sepse unë jam duke përdorur strlen të bëni të sigurtë që unë nuk do të llogariten shumë të larta. Kështu që edhe është ajo. Përsëri, kjo është vetëm sikur të kishim bërë një javë më parë. Më lejoni të shkruaj në rreshtin më poshtë, edhe pse ne nuk duam të bëjmë të dyja. Kjo është identike tani për këtë. Pra, edhe pse s është një varg, si ne kemi qenë duke e quajtur atë për disa javë, s është me të vërtetë një * char. Pra, nëse ne duam të jetë super anal, është e vërtetë e duhur për të shkruar karakter të veçantë në vendin ith përdorur këto adresa numerike dhe këtë operator yll, por sinqerisht, kjo është më e pastër vetëm aq shumë. Pra, kjo nuk është e keqe. Nuk ka arsye për të ndaluar bërë line 27 here, por 26 është funksionalisht i njëjtë, dhe kjo është funksionalisht i njëjtë për të pikërisht arsyet që ne kemi diskutuar deri tani. Dhe së fundi, 29 vetëm është praktikë e mirë. Thirrja e pa s do të thotë se tani ju jeni duke i dhënë përsëri kujtesës që ju dha getString sepse përsëri, siç thashë hënë, getString për disa javë ka qenë futur një bug në kodin tuaj. Kodi juaj për javë të tëra ka pasur rrjedhjet e kujtesës ku ju keni qenë duke kërkuar getString për kujtesën, por ju nuk keni qenë duke i dhënë atë. Dhe kjo ishte zgjedhur qëllimisht nga ne pedagogjike sepse kjo është shumë vetëm për të menduar më herët. Por tani ne kemi nevojë për më shumë symmetry. Nëse ju kërkoni kompjuterin për kujtesën, siç është rasti për getString, siç është rasti me sa duket për malloc, ju duhet tani për pset tutje 4 edhe pa asnjë kujtim të tillë. Këtë njoftim është i ndryshëm nga thënë n Int. Ju nuk keni nevojë për të liruar këtë, sepse ju nuk e keni thirrur getString dhe ju nuk e keni thirrur malloc. Dhe edhe në qoftë se ju thirri GetInt si ne do të shohim përfundimisht, GetInt nuk kujtesës për ju, sepse ju në fakt mund të kalojë rreth integers dhe gjithandej dhe chars vetëm mënyrë ne kemi qenë bërë për disa javë. Vargjet, pse, janë të veçantë për shkak se me të vërtetë ata janë varg e karaktere të shumta. Pra, ata janë vetëm të ndryshëm from chars dhe gjithandej dhe ints dhe si. Por ne do të kthehen me atë para se të gjatë. Çfarëdo pyetjeje, atëherë në këtë fillim të pointers? Po. [Pyetja padëgjueshme Student] Ah, pyetje shumë e mirë. Një nga gjërat e pakta C fakt bën për ju, i cili është i përshtatshëm, është ajo shifra për ju atë që madhësia është i tipit të të dhënave dhe pastaj e bën atë lloj shumëzimit për ju. Kjo është e parëndësishme në rastin e karaktere, sepse pothuajse gjithmonë një char është 1 byte, kështu që kjo thjesht punon. Por, për hir të diskutimit, në qoftë se ju në të vërtetë janë integers shtypjen dhe ju ishin duke u përpjekur për të shtypur nga disa vlera s që ishte vënë në një numër të plotë, ju të ngjashme nuk do të duhet të bëjë + 4 * i vetëm sepse një është 4 int bytes. Aritmetike Pointer thotë se C dhe përpiluesit të bëjë të gjitha që math për ju. Të gjithë ju duhet të kujdesen rreth është numërimi në lloj kuptimin njerëzor. Po. [Student] Nëse ju të deklarojë një varg brenda një për lak, a keni për të liruar atë më vonë? Mirë pyetje. Nëse ju shpallur brenda varg e për lak, nuk keni nevojë për të liruar atë më vonë? Ju vetëm duhet të kujtesës të lirë që ju ndajnë me getString ose me malloc. Pra, nëse ju vetëm thoni diçka si - më lejoni të vënë formatimin e teksteve kaçurrel tani kështu që të gjitha kod është i lidhur. Nëse e keni kryer diçka, megjithëse buggily, si kjo, char * t = s, ju nuk keni nevojë që t lira t, sepse nuk përfshijnë ndonjë përmendje të malloc ose getString. Nëse nga ana tjetër ju e bëri këtë, getString, atëherë po, ju do të duhet për t lira. Dhe në fakt, shansi juaj e vetme për të bërë këtë është tani brenda këtij loop, për të njëjtën çështje të fushës që ne kemi diskutuar në të kaluarën. Përndryshe ju do të jetë ndarjen e kujtesës, e kujtesës ndarjen, shpërndarjen e kujtesës, dhe në fund të programit, sepse ju jeni jashtë atij lak, t nuk ekziston, por ju kurrë nuk u tha e sistemit operativ që ju nuk keni nevojë që kujtesë më. Dhe para se të gjatë, për pset 4 ose 5 ne do t'ju pajisë me një program të quajtur Shprehje, e cila është e ngjashme në frymë të gdb në atë që e mori disi e një ndërfaqe misterioze, por qëllimi i tij në jetë është që të ju ndihmojë. Dhe Shprehje është një program që do të në të ardhmen të kërkoni programet tuaja kërkoni për rrjedhjet e kujtesës, qoftë nga getString ose malloc, të cilat ne do të fillojnë duke përdorur të gjitha më shumë si ne të ndaluar përdorimin e bibliotekës CS50 sa më shumë. Ne fund tani kemi lloj e fjalorit dhe llojin e modelit mendor në teori me të cilat për të zgjidhur këtë program thyer. Pra, në këtë program të thyer, swap punon brenda swap, por ajo kurrë nuk ka punuar në të vërtetë në kryesore shkak kryesor kaluar në x dhe y, risjell, dhe ata ishin të kaluar në nga vlerat, kështu që të flasin. Kopjet e tyre janë dhënë në shkëmbim. Deri në fund të swap-it, a dhe b të vërtetë kishte qenë shkëmbyer, por sigurisht x dhe y, siç kemi diskutuar të hënën, nuk kishte qenë. Kështu që unë të propozojë në të gjelbër këtu se kjo është në të vërtetë zgjidhja këtu. Dhe në fakt, më lejoni të lëvizë yjet e mia vetëm të jenë në përputhje edhe pse, përsëri, funksionalisht kjo nuk ka rëndësi. Në javët e ardhshme ne do të shpjegojmë se kur dhe pse kjo ka rëndësi. Pra, në të gjelbër tani është një zgjidhje. Sinqerisht, kjo duket një tërësi shumë çrregullt, sepse unë kam të gjitha këto yje. Më lejoni të theksoj një gjë. Shkarko top këtu ku ai thotë int * a * b dhe int është krejtësisht bërë të njëjtën gjë si ajo gjithmonë ka. Ajo është shpallur argumente 2 ose parametrave të bie në ujdi, e parë e cila është një akrep int quajtur një, dytë e cila është një akrep int quajtur b. E vetmja gjë që është e re në këtë pikë është fakti se ka një yll atje. Çfarë do të thotë kjo? Një nuk është një int, b nuk është një int. Një është adresa e një int dhe b është adresa e një int ndryshme. Poshtë këtu, ky është vendi ku unë pranoj C merr konfuze. Tani ne jemi duke përdorur një yll, por ajo ka kuptim të ndryshëm në këtë kontekst. Sepse ne nuk jemi deklaruar pointers si ne jemi deri këtu, këtu ne jemi dereferencing gjëra. Pra teknikisht, yll në këtë kontekst të vijës së parë, të dytë, të tretë dhe në brendësi të swap-it është operatori dereference, që thjesht do të thotë të shkojnë atje. Pra, ashtu si gishti im ndjekur arrow për h, * Një mjet të shkojnë në atë adresë dhe për të gjetur mua int që është atje. * Mjetet b shkoni në adresën dhe të kalojë më se çfarë është atje. Pra, le të shlyen foto nga e hëna tani duke përdorur një pirg të kornizave, një fund i cili do të jetë kryesor, një sipërme e cila do të jetë swap, në mënyrë që bota jonë duket, ashtu si e hëna, si kjo. Këtu është një copë e kujtesës që kryesor është duke shkuar për t'u përdorur. Kujtojnë nga e hëna se programi kishte vetëm 2 variablave, e quajtur X dhe një i quajtur y, dhe unë kam vënë numrat 1 dhe 2 nuk ka. Tani kur unë e quaj swap si unë e bëri të hënën, më parë, kur kam përdorur versionin e kuqe e këtij programi, i cili duket si ky, I kam 2 parametra, a dhe b, dhe çfarë nuk e kemi shkruar këtu dhe këtu? Vetëm 1 dhe 2, fjalë për fjalë kopje të x dhe y. Sot ne ndryshojmë këtë. Sot në vend të kalimit në ints a dhe b ne jemi duke shkuar për të kaluar në 2 adresat. Këto adresa të ndodhë për pikë të ints, por ato nuk janë adresat ints veten. Ata janë adresat. Është si një adresë postare në vend. Pra, tani ne kemi nevojë për të vetëm të jap vetes pak më tepër hollësira në ekran. Kjo është e kujtesës kompjuterin tim si ajo ka qenë gjatë gjithë ditës. Tani ne kemi nevojë për disa skema arbitrar numeracionit. Pra, le të them vetëm, vetëm rastësisht, se kjo është adresa e kujtesës 123, 124. Le të thonë se kjo është 125, kjo është 126, dhe kështu me radhë, por kjo është krejtësisht arbitrare. Ne vetëm duhet disa skema që numëron në kujtesën time. Kështu që tani, kur unë në fakt të kalojë në x dhe y, unë nuk jam duke shkuar për të kaluar në x dhe y; Unë jam duke shkuar për të kaluar në adresën postare, kështu që të flasin, të x dhe y të kështu që ajo merr ruhet këtu dhe këtu nuk është 1 dhe 2, por në qoftë se ju mund të shihni tekstin tim të vogël, ajo merr kaluar në këtu dhe këtu? [Përgjigja e padëgjueshme Student] >> Pikërisht. 123 merr vënë këtu dhe 124 merr vënë këtu. Tani, sepse kam përdorur yllin e në këtë mënyrë linjë të parë deri këtu në majë, Programi time vetëm e di se 123 dhe 124, edhe pse ata janë padyshim integers që çdo njeri të mund të vëreni, ato duhet të interpretohen si adresat, adresat numerike. Ata nuk janë në vetvete ints, ata janë adresat, dhe kjo është për shkak se unë kam vënë në mënyrë eksplicite yjet atje. Deri tani në linjë tim të parë, të dytë dhe të tretë të kodit aktual çfarë ndodh këtu? Le të tërheqë pjesën tjetër e foto. Tmp është vetëm si ajo ishte të hënën. Asgjë të veçantë në lidhje me tmp. Kjo është vetëm një lokal 32 bit ndryshueshme, dhe brenda se unë jam në dukje ruajtjen e vlerës së * a. Tani, në qoftë se unë vetëm tha tmp = a, çfarë do të kam vënë këtu? >> [Student] 123. 123. Por kjo nuk është ajo që unë jam duke bërë. Unë jam duke thënë tmp = * a. Mjetet Star shkojnë atje. Kështu që këtu është një, 123. Si mund të shkoj atje? Pretendon si ka një shigjetë. E pra, nuk është, 1. Pra, çfarë merr ruajtur në tmp, me sa duket? Vetëm 1. Pra, me fjalë të tjera, është tmp * a, * një mjet të shkoni në adresën që është aktualisht në një, cila është dukje 123. Mirë, këtu ne jemi në vend të 123, unë shoh numrin 1, kështu që unë jam duke shkuar për të vënë numrin 1 atje. Tani çfarë të bëj në përputhje 2, * a * b =? Kjo është pak më shumë të përfshira, sepse tani ajo është një? Kjo është 123. Pra * a është ku? Drejtë ku unë kam qenë më parë. Kështu që të shkojnë atje. Rregull. Tani, së fundi, dhe pastaj në fund kjo do të fillojë të bëjë kuptim, shpresë, * B thotë se çfarë është në b? 124. Kështu kam nevojë për të shkojnë atje, e cila është 2. Pra, çfarë kam vënë, ku? 2 shkon në këtu, sepse * b * a shkon në. Kështu që unë do të bëj këtë. Dhe ju mund ta shihni tashmë, ndoshta, se ne jemi aq shumë afër për zgjidhjen e këtij problemi budalla, thjeshtë korrekte për herë të parë sepse tani ne ende kemi një kujtesë e asaj x ishte, ne kemi 2 kopje, pa dyshim, nga y, por tani thotë se linja 3 * b. Kështu që këtu është b. * Mjetet b shkojnë atje. Pra, ku është vendndodhja 124? Kjo është me sa duket këtu. Pra, çfarë mund të vënë këtu? Natyrisht, tmp. Deri tani unë e bëjnë këtë. Pra, unë kam këtu dhe 1 2 here. Dhe tani çfarë për të gjithë këtë, 123, 124, dhe 1? Sa më shpejt që kthimet shkëmbim, kjo memorie është aq i mirë sa e humbur sepse sa më shpejt të kthimit swap, sistemit operativ është i lirë të përdorin atë kujtesë përsëri në të ardhmen. Vetëm memorie kryesore së në fund të këtij rafte ashtuquajturës shkopinj rreth. Dhe kështu ne fund kemi tani një version pune. Më lejoni të shkoj në swap.c, dhe vini re në vijim. Në krye të programit kam ndryshuar prototip im të jetë int * a dhe int * b. Pra, e vetmja gjë që unë ndryshuar për të shkuar nga e kuqe, e cila ishte e keqe, të gjelbër, e cila është e mirë, po kam shtuar këtyre yjeve sot. Por pastaj këtu poshtë në shkëmbim të vetë unë kam për të kopjuar, ngjitur ajo ishte vetëm në rrëshqitje. Unë kam një yll këtu, yll ketu - që përputhet me prototipin - dhe pastaj të gjitha këto gjëra tani kanë yjet përveç tmp sepse përdorimi i një ndryshore të përkohshme, nuk ka asgjë të re atje. Unë vetëm nevojë për ruajtje të përkohshme për një int. Pra, ne nuk kemi nevojë për një yll atje. Ne vetëm duhet yll në mënyrë që ne mund të kalojnë këtë lloj të kufirit arbitrare midis këtyre 2 korniza në kujtesë të kompjuterit tim. Por një gjë e kaluar duhet të ndryshojë, dhe ju mund të keni atë tashmë glimpsed. Çfarë linjë tjetër është padyshim ndryshe tani? >> [Student] dhe x. Yeah, kështu që 25 është vija e fundit e kodit kam nevojë për të ndryshuar për këtë për të punuar. Një javë më parë dhe madje edhe të hënën Shkarko 25 dukej si kjo, shkëmbim X dhe Y, dhe kjo u thye vetëm për shkak se në qoftë se ju thonë swap (x, y) ju janë dhënë kopje të x dhe y të bie në ujdi, atëherë ajo është bërë gjë e saj, por ju nuk jeni në të vërtetë ndryshuar x dhe y vetë. Pra, edhe në qoftë se ju kurrë nuk kam parë këtë karakter para me simbolin komercial në kodin, vetëm të marrë një guess. Çfarë do të bëjë simbol, me sa duket? [Student] Merr adresën. Merr >> adresën. Pra simbol është thënë më jepni adresën e x. Kush e di se ku është ajo? Ajo ndodh të jetë 123. Unë nuk e kujdesit. Vetëm më jepni adresën e x. Dhe y do të thotë më jepni adresën e y. Dhe në këtë pikë historia është krejtësisht në përputhje me foto ne tërhoqi një moment më parë. Kështu që unë do të pranoj pointers, sigurisht për mua kur kam filluar të mësuar këtë, ishin padyshim një nga gjërat më të vështira për të mbyllur mendjen time rreth. Por e kuptojnë, veçanërisht si ne të mbajtur luajtur me këto llojet e gjërave, në qoftë se ju thyejnë atë poshtë për këto lloj super të thjeshtë intelektualisht jointeresant probleme e vetëm lëvizin numrat shikoj, përgjigje për një shumë të konfuzionit me pointers me të vërtetë mund të rrjedhin nga këto mekanikë shumë themelore. Këtu është një adresë. Shkoni atje me yllin. Ose anasjelltas, këtu është një simbol. Kuptoj se çfarë në të vërtetë është adresa. Dakord. Pra, ku është e gjithë kjo vjen nga kujtesa? Ne kemi tërhequr kete foto nja dy herë, dhe unë mbaj premtues ne do të kthehemi në të, por këtu është përfaqësimi i kujtesën e kompjuterit tuaj kjo është pak më shumë se etiketuar dërrasë tonë këtu është. Segmenti Teksti në krye përfaqëson atë në lidhje me programin tuaj? [Përgjigja e padëgjueshme Studenti] >> Na vjen keq? Thuaj përsëri. [Student] Programi aktual. Programi aktual >>. Pra tingëllimë 0s dhe 1s që ju keni hartuar pas shkruar kodin C dhe pastaj drejtimin dhe gjenerimin e përfundon 0s dhe 1s deri atje duke u tucked në kujtesë sepse kur ju klikoni dy herë një ikonë për Mac apo PC ose drejtuar një komandë në ftim si mario tuaj, 0s 1s juaj dhe nga disku merrni ngarkuar në memorie në mënyrë që kompjuteri mund të manipulojë ato dhe ekzekutuar ata më shpejt. Të dhënat nisur kështu dhe të dhënat uninitialized, ne nuk do të flasim shumë për ata, por ato janë vetëm variabla globale. Initialized thotë variablave globale që ju dha për vlerat; uninitialized thotë variablave globale se ju ende nuk japin vlera. Pastaj ka këto variabla mjedis të cilën unë do të plotësisht Vala dorën time në, por ata janë atje dhe se gjëra të tilla si dyqane emrin tuaj përdorues dhe lloj tjetër të detaje të nivelit të ulët. Por copa juiciest e shtrirjes kujtesën tuaj është kjo gjë quhet rafte dhe tog. Rafte përsëri, të jetë i qartë, është e kujtesës që është përdorur sa herë që funksionet janë të thirrur, sa herë që ka shumë variabla lokale dhe sa herë janë parametrat duke kaluar rreth. Të gjithë që ndodh në rafte. Tog ne nuk kemi biseduar rreth, por të marrë një guess i cili përdor sasi. Vetëm një copë e ndryshme të kujtesës. Kjo ndodh për të tërhequr këtu në krye, por kjo është një konventë arbitrare pikture. Kush është me sa duket duke përdorur kujtesën nga tog për javë të tëra? Kjo është teknikisht, por ju tërthorazi. >> [Student] getString. GetString dhe malloc. Kështu që këtu është dallimi themelor. Ju e dini për disa javëve të fundit se në qoftë se keni nevojë për kujtesën, vetëm të deklarojë një ndryshore. Nëse keni nevojë për shumë të kujtesës, mund të deklarojë një koleksion të drejtë brenda e funksionit tuaj. Por problemi që ne kemi mbajtur përballur është në qoftë se ju të deklarojë variablave lokale brenda funksioneve, sa më shpejt të kthimit të funksionit, se çfarë ndodh në kujtesën dhe atyre variablave? Vetëm lloj i tij nuk është më e juaja, e drejtë? Ajo thjesht zhduket lloj konceptualisht. Është ende fizikisht atje, natyrisht, por kjo nuk është më e drejta juaj për t'u përdorur. Kjo është padyshim problematike në qoftë se ju dëshironi të shkruani funksionet në jetën që në fakt i kujtesës dhe nuk japin atë menjëherë. Rasti në pikën: Qëllimi getString në jetë është që të kemi asnjë ide paraprakisht si e madhe e një varg që unë jam duke shkuar për të tipit në tastierë, por ajo e mori për të të jetë në gjendje të siguroj kujtesë për të mbajtur Davidin apo Tungjatjeta ose një ese të tërë që përdoruesi mund të keni shtypur in Pra getString ka qenë duke përdorur malloc. Malloc prandaj duhet të jetë duke përdorur jo rafte; vend të kësaj ajo është duke përdorur këtë gjë të quajtur grumbull. Nuk ka asgjë të ndryshme në lidhje me kujtesën. Kjo nuk është e shpejtë apo të ngadalshëm, ose diçka të tillë. Është vetëm fizikisht në një vend tjetër. Por rregulli është se kujtesa që është ndarë në tog kurrë nuk do të merren larg nga ju derisa ju telefononi - të marrë një guess - falas. Në të kundërt, çdo kujtim që ju kërkoni për në rafte vetëm me shpalljen e një grup ose deklaruar një ndryshore si ne kemi qenë bërë për disa javë, që nga default përfundon deri në rafte. Dhe që punon e madhe 90% të kohës, por në ato raste të rralla ku ju doni të caktojë kujtesës dhe për të mbajtur atë rreth, atëherë ju duhet të përdorni një funksion si malloc. Apo ne kemi përdorur një funksion si getString, e cila nga ana e përdor malloc. Le të shohim kur kjo mund të prishen dhe pastaj të marrë një vështrim në Binky. Ne do të kthehen me atë në të ardhmen. Këtu është një program super të thjeshtë që në 2 linja e parë e bën atë? Në anglisht, çfarë bëjnë këto para 2 rreshta të kodit të bëjë brenda kryesore? [Përgjigja e padëgjueshme Student] Kujdesshëm. Ajo nuk më jep adresën e x apo y. [Student] Jep pointers për ints. Mirë >>. Jepni 2 pointers të integers. Me fjalë të tjera, jepni 2 chunks e kujtesës që unë mbaj vizatim sot, edhe pse unë fshirë atë tani, si sheshe. Jepni 2 chunks e kujtesës, e quajtur x, një i quajtur y - më herët kam quajtur ata s dhe t - dhe çfarë është lloji i asaj copë e kujtesës? Kjo do të ruajtur një adresë. Kjo është e tipit int *. Pra, adresa e një int përfundimisht do të jetojnë në x, adresa e një int përfundimisht do të jetojnë në y, por fillimisht, ajo që është në brendësi të x dhe y? Kush e di? Vlerat e mbeturina. Ajo ka asgjë të bëjë me pointers. Në qoftë se ne nuk kemi vënë diçka atje, kush e di se çfarë është në të vërtetë atje? Tani, x. Çfarë ndodh këtu? Kjo është legit tani sepse x është një akrep. Kjo është një int *. Kështu që do të thotë unë mund të vënë në x adresën e disa copë e kujtesës. Çfarë do të malloc kthehet? Përsosur, ajo kthehet adresat, adresën e bajt parë në një copë tërë të kujtesës. Sa është kjo me sa duket bytes ndarjen, për shembull, në aplikim? Çfarë është madhësia e një int? 4. Nëse ju mendoni përsëri në 1 javë, kjo nuk është e super të rëndësishme të kujtojmë gjithmonë se, por në këtë rast është e dobishme të dinë, 4 bytes. Pra, kjo është ndarjes në 4 bytes grumbullosh dhe është kthyer adresën e një të parë për mua në mënyrë arbitrare. Tani, çfarë është duke bërë x? A * x = 42 është duke bërë çfarë? Nëse në këtë pikë në histori kemi x, e cila duket si ky me disa vlera e mbeturinave, ky është tani y me disa vlera mbeturinave, tani në përputhje 3 kam ndarë 4 bytes. Kjo foto thelb duket si ky. Ose më saktë, nëse kjo është adresa arbitrare 123, kjo është ajo që historia jonë tani duket si. * X = 42 tani do të thotë çfarë? Kjo do të thotë të shkojë në 123 adresën dhe të vënë numrin 42 atje. Unë nuk kam nevojë për të nxjerrë këto rreshta, sepse ne nuk jemi duke bërë vargjet. Unë duhet të ketë shkruar vetëm atë si kjo, dhe vetëm për hir të demonstratës së, 42 si një lloj int të merr një shumë hapësirë, 4 bytes. Pra, kjo është ajo që ka ndodhur atje, por ka një problem tani. * Y = 13. Çfarë do të ndodhë këtu? Problemi është * y në botën tonë të thjeshtuar të thotë vetëm të shkoni në adresën në y. Çfarë është në y? Kjo është disa vlera mbeturina. Pra, le të supozojmë se kjo është vlera e mbeturinave 5551212, diçka të çmendur si kjo. * Mjetet y shkojnë për të adresuar 5.551.212. Kjo është si këtu. Ajo nuk ekziston, për shembull. Pra * y merr 13 mjete që unë jam duke u përpjekur për të nxjerrë 13 here. Ajo nuk ekziston. Unë e kam tejkaluar segmentin e dërrasën e zezë. Çfarë mund të shkoj? Kjo fshehtë segmentimit mesazh faji, sepse unë jam duke u përpjekur për të vënë në kujtesën si një vlerë 13 në një vend që nuk ekziston. Pjesa tjetër e programit mund të punojnë në rregull, por deri në atë moment ajo nuk ka. Pra, le të përpiqemi për të treguar këtë histori. Ne do të kthehen në se një herë ne kemi biseduar për magji. Le të kthehemi në këtë dhe të përfundojë me këtë gjë të quajtur Binky, i cili është një profesor risjell Stanford ulur në shtëpi duke luajtur me claymation, për të treguar historinë e pikërisht atij programi të njëjtë. Kjo është vetëm rreth 3 minuta gjatë. Këtu kemi Binky. [Gjuha mashkull në video] Hej Binky, zgjohen. Është koha për argëtim akrep. [Binky] Çfarë është ajo? Mësoni rreth pointers? Oh, me mirësi të shtrirë! [Gjuha mashkull] E pra, për të filluar, unë mendoj që ne do të jeni nevojë për një pointers çift. [Binky] Okay. Ky kod ndan 2 pointers që mund të tregojnë për integers. [Gjuha mashkull] Okay. E pra, unë shoh 2 pointers, por ata nuk duket të jetë duke treguar për asgjë. [Binky] Kjo është e drejtë. Fillimisht, pointers nuk tregojnë për ndonjë gjë. Gjërat që çojnë tek quhen pointees, dhe vendosjen e tyre deri është një hap i veçantë. [Gjuha mashkull] Oh, e drejtë, e drejtë. Unë e dinte se. Të pointees janë të ndara. Eri, kështu si bëni ju akordojë një pointee? [Binky] Okay. Ky kod ndan një pointee ri integer, dhe kjo pjesë vendos x për pikë për të. [Gjuha mashkull] Hej, që duket më mirë. Kështu që e bëjnë atë të bëjë diçka. >> [Binky] Okay. Unë do të dereference X tregues për të ruajtur numrin 42 në pointee saj. Për këtë mashtrim që unë do të duhet shkop magjik e dereferencing time. [Gjuha mashkull] shkop magjik tuaj magjik të dereferencing? Kjo është e madhe. [Binky] Kjo është ajo që duket si kodi. Unë vetëm do të ngritur numrin dhe ... [Popping tingull] [Gjuha mashkull] Hej po, atje shkon. Pra, duke bërë një dereference në vijim x shigjeta për të hyrë në pointee e saj, në këtë rast për të ruajtur 42 në atje. Hej, provoni duke e përdorur atë për të ruajtur numrin e 13 nëpërmjet treguesin tjetër, y. [Binky] Okay. Unë vetëm do të shkoj këtu për y dhe për të marrë 13 numri ngritur dhe pastaj të marrë shkopin e dereferencing dhe vetëm ... [Tingull gumëzhimë] Whoa! [Gjuha mashkull] Oh hey, që nuk punojnë. Thuaj, Binky, unë nuk mendoj se 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ë. [Binky] Hmm, pikë e mirë. [Gjuha mashkull] Yeah. Ne ndarë y akrep, por ne kurrë nuk vënë atë në një pikë të pointee. [Binky] Hmm, shumë i vëmendshëm. [Gjuha mashkull] Hej, ju jeni në kërkim të mira atje, Binky. Ju mund të rregullojmë atë mënyrë që pikë në y pointee njëjtë si x? >> [Binky] Sure. Unë do të përdorin shkop magjik e detyrës time akrep. [Mashkull Gjuha] është se do të jetë një problem si më parë? [Binky] Jo, kjo nuk do të prekë pointees. Ajo vetëm ndryshon një tregues për pikë për të njëjtën gjë si një tjetër. [Popping tingull] [Gjuha mashkull] Oh, unë shoh. Tani y pikë në të njëjtin vend si x. Pra prisni. Tani y është fikse. Ajo ka një pointee. Kështu që ju mund të provoni shkopin e dereferencing përsëri për të dërguar më shumë se 13. [Binky] Uh, në rregull. Këtu shkon. [Popping tingull] [Gjuha mashkull] Hej, shikoni në atë. Tani dereferencing punimeve për y. Dhe për shkak se janë për ndarjen e pointers se pointee një, ata të dy shohin 13. [Binky] Yeah, ndarjen. Çfarëdo. Pra, jemi ne do të kaloni vende tani? [Gjuha mashkull] Oh shiko, ne jemi jashtë kohës. >> [Binky] Por - [Gjuha mashkull] Vetëm mos harroni të 3 rregullat pointer. Numri 1, struktura bazë është se ju keni një tregues dhe ajo tregon mbi një pointee. Por tregues dhe pointee janë të ndara, dhe gabimi i përbashkët është për të ngritur një tregues por për të harrojnë për të dhënë atë një pointee. Numri 2, dereferencing akrep fillon në treguesin dhe ndjek shigjetën e tij mbi për të hyrë në pointee saj. Siç e dimë të gjithë, kjo funksionon vetëm nëse ka një pointee, cili lloj i merr kthehet për të sunduar numër 1. Numri 3, caktimi akrep merr një akrep dhe e ndryshon atë për pikë në pointee njëjtën si një tjetër pointer. Pra, pas caktimit, 2 pointers do të tregojë të njëjtën pointee. Ndonjëherë që është quajtur ndarjen. Dhe kjo është e gjitha nuk është për atë të vërtetë. Bye-bye tani. Kjo është Binky. Kjo është CS50. Ne do të shohim se javën e ardhshme. [Duartrokitje] [CS50.TV]