1 00:00:00,000 --> 00:00:02,520 [Powered by Google Translate] [Sehemu ya 4 - Zaidi Starehe] 2 00:00:02,520 --> 00:00:04,850 [Rob Bowden - Chuo Kikuu cha Harvard] 3 00:00:04,850 --> 00:00:07,370 [Hii ni CS50. - CS50.TV] 4 00:00:08,920 --> 00:00:13,350 Tuna kesho quiz, katika kesi guys hawakujua kwamba. 5 00:00:14,810 --> 00:00:20,970 Ni kimsingi juu ya kila kitu unaweza tumeona katika darasa au lazima tumeona katika darasa. 6 00:00:20,970 --> 00:00:26,360 Hiyo ni pamoja na kuyatumia, ingawa wao ni mada sana hivi karibuni. 7 00:00:26,360 --> 00:00:29,860 Wewe lazima angalau kuelewa viwango vya juu yao. 8 00:00:29,860 --> 00:00:34,760 Chochote kwamba ameondoka juu katika darasa unapaswa kuelewa kwa chemsha bongo. 9 00:00:34,760 --> 00:00:37,320 Hivyo kama una maswali juu yao, unaweza kuwauliza sasa. 10 00:00:37,320 --> 00:00:43,280 Lakini hii ni kwenda kuwa kikao sana mwanafunzi inayoongozwa ambapo wewe guys kuuliza maswali, 11 00:00:43,280 --> 00:00:45,060 hivyo hopefully watu wana maswali. 12 00:00:45,060 --> 00:00:48,020 Je, mtu yeyote kuwa na maswali? 13 00:00:49,770 --> 00:00:52,090 Ndiyo. >> [Mwanafunzi] Je, unaweza kwenda zaidi ya kuyatumia tena? 14 00:00:52,090 --> 00:00:54,350 Nitakwenda zaidi ya kuyatumia. 15 00:00:54,350 --> 00:00:59,180 Yote ya vigezo yako lazima kuishi katika kumbukumbu, 16 00:00:59,180 --> 00:01:04,450 lakini kwa kawaida wewe usijali kuhusu kwamba na wewe tu kusema x 2 + na + y 3 17 00:01:04,450 --> 00:01:07,080 na compiler itakuwa takwimu nje ambapo mambo wanaishi kwa ajili yenu. 18 00:01:07,080 --> 00:01:12,990 Mara wewe ni kushughulika na kuyatumia, sasa wewe ni wazi kwa kutumia anwani wale kumbukumbu. 19 00:01:12,990 --> 00:01:19,800 Hivyo variable moja itakuwa milele tu kuishi katika anuani moja wakati wowote. 20 00:01:19,800 --> 00:01:24,040 Kama tunataka kutangaza pointer, ni nini aina kwenda kuangalia kama? 21 00:01:24,040 --> 00:01:26,210 >> Nataka kutangaza p pointer. Nini aina kuangalia kama? 22 00:01:26,210 --> 00:01:33,530 [Mwanafunzi] int * p. >> Yeah. Hivyo int * p. 23 00:01:33,530 --> 00:01:38,030 Na jinsi gani mimi kufanya hivyo kumweka kwa x? >> [Mwanafunzi] Ampersand. 24 00:01:40,540 --> 00:01:45,300 [Bowden] Basi ampersand ni halisi iitwayo anuani ya operator. 25 00:01:45,300 --> 00:01:50,460 Hivyo wakati mimi kusema & x ni kupata anuani ya kumbukumbu ya x kutofautiana. 26 00:01:50,460 --> 00:01:56,790 Hivyo sasa nina p pointer, na mahali popote katika code yangu naweza kutumia * p 27 00:01:56,790 --> 00:02:02,960 au mimi naweza kutumia x na itakuwa exact kitu. 28 00:02:02,960 --> 00:02:09,520 (* P). Nini hii kufanya? Nini nyota kwamba mean? 29 00:02:09,520 --> 00:02:13,120 [Mwanafunzi] Ina maana thamani katika hatua hiyo. >> Yeah. 30 00:02:13,120 --> 00:02:17,590 Hivyo kama sisi kuangalia yake, inaweza kuwa muhimu sana ili kuweza kuteka michoro 31 00:02:17,590 --> 00:02:22,230 ambapo hii ni sanduku kidogo ya kumbukumbu kwa ajili ya x, ambayo hufanyika kuwa thamani 4, 32 00:02:22,230 --> 00:02:25,980 basi tuna sanduku kidogo ya kumbukumbu kwa ajili ya p, 33 00:02:25,980 --> 00:02:31,590 na hivyo p pointi x, hivyo sisi kuteka mshale kutoka p kwa x. 34 00:02:31,590 --> 00:02:40,270 Hivyo wakati sisi kusema * p sisi ni kusema kwenda sanduku kwamba ni p. 35 00:02:40,270 --> 00:02:46,480 Nyota ni kufuata mshale na kisha kufanya chochote unataka na sanduku ya kwamba haki pale. 36 00:02:46,480 --> 00:03:01,090 Hivyo naweza kusema * p = 7, na kwamba watakwenda sanduku kwamba ni x na mabadiliko ambayo kwa 7. 37 00:03:01,090 --> 00:03:13,540 Au mimi naweza kusema int z = * p * 2; Hiyo utata kwa sababu ni nyota, nyota. 38 00:03:13,540 --> 00:03:19,230 nyota moja ni dereferencing p, nyota nyingine ni kuzidisha kwa 2. 39 00:03:19,230 --> 00:03:26,780 Taarifa mimi inaweza kuwa tu kama vile kubadilishwa p * kwa x. 40 00:03:26,780 --> 00:03:29,430 Unaweza kutumia yao katika njia ya sawa. 41 00:03:29,430 --> 00:03:38,000 Na kisha baadaye naweza kuwa na uhakika na kitu p mpya kabisa. 42 00:03:38,000 --> 00:03:42,190 Naweza kusema tu p = &z; 43 00:03:42,190 --> 00:03:44,940 Hivyo sasa P pointi tena kwa x; inaelekeza katika z. 44 00:03:44,940 --> 00:03:50,510 Na wakati wowote mimi kufanya * p ni sawa kama kufanya z. 45 00:03:50,510 --> 00:03:56,170 Hivyo kitu muhimu kuhusu hii ni mara moja sisi kuanza kuingia katika utendaji. 46 00:03:56,170 --> 00:03:59,790 >> Ni aina ya useless kutangaza pointer kwamba pointi kwa kitu 47 00:03:59,790 --> 00:04:03,140 na kisha wewe tu dereferencing ni 48 00:04:03,140 --> 00:04:06,060 wakati unaweza kuwa na kutumika variable awali kwa kuanzia. 49 00:04:06,060 --> 00:04:18,190 Lakini wakati wewe kupata katika utendaji - hivyo hebu sema tuna baadhi ya kazi, int foo, 50 00:04:18,190 --> 00:04:32,810 kwamba inachukua pointer na tu anafanya * p = 6; 51 00:04:32,810 --> 00:04:39,990 Kama tuliona kabla na byta, huwezi kufanya byta ufanisi na kazi tofauti 52 00:04:39,990 --> 00:04:45,180 na tu kupita integers kwa sababu kila kitu katika C daima akipita thamani. 53 00:04:45,180 --> 00:04:48,360 Hata wakati wewe ni kupita kuyatumia wewe akipita thamani. 54 00:04:48,360 --> 00:04:51,940 Ni tu hivyo hutokea kwamba wale maadili ni kumbukumbu anwani. 55 00:04:51,940 --> 00:05:00,770 Hivyo wakati mimi kusema foo (p); mimi nina kupita pointer ndani ya foo kazi 56 00:05:00,770 --> 00:05:03,910 na kisha foo ni kufanya * p = 6; 57 00:05:03,910 --> 00:05:08,600 Hivyo ndani ya kazi kwamba, * p bado ni sawa na x, 58 00:05:08,600 --> 00:05:12,720 lakini siwezi kutumia x ndani ya kazi ambayo kwa sababu si scoped ndani ya kazi hiyo. 59 00:05:12,720 --> 00:05:19,510 Hivyo * p = 6 ni njia pekee ya mimi kupata variable mitaa kutoka kazi nyingine. 60 00:05:19,510 --> 00:05:23,600 Au, vizuri, kuyatumia ni njia pekee ya mimi kupata variable mitaa kutoka kazi nyingine. 61 00:05:23,600 --> 00:05:31,600 [Mwanafunzi] Hebu sema wewe alitaka kurudi pointer. Jinsi gani hasa gani unaweza kufanya hivyo? 62 00:05:31,600 --> 00:05:44,270 [Bowden] Kurudi pointer kama katika kitu kama int y = 3; kurudi & y? >> [Mwanafunzi] Yeah. 63 00:05:44,270 --> 00:05:48,480 [Bowden] Sawa. Wewe kamwe kufanya hivyo. Hii ni mbaya. 64 00:05:48,480 --> 00:05:59,480 Nadhani nikaona katika slides hizi hotuba wewe ulianza kuona mchoro nzima ya kumbukumbu 65 00:05:59,480 --> 00:06:02,880 ambapo hadi hapa nimepata kumbukumbu anuani 0 66 00:06:02,880 --> 00:06:09,550 na chini hapa una kumbukumbu anuani gigs 4 au 2-32. 67 00:06:09,550 --> 00:06:15,120 Hivyo basi nimepata baadhi ya mambo na baadhi ya mambo na kisha una stack yako 68 00:06:15,120 --> 00:06:21,780 na nimepata lundo yako, ambayo wewe tu kuanza kujifunza kuhusu, kupanda juu. 69 00:06:21,780 --> 00:06:24,390 [Mwanafunzi] Je, si chungu juu ya stack? 70 00:06:24,390 --> 00:06:27,760 >> Yeah. lundo ni juu, si hivyo? >> [Mwanafunzi] Naam, yeye kuweka 0 juu. 71 00:06:27,760 --> 00:06:30,320 [Mwanafunzi] Oh, akaweka 0 juu. >> [Mwanafunzi] Oh, okay. 72 00:06:30,320 --> 00:06:36,060 Disclaimer: popote na CS50 utaenda kuona njia hii. >> [Mwanafunzi] Sawa. 73 00:06:36,060 --> 00:06:40,290 Ni kwamba tu wakati wewe kwanza kuona mwingi, 74 00:06:40,290 --> 00:06:45,000 kama wakati unafikiri ya stack unafikiri ya stacking mambo juu ya mtu mwingine. 75 00:06:45,000 --> 00:06:50,810 Hivyo sisi huwa na hii flip kuzunguka hivyo stack ni kupanda juu kama kawaida ingekuwa stack 76 00:06:50,810 --> 00:06:55,940 badala ya stack kunyongwa chini. >> [Mwanafunzi] Wala chungu kitaalam kukua pia, ingawa? 77 00:06:55,940 --> 00:07:01,100 Ni inategemea nini maana ya kukua. 78 00:07:01,100 --> 00:07:04,010 stack na lundo daima kukua katika maelekezo kinyume. 79 00:07:04,010 --> 00:07:09,420 stack daima ni kukua kwa maana ya kwamba ni kupanda juu 80 00:07:09,420 --> 00:07:12,940 kuelekea juu kumbukumbu anwani, na chungu ni kuongezeka chini 81 00:07:12,940 --> 00:07:17,260 kwa kuwa ni kuongezeka kwa anwani ya chini kumbukumbu. 82 00:07:17,260 --> 00:07:20,250 Hivyo ni juu 0 na chini ni high kumbukumbu anwani. 83 00:07:20,250 --> 00:07:26,390 Wao ni wote kukua, tu katika kupinga maelekezo. 84 00:07:26,390 --> 00:07:29,230 [Mwanafunzi] mimi tu maana kwamba kwa sababu wewe alisema kuweka stack juu ya chini 85 00:07:29,230 --> 00:07:33,640 sababu inaonekana Intuitive zaidi kwa sababu kwa stack kuanza saa ya juu ya chungu, 86 00:07:33,640 --> 00:07:37,520 lundo ni juu ya yenyewe pia, hivyo that's - >> Yeah. 87 00:07:37,520 --> 00:07:44,960 Wewe pia kufikiria chungu kama kupanda juu na kubwa, lakini stack zaidi ya hivyo. 88 00:07:44,960 --> 00:07:50,280 Hivyo stack ni moja kwamba sisi aina ya wanataka kuonyesha kukua. 89 00:07:50,280 --> 00:07:55,390 Lakini kila mahali ukiangalia vinginevyo ni kwenda kuonyesha anwani 0 saa ya juu 90 00:07:55,390 --> 00:07:59,590 na juu ya kumbukumbu anuani hapo chini, hivyo hii ni maoni yako ya kawaida ya kumbukumbu. 91 00:07:59,590 --> 00:08:02,100 >> Je, una swali? 92 00:08:02,100 --> 00:08:04,270 [Mwanafunzi] Unaweza kutuambia zaidi juu ya lundo? 93 00:08:04,270 --> 00:08:06,180 Yeah. Mimi itabidi kupata kwamba katika pili. 94 00:08:06,180 --> 00:08:12,220 Kwanza, kurejea kwa nini kurudi & y ni kitu mbaya, 95 00:08:12,220 --> 00:08:18,470 juu ya stack wewe kuwa na rundo la muafaka stack ambayo kuwakilisha yote ya kazi 96 00:08:18,470 --> 00:08:20,460 ambayo imekuwa kuitwa. 97 00:08:20,460 --> 00:08:27,990 Hivyo kupuuza mambo ya awali, juu ya stack wako daima ni kwenda kuwa kazi kuu 98 00:08:27,990 --> 00:08:33,090 tangu kwamba kazi hiyo ni ya kwanza kuitwa. 99 00:08:33,090 --> 00:08:37,130 Na kisha wakati wewe piga kazi nyingine, stack anaenda kukua chini. 100 00:08:37,130 --> 00:08:41,640 Hivyo kama mimi kuwaita baadhi ya kazi, foo, na anapata stack yake mwenyewe frame, 101 00:08:41,640 --> 00:08:47,280 inaweza kuwaita baadhi ya kazi, bar; anapata stack yake mwenyewe frame. 102 00:08:47,280 --> 00:08:49,840 Na bar inaweza kuwa ya kujirudia na inaweza kuita yenyewe, 103 00:08:49,840 --> 00:08:54,150 na hivyo kuwa wito pili kwa bar ni kwenda kupata stack yake mwenyewe frame. 104 00:08:54,150 --> 00:08:58,880 Na hivyo yale yanayoendelea katika muafaka haya yote ni stack ya vigezo mitaa 105 00:08:58,880 --> 00:09:03,450 na wote wa hoja kwamba kazi - 106 00:09:03,450 --> 00:09:08,730 Yoyote yaliyo ya ndani ya nchi scoped kwa kazi hii kwenda katika muafaka haya stack. 107 00:09:08,730 --> 00:09:21,520 Hivyo kwamba maana wakati mimi alisema kitu kama bar ni kazi, 108 00:09:21,520 --> 00:09:29,270 Mimi tu kwenda kutangaza integer na kisha kurudi pointer integer kwamba. 109 00:09:29,270 --> 00:09:33,790 Hivyo ambapo gani y kuishi? 110 00:09:33,790 --> 00:09:36,900 [Mwanafunzi] y anaishi katika bar. >> [Bowden] Yeah. 111 00:09:36,900 --> 00:09:45,010 Mahali fulani katika mraba huu kidogo ya kumbukumbu ni mraba littler kwamba ana y ndani yake. 112 00:09:45,010 --> 00:09:53,370 Wakati mimi kurudi & y, mimi nina kurudi pointer block hii kidogo ya kumbukumbu. 113 00:09:53,370 --> 00:09:58,400 Lakini basi atakaporudi kazi, stack yake frame anapata popped mbali stack. 114 00:10:01,050 --> 00:10:03,530 Na kwamba sababu ni kuitwa stack. 115 00:10:03,530 --> 00:10:06,570 Ni kama muundo data stack, kama unajua nini kuwa ni. 116 00:10:06,570 --> 00:10:11,580 Au hata kama stack ya trays ni daima mfano, 117 00:10:11,580 --> 00:10:16,060 kuu ni kwenda juu chini, kisha kazi kwanza wewe piga yataenda juu ya kwamba, 118 00:10:16,060 --> 00:10:20,400 na huwezi kupata nyuma kuu mpaka kurudi kutoka utendaji wote ambao wameitwa 119 00:10:20,400 --> 00:10:22,340 ambayo yamekuwa kuwekwa juu yake. 120 00:10:22,340 --> 00:10:28,650 >> [Mwanafunzi] Basi kama alivyofanya kufanya kurudi y &, thamani kwamba ni kubadilika bila ya taarifa. 121 00:10:28,650 --> 00:10:31,290 Ndiyo, it's - >> [mwanafunzi] Ni inaweza kuwa overwritten. >> Yeah. 122 00:10:31,290 --> 00:10:34,660 Ni kabisa - Kama wewe kujaribu na - 123 00:10:34,660 --> 00:10:38,040 Hii pia ingekuwa int * bar kwa sababu ni kurudi pointer, 124 00:10:38,040 --> 00:10:41,310 hivyo kurudi yake ni aina int *. 125 00:10:41,310 --> 00:10:46,500 Kama wewe kujaribu kutumia thamani ya kurudi kwa kazi hii, ni undefined tabia 126 00:10:46,500 --> 00:10:51,770 kwa sababu pointer kwamba anasema kwa kumbukumbu mbaya. >> [Mwanafunzi] Sawa. 127 00:10:51,770 --> 00:11:01,250 Basi nini kama, kwa mfano, alitangaza int * y = malloc (sizeof (int))? 128 00:11:01,250 --> 00:11:03,740 Hiyo ni bora zaidi. Ndiyo. 129 00:11:03,740 --> 00:11:07,730 [Mwanafunzi] Kuongelea jinsi wakati sisi Drag mambo bin yetu kusaga 130 00:11:07,730 --> 00:11:11,750 wao siyo kweli erased; sisi tu kupoteza kuyatumia yao. 131 00:11:11,750 --> 00:11:15,550 Hivyo katika kesi hii je sisi kweli kufuta thamani au ni bado kuna katika kumbukumbu? 132 00:11:15,550 --> 00:11:19,130 Kwa sehemu kubwa, ni ya kwenda bado kuwa huko. 133 00:11:19,130 --> 00:11:24,220 Lakini hebu sema sisi kutokea kwa kuwaita baadhi ya kazi nyingine, bazi. 134 00:11:24,220 --> 00:11:28,990 Baz ni kwenda kupata stack yake mwenyewe frame ya juu hapa. 135 00:11:28,990 --> 00:11:31,470 Ni kwenda kuwa overwriting yote ya mambo haya, 136 00:11:31,470 --> 00:11:34,180 na kisha kama baadaye kujaribu na kutumia pointer kwamba got kabla, 137 00:11:34,180 --> 00:11:35,570 si kwenda kuwa thamani sawa. 138 00:11:35,570 --> 00:11:38,150 Ni kwenda yamebadilika kwa sababu tu wewe kuitwa bazi kazi. 139 00:11:38,150 --> 00:11:43,080 [Mwanafunzi] Lakini sisi si alikuwa, ingekuwa sisi bado kupata 3? 140 00:11:43,080 --> 00:11:44,990 [Bowden] Katika uwezekano wote, ninyi wenyewe. 141 00:11:44,990 --> 00:11:49,670 Lakini huwezi kutegemea kwamba. C tu anasema tabia zisizoeleweka. 142 00:11:49,670 --> 00:11:51,920 >> [Mwanafunzi] Oh, ni gani. Sawa. 143 00:11:51,920 --> 00:11:58,190 Hivyo wakati unataka kurudi pointer, hii ni wapi malloc huja katika matumizi. 144 00:12:00,930 --> 00:12:15,960 Mimi nina maandishi kweli tu kurudi malloc (3 * sizeof (int)). 145 00:12:17,360 --> 00:12:24,050 Tutaweza kwenda juu zaidi katika malloc pili, lakini wazo la malloc ni wote wa vigezo yako ya mtaa 146 00:12:24,050 --> 00:12:26,760 daima kwenda juu ya stack. 147 00:12:26,760 --> 00:12:31,570 Chochote ambacho malloced unaendelea chungu, na itakuwa ni milele na daima kuwa katika kifusi 148 00:12:31,570 --> 00:12:34,490 mpaka waziwazi huru yake. 149 00:12:34,490 --> 00:12:42,130 Hivyo hii ina maana kwamba wakati wewe malloc kitu, ni kwenda kuishi baada ya kurudi kazi. 150 00:12:42,130 --> 00:12:46,800 [Mwanafunzi] Je, ni kuishi baada ya mpango ataacha mbio? >> No 151 00:12:46,800 --> 00:12:53,180 Okay, kwa hivyo ni kwenda kuwa huko mpaka mpango ni njia yote kufanyika mbio. >> Ndiyo. 152 00:12:53,180 --> 00:12:57,510 Tunaweza kwenda zaidi ya maelezo ya kile kinachotokea wakati mpango ataacha mbio. 153 00:12:57,510 --> 00:13:02,150 Unaweza haja ya kuwakumbusha yangu, lakini kwamba ni jambo tofauti kabisa. 154 00:13:02,150 --> 00:13:04,190 [Mwanafunzi] Basi malloc inajenga pointer? >> Yeah. 155 00:13:04,190 --> 00:13:13,030 Malloc - >> [mwanafunzi] Nadhani malloc designates block ya kumbukumbu kwamba pointer wanaweza kutumia. 156 00:13:15,400 --> 00:13:19,610 [Bowden] Mimi nataka kuwa mchoro tena. >> [Mwanafunzi] Basi kazi hii kazi, ingawa? 157 00:13:19,610 --> 00:13:26,430 [Mwanafunzi] Yeah, malloc designates block ya kumbukumbu kwamba unaweza kutumia, 158 00:13:26,430 --> 00:13:30,470 na kisha kuirudisha anuani ya kuzuia kwanza ya kumbukumbu hiyo. 159 00:13:30,470 --> 00:13:36,750 >> [Bowden] Yeah. Hivyo wakati wewe malloc, wewe ni grabbing baadhi block ya kumbukumbu 160 00:13:36,750 --> 00:13:38,260 kwamba sasa katika lundo. 161 00:13:38,260 --> 00:13:43,040 Kama chungu ni ndogo mno, kuwarundika ni kwenda tu kukua, na hukua katika mwelekeo huu. 162 00:13:43,040 --> 00:13:44,650 Basi hebu kusema chungu ni ndogo mno. 163 00:13:44,650 --> 00:13:49,960 Basi ni habari kukua kidogo kidogo na kurudi pointer hii block kwamba tu ilikua. 164 00:13:49,960 --> 00:13:55,130 Wakati mambo bure, wewe ni kufanya zaidi ya chumba katika chungu, 165 00:13:55,130 --> 00:14:00,030 hivyo basi baadaye wito kwa malloc wanaweza kutumia tena kwamba kumbukumbu kwamba hapo awali alikuwa huru. 166 00:14:00,030 --> 00:14:09,950 jambo muhimu kuhusu malloc na bure ni kwamba inakupa udhibiti kamili 167 00:14:09,950 --> 00:14:12,700 juu ya maisha ya vitalu hizi kumbukumbu. 168 00:14:12,700 --> 00:14:15,420 Vigezo Global ni daima hai. 169 00:14:15,420 --> 00:14:18,500 Vigezo Mitaa ni hai ndani ya wigo wao. 170 00:14:18,500 --> 00:14:22,140 Haraka kama wewe kwenda nyuma Brace curly, vigezo mitaa ni maiti. 171 00:14:22,140 --> 00:14:28,890 Kumbukumbu Malloced ni hai wakati unataka kuwa hai 172 00:14:28,890 --> 00:14:33,480 na kisha ni iliyotolewa wakati kuwaambia ni kutolewa. 173 00:14:33,480 --> 00:14:38,420 Wale ni kweli tu aina 3 ya kumbukumbu, kwa kweli. 174 00:14:38,420 --> 00:14:41,840 Kuna moja kwa moja ya kumbukumbu ya usimamizi, ambayo ni stack. 175 00:14:41,840 --> 00:14:43,840 Mambo kutokea kwa wewe moja kwa moja. 176 00:14:43,840 --> 00:14:46,910 Wakati kusema x int, kumbukumbu ni zilizotengwa kwa ajili ya x int. 177 00:14:46,910 --> 00:14:51,630 Wakati x huenda nje ya wigo, kumbukumbu ni reclaimed kwa x. 178 00:14:51,630 --> 00:14:54,790 Kisha kuna nguvu kumbukumbu usimamizi, ambayo ni nini malloc ni, 179 00:14:54,790 --> 00:14:56,740 ambayo ni wakati wewe kuwa na udhibiti. 180 00:14:56,740 --> 00:15:01,290 Wewe dynamically kuamua wakati kumbukumbu lazima na haipaswi zilizotengwa. 181 00:15:01,290 --> 00:15:05,050 Na kisha kuna tuli, ambayo tu ina maana kwamba anaishi milele, 182 00:15:05,050 --> 00:15:06,610 ambayo ni nini vigezo kimataifa ni. 183 00:15:06,610 --> 00:15:10,240 Wao ni tu daima katika kumbukumbu. 184 00:15:10,960 --> 00:15:12,760 >> Maswali? 185 00:15:14,490 --> 00:15:17,230 [Mwanafunzi] Je, unaweza kufafanua block tu kwa kutumia braces curly 186 00:15:17,230 --> 00:15:21,220 lakini si kuwa na kuwa kama maelezo au taarifa wakati au kitu kama hicho? 187 00:15:21,220 --> 00:15:29,130 Unaweza kufafanua block kama katika kazi, lakini ambayo ina braces curly pia. 188 00:15:29,130 --> 00:15:32,100 [Mwanafunzi] Hivyo unaweza si tu kama jozi random ya braces curly katika code yako 189 00:15:32,100 --> 00:15:35,680 kwamba kuwa na vigezo mitaa? >> Ndiyo, unaweza. 190 00:15:35,680 --> 00:15:45,900 Ndani ya bar int sisi inaweza kuwa na {int y = 3;}. 191 00:15:45,900 --> 00:15:48,440 Hiyo walidhani kuwa hapa hapa. 192 00:15:48,440 --> 00:15:52,450 Lakini hiyo kabisa amefafanua wigo wa int y. 193 00:15:52,450 --> 00:15:57,320 Baada brace kwamba pili curly, y haiwezi kutumika tena. 194 00:15:57,910 --> 00:16:00,630 Wewe karibu kamwe kufanya hivyo, ingawa. 195 00:16:02,940 --> 00:16:07,370 Kupata nyuma na kile kinachotokea wakati mpango mwisho, 196 00:16:07,370 --> 00:16:18,760 kuna aina ya uongo mbaya / nusu kwamba sisi kuwapa ili tu kufanya mambo rahisi. 197 00:16:18,760 --> 00:16:24,410 Sisi kukuambia kwamba wakati wewe kutenga kumbukumbu 198 00:16:24,410 --> 00:16:29,860 wewe ni kugawa baadhi chunk ya RAM kwa variable kwamba. 199 00:16:29,860 --> 00:16:34,190 Lakini wewe si kweli moja kwa moja kugusa RAM milele katika programu yako. 200 00:16:34,190 --> 00:16:37,490 Kama wewe kufikiria hivyo, jinsi mimi akauchomoa - 201 00:16:37,490 --> 00:16:44,330 Na kweli, kama wewe kwenda kupitia katika GDB utaona kitu kimoja. 202 00:16:51,120 --> 00:16:57,590 Bila kujali mara ngapi wewe kuendesha programu yako au nini mpango wewe ni mbio, 203 00:16:57,590 --> 00:16:59,950 stack daima ni kwenda kuanza - 204 00:16:59,950 --> 00:17:06,510 wewe daima kwenda kuona vigezo karibu anuani kitu oxbffff. 205 00:17:06,510 --> 00:17:09,470 Ni kawaida mahali fulani katika kanda hiyo. 206 00:17:09,470 --> 00:17:18,760 Lakini jinsi gani wanaweza 2 mipango uwezekano wa kuwa na kuyatumia kwa kumbukumbu sawa? 207 00:17:20,640 --> 00:17:27,650 [Mwanafunzi] Kuna baadhi ya wajibu holela wa oxbfff ambapo zinatakiwa kuwa juu ya RAM 208 00:17:27,650 --> 00:17:31,320 kwamba kweli anaweza kuwa katika maeneo tofauti kutegemea wakati kazi iliitwa. 209 00:17:31,320 --> 00:17:35,920 Yeah. mrefu ni virtual kumbukumbu. 210 00:17:35,920 --> 00:17:42,250 Wazo ni kwamba, kila mchakato wa moja, kila mpango moja kwamba ni mbio kwenye kompyuta yako 211 00:17:42,250 --> 00:17:49,450 ina wenyewe wake - hebu kudhani bits 32 - kujitegemea kabisa anuani nafasi. 212 00:17:49,450 --> 00:17:51,590 Hii ni nafasi anuani. 213 00:17:51,590 --> 00:17:56,220 Ina kujitegemea kabisa yake mwenyewe gigabytes 4 kutumia. 214 00:17:56,220 --> 00:18:02,220 >> Hivyo kama wewe kukimbia mipango 2 wakati huo huo, mpango huu anaona gigabytes 4 kwa yenyewe, 215 00:18:02,220 --> 00:18:04,870 mpango huu anaona gigabytes 4 kwa yenyewe, 216 00:18:04,870 --> 00:18:07,720 na ni vigumu kwa mpango huu kwa dereference pointer 217 00:18:07,720 --> 00:18:10,920 na kuishia na kumbukumbu kutoka mpango huu. 218 00:18:10,920 --> 00:18:18,200 Na nini kumbukumbu virtual ni ni ramani kutoka nafasi michakato anuani 219 00:18:18,200 --> 00:18:20,470 mambo halisi juu ya RAM. 220 00:18:20,470 --> 00:18:22,940 Hivyo ni juu ya mfumo wa uendeshaji wako na kujua kwamba, 221 00:18:22,940 --> 00:18:28,080 hey, wakati huu pointer dereferences guy oxbfff, kwamba kweli ina maana 222 00:18:28,080 --> 00:18:31,040 kwamba anataka RAM Byte 1000, 223 00:18:31,040 --> 00:18:38,150 lakini kama mpango huu dereferences oxbfff, yeye kweli anataka RAM Byte 10,000. 224 00:18:38,150 --> 00:18:41,590 Wanaweza kuwa kiholela mbali mbali. 225 00:18:41,590 --> 00:18:48,730 Hii ni hata ya kweli ya mambo ndani ya nafasi michakato anuani moja. 226 00:18:48,730 --> 00:18:54,770 Hivyo kama anaona gigabytes wote 4 kwa yenyewe, lakini tuseme - 227 00:18:54,770 --> 00:18:57,290 [Mwanafunzi] Kwani kila mchakato wa moja - 228 00:18:57,290 --> 00:19:01,350 Hebu sema wewe kuwa na kompyuta na gigabytes 4 tu ya RAM. 229 00:19:01,350 --> 00:19:06,430 Je, kila mchakato wa moja kuona nzima gigabytes 4? >> Ndiyo. 230 00:19:06,430 --> 00:19:13,060 Lakini gigabytes 4 anaona ni uongo. 231 00:19:13,060 --> 00:19:20,460 Ni tu ni anadhani ana kumbukumbu hii yote kwa sababu hajui mchakato wowote mwingine lipo. 232 00:19:20,460 --> 00:19:28,140 Itakuwa tu kutumia kiasi kama kumbukumbu kama kweli anahitaji. 233 00:19:28,140 --> 00:19:32,340 mfumo wa uendeshaji ni si kwenda kutoa RAM kwa mchakato huu 234 00:19:32,340 --> 00:19:35,750 kama si kutumia yoyote kumbukumbu katika mkoa huu mzima. 235 00:19:35,750 --> 00:19:39,300 Si kwenda kutoa ni kumbukumbu kwa ajili ya kanda hiyo. 236 00:19:39,300 --> 00:19:54,780 Lakini wazo ni kwamba - mimi nina ninafikiria - siwezi kufikiri ya mlinganisho. 237 00:19:54,780 --> 00:19:56,780 Analojia ni ngumu. 238 00:19:57,740 --> 00:20:02,700 Moja ya masuala ya kumbukumbu virtual au moja ya mambo ni kutatua 239 00:20:02,700 --> 00:20:06,810 ni kwamba michakato ya lazima kabisa hawajui mtu mwingine. 240 00:20:06,810 --> 00:20:12,140 Na hivyo unaweza kuandika mpango wowote kwamba tu dereferences yoyote pointer, 241 00:20:12,140 --> 00:20:19,340 kama tu kuandika mpango kwamba anasema * (ox1234), 242 00:20:19,340 --> 00:20:22,890 na kwamba ni dereferencing kumbukumbu anuani 1234. 243 00:20:22,890 --> 00:20:28,870 >> Lakini ni juu ya mfumo wa uendeshaji na kisha kutafsiri nini maana ya 1234. 244 00:20:28,870 --> 00:20:33,960 Hivyo kama 1234 hutokea kwa kuwa halali kumbukumbu anuani kwa utaratibu huu, 245 00:20:33,960 --> 00:20:38,800 kama ni juu ya stack au kitu, basi hii atarudi thamani ya anuani kwamba kumbukumbu 246 00:20:38,800 --> 00:20:41,960 mbali kama mchakato anajua. 247 00:20:41,960 --> 00:20:47,520 Lakini kama 1234 ni si anuani halali, kama hutokea kwa ardhi 248 00:20:47,520 --> 00:20:52,910 katika baadhi ya kipande kidogo ya kumbukumbu hapa ambacho ni zaidi ya stack na zaidi ya chungu 249 00:20:52,910 --> 00:20:57,200 na wewe si kweli kwamba kutumika, kisha hiyo wakati wewe kupata mambo kama segfaults 250 00:20:57,200 --> 00:21:00,260 kwa sababu wewe ni kugusa kumbukumbu kwamba unapaswa kuwa kugusa. 251 00:21:07,180 --> 00:21:09,340 Hii pia ni kweli - 252 00:21:09,340 --> 00:21:15,440 Mfumo ya 32-bit, 32 bits ina maana una bits 32 kufafanua anuani kumbukumbu. 253 00:21:15,440 --> 00:21:22,970 Ni kwa nini ni kuyatumia 8 ka sababu 32 bits ni 8 ka - au ka 4. 254 00:21:22,970 --> 00:21:25,250 Kuyatumia ni 4 ka. 255 00:21:25,250 --> 00:21:33,680 Hivyo wakati wewe kuona kama pointer oxbfffff, kwamba ni - 256 00:21:33,680 --> 00:21:40,080 Ndani ya mpango wowote unaweza tu kujenga yoyote pointer holela, 257 00:21:40,080 --> 00:21:46,330 popote kutoka ox0 kwa ng'ombe 8 f's - ffffffff. 258 00:21:46,330 --> 00:21:49,180 [Mwanafunzi] Je wewe kusema wao ni 4 ka? >> Yeah. 259 00:21:49,180 --> 00:21:52,730 [Mwanafunzi] Kisha Byte kila itakuwa na - >> [Bowden] hexadesimoli. 260 00:21:52,730 --> 00:21:59,360 Hexadesimoli - 5, 6, 7, 8. Hivyo kuyatumia utaenda daima kuona katika hexadesimoli. 261 00:21:59,360 --> 00:22:01,710 Ni tu jinsi sisi classify kuyatumia. 262 00:22:01,710 --> 00:22:05,240 Kila digits 2 ya hexadesimoli ni 1 Byte. 263 00:22:05,240 --> 00:22:09,600 Hivyo kuna kwenda kuwa 8 hexadesimoli digits kwa ka 4. 264 00:22:09,600 --> 00:22:14,190 Hivyo kila pointer moja juu ya mfumo wa 32-bit ni kwenda kuwa 4 ka, 265 00:22:14,190 --> 00:22:18,550 ambayo ina maana kwamba katika mchakato wako unaweza kujenga yoyote holela ka 4 266 00:22:18,550 --> 00:22:20,550 na kufanya pointer nje ya hayo, 267 00:22:20,550 --> 00:22:32,730 ambayo ina maana kwamba mbali kama ni kufahamu, inaweza kushughulikia 2 mzima ka 32 ya kumbukumbu. 268 00:22:32,730 --> 00:22:34,760 Hata ingawa ni kweli haina kupata kwamba, 269 00:22:34,760 --> 00:22:40,190 hata kama kompyuta yako tu ina megabaiti 512, ni anadhani ana kwamba kumbukumbu sana. 270 00:22:40,190 --> 00:22:44,930 Na mfumo wa uendeshaji ni smart kutosha kwamba itakuwa tu kutenga kile haja kweli. 271 00:22:44,930 --> 00:22:49,630 Haina tu kwenda, oh, mchakato mpya: 4 gigs. 272 00:22:49,630 --> 00:22:51,930 >> Yeah. >> [Mwanafunzi] gani ng'ombe maana? Mbona kuandika? 273 00:22:51,930 --> 00:22:54,980 Ni tu ishara kwa hexadesimoli. 274 00:22:54,980 --> 00:22:59,590 Baada ya kuona idadi ya kuanza kwa ng'ombe, mambo mfululizo ni hexadesimoli. 275 00:23:01,930 --> 00:23:05,760 [Mwanafunzi] Wewe walikuwa akielezea juu ya kile kinachotokea wakati mpango mwisho. >> Ndiyo. 276 00:23:05,760 --> 00:23:09,480 Nini kinatokea wakati mpango mwisho ni mfumo wa uendeshaji 277 00:23:09,480 --> 00:23:13,600 tu erases upangaji kwamba ina kwa anwani hizi, na hiyo ni yake. 278 00:23:13,600 --> 00:23:17,770 mfumo wa uendeshaji sasa wanaweza kutoa tu kwamba kumbukumbu kwa mpango mwingine kutumia. 279 00:23:17,770 --> 00:23:19,490 [Mwanafunzi] Sawa. 280 00:23:19,490 --> 00:23:24,800 Hivyo wakati wewe kutenga kitu juu ya lundo au vigezo stack au kimataifa au kitu chochote, 281 00:23:24,800 --> 00:23:27,010 wao wote tu kutoweka kwa haraka kama mpango mwisho 282 00:23:27,010 --> 00:23:32,120 kwa sababu ya mfumo wa uendeshaji ni sasa huru kutoa kwamba kumbukumbu kwa mchakato nyingine yoyote. 283 00:23:32,120 --> 00:23:35,150 [Mwanafunzi] Hata ingawa kuna bado pengine maadili yaliyoandikwa katika? >> Yeah. 284 00:23:35,150 --> 00:23:37,740 maadili ni uwezekano bado kuna. 285 00:23:37,740 --> 00:23:41,570 Ni tu ni kwenda kuwa vigumu kupata kwao. 286 00:23:41,570 --> 00:23:45,230 Ni vigumu zaidi kupata saa yao zaidi ni kupata saa faili ilifutwa 287 00:23:45,230 --> 00:23:51,450 kwa sababu ilifutwa faili aina ya aketiye huko kwa muda mrefu na ngumu kuendesha ni mengi zaidi. 288 00:23:51,450 --> 00:23:54,120 Hivyo ni kwenda overwrite sehemu mbalimbali za kumbukumbu 289 00:23:54,120 --> 00:23:58,640 kabla hayajatokea ili overwrite chunk ya kumbukumbu kwamba faili kwamba kutumika kuwa katika. 290 00:23:58,640 --> 00:24:04,520 Lakini kuu kumbukumbu, RAM, wewe mzunguko kwa njia ya kura kwa kasi, 291 00:24:04,520 --> 00:24:08,040 hivyo ni kwenda haraka sana kuwa overwritten. 292 00:24:10,300 --> 00:24:13,340 Maswali juu ya hili au kitu kingine? 293 00:24:13,340 --> 00:24:16,130 [Mwanafunzi] nina maswali kuhusu mada tofauti tofauti. >> Sawa. 294 00:24:16,130 --> 00:24:19,060 Je, mtu yeyote kuwa na maswali juu ya hili? 295 00:24:20,170 --> 00:24:23,120 >> Sawa. Mbalimbali ya mada. >> [Mwanafunzi] Sawa. 296 00:24:23,120 --> 00:24:26,550 Mimi alikuwa anapita katika baadhi ya vipimo vya mazoezi, 297 00:24:26,550 --> 00:24:30,480 na katika mmoja wao ni kuzungumza kuhusu sizeof 298 00:24:30,480 --> 00:24:35,630 na thamani ya kwamba kuirudisha au aina tofauti kutofautiana. >> Ndiyo. 299 00:24:35,630 --> 00:24:45,060 Na alisema kwamba wote int na ya muda mrefu kurudi 4, hivyo ni wote ka 4 mrefu. 300 00:24:45,060 --> 00:24:48,070 Je, kuna tofauti yoyote kati ya int na muda mrefu, au ni kitu kimoja? 301 00:24:48,070 --> 00:24:50,380 Ndiyo, kuna tofauti. 302 00:24:50,380 --> 00:24:52,960 C kiwango - 303 00:24:52,960 --> 00:24:54,950 Mimi pengine anaenda fujo up. 304 00:24:54,950 --> 00:24:58,800 Kiwango C ni kama yale C ni, nyaraka rasmi ya C. 305 00:24:58,800 --> 00:25:00,340 Hii ni nini anasema. 306 00:25:00,340 --> 00:25:08,650 Hivyo kiwango C tu anasema kwamba Char itakuwa milele na daima kuwa 1 Byte. 307 00:25:10,470 --> 00:25:19,040 Kila kitu baada ya kuwa - mfupi ni daima tu hufafanuliwa kama ulikuwa mkubwa kuliko au sawa na char. 308 00:25:19,040 --> 00:25:23,010 Hii inaweza kuwa madhubuti zaidi kuliko, lakini si chanya. 309 00:25:23,010 --> 00:25:31,940 int ni tu hufafanuliwa kama ulikuwa mkubwa kuliko au sawa na mfupi. 310 00:25:31,940 --> 00:25:36,210 Na muda mrefu ni tu hufafanuliwa kama ulikuwa mkubwa kuliko au sawa na int. 311 00:25:36,210 --> 00:25:41,600 Na muda mrefu, ni mkubwa kuliko au sawa na muda mrefu. 312 00:25:41,600 --> 00:25:46,610 Hivyo kitu pekee kiwango C amefafanua ni kuagiza jamaa wa kila kitu. 313 00:25:46,610 --> 00:25:54,880 kiasi halisi ya kumbukumbu kwamba mambo kuchukua ni ujumla hadi utekelezaji, 314 00:25:54,880 --> 00:25:57,640 lakini ni pretty defined vizuri katika hatua hii. >> [Mwanafunzi] Sawa. 315 00:25:57,640 --> 00:26:02,490 Hivyo kaptula ni karibu daima itakuwa 2 ka. 316 00:26:04,920 --> 00:26:09,950 Ints ni karibu daima itakuwa 4 ka. 317 00:26:12,070 --> 00:26:15,340 Hutamani muda mrefu ni karibu daima itakuwa 8 bytes. 318 00:26:17,990 --> 00:26:23,160 Na anatamani, inategemea kama unatumia 32-bit au mfumo 64-bit. 319 00:26:23,160 --> 00:26:27,450 Hiyo kwa muda mrefu ni kwenda yanahusiana na aina ya mfumo. 320 00:26:27,450 --> 00:26:31,920 Kama wewe ni kutumia mfumo wa 32-bit kama Appliance, itakavyo kuwa 4 ka. 321 00:26:34,530 --> 00:26:42,570 Kama unatumia 64-bit kama mengi ya kompyuta hivi karibuni, ni kwenda kuwa 8 bytes. 322 00:26:42,570 --> 00:26:45,230 >> Ints ni karibu daima ka 4 katika hatua hii. 323 00:26:45,230 --> 00:26:47,140 Hutamani muda mrefu ni karibu daima 8 bytes. 324 00:26:47,140 --> 00:26:50,300 Huko nyuma, ints kutumika tu 2 ka. 325 00:26:50,300 --> 00:26:56,840 Lakini taarifa kwamba hii kabisa satisfies yote ya mahusiano haya ya mkuu kuliko na kuwa sawa na. 326 00:26:56,840 --> 00:27:01,280 Hiyo kwa muda mrefu kikamilifu kuruhusiwa kuwa ukubwa sawa kama integer, 327 00:27:01,280 --> 00:27:04,030 na ni pia kuruhusiwa kuwa ukubwa sawa kama muda mrefu. 328 00:27:04,030 --> 00:27:11,070 Na tu hivyo hutokea kuwa kwamba katika 99.999% ya mifumo, ni kwenda kuwa sawa na 329 00:27:11,070 --> 00:27:15,800 aidha int au muda mrefu. Ni inategemea tu kidogo 32-au 64-bit. >> [Mwanafunzi] Sawa. 330 00:27:15,800 --> 00:27:24,600 Katika ikifungwa, ni jinsi gani ya uhakika decimal mteule katika suala la bits? 331 00:27:24,600 --> 00:27:27,160 Kama kama binary? >> Yeah. 332 00:27:27,160 --> 00:27:30,570 Huna haja ya kujua kwamba kwa CS50. 333 00:27:30,570 --> 00:27:32,960 Huna hata kujifunza kuwa katika 61. 334 00:27:32,960 --> 00:27:37,350 Huwezi kujifunza kwamba kweli katika shaka yoyote. 335 00:27:37,350 --> 00:27:42,740 Ni tu uwakilishi. 336 00:27:42,740 --> 00:27:45,440 Mimi kusahau allotments kidogo halisi. 337 00:27:45,440 --> 00:27:53,380 wazo la uhakika floating ni kwamba kutenga idadi maalum ya bits kuwakilisha - 338 00:27:53,380 --> 00:27:56,550 Kimsingi, kila kitu ni kwa nukuu ya kisayansi. 339 00:27:56,550 --> 00:28:05,600 Hivyo kutenga idadi maalum ya bits kuwakilisha idadi yenyewe, kama 1.2345. 340 00:28:05,600 --> 00:28:10,200 Siwezi kamwe kuwakilisha idadi na tarakimu zaidi ya 5. 341 00:28:12,200 --> 00:28:26,300 Kisha wewe pia kutenga idadi maalum ya bits ili huelekea kuwa kama 342 00:28:26,300 --> 00:28:32,810 unaweza tu kwenda idadi fulani, kama kwamba exponent kubwa unaweza kuwa, 343 00:28:32,810 --> 00:28:36,190 na unaweza tu kwenda chini kwa exponent fulani, 344 00:28:36,190 --> 00:28:38,770 kama hiyo ni ndogo exponent unaweza kuwa. 345 00:28:38,770 --> 00:28:44,410 >> Sikumbuki bits njia halisi ni kwa ajili ya wote wa maadili haya, 346 00:28:44,410 --> 00:28:47,940 lakini idadi fulani ya bits ni wakfu kwa 1.2345, 347 00:28:47,940 --> 00:28:50,930 idadi mwingine baadhi ya bits ni wakfu kwa exponent, 348 00:28:50,930 --> 00:28:55,670 na ni inawezekana tu kuwakilisha exponent ya ukubwa fulani. 349 00:28:55,670 --> 00:29:01,100 [Mwanafunzi] Na mara mbili? Ni kwamba kama kuelea ziada kwa muda mrefu? >> Yeah. 350 00:29:01,100 --> 00:29:07,940 Ni kitu kimoja kama kuelea ila sasa unatumia ka 8 badala ya ka 4. 351 00:29:07,940 --> 00:29:11,960 Sasa wewe utakuwa na uwezo wa kutumia tarakimu 9 au tarakimu ya 10, 352 00:29:11,960 --> 00:29:16,630 na hii itakuwa na uwezo wa kwenda hadi 300 badala ya 100. >> [Mwanafunzi] Sawa. 353 00:29:16,630 --> 00:29:21,550 Na ikifungwa ni pia 4 ka. >> Ndiyo. 354 00:29:21,550 --> 00:29:27,520 Naam, tena, labda inategemea kwa ujumla juu ya utekelezaji wa jumla, 355 00:29:27,520 --> 00:29:30,610 lakini ikifungwa ni 4 ka, DOUBLES ni 8. 356 00:29:30,610 --> 00:29:33,440 DOUBLES huitwa mara mbili kwa sababu ni mara mbili ya ukubwa wa inaelea. 357 00:29:33,440 --> 00:29:38,380 [Mwanafunzi] Sawa. Na ni pale mara mbili mara mbili? >> Kuna si. 358 00:29:38,380 --> 00:29:43,660 Nadhani - >> [mwanafunzi] Kama hutamani muda mrefu? >> Yeah. Sidhani hivyo. Ndiyo. 359 00:29:43,660 --> 00:29:45,950 [Mwanafunzi] cha mtihani mwaka jana kulikuwa na swali kuhusu kazi kuu 360 00:29:45,950 --> 00:29:49,490 kuwa na kuwa sehemu ya programu yako. 361 00:29:49,490 --> 00:29:52,310 Jibu ni kwamba hana na kuwa sehemu ya programu yako. 362 00:29:52,310 --> 00:29:55,100 Katika hali gani? Hiyo ni nini nikaona. 363 00:29:55,100 --> 00:29:59,090 [Bowden] Inaonekana - >> [mwanafunzi] Nini hali? 364 00:29:59,090 --> 00:30:02,880 Je, una tatizo? >> [Mwanafunzi] Yeah, mimi unaweza dhahiri kuvuta it up. 365 00:30:02,880 --> 00:30:07,910 Haina kuwa, kitaalam, lakini kimsingi ni kwenda kuwa. 366 00:30:07,910 --> 00:30:10,030 [Mwanafunzi] nikaona moja juu ya tofauti wa mwaka. 367 00:30:10,030 --> 00:30:16,220 Ilikuwa kama kweli au uongo: halali - >> Oh, c faili.? 368 00:30:16,220 --> 00:30:18,790 . [Mwanafunzi] yoyote c faili lazima kuwa - [wote akizungumza kwa mara moja - unintelligible] 369 00:30:18,790 --> 00:30:21,120 Sawa. Basi hiyo ni tofauti. 370 00:30:21,120 --> 00:30:26,800 >> C. Faili tu mahitaji vyenye kuharibika. 371 00:30:26,800 --> 00:30:32,400 Unaweza kukusanya faili katika code mashine, binary, chochote, 372 00:30:32,400 --> 00:30:36,620 bila kuwa executable bado. 373 00:30:36,620 --> 00:30:39,420 executable halali lazima kuwa na kazi kuu. 374 00:30:39,420 --> 00:30:45,460 Unaweza kuandika kazi 100 katika faili 1 lakini hakuna kuu 375 00:30:45,460 --> 00:30:48,800 na kisha kukusanya kwamba chini binary, 376 00:30:48,800 --> 00:30:54,460 kisha kuandika faili nyingine kwamba tu ana kuu lakini ni wito rundo la kazi hizi 377 00:30:54,460 --> 00:30:56,720 katika faili hii binary zaidi ya hapa. 378 00:30:56,720 --> 00:31:01,240 Na hivyo wakati wewe ni kufanya executable, kwamba ni nini linker gani 379 00:31:01,240 --> 00:31:05,960 ni inaunganisha hizi files binary 2 ndani ya kutekelezwa. 380 00:31:05,960 --> 00:31:11,400 Hivyo c. Faili haina haja ya kuwa na kazi kuu wakati wote. 381 00:31:11,400 --> 00:31:19,220 Na juu ya besi kubwa code utaona maelfu ya. Files c na 1 kuu faili. 382 00:31:23,960 --> 00:31:26,110 Zaidi maswali? 383 00:31:29,310 --> 00:31:31,940 [Mwanafunzi] Kulikuwa na swali lingine. 384 00:31:31,940 --> 00:31:36,710 Ni alisema kufanya ni compiler. Kweli au uongo? 385 00:31:36,710 --> 00:31:42,030 Na jibu ilikuwa ni uongo, na mimi kueleweka kwa nini siyo kama Clang. 386 00:31:42,030 --> 00:31:44,770 Lakini je, sisi kuwaita kufanya kama si? 387 00:31:44,770 --> 00:31:49,990 Matokeo ni ya kimsingi tu - naweza kuona hasa nini wito yake. 388 00:31:49,990 --> 00:31:52,410 Lakini ni anaendesha tu amri. 389 00:31:53,650 --> 00:31:55,650 Kufanya. 390 00:31:58,240 --> 00:32:00,870 Naweza kuvuta hii up. Yeah. 391 00:32:10,110 --> 00:32:13,180 Oh, yeah. Matokeo pia anafanya hivyo. 392 00:32:13,180 --> 00:32:17,170 Hii inasema madhumuni ya shirika kufanya ni kuamua moja kwa moja 393 00:32:17,170 --> 00:32:19,610 ambayo vipande vya mpango kubwa yanahitaji recompiled 394 00:32:19,610 --> 00:32:22,350 na kutoa amri kwa recompile yao. 395 00:32:22,350 --> 00:32:27,690 Unaweza kufanya kufanya files kwamba ni kabisa kubwa. 396 00:32:27,690 --> 00:32:33,210 Matokeo inaangalia mihuri wakati wa files na, kama sisi alisema kabla, 397 00:32:33,210 --> 00:32:36,930 unaweza kukusanya files binafsi chini, na si mpaka kupata kwa linker 398 00:32:36,930 --> 00:32:39,270 kwamba wao ni kuweka pamoja ndani ya kutekelezwa. 399 00:32:39,270 --> 00:32:43,810 Hivyo kama una 10 files tofauti na kufanya mabadiliko kwa 1 wao, 400 00:32:43,810 --> 00:32:47,870 basi nini kufanya ni kwenda kufanya ni tu kwamba recompile 1 faili 401 00:32:47,870 --> 00:32:50,640 na kisha relink kila kitu pamoja. 402 00:32:50,640 --> 00:32:53,020 Lakini ni kiasi dumber kuliko hiyo. 403 00:32:53,020 --> 00:32:55,690 Ni juu ya wewe kabisa kufafanua kwamba hiyo ndiyo wanapaswa kufanya. 404 00:32:55,690 --> 00:32:59,560 Ni kwa default ina uwezo wa kutambua hili muhuri wakati stuff, 405 00:32:59,560 --> 00:33:03,220 lakini unaweza kuandika faili kufanya kufanya kitu chochote. 406 00:33:03,220 --> 00:33:09,150 Unaweza kuandika kufanya faili ili pale unapoandika kufanya hivyo tu cd ya saraka nyingine. 407 00:33:09,150 --> 00:33:15,560 Mimi nilikuwa frustrated kupata kwa sababu mimi tack kila kitu ndani ya Appliance yangu 408 00:33:15,560 --> 00:33:21,740 na kisha mimi mtazamo PDF kutoka Mac. 409 00:33:21,740 --> 00:33:30,720 >> Kwa hiyo mimi kwenda Finder na siwezi kufanya Nenda, Connect na Server, 410 00:33:30,720 --> 00:33:36,950 na server mimi kuungana na ni Appliance yangu, kisha mimi kufungua PDF 411 00:33:36,950 --> 00:33:40,190 kwamba anapata ulioandaliwa na mpira. 412 00:33:40,190 --> 00:33:49,320 Lakini mimi kupata frustrated kwa sababu kila wakati mimi zinahitajika kwa ajili ya kujikumbusha PDF, 413 00:33:49,320 --> 00:33:53,900 Mimi nilikuwa na nakala yake kwa directory maalum kwamba inaweza kupata 414 00:33:53,900 --> 00:33:57,710 na ilikuwa kupata annoying. 415 00:33:57,710 --> 00:34:02,650 Hivyo badala niliandika faili kufanya, ambayo una kufafanua jinsi inafanya mambo. 416 00:34:02,650 --> 00:34:06,130 Jinsi ya kufanya katika hili ni PDF mpira. 417 00:34:06,130 --> 00:34:10,090 Tu kama faili yoyote nyingine kufanya - au mimi nadhani wewe hawajaona files kufanya, 418 00:34:10,090 --> 00:34:13,510 lakini sisi katika appliance kimataifa kufanya faili kwamba tu anasema, 419 00:34:13,510 --> 00:34:16,679 kama wewe ni kuandaa faili C, kutumia Clang. 420 00:34:16,679 --> 00:34:20,960 Na hivyo hapa katika kufanya file yangu kwamba mimi kufanya nasema, 421 00:34:20,960 --> 00:34:25,020 faili hii utaenda wanataka kukusanya na PDF mpira. 422 00:34:25,020 --> 00:34:27,889 Na hivyo ni PDF mpira kwamba anafanya kuandaa. 423 00:34:27,889 --> 00:34:31,880 Kufanya si kuandaa. Ni kukimbia tu amri hizi katika mlolongo mimi maalum. 424 00:34:31,880 --> 00:34:36,110 Hivyo ni anaendesha PDF mpira, ni nakala yake na directory mimi nataka kunakiliwa kwa, 425 00:34:36,110 --> 00:34:38,270 ni cd ya saraka na anafanya mambo mengine, 426 00:34:38,270 --> 00:34:42,380 lakini wote ni gani ni kutambua wakati mabadiliko ya SVG, 427 00:34:42,380 --> 00:34:45,489 na kama ni mabadiliko, basi itakuwa kukimbia amri kwamba ni walidhani kukimbia 428 00:34:45,489 --> 00:34:48,760 wakati mabadiliko faili. >> [Mwanafunzi] Sawa. 429 00:34:50,510 --> 00:34:54,420 Sijui ambapo kimataifa kufanya files ni kwa ajili yangu na kuangalia ni nje. 430 00:34:57,210 --> 00:35:04,290 Maswali mengine? Kitu chochote kutoka zamani Quizzes? Mambo pointer yoyote? 431 00:35:06,200 --> 00:35:08,730 Kuna mambo ya hila na kuyatumia kama - 432 00:35:08,730 --> 00:35:10,220 Mimi si kwenda kuwa na uwezo wa kupata swali Jaribio juu yake - 433 00:35:10,220 --> 00:35:16,250 lakini tu kama jambo la aina hii. 434 00:35:19,680 --> 00:35:24,060 Hakikisha kuelewa kwamba wakati mimi kusema int * x * y - 435 00:35:24,890 --> 00:35:28,130 Hii si hasa chochote hapa, mimi nadhani. 436 00:35:28,130 --> 00:35:32,140 Lakini kama * x * y, wale ni 2 vigezo kwamba ni juu ya stack. 437 00:35:32,140 --> 00:35:37,220 Wakati mimi kusema x = malloc (sizeof (int)), x bado ni kutofautiana juu ya stack, 438 00:35:37,220 --> 00:35:41,180 malloc ni baadhi block juu katika chungu, na sisi ni kuwa x uhakika na lundo. 439 00:35:41,180 --> 00:35:43,900 >> Hivyo kitu juu ya pointi stack chungu. 440 00:35:43,900 --> 00:35:48,100 Kila wewe malloc kitu chochote, wewe ni inevitably hifadhi hiyo ndani ya pointer. 441 00:35:48,100 --> 00:35:55,940 Hivyo pointer kwamba ni juu ya stack, block malloced ni juu ya lundo. 442 00:35:55,940 --> 00:36:01,240 mengi ya watu kupata kuchanganyikiwa na kusema int * x = malloc; x ni juu ya lundo. 443 00:36:01,240 --> 00:36:04,100 No nini x anaonyesha ni juu ya lundo. 444 00:36:04,100 --> 00:36:08,540 x yenyewe ni juu ya stack, isipokuwa kwa sababu yoyote una x kuwa variable kimataifa, 445 00:36:08,540 --> 00:36:11,960 katika kesi ambayo hutokea kwa kuwa katika mkoa mwingine wa kumbukumbu. 446 00:36:13,450 --> 00:36:20,820 Hivyo kuweka wimbo, hizi michoro sanduku na mshale ni pretty kawaida kwa chemsha bongo. 447 00:36:20,820 --> 00:36:25,740 Au kama si juu ya jaribio 0, itakuwa juu ya chemsha bongo 1. 448 00:36:27,570 --> 00:36:31,940 Unapaswa kujua haya yote, kwa hatua katika kuandaa 449 00:36:31,940 --> 00:36:35,740 tangu alikuwa na kujibu maswali juu ya hayo. Ndiyo. 450 00:36:35,740 --> 00:36:38,940 [Mwanafunzi] Inawezekana sisi kwenda juu ya hatua hizo - >> Uhakika. 451 00:36:48,340 --> 00:36:58,640 Kabla ya hatua na kuandaa tuna preprocessing, 452 00:36:58,640 --> 00:37:16,750 kuandaa, kukusanyika, na kuunganisha. 453 00:37:16,750 --> 00:37:21,480 Preprocessing. Je, hiyo nini? 454 00:37:29,720 --> 00:37:32,290 Ni hatua rahisi katika - vizuri, si kama - 455 00:37:32,290 --> 00:37:35,770 kwamba haina maana ni lazima kuwa wazi, lakini ni hatua rahisi. 456 00:37:35,770 --> 00:37:38,410 You guys yangeweza kutekeleza ninyi wenyewe. Yeah. 457 00:37:38,410 --> 00:37:43,410 [Mwanafunzi] Chukua yale katika yako ni pamoja na kama hii na nakala na kisha pia amefafanua. 458 00:37:43,410 --> 00:37:49,250 Inaonekana kwa mambo kama # ni pamoja na # define, 459 00:37:49,250 --> 00:37:53,800 na ni haki nakala na pastes nini wale kweli maana. 460 00:37:53,800 --> 00:37:59,240 Hivyo wakati wewe kusema ni pamoja # cs50.h, preprocessor ni kuiga na pasting cs50.h 461 00:37:59,240 --> 00:38:01,030 ndani ya mstari huo. 462 00:38:01,030 --> 00:38:06,640 Wakati kusema # define x kuwa 4, preprocessor inakwenda kupitia mpango mzima 463 00:38:06,640 --> 00:38:10,400 na nafasi ya matukio yote ya x kwa 4. 464 00:38:10,400 --> 00:38:17,530 Hivyo preprocessor inachukua halali C faili na matokeo halali C faili 465 00:38:17,530 --> 00:38:20,300 ambapo mambo wamekuwa kunakiliwa na pasted. 466 00:38:20,300 --> 00:38:24,230 Hivyo ikiandaa. Je, hiyo nini? 467 00:38:25,940 --> 00:38:28,210 [Mwanafunzi] Ni inakwenda kutoka C kwa binary. 468 00:38:28,210 --> 00:38:30,970 >> [Bowden] Ni haina kwenda njia yote ya binary. 469 00:38:30,970 --> 00:38:34,220 [Mwanafunzi] Ili code mashine, basi? >> Ni si mashine code. 470 00:38:34,220 --> 00:38:35,700 [Mwanafunzi] Bunge? >> Bunge. 471 00:38:35,700 --> 00:38:38,890 Unaendelea na Bunge kabla huenda njia yote ya code C, 472 00:38:38,890 --> 00:38:45,010 na zaidi lugha kufanya kitu kama hiki. 473 00:38:47,740 --> 00:38:50,590 Pick lugha yoyote ya ngazi ya juu, na kama wewe ni kwenda kukusanya yake, 474 00:38:50,590 --> 00:38:52,390 ni uwezekano wa kukusanya katika hatua. 475 00:38:52,390 --> 00:38:58,140 Kwanza ni kwenda kukusanya Chatu na C, basi ni kwenda kukusanya C kwa Bunge, 476 00:38:58,140 --> 00:39:01,600 na kisha Bunge ni kwenda kupata Tafsiri ya binary. 477 00:39:01,600 --> 00:39:07,800 Hivyo kuandaa anaenda kuleta kutoka C kwa Bunge. 478 00:39:07,800 --> 00:39:12,130 neno kuandaa kawaida maana kuleta kutoka ngazi ya juu 479 00:39:12,130 --> 00:39:14,340 kwa ngazi ya chini lugha ya programu. 480 00:39:14,340 --> 00:39:19,190 Hivyo hii ni hatua tu katika mkusanyiko ambapo kuanza kwa lugha ya ngazi ya juu 481 00:39:19,190 --> 00:39:23,270 na kuishia katika lugha ngazi ya chini, na kwamba sababu ya hatua inaitwa kuandaa. 482 00:39:25,280 --> 00:39:33,370 [Mwanafunzi] Wakati wa kuandaa, hebu kusema kwamba umefanya kosa # pamoja cs50.h. 483 00:39:33,370 --> 00:39:42,190 Will compiler recompile cs50.h, kama kazi ya kwamba ni huko, 484 00:39:42,190 --> 00:39:45,280 na kutafsiri kwamba katika kanuni Bunge kama vile, 485 00:39:45,280 --> 00:39:50,830 au itakuwa nakala na kuweka kitu ambacho imekuwa ni kabla ya Bunge? 486 00:39:50,830 --> 00:39:56,910 cs50.h itakuwa pretty much kamwe kuishia katika Bunge. 487 00:39:59,740 --> 00:40:03,680 Mambo kama prototypes kazi na mambo tu kwa ajili ya wewe kuwa makini. 488 00:40:03,680 --> 00:40:09,270 Ni dhamana kwamba compiler unaweza kuangalia mambo kama wewe ni wito kazi 489 00:40:09,270 --> 00:40:12,910 pamoja na haki ya kurudi aina na hoja haki na mambo ya ajabu. 490 00:40:12,910 --> 00:40:18,350 >> Hivyo cs50.h itakuwa preprocessed ndani ya faili, na kisha wakati ni kuandaa 491 00:40:18,350 --> 00:40:22,310 ni kimsingi kutupwa mbali baada inafanya kuhakikisha kwamba kila kitu ni kuitwa kwa usahihi. 492 00:40:22,310 --> 00:40:29,410 Lakini kazi defined katika maktaba CS50, ambayo ni tofauti na cs50.h, 493 00:40:29,410 --> 00:40:33,610 wale si tofauti compiled. 494 00:40:33,610 --> 00:40:37,270 Hiyo kweli kuja chini katika hatua ya kuunganisha, hivyo tutaweza kupata kwamba katika pili. 495 00:40:37,270 --> 00:40:40,100 Lakini kwanza, ni nini kukusanyika? 496 00:40:41,850 --> 00:40:44,500 [Mwanafunzi] Bunge kwa binary? >> Yeah. 497 00:40:46,300 --> 00:40:48,190 Kukusanyika. 498 00:40:48,190 --> 00:40:54,710 Hatuna kuiita kuandaa kwa sababu Bunge ni kiasi pretty tafsiri safi ya binary. 499 00:40:54,710 --> 00:41:00,230 Kuna ni kidogo sana mantiki katika kwenda Bunge kwa binary. 500 00:41:00,230 --> 00:41:03,180 Ni kama tu kuangalia juu katika meza, oh, tuna maelekezo haya; 501 00:41:03,180 --> 00:41:06,290 kwamba sambamba na binary 01,110. 502 00:41:10,200 --> 00:41:15,230 Na hivyo files kwamba kukusanyika kwa ujumla matokeo ni files o.. 503 00:41:15,230 --> 00:41:19,020 Na. O files ni nini sisi walikuwa wakisema kabla, 504 00:41:19,020 --> 00:41:21,570 jinsi faili haina haja ya kuwa na kazi kuu. 505 00:41:21,570 --> 00:41:27,640 Faili yoyote inaweza compiled chini faili o. Muda mrefu kama ni halali C faili. 506 00:41:27,640 --> 00:41:30,300 Ni inaweza compiled chini. O. 507 00:41:30,300 --> 00:41:43,030 Sasa, kuunganisha ni nini hasa huleta rundo la o files. Na huleta yao kwa kutekelezwa. 508 00:41:43,030 --> 00:41:51,110 Na hivyo kile kuunganisha gani ni unaweza kufikiri ya maktaba CS50 kama faili o.. 509 00:41:51,110 --> 00:41:56,980 Tayari ni compiled binary file. 510 00:41:56,980 --> 00:42:03,530 Na hivyo wakati wewe kukusanya faili yako, hello.c yako, ambayo inatoa wito GetString, 511 00:42:03,530 --> 00:42:06,360 hello.c anapata compiled chini hello.o, 512 00:42:06,360 --> 00:42:08,910 hello.o ni sasa katika binary. 513 00:42:08,910 --> 00:42:12,830 Ni anatumia GetString, hivyo mahitaji ya kwenda juu kwa cs50.o, 514 00:42:12,830 --> 00:42:16,390 na linker smooshes yao pamoja na nakala GetString ndani ya faili hili 515 00:42:16,390 --> 00:42:20,640 na hutoka nje na executable kwamba ana kazi yote ni mahitaji. 516 00:42:20,640 --> 00:42:32,620 Hivyo cs50.o si kweli faili O, lakini ni karibu kutosha kwamba hakuna tofauti ya kimsingi. 517 00:42:32,620 --> 00:42:36,880 Hivyo kuunganisha tu huleta rundo la files pamoja 518 00:42:36,880 --> 00:42:41,390 kwamba tofauti vyenye wote wa kazi mimi haja ya kutumia 519 00:42:41,390 --> 00:42:46,120 na inajenga executable kwamba mapenzi kweli kukimbia. 520 00:42:48,420 --> 00:42:50,780 >> Na hivyo pia kwamba kile sisi walikuwa wakisema kabla ya 521 00:42:50,780 --> 00:42:55,970 ambapo unaweza 1000 files c., wewe kukusanya wote wale o files., 522 00:42:55,970 --> 00:43:00,040 ambayo pengine kuchukua muda, kisha wewe kubadili 1 c faili.. 523 00:43:00,040 --> 00:43:05,480 Unahitaji tu recompile kwamba 1. C faili na kisha relink kila kitu kingine, 524 00:43:05,480 --> 00:43:07,690 kuhusisha kila kitu nyuma pamoja. 525 00:43:09,580 --> 00:43:11,430 [Mwanafunzi] Wakati sisi ni kuunganisha sisi kuandika lcs50? 526 00:43:11,430 --> 00:43:20,510 Yeah, hivyo-lcs50. Ishara kwamba bendera kwa linker kwamba unapaswa kuunganisha katika maktaba hiyo. 527 00:43:26,680 --> 00:43:28,910 Maswali? 528 00:43:41,310 --> 00:43:46,860 Je, sisi wamekwenda juu ya binary nyingine ya sekunde kwamba 5 katika hotuba ya kwanza? 529 00:43:50,130 --> 00:43:53,010 Sidhani hivyo. 530 00:43:55,530 --> 00:43:58,820 Unapaswa kujua yote ya Os kubwa kwamba tumeenda juu, 531 00:43:58,820 --> 00:44:02,670 na unapaswa kuwa na uwezo wa, ikiwa tuliyowapeni kazi, 532 00:44:02,670 --> 00:44:09,410 unapaswa kuwa na uwezo wa kusema ni kubwa O, ukali. Au vizuri, big O ni mbaya. 533 00:44:09,410 --> 00:44:15,300 Hivyo kama unaweza kuona nested kwa matanzi looping juu ya idadi sawa ya mambo, 534 00:44:15,300 --> 00:44:22,260 kama int i, i > [mwanafunzi] n squared. >> Huelekea kuwa n squared. 535 00:44:22,260 --> 00:44:25,280 Kama una triple nested, huelekea kuwa n cubed. 536 00:44:25,280 --> 00:44:29,330 Hivyo kwamba aina ya kitu unapaswa kuwa na uwezo wa kumweka nje mara moja. 537 00:44:29,330 --> 00:44:33,890 Unahitaji kujua insertion aina na aina ya Bubble na kuunganisha aina na wale wote. 538 00:44:33,890 --> 00:44:41,420 Ni rahisi kuelewa kwa nini wao ni wale n squared na n logi n na yote ya kwamba 539 00:44:41,420 --> 00:44:47,810 sababu nadhani kulikuwa na juu ya chemsha bongo ya mwaka mmoja ambapo sisi kimsingi alitoa wewe 540 00:44:47,810 --> 00:44:55,050 utekelezaji wa aina Bubble na akasema, "Ni wakati wa mbio kazi hii?" 541 00:44:55,050 --> 00:45:01,020 Hivyo kama wewe kutambua kama aina Bubble, basi unaweza kusema mara moja n squared. 542 00:45:01,020 --> 00:45:05,470 Lakini kama wewe tu kuangalia ni, huna hata haja ya kutambua Bubble ni aina; 543 00:45:05,470 --> 00:45:08,990 unaweza tu kusema hii ni kufanya hii na hii. Hii ni n squared. 544 00:45:12,350 --> 00:45:14,710 [Mwanafunzi] Je, kuna mifano mgumu unaweza kuja na, 545 00:45:14,710 --> 00:45:20,370 kama wazo sawa ya kuhesabia nje? 546 00:45:20,370 --> 00:45:24,450 >> Sidhani tunataka kuwapa mifano yoyote mgumu. 547 00:45:24,450 --> 00:45:30,180 aina Bubble kitu ni kuhusu ngumu kama tunataka kwenda, 548 00:45:30,180 --> 00:45:36,280 na hata kuwa, kwa muda mrefu kama wewe kuelewa kwamba wewe ni juu ya safu iterating 549 00:45:36,280 --> 00:45:41,670 kwa kila kipengele katika safu, ambayo ni kwenda kuwa kitu ambacho n squared. 550 00:45:45,370 --> 00:45:49,940 Kuna jumla, maswali kama haki hapa tuna - Oh. 551 00:45:55,290 --> 00:45:58,530 Tu siku nyingine, Doug alidai, "nimeizua algorithm kwamba unaweza aina safu 552 00:45:58,530 --> 00:46:01,780 "Ya idadi n katika O (logi n) wakati!" 553 00:46:01,780 --> 00:46:04,900 Hivyo ni jinsi gani tunajua kwamba ni vigumu? 554 00:46:04,900 --> 00:46:08,850 [Inaudible mwanafunzi majibu] >> Yeah. 555 00:46:08,850 --> 00:46:13,710 Kwa uchache sana, una kugusa kila kipengele katika safu, 556 00:46:13,710 --> 00:46:16,210 hivyo ni vigumu kutatua safu ya - 557 00:46:16,210 --> 00:46:20,850 Kama kila kitu ni kwa utaratibu zisizochambuliwa, basi wewe ni kwenda kuwa kugusa kila kitu katika safu, 558 00:46:20,850 --> 00:46:25,320 hivyo ni vigumu kufanya hivyo katika chini ya O ya n. 559 00:46:27,430 --> 00:46:30,340 [Mwanafunzi] Wewe alituonyesha kuwa mfano wa kuwa na uwezo wa kufanya hivyo katika O ya n 560 00:46:30,340 --> 00:46:33,920 kama matumizi mengi ya kumbukumbu. >> Yeah. 561 00:46:33,920 --> 00:46:37,970 Na that's - mimi kusahau kile that's - Je, ni aina ya kuhesabu? 562 00:46:47,360 --> 00:46:51,330 Hmm. Hiyo ni integer kuchagua algorithm. 563 00:46:59,850 --> 00:47:05,100 Mimi nilikuwa kuangalia kwa jina maalum kwa ajili ya hili kwamba mimi hakuweza kukumbuka wiki iliyopita. 564 00:47:05,100 --> 00:47:13,000 Yeah. Hizi ni aina ya aina yake kuwa anaweza kukamilisha mambo katika kubwa O ya n. 565 00:47:13,000 --> 00:47:18,430 Lakini kuna mapungufu, kama unaweza tu kutumia integers hadi idadi fulani. 566 00:47:20,870 --> 00:47:24,560 Plus kama wewe ni kujaribu kutatua that's kitu - 567 00:47:24,560 --> 00:47:30,750 Kama safu yako ni 012, -12, 151, milioni 4, 568 00:47:30,750 --> 00:47:35,120 basi kwamba kipengele kimoja kwenda kabisa uharibifu wa kutenganisha nzima. 569 00:47:42,060 --> 00:47:44,030 >> Maswali? 570 00:47:49,480 --> 00:47:58,870 [Mwanafunzi] Kama una kazi ya kujirudia na hivyo hufanya tu wito kujirudia 571 00:47:58,870 --> 00:48:02,230 ndani ya taarifa ya kurudi, hiyo ni mkia kujirudia, 572 00:48:02,230 --> 00:48:07,360 na hivyo ingekuwa kwamba si kutumia zaidi ya kumbukumbu wakati wa Runtime 573 00:48:07,360 --> 00:48:12,550 au ingekuwa angalau kutumia kumbukumbu kulinganishwa kama iterative suluhisho? 574 00:48:12,550 --> 00:48:14,530 [Bowden] Ndiyo. 575 00:48:14,530 --> 00:48:19,840 Itakuwa uwezekano kuwa fulani polepole, lakini si kweli. 576 00:48:19,840 --> 00:48:23,290 Mkia kujirudia ni nzuri sana. 577 00:48:23,290 --> 00:48:32,640 Kuangalia tena katika muafaka stack, hebu sema tuna kuu 578 00:48:32,640 --> 00:48:42,920 na tuna bar int (int x) au kitu. 579 00:48:42,920 --> 00:48:52,310 Hii si kamilifu kujirudia kazi, lakini kurudi bar (x - 1). 580 00:48:52,310 --> 00:48:57,620 Hivyo ni wazi, hii ni dosari. Unahitaji kesi ya msingi na mambo ya ajabu. 581 00:48:57,620 --> 00:49:00,360 Lakini wazo hapa ni kwamba hii ni mkia kujirudia, 582 00:49:00,360 --> 00:49:06,020 ambayo ina maana wakati wito kuu bar ni kwenda kupata stack yake frame. 583 00:49:09,550 --> 00:49:12,440 Katika sura hii kuna stack kwenda kuwa block kidogo ya kumbukumbu 584 00:49:12,440 --> 00:49:17,490 kwamba sambamba na hoja x wake. 585 00:49:17,490 --> 00:49:25,840 Na hivyo hebu sema kuu kinachotokea kuwaita bar (100); 586 00:49:25,840 --> 00:49:30,050 Hivyo x ni kwenda kuanza nje kama 100. 587 00:49:30,050 --> 00:49:35,660 Kama compiler inatambua kuwa hii ni mkia kujirudia kazi, 588 00:49:35,660 --> 00:49:38,540 basi wakati bar hufanya wito wake kujirudia kwa bar, 589 00:49:38,540 --> 00:49:45,490 badala ya kufanya mpya stack frame, ambayo ni ambapo stack kuanza kukua kwa kiasi kikubwa, 590 00:49:45,490 --> 00:49:48,220 hatimaye itakuwa kukimbia katika kifusi na kisha kupata segfaults 591 00:49:48,220 --> 00:49:51,590 kwa sababu kumbukumbu kuanza colliding. 592 00:49:51,590 --> 00:49:54,830 >> Hivyo badala ya kufanya stack yake mwenyewe frame, inaweza kutambua, 593 00:49:54,830 --> 00:49:59,080 hey, mimi kwa kweli kamwe haja ya kurudi tena katika sura hii stack, 594 00:49:59,080 --> 00:50:08,040 hivyo badala mimi itabidi kuchukua nafasi ya hoja hii kwa 99 na kisha kuanza bar kote. 595 00:50:08,040 --> 00:50:11,810 Na basi itakuwa kufanya hivyo tena na itafikia kurudi bar (x - 1), 596 00:50:11,810 --> 00:50:17,320 na badala ya kufanya mpya stack frame, itakuwa tu nafasi ya hoja yake ya sasa na 98 597 00:50:17,320 --> 00:50:20,740 na kisha kuruka nyuma mwanzo sana ya bar. 598 00:50:23,860 --> 00:50:30,430 Those shughuli, kuondoa kwamba thamani 1 juu ya stack na kuruka nyuma mwanzo, 599 00:50:30,430 --> 00:50:32,430 ni pretty ufanisi. 600 00:50:32,430 --> 00:50:41,500 Hivyo si tu kuwa hii ni sawa kumbukumbu ya matumizi kama kazi tofauti ambayo ni iterative 601 00:50:41,500 --> 00:50:45,390 kwa sababu wewe ni tu kwa kutumia 1 stack frame, lakini wewe si mateso downsides 602 00:50:45,390 --> 00:50:47,240 ya kuwa na kuwaita kazi. 603 00:50:47,240 --> 00:50:50,240 Wito kazi wanaweza kuwa fulani ghali kwa sababu ina nini kuanzisha hii yote 604 00:50:50,240 --> 00:50:52,470 na teardown na mambo haya yote. 605 00:50:52,470 --> 00:50:58,160 Hivyo hii recursion mkia ni nzuri. 606 00:50:58,160 --> 00:51:01,170 [Mwanafunzi] Kwa nini ni si kujenga hatua mpya? 607 00:51:01,170 --> 00:51:02,980 Kwa sababu anatambua haina haja. 608 00:51:02,980 --> 00:51:07,800 wito kwa bar ni tu kurudi wito kujirudia. 609 00:51:07,800 --> 00:51:12,220 Hivyo hana haja ya kufanya chochote kwa thamani ya kurudi. 610 00:51:12,220 --> 00:51:15,120 Ni tu kwenda mara moja kurudi. 611 00:51:15,120 --> 00:51:20,530 Hivyo tu kwenda kuchukua nafasi ya hoja yake mwenyewe na kuanza juu. 612 00:51:20,530 --> 00:51:25,780 Na pia, kama huna mkia kujirudia version, 613 00:51:25,780 --> 00:51:31,460 basi kupata hizi baa zote ambapo wakati bar hili hurejea 614 00:51:31,460 --> 00:51:36,010 ina kurudi thamani yake kwa hii moja, basi hiyo bar mara moja anarudi 615 00:51:36,010 --> 00:51:39,620 na kuirudisha thamani yake kwa moja hii, basi tu kwenda mara moja kurudi 616 00:51:39,620 --> 00:51:41,350 na kurudi thamani yake kwa moja hii. 617 00:51:41,350 --> 00:51:45,350 Basi, wewe ni kuokoa hii popping mambo yote haya mbali ya stack 618 00:51:45,350 --> 00:51:48,730 tangu thamani ya kurudi ni kwenda tu kuwa kupita njia yote nyuma hadi anyway. 619 00:51:48,730 --> 00:51:55,400 Hivyo kwa nini siyo tu nafasi ya hoja yetu na hoja updated na kuanza juu? 620 00:51:57,460 --> 00:52:01,150 Kama kazi ni si mkia kujirudia, kama wewe kufanya kitu kama - 621 00:52:01,150 --> 00:52:07,530 [Mwanafunzi] kama bar (x + 1). >> Yeah. 622 00:52:07,530 --> 00:52:11,770 >> Hivyo kama wewe kuiweka katika hali, basi wewe ni kufanya kitu kwa thamani ya kurudi. 623 00:52:11,770 --> 00:52:16,260 Au hata kama wewe tu kufanya kurudi 2 * bar (x - 1). 624 00:52:16,260 --> 00:52:23,560 Hivyo sasa bar (x - 1) anahitaji kurudi katika utaratibu kwa ajili yake kwa mahesabu ya mara 2 kuwa thamani, 625 00:52:23,560 --> 00:52:26,140 hivyo sasa haina haja zake tofauti mwenyewe stack frame, 626 00:52:26,140 --> 00:52:31,180 na sasa, hakuna jambo jinsi ngumu wewe jaribu, wewe ni kwenda haja ya - 627 00:52:31,180 --> 00:52:34,410 Hii si mkia kujirudia. 628 00:52:34,410 --> 00:52:37,590 [Mwanafunzi] Je, mimi kujaribu kuleta recursion kwa lengo recursion mkia - 629 00:52:37,590 --> 00:52:41,450 [Bowden] Katika ulimwengu halisi, lakini katika CS50 wewe huna. 630 00:52:43,780 --> 00:52:49,280 Ili kupata mkia recursion, kwa ujumla, wewe kuanzisha hoja ya ziada 631 00:52:49,280 --> 00:52:53,550 ambapo bar itachukua x int ndani ya y 632 00:52:53,550 --> 00:52:56,990 na y sambamba na kitu mwisho unataka kurudi. 633 00:52:56,990 --> 00:53:03,650 Hivyo basi hii utaenda tunarudi bar (x - 1), 2 * y. 634 00:53:03,650 --> 00:53:09,810 Hivyo kwamba tu wa ngazi za juu jinsi kubadilisha mambo kuwa mkia kujirudia. 635 00:53:09,810 --> 00:53:13,790 Lakini hoja ya ziada - 636 00:53:13,790 --> 00:53:17,410 Na kisha katika mwisho wakati wewe kufikia msingi wako kesi, wewe tu kurudi y 637 00:53:17,410 --> 00:53:22,740 kwa sababu tumekuwa kukusanya muda wote thamani ya kurudi kwamba unataka. 638 00:53:22,740 --> 00:53:27,280 Wewe aina ya wamekuwa wakifanya hivyo iteratively lakini kutumia calls kujirudia. 639 00:53:32,510 --> 00:53:34,900 Maswali? 640 00:53:34,900 --> 00:53:39,890 [Mwanafunzi] Labda kuhusu hesabu pointer, kama wakati wa kutumia masharti. >> Uhakika. 641 00:53:39,890 --> 00:53:43,610 Pointer hesabu. 642 00:53:43,610 --> 00:53:48,440 Wakati wa kutumia masharti ni rahisi kwa sababu ya masharti ni Char nyota, 643 00:53:48,440 --> 00:53:51,860 chars ni milele na daima Byte moja, 644 00:53:51,860 --> 00:53:57,540 na hivyo pointer arithmetic ni sawa na hesabu ya mara kwa mara wakati wewe ni kushughulika na masharti. 645 00:53:57,540 --> 00:54:08,790 Hebu tu kusema Char * s = "hello". 646 00:54:08,790 --> 00:54:11,430 Hivyo tuna block katika kumbukumbu. 647 00:54:19,490 --> 00:54:22,380 Inahitaji ka 6 kwa sababu wewe daima haja Terminator null. 648 00:54:22,380 --> 00:54:28,620 Na Char * s inaenda kwa mwanzo wa safu hii. 649 00:54:28,620 --> 00:54:32,830 Hivyo anasema kuna s. 650 00:54:32,830 --> 00:54:36,710 Sasa, hii ni kimsingi jinsi safu yoyote kazi, 651 00:54:36,710 --> 00:54:40,780 bila kujali kama ni kurudi kwa malloc au kama ni juu ya stack. 652 00:54:40,780 --> 00:54:47,110 Safu yoyote kimsingi ni pointer mwanzo wa safu, 653 00:54:47,110 --> 00:54:53,640 na kisha yoyote operesheni safu, yoyote Indexing, ni kwenda tu katika safu kwamba baadhi ya kukabiliana. 654 00:54:53,640 --> 00:55:05,360 >> Hivyo wakati mimi kusema kitu kama s [3]; hii ni kwenda s na kuhesabu chars 3 in 655 00:55:05,360 --> 00:55:12,490 Hivyo s [3], tuna 0, 1, 2, 3, hivyo s [3] ni kwenda kwa kutaja l hii. 656 00:55:12,490 --> 00:55:20,460 [Mwanafunzi] Na sisi inaweza kufikia thamani sawa kwa kufanya s + 3 na kisha mabano nyota? 657 00:55:20,460 --> 00:55:22,570 Ndiyo. 658 00:55:22,570 --> 00:55:26,010 Hii ni sawa na * (s + 3); 659 00:55:26,010 --> 00:55:31,240 na kwamba ni ya milele na daima sawa bila kujali wewe kufanya. 660 00:55:31,240 --> 00:55:34,070 Kamwe haja ya kutumia syntax bracket. 661 00:55:34,070 --> 00:55:37,770 Daima unaweza kutumia * (s + 3) syntax. 662 00:55:37,770 --> 00:55:40,180 Watu huvaa kama syntax bracket, ingawa. 663 00:55:40,180 --> 00:55:43,860 [Mwanafunzi] Basi wote arrays ni kweli tu kuyatumia. 664 00:55:43,860 --> 00:55:53,630 Kuna tofauti kidogo wakati mimi kusema int x [4]; >> [mwanafunzi] Je, hiyo kujenga kumbukumbu? 665 00:55:53,630 --> 00:56:03,320 [Bowden] Hayo ni kwenda kujenga ints 4 juu ya stack, hivyo 16 ka ujumla. 666 00:56:03,320 --> 00:56:05,700 Ni kwenda kujenga ka 16 juu ya stack. 667 00:56:05,700 --> 00:56:09,190 x si kuhifadhiwa mahali popote. 668 00:56:09,190 --> 00:56:13,420 Ni haki ya alama akimaanisha mwanzo wa kitu. 669 00:56:13,420 --> 00:56:17,680 Kwa sababu wewe alitangaza safu ndani ya kazi hii, 670 00:56:17,680 --> 00:56:22,340 nini compiler anaenda kufanya ni tu nafasi matukio yote ya x variable 671 00:56:22,340 --> 00:56:26,400 na ambapo ilivyotokea kuchagua kuweka ka hizi 16. 672 00:56:26,400 --> 00:56:30,040 Ni hawezi kufanya hivyo kwa Char * ni kwa sababu ya ni pointer halisi. 673 00:56:30,040 --> 00:56:32,380 Ni bure na kisha kumweka kwa mambo mengine. 674 00:56:32,380 --> 00:56:36,140 x ni mara kwa mara. Huwezi kuwa ni hatua ya safu mbalimbali. >> [Mwanafunzi] Sawa. 675 00:56:36,140 --> 00:56:43,420 Lakini wazo hili, hii Indexing, ni sawa bila kujali kama ni safu ya jadi 676 00:56:43,420 --> 00:56:48,230 au kama ni pointer kitu au kama ni pointer safu malloced. 677 00:56:48,230 --> 00:56:59,770 Na kwa kweli, ni sawa hivyo kwamba pia ni kitu kimoja. 678 00:56:59,770 --> 00:57:05,440 Ni kweli inasababisha tu nini ndani ya mabano na nini kushoto ya mabano, 679 00:57:05,440 --> 00:57:07,970 anaongeza wote pamoja, na dereferences. 680 00:57:07,970 --> 00:57:14,710 Hivyo hii ni halali kama * (s + 3) au s [3]. 681 00:57:16,210 --> 00:57:22,090 [Mwanafunzi] Je, unaweza kuwa na kuyatumia akizungumzia arrays 2-dimensional? 682 00:57:22,090 --> 00:57:27,380 >> Ni vigumu. Kijadi, hakuna. 683 00:57:27,380 --> 00:57:34,720 Safu 2-dimensional ni safu 1-dimensional na syntax baadhi rahisi 684 00:57:34,720 --> 00:57:54,110 kwa sababu wakati mimi kusema int x [3] [3], hii ni kweli tu 1 safu na maadili 9. 685 00:57:55,500 --> 00:58:03,000 Na hivyo wakati mimi index, compiler anajua nini namaanisha. 686 00:58:03,000 --> 00:58:13,090 Nikisema x [1] [2], anajua mimi nataka kwenda mstari wa pili, hivyo ni kwenda ruka 3 ya kwanza, 687 00:58:13,090 --> 00:58:17,460 na kisha anataka Jambo la pili kwa kuwa, hivyo ni kwenda kupata hii moja. 688 00:58:17,460 --> 00:58:20,480 Lakini bado tu safu moja-dimensional. 689 00:58:20,480 --> 00:58:23,660 Na hivyo kama nilitaka hawawajui pointer safu kwamba, 690 00:58:23,660 --> 00:58:29,770 Naweza kusema int * p = x; 691 00:58:29,770 --> 00:58:33,220 aina ya x ni tu - 692 00:58:33,220 --> 00:58:38,280 Ni mbaya akisema aina ya x kwa vile ni ishara tu na si kutofautiana halisi, 693 00:58:38,280 --> 00:58:40,140 lakini ni tu * int. 694 00:58:40,140 --> 00:58:44,840 x ni tu pointer mwanzo wa hii. >> [Mwanafunzi] Sawa. 695 00:58:44,840 --> 00:58:52,560 Na hivyo mimi si kuwa na uwezo wa kupata [1] [2]. 696 00:58:52,560 --> 00:58:58,370 Nadhani kuna syntax maalum kwa ajili ya kutangaza pointer, 697 00:58:58,370 --> 00:59:12,480 kitu ridiculous kama int (* p [-. kitu ujinga kabisa mimi hata sijui. 698 00:59:12,480 --> 00:59:17,090 Lakini kuna syntax kwa ajili ya kutangaza kuyatumia kama kwa mabano na mambo. 699 00:59:17,090 --> 00:59:22,960 Inaweza hata basi wewe kufanya hivyo. 700 00:59:22,960 --> 00:59:26,640 Mimi naweza kuangalia nyuma katika kitu ambacho ingekuwa kuniambia ukweli. 701 00:59:26,640 --> 00:59:34,160 Nami kuangalia kwa hilo baadaye, kama kuna syntax kwa uhakika. Lakini kamwe kuona. 702 00:59:34,160 --> 00:59:39,670 Na hata hivyo ni syntax kizamani kwamba kama matumizi yake, watu watakuwa baffled. 703 00:59:39,670 --> 00:59:43,540 Arrays multidimensional ni pretty nadra kama ni. 704 00:59:43,540 --> 00:59:44,630 Wewe pretty much - 705 00:59:44,630 --> 00:59:48,490 Naam, kama wewe ni kufanya mambo tumbo si kwenda kuwa adimu, 706 00:59:48,490 --> 00:59:56,730 lakini katika C wewe ni mara chache kwenda kuwa na kutumia arrays multidimensional. 707 00:59:57,630 --> 01:00:00,470 Yeah. >> [Mwanafunzi] Hebu sema una safu kweli kwa muda mrefu. 708 01:00:00,470 --> 01:00:03,900 >> Hivyo katika kumbukumbu virtual ingekuwa kuonekana kuwa yote mfululizo, 709 01:00:03,900 --> 01:00:05,640 kama vipengele haki ya karibu na kila mmoja, 710 01:00:05,640 --> 01:00:08,770 lakini katika kumbukumbu ya kimwili, ingekuwa inawezekana kwa kuwa kwa kuwa wameigawanya? >> Ndiyo. 711 01:00:08,770 --> 01:00:16,860 Jinsi virtual kumbukumbu matendo ni kama tu anavyotenganisha - 712 01:00:19,220 --> 01:00:24,860 kitengo cha mgao ni ukurasa, ambayo huelekea kuwa 4 kilobytes, 713 01:00:24,860 --> 01:00:29,680 na hivyo wakati wa mchakato anasema, hey, nataka kutumia kumbukumbu hii, 714 01:00:29,680 --> 01:00:35,970 mfumo wa uendeshaji ni kwenda kuipa kilobytes 4 Kitalu kwamba kidogo ya kumbukumbu. 715 01:00:35,970 --> 01:00:39,100 Hata kama wewe tu kutumia moja kidogo Byte katika block nzima ya kumbukumbu, 716 01:00:39,100 --> 01:00:42,850 mfumo wa uendeshaji ni kwenda kuwapa kamili kilobytes 4. 717 01:00:42,850 --> 01:00:49,410 Basi nini maana ya hii ni mimi naweza kuwa - wacha kusema hii ni stack yangu. 718 01:00:49,410 --> 01:00:53,180 Stack Hii inaweza kutengwa. Stack yangu inaweza kuwa megabaiti na megabaiti. 719 01:00:53,180 --> 01:00:55,020 Stack yangu inaweza kuwa kubwa. 720 01:00:55,020 --> 01:01:00,220 Lakini stack yenyewe ina kuwa umegawanyika katika kurasa binafsi, 721 01:01:00,220 --> 01:01:09,010 ambayo kama sisi kuangalia juu hapa hebu kusema hii ni RAM yetu, 722 01:01:09,010 --> 01:01:16,600 kama nina 2 gigabytes ya RAM, hii ni halisi anuani 0 0 Byte kama ya RAM yangu, 723 01:01:16,600 --> 01:01:22,210 na hii ni 2 gigabytes njia yote chini hapa. 724 01:01:22,210 --> 01:01:27,230 Hivyo ukurasa huu ili yanahusiana na block hii zaidi hapa. 725 01:01:27,230 --> 01:01:29,400 Ukurasa Hii inaweza yanahusiana na block hii zaidi hapa. 726 01:01:29,400 --> 01:01:31,560 Moja hii inaweza yanahusiana na hii moja zaidi ya hapa. 727 01:01:31,560 --> 01:01:35,540 Hivyo mfumo wa uendeshaji ni bure hawawajui kumbukumbu kimwili 728 01:01:35,540 --> 01:01:39,320 yoyote ukurasa binafsi kiholela. 729 01:01:39,320 --> 01:01:46,180 Na hiyo ina maana kwamba kama mpaka hii hutokea kwa magamaga safu, 730 01:01:46,180 --> 01:01:50,070 safu kinachotokea kwa kuwa kushoto ya hii na haki ya utaratibu huu wa ukurasa, 731 01:01:50,070 --> 01:01:54,460 kisha safu kwamba ni kwenda kuwa umegawanyika katika kumbukumbu ya kimwili. 732 01:01:54,460 --> 01:01:59,280 Na kisha wakati wewe kuacha mpango, wakati mchakato kumalizika, 733 01:01:59,280 --> 01:02:05,690 haya upangaji kupata erased na basi ni huru kutumia vitalu hizi kidogo kwa ajili ya mambo mengine. 734 01:02:14,730 --> 01:02:17,410 Zaidi maswali? 735 01:02:17,410 --> 01:02:19,960 [Mwanafunzi] arithmetic pointer. >> Oh yeah. 736 01:02:19,960 --> 01:02:28,410 Strings yalikuwa rahisi, lakini kuangalia kitu kama ints, 737 01:02:28,410 --> 01:02:35,000 hivyo nyuma int x [4]; 738 01:02:35,000 --> 01:02:41,810 Kama hii ni safu au kama ni pointer safu malloced ya integers 4, 739 01:02:41,810 --> 01:02:47,060 itakavyo kutibiwa njia sawa. 740 01:02:50,590 --> 01:02:53,340 [Mwanafunzi] Basi ni juu ya arrays mirundi? 741 01:03:01,400 --> 01:03:05,270 [Bowden] Arrays ni si juu ya lundo. >> [Mwanafunzi] Oh. 742 01:03:05,270 --> 01:03:08,320 >> [Bowden] Aina hii ya safu huelekea kuwa juu ya stack 743 01:03:08,320 --> 01:03:12,220 isipokuwa wewe amekiri kuwa ni saa - kupuuza vigezo kimataifa. Usitumie vigezo kimataifa. 744 01:03:12,220 --> 01:03:16,280 Ndani ya kazi nasema int x [4]; 745 01:03:16,280 --> 01:03:22,520 Ni kwenda kujenga block 4-integer juu ya stack kwa safu hii. 746 01:03:22,520 --> 01:03:26,960 Lakini hii malloc (4 * sizeof (int)); yataenda juu ya lundo. 747 01:03:26,960 --> 01:03:31,870 Lakini baada ya hatua hii naweza kutumia x na p katika pretty much njia hiyo hiyo, 748 01:03:31,870 --> 01:03:36,140 nyingine kuliko isipokuwa nilivyosema kabla kuhusu unaweza reassign p. 749 01:03:36,140 --> 01:03:40,960 Kitaalam, ukubwa wao ni tofauti kwa kiasi fulani, lakini hiyo ni kabisa lisilo na maana. 750 01:03:40,960 --> 01:03:43,310 Wewe kweli kamwe kutumia ukubwa wao. 751 01:03:48,020 --> 01:03:56,810 p mimi naweza kusema p [3] = 2; au x [3] = 2; 752 01:03:56,810 --> 01:03:59,680 Unaweza kutumia yao katika njia hasa sawa. 753 01:03:59,680 --> 01:04:01,570 Hivyo pointer arithmetic sasa - Ndiyo. 754 01:04:01,570 --> 01:04:07,390 [Mwanafunzi] Je kufanya p * kama una mabano? 755 01:04:07,390 --> 01:04:11,720 mabano ni dereference thabiti. >> Sawa. 756 01:04:11,720 --> 01:04:20,200 Kweli, pia unachosema na unaweza kupata arrays multidimensional 757 01:04:20,200 --> 01:05:02,650 na kuyatumia, nini unaweza kufanya ni kitu kama, hebu sema, int ** pp = malloc (sizeof (int *) * 5); 758 01:05:02,650 --> 01:05:06,900 Mimi itabidi kuandika yote nje ya kwanza. 759 01:05:37,880 --> 01:05:41,020 Mimi sitaki kuwa moja. 760 01:05:41,020 --> 01:05:42,550 Sawa. 761 01:05:42,550 --> 01:05:48,910 Nini mimi hapa ni - Kwamba lazima pp [i]. 762 01:05:48,910 --> 01:05:53,680 Hivyo pp ni pointer pointer. 763 01:05:53,680 --> 01:06:02,420 Wewe mallocing pp kwa uhakika na safu ya nyota 5 int. 764 01:06:02,420 --> 01:06:10,950 Hivyo katika kumbukumbu una juu ya pp stack 765 01:06:10,950 --> 01:06:20,150 Ni kwenda na kumweka kwa safu ya vitalu 5 ambao wote ni wenyewe kuyatumia. 766 01:06:20,150 --> 01:06:28,210 Na kisha wakati mimi malloc chini hapa, mimi malloc kwamba kila mtu binafsi ya kuyatumia those 767 01:06:28,210 --> 01:06:32,080 wanapaswa kumweka kuzuia tofauti ya ka 4 juu ya lundo. 768 01:06:32,080 --> 01:06:35,870 Hivyo hii pointi ka 4. 769 01:06:37,940 --> 01:06:40,660 Na hii pointi moja kwa ka mbalimbali 4. 770 01:06:40,660 --> 01:06:43,200 >> Na wote wanaongelea ka yao wenyewe 4. 771 01:06:43,200 --> 01:06:49,080 Hii inanipa njia ya kufanya mambo multidimensional. 772 01:06:49,080 --> 01:06:58,030 Mimi naweza kusema pp [3] [4], lakini sasa hii si kitu sawa kama arrays multidimensional 773 01:06:58,030 --> 01:07:05,390 kwa sababu arrays multidimensional ni kutafsiriwa [3] [4] ndani ya moja katika kukabiliana na safu x. 774 01:07:05,390 --> 01:07:14,790 Hii p dereferences, grossistledet index ya tatu, kisha dereferences kwamba 775 01:07:14,790 --> 01:07:20,790 na grossistledet - 4 itakuwa batili - index pili. 776 01:07:24,770 --> 01:07:31,430 Ambapo wakati tulikuwa int x [3] [4] kabla kama safu multidimensional 777 01:07:31,430 --> 01:07:35,740 na wakati wewe mara mbili bracket ni kweli tu dereference moja, 778 01:07:35,740 --> 01:07:40,490 wewe ni kufuatia pointer moja na kisha kukabiliana, 779 01:07:40,490 --> 01:07:42,850 hii ni kweli 2D rejea. 780 01:07:42,850 --> 01:07:45,840 Wewe kufuata 2 kuyatumia tofauti. 781 01:07:45,840 --> 01:07:50,420 Hivyo hii pia kitaalam inaruhusu kuwa na arrays multidimensional 782 01:07:50,420 --> 01:07:53,550 ambapo kila mtu binafsi ni safu ukubwa tofauti. 783 01:07:53,550 --> 01:07:58,000 Hivyo nadhani jagged arrays multidimensional ni nini ni wito 784 01:07:58,000 --> 01:08:01,870 tangu kweli jambo la kwanza inaweza kumweka kwa kitu ambayo ina vipengele 10, 785 01:08:01,870 --> 01:08:05,540 Jambo la pili inaweza kumweka kwa kitu ambayo ina vipengele 100. 786 01:08:05,540 --> 01:08:10,790 [Mwanafunzi] Je, kuna kikomo na idadi ya kuyatumia unaweza kuwa 787 01:08:10,790 --> 01:08:14,290 akizungumzia kuyatumia nyingine? >> No 788 01:08:14,290 --> 01:08:17,010 Unaweza kuwa na int ***** p. 789 01:08:18,050 --> 01:08:23,760 Rudi arithmetic pointer - >> [mwanafunzi] Oh. >> Yeah. 790 01:08:23,760 --> 01:08:35,649 [Mwanafunzi] Kama mimi na int *** p na kisha mimi kufanya dereferencing na mimi kusema p * ni sawa na thamani hii, 791 01:08:35,649 --> 01:08:39,560 ni hayo tu kwenda kufanya 1 ngazi ya dereferencing? >> Ndiyo. 792 01:08:39,560 --> 01:08:43,340 Hivyo kama nataka kupata kitu kwamba pointer mwisho akionyesha - 793 01:08:43,340 --> 01:08:46,210 Kisha wewe kufanya *** p. >> Sawa. 794 01:08:46,210 --> 01:08:54,080 Hivyo hii ni p pointi 1 block, pointi ya kuzuia mwingine, pointi ya kuzuia mwingine. 795 01:08:54,080 --> 01:09:02,010 Kisha kama wewe kufanya * p = kitu kingine, basi wewe ni kubadilisha huu 796 01:09:02,010 --> 01:09:13,640 kwa sasa kumweka kuzuia tofauti. >> Sawa. 797 01:09:13,640 --> 01:09:17,649 >> [Bowden] Na kama hawa walikuwa malloced, basi una sasa kuvuja kumbukumbu 798 01:09:17,649 --> 01:09:20,430 isipokuwa wewe kutokea kwa kuwa na references tofauti ya hizi 799 01:09:20,430 --> 01:09:25,270 tangu huwezi kupata nyuma wale walio kuwa wewe tu akatupa mbali. 800 01:09:25,270 --> 01:09:29,550 Pointer hesabu. 801 01:09:29,550 --> 01:09:36,310 int x [4]; ni kwenda kutenga safu ya integers 4 802 01:09:36,310 --> 01:09:40,670 ambapo x inaenda kwa mwanzo wa safu. 803 01:09:40,670 --> 01:09:50,420 Hivyo wakati mimi kusema kitu kama x [1]; nataka kumaanisha kwenda integer pili katika safu, 804 01:09:50,420 --> 01:09:53,319 ambayo itakuwa ni hii moja. 805 01:09:53,319 --> 01:10:04,190 Lakini kwa kweli, hilo ni 4 ka katika safu hii tangu integer inachukua hadi ka 4. 806 01:10:04,190 --> 01:10:08,470 Hivyo kukabiliana ya 1 kweli maana yake kukabiliana ya 1 807 01:10:08,470 --> 01:10:12,030 ukubwa wa mara kila aina ya safu ni. 808 01:10:12,030 --> 01:10:17,170 Hii ni safu ya integers, hivyo anajua kufanya 1 ukubwa wa mara int wakati anataka kukabiliana. 809 01:10:17,170 --> 01:10:25,260 syntax nyingine. Kumbuka kuwa hii ni sawa na * (x + 1); 810 01:10:25,260 --> 01:10:35,250 Wakati mimi kusema pointer + 1, nini kwamba anarudi ni anuani ya kwamba pointer ni hifadhi ya 811 01:10:35,250 --> 01:10:40,360 plus 1 ukubwa wa mara ya aina ya pointer. 812 01:10:40,360 --> 01:10:59,510 Hivyo kama x = ox100, basi x + 1 = ox104. 813 01:10:59,510 --> 01:11:19,750 Na unaweza vibaya hii na kusema kitu kama Char * c = (Char *) x; 814 01:11:19,750 --> 01:11:23,050 na sasa c ni kwenda kuwa anuani hiyo kama x. 815 01:11:23,050 --> 01:11:26,040 c ni kwenda kuwa sawa na ox100, 816 01:11:26,040 --> 01:11:31,490 lakini c + 1 ni kwenda kuwa sawa na ox101 817 01:11:31,490 --> 01:11:38,030 tangu pointer arithmetic hutegemea aina ya pointer kwamba wewe ni kuongeza. 818 01:11:38,030 --> 01:11:45,390 Hivyo c + 1, inaangalia c, ni pointer Char, hivyo ni kwenda kuongeza 1 ukubwa wa mara Char, 819 01:11:45,390 --> 01:11:48,110 ambayo ni daima itakuwa 1, ili kupata 101, 820 01:11:48,110 --> 01:11:54,890 lakini kama mimi kufanya x, ambayo pia bado 100, x + 1 ni kwenda kuwa 104. 821 01:11:56,660 --> 01:12:06,340 [Mwanafunzi] Je, unaweza kutumia c + + ili kuendeleza pointer yako na 1? 822 01:12:06,340 --> 01:12:09,810 Ndiyo, unaweza. 823 01:12:09,810 --> 01:12:16,180 Huwezi kufanya hivyo kwa sababu x x ni ishara tu, ni mara kwa mara; huwezi kubadilisha x. 824 01:12:16,180 --> 01:12:22,610 >> Lakini c hutokea tu kuwa pointer, hivyo c + + ni kikamilifu halali na itakuwa na increment 1. 825 01:12:22,610 --> 01:12:32,440 Kama c walikuwa tu * int, basi c + + itakuwa 104. 826 01:12:32,440 --> 01:12:41,250 + + Gani pointer hesabu tu kama c + 1 ingekuwa kufanyika pointer hesabu. 827 01:12:43,000 --> 01:12:48,870 Hii ni kweli jinsi mambo mengi kama aina kuunganisha - 828 01:12:49,670 --> 01:12:55,710 Badala ya kujenga nakala za mambo, unaweza badala kupita - 829 01:12:55,710 --> 01:13:02,400 Kama kama mimi alitaka kupita hii nusu ya safu - basi s kufuta baadhi ya hii. 830 01:13:04,770 --> 01:13:10,520 Hebu sema mimi alitaka kupita upande huu wa safu ndani ya kazi. 831 01:13:10,520 --> 01:13:12,700 Gani mimi kupita kwa kazi hiyo? 832 01:13:12,700 --> 01:13:17,050 Kama mimi kupita x, mimi kupita anwani hii. 833 01:13:17,050 --> 01:13:23,780 Lakini nataka kupita anwani hii hasa. Basi nini lazima mimi kupita? 834 01:13:23,780 --> 01:13:26,590 [Mwanafunzi] Pointer + 2? 835 01:13:26,590 --> 01:13:29,350 [Bowden] Basi x + 2. Ndiyo. 836 01:13:29,350 --> 01:13:31,620 Hiyo itakuwa anwani hii. 837 01:13:31,620 --> 01:13:42,810 Utapata pia mara nyingi sana kuona kama x [2] na kisha anuani ya kwamba. 838 01:13:42,810 --> 01:13:47,850 Hivyo haja ya kuchukua anuani yake kwa sababu ni bracket dereference thabiti. 839 01:13:47,850 --> 01:13:53,250 x [2] unahusu thamani ya kwamba ni katika sanduku hili, na kisha unataka anuani ya sanduku kwamba, 840 01:13:53,250 --> 01:13:56,850 hivyo unaweza kusema & x [2]. 841 01:13:56,850 --> 01:14:02,880 Basi hiyo ni jinsi ya kitu katika aina kuunganisha ambapo unataka kupita orodha nusu kwa kitu 842 01:14:02,880 --> 01:14:08,790 wewe kweli tu kupita & x [2], na sasa kama mbali kama wito kujirudia ni wasiwasi, 843 01:14:08,790 --> 01:14:12,510 safu yangu mpya kuanza huko. 844 01:14:12,510 --> 01:14:15,130 Dakika ya mwisho maswali. 845 01:14:15,130 --> 01:14:20,050 [Mwanafunzi] Kama hatuwezi kuweka au ampersand - nini kwamba uitwao? >> Nyota? 846 01:14:20,050 --> 01:14:23,200 [Mwanafunzi] Star. >> Kitaalam, dereference operator, lakini - >> [mwanafunzi] Dereference. 847 01:14:23,200 --> 01:14:29,310 >> Kama hatuwezi kuweka nyota au ampersand, kile kinachotokea kama mimi tu kusema y = x x na ni pointer? 848 01:14:29,310 --> 01:14:34,620 Je, ni aina ya y? >> [Mwanafunzi] mimi itabidi tu kusema ni pointer 2. 849 01:14:34,620 --> 01:14:38,270 Hivyo kama wewe tu kusema y = x, sasa x na y uhakika na kitu kimoja. >> [Mwanafunzi] Point kwa kitu kimoja. 850 01:14:38,270 --> 01:14:45,180 Na kama x ni pointer int? >> Ingekuwa kulalamika kwa sababu huwezi hawawajui kuyatumia. 851 01:14:45,180 --> 01:14:46,540 [Mwanafunzi] Sawa. 852 01:14:46,540 --> 01:14:51,860 Kumbuka kuyatumia kwamba, hata ingawa sisi kuteka yao kama mishale, 853 01:14:51,860 --> 01:15:02,010 kweli yote ya hazina wao - int * x - kweli x wote ni hifadhi ni kitu kama ox100, 854 01:15:02,010 --> 01:15:06,490 ambayo sisi kutokea kwa kuwakilisha kama akizungumzia kuzuia kuhifadhiwa katika 100. 855 01:15:06,490 --> 01:15:19,660 Hivyo wakati mimi kusema int * y = x; Mimi tu kuiga ox100 ndani ya y, 856 01:15:19,660 --> 01:15:24,630 ambayo sisi ni kwenda tu kuwakilisha kama y, pia akizungumzia ox100. 857 01:15:24,630 --> 01:15:39,810 Na kama nasema int i = (int) x; kisha i ni kwenda kuhifadhi chochote thamani ya ox100 ni 858 01:15:39,810 --> 01:15:45,100 ndani yake, lakini sasa ni kwenda kufasiriwa kama integer badala ya pointer. 859 01:15:45,100 --> 01:15:49,310 Lakini unahitaji kutupwa au pengine itakuwa kulalamika. 860 01:15:49,310 --> 01:15:53,300 [Mwanafunzi] Basi nini maana kuwafukuza - 861 01:15:53,300 --> 01:16:00,290 Je, ni kwenda kuwa akitoa int ya x au akitoa int ya y? 862 01:16:00,290 --> 01:16:03,700 [Bowden] Nini? 863 01:16:03,700 --> 01:16:07,690 [Mwanafunzi] Sawa. Baada ya mabano haya ni kuna kwenda kuwa x au ay huko? 864 01:16:07,690 --> 01:16:11,500 >> [Bowden] Ama. x na y ni sawa. >> [Mwanafunzi] Sawa. 865 01:16:11,500 --> 01:16:14,390 Kwa sababu uko wote kuyatumia. >> Yeah. 866 01:16:14,390 --> 01:16:21,050 [Mwanafunzi] Hivyo itakuwa kuhifadhi 100 hexadesimoli katika fomu integer? >> [Bowden] Yeah. 867 01:16:21,050 --> 01:16:23,620 Lakini si thamani ya chochote ni pointi. 868 01:16:23,620 --> 01:16:29,940 [Bowden] Yeah. >> [Mwanafunzi] Basi tu anuani katika fomu integer. Sawa. 869 01:16:29,940 --> 01:16:34,720 [Bowden] Kama alitaka kwa sababu baadhi ya ajabu, 870 01:16:34,720 --> 01:16:38,900 unaweza peke kukabiliana na kuyatumia na kamwe kukabiliana na integers 871 01:16:38,900 --> 01:16:49,240 na tu kuwa kama int * x = 0. 872 01:16:49,240 --> 01:16:53,000 Kisha utaenda kupata kweli kuchanganyikiwa mara moja pointer arithmetic kuanza kinachotokea. 873 01:16:53,000 --> 01:16:56,570 Hivyo idadi ya kwamba wao ni kuhifadhi maana. 874 01:16:56,570 --> 01:16:58,940 Ni jinsi tu wewe kuishia kutafsiri yao. 875 01:16:58,940 --> 01:17:02,920 Hivyo mimi nina bure nakala ox100 kutoka * int kwa int, 876 01:17:02,920 --> 01:17:07,790 na mimi nina bure hawawajui - you're pengine kwenda kupata yelled saa kwa si akitoa - 877 01:17:07,790 --> 01:17:18,160 Mimi nina bure hawawajui kitu kama (int *) ox1234 katika * huu holela int. 878 01:17:18,160 --> 01:17:25,480 Hivyo ox123 ni tu kama halali anuani kumbukumbu kama ni & y. 879 01:17:25,480 --> 01:17:32,060 & Y kinachotokea kurudi kitu ambacho ni kiasi pretty ox123. 880 01:17:32,060 --> 01:17:35,430 [Mwanafunzi] Laiti kuwa njia ya kweli ya baridi kwenda kutoka hexadesimoli kwa ajili ya decimal, 881 01:17:35,430 --> 01:17:39,230 kama kama una pointer na wewe kuwatupia kama int? 882 01:17:39,230 --> 01:17:44,860 [Bowden] Unaweza kweli tu magazeti kutumia kama printf. 883 01:17:44,860 --> 01:17:50,300 Hebu sema nina int y = 100. 884 01:17:50,300 --> 01:18:02,700 Hivyo printf (% d \ n - kama unapaswa tayari kujua - magazeti kwamba kama integer,% x. 885 01:18:02,700 --> 01:18:05,190 Tutaweza tu magazeti ni kama hexadesimoli. 886 01:18:05,190 --> 01:18:10,760 Hivyo pointer si kuhifadhiwa kama hexadesimoli, 887 01:18:10,760 --> 01:18:12,960 na integer si kuhifadhiwa kama decimal. 888 01:18:12,960 --> 01:18:14,700 Kila kitu ni kuhifadhiwa kama binary. 889 01:18:14,700 --> 01:18:17,950 Ni tu kwamba sisi huwa na kuonyesha kuyatumia kama hexadesimoli 890 01:18:17,950 --> 01:18:23,260 kwa sababu tunafikiri ya mambo haya katika vitalu 4-Byte, 891 01:18:23,260 --> 01:18:25,390 na kumbukumbu anwani huwa na kuwa familiar. 892 01:18:25,390 --> 01:18:28,890 Sisi ni kama, ikiwa ni kuanza na bf, basi hutokea kwa kuwa juu ya stack. 893 01:18:28,890 --> 01:18:35,560 Hivyo ni tu tafsiri yetu ya kuyatumia kama hexadesimoli. 894 01:18:35,560 --> 01:18:39,200 Sawa. Maswali yoyote ya mwisho? 895 01:18:39,200 --> 01:18:41,700 >> Nitakuwa hapa kwa kidogo baada ya kama una kitu kingine chochote. 896 01:18:41,700 --> 01:18:46,070 Na kwamba mwisho wa. 897 01:18:46,070 --> 01:18:48,360 >> [Mwanafunzi] Yay! [Applause] 898 01:18:51,440 --> 01:18:53,000 >> [CS50.TV]