1 00:00:00,000 --> 00:00:06,030 >> [Muzika] 2 00:00:06,030 --> 00:00:08,390 >> DOUG Lloyd: Pointers, këtu jemi. 3 00:00:08,390 --> 00:00:11,080 Kjo është ndoshta do të të jetë tema më e vështirë 4 00:00:11,080 --> 00:00:12,840 që ne flasim për në CS50. 5 00:00:12,840 --> 00:00:15,060 Dhe në qoftë se ju keni lexuar asgjë për pointers 6 00:00:15,060 --> 00:00:19,080 para se ju mund të jetë pak frikësuese shkon në këtë video. 7 00:00:19,080 --> 00:00:21,260 Është e vërtetë pointers do t'ju lejojë mundësinë 8 00:00:21,260 --> 00:00:23,740 për të ndoshta vidhos deri goxha keq kur ju jeni 9 00:00:23,740 --> 00:00:27,450 duke punuar me variablat, dhe të dhënat, dhe duke shkaktuar programin tuaj për të rrëzuar. 10 00:00:27,450 --> 00:00:30,490 Por ata janë në fakt të vërtetë të dobishme dhe ata na një mënyrë të vërtetë të madhe të lejuar 11 00:00:30,490 --> 00:00:33,340 për të kaluar dhëna mbrapa dhe radhë midis funksioneve, 12 00:00:33,340 --> 00:00:35,490 se ne jemi ndryshe në gjendje të bëjë. 13 00:00:35,490 --> 00:00:37,750 >> Dhe kështu ajo që ne me të vërtetë dua të bëj këtu është tren 14 00:00:37,750 --> 00:00:41,060 ju të keni disiplinë të mirë akrep, kështu që ju mund të përdorni në mënyrë efektive pointers 15 00:00:41,060 --> 00:00:43,850 për të bërë programet tuaja që shumë më mirë. 16 00:00:43,850 --> 00:00:48,220 Siç thashë pointers të na japë një tjetër mënyrë për të kaluar të dhënave në mes funksioneve. 17 00:00:48,220 --> 00:00:50,270 Tani në qoftë se ju kujtohet nga një video të parë, kur 18 00:00:50,270 --> 00:00:53,720 ne ishim duke folur për Shtrirja e ndryshueshme, e përmenda 19 00:00:53,720 --> 00:01:00,610 që të gjitha të dhënat që ne të kalojë në mes të Funksionet në C është miratuar nga vlera. 20 00:01:00,610 --> 00:01:03,070 Dhe unë nuk mund të ketë përdorur atë afat, ajo që unë do të thotë atje 21 00:01:03,070 --> 00:01:07,170 ishte se ne jemi duke kaluar kopje të të dhënave. 22 00:01:07,170 --> 00:01:12,252 Kur ne të kalojë një ndryshore në një funksion, ne nuk jemi në fakt kaluar ndryshueshme 23 00:01:12,252 --> 00:01:13,210 në funksion, e drejtë? 24 00:01:13,210 --> 00:01:17,670 Ne jemi duke kaluar një kopje që të dhënat e funksionit. 25 00:01:17,670 --> 00:01:20,760 Funksioni bën atë që do dhe ajo llogarit disa vlera, 26 00:01:20,760 --> 00:01:23,180 dhe ndoshta ne i përdorim se vlera kur ajo i jep atë përsëri. 27 00:01:23,180 --> 00:01:26,700 >> Nuk ishte një përjashtim për Ky rregull i kalonte vlerë, 28 00:01:26,700 --> 00:01:31,210 dhe ne do të kthehen në atë që është pak më vonë në këtë video. 29 00:01:31,210 --> 00:01:34,880 Në qoftë se ne përdorim pointers në vend e përdorimit të variablave, 30 00:01:34,880 --> 00:01:38,180 ose në vend të përdorimit të variablave vetë ose kopjet e variablave, 31 00:01:38,180 --> 00:01:43,790 ne tani mund të kalojë variablat rreth ndërmjet funksioneve në një mënyrë të ndryshme. 32 00:01:43,790 --> 00:01:46,550 Kjo do të thotë se në qoftë se ne kemi bërë një ndryshim në një funksion, 33 00:01:46,550 --> 00:01:49,827 se ndryshimi në fakt do të marrë efekt në një funksion të ndryshëm. 34 00:01:49,827 --> 00:01:52,160 Përsëri, kjo është diçka që ne nuk mund të bëjmë më parë, 35 00:01:52,160 --> 00:01:56,979 dhe në qoftë se ju keni provuar ndonjëherë për të bie në ujdi Vlera e dy variablave në një funksion, 36 00:01:56,979 --> 00:01:59,270 e keni vënë re këtë problem lloj i zvarrit deri, e drejtë? 37 00:01:59,270 --> 00:02:04,340 >> Në qoftë se ne duam të bie në ujdi X dhe Y, dhe ne të kalojë ato në një funksion të quajtur shkëmbim, 38 00:02:04,340 --> 00:02:08,680 brenda i funksionit shkëmbim Variablat bëjnë vlerat e këmbimit. 39 00:02:08,680 --> 00:02:12,600 Një bëhet dy, dy bëhet një, por ne nuk e bëjmë në fakt 40 00:02:12,600 --> 00:02:16,890 ndryshojë asgjë në origjinal funksion, në thirrësi. 41 00:02:16,890 --> 00:02:19,550 Sepse ne nuk mund, ne jemi vetëm duke punuar me kopje të tyre. 42 00:02:19,550 --> 00:02:24,760 Me pointers pse, ne mund të në fakt kalojnë X dhe Y në një funksion. 43 00:02:24,760 --> 00:02:26,960 Se funksioni mund të bëjë diçka me ta. 44 00:02:26,960 --> 00:02:29,250 Dhe këto vlera variablat në fakt mund të ndryshojë. 45 00:02:29,250 --> 00:02:33,710 Pra, kjo është mjaft e një ndryshim në aftësia jonë për të punuar me të dhëna. 46 00:02:33,710 --> 00:02:36,100 >> Para se të pikiatë në pointers, unë mendoj se është me vlerë 47 00:02:36,100 --> 00:02:38,580 duke marrë disa minuta për të të kthehemi në bazat këtu. 48 00:02:38,580 --> 00:02:41,000 Dhe të ketë një sy se si Punimet e kujtesës kompjuter 49 00:02:41,000 --> 00:02:45,340 për shkak se këto dy subjekte janë duke shkuar që në fakt të jetë goxha të ndërlidhura. 50 00:02:45,340 --> 00:02:48,480 Si ju ndoshta e dini, në sistemin tuaj kompjuterik 51 00:02:48,480 --> 00:02:51,310 ju keni një hard drive ose ndoshta një makinë solide të shtetit, 52 00:02:51,310 --> 00:02:54,430 një lloj i lokacionit file storage. 53 00:02:54,430 --> 00:02:57,950 Kjo është zakonisht diku në lagje prej 250 gigabajt 54 00:02:57,950 --> 00:02:59,810 për të ndoshta disa terabytes tani. 55 00:02:59,810 --> 00:03:02,270 Dhe kjo është ku të gjithë tuaj fotografi në fund të fundit jetojnë, 56 00:03:02,270 --> 00:03:04,870 edhe kur kompjuteri juaj është i mbyllur jashtë, ju mund ta kthejnë atë përsëri në 57 00:03:04,870 --> 00:03:09,190 dhe ju do të gjeni dosjet tuaja janë atje përsëri kur ju reboot sistemin tuaj. 58 00:03:09,190 --> 00:03:14,820 Por disk drives, si një hard disk drive, një HDD, apo një makinë solide të shtetit, një SSD, 59 00:03:14,820 --> 00:03:16,050 janë vetëm hapësira e magazinimit. 60 00:03:16,050 --> 00:03:20,400 >> Ne nuk mund të vërtetë të bëjë asgjë me të dhënat që është në hard disk, 61 00:03:20,400 --> 00:03:22,080 ose në një makinë të ngurta shtetëror. 62 00:03:22,080 --> 00:03:24,950 Në mënyrë që në fakt ndryshojnë të dhëna ose të lëvizin atë rreth, 63 00:03:24,950 --> 00:03:28,800 ne duhet të lëvizin atë në RAM, kujtesë e gjallë. 64 00:03:28,800 --> 00:03:31,170 Tani RAM, ju keni një shumë më pak në kompjuterin tuaj. 65 00:03:31,170 --> 00:03:34,185 Ju mund të keni diku në lagje e 512 MB 66 00:03:34,185 --> 00:03:38,850 në qoftë se ju keni një kompjuter të vjetër, për ndoshta dy, katër, tetë, 16, 67 00:03:38,850 --> 00:03:41,820 ndoshta edhe pak më shumë, gigabajt të RAM. 68 00:03:41,820 --> 00:03:46,390 Pra, kjo është shumë më e vogël, por kjo është ku të gjitha të dhënave të paqëndrueshme ekziston. 69 00:03:46,390 --> 00:03:48,270 Kjo është ku ne mund të ndryshojmë gjërat. 70 00:03:48,270 --> 00:03:53,350 Por, kur jemi kthyer kompjuterin tonë jashtë, të gjitha të dhënat në RAM është shkatërruar. 71 00:03:53,350 --> 00:03:57,150 >> Pra, kjo është arsyeja pse ne duhet të kemi hard disk për vendndodhjen më të përhershëm të saj, 72 00:03:57,150 --> 00:03:59,720 në mënyrë që ajo exists- kjo do jetë me të vërtetë i keq në qoftë se çdo herë kemi 73 00:03:59,720 --> 00:04:03,310 kthyer kompjuterin tonë jashtë, çdo skedar në sistemin tonë ishte zhdukur. 74 00:04:03,310 --> 00:04:05,600 Pra, ne punojmë brenda RAM. 75 00:04:05,600 --> 00:04:09,210 Dhe çdo herë që ne jemi duke folur për kujtesës, shumë e shumë, në CS50, 76 00:04:09,210 --> 00:04:15,080 ne jemi duke folur për RAM, jo hard disk. 77 00:04:15,080 --> 00:04:18,657 >> Pra, kur ne shkojmë gjëra në kujtesë, ajo merr një sasi të caktuar të hapësirës. 78 00:04:18,657 --> 00:04:20,740 Të gjitha llojet e të dhënave që ne kemi qenë duke punuar me 79 00:04:20,740 --> 00:04:23,480 të marrë të ndryshme shumat e hapësirës në RAM. 80 00:04:23,480 --> 00:04:27,600 Pra, çdo herë që ju të krijoni një numër të plotë ndryshueshme, katër byte memorje 81 00:04:27,600 --> 00:04:30,750 janë vendosur mënjanë në RAM kështu ju mund të punojnë me atë numër të plotë. 82 00:04:30,750 --> 00:04:34,260 Ju mund të deklarojë integer, ndryshuar atë, të caktojë atë 83 00:04:34,260 --> 00:04:36,700 me një vlerë 10 incremented nga një, kështu me radhë e kështu me radhë. 84 00:04:36,700 --> 00:04:39,440 E gjithë kjo duhet të ndodhë në RAM, dhe që ju të merrni katër bytes 85 00:04:39,440 --> 00:04:42,550 për të punuar me të për çdo numër i plotë që keni krijuar. 86 00:04:42,550 --> 00:04:45,410 >> Çdo karakter ju krijojë merr një bajt. 87 00:04:45,410 --> 00:04:48,160 Kjo është vetëm sa hapësirë ​​është të nevojshme për të ruajtur një karakter. 88 00:04:48,160 --> 00:04:51,310 Çdo noton, një e vërtetë numër, merr katër bytes 89 00:04:51,310 --> 00:04:53,390 nëse kjo është një dyfishtë precision pikë lundrues 90 00:04:53,390 --> 00:04:56,510 numër, i cili ju lejon të kanë shifra më të sakta ose më shumë 91 00:04:56,510 --> 00:04:59,300 pas presjes dhjetore pa humbur saktësi, 92 00:04:59,300 --> 00:05:01,820 që marrin tetë byte memorje. 93 00:05:01,820 --> 00:05:06,730 Dëshiron gjata, integers vërtetë të mëdha, gjithashtu marrin tetë byte memorje. 94 00:05:06,730 --> 00:05:09,000 Sa byte memorje do të strings marrë? 95 00:05:09,000 --> 00:05:12,990 E pra, le të vënë një gjilpërë me kokë në këtë pyetje tani për tani, por ne do të kthehen në të. 96 00:05:12,990 --> 00:05:17,350 >> Pra, përsëri në këtë idenë e kujtesës si një grup i madh i qelizave byte-sized. 97 00:05:17,350 --> 00:05:20,871 Kjo është me të vërtetë e gjitha kjo është, kjo është vetëm një grup të madh të qelizave, 98 00:05:20,871 --> 00:05:23,370 ashtu si çdo grup tjetër që ju jeni të njohur me të dhe të shohim, 99 00:05:23,370 --> 00:05:26,430 me përjashtim të çdo element është një bajt gjerë. 100 00:05:26,430 --> 00:05:30,030 Dhe vetëm si një grup, çdo element ka një adresë. 101 00:05:30,030 --> 00:05:32,120 Çdo element i një sërë ka një indeks, dhe ne 102 00:05:32,120 --> 00:05:36,302 mund të përdorin këtë indeks për të bërë të ashtuquajtur qasje të rastësishme në grup. 103 00:05:36,302 --> 00:05:38,510 Ne nuk duhet të fillojë në fillimi i vektorit, 104 00:05:38,510 --> 00:05:40,569 iterate nëpër çdo element të vetme të tyre, 105 00:05:40,569 --> 00:05:41,860 për të gjetur atë që ne jemi duke kërkuar për. 106 00:05:41,860 --> 00:05:45,790 Ne mund të them vetëm, unë dua të merrni të Elementi 15 apo elementi 100. 107 00:05:45,790 --> 00:05:49,930 Dhe ju mund vetëm të kalojë në këtë numër dhe për të marrë vlerën që ju po kërkoni. 108 00:05:49,930 --> 00:05:54,460 >> Në mënyrë të ngjashme çdo vend në kujtesën e ka një adresë. 109 00:05:54,460 --> 00:05:57,320 Pra, kujtesa juaj mund të duket diçka si kjo. 110 00:05:57,320 --> 00:06:01,420 Këtu është një copë shumë e vogël e kujtesës, kjo është 20 bytes të memories. 111 00:06:01,420 --> 00:06:04,060 20 bytes e parë, sepse im drejtohet ka në pjesën e poshtme 112 00:06:04,060 --> 00:06:08,890 janë 0, 1, 2, 3, dhe kështu në të gjithë rrugën deri në 19. 113 00:06:08,890 --> 00:06:13,190 Dhe kur unë deklaroj variablave dhe kur unë të fillojë për të punuar me ta, 114 00:06:13,190 --> 00:06:15,470 sistemi do të vendosur mënjanë disa hapësirë ​​për mua 115 00:06:15,470 --> 00:06:17,595 në këtë kujtim për të punuar me variablat e mia. 116 00:06:17,595 --> 00:06:21,610 Kështu që unë mund të them, char c është e barabartë me kapitalin H. Dhe çfarë do të ndodhë? 117 00:06:21,610 --> 00:06:23,880 Pra sistemi do të vendosur mënjanë për mua një byte. 118 00:06:23,880 --> 00:06:27,870 Në këtë rast ajo zgjodhi numrin byte katër, byte në adresën katër, 119 00:06:27,870 --> 00:06:31,310 dhe ajo do të ruajtur H shkronjë kapitale në atje për mua. 120 00:06:31,310 --> 00:06:34,350 Në qoftë se unë them shpejtësi int Kufiri i barabartë 65, është 121 00:06:34,350 --> 00:06:36,806 duke shkuar për të lënë mënjanë katër bytes të memories për mua. 122 00:06:36,806 --> 00:06:39,180 Dhe ajo do të trajtojmë ata katër bytes si një njësi e vetme 123 00:06:39,180 --> 00:06:41,305 sepse ajo që ne jemi duke punuar me eshte nje numer ketu. 124 00:06:41,305 --> 00:06:44,350 Dhe ajo do të ruajtur 65 në atje. 125 00:06:44,350 --> 00:06:47,000 >> Tani tashmë unë jam natyrë e ju thënë një grimë e një gënjeshtër, 126 00:06:47,000 --> 00:06:50,150 e drejtë, sepse ne e dimë se kompjuterët punojnë në binar. 127 00:06:50,150 --> 00:06:53,100 Ata nuk e kuptojnë domosdo se çfarë është një H kapital është 128 00:06:53,100 --> 00:06:57,110 apo çfarë është një 65 është, ata vetëm kuptojnë binare, zero dhe ato. 129 00:06:57,110 --> 00:06:59,000 Dhe kështu në fakt, çfarë ne jemi ruajtjen në atje 130 00:06:59,000 --> 00:07:03,450 nuk është letër H dhe numri 65, por më tepër përfaqësime binare 131 00:07:03,450 --> 00:07:06,980 e tyre, të cilat duken një pak diçka si kjo. 132 00:07:06,980 --> 00:07:10,360 Dhe në veçanti në Konteksti i variablit numër i plotë, 133 00:07:10,360 --> 00:07:13,559 kjo nuk do të vetëm të nxjerr atë në, kjo nuk do të trajtojnë atë si një katër 134 00:07:13,559 --> 00:07:15,350 byte copë domosdoshmërisht, kjo është në të vërtetë do 135 00:07:15,350 --> 00:07:19,570 për të trajtuar atë si një katër chunks byte, e cila mund të duket diçka si kjo. 136 00:07:19,570 --> 00:07:22,424 Dhe, edhe kjo nuk është e krejtësisht e vërtetë ose, 137 00:07:22,424 --> 00:07:24,840 për shkak të diçka të quajtur një endianness, të cilat ne nuk jemi 138 00:07:24,840 --> 00:07:26,965 do të merrni në tani, por në qoftë se ju jeni kurioz rreth, 139 00:07:26,965 --> 00:07:29,030 ju mund ta lexoni deri në pak dhe endianness mëdha. 140 00:07:29,030 --> 00:07:31,640 Por, për hir të këtij argumenti, për hir të kësaj video, 141 00:07:31,640 --> 00:07:34,860 le të supozojmë se është, në fakt, si numri 65 do të 142 00:07:34,860 --> 00:07:36,970 të përfaqësohen në kujtesës në çdo sistem, 143 00:07:36,970 --> 00:07:38,850 edhe pse kjo nuk është plotësisht e vërtetë. 144 00:07:38,850 --> 00:07:41,700 >> Por le të vërtetë të merrni vetëm shpëtoj të gjithë binar tërësisht, 145 00:07:41,700 --> 00:07:44,460 dhe vetëm mendojnë për sa H dhe 65, kjo është një shumë më e lehtë 146 00:07:44,460 --> 00:07:47,900 të mendojnë për atë si se si një qenie njerëzore. 147 00:07:47,900 --> 00:07:51,420 Të gjithë të drejtë, kështu që gjithashtu duket ndoshta një pak të rastit që I've- sistemi im 148 00:07:51,420 --> 00:07:55,130 nuk ka dhënë më bytes 5, 6, 7, dhe 8 të ruajtur numër i plotë. 149 00:07:55,130 --> 00:07:58,580 Ka një arsye për këtë, gjithashtu, që ne nuk do të marrë në të drejtë tani, por mjafton 150 00:07:58,580 --> 00:08:00,496 kjo për të thënë se çfarë kompjuteri është bërë këtu 151 00:08:00,496 --> 00:08:02,810 është ndoshta një masë e mirë nga ana e saj. 152 00:08:02,810 --> 00:08:06,020 Për të mos më jepni kujtesës që është domosdoshmërisht për të kthyer prapa. 153 00:08:06,020 --> 00:08:10,490 Edhe pse ajo do të bëjë atë tani në qoftë se unë dua të të marrë një tjetër varg, 154 00:08:10,490 --> 00:08:13,080 quajtur mbiemri, dhe unë dua për të vënë Lloyd në atje. 155 00:08:13,080 --> 00:08:18,360 Unë do të duhet të përshtaten një karakter, çdo letër prej se është 156 00:08:18,360 --> 00:08:21,330 do të kërkojë një karakter, një bajt memorie. 157 00:08:21,330 --> 00:08:26,230 Pra, nëse unë mund të vënë Lloyd në rrjet e mia si kjo unë jam goxha i mirë për të shkuar, e drejtë? 158 00:08:26,230 --> 00:08:28,870 Çfarë është zhdukur? 159 00:08:28,870 --> 00:08:31,840 >> Mos harroni se çdo varg ne punojmë me në C përfundon me backslash zero, 160 00:08:31,840 --> 00:08:33,339 dhe ne nuk mund të harroj se këtu, ose. 161 00:08:33,339 --> 00:08:36,090 Ne kemi nevojë për të vënë mënjanë një bajt e kujtesës për të mbajtur atë kështu që ne 162 00:08:36,090 --> 00:08:39,130 e di kur string jonë ka përfunduar. 163 00:08:39,130 --> 00:08:41,049 Pra, përsëri kjo marrëveshje e mënyrën gjërat 164 00:08:41,049 --> 00:08:42,799 shfaqet në fuqinë e kujtesës të jetë pak të rastit, 165 00:08:42,799 --> 00:08:44,870 por ajo në fakt është se si shumica e sistemeve janë të dizajnuara. 166 00:08:44,870 --> 00:08:48,330 Të vijë atyre në multiples e katër, për arsye përsëri 167 00:08:48,330 --> 00:08:50,080 që ne nuk kemi nevojë të merrni në të drejtë tani. 168 00:08:50,080 --> 00:08:53,060 Por kjo, kështu që mjafton të themi se pas këtyre tre rreshta të kodit, 169 00:08:53,060 --> 00:08:54,810 kjo është ajo që e kujtesës mund të duket si. 170 00:08:54,810 --> 00:08:58,930 Nëse kam nevojë për vende të kujtesës 4, 8, 12 dhe për të mbajtur të dhënat e mia, 171 00:08:58,930 --> 00:09:01,100 kjo është ajo që kujtesa ime mund të duket si. 172 00:09:01,100 --> 00:09:04,062 >> Dhe vetëm të jetë veçanërisht e pedant këtu, kur 173 00:09:04,062 --> 00:09:06,020 ne jemi duke folur për kujtesën Adresat Ne zakonisht 174 00:09:06,020 --> 00:09:08,390 bëjë këtë duke përdorur notations heksadecimal. 175 00:09:08,390 --> 00:09:12,030 Pra, pse nuk kemi kthyer të gjitha këto nga decimal të simbol heksadecimal 176 00:09:12,030 --> 00:09:15,010 vetëm për shkak se kjo është në përgjithësi si ne i referohemi kujtesës. 177 00:09:15,010 --> 00:09:17,880 Pra, në vend të të qenit 0 përmes 19, ajo që ne kemi është zero 178 00:09:17,880 --> 00:09:20,340 x zero përmes zero x1 tre. 179 00:09:20,340 --> 00:09:23,790 Këto janë 20 bytes e kujtesës që ne kanë ose ne jemi duke kërkuar në në këtë imazh 180 00:09:23,790 --> 00:09:25,540 mu ketu. 181 00:09:25,540 --> 00:09:29,310 >> Pra, të gjitha që u tha, le të hap larg nga kujtesa për një të dytë 182 00:09:29,310 --> 00:09:30,490 dhe të kthehet në pointers. 183 00:09:30,490 --> 00:09:32,420 Këtu është më e rëndësishme gjë për të kujtuar 184 00:09:32,420 --> 00:09:34,070 si ne të fillojë të punojë me pointers. 185 00:09:34,070 --> 00:09:36,314 Një tregues është asgjë më shumë se një adresë. 186 00:09:36,314 --> 00:09:38,230 Unë do të them atë përsëri për shkak është e rëndësishme që, 187 00:09:38,230 --> 00:09:42,730 një tregues nuk është asgjë më shumë se një adresë. 188 00:09:42,730 --> 00:09:47,760 Pointers janë adresat në vende në kujtesën ku variabla jetojnë. 189 00:09:47,760 --> 00:09:52,590 Duke ditur se bëhet shpresojmë se një pak më e lehtë për të punuar me ta. 190 00:09:52,590 --> 00:09:54,550 Një tjetër gjë që unë doja të bëni është që të ketë lloj 191 00:09:54,550 --> 00:09:58,510 Diagramet e vizualisht përfaqësojnë çfarë është ndodh me linjat e ndryshme të kodit. 192 00:09:58,510 --> 00:10:00,660 Dhe ne do të bëjmë këtë një çift e herë në pointers, 193 00:10:00,660 --> 00:10:03,354 dhe kur ne flasim për dinamik kujtese si. 194 00:10:03,354 --> 00:10:06,020 Sepse unë mendoj se këto diagramet mund të jetë veçanërisht e dobishme. 195 00:10:06,020 --> 00:10:09,540 >> Pra, nëse unë them për shembull, int k në kodin tim, çfarë po ndodh? 196 00:10:09,540 --> 00:10:12,524 E pra çfarë po ndodh në thelb është Unë jam marrë kujtesës caktuar për mua, 197 00:10:12,524 --> 00:10:14,690 por edhe unë nuk doja të mendoni rreth saj si kjo, unë 198 00:10:14,690 --> 00:10:16,300 si të mendojnë për atë si një kuti. 199 00:10:16,300 --> 00:10:20,090 Unë kam një kuti dhe kjo është me ngjyrë të gjelbër për shkak se unë 200 00:10:20,090 --> 00:10:21,750 mund të vënë integers në kuti të gjelbër. 201 00:10:21,750 --> 00:10:23,666 Në qoftë se ajo ishte një karakter i mund të ketë një kuti blu. 202 00:10:23,666 --> 00:10:27,290 Por unë gjithmonë them, në qoftë se unë jam duke krijuar një kuti që mund të mbajë integers 203 00:10:27,290 --> 00:10:28,950 se kuti është me ngjyrë të gjelbër. 204 00:10:28,950 --> 00:10:33,020 Dhe unë të marrë një shënues të përhershëm dhe unë shkruaj k në anën e saj. 205 00:10:33,020 --> 00:10:37,590 Pra, unë kam një kuti të quajtur k, në të cilën unë mund të vënë integers. 206 00:10:37,590 --> 00:10:41,070 Pra, kur unë them int k, kjo është çfarë ndodh në kokën time. 207 00:10:41,070 --> 00:10:43,140 Nëse unë them k është e barabartë me pesë, çfarë jam unë duke bërë? 208 00:10:43,140 --> 00:10:45,110 E pra, unë jam vënë pesë në kuti, e drejtë. 209 00:10:45,110 --> 00:10:48,670 Kjo është shumë i thjeshtë, në qoftë se Unë them int k, të krijojë një kuti të quajtur k. 210 00:10:48,670 --> 00:10:52,040 Nëse unë them k është e barabartë me 5, i vendosi pesë në kuti. 211 00:10:52,040 --> 00:10:53,865 Shpresojmë që nuk është shumë e një kërcim. 212 00:10:53,865 --> 00:10:55,990 Ja ku gjërat shkojnë një pak interesante edhe pse. 213 00:10:55,990 --> 00:11:02,590 Nëse unë them int * pk, dhe edhe në qoftë se unë nuk e bëj e di se çfarë kjo do të thotë detyrimisht, 214 00:11:02,590 --> 00:11:06,150 atë e mori në mënyrë të qartë diçka të bëjë me një numër të plotë. 215 00:11:06,150 --> 00:11:08,211 Kështu që unë jam duke shkuar për ngjyra kjo kuti e gjelbër-ish, 216 00:11:08,211 --> 00:11:10,210 Unë e di se ka diçka të bëjë me një numër të plotë, 217 00:11:10,210 --> 00:11:13,400 por kjo nuk është një numër i plotë në vetvete, sepse kjo është një yll int. 218 00:11:13,400 --> 00:11:15,390 Ka diçka pak ndryshme në lidhje me të. 219 00:11:15,390 --> 00:11:17,620 Pra, përfshirë një numër të plotë-së, por ndryshe është 220 00:11:17,620 --> 00:11:19,830 jo shumë e ndryshme nga atë që ne ishim duke folur rreth. 221 00:11:19,830 --> 00:11:24,240 Kjo është një kuti, e saj mori një etiketë, ajo është veshur me një pk etiketë, 222 00:11:24,240 --> 00:11:27,280 dhe kjo është e aftë të mbajnë Yjet int, çfarëdo që ata janë. 223 00:11:27,280 --> 00:11:29,894 Ata kanë diçka për të bërë me integers, në mënyrë të qartë. 224 00:11:29,894 --> 00:11:31,060 Këtu është vija e fundit pse. 225 00:11:31,060 --> 00:11:37,650 Nëse unë them PK = & k, ee, çfarë ka ndodhur vetëm, e drejtë? 226 00:11:37,650 --> 00:11:41,820 Pra ky numër të rastit, në dukje të rastit numër, merr hedhur në kutinë e atje. 227 00:11:41,820 --> 00:11:44,930 E gjithë kjo është, është pk merr adresën e k. 228 00:11:44,930 --> 00:11:52,867 Kështu që unë jam i fërkimit ku k jeton në kujtesë, adresën e tij, adresa e bytes saj. 229 00:11:52,867 --> 00:11:55,200 Të gjitha unë jam duke bërë është që unë jam duke thënë se kjo vlerë është ajo që unë jam duke shkuar 230 00:11:55,200 --> 00:11:59,430 për të vënë brenda kuti të quajtur PK tim. 231 00:11:59,430 --> 00:12:02,080 Dhe për shkak se këto gjëra janë pointers, dhe për shkak kërkim 232 00:12:02,080 --> 00:12:04,955 në një varg si zero x tetë zero c shtatë katër tetë 233 00:12:04,955 --> 00:12:07,790 dy zero është ndoshta jo shumë kuptimplotë. 234 00:12:07,790 --> 00:12:12,390 Kur ne përgjithësi kujtoj pointers, ne fakt e bëjnë këtë si pointers. 235 00:12:12,390 --> 00:12:17,000 Pk na jep informacion ne kemi nevojë për të gjetur k në kujtesë. 236 00:12:17,000 --> 00:12:19,120 Pra, në thelb pk ka një shigjetë në të. 237 00:12:19,120 --> 00:12:21,670 Dhe nëse ecim gjatësinë e atij shigjetë, imagjinoni 238 00:12:21,670 --> 00:12:25,280 kjo është diçka që ju mund të ecin në, në qoftë se ne ecin përgjatë gjatësisë së shigjetës, 239 00:12:25,280 --> 00:12:29,490 në majë shumë të atij shigjetës, ne do të gjeni vend në kujtesën e 240 00:12:29,490 --> 00:12:31,390 ku k jeton. 241 00:12:31,390 --> 00:12:34,360 Dhe kjo është me të vërtetë e rëndësishme sepse një herë ne e dimë se ku jeton k, 242 00:12:34,360 --> 00:12:37,870 ne mund të fillojnë të punojnë me të dhënat brenda atë vend kujtesës. 243 00:12:37,870 --> 00:12:40,780 Edhe pse ne jemi duke marrë një teeny pak përpara vetes për tani. 244 00:12:40,780 --> 00:12:42,240 >> Pra, çfarë është një akrep? 245 00:12:42,240 --> 00:12:45,590 Një tregues është një artikull dhënat e të cilit Vlera është një adresë e kujtesës. 246 00:12:45,590 --> 00:12:49,740 Kjo ishte se zero x tetë zero sende në vazhdim e sipër, që ishte një adresë kujtim. 247 00:12:49,740 --> 00:12:52,060 Kjo ishte një vend në kujtesë. 248 00:12:52,060 --> 00:12:55,080 Dhe llojin e një akrep përshkruan llojin 249 00:12:55,080 --> 00:12:56,930 e të dhënave që ju do të gjeni në se adresa memorike. 250 00:12:56,930 --> 00:12:58,810 Pra, ka të drejtën ylli int pjesë. 251 00:12:58,810 --> 00:13:03,690 Nëse unë ndjek atë shigjetë, është do të më çojë në një vend. 252 00:13:03,690 --> 00:13:06,980 Dhe kjo vendndodhja, ajo që unë do të gjeni atje në shembullin tim, 253 00:13:06,980 --> 00:13:08,240 është një kuti e gjelbër me ngjyrë. 254 00:13:08,240 --> 00:13:12,650 Është një numër i plotë, kjo është ajo që unë do të gjeni nëse unë shkoj në atë adresë. 255 00:13:12,650 --> 00:13:14,830 Lloji dhënat e një akrep përshkruan çfarë 256 00:13:14,830 --> 00:13:17,936 ju do të gjeni në këtë adresë e kujtesës. 257 00:13:17,936 --> 00:13:19,560 Kështu që këtu është gjë me të vërtetë cool pse. 258 00:13:19,560 --> 00:13:25,090 Pointers të na lejojë të kalojë Variablat mes funksioneve. 259 00:13:25,090 --> 00:13:28,520 Dhe në fakt kalojnë variablave dhe jo të kalojë kopje të tyre. 260 00:13:28,520 --> 00:13:32,879 Sepse në qoftë se ne e dimë saktësisht se ku në kujtesë për të gjetur një ndryshore, 261 00:13:32,879 --> 00:13:35,670 ne nuk kemi nevojë për të bërë një kopje të ajo, ne vetëm mund të shkojnë në atë vend 262 00:13:35,670 --> 00:13:37,844 dhe të punojnë me këtë variabël. 263 00:13:37,844 --> 00:13:40,260 Pra, në thelb pointers lloj e bëjnë një mjedis kompjuter 264 00:13:40,260 --> 00:13:42,360 shumë më shumë si në botën e vërtetë, e drejtë. 265 00:13:42,360 --> 00:13:44,640 >> Kështu që këtu është një analogji. 266 00:13:44,640 --> 00:13:48,080 Le të thonë se unë kam një fletore, e drejtë, dhe kjo është e plotë të shënimeve. 267 00:13:48,080 --> 00:13:50,230 Dhe unë do të doja që ju të rinovuar atë. 268 00:13:50,230 --> 00:13:53,960 Ju jeni një funksion që përditësime shënime, e drejtë. 269 00:13:53,960 --> 00:13:56,390 Në mënyrën se si ne kemi qenë punuar deri më tani, çfarë 270 00:13:56,390 --> 00:14:02,370 ndodh është që ju do të marrë fletoren time, ju do të shkoni në dyqan kopje, 271 00:14:02,370 --> 00:14:06,410 ju do të bëni një kopje të Xerox çdo faqe e fletore. 272 00:14:06,410 --> 00:14:09,790 Ju do të lënë fletoren e mia në tryezën time, kur ju jeni bërë, 273 00:14:09,790 --> 00:14:14,600 ju do të shkoni dhe të kalojnë gjëra në tim fletore që janë nga data apo e gabuar, 274 00:14:14,600 --> 00:14:19,280 dhe pastaj ju do të kalojë përsëri në më rafte e faqeve Xerox 275 00:14:19,280 --> 00:14:22,850 që është një kopje e fletoren time me ndryshimet që ju keni bërë për të. 276 00:14:22,850 --> 00:14:27,040 Dhe në këtë pikë, është deri në mua si funksioni quajtur, si telefonuesi, 277 00:14:27,040 --> 00:14:30,582 për të vendosur për të marrë shënimet tuaja dhe integrimin e tyre përsëri në fletoren time. 278 00:14:30,582 --> 00:14:32,540 Pra, ka shumë hapa përfshirë këtu, e drejtë. 279 00:14:32,540 --> 00:14:34,850 Ashtu si nuk do të ishte më mirë në qoftë se unë vetëm them, hej, ju mund të 280 00:14:34,850 --> 00:14:38,370 rinovuar fletoren time për mua, ju dorë fletoren time, 281 00:14:38,370 --> 00:14:40,440 dhe ti marrin gjërat dhe fjalë për fjalë kalojnë ato 282 00:14:40,440 --> 00:14:42,810 dhe përditësimin shënimet e mia në fletoren time. 283 00:14:42,810 --> 00:14:45,140 Dhe pastaj jepni fletoren time mbrapa. 284 00:14:45,140 --> 00:14:47,320 Kjo është lloj i asaj që pointers të na lejojë të bëjmë, 285 00:14:47,320 --> 00:14:51,320 ata e bëjnë këtë mjedis shumë më shumë si se si ne të veprojë në realitet. 286 00:14:51,320 --> 00:14:54,640 >> Të gjithë të drejtë kështu që kjo është ajo një akrep është, le të flasim 287 00:14:54,640 --> 00:14:58,040 për mënyrën se si pointers punojnë në C, dhe se si ne mund të fillojnë të punojnë me ta. 288 00:14:58,040 --> 00:15:02,550 Pra, ka një tregues shumë i thjeshtë në C quajtur treguesin null. 289 00:15:02,550 --> 00:15:04,830 Pikat null tregues për asgjë. 290 00:15:04,830 --> 00:15:08,310 Kjo ndoshta duket sikur është në fakt nuk është një gjë shumë e dobishme, 291 00:15:08,310 --> 00:15:10,500 por si ne do të shohim një pak më vonë, fakti 292 00:15:10,500 --> 00:15:15,410 se ky tregues null ekziston vërtetë me të vërtetë mund të jetë në dispozicion. 293 00:15:15,410 --> 00:15:19,090 Dhe sa herë që ju të krijoni një akrep, dhe ju nuk e vënë immediately- vlera e tij 294 00:15:19,090 --> 00:15:21,060 një shembull i përcaktimit vlera e tij menjëherë 295 00:15:21,060 --> 00:15:25,401 do të jetë një çift slides mbrapa ku kam thënë pk barabartë & K, 296 00:15:25,401 --> 00:15:28,740 pk merr adresën K-së, si ne do të shohim se çka do të thotë, 297 00:15:28,740 --> 00:15:32,990 ne do të shohim se si të kodit që shortly- në qoftë se ne nuk e vendosur vlerën e saj për diçka 298 00:15:32,990 --> 00:15:35,380 kuptimplotë menjëherë, ju duhet gjithmonë 299 00:15:35,380 --> 00:15:37,480 vendosur treguesin tuaj të tregojnë për null. 300 00:15:37,480 --> 00:15:40,260 Ju duhet të vënë atë të tregojnë për asgjë. 301 00:15:40,260 --> 00:15:43,614 >> Kjo është shumë e ndryshme se vetëm duke e lënë vlerën siç është 302 00:15:43,614 --> 00:15:45,530 dhe pastaj duke deklaruar një tregues dhe vetëm duke supozuar 303 00:15:45,530 --> 00:15:48,042 është null, sepse kjo është e vërtetë rrallë. 304 00:15:48,042 --> 00:15:50,000 Kështu që ju duhet gjithmonë të vendosur vlera e një tregues 305 00:15:50,000 --> 00:15:55,690 të null nëse ju nuk e vënë vlerën e saj diçka kuptimplotë menjëherë. 306 00:15:55,690 --> 00:15:59,090 Ju mund të kontrolloni nëse një tregues i vlerës është i pavlefshëm duke përdorur operatorin e barazisë 307 00:15:59,090 --> 00:16:05,450 (==), Ashtu si ju krahasoni ndonjë numër i plotë Vlerat ose vlerat karakter duke përdorur (==) 308 00:16:05,450 --> 00:16:06,320 gjithashtu. 309 00:16:06,320 --> 00:16:10,994 Kjo është një lloj i veçantë i vazhdueshëm Vlera që ju mund të përdorni për të testuar. 310 00:16:10,994 --> 00:16:13,160 Kështu që ishte një shumë e thjeshtë pointer, tregues null. 311 00:16:13,160 --> 00:16:15,320 Një tjetër mënyrë për të krijuar një tregues është për nxjerrjen 312 00:16:15,320 --> 00:16:18,240 adresa e një variable keni krijuar tashmë, 313 00:16:18,240 --> 00:16:22,330 dhe ju bëni këtë duke përdorur & Nxjerrja adresë operator. 314 00:16:22,330 --> 00:16:26,720 Të cilat ne kemi parë tashmë më parë në shembullin e parë diagram kam treguar. 315 00:16:26,720 --> 00:16:31,450 Pra, nëse x është një ndryshore që ne kemi tashmë e krijuar e tipit numër i plotë, 316 00:16:31,450 --> 00:16:35,110 atëherë dhe x është tregues për një numër të plotë. 317 00:16:35,110 --> 00:16:39,810 dhe x është- mbani mend, dhe do të nxjerrë adresa e gjë në të djathtë. 318 00:16:39,810 --> 00:16:45,350 Dhe që nga një tregues është vetëm një adresë, se dhe x është tregues për një numër të plotë 319 00:16:45,350 --> 00:16:48,560 vlera e të cilit është vendi ku në jetën e kujtesës x. 320 00:16:48,560 --> 00:16:50,460 Kjo është adresa e X-it. 321 00:16:50,460 --> 00:16:53,296 Pra, & x është adresa e x. 322 00:16:53,296 --> 00:16:55,670 Le të marrin këtë hap një më tej dhe të lidheni me diçka 323 00:16:55,670 --> 00:16:58,380 Kam përmendur tërthorazi në një video paraprak. 324 00:16:58,380 --> 00:17:06,730 Nëse arr është një grup i dyshe, atëherë & arr kllapa katrore i është një tregues 325 00:17:06,730 --> 00:17:08,109 për një të dyfishtë. 326 00:17:08,109 --> 00:17:08,970 NE RREGULL. 327 00:17:08,970 --> 00:17:12,160 arr kllapa katrore unë, kur arr është një grup i dyshe, 328 00:17:12,160 --> 00:17:19,069 pastaj arr kllapa katrore i është elementi i-th e atij grup, 329 00:17:19,069 --> 00:17:29,270 dhe & arr kllapa katrore i është ku në kujtesës elementi i-th e arr ekziston. 330 00:17:29,270 --> 00:17:31,790 >> Pra, çfarë është implikimi këtu? 331 00:17:31,790 --> 00:17:34,570 Një emër vargjeve, implikimi e këtë gjë të gjithë, 332 00:17:34,570 --> 00:17:39,290 është se emri i një grup është në fakt në vetvete një akrep. 333 00:17:39,290 --> 00:17:41,170 Ju keni qenë duke punuar me pointers të gjithë së bashku 334 00:17:41,170 --> 00:17:45,290 çdo herë që ju keni përdorur një koleksion. 335 00:17:45,290 --> 00:17:49,090 Mbani mend nga shembulli në fushëveprimin e ndryshueshme, 336 00:17:49,090 --> 00:17:53,420 pranë fund të video unë i pranishëm një shembull ku ne kemi një funksion 337 00:17:53,420 --> 00:17:56,890 quajtur int grup dhe një Funksioni i quajtur set array. 338 00:17:56,890 --> 00:18:00,490 Dhe sfida juaj për të përcaktuar nëse janë apo jo, apo çfarë 339 00:18:00,490 --> 00:18:03,220 Vlerat që ne të shtypura jashtë fundi i funksionit, 340 00:18:03,220 --> 00:18:05,960 ne fund te programin kryesor. 341 00:18:05,960 --> 00:18:08,740 >> Nëse ju kujtohet nga ajo shembull ose në qoftë se ju keni shikuar videon, 342 00:18:08,740 --> 00:18:13,080 ju e dini se kur ju-thirrjen për grup int efektivisht nuk bën asgjë. 343 00:18:13,080 --> 00:18:16,390 Por thirrja për të vendosur grup bën. 344 00:18:16,390 --> 00:18:19,280 Dhe unë lloj i glossed mbi pse që ishte rasti në atë kohë. 345 00:18:19,280 --> 00:18:22,363 Unë vetëm tha, pra kjo është një grup, është e të veçantë, ju e dini, ka një arsye. 346 00:18:22,363 --> 00:18:25,020 Arsyeja është se një grup të Emri është me të vërtetë vetëm një tregues, 347 00:18:25,020 --> 00:18:28,740 dhe ka këtë të veçantë katror sintaksë kllapa se 348 00:18:28,740 --> 00:18:30,510 bëjë gjëra shumë nicer për të punuar me të. 349 00:18:30,510 --> 00:18:34,410 Dhe ata e bëjnë idenë e një treguesin shumë më pak frikësuese, 350 00:18:34,410 --> 00:18:36,800 dhe kjo është arsyeja pse ata janë lloj e paraqitur në këtë mënyrë. 351 00:18:36,800 --> 00:18:38,600 Por me të vërtetë vargjeve janë vetëm pointers. 352 00:18:38,600 --> 00:18:41,580 Dhe kjo është arsyeja pse kur ne bëri një ndryshim në grup, 353 00:18:41,580 --> 00:18:44,880 kur kemi kaluar një grup si një parametër në një funksion ose si një argumenti 354 00:18:44,880 --> 00:18:50,110 në një funksion, përmbajtja e vektorit ndryshuar në të vërtetë në të dy callee 355 00:18:50,110 --> 00:18:51,160 dhe në thirrësit. 356 00:18:51,160 --> 00:18:55,846 I cili për çdo lloj tjetër të ndryshore pamë nuk ishte rasti. 357 00:18:55,846 --> 00:18:58,970 Pra, kjo është vetëm diçka për të mbajtur në mendje kur ju jeni duke punuar me pointers, 358 00:18:58,970 --> 00:19:01,610 është se emri i një array në fakt një tregues 359 00:19:01,610 --> 00:19:04,750 të elementit të parë të kësaj vektorit. 360 00:19:04,750 --> 00:19:08,930 >> OK kështu që tani kemi të gjitha këto fakte, le të mbajë, apo jo. 361 00:19:08,930 --> 00:19:11,370 Pse nuk kemi kujdes për ku diçka jeton. 362 00:19:11,370 --> 00:19:14,120 Edhe si i tha, kjo është goxha e e dobishme të dinë se ku jeton diçka 363 00:19:14,120 --> 00:19:17,240 kështu që ju mund të shkoni atje dhe për të ndryshuar atë. 364 00:19:17,240 --> 00:19:19,390 Punojnë me të dhe në fakt kanë gjë që ju 365 00:19:19,390 --> 00:19:23,710 dua të bëj për këtë qëllim ndryshueshme të marrë, dhe jo të hyjë në fuqi në disa kopje të saj. 366 00:19:23,710 --> 00:19:26,150 Kjo quhet dereferencing. 367 00:19:26,150 --> 00:19:28,690 Ne do të shkojmë në referencës dhe ne të ndryshojë vlerën atje. 368 00:19:28,690 --> 00:19:32,660 Pra, nëse ne kemi një tregues dhe është quajtur pc, dhe kjo tregon për një karakter, 369 00:19:32,660 --> 00:19:40,610 atëherë mund të themi * pc dhe pc * është Emri i asaj që ne do të gjeni nëse ne do të shkojmë 370 00:19:40,610 --> 00:19:42,910 në pc adresën. 371 00:19:42,910 --> 00:19:47,860 Ajo që ne do të gjeni se ka një karakter dhe * pc është se si ne i referohemi të dhënave në atë 372 00:19:47,860 --> 00:19:48,880 Vendndodhja. 373 00:19:48,880 --> 00:19:54,150 Pra, ne mund të themi diçka si * pc = D ose diçka të tillë, 374 00:19:54,150 --> 00:19:59,280 dhe kjo do të thotë se çdo gjë që ishte kujtesës adresën pc, 375 00:19:59,280 --> 00:20:07,040 çfarëdo karakteri ishte më parë atje, tani D, në qoftë se ne themi * PC = D. 376 00:20:07,040 --> 00:20:10,090 >> Pra, këtu ne do të shkojmë përsëri me disa sende çuditshme C, e drejtë. 377 00:20:10,090 --> 00:20:14,560 Pra, ne kemi parë * më parë si disi pjesë e tipit të të dhënave, 378 00:20:14,560 --> 00:20:17,160 dhe tani ajo është duke u përdorur në një kontekst pak më të ndryshme 379 00:20:17,160 --> 00:20:19,605 për të hyrë në të dhënat në një vend. 380 00:20:19,605 --> 00:20:22,480 Unë e di se është pak konfuze dhe kjo është në fakt pjesë e kësaj e tërë 381 00:20:22,480 --> 00:20:25,740 si, pse pointers kanë këtë mitologji rreth tyre si aq komplekse, 382 00:20:25,740 --> 00:20:28,250 është lloj i një problemi sintaksë, me ndershmëri. 383 00:20:28,250 --> 00:20:31,810 Por * është përdorur në të dy kontekstet, edhe si pjesë e emrit të tipit, 384 00:20:31,810 --> 00:20:34,100 dhe ne do të shohim pak diçka më vonë tjetër, too. 385 00:20:34,100 --> 00:20:36,490 Dhe tani është Operatori dereference. 386 00:20:36,490 --> 00:20:38,760 Pra, ajo shkon në referencë, ajo accesses të dhënat e 387 00:20:38,760 --> 00:20:43,000 në vendin e kursorit, dhe ju lejon për të manipuluar atë sipas dëshirës. 388 00:20:43,000 --> 00:20:45,900 >> Tani kjo është shumë e ngjashme me vizituar të afërmin tënd, e drejtë. 389 00:20:45,900 --> 00:20:48,710 Nëse ju e dini se çfarë tuaj fqinji jeton, ju jeni 390 00:20:48,710 --> 00:20:50,730 nuk varur me fqinjin tuaj. 391 00:20:50,730 --> 00:20:53,510 Ju e dini që ju ndodh që të e di se ku ata jetojnë, 392 00:20:53,510 --> 00:20:56,870 por kjo nuk do të thotë se nga virtyt i pasur këtë njohuri 393 00:20:56,870 --> 00:20:59,170 ju jeni të bashkëveprojmë me ta. 394 00:20:59,170 --> 00:21:01,920 Nëse ju doni për të bashkëvepruar me ta, ju duhet të shkoni në shtëpinë e tyre, 395 00:21:01,920 --> 00:21:03,760 ju duhet të shkoni për të ku ata jetojnë. 396 00:21:03,760 --> 00:21:07,440 Dhe një herë ju bëni këtë, atëherë ju mund të bashkëveprojnë 397 00:21:07,440 --> 00:21:09,420 me ta ashtu si ju do të duan të. 398 00:21:09,420 --> 00:21:12,730 Dhe në mënyrë të ngjashme me variablat, ju duhet të shkoni në adresën e tyre 399 00:21:12,730 --> 00:21:15,320 në qoftë se ju doni për të bashkëvepruar ato, ju nuk mund vetëm të dinë adresën. 400 00:21:15,320 --> 00:21:21,495 Dhe mënyra që ju të shkoni në adresën e është për të përdorur *, operatori dereference. 401 00:21:21,495 --> 00:21:23,620 Çfarë mendoni ju ndodh nëse ne përpiqemi dhe dereference 402 00:21:23,620 --> 00:21:25,260 një tregues vlera e të cilit është i pavlefshëm? 403 00:21:25,260 --> 00:21:28,470 Kujtojnë se null tregues tregon asgjë. 404 00:21:28,470 --> 00:21:34,110 Pra, nëse ju provoni dhe dereference asgjë ose shkoni në një asgjë adresën, 405 00:21:34,110 --> 00:21:36,800 çfarë mendoni ju ndodh? 406 00:21:36,800 --> 00:21:39,630 Segmentimit E pra në qoftë se ju mendoi faj, ju do të jetë e drejtë. 407 00:21:39,630 --> 00:21:41,390 Nëse ju provoni dhe dereference një tregues null, 408 00:21:41,390 --> 00:21:43,140 vuani një ndarje faji. Por prisni, 409 00:21:43,140 --> 00:21:45,820 nuk po ju them se në qoftë se ju nuk jeni duke shkuar 410 00:21:45,820 --> 00:21:49,220 për të vendosur vlerën tuaj e juaj tregues për diçka të rëndësishme, 411 00:21:49,220 --> 00:21:51,000 ju duhet të vënë të null? 412 00:21:51,000 --> 00:21:55,290 Kam bërë dhe në fakt segmentimit faji është lloj i një sjellje të mirë. 413 00:21:55,290 --> 00:21:58,680 >> A keni deklaruar ndonjëherë një ndryshore dhe Nuk caktuar vlerën e saj menjëherë? 414 00:21:58,680 --> 00:22:02,680 Kështu që ju vetëm të thonë int x; ju nuk e bëni në fakt të caktojë atë për ndonjë gjë 415 00:22:02,680 --> 00:22:05,340 dhe pastaj më vonë në kodin tuaj, ju shtypura nga vlera e x, 416 00:22:05,340 --> 00:22:07,650 nuk ka ende caktuar atë për ndonjë gjë. 417 00:22:07,650 --> 00:22:10,370 Shpesh ju do të merrni zero, por ndonjëherë ju 418 00:22:10,370 --> 00:22:15,000 mund të marrë disa numër të rastit, dhe ju nuk keni ide se ku ai erdhi nga. 419 00:22:15,000 --> 00:22:16,750 Në mënyrë të ngjashme mund të gjëra ndodhë me pointers. 420 00:22:16,750 --> 00:22:20,110 Kur ju të deklarojë një akrep int * pk për shembull, 421 00:22:20,110 --> 00:22:23,490 dhe ju nuk caktojë atë në një vlerë, ju merrni katër bytes për kujtesën. 422 00:22:23,490 --> 00:22:25,950 Çfarëdo katër bytes kujtesës sistemi mund 423 00:22:25,950 --> 00:22:28,970 gjeni se kanë disa vlera kuptimplotë. 424 00:22:28,970 --> 00:22:31,760 Dhe nuk mund të ketë qenë diçka tashmë atje që 425 00:22:31,760 --> 00:22:34,190 nuk është më e nevojshme nga një tjetër funksion, kështu që ju vetëm duhet 426 00:22:34,190 --> 00:22:35,900 çfarëdo të dhënave ishte atje. 427 00:22:35,900 --> 00:22:40,570 >> Çfarë ndodh nëse ju u përpoq të bëjë dereference disa adresa që ju don't- ka qenë 428 00:22:40,570 --> 00:22:43,410 tashmë bytes dhe informacioni në atje, kjo është tani në treguesin tuaj. 429 00:22:43,410 --> 00:22:47,470 Nëse ju provoni dhe dereference atë akrep, ju mund të messing me disa kujtesës 430 00:22:47,470 --> 00:22:49,390 që ju nuk e keni ndërmend të luajnë me të gjitha. 431 00:22:49,390 --> 00:22:51,639 Dhe në të vërtetë ju mund të bëni diçka me të vërtetë shkatërruese, 432 00:22:51,639 --> 00:22:54,880 si të thyer një tjetër program, ose të thyejnë një tjetër funksion, 433 00:22:54,880 --> 00:22:58,289 ose të bëjë diçka me qëllim të keq që ju nuk e keni ndërmend të bëni në të gjitha. 434 00:22:58,289 --> 00:23:00,080 Dhe kështu kjo është arsyeja pse kjo është në fakt një ide e mirë 435 00:23:00,080 --> 00:23:04,030 për të vendosur tuaj pointers për null nëse ju nuk i vendosur ato në diçka kuptimplotë. 436 00:23:04,030 --> 00:23:06,760 Kjo është ndoshta më të mirë në Fundi i ditës për programin tuaj 437 00:23:06,760 --> 00:23:09,840 të rrëzuar, atëherë për atë për të bërë Diçka që vida deri 438 00:23:09,840 --> 00:23:12,400 një program apo një tjetër funksion. 439 00:23:12,400 --> 00:23:15,207 Kjo sjellje është ndoshta edhe më pak se ideale vetëm crashing. 440 00:23:15,207 --> 00:23:17,040 Dhe kështu kjo është arsyeja pse kjo është në fakt një zakon i mirë 441 00:23:17,040 --> 00:23:20,920 për të marrë në për të vendosur tuaj pointers të null qoftë se ju nuk vendosur ato 442 00:23:20,920 --> 00:23:24,540 në një vlerë kuptimplotë menjëherë, një vlerë që ju të dini 443 00:23:24,540 --> 00:23:27,260 dhe që ju mund të sigurtë dereference. 444 00:23:27,260 --> 00:23:32,240 >> Pra, le të kthehem tani dhe për të marrë një vështrim në sintaksë e përgjithshëm të situatës. 445 00:23:32,240 --> 00:23:37,400 Nëse unë them int * p ;, Çfarë kam bërë vetëm? 446 00:23:37,400 --> 00:23:38,530 Ajo që unë kam bërë është kjo. 447 00:23:38,530 --> 00:23:43,290 Unë e di se vlera e p është një adresë sepse të gjitha pointers janë vetëm 448 00:23:43,290 --> 00:23:44,660 Adresat. 449 00:23:44,660 --> 00:23:47,750 Unë mund dereference p duke përdorur operatorin *. 450 00:23:47,750 --> 00:23:51,250 Në këtë kontekst këtu, në shumë lartë kujtojnë * është pjesë e tipit. 451 00:23:51,250 --> 00:23:53,510 Int * është lloji dhënave. 452 00:23:53,510 --> 00:23:56,150 Por unë mund të dereference p duke përdorur operatorin *, 453 00:23:56,150 --> 00:24:01,897 dhe në qoftë se unë bëj kështu, nëse unë shkoj në atë adresë, çfarë do të gjej në atë adresë? 454 00:24:01,897 --> 00:24:02,855 Unë do të gjeni një numër të plotë. 455 00:24:02,855 --> 00:24:05,910 Pra, int * p është në thelb duke thënë: p është një adresë. 456 00:24:05,910 --> 00:24:09,500 Unë mund dereference p dhe nëse Unë bëj, unë do të gjeni një numër të plotë 457 00:24:09,500 --> 00:24:11,920 në atë vend e kujtesës. 458 00:24:11,920 --> 00:24:14,260 >> OK kështu që unë tha se nuk ishte një tjetër gjë bezdisshëm me yje 459 00:24:14,260 --> 00:24:17,060 dhe këtu është ku që gjë bezdisshëm me yje është. 460 00:24:17,060 --> 00:24:21,640 A keni provuar ndonjëherë për të deklaruar variabla të shumta të të njëjtit lloj 461 00:24:21,640 --> 00:24:24,409 në të njëjtin drejtim të kodit? 462 00:24:24,409 --> 00:24:27,700 Pra, për një të dytë, të pretendojë se vija, kodi Unë në fakt kam atje në gjelbër 463 00:24:27,700 --> 00:24:29,366 nuk ka dhe vetëm ajo thotë int x, y, z ;. 464 00:24:29,366 --> 00:24:31,634 465 00:24:31,634 --> 00:24:34,550 Çfarë kjo do të bëjë në fakt është të krijojë tre variabla numër i plotë për ju, 466 00:24:34,550 --> 00:24:36,930 një i quajtur X, një i quajtur y, dhe një quajtur z. 467 00:24:36,930 --> 00:24:41,510 Kjo është një mënyrë për të bërë atë pa pasur nevojë për të ndarë në tre rreshta. 468 00:24:41,510 --> 00:24:43,890 >> Ja ku yjet merrni bezdisshëm përsëri edhe pse, 469 00:24:43,890 --> 00:24:49,200 sepse * është në fakt pjesë të dy emrit tipit dhe pjesë 470 00:24:49,200 --> 00:24:50,320 e emrit ndryshueshme. 471 00:24:50,320 --> 00:24:56,430 Dhe kështu që nëse unë them int * px, py, PZ, çfarë unë në fakt të merrni është një tregues për një numër të plotë 472 00:24:56,430 --> 00:25:01,650 quajtur px dhe dy integers, py dhe PZ. 473 00:25:01,650 --> 00:25:04,950 Dhe kjo ndoshta nuk është çfarë ne duam, kjo nuk është e mirë. 474 00:25:04,950 --> 00:25:09,290 >> Pra, nëse unë dua të krijoj pointers të shumta në të njëjtën linjë, i llojit të njëjtë, 475 00:25:09,290 --> 00:25:12,140 dhe yjet, çfarë unë në fakt duhet të bëni është të themi int * PA, * BP, * pc. 476 00:25:12,140 --> 00:25:17,330 477 00:25:17,330 --> 00:25:20,300 Tani ka thënë vetëm se dhe tani po ju them këtë, 478 00:25:20,300 --> 00:25:22,170 ju ndoshta kurrë nuk do ta bëjë këtë. 479 00:25:22,170 --> 00:25:25,170 Dhe kjo është ndoshta një gjë e mirë me ndershmëri, sepse ju mund pa dashje 480 00:25:25,170 --> 00:25:26,544 heq një yll, diçka të tillë. 481 00:25:26,544 --> 00:25:29,290 Kjo është ndoshta më e mirë për të ndoshta të deklaruar pointers në linja të veçanta, 482 00:25:29,290 --> 00:25:31,373 por kjo është vetëm një tjetër e atyre bezdisshëm sintaksë 483 00:25:31,373 --> 00:25:35,310 gjëra me yjet që e bëjnë pointers kaq e vështirë për të punuar me të. 484 00:25:35,310 --> 00:25:39,480 Për shkak se ajo është vetëm kjo sintaktik rrëmujë ju duhet të punojnë me. 485 00:25:39,480 --> 00:25:41,600 Me praktikë kjo e bën të vërtetë të bëhet natyrë e dytë. 486 00:25:41,600 --> 00:25:45,410 Unë ende bëjnë gabime me atë ende pas programimit për 10 vjet, 487 00:25:45,410 --> 00:25:49,630 kështu që nuk do të jetë mërzitur, nëse ndodh diçka për ju, kjo është goxha e përbashkët me ndershmëri. 488 00:25:49,630 --> 00:25:52,850 Është me të vërtetë lloji i një e metë e sintaksës. 489 00:25:52,850 --> 00:25:54,900 >> OK kështu që unë lloj i premtuar se ne do të rishqyrtojnë 490 00:25:54,900 --> 00:25:59,370 koncepti i se sa i madh është një varg. 491 00:25:59,370 --> 00:26:02,750 E pra, nëse unë ju tha se një string, ne kemi me të vërtetë lloji i 492 00:26:02,750 --> 00:26:04,140 është gënjyer për ju të gjithë kohën. 493 00:26:04,140 --> 00:26:06,181 Nuk ka asnjë lloj të dhënave të quajtur string, dhe në fakt unë 494 00:26:06,181 --> 00:26:09,730 përmendur këtë në një nga tonë më të hershme video në lloje të të dhënave, 495 00:26:09,730 --> 00:26:13,820 se string ishte një lloj të dhënave që është krijuar për ju në CS50.h. 496 00:26:13,820 --> 00:26:17,050 Ju duhet të #include CS50.h në mënyrë që të përdorin atë. 497 00:26:17,050 --> 00:26:19,250 >> E pra string është me të vërtetë vetëm një alias për diçka 498 00:26:19,250 --> 00:26:23,600 quhet char *, një tregues për një karakter. 499 00:26:23,600 --> 00:26:26,010 E pra pointers, kujtojnë, janë vetëm adreson. 500 00:26:26,010 --> 00:26:28,780 Pra, çfarë është madhësia në bytes i një varg? 501 00:26:28,780 --> 00:26:29,796 E pra kjo është katër ose tetë. 502 00:26:29,796 --> 00:26:32,170 Dhe arsyeja unë them katër ose tetë është për shkak se në fakt 503 00:26:32,170 --> 00:26:36,730 varet nga sistemi, Nëse jeni duke përdorur CS50 ide, char * është madhësia e një char 504 00:26:36,730 --> 00:26:39,340 * Është tetë, kjo është një sistem 64-bit. 505 00:26:39,340 --> 00:26:43,850 Çdo adresa në kujtesë është 64 bit e gjatë. 506 00:26:43,850 --> 00:26:48,270 Nëse jeni duke përdorur pajisjen CS50 ose duke përdorur ndonjë makinë 32-bit, 507 00:26:48,270 --> 00:26:51,640 dhe ju keni dëgjuar se gjatë 32-bit makine, çfarë është një makinë 32-bit? 508 00:26:51,640 --> 00:26:56,090 E pra kjo thjesht do të thotë se çdo Adresa në memorie është 32 bit e gjatë. 509 00:26:56,090 --> 00:26:59,140 Dhe kështu 32 bit është katër bytes. 510 00:26:59,140 --> 00:27:02,710 Pra, një char * është katër ose tetë bytes varësi të sistemit tuaj. 511 00:27:02,710 --> 00:27:06,100 Dhe me të vërtetë çdo lloj të të dhënave, dhe një tregues për ndonjë të dhënave 512 00:27:06,100 --> 00:27:12,030 lloji, pasi të gjitha pointers janë vetëm adresat, janë katër ose tetë bytes. 513 00:27:12,030 --> 00:27:14,030 Pra, le të rishqyrtojnë këtë diagramin dhe le të përfundojmë 514 00:27:14,030 --> 00:27:18,130 Kjo video me një stërvitje të vogël këtu. 515 00:27:18,130 --> 00:27:21,600 Kështu që këtu është diagrami ne e kemi lënë jashtë me në fillim të videos. 516 00:27:21,600 --> 00:27:23,110 Pra, çfarë ndodh tani, nëse unë them PK = 35 *? 517 00:27:23,110 --> 00:27:26,370 518 00:27:26,370 --> 00:27:30,530 Pra, çfarë do të thotë kur unë them, * PK = 35? 519 00:27:30,530 --> 00:27:32,420 Merrni një të dytë. 520 00:27:32,420 --> 00:27:34,990 * pk. 521 00:27:34,990 --> 00:27:39,890 Në kontekst këtu, * është Operatori dereference. 522 00:27:39,890 --> 00:27:42,110 Kështu që kur dereference Operatori është përdorur, 523 00:27:42,110 --> 00:27:48,520 ne do të shkojmë në adresën vuri në dukje nga PK, dhe ne të ndryshojë atë që kemi gjetur. 524 00:27:48,520 --> 00:27:55,270 Pra PK = 35 * efektive e bën këtë në foto. 525 00:27:55,270 --> 00:27:58,110 Pra, kjo është në thelb sintaksore identike me të ka thënë k = 35. 526 00:27:58,110 --> 00:28:00,740 527 00:28:00,740 --> 00:28:01,930 >> Nje me shume. 528 00:28:01,930 --> 00:28:05,510 Nëse unë them m int, unë krijoj një variabël të ri të quajtur m. 529 00:28:05,510 --> 00:28:08,260 Një kuti e re, kjo është një kuti e gjelbër për shkak se ajo do të mbajë një numër të plotë, 530 00:28:08,260 --> 00:28:09,840 dhe kjo është etiketuar m. 531 00:28:09,840 --> 00:28:14,960 Nëse unë them m = 4, kam vënë një numër i plotë në atë kuti. 532 00:28:14,960 --> 00:28:20,290 Nëse themi PK = & m, si e bën ky ndryshim diagram? 533 00:28:20,290 --> 00:28:28,760 PK = & M, a ju kujtohet se çfarë Dhe Operatori bën apo quhet? 534 00:28:28,760 --> 00:28:34,430 Mos harroni se & emërin e ndryshueshme është adresa e një emrin e ndryshueshme. 535 00:28:34,430 --> 00:28:38,740 Pra, ajo që ne jemi duke thënë është pk merr adresën e m. 536 00:28:38,740 --> 00:28:42,010 Dhe kështu në mënyrë efektive çfarë ndodh diagram është se pk pikë nuk është më 537 00:28:42,010 --> 00:28:46,420 për k, por tregon m. 538 00:28:46,420 --> 00:28:48,470 >> Përsëri pointers janë shumë ndërlikuar për të punuar me 539 00:28:48,470 --> 00:28:50,620 dhe ata e marrin shumë praktikë, por për shkak 540 00:28:50,620 --> 00:28:54,150 të aftësisë së tyre për të lejuar ju për të kaluar të dhënave në mes funksioneve të 541 00:28:54,150 --> 00:28:56,945 dhe në fakt kanë ata Ndryshimet hyjnë në fuqi, 542 00:28:56,945 --> 00:28:58,820 duke marrë kokën tuaj rreth është me të vërtetë e rëndësishme. 543 00:28:58,820 --> 00:29:02,590 Kjo ndoshta është më e komplikuar tema kemi diskutuar në CS50, 544 00:29:02,590 --> 00:29:05,910 por vlera që ju merrni nga përdorimi pointers 545 00:29:05,910 --> 00:29:09,200 tejkalon komplikacione që vijnë nga të mësuarit e tyre. 546 00:29:09,200 --> 00:29:12,690 Kështu që unë ju uroj më të mirë të fat mësuar rreth pointers. 547 00:29:12,690 --> 00:29:15,760 Unë jam Doug Lloyd, kjo është CS50. 548 00:29:15,760 --> 00:29:17,447