1 00:00:00,000 --> 00:00:06,030 >> [MUZIKO Ludante] 2 00:00:06,030 --> 00:00:08,390 >> DOUG LLOYD: Montriloj, jen ni estas. 3 00:00:08,390 --> 00:00:11,080 Tio sendube iranta esti la plej malfacila temo 4 00:00:11,080 --> 00:00:12,840 ke ni raportas en CS50. 5 00:00:12,840 --> 00:00:15,060 Se vi legis ion pri punteros 6 00:00:15,060 --> 00:00:19,080 antaŭ vi povus esti iomete intimidar iranta en tiu video. 7 00:00:19,080 --> 00:00:21,260 Ĝi estas vera la montriloj cxu vi permesas la kapablon 8 00:00:21,260 --> 00:00:23,740 eble ŝraŭbo supren bela malbone kiam vi estas 9 00:00:23,740 --> 00:00:27,450 laborante kun variabloj, kaj datumoj, kaj kaŭzante via programo por frakasi. 10 00:00:27,450 --> 00:00:30,490 Sed ili estas efektive vere utila kaj ili permesos al ni vere grandan vojon 11 00:00:30,490 --> 00:00:33,340 pasi datumojn reen kaj reen inter funkcioj, 12 00:00:33,340 --> 00:00:35,490 ke ni estas alie nekapablaj fari. 13 00:00:35,490 --> 00:00:37,750 >> Kaj tiel kion ni vere volas fari tie estas trajno 14 00:00:37,750 --> 00:00:41,060 vi havi bonan montrilo disciplino, do ke vi povas uzi punteros efike 15 00:00:41,060 --> 00:00:43,850 fari vian programoj kiuj multe pli bone. 16 00:00:43,850 --> 00:00:48,220 Kiel mi diris punteros al ni malsaman maniero pasi datumojn inter funkcioj. 17 00:00:48,220 --> 00:00:50,270 Nun se vi memoras de frua vídeo, kiam 18 00:00:50,270 --> 00:00:53,720 ni parolis pri ŝanĝiĝema amplekso, mi menciis 19 00:00:53,720 --> 00:01:00,610 ke ĉiuj datumoj kiujn ni pasas inter funkcioj en C preterpasis valoro. 20 00:01:00,610 --> 00:01:03,070 Kaj mi ne uzis ke termino, kion mi signifis tie 21 00:01:03,070 --> 00:01:07,170 estis ke ni pasas kopiojn de datumoj. 22 00:01:07,170 --> 00:01:12,252 Kiam ni pasas variablo al funkcio, ni fakte ne pasante la variablo 23 00:01:12,252 --> 00:01:13,210 al la funkcio, ĉu ne? 24 00:01:13,210 --> 00:01:17,670 Ni pasante kopion de ke datumoj por la funkcio. 25 00:01:17,670 --> 00:01:20,760 La funkcio faras kio volas, kaj ĝi kalkulas iu valoro, 26 00:01:20,760 --> 00:01:23,180 kaj eble ni uzu tiun valoron kiam donas ĝin reen. 27 00:01:23,180 --> 00:01:26,700 >> Ekzistis unu escepto al tiu regulo trapasu valoro, 28 00:01:26,700 --> 00:01:31,210 kaj ni revenos al kio tiu estas iom pli poste en ĉi tiu video. 29 00:01:31,210 --> 00:01:34,880 Se ni uzas punteros anstataŭe de uzante variabloj, 30 00:01:34,880 --> 00:01:38,180 aŭ anstataŭ uzi la variabloj sin aŭ kopiojn de la variabloj, 31 00:01:38,180 --> 00:01:43,790 ni povas nun pasas la variabloj ĉirkaŭ inter funkcioj en malsama maniero. 32 00:01:43,790 --> 00:01:46,550 Tio signifas ke se ni faras ŝanĝo en unu funkcio, 33 00:01:46,550 --> 00:01:49,827 ke ŝanĝo estos reale preni efekto en malsama funkcio. 34 00:01:49,827 --> 00:01:52,160 Denove, tiu estas iu kiu ni ne povis fari antaŭe, 35 00:01:52,160 --> 00:01:56,979 kaj se vi iam provis interŝanĝi la valoro de du variabloj en funkcio, 36 00:01:56,979 --> 00:01:59,270 vi rimarkis tiun problemon ia rampanta supren, dekstra? 37 00:01:59,270 --> 00:02:04,340 >> Se ni volas interŝanĝi X kaj Y, kaj ni pasas ilin al funkcio nomita interŝanĝa, 38 00:02:04,340 --> 00:02:08,680 interne de la funkcio interŝanĝi la variabloj fari interŝanĝon valoroj. 39 00:02:08,680 --> 00:02:12,600 Igas du, du iĝas unu, sed ni ne vere 40 00:02:12,600 --> 00:02:16,890 ŝanĝi ion en la originala funkcion, en la telefonanto. 41 00:02:16,890 --> 00:02:19,550 Ĉar ni ne povas, ni estas nur laborante kun kopioj de ili. 42 00:02:19,550 --> 00:02:24,760 Kun punteros tamen, ni povas reale pasi X kaj Y al funkcio. 43 00:02:24,760 --> 00:02:26,960 Ke funkcio povas fari iun kun ili. 44 00:02:26,960 --> 00:02:29,250 Kaj tiuj variabloj valoroj povas fakte ŝanĝi. 45 00:02:29,250 --> 00:02:33,710 Do tio estas tute ŝanĝo en nia kapablo labori kun datumoj. 46 00:02:33,710 --> 00:02:36,100 >> Antaŭ ni plonĝi en punteros, mi pensas ĝi estas valora 47 00:02:36,100 --> 00:02:38,580 prenante kelkajn minutojn reiru al Bazaj tie. 48 00:02:38,580 --> 00:02:41,000 Kaj rigardu kiamaniere komputila memoro verkoj 49 00:02:41,000 --> 00:02:45,340 cxar tiuj du temoj estas irantaj por fakte esti bela interrilatigitaj. 50 00:02:45,340 --> 00:02:48,480 Kiel vi probable scias, sur via komputilo 51 00:02:48,480 --> 00:02:51,310 vi havas malmolan diskon aŭ eble solida stata stirado, 52 00:02:51,310 --> 00:02:54,430 ia dosieron stokado loko. 53 00:02:54,430 --> 00:02:57,950 Ĝi estas kutime ie najbaraĵo de 250 gigabajtoj 54 00:02:57,950 --> 00:02:59,810 al eble kelkaj terabajtoj nun. 55 00:02:59,810 --> 00:03:02,270 Kaj estas kie ĉiuj viaj dosierojn finfine vivi, 56 00:03:02,270 --> 00:03:04,870 Eĉ kiam via komputilo estas fermitaj for, vi povas turni ĝin reen sur 57 00:03:04,870 --> 00:03:09,190 kaj vi trovos viajn dosierojn tie denove kiam vi restartas vian sistemon. 58 00:03:09,190 --> 00:03:14,820 Sed diskoj, kiel malmola disko, oni HDD, aŭ solida stata stirado, SSD, 59 00:03:14,820 --> 00:03:16,050 estas nur stora. 60 00:03:16,050 --> 00:03:20,400 >> Ni ne povas vere fari ion kun la datumoj kiuj estas en malmola disko, 61 00:03:20,400 --> 00:03:22,080 aŭ en solida stata stirado. 62 00:03:22,080 --> 00:03:24,950 Por reale ŝanĝi datumojn aŭ movi ĝin ĉirkaŭe, 63 00:03:24,950 --> 00:03:28,800 Ni devas movi ĝin al RAM, hazarda aliro memoro. 64 00:03:28,800 --> 00:03:31,170 Nun RAM, vi havas multe malpli en via komputilo. 65 00:03:31,170 --> 00:03:34,185 Vi povas havi ie en la najbaraĵo de 512 megabajtoj 66 00:03:34,185 --> 00:03:38,850 se vi havas pli malnovan komputilon, al eble du, kvar, ok, 16 67 00:03:38,850 --> 00:03:41,820 eble eĉ iom pli, gigabajtoj de RAM. 68 00:03:41,820 --> 00:03:46,390 Do jen multe pli malgranda, sed tio estas kie ĉio el la volátil datumoj ekzistas. 69 00:03:46,390 --> 00:03:48,270 Tie estas kie ni povas ŝanĝi aferojn. 70 00:03:48,270 --> 00:03:53,350 Sed kiam ni turnas nian komputilon for, ĉiuj de la datumoj en RAM estas detruita. 71 00:03:53,350 --> 00:03:57,150 >> Tial do ni bezonas havi malmola disko por la pli permanenta loko de ĝi, 72 00:03:57,150 --> 00:03:59,720 tiel ke ĝi exists- ĝi farus esti vere malbona se ĉiufoje ni 73 00:03:59,720 --> 00:04:03,310 turnis niajn komputilo malproksime, ĉiu dosiero en nia sistemo estis forviŝita. 74 00:04:03,310 --> 00:04:05,600 Do ni laboras ene de RAM. 75 00:04:05,600 --> 00:04:09,210 Kaj ĉiufoje ni parolas pri memoro, preskaux, en CS50, 76 00:04:09,210 --> 00:04:15,080 ni parolas pri RAM, ne fiksita disko. 77 00:04:15,080 --> 00:04:18,657 >> Do kiam ni movi objektojn en memoro, ĝi okupas certan kvanton de spaco. 78 00:04:18,657 --> 00:04:20,740 Ĉiuj de la datumtipoj, ke ni estis laboranta kun 79 00:04:20,740 --> 00:04:23,480 levu malsamajn kvantoj de spaco en RAM. 80 00:04:23,480 --> 00:04:27,600 Do ĉiufoje oni kreas entjero variablo, kvar bajtoj de memoro 81 00:04:27,600 --> 00:04:30,750 ili flankenmetis en RAM tiel vi povas labori kun tiu entjero. 82 00:04:30,750 --> 00:04:34,260 Vi povas deklari la entjero, ŝanĝi ĝin, atribui ĝin 83 00:04:34,260 --> 00:04:36,700 al valoro 10 incremented post alia, tiel plu kaj tiel plu. 84 00:04:36,700 --> 00:04:39,440 Ĉiuj kiu bezonas okazi en RAM, kaj vi ricevas kvar bajtoj 85 00:04:39,440 --> 00:04:42,550 labori kun por ĉiu entjera ke vi kreas. 86 00:04:42,550 --> 00:04:45,410 >> Ĉiu karaktero vin krei ricevas unu bajto. 87 00:04:45,410 --> 00:04:48,160 Tio estas nur kiom spaco estas bezonas stoki karaktero. 88 00:04:48,160 --> 00:04:51,310 Ĉiu flosilo, vera nombro, ricevas kvar bajtoj 89 00:04:51,310 --> 00:04:53,390 krom se ĝi estas duobla precizeco glitpunktaj 90 00:04:53,390 --> 00:04:56,510 nombro, kiu permesas vin havi pli preciza aŭ pli ciferoj 91 00:04:56,510 --> 00:04:59,300 post la dekuma punkto sen perdi precizecon, 92 00:04:59,300 --> 00:05:01,820 kiun levu ok bajtoj de memoro. 93 00:05:01,820 --> 00:05:06,730 Longe sopiras, vere granda entjeroj, ankaŭ levu ok bajtoj de memoro. 94 00:05:06,730 --> 00:05:09,000 Kiom da bajtoj de memoro ĉu kordoj kolektis? 95 00:05:09,000 --> 00:05:12,990 Nu ni metis pinglon en tiu demando por nun, sed ni revenos al tio. 96 00:05:12,990 --> 00:05:17,350 >> Do reen al tiu ideo de memoro kiel granda tabelo de bajto grandeco ĉeloj. 97 00:05:17,350 --> 00:05:20,871 Tio estas vere ĉiuj estas, estas nur grandegan tabelo de ĉeloj, 98 00:05:20,871 --> 00:05:23,370 same kiel ĉiu alia tabelo kiu vi konas kaj vidas, 99 00:05:23,370 --> 00:05:26,430 krom ĉiu ero estas unu bajton larĝa. 100 00:05:26,430 --> 00:05:30,030 Kaj ĝuste kiel tabelo, ĉiu elemento havas adreson. 101 00:05:30,030 --> 00:05:32,120 Ĉiu elemento de tabelo havas indicon, kaj ni 102 00:05:32,120 --> 00:05:36,302 povas uzi tiun indekson fari tn hazarda aliro sur la tabelo. 103 00:05:36,302 --> 00:05:38,510 Ni ne devas komenci je la komenco de la tabelo, 104 00:05:38,510 --> 00:05:40,569 persisti tra ĉiu sola elemento gxia 105 00:05:40,569 --> 00:05:41,860 trovi kion ni serĉas. 106 00:05:41,860 --> 00:05:45,790 Ni povas nur diri: Mi volas atingi la 15a elemento aŭ la 100a elemento. 107 00:05:45,790 --> 00:05:49,930 Kaj vi povas simple pasas en tiu nombro kaj akiri la valoron vi serĉas. 108 00:05:49,930 --> 00:05:54,460 >> Simile ĉiu loko memore havas adreson. 109 00:05:54,460 --> 00:05:57,320 Do via memoro povus aspektas tiel. 110 00:05:57,320 --> 00:06:01,420 Jen tre malgranda bloko de memoro, tiu estas 20 bajtoj de memoro. 111 00:06:01,420 --> 00:06:04,060 La unuaj 20 bajtoj ĉar mia alparolas tie funde 112 00:06:04,060 --> 00:06:08,890 Estas 0, 1, 2, 3, kaj tiel sur la tuta vojo ĝis 19. 113 00:06:08,890 --> 00:06:13,190 Kaj kiam mi deklaras variablojn kaj kiam mi komencas labori kun ili, 114 00:06:13,190 --> 00:06:15,470 la sistemo tuj starigis flanken iun spacon por mi 115 00:06:15,470 --> 00:06:17,595 en tiu memoro labori kun mia variabloj. 116 00:06:17,595 --> 00:06:21,610 Do mi povus diri, char c egalas ĉefurbo H. Kaj kio okazos? 117 00:06:21,610 --> 00:06:23,880 Nu la sistemo tuj flankenmetis por mi unu bajto. 118 00:06:23,880 --> 00:06:27,870 En ĉi tiu kazo elektis bajto nombro kvar, la bajto je adreson kvar, 119 00:06:27,870 --> 00:06:31,310 kaj ĝi tuj stoki la letero ĉefurbo H en tie por mi. 120 00:06:31,310 --> 00:06:34,350 Se mi tiam diri int rapido limo egalas 65, estas 121 00:06:34,350 --> 00:06:36,806 tuj flankenmetis kvar bajtoj de memoro por mi. 122 00:06:36,806 --> 00:06:39,180 Kaj ĝi tuj trakti tiujn kvar bajtojn kiel ununura unuo 123 00:06:39,180 --> 00:06:41,305 ĉar kion ni laboras kun estas entjero tie. 124 00:06:41,305 --> 00:06:44,350 Kaj ĝi tuj stoki 65 en tie. 125 00:06:44,350 --> 00:06:47,000 >> Nun jam mi estas speco de diranta vin iom de mensogo, 126 00:06:47,000 --> 00:06:50,150 Bone, ĉar ni scias ke komputiloj labori en duuma. 127 00:06:50,150 --> 00:06:53,100 Ili ne komprenas nepre kio majuskla H estas 128 00:06:53,100 --> 00:06:57,110 aŭ kia estas la 65, ili nur kompreni duuma, nuloj kaj aĵoj. 129 00:06:57,110 --> 00:06:59,000 Kaj tial fakte kio ni stokante tien 130 00:06:59,000 --> 00:07:03,450 ne estas la litero H kaj la numero 65, sed prefere la duuma reprezentoj 131 00:07:03,450 --> 00:07:06,980 gxia aspekti iom io tiamaniere. 132 00:07:06,980 --> 00:07:10,360 Kaj precipe en la kunteksto de la entjera variablo, 133 00:07:10,360 --> 00:07:13,559 ĝi ne iras por ĵus kraĉis ĝin, ĝi ne tuj trakti ĝin kiel unu kvar 134 00:07:13,559 --> 00:07:15,350 bajto chunk nepre, ĝi estas vere iranta 135 00:07:15,350 --> 00:07:19,570 trakti ĝin kiel kvar unu bajto pecoj, kiu eble aspektas tiel. 136 00:07:19,570 --> 00:07:22,424 Kaj eĉ tio ne tute vera ankaŭ ne, 137 00:07:22,424 --> 00:07:24,840 pro io nomata an endianness, kiun ni ne 138 00:07:24,840 --> 00:07:26,965 tuj eniri nun, sed se vi estas scivola pri, 139 00:07:26,965 --> 00:07:29,030 vi povas legi sur iom kaj granda endianness. 140 00:07:29,030 --> 00:07:31,640 Sed pro tiu argumento, pro tiu video, 141 00:07:31,640 --> 00:07:34,860 ni nur supozas ke estas, en Fakte, kiel la numero 65 estus 142 00:07:34,860 --> 00:07:36,970 esti reprezentitaj en memoro sur ĉiu sistemo, 143 00:07:36,970 --> 00:07:38,850 kvankam ĝi ne estas tute vera. 144 00:07:38,850 --> 00:07:41,700 >> Sed ni vere simple akiri liverita de ĉiuj binaraj tute, 145 00:07:41,700 --> 00:07:44,460 kaj nur pensas pri kiel H kaj 65, estas multe pli facile 146 00:07:44,460 --> 00:07:47,900 pensi pri ĝi kiel ke kiel homo. 147 00:07:47,900 --> 00:07:51,420 Bone, do ĝi ankaŭ ŝajnas eble iom hazarda ke I've- mia sistemo 148 00:07:51,420 --> 00:07:55,130 ne donis al mi bajtoj 5, 6, 7, kaj 8 stoki la entjero. 149 00:07:55,130 --> 00:07:58,580 Pro bona kialo por tio, ankaŭ, kiu ni ne enir ĝuste nun, sed sufiĉas 150 00:07:58,580 --> 00:08:00,496 diri ke kio la komputilo faras tie 151 00:08:00,496 --> 00:08:02,810 estas verŝajne bona movo sur lia parto. 152 00:08:02,810 --> 00:08:06,020 Por ne doni al mi memoro kiu estas nepre malantaŭo al dorso. 153 00:08:06,020 --> 00:08:10,490 Kvankam ĝi estas iranta fari ĝin nun se mi volas ricevi alian ĉenon, 154 00:08:10,490 --> 00:08:13,080 nomata familian nomon, kaj mi volas meti Lloyd en tie. 155 00:08:13,080 --> 00:08:18,360 Mi tuj devas persvadi unu karaktero, ĉiu litero de tio 156 00:08:18,360 --> 00:08:21,330 tuj postulos unu karaktero, unu bajto da memoro. 157 00:08:21,330 --> 00:08:26,230 Do se mi povus meti Lloyd en mia tabelo tiel mi estas sufiĉe bona iri, ĉu ne? 158 00:08:26,230 --> 00:08:28,870 Kio mankas? 159 00:08:28,870 --> 00:08:31,840 >> Memoru ke ĉiu linio ni laboras kun en C finiĝas kun backslash nula, 160 00:08:31,840 --> 00:08:33,339 kaj ni ne povas preterlasi ke ĉi tie, ĉu. 161 00:08:33,339 --> 00:08:36,090 Ni devas flankenmetis unu bajto de memoro por teni ke do ni 162 00:08:36,090 --> 00:08:39,130 scias kiam nia kordoj finis. 163 00:08:39,130 --> 00:08:41,049 Do denove tiu aranĝo de la aferoj 164 00:08:41,049 --> 00:08:42,799 aperas en memoro potenco esti iom hazarda, 165 00:08:42,799 --> 00:08:44,870 sed fakte estas kiel plej multaj sistemoj estas desegnitaj. 166 00:08:44,870 --> 00:08:48,330 Por vicigi ilin sur obloj de kvar, por kialoj denove 167 00:08:48,330 --> 00:08:50,080 ke ni ne bezonas enir nun. 168 00:08:50,080 --> 00:08:53,060 Sed tiu, do sufiĉas diri ke Post tiuj tri linioj de kodo, 169 00:08:53,060 --> 00:08:54,810 jen kion memoro povus aspekti. 170 00:08:54,810 --> 00:08:58,930 Se mi bezonas memoro lokoj 4, 8, kaj 12 por teni mian datumojn, 171 00:08:58,930 --> 00:09:01,100 jen kion mia memoro povus aspekti. 172 00:09:01,100 --> 00:09:04,062 >> Kaj nur esti aparte pedanta tie, kiam 173 00:09:04,062 --> 00:09:06,020 ni parolas pri memoro adresojn ni kutime 174 00:09:06,020 --> 00:09:08,390 tion fari uzante deksesumaj notacioj. 175 00:09:08,390 --> 00:09:12,030 Do kial ni ne konverti ĉiujn tiujn el dekuma al deksesuma notacio 176 00:09:12,030 --> 00:09:15,010 nur ĉar tio estas ĝenerale kiamaniere ni priparolas memoro. 177 00:09:15,010 --> 00:09:17,880 Do anstataŭ esti 0 tra 19, kion ni havas estas nulo 178 00:09:17,880 --> 00:09:20,340 x zero tra nulo x1 tri. 179 00:09:20,340 --> 00:09:23,790 Tiuj estas la 20 bajtoj de memoro kiun ni esti aŭ ni rigardas en ĉi tiu bildo 180 00:09:23,790 --> 00:09:25,540 ĝuste ĉi tie. 181 00:09:25,540 --> 00:09:29,310 >> Do ĉio tiu estado diris, ni paŝi for el memoro dum sekundo 182 00:09:29,310 --> 00:09:30,490 kaj reen al punteros. 183 00:09:30,490 --> 00:09:32,420 Jen la plej grava afero memori 184 00:09:32,420 --> 00:09:34,070 kiel ni komencas labori kun punteros. 185 00:09:34,070 --> 00:09:36,314 Montrilo estas nenio pli ol adreson. 186 00:09:36,314 --> 00:09:38,230 Mi diros ĝin denove, ĉar ĝi estas tiel grava, 187 00:09:38,230 --> 00:09:42,730 montrilo estas nenio pli ol adreson. 188 00:09:42,730 --> 00:09:47,760 Montriloj estas adresoj por lokoj memore kie variabloj vivi. 189 00:09:47,760 --> 00:09:52,590 Sciante ke ĝi iĝas espereble iomete pli facile labori kun ili. 190 00:09:52,590 --> 00:09:54,550 Alia afero mi ŝatas fari estas havas varon 191 00:09:54,550 --> 00:09:58,510 de diagramoj vide reprezenti kio estas okazas kun diversaj linioj de kodo. 192 00:09:58,510 --> 00:10:00,660 Kaj ni faros ĉi paro de tempoj en punteros, 193 00:10:00,660 --> 00:10:03,354 kaj kiam ni parolas pri dinamika memoro atribuo tiel. 194 00:10:03,354 --> 00:10:06,020 Ĉar mi pensas ke tiuj diagramoj povas esti precipe helpema. 195 00:10:06,020 --> 00:10:09,540 >> Do se mi diras ekzemple, int k en mia kodo, kio okazas? 196 00:10:09,540 --> 00:10:12,524 Nu kio esence estas okazanta Mi ricevas memoro flankenmetis por mi, 197 00:10:12,524 --> 00:10:14,690 sed mi eĉ ne ŝatas pripensas ĝin kiel tio, mi 198 00:10:14,690 --> 00:10:16,300 ŝatas pensi pri ĝi kiel skatolo. 199 00:10:16,300 --> 00:10:20,090 Mi havas skatolon kaj ĝi estas kolora verda ĉar mi 200 00:10:20,090 --> 00:10:21,750 povas meti entjeroj en verda skatoloj. 201 00:10:21,750 --> 00:10:23,666 Se ĝi estis karaktero mi havu blua skatolo. 202 00:10:23,666 --> 00:10:27,290 Sed mi ĉiam diras, se mi kreanta skatolo kiu povas teni entjeroj 203 00:10:27,290 --> 00:10:28,950 ke skatolo estas kolorita verda. 204 00:10:28,950 --> 00:10:33,020 Kaj Mi prenos permanenta markilo kaj Mi skribos sur la k flanko. 205 00:10:33,020 --> 00:10:37,590 Do mi havas skatolon nomita k, en kiun mi povas meti entjeroj. 206 00:10:37,590 --> 00:10:41,070 Do kiam mi diras int k, jen kio okazas en mia kapo. 207 00:10:41,070 --> 00:10:43,140 Se mi diras k egalas kvin, kion mi faras? 208 00:10:43,140 --> 00:10:45,110 Nu, mi metante kvin en la skatolo, dekstre. 209 00:10:45,110 --> 00:10:48,670 Tiu estas sufiĉe simpla, se Mi diras int k, krei skatolon nomita k. 210 00:10:48,670 --> 00:10:52,040 Se mi diras k egalas 5, metis kvin en la skatolo. 211 00:10:52,040 --> 00:10:53,865 Espereble tio ne tro bona salto. 212 00:10:53,865 --> 00:10:55,990 Jen kien aferoj iras iom interesa kvankam. 213 00:10:55,990 --> 00:11:02,590 Se mi diras int * pk, bone eĉ se mi ne scias kion tio nepre signifas, 214 00:11:02,590 --> 00:11:06,150 ĝi estas klare ion fari kun entjero. 215 00:11:06,150 --> 00:11:08,211 Do mi tuj kolori tiu skatolo verda-ish, 216 00:11:08,211 --> 00:11:10,210 Mi scias ĝin estas atingis ion fari kun entjero, 217 00:11:10,210 --> 00:11:13,400 sed ĝi ne estas entjero mem, ĉar ĝi estas int stelo. 218 00:11:13,400 --> 00:11:15,390 Estas io iomete malsama pri ĝi. 219 00:11:15,390 --> 00:11:17,620 Do entjero estas implikitaj, sed alie ĝi estas 220 00:11:17,620 --> 00:11:19,830 ne tro malsama de kion ni parolis. 221 00:11:19,830 --> 00:11:24,240 Ĝi estas skatolo, liaj ricevis etiketon, ĝi surhavas etiketo pk, 222 00:11:24,240 --> 00:11:27,280 kaj estas kapabla je posedo int steloj ajn tiuj estas. 223 00:11:27,280 --> 00:11:29,894 Ili havas ion por fari kun entjeroj, klare. 224 00:11:29,894 --> 00:11:31,060 Jen la lasta linio tamen. 225 00:11:31,060 --> 00:11:37,650 Se mi diras pk = & k, halt, kio ĵus okazis, ĉu ne? 226 00:11:37,650 --> 00:11:41,820 Do tiu hazarda nombro, ŝajne aleatoria nombro, gets ĵetitaj en la skatolo. 227 00:11:41,820 --> 00:11:44,930 Ĉiuj kiu estas, estas pk akiras la adreson de k. 228 00:11:44,930 --> 00:11:52,867 Do mi senmoviĝanta kie k vivas en memoro, lia adreso, la adreso de lia bajtoj. 229 00:11:52,867 --> 00:11:55,200 Ĉiuj mi faras estas mi dirante ke valoro estas kion mi tuj 230 00:11:55,200 --> 00:11:59,430 meti ene de mia skatolo nomita pk. 231 00:11:59,430 --> 00:12:02,080 Kaj ĉar ĉi tiuj aferoj estas punteros, kaj ĉar rigardanta 232 00:12:02,080 --> 00:12:04,955 ĉe ĉenon kiel nulon x ok nul c sep kvar ok 233 00:12:04,955 --> 00:12:07,790 du nulo estas probable Ne tre senchava. 234 00:12:07,790 --> 00:12:12,390 Kiam ni ĝenerale bildigi punteros, ni fakte faris tiel, kiel punteros. 235 00:12:12,390 --> 00:12:17,000 Pk donas nin la informo ni devas trovi k en memoro. 236 00:12:17,000 --> 00:12:19,120 Do esence pk havas sagon. 237 00:12:19,120 --> 00:12:21,670 Kaj se ni iradas la longo de tiu sago, imagi 238 00:12:21,670 --> 00:12:25,280 ĝi estas io vi povas marŝi sur, se ni marŝi laŭ la longo de la sago, 239 00:12:25,280 --> 00:12:29,490 ĉe la pinto de tiu sago, ni trovos la lokon en memoro 240 00:12:29,490 --> 00:12:31,390 kie k vivas. 241 00:12:31,390 --> 00:12:34,360 Kaj tio estas vere grava ĉar iam ni scios kie k vivas, 242 00:12:34,360 --> 00:12:37,870 ni povas komenci labori kun la datumoj ene de tiu memoro loko. 243 00:12:37,870 --> 00:12:40,780 Kvankam ni estas duumaj teeny mordis antaŭen de ni mem nun. 244 00:12:40,780 --> 00:12:42,240 >> Do kio estas puntero? 245 00:12:42,240 --> 00:12:45,590 Montrilo estas datumo artikolon kies valoro estas memoro adreso. 246 00:12:45,590 --> 00:12:49,740 Tio estis tiu nulo x ok nul havajxoj okazas, ke estis memoro adreso. 247 00:12:49,740 --> 00:12:52,060 Tio estis loko en memoro. 248 00:12:52,060 --> 00:12:55,080 Kaj la tipo de puntero priskribas la specon 249 00:12:55,080 --> 00:12:56,930 de datumoj vi trovos ĉe tiu memoro adreso. 250 00:12:56,930 --> 00:12:58,810 Do ekzistas la int stelo parto dekstra. 251 00:12:58,810 --> 00:13:03,690 Se mi sekvas ke sago, ĝi estas tuj konduku min al loko. 252 00:13:03,690 --> 00:13:06,980 Kaj tiu loko, kion mi trovos tie en mia ekzemplo, 253 00:13:06,980 --> 00:13:08,240 Estas verda kolora skatolo. 254 00:13:08,240 --> 00:13:12,650 Ĝi estas entjero, jen kion mi trovos se mi iras al tiu adreso. 255 00:13:12,650 --> 00:13:14,830 La datumtipo de montrilo priskribas kion 256 00:13:14,830 --> 00:13:17,936 Vi trovos ĉe tiu memoro adreso. 257 00:13:17,936 --> 00:13:19,560 Do jen la vere malvarmeta afero tamen. 258 00:13:19,560 --> 00:13:25,090 Montriloj nin permesas pasi variabloj inter funkcioj. 259 00:13:25,090 --> 00:13:28,520 Kaj fakte okazis variabloj kaj ne pasi kopiojn de ili. 260 00:13:28,520 --> 00:13:32,879 Ĉar se ni scias precize kie memore trovi variablon, 261 00:13:32,879 --> 00:13:35,670 ni ne bezonas fari kopion de ĝin, ni povas nur iri al tiu loko 262 00:13:35,670 --> 00:13:37,844 kaj labori kun tiu variablo. 263 00:13:37,844 --> 00:13:40,260 Do en esenco punteros speco de fari komputila medio 264 00:13:40,260 --> 00:13:42,360 multe pli kiel la reala mondo, dekstre. 265 00:13:42,360 --> 00:13:44,640 >> Do jen analogion. 266 00:13:44,640 --> 00:13:48,080 Diru ke mi havas kajeron, dekstra, kaj ĝi estas plena de notoj. 267 00:13:48,080 --> 00:13:50,230 Kaj mi ŝatus ke vi ĝisdatigi ĝin. 268 00:13:50,230 --> 00:13:53,960 Vi estas funkcio kiu ĝisdatigoj notoj, dekstre. 269 00:13:53,960 --> 00:13:56,390 En la vojo ni estis laboras ĝis nun, kio 270 00:13:56,390 --> 00:14:02,370 okazas estas vi prenos mian notlibron, vi iros al la kopion vendejo, 271 00:14:02,370 --> 00:14:06,410 vi faros Xerox kopion de ĉiun paĝon de la kajero. 272 00:14:06,410 --> 00:14:09,790 Vi lasos mian notlibron reen sur mia skribtablo kiam vi faris, 273 00:14:09,790 --> 00:14:14,600 vi iros transiri ekstere aferojn en mia kajero kiu estas eksdata aŭ erara, 274 00:14:14,600 --> 00:14:19,280 kaj tiam vi pasos al mi la stako de Xerox paĝoj 275 00:14:19,280 --> 00:14:22,850 ke estas repliko de mia kajero kun la ŝanĝojn kiujn vi faris al ĝi. 276 00:14:22,850 --> 00:14:27,040 Kaj je tiu punkto, ĝi estas supren al mi kiel kunvokado funkcio, kiel la llamador, 277 00:14:27,040 --> 00:14:30,582 decidi preni viajn notojn kaj integri ilin reen en mia notlibro. 278 00:14:30,582 --> 00:14:32,540 Do ekzistas multaj paŝoj implikitaj tie, dekstre. 279 00:14:32,540 --> 00:14:34,850 Kiel ĉu ne estus pli bone se Mi nur diras, hej, ĉu vi 280 00:14:34,850 --> 00:14:38,370 ĝisdatigi mian notlibron por mi transdonos al vi mian notlibron, 281 00:14:38,370 --> 00:14:40,440 kaj vi prenu aferojn kaj laŭvorte transiri ilin 282 00:14:40,440 --> 00:14:42,810 kaj ĝisdatigi miajn notojn en mia notlibro. 283 00:14:42,810 --> 00:14:45,140 Kaj donu al mi mian notlibron reen. 284 00:14:45,140 --> 00:14:47,320 Tio estas speco de kio punteros permesi nin fari, 285 00:14:47,320 --> 00:14:51,320 ili faras ĉi medio multe pli kiel kiel ni funkcias en realo. 286 00:14:51,320 --> 00:14:54,640 >> Bone do tio estas kion montrilo estas, ni parolu 287 00:14:54,640 --> 00:14:58,040 pri kiel punteros labori en C, kaj kiel ni povas komenci al labori kun ili. 288 00:14:58,040 --> 00:15:02,550 Do tie estas tre simplaj montrilon en C nomita la nula puntero. 289 00:15:02,550 --> 00:15:04,830 La nula puntero punktoj al nenio. 290 00:15:04,830 --> 00:15:08,310 Ĉi tio probable similas ĝi estas fakte ne tre utila afero, 291 00:15:08,310 --> 00:15:10,500 sed kiel ni vidos iom poste, la fakto 292 00:15:10,500 --> 00:15:15,410 ke nula puntero ekzistas vere vere povas veni en oportuna. 293 00:15:15,410 --> 00:15:19,090 Kaj kiam ajn vi krei puntero, kaj vi ne metis sian valoron immediately- 294 00:15:19,090 --> 00:15:21,060 ekzemplo de enkadrigo lia valoro tuj 295 00:15:21,060 --> 00:15:25,401 Estos paro diapozitivoj reen Kie mi diris pk egalas & k, 296 00:15:25,401 --> 00:15:28,740 pk ricevas k la adreso, kiel ni vidos, kion ĝi signifas, 297 00:15:28,740 --> 00:15:32,990 ni vidos kiel kodigi ke shortly- se ni ne fiksita ĝian valoron al io 298 00:15:32,990 --> 00:15:35,380 signifoplena tuj, Vi devas ĉiam 299 00:15:35,380 --> 00:15:37,480 agordi vian puntero atentigi al nula. 300 00:15:37,480 --> 00:15:40,260 Vi devus agordi ĝin por indiki al nenio. 301 00:15:40,260 --> 00:15:43,614 >> Tio estas tre malsama ol nur lasante la valoron kiel ĝi estas 302 00:15:43,614 --> 00:15:45,530 kaj tiam deklari montrilo kaj nur supozante 303 00:15:45,530 --> 00:15:48,042 ĝi estas nula pro tio malofte vera. 304 00:15:48,042 --> 00:15:50,000 Do vi devus ĉiam fiksita la valoro de puntero 305 00:15:50,000 --> 00:15:55,690 al nula se vi ne metis ĝian valoron al io signfa tuj. 306 00:15:55,690 --> 00:15:59,090 Vi povas kontroli ĉu montrilo valoro estas nula uzante la egaleco operatoro 307 00:15:59,090 --> 00:16:05,450 (==), Nur ŝatas vin kompari ajna entjero valoroj aŭ karaktero valoroj uzante (==) 308 00:16:05,450 --> 00:16:06,320 ankaŭ. 309 00:16:06,320 --> 00:16:10,994 Ĝi estas speciala speco de konstanta valoro, kiun vi povas uzi por provi. 310 00:16:10,994 --> 00:16:13,160 Do kiu estis tre simpla puntero, la nula puntero. 311 00:16:13,160 --> 00:16:15,320 Alia maniero por krei montrilo estas ĉerpi 312 00:16:15,320 --> 00:16:18,240 la adreson de variablo vi jam kreis, 313 00:16:18,240 --> 00:16:22,330 kaj vi faros tion uzante la & operatoro Adreso eltiro. 314 00:16:22,330 --> 00:16:26,720 Kiun ni jam vidis antaŭe en la unua diagramo ekzemplo mi montris. 315 00:16:26,720 --> 00:16:31,450 Do se x estas variablo kiu ni jam kreita de tipo entjero, 316 00:16:31,450 --> 00:16:35,110 tiam & x estas puntero al entjero. 317 00:16:35,110 --> 00:16:39,810 & x estas- memoras, & iras ĉerpi la adreso de la afero dekstre. 318 00:16:39,810 --> 00:16:45,350 Kaj ekde puntero estas nur parolado, ol & x estas puntero al entjero 319 00:16:45,350 --> 00:16:48,560 kies valoro estas kie en memoro x vivojn. 320 00:16:48,560 --> 00:16:50,460 Estas x-adreson. 321 00:16:50,460 --> 00:16:53,296 Do & x estas la adreso de x. 322 00:16:53,296 --> 00:16:55,670 Ni prenu ĉi unu paŝo pli kaj konekti al io 323 00:16:55,670 --> 00:16:58,380 Mi aludis en unuavican vídeo. 324 00:16:58,380 --> 00:17:06,730 Se arr estas tabelo de duobloj, tiam & arr kvadrata krampo i estas montrilo 325 00:17:06,730 --> 00:17:08,109 al duobla. 326 00:17:08,109 --> 00:17:08,970 BONE. 327 00:17:08,970 --> 00:17:12,160 arr kvadrata krampo i, se arr estas tabelo de duobloj, 328 00:17:12,160 --> 00:17:19,069 tiam arr kvadrata krampo i estas la i-a ero de tiu tabelo, 329 00:17:19,069 --> 00:17:29,270 kaj & arr kvadrata krampo i estas kie en memoro la i-a ero de arr ekzistas. 330 00:17:29,270 --> 00:17:31,790 >> Do kio estas la implikaĵon tie? 331 00:17:31,790 --> 00:17:34,570 An arrays nomo, la implico de tiu tuta afero, 332 00:17:34,570 --> 00:17:39,290 estas ke tabelo nomo estas fakte mem montrilo. 333 00:17:39,290 --> 00:17:41,170 Vi estis laboranta kun punteros ĉiuj kune 334 00:17:41,170 --> 00:17:45,290 ĉiufoje ke vi uzis tabelo. 335 00:17:45,290 --> 00:17:49,090 Rememoru el la ekzemplo sur ŝanĝiĝema amplekso, 336 00:17:49,090 --> 00:17:53,420 proksime de la fino de la video mi prezentas ekzemplo kie ni havas funkcion 337 00:17:53,420 --> 00:17:56,890 nomata aro int kaj funkcio nomita aro tabelo. 338 00:17:56,890 --> 00:18:00,490 Kaj via defio por determini ĉu aŭ ne, aŭ kio la 339 00:18:00,490 --> 00:18:03,220 valoroj kiujn ni presis eksteren la fino de la funkcio, 340 00:18:03,220 --> 00:18:05,960 ĉe la fino de la ĉefa programo. 341 00:18:05,960 --> 00:18:08,740 >> Se vi memoras de tiu ekzemplo aŭ se vi jam spektis la video, 342 00:18:08,740 --> 00:18:13,080 vi scias, ke kiam vi- la alvoko al aro int efike faras nenion. 343 00:18:13,080 --> 00:18:16,390 Sed la alvoko agordi tabelo faras. 344 00:18:16,390 --> 00:18:19,280 Kaj mi ia glosada super kial kiu estis la kazo en la momento. 345 00:18:19,280 --> 00:18:22,363 Mi nur diris, nu ĝi estas tabelo, estas specialaj, vi scias, ke estas kialo. 346 00:18:22,363 --> 00:18:25,020 La kialo estas ke la tabelo nomo estas vere nur puntero, 347 00:18:25,020 --> 00:18:28,740 kaj ekzistas tiu speciala kvadrata krampo sintakso ke 348 00:18:28,740 --> 00:18:30,510 fari aferojn multe pli agrabla por labori kun. 349 00:18:30,510 --> 00:18:34,410 Kaj ili faru la ideo de Pointer multe malpli timiganta, 350 00:18:34,410 --> 00:18:36,800 kaj tial ili estas speco de prezentita en tiu maniero. 351 00:18:36,800 --> 00:18:38,600 Sed vere arrays estas nur montriloj. 352 00:18:38,600 --> 00:18:41,580 Kaj tial kiam ni faris ŝanĝon al la tabelo, 353 00:18:41,580 --> 00:18:44,880 ni preteriris tabelo kiel parametro al funkcio aŭ kiel argumento 354 00:18:44,880 --> 00:18:50,110 al funkcio, la enhavo de la tabelo fakte ŝanĝis en ambaŭ la callee 355 00:18:50,110 --> 00:18:51,160 kaj en la telefonanto. 356 00:18:51,160 --> 00:18:55,846 Kiu por ĉiu alia speco de ŝanĝiĝema ni vidis ne estis la kazo. 357 00:18:55,846 --> 00:18:58,970 Do tio estas nur io teni en menso kiam vi laboras kun punteros, 358 00:18:58,970 --> 00:19:01,610 estas ke la nomo de tabelo reale montrilo 359 00:19:01,610 --> 00:19:04,750 al la unua elemento de tiu tabelo. 360 00:19:04,750 --> 00:19:08,930 >> OK tiel nun ni havas ĉiujn tiujn faktojn, ni plu iri, dekstre. 361 00:19:08,930 --> 00:19:11,370 Kial ni zorgas pri kie io vivas. 362 00:19:11,370 --> 00:19:14,120 Nu kiel mi diris, ĝi estas bela utile scii kie io vivas 363 00:19:14,120 --> 00:19:17,240 do vi povas iri tie kaj ŝanĝi ĝin. 364 00:19:17,240 --> 00:19:19,390 Labori kun ĝi kaj reale havas nenion, pri kio vi 365 00:19:19,390 --> 00:19:23,710 volas fari al tiu variablo efektiviĝos, kaj ne efektiviĝas sur iun kopion de ĝi. 366 00:19:23,710 --> 00:19:26,150 Tio nomiĝas dereferencing. 367 00:19:26,150 --> 00:19:28,690 Ni iru al la referenco kaj ni ŝanĝas la valoron tie. 368 00:19:28,690 --> 00:19:32,660 Do se ni havas puntero kaj ĝi nomiĝas pc, kaj ĝi notas al karaktero, 369 00:19:32,660 --> 00:19:40,610 tiam ni povas diri * pc kaj * pc estas la nomo de kion ni trovos, se ni iros 370 00:19:40,610 --> 00:19:42,910 al la adreso pc. 371 00:19:42,910 --> 00:19:47,860 Kion ni trovos tie estas karaktero kaj * pc estas kiel ni rilatas al la datumoj en tiu 372 00:19:47,860 --> 00:19:48,880 situon. 373 00:19:48,880 --> 00:19:54,150 Do ni povus diri ion kiel * pc = D aŭ io simila, 374 00:19:54,150 --> 00:19:59,280 kaj tio signifas ke kio ajn Estis ĉe memoro Adreso pc, 375 00:19:59,280 --> 00:20:07,040 ajn rolulo antaŭe tie, nun D, ​​se ni diri * pc = D. 376 00:20:07,040 --> 00:20:10,090 >> Do jen ni iras denove kun iuj strangaj C stuff, dekstre. 377 00:20:10,090 --> 00:20:14,560 Do ni vidis antaŭe * kiel estante iel parto de la datumtipo, 378 00:20:14,560 --> 00:20:17,160 kaj nun ĝi estas uzata en iomete malsama kunteksto 379 00:20:17,160 --> 00:20:19,605 aliri la datumojn al loko. 380 00:20:19,605 --> 00:20:22,480 Mi scias ke estas iom konfuza kaj ke estas fakte parto de tiu tuta 381 00:20:22,480 --> 00:20:25,740 kiel, kial punteros havas ĉi mitologio ĉirkaŭ ili kiel estanta tiel kompleksaj, 382 00:20:25,740 --> 00:20:28,250 estas speco de sintaksa problemo, honeste. 383 00:20:28,250 --> 00:20:31,810 Sed estas uzata en ambaŭ kuntekstoj: ambaŭ kiel parto de la tipo nomon 384 00:20:31,810 --> 00:20:34,100 kaj ni vidos iom poste ion alian. 385 00:20:34,100 --> 00:20:36,490 Kaj nun estas la dereference operatoro. 386 00:20:36,490 --> 00:20:38,760 Do li iras al la referencon, ĝi aliroj la datumoj 387 00:20:38,760 --> 00:20:43,000 ĉe la loko de la montrilo, kaj permesas manipuli ĝin ĉe volo. 388 00:20:43,000 --> 00:20:45,900 >> Nun tiu estas tre simila al vizitante viajn proksimulon, dekstre. 389 00:20:45,900 --> 00:20:48,710 Se vi scias kion viaj najbaro vivas, vi estas 390 00:20:48,710 --> 00:20:50,730 ne eliri kun via najbaro. 391 00:20:50,730 --> 00:20:53,510 Vi scias vi hazarde scias kie ili vivas, 392 00:20:53,510 --> 00:20:56,870 sed tio ne signifas, ke per virto de havado ke scio 393 00:20:56,870 --> 00:20:59,170 vi interagas kun ili. 394 00:20:59,170 --> 00:21:01,920 Se vi volas interagi kun ili, Vi devi iri al sia domo, 395 00:21:01,920 --> 00:21:03,760 Vi devi iri al kie ili vivas. 396 00:21:03,760 --> 00:21:07,440 Kaj unufoje vi faras tion, tiam vi povas interagi 397 00:21:07,440 --> 00:21:09,420 kun ili nur ŝatas vin volus. 398 00:21:09,420 --> 00:21:12,730 Kaj simile kun variabloj, vi bezonas iri al ilia adreson 399 00:21:12,730 --> 00:21:15,320 se vi volas interagi ilin, ne eblas simple konas la adreson. 400 00:21:15,320 --> 00:21:21,495 Kaj la vojon vi iru al la adreso estas uzi *, la dereference operatoro. 401 00:21:21,495 --> 00:21:23,620 Kion vi pensas okazas se ni provas kaj dereference 402 00:21:23,620 --> 00:21:25,260 montrilo kies valoro estas nula? 403 00:21:25,260 --> 00:21:28,470 Memoru ke la nula puntero punktoj al nenio. 404 00:21:28,470 --> 00:21:34,110 Do se vi provas kaj dereference nenio aŭ iri al direkto nenion, 405 00:21:34,110 --> 00:21:36,800 Kio vi pensas okazas? 406 00:21:36,800 --> 00:21:39,630 Nu, se vi divenis segmentación kulpo, ke vi estus prava. 407 00:21:39,630 --> 00:21:41,390 Se vi provas kaj dereference nula puntero, 408 00:21:41,390 --> 00:21:43,140 vi suferos segmentación kulpo. Sed atendu, 409 00:21:43,140 --> 00:21:45,820 ĉu mi ne diris al vi, ke se vi ne tuj 410 00:21:45,820 --> 00:21:49,220 agordi vian valoron de via montrilon al io signfa, 411 00:21:49,220 --> 00:21:51,000 vi ekus al nula? 412 00:21:51,000 --> 00:21:55,290 Mi faris kaj fakte la segmentación kulpo estas speco de bona konduto. 413 00:21:55,290 --> 00:21:58,680 >> Ĉu vi iam deklaris variablo kaj ne atribuita ĝia valoro tuj? 414 00:21:58,680 --> 00:22:02,680 Do vi simple diru int x; vi ne reale atribui ĝin al ion 415 00:22:02,680 --> 00:22:05,340 kaj tiam pli poste en via kodo, vi presi la valoro de x, 416 00:22:05,340 --> 00:22:07,650 havi ankoraŭ ne atribuis al nenio. 417 00:22:07,650 --> 00:22:10,370 Oftaj vi ricevos nulo, sed kelkfoje vi 418 00:22:10,370 --> 00:22:15,000 povus akiri iom hazarda nombro, kaj vi ne havas ideon de kie ĝi devenas. 419 00:22:15,000 --> 00:22:16,750 Simile povas aferoj okazi kun punteros. 420 00:22:16,750 --> 00:22:20,110 Kiam vi deklaras puntero int * pk ekzemple, 421 00:22:20,110 --> 00:22:23,490 kaj vi ne atribui ĝin al valoro, vi ricevas kvar bitokoj por memoro. 422 00:22:23,490 --> 00:22:25,950 Whatever kvar bajtoj de memoro la sistemo povas 423 00:22:25,950 --> 00:22:28,970 trovi ke havas iuj signfa valoro. 424 00:22:28,970 --> 00:22:31,760 Kaj eble ekzistis iu jam tie 425 00:22:31,760 --> 00:22:34,190 jam ne bezonas alian funkcio, do vi simple devos 426 00:22:34,190 --> 00:22:35,900 ajn datumoj estis tie. 427 00:22:35,900 --> 00:22:40,570 >> Kio se vi provus fari dereference iu adreso kiun vi don't- ekzistis 428 00:22:40,570 --> 00:22:43,410 Jam bajtoj kaj informo en tie, tio estas jam en viaj montrilo. 429 00:22:43,410 --> 00:22:47,470 Se vi provas kaj dereference ke puntero, vi eble rompado kun iu memoro 430 00:22:47,470 --> 00:22:49,390 ke vi ne intencas salaton kun ĝi ĉiuj. 431 00:22:49,390 --> 00:22:51,639 Kaj fakte vi povus fari io vere ruiniga, 432 00:22:51,639 --> 00:22:54,880 kiel rompi alia programo, aŭ rompi alian funkcion, 433 00:22:54,880 --> 00:22:58,289 aŭ fari ion malican ke vi ne intencas taŭgus. 434 00:22:58,289 --> 00:23:00,080 Kaj tiel tio estas kial ĝi estas fakte bona ideo 435 00:23:00,080 --> 00:23:04,030 agordi vian punteros al nula se vi ne starigu ilin al iu signifa. 436 00:23:04,030 --> 00:23:06,760 Estas probable pli bona ĉe la fino de la tago por via programo 437 00:23:06,760 --> 00:23:09,840 kraŝi tiam por ĝin fari iu kiu ŝraŭboj supren 438 00:23:09,840 --> 00:23:12,400 alia programo aŭ alia funkcio. 439 00:23:12,400 --> 00:23:15,207 Ke konduto estas verŝajne eĉ malpli idealo ol nur frakasante. 440 00:23:15,207 --> 00:23:17,040 Kaj tiel tio estas kial ĝi estas fakte bona kutimo 441 00:23:17,040 --> 00:23:20,920 enir agordi vian punteros al nula se vi ne metis ilin 442 00:23:20,920 --> 00:23:24,540 al senchava valoro Tuj, valoro kiu vi scias 443 00:23:24,540 --> 00:23:27,260 kaj ke vi povas sekure la dereference. 444 00:23:27,260 --> 00:23:32,240 >> Do ni revenu nun kaj rigardu ĉe la entuta sintakso de la situacio. 445 00:23:32,240 --> 00:23:37,400 Se mi diras int * p ;, kion mi ĵus faris! 446 00:23:37,400 --> 00:23:38,530 Kion mi faris estas tiu. 447 00:23:38,530 --> 00:23:43,290 Mi konas la valoron de p estas adreso ĉar ĉiuj indikoj estas nur 448 00:23:43,290 --> 00:23:44,660 adresoj. 449 00:23:44,660 --> 00:23:47,750 Mi povas dereference p uzante la * operatoro. 450 00:23:47,750 --> 00:23:51,250 En tiu kunteksto ĉi tie, ĉe la tre supro rememori * estas parto de la tipo. 451 00:23:51,250 --> 00:23:53,510 Int * estas la datumtipo. 452 00:23:53,510 --> 00:23:56,150 Sed mi povas dereference p uzante la * operatoro, 453 00:23:56,150 --> 00:24:01,897 kaj se mi faras tion, se mi iras al tiu direkto, kion mi trovis en tiu adreso? 454 00:24:01,897 --> 00:24:02,855 Mi trovos entjero. 455 00:24:02,855 --> 00:24:05,910 Do int * p estas esence dirante, p estas adreso. 456 00:24:05,910 --> 00:24:09,500 Mi povas dereference p kaj se Mi faros, mi trovos entjero 457 00:24:09,500 --> 00:24:11,920 en tiu memoro loko. 458 00:24:11,920 --> 00:24:14,260 >> OK tiel mi diris estis alia ĝena afero per steloj 459 00:24:14,260 --> 00:24:17,060 kaj jen kien ke ĝena afero kun steloj estas. 460 00:24:17,060 --> 00:24:21,640 Ĉu vi iam provis deklari multoblaj variabloj de la sama tipo 461 00:24:21,640 --> 00:24:24,409 sur la sama linio de kodo? 462 00:24:24,409 --> 00:24:27,700 Do dum sekundo, ŝajnigi ke la linio, la kodo mi efektive havas tie en verda 463 00:24:27,700 --> 00:24:29,366 ne estas tie kaj ĝi nur diras int x, y, z ;. 464 00:24:29,366 --> 00:24:31,634 465 00:24:31,634 --> 00:24:34,550 Kio kiu farus estas reale krei tri entjeraj variabloj por vi, 466 00:24:34,550 --> 00:24:36,930 unu nomita x, unu nomita y, kaj oni nomis z. 467 00:24:36,930 --> 00:24:41,510 Estas maniero de fari ĝin sen devi disfendita sur tri linioj. 468 00:24:41,510 --> 00:24:43,890 >> Jen kie steloj akiri ĝena denove kvankam, 469 00:24:43,890 --> 00:24:49,200 ĉar la * estas reale parto de ambaŭ la speca nomo kaj parto 470 00:24:49,200 --> 00:24:50,320 de la variablo nomo. 471 00:24:50,320 --> 00:24:56,430 Kaj do se mi diras int * px, py, PZ, kion mi reale preni estas puntero al entjero 472 00:24:56,430 --> 00:25:01,650 nomata px kaj du entjeroj, py kaj Pz. 473 00:25:01,650 --> 00:25:04,950 Kaj tio estas probable ne kion ni volas, tio estas ne bona. 474 00:25:04,950 --> 00:25:09,290 >> Do se mi volas krei plurajn punteros sur la sama linio, de la sama tipo, 475 00:25:09,290 --> 00:25:12,140 kaj stelojn, kion mi efektive bezonas nur diri int * pa, * pb, * pc. 476 00:25:12,140 --> 00:25:17,330 477 00:25:17,330 --> 00:25:20,300 Nun li ĵus diris ke kaj nun diras al vi tion, 478 00:25:20,300 --> 00:25:22,170 vi probable neniam faros tion. 479 00:25:22,170 --> 00:25:25,170 Kaj estas probable bona afero honeste, ĉar vi povus distrite 480 00:25:25,170 --> 00:25:26,544 preterlasi stelo, iu kiel tio. 481 00:25:26,544 --> 00:25:29,290 Ĝi estas probable plej bone eble deklari punteros sur individuaj linioj, 482 00:25:29,290 --> 00:25:31,373 sed ĝi estas nur alia de tiuj ĝenaj sintakso 483 00:25:31,373 --> 00:25:35,310 aferojn kun steloj kiuj faras punteros tiel malfacila labori kun. 484 00:25:35,310 --> 00:25:39,480 Ĉar estas nur ĉi sintaksa salaton vi devas labori tra. 485 00:25:39,480 --> 00:25:41,600 Kun praktiko jes vere fariĝis dua naturo. 486 00:25:41,600 --> 00:25:45,410 Mi ankoraŭ faras erarojn kun ĝi ankoraŭ post programado dum 10 jaroj, 487 00:25:45,410 --> 00:25:49,630 do ne esti agitita se io okazas al vi, estas sufiĉe komuna honeste. 488 00:25:49,630 --> 00:25:52,850 Estas vere ia difekto de la sintakso. 489 00:25:52,850 --> 00:25:54,900 >> OK tiel mi specon de promesitaj ke ni reviziti 490 00:25:54,900 --> 00:25:59,370 la koncepto de kiel granda estas ĉeno. 491 00:25:59,370 --> 00:26:02,750 Nu, se mi dirus al vi ke kordo, ni vere ia 492 00:26:02,750 --> 00:26:04,140 kuŝis al vi la tutan tempon. 493 00:26:04,140 --> 00:26:06,181 Mankas datumtipo nomata kordo, kaj fakte mi 494 00:26:06,181 --> 00:26:09,730 menciis tion en unu el niaj fruaj videoj sur datumtipoj, 495 00:26:09,730 --> 00:26:13,820 ke kordoj estis datumtipo ke estis kreita por vi en cs50.h. 496 00:26:13,820 --> 00:26:17,050 Vi devas include Cs50.h por uzi ĝin. 497 00:26:17,050 --> 00:26:19,250 >> Nu kordoj estas vere nur alias ion 498 00:26:19,250 --> 00:26:23,600 vokis la char *, a montrilon al karaktero. 499 00:26:23,600 --> 00:26:26,010 Nu punteros, revokon, estas nur alparolas. 500 00:26:26,010 --> 00:26:28,780 Do kio estas la grandeco en bajtoj de kordo? 501 00:26:28,780 --> 00:26:29,796 Nu ĝi estas kvar aŭ ok. 502 00:26:29,796 --> 00:26:32,170 Kaj la kialo mi diras kvar aŭ ok estas ĉar reale 503 00:26:32,170 --> 00:26:36,730 dependas de la sistemo, Se vi uzas CS50 ide, char * estas la grandeco de char 504 00:26:36,730 --> 00:26:39,340 * Estas ok, estas 64-bita sistemo. 505 00:26:39,340 --> 00:26:43,850 Ĉiu adreson en memoro estas 64 bitojn longa. 506 00:26:43,850 --> 00:26:48,270 Se vi uzas CS50 aparaton aŭ uzante ajna 32-bita maŝino, 507 00:26:48,270 --> 00:26:51,640 kaj ke vi aŭdis ke termino 32 bitoj maŝino, kio estas 32-bita maŝino? 508 00:26:51,640 --> 00:26:56,090 Bone ĝi nur signifas ke ĉiu adreson en memoro estas 32 bitojn longa. 509 00:26:56,090 --> 00:26:59,140 Kaj do 32 bitoj estas kvar bajtoj. 510 00:26:59,140 --> 00:27:02,710 Do char * estas kvar aŭ ok bajtoj depende de via sistemo. 511 00:27:02,710 --> 00:27:06,100 Kaj efektive neniu datumtipoj, kaj montrilo al ajna datumoj 512 00:27:06,100 --> 00:27:12,030 tajpi, ĉar ĉiuj indikoj estas nur adresojn, estas kvar aŭ ok bajtoj. 513 00:27:12,030 --> 00:27:14,030 Do ni reviziti ĉi diagramon kaj ni konkludi 514 00:27:14,030 --> 00:27:18,130 tiu video kun iom ekzerco tie. 515 00:27:18,130 --> 00:27:21,600 Do jen la diagramo ni finis per tuj en la komenco de la video. 516 00:27:21,600 --> 00:27:23,110 Do kio okazas nun se mi diras * pk = 35? 517 00:27:23,110 --> 00:27:26,370 518 00:27:26,370 --> 00:27:30,530 Do kio faras ĝi signifi kiam mi diras, * pk = 35? 519 00:27:30,530 --> 00:27:32,420 Prenu duan. 520 00:27:32,420 --> 00:27:34,990 * pk. 521 00:27:34,990 --> 00:27:39,890 En kunteksto tie, * estas dereference operatoro. 522 00:27:39,890 --> 00:27:42,110 Do kiam la dereference operatoro estas uzata, 523 00:27:42,110 --> 00:27:48,520 ni iru al la adreso indikis per pk, kaj ni ŝanĝas kion ni trovas. 524 00:27:48,520 --> 00:27:55,270 Do * pk = 35 efike faras tion por la bildo. 525 00:27:55,270 --> 00:27:58,110 Do estas esence sintakse identa al de dirinte k = 35. 526 00:27:58,110 --> 00:28:00,740 527 00:28:00,740 --> 00:28:01,930 >> Unu pli. 528 00:28:01,930 --> 00:28:05,510 Se mi diras int m Mi kreos nova variablo nomas m. 529 00:28:05,510 --> 00:28:08,260 Nova skatolo, ĝi estas verda skatolo ĉar ĝi tuj teni entjero, 530 00:28:08,260 --> 00:28:09,840 kaj ĝin etikeditaj m. 531 00:28:09,840 --> 00:28:14,960 Se mi diras m = 4, mi metis entjero en tiun skatolon. 532 00:28:14,960 --> 00:28:20,290 Se diru pk = & m, kiel faras tiu diagramo ŝanĝo? 533 00:28:20,290 --> 00:28:28,760 Pk = & m, do vi memoras, kion la & Operatoro faras aŭ nomiĝas? 534 00:28:28,760 --> 00:28:34,430 Memoru ke & iu variablo nomo estas la adreso de variablo nomo. 535 00:28:34,430 --> 00:28:38,740 Do kion ni diras estas pk akiras la adreson de m. 536 00:28:38,740 --> 00:28:42,010 Kaj tiel efike kio okazas la diagramo estas ke pk plu punktoj 537 00:28:42,010 --> 00:28:46,420 al k, sed punktoj al m. 538 00:28:46,420 --> 00:28:48,470 >> Denove punteros estas tre malfacila labori kun 539 00:28:48,470 --> 00:28:50,620 kaj ili prenas multajn praktiko, sed ĉar 540 00:28:50,620 --> 00:28:54,150 de ilia kapableco permesi vin pasi datumojn inter funkcioj 541 00:28:54,150 --> 00:28:56,945 kaj efektive havas tiujn Ŝanĝoj efektiviĝas, 542 00:28:56,945 --> 00:28:58,820 akiranta vian kapon ĉirkaŭe estas vere grava. 543 00:28:58,820 --> 00:29:02,590 Ĝi probable estas la plej komplikitaj temo ni diskutas en CS50, 544 00:29:02,590 --> 00:29:05,910 sed la valoro kiun vi preni de uzante punteros 545 00:29:05,910 --> 00:29:09,200 malproksime superpezas la komplikaĵoj kiuj venas de lernanta ilin. 546 00:29:09,200 --> 00:29:12,690 Do mi deziras al vi la plej bonajn sorto lernanta pri punteros. 547 00:29:12,690 --> 00:29:15,760 Mi Doug Lloyd, tiu estas CS50. 548 00:29:15,760 --> 00:29:17,447