1 00:00:00,000 --> 00:00:02,520 [Powered by Google Translate] [Seksyon 4 - Higit kumportableng] 2 00:00:02,520 --> 00:00:04,850 [Rob Bowden - Harvard University] 3 00:00:04,850 --> 00:00:07,370 [Ito ay CS50. - CS50.TV] 4 00:00:08,920 --> 00:00:13,350 Mayroon kaming pagsusulit bukas, kung sakaling guys ay hindi alam na. 5 00:00:14,810 --> 00:00:20,970 Ito ay isa lamang sa lahat ng maaari mong nakikita sa klase o dapat na nakikita sa klase. 6 00:00:20,970 --> 00:00:26,360 Na kinabibilangan ng payo, kahit na nasa kamakailang mga paksa. 7 00:00:26,360 --> 00:00:29,860 Dapat mong hindi bababa sa maunawaan ang mga mataas na antas ng mga ito. 8 00:00:29,860 --> 00:00:34,760 Anumang bagay na nawala sa klase dapat mong maunawaan para sa pagsusulit. 9 00:00:34,760 --> 00:00:37,320 Kaya kung mayroon kang mga tanong sa kanila, maaari mong hilingin ang mga ito ngayon. 10 00:00:37,320 --> 00:00:43,280 Ngunit ito ay pagpunta sa isang napaka mag-aaral-LED session kung saan mo guys magtanong, 11 00:00:43,280 --> 00:00:45,060 kaya sana ang mga tao ay may mga katanungan. 12 00:00:45,060 --> 00:00:48,020 Ba ang sinuman may mga katanungan? 13 00:00:49,770 --> 00:00:52,090 Oo. >> [Mag-aaral] Maaari kang pumunta sa paglipas ng payo muli? 14 00:00:52,090 --> 00:00:54,350 Kukunin ko na pumunta sa paglipas ng payo. 15 00:00:54,350 --> 00:00:59,180 Ang lahat ng iyong mga variable kinakailangang mabuhay sa memory, 16 00:00:59,180 --> 00:01:04,450 ngunit karaniwang hindi mo mag-alala tungkol sa at sabihin mo lang x + 2 at y + 3 17 00:01:04,450 --> 00:01:07,080 at ang tagatala ay malaman kung saan ang mga bagay ay naninirahan para sa iyo. 18 00:01:07,080 --> 00:01:12,990 Kapag ikaw ay pagharap sa mga payo, ngayon tahasang gumagamit ka ng mga address memory. 19 00:01:12,990 --> 00:01:19,800 Kaya ng isang variable ay lamang kailanman nakatira sa isang solong address sa anumang naibigay na oras. 20 00:01:19,800 --> 00:01:24,040 Kung gusto naming upang idedeklara ng pointer, kung ano ang uri ng pagpunta sa hitsura? 21 00:01:24,040 --> 00:01:26,210 >> Gusto kong idedeklara ng pointer p. Ano ang uri ng hitsura? 22 00:01:26,210 --> 00:01:33,530 [Mag-aaral] int * p. >> Oo. Kaya int * p. 23 00:01:33,530 --> 00:01:38,030 At paano ko ituro ito sa x? >> [Mag-aaral] Ampersand. 24 00:01:40,540 --> 00:01:45,300 [Bowden] Kaya ampersand Literal na tinatawag na ang address ng operator. 25 00:01:45,300 --> 00:01:50,460 Kaya kapag sinabi ko at x nakakakuha ito ng memory address ng variable x. 26 00:01:50,460 --> 00:01:56,790 Kaya ngayon mayroon akong ang pointer p, at kahit saan sa aking code Maaari ko bang gamitin ang * p 27 00:01:56,790 --> 00:02:02,960 o maaari ko bang gamitin ang x at ito ay ang eksaktong parehong bagay. 28 00:02:02,960 --> 00:02:09,520 (* P). Ano ito ginagawa? Ano ang bituin na ibig sabihin nito? 29 00:02:09,520 --> 00:02:13,120 [Mag-aaral] Ito ay nangangahulugan na ang isang halaga sa puntong iyon. >> Oo. 30 00:02:13,120 --> 00:02:17,590 Kaya't kung tiningnan namin ito, maaari itong maging lubhang kapaki-pakinabang upang gumuhit ang diagram 31 00:02:17,590 --> 00:02:22,230 kung saan ito ay isang maliit na kahon ng memory para sa x, na ang mangyayari sa ang halaga 4, 32 00:02:22,230 --> 00:02:25,980 pagkatapos kami ay may isang maliit na kahon ng memory para sa p, 33 00:02:25,980 --> 00:02:31,590 at upang p puntos sa x, kaya namin gumuhit ng isang arrow mula p sa x. 34 00:02:31,590 --> 00:02:40,270 Kaya kapag sinabi namin * p namin sinasabi na pumunta sa kahon na p. 35 00:02:40,270 --> 00:02:46,480 Star ay sundin ang mga arrow at pagkatapos ay anumang nais mo na may na kahon doon. 36 00:02:46,480 --> 00:03:01,090 Sa gayon ay maaari kong sabihin * p = 7; at iyon ay pumunta sa kahon na x at pagbabago na sa 7. 37 00:03:01,090 --> 00:03:13,540 O maaari ba akong sabihin int z = * p * 2; Iyon ang nakakalito dahil ito ay star, star. 38 00:03:13,540 --> 00:03:19,230 Ang isang bituin ay dereferencing p, ang iba pang mga bituin ay multiply ng 2. 39 00:03:19,230 --> 00:03:26,780 Mapansin maaari ba akong magkaroon lamang pati na rin pinalitan ang * p may x. 40 00:03:26,780 --> 00:03:29,430 Maaari mong gamitin ang mga ito sa parehong paraan. 41 00:03:29,430 --> 00:03:38,000 At pagkatapos mamaya sa ko maaaring magkaroon p punto sa isang ganap na bagong bagay. 42 00:03:38,000 --> 00:03:42,190 Maaari ko lang sabihin p = &z; 43 00:03:42,190 --> 00:03:44,940 Kaya ngayon p hindi na punto upang x; punto upang z. 44 00:03:44,940 --> 00:03:50,510 At anumang oras gagawin ko * p katulad ng ginagawa z. 45 00:03:50,510 --> 00:03:56,170 Kaya ang kapaki-pakinabang na bagay tungkol sa sandaling sinimulan namin ang pagkuha sa function. 46 00:03:56,170 --> 00:03:59,790 >> Ito ay uri ng walang kaukulan na idedeklara ng pointer na tumuturo sa isang bagay 47 00:03:59,790 --> 00:04:03,140 at pagkatapos ka dereferencing ito 48 00:04:03,140 --> 00:04:06,060 kapag ginamit mo ang orihinal na variable upang magsimula sa. 49 00:04:06,060 --> 00:04:18,190 Ngunit kapag nakakuha ka sa mga function - kaya sabihin nating mayroon kaming ilang function, int foo, 50 00:04:18,190 --> 00:04:32,810 na tumatagal ng pointer at ginagawa lang * p = 6; 51 00:04:32,810 --> 00:04:39,990 Tulad ng nakita namin bago may makipagpalitan, hindi mo maaaring gawin ng isang epektibong makipagpalitan at isang hiwalay na function na 52 00:04:39,990 --> 00:04:45,180 sa pamamagitan ng lamang pagpasa mga integer dahil ang lahat sa C ay palaging pagpasa sa pamamagitan ng halaga. 53 00:04:45,180 --> 00:04:48,360 Kahit na kapag ikaw ay pagpasa ng mga payo ka pagpasa sa pamamagitan ng halaga. 54 00:04:48,360 --> 00:04:51,940 Ito lang kaya mangyayari ang mga halaga ay ang mga address ng memorya. 55 00:04:51,940 --> 00:05:00,770 Kaya kapag sinabi ko foo (p); ako pagpasa sa pointer sa katangian ng foo 56 00:05:00,770 --> 00:05:03,910 at pagkatapos foo ginagawa * p = 6; 57 00:05:03,910 --> 00:05:08,600 Kaya sa loob ng function na iyon, * p pa rin ang katumbas sa x, 58 00:05:08,600 --> 00:05:12,720 ngunit hindi ako maaaring gumamit ng x sa loob ng na function na dahil hindi ito scoped loob na function na. 59 00:05:12,720 --> 00:05:19,510 Kaya * p = 6 ay ang tanging paraan na maaari kong ma-access ang isang lokal na variable mula sa isa pang function na. 60 00:05:19,510 --> 00:05:23,600 O, mahusay, ang mga payo ay ang tanging paraan na maaari kong ma-access ang isang lokal na variable mula sa isa pang function na. 61 00:05:23,600 --> 00:05:31,600 [Mag-aaral] sabihin nating na nais mo upang ibalik ang isang pointer. Paano eksaktong gawin iyon? 62 00:05:31,600 --> 00:05:44,270 [Bowden] Bumalik ng pointer sa isang bagay tulad ng int y = 3; return & ya? >> [Mag-aaral] Oo. 63 00:05:44,270 --> 00:05:48,480 [Bowden] Okay. Hindi mo dapat gawin ito. Ito ay masama. 64 00:05:48,480 --> 00:05:59,480 Tingin ko Nakita ko sa mga slide ng panayam Sinimulan mo nakikita ang buong diagram ng memory 65 00:05:59,480 --> 00:06:02,880 kung saan up dito mayroon kang memory address 0 66 00:06:02,880 --> 00:06:09,550 at pababa dito mayroon kang address ng memorya 4 gig o 2 sa 32. 67 00:06:09,550 --> 00:06:15,120 Kaya pagkatapos ay mayroon kang ilang mga bagay-bagay at ilang mga bagay-bagay at pagkatapos ay ang iyong stack 68 00:06:15,120 --> 00:06:21,780 at mayroon ka iyong magbunton, kung saan mo lamang makapagsimula sa pag-aaral tungkol sa, lumalaking up. 69 00:06:21,780 --> 00:06:24,390 [Mag-aaral] Ay hindi ang magbunton sa itaas ng stack? 70 00:06:24,390 --> 00:06:27,760 >> Oo. Magbunton sa itaas, hindi ito? >> [Mag-aaral] Well, ilagay siya ng 0 sa itaas. 71 00:06:27,760 --> 00:06:30,320 [Mag-aaral] Oh, siya ilagay 0 sa tuktok. >> [Mag-aaral] Oh, okay. 72 00:06:30,320 --> 00:06:36,060 Disclaimer: Saanman may CS50 ka pagpunta upang makita ito sa ganitong paraan. >> [Mag-aaral] Okay. 73 00:06:36,060 --> 00:06:40,290 Lang na kapag unang nakakakita ka ng mga stack, 74 00:06:40,290 --> 00:06:45,000 bang kapag sa tingin mo ng isang stack na sa tingin mo ng stacking ng mga bagay sa tuktok ng isa't isa. 75 00:06:45,000 --> 00:06:50,810 Kaya malamang namin upang i-flip ito sa paligid upang stack ay lumalaking tulad ng stack ng karaniwan mong ginagawa 76 00:06:50,810 --> 00:06:55,940 sa halip ng stack lawit. >> [Mag-aaral] Huwag tambak technically lumaki masyadong, bagaman? 77 00:06:55,940 --> 00:07:01,100 Depende sa kung ano ang ibig sabihin sa iyo sa pamamagitan ng lumaki. 78 00:07:01,100 --> 00:07:04,010 Ang stack at magbunton palaging paglaki sa mga tapat na mga direksyon. 79 00:07:04,010 --> 00:07:09,420 Stack ay palaging lumalagong sa kamalayan na ito lumalagong up 80 00:07:09,420 --> 00:07:12,940 patungo sa mas mataas na memory address, at ang magbunton ay lumalaking pababa 81 00:07:12,940 --> 00:07:17,260 na ito lumalaking patungo sa mas mababang address memory. 82 00:07:17,260 --> 00:07:20,250 Kaya itaas ay 0 at ibaba ang mataas na memory address. 83 00:07:20,250 --> 00:07:26,390 Sila ay parehong lumalagong, lamang sa paghadlang direksyon. 84 00:07:26,390 --> 00:07:29,230 [Mag-aaral] ko lang nilalayong na dahil sinabi mo inilagay mo stack sa ibaba 85 00:07:29,230 --> 00:07:33,640 dahil mukhang mas madaling maunawaan dahil para sa stack sa magsimula sa tuktok ng magbunton, 86 00:07:33,640 --> 00:07:37,520 magbunton sa tuktok ng mismong masyadong, kaya that's - >> Oo. 87 00:07:37,520 --> 00:07:44,960 Mo ring tingin ng magbunton bilang lumalaking up at mas malaki, ngunit ang stack mas kaya. 88 00:07:44,960 --> 00:07:50,280 Kaya ang stack namin uri ng nais na ipakita ang lumalaking up. 89 00:07:50,280 --> 00:07:55,390 Ngunit lahat ng dako titingnan mo kung hindi man ay upang ipakita ang address 0 sa tuktok 90 00:07:55,390 --> 00:07:59,590 at ang pinakamataas na memory address sa ibaba, kaya ito ay ang iyong karaniwang view ng memorya. 91 00:07:59,590 --> 00:08:02,100 >> Mayroon ba kayong isang tanong? 92 00:08:02,100 --> 00:08:04,270 [Mag-aaral] Maaari mo bang sabihin sa amin ang higit pa tungkol sa magbunton? 93 00:08:04,270 --> 00:08:06,180 Oo. Ako makakakuha ng sa isang segundo. 94 00:08:06,180 --> 00:08:12,220 Una, ang pagpunta pabalik sa kung bakit bumabalik at y ay isang masamang bagay, 95 00:08:12,220 --> 00:08:18,470 sa stack mayroon ka ng isang bungkos ng mga frame stack na kumakatawan sa lahat ng mga pag-andar 96 00:08:18,470 --> 00:08:20,460 na tinatawag. 97 00:08:20,460 --> 00:08:27,990 Kaya sa pagbalewala sa ng mga nakaraang mga bagay, sa tuktok ng iyong stack ay palaging na ang pangunahing function na 98 00:08:27,990 --> 00:08:33,090 dahil na unang function na tinatawag. 99 00:08:33,090 --> 00:08:37,130 At pagkatapos ay kapag tumawag ka ng isa pang function na, stack ang binabalak na palaguin ang. 100 00:08:37,130 --> 00:08:41,640 Kaya kung tumawag ako ng ilang function, foo, at ito ay nakakakuha ng sarili nitong stack frame, 101 00:08:41,640 --> 00:08:47,280 maaari itong tumawag ilang function, bar, ito ay nakakakuha ng sarili nitong stack frame. 102 00:08:47,280 --> 00:08:49,840 At bar ay maaaring recursive at maaaring tumawag mismo, 103 00:08:49,840 --> 00:08:54,150 at sa gayon ay ang pangalawang tawag sa bar upang makakuha ng sarili nitong stack frame. 104 00:08:54,150 --> 00:08:58,880 At kaya kung ano ang napupunta sa mga frame ng stack ang lahat ng lokal na mga variable 105 00:08:58,880 --> 00:09:03,450 at ang lahat ng mga argumento ng function na na - 106 00:09:03,450 --> 00:09:08,730 Anumang bagay na lokal scoped na ito function na pumunta sa mga frame ng stack. 107 00:09:08,730 --> 00:09:21,520 Kaya nangangahulugan iyon na kapag sinabi ko ang isang bagay tulad ng bar ay isang function, 108 00:09:21,520 --> 00:09:29,270 Lang ako na idedeklara ang isang integer at pagkatapos ay ibalik ang isang pointer na integer. 109 00:09:29,270 --> 00:09:33,790 Kaya kung saan ay y nakatira? 110 00:09:33,790 --> 00:09:36,900 [Mag-aaral] y nakatira sa bar. >> [Bowden] Oo. 111 00:09:36,900 --> 00:09:45,010 Sa isang lugar sa maliit na plaza ng memorya ay isang littler parisukat na may y sa loob nito. 112 00:09:45,010 --> 00:09:53,370 Kapag bumalik ako & y, ako bumabalik ng pointer sa maliit na bloke ng memorya. 113 00:09:53,370 --> 00:09:58,400 Ngunit kapag ang isang function babalik, ang stack frame ay makakakuha ng pop-off ang stack ang. 114 00:10:01,050 --> 00:10:03,530 At iyon ang dahilan kung bakit ito ay tinatawag na stack. 115 00:10:03,530 --> 00:10:06,570 Ito ay tulad ng istraktura ng data ng stack, kung alam mo kung ano na. 116 00:10:06,570 --> 00:10:11,580 O kahit na tulad ng isang stack ng mga trays ay laging Halimbawa, 117 00:10:11,580 --> 00:10:16,060 pangunahing ay upang pumunta sa ibaba, pagkatapos ay ang unang function na tawagan ka upang pumunta sa tuktok ng na, 118 00:10:16,060 --> 00:10:20,400 at hindi ka maaaring makakuha ng pabalik sa pangunahing hanggang sa bumalik ka mula sa lahat ng mga function na ay tinatawag na 119 00:10:20,400 --> 00:10:22,340 na nakalagay sa itaas nito. 120 00:10:22,340 --> 00:10:28,650 >> [Mag-aaral] Kaya kung ginawa mo ibalik ang & ya, ang halaga na ay sakop upang baguhin nang walang abiso. 121 00:10:28,650 --> 00:10:31,290 Oo, it's - >> [mag-aaral] Maaaring ito ay mapapatungan. >> Oo. 122 00:10:31,290 --> 00:10:34,660 Ito ay ganap - Kung sinubukan mong at - 123 00:10:34,660 --> 00:10:38,040 Ito ay isang int * bar dahil ito ay nagbabalik ng isang pointer, 124 00:10:38,040 --> 00:10:41,310 kaya ang kanyang return uri int *. 125 00:10:41,310 --> 00:10:46,500 Kung sinusubukan mong gamitin ang return halaga ng mga function na ito, ito ay hindi natukoy na pag-uugali 126 00:10:46,500 --> 00:10:51,770 dahil ang pointer na mga punto sa masamang memory. >> [Mag-aaral] Okay. 127 00:10:51,770 --> 00:11:01,250 Kaya kung ano kung, halimbawa, ipinahayag int * y = malloc (sizeof (int))? 128 00:11:01,250 --> 00:11:03,740 Iyon ay mas mahusay. Oo. 129 00:11:03,740 --> 00:11:07,730 [Mag-aaral] uusapang namin tungkol sa kung paano kapag namin i-drag ang mga bagay sa aming recycle bin 130 00:11:07,730 --> 00:11:11,750 hindi sila aktwal na mabubura; lang namin mawala ang kanilang mga payo. 131 00:11:11,750 --> 00:11:15,550 Kaya sa kasong ito namin aktwal burahin ang halaga o ito pa rin doon sa memory? 132 00:11:15,550 --> 00:11:19,130 Para sa nakararaming bahagi, ito pa rin doon. 133 00:11:19,130 --> 00:11:24,220 Ngunit sabihin nating namin mangyari sa tumawag sa ilang iba pang mga function, baz. 134 00:11:24,220 --> 00:11:28,990 Baz ay pagpunta upang makakuha ng sarili nitong stack frame sa dito. 135 00:11:28,990 --> 00:11:31,470 Ito na Sasapawan nito ang lahat ng ito bagay, 136 00:11:31,470 --> 00:11:34,180 at pagkatapos ay kung ikaw mamaya subukan at gamitin ang pointer na ba kayong bago, 137 00:11:34,180 --> 00:11:35,570 hindi ito pagpunta sa parehong halaga. 138 00:11:35,570 --> 00:11:38,150 Ito ay pagpunta sa ay nagbago dahil ikaw lamang tinatawag na pag-andar baz. 139 00:11:38,150 --> 00:11:43,080 [Mag-aaral] Ngunit ay hindi namin, pa rin namin makakuha ng 3? 140 00:11:43,080 --> 00:11:44,990 [Bowden] Sa lahat ng posibilidad, gagawin mo. 141 00:11:44,990 --> 00:11:49,670 Ngunit hindi ka maaaring umasa sa na. Sabi lang ng C hindi natukoy na pag-uugali. 142 00:11:49,670 --> 00:11:51,920 >> [Mag-aaral] Oh, ginagawa nito. Okay. 143 00:11:51,920 --> 00:11:58,190 Kaya kapag gusto mong ibalik ang isang pointer, ito ay kung saan malloc ay ginagamit. 144 00:12:00,930 --> 00:12:15,960 Sumulat ako aktwal na lamang bumalik malloc (3 * sizeof (int)). 145 00:12:17,360 --> 00:12:24,050 Susubukan naming pumunta sa paglipas ng malloc higit pa sa isang segundo, ngunit ang ideya ng malloc ay sa lahat ng iyong lokal na variable 146 00:12:24,050 --> 00:12:26,760 laging pumunta sa stack. 147 00:12:26,760 --> 00:12:31,570 Anumang bagay na malloced napupunta sa magbunton, at ito magpakailanman at palaging sa magbunton 148 00:12:31,570 --> 00:12:34,490 hanggang sa tahasan mong magbakante ito. 149 00:12:34,490 --> 00:12:42,130 Kaya ito ay nangangahulugan na kapag malloc ka ng isang bagay, ito ay upang mabuhay matapos ang return ng function na. 150 00:12:42,130 --> 00:12:46,800 [Mag-aaral] ito nakataguyod makalipas ang pagkatapos Humihinto ang programa tumatakbo? >> No. 151 00:12:46,800 --> 00:12:53,180 Okay, kaya ang nangyayari doon hanggang ang programa ay tapos na ang lahat ng paraan sa pagtakbo. >> Oo. 152 00:12:53,180 --> 00:12:57,510 Maaari naming pumunta sa paglipas ng mga detalye ng kung ano ang mangyayari kapag Humihinto ang programa tumatakbo. 153 00:12:57,510 --> 00:13:02,150 Maaaring kailanganin mong ipaalala sa akin, ngunit iyon ay isang hiwalay na bagay. 154 00:13:02,150 --> 00:13:04,190 [Mag-aaral] Kaya malloc lumilikha ng pointer? >> Oo. 155 00:13:04,190 --> 00:13:13,030 Malloc - >> [mag-aaral] tingin ko malloc designates isang bloke ng memorya na ang pointer ng maaaring gamitin. 156 00:13:15,400 --> 00:13:19,610 [Bowden] gusto ko na diagram muli. >> [Mag-aaral] Kaya gumagana ang function na ito, bagaman? 157 00:13:19,610 --> 00:13:26,430 [Mag-aaral] Oo, malloc designates isang bloke ng memorya na maaari mong gamitin, 158 00:13:26,430 --> 00:13:30,470 at pagkatapos ay nagbalik ang address ng unang bloke ng memorya na. 159 00:13:30,470 --> 00:13:36,750 >> [Bowden] Oo. Kaya kapag ikaw malloc, ka daklot ilang bloke ng memorya 160 00:13:36,750 --> 00:13:38,260 na kasalukuyang sa magbunton. 161 00:13:38,260 --> 00:13:43,040 Kung ang magbunton ay masyadong maliit, magbunton ang lamang pagpunta upang lumago, at ito ay lumalaki sa direksyon. 162 00:13:43,040 --> 00:13:44,650 Kaya sabihin nating magbunton ay masyadong maliit. 163 00:13:44,650 --> 00:13:49,960 Pagkatapos ito ay tungkol sa upang mapalago ang ilang sandali at magbalik ng pointer sa block na ito na lamang lumago. 164 00:13:49,960 --> 00:13:55,130 Kapag ikaw libreng mga bagay-bagay, nagsasagawa ka ng higit pang mga kuwarto sa magbunton, 165 00:13:55,130 --> 00:14:00,030 kaya pagkatapos ng mamaya tumawag sa malloc maaaring muling gamitin na memory na dati mo ay napalaya. 166 00:14:00,030 --> 00:14:09,950 Ang mahalagang bagay tungkol sa malloc at libreng na ito ay nagbibigay sa iyo ng kumpletong kontrol 167 00:14:09,950 --> 00:14:12,700 sa ibabaw ng buhay ng mga bloke ng memorya. 168 00:14:12,700 --> 00:14:15,420 Pangkalahatang variable ay palaging buhay. 169 00:14:15,420 --> 00:14:18,500 Lokal na mga variable ay buhay sa loob ng kanilang mga saklaw. 170 00:14:18,500 --> 00:14:22,140 Sa lalong madaling pumunta nakaraang isang kulot suhay, ang mga lokal na variable ay patay. 171 00:14:22,140 --> 00:14:28,890 Malloced memory ay buhay kapag gusto mo ito sa buhay 172 00:14:28,890 --> 00:14:33,480 at pagkatapos ay inilabas kapag ikaw ay sabihin dito ay ilalabas. 173 00:14:33,480 --> 00:14:38,420 Yaong mga aktwal na lamang ang 3 uri ng memorya, talagang. 174 00:14:38,420 --> 00:14:41,840 May awtomatikong memory pamamahala, na kung saan ay ang stack. 175 00:14:41,840 --> 00:14:43,840 Mga bagay-bagay mangyari para sa iyo awtomatikong. 176 00:14:43,840 --> 00:14:46,910 Kapag sinabi mong int x, memory ay inilaan para sa mga int x. 177 00:14:46,910 --> 00:14:51,630 Kapag pupunta ng x ng saklaw, memory ay reclaim para sa x. 178 00:14:51,630 --> 00:14:54,790 Pagkatapos may dynamic memory pamamahala, na kung ano ang malloc ay, 179 00:14:54,790 --> 00:14:56,740 na kapag mayroon kang kontrol. 180 00:14:56,740 --> 00:15:01,290 Dynamic kang magpasya kapag memory dapat at hindi dapat na inilalaan. 181 00:15:01,290 --> 00:15:05,050 At pagkatapos ay may static, kung saan ay nangangahulugan lamang na ito nakatira magpakailanman, 182 00:15:05,050 --> 00:15:06,610 na kung ano ang pangkalahatang variable. 183 00:15:06,610 --> 00:15:10,240 Hindi lang nila palagi sa memory. 184 00:15:10,960 --> 00:15:12,760 >> Mga tanong? 185 00:15:14,490 --> 00:15:17,230 [Mag-aaral] Maaari mong tukuyin ang isang bloke lamang sa pamamagitan ng paggamit ng mga kulot tirante 186 00:15:17,230 --> 00:15:21,220 ngunit hindi kinakailangang magkaroon ng isang kung statement o habang pahayag o anumang bagay tulad na? 187 00:15:21,220 --> 00:15:29,130 Maaari mong tukuyin ang isang bloke sa isang function, ngunit na may kulot tirante masyadong. 188 00:15:29,130 --> 00:15:32,100 [Mag-aaral] Kaya hindi lamang mo maaaring magkaroon ng tulad ng isang random na pares ng mga kulot tirante sa iyong code 189 00:15:32,100 --> 00:15:35,680 na may lokal na mga variable? >> Oo, maaari mong. 190 00:15:35,680 --> 00:15:45,900 Inside ng int bar kami {int y = 3;}. 191 00:15:45,900 --> 00:15:48,440 Na dapat dito mismo. 192 00:15:48,440 --> 00:15:52,450 Ngunit ganap na tumutukoy sa saklaw ng int y. 193 00:15:52,450 --> 00:15:57,320 Pagkatapos na pangalawang kulot suhay, y hindi maaaring gamitin ito. 194 00:15:57,910 --> 00:16:00,630 Mo halos hindi kailanman gawin iyon, bagaman. 195 00:16:02,940 --> 00:16:07,370 Pagbalik sa kung ano ang mangyayari kapag nagtatapos ang isang programa, 196 00:16:07,370 --> 00:16:18,760 may uri ng isang maling kuru-kuro / kalahati kasinungalingan na bigyan kami upang lamang gumawa ng mga bagay madali. 197 00:16:18,760 --> 00:16:24,410 Sabihin namin sa iyo na kapag maglaan ka ng memory 198 00:16:24,410 --> 00:16:29,860 ka paglaan ng ilang tipak ng RAM para sa variable na. 199 00:16:29,860 --> 00:16:34,190 Ngunit hindi ka talagang direkta pagpindot RAM kailanman sa iyong mga programa. 200 00:16:34,190 --> 00:16:37,490 Kung sa tingin mo nito, kung paano ko ginamit - 201 00:16:37,490 --> 00:16:44,330 At aktwal na, kung pumunta ka sa pamamagitan ng sa GDB makikita mo makita ang mga parehong bagay. 202 00:16:51,120 --> 00:16:57,590 Hindi alintana kung gaano karaming beses patakbuhin mo ang iyong programa o kung ano ang program nagpapatakbo ka, 203 00:16:57,590 --> 00:16:59,950 stack ay palaging pagpunta upang magsimula - 204 00:16:59,950 --> 00:17:06,510 Palagi ka upang makita ang mga variable sa paligid address oxbffff isang bagay. 205 00:17:06,510 --> 00:17:09,470 Ito ay karaniwang isang lugar sa rehiyon na iyon. 206 00:17:09,470 --> 00:17:18,760 Ngunit paano 2 programa posibleng may mga payo sa parehong memorya? 207 00:17:20,640 --> 00:17:27,650 [Mag-aaral] May ilang arbitrary pagtatalaga ng kung saan oxbfff ay dapat sa RAM 208 00:17:27,650 --> 00:17:31,320 na maaaring tunay na sa iba't-ibang lugar depende sa kapag ang function ay tinatawag na. 209 00:17:31,320 --> 00:17:35,920 Oo. Termino virtual memory. 210 00:17:35,920 --> 00:17:42,250 Ang ideya ay na ang bawat solong proseso, ang bawat solong programa na tumatakbo sa iyong computer 211 00:17:42,250 --> 00:17:49,450 ay may sariling - sabihin ipinapalagay 32 bit - ganap na malayang address espasyo. 212 00:17:49,450 --> 00:17:51,590 Ito ang address na espasyo. 213 00:17:51,590 --> 00:17:56,220 Ay may sarili nitong ganap na independiyenteng 4 gigabytes upang gamitin. 214 00:17:56,220 --> 00:18:02,220 >> Kaya kung nagpapatakbo ka ng 2 programa nang sabay-sabay, programang ito ay nakikita ng 4 gigabytes sa sarili nito, 215 00:18:02,220 --> 00:18:04,870 Ang programang ito ay nakikita ng 4 gigabytes sa sarili nito, 216 00:18:04,870 --> 00:18:07,720 at ito ay imposible para sa programang ito sa dereference ng pointer 217 00:18:07,720 --> 00:18:10,920 at nagtatapos sa memorya mula sa programang ito. 218 00:18:10,920 --> 00:18:18,200 At kung ano ang virtual memory ay pagmamapa mula sa isang proseso ng address ng espasyo 219 00:18:18,200 --> 00:18:20,470 sa aktwal na bagay sa RAM. 220 00:18:20,470 --> 00:18:22,940 Kaya hanggang sa iyong operating system upang malaman na, 221 00:18:22,940 --> 00:18:28,080 hey, kapag ito tao oxbfff dereferences pointer, na talagang ay nangangahulugan 222 00:18:28,080 --> 00:18:31,040 na siya gustong RAM byte 1000, 223 00:18:31,040 --> 00:18:38,150 samantalang kung sa programang ito oxbfff dereferences, siya talaga gustong RAM byte 10000. 224 00:18:38,150 --> 00:18:41,590 Maaari silang mang malayo. 225 00:18:41,590 --> 00:18:48,730 Ito ay totoo kahit ng mga bagay sa loob ng isang proseso ng address ng espasyo. 226 00:18:48,730 --> 00:18:54,770 Kaya tulad ng nakikita ang lahat ng 4 gigabytes sa sarili nito, ngunit sabihin nating - 227 00:18:54,770 --> 00:18:57,290 [Mag-aaral] Gumagana ba bawat solong proseso - 228 00:18:57,290 --> 00:19:01,350 Sabihin nating mayroon kang isang computer na may 4 gigabytes lamang ng RAM. 229 00:19:01,350 --> 00:19:06,430 Ba ang bawat solong proseso makita ang buong 4 gigabytes? >> Oo. 230 00:19:06,430 --> 00:19:13,060 Ngunit ang 4 gigabytes ito nakikita ay isang kasinungalingan. 231 00:19:13,060 --> 00:19:20,460 Lamang ito sa tingin nito ay ito ay ang lahat ng ito memory dahil hindi nito malalaman anumang iba pang mga proseso umiiral. 232 00:19:20,460 --> 00:19:28,140 Ito ay lamang gamitin ng mas maraming memory bilang aktwal na ito ay kailangang. 233 00:19:28,140 --> 00:19:32,340 Ang operating system ay hindi upang bigyan ng RAM sa prosesong ito 234 00:19:32,340 --> 00:19:35,750 kung hindi pa ito gamit ang anumang memory sa buong rehiyon na ito. 235 00:19:35,750 --> 00:19:39,300 Hindi ito upang bigyan ito ng memory para sa rehiyon na iyon. 236 00:19:39,300 --> 00:19:54,780 Ngunit ang ideya ay na - ako sinusubukang mag-isip ng - Hindi ako makapag-isip ng isang pagkakatulad. 237 00:19:54,780 --> 00:19:56,780 Analogies ay mahirap. 238 00:19:57,740 --> 00:20:02,700 Isa ng ang mga isyu ng virtual memory o isa ng mga bagay na ito paglutas 239 00:20:02,700 --> 00:20:06,810 ay ang proseso ay dapat na ganap na alam ng isa't isa. 240 00:20:06,810 --> 00:20:12,140 At sa gayon ay maaari mong magsulat ng anumang programa na lamang dereferences anumang pointer, 241 00:20:12,140 --> 00:20:19,340 gusto magsulat lamang ng programa na nagsasabing * (ox1234), 242 00:20:19,340 --> 00:20:22,890 at iyon ang dereferencing memory address 1234. 243 00:20:22,890 --> 00:20:28,870 >> Subalit hanggang sa operating system pagkatapos isalin ang mga kung ano ang 1234 ay nangangahulugan. 244 00:20:28,870 --> 00:20:33,960 Kaya kung 1234 ang mangyayari na maging isang wastong address ng memory para sa prosesong ito, 245 00:20:33,960 --> 00:20:38,800 tulad ng ito ay sa stack o isang bagay, pagkatapos ito ay ibalik ang halaga ng memorya na address 246 00:20:38,800 --> 00:20:41,960 kasing layo ng proseso alam. 247 00:20:41,960 --> 00:20:47,520 Ngunit kung 1234 ay hindi isang wastong address, tulad ng mangyayari para mapunta 248 00:20:47,520 --> 00:20:52,910 sa ilang maliit na bahagi ng memory dito na higit sa stack at higit sa magbunton 249 00:20:52,910 --> 00:20:57,200 at hindi mo talagang ginagamit na, pagkatapos na kapag ikaw ay makakuha ng mga bagay tulad ng segfaults 250 00:20:57,200 --> 00:21:00,260 dahil ka pagpindot ng memorya na hindi mo dapat na nakadikit. 251 00:21:07,180 --> 00:21:09,340 Totoo rin ito - 252 00:21:09,340 --> 00:21:15,440 Ang isang 32-bit na sistema, 32 bit nangangahulugan na mayroon kang 32 bit upang tukuyin ang isang address ng memorya. 253 00:21:15,440 --> 00:21:22,970 Ito ay kung bakit ang mga payo ay 8 bytes dahil 32 bit 8 bytes - o 4 bytes. 254 00:21:22,970 --> 00:21:25,250 Payo 4 bytes. 255 00:21:25,250 --> 00:21:33,680 Kaya kapag nakita mo ang isang pointer tulad oxbfffff, na - 256 00:21:33,680 --> 00:21:40,080 Sa loob ng anumang ibinigay na programa, maaari mo lamang bumuo ng iba pang arbitrary pointer, 257 00:21:40,080 --> 00:21:46,330 kahit saan mula ox0 sa baka 8 f's - ffffffff. 258 00:21:46,330 --> 00:21:49,180 [Mag-aaral] ba Hindi sinabi mong sila 4 bytes? >> Oo. 259 00:21:49,180 --> 00:21:52,730 [Mag-aaral] Pagkatapos byte bawat isa ay may - >> [Bowden] hexadecimal. 260 00:21:52,730 --> 00:21:59,360 Hexadecimal - 5, 6, 7, 8. Kaya payo ka laging makita sa hexadecimal. 261 00:21:59,360 --> 00:22:01,710 Lang kung paano namin uri-uriin ang mga payo. 262 00:22:01,710 --> 00:22:05,240 Bawat 2 digit ng hexadecimal ay 1 byte. 263 00:22:05,240 --> 00:22:09,600 Kaya mayroong 8 hexadecimal digit para sa 4 bytes. 264 00:22:09,600 --> 00:22:14,190 Kaya ang bawat isang pointer sa isang 32-bit na sistema ay pagpunta sa 4 bytes, 265 00:22:14,190 --> 00:22:18,550 na nangangahulugan na sa iyong proseso maaari kang bumuo ng anumang arbitrary 4 bytes 266 00:22:18,550 --> 00:22:20,550 at gumawa ng isang pointer nito, 267 00:22:20,550 --> 00:22:32,730 na nangangahulugan na ang bilang malayo bilang ito ang kamalayan, maaari itong matugunan ang isang buong 2 sa 32 bytes ng memorya. 268 00:22:32,730 --> 00:22:34,760 Kahit na ito ay hindi talagang magkaroon ng access sa, 269 00:22:34,760 --> 00:22:40,190 kahit na kung ang iyong computer lamang ay may 512 megabytes, sa tingin nito ay may ganoong karaming memory. 270 00:22:40,190 --> 00:22:44,930 At operating system na smart sapat na ito lamang magtalaga ng kung ano ang iyong aktwal na kailangan. 271 00:22:44,930 --> 00:22:49,630 Hindi ito pumunta lamang, oh, isang bagong proseso: 4 gig. 272 00:22:49,630 --> 00:22:51,930 >> Oo. >> [Mag-aaral] Ano ang ginagawa ng baka ang ibig sabihin nito? Bakit ka magsulat ang mga ito? 273 00:22:51,930 --> 00:22:54,980 Ito ay ang simbolo para sa hexadecimal. 274 00:22:54,980 --> 00:22:59,590 Kapag nakita mo ang isang numero ng panimula sa baka, ang mga sunud-sunod na mga bagay ay hexadecimal. 275 00:23:01,930 --> 00:23:05,760 [Mag-aaral] ay nagpapaliwanag tungkol sa kung ano ang mangyayari kapag nagtatapos ang isang programa. >> Oo. 276 00:23:05,760 --> 00:23:09,480 Ano ang mangyayari kapag nagtatapos ang isang programa ang operating system 277 00:23:09,480 --> 00:23:13,600 lamang Buburahin sa pagmamapa na ito para sa mga address na ito, at na ito. 278 00:23:13,600 --> 00:23:17,770 Ang operating system ay maaari na ngayong lamang bigyan na memory sa ibang program ang gagamitin. 279 00:23:17,770 --> 00:23:19,490 [Mag-aaral] Okay. 280 00:23:19,490 --> 00:23:24,800 Kaya kapag maglaan ka ng isang bagay sa magbunton o ang stack o pangkalahatang variable o anumang, 281 00:23:24,800 --> 00:23:27,010 lahat sila lamang mawala sa lalong madaling ang programa ay nagtatapos 282 00:23:27,010 --> 00:23:32,120 dahil ang operating system na ngayon ang libreng upang bigyan na memory sa anumang iba pang mga proseso. 283 00:23:32,120 --> 00:23:35,150 [Mag-aaral] Kahit na ay marahil pa rin halaga na nakasulat sa? >> Oo. 284 00:23:35,150 --> 00:23:37,740 Ang mga halaga ay malamang pa rin doon. 285 00:23:37,740 --> 00:23:41,570 Lamang ito ito ay mahirap upang makakuha ng sa kanila. 286 00:23:41,570 --> 00:23:45,230 Ito ay mas mahirap upang makakuha ng sa kanila kaysa ito ay upang makakuha ng sa isang tinanggal na file 287 00:23:45,230 --> 00:23:51,450 dahil ang tinanggal na file ng uri ng makikita doon para sa isang mahabang panahon at hard drive ng maraming mas malaking. 288 00:23:51,450 --> 00:23:54,120 Kaya patungan ang mga iba't-ibang bahagi ng memorya 289 00:23:54,120 --> 00:23:58,640 bago ito mangyayari patungan ang mga tipak ng memorya na file na ginagamit sa. 290 00:23:58,640 --> 00:24:04,520 Ngunit ang pangunahing memorya, RAM, umikot sa pamamagitan ng maraming mas mabilis, 291 00:24:04,520 --> 00:24:08,040 kaya napaka mabilis na-o-overwrite. 292 00:24:10,300 --> 00:24:13,340 Mga tanong na ito o anumang bagay? 293 00:24:13,340 --> 00:24:16,130 [Mag-aaral] Mayroon akong tanong tungkol sa isang iba't ibang mga paksa. >> Okay. 294 00:24:16,130 --> 00:24:19,060 Ba ang sinuman tanong na ito? 295 00:24:20,170 --> 00:24:23,120 >> Okay. Iba't ibang paksa. >> [Mag-aaral] Okay. 296 00:24:23,120 --> 00:24:26,550 Ako pagpunta sa pamamagitan ng ilang ng ang mga pagsubok ng kasanayan, 297 00:24:26,550 --> 00:24:30,480 at sa isa sa mga ito ay pakikipag-usap tungkol sa sizeof 298 00:24:30,480 --> 00:24:35,630 at ang halaga na ito ay nagbabalik o ibang mga variable na uri. >> Oo. 299 00:24:35,630 --> 00:24:45,060 At sinabi na parehong int at mahabang parehong return 4, kaya sila parehong 4 bytes mahaba. 300 00:24:45,060 --> 00:24:48,070 Mayroon bang anumang pagkakaiba sa pagitan ng isang int at isang mahabang, o ito ang parehong bagay? 301 00:24:48,070 --> 00:24:50,380 Oo, ang isang pagkakaiba. 302 00:24:50,380 --> 00:24:52,960 Ang C standard - 303 00:24:52,960 --> 00:24:54,950 Marahil ako pagpunta sa gulo up. 304 00:24:54,950 --> 00:24:58,800 Ang C karaniwang ay tulad lamang ng kung ano ang C ay, ang opisyal na dokumentasyon ng C. 305 00:24:58,800 --> 00:25:00,340 Ito ay kung ano ang nakasulat. 306 00:25:00,340 --> 00:25:08,650 Kaya ang C sabi lang ng standard na ang isang pansamantalang trabaho ay magpakailanman at laging 1 byte. 307 00:25:10,470 --> 00:25:19,040 Lahat pagkatapos na - isang maikling ay laging lamang tinukoy bilang mas malaki kaysa sa o katumbas sa isang pansamantalang trabaho. 308 00:25:19,040 --> 00:25:23,010 Maaaring ito ay mahigpit na mas malaki kaysa sa, ngunit hindi positibo. 309 00:25:23,010 --> 00:25:31,940 Int isang tinukoy bilang mas malaki kaysa sa o katumbas sa isang maikling. 310 00:25:31,940 --> 00:25:36,210 At ng mahabang ay lamang tinukoy bilang mas malaki kaysa sa o katumbas sa isang int. 311 00:25:36,210 --> 00:25:41,600 At isang mahaba mahaba ay mas malaki kaysa sa o katumbas sa isang mahabang. 312 00:25:41,600 --> 00:25:46,610 Kaya ang tanging bagay na ang C karaniwang tumutukoy ang mga kamag-anak na pagkakasunud-sunod ng lahat. 313 00:25:46,610 --> 00:25:54,880 Ang aktwal na halaga ng memorya na bagay tumagal ng hanggang sa pangkalahatan hanggang sa pagpapatupad, 314 00:25:54,880 --> 00:25:57,640 ngunit ito medyo mahusay na tinukoy sa puntong ito. >> [Mag-aaral] Okay. 315 00:25:57,640 --> 00:26:02,490 Kaya shorts ay halos palaging pagpunta sa 2 bytes. 316 00:26:04,920 --> 00:26:09,950 Ints ay halos palaging pagpunta sa 4 bytes. 317 00:26:12,070 --> 00:26:15,340 Long longs halos palaging pagpunta sa 8 bytes. 318 00:26:17,990 --> 00:26:23,160 At longs, ito ay depende sa kung gumagamit ka ng isang 32-bit o 64-bit system. 319 00:26:23,160 --> 00:26:27,450 Kaya isang mahabang tumutugma sa uri ng sistema. 320 00:26:27,450 --> 00:26:31,920 Kung gumagamit ka ng isang 32-bit na system tulad ng sa Appliance, ito na 4 bytes. 321 00:26:34,530 --> 00:26:42,570 Kung gumagamit ka ng 64-bit na tulad ng maraming kamakailang mga computer, ito ay pagpunta sa 8 bytes. 322 00:26:42,570 --> 00:26:45,230 >> Ints ay halos palaging 4 na bytes sa puntong ito. 323 00:26:45,230 --> 00:26:47,140 Long longs halos palaging 8 bytes. 324 00:26:47,140 --> 00:26:50,300 Sa nakaraan, ang mga ints ginamit lamang 2 bytes. 325 00:26:50,300 --> 00:26:56,840 Ngunit mapansin na ito ay ganap na natutugunan ang lahat ng mga relasyon na ito na mas malaki kaysa sa at pantay-pantay sa. 326 00:26:56,840 --> 00:27:01,280 Kaya mahaba ang perpektong pinapayagan ang parehong laki bilang isang integer, 327 00:27:01,280 --> 00:27:04,030 at din ito pinapayagan na ang parehong laki bilang isang mahabang mahaba. 328 00:27:04,030 --> 00:27:11,070 At ito lamang kaya ang mangyayari sa 99.999% ng system, ito ay katumbas ng 329 00:27:11,070 --> 00:27:15,800 alinman sa isang int o ng mahabang mahaba. Ito lamang ay depende sa 32-bit o 64-bit. >> [Mag-aaral] Okay. 330 00:27:15,800 --> 00:27:24,600 Sa kamay, kung paano ang decimal point na itinalaga sa mga tuntunin ng bit? 331 00:27:24,600 --> 00:27:27,160 Gusto bilang binary? >> Oo. 332 00:27:27,160 --> 00:27:30,570 Hindi mo na kailangang malaman na para sa CS50. 333 00:27:30,570 --> 00:27:32,960 Hindi mo na matuto na sa 61. 334 00:27:32,960 --> 00:27:37,350 Hindi ka matuto na talagang sa anumang kurso. 335 00:27:37,350 --> 00:27:42,740 Ito ay isang representasyon. 336 00:27:42,740 --> 00:27:45,440 Nakalimutan ko ang eksaktong bit allotments. 337 00:27:45,440 --> 00:27:53,380 Ang ideya ng lumulutang point na maglaan ka ng isang tiyak na bilang ng mga bits upang kumatawan - 338 00:27:53,380 --> 00:27:56,550 Talaga, ang lahat ay sa pagtatandang siyentipiko. 339 00:27:56,550 --> 00:28:05,600 Kaya maglaan ka ng isang tiyak na bilang ng mga bits kumakatawan sa bilang mismo, tulad ng 1.2345. 340 00:28:05,600 --> 00:28:10,200 Hindi ko maaaring kumakatawan sa isang numero na may higit pang mga digit sa 5. 341 00:28:12,200 --> 00:28:26,300 Pagkatapos ka ring magtalaga ng isang tiyak na bilang ng mga bits upang ito ay may kaugaliang tulad ng 342 00:28:26,300 --> 00:28:32,810 maaari ka lamang pumunta up sa isang tiyak na numero, tulad na ang pinakamalaking exponent maaari kang magkaroon ng, 343 00:28:32,810 --> 00:28:36,190 at maaari ka lamang pumunta down sa isang tiyak na exponent, 344 00:28:36,190 --> 00:28:38,770 gusto na ang pinakamaliit na exponent maaari kang magkaroon ng. 345 00:28:38,770 --> 00:28:44,410 >> Hindi ko matandaan ang eksaktong paraan bits ay itinalaga sa lahat ng mga halagang ito, 346 00:28:44,410 --> 00:28:47,940 ngunit ang isang tiyak na bilang ng mga bits ay nakatuon sa 1.2345, 347 00:28:47,940 --> 00:28:50,930 isa pang tiyak na bilang ng mga bits ay nakatuon sa exponent, 348 00:28:50,930 --> 00:28:55,670 at ito ay lamang na posible na kinakatawan ang isang exponent ng isang tiyak na laki. 349 00:28:55,670 --> 00:29:01,100 [Mag-aaral] At double? Ay na tulad ng isang dagdag na mahaba Float? >> Oo. 350 00:29:01,100 --> 00:29:07,940 Ito ay ang parehong bagay bilang isang Float maliban ngayon gumagamit ka ng 8 bytes sa halip ng 4 bytes. 351 00:29:07,940 --> 00:29:11,960 Ngayon magagawa mong gamitin ang 9 digits o 10 digit, 352 00:29:11,960 --> 00:29:16,630 at ito ay pumunta ng hanggang sa 300 sa halip ng 100. >> [Mag-aaral] Okay. 353 00:29:16,630 --> 00:29:21,550 At sa kamay 4 bytes. >> Oo. 354 00:29:21,550 --> 00:29:27,520 Well, muli, marahil ito ay depende pangkalahatang sa pangkalahatang pagpapatupad, 355 00:29:27,520 --> 00:29:30,610 ngunit sa kamay 4 bytes, Doubles ay 8. 356 00:29:30,610 --> 00:29:33,440 Doubles ay tinatawag na double dahil ang mga ito ay double ang laki ng mga kamay. 357 00:29:33,440 --> 00:29:38,380 [Mag-aaral] Okay. At doon ay double doubles? >> Hindi. 358 00:29:38,380 --> 00:29:43,660 Tingin ko - >> [mag-aaral] Tulad ng mahabang longs? >> Oo. Hindi sa tingin ko. Oo. 359 00:29:43,660 --> 00:29:45,950 [Mag-aaral] Sa huling taon ng pagsubok ay may isang katanungan tungkol sa mga pangunahing function na 360 00:29:45,950 --> 00:29:49,490 hindi upang maging bahagi ng iyong programa. 361 00:29:49,490 --> 00:29:52,310 Ang sagot na ito ay hindi upang maging bahagi ng iyong programa. 362 00:29:52,310 --> 00:29:55,100 Sa anong sitwasyon? Kung ano ang nakita ko. 363 00:29:55,100 --> 00:29:59,090 [Bowden] Mukhang - >> [mag-aaral] Ano ang sitwasyon? 364 00:29:59,090 --> 00:30:02,880 Mayroon ba kayong ang problema? >> [Mag-aaral] Oo, maaari ko talagang hilahin ito. 365 00:30:02,880 --> 00:30:07,910 Hindi ito maging, technically, ngunit isa lamang ito upang maging. 366 00:30:07,910 --> 00:30:10,030 [Mag-aaral] Nakita ko isa sa isang iba't ibang mga taon. 367 00:30:10,030 --> 00:30:16,220 Ito ay tulad True o Maling: Isang balidong - >> Oh, isang file c.? 368 00:30:16,220 --> 00:30:18,790 [Mag-aaral] Anumang file c dapat na magkaroon - [parehong nagsasalita nang sabay-sabay - hindi maintindihan] 369 00:30:18,790 --> 00:30:21,120 Okay. Kaya na hiwalay na. 370 00:30:21,120 --> 00:30:26,800 >> Ang isang file na. C kailangang maglaman ng mga function. 371 00:30:26,800 --> 00:30:32,400 Maaari mong ipunin ang isang file sa machine code, binary, anumang, 372 00:30:32,400 --> 00:30:36,620 nang wala ito executable pa. 373 00:30:36,620 --> 00:30:39,420 Isang wastong executable dapat magkaroon ng isang pangunahing function na. 374 00:30:39,420 --> 00:30:45,460 Maaari kang magsulat ng 100 function sa 1 file ngunit walang mga pangunahing 375 00:30:45,460 --> 00:30:48,800 at pagkatapos makatipon na pababa sa binary, 376 00:30:48,800 --> 00:30:54,460 pagkatapos ay isulat mo ng isa pang file na may lamang pangunahing ngunit tawag ng grupo ng mga function 377 00:30:54,460 --> 00:30:56,720 sa binary file sa paglipas dito. 378 00:30:56,720 --> 00:31:01,240 At kaya kapag nagsasagawa ka ng executable, na kung ano ang ginagawa ng linker 379 00:31:01,240 --> 00:31:05,960 ito pinagsasama mga 2 binary file sa isang executable. 380 00:31:05,960 --> 00:31:11,400 Kaya ang isang file na. C ay hindi kailangan upang magkaroon ng isang pangunahing function na sa lahat. 381 00:31:11,400 --> 00:31:19,220 At sa malaking base ng code na makikita mo ang libu-libong ng mga. File c at 1 pangunahing file. 382 00:31:23,960 --> 00:31:26,110 Higit pang mga tanong? 383 00:31:29,310 --> 00:31:31,940 [Mag-aaral] May isa pang tanong. 384 00:31:31,940 --> 00:31:36,710 Ito sinabi gumawa ng isang tagatala. Totoo o Maling? 385 00:31:36,710 --> 00:31:42,030 At ang sagot ay maling, at ko nauunawaan kung bakit ito ay hindi tulad ng kumalatong. 386 00:31:42,030 --> 00:31:44,770 Ngunit ano kami tatawag gumawa ng mga kung ito ay hindi? 387 00:31:44,770 --> 00:31:49,990 Gawing ay isa lamang - Maaari ko bang makita kung ano mismo ang tawag ito. 388 00:31:49,990 --> 00:31:52,410 Ngunit ito lamang tumatakbo ang mga utos. 389 00:31:53,650 --> 00:31:55,650 Gawin. 390 00:31:58,240 --> 00:32:00,870 Ko hilahin ang up na ito. Oo. 391 00:32:10,110 --> 00:32:13,180 Oh, oo. Gawing din ginagawa na. 392 00:32:13,180 --> 00:32:17,170 Sabi ito ang layunin ng utility Magsagawa ng upang matukoy awtomatikong 393 00:32:17,170 --> 00:32:19,610 kung aling mga piraso ng isang malaking programa kailangan na recompiled 394 00:32:19,610 --> 00:32:22,350 at magbigay ng mga utos upang mag-recompile ang mga ito. 395 00:32:22,350 --> 00:32:27,690 Maaari kang gumawa ng gumawa ng mga file na ay talagang malaking. 396 00:32:27,690 --> 00:32:33,210 Gawing tinitingnan ang mga selyo ng oras ng mga file at, tulad ng sinabi namin bago, 397 00:32:33,210 --> 00:32:36,930 maaari mong ipunin ang mga indibidwal na file, at ito ay hindi hanggang sa makakuha ka sa linker 398 00:32:36,930 --> 00:32:39,270 na sila ay magkasama sa isang executable. 399 00:32:39,270 --> 00:32:43,810 Kaya kung mayroon kang 10 iba't ibang mga file at gumawa ka ng pagbabago sa 1 sa kanila, 400 00:32:43,810 --> 00:32:47,870 pagkatapos kung ano ang Magsagawa ng pagpunta sa gawin ay mag-recompile na 1 file 401 00:32:47,870 --> 00:32:50,640 at pagkatapos ay relink lahat ng sama-sama. 402 00:32:50,640 --> 00:32:53,020 Subalit mas dumber kaysa. 403 00:32:53,020 --> 00:32:55,690 Ito ay hanggang sa iyo upang ganap na tukuyin na na kung ano ang dapat ito ginagawa. 404 00:32:55,690 --> 00:32:59,560 Ito sa pamamagitan ng default ay may kakayahang nakikilala ang oras stamp bagay, 405 00:32:59,560 --> 00:33:03,220 ngunit maaari mong magsulat ng isang Magsagawa ng file gawin. 406 00:33:03,220 --> 00:33:09,150 Maaari kang magsulat ng isang gumawa ng file sa gayon ay kapag nag-type ka gawin ito ay cd sa ibang direktoryo. 407 00:33:09,150 --> 00:33:15,560 Ako ay nagsisimula bigo dahil tak ko ang lahat sa loob ng aking Appliance 408 00:33:15,560 --> 00:33:21,740 at pagkatapos ko bang tingnan ang mga PDF mula sa Mac. 409 00:33:21,740 --> 00:33:30,720 >> Kaya pumunta ako sa Finder at Maaari ko Pumunta, Kumonekta sa Server, 410 00:33:30,720 --> 00:33:36,950 at ang server na kumonekta kong ang aking Appliance, at pagkatapos ay ko bang buksan ang PDF 411 00:33:36,950 --> 00:33:40,190 na maipo inipon ng LaTeX. 412 00:33:40,190 --> 00:33:49,320 Ngunit ako ay nagsisimula bigo dahil sa bawat solong oras na kailangan ko upang i-refresh ang PDF, 413 00:33:49,320 --> 00:33:53,900 Mayroon akong upang kopyahin ang mga ito sa isang tukoy na direktoryo na maaaring ma-access ang 414 00:33:53,900 --> 00:33:57,710 at ito ay nakakakuha ng nakakainis. 415 00:33:57,710 --> 00:34:02,650 Kaya sa halip ko nagsulat ng Magsagawa ng file, kung saan mayroon kang upang tukuyin kung paano ito ay gumagawa ng mga bagay. 416 00:34:02,650 --> 00:34:06,130 Paano gumawa ka sa PDF LaTeX. 417 00:34:06,130 --> 00:34:10,090 Tulad ng anumang iba pang mga file Magsagawa ng - o hulaan ko hindi mo pa nakikita ang mga file Magsagawa ng, 418 00:34:10,090 --> 00:34:13,510 ngunit mayroon kaming sa Appliance global na Magsagawa ng file na lang sabi, 419 00:34:13,510 --> 00:34:16,679 kung ikaw ay kino-compile ang isang C file, gamitin ang kumalatong. 420 00:34:16,679 --> 00:34:20,960 At kaya dito sa aking Magsagawa ng file na gumawa ako sinasabi ko, 421 00:34:20,960 --> 00:34:25,020 ang file na ito ay pagpunta sa nais upang ipunin sa PDF LaTeX. 422 00:34:25,020 --> 00:34:27,889 At kaya ito PDF LaTeX na paggawa ng kino-compile ang. 423 00:34:27,889 --> 00:34:31,880 Gawing ay hindi kino-compile. Lamang ito patakbuhin ang mga utos na ito sa ang pagkakasunud-sunod ko tinukoy. 424 00:34:31,880 --> 00:34:36,110 Kaya nagpapatakbo PDF LaTeX, kinokopya ito sa direktoryo Gusto ko ito kinopya sa, 425 00:34:36,110 --> 00:34:38,270 ito cd sa direktoryo at ginagawa ng mga iba pang mga bagay, 426 00:34:38,270 --> 00:34:42,380 ngunit ang lahat ng ginagawa nito ay makilala kapag ng mga pagbabago sa file, 427 00:34:42,380 --> 00:34:45,489 at kung ito ay nagbabago, pagkatapos ito ay patakbuhin ang mga utos na ito ay dapat na tumakbo 428 00:34:45,489 --> 00:34:48,760 kapag ang file pagbabago. >> [Mag-aaral] Okay. 429 00:34:50,510 --> 00:34:54,420 Hindi ko alam kung saan ang pandaigdigang Magsagawa ng file para sa akin upang suriin ito. 430 00:34:57,210 --> 00:35:04,290 Iba pang mga tanong? Anumang bagay mula sa mga nakaraang pagsusulit? Anumang pointer bagay? 431 00:35:06,200 --> 00:35:08,730 May banayad na mga bagay na may mga payo tulad - 432 00:35:08,730 --> 00:35:10,220 Hindi ako pagpunta upang makahanap ng isang tanong sa pagsusulit sa - 433 00:35:10,220 --> 00:35:16,250 ngunit tulad ng ganitong uri ng bagay. 434 00:35:19,680 --> 00:35:24,060 Tiyaking nauunawaan mo na kapag sinabi ko int * x * y - 435 00:35:24,890 --> 00:35:28,130 Ito ay hindi eksakto anuman dito, hulaan ko. 436 00:35:28,130 --> 00:35:32,140 Ngunit tulad ng * x * y, mga 2 variable na sa stack. 437 00:35:32,140 --> 00:35:37,220 Kapag sinabi ko x = malloc (sizeof (int)), x pa rin ang isang variable sa stack, 438 00:35:37,220 --> 00:35:41,180 malloc ilang bloke sa paglipas ng sa magbunton, at nagkakaroon kami ng x punto sa magbunton. 439 00:35:41,180 --> 00:35:43,900 >> Kaya isang bagay sa ang mga puntos ng stack sa magbunton. 440 00:35:43,900 --> 00:35:48,100 Tuwing malloc mo anumang, hindi maaaring hindi ka pag-imbak nito sa loob ng isang pointer. 441 00:35:48,100 --> 00:35:55,940 Kaya ang pointer sa stack, ang malloced bloke ay sa magbunton. 442 00:35:55,940 --> 00:36:01,240 A maraming ng mga tao makakuha ng nalilito at sabihin int * x = malloc; x sa magbunton. 443 00:36:01,240 --> 00:36:04,100 Hindi. Ano ang x mga punto sa sa magbunton. 444 00:36:04,100 --> 00:36:08,540 x mismo sa stack, maliban para sa anumang dahilan x ay isang pandaigdigang variable, 445 00:36:08,540 --> 00:36:11,960 kung saan ito ang mangyayari sa ibang rehiyon ng memorya. 446 00:36:13,450 --> 00:36:20,820 Kaya pagpapanatiling track, mga kahon at arrow diagram ay medyo karaniwang para sa pagsusulit. 447 00:36:20,820 --> 00:36:25,740 O kung ito ay hindi sa pagsusulit 0, ito sa pagsusulit 1. 448 00:36:27,570 --> 00:36:31,940 Dapat mong malaman ang lahat ng ito, ang mga hakbang sa kino-compile ang 449 00:36:31,940 --> 00:36:35,740 dahil mayroon kang upang sagutin ang mga katanungan sa mga. Oo. 450 00:36:35,740 --> 00:36:38,940 [Mag-aaral] ma kami sa mga hakbang - >> Oo naman. 451 00:36:48,340 --> 00:36:58,640 Bago mga hakbang at kino-compile ang mayroon kaming preprocessing, 452 00:36:58,640 --> 00:37:16,750 kino-compile, assembling, at pag-link. 453 00:37:16,750 --> 00:37:21,480 Preprocessing. Ano ang na gawin? 454 00:37:29,720 --> 00:37:32,290 Ito ay ang pinakamadaling hakbang sa - na rin, hindi tulad ng - 455 00:37:32,290 --> 00:37:35,770 na hindi ibig sabihin dapat ito ay halata, ngunit ito ay ang pinakamadaling hakbang. 456 00:37:35,770 --> 00:37:38,410 Mong guys ay maaaring ipatupad ito sarili. Oo. 457 00:37:38,410 --> 00:37:43,410 [Mag-aaral] Dalhin kung ano ang mayroon kang sa iyong Kabilang tulad nito at kinokopya ito at pagkatapos din tumutukoy. 458 00:37:43,410 --> 00:37:49,250 Tumingin para sa mga bagay tulad ng # include at # tukuyin, 459 00:37:49,250 --> 00:37:53,800 at ito lamang kopya at pastes kung ano ang mga aktwal na ibig sabihin. 460 00:37:53,800 --> 00:37:59,240 Kaya kapag sinabi mong # include cs50.h, ang Preprocessor ang pagkopya at pag-paste ng cs50.h 461 00:37:59,240 --> 00:38:01,030 sa na linya. 462 00:38:01,030 --> 00:38:06,640 Kapag sinabi mong # tukuyin ang mga x na 4, Preprocessor napupunta sa pamamagitan ng buong programa 463 00:38:06,640 --> 00:38:10,400 at pumapalit sa lahat ng mga pagkakataon ng mga x na may 4 na. 464 00:38:10,400 --> 00:38:17,530 Kaya Preprocessor tumatagal ng isang wastong file ng C at output ng isang wastong file C 465 00:38:17,530 --> 00:38:20,300 kung saan ang mga bagay na nakopya at nailagay. 466 00:38:20,300 --> 00:38:24,230 Kaya ngayon kino-compile. Ano ang na gawin? 467 00:38:25,940 --> 00:38:28,210 [Mag-aaral] pupunta ito mula sa C sa binary. 468 00:38:28,210 --> 00:38:30,970 >> [Bowden] Hindi ito pumunta ang lahat ng mga paraan sa binary. 469 00:38:30,970 --> 00:38:34,220 [Mag-aaral] Upang machine code? >> Hindi machine code. 470 00:38:34,220 --> 00:38:35,700 [Mag-aaral] Assembly? >> Assembly. 471 00:38:35,700 --> 00:38:38,890 Napupunta sa Assembly bago ito napupunta ang lahat ng mga paraan upang C code, 472 00:38:38,890 --> 00:38:45,010 at karamihan ng mga wika gawin ang isang bagay tulad nito. 473 00:38:47,740 --> 00:38:50,590 Pumili ng anumang mataas na antas ng wika, at kung ikaw ay pagpunta upang ipunin ito, 474 00:38:50,590 --> 00:38:52,390 malamang upang ipunin sa hakbang. 475 00:38:52,390 --> 00:38:58,140 Una ito upang ipunin ang Python sa C, pagkatapos ito upang ipunin ang C sa Assembly, 476 00:38:58,140 --> 00:39:01,600 at pagkatapos Assembly ay pagpunta upang isinalin sa binary. 477 00:39:01,600 --> 00:39:07,800 Kaya kino-compile ang pagpunta upang dalhin ito mula sa C sa Assembly. 478 00:39:07,800 --> 00:39:12,130 Ang salitang kino-compile ay karaniwang ay nangangahulugan na ang nagdadala sa mga ito mula sa isang mas mataas na antas 479 00:39:12,130 --> 00:39:14,340 sa isang mas mababang antas ng wika programming. 480 00:39:14,340 --> 00:39:19,190 Kaya ito ay ang tanging hakbang sa compilation kung saan simulan mo sa isang mataas na antas ng wika 481 00:39:19,190 --> 00:39:23,270 at nagtatapos sa isang mababang antas na wika, at iyon ang dahilan kung bakit hakbang ay tinatawag na kino-compile. 482 00:39:25,280 --> 00:39:33,370 [Mag-aaral] Sa panahon kino-compile, sabihin nating na nagawa mo na # include cs50.h. 483 00:39:33,370 --> 00:39:42,190 Gagana ba ang tagatala mag-recompile ang cs50.h, tulad ng mga function na doon, 484 00:39:42,190 --> 00:39:45,280 at i-translate na sa Assembly code pati na rin, 485 00:39:45,280 --> 00:39:50,830 o kopyahin at i-paste ang isang bagay na pre-Assembly? 486 00:39:50,830 --> 00:39:56,910 cs50.h ay medyo magkano hindi magtapos sa Assembly. 487 00:39:59,740 --> 00:40:03,680 Bagay tulad ng mga function na modelo at mga bagay para lamang sa iyo upang maging maingat. 488 00:40:03,680 --> 00:40:09,270 Tinitiyak na tagatala maaaring suriin ng mga bagay tulad ng pagtawag sa function ka 489 00:40:09,270 --> 00:40:12,910 na may tamang uri ng return at ang tamang argumento at bagay-bagay. 490 00:40:12,910 --> 00:40:18,350 >> Kaya cs50.h ay preprocessed sa file, at pagkatapos ay kapag ito ay kino-compile 491 00:40:18,350 --> 00:40:22,310 isa lamang ito itinapon ang layo pagkatapos tinitiyak na ang lahat ay tinatawag na tama. 492 00:40:22,310 --> 00:40:29,410 Ngunit ang mga function na tinukoy sa CS50 library, na hiwalay mula sa cs50.h, 493 00:40:29,410 --> 00:40:33,610 mga hindi hiwalay inipon. 494 00:40:33,610 --> 00:40:37,270 Na ang aktwal na bumaba sa hakbang na ang pagli-link, kaya ipapakita namin sa isang segundo. 495 00:40:37,270 --> 00:40:40,100 Ngunit una, kung ano ang assembling? 496 00:40:41,850 --> 00:40:44,500 [Mag-aaral] Assembly sa binary? >> Oo. 497 00:40:46,300 --> 00:40:48,190 Assembling. 498 00:40:48,190 --> 00:40:54,710 Hindi namin tumawag ito kino-compile dahil Assembly ay medyo magkano ang isang dalisay na pagsasalin ng binary. 499 00:40:54,710 --> 00:41:00,230 May napakakaunting logic ng pagpunta mula sa Assembly sa binary. 500 00:41:00,230 --> 00:41:03,180 Lamang ito bang hinahanap sa isang table, oh, mayroon kaming ito pagtuturo; 501 00:41:03,180 --> 00:41:06,290 na tumutugon sa binary 01,110. 502 00:41:10,200 --> 00:41:15,230 At sa gayon ang mga file na assembling pangkalahatan output ay o file. 503 00:41:15,230 --> 00:41:19,020 At. O file ay kung ano ang aming sinasabi bago, 504 00:41:19,020 --> 00:41:21,570 kung paano ang isang file ay hindi kailangan upang magkaroon ng isang pangunahing function na. 505 00:41:21,570 --> 00:41:27,640 File anumang inipon down sa isang file o bilang hangga't ito ay isang wastong file C. 506 00:41:27,640 --> 00:41:30,300 Maaari itong inipon pababa. O. 507 00:41:30,300 --> 00:41:43,030 Ngayon, pag-uugnay ay kung ano ang aktwal na nagdudulot ng ng grupo ng o file at pinagsasama-sa kanila sa isang executable. 508 00:41:43,030 --> 00:41:51,110 At kaya kung ano ang Pag-uugnay ng ginagawa ay maaari mong isipin ng CS50 library bilang isang file o. 509 00:41:51,110 --> 00:41:56,980 Na inipon file sa binary. 510 00:41:56,980 --> 00:42:03,530 At kaya kapag makatipon mo ang iyong file, iyong hello.c, na tawag GetString, 511 00:42:03,530 --> 00:42:06,360 hello.c ay makakakuha inipon down sa hello.o, 512 00:42:06,360 --> 00:42:08,910 hello.o ngayon sa binary. 513 00:42:08,910 --> 00:42:12,830 Gumagamit GetString, kaya kailangang pumunta sa cs50.o, 514 00:42:12,830 --> 00:42:16,390 at ang linker ang smooshes iyon nang magkakasama at kinokopya GetString sa ang file na ito 515 00:42:16,390 --> 00:42:20,640 at ay may isang executable na may lahat ng mga function na kailangan nito. 516 00:42:20,640 --> 00:42:32,620 Kaya cs50.o ay hindi talagang O file, ngunit ito ay malapit sapat na walang saligan pagkakaiba. 517 00:42:32,620 --> 00:42:36,880 Kaya nagli-link lamang ay nagdudulot ng isang bungkos ng mga file nang magkasama 518 00:42:36,880 --> 00:42:41,390 na hiwalay na naglalaman ng lahat ng mga pag-andar, kailangan kong gamitin 519 00:42:41,390 --> 00:42:46,120 at lumilikha ng executable na ang talagang tumakbo. 520 00:42:48,420 --> 00:42:50,780 >> At kaya na rin kung ano ang aming sinasabi bago 521 00:42:50,780 --> 00:42:55,970 kung saan maaari kang magkaroon ng 1000. file c, makatipon mo ang lahat ng ito sa o file, 522 00:42:55,970 --> 00:43:00,040 na marahil magtagal, pagkatapos binago mo 1 c file. 523 00:43:00,040 --> 00:43:05,480 Kailangan mo lamang na mag-recompile na 1. C file at pagkatapos ay relink lahat ng iba pa, 524 00:43:05,480 --> 00:43:07,690 link ang lahat ng pabalik nang magkasama. 525 00:43:09,580 --> 00:43:11,430 [Mag-aaral] Kapag nagli-link ka namin isulat namin lcs50? 526 00:43:11,430 --> 00:43:20,510 Oo, kaya-lcs50. Signal na bandila sa linker na dapat mong nagli-link sa na library. 527 00:43:26,680 --> 00:43:28,910 Mga tanong? 528 00:43:41,310 --> 00:43:46,860 Namin nawala sa paglipas ng binary iba pang kaysa sa 5 segundo sa unang panayam? 529 00:43:50,130 --> 00:43:53,010 Hindi sa tingin ko. 530 00:43:55,530 --> 00:43:58,820 Dapat mong malaman ang lahat ng malaking Os na namin ang nawala sa paglipas ng, 531 00:43:58,820 --> 00:44:02,670 at dapat mong ma-, kung ibinigay namin sa iyo ng isang function, 532 00:44:02,670 --> 00:44:09,410 dapat mong magagawang upang sabihin ito ang malaking O, halos. O na rin, malaki O ay magaspang. 533 00:44:09,410 --> 00:44:15,300 Kaya kung mong makita Nested para sa mga loop na looping sa ibabaw ng parehong bilang ng mga bagay, 534 00:44:15,300 --> 00:44:22,260 tulad ng int i, i > [mag-aaral] n squared. >> May kaugaliang n squared. 535 00:44:22,260 --> 00:44:25,280 Kung triple ka na Nested, may gawi na n nakakubo. 536 00:44:25,280 --> 00:44:29,330 Kaya na uri ng bagay dapat mong magagawang upang ituro ang kaagad. 537 00:44:29,330 --> 00:44:33,890 Kailangan mong malaman-uuri ng pagpapasok ng at-uuri ng bubble at sumanib-uri-uriin at ang lahat ng mga. 538 00:44:33,890 --> 00:44:41,420 Ito ay madali upang maunawaan kung bakit ang mga ito ay mga n squared at n log n at lahat ng na 539 00:44:41,420 --> 00:44:47,810 dahil sa tingin ko nagkaroon sa isang pagsusulit sa isang taon kung saan talaga namin ibinigay mo 540 00:44:47,810 --> 00:44:55,050 ng pagpapatupad ng bubble-uuri at sinabing, "Ano ang tumatakbo oras ng function na ito?" 541 00:44:55,050 --> 00:45:01,020 Kaya kung makilala ka bilang bubble-uuri, maaari mong agad sabihin n squared. 542 00:45:01,020 --> 00:45:05,470 Ngunit kung mo lamang tumingin sa ito, hindi mo na kailangan upang mapagtanto ito ng bubble-uuri; 543 00:45:05,470 --> 00:45:08,990 Maaari mo lamang sabihin na ito ay ginagawa ito at ito. Ito n squared. 544 00:45:12,350 --> 00:45:14,710 [Mag-aaral] Mayroon bang anumang mga matibay na halimbawa na maaari mong makabuo ng, 545 00:45:14,710 --> 00:45:20,370 tulad ng isang katulad na ideya ng pag-uunawa ng? 546 00:45:20,370 --> 00:45:24,450 >> Palagay ko ay hindi namin magbibigay sa iyo ng anumang matigas halimbawa. 547 00:45:24,450 --> 00:45:30,180 Ang bubble-uuri ng bagay ay tungkol sa bilang matigas tulad kami, 548 00:45:30,180 --> 00:45:36,280 at kahit na, hangga't nauunawaan mo na ikaw ay iterating sa ibabaw ng array 549 00:45:36,280 --> 00:45:41,670 para sa bawat elemento sa array, na kung saan ay pagpunta sa isang bagay na n squared. 550 00:45:45,370 --> 00:45:49,940 Mayroong mga pangkalahatang katanungan, tulad ng karapatan dito mayroon kaming - Oh. 551 00:45:55,290 --> 00:45:58,530 Sa iba pang mga araw, Doug inaangkin, "ako imbento ng isang algorithm na maaaring ayusin ng isang array 552 00:45:58,530 --> 00:46:01,780 "Ng mga n numero sa O (log n) oras!" 553 00:46:01,780 --> 00:46:04,900 Kaya kung paano namin malalaman na imposibleng? 554 00:46:04,900 --> 00:46:08,850 [Hindi marinig na mag-aaral ng tugon] >> Oo. 555 00:46:08,850 --> 00:46:13,710 Sa pinakadulo hindi bababa sa, mayroon kang pindutin bawat elemento sa array, 556 00:46:13,710 --> 00:46:16,210 kaya imposibleng upang pag-uri-uriin ang isang hanay ng mga - 557 00:46:16,210 --> 00:46:20,850 Kung ang lahat ay sa unsorted-sunod, pagkatapos ikaw ay pagpunta sa na nakadikit lahat sa array, 558 00:46:20,850 --> 00:46:25,320 kaya imposible na gawin ito sa mas mababa kaysa O ng n. 559 00:46:27,430 --> 00:46:30,340 [Mag-aaral] ay nagpakita mo sa amin na halimbawa ng gawin ito sa O ng n 560 00:46:30,340 --> 00:46:33,920 kung gumamit ka ng maraming memorya. >> Oo. 561 00:46:33,920 --> 00:46:37,970 At that's - nakalimutan ko kung ano ang that's - Ay ito pagbibilang sa-uuri? 562 00:46:47,360 --> 00:46:51,330 Hmm. Na ay isang integer na pag-uuri algorithm. 563 00:46:59,850 --> 00:47:05,100 Ako ay naghahanap para sa espesyal na pangalan para sa na hindi ko matandaan ang huling linggo. 564 00:47:05,100 --> 00:47:13,000 Oo. Ito ay ang mga uri ng mga uri na maaaring maisagawa ang mga bagay sa malaking O ng n. 565 00:47:13,000 --> 00:47:18,430 Ngunit may mga limitasyon, tulad ng maaari mo lamang gamitin ang integer hanggang sa ilang. 566 00:47:20,870 --> 00:47:24,560 Plus kung sinusubukan mong i-ayusin ang mga that's ng isang bagay - 567 00:47:24,560 --> 00:47:30,750 Kung ang iyong array ay 012, -12, 151, 4 na milyong, 568 00:47:30,750 --> 00:47:35,120 pagkatapos na iisang elemento ay ganap na sanhi ng pagkapahamak ng buong pag-uuri. 569 00:47:42,060 --> 00:47:44,030 >> Mga tanong? 570 00:47:49,480 --> 00:47:58,870 [Mag-aaral] Kung mayroon kang isang recursive function at ito ay gumagawa ng mga recursive tawag 571 00:47:58,870 --> 00:48:02,230 sa loob ng isang pahayag ng return, na buntot recursive, 572 00:48:02,230 --> 00:48:07,360 at ito ay na hindi gumagamit ng higit pa memory sa oras ng runtime 573 00:48:07,360 --> 00:48:12,550 o gusto ng hindi bababa sa gamitin ang maihahambing memory bilang isang umuulit solusyon? 574 00:48:12,550 --> 00:48:14,530 [Bowden] Oo. 575 00:48:14,530 --> 00:48:19,840 Ay malamang na medyo mas mabagal, ngunit hindi talaga. 576 00:48:19,840 --> 00:48:23,290 Buntot recursive ay medyo magandang. 577 00:48:23,290 --> 00:48:32,640 Naghahanap muli sa frame stack, sabihin nating mayroon kaming pangunahing 578 00:48:32,640 --> 00:48:42,920 at mayroon kaming int bar (int x) o isang bagay. 579 00:48:42,920 --> 00:48:52,310 Ito ay hindi isang perpektong recursive function na, ngunit ang return bar (x - 1). 580 00:48:52,310 --> 00:48:57,620 Kaya malinaw naman, ito ay flawed. Kailangan mong base at mga kaso ng mga bagay-bagay. 581 00:48:57,620 --> 00:49:00,360 Ngunit ang ideya dito ay na ito ay buntot recursive, 582 00:49:00,360 --> 00:49:06,020 na nangangahulugan na kapag ang mga pangunahing tawag bar na ito upang makuha ang stack frame. 583 00:49:09,550 --> 00:49:12,440 Sa stack frame na ito ay may pagpunta sa isang maliit na bloke ng memorya 584 00:49:12,440 --> 00:49:17,490 na tumutugon sa nito argumento x. 585 00:49:17,490 --> 00:49:25,840 At kaya sabihin nating pangunahing mangyayari tumawag sa bar (100); 586 00:49:25,840 --> 00:49:30,050 Kaya x ay pagpunta upang simulan ang bilang sa 100. 587 00:49:30,050 --> 00:49:35,660 Kung tagatala ay kinikilala na ito ay isang buntot recursive function na, 588 00:49:35,660 --> 00:49:38,540 pagkatapos ay kapag ang bar ginagawang recursive tawag nito sa bar, 589 00:49:38,540 --> 00:49:45,490 sa halip ng paggawa ng isang bagong stack frame, na kung saan ang stack ang nagsimula lumalagong sa kalakhan, 590 00:49:45,490 --> 00:49:48,220 kalaunan ito ay tumakbo sa magbunton at pagkatapos mo makakuha ng mga segfaults 591 00:49:48,220 --> 00:49:51,590 dahil ang memory nagsisimula nagbabanggaan. 592 00:49:51,590 --> 00:49:54,830 >> Kaya sa halip ng paggawa ng sarili nitong stack frame, maaari itong Napagtanto, 593 00:49:54,830 --> 00:49:59,080 hey, hindi ko talagang kailangan upang bumalik sa stack frame na ito, 594 00:49:59,080 --> 00:50:08,040 kaya sa halip makikita ko lang palitan ang argument na ito may 99 at pagkatapos ay simulan ang bar sa lahat ng dako. 595 00:50:08,040 --> 00:50:11,810 At pagkatapos ito ay gawin itong muli at ito maabot ang return bar (x - 1), 596 00:50:11,810 --> 00:50:17,320 at sa halip ng paggawa ng bagong stack frame, ito lamang palitan ang kasalukuyan nitong argument may 98 597 00:50:17,320 --> 00:50:20,740 at pagkatapos ay tumalon pabalik sa pinakadulo simula ng bar. 598 00:50:23,860 --> 00:50:30,430 Yaong mga pagpapatakbo, pinapalitan na 1 halaga sa stack at paglukso pabalik sa simula, 599 00:50:30,430 --> 00:50:32,430 medyo mahusay. 600 00:50:32,430 --> 00:50:41,500 Kaya hindi lamang ito ang parehong paggamit ng memorya bilang isang hiwalay na function na na umuulit 601 00:50:41,500 --> 00:50:45,390 dahil ikaw lamang ginagamit 1 stack frame, ngunit hindi ka naghihirap ang downsides 602 00:50:45,390 --> 00:50:47,240 ng kinakailangang tumawag function. 603 00:50:47,240 --> 00:50:50,240 Pagtawag function ay maaaring medyo mahal dahil ito ay may sa gawin ang lahat ng ito setup 604 00:50:50,240 --> 00:50:52,470 at teardown at ang lahat ng ito bagay-bagay. 605 00:50:52,470 --> 00:50:58,160 Kaya buntot recursion na ito ay mabuti. 606 00:50:58,160 --> 00:51:01,170 [Mag-aaral] Bakit ang hindi lumikha ng mga bagong hakbang? 607 00:51:01,170 --> 00:51:02,980 Dahil napagtanto hindi ito kailangang. 608 00:51:02,980 --> 00:51:07,800 Ang tawag sa bar bumabalik recursive tawag. 609 00:51:07,800 --> 00:51:12,220 Kaya hindi ito kailangan upang gawin ang anumang bagay na may halaga return. 610 00:51:12,220 --> 00:51:15,120 Lamang ito upang agad na ibalik ito. 611 00:51:15,120 --> 00:51:20,530 Kaya lamang ito upang palitan ang sarili nitong argumento at magsimulang muli. 612 00:51:20,530 --> 00:51:25,780 At din, kung wala kang ang buntot recursive bersyon, 613 00:51:25,780 --> 00:51:31,460 pagkatapos kang makakuha ng lahat ng mga bar kung saan kapag nagbabalik ang bar na ito 614 00:51:31,460 --> 00:51:36,010 ito ay may upang bumalik ang halaga na ito, pagkatapos na bar agad nagbalik 615 00:51:36,010 --> 00:51:39,620 at nagbalik ang halaga nito sa isang ito, pagkatapos lamang ito upang agad na bumalik 616 00:51:39,620 --> 00:51:41,350 at ibalik ang halaga nito sa isang ito. 617 00:51:41,350 --> 00:51:45,350 Kaya ka-save ang popping ang lahat ng mga bagay na ito ng stack 618 00:51:45,350 --> 00:51:48,730 dahil ang return halaga lang na pumasa sa lahat ng paraan-back up pa rin. 619 00:51:48,730 --> 00:51:55,400 Kaya bakit hindi lamang palitan ang aming mga argumento sa mga na-update na argumento at magsimulang muli? 620 00:51:57,460 --> 00:52:01,150 Kung ang function ay hindi buntot recursive, kung gawin mo ang isang bagay tulad ng - 621 00:52:01,150 --> 00:52:07,530 [Mag-aaral] kung bar (x + 1). >> Oo. 622 00:52:07,530 --> 00:52:11,770 >> Kaya kung inilagay mo ito sa kundisyon, pagkatapos ikaw ay paggawa ng isang bagay ang halaga ng return. 623 00:52:11,770 --> 00:52:16,260 O kahit mo lamang gawin return 2 * bar (x - 1). 624 00:52:16,260 --> 00:52:23,560 Kaya ngayon bar (x - 1) kailangang bumalik upang ito upang makalkula ang 2 beses na halaga, 625 00:52:23,560 --> 00:52:26,140 kaya ngayon ay kailangan ng sarili nitong hiwalay na stack ng frame, 626 00:52:26,140 --> 00:52:31,180 at ngayon, kahit na kung paano mahirap subukan mo, ikaw ay kailangang - 627 00:52:31,180 --> 00:52:34,410 Na ito ay hindi recursive na buntot. 628 00:52:34,410 --> 00:52:37,590 [Mag-aaral] Gusto kong subukan na magdala ng recursion sa layunin para sa isang buntot recursion - 629 00:52:37,590 --> 00:52:41,450 [Bowden] Sa isang perpektong mundo, ngunit sa CS50 hindi mo na kailangang. 630 00:52:43,780 --> 00:52:49,280 Upang makakuha ng buntot na recursion, sa pangkalahatan, itinakda mo ng karagdagang argumento 631 00:52:49,280 --> 00:52:53,550 kung saan bar tumagal ng int x sa y 632 00:52:53,550 --> 00:52:56,990 at y tumutugon sa ang tunay na bagay na gusto mong ibalik. 633 00:52:56,990 --> 00:53:03,650 Kaya pagkatapos ito ka na bumabalik bar (x - 1), 2 * y. 634 00:53:03,650 --> 00:53:09,810 Kaya na mataas na antas ng kung paano mo ibahin ang anyo ng mga bagay sa buntot recursive. 635 00:53:09,810 --> 00:53:13,790 Ngunit ang dagdag na argumento - 636 00:53:13,790 --> 00:53:17,410 At pagkatapos ay sa dulo kapag naabot mo ang iyong base kaso, mo lang bumalik y 637 00:53:17,410 --> 00:53:22,740 dahil na-iipon ng buong oras ang return halaga na gusto mo. 638 00:53:22,740 --> 00:53:27,280 Mong uri ng ay ginagawa ito iteratively ngunit ang paggamit ng mga recursive tawag. 639 00:53:32,510 --> 00:53:34,900 Mga tanong? 640 00:53:34,900 --> 00:53:39,890 [Mag-aaral] Siguro tungkol pointer aritmetika, tulad ng kapag gumagamit ng string. >> Oo naman. 641 00:53:39,890 --> 00:53:43,610 Pointer aritmetika. 642 00:53:43,610 --> 00:53:48,440 Kapag gumagamit ng string madali dahil sa mga string magpasinda mga bituin, 643 00:53:48,440 --> 00:53:51,860 char ay magpakailanman at palaging isang solong byte, 644 00:53:51,860 --> 00:53:57,540 at kaya pointer aritmetika ay katumbas sa regular na pang-aritmetika kapag kayo ay pagharap sa string. 645 00:53:57,540 --> 00:54:08,790 Sabihin lang sabihin magpasinda * s = "kumusta". 646 00:54:08,790 --> 00:54:11,430 Kaya kami ay may isang bloke sa memorya. 647 00:54:19,490 --> 00:54:22,380 Kailangan nito 6 bytes dahil palagi mong kailangan ang null Terminator. 648 00:54:22,380 --> 00:54:28,620 At magpasinda * s ay pagpunta upang tumuro sa simula ng array na ito. 649 00:54:28,620 --> 00:54:32,830 Kaya s mga punto doon. 650 00:54:32,830 --> 00:54:36,710 Ngayon, ito ay isa lamang kung paano gumagana ang array anumang, 651 00:54:36,710 --> 00:54:40,780 hindi alintana kung ito ay isang balik sa pamamagitan ng malloc o kung ito ay sa stack. 652 00:54:40,780 --> 00:54:47,110 Array anumang ay isa lamang isang pointer sa simula ng array, 653 00:54:47,110 --> 00:54:53,640 ang anumang operasyon ng array, anumang pag-i-index, at pagkatapos lamang ng pagpunta sa na array isang tiyak na offset. 654 00:54:53,640 --> 00:55:05,360 >> Kaya kapag sinabi ko ang isang bagay tulad ng mga [3]; ito ay pagpunta sa mga at pagbibilang 3 char. 655 00:55:05,360 --> 00:55:12,490 Kaya s [3], kami ay may 0, 1, 2, 3, kaya s [3] ay sumangguni sa ito l. 656 00:55:12,490 --> 00:55:20,460 [Mag-aaral] At maaari kaming maabot ang parehong halaga sa pamamagitan ng paggawa ng mga + 3 at pagkatapos ay panaklong star? 657 00:55:20,460 --> 00:55:22,570 Oo. 658 00:55:22,570 --> 00:55:26,010 Ito ay katumbas sa * (mga + 3); 659 00:55:26,010 --> 00:55:31,240 at iyon ay magpakailanman at palaging katumbas hindi mahalaga kung ano ang ginagawa mo. 660 00:55:31,240 --> 00:55:34,070 Hindi mo na kailangang gamitin ang syntax ng bracket. 661 00:55:34,070 --> 00:55:37,770 Maaari mong palaging gamitin ang (mga + 3) * syntax. 662 00:55:37,770 --> 00:55:40,180 Mga tao ay may posibilidad na gusto ang syntax ng bracket, bagaman. 663 00:55:40,180 --> 00:55:43,860 [Mag-aaral] Kaya lahat ng mga array ay aktwal na lamang payo. 664 00:55:43,860 --> 00:55:53,630 May ay isang bahagyang pagkakaiba kapag sinabi ko int x [4]; >> [mag-aaral] ba na lumikha sa memory? 665 00:55:53,630 --> 00:56:03,320 [Bowden] Iyon ay pagpunta upang lumikha ng 4 ints sa stack, kaya 16 na bytes pangkalahatang. 666 00:56:03,320 --> 00:56:05,700 Ito upang lumikha ng mga 16 bytes sa stack. 667 00:56:05,700 --> 00:56:09,190 x ay hindi naka-imbak sa kahit saan. 668 00:56:09,190 --> 00:56:13,420 Ito ay isang simbolo na tumutukoy sa simula ng bagay. 669 00:56:13,420 --> 00:56:17,680 Dahil ipinahayag mo ang hanay sa loob ng function na ito, 670 00:56:17,680 --> 00:56:22,340 ano ang tagatala ay pagpunta sa gawin ay lamang palitan ang lahat ng mga pagkakataon ng variable x 671 00:56:22,340 --> 00:56:26,400 sa kung saan nangyari ito upang pumili upang ilagay ang mga ito 16 bytes. 672 00:56:26,400 --> 00:56:30,040 Hindi ito maaaring gawin iyon may magpasinda * s dahil s ay isang aktwal na pointer. 673 00:56:30,040 --> 00:56:32,380 Ay libre upang pagkatapos ay tumuturo sa iba pang mga bagay. 674 00:56:32,380 --> 00:56:36,140 x ay isang pare-pareho. Hindi ka maaaring magkaroon ng punto sa ibang array. >> [Mag-aaral] Okay. 675 00:56:36,140 --> 00:56:43,420 Subalit ang ideyang ito, ang pag-i-index na ito, ay ang parehong alintana kung ito ang isang tradisyonal na array 676 00:56:43,420 --> 00:56:48,230 o kung ito ay isang pointer sa isang bagay o kung ang isang pointer sa isang malloced array. 677 00:56:48,230 --> 00:56:59,770 At sa katunayan, kaya katumbas na na rin ang parehong bagay. 678 00:56:59,770 --> 00:57:05,440 Ito aktwal lamang ibig sabihin kung ano ang sa loob ng mga bracket at kung ano ang kaliwa ng mga bracket, 679 00:57:05,440 --> 00:57:07,970 nagdadagdag ng mga iyon nang magkakasama, at dereferences. 680 00:57:07,970 --> 00:57:14,710 Kaya ito ay tulad ng wastong bilang * (mga + 3) o mga [3]. 681 00:57:16,210 --> 00:57:22,090 [Mag-aaral] Maaari kang magkaroon ng mga payo na tumuturo sa 2-dimensional array? 682 00:57:22,090 --> 00:57:27,380 >> Ito ay mahirap. Tradisyonal, hindi. 683 00:57:27,380 --> 00:57:34,720 2-dimensional array ay 1-dimensional array na may ilang maginhawang syntax 684 00:57:34,720 --> 00:57:54,110 dahil kapag sinabi ko int x [3] [3], talaga ito ay may 1 array na may 9 na halaga. 685 00:57:55,500 --> 00:58:03,000 At kaya kapag ako ay nag-index, tagatala alam kung ano ang ibig sabihin ko. 686 00:58:03,000 --> 00:58:13,090 Kung sinasabi ko x [1] [2], alam na gusto kong pumunta sa pangalawang hilera, kaya ito upang laktawan ang unang 3, 687 00:58:13,090 --> 00:58:17,460 at pagkatapos ay nais ang ikalawang bagay na, kaya upang makakuha ng isang ito. 688 00:58:17,460 --> 00:58:20,480 Ngunit ito ay pa rin ng isang-dimensional array. 689 00:58:20,480 --> 00:58:23,660 At kaya kung Nais kong upang magtalaga ng isang pointer sa array na, 690 00:58:23,660 --> 00:58:29,770 Gusto ko sabihin int * p = x; 691 00:58:29,770 --> 00:58:33,220 Lamang ang uri ng x - 692 00:58:33,220 --> 00:58:38,280 Ito ay magaspang sinasabi uri ng x dahil ito ay isang simbolo at ito ay hindi isang aktwal na variable, 693 00:58:38,280 --> 00:58:40,140 ngunit ito ay isang int *. 694 00:58:40,140 --> 00:58:44,840 x ay isang pointer sa simula ng ito. >> [Mag-aaral] Okay. 695 00:58:44,840 --> 00:58:52,560 At kaya hindi ko upang ma-access ang [1] [2]. 696 00:58:52,560 --> 00:58:58,370 Tingin ko may espesyal na syntax para sa deklarasyon ng pointer, 697 00:58:58,370 --> 00:59:12,480 isang bagay na katawa-tawa tulad ng int (* p [- ng isang bagay na ganap na katawa-tawa hindi ko alam. 698 00:59:12,480 --> 00:59:17,090 Ngunit may syntax para sa deklarasyon ng mga payo tulad ng may mga panaklong at mga bagay. 699 00:59:17,090 --> 00:59:22,960 Hindi kahit na ito ay maaaring sabihin gawin mo na. 700 00:59:22,960 --> 00:59:26,640 Maaari kong tumingin pabalik sa isang bagay na sabihin sa akin ang katotohanan. 701 00:59:26,640 --> 00:59:34,160 Kong hanapin ito sa ibang pagkakataon, kung may syntax para sa punto. Ngunit hindi mo makita ito. 702 00:59:34,160 --> 00:59:39,670 At kahit syntax kaya patay na kung gagamitin mo ito, ang mga tao ay baffled. 703 00:59:39,670 --> 00:59:43,540 Maraming interes array ay medyo bihirang ito ay. 704 00:59:43,540 --> 00:59:44,630 Mong medyo mas - 705 00:59:44,630 --> 00:59:48,490 Well, kung gumagawa ka ng mga bagay na matrix ay hindi ito pagpunta sa bihirang, 706 00:59:48,490 --> 00:59:56,730 ngunit sa C bihira ka pagpunta sa paggamit ng mga maraming interes array. 707 00:59:57,630 --> 01:00:00,470 Oo. >> [Mag-aaral] Sabihin nating mayroon kang isang talagang mahaba array. 708 01:00:00,470 --> 01:00:03,900 >> Kaya sa virtual memory ay lilitaw sa lahat ng magkakasunod, 709 01:00:03,900 --> 01:00:05,640 tulad ng mga elemento sa tabi mismo sa bawat isa, 710 01:00:05,640 --> 01:00:08,770 ngunit sa pisikal na memorya, ito ay posible para sa maghiwalay? >> Oo. 711 01:00:08,770 --> 01:00:16,860 Paano virtual memory gawa ay naghihiwalay lamang ito - 712 01:00:19,220 --> 01:00:24,860 Ang yunit ng paglalaan ay isang pahina, na may kaugaliang 4 kilobytes, 713 01:00:24,860 --> 01:00:29,680 at kaya kapag ang proseso ng sabi, hey, gusto kong gamitin ang memory, 714 01:00:29,680 --> 01:00:35,970 ang operating system upang magtalaga ito ng 4 na kilobytes para sa maliit na bloke ng memorya. 715 01:00:35,970 --> 01:00:39,100 Kahit na kung ka lamang gumamit ng isang maliit na byte sa buong bloke ng memorya, 716 01:00:39,100 --> 01:00:42,850 ang operating system upang bigyan ito ng buong 4 kilobytes. 717 01:00:42,850 --> 01:00:49,410 Kaya kung ano ang Nangangahulugan itong maaari ba akong magkaroon ng - sabihin nating ito ang aking stack. 718 01:00:49,410 --> 01:00:53,180 Stack na ito ay maaari na pinaghiwalay. Aking stack mga megabytes at megabytes. 719 01:00:53,180 --> 01:00:55,020 Maaaring maging malaking ang Aking stack. 720 01:00:55,020 --> 01:01:00,220 Ngunit ng stack mismo ay hatiin sa mga indibidwal na mga pahina, 721 01:01:00,220 --> 01:01:09,010 na kung tiningnan namin sa paglipas ng dito sabihin nating ito ang aming RAM, 722 01:01:09,010 --> 01:01:16,600 kung mayroon akong 2 gigabytes ng RAM, ito ay aktwal na address ng 0 tulad ng 0 byte ng aking RAM, 723 01:01:16,600 --> 01:01:22,210 at ito ay 2 gigabytes ang lahat ng mga paraan pababa dito. 724 01:01:22,210 --> 01:01:27,230 Kaya pahinang ito ay maaaring tumutugma sa block na ito sa paglipas dito. 725 01:01:27,230 --> 01:01:29,400 Ang pahinang ito ay maaaring tumutugma sa block na ito sa paglipas dito. 726 01:01:29,400 --> 01:01:31,560 Ito ay maaaring tumutugma sa isa sa paglipas dito. 727 01:01:31,560 --> 01:01:35,540 Kaya ang operating system ay libre upang magtalaga ng pisikal na memory 728 01:01:35,540 --> 01:01:39,320 sa anumang indibidwal na pahina sa mang. 729 01:01:39,320 --> 01:01:46,180 At na nangangahulugan na kung ang hangganan nangyari ito sa sumaklang isang array, 730 01:01:46,180 --> 01:01:50,070 array ng mangyayari sa kaliwa ng ito at karapatan ng order na ito ng isang pahina, 731 01:01:50,070 --> 01:01:54,460 array na ay pagpunta sa hatiin sa pisikal na memory. 732 01:01:54,460 --> 01:01:59,280 At pagkatapos ay kapag ikaw ay huminto sa programa, kapag ang proseso ay nagtatapos, 733 01:01:59,280 --> 01:02:05,690 mga pagmamapa makakuha ng mabubura at pagkatapos ay libre upang gamitin ang mga maliit na mga bloke para sa iba pang mga bagay. 734 01:02:14,730 --> 01:02:17,410 Higit pang mga tanong? 735 01:02:17,410 --> 01:02:19,960 [Mag-aaral] Ang pointer aritmetika. >> Oh oo. 736 01:02:19,960 --> 01:02:28,410 String ay madali, ngunit naghahanap sa isang bagay tulad ng mga ints, 737 01:02:28,410 --> 01:02:35,000 kaya bumalik sa int x [4]; 738 01:02:35,000 --> 01:02:41,810 Kung ito ay isang array o kung ito ay isang pointer sa isang malloced array ng 4 integer, 739 01:02:41,810 --> 01:02:47,060 ito ay pagpunta sa ay ginagamot sa parehong paraan. 740 01:02:50,590 --> 01:02:53,340 [Mag-aaral] Kaya array sa magbunton? 741 01:03:01,400 --> 01:03:05,270 [Bowden] array ay hindi sa magbunton. >> [Mag-aaral] Oh. 742 01:03:05,270 --> 01:03:08,320 >> [Bowden] Ang uri ng array ay may kaugaliang sa stack 743 01:03:08,320 --> 01:03:12,220 maliban kung ipinahayag mo ito sa - pagbalewala sa pangkalahatang variable. Huwag gumamit ng mga pangkalahatang variable. 744 01:03:12,220 --> 01:03:16,280 Sa loob ng isang function na sinasabi ko int x [4]; 745 01:03:16,280 --> 01:03:22,520 Ito ay pagpunta upang lumikha ng isang 4-integer bloke sa stack para sa array na ito. 746 01:03:22,520 --> 01:03:26,960 Ngunit ito malloc (4 * sizeof (int)); upang pumunta sa magbunton. 747 01:03:26,960 --> 01:03:31,870 Ngunit pagkatapos ng puntong ito Maaari ko bang gamitin ang x at p sa medyo halos parehong paraan, 748 01:03:31,870 --> 01:03:36,140 iba kaysa sa pagbubukod sinabi ko bago tungkol reassign p. 749 01:03:36,140 --> 01:03:40,960 Technically, ang kanilang mga laki ay medyo iba, ngunit na ganap na walang-katuturang. 750 01:03:40,960 --> 01:03:43,310 Hindi mo aktwal na gamitin ang kanilang mga laki. 751 01:03:48,020 --> 01:03:56,810 Ang p maaari kong sabihin p [3] = 2; o x [3] = 2; 752 01:03:56,810 --> 01:03:59,680 Maaari mong gamitin ang mga ito sa eksaktong parehong paraan. 753 01:03:59,680 --> 01:04:01,570 Kaya pointer aritmetika ngayon - Oo. 754 01:04:01,570 --> 01:04:07,390 [Mag-aaral] ba hindi mo gawin p * kung mayroon kang mga bracket? 755 01:04:07,390 --> 01:04:11,720 Ang mga bracket ay isang implicit dereference. >> Okay. 756 01:04:11,720 --> 01:04:20,200 Aktwal na din kung ano ang sinasabi mo na may maaari kang makakuha ng maraming interes array 757 01:04:20,200 --> 01:05:02,650 sa mga payo, kung ano ang maaari mong gawin ay isang bagay tulad ng, sabihin nating, int ** pp = malloc (sizeof (int *) * 5); 758 01:05:02,650 --> 01:05:06,900 Kukunin ko na lang isulat ang lahat ng ito out muna. 759 01:05:37,880 --> 01:05:41,020 Hindi ko gusto na ang isa. 760 01:05:41,020 --> 01:05:42,550 Okay. 761 01:05:42,550 --> 01:05:48,910 Ano ang ginawa ko dito - ay dapat na pp [i]. 762 01:05:48,910 --> 01:05:53,680 Kaya pp ng pointer sa isang pointer. 763 01:05:53,680 --> 01:06:02,420 Ka mallocing pp upang tumuro sa isang array ng 5 int bituin. 764 01:06:02,420 --> 01:06:10,950 Kaya sa memorya na ikaw ay may sa stack ang pp. 765 01:06:10,950 --> 01:06:20,150 Ito ay upang tumuro sa isang hanay ng mga 5 bloke na ang lahat ang kanilang mga sarili payo. 766 01:06:20,150 --> 01:06:28,210 At pagkatapos ay kapag malloc ko pababa dito, malloc ko na ang bawat isa ng mga indibidwal na payo 767 01:06:28,210 --> 01:06:32,080 dapat tumuro sa isang hiwalay na bloke ng 4 bytes sa magbunton. 768 01:06:32,080 --> 01:06:35,870 Kaya ito ng mga puntos sa 4 bytes. 769 01:06:37,940 --> 01:06:40,660 At ito ang isa mga puntos sa isang iba't ibang 4 bytes. 770 01:06:40,660 --> 01:06:43,200 >> At lahat ng mga ito ay tumuturo sa kanilang sariling 4 bytes. 771 01:06:43,200 --> 01:06:49,080 Ito ay nagbibigay sa akin ang paraan ng paggawa ng maraming interes bagay. 772 01:06:49,080 --> 01:06:58,030 Maaari kong sabihin pp [3] [4], ngunit ngayon ito ay hindi ang parehong bagay bilang maraming interes array 773 01:06:58,030 --> 01:07:05,390 dahil maraming interes array na ito isinalin [3] [4] sa isang solong na offset sa array x. 774 01:07:05,390 --> 01:07:14,790 Ito dereferences p, access sa ikatlong index, pagkatapos dereferences na 775 01:07:14,790 --> 01:07:20,790 at ina-access - 4 ay hindi wasto - ang pangalawang index. 776 01:07:24,770 --> 01:07:31,430 Sapagkat kapag nagkaroon kami ang int x [3] [4] bago bilang isang maraming interes array 777 01:07:31,430 --> 01:07:35,740 at kapag nag-double bracket ito ay talagang lamang ng isang solong dereference, 778 01:07:35,740 --> 01:07:40,490 Sinusundan ka ng isang pointer at pagkatapos ay isang offset, 779 01:07:40,490 --> 01:07:42,850 talaga ito 2D reference. 780 01:07:42,850 --> 01:07:45,840 Sinusundan mo 2 magkahiwalay na payo. 781 01:07:45,840 --> 01:07:50,420 Kaya ito din technically ay nagpapahintulot sa iyo na magkaroon ng maraming interes array 782 01:07:50,420 --> 01:07:53,550 kung saan ang bawat indibidwal na array ay iba't ibang laki. 783 01:07:53,550 --> 01:07:58,000 Kaya sa tingin ko tulis-tulis maraming interes array ay kung ano ang tawag 784 01:07:58,000 --> 01:08:01,870 dahil talaga ang unang bagay na maaaring tumuro sa isang bagay na ay may 10 mga elemento, 785 01:08:01,870 --> 01:08:05,540 ang ikalawang bagay ay tumuturo sa isang bagay na ay may 100 mga elemento. 786 01:08:05,540 --> 01:08:10,790 [Mag-aaral] Mayroon bang limitasyon sa bilang ng mga payo na maaari kang magkaroon ng 787 01:08:10,790 --> 01:08:14,290 na tumuturo sa iba pang mga payo? >> No. 788 01:08:14,290 --> 01:08:17,010 Maaari kang magkaroon ng int ***** p. 789 01:08:18,050 --> 01:08:23,760 Bumalik sa pointer aritmetika - >> [mag-aaral] Oh. >> Oo. 790 01:08:23,760 --> 01:08:35,649 [Mag-aaral] Kung mayroon akong int *** p at gagawin ko ng dereferencing at sinasabi ko ay katumbas sa halagang ito ang p *, 791 01:08:35,649 --> 01:08:39,560 ito lamang ang pagpunta sa gawin 1 antas ng dereferencing? >> Oo. 792 01:08:39,560 --> 01:08:43,340 Kaya kung nais ko upang ma-access ang bagay na ang huling pointer ay pagturo sa - 793 01:08:43,340 --> 01:08:46,210 Pagkatapos gawin mo *** p. >> Okay. 794 01:08:46,210 --> 01:08:54,080 Kaya ito ay p ang mga puntos sa 1 bloke, ang mga puntos sa isa pang block, ang mga puntos sa ibang block. 795 01:08:54,080 --> 01:09:02,010 Pagkatapos kung gawin mo * p = iba pa, pagkatapos ikaw ay baguhin ang 796 01:09:02,010 --> 01:09:13,640 sa ngayon na ituro sa isang iba't ibang mga bloke. >> Okay. 797 01:09:13,640 --> 01:09:17,649 >> [Bowden] At kung ang mga ito ay malloced, pagkatapos ngayon mo pa leaked memory 798 01:09:17,649 --> 01:09:20,430 maliban kung mangyari mong magkaroon ng iba't-ibang mga sanggunian sa mga ito 799 01:09:20,430 --> 01:09:25,270 dahil hindi ka bumalik sa iyong mga iyan mo lamang threw layo. 800 01:09:25,270 --> 01:09:29,550 Pointer aritmetika. 801 01:09:29,550 --> 01:09:36,310 int x [4]; pagpunta sa maglaan ng isang hanay ng mga 4 integer 802 01:09:36,310 --> 01:09:40,670 kung saan ang x ay upang tumuro sa simula ng array. 803 01:09:40,670 --> 01:09:50,420 Kaya kapag sinabi ko ang isang bagay tulad ng x [1], gusto ko bang pumunta sa pangalawang integer sa array, 804 01:09:50,420 --> 01:09:53,319 na ang isang ito. 805 01:09:53,319 --> 01:10:04,190 Ngunit talagang, na 4 bytes sa array dahil ang integer na ito ay tumatagal ng hanggang 4 bytes. 806 01:10:04,190 --> 01:10:08,470 Kaya isang offset ng 1 talagang nangangahulugan isang offset ng 1 807 01:10:08,470 --> 01:10:12,030 beses ang laki ng anuman ang uri ng array ay. 808 01:10:12,030 --> 01:10:17,170 Ito ay isang hanay ng mga integer, kaya alam upang gawin ang 1 beses na laki ng int kapag nais upang i-offset. 809 01:10:17,170 --> 01:10:25,260 Ang iba pang mga syntax. Tandaan na ito ay katumbas sa * (x + 1); 810 01:10:25,260 --> 01:10:35,250 Kapag sinasabi ko ang pointer + 1, ano ang return address na pointer ay ang pag-iimbak ng 811 01:10:35,250 --> 01:10:40,360 kasama ang 1 beses ang laki ng uri ng pointer. 812 01:10:40,360 --> 01:10:59,510 Kaya kung x = ox100, pagkatapos ay x + 1 = ox104. 813 01:10:59,510 --> 01:11:19,750 At maaari mong abusuhin ito at sabihin ang isang bagay tulad ng pansamantalang trabaho * c = (magpasinda *) x; 814 01:11:19,750 --> 01:11:23,050 at ngayon c sa parehong address tulad ng x. 815 01:11:23,050 --> 01:11:26,040 c ay katumbas ng ox100, 816 01:11:26,040 --> 01:11:31,490 ngunit c + 1 ay katumbas ng ox101 817 01:11:31,490 --> 01:11:38,030 dahil ang pointer aritmetika ay depende sa uri ng pointer na pagdaragdag sa. 818 01:11:38,030 --> 01:11:45,390 Kaya c + 1, tinitingnan nito c, ito ay isang pansamantalang trabaho na pointer, kaya ito upang magdagdag ng 1 beses na laki ng pansamantalang trabaho, 819 01:11:45,390 --> 01:11:48,110 na palaging pagpunta sa 1, kaya makakakuha ka ng 101, 820 01:11:48,110 --> 01:11:54,890 samantalang kung gagawin ko x, na kung saan ay din pa rin 100, x + 1 ay magiging 104. 821 01:11:56,660 --> 01:12:06,340 [Mag-aaral] Maaari mong gamitin ang c + + upang upang mag-advance ang iyong pointer ng 1? 822 01:12:06,340 --> 01:12:09,810 Oo, maaari mong. 823 01:12:09,810 --> 01:12:16,180 Hindi mo maaaring gawin na may x dahil ang x ay isang simbolo, ito ay isang pare-pareho, hindi mo maaaring baguhin x. 824 01:12:16,180 --> 01:12:22,610 >> Ngunit c mangyayari lamang ng pointer, kaya c + + perpektong wastong at ito ay dagdagan ng 1. 825 01:12:22,610 --> 01:12:32,440 Kung c ay isang int *, pagkatapos c + + ay 104. 826 01:12:32,440 --> 01:12:41,250 + + Gumagana ang pointer aritmetika tulad ng c + 1 ay magkakaroon gawin pointer aritmetika. 827 01:12:43,000 --> 01:12:48,870 Ito ay talagang kung paano ang isang maraming mga bagay tulad ng pagsasama-uuri - 828 01:12:49,670 --> 01:12:55,710 Sa halip ng paglikha ng mga kopya ng mga bagay, maaari mong halip pumasa - 829 01:12:55,710 --> 01:13:02,400 Nais kung gusto ko upang pumasa ito kalahati ng array - hayaan ang burahin ang ilan sa mga ito. 830 01:13:04,770 --> 01:13:10,520 Sabihin nating gusto ko upang pumasa ito bahagi ng array sa isang function. 831 01:13:10,520 --> 01:13:12,700 Ano ang gusto kong ipasa na ang function? 832 01:13:12,700 --> 01:13:17,050 Kung pumasa ako x, ako ang pagpasa sa address na ito. 833 01:13:17,050 --> 01:13:23,780 Ngunit nais ko upang pumasa sa partikular na address na ito. Kaya ano ang dapat kong ipasa? 834 01:13:23,780 --> 01:13:26,590 [Mag-aaral] pointer + 2? 835 01:13:26,590 --> 01:13:29,350 [Bowden] Kaya x + 2. Oo. 836 01:13:29,350 --> 01:13:31,620 Na pagpunta sa address na ito. 837 01:13:31,620 --> 01:13:42,810 Makikita mo rin napaka madalas na makita ang mga ito bilang x [2] at pagkatapos ay ang address na iyon. 838 01:13:42,810 --> 01:13:47,850 Kaya kailangan mo ang address ng dahil bracket ay isang implicit dereference. 839 01:13:47,850 --> 01:13:53,250 x [2] ay tumutukoy sa halaga na sa kahon na ito, at pagkatapos ay nais mo ang address ng kahon na, 840 01:13:53,250 --> 01:13:56,850 kaya sabihin mo & x [2]. 841 01:13:56,850 --> 01:14:02,880 Kaya, na kung paano isang bagay sa pagsasama-uuri na kung saan nais mong pumasa sa kalahati ng listahan sa isang bagay 842 01:14:02,880 --> 01:14:08,790 mo ba talagang lamang pumasa sa & x [2], at ngayon bilang malayo bilang recursive tawag ay nababahala, 843 01:14:08,790 --> 01:14:12,510 aking bagong array nagsisimula doon. 844 01:14:12,510 --> 01:14:15,130 Huling minuto tanong. 845 01:14:15,130 --> 01:14:20,050 [Mag-aaral] Kung hindi namin maglagay ng isang ampersand o - kung ano ang na tinatawag? >> Star? 846 01:14:20,050 --> 01:14:23,200 [Mag-aaral] Star. >> Technically, dereference operator, ngunit - >> [mag-aaral] Dereference. 847 01:14:23,200 --> 01:14:29,310 >> Kung hindi namin maglagay ng star o isang ampersand, ano ang mangyayari kung ko lang sabihin y = x at x ay isang pointer? 848 01:14:29,310 --> 01:14:34,620 Ano ang uri ng y? >> [Mag-aaral] kukunin ko na lang sabihin ito ng pointer 2. 849 01:14:34,620 --> 01:14:38,270 Kaya kung sabihin mo lamang y = x, ngayon x at y punto sa parehong bagay. >> [Mag-aaral] Point sa parehong bagay. 850 01:14:38,270 --> 01:14:45,180 At kung ang x ay isang int pointer? >> Ito magreklamo dahil hindi ka maaaring magtalaga ng mga payo. 851 01:14:45,180 --> 01:14:46,540 [Mag-aaral] Okay. 852 01:14:46,540 --> 01:14:51,860 Tandaan na payo, kahit na namin gumuhit ng mga ito bilang mga arrow, 853 01:14:51,860 --> 01:15:02,010 talagang lahat ng sila tindahan - int * x - talaga x lahat ng pag-iimbak ng isang bagay tulad ng ox100, 854 01:15:02,010 --> 01:15:06,490 na mangyari namin upang kumatawan bilang na tumuturo sa block na naka-imbak sa 100. 855 01:15:06,490 --> 01:15:19,660 Kaya kapag sinabi ko int * y = x; lang ako pagkopya ox100 sa y, 856 01:15:19,660 --> 01:15:24,630 kung saan lang namin ang pagpunta sa kumakatawan sa bilang y, din na tumuturo sa ox100. 857 01:15:24,630 --> 01:15:39,810 At kung sinasabi ko int i = (int) x; pagkatapos ay i upang mag-imbak anuman ang halaga ng ox100 858 01:15:39,810 --> 01:15:45,100 sa loob nito, ngunit ngayon ito pagpunta sa kahulugan bilang isang integer sa halip ng isang pointer. 859 01:15:45,100 --> 01:15:49,310 Ngunit kailangan mo ang nagsumite ng kung ito ay magreklamo. 860 01:15:49,310 --> 01:15:53,300 [Mag-aaral] Kaya mo bang sabihin na pinalayas - 861 01:15:53,300 --> 01:16:00,290 Ay ito pagpunta sa paghahagis ng int ng x o Casting int ng y? 862 01:16:00,290 --> 01:16:03,700 [Bowden] Ano? 863 01:16:03,700 --> 01:16:07,690 [Mag-aaral] Okay. Pagkatapos ng mga panaklong ay mayroong pagpunta sa isang x o ay doon? 864 01:16:07,690 --> 01:16:11,500 >> [Bowden] Alinman. x at y ay katumbas. >> [Mag-aaral] Okay. 865 01:16:11,500 --> 01:16:14,390 Dahil hindi nila parehong payo. >> Oo. 866 01:16:14,390 --> 01:16:21,050 [Mag-aaral] Kaya ito ay magdudulot ng iimbak ang hexadecimal 100 sa integer anyo? >> [Bowden] Oo. 867 01:16:21,050 --> 01:16:23,620 Ngunit hindi ang halaga ng anumang punto upang. 868 01:16:23,620 --> 01:16:29,940 [Bowden] Oo. >> [Mag-aaral] Kaya lang ang mga address sa form na integer. Okay. 869 01:16:29,940 --> 01:16:34,720 [Bowden] Kung nais mong para sa ilang mga kakaibang dahilan, 870 01:16:34,720 --> 01:16:38,900 maaari kang eksklusibong humarap sa payo at hindi kailanman makitungo sa integer 871 01:16:38,900 --> 01:16:49,240 at tulad ng int * x = 0. 872 01:16:49,240 --> 01:16:53,000 Pagkatapos ka pagpunta upang talagang nalilito sa sandaling pointer aritmetika nagsisimula nangyayari. 873 01:16:53,000 --> 01:16:56,570 Kaya ang mga numero na imbak ng sila ay walang kahulugan. 874 01:16:56,570 --> 01:16:58,940 Kung lang kung paano mo pagbibigay-kahulugan ang mga ito. 875 01:16:58,940 --> 01:17:02,920 Kaya ako libreng upang kopyahin ang ox100 mula sa isang int * sa isang int, 876 01:17:02,920 --> 01:17:07,790 at ako ay libreng upang magtalaga - you're marahil pagpunta upang yelled sa para sa hindi paghahagis - 877 01:17:07,790 --> 01:17:18,160 Ako libreng upang magtalaga ng isang bagay tulad ng (int *) ox1234 sa ito arbitrary int *. 878 01:17:18,160 --> 01:17:25,480 Kaya ox123 ay tulad ng wastong ng memory address na & ya. 879 01:17:25,480 --> 01:17:32,060 & Yahin ang mangyayari upang magbalik ng bagay na medyo mas ox123. 880 01:17:32,060 --> 01:17:35,430 [Mag-aaral] Gusto na talagang cool na paraan upang pumunta mula sa hexadecimal sa decimal form na, 881 01:17:35,430 --> 01:17:39,230 bang kung mayroon kang isang pointer at pinalayas mo ito bilang isang int? 882 01:17:39,230 --> 01:17:44,860 [Bowden] Maaari mong talagang lamang print gamit tulad ng printf. 883 01:17:44,860 --> 01:17:50,300 Ipagpalagay natin na mayroon akong int y = 100. 884 01:17:50,300 --> 01:18:02,700 Kaya printf (% d \ n - bilang dapat alam mo na - i-print na bilang isang integer,% x. 885 01:18:02,700 --> 01:18:05,190 Lang namin i-print ang mga ito bilang hexadecimal. 886 01:18:05,190 --> 01:18:10,760 Kaya ang pointer ay hindi naka-imbak bilang hexadecimal, 887 01:18:10,760 --> 01:18:12,960 at isang integer ay hindi naka-imbak bilang decimal. 888 01:18:12,960 --> 01:18:14,700 Lahat ay naka-imbak bilang binary. 889 01:18:14,700 --> 01:18:17,950 Lang na may posibilidad namin upang ipakita ang mga payo bilang hexadecimal 890 01:18:17,950 --> 01:18:23,260 dahil sa tingin namin ng mga bagay sa mga 4-byte na bloke, 891 01:18:23,260 --> 01:18:25,390 at memory address ay may posibilidad na maging pamilyar. 892 01:18:25,390 --> 01:18:28,890 Humihingi kami ng tulad ng, kung nagsisimula ito sa bf, ito ang mangyayari sa stack. 893 01:18:28,890 --> 01:18:35,560 Kaya aming interpretasyon ng payo bilang hexadecimal. 894 01:18:35,560 --> 01:18:39,200 Okay. Anumang huling tanong? 895 01:18:39,200 --> 01:18:41,700 >> Makikita ko dito para sa isang bit pagkatapos kung mayroon kang anumang bagay. 896 01:18:41,700 --> 01:18:46,070 At na ang dulo ng na. 897 01:18:46,070 --> 01:18:48,360 >> [Mag-aaral] Yay! [Palakpakan] 898 01:18:51,440 --> 01:18:53,000 >> [CS50.TV]