[Powered by Google Translate] [4. jagu - mugavam] [Rob Bowden - Harvardi Ülikool] [See on CS50. - CS50.TV] Meil on viktoriin homme, juhul kui te poisid ei tea seda. See on põhimõtteliselt kõike, mida võis näha klassi või oleks pidanud klassis. See sisaldab viiteid, kuigi nad on väga hiljutine teema. Sa peaksid vähemalt mõistavad kõrge neist. Midagi, mis oli läinud üle klassis sa peaksid mõistma, et viktoriini. Nii et kui teil on küsimusi nende kohta, võite paluda neil nüüd. Aga see saab olema väga üliõpilane juhitud istungil, kus te esitada küsimusi, nii et loodetavasti inimesed on küsimusi. Kas kellelgi on küsimusi? Jah. >> [Üliõpilane] Kas te lähete üle osuti jälle? Ma lähen üle suunanäitajaks. Kõik teie muutujate korral elada mälu, kuid tavaliselt sa ei muretse, et ja sa ütlesid x + 2 ja y + 3 ja kompilaator aru saada, kus asjad elavad teile. Kui olete tegelevad suunanäitajaks, nüüd sa selgesõnaliselt kasutades nende mälu aadresse. Nii et ühe muutuja aitab ainult elada ühes aadress igal ajahetkel. Kui me tahame tunnistada osuti, mis tüüpi hakkab välja nägema? Ma tahan kuulutada osuti lk. Mis tüüpi välja näeb? [Üliõpilane] int * lk. >> Jah. Nii int * lk. Ja kuidas ma saan teha seda osutada x? >> [Üliõpilane] Ampersand. [Bowden] Nii ampersand on sõna otseses mõttes nimetatakse aadress operaator. Nii et kui ma ütlen & x Läheb mälu aadress muutuja x. Nii et nüüd on mul pointer p ja kõikjal minu koodi saan kasutada * p või ma võiks kasutada x ja see on täpselt sama asi. (* P). Mis on selle teed? Mida see täht tähendab? [Üliõpilane] See tähendab väärtus selles punktis. >> Jah. Nii et kui me vaatame seda, see võib olla väga kasulik töötada välja skeemid kui see on väike kast mälu x, mis juhtub olema väärtus 4, siis on meil vähe kasti mälu p, ja nii p punktid x, nii et me joonistada noole p x. Nii et kui me ütleme, * p me ütleme minna kast, mis on p. Star on Järgige noolt ja siis mida iganes sa tahad, et kast seal. Nii et võin öelda * p = 7; ja mis läheb kasti, mis on x ja muutustele, mis kuni 7. Või ma võiks öelda, int z = * p * 2; See on segadusse ajav, sest see on täht, täht. Üks täht on viite mahavõtmine p, teine ​​täht on korrutades 2-ga. Teade ma oleks võinud sama hästi asendada * p x. Võite kasutada neid samal viisil. Ja siis hiljem saan lk punkt on täiesti uus asi. Võin vaid öelda, p = &z; Nii et nüüd p enam punkte x; osutab ta z. Ja iga kord, kui ma * p see on sama nagu teed z. Nii et kasulik asi on see, kui hakkame sattumist funktsioone. See on selline mõttetu kuulutada osuti, mis näitab, et midagi ja siis sa oled lihtsalt viite mahavõtmine see kui sa oleks võinud kasutada originaal muutuja alustada. Aga kui sa sattuda funktsioonid - nii oletame meil on mõned funktsiooni, int suva, mis võtab osuti ja lihtsalt ei * p = 6; Nagu me nägime enne koos swap, sa ei saa tõhus swap ja eraldi funktsioon poolt sõidame täisarvud, sest kõik C on alati möödub väärtus. Isegi kui sa möödaminnes suunanäitajaks sa möödub väärtus. See lihtsalt nii juhtub, et need väärtused on mälu aadresse. Nii et kui ma ütlen foo (p); Ma panen osuti sisse funktsioon foo ja siis suva teeb * p = 6; Nii seest, et funktsioon, * p on ikka võrdne x, aga ma ei saa kasutada x sees, et funktsioon, kuna see ei ole scoped jooksul seda funktsiooni. Nii * p = 6 on ainus viis võin juurdepääs kohaliku muutuja teise funktsiooni. Või, noh, osuti on ainus viis võin juurdepääs kohaliku muutuja teise funktsiooni. [Üliõpilane] Oletame, et sa tahad tagasi pointer. Kuidas täpselt sa seda tegid? [Bowden] Tagasi osuti nagu midagi int y = 3; tagastamine & y? >> [Üliõpilane] Jah. [Bowden] Okei. Te ei tohiks kunagi teha. See on halb. Ma arvan, et ma nägin neid loeng slaidid sa hakkasid nägema kogu see skeem mälu kus siin sul mälu aadress 0 ja siin all teil on mälu aadress 4 kontserti või 2 32. Siis sul on mõned asjad ja mõned asjad ja siis sa pead oma korstnat ja sul on oma hunnik, mis sa just alustanud õppida, kasvab. [Üliõpilane] ei ole hunnik eespool korstnat? Jah. Hunnik on peal, kas pole? >> [Üliõpilane] Noh, ta pani 0 peal. [Üliõpilane] Oh, ta pani 0 peal. >> [Üliõpilane] Oh, okei. Disclaimer: kusagil CS50 sa lähed, et näha selle nii. >> [Üliõpilane] Okei. See on lihtsalt, et kui sa oled esimene nägemine korstnad, meeldib, kui te arvate korstnat te arvate virnastamine asjad peal üksteist. Nii et meil on kombeks klapp selle ümber nii korstna kasvab nagu pinu tavaliselt, asemel virna ripub alla. >> [Üliõpilane] Ärge hunnikutes tehniliselt kasvada liiga, kuigi? See sõltub sellest, mida te mõtlete kasvada. Korstnat ja hunnik alati kasvab vastupidises suunas. Pinu on alati kasvab selles mõttes, et see kasvab üles Suuremat mälu aadresse ja hunnik kasvab alla aastal, et see kasvab poole väiksema mälu aadresse. Nii et üleval on 0 ja alt on kõrge mälu aadresse. Nad mõlemad kasvab, lihtsalt eri suundades. [Üliõpilane] Ma lihtsalt mõtlesin, et kuna sa ütlesid paned virna alaosas sest tundub, intuitiivsem sest korstnat alustada ülaosas hunnik, hunnik on peal ise ka, et see on - >> Jah. Sa mõtlema ka hunnik nagu kasvab ja suurem, kuid korstna rohkem. Nii et korstnat on see, et me nagu tahaks näidata kasvab. Aga kõikjal vaatad muidu läheb näidata aadress 0 ülaosas ja kõrgeima mälu aadress allosas, nii et see on teie tavaline vaade mälu. Kas teil on küsimus? [Üliõpilane] Kas sa sellest lähemalt rääkida hunnik? Jah. Ma toon selle kohe tagasi. Esiteks, naastes miks tagastamise ja y on halb, kohta virna teil on hunnik Stack raamid, mis esindavad kõiki funktsioone mida on kutsutud. Nii eiramine eelmine asjad, peal oma virna on alati saab olema peamine funktsioon kuna see on esimene ülesanne, mis kuramuse nimetatakse. Ja siis kui sa helistasid teise funktsiooni, korstnat läheb kasvama alla. Nii et kui ma kutsun mõne funktsiooni, suva, ja ta saab oma freimi, see võib helistada mõni funktsioon, baar, see saab oma freimi. Ja baar võiks olla rekursiivne ja see võib helistada ise, ja nii, et teine ​​kõne, et baar ei hakka oma freimi. Ja mis siis läheb nende korstnat raamid on kõik kohalikud muutujad ja kõik funktsiooni argumendid, et - Kõik asjad, mis on kohapeal scoped et seda funktsiooni minna need virna raame. Nii et see tähendab, kui ma ütlesin midagi baar on funktsioon, Ma lihtsalt kuulutada täisarv ja siis tagasi pointer et täisarv. Nii et kui ei y elada? [Üliõpilane] y elab baar. >> [Bowden] Jah. Kuskil see väike ruut mälu on littler ruudul y ta. Kui ma tagasi tulen ja y, ma tagastab viida, mis see väike ploki mälu. Aga siis, kui funktsioon tagastab selle freimi saab ilmus välja pinu. Ja sellepärast nimetatakse seda pinu. See on nagu pinu andmestruktuur, kui sa tead, mis see on. Või lausa virna plaate on alati näiteks peamine on minemas põhjale, siis esimene ülesanne helistate on minemas peal, et ja sa ei saa tagasi Otse kuni naasete kõik funktsioonid, mida on kutsutud mis on asetatud ta. [Üliõpilane] Nii et kui sa tegid seda tagasi ja y, et väärtus võib muutuda ilma ette teatamata. Jah, see on - >> [üliõpilane] See võiks olla kirjutada. >> Jah. See on täiesti - kui te proovida ja - See oleks ka int * baar sest see tagasi pointer, nii selle tasuvus tüüp on int *. Kui üritate kasutada tagastatav väärtus selle funktsiooni, see on määratlemata käitumine sest et osuti osutab halb mälu. >> [Üliõpilane] Okei. Mis siis, kui näiteks teie deklareeritud int * y = malloc (sizeof (int))? Nii on parem. Jah. [Üliõpilane] Me rääkisime sellest, kuidas, kui me tõmmata asju meie prügikasti nad ole tegelikult kustutada, me lihtsalt kaotavad oma suunanäitajaks. Nii et sel juhul me tegelikult kustutada väärtus või on see ikka seal mälu? Enamasti, see läheb siiski olemas. Aga oletame, et me juhtuda, et helistada mõnda muud funktsiooni, Baz. Baz ei hakka oma freimi siin. See saab olema kirjutades üle kõik see kraam, ja siis kui sa hiljem proovida ja kasutada pointer et sul enne, ta ei kavatse olla sama väärtusega. See läheb muutnud lihtsalt sellepärast, et sa helistasid funktsioon Baz. [Üliõpilane] Aga kui me ei oleks, oleks me ikka 3? [Bowden] Suure tõenäosusega sa oleks. Aga sa ei saa tugineda sellele. C lihtsalt ütleb undefined käitumist. [Üliõpilane] Oh, see teeb. Okei. Nii et kui sa tahad tagasi pointer, see on koht, kus malloc on kasutusel. Ma kirjutan tegelikult lihtsalt tagasi malloc (3 * sizeof (int)). Me läheme üle malloc rohkem teine, kuid ideele malloc on kõik oma kohalike muutujate alati minna korstnat. Midagi, mis on malloced läheb hunnik, ja see igavesti ja alati on hunnik kuni sa selgesõnaliselt vabastab ta. Nii et see tähendab, et kui sa malloc midagi, see saab ellu jääda pärast tagastab funktsioon. [Üliõpilane] Kas see jääda ka peale programmi peatub? >> Ei Okei, nii et see saab olema seal, kuni programm on täiesti valmis näitama. >> Jah. Me võime minna üle üksikasjad, mis juhtub siis, kui programm peatub. Võib-olla peate mind meelde, kuid see on eraldi asi täiesti. [Üliõpilane] Nii malloc loob pointer? >> Jah. Malloc - >> [üliõpilane] Ma arvan malloc tähistab ploki mälu, et osuti saab kasutada. [Bowden] Ma tahan, et skeem uuesti. >> [Üliõpilane] Nii et see toimib, kuigi? [Üliõpilane] Jah, malloc tähistab ploki mälu, mida saab kasutada, ja siis tagastab aadress esimese ploki et mälu. [Bowden] Jah. Nii et kui te malloc, sa haarata mõned ploki mälu see on praegu hunnik. Kui hunnik on liiga väike, siis hunnik lihtsalt läheb kasvama, ja see kasvab selles suunas. Ütleme hunnik on liiga väike. Siis on umbes kasvada natuke ja tagasi pointer see plokk, mis lihtsalt kasvas. Kui tasuta asju, sa üritad rohkem ruumi hunnik, nii siis hiljem helistada malloc saab taaskasutada, et mälu, mis te varem vabastada. Tähtsam malloc ja vaba on, et see annab teile täieliku kontrolli eluea jooksul nende mälu plokki. Globaalsed muutujad on alati elus. Kohalik muutujad elus kuulub nende reguleerimisalasse. Niipea, kui te minna varem lokkis traksidega, kohalikud muutujad on surnud. Malloced mälu on elus kui sa tahad seda olla elus ja siis vabaneb, kui ütlete see vabastatakse. Need on tegelikult ainult 3 tüüpi mälu, tõesti. Seal on automaatne mälu haldamine, mis on pinu. Asjad juhtuvad automaatselt. Kui sa ütled int x, mälu eraldatakse int x. Kui x läheb välja ulatus, mälu on taastatud x. Siis on dünaamiline mälu haldamine, mis on see, mida malloc on, mis on siis, kui teil on kontroll. Sa dünaamiliselt otsustada, kui mälu peaks ja ei tohiks määrata. Ja siis on staatiline, mis tähendab lihtsalt, et ta elab igavesti, mis on see, mis globaalsed muutujad on. Nad on lihtsalt alati mällu. Küsimused? [Üliõpilane] Kas sa define plokk lihtsalt kasutades looksulg kuid ei pea olema, kui avaldus või kui avaldus või midagi sellist? Saate määrata ploki nagu funktsioon, kuid mis on looksulg liiga. [Üliõpilane] Nii et sa ei saa lihtsalt olla nagu juhuslikult paari looksulg oma koodi mis on lokaalsete muutujate? >> Jah, saab küll. Toas int baar oleksime võinud {int y = 3;}. See peaks olema siin. Aga see täiesti piiritletakse int y. Pärast seda teist lokkis traksidega, y ei saa enam kasutada. Sa peaaegu kunagi seda teha, kuigi. Getting tagasi mis juhtub, kui programm lõpeb, seal on selline väärarusaam / pool vale, et me anname, et lihtsalt teha asju lihtsamaks. Me ütleme teile, et kui te mälu eraldada sa jaotada osa patakas RAM selle muutuja. Aga sa ei ole tõesti otseselt puudutamata RAM kunagi oma programmides. Kui sa arvad, et see, kuidas ma joonistasin - Ja tegelikult, kui sa lähed läbi GDB näete sama asja. Sõltumata sellest, mitu korda sa käivitada oma programmi või millist programmi sa kasutad, korstnat alati saab alustada - sa oled alati näeme muutujad ümber aadress oxbffff midagi. See on tavaliselt kuskil selles piirkonnas. Aga kuidas 2 programmide olla on viiteid, et sama mälu? [Üliõpilane] Seal on mõned meelevaldne määramine, kus oxbfff peaks olema RAM mis võib tegelikult olla erinevates kohtades, sõltuvalt kui funktsioon kutsuti. Jah. Mõiste on virtuaalmälu. Idee on selles, et iga protsess, iga programm, mis töötab arvutis on oma - oletame 32 bitti - täiesti sõltumatu aadress ruumi. See on aadress ruumi. Tal on oma täiesti sõltumatu 4 gigabaiti kasutada. Nii et kui sa jooksed 2 programmide üheaegselt, see programm näeb 4 GB endale, Selle programmi näeb 4 GB endale, ja see on võimatu seda programmi dereference pointer ja lõpuks mälu selle programmi. Ja mis virtuaalmälu on on teisendamisprotsessi protsesside aadress ruumi tegelikult asju RAM. Nii et see on kuni opsüsteemi teada, et hei, kui see kutt dereferences osuti oxbfff, et tegelikult tähendab et ta tahab RAM bait 1000, arvestades, et kui see programm dereferences oxbfff, ta tõesti tahab RAM bait 10000. Nad võivad olla meelevaldselt kaugel. See kehtib isegi asju ühes protsesside aadress ruumi. Nii nagu ta näeb kõiki 4 GB endale, kuid oletame - [Üliõpilane] Kas iga protsess - Oletame, et teil on arvuti koos ainult 4 GB RAM. Kas iga protsessi näha kogu 4 GB? >> Jah. Aga 4 GB ta näeb, on vale. See on lihtsalt see arvab, et see on kõik see mälu, sest ta ei tea ühtegi teist protsessi ei ole. See ainult kasutada rohkem mälu kui ta tegelikult vajab. Operatsioonisüsteem ei kavatse anda RAM sellele protsessile kui see ei kasuta mälu selle kogu piirkonnas. Ta ei kavatse anda seda mälu sellesse piirkonda. Aga mõte on selles, et - ma üritan välja mõelda - ma ei saa mõelda analoogia põhjal. Analoogiaid on raske. Üks küsimusi virtuaalmälu või üks neist asjadest see lahendada on see, et protsessid oleksid täiesti teadlikud üksteise vastu. Ja nii saab kirjutada iga programmi, mis lihtsalt dereferences tahes pointer, meeldib lihtsalt kirjutada programm, mis ütleb * (ox1234) ja see on viite mahavõtmine mälu aadress 1234. Aga see on kuni operatsioonisüsteemi seejärel tõlkida mida 1234 tähendab. Nii et kui 1234 juhtub olema kehtiv mälu aadressi selle protsessi, nagu see siis korstna või midagi, siis see tagastab väärtuse, et mälu aadress niipalju kui protsess teab. Aga kui 1234 pole kehtiv aadress, nagu see juhtub maa mõnel tükike mälu siin, mis on väljaspool korstnat ja pärast hunnik ja sa ei ole tegelikult kasutas seda, siis see on, kui saad asjad segfaults sest sa oled liigutav mälu, et sa ei tohiks liigutav. See on ka tõsi - 32-bitine süsteem, 32 bitti tähendab, et olete 32 bitti määratleda mälu aadressi. See on põhjus, miks osuti on 8 baiti, sest 32 bitti on 8 baiti - või 4 baiti. Näiturid on 4 baiti. Nii et kui näed osuti nagu oxbfffff, mis on - Jooksul igas konkreetses programmis saab lihtsalt ehitada suvalises pointer, kuskil ox0 et härg 8 f's - FFFFFFFF. [Üliõpilane] Kas sa ei arva nad on 4 baiti? >> Jah. [Üliõpilane] Siis iga bait on - >> [Bowden] Hexadecimal. Hexadecimal - 5, 6, 7, 8. Nii suunanäitajaks sa lähed alati näha kuueteistkümnendsüsteemis. See on lihtsalt kuidas me liigitada suunanäitajaks. Iga 2 numbrit kuueteistkümnendsüsteemis on 1 bait. Nii et seal saab olema 8 kuueteistkümnendarvudega 4 baiti. Nii et iga noolena 32-bitine süsteem saab olema 4 baiti, mis tähendab, et teie protsessi saab ehitada suvalises 4 baiti ja teha kursor välja, mis tähendab, et nii palju kui see on teada, siis saab tegeleda kogu 2 32 baiti mälu. Kuigi see ei ole tegelikult juurdepääs sellele, isegi kui arvuti on ainult 512 megabaiti, siis arvab, et see on, et palju mälu. Ja operatsioonisüsteem on piisavalt targad, et see ainult eraldada mida sa tegelikult vajad. See ei saa lihtsalt minna, oh, uus protsess: 4 kontserti. Jah. >> [Üliõpilane] Mis härg tähendab? Miks sa kirjutad siis? See on lihtsalt sümbol kuueteistkümnendsüsteemis. Kui näed number algab härg, hilisemad asjad on kuueteistkümnendsüsteemis. [Üliõpilane] Sa selgitab, mis juhtub, kui programm lõpeb. >> Jah. Mis juhtub, kui programm lõpeb on operatsioonisüsteem lihtsalt kustutab kaardistamisel, et see on nende aadressid, ja ongi kõik. Operatsioonisüsteemi saab nüüd lihtsalt anda, et mälust teise programmi kasutada. [Üliõpilane] Okei. Nii et kui te eraldada midagi hunnik või korstna või globaalsed muutujad või midagi, nad kõik lihtsalt kaovad niipea, kui programmi lõppemist sest operatsioonisüsteem on nüüd tasuta anda, et mälu tahes muul viisil. [Üliõpilane] Kuigi seal on ilmselt veel väärtusi kirjutatud? >> Jah. Väärtused on tõenäoliselt ikka veel seal. See on lihtsalt see saab olema raske saada neid. See on palju raskem saada neid, kui see on nöökima kustutatud faili sest kustutatud faili tüüpi istub seal pikka aega ja kõvaketas on palju suurem. Nii et see läheb üle kirjutada erinevates osades mälu enne kui see juhtub üle kirjutada patakas mälu, et see fail kasutada olevat. Aga põhimälu, RAM, siis tsükkel läbi palju kiiremini, nii see läheb väga kiiresti üle kirjutada. Küsimused see või midagi muud? [Üliõpilane] Mul on küsimusi eri teema. >> Okei. Kas kellelgi on küsimusi selle kohta? Okei. Teine teema. >> [Üliõpilane] Okei. Olin läbimas mõned praktikas katseid, ja üks neist see rääkis sizeof ja väärtus, et ta naaseb või erineva muutuja tüüpi. >> Jah. Ja ta ütles, et nii int ja pikk nii tulu 4, nii et nad on nii 4 baiti pikk. Kas on olemas vahe int ja pikk, või on see sama asi? Jah, seal on erinevus. C standard - Ma olen ilmselt läheb segi ajama. C standard on just nagu C on ametlikel dokumentidel C. See on see, mida ta ütleb. Nii C standardi lihtsalt ütleb, et char igavesti ja alati 1 bait. Peale seda - lühike on alati lihtsalt määratleda kui suurem või võrdne char. See võib olla rangelt suurem, kuid mitte positiivne. Väravavahi on lihtsalt määratleda kui suurem või võrdne lühike. Ja pikk on lihtsalt määratleda kui suurem või võrdne int. Ja pikka on suurem või võrdne pikk. Nii et ainus asi C standard defineerib on suhteline tellimine kõike. Tegelik mälu, et asjad võtavad tavaliselt kuni rakendamise, aga see on päris täpselt määratletud selles punktis. >> [Üliõpilane] Okei. Nii et püksid on peaaegu alati saab olema 2 baiti. Ints on peaaegu alati saab olema 4 baiti. Pikad Pikad on peaaegu alati saab olema 8 baiti. Ja igatseb, see sõltub sellest, kas te kasutate 32-bitist või 64-bitist süsteemi. Nii kaua läheb vastavad süsteemi tüübist. Kui te kasutate 32-bitist süsteemi nagu Appliance, see saab olema 4 baiti. Kui te kasutate 64-bit nagu paljud viimastel arvutid, see saab olema 8 baiti. Ints on peaaegu alati 4 baiti selles punktis. Pikad pikad on peaaegu alati 8 baiti. In the past, ints kasutada ainult 2 baiti. Aga teate, et see täielikult rahuldab kõik nende suhete üle ja võrdne. Nii kaua on täiesti lubatud olla sama suur kui täisarv, ja see on ka lubatud olla sama suur kui kaua kaua. Ja see lihtsalt nii juhtub olema, et 99,999% süsteemid, see saab olema võrdne kas int või kaua kaua. See lihtsalt sõltub 32-bitine või 64-bitine. >> [Üliõpilane] Okei. Murdarvuna, kuidas on koma määratud poolest bitti? Nagu näiteks binaarne? >> Jah. Sa ei pea teadma, et CS50. Sa ei pea isegi teada, et 61. Sa ei õpi, et tõesti mingil muidugi. See on lihtsalt esindatuse. Ma unustan täpne natuke kattealad. Idee ujukoma on see, et sa eraldama teatud arvu bitti esindama - Põhimõtteliselt kõik on teaduslik kuju. Nii et sa eraldama teatud arvu bittide esindama arvu ise, nagu 1,2345. Ma ei saa kunagi enamate rohkem numbreid kui 5. Siis ka eraldama teatud arvu bittide nii et see kipub nii olema saad vaid kuni teatud number, nagu see on suurim eksponent saab olla, ja te saate ainult minna teatud eksponent meeldib, mis on väikseim eksponent saab olema. Ma ei mäleta täpselt nii bitti on määratud kõik need väärtused, kuid teatud bittide arv on pühendatud 1,2345, teise teatud bittide arv on pühendatud eksponent ja see on võimalik ainult esindama eksponent teatud suurusest. [Üliõpilane] Ja topelt? Kas see on nagu eriti pika float? >> Jah. See on sama asi nagu ujuk välja arvatud nüüd sa kasutad 8 baiti asemel 4 baiti. Nüüd on sul võimalik kasutada 9 numbrit või 10 numbrit, ja see saab minna kuni 300 asemel 100. >> [Üliõpilane] Okei. Ja ujukid on ka 4 baiti. >> Jah. Noh, jälle, see sõltub pigem üldine üldise rakendamise, kuid ujukid on 4 baiti, kahekordistab on 8. Paarismängud nimetatakse topelt, sest nad on kahekordistada ujukite. [Üliõpilane] Okei. Ja on seal topelt kahekordistab? >> Seal ei ole. Ma arvan - >> [üliõpilane] Nagu kaua pikad? >> Jah. Ma ei arva nii. Jah. [Üliõpilane] eelmise aasta test oli küsimus põhiülesanne võttes olla osa teie programmi. Vastus oli, et see ei pea olema osa teie programmi. Millises olukorras? Seda ma nägin. [Bowden] Tundub - >> [üliõpilane] Mis olukorras? Kas teil on probleem? >> [Üliõpilane] Jah, võin kindlasti tõmmake see üles. See ei pea olema tehniliselt, kuid põhimõtteliselt see saab olema. [Üliõpilane] Ma nägin üks teistsugune aasta. See oli nagu Õige või vale: kehtiv - >> Oh,. C faili? [Üliõpilane] Igasugune. C fail peab olema - [nii keelt korraga - arusaamatu] Okei. Nii et eraldi. . C faili lihtsalt peab sisaldama funktsioone. Võite koostada faili masinkoodidena, binaarne, mis iganes, ilma et oleks käivitatav veel. Kehtiv käivitatava peab olema peamine ülesanne. Võite kirjutada 100 Funktsioonid 1 faili, kuid ei peamised ja seejärel kompileerida, et näha binaarne, siis kirjutada teise faili, mis on ainult peamised kuid see nõuab hunniku neid funktsioone Selles binaarfaili siin. Ja nii kui sa üritad käivitatava, seda linker ei on see ühendab neid 2 binaarfailidega käivitatava. Nii. C fail ei pea olema peamine ülesanne üldse. Ja suur kood alused näete tuhandeid. C failid ja 1 peamine fail. Veel küsimusi? [Üliõpilane] Oli teine ​​küsimus. Ta ütles, teha on kompilaator. Õige või vale? Ja vastus oli vale, ja sain aru, miks see ei ole nagu rõkkama. Aga mida me nimetame teha, kui see ei ole? Tee on põhimõtteliselt lihtsalt - ma näen täpselt, mida ta nimetab seda. Aga see lihtsalt jookseb käske. Tee. Ma ei tõmba see üles. Jah. Oh, jah. Tee ka ei tee seda. See ütleb eesmärgil mark utiliit on määrata automaatselt mis tükid suur programm tuleb recompiled ja anda käske kompileeri neid. Võite teha teha faile, mis on absoluutselt tohutu. Tee vaatab ajatemplite failide ja, nagu me varem öelnud, saate koostada üksikuid faile alla ja see ei ole kuni jõuad linker et nad pannakse kokku on käivitatav. Nii et kui sul on 10 erinevat faili ja te muudate 1 neist, siis mida teha kavatseb teha on lihtsalt kompileeri et 1 fail ja uuesti linkida kõike koos. Aga see on palju rumalam kui see. See on kuni teil täielikult määratleda, et see, mida ta peaks tegema. See vaikimisi on võime tunda see ajatempel kraami, kuid võite kirjutada margi faili midagi teha. Võite kirjutada tegema faili nii, et kui kirjutad oleks lihtsalt cd teise kataloogi. Olin saada pettunud, sest ma tack kõik sees minu Appliance ja siis saan vaadata PDF Mac. Nii et ma lähen Finder ja ma ei ei lähe, Ühendu serveriga, ja server Ma võtan on minu Appliance, ja siis ma avada PDF et saab koostatud LaTeX. Aga ma imestasin pettunud, sest iga kord, mul on vaja värskendada PDF, Ma pidin kopeeri see konkreetse kataloogi, et see võiks pääseda ja see oli saada tüütu. Nii et selle asemel ma kirjutasin margi fail, mis teil on määratleda, kuidas ta teeb asju. Kuidas sa teed seda PDF LaTeX. Just nagu iga teine ​​mark faili - või ma arvan, et sa ei ole näinud mark faili, kuid meil Appliance globaalse margi faili lihtsalt ütleb, kui teil on koostamisel C faili, kasutage rõkkama. Ja nii siin minu teha faili et ma ütlen, Faili sa lähed soovid kompileerida PDF LaTeX. Ja nii see on PDF lateks, mis teeb koostamisel. Tee ei ole koostamisel. See on lihtsalt neid käske järjekorras ma täpsustada. Nii et see töötab PDF LaTeX, see kopeerib selle kataloogi ma tahan seda, mida soovid kopeerida, see cd kataloog, ja teeb muid asju, kuid kõik see on tunda, kui faili muudatusi, ja kui see muutub, siis see kestab käske, mis ta pidi jooksma kui faili muudatusi. >> [Üliõpilane] Okei. Ma ei tea, kui kasutatakse globaalse margi failid on minu jaoks seda kontrollida. Muud küsimused? Midagi varasemast viktoriinid? Iga kursor asju? On peent asju osuti nagu - Ma ei kavatse olla võimalik leida viktoriini küsimus selle kohta - Aga nagu selline asi. Veenduge, et te mõistate, et kui ma ütlen, int * x * y - See ei ole täpselt siin midagi, ma arvan. Aga nagu * x * y, need on 2 muutujad, mis on ära pinu. Kui ma ütlen x = malloc (sizeof (int)), x on ikka muutuja korstnat malloc on mõned plokk üle hunnik, ja meil oli x käsk hunnik. Nii et midagi virna punkte hunnik. Kui sa malloc midagi, sa paratamatult säilitamist sees osuti. Nii et osuti on virnas, malloced plokk on hunnik. Paljud inimesed saavad segaduses ja öelda, int * x = malloc; x on hunnik. No Mida x osutab on hunnik. x ise on virnas, kui mingil põhjusel olete x olla globaalne muutuja, millisel juhul ta juhtub olema mõnes muus piirkonnas mälu. Nii et jälgida, need kasti ja nool diagrammid on päris tavaline, et viktoriini. Või kui see ei ole kohta viktoriini 0, siis toimub viktoriin 1. Sa peaksid teadma kõik need, sammud koostamisel kuna siis tuli vastata küsimustele nimetatud. Jah. [Üliõpilane] Kas me läheme üle need sammud - >> Muidugi. Enne samme ja koostamise meil preprocessing koostamise, montaaž ja sidumine. Eeltöötlus. Mida see teeb? See on lihtsaim samm - hästi, mitte nagu - see ei tähenda, et peaks olema selge, kuid see on kõige lihtsam samm. Te võiks rakendada seda ise. Jah. [Üliõpilane] Võtta mida on teie sisaldab niimoodi ja see kopeerib ja siis määratletakse ka. Tundub asjad # include ja # define, ja see lihtsalt koopiad ja pastad mida need tegelikult tähendavad. Nii et kui te ütlete # include cs50.h, eeltöötluse on kopeerimine ja kleepimine cs50.h arvesse, et liin. Kui sa ütled # define x on 4, eeltöötluse läbib kogu programmi ning asendab kõik juhtumid x 4. Nii eeltöötluse võtab kehtiv C fail ja väljundid kehtiv C fail kus asjad on kopeeritud ja kleebitud. Nüüd koostamiseks. Mida see teeb? [Üliõpilane] See läheb C kahekomponentsete. [Bowden] See ei lähe kõik nii binaarne. [Üliõpilane] Et masin koodi siis? >> See ei ole masina koodi. [Üliõpilane] assamblee? >> Assamblee. See läheb Assamblee enne läheb kõik viis C-koodi, ja kõige keeles midagi sellist teha. Vali kõik kõrgetasemelised keel, ja kui sa lähed kompileerida, on tõenäoline, et koostada sammudega. Esiteks see saab koostada Pythoni C, siis see saab kompileerida C kuni assamblee ja siis assamblee ei hakka ümber binaarne. Nii koostamise läheb toob see C kuni assamblee. Sõna koostamise tähendab tavaliselt toob see kõrgem tase madalamale tasemele programmeerimiskeelt. Nii et see on ainult samm koostamise kus hakkate koos kõrgetasemelise keeles ja lõpuks madala keeles, ja sellepärast etappi nimetatakse koostamisel. [Üliõpilane] Ajal koostamise oletame, et sa oled teinud # include cs50.h. Kas tõlkija kompileeri cs50.h, nagu funktsioonid, mis on seal, ja moodustavad sellest Assamblee kood samuti, või on see kopeerida ja kleepida midagi, mis on olnud eelnevalt assamblee? cs50.h päris palju kunagi sattuda assamblee. Asju funktsiooni prototüüpe ja asjad on just teie jaoks olema ettevaatlik. See tagab, et tõlkija on võimalik vaadata asju, nagu olete helistaja funktsioone kellel on õigus tagasi liigid ja õigus argumendid ja värki. Nii cs50.h on eeltöödeldud sisse faili ja siis, kui ta on koostamisel See on põhimõtteliselt ära visata pärast jälgib, et kõik on kutsutud õigesti. Aga funktsioonid määratletud CS50 raamatukogu, mis on eraldi cs50.h, need ei eraldi koostatud. See on tegelikult langenud ühendab samm, nii me jõuame, et teises. Aga kõigepealt, mida kokkupanek? [Üliõpilane] Assamblee binaarne? >> Jah. Kokkupanek. Me ei kutsu seda koostamisel sest Assamblee on päris palju puhast tõlge binaarne. On väga vähe loogikat läheb Assamblee binaarne. See on nagu soojaks tabelis, oh, meil on see õpetus; mis vastab binaarne 01110. Ja nii faile, kokkupanek üldiselt väljundid. O faile. Ja. O failid on, mida me ütlesime enne, kuidas fail ei pea olema peamine ülesanne. Iga faili saab koostada alla. O faili nii kaua, kui see on sobilik C-faili. See võib koostada alla. O. Nüüd ühendab on see, mis tegelikult toob kamp. O failid ja toob need täidetavad. Ja mis ühendab ei ole sa ei mõtle CS50 raamatukogu. O faili. See on juba koostatud binaarne fail. Ja nii kui sa kompileerida faili oma hello.c, mis nõuab getString, hello.c saab koostada alla hello.o, hello.o on nüüd binaarne. Ta kasutab getString, nii et see peab minema üle cs50.o, ja linker smooshes need kokku ja kopeerib getString sellesse faili ja väljub käivitatava, mis on kõik funktsioonid, mida ta vajab. Nii cs50.o ei ole tegelikult O faili, aga see on piisavalt lähedal, et ei ole põhimõttelist erinevust. Nii ühendab vaid toob hunnik faile kokku et eraldi sisaldavad kõiki funktsioone mul on vaja kasutada ja loob käivitatava vormi, mis on reaalselt sõita. Ja nii see on ka see, mida me ütlesime enne kus saab olema 1000. c failide koguda neid kõiki. o faili, mis võtab tõenäoliselt aega, siis muudad 1. c faili. Teil on vaja ainult kompileeri, et 1. C fail ja uuesti linkida kõike muud, siduda kõik tagasi kokku. [Üliõpilane] Kui Me seostame me kirjutame lcs50? Jah, nii-lcs50. See lipp signaale linker, et sa tuleks siduda selle raamatukogu. Küsimused? Kas me oleme läinud üle binaarne muu kui 5 sekundit esimeses loengus? Ma ei arva nii. Sa peaksid teadma kõik suured Os, et oleme läinud üle, ja sa peaksid saama, kui me andsime teile funktsiooni, siis peaks olema võimalik öelda, et see on suur O, jämedalt. Või noh, suur O on karm. Nii et kui näete nested jaoks silmuseid silmuspõletamise üle sama palju asju, nagu int i, i > [üliõpilane] n ruudus. >> See kipub olema n ruudus. Kui teil on kolmekordne pesitses, see kipub olema n kuubis. Nii et selline asi siis peaks olema võimalik välja tuua kohe. Sa pead teadma sisestamise sorteerida ning mull sorteerida ning ühendada sorteerida ning kõik need. See on lihtsam mõista, miks nad on sellised n ruudus ja n log n ja kõik selle sest ma arvan, et seal oli viktoriin üks aasta, kus me põhimõtteliselt andsin sulle rakendamise mull sorteerida ning ütles: "Mis on töötamise aeg selle funktsiooni?" Nii et kui te tunnistate seda mull sorteerida, siis saate kohe öelda, n ruudus. Aga kui sa lihtsalt vaatad, sa ei pea isegi aru, et see on mull sorteerida; võid lihtsalt öelda seda teeb seda ja seda. See on n ruudus. [Üliõpilane] Kas on raske näiteid võite tulla, nagu sarnane idee figuring? Ma ei arva, et me annaks sulle raske näiteid. Mull sorteerida asi on umbes sama raske kui me läheks, ja isegi see, kui sa mõistad, et sa itereerimise üle massiivi iga element massiivi, mis saab olema midagi, mis on n ruudus. Seal on küsimused, nagu siin on meil - Oh. Lihtsalt ühel päeval, Doug väitis: "Ma olen leiutanud algoritm, mida saab sortida massiivi "N arvu O (log n) ajaga!" Niisiis, kuidas me teame, et on võimatu? [Kuuldamatu õpilase vastus] >> Jah. Vähemalt on, mida sa pead puudutada iga element massiivi nii et see on võimatu sorteeri massiiv - Kui kõik on sorteerimata järjekorras, siis sa lähed tuleb liigutav kõik massiivi, nii et see on võimatu seda teha vähem kui O n. [Üliõpilane] Sa näitasid meile, et näide on võimalik seda teha O n kui kasutad palju mälu. >> Jah. Ja see on - ma unustan Mis see on - Kas see lugedes sorteerida? Hmm. See on täisarv sortimise algoritm. Ma otsisin eriline nimi see, et ma ei mäleta eelmisel nädalal. Jah. Need liigid on kehvasti, et saab täita asju suur O n. Kuid on ka piiranguid, nagu saab kasutada ainult täisarvud kuni teatud number. Plus, kui sa üritad sortida midagi see on - Kui teie massiiv on 012, -12, 151, 4 miljonit siis, et ühe osa läheb täielikult hävitada kogu sorteerimist. Küsimused? [Üliõpilane] Kui teil on rekursiivne funktsioon ja see lihtsalt teeb rekursiivne kõne jooksul tulu avaldus, et on saba rekursiivne, ja nii oleks, et mitte kasutada rohkem mälu ajal runtime või et see oleks vähemalt kasutada võrreldavaid mälu iteratiivne lahendus? [Bowden] Jah. See on tõenäoliselt mõnevõrra aeglasem, kuid tegelikult mitte. Saba rekursiivne on päris hea. Vaadates uuesti virna raamid, oletame, et meil on peamised ja meil on int baar (int x) või midagi. See ei ole täiuslik rekursiivne funktsioon, kuid tasuvus baar (x - 1). Nii et ilmselt see on vigane. Sa pead baasi juhtudel ja värki. Aga mõte on selles, et see on saba rekursiivne, mis tähendab, kui peamised kõned baar see läheb aina oma freimi. Selles freimi seal saab olema vähe ploki mälu mis vastab selle argumendi x. Ja nii ütleme peamine juhtub helistada baar (100); Nii et x läheb alguses on 100. Kui tõlkija tunnistab, et see on saba rekursiivne funktsioon, siis, kui baar teeb selle rekursiivne kõne baar, tegemise asemel uue freimi, mis on kui pakk väljub suuresti, lõpuks ta tekib hunnik ja siis saad segfaults kuna mälu hakkab põrgata. Nii et selle asemel, et oma freimi, see saab aru, Hei, ma ei ole kunagi tõesti vaja tulla tagasi selle freimi, Nii et selle asemel ma lihtsalt asendada see argument on 99 ja seejärel alustada baar üle. Ja siis ta teeb seda uuesti ja see jõuab tagasi baari (x - 1), ja tegemise asemel uue freimi, siis lihtsalt asendada senine argument 98 ja siis hüppa tagasi alguses baar. Need toimingud, asendades et 1 väärtus korstnat ja hüppas tagasi alguses, on üsna tõhus. Nii et mitte ainult see sama mälukasutust eraldi funktsioon, mis on iteratiivne sest sa oled ainult kasutades 1 freimi, aga sa ei põe varjuküljed võttes helistada funktsioone. Üleskutse funktsioonid võib veidi kallis, sest see on kõike seda teha setup ja teardown ja kõik see kraam. Nii et see saba rekursioon on hea. [Üliõpilane] Miks see ei loo uusi samme? Sest see mõistab, see ei pea. Kõne baar on lihtsalt tagasi rekursiivne kõne. Seega ei ole vaja midagi teha tagastatav väärtus. See lihtsalt läheb kohe tagastada. Nii see lihtsalt läheb asendada oma väidet ja alustada otsast peale. Ja ka siis, kui teil ei ole saba rekursiivne versioon, siis sa saad kõik need baari, kus millal see baar tagastab peab ta tagastama selle raha selle ühe, siis see baar kohe tagasi ja ta naaseb oma raha selle ühe, siis lihtsalt läheb kohe tagasi ja tagastab selle väärtuse siin. Nii et te säästes see popping kõik need asjad ära virna alates tagastatav väärtus on lihtsalt saab olema läbinud kogu tee tagasi üles niikuinii. Nii et miks mitte lihtsalt asendada meie argument uuendatud argument ja alustada otsast peale? Kui funktsioon ei ole saba rekursiivne, kui sa midagi sellist - [Üliõpilane] kui baar (x + 1). >> Jah. Nii et kui paned ta seisund, siis sa teed midagi tagastatav väärtus. Või isegi kui te just do tagasi 2 * baar (x - 1). Nüüd baar (x - 1) peab tagastama, et see arvutada 2 korda see väärtus, nii et nüüd ta ei vaja oma eraldi freimi, ja nüüd, ükskõik kui kõvasti sa proovida, sa lähed vaja - See ei ole saba rekursiivne. [Üliõpilane] Kas ma püüa rekursioon eesmärgiks saba rekursioon - [Bowden] Ideaalses maailmas, kuid CS50 sa ei pea. Selleks, et saada saba rekursioon, üldiselt, kui luua täiendav argument kus baaris võtab int x arvesse y ja y vastab ülim asi, mida soovite naasta. Nii siis sa lähed tuleb tagasi baari (x - 1) 2 * y. Nii et see on lihtsalt kõrgetasemeline kuidas muuta asjad olema saba rekursiivne. Aga pildi argument - Ja siis lõpuks, kui jõuad oma baasi nii, siis lihtsalt tagasi y sest sa kogunev kogu aeg tagastatav väärtus, mida soovite. Sa liiki on teinud seda korduvalt, kuid kasutades rekursiivne kõned. Küsimused? [Üliõpilane] Ehk umbes pointer aritmeetika, nagu kasutades stringid. >> Muidugi. Pointer aritmeetika. Kui kasutate stringid see on lihtne, sest stringid on char tähte, tähemärki on igavesti ja alati ühe baidi, ja nii pointer aritmeetika võrdub regulaarne aritmeetika, kui olete tegelevad stringid. Ütleme nii, et char * s = "tere". Nii et meil on ploki mälu. See vajab 6 baiti, sest sa alati vaja null terminaator. Ja char * s läheb osutada alguses massiivi. Nii s juhib seal. Nüüd on see põhiliselt kuidas tahes massiivi töötab, olenemata sellest, kas see oli deklaratsiooni malloc või kas see siis korstna. Iga massiiv on põhiliselt viit algust massiiv, ja siis mõni rida operatsiooni, mis tahes indekseerimine, lihtsalt läheb sinna massiivi teatud kompenseerida. Nii et kui ma ütlen midagi s [3]; seda läheb s ja loendamine 3 tähemärki sisse Nii s [3], on meil 0, 1, 2, 3, nii s [3] läheb viidatakse käesolevale l. [Üliõpilane] Ja me võiksime jõuda sama väärtusega tehes s + 3 ja seejärel sulgudes täht? Jah. See on samaväärne * (t + 3); ja see on igavesti ja alati samaväärne ükskõik, mida te teete. Sa ei pea kasutama sulg süntaks. Teil on alati võimalik kasutada * (id + 3) süntaks. Inimesed kipuvad nagu sulg süntaks, kuigi. [Üliõpilane] Nii et kõik massiivid on tegelikult lihtsalt suunanäitajaks. On väike erinevus, kui ütlen, int x [4]; >> [üliõpilane] Kas see luua mälu? [Bowden] See läheb luua 4 ints kohta virna, et 16 baiti üldine. See saab luua 16 baiti kohta virna. x ei salvestata kuhugi. See on lihtsalt sümbol viitab algust asi. Sest sa deklareeritud massiivi sees seda funktsiooni, mida tõlkija saab teha, on lihtsalt asendada kõik juhtumid muutuja x koos kus see juhtus otsustasime asetada need 16 baiti. Seda ei saa teha, et char * s, sest s on tegelik pointer. See on tasuta siis osutada muid asju. x on konstantne. Sul ei saa olla see punkt, et erinevad massiivi. >> [Üliõpilane] Okei. Aga see mõte, see indekseerimine, on sama sõltumata sellest, kas see on traditsiooniline massiivi või kui see on kursor midagi või kui see on kursor malloced massiivi. Ja tegelikult, see on nii samaväärsed, et see on ka sama asi. See tegelikult lihtsalt tõlgib, mis seal sees on sulgudes ja mis sellest järel sulgudes lisab need kokku ja dereferences. Nii et see on sama kehtib * (t + 3) või s [3]. [Üliõpilane] Kas teil on osuti osutab 2-mõõtmelise massiivi? See on raskem. Traditsiooniliselt ei ole. 2-mõõtmeline massiiv on lihtsalt 1-mõõtmeline massiiv mõned mugav süntaks sest kui ma ütlen, int x [3] [3], see on tõesti vaid 1 rida koos 9 väärtused. Ja nii kui ma indeksi koostaja teab, mida ma mõtlen. Kui ma ütlen x [1] [2], see teab, et ma tahan minna teises reas, nii see läheb jäta esimesed 3, ja siis tahab teine ​​asi, et nii see läheb, et saada see üks. Aga see on ikkagi vaid ühe-mõõtmeline massiiv. Ja nii kui ma tahtsin anda osuti selle massiivi, Ütleksin int * p = x; Tüüpi x on lihtsalt - See on karm öelda tüüpi x kuna see on vaid sümbol ja see ei ole tegelik muutuja, kuid see on lihtsalt int *. x on lihtsalt kursor alguses seda. >> [Üliõpilane] Okei. Ja nii ma ei pääse [1] [2]. Ma arvan, et tegemist on eriti süntaks tunnistamise pointer, midagi naeruväärne nagu int (* p [- midagi täiesti naeruväärne. Ma ei tea isegi. Aga seal on süntaks tunnistamise viiteid jms sulgudes ja asjad. See ei pruugi isegi lasta sul seda teha. Ma võiks tagasi vaadata midagi, mis ei ütle mulle tõtt. Ma vaatan seda hiljem, kui on süntaks punkti. Aga te ei näe seda. Ja isegi süntaks on nii arhailine, et kui te kasutate seda, inimesed on segaduses. Mitmemõõtmelise massiivi on päris haruldane, sest see on. Sa päris palju - Noh, kui sa teed maatriks asju ta ei kavatse olla haruldased, kuid C sa harva kavatsed kasutada mitmemõõtmelist massiivi. Jah. >> [Üliõpilane] Oletame, et teil on tõesti pikk massiiv. Nii et virtuaalne mälu tundub olevat kõik järjest, nagu elemente õigus teineteise kõrval, kuid füüsilist mälu, siis kas oleks võimalik, et tuleb lahku? >> Jah. Kuidas virtuaalmälu tööd on see lihtsalt eraldab - Ühiku jaotus on leht, mis kipub olema 4 kilobaiti, ja nii kui protsess ütleb, kuule, ma tahan kasutada seda mälu, operatsioonisüsteem läheb eraldada talle 4 kilobaiti selle väikese ploki mälu. Isegi kui kasutada ainult ühte vähe bait kogu ploki mälu, operatsioonisüsteem on annan ta täielikult 4 kilobaiti. Nii et mida see tähendab, ma oleks võinud - oletame, et see on minu stack. See virna võiks eraldada. Minu stack võiks olla megabaiti ja megabaiti. Minu stack võib olla tohutu. Aga korstnat ise tuleb jagada üksikuid lehti, mis siis, kui me vaatame siin oletame see on meie mälu, kui mul on 2 GB RAM, see on tegelik aadress 0 nagu 0. bait minu RAM, ja see on 2 gigabaiti kogu tee alla siit. Nii et see leht võib vastavad käesolevas lahtris siin. See leht võiks vastavad käesolevas lahtris siin. See võiks vastavad see siin. Nii et operatsioonisüsteem on vabalt määrata füüsilise mälu iga üksiku lehe meelevaldselt. Ja see tähendab, et kui see piir juhtub straddle massiiv, massiivi juhtub jätta selle ja õigus käesoleva järjekorras lehel siis massiivi saab olema jagatud füüsilist mälu. Ja siis kui sa väljud rakendusest, kui protsess lõpeb, Nende kaardistamisel saada kustutada ja siis on vabadus kasutada neid vähe plokid muid asju. Veel küsimusi? [Üliõpilane] pointer aritmeetika. >> Oh jah. Strings oli lihtsam, aga kui vaadata midagi ints, Nii tagasi int x [4]; Kas see on massiiv või kas see on kursor malloced massiivi 4 täisarvud, see saab ravida samamoodi. [Üliõpilane] Nii massiivid asuvad hunnik? [Bowden] massiivid on mitte hunnik. >> [Üliõpilane] Oh. [Bowden] Seda tüüpi massiivi kipub olema korstnat kui sa tunnistada seda - ignoreerides globaalsed muutujad. Ärge kasutage globaalsed muutujad. Toas funktsioon ütlen int x [4]; See saab luua 4-täisarv blokeerida korstnat selle massiivi. Aga see malloc (4 * sizeof (int)); läheb minna laduma. Aga pärast seda punkti ma saan kasutada x ja p üsna sama viise, välja arvatud erandid ma enne ütlesin umbes võite ümber jaotada lk. Tehniliselt nende suurused on mõnevõrra erinevad, kuid see on täiesti ebaoluline. Sa ei kasuta tegelikult oma suurused. Lk võin öelda p [3] = 2 või x [3] = 2; Võite kasutada neid täpselt samal viisil. Nii pointer aritmeetika nüüd - Jah. [Üliõpilane] Kas sa ei pea tegema p * kui teil on sulgudes? Sulgudes on kaudne dereference. >> Okei. Tegelikult ka, mida sa räägid, kus sa saad mitmemõõtmelise massiivi koos suunanäitajaks, mida saate teha, on midagi sellist, ütleme, int ** pp = malloc (sizeof (int *) * 5); Ma kirjutan selle kõik välja esimesena. Ma ei tahtnud, et üks. Okei. Mida ma tegin siin on - See peaks olema PP [i]. Nii et PP on viit kursor. Sa mallocing PP punkti massiivi 5 int tähte. Nii et mälu sul on stack lk See saab viidata massiivi 5 plokki, mis on kõik ise lähtekohtadeks. Ja siis kui ma malloc siia, ma malloc et iga üksik viiteid tuleks viidata eraldiseisva 4 baiti kohta hunnik. Nii viitab see 4 baiti. Ja see viitab eri 4 baiti. Ja kõik nad viitavad oma 4 baiti. See annab mulle viis seda mitmemõõtmelist asju. Võiksin öelda, PP, [3] [4], kuid nüüd see ei ole sama asi nagu mitmemõõtmelise massiivi sest mitmemõõtmelise massiivi see tõlgitud [3] [4] üheks paigutamisega x massiivi. See dereferences p, pöördub kolmanda indeks, siis dereferences et ja juurdepääsud - 4 oleks kehtetu - teine ​​indeks. Arvestades, et kui meil oli int x [3] [4] enne kui mitmemõõtmelise massiivi ja kui sa topelt sulg see on tõesti ainult üks dereference, sa pärast ühekordset kursor ja seejärel kompenseerida, see on tõesti 2D mudelit. Te järgite 2 eraldi suunanäitajaks. Nii see ka tehniliselt võimaldab teil on mitmemõõtmelise massiivi kus iga massiiv on erineva suurusega. Nii et ma arvan sakilised mitmemõõtmelise massiivi on, kuidas seda nimetatakse kuna tõesti esimene asi võiks anda midagi, millel on 10 elementi, Teine asi võiks anda midagi, mis on 100 elementi. [Üliõpilane] Kas on olemas piiratud hulk viiteid saab olema osutades muid viiteid? >> Ei Sul võib olla int ***** lk. Tagasi pointer aritmeetika - >> [üliõpilane] Oh. >> Jah. [Üliõpilane] Kui mul on int *** p ja siis ma teen viite mahavõtmine ja ma ütlen p * võrdub see väärtus, on see ainult kavatse teha 1 taseme viite mahavõtmine? >> Jah. Nii et kui ma tahan pääseda asi, mis viimase osuti osutab juures - Siis sa *** p. >> Okei. Nii et see on p punkti 1 blokk, punktide teise ploki, punktide teise blokeerida. Siis kui sa * p = midagi muud, siis muutuvad käesoleva Seni osutavad erinevad blokeerida. >> Okei. [Bowden] Ja kui need olid malloced, siis on nüüd lekkinud mälu kui teil juhtub olema erinevaid viiteid nende kuna sa ei saa tagasi neid ka, et sa lihtsalt viskas ära. Pointer aritmeetika. int x [4]; läheb eraldada massiivi 4 täisarvud kus x läheb osutada alguses massiivi. Nii et kui ma ütlen midagi x [1]; ma tahan, et see tähendab minna teise täisarv massiivis, mis oleks see üks. Aga tõesti, see on 4 baiti arvesse array kuna see täisarv võtab kuni 4 baiti. Nii et korvata 1 tegelikult tähendab offset 1 korda suurem tüübist olenemata massiiv on. See on hulga täisarvud, nii et ta teab, mida teha 1 korda suurus int, kui ta tahab korvata. Teine süntaks. Pea meeles, et see on samaväärne * (x + 1); Kui ma ütlen pointer + 1, mida see tulu on aadress, et osuti on hoidmiseks pluss 1 korda suurem tüüpi pointer. Nii et kui x = ox100, siis x + 1 = ox104. Ja saab kuritarvitada ja öelda midagi sellist char * c = (char *) x; ja nüüd c saab olema sama aadress, kui x. c saab olema võrdne ox100, kuid c + 1 saab olema võrdne ox101 alates pointer aritmeetika sõltub tüüpi pointer, et teil on lisades. Nii et c + 1, siis vaatab c, see char osuti, nii see läheb lisada 1 korda suurus char, mis on alati saab olema 1, nii saad 101, arvestades, et kui ma teen x, mis on endiselt 100, x + 1 saab olema 104. [Üliõpilane] Kas te kasutate c + +, et edendada oma pointer 1.? Jah, saab küll. Sa ei saa teha, et x, sest x on lihtsalt sümbol, see on pidev, sa ei saa muuta x. Aga c juhtub lihtsalt olema osuti, nii C + + on taiesti korraliult see juurdekasvu 1. Kui c olid lihtsalt int *, siis c + + oleks 104. + + Ei pointer aritmeetika nagu c + 1 oleks teinud pointer aritmeetika. See on tegelikult kuidas paljud asjad ühendamise omamoodi - Selle asemel, et luua koopiad asjad, võite selle asemel läbida - Nagu kui ma tahtsin taolist pool massiivi - Teeme kustutada osa sellest. Oletame, et ma tahtsin taolist pool massiivi sisse funktsioon. Mida ma edasi selle funktsiooni? Kui ma mööda x, olen möödaminnes sellele aadressile. Aga ma tahan taolist eelkõige aadress. Nii et mida ma peaksin edasi? [Üliõpilane] Pointer + 2? [Bowden] Nii x + 2. Jah. See saab olema sellel aadressil. Sul ka väga sageli näen seda x [2] ja siis aadress, et. Nii et sa pead võtma aadress, sest sulg on kaudne dereference. x [2] viitab väärtusele, mis on sellele kasti ja seejärel soovitud aadress, et kast, nii ütled ja x [2]. Nii et kuidas midagi Tarkvaraprojekteerimise kus soovid edastada pool nimekirja midagi sa tõesti lihtsalt liigu ja x [2], ja nüüd nii palju kui rekursiivne kõne puhul, minu uus massiiv hakkab seal. Viimase hetke küsimustele. [Üliõpilane] Kui me ei pane ampersand või - mis see pealkiri on? >> Star? [Üliõpilane] Star. >> Tehniliselt dereference operaator, kuid - >> [üliõpilane] dereference. Kui me ei pane täht või märk, mis juhtub, kui ma lihtsalt öelda y = x ja x on viit? Mis tüüpi on y? >> [Üliõpilane] ma lihtsalt öelda, et see on osuti 2. Nii et kui sa ütlesid y = x, nüüd x ja y viitavad sama asi. >> [Üliõpilane] punkti sama asi. Ja kui x on int pointer? >> Oleks kurta, sest sa ei saa määrata suunanäitajaks. [Üliõpilane] Okei. Pea meeles, et suunanäitajaks, kuigi me joonistame neid nooli, tegelikult kõik need poe - int * x - tegelikult kõik x on hoidmiseks on midagi ox100, mis me juhtuda esindama osutades blokk salvestatud 100. Nii et kui ma ütlen, int * y = x; Ma lihtsalt kopeerides ox100 arvesse y, mis me lihtsalt läheb esindama y, samuti osutades ox100. Ja kui ma ütlen int i = (int) x, siis ma ei kavatse salvestada mida iganes väärtus ox100 on sees, kuid nüüd läheb tuleb tõlgendada nii, täisarv asemel pointer. Aga sa pead valatud või muidu ta kurta. [Üliõpilane] Nii sa mõtled, et enamus - Kas see saab olema otsustav int x või valu int y? [Bowden] Mida? [Üliõpilane] Okei. Pärast neid Sulgudes on seal saab olema x või ay seal? [Bowden] kas. x ja y on võrdsed. >> [Üliõpilane] Okei. Sest nad on nii suunanäitajaks. >> Jah. [Üliõpilane] Seega oleks salvestada kuueteistkümnendsüsteemis 100 täisarv vormi? >> [Bowden] Jah. Aga mitte väärtus iganes ta osutab. [Bowden] Jah. >> [Üliõpilane] Nii lihtsalt aadressi täisarv vormi. Okei. [Bowden] Kui sa tahad mõnda veider põhjus, võid ainult tegeleda viiteid ja kunagi tegelema täisarvud ja lihtsalt olla nagu int * x = 0. Siis sa lähed, et saada tõesti segaduses kui pointer aritmeetika algab juhtub. Nii numbrid, et nad salvestada on mõttetu. See on lihtsalt, kuidas sa lõpuks tõlgendamisel. Nii et ma olen vaba kopeerida ox100 alates int * kuni keskmine, ja mina olen vaba määrata - Sa oled ilmselt hakka karjus jaoks ei casting - Ma olen vaba määrata midagi (int *) ox1234 sellesse suvaline int *. Nii ox123 on täpselt sama kehtib mälu aadressi on ja y. Ja y juhtub midagi tagastada, et on päris palju ox123. [Üliõpilane] Kas see oleks väga lahe viis minna kuueteistkümnendsüsteemis koma vormis, meeldib kui teil on osuti ja te enamus seda int? [Bowden] Te võite tõesti lihtsalt printida nagu printf. Oletame, et mul on int y = 100. Nii printf (% d \ n - kui sa peaksid juba teadma - printida, et kui täisarv,% x. Me lihtsalt printida nii kuueteistkümnendsüsteemis. Nii et osuti ei salvestatud kuueteistkümnendsüsteemi, ja täisarv ei salvestata kohaga. Kõik on salvestatud binaarne. See on lihtsalt, et meil on kombeks näidata osuti nagu kuueteistkümnendsüsteemis sest me mõtleme asjad need 4-ploki, ja mälu aadresse kipuvad olema tuttav. Me oleme nagu, kui see algab bf, siis see juhtub olema pinu. Nii et see on lihtsalt meie tõlgendus osuti nagu kuueteistkümnendsüsteemis. Okei. Kõik viimase küsimusi? Ma tulen siia natuke pärast, kui teil on midagi muud. Ja ongi lõpuks see. [Üliõpilane] Jee! [Aplaus] [CS50.TV]