1 00:00:00,000 --> 00:00:06,030 >> [REPRODUCCIÓ DE MÚSICA] 2 00:00:06,030 --> 00:00:08,390 >> DOUG LLOYD: Punters, aquí estem. 3 00:00:08,390 --> 00:00:11,080 Aquesta és, probablement, va serà el tema més difícil 4 00:00:11,080 --> 00:00:12,840 que es parla al CS50. 5 00:00:12,840 --> 00:00:15,060 I si has llegit res d'apuntadors 6 00:00:15,060 --> 00:00:19,080 abans que vostè pot ser que sigui una mica intimidatori entrar en aquest vídeo. 7 00:00:19,080 --> 00:00:21,260 És cert els punters Permet la capacitat 8 00:00:21,260 --> 00:00:23,740 cargolar potser fins bastant malament quan estàs 9 00:00:23,740 --> 00:00:27,450 treballar amb variables, i les dades, i fent que el seu programa es bloquegi. 10 00:00:27,450 --> 00:00:30,490 Però en realitat són realment útils i ens realment una gran manera permeten 11 00:00:30,490 --> 00:00:33,340 per passar les dades cap enrere i tornada entre funcions, 12 00:00:33,340 --> 00:00:35,490 que som d'una altra manera no pot fer. 13 00:00:35,490 --> 00:00:37,750 >> I així el que realment vull fer aquí és el tren 14 00:00:37,750 --> 00:00:41,060 li permet tenir una bona disciplina punter, per la qual que pot utilitzar punters amb eficàcia 15 00:00:41,060 --> 00:00:43,850 per fer els seus programes que molt millor. 16 00:00:43,850 --> 00:00:48,220 Com vaig dir punters ens donen una diferent manera de passar les dades entre funcions. 17 00:00:48,220 --> 00:00:50,270 Ara bé, si vostè recorda de un vídeo anterior, quan 18 00:00:50,270 --> 00:00:53,720 parlàvem àmbit de variable, vaig esmentar 19 00:00:53,720 --> 00:01:00,610 que totes les dades que es passa entre funcions en C es passen per valor. 20 00:01:00,610 --> 00:01:03,070 I pot ser que no he fet servir aquesta termini, la qual cosa significava que 21 00:01:03,070 --> 00:01:07,170 va ser que estem passant còpies de les dades. 22 00:01:07,170 --> 00:01:12,252 Quan es passa una variable a una funció, no estem en realitat passa la variable 23 00:01:12,252 --> 00:01:13,210 a la funció, no? 24 00:01:13,210 --> 00:01:17,670 Estem passant una còpia de que les dades a la funció. 25 00:01:17,670 --> 00:01:20,760 La funció fa el que farà i es calcula un valor, 26 00:01:20,760 --> 00:01:23,180 i potser fem servir aquest valor quan se li dóna l'esquena. 27 00:01:23,180 --> 00:01:26,700 >> Hi va haver una excepció a aquesta regla de passar per valor, 28 00:01:26,700 --> 00:01:31,210 i anem a tornar al que és una mica més endavant en aquest vídeo. 29 00:01:31,210 --> 00:01:34,880 Si fem servir punters lloc d'utilitzar variables, 30 00:01:34,880 --> 00:01:38,180 o en lloc d'utilitzar les variables ells mateixos o còpies de les variables, 31 00:01:38,180 --> 00:01:43,790 ara podem passar a les variables al voltant entre les funcions d'una manera diferent. 32 00:01:43,790 --> 00:01:46,550 Això vol dir que si fem un canvi en una funció, 33 00:01:46,550 --> 00:01:49,827 que el canvi realment prendre efectuar en una funció diferent. 34 00:01:49,827 --> 00:01:52,160 Un cop més, això és una cosa que no podíem fer abans, 35 00:01:52,160 --> 00:01:56,979 i si alguna vegada has tractat de canviar la valor de dues variables en una funció, 36 00:01:56,979 --> 00:01:59,270 vostè ha notat aquest problema espècie de rèptil, oi? 37 00:01:59,270 --> 00:02:04,340 >> Si volem canviar X i Y, i passar-los a una funció anomenada swap, 38 00:02:04,340 --> 00:02:08,680 dins de la funció de canviar el variables que fan els valors de canvi. 39 00:02:08,680 --> 00:02:12,600 Un es converteix en dues, dues esdevé un, però no ho fem realitat 40 00:02:12,600 --> 00:02:16,890 canviar res en l'original funció, en la persona que truca. 41 00:02:16,890 --> 00:02:19,550 Perquè no podem, estem només treballar amb còpies dels mateixos. 42 00:02:19,550 --> 00:02:24,760 Amb punters això, podem en realitat passar X i Y a una funció. 43 00:02:24,760 --> 00:02:26,960 Aquesta funció pot fer alguna cosa amb ells. 44 00:02:26,960 --> 00:02:29,250 I els valors de les variables en realitat pot canviar. 45 00:02:29,250 --> 00:02:33,710 Així que això és un gran canvi en la nostra capacitat per treballar amb dades. 46 00:02:33,710 --> 00:02:36,100 >> Abans de submergir-se en punters, crec que val la pena 47 00:02:36,100 --> 00:02:38,580 prendre un parell de minuts a tornar al bàsic aquí. 48 00:02:38,580 --> 00:02:41,000 I fer una ullada a com obres de memòria per a ordinadors 49 00:02:41,000 --> 00:02:45,340 perquè aquests dos temes van per ser realment molt relacionats entre si. 50 00:02:45,340 --> 00:02:48,480 Com vostè probablement sap, en el seu sistema informàtic 51 00:02:48,480 --> 00:02:51,310 Té un disc dur o potser una unitat d'estat sòlid, 52 00:02:51,310 --> 00:02:54,430 una mena de lloc d'emmagatzematge d'arxius. 53 00:02:54,430 --> 00:02:57,950 En general és un lloc en el veïnatge de 250 gigabytes 54 00:02:57,950 --> 00:02:59,810 que potser un parell de terabytes ara. 55 00:02:59,810 --> 00:03:02,270 I és on tots els de la seva arxius viuen en última instància, 56 00:03:02,270 --> 00:03:04,870 fins i tot quan l'ordinador està apagat apagat, pot tornar a engegar 57 00:03:04,870 --> 00:03:09,190 i trobareu els arxius hi són de nou al reiniciar el sistema. 58 00:03:09,190 --> 00:03:14,820 Però les unitats de disc, com una unitat de disc dur, un disc dur o una unitat d'estat sòlid, un SSD, 59 00:03:14,820 --> 00:03:16,050 són l'espai d'emmagatzematge just. 60 00:03:16,050 --> 00:03:20,400 >> En realitat no podem fer res amb les dades que es troba en el disc dur, 61 00:03:20,400 --> 00:03:22,080 o en una unitat d'estat sòlid. 62 00:03:22,080 --> 00:03:24,950 Per tal de canviar realment de dades o moure'l, 63 00:03:24,950 --> 00:03:28,800 hem de moure-ho a RAM, memòria d'accés aleatori. 64 00:03:28,800 --> 00:03:31,170 Ara RAM, vostè té un munt menys en el seu ordinador. 65 00:03:31,170 --> 00:03:34,185 És possible que en algun lloc del barri de 512 megabytes 66 00:03:34,185 --> 00:03:38,850 si vostè té un ordinador antic, que potser dos, quatre, vuit, 16, 67 00:03:38,850 --> 00:03:41,820 possiblement fins i tot una mica més, gigabytes de RAM. 68 00:03:41,820 --> 00:03:46,390 Així que això és molt més petit, però això és on totes les dades volàtils existeix. 69 00:03:46,390 --> 00:03:48,270 Aquí és on podem canviar les coses. 70 00:03:48,270 --> 00:03:53,350 Però quan ens tornem nostre ordinador apagat, totes les dades a la RAM es destrueix. 71 00:03:53,350 --> 00:03:57,150 >> Així que per això hem de tenir el disc dur per a la ubicació més permanent de la mateixa, 72 00:03:57,150 --> 00:03:59,720 de manera que existeix- que ho faria ser realment dolent si cada vegada que 73 00:03:59,720 --> 00:04:03,310 convertit al nostre ordinador apagat, cada arxiu en el nostre sistema va ser esborrada. 74 00:04:03,310 --> 00:04:05,600 Així que treballem dins de RAM. 75 00:04:05,600 --> 00:04:09,210 I cada vegada que estem parlant de memòria, més o menys, al CS50, 76 00:04:09,210 --> 00:04:15,080 estem parlant de RAM, no disc dur. 77 00:04:15,080 --> 00:04:18,657 >> Així que quan ens movem coses a la memòria, que ocupa una certa quantitat d'espai. 78 00:04:18,657 --> 00:04:20,740 Tots els tipus de dades que hem estat treballant amb 79 00:04:20,740 --> 00:04:23,480 assumir diferents quantitats d'espai a la RAM. 80 00:04:23,480 --> 00:04:27,600 Així que cada vegada que creï un sencer variables, quatre bytes de memòria 81 00:04:27,600 --> 00:04:30,750 es deixen de costat a la memòria RAM perquè pot treballar amb aquest sencer. 82 00:04:30,750 --> 00:04:34,260 Pot declarar el nombre sencer, canviar-ho, assignar- 83 00:04:34,260 --> 00:04:36,700 a un valor de 10 incrementat per un, així successivament i així successivament. 84 00:04:36,700 --> 00:04:39,440 Tot el que ha de passar a RAM, i s'obté 4 bytes 85 00:04:39,440 --> 00:04:42,550 per treballar amb per a cada sencer que vostè creu. 86 00:04:42,550 --> 00:04:45,410 >> Cada caràcter que crear aconsegueix un byte. 87 00:04:45,410 --> 00:04:48,160 Això és només la quantitat d'espai necessària per emmagatzemar un caràcter. 88 00:04:48,160 --> 00:04:51,310 Cada flotador, un veritable nombre, obté quatre bytes 89 00:04:51,310 --> 00:04:53,390 llevat que sigui un doble punt flotant de precisió 90 00:04:53,390 --> 00:04:56,510 nombre, que li permet tenir dígits més precises o més 91 00:04:56,510 --> 00:04:59,300 després del punt decimal sense perdre precisió, 92 00:04:59,300 --> 00:05:01,820 de prendre fins a vuit bytes de memòria. 93 00:05:01,820 --> 00:05:06,730 Anhela llargs, realment grans nombres enters, També prendre fins a vuit bytes de memòria. 94 00:05:06,730 --> 00:05:09,000 Quants bytes de memòria Què cadenes ocupen? 95 00:05:09,000 --> 00:05:12,990 Bé anem a posar una agulla en aquesta pregunta per ara, però anem a tornar-hi. 96 00:05:12,990 --> 00:05:17,350 >> Així que de tornada a aquesta idea de la memòria com una gran varietat de cèl·lules bytes de mida. 97 00:05:17,350 --> 00:05:20,871 Això és realment tot el que és, és només una enorme varietat de cèl·lules, 98 00:05:20,871 --> 00:05:23,370 de la mateixa manera que qualsevol altra matriu que vostè està familiaritzat amb i veure, 99 00:05:23,370 --> 00:05:26,430 excepte cada element és un byte d'amplada. 100 00:05:26,430 --> 00:05:30,030 I igual que una matriu, cada element té una adreça. 101 00:05:30,030 --> 00:05:32,120 Cada element d'una matriu té un índex, i nosaltres 102 00:05:32,120 --> 00:05:36,302 pot utilitzar aquest índex per fer la trucada accés aleatori a la matriu. 103 00:05:36,302 --> 00:05:38,510 No hem de començar per el principi de la matriu, 104 00:05:38,510 --> 00:05:40,569 iterar a través de tots els sol element de la mateixa, 105 00:05:40,569 --> 00:05:41,860 per trobar el que estem buscant. 106 00:05:41,860 --> 00:05:45,790 Només podem dir que vull arribar al Element 15a o l'element número 100. 107 00:05:45,790 --> 00:05:49,930 I que només pot passar en aquest nombre i obtenir el valor que vostè està buscant. 108 00:05:49,930 --> 00:05:54,460 >> De la mateixa manera cada localització en la memòria té una adreça. 109 00:05:54,460 --> 00:05:57,320 Així que la seva memòria podria alguna cosa com això. 110 00:05:57,320 --> 00:06:01,420 Aquí hi ha una molt petita part de memòria, aquesta és de 20 bytes de memòria. 111 00:06:01,420 --> 00:06:04,060 Els primers 20 bytes perquè el meu aborda hi ha a la part inferior 112 00:06:04,060 --> 00:06:08,890 són 0, 1, 2, 3, i així en tot el camí fins al 19. 113 00:06:08,890 --> 00:06:13,190 I quan em declaro variables, i quan començo a treballar amb ells, 114 00:06:13,190 --> 00:06:15,470 el sistema es va a establir de costat una mica d'espai per a mi 115 00:06:15,470 --> 00:06:17,595 en aquesta memòria per treballar amb els meus variables. 116 00:06:17,595 --> 00:06:21,610 Així que podria dir, char c és igual a la capital H. I què passarà? 117 00:06:21,610 --> 00:06:23,880 Bé, el sistema va reservat per a mi un byte. 118 00:06:23,880 --> 00:06:27,870 En aquest cas es va triar el nombre de bytes quatre, el octet en la direcció de quatre, 119 00:06:27,870 --> 00:06:31,310 i que va a emmagatzemar el lletra majúscula H en allà per a mi. 120 00:06:31,310 --> 00:06:34,350 Doncs si jo dic velocitat int límit és igual a 65, que és 121 00:06:34,350 --> 00:06:36,806 va a deixar de banda les quatre bytes de memòria per a mi. 122 00:06:36,806 --> 00:06:39,180 I que va a tractar a les persones 4 bytes com una sola unitat 123 00:06:39,180 --> 00:06:41,305 perquè el que estem treballant amb un sencer aquí. 124 00:06:41,305 --> 00:06:44,350 I que va a emmagatzemar 65 en aquest país. 125 00:06:44,350 --> 00:06:47,000 >> Ara ja estic una mica que li diu una mica d'una mentida, 126 00:06:47,000 --> 00:06:50,150 dreta, perquè sabem que ordinadors funcionen en binari. 127 00:06:50,150 --> 00:06:53,100 Ells no entenen necessàriament el majúscula és 128 00:06:53,100 --> 00:06:57,110 o el que és un 65, és a dir, que només entenen el binari, zeros i uns. 129 00:06:57,110 --> 00:06:59,000 I el que en realitat el que estem emmagatzemant allà 130 00:06:59,000 --> 00:07:03,450 no és la lletra H i el número 65, sinó més aviat les representacions binàries 131 00:07:03,450 --> 00:07:06,980 del mateix, que busqui un mica alguna cosa com això. 132 00:07:06,980 --> 00:07:10,360 I, en particular en el context de la variable de nombre sencer, 133 00:07:10,360 --> 00:07:13,559 no va a simplement escopir a, no va a tractar-lo com un de quatre 134 00:07:13,559 --> 00:07:15,350 tros byte necessàriament, en realitat està passant 135 00:07:15,350 --> 00:07:19,570 tractar-lo com quatre trossos d'un byte, que podria ser alguna cosa com això. 136 00:07:19,570 --> 00:07:22,424 I fins i tot això no és tot cert tampoc, 137 00:07:22,424 --> 00:07:24,840 causa d'alguna cosa anomenat 1 endianness, que no estem 138 00:07:24,840 --> 00:07:26,965 va entrar en aquest moment, però si ets curiós sobre, 139 00:07:26,965 --> 00:07:29,030 es pot llegir en poc i grans endianness. 140 00:07:29,030 --> 00:07:31,640 Però pel bé d'aquest argument, pel bé d'aquest vídeo, 141 00:07:31,640 --> 00:07:34,860 anem a suposar que és, en De fet, com el nombre 65 ho faria 142 00:07:34,860 --> 00:07:36,970 estar representats en memòria en tots els sistemes, 143 00:07:36,970 --> 00:07:38,850 encara que no és del tot cert. 144 00:07:38,850 --> 00:07:41,700 >> Però siguem en realitat només aconsegueixen desfer-se de tots binari complet, 145 00:07:41,700 --> 00:07:44,460 i només pensar en com H i el 65, que és molt més fàcil 146 00:07:44,460 --> 00:07:47,900 pensar-hi com que com a ésser humà. 147 00:07:47,900 --> 00:07:51,420 Molt bé, pel que també sembla potser un poc aleatori que I've- meu sistema 148 00:07:51,420 --> 00:07:55,130 no em va donar bytes 5, 6, 7, i 8 per emmagatzemar el nombre enter. 149 00:07:55,130 --> 00:07:58,580 Hi ha una raó per això, també, que no entrarem en aquest moment, però suficient 150 00:07:58,580 --> 00:08:00,496 amb dir que el que el equip està fent aquí 151 00:08:00,496 --> 00:08:02,810 és probablement una bona jugada de la seva part. 152 00:08:02,810 --> 00:08:06,020 Per no donar-me memòria que és còpia necessàriament amb esquena. 153 00:08:06,020 --> 00:08:10,490 Tot i que va a fer-ho ara si vull tenir una altra cadena, 154 00:08:10,490 --> 00:08:13,080 Vaig trucar cognom, i vull posar Lloyd allà. 155 00:08:13,080 --> 00:08:18,360 Vaig a haver d'adaptar a un sol caràcter, cada lletra que és 156 00:08:18,360 --> 00:08:21,330 requerirà d'un caràcter, un byte de memòria. 157 00:08:21,330 --> 00:08:26,230 Així que si podia posar Lloyd en el meu arsenal com això sóc bastant bo per anar, oi? 158 00:08:26,230 --> 00:08:28,870 Què falta? 159 00:08:28,870 --> 00:08:31,840 >> Recordeu que cada cadena treballem amb en C acaba amb barra invertida zero, 160 00:08:31,840 --> 00:08:33,339 i no podem ometre que aquí, tampoc. 161 00:08:33,339 --> 00:08:36,090 Hem de deixar de banda un byte de memòria per sostenir que el que 162 00:08:36,090 --> 00:08:39,130 saber quan la nostra cadena ha acabat. 163 00:08:39,130 --> 00:08:41,049 Així que de nou aquest acord de les coses 164 00:08:41,049 --> 00:08:42,799 apareixerà en la força de la memòria ser una mica a l'atzar, 165 00:08:42,799 --> 00:08:44,870 però en realitat és com la majoria dels sistemes estan dissenyats. 166 00:08:44,870 --> 00:08:48,330 Per alinear en múltiples de quatre, per raons de nou 167 00:08:48,330 --> 00:08:50,080 que no necessitem entrar en aquest moment. 168 00:08:50,080 --> 00:08:53,060 Però això, per la qual cosa n'hi ha prou amb dir que després d'aquestes tres línies de codi, 169 00:08:53,060 --> 00:08:54,810 això és el que la memòria podria ser similar. 170 00:08:54,810 --> 00:08:58,930 Si necessito posicions de memòria 4, 8 i 12 per subjectar les meves dades, 171 00:08:58,930 --> 00:09:01,100 això és el que la meva memòria podria ser similar. 172 00:09:01,100 --> 00:09:04,062 >> I només ser particularment pedant aquí, quan 173 00:09:04,062 --> 00:09:06,020 estem parlant de la memòria adreces Solem 174 00:09:06,020 --> 00:09:08,390 fer-ho usant notacions hexadecimals. 175 00:09:08,390 --> 00:09:12,030 Llavors, ¿per què no ens convertim tots aquests de decimal a notació hexadecimal 176 00:09:12,030 --> 00:09:15,010 simplement perquè això és en general com ens referim a la memòria. 177 00:09:15,010 --> 00:09:17,880 Així que en lloc de ser de 0 a 19, el que tenim és zero 178 00:09:17,880 --> 00:09:20,340 x zero per zero x1 3. 179 00:09:20,340 --> 00:09:23,790 Aquests són els 20 bytes de memòria que hem o estem veient en aquesta imatge 180 00:09:23,790 --> 00:09:25,540 aquí mateix. 181 00:09:25,540 --> 00:09:29,310 >> Així que tot el que es diu, anem a allunyar-se de la memòria per un segon 182 00:09:29,310 --> 00:09:30,490 i de nou als punters. 183 00:09:30,490 --> 00:09:32,420 Aquí és el més important cosa per recordar 184 00:09:32,420 --> 00:09:34,070 a mesura que vam començar a treballar amb punters. 185 00:09:34,070 --> 00:09:36,314 Un punter és gens més d'una adreça. 186 00:09:36,314 --> 00:09:38,230 Ho diré una altra vegada perquè que és tan important, 187 00:09:38,230 --> 00:09:42,730 un punter no és gens més d'una adreça. 188 00:09:42,730 --> 00:09:47,760 Els punters són adreces a llocs en la memòria on viuen variables. 189 00:09:47,760 --> 00:09:52,590 Sabent que es fa d'esperar un poc més fàcil treballar amb ells. 190 00:09:52,590 --> 00:09:54,550 Una altra cosa que m'agrada de fer és tenir sort 191 00:09:54,550 --> 00:09:58,510 dels diagrames de representar visualment el que és passant amb diverses línies de codi. 192 00:09:58,510 --> 00:10:00,660 I farem això un parell de vegades en els punters, 193 00:10:00,660 --> 00:10:03,354 i quan parlem de dinàmica assignació de memòria també. 194 00:10:03,354 --> 00:10:06,020 Perquè crec que aquests diagrames pot ser particularment útil. 195 00:10:06,020 --> 00:10:09,540 >> Així que si jo dic per exemple, int k en el meu codi, què està passant? 196 00:10:09,540 --> 00:10:12,524 Bé el que està succeint és, bàsicament, M'estic posant de memòria reservat per a mi, 197 00:10:12,524 --> 00:10:14,690 però ni tan sols m'agrada penso així, jo 198 00:10:14,690 --> 00:10:16,300 agradaria pensar-hi com una caixa. 199 00:10:16,300 --> 00:10:20,090 Tinc una caixa i és de color verd perquè 200 00:10:20,090 --> 00:10:21,750 pot posar nombres enters en caixes verdes. 201 00:10:21,750 --> 00:10:23,666 Si es tractava d'un personatge que podria tenir un quadre blau. 202 00:10:23,666 --> 00:10:27,290 Però jo sempre dic, si jo estic creant una caixa que pot contenir nombres enters 203 00:10:27,290 --> 00:10:28,950 aquesta caixa és de color verd. 204 00:10:28,950 --> 00:10:33,020 I prenc un marcador permanent i escric k al costat de la mateixa. 205 00:10:33,020 --> 00:10:37,590 Així que tinc una caixa anomenada k, en la qual puc posar sencers. 206 00:10:37,590 --> 00:10:41,070 Així que quan dic int k, això és el que passa al meu cap. 207 00:10:41,070 --> 00:10:43,140 Si dic k és igual a cinc, què estic fent? 208 00:10:43,140 --> 00:10:45,110 Bé, em posaré de cinc en el quadre, la dreta. 209 00:10:45,110 --> 00:10:48,670 Això és bastant senzill, si Dic int k, crear un quadre anomenat k. 210 00:10:48,670 --> 00:10:52,040 Si dic k és igual a 5, posar cinc a la caixa. 211 00:10:52,040 --> 00:10:53,865 Esperem que això no és massa d'un salt. 212 00:10:53,865 --> 00:10:55,990 Aquí és on les coses van una poc interessant. 213 00:10:55,990 --> 00:11:02,590 Si dic int * pk, bé encara que no ho faig sap el que això significa necessàriament, 214 00:11:02,590 --> 00:11:06,150 És clarament té alguna cosa a veure amb un sencer. 215 00:11:06,150 --> 00:11:08,211 Així que vaig a pintar aquesta caixa verda-ish, 216 00:11:08,211 --> 00:11:10,210 Sé que té alguna cosa a veure amb un sencer, 217 00:11:10,210 --> 00:11:13,400 però no és un nombre enter en si, perquè és un int estrelles. 218 00:11:13,400 --> 00:11:15,390 Hi ha alguna cosa una mica diferent al respecte. 219 00:11:15,390 --> 00:11:17,620 Així involucrats d'un sencer, però per la resta és 220 00:11:17,620 --> 00:11:19,830 no molt diferent de el que estàvem parlant. 221 00:11:19,830 --> 00:11:24,240 És una caixa, la seva té una etiqueta, que porta un pk etiqueta, 222 00:11:24,240 --> 00:11:27,280 i és capaç de tinença estrelles int, el que són. 223 00:11:27,280 --> 00:11:29,894 Tenen alguna cosa a veure amb nombres enters, amb claredat. 224 00:11:29,894 --> 00:11:31,060 Aquí està l'última línia però. 225 00:11:31,060 --> 00:11:37,650 Si dic pk = & k, espera, el que acaba de succeir, oi? 226 00:11:37,650 --> 00:11:41,820 Així que aquest nombre a l'atzar, aparentment a l'atzar nombre, es tira en el quadre d'allà. 227 00:11:41,820 --> 00:11:44,930 Tot el que és, és pk obté la direcció de k. 228 00:11:44,930 --> 00:11:52,867 Així que em quedo on k viu en la memòria, seva direcció, la direcció dels seus bytes. 229 00:11:52,867 --> 00:11:55,200 Tot el que estic fent és el que dic que el valor és el que vaig 230 00:11:55,200 --> 00:11:59,430 per posar dins del meu caixa anomenada pk. 231 00:11:59,430 --> 00:12:02,080 I perquè aquestes coses són punters, i perquè busca 232 00:12:02,080 --> 00:12:04,955 en una cadena com zero x 08:00 zero c 07:00 04:08 233 00:12:04,955 --> 00:12:07,790 02:00 zero és, probablement, no és molt significativa. 234 00:12:07,790 --> 00:12:12,390 Quan visualitzem general punters, que en realitat fem com punters. 235 00:12:12,390 --> 00:12:17,000 Pk ens dóna la informació hem de trobar k en la memòria. 236 00:12:17,000 --> 00:12:19,120 Així que, bàsicament pk té una fletxa en ell. 237 00:12:19,120 --> 00:12:21,670 I si caminem la longitud d'aquesta fletxa, imagini 238 00:12:21,670 --> 00:12:25,280 és una cosa que es pot caminar, si caminar al llarg de la longitud de la fletxa, 239 00:12:25,280 --> 00:12:29,490 a la punta de la fletxa, que serà trobar la ubicació en la memòria 240 00:12:29,490 --> 00:12:31,390 on k viu. 241 00:12:31,390 --> 00:12:34,360 I això és realment important perquè una vegada que sabem que k viu, 242 00:12:34,360 --> 00:12:37,870 podem començar a treballar amb les dades dins d'aquesta posició de memòria. 243 00:12:37,870 --> 00:12:40,780 Tot i que estem rebent un petit mica per davant de nosaltres per ara. 244 00:12:40,780 --> 00:12:42,240 >> Llavors, què és un punter? 245 00:12:42,240 --> 00:12:45,590 Un punter és un element de dades el valor és una adreça de memòria. 246 00:12:45,590 --> 00:12:49,740 Aquesta va ser que el zero x 8 zero coses passant, que era una direcció de memòria. 247 00:12:49,740 --> 00:12:52,060 Aquesta va ser una ubicació en la memòria. 248 00:12:52,060 --> 00:12:55,080 I el tipus d'un punter descriu el tipus 249 00:12:55,080 --> 00:12:56,930 de les dades que trobareu a aquesta direcció de memòria. 250 00:12:56,930 --> 00:12:58,810 Així que la part dreta int estrelles. 251 00:12:58,810 --> 00:13:03,690 Si segueixo aquesta fletxa, és em va portar a una ubicació. 252 00:13:03,690 --> 00:13:06,980 I aquest lloc, el que trobaran allà en el meu exemple, 253 00:13:06,980 --> 00:13:08,240 és un quadre de color verd. 254 00:13:08,240 --> 00:13:12,650 És un sencer, això és el que trobaran si vaig a aquesta direcció. 255 00:13:12,650 --> 00:13:14,830 El tipus de dades d'un punter descriu el 256 00:13:14,830 --> 00:13:17,936 es troba en aquesta adreça de memòria. 257 00:13:17,936 --> 00:13:19,560 Així que aquí està la cosa molt fresc però. 258 00:13:19,560 --> 00:13:25,090 Punters ens permeten passar variables entre funcions. 259 00:13:25,090 --> 00:13:28,520 I en realitat passar variables i no passar còpies d'ells. 260 00:13:28,520 --> 00:13:32,879 Perquè si sabem exactament on en memòria per trobar una variable, 261 00:13:32,879 --> 00:13:35,670 no necessitem fer una còpia de ella, que només pot anar a aquest lloc 262 00:13:35,670 --> 00:13:37,844 i treballar amb aquesta variable. 263 00:13:37,844 --> 00:13:40,260 Així que en essència punters espècie de fer un entorn informàtic 264 00:13:40,260 --> 00:13:42,360 molt més com el món real, a la dreta. 265 00:13:42,360 --> 00:13:44,640 >> Així que aquí hi ha una analogia. 266 00:13:44,640 --> 00:13:48,080 Diguem que tinc un quadern, dreta, i està ple de notes. 267 00:13:48,080 --> 00:13:50,230 I m'agradaria que actualitzar-lo. 268 00:13:50,230 --> 00:13:53,960 Vostè és una funció que Actualitzacions de notes, dreta. 269 00:13:53,960 --> 00:13:56,390 En la forma en què hem estat treballant fins ara, el que 270 00:13:56,390 --> 00:14:02,370 que passa és que vostè prengui el meu quadern, te'n vas a la botiga de còpia, 271 00:14:02,370 --> 00:14:06,410 que va a fer una còpia de Xerox cada pàgina del quadern. 272 00:14:06,410 --> 00:14:09,790 Vas a deixar la meva llibreta de tornada en el meu escriptori quan hagi acabat, 273 00:14:09,790 --> 00:14:14,600 aniràs i ratllar coses en el meu quadern que estan fora de data o erroni, 274 00:14:14,600 --> 00:14:19,280 i després passarà de nou a me la pila de pàgines Xerox 275 00:14:19,280 --> 00:14:22,850 que és una rèplica del meu portàtil amb els canvis que vostè ha fet a ella. 276 00:14:22,850 --> 00:14:27,040 I en aquest punt, li toca a mi com la funció de trucada, ja que la persona que truca, 277 00:14:27,040 --> 00:14:30,582 en decidir prendre les seves notes i integrar-los de nou en el meu quadern. 278 00:14:30,582 --> 00:14:32,540 Així que hi ha un munt de passos involucrat aquí, a la dreta. 279 00:14:32,540 --> 00:14:34,850 Igual que no seria millor si acabo de dir, bé, oi 280 00:14:34,850 --> 00:14:38,370 actualitzar el meu quadern per jo, que lliuro el meu quadern, 281 00:14:38,370 --> 00:14:40,440 i es pren les coses i creuar literalment fora 282 00:14:40,440 --> 00:14:42,810 i actualitzar els meus notes en la llibreta. 283 00:14:42,810 --> 00:14:45,140 I després em donen el meu quadern esquena. 284 00:14:45,140 --> 00:14:47,320 Això és una cosa del que punters ens permeten fer, 285 00:14:47,320 --> 00:14:51,320 que fan d'aquest entorn molt més com la forma en què operem a la realitat. 286 00:14:51,320 --> 00:14:54,640 >> Està bé així que això és el que un punter està, anem a parlar 287 00:14:54,640 --> 00:14:58,040 sobre com funcionen els punters en C, i com podem començar a treballar amb ells. 288 00:14:58,040 --> 00:15:02,550 Així que hi ha una molt simple punter en C anomenat el punter nul. 289 00:15:02,550 --> 00:15:04,830 Els punts de punter nul a res. 290 00:15:04,830 --> 00:15:08,310 Això probablement sembla que és En realitat no és una cosa molt útil, 291 00:15:08,310 --> 00:15:10,500 però com veurem un poc més endavant, el fet 292 00:15:10,500 --> 00:15:15,410 l'existència d'aquest punter nul realment realment pot ser útil. 293 00:15:15,410 --> 00:15:19,090 I cada vegada que es crea un punter i no estableix el seu valor seguit- 294 00:15:19,090 --> 00:15:21,060 un exemple de configuració el seu valor immediatament 295 00:15:21,060 --> 00:15:25,401 serà un parell de diapositives de retorn on vaig dir pk és igual a & k, 296 00:15:25,401 --> 00:15:28,740 pk obté la direcció de k, com anem a veure el que això significa, 297 00:15:28,740 --> 00:15:32,990 anem a veure com el codi que shortly- si no establim seu valor a alguna cosa 298 00:15:32,990 --> 00:15:35,380 immediatament significatiu, sempre ha de 299 00:15:35,380 --> 00:15:37,480 establir el punter per apuntar a null. 300 00:15:37,480 --> 00:15:40,260 Vostè ha configurar-lo perquè apunti a res. 301 00:15:40,260 --> 00:15:43,614 >> Això és molt diferent a simplement deixant el valor ja que és 302 00:15:43,614 --> 00:15:45,530 i després declarar una punter i acaba assumint 303 00:15:45,530 --> 00:15:48,042 és nul·la perquè és poques vegades és cert. 304 00:15:48,042 --> 00:15:50,000 Així que sempre s'ha d'establir el valor d'un punter 305 00:15:50,000 --> 00:15:55,690 null si no s'estableix el seu valor a alguna cosa significatiu immediatament. 306 00:15:55,690 --> 00:15:59,090 Podeu comprovar si el valor d'un punter és nul utilitzant l'operador d'igualtat 307 00:15:59,090 --> 00:16:05,450 (==), Igual que es compara qualsevol sencer valors o valors de caràcters utilitzant (==) 308 00:16:05,450 --> 00:16:06,320 tant be. 309 00:16:06,320 --> 00:16:10,994 És un tipus especial de constant valor que es pot utilitzar per provar. 310 00:16:10,994 --> 00:16:13,160 Així que va ser una molt simple punter, el punter nul. 311 00:16:13,160 --> 00:16:15,320 Una altra manera de crear un punter és extreure 312 00:16:15,320 --> 00:16:18,240 la direcció d'una variable ja ha creat, 313 00:16:18,240 --> 00:16:22,330 i ho fa utilitzant la I extracció direcció de l'operador. 314 00:16:22,330 --> 00:16:26,720 Que ja hem vist amb anterioritat en el primer exemple diagrama vaig mostrar. 315 00:16:26,720 --> 00:16:31,450 Així que si x és una variable que hem ja creat de tipus sencer, 316 00:16:31,450 --> 00:16:35,110 a continuació, i x és un punter a un enter. 317 00:16:35,110 --> 00:16:39,810 i x es- recorden, i es va a extreure la direcció de la cosa a la dreta. 318 00:16:39,810 --> 00:16:45,350 I ja que un punter és només una direcció, que i x és un punter a un enter 319 00:16:45,350 --> 00:16:48,560 el valor és on en la memòria x vides. 320 00:16:48,560 --> 00:16:50,460 És l'adreça de x. 321 00:16:50,460 --> 00:16:53,296 Així i x és la direcció de x. 322 00:16:53,296 --> 00:16:55,670 Fem un pas més enllà i connectar a alguna cosa 323 00:16:55,670 --> 00:16:58,380 He al·ludit en un vídeo anterior. 324 00:16:58,380 --> 00:17:06,730 Si arr és una matriu de dobles, a continuació, i claudàtor arr i és un punter 325 00:17:06,730 --> 00:17:08,109 a una doble. 326 00:17:08,109 --> 00:17:08,970 D'ACORD. 327 00:17:08,970 --> 00:17:12,160 arr claudàtor i, si arr és una matriu de dobles, 328 00:17:12,160 --> 00:17:19,069 després arr claudàtor i és l'element i d'aquesta matriu, 329 00:17:19,069 --> 00:17:29,270 i I arr claudàtor i és on en existeix l'element i de arr memòria. 330 00:17:29,270 --> 00:17:31,790 >> Quina és la implicació aquí? 331 00:17:31,790 --> 00:17:34,570 Un nom de matrius, la implicació de tot aquest assumpte, 332 00:17:34,570 --> 00:17:39,290 és que el nom d'una matriu és en realitat si mateix un punter. 333 00:17:39,290 --> 00:17:41,170 Vostè ha estat treballant amb punters al llarg 334 00:17:41,170 --> 00:17:45,290 cada vegada que vostè ha utilitzat una matriu. 335 00:17:45,290 --> 00:17:49,090 Recordeu l'exemple l'àmbit de les variables, 336 00:17:49,090 --> 00:17:53,420 prop del final del vídeo que presento un exemple en el qual tenim una funció 337 00:17:53,420 --> 00:17:56,890 anomenada int setembre i un funció anomenada matriu de conjunts. 338 00:17:56,890 --> 00:18:00,490 I el seu repte per determinar si o no, o el que el 339 00:18:00,490 --> 00:18:03,220 valors que imprimeix al final de la funció, 340 00:18:03,220 --> 00:18:05,960 al final del programa principal. 341 00:18:05,960 --> 00:18:08,740 >> Si vostè recorda d'aquest exemple o si has vist el vídeo, 342 00:18:08,740 --> 00:18:13,080 vostè sap que quan tu- la crida a conjunt int fa efectivament res. 343 00:18:13,080 --> 00:18:16,390 Però la crida per establir matriu fa. 344 00:18:16,390 --> 00:18:19,280 I en certa manera em va passar per alt per què aquest va ser el cas en el moment. 345 00:18:19,280 --> 00:18:22,363 Que acabo de dir, així que és una matriu, que és especial, ja saps, hi ha una raó. 346 00:18:22,363 --> 00:18:25,020 La raó és que una matriu de nom és en realitat només un punter, 347 00:18:25,020 --> 00:18:28,740 i hi ha aquest especial sintaxi de claudàtor que 348 00:18:28,740 --> 00:18:30,510 fer les coses molt més agradable per treballar. 349 00:18:30,510 --> 00:18:34,410 I fan la idea d'un punter molt menys intimidant, 350 00:18:34,410 --> 00:18:36,800 i és per això que són una espècie de presentat d'aquesta manera. 351 00:18:36,800 --> 00:18:38,600 Però en realitat les matrius són punters. 352 00:18:38,600 --> 00:18:41,580 I per això quan ens fet un canvi en la matriu, 353 00:18:41,580 --> 00:18:44,880 quan vam passar una matriu com un paràmetre a una funció o com un argument 354 00:18:44,880 --> 00:18:50,110 a una funció, el contingut de la matriu en realitat canviat tant en el destinatari de la trucada 355 00:18:50,110 --> 00:18:51,160 i en la persona que truca. 356 00:18:51,160 --> 00:18:55,846 El que per a qualsevol altre tipus de variables que vam veure no va ser el cas. 357 00:18:55,846 --> 00:18:58,970 Així que això és una cosa a tenir en ment quan es treballa amb punters, 358 00:18:58,970 --> 00:19:01,610 és que el nom d'un array en realitat un punter 359 00:19:01,610 --> 00:19:04,750 al primer element de la matriu. 360 00:19:04,750 --> 00:19:08,930 >> Acceptar el que ara tenim tots aquests fets, seguirem endavant, a la dreta. 361 00:19:08,930 --> 00:19:11,370 Per què ens preocupem on alguna cosa viu. 362 00:19:11,370 --> 00:19:14,120 Bé, com he dit, és bastant útil saber on alguna cosa viu 363 00:19:14,120 --> 00:19:17,240 pel que pot anar-hi i canviar-lo. 364 00:19:17,240 --> 00:19:19,390 Treballar amb ell i, de fet tenir la cosa que vostè 365 00:19:19,390 --> 00:19:23,710 vol fer en aquest sentit pren variables, i no prendre efecte en alguna còpia. 366 00:19:23,710 --> 00:19:26,150 Això es diu eliminació de referències. 367 00:19:26,150 --> 00:19:28,690 Ens anem a la referència i canviem el valor allà. 368 00:19:28,690 --> 00:19:32,660 Així que si tenim un punter i es diu pc, i apunta a un personatge, 369 00:19:32,660 --> 00:19:40,610 llavors podem dir * * PC i PC és el nom del que trobarem si anem 370 00:19:40,610 --> 00:19:42,910 a la direcció de PC. 371 00:19:42,910 --> 00:19:47,860 Què trobarem que hi ha un personatge i * PC és com ens referim a les dades en aquest 372 00:19:47,860 --> 00:19:48,880 ubicació. 373 00:19:48,880 --> 00:19:54,150 Així que podríem dir alguna cosa com * Pc = D o alguna cosa per l'estil, 374 00:19:54,150 --> 00:19:59,280 i això vol dir que tot el que va ser en memòria d'adreces de PC, 375 00:19:59,280 --> 00:20:07,040 qualsevol caràcter era prèviament allà, ara és D, si diem * pc = D. 376 00:20:07,040 --> 00:20:10,090 >> Així que aquí anem de nou amb algunes coses rares C, dreta. 377 00:20:10,090 --> 00:20:14,560 Així que hem vist anteriorment com * d'alguna manera part del tipus de dades, 378 00:20:14,560 --> 00:20:17,160 i ara s'està utilitzant en un context lleugerament diferent 379 00:20:17,160 --> 00:20:19,605 per accedir a les dades en una ubicació. 380 00:20:19,605 --> 00:20:22,480 Sé que és una mica confús i això és en realitat part d'aquest tot 381 00:20:22,480 --> 00:20:25,740 de la mateixa manera que, per què punters tenen aquesta mitologia al voltant d'ells per ser tan complex, 382 00:20:25,740 --> 00:20:28,250 és una espècie de problema de sintaxi, la veritat. 383 00:20:28,250 --> 00:20:31,810 Però * s'utilitza en ambdós contextos, tant com a part del nom de tipus, 384 00:20:31,810 --> 00:20:34,100 i anem a veure una mica una mica més tard la resta, també. 385 00:20:34,100 --> 00:20:36,490 I ara mateix és el operador d'eliminar la referència. 386 00:20:36,490 --> 00:20:38,760 Així que va a la referència, s'accedeix a les dades 387 00:20:38,760 --> 00:20:43,000 en la ubicació del punter, i li permet manipular a voluntat. 388 00:20:43,000 --> 00:20:45,900 >> Ara bé, això és molt similar a visitar al seu veí, a la dreta. 389 00:20:45,900 --> 00:20:48,710 Si vostè sap el que el seu veí viu, vostè és 390 00:20:48,710 --> 00:20:50,730 no sortir amb el seu veí. 391 00:20:50,730 --> 00:20:53,510 Vostè sap vostè passa saber on viuen, 392 00:20:53,510 --> 00:20:56,870 però això no vol dir que per virtut de tenir aquest coneixement 393 00:20:56,870 --> 00:20:59,170 està interactuant amb ells. 394 00:20:59,170 --> 00:21:01,920 Si voleu interactuar amb ells, vostè ha d'anar a casa seva, 395 00:21:01,920 --> 00:21:03,760 has d'anar a on viuen. 396 00:21:03,760 --> 00:21:07,440 I una vegada que ho fas, llavors vostè pot interactuar 397 00:21:07,440 --> 00:21:09,420 amb ells igual que voldries. 398 00:21:09,420 --> 00:21:12,730 I de manera similar amb les variables, has d'anar al seu domicili 399 00:21:12,730 --> 00:21:15,320 si vols interactuar ells, un no pot saber la direcció. 400 00:21:15,320 --> 00:21:21,495 I la manera d'anar a l'adreça és d'usar *, l'operador eliminar la referència. 401 00:21:21,495 --> 00:21:23,620 Què creus que passa si tractem d'eliminar la referència 402 00:21:23,620 --> 00:21:25,260 un punter el valor és nul? 403 00:21:25,260 --> 00:21:28,470 Recordem que la hipòtesi nul·la punter apunta a res. 404 00:21:28,470 --> 00:21:34,110 Així que si vostè tracta d'eliminar la referència res o anar a una adreça de res, 405 00:21:34,110 --> 00:21:36,800 ¿Què creus que passa? 406 00:21:36,800 --> 00:21:39,630 Segmentació Bé, si vostè ho va endevinar culpa, estaríem en la veritat. 407 00:21:39,630 --> 00:21:41,390 Si tractes d'eliminar la referència un punter nul, 408 00:21:41,390 --> 00:21:43,140 vostè pateix una segmentació criticar. Però espera, 409 00:21:43,140 --> 00:21:45,820 No et dic, que si no vas 410 00:21:45,820 --> 00:21:49,220 per establir el seu valor del seu Punter a alguna cosa significatiu, 411 00:21:49,220 --> 00:21:51,000 d'establir en nul? 412 00:21:51,000 --> 00:21:55,290 Ho vaig fer i realment la segmentació culpa és una espècie de bon comportament. 413 00:21:55,290 --> 00:21:58,680 >> Alguna vegada ha declarat una variable i No assignat el seu valor immediatament? 414 00:21:58,680 --> 00:22:02,680 Així que vostè acaba de dir int x; no ho fa realitat assignar-la a res 415 00:22:02,680 --> 00:22:05,340 i més tard en el seu codi, imprimeixi el valor de x, 416 00:22:05,340 --> 00:22:07,650 Encara no tenir és assignat a res. 417 00:22:07,650 --> 00:22:10,370 Freqüents que obtindrà zero, però de vegades 418 00:22:10,370 --> 00:22:15,000 podria aconseguir alguna cosa de nombres aleatoris, i vostè no té idea d'on vi. 419 00:22:15,000 --> 00:22:16,750 De la mateixa manera pot coses passar amb punters. 420 00:22:16,750 --> 00:22:20,110 Quan es declara un punter int * pk per exemple, 421 00:22:20,110 --> 00:22:23,490 i no s'assigna a un valor, vostè aconsegueix quatre octets per a la memòria. 422 00:22:23,490 --> 00:22:25,950 Qualssevol que siguin quatre octets de la memòria del sistema pot 423 00:22:25,950 --> 00:22:28,970 trobar que tenen algun valor significatiu. 424 00:22:28,970 --> 00:22:31,760 I podria haver hagut cosa que ja existeix que 425 00:22:31,760 --> 00:22:34,190 ja no és necessària per un altre funció, de manera que només té 426 00:22:34,190 --> 00:22:35,900 totes les dades que hi era. 427 00:22:35,900 --> 00:22:40,570 >> El que si es va tractar de fer dereference alguna adreça que no- havia 428 00:22:40,570 --> 00:22:43,410 ja bytes i informació en allà, això és ara al punter. 429 00:22:43,410 --> 00:22:47,470 Si tractes d'eliminar la referència d'aquest punter, vostè podria estar ficant amb una mica de memòria 430 00:22:47,470 --> 00:22:49,390 que no tenia intenció ficar-se amb tot. 431 00:22:49,390 --> 00:22:51,639 I, de fet, vostè podria fer alguna cosa realment devastador, 432 00:22:51,639 --> 00:22:54,880 com trencar un altre programa, o trencar una altra funció, 433 00:22:54,880 --> 00:22:58,289 o fer alguna cosa maliciós que que no té la intenció de fer-ho en absolut. 434 00:22:58,289 --> 00:23:00,080 I per això és realment una bona idea 435 00:23:00,080 --> 00:23:04,030 per establir els seus punters a null si no els estableix en alguna cosa significatiu. 436 00:23:04,030 --> 00:23:06,760 És probablement millor en el final del dia per al seu programa 437 00:23:06,760 --> 00:23:09,840 a estavellar a continuació perquè ho faci cosa que fica la pota 438 00:23:09,840 --> 00:23:12,400 altre programa o una altra funció. 439 00:23:12,400 --> 00:23:15,207 Aquest comportament és probablement encara menys ideal que només estavellar-se. 440 00:23:15,207 --> 00:23:17,040 I per això és en realitat un bon hàbit 441 00:23:17,040 --> 00:23:20,920 per entrar en establir les seves punters null si no s'estableix que 442 00:23:20,920 --> 00:23:24,540 a un valor significatiu immediatament, un valor que vostè sap 443 00:23:24,540 --> 00:23:27,260 i que vostè pot de manera segura en eliminar la referència. 444 00:23:27,260 --> 00:23:32,240 >> Així que tornem ara i fer una ullada en la sintaxi general de la situació. 445 00:23:32,240 --> 00:23:37,400 Si dic int * p;, el que he acabo de fer? 446 00:23:37,400 --> 00:23:38,530 El que he fet és això. 447 00:23:38,530 --> 00:23:43,290 Sé que el valor de p és una adreça perquè tots els indicadors són només 448 00:23:43,290 --> 00:23:44,660 direccions. 449 00:23:44,660 --> 00:23:47,750 Puc eliminar la referència p usant l'operador *. 450 00:23:47,750 --> 00:23:51,250 En aquest context aquí, al molt superior recordar la * forma part del tipus. 451 00:23:51,250 --> 00:23:53,510 Int * és el tipus de dades. 452 00:23:53,510 --> 00:23:56,150 Però no puc eliminar la referència p usant l'operador *, 453 00:23:56,150 --> 00:24:01,897 i si ho faig, si em vaig a aquesta direcció, el que vaig a trobar en aquesta direcció? 454 00:24:01,897 --> 00:24:02,855 Vaig a trobar un enter. 455 00:24:02,855 --> 00:24:05,910 Així int * p és bàsicament dient: p és una direcció. 456 00:24:05,910 --> 00:24:09,500 Puc eliminar la referència p i si Ho faig, vaig a trobar un enter 457 00:24:09,500 --> 00:24:11,920 en aquesta ubicació de memòria. 458 00:24:11,920 --> 00:24:14,260 >> OK, així que va dir que hi havia un altre cosa molesta amb les estrelles 459 00:24:14,260 --> 00:24:17,060 i aquí és on que cosa molesta amb les estrelles és. 460 00:24:17,060 --> 00:24:21,640 Alguna vegada ha tractat de declarar múltiples variables del mateix tipus 461 00:24:21,640 --> 00:24:24,409 en la mateixa línia de codi? 462 00:24:24,409 --> 00:24:27,700 Així que per un segon, pretendre que la línia, el codi realitat hi tinc en verd 463 00:24:27,700 --> 00:24:29,366 No hi és i només diu int x, i, z;. 464 00:24:29,366 --> 00:24:31,634 465 00:24:31,634 --> 00:24:34,550 El que faria és en realitat crear 3 variables senceres per a vostè, 466 00:24:34,550 --> 00:24:36,930 un anomenat x, un anomenat i, i un anomenat z. 467 00:24:36,930 --> 00:24:41,510 És una manera de fer-ho sense haver de dividir en tres línies. 468 00:24:41,510 --> 00:24:43,890 >> Aquí és on les estrelles obtenen molest altra vegada però, 469 00:24:43,890 --> 00:24:49,200 perquè el * és en realitat part tant el nom del tipus i part 470 00:24:49,200 --> 00:24:50,320 del nom de la variable. 471 00:24:50,320 --> 00:24:56,430 I pel que si et dic int * px, py, pz, el que aconseguir realment és un punter a un enter 472 00:24:56,430 --> 00:25:01,650 anomenat px i dos nombres enters, p i i pl. 473 00:25:01,650 --> 00:25:04,950 I això probablement no ho és que volem, això no és bo. 474 00:25:04,950 --> 00:25:09,290 >> Així que si vull crear múltiples punters en la mateixa línia, del mateix tipus, 475 00:25:09,290 --> 00:25:12,140 i les estrelles, el que realment necessita de fer és dir int * pa, * pb, * pc. 476 00:25:12,140 --> 00:25:17,330 477 00:25:17,330 --> 00:25:20,300 Ara que acaba de dir que i ara vostè està dient, 478 00:25:20,300 --> 00:25:22,170 vostè probablement mai va a fer això. 479 00:25:22,170 --> 00:25:25,170 I és probablement una bona cosa, sincerament, perquè és possible que inadvertidament 480 00:25:25,170 --> 00:25:26,544 ometre una estrella, una cosa així. 481 00:25:26,544 --> 00:25:29,290 És probablement el millor per declarar potser indicacions sobre les línies individuals, 482 00:25:29,290 --> 00:25:31,373 però és només un altre dels sintaxi molest 483 00:25:31,373 --> 00:25:35,310 coses amb les estrelles que fan punters tan difícil de treballar. 484 00:25:35,310 --> 00:25:39,480 Perquè és precisament aquesta sintàctica embolic que ha de treballar a través. 485 00:25:39,480 --> 00:25:41,600 Amb la pràctica ho fa realment convertit en una segona naturalesa. 486 00:25:41,600 --> 00:25:45,410 Encara cometo errors amb ell encara després de la programació durant 10 anys, 487 00:25:45,410 --> 00:25:49,630 així que no us preocupeu si passa alguna cosa a vostè, que és bastant comú amb honestedat. 488 00:25:49,630 --> 00:25:52,850 És molt amable de un defecte de la sintaxi. 489 00:25:52,850 --> 00:25:54,900 >> Acceptar així que tipus de prometre que anàvem a tornar 490 00:25:54,900 --> 00:25:59,370 el concepte de què tan gran és una cadena. 491 00:25:59,370 --> 00:26:02,750 Bé si et digués que un cadena, tenim molt amable de 492 00:26:02,750 --> 00:26:04,140 estat mentint tot el temps. 493 00:26:04,140 --> 00:26:06,181 No hi ha cap tipus de dades anomenat cadena, i de fet 494 00:26:06,181 --> 00:26:09,730 esmentat això en una de les nostres primers vídeos sobre tipus de dades, 495 00:26:09,730 --> 00:26:13,820 aquesta cadena era un tipus de dades que va ser creat per vostè en CS50.h. 496 00:26:13,820 --> 00:26:17,050 Has de #include CS50.h per tal d'usar-lo. 497 00:26:17,050 --> 00:26:19,250 >> Bé cadena és realment només un àlies per a alguna cosa 498 00:26:19,250 --> 00:26:23,600 anomenat el char *, 1 Punter a un personatge. 499 00:26:23,600 --> 00:26:26,010 Bé punters, el record, són només aborda. 500 00:26:26,010 --> 00:26:28,780 Llavors, quin és la mida en bytes d'una cadena? 501 00:26:28,780 --> 00:26:29,796 Bé, és de quatre o vuit. 502 00:26:29,796 --> 00:26:32,170 I la raó per la qual dir quatre o vuit és perquè en realitat 503 00:26:32,170 --> 00:26:36,730 depèn del sistema, Si utilitzeu Ide CS50, char * és la mida d'un char 504 00:26:36,730 --> 00:26:39,340 * És de vuit, que és un sistema de 64 bits. 505 00:26:39,340 --> 00:26:43,850 Cada direcció a la memòria és de 64 bits de longitud. 506 00:26:43,850 --> 00:26:48,270 Si utilitzes aparell CS50 o l'ús de qualsevol màquina de 32 bits, 507 00:26:48,270 --> 00:26:51,640 i vostè ha sentit aquest terme de 32 bits màquina, el que és una màquina de 32 bits? 508 00:26:51,640 --> 00:26:56,090 Bé, només dir que cada direcció a la memòria és de 32 bits de longitud. 509 00:26:56,090 --> 00:26:59,140 I així 32 bits és de quatre bytes. 510 00:26:59,140 --> 00:27:02,710 Així que un char * és de quatre o vuit bytes en funció del sistema. 511 00:27:02,710 --> 00:27:06,100 I de fet qualsevol tipus de dades, i un punter a les dades 512 00:27:06,100 --> 00:27:12,030 escrigui, ja que tots els punters són només direccions, quatre o vuit bytes. 513 00:27:12,030 --> 00:27:14,030 Així que anem a revisar aquest Diagrama i arribarem a la conclusió 514 00:27:14,030 --> 00:27:18,130 aquest vídeo amb una mica d'exercici aquí. 515 00:27:18,130 --> 00:27:21,600 Així que aquí està el diagrama ho deixem amb en el començament del vídeo. 516 00:27:21,600 --> 00:27:23,110 Llavors, què passa ara si dic * pk = 35? 517 00:27:23,110 --> 00:27:26,370 518 00:27:26,370 --> 00:27:30,530 Així que, què vol dir quan dic, * pk = 35? 519 00:27:30,530 --> 00:27:32,420 Tome un segon. 520 00:27:32,420 --> 00:27:34,990 * Pk. 521 00:27:34,990 --> 00:27:39,890 En el context aquí, * és operador d'eliminar la referència. 522 00:27:39,890 --> 00:27:42,110 Així que quan el dereference s'utilitza operador, 523 00:27:42,110 --> 00:27:48,520 anem a l'adreça apuntada per pk i canviem el que trobem. 524 00:27:48,520 --> 00:27:55,270 Així * pk = 35 amb eficàcia Fa això a la imatge. 525 00:27:55,270 --> 00:27:58,110 Així que és bàsicament sintàcticament idèntic al d'haver dit k = 35. 526 00:27:58,110 --> 00:28:00,740 527 00:28:00,740 --> 00:28:01,930 >> Un més. 528 00:28:01,930 --> 00:28:05,510 Si dic int m, crec una nova variable anomenada m. 529 00:28:05,510 --> 00:28:08,260 Una nova caixa, que és una caixa verda perquè que contindrà un nombre sencer, 530 00:28:08,260 --> 00:28:09,840 i està etiquetada m. 531 00:28:09,840 --> 00:28:14,960 Si dic m = 4, vaig posar un sencer en aquesta caixa. 532 00:28:14,960 --> 00:28:20,290 Si per exemple pk = & m, com ho fa aquest canvi diagrama? 533 00:28:20,290 --> 00:28:28,760 Pk = & m, recorda el que el I l'operador fa o es diu? 534 00:28:28,760 --> 00:28:34,430 Recordeu que i algun nom de variable és l'adreça d'un nom de variable. 535 00:28:34,430 --> 00:28:38,740 Així que el que estem dient és pk obté la direcció del m. 536 00:28:38,740 --> 00:28:42,010 I així efectivament el que passa el diagrama és que ja no pk punts 537 00:28:42,010 --> 00:28:46,420 k, però apunta m. 538 00:28:46,420 --> 00:28:48,470 >> Un cop més punters són molt difícil de treballar amb 539 00:28:48,470 --> 00:28:50,620 i prenen una gran quantitat de pràctica, sinó perquè 540 00:28:50,620 --> 00:28:54,150 de la seva capacitat de permetre que per passar les dades entre les funcions 541 00:28:54,150 --> 00:28:56,945 i en realitat tenen els els canvis tinguin efecte, 542 00:28:56,945 --> 00:28:58,820 aconseguir el seu cap al voltant que és realment important. 543 00:28:58,820 --> 00:29:02,590 És probablement el més complicat tema es discuteix en el CS50, 544 00:29:02,590 --> 00:29:05,910 però el valor que arribar des de l'ús de punters 545 00:29:05,910 --> 00:29:09,200 és molt més gran que les complicacions que provenen de aprendre-les. 546 00:29:09,200 --> 00:29:12,690 Així que li desitjo la millor de sort aprenent sobre punters. 547 00:29:12,690 --> 00:29:15,760 Sóc Doug Lloyd, això és CS50. 548 00:29:15,760 --> 00:29:17,447