1 00:00:00,000 --> 00:00:06,030 >> [MUSIC nagpe-play] 2 00:00:06,030 --> 00:00:08,390 >> DOUG LLOYD: Payo, dito tayo. 3 00:00:08,390 --> 00:00:11,080 Ito ay marahil pagpunta sa ang pinaka-mahirap na paksa 4 00:00:11,080 --> 00:00:12,840 na makipag-usap namin tungkol sa CS50. 5 00:00:12,840 --> 00:00:15,060 At kung nabasa mo na kahit ano tungkol sa mga payo 6 00:00:15,060 --> 00:00:19,080 bago mo maaaring maging isang maliit na piraso pananakot ng pagpunta sa video na ito. 7 00:00:19,080 --> 00:00:21,260 Ito ay totoo ang mga payo pinapayagan ka ng kakayahan 8 00:00:21,260 --> 00:00:23,740 upang marahil magtaas medyo maayos na kapag ikaw ay 9 00:00:23,740 --> 00:00:27,450 nagtatrabaho sa mga variable, at data, at nagiging sanhi ng iyong mga programa ng pag-crash. 10 00:00:27,450 --> 00:00:30,490 Ngunit ang mga ito ang tunay na talagang kapaki-pakinabang at payagan ang mga ito sa amin ng isang talagang mahusay na paraan 11 00:00:30,490 --> 00:00:33,340 upang pumasa data sa likod at balik sa pagitan ng mga pag-andar, 12 00:00:33,340 --> 00:00:35,490 na kami sa kabilang banda ay hindi na gawin. 13 00:00:35,490 --> 00:00:37,750 >> At kaya kung ano ang aming talagang gusto mong gawin dito ay tren 14 00:00:37,750 --> 00:00:41,060 mong magkaroon ng mahusay na disiplina pointer, kaya na maaari mong gamitin ang mga payo epektibong 15 00:00:41,060 --> 00:00:43,850 upang gawin ang iyong mga programa na mas mahusay. 16 00:00:43,850 --> 00:00:48,220 Tulad ng sinabi ko payo bigyan kami ng isang iba't ibang mga paraan upang pumasa data sa pagitan ng mga pag-andar. 17 00:00:48,220 --> 00:00:50,270 Ngayon kung ang pagpapabalik sa iyo mula sa isang mas naunang video, kapag 18 00:00:50,270 --> 00:00:53,720 kami ay pakikipag-usap tungkol sa variable na saklaw, nabanggit ko 19 00:00:53,720 --> 00:01:00,610 na ang lahat ng data na ipasa namin sa pagitan ng function sa C ay dumaan sa pamamagitan ng halaga. 20 00:01:00,610 --> 00:01:03,070 At hindi ko maaaring magkaroon ng ginagamit na term, ano ang ibig sabihin ko doon 21 00:01:03,070 --> 00:01:07,170 ay na ang pagpasa namin ay mga kopya ng data. 22 00:01:07,170 --> 00:01:12,252 Kapag pumasa namin ang isang variable sa isang function, hindi kami talagang makapasa sa variable 23 00:01:12,252 --> 00:01:13,210 sa pag-andar, tama? 24 00:01:13,210 --> 00:01:17,670 Kami ay pagpasa ng isang kopya ng ang data na iyon sa pag-andar. 25 00:01:17,670 --> 00:01:20,760 Ang function na ay kung ano ay ito at ito kinakalkula ilang mga halaga, 26 00:01:20,760 --> 00:01:23,180 at baka ginagamit namin ang halaga na kapag ito ay nagbibigay sa likod. 27 00:01:23,180 --> 00:01:26,700 >> Nagkaroon ng isang pagbubukod sa sa alituntuning ito ng pagpasa sa pamamagitan ng halaga, 28 00:01:26,700 --> 00:01:31,210 at kami ay bumalik sa kung ano na ang ay isang maliit na sa susunod sa video na ito. 29 00:01:31,210 --> 00:01:34,880 Sa halip Kung gagamitin namin ang mga payo ng paggamit ng mga variable, 30 00:01:34,880 --> 00:01:38,180 o sa halip ng paggamit ng mga variable kanilang mga sarili o ng mga kopya ng mga variable, 31 00:01:38,180 --> 00:01:43,790 maaari naming ngayon ipasa ang mga variable sa paligid pagitan ng mga function sa isang iba't ibang mga paraan. 32 00:01:43,790 --> 00:01:46,550 Nangangahulugan ito na kung gawin namin isang pagbabago sa isang function, 33 00:01:46,550 --> 00:01:49,827 pagbabago na talagang magdadala epekto sa ibang function. 34 00:01:49,827 --> 00:01:52,160 Muli, ito ay isang bagay na hindi namin maaaring gawin dati, 35 00:01:52,160 --> 00:01:56,979 at kung sakaling mo na sinubukan upang magpalit ng halaga ng dalawang variable sa isang function, 36 00:01:56,979 --> 00:01:59,270 napansin mo ang problemang ito uri ng gumagapang up, di ba? 37 00:01:59,270 --> 00:02:04,340 >> Kung gusto namin upang magpalitan ng X at Y, at kami ipasa ang mga ito sa isang function na tinatawag na swap, 38 00:02:04,340 --> 00:02:08,680 sa loob ng function na magpalit ng mga variable gawin exchange halaga. 39 00:02:08,680 --> 00:02:12,600 One nagiging dalawa, dalawang nagiging isa, ngunit hindi namin talagang 40 00:02:12,600 --> 00:02:16,890 baguhin ang anumang bagay sa orihinal na function, sa mga tumatawag. 41 00:02:16,890 --> 00:02:19,550 Dahil hindi namin, hindi namin lamang nagtatrabaho sa mga kopya ng mga ito. 42 00:02:19,550 --> 00:02:24,760 Sa mga payo bagaman, maaari naming talagang pumasa X at Y sa isang function. 43 00:02:24,760 --> 00:02:26,960 Maaaring gawin function na isang bagay sa kanila. 44 00:02:26,960 --> 00:02:29,250 At ang mga variable na halaga aktwal na maaaring baguhin. 45 00:02:29,250 --> 00:02:33,710 Kaya na ay lubos ng isang pagbabago sa ang aming kakayahan upang gumana sa data. 46 00:02:33,710 --> 00:02:36,100 >> Bago namin sumisid sa mga payo, sa tingin ko ito ay nagkakahalaga ng 47 00:02:36,100 --> 00:02:38,580 pagkuha ng ilang minuto upang bumalik sa pangunahing kaalaman dito. 48 00:02:38,580 --> 00:02:41,000 At magkaroon ng isang pagtingin sa kung paano gawa ng computer memory 49 00:02:41,000 --> 00:02:45,340 sapagka't ang dalawang paksa ay pagpunta sa tunay na maging pretty magkakaugnay. 50 00:02:45,340 --> 00:02:48,480 Bilang mo marahil alam, sa iyong computer system 51 00:02:48,480 --> 00:02:51,310 ikaw ay may isang hard drive o marahil ng isang solid drive ng estado, 52 00:02:51,310 --> 00:02:54,430 ilang uri ng mga lokasyon ng imbakan ng file. 53 00:02:54,430 --> 00:02:57,950 Ito ay karaniwang isang lugar sa kabayanan ng 250 gigabytes 54 00:02:57,950 --> 00:02:59,810 upang marahil isang pares ng terabytes ngayon. 55 00:02:59,810 --> 00:03:02,270 At ito ay kung saan ang lahat ng iyong file sa huli ay nakatira, 56 00:03:02,270 --> 00:03:04,870 kahit na kapag ang iyong computer ay shut off, maaari mo itong i-pabalik sa 57 00:03:04,870 --> 00:03:09,190 at makikita mo ang iyong mga file ay may muli kapag reboot mo ang iyong system. 58 00:03:09,190 --> 00:03:14,820 Ngunit disk drive, tulad ng isang hard disk drive, isang HDD, o isang solid drive ng estado, isang SSD, 59 00:03:14,820 --> 00:03:16,050 mga puwang lamang storage. 60 00:03:16,050 --> 00:03:20,400 >> Hindi namin maaaring aktwal na gawin sa ang data na nasa hard disk, 61 00:03:20,400 --> 00:03:22,080 o sa isang solid estado drive. 62 00:03:22,080 --> 00:03:24,950 Upang tunay na baguhin data o ilipat ito sa paligid, 63 00:03:24,950 --> 00:03:28,800 kami ay may upang ilipat ito sa RAM, random access memory. 64 00:03:28,800 --> 00:03:31,170 Ngayon RAM, mayroon kang maraming mas mababa ng sa iyong computer. 65 00:03:31,170 --> 00:03:34,185 Ikaw ay maaaring magkaroon saanman sa kabayanan ng 512 megabytes 66 00:03:34,185 --> 00:03:38,850 kung ikaw ay may isang mas lumang mga computer, na siguro dalawa, apat, walo, 16, 67 00:03:38,850 --> 00:03:41,820 marahil kahit na isang maliit higit pa, gigabytes ng RAM. 68 00:03:41,820 --> 00:03:46,390 Kaya na ang mas maliit, ngunit iyan ay kung saan ang lahat ng mga salawahan data ay umiiral na. 69 00:03:46,390 --> 00:03:48,270 Iyon ay kung saan maaari naming baguhin ang mga bagay. 70 00:03:48,270 --> 00:03:53,350 Ngunit kapag binuksan namin ang aming mga computer off, ang lahat ng data sa RAM ay pupuksain. 71 00:03:53,350 --> 00:03:57,150 >> Kaya na ang dahilan kung bakit kailangan naming magkaroon ng hard disk para sa mas permanenteng lokasyon ng mga ito, 72 00:03:57,150 --> 00:03:59,720 upang ang exists- ito gagawin ito maging ganap na hindi maayos kung sa bawat oras na namin 73 00:03:59,720 --> 00:04:03,310 naka aming computer off, ang bawat file sa aming sistema ay obliterated. 74 00:04:03,310 --> 00:04:05,600 Kaya ang trabaho namin sa loob ng RAM. 75 00:04:05,600 --> 00:04:09,210 At sa tuwing pinag-uusapan natin ang tungkol sa memory, medyo marami, sa CS50, 76 00:04:09,210 --> 00:04:15,080 pinag-uusapan natin ang tungkol sa RAM, hindi hard disk. 77 00:04:15,080 --> 00:04:18,657 >> Kaya kapag lumipat kami ng mga bagay sa memory, ito ay tumatagal ng hanggang sa isang tiyak na halaga ng puwang. 78 00:04:18,657 --> 00:04:20,740 Ang lahat ng mga uri ng data na kami ay nagtatrabaho sa 79 00:04:20,740 --> 00:04:23,480 tumagal ng hanggang iba't ibang halaga ng puwang sa RAM. 80 00:04:23,480 --> 00:04:27,600 Kaya sa bawat oras na lumikha ng isang integer variable, apat na bytes ng memory 81 00:04:27,600 --> 00:04:30,750 ay magtabi sa RAM kaya mo maaaring gumana sa na integer. 82 00:04:30,750 --> 00:04:34,260 Maaari mong ipahayag ang mga integer, baguhin ito, italaga ito 83 00:04:34,260 --> 00:04:36,700 sa halagang 10 incremented sa pamamagitan ng isa, kaya sa at iba pa. 84 00:04:36,700 --> 00:04:39,440 Lahat na mga pangangailangan sa mangyayari sa RAM, at makakakuha ka ng apat bytes 85 00:04:39,440 --> 00:04:42,550 upang gumana sa para sa bawat integer na kang lumikha. 86 00:04:42,550 --> 00:04:45,410 >> Ang bawat karakter mo lumikha ng isa nakukuha byte. 87 00:04:45,410 --> 00:04:48,160 Iyon ang dahilan lamang kung magkano ang space ay kinakailangan upang mag-imbak ng isang character. 88 00:04:48,160 --> 00:04:51,310 Bawat float, isang tunay na number, makakakuha ng apat na bytes 89 00:04:51,310 --> 00:04:53,390 maliban kung ito ay isang double precision lumulutang point 90 00:04:53,390 --> 00:04:56,510 numero, na kung saan ay nagbibigay-daan sa iyo upang magkaroon ng mas tumpak o higit pang mga digit 91 00:04:56,510 --> 00:04:59,300 pagkatapos ng decimal point nang hindi nawawala ang katumpakan, 92 00:04:59,300 --> 00:05:01,820 na tumagal ng hanggang sa walong bytes ng memorya. 93 00:05:01,820 --> 00:05:06,730 Long longs, talagang malaking integer, ring kumuha ng up ng walong bytes ng memorya. 94 00:05:06,730 --> 00:05:09,000 Gaano karaming bytes ng memory huwag string tumagal ng hanggang? 95 00:05:09,000 --> 00:05:12,990 Maglagay ng isang pin sa tanong na rin ipaalam para sa ngayon, ngunit kami ay bumalik na ito. 96 00:05:12,990 --> 00:05:17,350 >> Kaya bumalik sa ideya na ito ng memorya bilang isang malaking hanay ng mga cell byte-sized. 97 00:05:17,350 --> 00:05:20,871 Iyan ay talagang ang lahat ng ito ay, ito ay lamang ng isang malaking hanay ng mga cell, 98 00:05:20,871 --> 00:05:23,370 tulad ng anumang iba pang mga array na pamilyar ka sa at makita, 99 00:05:23,370 --> 00:05:26,430 maliban bawat elemento ay isa byte wide. 100 00:05:26,430 --> 00:05:30,030 At tulad ng isang array, bawat elemento ay may isang address. 101 00:05:30,030 --> 00:05:32,120 Ang bawat elemento ng isang array ay may isang index, at kami 102 00:05:32,120 --> 00:05:36,302 maaaring gumamit ng index na gawin sa tinatawag na random access sa array. 103 00:05:36,302 --> 00:05:38,510 Wala kaming upang magsimula sa sa simula ng array, 104 00:05:38,510 --> 00:05:40,569 umulit sa pamamagitan ng bawat solong elemento nito, 105 00:05:40,569 --> 00:05:41,860 upang makita kung ano ang aming hinahanap. 106 00:05:41,860 --> 00:05:45,790 Maaari lang namin sabihin, gusto ko upang makakuha ng sa Ika-15 na sangkap o ang ika-100 na element. 107 00:05:45,790 --> 00:05:49,930 At maaari ka lamang pumasa sa numero na at makuha ang halaga na iyong hinahanap. 108 00:05:49,930 --> 00:05:54,460 >> Sa katulad na paraan sa bawat lokasyon sa memory ay isang address. 109 00:05:54,460 --> 00:05:57,320 Kaya ang iyong memory baka magmumukhang ganito. 110 00:05:57,320 --> 00:06:01,420 Narito ang isang tunay maliit na tipak ng memory, ito ay 20 bytes ng memorya. 111 00:06:01,420 --> 00:06:04,060 Ang unang 20 bytes dahil ang aking address doon sa ibaba 112 00:06:04,060 --> 00:06:08,890 ay 0, 1, 2, 3, at iba sa lahat ng mga paraan ng hanggang sa 19. 113 00:06:08,890 --> 00:06:13,190 At kapag Ipinahahayag ko variable at kapag binuksan ko na magtrabaho sa mga ito, 114 00:06:13,190 --> 00:06:15,470 ang sistema ay pagpunta sa set Magbibigay ng ilang espasyo para sa akin 115 00:06:15,470 --> 00:06:17,595 sa memory sa trabaho sa aking mga variable. 116 00:06:17,595 --> 00:06:21,610 Kaya maaaring sabihin ko, char c ay katumbas ng capital H. At kung ano ang nangyayari sa mangyayari? 117 00:06:21,610 --> 00:06:23,880 Well ang sistema ay pagpunta sa magtabi para sa akin ang isa byte. 118 00:06:23,880 --> 00:06:27,870 Sa kasong ito pinili ito number byte apat, ang byte sa address apat, 119 00:06:27,870 --> 00:06:31,310 at ito ay pagpunta sa tindahan ng sulat capital H sa doon para sa akin. 120 00:06:31,310 --> 00:06:34,350 Kung pagkatapos kong sabihin speed int limit ay katumbas ng 65, ito ay 121 00:06:34,350 --> 00:06:36,806 pagpunta sa magtabi ng apat bytes ng memory para sa akin. 122 00:06:36,806 --> 00:06:39,180 At ito ang nangyayari sa paggamot sa mga apat na bytes bilang isang yunit 123 00:06:39,180 --> 00:06:41,305 dahil kung ano kami ay nagtatrabaho may ay isang integer dito. 124 00:06:41,305 --> 00:06:44,350 At ito ang nangyayari sa tindahan ng 65 sa doon. 125 00:06:44,350 --> 00:06:47,000 >> Ngayon na ako ang uri ng na nagsasabi sa iyo ng isang piraso ng isang kasinungalingan, 126 00:06:47,000 --> 00:06:50,150 karapatan, dahil alam namin na computer na trabaho sa binary. 127 00:06:50,150 --> 00:06:53,100 Hindi nila maunawaan kinakailangan kung ano ang isang capital H ay 128 00:06:53,100 --> 00:06:57,110 o kung ano ang isang 65 ay, sila lamang maunawaan binary, zero at mga. 129 00:06:57,110 --> 00:06:59,000 At kaya kung ano ang tunay kami ay nag-iimbak sa doon 130 00:06:59,000 --> 00:07:03,450 ay hindi ang titik H at ang bilang 65, ngunit sa halip ang binary na representasyon 131 00:07:03,450 --> 00:07:06,980 niyaon, na tumingin ng isang maliit na bagay tulad nito. 132 00:07:06,980 --> 00:07:10,360 At sa partikular na sa konteksto ng mga integer variable, 133 00:07:10,360 --> 00:07:13,559 hindi ito ay pagpunta sa dumura lamang ito sa, hindi ito ay pagpunta upang matrato ito bilang isa sa apat na 134 00:07:13,559 --> 00:07:15,350 byte tipak kinakailangan, talagang ito ay pagpunta 135 00:07:15,350 --> 00:07:19,570 na ituring ito bilang apat isa chunks byte, kung saan ay maaaring tumingin ng isang bagay tulad nito. 136 00:07:19,570 --> 00:07:22,424 At kahit na ito ay hindi lubos na totoo ang alinman sa, 137 00:07:22,424 --> 00:07:24,840 dahil sa isang bagay na tinatawag na isang endianness, na kung saan kami ay hindi 138 00:07:24,840 --> 00:07:26,965 pagpunta sa kumuha sa ngayon, ngunit kung gusto mong malaman ang tungkol sa, 139 00:07:26,965 --> 00:07:29,030 maaari mong basahin hanggang sa maliit na at malaking endianness. 140 00:07:29,030 --> 00:07:31,640 Ngunit para sa kapakanan ng mga argument na ito, para sa kapakanan ng video na ito, 141 00:07:31,640 --> 00:07:34,860 akala lang iyon ay, sa ipaalam katunayan, kung paano ang bilang na 65 gagawin 142 00:07:34,860 --> 00:07:36,970 kinakatawan sa memory sa bawat sistema, 143 00:07:36,970 --> 00:07:38,850 kahit na ito ay hindi ganap na totoo. 144 00:07:38,850 --> 00:07:41,700 >> Ngunit sabihin aktwal lamang makuha alisan ng lahat ng binary ganap, 145 00:07:41,700 --> 00:07:44,460 at sa tingin lamang tungkol sa bilang H at 65, ito ay isang mas madaling 146 00:07:44,460 --> 00:07:47,900 mag-isip tungkol sa mga ito tulad ng na bilang isang tao. 147 00:07:47,900 --> 00:07:51,420 Lahat ng mga karapatan, sa gayon ito rin ay tila marahil isang maliit na random na I've- aking sistema 148 00:07:51,420 --> 00:07:55,130 ay hindi ninyo ako bytes 5, 6, 7, at 8 sa tindahan ng mga integer. 149 00:07:55,130 --> 00:07:58,580 May isang dahilan para sa na, masyadong, na Hindi namin makuha sa ngayon, ngunit makasapat 150 00:07:58,580 --> 00:08:00,496 ito sa sabihin na kung ano ang ay ginagawa dito ng computer 151 00:08:00,496 --> 00:08:02,810 ay marahil isang magandang ilipat sa bahagi nito. 152 00:08:02,810 --> 00:08:06,020 Upang hindi ninyo ako memory na kinakailangang i-back sa likod. 153 00:08:06,020 --> 00:08:10,490 Kahit na ito ay pagpunta sa gawin ito ngayon kung gusto ko upang makakuha ng isa pang string, 154 00:08:10,490 --> 00:08:13,080 tinatawag na apelyido, at gusto ko upang ilagay Lloyd doon. 155 00:08:13,080 --> 00:08:18,360 Pupunta ako sa kailangan upang umangkop sa isa character, ang bawat titik ng iyan ay 156 00:08:18,360 --> 00:08:21,330 pagpunta sa nangangailangan ng isa character, isang byte ng memorya. 157 00:08:21,330 --> 00:08:26,230 Kaya kung maaari ko bang ilagay Lloyd sa aking array tulad nito Ako ay medyo magandang pumunta, di ba? 158 00:08:26,230 --> 00:08:28,870 Ano ang nawawala? 159 00:08:28,870 --> 00:08:31,840 >> Tandaan na ang bawat string ng trabaho namin may in C nagtatapos sa backslash zero, 160 00:08:31,840 --> 00:08:33,339 at hindi namin maaaring ligtaan na dito, alinman. 161 00:08:33,339 --> 00:08:36,090 Kailangan namin na maglaan ng isang byte ng memory upang i-hold na kaya namin 162 00:08:36,090 --> 00:08:39,130 Alam kapag ang aming mga string ay natapos. 163 00:08:39,130 --> 00:08:41,049 Kaya muli-aayos na ito ng paraan ng mga bagay 164 00:08:41,049 --> 00:08:42,799 lumitaw sa memory kapangyarihan maging isang maliit na random, 165 00:08:42,799 --> 00:08:44,870 ngunit ito talaga ay kung paano karamihan sa mga system ay dinisenyo. 166 00:08:44,870 --> 00:08:48,330 Sa line up ang mga ito sa multiple ng apat na, para sa mga kadahilanan na muli 167 00:08:48,330 --> 00:08:50,080 na hindi natin kailangang kumuha sa ngayon. 168 00:08:50,080 --> 00:08:53,060 Ngunit ito, kaya magkasiya ito upang sabihin na pagkatapos ng mga tatlong linya ng code, 169 00:08:53,060 --> 00:08:54,810 ito ay kung ano ang maaaring maging hitsura memory gusto. 170 00:08:54,810 --> 00:08:58,930 Kung kailangan ko lokasyon ng memorya 4, 8, at 12 na hawakan ang aking data, 171 00:08:58,930 --> 00:09:01,100 ito ay kung ano ang maaaring maging hitsura ng aking memory gusto. 172 00:09:01,100 --> 00:09:04,062 >> At maging partikular lamang pedantic dito, kapag 173 00:09:04,062 --> 00:09:06,020 pinag-uusapan natin ang tungkol sa memory addresses namin karaniwang 174 00:09:06,020 --> 00:09:08,390 gawin ito gamit hexadecimal notasyon. 175 00:09:08,390 --> 00:09:12,030 Kaya bakit hindi convert namin ang lahat ng mga mula sa decimal sa hexadecimal notasyon 176 00:09:12,030 --> 00:09:15,010 dahil lang na sa pangkalahatan kung paano namin sumangguni sa memory. 177 00:09:15,010 --> 00:09:17,880 Kaya sa halip ng pagiging 0 hanggang 19, kung ano ang mayroon kami ay zero 178 00:09:17,880 --> 00:09:20,340 x zero sa pamamagitan ng zero x1 tatlo. 179 00:09:20,340 --> 00:09:23,790 Iyon ang mga 20 bytes ng memorya na namin may o kaming naghahanap sa sa imahe na ito 180 00:09:23,790 --> 00:09:25,540 dito. 181 00:09:25,540 --> 00:09:29,310 >> Kaya lahat ng na ang pagiging sinabi, sabihin hakbang ang layo mula sa memory para sa isang segundo 182 00:09:29,310 --> 00:09:30,490 at bumalik sa mga payo. 183 00:09:30,490 --> 00:09:32,420 Narito ang pinaka-mahalaga bagay na dapat tandaan 184 00:09:32,420 --> 00:09:34,070 bilang namin simulan ang nagtatrabaho sa mga payo. 185 00:09:34,070 --> 00:09:36,314 Ang isang pointer ay wala higit sa isang address. 186 00:09:36,314 --> 00:09:38,230 Sasabihin kong ito muli dahil ito ay na mahalaga, 187 00:09:38,230 --> 00:09:42,730 isang pointer ay wala higit sa isang address. 188 00:09:42,730 --> 00:09:47,760 Payo ay addresses sa mga lokasyon sa memorya kung saan variable nakatira. 189 00:09:47,760 --> 00:09:52,590 Alam na ito ay nagiging sana ay isang kaunti mas madali upang gumana sa mga ito. 190 00:09:52,590 --> 00:09:54,550 Isa pang bagay na gusto ko na gawin ay ang magkaroon ng isang uri 191 00:09:54,550 --> 00:09:58,510 ng diagram biswal na kumakatawan sa kung ano ang nangyayari sa iba't-ibang linya ng code. 192 00:09:58,510 --> 00:10:00,660 At kami na gawin ito ng ilang ng mga beses sa mga payo, 193 00:10:00,660 --> 00:10:03,354 at kapag kami makipag-usap tungkol sa mga dynamic memory laang-gugulin rin. 194 00:10:03,354 --> 00:10:06,020 Dahil sa tingin ko na ang mga diagram maaaring maging partikular na kapaki-pakinabang. 195 00:10:06,020 --> 00:10:09,540 >> Kaya kung sinasabi ko halimbawa, int k sa aking code, ano ang nangyayari? 196 00:10:09,540 --> 00:10:12,524 Well kung ano ang karaniwang nangyayari ay Nakakakuha ako ng memory na magtabi para sa akin, 197 00:10:12,524 --> 00:10:14,690 ngunit hindi ko kahit na nais na isipin ang tungkol sa mga ito tulad na, ako 198 00:10:14,690 --> 00:10:16,300 nais na isipin ang tungkol sa mga ito tulad ng isang kahon. 199 00:10:16,300 --> 00:10:20,090 Mayroon akong isang box at ito ay berdeng kulay dahil ako 200 00:10:20,090 --> 00:10:21,750 maaaring maglagay ng integer sa berdeng kahon. 201 00:10:21,750 --> 00:10:23,666 Kung ito ay isang character ko maaaring magkaroon ng isang asul na kahon. 202 00:10:23,666 --> 00:10:27,290 Ngunit laging kong sabihin, kung Lumilikha ako isang kahon na maaaring humawak ng integer 203 00:10:27,290 --> 00:10:28,950 na kahon ay kulay berde. 204 00:10:28,950 --> 00:10:33,020 At kumuha ako ng isang permanenteng marker at isulat ko k sa gilid ng mga ito. 205 00:10:33,020 --> 00:10:37,590 Kaya ako ay may isang kahon na tinatawag k, sa kung saan ang maaari kong ilagay integer. 206 00:10:37,590 --> 00:10:41,070 Kaya kapag sinabi ko int k, na ang kung ano ang mangyayari sa aking ulo. 207 00:10:41,070 --> 00:10:43,140 Kung aking sabihin k ay katumbas ng limang, kung ano ang aking ginagawa? 208 00:10:43,140 --> 00:10:45,110 Well, ako ng paglagay ng limang sa kahon, i-right. 209 00:10:45,110 --> 00:10:48,670 Ito ay medyo tapat, kung Sinasabi ko int k, lumikha ng isang kahon na tinatawag na k. 210 00:10:48,670 --> 00:10:52,040 Kung aking sabihin k katumbas ng 5, maglagay ng limang sa kahon. 211 00:10:52,040 --> 00:10:53,865 Sana na hindi masyadong maraming ng isang hakbang. 212 00:10:53,865 --> 00:10:55,990 Narito ang kung saan ang mga bagay pumunta sa isang maliit na kagiliw-giliw na kahit na. 213 00:10:55,990 --> 00:11:02,590 Kung aking sabihin int * pk, well kahit hindi ko malaman kung ano ang kinakailangan na ang ibig sabihin, 214 00:11:02,590 --> 00:11:06,150 malinaw na ito ay nakuha ng isang bagay ang gagawin sa isang integer. 215 00:11:06,150 --> 00:11:08,211 Kaya ako ng pagpunta sa kulay ang kahong green-ish, 216 00:11:08,211 --> 00:11:10,210 Alam ko na ito ay nakuha ng isang bagay ang gagawin sa isang integer, 217 00:11:10,210 --> 00:11:13,400 ngunit ito ay hindi isang integer mismo, dahil sa ito ay isang int star. 218 00:11:13,400 --> 00:11:15,390 Mayroong isang bagay na bahagyang iba't ibang tungkol dito. 219 00:11:15,390 --> 00:11:17,620 Kaya kasangkot isang integer, ang ngunit kung hindi man ito ay 220 00:11:17,620 --> 00:11:19,830 hindi masyadong naiiba mula sa kung ano ang pinag-uusapan natin ay tungkol sa. 221 00:11:19,830 --> 00:11:24,240 Ito ay isang box, nito got ang isang label, ito ay may suot ng isang label pk, 222 00:11:24,240 --> 00:11:27,280 at ito ay kaya ng mga humahawak int stars, ano man ang mga iyon ay. 223 00:11:27,280 --> 00:11:29,894 Sila ay may isang bagay na gawin may integer, malinaw. 224 00:11:29,894 --> 00:11:31,060 Narito ang huling linya bagaman. 225 00:11:31,060 --> 00:11:37,650 Kung aking sabihin pk = & k, aba, kung ano lamang ang nangyari, di ba? 226 00:11:37,650 --> 00:11:41,820 Kaya ito random na numero, tila random number, makakakuha ng itinapon doon sa kahon. 227 00:11:41,820 --> 00:11:44,930 Ang lahat ng iyon ay, ay pk nakukuha ang mga address ng mga k. 228 00:11:44,930 --> 00:11:52,867 Kaya ako ng malagkit kung saan k nakatira sa memorya, kanyang address, ang address ng bytes nito. 229 00:11:52,867 --> 00:11:55,200 Lahat ako paggawa ay ko sinasabi halaga na ito ay kung ano ako pagpunta 230 00:11:55,200 --> 00:11:59,430 upang ilagay sa loob ng aking kahon na tinatawag pk. 231 00:11:59,430 --> 00:12:02,080 At dahil ang mga bagay ay mga payo, at dahil naghahanap 232 00:12:02,080 --> 00:12:04,955 sa isang string tulad ng zero x walong zero c pitong apat na walong 233 00:12:04,955 --> 00:12:07,790 dalawang zero ay marahil hindi masyadong makabuluhan. 234 00:12:07,790 --> 00:12:12,390 Kapag kami ay karaniwang maisalarawan mga payo, talaga naming gawin ito bilang payo. 235 00:12:12,390 --> 00:12:17,000 Pk nagbibigay sa amin ng impormasyon kailangan namin upang makahanap k sa memorya. 236 00:12:17,000 --> 00:12:19,120 Kaya talaga pk ay may isang arrow sa loob nito. 237 00:12:19,120 --> 00:12:21,670 At kung ang aming lakad ang haba ng arrow na, akala 238 00:12:21,670 --> 00:12:25,280 ito ay isang bagay na maaari mong maglakad sa, kung tayo maglakad sa kahabaan ng haba ng arrow, 239 00:12:25,280 --> 00:12:29,490 sa tunay na dulo ng arrow na, kami ay hanapin ang lokasyon sa memorya 240 00:12:29,490 --> 00:12:31,390 kung saan nakatira k. 241 00:12:31,390 --> 00:12:34,360 At iyan ay talagang mahalaga dahil sa sandaling malaman namin kung saan nakatira k, 242 00:12:34,360 --> 00:12:37,870 maaari naming simulan upang magtrabaho kasama ang data sa loob ng na lokasyon sa memorya. 243 00:12:37,870 --> 00:12:40,780 Kahit na kami ay nakakakuha ng isang maliit bit maagang ng ating sarili para sa ngayon. 244 00:12:40,780 --> 00:12:42,240 >> Kaya kung ano ang isang pointer? 245 00:12:42,240 --> 00:12:45,590 Ang isang pointer ay isang item ng data na halaga ay isang memory address. 246 00:12:45,590 --> 00:12:49,740 Iyon ay na zero x walong zero stuff pagpunta sa, na noon ay isang memory address. 247 00:12:49,740 --> 00:12:52,060 Iyon ay isang lokasyon sa memorya. 248 00:12:52,060 --> 00:12:55,080 At ang uri ng isang pointer naglalarawan ng mga uri 249 00:12:55,080 --> 00:12:56,930 ng data na makikita ninyo sa address na memory. 250 00:12:56,930 --> 00:12:58,810 Kaya may mga int star bahagi ng karapatan. 251 00:12:58,810 --> 00:13:03,690 Kung susundin ko arrow iyan, pagpunta sa humantong ako sa isang lokasyon. 252 00:13:03,690 --> 00:13:06,980 At lokasyon na iyon, kung ano ang aking ay mahanap doon sa aking halimbawa, 253 00:13:06,980 --> 00:13:08,240 ay isang green na kulay na kahon. 254 00:13:08,240 --> 00:13:12,650 Ito ay isang integer, na kung ano ako mahahanap kung pumunta ako sa address na iyon. 255 00:13:12,650 --> 00:13:14,830 Ang uri ng data ng isang pointer ay naglalarawan kung ano ang 256 00:13:14,830 --> 00:13:17,936 makikita mo sa na memory address. 257 00:13:17,936 --> 00:13:19,560 Kaya dito ang talagang cool na bagay kahit na. 258 00:13:19,560 --> 00:13:25,090 Payagan payo sa amin na ipasa variable sa pagitan ng mga pag-andar. 259 00:13:25,090 --> 00:13:28,520 At talagang pumasa variable at hindi pumasa ang mga kopya ng mga ito. 260 00:13:28,520 --> 00:13:32,879 Dahil kung alam natin ang eksaktong sa memory upang mahanap ang isang variable, 261 00:13:32,879 --> 00:13:35,670 hindi namin kailangan upang gumawa ng isang kopya ng ito, maaari naming pumunta lamang sa na lokasyon 262 00:13:35,670 --> 00:13:37,844 at gumagana sa mga variable na iyon. 263 00:13:37,844 --> 00:13:40,260 Kaya sa kakanyahan payo uri ng gumawa ng isang computer na kapaligiran 264 00:13:40,260 --> 00:13:42,360 isang pulutong mas tulad ng sa totoong mundo, kanan. 265 00:13:42,360 --> 00:13:44,640 >> Kaya narito ang isang pagkakatulad. 266 00:13:44,640 --> 00:13:48,080 Sabihin natin na mayroon akong isang notebook, karapatan, at ito ay puno ng mga tala. 267 00:13:48,080 --> 00:13:50,230 At gusto ko sa iyo upang i-update ito. 268 00:13:50,230 --> 00:13:53,960 Ikaw ay isang function na update ng mga tala, right. 269 00:13:53,960 --> 00:13:56,390 Sa daan na nakaya naming nagtatrabaho sa ngayon, kung ano 270 00:13:56,390 --> 00:14:02,370 mangyayari ay ikaw ay kumuha ng aking notebook, kailangan mong pumunta sa mga kopya ng tindahan, 271 00:14:02,370 --> 00:14:06,410 ikaw ay gumawa ng isang Xerox copy ng ang bawat pahina ng notebook. 272 00:14:06,410 --> 00:14:09,790 Makikita iwan ang aking notebook sa likod sa aking desk kapag tapos ka na, 273 00:14:09,790 --> 00:14:14,600 kailangan mong pumunta at i-cross ang mga bagay sa aking notebook na sa labas ng petsa o mali, 274 00:14:14,600 --> 00:14:19,280 at pagkatapos ay makikita mo ipasa pabalik sa akin ang stack ng Xerox pahina 275 00:14:19,280 --> 00:14:22,850 na ay isang kopya ng aking mga notebook sa ang mga pagbabago na iyong ginawa sa mga ito. 276 00:14:22,850 --> 00:14:27,040 At sa puntong iyon, ikaw ang bahala sa akin bilang pagtawag sa function, pati na ang tumatawag, 277 00:14:27,040 --> 00:14:30,582 upang magpasya na kunin ang iyong mga tala at isama ang mga ito pabalik sa aking notebook. 278 00:14:30,582 --> 00:14:32,540 Kaya mayroong isang pulutong ng mga hakbang kasangkot dito, right. 279 00:14:32,540 --> 00:14:34,850 Tulad ng hindi ito ay magiging mas mahusay na kung ako lamang sabihin, hey, maaari mong 280 00:14:34,850 --> 00:14:38,370 i-update ang aking notebook para sa sa akin, kamay mo ang aking mga notebook, 281 00:14:38,370 --> 00:14:40,440 at kumuha ka ng mga bagay at literal cross ang mga ito sa labas 282 00:14:40,440 --> 00:14:42,810 at i-update ang aking mga tala sa aking notebook. 283 00:14:42,810 --> 00:14:45,140 At pagkatapos ay bigyan ako ng aking notebook back. 284 00:14:45,140 --> 00:14:47,320 Na ang uri ng kung ano ang payagan payo sa amin upang gawin, 285 00:14:47,320 --> 00:14:51,320 gumawa sila ng environment na ito ng maraming higit na katulad ng kung paano namin gumana sa katotohanan. 286 00:14:51,320 --> 00:14:54,640 >> Lahat ng mga karapatan sa gayon ay ang kung ano ang makipag-usap sa isang pointer ay, ipaalam 287 00:14:54,640 --> 00:14:58,040 tungkol sa kung paano gumagana ang mga payo sa C, at kung paano namin simulan upang gumana sa mga ito. 288 00:14:58,040 --> 00:15:02,550 Kaya mayroong isang napaka-simpleng pointer sa C na tinatawag na ang null pointer. 289 00:15:02,550 --> 00:15:04,830 Ang null pointer mga puntos sa wala. 290 00:15:04,830 --> 00:15:08,310 Ito marahil ay tila tulad ng ito ay talagang hindi isang lubhang kapaki-pakinabang na bagay, 291 00:15:08,310 --> 00:15:10,500 ngunit bilang namin makita ang isang maliit na sa paglaon, ang katunayan 292 00:15:10,500 --> 00:15:15,410 na ito ay umiiral na null pointer tunay na tunay ay maaaring dumating sa madaling-gamiting. 293 00:15:15,410 --> 00:15:19,090 At kapag lumikha ka ng isang pointer, at hindi ka nagtakda ng halaga immediately- nito 294 00:15:19,090 --> 00:15:21,060 isang halimbawa ng pagtatakda ang halaga nito ay agad-agad 295 00:15:21,060 --> 00:15:25,401 ay bumalik sa isang pares ng mga slide kung saan sinabi ko pk katumbas & k, 296 00:15:25,401 --> 00:15:28,740 pk makakakuha address k, tulad ng ipapakita namin makita kung ano ang ibig sabihin nito, 297 00:15:28,740 --> 00:15:32,990 ipapakita namin makita kung paano code na shortly- kung hindi namin itakda ang halaga nito sa isang bagay 298 00:15:32,990 --> 00:15:35,380 makabuluhan agad, ikaw ay dapat na laging 299 00:15:35,380 --> 00:15:37,480 itakda ang iyong pointer upang tumuro sa null. 300 00:15:37,480 --> 00:15:40,260 Dapat mong itakda ito upang tumuro sa wala. 301 00:15:40,260 --> 00:15:43,614 >> Iyan ay ibang-iba kaysa Aalis lang ang halaga na ito ay 302 00:15:43,614 --> 00:15:45,530 at pagkatapos ng deklarasyon ng isang pointer at lamang sa pag-aakala 303 00:15:45,530 --> 00:15:48,042 ito ay null dahil na bihira totoo. 304 00:15:48,042 --> 00:15:50,000 Kaya dapat palagi kang naka-set sa halaga ng isang pointer 305 00:15:50,000 --> 00:15:55,690 sa null kung hindi mo itakda ang halaga nito sa isang bagay na mahalaga kaagad. 306 00:15:55,690 --> 00:15:59,090 Maaari mong suriin kung ang halaga ng isang pointer ni ay null gamit ang pagkakapantay-pantay operator 307 00:15:59,090 --> 00:16:05,450 (==), Tulad lamang ng sa iyo na ihambing ang anumang integer mga halaga o mga halaga ng character na gamit (==) 308 00:16:05,450 --> 00:16:06,320 din. 309 00:16:06,320 --> 00:16:10,994 Ito ay isang espesyal na uri ng pare-pareho halaga na maaari mong gamitin upang subukan. 310 00:16:10,994 --> 00:16:13,160 Kaya na ay isang napaka-simple pointer, ang null pointer. 311 00:16:13,160 --> 00:16:15,320 Ang isa pang paraan upang lumikha ng isang pointer ay upang kunin 312 00:16:15,320 --> 00:16:18,240 ang address ng isang variable nakalikha ka na ng, 313 00:16:18,240 --> 00:16:22,330 at gawin mo ito gamit ang & operator bunutan address. 314 00:16:22,330 --> 00:16:26,720 Alin na namin nakita dati sa unang halimbawa diagram ako ay nagpakita. 315 00:16:26,720 --> 00:16:31,450 Kaya kung x ay isang variable na kami nakalikha ng ganitong uri ng integer, 316 00:16:31,450 --> 00:16:35,110 pagkatapos & x ay isang pointer sa isang integer. 317 00:16:35,110 --> 00:16:39,810 & x ay- tandaan, at ay pagpunta upang kunin ang address ng bagay sa kanan. 318 00:16:39,810 --> 00:16:45,350 At dahil ang isang pointer ay lamang ng isang address, sa & x ay isang pointer sa isang integer 319 00:16:45,350 --> 00:16:48,560 halaga na ay kung saan sa memory x buhay. 320 00:16:48,560 --> 00:16:50,460 Ito ay address x ni. 321 00:16:50,460 --> 00:16:53,296 Kaya & x ay ang address ng x. 322 00:16:53,296 --> 00:16:55,670 Tingnan natin ang mga ito sa isang hakbang karagdagang at kumonekta sa isang bagay 323 00:16:55,670 --> 00:16:58,380 Tinukoy ko na sa isang naunang video. 324 00:16:58,380 --> 00:17:06,730 Kung arr ay isang array ng doubles, pagkatapos ay & arr square bracket i ay isang pointer 325 00:17:06,730 --> 00:17:08,109 sa isang double. 326 00:17:08,109 --> 00:17:08,970 SIGE. 327 00:17:08,970 --> 00:17:12,160 arr square bracket i, kung arr ay isang array ng doubles, 328 00:17:12,160 --> 00:17:19,069 pagkatapos arr square bracket i ay ang i-ika element ng array, 329 00:17:19,069 --> 00:17:29,270 at & arr square bracket i ay kung saan in memory ang i-ika elemento ng isinaayos na umiiral na. 330 00:17:29,270 --> 00:17:31,790 >> Kaya kung ano ang pagkakasangkot dito? 331 00:17:31,790 --> 00:17:34,570 Isang array name, ang pagkakasangkot ng buong bagay, 332 00:17:34,570 --> 00:17:39,290 ay na pangalan ng isang array ay talagang mismong isang pointer. 333 00:17:39,290 --> 00:17:41,170 Ikaw ay nagtatrabaho may mga payo sa lahat ng kasama 334 00:17:41,170 --> 00:17:45,290 sa bawat oras na nagamit mo na ang isang array. 335 00:17:45,290 --> 00:17:49,090 Tandaan mula sa halimbawa sa variable na saklaw, 336 00:17:49,090 --> 00:17:53,420 na malapit sa dulo ng video kasalukuyan ko isang halimbawa kung saan kami ay may isang function 337 00:17:53,420 --> 00:17:56,890 tinatawag set int at isang function na tinatawag na set array. 338 00:17:56,890 --> 00:18:00,490 At ang iyong mga hamon upang matukoy man o hindi, o kung ano ang 339 00:18:00,490 --> 00:18:03,220 mga halaga na naka-print out namin sa dulo ng function, 340 00:18:03,220 --> 00:18:05,960 sa dulo ng mga pangunahing programa. 341 00:18:05,960 --> 00:18:08,740 >> Kung isipin ang mo mula sa halimbawa na o kung pinanood mo na ang video, 342 00:18:08,740 --> 00:18:13,080 alam mo na kapag ka-ang tawag sa set int epektibo ay wala. 343 00:18:13,080 --> 00:18:16,390 Ngunit ang tawag upang i-set ang dami ginagawa. 344 00:18:16,390 --> 00:18:19,280 At ako uri ng glossed higit bakit na ang kaso sa panahon. 345 00:18:19,280 --> 00:18:22,363 Lang ang sinabi ko, na rin ito ay isang array, ito ay espesyal na, alam mo na, mayroong isang dahilan. 346 00:18:22,363 --> 00:18:25,020 Ang dahilan ay ang isang array ni name ay talagang lamang ang pointer, 347 00:18:25,020 --> 00:18:28,740 at may mga ito ng espesyal square bracket syntax na 348 00:18:28,740 --> 00:18:30,510 gumawa ng mga bagay ng maraming nicer upang gumana sa. 349 00:18:30,510 --> 00:18:34,410 At sila ay gumawa ng ideya ng isang pointer mas pananakot ng isang pulutong, 350 00:18:34,410 --> 00:18:36,800 at iyon ang dahilan kung bakit ang mga ito ay mga uri ng ipinakita sa paraang iyon. 351 00:18:36,800 --> 00:18:38,600 Ngunit talagang array ay lamang payo. 352 00:18:38,600 --> 00:18:41,580 At iyon ang dahilan kung bakit kapag tayo ginawa ng isang pagbabago sa array, 353 00:18:41,580 --> 00:18:44,880 kapag ipinasa namin ang isang array bilang isang parameter sa isang function o bilang isang argument 354 00:18:44,880 --> 00:18:50,110 sa isang function, ang mga nilalaman ng array talagang nagbago sa parehong callee 355 00:18:50,110 --> 00:18:51,160 at sa mga tumatawag. 356 00:18:51,160 --> 00:18:55,846 Aling para sa bawat iba pang mga uri ng variable nakita natin ay hindi ito ang kaso. 357 00:18:55,846 --> 00:18:58,970 Kaya na ang isang bagay lamang na panatilihin sa isip kapag ikaw ay nagtatrabaho sa mga payo, 358 00:18:58,970 --> 00:19:01,610 ay na ang pangalan ng isang array talagang isang pointer 359 00:19:01,610 --> 00:19:04,750 sa unang elemento ng array. 360 00:19:04,750 --> 00:19:08,930 >> OK kaya ngayon kami ay lahat ng mga ito katotohanan, sabihin panatilihin ang pagpunta, right ipaalam. 361 00:19:08,930 --> 00:19:11,370 Bakit namin pag-aalaga tungkol kung saan ang isang bagay na nabubuhay. 362 00:19:11,370 --> 00:19:14,120 Well tulad ng sinabi ko, ito ay medyo kapaki-pakinabang na malaman kung saan ang isang bagay ay nabubuhay 363 00:19:14,120 --> 00:19:17,240 kaya maaari kang pumunta doon at baguhin ito. 364 00:19:17,240 --> 00:19:19,390 Makipagtulungan sa mga ito at ang tunay na may mga bagay na kayo 365 00:19:19,390 --> 00:19:23,710 gusto mong gawin sa na variable take effect, at hindi magkakaroon ng epekto sa ilang kopya nito. 366 00:19:23,710 --> 00:19:26,150 Ito ay tinatawag na dereferencing. 367 00:19:26,150 --> 00:19:28,690 Pumunta kami sa reference at palitan namin ang mga halaga doon. 368 00:19:28,690 --> 00:19:32,660 Kaya kung kami ay may isang pointer at ito ay tinatawag PC, at mga puntos sa isang character, 369 00:19:32,660 --> 00:19:40,610 pagkatapos ay maaari naming sabihin * pc at * PC ay ang mga pangalan ng kung ano ang makikita namin mahanap kung pumunta kami 370 00:19:40,610 --> 00:19:42,910 sa address na pc. 371 00:19:42,910 --> 00:19:47,860 Ano ang makikita namin mahanap doon ay isang karakter at * pc ay kung paano namin sumangguni sa data sa na 372 00:19:47,860 --> 00:19:48,880 lokasyon. 373 00:19:48,880 --> 00:19:54,150 Kaya maaari naming sabihin isang bagay tulad ng * pc = D o isang bagay tulad na, 374 00:19:54,150 --> 00:19:59,280 at na nangangahulugan na ang anumang ay sa memory address pc, 375 00:19:59,280 --> 00:20:07,040 kahit anong character na dati ay doon, ay D ngayon, kung sabihin namin * pc = D. 376 00:20:07,040 --> 00:20:10,090 >> Kaya dito namin pumunta muli gamit ilang mga kakatwang mga bagay-bagay C, right. 377 00:20:10,090 --> 00:20:14,560 Kaya nakita namin na ang * dati na rin ang pagiging kahit papaano bahagi ng uri ng data, 378 00:20:14,560 --> 00:20:17,160 at ngayon ito ay ginagamit sa isang bahagyang naiiba context 379 00:20:17,160 --> 00:20:19,605 upang ma-access ang data sa isang lokasyon. 380 00:20:19,605 --> 00:20:22,480 Alam ko ito ay isang maliit na nakalilito at na ang tunay na bahagi ng buong 381 00:20:22,480 --> 00:20:25,740 tulad ng, kung bakit mga payo na ito ay may mga alamat sa paligid ng mga ito bilang sa pagiging kaya complex, 382 00:20:25,740 --> 00:20:28,250 ay uri ng isang problema syntax, totoo lang. 383 00:20:28,250 --> 00:20:31,810 Ngunit * ay ginagamit sa parehong konteksto, parehong bilang bahagi ng pangalan ng uri, 384 00:20:31,810 --> 00:20:34,100 at kami na makita ang isang maliit na mamaya may ibang tao, masyadong. 385 00:20:34,100 --> 00:20:36,490 At ngayon ay ang dereference operator. 386 00:20:36,490 --> 00:20:38,760 Kaya ito ang papunta sa reference, ito-access ang data 387 00:20:38,760 --> 00:20:43,000 sa lokasyon ng pointer, at ay nagbibigay-daan sa iyo upang manipulahin ang mga ito sa kalooban. 388 00:20:43,000 --> 00:20:45,900 >> Ngayon na ito ay halos kapareho sa sa pagbisita sa iyong mga kapit-bahay, right. 389 00:20:45,900 --> 00:20:48,710 Kung alam mo kung ano ang iyong kapwa nakatira, ikaw ay 390 00:20:48,710 --> 00:20:50,730 hindi nakikipag-hang-out kasama ang iyong kapwa. 391 00:20:50,730 --> 00:20:53,510 Alam mo mong mangyari sa alam kung saan sila nakatira, 392 00:20:53,510 --> 00:20:56,870 ngunit iyon ay hindi nangangahulugan na sa pamamagitan ng dahil sa pagkakaroon ng kaalaman na 393 00:20:56,870 --> 00:20:59,170 ikaw ay nakikipag-ugnayan sa kanila. 394 00:20:59,170 --> 00:21:01,920 Kung nais mong makipag-ugnayan sa kanila, kailangan mong pumunta sa kanilang mga bahay, 395 00:21:01,920 --> 00:21:03,760 ikaw ay may upang pumunta sa kung saan sila nakatira. 396 00:21:03,760 --> 00:21:07,440 At sa sandaling gawin mo iyon, pagkatapos ay maaari kang makipag-ugnayan 397 00:21:07,440 --> 00:21:09,420 sa kanila gusto lang gusto mo nais na. 398 00:21:09,420 --> 00:21:12,730 At katulad sa mga variable, kailangan mong pumunta sa kanilang address 399 00:21:12,730 --> 00:21:15,320 kung gusto mong makipag-ugnayan sa kanila, hindi mo pwedeng malaman ang address. 400 00:21:15,320 --> 00:21:21,495 At ang paraan na pumunta ka sa address na ito ay gamitin *, ang dereference operator. 401 00:21:21,495 --> 00:21:23,620 Ano sa tingin ninyo ang mangyayari kung susubukan namin at dereference 402 00:21:23,620 --> 00:21:25,260 isang pointer na ang halaga ay null? 403 00:21:25,260 --> 00:21:28,470 Alalahanin na ang mga null pointer mga puntos sa wala. 404 00:21:28,470 --> 00:21:34,110 Kaya kung susubukan mo at dereference wala o pumunta sa isang address sa wala, 405 00:21:34,110 --> 00:21:36,800 ano sa palagay mo ang mangyayari? 406 00:21:36,800 --> 00:21:39,630 Well kung nahulaan mo segmentation kasalanan, gusto mo ay tama. 407 00:21:39,630 --> 00:21:41,390 Kung subukan mo at dereference isang null pointer, 408 00:21:41,390 --> 00:21:43,140 magdusa ka ng isang segmentation kasalanan. Ngunit sandali, 409 00:21:43,140 --> 00:21:45,820 Hindi ko sabihin sa iyo, na kung hindi ka pupunta 410 00:21:45,820 --> 00:21:49,220 upang itakda ang iyong halaga ng iyong pointer sa isang bagay na mahalaga, 411 00:21:49,220 --> 00:21:51,000 dapat mong i-set sa null? 412 00:21:51,000 --> 00:21:55,290 Ginawa ko at talagang ang segmentation kasalanan ay uri ng isang magandang pag-uugali. 413 00:21:55,290 --> 00:21:58,680 >> Nakarating na ba ipinahayag sa iyo ng isang variable at hindi nakatakda ang halaga nito ay agad-agad? 414 00:21:58,680 --> 00:22:02,680 Kaya sabihin mo lang int x; hindi mo talagang italaga ito sa kahit ano 415 00:22:02,680 --> 00:22:05,340 at pagkatapos ay sa susunod sa iyong code, mong i-print out ang halaga ng x, 416 00:22:05,340 --> 00:22:07,650 pagkakaroon ng hindi pa rin itinalaga ito sa kahit ano. 417 00:22:07,650 --> 00:22:10,370 Madalas na makakakuha ka ng zero, ngunit kung minsan mo 418 00:22:10,370 --> 00:22:15,000 maaaring makakuha ng ilang mga random na numero, at wala kang ideya kung saan ito nanggaling. 419 00:22:15,000 --> 00:22:16,750 Sa katulad na paraan Maaari bagay mangyayari sa mga payo. 420 00:22:16,750 --> 00:22:20,110 Kapag ipinapahayag mo ang isang pointer int * pk halimbawa, 421 00:22:20,110 --> 00:22:23,490 at hindi mo na italaga ito sa isang halaga, makakakuha ka ng apat bytes para sa memory. 422 00:22:23,490 --> 00:22:25,950 Anuman ang apat na bytes ng memory ng system ang maaaring 423 00:22:25,950 --> 00:22:28,970 makahanap na ang ilang mga makabuluhang halaga. 424 00:22:28,970 --> 00:22:31,760 At doon ay maaaring naging isang bagay na doon na 425 00:22:31,760 --> 00:22:34,190 ay hindi na kailangan ng isa pang function, kaya mo na lang 426 00:22:34,190 --> 00:22:35,900 kahit anong data ay naroon. 427 00:22:35,900 --> 00:22:40,570 >> Paano kung sinubukan mong gawin dereference ilang address na do not mong mayroong 428 00:22:40,570 --> 00:22:43,410 naka bytes at impormasyon sa doon, na sa iyong pointer ngayon. 429 00:22:43,410 --> 00:22:47,470 Kung subukan mo at dereference na pointer, maaari kang maging panggugulo sa ilang mga memory 430 00:22:47,470 --> 00:22:49,390 na hindi ninyo kagustuhan sa gulo sa lahat ng ito. 431 00:22:49,390 --> 00:22:51,639 At sa katunayan na maaari mong gawin isang bagay na talagang nagwawasak, 432 00:22:51,639 --> 00:22:54,880 tulad ng break ng isa pang programa, o basagin ang isa pang pag-andar, 433 00:22:54,880 --> 00:22:58,289 o gawin ang isang bagay masamang hangarin na hindi ninyo kagustuhan na gawin sa lahat. 434 00:22:58,289 --> 00:23:00,080 At kaya na kung bakit ito ay talagang isang magandang ideya 435 00:23:00,080 --> 00:23:04,030 upang itakda ang iyong mga payo sa null kung ikaw hindi itakda ang mga ito sa isang bagay na mahalaga. 436 00:23:04,030 --> 00:23:06,760 Ito ay malamang na mas mahusay sa pagtatapos ng araw para sa iyong mga programa 437 00:23:06,760 --> 00:23:09,840 pag-crash at pagkatapos ay para sa mga ito upang gawin isang bagay na screws up 438 00:23:09,840 --> 00:23:12,400 ibang programa o iba pang function. 439 00:23:12,400 --> 00:23:15,207 Pag-uugali na ito ay marahil kahit na mas mainam pa sa pag-crash. 440 00:23:15,207 --> 00:23:17,040 At kaya na kung bakit ito ay talagang isang magandang ugali 441 00:23:17,040 --> 00:23:20,920 upang makakuha ng sa upang i-set ang iyong mga payo sa null kung hindi mo itakda ang mga ito 442 00:23:20,920 --> 00:23:24,540 sa isang makabuluhang halaga agad-agad, ang halaga ng isang na alam mo 443 00:23:24,540 --> 00:23:27,260 at na maaari mong ligtas ang dereference. 444 00:23:27,260 --> 00:23:32,240 >> Kaya sabihin bumalik ngayon at kumuha ng isang hitsura sa pangkalahatang syntax ng ang sitwasyon. 445 00:23:32,240 --> 00:23:37,400 Kung aking sabihin int * p ;, kung ano ang nagawa ko na lang? 446 00:23:37,400 --> 00:23:38,530 Ano ang aking nagawa ay na ito. 447 00:23:38,530 --> 00:23:43,290 Alam ko ang halaga ng p ay isang address dahil ang lahat ng mga payo ay lamang 448 00:23:43,290 --> 00:23:44,660 address. 449 00:23:44,660 --> 00:23:47,750 Maaari ko dereference p gamit ang * operator. 450 00:23:47,750 --> 00:23:51,250 Sa kontekstong ito dito, sa pinakadulo top pagpapabalik ng * ay bahagi ng uri. 451 00:23:51,250 --> 00:23:53,510 Int * ay ang uri ng data. 452 00:23:53,510 --> 00:23:56,150 Ngunit maaari ko dereference p gamit ang * operator, 453 00:23:56,150 --> 00:24:01,897 at kung gagawin ko ito, kung pumunta ako sa address na iyon, kung ano ang mahahanap ko sa address na iyon? 454 00:24:01,897 --> 00:24:02,855 Maghahanap ako ng isang integer. 455 00:24:02,855 --> 00:24:05,910 Kaya int * p talaga na nagsasabi, p ay isang address. 456 00:24:05,910 --> 00:24:09,500 Maaari ko dereference p at kung Gagawin ko, maghahanap ako ng isang integer 457 00:24:09,500 --> 00:24:11,920 sa na lokasyon sa memorya. 458 00:24:11,920 --> 00:24:14,260 >> OK kaya sinabi ko nagkaroon ng isa pang nakakainis na bagay na may mga bituin 459 00:24:14,260 --> 00:24:17,060 at narito ang kung saan na nakakainis na bagay na may mga bituin ay. 460 00:24:17,060 --> 00:24:21,640 Nakarating na ba sinubukan na idedeklara maramihang mga variable ng parehong uri 461 00:24:21,640 --> 00:24:24,409 sa parehong linya ng code? 462 00:24:24,409 --> 00:24:27,700 Kaya para sa isang segundo, magpanggap na ang linya, ang code ako tunay na may doon sa green 463 00:24:27,700 --> 00:24:29,366 ay hindi doon at ito lamang ang nagsasabing int x, y, z ;. 464 00:24:29,366 --> 00:24:31,634 465 00:24:31,634 --> 00:24:34,550 Ano na gawin ay ang tunay na lumikha tatlong integer variable para sa iyo, 466 00:24:34,550 --> 00:24:36,930 isa na tinatawag na x, isa na tinatawag na y, at isa na tinatawag z. 467 00:24:36,930 --> 00:24:41,510 Ito ay isang paraan upang gawin ito nang walang kinakailangang mag-split papunta tatlong linya. 468 00:24:41,510 --> 00:24:43,890 >> Narito kung saan stars makakuha ng nakakainis muli bagaman, 469 00:24:43,890 --> 00:24:49,200 dahil ang * ay aktwal na bahagi ng parehong mga uri ng pangalan at mga bahagi 470 00:24:49,200 --> 00:24:50,320 ng pangalan ng variable. 471 00:24:50,320 --> 00:24:56,430 At kaya kung sinasabi ko int * px, py, pz, ano ang aking talagang makakuha ay isang pointer sa isang integer 472 00:24:56,430 --> 00:25:01,650 tinatawag px at dalawang integer, py at pz. 473 00:25:01,650 --> 00:25:04,950 At iyan ay marahil hindi kung ano gusto namin, na hindi mabuti. 474 00:25:04,950 --> 00:25:09,290 >> Kaya kung nais kong lumikha ng maramihang mga payo sa parehong linya, ng ang parehong uri, 475 00:25:09,290 --> 00:25:12,140 at mga bituin, kung ano talaga ang kailangan ko gawin ay sabihin int * pa, * pb, * pc. 476 00:25:12,140 --> 00:25:17,330 477 00:25:17,330 --> 00:25:20,300 Ngayon ang pagkakaroon ng sinabi lamang na at ngayon na nagsasabi sa iyo na ito, 478 00:25:20,300 --> 00:25:22,170 ikaw ay malamang na hindi kailanman gawin ito. 479 00:25:22,170 --> 00:25:25,170 At ito ay marahil isang magandang bagay sa totoo lang, dahil maaaring hindi sinasadyang mo 480 00:25:25,170 --> 00:25:26,544 ligtaan isang bituin, isang bagay na tulad ng. 481 00:25:26,544 --> 00:25:29,290 Ito ay marahil pinakamahusay na siguro idedeklara mga payo sa mga indibidwal na mga linya, 482 00:25:29,290 --> 00:25:31,373 ngunit ito ay lamang ng isa pa ng mga nakakainis na syntax 483 00:25:31,373 --> 00:25:35,310 mga bagay-bagay na may mga bituin na bumubuo payo kaya mahirap upang gumana sa. 484 00:25:35,310 --> 00:25:39,480 Dahil ito lang ang syntactic ito Nagkamali mayroon kang magtrabaho sa pamamagitan ng. 485 00:25:39,480 --> 00:25:41,600 Sa pamamagitan ng pagsasanay ng ginagawa nito talagang naging pangalawang kalikasan. 486 00:25:41,600 --> 00:25:45,410 Gumawa pa rin ako ng mga pagkakamali sa mga ito pa rin matapos programming para sa 10 taon, 487 00:25:45,410 --> 00:25:49,630 kaya huwag maging sira kung may mangyari sa iyo, ito ay medyo pangkaraniwan sa totoo lang. 488 00:25:49,630 --> 00:25:52,850 Ito ay talagang uri ng isang kapintasan ng syntax. 489 00:25:52,850 --> 00:25:54,900 >> OK kaya ako uri ng ipinangako na kami ay muling bisitahin ang 490 00:25:54,900 --> 00:25:59,370 ang konsepto ng kung paano malaki ay isang string. 491 00:25:59,370 --> 00:26:02,750 Well kung sinabi ko sa iyo na ang isang string, na namin talagang uri ng 492 00:26:02,750 --> 00:26:04,140 tinanggal namamalagi sa iyo ang buong oras. 493 00:26:04,140 --> 00:26:06,181 Walang uri ng data na tinatawag na string, at sa katunayan ko 494 00:26:06,181 --> 00:26:09,730 nabanggit na ito sa isa sa aming mga pinakamaagang mga video sa mga uri ng data, 495 00:26:09,730 --> 00:26:13,820 na string ay isang uri ng data na ay nilikha para sa iyo sa CS50.h. 496 00:26:13,820 --> 00:26:17,050 Ikaw ay may na # include CS50.h upang gamitin ito. 497 00:26:17,050 --> 00:26:19,250 >> Well string ay talagang lamang isang alias para sa isang bagay 498 00:26:19,250 --> 00:26:23,600 tinatawag na ang char *, isang pointer sa isang character. 499 00:26:23,600 --> 00:26:26,010 Well payo, pagpapabalik, ay lamang address. 500 00:26:26,010 --> 00:26:28,780 Kaya kung ano ang laki sa bytes ng isang string? 501 00:26:28,780 --> 00:26:29,796 Well ito ay apat o walong. 502 00:26:29,796 --> 00:26:32,170 At ang dahilan kung bakit sinasabi ko ang apat o walong ay dahil ito ang tunay na 503 00:26:32,170 --> 00:26:36,730 depende sa sistema, Kung gumagamit ka ng CS50 ide, char * ay ang laki ng isang pansamantalang trabaho 504 00:26:36,730 --> 00:26:39,340 * Ay walong, ito ay isang 64-bit system. 505 00:26:39,340 --> 00:26:43,850 Bawat address sa memorya ay 64 bits mahaba. 506 00:26:43,850 --> 00:26:48,270 Kung gumagamit ka ng CS50 appliance o paggamit ng anumang 32-bit machine, 507 00:26:48,270 --> 00:26:51,640 at iyong narinig na kataga 32-bit machine, ano ay isang 32-bit machine? 508 00:26:51,640 --> 00:26:56,090 Well ito ay nangangahulugan lamang na ang bawat address sa memorya ay 32 bits mahaba. 509 00:26:56,090 --> 00:26:59,140 At kaya 32 bits ay apat na bytes. 510 00:26:59,140 --> 00:27:02,710 Kaya ang isang pansamantalang trabaho * ay apat o walong bytes depende sa iyong system. 511 00:27:02,710 --> 00:27:06,100 At sa katunayan ng anumang uri ng data, at isang pointer sa anumang data 512 00:27:06,100 --> 00:27:12,030 type, dahil ang lahat ng mga payo ay lamang address, apat o walong bytes. 513 00:27:12,030 --> 00:27:14,030 Kaya sabihin muling bisitahin ito diagram at ni tapusin ipaalam 514 00:27:14,030 --> 00:27:18,130 ang video na ito gamit ang isang maliit na ehersisyo dito. 515 00:27:18,130 --> 00:27:21,600 Kaya dito ang diagram tumigil kami sa sa pinakadulo simula ng video. 516 00:27:21,600 --> 00:27:23,110 Kaya kung ano ang mangyayari ngayon kung sinasabi ko * pk = 35? 517 00:27:23,110 --> 00:27:26,370 518 00:27:26,370 --> 00:27:30,530 Kaya kung ano ang ibig sabihin kapag sinasabi ko, * pk = 35? 519 00:27:30,530 --> 00:27:32,420 Kumuha ng isang segundo. 520 00:27:32,420 --> 00:27:34,990 * pk. 521 00:27:34,990 --> 00:27:39,890 Sa konteksto dito, * ay dereference operator. 522 00:27:39,890 --> 00:27:42,110 Kaya kapag ang dereference operator ay ginagamit, 523 00:27:42,110 --> 00:27:48,520 pumunta kami sa address itinuturo sa sa pamamagitan ng pk, at baguhin natin kung ano ang nakita namin. 524 00:27:48,520 --> 00:27:55,270 Kaya * pk = 35 epektibong Ginagawa ito sa larawan. 525 00:27:55,270 --> 00:27:58,110 Kaya ito ay isa lamang syntactically magkapareho sa mga pag-sinabi k = 35. 526 00:27:58,110 --> 00:28:00,740 527 00:28:00,740 --> 00:28:01,930 >> Isa pa. 528 00:28:01,930 --> 00:28:05,510 Kung aking sabihin int m, ako lilikha ng isang bagong variable na tinatawag na m. 529 00:28:05,510 --> 00:28:08,260 Ang isang bagong box, ito ay isang green box dahil ito ay pagpunta upang i-hold ang isang integer, 530 00:28:08,260 --> 00:28:09,840 at ito ay may label na m. 531 00:28:09,840 --> 00:28:14,960 Kung aking sabihin m = 4, Naglagay ako ng isang integer sa na box. 532 00:28:14,960 --> 00:28:20,290 Kung sabihin nating pk = & m, kung paano gumagana ang pagbabagong ito diagram? 533 00:28:20,290 --> 00:28:28,760 Pk = & m, gawin mo matandaan kung ano ang mga & Operator ay o ay tinatawag na? 534 00:28:28,760 --> 00:28:34,430 Tandaan & ilang pangalan na variable ay ang address ng isang pangalan ng variable. 535 00:28:34,430 --> 00:28:38,740 Kaya kung ano ang iyong sinasabi namin ay pk nakukuha ang address ng m. 536 00:28:38,740 --> 00:28:42,010 At kaya epektibo kung ano ang mangyayari sa mga diagram ay na pk hindi na puntos 537 00:28:42,010 --> 00:28:46,420 sa k, ngunit puntos upang m. 538 00:28:46,420 --> 00:28:48,470 >> Muli payo ay napaka nakakalito na magtrabaho sa 539 00:28:48,470 --> 00:28:50,620 at sila ay kumuha ng isang pulutong ng pagsasanay, ngunit dahil 540 00:28:50,620 --> 00:28:54,150 sa kanilang kakayahan na magpapahintulot sa inyo upang pumasa data sa pagitan ng mga pag-andar 541 00:28:54,150 --> 00:28:56,945 at tunay na may mga pagbabago magkakabisa, 542 00:28:56,945 --> 00:28:58,820 pagkuha ng inyong ulo sa paligid ay talagang mahalaga. 543 00:28:58,820 --> 00:29:02,590 Ito marahil ay ang pinaka-kumplikado topic tatalakayin natin sa CS50, 544 00:29:02,590 --> 00:29:05,910 ngunit ang halaga na kayo makuha mula sa paggamit ng mga payo 545 00:29:05,910 --> 00:29:09,200 malayo outweighs ang komplikasyon na nanggaling mula sa pag-aaral ng mga ito. 546 00:29:09,200 --> 00:29:12,690 Kaya gusto ko sa iyo ang pinakamahusay na ng swerte sa pag-aaral tungkol sa mga payo. 547 00:29:12,690 --> 00:29:15,760 Ako Doug Lloyd, ito ay CS50. 548 00:29:15,760 --> 00:29:17,447