[Powered by Google Translate] [Sehemu ya 4 - Zaidi Starehe] [Rob Bowden - Chuo Kikuu cha Harvard] [Hii ni CS50. - CS50.TV] Tuna kesho quiz, katika kesi guys hawakujua kwamba. Ni kimsingi juu ya kila kitu unaweza tumeona katika darasa au lazima tumeona katika darasa. Hiyo ni pamoja na kuyatumia, ingawa wao ni mada sana hivi karibuni. Wewe lazima angalau kuelewa viwango vya juu yao. Chochote kwamba ameondoka juu katika darasa unapaswa kuelewa kwa chemsha bongo. Hivyo kama una maswali juu yao, unaweza kuwauliza sasa. Lakini hii ni kwenda kuwa kikao sana mwanafunzi inayoongozwa ambapo wewe guys kuuliza maswali, hivyo hopefully watu wana maswali. Je, mtu yeyote kuwa na maswali? Ndiyo. >> [Mwanafunzi] Je, unaweza kwenda zaidi ya kuyatumia tena? Nitakwenda zaidi ya kuyatumia. Yote ya vigezo yako lazima kuishi katika kumbukumbu, lakini kwa kawaida wewe usijali kuhusu kwamba na wewe tu kusema x 2 + na + y 3 na compiler itakuwa takwimu nje ambapo mambo wanaishi kwa ajili yenu. Mara wewe ni kushughulika na kuyatumia, sasa wewe ni wazi kwa kutumia anwani wale kumbukumbu. Hivyo variable moja itakuwa milele tu kuishi katika anuani moja wakati wowote. Kama tunataka kutangaza pointer, ni nini aina kwenda kuangalia kama? Nataka kutangaza p pointer. Nini aina kuangalia kama? [Mwanafunzi] int * p. >> Yeah. Hivyo int * p. Na jinsi gani mimi kufanya hivyo kumweka kwa x? >> [Mwanafunzi] Ampersand. [Bowden] Basi ampersand ni halisi iitwayo anuani ya operator. Hivyo wakati mimi kusema & x ni kupata anuani ya kumbukumbu ya x kutofautiana. Hivyo sasa nina p pointer, na mahali popote katika code yangu naweza kutumia * p au mimi naweza kutumia x na itakuwa exact kitu. (* P). Nini hii kufanya? Nini nyota kwamba mean? [Mwanafunzi] Ina maana thamani katika hatua hiyo. >> Yeah. Hivyo kama sisi kuangalia yake, inaweza kuwa muhimu sana ili kuweza kuteka michoro ambapo hii ni sanduku kidogo ya kumbukumbu kwa ajili ya x, ambayo hufanyika kuwa thamani 4, basi tuna sanduku kidogo ya kumbukumbu kwa ajili ya p, na hivyo p pointi x, hivyo sisi kuteka mshale kutoka p kwa x. Hivyo wakati sisi kusema * p sisi ni kusema kwenda sanduku kwamba ni p. Nyota ni kufuata mshale na kisha kufanya chochote unataka na sanduku ya kwamba haki pale. Hivyo naweza kusema * p = 7, na kwamba watakwenda sanduku kwamba ni x na mabadiliko ambayo kwa 7. Au mimi naweza kusema int z = * p * 2; Hiyo utata kwa sababu ni nyota, nyota. nyota moja ni dereferencing p, nyota nyingine ni kuzidisha kwa 2. Taarifa mimi inaweza kuwa tu kama vile kubadilishwa p * kwa x. Unaweza kutumia yao katika njia ya sawa. Na kisha baadaye naweza kuwa na uhakika na kitu p mpya kabisa. Naweza kusema tu p = &z; Hivyo sasa P pointi tena kwa x; inaelekeza katika z. Na wakati wowote mimi kufanya * p ni sawa kama kufanya z. Hivyo kitu muhimu kuhusu hii ni mara moja sisi kuanza kuingia katika utendaji. Ni aina ya useless kutangaza pointer kwamba pointi kwa kitu na kisha wewe tu dereferencing ni wakati unaweza kuwa na kutumika variable awali kwa kuanzia. Lakini wakati wewe kupata katika utendaji - hivyo hebu sema tuna baadhi ya kazi, int foo, kwamba inachukua pointer na tu anafanya * p = 6; Kama tuliona kabla na byta, huwezi kufanya byta ufanisi na kazi tofauti na tu kupita integers kwa sababu kila kitu katika C daima akipita thamani. Hata wakati wewe ni kupita kuyatumia wewe akipita thamani. Ni tu hivyo hutokea kwamba wale maadili ni kumbukumbu anwani. Hivyo wakati mimi kusema foo (p); mimi nina kupita pointer ndani ya foo kazi na kisha foo ni kufanya * p = 6; Hivyo ndani ya kazi kwamba, * p bado ni sawa na x, lakini siwezi kutumia x ndani ya kazi ambayo kwa sababu si scoped ndani ya kazi hiyo. Hivyo * p = 6 ni njia pekee ya mimi kupata variable mitaa kutoka kazi nyingine. Au, vizuri, kuyatumia ni njia pekee ya mimi kupata variable mitaa kutoka kazi nyingine. [Mwanafunzi] Hebu sema wewe alitaka kurudi pointer. Jinsi gani hasa gani unaweza kufanya hivyo? [Bowden] Kurudi pointer kama katika kitu kama int y = 3; kurudi & y? >> [Mwanafunzi] Yeah. [Bowden] Sawa. Wewe kamwe kufanya hivyo. Hii ni mbaya. Nadhani nikaona katika slides hizi hotuba wewe ulianza kuona mchoro nzima ya kumbukumbu ambapo hadi hapa nimepata kumbukumbu anuani 0 na chini hapa una kumbukumbu anuani gigs 4 au 2-32. Hivyo basi nimepata baadhi ya mambo na baadhi ya mambo na kisha una stack yako na nimepata lundo yako, ambayo wewe tu kuanza kujifunza kuhusu, kupanda juu. [Mwanafunzi] Je, si chungu juu ya stack? Yeah. lundo ni juu, si hivyo? >> [Mwanafunzi] Naam, yeye kuweka 0 juu. [Mwanafunzi] Oh, akaweka 0 juu. >> [Mwanafunzi] Oh, okay. Disclaimer: popote na CS50 utaenda kuona njia hii. >> [Mwanafunzi] Sawa. Ni kwamba tu wakati wewe kwanza kuona mwingi, kama wakati unafikiri ya stack unafikiri ya stacking mambo juu ya mtu mwingine. Hivyo sisi huwa na hii flip kuzunguka hivyo stack ni kupanda juu kama kawaida ingekuwa stack badala ya stack kunyongwa chini. >> [Mwanafunzi] Wala chungu kitaalam kukua pia, ingawa? Ni inategemea nini maana ya kukua. stack na lundo daima kukua katika maelekezo kinyume. stack daima ni kukua kwa maana ya kwamba ni kupanda juu kuelekea juu kumbukumbu anwani, na chungu ni kuongezeka chini kwa kuwa ni kuongezeka kwa anwani ya chini kumbukumbu. Hivyo ni juu 0 na chini ni high kumbukumbu anwani. Wao ni wote kukua, tu katika kupinga maelekezo. [Mwanafunzi] mimi tu maana kwamba kwa sababu wewe alisema kuweka stack juu ya chini sababu inaonekana Intuitive zaidi kwa sababu kwa stack kuanza saa ya juu ya chungu, lundo ni juu ya yenyewe pia, hivyo that's - >> Yeah. Wewe pia kufikiria chungu kama kupanda juu na kubwa, lakini stack zaidi ya hivyo. Hivyo stack ni moja kwamba sisi aina ya wanataka kuonyesha kukua. Lakini kila mahali ukiangalia vinginevyo ni kwenda kuonyesha anwani 0 saa ya juu na juu ya kumbukumbu anuani hapo chini, hivyo hii ni maoni yako ya kawaida ya kumbukumbu. Je, una swali? [Mwanafunzi] Unaweza kutuambia zaidi juu ya lundo? Yeah. Mimi itabidi kupata kwamba katika pili. Kwanza, kurejea kwa nini kurudi & y ni kitu mbaya, juu ya stack wewe kuwa na rundo la muafaka stack ambayo kuwakilisha yote ya kazi ambayo imekuwa kuitwa. Hivyo kupuuza mambo ya awali, juu ya stack wako daima ni kwenda kuwa kazi kuu tangu kwamba kazi hiyo ni ya kwanza kuitwa. Na kisha wakati wewe piga kazi nyingine, stack anaenda kukua chini. Hivyo kama mimi kuwaita baadhi ya kazi, foo, na anapata stack yake mwenyewe frame, inaweza kuwaita baadhi ya kazi, bar; anapata stack yake mwenyewe frame. Na bar inaweza kuwa ya kujirudia na inaweza kuita yenyewe, na hivyo kuwa wito pili kwa bar ni kwenda kupata stack yake mwenyewe frame. Na hivyo yale yanayoendelea katika muafaka haya yote ni stack ya vigezo mitaa na wote wa hoja kwamba kazi - Yoyote yaliyo ya ndani ya nchi scoped kwa kazi hii kwenda katika muafaka haya stack. Hivyo kwamba maana wakati mimi alisema kitu kama bar ni kazi, Mimi tu kwenda kutangaza integer na kisha kurudi pointer integer kwamba. Hivyo ambapo gani y kuishi? [Mwanafunzi] y anaishi katika bar. >> [Bowden] Yeah. Mahali fulani katika mraba huu kidogo ya kumbukumbu ni mraba littler kwamba ana y ndani yake. Wakati mimi kurudi & y, mimi nina kurudi pointer block hii kidogo ya kumbukumbu. Lakini basi atakaporudi kazi, stack yake frame anapata popped mbali stack. Na kwamba sababu ni kuitwa stack. Ni kama muundo data stack, kama unajua nini kuwa ni. Au hata kama stack ya trays ni daima mfano, kuu ni kwenda juu chini, kisha kazi kwanza wewe piga yataenda juu ya kwamba, na huwezi kupata nyuma kuu mpaka kurudi kutoka utendaji wote ambao wameitwa ambayo yamekuwa kuwekwa juu yake. [Mwanafunzi] Basi kama alivyofanya kufanya kurudi y &, thamani kwamba ni kubadilika bila ya taarifa. Ndiyo, it's - >> [mwanafunzi] Ni inaweza kuwa overwritten. >> Yeah. Ni kabisa - Kama wewe kujaribu na - Hii pia ingekuwa int * bar kwa sababu ni kurudi pointer, hivyo kurudi yake ni aina int *. Kama wewe kujaribu kutumia thamani ya kurudi kwa kazi hii, ni undefined tabia kwa sababu pointer kwamba anasema kwa kumbukumbu mbaya. >> [Mwanafunzi] Sawa. Basi nini kama, kwa mfano, alitangaza int * y = malloc (sizeof (int))? Hiyo ni bora zaidi. Ndiyo. [Mwanafunzi] Kuongelea jinsi wakati sisi Drag mambo bin yetu kusaga wao siyo kweli erased; sisi tu kupoteza kuyatumia yao. Hivyo katika kesi hii je sisi kweli kufuta thamani au ni bado kuna katika kumbukumbu? Kwa sehemu kubwa, ni ya kwenda bado kuwa huko. Lakini hebu sema sisi kutokea kwa kuwaita baadhi ya kazi nyingine, bazi. Baz ni kwenda kupata stack yake mwenyewe frame ya juu hapa. Ni kwenda kuwa overwriting yote ya mambo haya, na kisha kama baadaye kujaribu na kutumia pointer kwamba got kabla, si kwenda kuwa thamani sawa. Ni kwenda yamebadilika kwa sababu tu wewe kuitwa bazi kazi. [Mwanafunzi] Lakini sisi si alikuwa, ingekuwa sisi bado kupata 3? [Bowden] Katika uwezekano wote, ninyi wenyewe. Lakini huwezi kutegemea kwamba. C tu anasema tabia zisizoeleweka. [Mwanafunzi] Oh, ni gani. Sawa. Hivyo wakati unataka kurudi pointer, hii ni wapi malloc huja katika matumizi. Mimi nina maandishi kweli tu kurudi malloc (3 * sizeof (int)). Tutaweza kwenda juu zaidi katika malloc pili, lakini wazo la malloc ni wote wa vigezo yako ya mtaa daima kwenda juu ya stack. Chochote ambacho malloced unaendelea chungu, na itakuwa ni milele na daima kuwa katika kifusi mpaka waziwazi huru yake. Hivyo hii ina maana kwamba wakati wewe malloc kitu, ni kwenda kuishi baada ya kurudi kazi. [Mwanafunzi] Je, ni kuishi baada ya mpango ataacha mbio? >> No Okay, kwa hivyo ni kwenda kuwa huko mpaka mpango ni njia yote kufanyika mbio. >> Ndiyo. Tunaweza kwenda zaidi ya maelezo ya kile kinachotokea wakati mpango ataacha mbio. Unaweza haja ya kuwakumbusha yangu, lakini kwamba ni jambo tofauti kabisa. [Mwanafunzi] Basi malloc inajenga pointer? >> Yeah. Malloc - >> [mwanafunzi] Nadhani malloc designates block ya kumbukumbu kwamba pointer wanaweza kutumia. [Bowden] Mimi nataka kuwa mchoro tena. >> [Mwanafunzi] Basi kazi hii kazi, ingawa? [Mwanafunzi] Yeah, malloc designates block ya kumbukumbu kwamba unaweza kutumia, na kisha kuirudisha anuani ya kuzuia kwanza ya kumbukumbu hiyo. [Bowden] Yeah. Hivyo wakati wewe malloc, wewe ni grabbing baadhi block ya kumbukumbu kwamba sasa katika lundo. Kama chungu ni ndogo mno, kuwarundika ni kwenda tu kukua, na hukua katika mwelekeo huu. Basi hebu kusema chungu ni ndogo mno. Basi ni habari kukua kidogo kidogo na kurudi pointer hii block kwamba tu ilikua. Wakati mambo bure, wewe ni kufanya zaidi ya chumba katika chungu, hivyo basi baadaye wito kwa malloc wanaweza kutumia tena kwamba kumbukumbu kwamba hapo awali alikuwa huru. jambo muhimu kuhusu malloc na bure ni kwamba inakupa udhibiti kamili juu ya maisha ya vitalu hizi kumbukumbu. Vigezo Global ni daima hai. Vigezo Mitaa ni hai ndani ya wigo wao. Haraka kama wewe kwenda nyuma Brace curly, vigezo mitaa ni maiti. Kumbukumbu Malloced ni hai wakati unataka kuwa hai na kisha ni iliyotolewa wakati kuwaambia ni kutolewa. Wale ni kweli tu aina 3 ya kumbukumbu, kwa kweli. Kuna moja kwa moja ya kumbukumbu ya usimamizi, ambayo ni stack. Mambo kutokea kwa wewe moja kwa moja. Wakati kusema x int, kumbukumbu ni zilizotengwa kwa ajili ya x int. Wakati x huenda nje ya wigo, kumbukumbu ni reclaimed kwa x. Kisha kuna nguvu kumbukumbu usimamizi, ambayo ni nini malloc ni, ambayo ni wakati wewe kuwa na udhibiti. Wewe dynamically kuamua wakati kumbukumbu lazima na haipaswi zilizotengwa. Na kisha kuna tuli, ambayo tu ina maana kwamba anaishi milele, ambayo ni nini vigezo kimataifa ni. Wao ni tu daima katika kumbukumbu. Maswali? [Mwanafunzi] Je, unaweza kufafanua block tu kwa kutumia braces curly lakini si kuwa na kuwa kama maelezo au taarifa wakati au kitu kama hicho? Unaweza kufafanua block kama katika kazi, lakini ambayo ina braces curly pia. [Mwanafunzi] Hivyo unaweza si tu kama jozi random ya braces curly katika code yako kwamba kuwa na vigezo mitaa? >> Ndiyo, unaweza. Ndani ya bar int sisi inaweza kuwa na {int y = 3;}. Hiyo walidhani kuwa hapa hapa. Lakini hiyo kabisa amefafanua wigo wa int y. Baada brace kwamba pili curly, y haiwezi kutumika tena. Wewe karibu kamwe kufanya hivyo, ingawa. Kupata nyuma na kile kinachotokea wakati mpango mwisho, kuna aina ya uongo mbaya / nusu kwamba sisi kuwapa ili tu kufanya mambo rahisi. Sisi kukuambia kwamba wakati wewe kutenga kumbukumbu wewe ni kugawa baadhi chunk ya RAM kwa variable kwamba. Lakini wewe si kweli moja kwa moja kugusa RAM milele katika programu yako. Kama wewe kufikiria hivyo, jinsi mimi akauchomoa - Na kweli, kama wewe kwenda kupitia katika GDB utaona kitu kimoja. Bila kujali mara ngapi wewe kuendesha programu yako au nini mpango wewe ni mbio, stack daima ni kwenda kuanza - wewe daima kwenda kuona vigezo karibu anuani kitu oxbffff. Ni kawaida mahali fulani katika kanda hiyo. Lakini jinsi gani wanaweza 2 mipango uwezekano wa kuwa na kuyatumia kwa kumbukumbu sawa? [Mwanafunzi] Kuna baadhi ya wajibu holela wa oxbfff ambapo zinatakiwa kuwa juu ya RAM kwamba kweli anaweza kuwa katika maeneo tofauti kutegemea wakati kazi iliitwa. Yeah. mrefu ni virtual kumbukumbu. Wazo ni kwamba, kila mchakato wa moja, kila mpango moja kwamba ni mbio kwenye kompyuta yako ina wenyewe wake - hebu kudhani bits 32 - kujitegemea kabisa anuani nafasi. Hii ni nafasi anuani. Ina kujitegemea kabisa yake mwenyewe gigabytes 4 kutumia. Hivyo kama wewe kukimbia mipango 2 wakati huo huo, mpango huu anaona gigabytes 4 kwa yenyewe, mpango huu anaona gigabytes 4 kwa yenyewe, na ni vigumu kwa mpango huu kwa dereference pointer na kuishia na kumbukumbu kutoka mpango huu. Na nini kumbukumbu virtual ni ni ramani kutoka nafasi michakato anuani mambo halisi juu ya RAM. Hivyo ni juu ya mfumo wa uendeshaji wako na kujua kwamba, hey, wakati huu pointer dereferences guy oxbfff, kwamba kweli ina maana kwamba anataka RAM Byte 1000, lakini kama mpango huu dereferences oxbfff, yeye kweli anataka RAM Byte 10,000. Wanaweza kuwa kiholela mbali mbali. Hii ni hata ya kweli ya mambo ndani ya nafasi michakato anuani moja. Hivyo kama anaona gigabytes wote 4 kwa yenyewe, lakini tuseme - [Mwanafunzi] Kwani kila mchakato wa moja - Hebu sema wewe kuwa na kompyuta na gigabytes 4 tu ya RAM. Je, kila mchakato wa moja kuona nzima gigabytes 4? >> Ndiyo. Lakini gigabytes 4 anaona ni uongo. Ni tu ni anadhani ana kumbukumbu hii yote kwa sababu hajui mchakato wowote mwingine lipo. Itakuwa tu kutumia kiasi kama kumbukumbu kama kweli anahitaji. mfumo wa uendeshaji ni si kwenda kutoa RAM kwa mchakato huu kama si kutumia yoyote kumbukumbu katika mkoa huu mzima. Si kwenda kutoa ni kumbukumbu kwa ajili ya kanda hiyo. Lakini wazo ni kwamba - mimi nina ninafikiria - siwezi kufikiri ya mlinganisho. Analojia ni ngumu. Moja ya masuala ya kumbukumbu virtual au moja ya mambo ni kutatua ni kwamba michakato ya lazima kabisa hawajui mtu mwingine. Na hivyo unaweza kuandika mpango wowote kwamba tu dereferences yoyote pointer, kama tu kuandika mpango kwamba anasema * (ox1234), na kwamba ni dereferencing kumbukumbu anuani 1234. Lakini ni juu ya mfumo wa uendeshaji na kisha kutafsiri nini maana ya 1234. Hivyo kama 1234 hutokea kwa kuwa halali kumbukumbu anuani kwa utaratibu huu, kama ni juu ya stack au kitu, basi hii atarudi thamani ya anuani kwamba kumbukumbu mbali kama mchakato anajua. Lakini kama 1234 ni si anuani halali, kama hutokea kwa ardhi katika baadhi ya kipande kidogo ya kumbukumbu hapa ambacho ni zaidi ya stack na zaidi ya chungu na wewe si kweli kwamba kutumika, kisha hiyo wakati wewe kupata mambo kama segfaults kwa sababu wewe ni kugusa kumbukumbu kwamba unapaswa kuwa kugusa. Hii pia ni kweli - Mfumo ya 32-bit, 32 bits ina maana una bits 32 kufafanua anuani kumbukumbu. Ni kwa nini ni kuyatumia 8 ka sababu 32 bits ni 8 ka - au ka 4. Kuyatumia ni 4 ka. Hivyo wakati wewe kuona kama pointer oxbfffff, kwamba ni - Ndani ya mpango wowote unaweza tu kujenga yoyote pointer holela, popote kutoka ox0 kwa ng'ombe 8 f's - ffffffff. [Mwanafunzi] Je wewe kusema wao ni 4 ka? >> Yeah. [Mwanafunzi] Kisha Byte kila itakuwa na - >> [Bowden] hexadesimoli. Hexadesimoli - 5, 6, 7, 8. Hivyo kuyatumia utaenda daima kuona katika hexadesimoli. Ni tu jinsi sisi classify kuyatumia. Kila digits 2 ya hexadesimoli ni 1 Byte. Hivyo kuna kwenda kuwa 8 hexadesimoli digits kwa ka 4. Hivyo kila pointer moja juu ya mfumo wa 32-bit ni kwenda kuwa 4 ka, ambayo ina maana kwamba katika mchakato wako unaweza kujenga yoyote holela ka 4 na kufanya pointer nje ya hayo, ambayo ina maana kwamba mbali kama ni kufahamu, inaweza kushughulikia 2 mzima ka 32 ya kumbukumbu. Hata ingawa ni kweli haina kupata kwamba, hata kama kompyuta yako tu ina megabaiti 512, ni anadhani ana kwamba kumbukumbu sana. Na mfumo wa uendeshaji ni smart kutosha kwamba itakuwa tu kutenga kile haja kweli. Haina tu kwenda, oh, mchakato mpya: 4 gigs. Yeah. >> [Mwanafunzi] gani ng'ombe maana? Mbona kuandika? Ni tu ishara kwa hexadesimoli. Baada ya kuona idadi ya kuanza kwa ng'ombe, mambo mfululizo ni hexadesimoli. [Mwanafunzi] Wewe walikuwa akielezea juu ya kile kinachotokea wakati mpango mwisho. >> Ndiyo. Nini kinatokea wakati mpango mwisho ni mfumo wa uendeshaji tu erases upangaji kwamba ina kwa anwani hizi, na hiyo ni yake. mfumo wa uendeshaji sasa wanaweza kutoa tu kwamba kumbukumbu kwa mpango mwingine kutumia. [Mwanafunzi] Sawa. Hivyo wakati wewe kutenga kitu juu ya lundo au vigezo stack au kimataifa au kitu chochote, wao wote tu kutoweka kwa haraka kama mpango mwisho kwa sababu ya mfumo wa uendeshaji ni sasa huru kutoa kwamba kumbukumbu kwa mchakato nyingine yoyote. [Mwanafunzi] Hata ingawa kuna bado pengine maadili yaliyoandikwa katika? >> Yeah. maadili ni uwezekano bado kuna. Ni tu ni kwenda kuwa vigumu kupata kwao. Ni vigumu zaidi kupata saa yao zaidi ni kupata saa faili ilifutwa kwa sababu ilifutwa faili aina ya aketiye huko kwa muda mrefu na ngumu kuendesha ni mengi zaidi. Hivyo ni kwenda overwrite sehemu mbalimbali za kumbukumbu kabla hayajatokea ili overwrite chunk ya kumbukumbu kwamba faili kwamba kutumika kuwa katika. Lakini kuu kumbukumbu, RAM, wewe mzunguko kwa njia ya kura kwa kasi, hivyo ni kwenda haraka sana kuwa overwritten. Maswali juu ya hili au kitu kingine? [Mwanafunzi] nina maswali kuhusu mada tofauti tofauti. >> Sawa. Je, mtu yeyote kuwa na maswali juu ya hili? Sawa. Mbalimbali ya mada. >> [Mwanafunzi] Sawa. Mimi alikuwa anapita katika baadhi ya vipimo vya mazoezi, na katika mmoja wao ni kuzungumza kuhusu sizeof na thamani ya kwamba kuirudisha au aina tofauti kutofautiana. >> Ndiyo. Na alisema kwamba wote int na ya muda mrefu kurudi 4, hivyo ni wote ka 4 mrefu. Je, kuna tofauti yoyote kati ya int na muda mrefu, au ni kitu kimoja? Ndiyo, kuna tofauti. C kiwango - Mimi pengine anaenda fujo up. Kiwango C ni kama yale C ni, nyaraka rasmi ya C. Hii ni nini anasema. Hivyo kiwango C tu anasema kwamba Char itakuwa milele na daima kuwa 1 Byte. Kila kitu baada ya kuwa - mfupi ni daima tu hufafanuliwa kama ulikuwa mkubwa kuliko au sawa na char. Hii inaweza kuwa madhubuti zaidi kuliko, lakini si chanya. int ni tu hufafanuliwa kama ulikuwa mkubwa kuliko au sawa na mfupi. Na muda mrefu ni tu hufafanuliwa kama ulikuwa mkubwa kuliko au sawa na int. Na muda mrefu, ni mkubwa kuliko au sawa na muda mrefu. Hivyo kitu pekee kiwango C amefafanua ni kuagiza jamaa wa kila kitu. kiasi halisi ya kumbukumbu kwamba mambo kuchukua ni ujumla hadi utekelezaji, lakini ni pretty defined vizuri katika hatua hii. >> [Mwanafunzi] Sawa. Hivyo kaptula ni karibu daima itakuwa 2 ka. Ints ni karibu daima itakuwa 4 ka. Hutamani muda mrefu ni karibu daima itakuwa 8 bytes. Na anatamani, inategemea kama unatumia 32-bit au mfumo 64-bit. Hiyo kwa muda mrefu ni kwenda yanahusiana na aina ya mfumo. Kama wewe ni kutumia mfumo wa 32-bit kama Appliance, itakavyo kuwa 4 ka. Kama unatumia 64-bit kama mengi ya kompyuta hivi karibuni, ni kwenda kuwa 8 bytes. Ints ni karibu daima ka 4 katika hatua hii. Hutamani muda mrefu ni karibu daima 8 bytes. Huko nyuma, ints kutumika tu 2 ka. Lakini taarifa kwamba hii kabisa satisfies yote ya mahusiano haya ya mkuu kuliko na kuwa sawa na. Hiyo kwa muda mrefu kikamilifu kuruhusiwa kuwa ukubwa sawa kama integer, na ni pia kuruhusiwa kuwa ukubwa sawa kama muda mrefu. Na tu hivyo hutokea kuwa kwamba katika 99.999% ya mifumo, ni kwenda kuwa sawa na aidha int au muda mrefu. Ni inategemea tu kidogo 32-au 64-bit. >> [Mwanafunzi] Sawa. Katika ikifungwa, ni jinsi gani ya uhakika decimal mteule katika suala la bits? Kama kama binary? >> Yeah. Huna haja ya kujua kwamba kwa CS50. Huna hata kujifunza kuwa katika 61. Huwezi kujifunza kwamba kweli katika shaka yoyote. Ni tu uwakilishi. Mimi kusahau allotments kidogo halisi. wazo la uhakika floating ni kwamba kutenga idadi maalum ya bits kuwakilisha - Kimsingi, kila kitu ni kwa nukuu ya kisayansi. Hivyo kutenga idadi maalum ya bits kuwakilisha idadi yenyewe, kama 1.2345. Siwezi kamwe kuwakilisha idadi na tarakimu zaidi ya 5. Kisha wewe pia kutenga idadi maalum ya bits ili huelekea kuwa kama unaweza tu kwenda idadi fulani, kama kwamba exponent kubwa unaweza kuwa, na unaweza tu kwenda chini kwa exponent fulani, kama hiyo ni ndogo exponent unaweza kuwa. Sikumbuki bits njia halisi ni kwa ajili ya wote wa maadili haya, lakini idadi fulani ya bits ni wakfu kwa 1.2345, idadi mwingine baadhi ya bits ni wakfu kwa exponent, na ni inawezekana tu kuwakilisha exponent ya ukubwa fulani. [Mwanafunzi] Na mara mbili? Ni kwamba kama kuelea ziada kwa muda mrefu? >> Yeah. Ni kitu kimoja kama kuelea ila sasa unatumia ka 8 badala ya ka 4. Sasa wewe utakuwa na uwezo wa kutumia tarakimu 9 au tarakimu ya 10, na hii itakuwa na uwezo wa kwenda hadi 300 badala ya 100. >> [Mwanafunzi] Sawa. Na ikifungwa ni pia 4 ka. >> Ndiyo. Naam, tena, labda inategemea kwa ujumla juu ya utekelezaji wa jumla, lakini ikifungwa ni 4 ka, DOUBLES ni 8. DOUBLES huitwa mara mbili kwa sababu ni mara mbili ya ukubwa wa inaelea. [Mwanafunzi] Sawa. Na ni pale mara mbili mara mbili? >> Kuna si. Nadhani - >> [mwanafunzi] Kama hutamani muda mrefu? >> Yeah. Sidhani hivyo. Ndiyo. [Mwanafunzi] cha mtihani mwaka jana kulikuwa na swali kuhusu kazi kuu kuwa na kuwa sehemu ya programu yako. Jibu ni kwamba hana na kuwa sehemu ya programu yako. Katika hali gani? Hiyo ni nini nikaona. [Bowden] Inaonekana - >> [mwanafunzi] Nini hali? Je, una tatizo? >> [Mwanafunzi] Yeah, mimi unaweza dhahiri kuvuta it up. Haina kuwa, kitaalam, lakini kimsingi ni kwenda kuwa. [Mwanafunzi] nikaona moja juu ya tofauti wa mwaka. Ilikuwa kama kweli au uongo: halali - >> Oh, c faili.? . [Mwanafunzi] yoyote c faili lazima kuwa - [wote akizungumza kwa mara moja - unintelligible] Sawa. Basi hiyo ni tofauti. C. Faili tu mahitaji vyenye kuharibika. Unaweza kukusanya faili katika code mashine, binary, chochote, bila kuwa executable bado. executable halali lazima kuwa na kazi kuu. Unaweza kuandika kazi 100 katika faili 1 lakini hakuna kuu na kisha kukusanya kwamba chini binary, kisha kuandika faili nyingine kwamba tu ana kuu lakini ni wito rundo la kazi hizi katika faili hii binary zaidi ya hapa. Na hivyo wakati wewe ni kufanya executable, kwamba ni nini linker gani ni inaunganisha hizi files binary 2 ndani ya kutekelezwa. Hivyo c. Faili haina haja ya kuwa na kazi kuu wakati wote. Na juu ya besi kubwa code utaona maelfu ya. Files c na 1 kuu faili. Zaidi maswali? [Mwanafunzi] Kulikuwa na swali lingine. Ni alisema kufanya ni compiler. Kweli au uongo? Na jibu ilikuwa ni uongo, na mimi kueleweka kwa nini siyo kama Clang. Lakini je, sisi kuwaita kufanya kama si? Matokeo ni ya kimsingi tu - naweza kuona hasa nini wito yake. Lakini ni anaendesha tu amri. Kufanya. Naweza kuvuta hii up. Yeah. Oh, yeah. Matokeo pia anafanya hivyo. Hii inasema madhumuni ya shirika kufanya ni kuamua moja kwa moja ambayo vipande vya mpango kubwa yanahitaji recompiled na kutoa amri kwa recompile yao. Unaweza kufanya kufanya files kwamba ni kabisa kubwa. Matokeo inaangalia mihuri wakati wa files na, kama sisi alisema kabla, unaweza kukusanya files binafsi chini, na si mpaka kupata kwa linker kwamba wao ni kuweka pamoja ndani ya kutekelezwa. Hivyo kama una 10 files tofauti na kufanya mabadiliko kwa 1 wao, basi nini kufanya ni kwenda kufanya ni tu kwamba recompile 1 faili na kisha relink kila kitu pamoja. Lakini ni kiasi dumber kuliko hiyo. Ni juu ya wewe kabisa kufafanua kwamba hiyo ndiyo wanapaswa kufanya. Ni kwa default ina uwezo wa kutambua hili muhuri wakati stuff, lakini unaweza kuandika faili kufanya kufanya kitu chochote. Unaweza kuandika kufanya faili ili pale unapoandika kufanya hivyo tu cd ya saraka nyingine. Mimi nilikuwa frustrated kupata kwa sababu mimi tack kila kitu ndani ya Appliance yangu na kisha mimi mtazamo PDF kutoka Mac. Kwa hiyo mimi kwenda Finder na siwezi kufanya Nenda, Connect na Server, na server mimi kuungana na ni Appliance yangu, kisha mimi kufungua PDF kwamba anapata ulioandaliwa na mpira. Lakini mimi kupata frustrated kwa sababu kila wakati mimi zinahitajika kwa ajili ya kujikumbusha PDF, Mimi nilikuwa na nakala yake kwa directory maalum kwamba inaweza kupata na ilikuwa kupata annoying. Hivyo badala niliandika faili kufanya, ambayo una kufafanua jinsi inafanya mambo. Jinsi ya kufanya katika hili ni PDF mpira. Tu kama faili yoyote nyingine kufanya - au mimi nadhani wewe hawajaona files kufanya, lakini sisi katika appliance kimataifa kufanya faili kwamba tu anasema, kama wewe ni kuandaa faili C, kutumia Clang. Na hivyo hapa katika kufanya file yangu kwamba mimi kufanya nasema, faili hii utaenda wanataka kukusanya na PDF mpira. Na hivyo ni PDF mpira kwamba anafanya kuandaa. Kufanya si kuandaa. Ni kukimbia tu amri hizi katika mlolongo mimi maalum. Hivyo ni anaendesha PDF mpira, ni nakala yake na directory mimi nataka kunakiliwa kwa, ni cd ya saraka na anafanya mambo mengine, lakini wote ni gani ni kutambua wakati mabadiliko ya SVG, na kama ni mabadiliko, basi itakuwa kukimbia amri kwamba ni walidhani kukimbia wakati mabadiliko faili. >> [Mwanafunzi] Sawa. Sijui ambapo kimataifa kufanya files ni kwa ajili yangu na kuangalia ni nje. Maswali mengine? Kitu chochote kutoka zamani Quizzes? Mambo pointer yoyote? Kuna mambo ya hila na kuyatumia kama - Mimi si kwenda kuwa na uwezo wa kupata swali Jaribio juu yake - lakini tu kama jambo la aina hii. Hakikisha kuelewa kwamba wakati mimi kusema int * x * y - Hii si hasa chochote hapa, mimi nadhani. Lakini kama * x * y, wale ni 2 vigezo kwamba ni juu ya stack. Wakati mimi kusema x = malloc (sizeof (int)), x bado ni kutofautiana juu ya stack, malloc ni baadhi block juu katika chungu, na sisi ni kuwa x uhakika na lundo. Hivyo kitu juu ya pointi stack chungu. Kila wewe malloc kitu chochote, wewe ni inevitably hifadhi hiyo ndani ya pointer. Hivyo pointer kwamba ni juu ya stack, block malloced ni juu ya lundo. mengi ya watu kupata kuchanganyikiwa na kusema int * x = malloc; x ni juu ya lundo. No nini x anaonyesha ni juu ya lundo. x yenyewe ni juu ya stack, isipokuwa kwa sababu yoyote una x kuwa variable kimataifa, katika kesi ambayo hutokea kwa kuwa katika mkoa mwingine wa kumbukumbu. Hivyo kuweka wimbo, hizi michoro sanduku na mshale ni pretty kawaida kwa chemsha bongo. Au kama si juu ya jaribio 0, itakuwa juu ya chemsha bongo 1. Unapaswa kujua haya yote, kwa hatua katika kuandaa tangu alikuwa na kujibu maswali juu ya hayo. Ndiyo. [Mwanafunzi] Inawezekana sisi kwenda juu ya hatua hizo - >> Uhakika. Kabla ya hatua na kuandaa tuna preprocessing, kuandaa, kukusanyika, na kuunganisha. Preprocessing. Je, hiyo nini? Ni hatua rahisi katika - vizuri, si kama - kwamba haina maana ni lazima kuwa wazi, lakini ni hatua rahisi. You guys yangeweza kutekeleza ninyi wenyewe. Yeah. [Mwanafunzi] Chukua yale katika yako ni pamoja na kama hii na nakala na kisha pia amefafanua. Inaonekana kwa mambo kama # ni pamoja na # define, na ni haki nakala na pastes nini wale kweli maana. Hivyo wakati wewe kusema ni pamoja # cs50.h, preprocessor ni kuiga na pasting cs50.h ndani ya mstari huo. Wakati kusema # define x kuwa 4, preprocessor inakwenda kupitia mpango mzima na nafasi ya matukio yote ya x kwa 4. Hivyo preprocessor inachukua halali C faili na matokeo halali C faili ambapo mambo wamekuwa kunakiliwa na pasted. Hivyo ikiandaa. Je, hiyo nini? [Mwanafunzi] Ni inakwenda kutoka C kwa binary. [Bowden] Ni haina kwenda njia yote ya binary. [Mwanafunzi] Ili code mashine, basi? >> Ni si mashine code. [Mwanafunzi] Bunge? >> Bunge. Unaendelea na Bunge kabla huenda njia yote ya code C, na zaidi lugha kufanya kitu kama hiki. Pick lugha yoyote ya ngazi ya juu, na kama wewe ni kwenda kukusanya yake, ni uwezekano wa kukusanya katika hatua. Kwanza ni kwenda kukusanya Chatu na C, basi ni kwenda kukusanya C kwa Bunge, na kisha Bunge ni kwenda kupata Tafsiri ya binary. Hivyo kuandaa anaenda kuleta kutoka C kwa Bunge. neno kuandaa kawaida maana kuleta kutoka ngazi ya juu kwa ngazi ya chini lugha ya programu. Hivyo hii ni hatua tu katika mkusanyiko ambapo kuanza kwa lugha ya ngazi ya juu na kuishia katika lugha ngazi ya chini, na kwamba sababu ya hatua inaitwa kuandaa. [Mwanafunzi] Wakati wa kuandaa, hebu kusema kwamba umefanya kosa # pamoja cs50.h. Will compiler recompile cs50.h, kama kazi ya kwamba ni huko, na kutafsiri kwamba katika kanuni Bunge kama vile, au itakuwa nakala na kuweka kitu ambacho imekuwa ni kabla ya Bunge? cs50.h itakuwa pretty much kamwe kuishia katika Bunge. Mambo kama prototypes kazi na mambo tu kwa ajili ya wewe kuwa makini. Ni dhamana kwamba compiler unaweza kuangalia mambo kama wewe ni wito kazi pamoja na haki ya kurudi aina na hoja haki na mambo ya ajabu. Hivyo cs50.h itakuwa preprocessed ndani ya faili, na kisha wakati ni kuandaa ni kimsingi kutupwa mbali baada inafanya kuhakikisha kwamba kila kitu ni kuitwa kwa usahihi. Lakini kazi defined katika maktaba CS50, ambayo ni tofauti na cs50.h, wale si tofauti compiled. Hiyo kweli kuja chini katika hatua ya kuunganisha, hivyo tutaweza kupata kwamba katika pili. Lakini kwanza, ni nini kukusanyika? [Mwanafunzi] Bunge kwa binary? >> Yeah. Kukusanyika. Hatuna kuiita kuandaa kwa sababu Bunge ni kiasi pretty tafsiri safi ya binary. Kuna ni kidogo sana mantiki katika kwenda Bunge kwa binary. Ni kama tu kuangalia juu katika meza, oh, tuna maelekezo haya; kwamba sambamba na binary 01,110. Na hivyo files kwamba kukusanyika kwa ujumla matokeo ni files o.. Na. O files ni nini sisi walikuwa wakisema kabla, jinsi faili haina haja ya kuwa na kazi kuu. Faili yoyote inaweza compiled chini faili o. Muda mrefu kama ni halali C faili. Ni inaweza compiled chini. O. Sasa, kuunganisha ni nini hasa huleta rundo la o files. Na huleta yao kwa kutekelezwa. Na hivyo kile kuunganisha gani ni unaweza kufikiri ya maktaba CS50 kama faili o.. Tayari ni compiled binary file. Na hivyo wakati wewe kukusanya faili yako, hello.c yako, ambayo inatoa wito GetString, hello.c anapata compiled chini hello.o, hello.o ni sasa katika binary. Ni anatumia GetString, hivyo mahitaji ya kwenda juu kwa cs50.o, na linker smooshes yao pamoja na nakala GetString ndani ya faili hili na hutoka nje na executable kwamba ana kazi yote ni mahitaji. Hivyo cs50.o si kweli faili O, lakini ni karibu kutosha kwamba hakuna tofauti ya kimsingi. Hivyo kuunganisha tu huleta rundo la files pamoja kwamba tofauti vyenye wote wa kazi mimi haja ya kutumia na inajenga executable kwamba mapenzi kweli kukimbia. Na hivyo pia kwamba kile sisi walikuwa wakisema kabla ya ambapo unaweza 1000 files c., wewe kukusanya wote wale o files., ambayo pengine kuchukua muda, kisha wewe kubadili 1 c faili.. Unahitaji tu recompile kwamba 1. C faili na kisha relink kila kitu kingine, kuhusisha kila kitu nyuma pamoja. [Mwanafunzi] Wakati sisi ni kuunganisha sisi kuandika lcs50? Yeah, hivyo-lcs50. Ishara kwamba bendera kwa linker kwamba unapaswa kuunganisha katika maktaba hiyo. Maswali? Je, sisi wamekwenda juu ya binary nyingine ya sekunde kwamba 5 katika hotuba ya kwanza? Sidhani hivyo. Unapaswa kujua yote ya Os kubwa kwamba tumeenda juu, na unapaswa kuwa na uwezo wa, ikiwa tuliyowapeni kazi, unapaswa kuwa na uwezo wa kusema ni kubwa O, ukali. Au vizuri, big O ni mbaya. Hivyo kama unaweza kuona nested kwa matanzi looping juu ya idadi sawa ya mambo, kama int i, i > [mwanafunzi] n squared. >> Huelekea kuwa n squared. Kama una triple nested, huelekea kuwa n cubed. Hivyo kwamba aina ya kitu unapaswa kuwa na uwezo wa kumweka nje mara moja. Unahitaji kujua insertion aina na aina ya Bubble na kuunganisha aina na wale wote. Ni rahisi kuelewa kwa nini wao ni wale n squared na n logi n na yote ya kwamba sababu nadhani kulikuwa na juu ya chemsha bongo ya mwaka mmoja ambapo sisi kimsingi alitoa wewe utekelezaji wa aina Bubble na akasema, "Ni wakati wa mbio kazi hii?" Hivyo kama wewe kutambua kama aina Bubble, basi unaweza kusema mara moja n squared. Lakini kama wewe tu kuangalia ni, huna hata haja ya kutambua Bubble ni aina; unaweza tu kusema hii ni kufanya hii na hii. Hii ni n squared. [Mwanafunzi] Je, kuna mifano mgumu unaweza kuja na, kama wazo sawa ya kuhesabia nje? Sidhani tunataka kuwapa mifano yoyote mgumu. aina Bubble kitu ni kuhusu ngumu kama tunataka kwenda, na hata kuwa, kwa muda mrefu kama wewe kuelewa kwamba wewe ni juu ya safu iterating kwa kila kipengele katika safu, ambayo ni kwenda kuwa kitu ambacho n squared. Kuna jumla, maswali kama haki hapa tuna - Oh. Tu siku nyingine, Doug alidai, "nimeizua algorithm kwamba unaweza aina safu "Ya idadi n katika O (logi n) wakati!" Hivyo ni jinsi gani tunajua kwamba ni vigumu? [Inaudible mwanafunzi majibu] >> Yeah. Kwa uchache sana, una kugusa kila kipengele katika safu, hivyo ni vigumu kutatua safu ya - Kama kila kitu ni kwa utaratibu zisizochambuliwa, basi wewe ni kwenda kuwa kugusa kila kitu katika safu, hivyo ni vigumu kufanya hivyo katika chini ya O ya n. [Mwanafunzi] Wewe alituonyesha kuwa mfano wa kuwa na uwezo wa kufanya hivyo katika O ya n kama matumizi mengi ya kumbukumbu. >> Yeah. Na that's - mimi kusahau kile that's - Je, ni aina ya kuhesabu? Hmm. Hiyo ni integer kuchagua algorithm. Mimi nilikuwa kuangalia kwa jina maalum kwa ajili ya hili kwamba mimi hakuweza kukumbuka wiki iliyopita. Yeah. Hizi ni aina ya aina yake kuwa anaweza kukamilisha mambo katika kubwa O ya n. Lakini kuna mapungufu, kama unaweza tu kutumia integers hadi idadi fulani. Plus kama wewe ni kujaribu kutatua that's kitu - Kama safu yako ni 012, -12, 151, milioni 4, basi kwamba kipengele kimoja kwenda kabisa uharibifu wa kutenganisha nzima. Maswali? [Mwanafunzi] Kama una kazi ya kujirudia na hivyo hufanya tu wito kujirudia ndani ya taarifa ya kurudi, hiyo ni mkia kujirudia, na hivyo ingekuwa kwamba si kutumia zaidi ya kumbukumbu wakati wa Runtime au ingekuwa angalau kutumia kumbukumbu kulinganishwa kama iterative suluhisho? [Bowden] Ndiyo. Itakuwa uwezekano kuwa fulani polepole, lakini si kweli. Mkia kujirudia ni nzuri sana. Kuangalia tena katika muafaka stack, hebu sema tuna kuu na tuna bar int (int x) au kitu. Hii si kamilifu kujirudia kazi, lakini kurudi bar (x - 1). Hivyo ni wazi, hii ni dosari. Unahitaji kesi ya msingi na mambo ya ajabu. Lakini wazo hapa ni kwamba hii ni mkia kujirudia, ambayo ina maana wakati wito kuu bar ni kwenda kupata stack yake frame. Katika sura hii kuna stack kwenda kuwa block kidogo ya kumbukumbu kwamba sambamba na hoja x wake. Na hivyo hebu sema kuu kinachotokea kuwaita bar (100); Hivyo x ni kwenda kuanza nje kama 100. Kama compiler inatambua kuwa hii ni mkia kujirudia kazi, basi wakati bar hufanya wito wake kujirudia kwa bar, badala ya kufanya mpya stack frame, ambayo ni ambapo stack kuanza kukua kwa kiasi kikubwa, hatimaye itakuwa kukimbia katika kifusi na kisha kupata segfaults kwa sababu kumbukumbu kuanza colliding. Hivyo badala ya kufanya stack yake mwenyewe frame, inaweza kutambua, hey, mimi kwa kweli kamwe haja ya kurudi tena katika sura hii stack, hivyo badala mimi itabidi kuchukua nafasi ya hoja hii kwa 99 na kisha kuanza bar kote. Na basi itakuwa kufanya hivyo tena na itafikia kurudi bar (x - 1), na badala ya kufanya mpya stack frame, itakuwa tu nafasi ya hoja yake ya sasa na 98 na kisha kuruka nyuma mwanzo sana ya bar. Those shughuli, kuondoa kwamba thamani 1 juu ya stack na kuruka nyuma mwanzo, ni pretty ufanisi. Hivyo si tu kuwa hii ni sawa kumbukumbu ya matumizi kama kazi tofauti ambayo ni iterative kwa sababu wewe ni tu kwa kutumia 1 stack frame, lakini wewe si mateso downsides ya kuwa na kuwaita kazi. Wito kazi wanaweza kuwa fulani ghali kwa sababu ina nini kuanzisha hii yote na teardown na mambo haya yote. Hivyo hii recursion mkia ni nzuri. [Mwanafunzi] Kwa nini ni si kujenga hatua mpya? Kwa sababu anatambua haina haja. wito kwa bar ni tu kurudi wito kujirudia. Hivyo hana haja ya kufanya chochote kwa thamani ya kurudi. Ni tu kwenda mara moja kurudi. Hivyo tu kwenda kuchukua nafasi ya hoja yake mwenyewe na kuanza juu. Na pia, kama huna mkia kujirudia version, basi kupata hizi baa zote ambapo wakati bar hili hurejea ina kurudi thamani yake kwa hii moja, basi hiyo bar mara moja anarudi na kuirudisha thamani yake kwa moja hii, basi tu kwenda mara moja kurudi na kurudi thamani yake kwa moja hii. Basi, wewe ni kuokoa hii popping mambo yote haya mbali ya stack tangu thamani ya kurudi ni kwenda tu kuwa kupita njia yote nyuma hadi anyway. Hivyo kwa nini siyo tu nafasi ya hoja yetu na hoja updated na kuanza juu? Kama kazi ni si mkia kujirudia, kama wewe kufanya kitu kama - [Mwanafunzi] kama bar (x + 1). >> Yeah. Hivyo kama wewe kuiweka katika hali, basi wewe ni kufanya kitu kwa thamani ya kurudi. Au hata kama wewe tu kufanya kurudi 2 * bar (x - 1). Hivyo sasa bar (x - 1) anahitaji kurudi katika utaratibu kwa ajili yake kwa mahesabu ya mara 2 kuwa thamani, hivyo sasa haina haja zake tofauti mwenyewe stack frame, na sasa, hakuna jambo jinsi ngumu wewe jaribu, wewe ni kwenda haja ya - Hii si mkia kujirudia. [Mwanafunzi] Je, mimi kujaribu kuleta recursion kwa lengo recursion mkia - [Bowden] Katika ulimwengu halisi, lakini katika CS50 wewe huna. Ili kupata mkia recursion, kwa ujumla, wewe kuanzisha hoja ya ziada ambapo bar itachukua x int ndani ya y na y sambamba na kitu mwisho unataka kurudi. Hivyo basi hii utaenda tunarudi bar (x - 1), 2 * y. Hivyo kwamba tu wa ngazi za juu jinsi kubadilisha mambo kuwa mkia kujirudia. Lakini hoja ya ziada - Na kisha katika mwisho wakati wewe kufikia msingi wako kesi, wewe tu kurudi y kwa sababu tumekuwa kukusanya muda wote thamani ya kurudi kwamba unataka. Wewe aina ya wamekuwa wakifanya hivyo iteratively lakini kutumia calls kujirudia. Maswali? [Mwanafunzi] Labda kuhusu hesabu pointer, kama wakati wa kutumia masharti. >> Uhakika. Pointer hesabu. Wakati wa kutumia masharti ni rahisi kwa sababu ya masharti ni Char nyota, chars ni milele na daima Byte moja, na hivyo pointer arithmetic ni sawa na hesabu ya mara kwa mara wakati wewe ni kushughulika na masharti. Hebu tu kusema Char * s = "hello". Hivyo tuna block katika kumbukumbu. Inahitaji ka 6 kwa sababu wewe daima haja Terminator null. Na Char * s inaenda kwa mwanzo wa safu hii. Hivyo anasema kuna s. Sasa, hii ni kimsingi jinsi safu yoyote kazi, bila kujali kama ni kurudi kwa malloc au kama ni juu ya stack. Safu yoyote kimsingi ni pointer mwanzo wa safu, na kisha yoyote operesheni safu, yoyote Indexing, ni kwenda tu katika safu kwamba baadhi ya kukabiliana. Hivyo wakati mimi kusema kitu kama s [3]; hii ni kwenda s na kuhesabu chars 3 in Hivyo s [3], tuna 0, 1, 2, 3, hivyo s [3] ni kwenda kwa kutaja l hii. [Mwanafunzi] Na sisi inaweza kufikia thamani sawa kwa kufanya s + 3 na kisha mabano nyota? Ndiyo. Hii ni sawa na * (s + 3); na kwamba ni ya milele na daima sawa bila kujali wewe kufanya. Kamwe haja ya kutumia syntax bracket. Daima unaweza kutumia * (s + 3) syntax. Watu huvaa kama syntax bracket, ingawa. [Mwanafunzi] Basi wote arrays ni kweli tu kuyatumia. Kuna tofauti kidogo wakati mimi kusema int x [4]; >> [mwanafunzi] Je, hiyo kujenga kumbukumbu? [Bowden] Hayo ni kwenda kujenga ints 4 juu ya stack, hivyo 16 ka ujumla. Ni kwenda kujenga ka 16 juu ya stack. x si kuhifadhiwa mahali popote. Ni haki ya alama akimaanisha mwanzo wa kitu. Kwa sababu wewe alitangaza safu ndani ya kazi hii, nini compiler anaenda kufanya ni tu nafasi matukio yote ya x variable na ambapo ilivyotokea kuchagua kuweka ka hizi 16. Ni hawezi kufanya hivyo kwa Char * ni kwa sababu ya ni pointer halisi. Ni bure na kisha kumweka kwa mambo mengine. x ni mara kwa mara. Huwezi kuwa ni hatua ya safu mbalimbali. >> [Mwanafunzi] Sawa. Lakini wazo hili, hii Indexing, ni sawa bila kujali kama ni safu ya jadi au kama ni pointer kitu au kama ni pointer safu malloced. Na kwa kweli, ni sawa hivyo kwamba pia ni kitu kimoja. Ni kweli inasababisha tu nini ndani ya mabano na nini kushoto ya mabano, anaongeza wote pamoja, na dereferences. Hivyo hii ni halali kama * (s + 3) au s [3]. [Mwanafunzi] Je, unaweza kuwa na kuyatumia akizungumzia arrays 2-dimensional? Ni vigumu. Kijadi, hakuna. Safu 2-dimensional ni safu 1-dimensional na syntax baadhi rahisi kwa sababu wakati mimi kusema int x [3] [3], hii ni kweli tu 1 safu na maadili 9. Na hivyo wakati mimi index, compiler anajua nini namaanisha. Nikisema x [1] [2], anajua mimi nataka kwenda mstari wa pili, hivyo ni kwenda ruka 3 ya kwanza, na kisha anataka Jambo la pili kwa kuwa, hivyo ni kwenda kupata hii moja. Lakini bado tu safu moja-dimensional. Na hivyo kama nilitaka hawawajui pointer safu kwamba, Naweza kusema int * p = x; aina ya x ni tu - Ni mbaya akisema aina ya x kwa vile ni ishara tu na si kutofautiana halisi, lakini ni tu * int. x ni tu pointer mwanzo wa hii. >> [Mwanafunzi] Sawa. Na hivyo mimi si kuwa na uwezo wa kupata [1] [2]. Nadhani kuna syntax maalum kwa ajili ya kutangaza pointer, kitu ridiculous kama int (* p [-. kitu ujinga kabisa mimi hata sijui. Lakini kuna syntax kwa ajili ya kutangaza kuyatumia kama kwa mabano na mambo. Inaweza hata basi wewe kufanya hivyo. Mimi naweza kuangalia nyuma katika kitu ambacho ingekuwa kuniambia ukweli. Nami kuangalia kwa hilo baadaye, kama kuna syntax kwa uhakika. Lakini kamwe kuona. Na hata hivyo ni syntax kizamani kwamba kama matumizi yake, watu watakuwa baffled. Arrays multidimensional ni pretty nadra kama ni. Wewe pretty much - Naam, kama wewe ni kufanya mambo tumbo si kwenda kuwa adimu, lakini katika C wewe ni mara chache kwenda kuwa na kutumia arrays multidimensional. Yeah. >> [Mwanafunzi] Hebu sema una safu kweli kwa muda mrefu. Hivyo katika kumbukumbu virtual ingekuwa kuonekana kuwa yote mfululizo, kama vipengele haki ya karibu na kila mmoja, lakini katika kumbukumbu ya kimwili, ingekuwa inawezekana kwa kuwa kwa kuwa wameigawanya? >> Ndiyo. Jinsi virtual kumbukumbu matendo ni kama tu anavyotenganisha - kitengo cha mgao ni ukurasa, ambayo huelekea kuwa 4 kilobytes, na hivyo wakati wa mchakato anasema, hey, nataka kutumia kumbukumbu hii, mfumo wa uendeshaji ni kwenda kuipa kilobytes 4 Kitalu kwamba kidogo ya kumbukumbu. Hata kama wewe tu kutumia moja kidogo Byte katika block nzima ya kumbukumbu, mfumo wa uendeshaji ni kwenda kuwapa kamili kilobytes 4. Basi nini maana ya hii ni mimi naweza kuwa - wacha kusema hii ni stack yangu. Stack Hii inaweza kutengwa. Stack yangu inaweza kuwa megabaiti na megabaiti. Stack yangu inaweza kuwa kubwa. Lakini stack yenyewe ina kuwa umegawanyika katika kurasa binafsi, ambayo kama sisi kuangalia juu hapa hebu kusema hii ni RAM yetu, kama nina 2 gigabytes ya RAM, hii ni halisi anuani 0 0 Byte kama ya RAM yangu, na hii ni 2 gigabytes njia yote chini hapa. Hivyo ukurasa huu ili yanahusiana na block hii zaidi hapa. Ukurasa Hii inaweza yanahusiana na block hii zaidi hapa. Moja hii inaweza yanahusiana na hii moja zaidi ya hapa. Hivyo mfumo wa uendeshaji ni bure hawawajui kumbukumbu kimwili yoyote ukurasa binafsi kiholela. Na hiyo ina maana kwamba kama mpaka hii hutokea kwa magamaga safu, safu kinachotokea kwa kuwa kushoto ya hii na haki ya utaratibu huu wa ukurasa, kisha safu kwamba ni kwenda kuwa umegawanyika katika kumbukumbu ya kimwili. Na kisha wakati wewe kuacha mpango, wakati mchakato kumalizika, haya upangaji kupata erased na basi ni huru kutumia vitalu hizi kidogo kwa ajili ya mambo mengine. Zaidi maswali? [Mwanafunzi] arithmetic pointer. >> Oh yeah. Strings yalikuwa rahisi, lakini kuangalia kitu kama ints, hivyo nyuma int x [4]; Kama hii ni safu au kama ni pointer safu malloced ya integers 4, itakavyo kutibiwa njia sawa. [Mwanafunzi] Basi ni juu ya arrays mirundi? [Bowden] Arrays ni si juu ya lundo. >> [Mwanafunzi] Oh. [Bowden] Aina hii ya safu huelekea kuwa juu ya stack isipokuwa wewe amekiri kuwa ni saa - kupuuza vigezo kimataifa. Usitumie vigezo kimataifa. Ndani ya kazi nasema int x [4]; Ni kwenda kujenga block 4-integer juu ya stack kwa safu hii. Lakini hii malloc (4 * sizeof (int)); yataenda juu ya lundo. Lakini baada ya hatua hii naweza kutumia x na p katika pretty much njia hiyo hiyo, nyingine kuliko isipokuwa nilivyosema kabla kuhusu unaweza reassign p. Kitaalam, ukubwa wao ni tofauti kwa kiasi fulani, lakini hiyo ni kabisa lisilo na maana. Wewe kweli kamwe kutumia ukubwa wao. p mimi naweza kusema p [3] = 2; au x [3] = 2; Unaweza kutumia yao katika njia hasa sawa. Hivyo pointer arithmetic sasa - Ndiyo. [Mwanafunzi] Je kufanya p * kama una mabano? mabano ni dereference thabiti. >> Sawa. Kweli, pia unachosema na unaweza kupata arrays multidimensional na kuyatumia, nini unaweza kufanya ni kitu kama, hebu sema, int ** pp = malloc (sizeof (int *) * 5); Mimi itabidi kuandika yote nje ya kwanza. Mimi sitaki kuwa moja. Sawa. Nini mimi hapa ni - Kwamba lazima pp [i]. Hivyo pp ni pointer pointer. Wewe mallocing pp kwa uhakika na safu ya nyota 5 int. Hivyo katika kumbukumbu una juu ya pp stack Ni kwenda na kumweka kwa safu ya vitalu 5 ambao wote ni wenyewe kuyatumia. Na kisha wakati mimi malloc chini hapa, mimi malloc kwamba kila mtu binafsi ya kuyatumia those wanapaswa kumweka kuzuia tofauti ya ka 4 juu ya lundo. Hivyo hii pointi ka 4. Na hii pointi moja kwa ka mbalimbali 4. Na wote wanaongelea ka yao wenyewe 4. Hii inanipa njia ya kufanya mambo multidimensional. Mimi naweza kusema pp [3] [4], lakini sasa hii si kitu sawa kama arrays multidimensional kwa sababu arrays multidimensional ni kutafsiriwa [3] [4] ndani ya moja katika kukabiliana na safu x. Hii p dereferences, grossistledet index ya tatu, kisha dereferences kwamba na grossistledet - 4 itakuwa batili - index pili. Ambapo wakati tulikuwa int x [3] [4] kabla kama safu multidimensional na wakati wewe mara mbili bracket ni kweli tu dereference moja, wewe ni kufuatia pointer moja na kisha kukabiliana, hii ni kweli 2D rejea. Wewe kufuata 2 kuyatumia tofauti. Hivyo hii pia kitaalam inaruhusu kuwa na arrays multidimensional ambapo kila mtu binafsi ni safu ukubwa tofauti. Hivyo nadhani jagged arrays multidimensional ni nini ni wito tangu kweli jambo la kwanza inaweza kumweka kwa kitu ambayo ina vipengele 10, Jambo la pili inaweza kumweka kwa kitu ambayo ina vipengele 100. [Mwanafunzi] Je, kuna kikomo na idadi ya kuyatumia unaweza kuwa akizungumzia kuyatumia nyingine? >> No Unaweza kuwa na int ***** p. Rudi arithmetic pointer - >> [mwanafunzi] Oh. >> Yeah. [Mwanafunzi] Kama mimi na int *** p na kisha mimi kufanya dereferencing na mimi kusema p * ni sawa na thamani hii, ni hayo tu kwenda kufanya 1 ngazi ya dereferencing? >> Ndiyo. Hivyo kama nataka kupata kitu kwamba pointer mwisho akionyesha - Kisha wewe kufanya *** p. >> Sawa. Hivyo hii ni p pointi 1 block, pointi ya kuzuia mwingine, pointi ya kuzuia mwingine. Kisha kama wewe kufanya * p = kitu kingine, basi wewe ni kubadilisha huu kwa sasa kumweka kuzuia tofauti. >> Sawa. [Bowden] Na kama hawa walikuwa malloced, basi una sasa kuvuja kumbukumbu isipokuwa wewe kutokea kwa kuwa na references tofauti ya hizi tangu huwezi kupata nyuma wale walio kuwa wewe tu akatupa mbali. Pointer hesabu. int x [4]; ni kwenda kutenga safu ya integers 4 ambapo x inaenda kwa mwanzo wa safu. Hivyo wakati mimi kusema kitu kama x [1]; nataka kumaanisha kwenda integer pili katika safu, ambayo itakuwa ni hii moja. Lakini kwa kweli, hilo ni 4 ka katika safu hii tangu integer inachukua hadi ka 4. Hivyo kukabiliana ya 1 kweli maana yake kukabiliana ya 1 ukubwa wa mara kila aina ya safu ni. Hii ni safu ya integers, hivyo anajua kufanya 1 ukubwa wa mara int wakati anataka kukabiliana. syntax nyingine. Kumbuka kuwa hii ni sawa na * (x + 1); Wakati mimi kusema pointer + 1, nini kwamba anarudi ni anuani ya kwamba pointer ni hifadhi ya plus 1 ukubwa wa mara ya aina ya pointer. Hivyo kama x = ox100, basi x + 1 = ox104. Na unaweza vibaya hii na kusema kitu kama Char * c = (Char *) x; na sasa c ni kwenda kuwa anuani hiyo kama x. c ni kwenda kuwa sawa na ox100, lakini c + 1 ni kwenda kuwa sawa na ox101 tangu pointer arithmetic hutegemea aina ya pointer kwamba wewe ni kuongeza. Hivyo c + 1, inaangalia c, ni pointer Char, hivyo ni kwenda kuongeza 1 ukubwa wa mara Char, ambayo ni daima itakuwa 1, ili kupata 101, lakini kama mimi kufanya x, ambayo pia bado 100, x + 1 ni kwenda kuwa 104. [Mwanafunzi] Je, unaweza kutumia c + + ili kuendeleza pointer yako na 1? Ndiyo, unaweza. Huwezi kufanya hivyo kwa sababu x x ni ishara tu, ni mara kwa mara; huwezi kubadilisha x. Lakini c hutokea tu kuwa pointer, hivyo c + + ni kikamilifu halali na itakuwa na increment 1. Kama c walikuwa tu * int, basi c + + itakuwa 104. + + Gani pointer hesabu tu kama c + 1 ingekuwa kufanyika pointer hesabu. Hii ni kweli jinsi mambo mengi kama aina kuunganisha - Badala ya kujenga nakala za mambo, unaweza badala kupita - Kama kama mimi alitaka kupita hii nusu ya safu - basi s kufuta baadhi ya hii. Hebu sema mimi alitaka kupita upande huu wa safu ndani ya kazi. Gani mimi kupita kwa kazi hiyo? Kama mimi kupita x, mimi kupita anwani hii. Lakini nataka kupita anwani hii hasa. Basi nini lazima mimi kupita? [Mwanafunzi] Pointer + 2? [Bowden] Basi x + 2. Ndiyo. Hiyo itakuwa anwani hii. Utapata pia mara nyingi sana kuona kama x [2] na kisha anuani ya kwamba. Hivyo haja ya kuchukua anuani yake kwa sababu ni bracket dereference thabiti. x [2] unahusu thamani ya kwamba ni katika sanduku hili, na kisha unataka anuani ya sanduku kwamba, hivyo unaweza kusema & x [2]. Basi hiyo ni jinsi ya kitu katika aina kuunganisha ambapo unataka kupita orodha nusu kwa kitu wewe kweli tu kupita & x [2], na sasa kama mbali kama wito kujirudia ni wasiwasi, safu yangu mpya kuanza huko. Dakika ya mwisho maswali. [Mwanafunzi] Kama hatuwezi kuweka au ampersand - nini kwamba uitwao? >> Nyota? [Mwanafunzi] Star. >> Kitaalam, dereference operator, lakini - >> [mwanafunzi] Dereference. Kama hatuwezi kuweka nyota au ampersand, kile kinachotokea kama mimi tu kusema y = x x na ni pointer? Je, ni aina ya y? >> [Mwanafunzi] mimi itabidi tu kusema ni pointer 2. Hivyo kama wewe tu kusema y = x, sasa x na y uhakika na kitu kimoja. >> [Mwanafunzi] Point kwa kitu kimoja. Na kama x ni pointer int? >> Ingekuwa kulalamika kwa sababu huwezi hawawajui kuyatumia. [Mwanafunzi] Sawa. Kumbuka kuyatumia kwamba, hata ingawa sisi kuteka yao kama mishale, kweli yote ya hazina wao - int * x - kweli x wote ni hifadhi ni kitu kama ox100, ambayo sisi kutokea kwa kuwakilisha kama akizungumzia kuzuia kuhifadhiwa katika 100. Hivyo wakati mimi kusema int * y = x; Mimi tu kuiga ox100 ndani ya y, ambayo sisi ni kwenda tu kuwakilisha kama y, pia akizungumzia ox100. Na kama nasema int i = (int) x; kisha i ni kwenda kuhifadhi chochote thamani ya ox100 ni ndani yake, lakini sasa ni kwenda kufasiriwa kama integer badala ya pointer. Lakini unahitaji kutupwa au pengine itakuwa kulalamika. [Mwanafunzi] Basi nini maana kuwafukuza - Je, ni kwenda kuwa akitoa int ya x au akitoa int ya y? [Bowden] Nini? [Mwanafunzi] Sawa. Baada ya mabano haya ni kuna kwenda kuwa x au ay huko? [Bowden] Ama. x na y ni sawa. >> [Mwanafunzi] Sawa. Kwa sababu uko wote kuyatumia. >> Yeah. [Mwanafunzi] Hivyo itakuwa kuhifadhi 100 hexadesimoli katika fomu integer? >> [Bowden] Yeah. Lakini si thamani ya chochote ni pointi. [Bowden] Yeah. >> [Mwanafunzi] Basi tu anuani katika fomu integer. Sawa. [Bowden] Kama alitaka kwa sababu baadhi ya ajabu, unaweza peke kukabiliana na kuyatumia na kamwe kukabiliana na integers na tu kuwa kama int * x = 0. Kisha utaenda kupata kweli kuchanganyikiwa mara moja pointer arithmetic kuanza kinachotokea. Hivyo idadi ya kwamba wao ni kuhifadhi maana. Ni jinsi tu wewe kuishia kutafsiri yao. Hivyo mimi nina bure nakala ox100 kutoka * int kwa int, na mimi nina bure hawawajui - you're pengine kwenda kupata yelled saa kwa si akitoa - Mimi nina bure hawawajui kitu kama (int *) ox1234 katika * huu holela int. Hivyo ox123 ni tu kama halali anuani kumbukumbu kama ni & y. & Y kinachotokea kurudi kitu ambacho ni kiasi pretty ox123. [Mwanafunzi] Laiti kuwa njia ya kweli ya baridi kwenda kutoka hexadesimoli kwa ajili ya decimal, kama kama una pointer na wewe kuwatupia kama int? [Bowden] Unaweza kweli tu magazeti kutumia kama printf. Hebu sema nina int y = 100. Hivyo printf (% d \ n - kama unapaswa tayari kujua - magazeti kwamba kama integer,% x. Tutaweza tu magazeti ni kama hexadesimoli. Hivyo pointer si kuhifadhiwa kama hexadesimoli, na integer si kuhifadhiwa kama decimal. Kila kitu ni kuhifadhiwa kama binary. Ni tu kwamba sisi huwa na kuonyesha kuyatumia kama hexadesimoli kwa sababu tunafikiri ya mambo haya katika vitalu 4-Byte, na kumbukumbu anwani huwa na kuwa familiar. Sisi ni kama, ikiwa ni kuanza na bf, basi hutokea kwa kuwa juu ya stack. Hivyo ni tu tafsiri yetu ya kuyatumia kama hexadesimoli. Sawa. Maswali yoyote ya mwisho? Nitakuwa hapa kwa kidogo baada ya kama una kitu kingine chochote. Na kwamba mwisho wa. [Mwanafunzi] Yay! [Applause] [CS50.TV]