1 00:00:00,000 --> 00:00:06,030 Spēlē muzika ] 2 00:00:06,030 --> 00:00:08,390 DŪGS LOJS:Norādes, ,šeit mēs esam. . 3 00:00:08,390 --> 00:00:12,840 Šī, iespējams, būs vissarežģītākā tēma, par kuru mēs runājam CS50. 4 00:00:12,840 --> 00:00:15,960 Un, ja iepriekš esat lasījis kaut ko par norādēm, jums varētu būt 5 00:00:15,960 --> 00:00:19,080 nedaudz biedējoši, iedziļināties šajā videoklipā. 6 00:00:19,080 --> 00:00:21,870 Tā ir taisnība, norādes var jums, iespējams, likt kļūdīties , 7 00:00:21,870 --> 00:00:24,660 strādājot ar mainīgajiem lielumiem un datiem, un izraisot programmas 8 00:00:24,660 --> 00:00:27,450 avāriju. 9 00:00:27,450 --> 00:00:30,130 Bet patiesībā tās ir patiešām noderīgas un sniedz mums patiešām 10 00:00:30,130 --> 00:00:32,810 lielisku veidu, kā pārsūtīt datus uz priekšu un atpakaļ starp 11 00:00:32,810 --> 00:00:35,490 funkcijām, ko mēs citādi nevaram darīt. 12 00:00:35,490 --> 00:00:38,276 Un tāpēc mēs patiešām vēlamies jūs apmācīt, lai norādēm būtu laba 13 00:00:38,276 --> 00:00:41,063 disciplīna , lai jūs varētu efektīvi izmantot norādes, lai padarītu 14 00:00:41,063 --> 00:00:43,850 savas programmas daudz labākas. 15 00:00:43,850 --> 00:00:46,035 Kā jau teicu, norādes sniedz mums atšķirīgu veidu, kā nodot datus 16 00:00:46,035 --> 00:00:48,220 starp funkcijām. 17 00:00:48,220 --> 00:00:52,350 Tagad, ja atceraties no kāda senāka videoklipa, kad mēs runājām par 18 00:00:52,350 --> 00:00:56,480 mainīgo mērogu, es minēju, ka visi dati, ko mēs nododam starp C 19 00:00:56,480 --> 00:01:00,610 funkcijām, tiek nodoti pēc vērtības. 20 00:01:00,610 --> 00:01:03,890 Un es, iespējams, neizmantoju šo terminu, jo es ar to domāju to, ka 21 00:01:03,890 --> 00:01:07,170 mēs nododam datu kopijas. 22 00:01:07,170 --> 00:01:10,190 Kad mēs nododam mainīgo funkcijai, mēs faktiski nenododam mainīgo 23 00:01:10,190 --> 00:01:13,210 funkcijai, vai ne? 24 00:01:13,210 --> 00:01:17,670 Mēs nododam šo datu kopiju funkcijai. 25 00:01:17,670 --> 00:01:20,425 Funkcija dara to, ko tā vēlas, un tā aprēķina kādu vērtību, un varbūt 26 00:01:20,425 --> 00:01:23,180 mēs izmantojam šo vērtību, kad tā to atdod. 27 00:01:23,180 --> 00:01:27,195 Šim noteikumam par vērtības nodošanu bija viens izņēmums, un mēs 28 00:01:27,195 --> 00:01:31,210 atgriezīsimies pie tānedaudz vēlāk šajā videoklipā. 29 00:01:31,210 --> 00:01:35,403 Ja mēs izmantojam norādes, nevis izmantojam mainīgos, pašus mainīgos 30 00:01:35,403 --> 00:01:39,596 lielumus vai mainīgo kopijas, mēs tagad varam nodot mainīgos starp 31 00:01:39,596 --> 00:01:43,790 funkcijām citādā veidā. 32 00:01:43,790 --> 00:01:46,808 Tas nozīmē, ka, ja mēs veicam izmaiņas vienā funkcijā, šīs izmaiņas 33 00:01:46,808 --> 00:01:49,827 faktiski stāsies spēkā citā funkcijā. 34 00:01:49,827 --> 00:01:52,974 Atkal, tas ir kaut kas, ko mēs nevarējām izdarīt iepriekš, un, ja jūs 35 00:01:52,974 --> 00:01:56,122 kādreiz esat mēģinājis apmainīt divu mainīgo vērtību funkcijā, esat 36 00:01:56,122 --> 00:01:59,270 pamanījis, ka šī problēma parādās, vai ne? 37 00:01:59,270 --> 00:02:02,406 Ja mēs vēlamies apmainīt X un Y, un mēs tos nododam funkcijai, ko 38 00:02:02,406 --> 00:02:05,543 sauc par mijmaiņas funkciju, funkcijas mijmaiņas ietvaros mainīgie 39 00:02:05,543 --> 00:02:08,680 apmainās ar vērtībām. 40 00:02:08,680 --> 00:02:12,785 Viens kļūst par diviem, divi kļūst par vienu, bet mēs faktiski neko 41 00:02:12,785 --> 00:02:16,890 nemainām sākotnējā funkcijā, funkcijas izsaucējā. 42 00:02:16,890 --> 00:02:19,550 Tā kā mēs nevaram, mēs strādājam tikai ar to kopijām. 43 00:02:19,550 --> 00:02:24,760 Tomēr, izmantojot norādes, mēs faktiski varam nodot X un Y funkcijai. 44 00:02:24,760 --> 00:02:26,960 Šī funkcija ar tiem var kaut ko darīt. 45 00:02:26,960 --> 00:02:29,250 Un šo mainīgo vērtības faktiski var mainīties. 46 00:02:29,250 --> 00:02:33,710 Tātad tās ir diezgan lielas izmaiņas mūsu spējā strādāt ar datiem. 47 00:02:33,710 --> 00:02:36,145 Pirms iedziļināmies norādēs, manuprāt, ir vērts veltīt dažas minūtes, 48 00:02:36,145 --> 00:02:38,580 lai atgrieztos pie pamatiem. 49 00:02:38,580 --> 00:02:41,960 Un apskatiet, kā darbojas datora atmiņa, jo šīs divas tēmas patiesībā 50 00:02:41,960 --> 00:02:45,340 būs diezgan savstarpēji saistītas. 51 00:02:45,340 --> 00:02:49,885 Kā jūs droši vien zināt, jūsu datorsistēmā ir cietais disks vai, 52 00:02:49,885 --> 00:02:54,430 iespējams, ārejais disks, sava veida failu glabāšanas vieta. 53 00:02:54,430 --> 00:02:59,810 Parasti tas ir ap 250 gigabaitiem līdz varbūt pāris terabaitiem tagad. 54 00:02:59,810 --> 00:03:02,936 Un tur atrodas visi jūsu faili, pat tad, kad dators ir izslēgts, 55 00:03:02,936 --> 00:03:06,063 varat to atkal ieslēgt, un pēc sistēmas atjaunināšanas faili atkal 56 00:03:06,063 --> 00:03:09,190 būs tur. 57 00:03:09,190 --> 00:03:12,620 Bet diskdziņi, piemēram, cietais disks, HDD vai ārējaisdiskdzinis, 58 00:03:12,620 --> 00:03:16,050 SSD, ir tikai atmiņas vieta. 59 00:03:16,050 --> 00:03:19,065 Mēs faktiski neko nevaram darīt ar datiem, kas atrodas cietajā diskā 60 00:03:19,065 --> 00:03:22,080 vai ārējādiskdzinī. 61 00:03:22,080 --> 00:03:25,440 Lai faktiski mainītu datus vai pārvietotu tos, mums tie ir jāpārvieto 62 00:03:25,440 --> 00:03:28,800 uz operatīvo atmiņu, brīvpiekļuves atmiņu. 63 00:03:28,800 --> 00:03:31,170 Tagad jūsu datorā ir daudz mazāk RAM. 64 00:03:31,170 --> 00:03:34,720 Ja jums ir vecāks dators, jums var būt aptuveni 512 megabaiti, 65 00:03:34,720 --> 00:03:38,270 iespējams, divi, četri, astoņi, 16, iespējams, pat nedaudz vairāk 66 00:03:38,270 --> 00:03:41,820 gigabaiti RAM. 67 00:03:41,820 --> 00:03:46,390 Tātad tas ir daudz mazāks, taču tur ir visi nepastāvīgie dati. 68 00:03:46,390 --> 00:03:48,270 Tieši tur mēs varam lietas mainīt. 69 00:03:48,270 --> 00:03:53,350 Bet, izslēdzot datoru, visi RAM dati tiek iznīcināti. 70 00:03:53,350 --> 00:03:56,670 Tāpēc mums ir nepieciešams cietais disks datu pastāvīgākai lokācijas 71 00:03:56,670 --> 00:03:59,990 vietai, lai tie saglabātos - būtu patiešām slikti, ja katru reizi, 72 00:03:59,990 --> 00:04:03,310 kad mēs izslēdzam datoru, katrs fails mūsu sistēmā tiktu izdzēsts. 73 00:04:03,310 --> 00:04:05,600 Tātad mēs strādājam RAM iekšpusē. 74 00:04:05,600 --> 00:04:10,340 Un katru reizi, kad mēs runājam par atmiņu, gandrīz CS50, mēs runājam 75 00:04:10,340 --> 00:04:15,080 par RAM, nevis cieto disku. 76 00:04:15,080 --> 00:04:18,657 Tātad, kad mēs pārvietojam lietas atmiņā, tie aizņem noteiktu vietu. 77 00:04:18,657 --> 00:04:21,068 Visi datu veidi, ar kuriem esam strādājuši, RAM aizņem atšķirīgu 78 00:04:21,068 --> 00:04:23,480 vietu. 79 00:04:23,480 --> 00:04:25,903 Tāpēc katru reizi, kad veidojat veselu skaitļu mainīgo, četri baiti 80 00:04:25,903 --> 00:04:28,326 atmiņas tiek rezervēti RAM, lai jūs varētu strādāt ar šo veselo 81 00:04:28,326 --> 00:04:30,750 skaitli. 82 00:04:30,750 --> 00:04:33,725 Jūs varat deklarēt veselu skaitli, mainīt to, piešķirt to vērtībai 83 00:04:33,725 --> 00:04:36,700 10, kas palielināta par vienu, tā tālāk un tā tālāk. 84 00:04:36,700 --> 00:04:39,625 Tam visam ānotiek RAM, un jūs saņemat četrus baitus, ar kuriem 85 00:04:39,625 --> 00:04:42,550 strādāt, katram izveidotajam veselam skaitlim. 86 00:04:42,550 --> 00:04:45,410 Katra jūsu izveidotā rakstzīme saņem vienu baitu. 87 00:04:45,410 --> 00:04:46,785 Tieši tik daudz vietas ir nepieciešams jūsu izveidotās rakstzīmes 88 00:04:46,785 --> 00:04:48,160 glabāšanai. 89 00:04:48,160 --> 00:04:51,575 Katrā plūstošā vērtība , reāls skaitlis, iegūst četrus baitus, ja 90 00:04:51,575 --> 00:04:54,990 vien tas nav dubultas precizitātes peldošā komata skaitlis, kas ļauj 91 00:04:54,990 --> 00:04:58,405 iegūt precīzākus vai vairāk ciparus aiz komata, nezaudējot 92 00:04:58,405 --> 00:05:01,820 precizitāti, kas aizņem astoņus baitus atmiņas. 93 00:05:01,820 --> 00:05:04,275 Lielās vienības , patiešām lieli veseli skaitļi, arī aizņem astoņus 94 00:05:04,275 --> 00:05:06,730 baitus atmiņas. 95 00:05:06,730 --> 00:05:09,000 Cik baitu atmiņas aizņem virknes? 96 00:05:09,000 --> 00:05:10,995 Pagaidām šim jautājumam pievienosim atgādinājumu, bet mēs pie tā 97 00:05:10,995 --> 00:05:12,990 atgriezīsimies. 98 00:05:12,990 --> 00:05:15,170 Tātad atpakaļ pie šīs idejas par atmiņu, kura ir kā milzīgs baitu - 99 00:05:15,170 --> 00:05:17,350 lieluma šūnu masīvs. 100 00:05:17,350 --> 00:05:20,376 Tas tiešām ir viss, tas ir tikai milzīgs šūnu masīvs, tāpat kā 101 00:05:20,376 --> 00:05:23,403 jebkurš cits masīvs, ko jūs pazīstat un redzat, s, izņemot to, ka 102 00:05:23,403 --> 00:05:26,430 katrs elements ir viena baita platumā. 103 00:05:26,430 --> 00:05:30,030 Un tāpat kā masīvam, katram elementam ir adrese. 104 00:05:30,030 --> 00:05:33,166 Katram masīva elementam ir indekss, un mēs varam izmantot šo indeksu, 105 00:05:33,166 --> 00:05:36,302 lai veiktu tā saukto nejaušo piekļuvi masīvam. 106 00:05:36,302 --> 00:05:39,081 Mums nav jāsāk ar masīva sākumu, atkārtojiet katru tā elementu, lai 107 00:05:39,081 --> 00:05:41,860 atrastu to, ko meklējam. 108 00:05:41,860 --> 00:05:43,825 Mēs varam tikai teikt, es gribu tikt pie 15. elementa vai 100. 109 00:05:43,825 --> 00:05:45,790 elementa. 110 00:05:45,790 --> 00:05:49,930 Un jūs varat vienkārši ievadīt šo numuru un iegūt vēlamo vērtību. 111 00:05:49,930 --> 00:05:54,460 Tāpat katrai vietai atmiņā ir adrese. 112 00:05:54,460 --> 00:05:57,320 Tātad jūsu atmiņa varētu izskatīties apmēram šādi. 113 00:05:57,320 --> 00:06:01,420 Šeit ir ļoti mazs atmiņas apjoms, tas ir 20 baiti atmiņas. 114 00:06:01,420 --> 00:06:05,155 Pirmie 20 baiti, jo manas adreses apakšā ir 0, 1, 2, 3 un tā tālāk 115 00:06:05,155 --> 00:06:08,890 līdz 19. 116 00:06:08,890 --> 00:06:13,242 Un, kad es deklarēju mainīgos un kad sāku ar tiem strādāt, sistēma 117 00:06:13,242 --> 00:06:17,595 man atvēlēs vietu šajā atmiņā, lai strādātu ar maniem mainīgajiem. 118 00:06:17,595 --> 00:06:21,610 Tāpēc es varētu teikt, ka char c ir vienāds ar lielo H. 119 00:06:17,595 --> 00:06:23,880 Un kas notiks? Sistēma man atvēlēs vienu baitu. 120 00:06:23,880 --> 00:06:27,595 Šajā gadījumā tas izvēlējās ceturto baitu, 4 adresē esošo baitu, un 121 00:06:27,595 --> 00:06:31,310 tas manā vietā saglabās lielo burtu H. 122 00:06:31,310 --> 00:06:34,058 Ja es saku, ka int ātruma ierobežojums ir vienāds ar 65, tas man 123 00:06:34,058 --> 00:06:36,806 atvēlēs četrus baitus atmiņas. 124 00:06:36,806 --> 00:06:39,055 Un tas šos četrus baitus uzskatīs par vienu vienību, jo tas, ar ko 125 00:06:39,055 --> 00:06:41,305 mēs strādājam, ir vesels skaitlis. 126 00:06:41,305 --> 00:06:44,350 Un tajā tiks uzglabāti 65. 127 00:06:44,350 --> 00:06:47,250 Jau tagad es jums mazliet meloju, jo mēs zinām, ka datori darbojas 128 00:06:47,250 --> 00:06:50,150 binārā formātā. 129 00:06:50,150 --> 00:06:53,630 Viņi ne vienmēr saprot, kas ir lielais H vai kas ir 65, viņi saprot 130 00:06:53,630 --> 00:06:57,110 tikai bināros, nulles un vieniniekus. 131 00:06:57,110 --> 00:07:02,045 Tātad patiesībā tas, ko mēs tur glabājam, nav burts H un cipars 65, 132 00:07:02,045 --> 00:07:06,980 bet gan tā binārie attēlojumi, kas izskatās nedaudz līdzīgi šim. 133 00:07:06,980 --> 00:07:10,127 Un jo īpaši vesela skaitļa mainīgā kontekstā tas netiks vienkārši tur 134 00:07:10,127 --> 00:07:13,275 ievietots, tas noteikti netiks uzskatīts par vienu četru baitu 135 00:07:13,275 --> 00:07:16,422 gabalu, tas faktiski tiks uzskatīts par četriem viena baita gabaliem, 136 00:07:16,422 --> 00:07:19,570 kas varētu izskatīties apmēram šādi. 137 00:07:19,570 --> 00:07:22,723 Un pat tas nav pilnīgi taisnība, jo tas ir saistīts ar to, ko sauc 138 00:07:22,723 --> 00:07:25,876 par endianness, kurā mēs tagad neiedziļināsimies, bet, ja jums ir 139 00:07:25,876 --> 00:07:29,030 interese, varat izlasīt par mazajiem un lielajiem galamērķiem. 140 00:07:29,030 --> 00:07:32,303 Bet šī argumenta labad, šī videoklipa labad, pieņemsim, ka patiesībā 141 00:07:32,303 --> 00:07:35,576 tā skaitlis 65 tiktu attēlots katras sistēmas atmiņā, lai gan tas nav 142 00:07:35,576 --> 00:07:38,850 pilnīgi taisnība. 143 00:07:38,850 --> 00:07:41,866 Bet patiesībā atbrīvosimies no visiem binārajiem elementiem un 144 00:07:41,866 --> 00:07:44,883 padomāsim tikai par H un 65, jo cilvēkam ir daudz vieglāk par to 145 00:07:44,883 --> 00:07:47,900 domāt. 146 00:07:47,900 --> 00:07:51,515 Labi, tāpēc šķiet arī nedaudz nejauši, ka mana sistēma man nedeva 5., 147 00:07:51,515 --> 00:07:55,130 6., 7. un 8. baitus, lai saglabātu veselu skaitli. 148 00:07:55,130 --> 00:07:58,970 Tam ir arī iemesls, kurā mēs šobrīd neiedziļināsimies, taču pietiek 149 00:07:58,970 --> 00:08:02,810 ar to, ka tas, ko dators šeit dara, visticamāk, ir pareizi. 150 00:08:02,810 --> 00:08:06,020 Lai man nepiešķirtu atmiņu, kas nepieciešams, lai atgrieztos atpakaļ. 151 00:08:06,020 --> 00:08:09,550 Lai gan tas to darīs tagad, ja es vēlos iegūt vēl citu virkni, ko 152 00:08:09,550 --> 00:08:13,080 sauc par uzvārdu, un es gribu te ievietot Loidu. 153 00:08:13,080 --> 00:08:17,205 Būs nepieciešams ietilpt vienā rakstzīmē, katram tās burtam būs 154 00:08:17,205 --> 00:08:21,330 nepieciešama viena rakstzīme, viens baits atmiņas. 155 00:08:21,330 --> 00:08:23,780 Tātad, ja es varētu iekļaut Loidu savā masīvā šādi, tas būtu diezgan 156 00:08:23,780 --> 00:08:26,230 labi, vai ne? 157 00:08:26,230 --> 00:08:28,870 Kas pietrūkst? 158 00:08:28,870 --> 00:08:31,104 Atcerieties, ka katra virkne, ar kuru mēs strādājam programmā C, 159 00:08:31,104 --> 00:08:33,339 beidzas ar slīpsvītru nulli, un mēs to nevaram izlaist arī šeit. 160 00:08:33,339 --> 00:08:36,234 Mums ir jāatliek viens baits atmiņas, lai to saglabātu, lai mēs 161 00:08:36,234 --> 00:08:39,130 zinātu, kad mūsu virkne ir beigusies. 162 00:08:39,130 --> 00:08:42,000 Tātad arī šis izkārtojums, kā lietas parādās atmiņā, varētu būt 163 00:08:42,000 --> 00:08:44,870 nedaudz nejaušs, taču patiesībā tā tiek veidota lielākā daļa sistēmu. 164 00:08:44,870 --> 00:08:47,475 Lai tos sarindotu četrinieku reizinājumos, atkal tādu iemeslu dēļ, 165 00:08:47,475 --> 00:08:50,080 kas mums šobrīd nav jāapspriež. 166 00:08:50,080 --> 00:08:52,445 Bet ir pietiekami pateikt, ka pēc šīm trim koda rindām atmiņa varētu 167 00:08:52,445 --> 00:08:54,810 izskatīties šādi. 168 00:08:54,810 --> 00:08:57,955 Ja man ir vajadzīgas 4., 8. un 12. atmiņas vietas, lai glabātu savus 169 00:08:57,955 --> 00:09:01,100 datus, mana atmiņa varētu izskatīties šādi. 170 00:09:01,100 --> 00:09:04,745 Un vienkārši esiet īpaši precīzi , kad runājam par atmiņas adresēm, 171 00:09:04,745 --> 00:09:08,390 mēs to parasti darām, izmantojot heksadecimālos apzīmējumus. 172 00:09:08,390 --> 00:09:10,596 Tātad, kāpēc mēs tos visus lai nepārveidotu no decimāldaļas uz 173 00:09:10,596 --> 00:09:12,803 heksadecimālo apzīmējumu tikai tāpēc, ka tā parasti mēs runājam par 174 00:09:12,803 --> 00:09:15,010 atmiņu. 175 00:09:15,010 --> 00:09:17,675 Tātad tā vietā, lai būtu no 0 līdz 19, mums ir nulle x nulle līdz 176 00:09:17,675 --> 00:09:20,340 nullei x1 trīs. 177 00:09:20,340 --> 00:09:22,940 Tie ir 20 baiti atmiņas, kas mums ir vai arī mēs skatāmies šajā 178 00:09:22,940 --> 00:09:25,540 attēlā. 179 00:09:25,540 --> 00:09:28,015 Ņemot to vērā, uz brīdi atkāpsimies no atmiņas un atgriezīsimies pie 180 00:09:28,015 --> 00:09:30,490 norādēm. 181 00:09:30,490 --> 00:09:32,280 Šeit ir vissvarīgākā lieta, kas jāatceras, kad sākam strādāt ar 182 00:09:32,280 --> 00:09:34,070 norādēm. 183 00:09:34,070 --> 00:09:36,314 Rādītājs ir nekas vairāk kā adrese. 184 00:09:36,314 --> 00:09:39,522 Es atkārtošu to vēlreiz, jo tas ir tik svarīgi, rādītājs nav nekas 185 00:09:39,522 --> 00:09:42,730 vairāk kā adrese. 186 00:09:42,730 --> 00:09:47,760 Rādītāji ir adreses uz vietām atmiņā, kur atrodas mainīgie. 187 00:09:47,760 --> 00:09:52,590 Zinot, ka, cerams, būs nedaudz vieglāk strādāt ar viņiem. 188 00:09:52,590 --> 00:09:55,550 Vēl viena lieta, ko man patīk darīt, ir sava veida diagrammas, kas 189 00:09:55,550 --> 00:09:58,510 vizuāli attēlo to, kas notiek ar dažādām koda rindām. 190 00:09:58,510 --> 00:10:00,932 Un mēs to darīsim pāris reizes norādēs, kā arī tad, kad runājam par 191 00:10:00,932 --> 00:10:03,354 dinamisko atmiņas piešķiršanu. 192 00:10:03,354 --> 00:10:06,020 Jo es domāju, ka šīs diagrammas var būt īpaši noderīgas. 193 00:10:06,020 --> 00:10:09,540 Tātad, ja es savā kodā saku, piemēram, int k, kas notiek? 194 00:10:09,540 --> 00:10:12,920 Būtībā notiek tas, ka man ir atlicināta atmiņa, bet man pat nepatīk 195 00:10:12,920 --> 00:10:16,300 par to tā domāt, man patīk domāt par to, kā par lodziņu. 196 00:10:16,300 --> 00:10:19,025 Man ir lodziņš, un tas ir zaļā krāsā, jo zaļos lodziņos varu ievietot 197 00:10:19,025 --> 00:10:21,750 veselus skaitļus. 198 00:10:21,750 --> 00:10:23,666 Ja tā būtu rakstzīme, man varētu būt zils lodziņš. 199 00:10:23,666 --> 00:10:26,308 Bet es vienmēr saku, ja es veidoju lodziņu, kurā var ievietot veselus 200 00:10:26,308 --> 00:10:28,950 skaitļus, tas ir zaļš. 201 00:10:28,950 --> 00:10:33,020 Un es paņemu pastāvīgo marķieri un uzrakstu tā malā k. 202 00:10:33,020 --> 00:10:35,305 Tātad man ir lodziņš ar nosaukumu k, kurā varu ievietot veselus 203 00:10:35,305 --> 00:10:37,590 skaitļus. 204 00:10:37,590 --> 00:10:41,070 Tātad, kad es saku int k, tas notiek manā galvā. 205 00:10:41,070 --> 00:10:43,140 Ja es saku, ka k ir pieci, ko es daru? 206 00:10:43,140 --> 00:10:45,110 Nu, es ielieku lodziņā piecus, pareizi. 207 00:10:45,110 --> 00:10:46,890 Tas ir diezgan vienkārši, ja es saku int k, izveidojiet lodziņu ar 208 00:10:46,890 --> 00:10:48,670 nosaukumu k. 209 00:10:48,670 --> 00:10:52,040 Ja es saku, ka k ir 5, ielieciet lodziņā piecus. 210 00:10:52,040 --> 00:10:53,865 Cerams, ka tas nav pārāk liels lēciens. 211 00:10:53,865 --> 00:10:55,990 Lūk, kur lietas tomēr notiek mazliet interesanti. 212 00:10:55,990 --> 00:11:01,070 Ja es saku int*pk, pat, ja es nezinu, ko tas noteikti nozīmē, tam 213 00:11:01,070 --> 00:11:06,150 noteikti ir kāds sakars ar veselu skaitli. 214 00:11:06,150 --> 00:11:08,566 Tāpēc es nokrāsošu šo lodziņu zaļganā krāsā, es zinu, ka tam ir kāds 215 00:11:08,566 --> 00:11:10,983 sakars ar veselu skaitli, bet pats par sevi tas nav vesels skaitlis, 216 00:11:10,983 --> 00:11:13,400 jo tā ir int zvaigznīte. 217 00:11:13,400 --> 00:11:15,390 Tajā ir kaut kas nedaudz atšķirīgs. 218 00:11:15,390 --> 00:11:17,610 Tātad ir iesaistīts vesels skaitlis, bet citādi tas pārāk neatšķiras 219 00:11:17,610 --> 00:11:19,830 no tā, par ko mēs runājām. 220 00:11:19,830 --> 00:11:23,555 Tas ir lodziņš, , tam ir etiķete, uz tā ir uzlīme pk, un tajā var būt 221 00:11:23,555 --> 00:11:27,280 zvaigznītes, lai kas tās būtu. 222 00:11:27,280 --> 00:11:29,894 Skaidrs, ka tiem ir kāds sakars ar veseliem skaitļiem. 223 00:11:29,894 --> 00:11:31,060 Tomēr šeit ir pēdējā rinda. 224 00:11:31,060 --> 00:11:37,650 Ja es saku pk=&k,, kas tikko notika, vai ne? 225 00:11:37,650 --> 00:11:39,735 Tātad šis nejaušais skaitlis, šķietami nejaušs skaitlis, tiek iemests 226 00:11:39,735 --> 00:11:41,820 lodziņā. . 227 00:11:41,820 --> 00:11:44,930 Viss, kas ir, nozīmē, ka , pk iegūst k adresi. 228 00:11:44,930 --> 00:11:48,898 Tāpēc es atzīmēju vietu, kur k atrodas atmiņā, tā adresi, tā baitu 229 00:11:48,898 --> 00:11:52,867 adresi. 230 00:11:52,867 --> 00:11:56,148 Viss, ko es daru, ir tas, ka es saku, ka vērtība ir tā, ko es 231 00:11:56,148 --> 00:11:59,430 ievietošu savā lodziņā ar nosaukumu pk. 232 00:11:59,430 --> 00:12:02,216 Un tāpēc, ka šīs lietas ir norādes, un tāpēc, ka skatīties uz virkni, 233 00:12:02,216 --> 00:12:05,003 piemēram, nulle x astoņi nulle c septiņi četri astoņi divi nulle, 234 00:12:05,003 --> 00:12:07,790 iespējams, nav pārāk jēgpilni. 235 00:12:07,790 --> 00:12:10,090 Kad mēs parasti vizualizējam norādes, mēs to darām tā, kā tas jādara 236 00:12:10,090 --> 00:12:12,390 ar norādēm. 237 00:12:12,390 --> 00:12:17,000 Pk sniedz mums informāciju, kas nepieciešama, lai atmiņā atrastu k. 238 00:12:17,000 --> 00:12:19,120 Tātad būtībā pk atrodas bultiņa. 239 00:12:19,120 --> 00:12:23,210 Un, ja mēs ejam šīs bultas garumā, iedomājieties, ka tas ir kaut kas, 240 00:12:23,210 --> 00:12:27,300 pa kuru varat staigāt, ja mēs ejam pa bultas garumu, šīs bultiņas 241 00:12:27,300 --> 00:12:31,390 pašā galā mēs atmiņā atradīsim vietu, kur atrodas k. 242 00:12:31,390 --> 00:12:34,630 Un tas ir patiešām svarīgi, jo, tiklīdz mēs zinām, kur atrodas k , 243 00:12:34,630 --> 00:12:37,870 mēs varam sākt strādāt ar datiem, kas ir šajā atmiņas vietā. 244 00:12:37,870 --> 00:12:40,780 Lai gan mēs šobrīd esam visam mazliet priekšā. 245 00:12:40,780 --> 00:12:42,240 Tātad, kas ir rādītājs? 246 00:12:42,240 --> 00:12:45,590 Rādītājs ir datu vienums, kura vērtība ir atmiņas adrese. 247 00:12:45,590 --> 00:12:49,740 Tā bija tā, ka nulle x astoņi nulle irtā bija atmiņas adrese. 248 00:12:49,740 --> 00:12:52,060 Tā bija vieta atmiņā. 249 00:12:52,060 --> 00:12:54,495 Un rādītāja veids apraksta datu veidu, ko atradīsit šajā atmiņas 250 00:12:54,495 --> 00:12:56,930 adresē. 251 00:12:56,930 --> 00:12:58,810 Tātad tur ir int star - * daļa, skaidrs? 252 00:12:58,810 --> 00:13:03,690 Ja es sekošu šai bultiņai, tā mani aizvedīs uz vietu. 253 00:13:03,690 --> 00:13:05,965 Un šī vieta, ko es tur atradīšu šeit savā piemērā, ir zaļas krāsas 254 00:13:05,965 --> 00:13:08,240 lodziņš. . 255 00:13:08,240 --> 00:13:12,650 Tas ir vesels skaitlis, to es atradīšu, ja došos uz šo adresi. 256 00:13:12,650 --> 00:13:17,936 Rādītāja datu tips apraksta to, ko jūs atradīsit šajā atmiņas adresē. 257 00:13:17,936 --> 00:13:19,560 Tātad šeit ir patiešām forši 258 00:13:19,560 --> 00:13:25,090 Rādītāji ļauj mums nodot mainīgos starp funkcijām. 259 00:13:25,090 --> 00:13:28,520 Un faktiski nodod mainīgos, nevis nodod to kopijas. 260 00:13:28,520 --> 00:13:31,628 Jo, ja mēs precīzi zinām, kur atmiņā atrast mainīgo, mums nav jāveido 261 00:13:31,628 --> 00:13:34,736 tā kopija, mēs varam vienkārši doties uz šo vietu un strādāt ar šo 262 00:13:34,736 --> 00:13:37,844 mainīgo. 263 00:13:37,844 --> 00:13:40,102 Tātad būtībā norādes padara datora vidi daudz līdzīgāku reālajai 264 00:13:40,102 --> 00:13:42,360 pasaulei, vai ne. 265 00:13:42,360 --> 00:13:44,640 Tātad, šeit ir analoģija. 266 00:13:44,640 --> 00:13:48,080 Pieņemsim, ka man ir piezīmju grāmatiņa, un tā ir pilna ar piezīmēm. 267 00:13:48,080 --> 00:13:50,230 Un es vēlētos, lai jūs to atjauninātu. 268 00:13:50,230 --> 00:13:53,960 Jūs esat funkcija, kas atjaunina piezīmes, vai ne. 269 00:13:53,960 --> 00:13:58,110 Tādā veidā, kā mēs esam strādājuši līdz šim, jūs paņemsit manu 270 00:13:58,110 --> 00:14:02,260 piezīmju grāmatiņu, jūs dosities uz kopiju biroju un izveidosit Xerox 271 00:14:02,260 --> 00:14:06,410 kopiju no katras piezīmju grāmatiņas lapas. 272 00:14:06,410 --> 00:14:09,698 Jūs noliksiet manu piezīmju grāmatiņu atpakaļ uz mana galda, kad 273 00:14:09,698 --> 00:14:12,986 būsiet pabeidzis, jūs aiziesit un izsvītrosiet manā piezīmju 274 00:14:12,986 --> 00:14:16,274 grāmatiņā lietas, kas ir novecojušas vai nepareizas, un pēc tam 275 00:14:16,274 --> 00:14:19,562 nosūtīsiet man atpakaļ Xerox lapu kaudzi, kas ir mana piezīmju 276 00:14:19,562 --> 00:14:22,850 grāmatiņas kopija ar tajā veiktajām izmaiņām. 277 00:14:22,850 --> 00:14:25,427 Un tajā brīdī man, kas ir kā izsaukšanas funkcija kā zvanītājam ir 278 00:14:25,427 --> 00:14:28,004 jāizlemj ņemt jūsu piezīmes un integrēt tās atpakaļ savā piezīmju 279 00:14:28,004 --> 00:14:30,582 grāmatiņā. 280 00:14:30,582 --> 00:14:32,540 Tātad šeit ir iesaistītas daudzas darbības, vai ne. 281 00:14:32,540 --> 00:14:35,107 Vai nebūtu labāk, ja es vienkārši pateiktu: Hei, vai jūs varat 282 00:14:35,107 --> 00:14:37,675 atjaunināt manu piezīmju grāmatiņu manā vietā, nodot jums manu 283 00:14:37,675 --> 00:14:40,242 piezīmju grāmatiņu, un jūs paņemat lietas un burtiski tās izsvītrojat 284 00:14:40,242 --> 00:14:42,810 un atjaunināt manas piezīmes manā piezīmju grāmatiņā. 285 00:14:42,810 --> 00:14:45,140 Un tad atdod man manu piezīmju grāmatiņu. 286 00:14:45,140 --> 00:14:48,230 Tas ir tas, ko norādes mums ļauj darīt, tās padara šo vidi daudz 287 00:14:48,230 --> 00:14:51,320 līdzīgāku tam, kā mēs darbojamies patiesībā. 288 00:14:51,320 --> 00:14:54,680 Tas ir tas, kas ir norāde. Parunāsim par to, kā norādesdarbojas 289 00:14:54,680 --> 00:14:58,040 programmā C un kā mēs varam sākt ar tiem strādāt. 290 00:14:58,040 --> 00:15:02,550 Tātad C valodā ir ļoti vienkārša norāde, ko sauc par nulles norādi. 291 00:15:02,550 --> 00:15:04,830 Nulles norāde norāda uz neko. 292 00:15:04,830 --> 00:15:08,356 Tas, iespējams, šķiet, ka patiesībā tā nav īpaši noderīga lieta, 293 00:15:08,356 --> 00:15:11,883 taču, kā mēs redzēsim nedaudz vēlāk, fakts, ka šis nulles 294 00:15:11,883 --> 00:15:15,410 norādepatiešām pastāv, var noderēt. 295 00:15:15,410 --> 00:15:19,088 Un ikreiz, kad veidojat norādiun neiestatāt tā vērtību uzreiz — tās 296 00:15:19,088 --> 00:15:22,766 vērtības tūlītējas iestatīšanas piemērs būs pāris slaidi atpakaļ 297 00:15:22,766 --> 00:15:26,444 vietā, kur es teicu, pk ir vienāds ar & k, pk iegūst k adresi, jo mēs 298 00:15:26,444 --> 00:15:30,123 redzēsim, kas tas ir. Tas nozīmē, ka drīzumā redzēsim, kā to kodēt. 299 00:15:30,123 --> 00:15:33,801 Ja mēs nekavējoties neiestatām tā vērtību uz kaut ko nozīmīgu, jums 300 00:15:33,801 --> 00:15:37,480 vienmēr ir jāiestata norāde, lai norādītu uz nulli. 301 00:15:37,480 --> 00:15:40,260 Jums vajadzētu iestatīt tā, lai tas nenorādītu uz neko. 302 00:15:40,260 --> 00:15:42,854 Tas ir pavisam savādāk, nekā vienkārši atstāt vērtību tādu, kāda tā 303 00:15:42,854 --> 00:15:45,448 ir, un pēc tam deklarēt norādiun pieņemt, ka tā ir nulle, jo tas reti 304 00:15:45,448 --> 00:15:48,042 ir patiesība. 305 00:15:48,042 --> 00:15:51,866 Tāpēc vienmēr ir jāiestata norādesvērtība uz nulli, ja uzreiz 306 00:15:51,866 --> 00:15:55,690 neiestatāt tās vērtību uz kaut ko nozīmīgāku. 307 00:15:55,690 --> 00:15:59,233 Varat pārbaudīt, vai norādesvērtība ir nulle, izmantojot vienādības 308 00:15:59,233 --> 00:16:02,776 operatoru (==), tāpat kā jūs salīdzināt visas veselu skaitļu vērtības 309 00:16:02,776 --> 00:16:06,320 vai rakstzīmju vērtības, izmantojot arī (==). 310 00:16:06,320 --> 00:16:08,657 Tas ir īpašs nemainīgas vērtības veids, ko varat izmantot, lai 311 00:16:08,657 --> 00:16:10,994 pārbaudītu. 312 00:16:10,994 --> 00:16:13,160 Tātad tas bija ļoti vienkārša norāde, nulles norāde. 313 00:16:13,160 --> 00:16:16,216 Vēl viens veids, kā izveidot rādītāju, ir izvilkt jau izveidotā 314 00:16:16,216 --> 00:16:19,273 mainīgā adresi, un jūs to darāt, izmantojot & operatora adreses 315 00:16:19,273 --> 00:16:22,330 izvilkšanu. 316 00:16:22,330 --> 00:16:26,720 Ko mēs jau redzējām iepriekš pirmajā parādītajā diagrammas piemērā. 317 00:16:26,720 --> 00:16:30,915 Tātad, ja x ir mainīgais, kuru mēs jau esam izveidojuši ar veselu 318 00:16:30,915 --> 00:16:35,110 skaitli, tad &x ir norādeuz veselu skaitli. 319 00:16:35,110 --> 00:16:37,460 &x ir- atcerieties, & gatavojas izvilkt labajā pusē esošās lietas 320 00:16:37,460 --> 00:16:39,810 adresi. 321 00:16:39,810 --> 00:16:44,185 Un tā kā norādeir tikai adrese, tad &x ir norādeuz veselu skaitli, 322 00:16:44,185 --> 00:16:48,560 kura vērtība ir vieta, kur x atrodas atmiņā. 323 00:16:48,560 --> 00:16:50,460 Tā ir x adrese. 324 00:16:50,460 --> 00:16:53,296 Tātad &x ir x adrese. 325 00:16:53,296 --> 00:16:55,838 Spersim šo soli tālāk un izveidosim savienojumu ar kaut ko, uz ko 326 00:16:55,838 --> 00:16:58,380 minēju iepriekšējā videoklipā. 327 00:16:58,380 --> 00:17:03,244 Ja arr ir dubultnieku masīvs, tad &arr kvadrātiekava i ir norādeuz 328 00:17:03,244 --> 00:17:08,109 dubultnieku. 329 00:17:08,109 --> 00:17:08,970 Labi. 330 00:17:08,970 --> 00:17:15,736 arr kvadrātiekava i, ja arr ir dubultnieku masīvs, tad arr 331 00:17:15,736 --> 00:17:22,503 kvadrātiekava i ir šī masīva i-tais elements, un &arr kvadrātiekava i 332 00:17:22,503 --> 00:17:29,270 ir vieta, kur atmiņā pastāv arr i-tais elements. 333 00:17:29,270 --> 00:17:31,790 Tātad, kāda ir nozīme šajā vietā ? 334 00:17:31,790 --> 00:17:35,540 Masīva nosaukums, visas šīs lietas nozīme, ir tāda, ka masīva 335 00:17:35,540 --> 00:17:39,290 nosaukums patiesībā ir norāde. 336 00:17:39,290 --> 00:17:42,290 Katru reizi, kad izmantojāt masīvu, jūs visu laiku strādājāt ar 337 00:17:42,290 --> 00:17:45,290 norādēm. 338 00:17:45,290 --> 00:17:49,156 Atcerieties, ka no piemēra par mainīgo tvērumu, videoklipa beigās es 339 00:17:49,156 --> 00:17:53,023 piedāvāju piemēru, kur mums ir funkcija set int un funkcija set 340 00:17:53,023 --> 00:17:56,890 array. 341 00:17:56,890 --> 00:18:01,425 Un jūsu izaicinājums ir noteikt, vai galvenās programmas beigās 342 00:18:01,425 --> 00:18:05,960 funkcijas beigās izdrukājām vērtības, vai ne. 343 00:18:05,960 --> 00:18:09,520 Ja atceraties šo piemēru vai esat skatījies videoklipu, jūs zināt, ka 344 00:18:09,520 --> 00:18:13,080 zvans iestatīt intu faktiski neko nedara. 345 00:18:13,080 --> 00:18:16,390 Bet aicinājums iestatīt masīvu to dara. 346 00:18:16,390 --> 00:18:19,280 Un es kaut kā noklusēju, kāpēc tajā laikā tas tā bija. 347 00:18:19,280 --> 00:18:20,821 Es tikko teicu, nu tas ir masīvs, tas ir īpašs, ziniet, tam ir 348 00:18:20,821 --> 00:18:22,363 iemesls. 349 00:18:22,363 --> 00:18:25,078 Iemesls ir tāds, ka masīva nosaukums patiesībā ir tikai norāde, un ir 350 00:18:25,078 --> 00:18:27,794 šī īpašā kvadrātiekavas sintakse, kas padara lietas daudz 351 00:18:27,794 --> 00:18:30,510 patīkamākas/ . 352 00:18:30,510 --> 00:18:33,655 Un tie padara norādesideju daudz mazāk biedējošu, un tāpēc tie tiek 353 00:18:33,655 --> 00:18:36,800 pasniegti šādā veidā. 354 00:18:36,800 --> 00:18:38,600 Bet patiesībā masīvi ir tikai norādes. 355 00:18:38,600 --> 00:18:42,786 Un tāpēc, veicot izmaiņas masīvā, kad mēs nodevām masīvu kā parametru 356 00:18:42,786 --> 00:18:46,973 funkcijai vai kā argumentu funkcijai, masīva saturs faktiski mainījās 357 00:18:46,973 --> 00:18:51,160 gan izsauktajā, gan izsaucējā. 358 00:18:51,160 --> 00:18:55,846 Tas tā nebija attiecībā uz visiem citiem mainīgajiem, ko mēs redzējām. 359 00:18:55,846 --> 00:19:00,298 Tas ir tikai tas, kas jāpatur prātā, strādājot ar norādēm, ka masīva 360 00:19:00,298 --> 00:19:04,750 nosaukums faktiski norāda uz šī masīva pirmo elementu. 361 00:19:04,750 --> 00:19:08,930 Labi, tagad mums ir visi šie fakti, turpināsim, labi. 362 00:19:08,930 --> 00:19:11,370 Kāpēc mums rūp, kurā vietā kas atrodas. 363 00:19:11,370 --> 00:19:14,305 Kā jau teicu, ir diezgan noderīgi zināt, kur kaut kas atrodas, lai 364 00:19:14,305 --> 00:19:17,240 jūs varētu doties uz turieni un to mainīt. 365 00:19:17,240 --> 00:19:20,475 Strādājiet ar to, lai tas, ko vēlaties veikt ar šo mainīgo, darbotos 366 00:19:20,475 --> 00:19:23,710 tieši uz to, nevis uz kādu tā kopiju. 367 00:19:23,710 --> 00:19:26,150 To sauc par atsauces atcelšanu. 368 00:19:26,150 --> 00:19:28,690 Mēs ejam uz atsauci un tur mainām vērtību. 369 00:19:28,690 --> 00:19:33,430 Tātad, ja mums ir norādeun to sauc par pc, un tas norāda uz 370 00:19:33,430 --> 00:19:38,170 rakstzīmi, tad mēs varam teikt, ka *pc un *pc ir nosaukums tam, ko 371 00:19:38,170 --> 00:19:42,910 mēs atradīsim, ja dosimies uz adresi pc. 372 00:19:42,910 --> 00:19:45,895 Mēs tur atradīsim rakstzīmi un *pc, kā mēs atsaucamies uz datiem šajā 373 00:19:45,895 --> 00:19:48,880 vietā. 374 00:19:48,880 --> 00:19:54,933 Tātad mēs varētu teikt kaut ko līdzīgu *pc=D vai kaut ko tamlīdzīgu, 375 00:19:54,933 --> 00:20:00,986 un tas nozīmē, ka tas, kas atradās atmiņas adresē pc, kāda rakstzīme 376 00:20:00,986 --> 00:20:07,040 tur bija iepriekš, tagad ir D, ja sakām *pc=D. 377 00:20:07,040 --> 00:20:10,090 Šeit mēs atkal saskaramies ar dīvainām C lietām, vai ne. 378 00:20:10,090 --> 00:20:13,261 Tāpēc mēs iepriekš uzskatījām, ka * ir daļa no datu veida, un tagad 379 00:20:13,261 --> 00:20:16,433 tas tiek izmantots nedaudz citā kontekstā, lai piekļūtu datiem 380 00:20:16,433 --> 00:20:19,605 noteiktā vietā. 381 00:20:19,605 --> 00:20:22,486 Es zinu, ka tas ir nedaudz mulsinoši, un tā patiesībā ir daļa no 382 00:20:22,486 --> 00:20:25,368 visa, piemēram, tas, kāpēc norādes ir tik sarežģītas, ir sava veida 383 00:20:25,368 --> 00:20:28,250 sintakses problēma. 384 00:20:28,250 --> 00:20:31,175 Bet * tiek izmantots abos kontekstos, kā daļa no tipa nosaukuma, un 385 00:20:31,175 --> 00:20:34,100 mēs redzēsim nedaudz vēlāk arī kaut ko citu. 386 00:20:34,100 --> 00:20:36,490 Un tieši tagad ir atsauces operators. 387 00:20:36,490 --> 00:20:39,745 Tādējādi tas pāriet uz atsauci, piekļūst datiem norādesatrašanās 388 00:20:39,745 --> 00:20:43,000 vietā un ļauj ar tiem manipulēt pēc vēlēšanās. 389 00:20:43,000 --> 00:20:45,900 Tagad tas ir ļoti līdzīgi kā apmeklējot kaimiņu, , vai ne. 390 00:20:45,900 --> 00:20:48,315 Ja tu zini, kur dzīvo tavs kaimiņš, tas nenozīmē, ka tu tagad esi 391 00:20:48,315 --> 00:20:50,730 kopā ar savu kaimiņu. 392 00:20:50,730 --> 00:20:54,950 Jūs zināt, ka zināt, kur viņi dzīvo, bet tas nenozīmē, ka, 393 00:20:54,950 --> 00:20:59,170 pateicoties šīm zināšanām, jūs ar viņiem esat kopā . 394 00:20:59,170 --> 00:21:01,465 Ja vēlaties ar viņiem sazināties, jums ir jādodas uz viņu māju, jums 395 00:21:01,465 --> 00:21:03,760 ir jādodas uz viņu dzīvesvietu. 396 00:21:03,760 --> 00:21:06,590 Kad esat to izdarījis, varat ar viņiem sazināties tieši tā, kā 397 00:21:06,590 --> 00:21:09,420 vēlaties. 398 00:21:09,420 --> 00:21:12,370 Un līdzīgi ar mainīgajiem lielumiem, jums ir jāiet uz viņu adresi, ja 399 00:21:12,370 --> 00:21:15,320 vēlaties ar tiem mijiedarboties, jūs nevarat tikai zināt adresi. 400 00:21:15,320 --> 00:21:21,495 Un veids, kā jūs dodaties uz adresi, ir use*, atsauces operators. 401 00:21:21,495 --> 00:21:23,377 Kas, jūsuprāt, notiek, ja mēs mēģināsim noņemt norādes rādītāju, kura 402 00:21:23,377 --> 00:21:25,260 vērtība ir nulle? 403 00:21:25,260 --> 00:21:28,470 Atcerieties, ka nulles norādenenorāda uz neko. 404 00:21:28,470 --> 00:21:32,635 Tātad, kas, jūsuprāt, notiek, ja mēģināt neko neatzīmēt vai doties uz 405 00:21:32,635 --> 00:21:36,800 adresi, kas nav nekas? 406 00:21:36,800 --> 00:21:39,630 Ja jūs uzminējāt segmentācijas kļūdu, jums varētu būt taisnība. 407 00:21:39,630 --> 00:21:43,140 Ja mēģināt noņemt atsauci uz nulles norādi, rodas segmentācijas kļūda. 408 00:21:41,390 --> 00:21:46,195 Bet pagaidiet, vai es jums neteicu, ka, ja jūs nevēlaties iestatīt 409 00:21:46,195 --> 00:21:51,000 norādesvērtību uz kaut ko nozīmīgu, jums ir jāiestata uz nulli? 410 00:21:51,000 --> 00:21:53,145 Es to darīju, un faktiski segmentācijas kļūda ir sava veida laba 411 00:21:53,145 --> 00:21:55,290 darbība. 412 00:21:55,290 --> 00:21:56,985 Vai esat kādreiz deklarējis mainīgo, nevis uzreiz piešķīris tā 413 00:21:56,985 --> 00:21:58,680 vērtību? 414 00:21:58,680 --> 00:22:01,670 Tātad jūs vienkārši sakāt int x; jūs faktiski to nepiešķirat nekam, 415 00:22:01,670 --> 00:22:04,660 un vēlāk savā kodā jūs izdrukājat x vērtību, joprojām nekam to 416 00:22:04,660 --> 00:22:07,650 nepiešķirot. 417 00:22:07,650 --> 00:22:11,325 Bieži vien jūs saņemat nulli, bet dažreiz jūs varat iegūt kādu 418 00:22:11,325 --> 00:22:15,000 nejaušu skaitli, un jums nav ne jausmas, no kurienes tas nācis. 419 00:22:15,000 --> 00:22:16,750 Līdzīgi lietas var notikt ar norādēm. 420 00:22:16,750 --> 00:22:20,120 Ja, piemēram, deklarējat norādiint*pk un nepiešķirat to vērtībai, 421 00:22:20,120 --> 00:22:23,490 atmiņai tiek piešķirti četri baiti. 422 00:22:23,490 --> 00:22:26,230 Neatkarīgi no tā, kādus četrus baitus atmiņas sistēma var atrast, 423 00:22:26,230 --> 00:22:28,970 tiem ir kāda nozīmīga vērtība. 424 00:22:28,970 --> 00:22:32,435 Un tur jau varēja būt kaut kas tāds, kas vairs nav vajadzīgs citai 425 00:22:32,435 --> 00:22:35,900 funkcijai, tāpēc jums vienkārši ir visi dati. 426 00:22:35,900 --> 00:22:38,403 Kā būtu, ja mēģinātu noņemt atsauci nokādas adreses, kuru 427 00:22:38,403 --> 00:22:40,906 nevēlaties — tur jau bija baiti un informācija, kas tagad ir jūsu 428 00:22:40,906 --> 00:22:43,410 norādē. 429 00:22:43,410 --> 00:22:46,400 Ja mēģināsit novirzīt šo norādi, iespējams, ka jūs sajaucat ar kādu 430 00:22:46,400 --> 00:22:49,390 atmiņu, ar kuru nevēlējāties to visu sajaukt. 431 00:22:49,390 --> 00:22:52,356 Un patiesībā jūs varētu darīt kaut ko patiešām postošu, piemēram, 432 00:22:52,356 --> 00:22:55,322 izjaukt citu programmu vai kādu citu funkciju, vai izdarīt kaut ko 433 00:22:55,322 --> 00:22:58,289 ļaunprātīgu, ko nemaz neplānojāt darīt. 434 00:22:58,289 --> 00:23:01,159 Tāpēc ir ieteicams iestatīt norādes uz nulli, ja tās nav iestatītas 435 00:23:01,159 --> 00:23:04,030 uz kaut ko nozīmīgu. 436 00:23:04,030 --> 00:23:08,215 Iespējams, ka beigās ir labāk, ja programma avarē, tad tā dara kaut 437 00:23:08,215 --> 00:23:12,400 ko tādu, kas izjauc citu programmu vai citu funkciju. 438 00:23:12,400 --> 00:23:15,207 Šāda uzvedība, iespējams, ir vēl mazāk ideāla nekā tikai avārija. 439 00:23:15,207 --> 00:23:19,224 Tāpēc ir labs ieradums iestatīt norādes uz nulli, ja jūs nekavējoties 440 00:23:19,224 --> 00:23:23,242 neiestatāt tām jēgpilnu vērtību, vērtību, kuru jūs zināt un kuru 441 00:23:23,242 --> 00:23:27,260 varat droši atsaukt. 442 00:23:27,260 --> 00:23:32,240 Tāpēc atgriezīsimies tagad un apskatīsim kopējo situācijas sintaksi. 443 00:23:32,240 --> 00:23:37,400 Ja es saku int *p;, ko es tikko izdarīju? 444 00:23:37,400 --> 00:23:38,530 Tas, ko es esmu izdarījis, ir šis. 445 00:23:38,530 --> 00:23:44,660 Es zinu, ka p vērtība ir adrese, jo visas norādes ir tikai adreses. 446 00:23:44,660 --> 00:23:47,750 Es varu atsaukt p, izmantojot operatoru *. 447 00:23:47,750 --> 00:23:51,250 Šajā kontekstā, pašā augšpusē atgādināt, * ir daļa no veida. 448 00:23:51,250 --> 00:23:53,510 Int * ir datu tips. 449 00:23:53,510 --> 00:23:57,703 Bet es varu veikt atsauci uz p, izmantojot operatoru *, un, ja es to 450 00:23:57,703 --> 00:24:01,897 daru, ja es došos uz šo adresi, ko es atradīšu šajā adresē? 451 00:24:01,897 --> 00:24:02,855 Es atradīšu veselu skaitli. 452 00:24:02,855 --> 00:24:05,910 Tātad int*p būtībā saka, p ir adrese. 453 00:24:05,910 --> 00:24:08,915 Es varu izmainīt p atsauci, un, ja es to daru, es atradīšu veselu 454 00:24:08,915 --> 00:24:11,920 skaitli šajā atmiņas vietā. 455 00:24:11,920 --> 00:24:14,490 Labi, tāpēc es teicu, ka ir vēl viena kaitinoša lieta ar zvaigznītēm 456 00:24:14,490 --> 00:24:17,060 un šeit ir šī kaitinošā lieta ar zvaigznītēm . 457 00:24:17,060 --> 00:24:20,734 Vai esat kādreiz mēģinājis deklarēt vairākus viena veida mainīgos 458 00:24:20,734 --> 00:24:24,409 vienā un tajā pašā koda rindā? 459 00:24:24,409 --> 00:24:26,887 Uz brīdi izliecieties, ka līnijas, koda, kas man ir zaļā krāsā, tur 460 00:24:26,887 --> 00:24:29,366 nav, un tajā ir tikai rakstīts int x,y,z;. 461 00:24:31,634 --> 00:24:34,282 Tas faktiski radītu jums trīs veselu skaitļu mainīgos, vienu ar 462 00:24:34,282 --> 00:24:36,930 nosaukumu x, otru ar nosaukumu y un trešoar z. 463 00:24:36,930 --> 00:24:41,510 Tas ir veids, kā to izdarīt, nesadaloties trīs rindās. 464 00:24:41,510 --> 00:24:45,915 Lūk, kur zvaigznītes atkal kļūst kaitinošas, jo * faktiski ir daļa 465 00:24:45,915 --> 00:24:50,320 gan no tipa nosaukuma, gan no mainīgā nosaukuma. 466 00:24:50,320 --> 00:24:55,985 Un tāpēc, ja es saku int *px,py,pz, es patiesībā saņemu norādiuz 467 00:24:55,985 --> 00:25:01,650 veselu skaitli, ko sauc par px, un divus veselus skaitļus, py un pz. 468 00:25:01,650 --> 00:25:04,950 Un tas, iespējams, nav tas, ko mēs vēlamies, tas nav labi. 469 00:25:04,950 --> 00:25:07,346 Tātad, ja es vēlos izveidot vairākas norādes vienā un tajā pašā 470 00:25:07,346 --> 00:25:09,743 rindā, viena veida, un zvaigznītes , man patiesībā ir jāsaka int 471 00:25:09,743 --> 00:25:12,140 *pa,*pb,*pc. 472 00:25:17,330 --> 00:25:19,750 Tagad, kad to tikko esmu pateicis un tagad jums to izstāstot, jūs, 473 00:25:19,750 --> 00:25:22,170 iespējams, nekad to nedarīsiet. 474 00:25:22,170 --> 00:25:24,357 Un, ja godīgi, tas droši vien ir labi, jo jūs netīšām varat izlaist 475 00:25:24,357 --> 00:25:26,544 zvaigznīti , kaut ko tamlīdzīgu. 476 00:25:26,544 --> 00:25:29,466 Iespējams, vislabāk ir norādīt norādes atsevišķās rindās, taču tā ir 477 00:25:29,466 --> 00:25:32,388 tikai vēl viena no tām kaitinošajām sintakses lietām ar zvaigznītēm 478 00:25:32,388 --> 00:25:35,310 kas apgrūtina norādes darbu. 479 00:25:35,310 --> 00:25:39,480 Jo tas ir tikai šis sintaktiskais haoss, kas jums ir jāpārvar. 480 00:25:39,480 --> 00:25:41,600 Ar praksi tas patiešām kļūst par otro dabu. 481 00:25:41,600 --> 00:25:44,276 Es joprojām pieļauju kļūdas ar to arī pēc 10 gadu programmēšanas, 482 00:25:44,276 --> 00:25:46,953 tāpēc neesiet sarūgtināts, ja ar jums kaut kas notiek, jo godīgi 483 00:25:46,953 --> 00:25:49,630 sakot, tas ir diezgan bieži. 484 00:25:49,630 --> 00:25:52,850 Tas tiešām ir sava veida sintakses trūkums. 485 00:25:52,850 --> 00:25:56,110 Labi, tāpēc es apsolīju, ka mēs pārskatīsim jēdzienu par to, cik 486 00:25:56,110 --> 00:25:59,370 liela ir virkne. 487 00:25:59,370 --> 00:26:04,140 Ja es jums to teicu par virknēm, mēs visu laiku esam jums melojuši. 488 00:26:04,140 --> 00:26:07,366 Nav datu tipa, ko sauc par virkni, un patiesībā es to pieminēju vienā 489 00:26:07,366 --> 00:26:10,593 no mūsu agrākajiem videoklipiem par datu veidiem. Šī virkne bija datu 490 00:26:10,593 --> 00:26:13,820 tips, kas tika izveidots CS50.h. 491 00:26:13,820 --> 00:26:17,050 Lai to izmantotu, #include CS50.h. 492 00:26:17,050 --> 00:26:20,325 Nu, virkne patiesībā ir tikai aizstājvārds kaut kam, ko sauc par char 493 00:26:20,325 --> 00:26:23,600 *, rādītājs uz rakstzīmi. 494 00:26:23,600 --> 00:26:26,010 Nu norādes, atcerieties, ir tikai adreses. 495 00:26:26,010 --> 00:26:28,780 Tātad, kāds ir virknes lielums baitos? 496 00:26:28,780 --> 00:26:29,796 Nu ir četri vai astoņi. 497 00:26:29,796 --> 00:26:32,977 Un iemesls, kāpēc es saku četrus vai astoņus, ir tāpēc, ka tas 498 00:26:32,977 --> 00:26:36,158 patiesībā ir atkarīgs no sistēmas. Ja izmantojat CS50 ide, char * ir 499 00:26:36,158 --> 00:26:39,340 char * ir astoņi, tā ir 64 bitu sistēma. 500 00:26:39,340 --> 00:26:43,850 Katra adrese atmiņā ir 64 biti gara. 501 00:26:43,850 --> 00:26:47,745 Ja izmantojat CS50 ierīci vai jebkuru 32 bitu iekārtu un esat 502 00:26:47,745 --> 00:26:51,640 dzirdējis šo terminu 32 bitu iekārta, kas ir 32 bitu iekārta? 503 00:26:51,640 --> 00:26:56,090 Tas tikai nozīmē, ka katra adrese atmiņā ir 32 biti gara. 504 00:26:56,090 --> 00:26:59,140 Tātad 32 biti ir četri baiti. 505 00:26:59,140 --> 00:27:02,710 Tātad rakstzīme * ir četri vai astoņi baiti atkarībā no jūsu sistēmas. 506 00:27:02,710 --> 00:27:07,370 Un patiešām visi datu tipi un rādītājs uz jebkuru datu tipu, jo visas 507 00:27:07,370 --> 00:27:12,030 norādesir tikai adreses, ir četri vai astoņi baiti. 508 00:27:12,030 --> 00:27:15,080 Tātad vēlreiz apskatīsim šo diagrammu un noslēgsim šo video ar 509 00:27:15,080 --> 00:27:18,130 nelielu vingrinājumu šeit. 510 00:27:18,130 --> 00:27:21,600 Tātad, šeit ir diagramma, kuru mēs pārtraucām videoklipa pašā sākumā. 511 00:27:21,600 --> 00:27:23,110 Tātad, kas notiks tagad, ja es saku *pk=35? 512 00:27:26,370 --> 00:27:30,530 Tātad, ko tas nozīmē, kad es saku *pk=35? 513 00:27:30,530 --> 00:27:32,420 Pagaidi. 514 00:27:32,420 --> 00:27:34,990 *pk. 515 00:27:34,990 --> 00:27:39,890 Šajā kontekstā * ir atsauces operators. 516 00:27:39,890 --> 00:27:44,205 Tātad, kad tiek izmantots atsauces operators, mēs ejam uz adresi, uz 517 00:27:44,205 --> 00:27:48,520 kuru norāda pk, un mainām to, ko atrodam. 518 00:27:48,520 --> 00:27:55,270 Tātad *pk=35 efektīvi to dara ar attēlu. 519 00:27:55,270 --> 00:27:58,110 Tātad būtībā tas ir sintaktiski identisks tam, ka ir norādīts k = 35. 520 00:28:00,740 --> 00:28:01,930 Vēl viens. 521 00:28:01,930 --> 00:28:05,510 Ja es saku int m, es izveidoju jaunu mainīgo ar nosaukumu m. 522 00:28:05,510 --> 00:28:07,675 Jauns lodziņš, tas ir zaļš lodziņš, jo tajā būs vesels skaitlis, un 523 00:28:07,675 --> 00:28:09,840 tas ir apzīmēts ar m. 524 00:28:09,840 --> 00:28:14,960 Ja es saku m=4, es šajā lodziņā ievietoju veselu skaitli. 525 00:28:14,960 --> 00:28:20,290 Ja sakiet pk=&m, kā šī diagramma mainās? 526 00:28:20,290 --> 00:28:28,760 Pk=&m, vai atceraties, ko dara vai sauc operators &? 527 00:28:28,760 --> 00:28:34,430 Atcerieties, ka & mainīgā nosaukums ir mainīgā nosaukuma adrese. 528 00:28:34,430 --> 00:28:38,740 Tātad, ko mēs sakām, pk iegūst m adresi. 529 00:28:38,740 --> 00:28:42,580 Un tik efektīvi diagramma notiek tā, ka pk vairs nenorāda uz k, bet 530 00:28:42,580 --> 00:28:46,420 norāda uz m. 531 00:28:46,420 --> 00:28:49,520 Arī ar norādēm ir ļoti sarežģīti strādāt, un tās prasa daudz prakses, 532 00:28:49,520 --> 00:28:52,620 taču, ņemot vērā to spēju pārsūtīt datus starp funkcijām un faktiski 533 00:28:52,620 --> 00:28:55,720 panākt, lai šīs izmaiņas stātos spēkā, ir ļoti svarīgi tām pievērst 534 00:28:55,720 --> 00:28:58,820 uzmanību. 535 00:28:58,820 --> 00:29:02,280 Iespējams, tā ir vissarežģītākā tēma, par kuru mēs runājam CS50, taču 536 00:29:02,280 --> 00:29:05,740 norādes izmantošanas radītā vērtība ievērojami pārsniedz 537 00:29:05,740 --> 00:29:09,200 sarežģījumus, kas rodas, tos apgūstot. 538 00:29:09,200 --> 00:29:12,690 Tāpēc es novēlu jums veiksmi, mācoties norādes. 539 00:29:12,690 --> 00:29:15,760 Es esmu Dags Loids, šis ir CS50.