1 00:00:00,000 --> 00:00:02,310 [Powered by Google Translate] [Setmana 4, continuació] 2 00:00:02,310 --> 00:00:04,240 [David J. Malan - Harvard University] 3 00:00:04,240 --> 00:00:07,290 [Aquesta és CS50. - CS50.TV] 4 00:00:07,290 --> 00:00:11,290 >> Això és CS50, i aquest és el cap de setmana 4. 5 00:00:11,290 --> 00:00:14,030 Així que una bona notícia i una mala notícia. 6 00:00:14,030 --> 00:00:26,240 No conferència el dilluns, cap problema fixat la setmana. [Estudiants victorejant] 7 00:00:26,240 --> 00:00:28,680 No t'agradarà a on va això. 8 00:00:28,680 --> 00:00:31,590 Però tenim aquest lloc el proper dimecres, 9 00:00:31,590 --> 00:00:37,740 i també hi ha un programa d'estudis per la conferència divendres divendres perquè puguem mantenir el rumb. 10 00:00:37,740 --> 00:00:40,580 Però tot serà filmat, com de costum, pel que no es preocupés. 11 00:00:40,580 --> 00:00:44,100 >> I pel que fa quiz 0 ho que farem a finals de la setmana 12 00:00:44,100 --> 00:00:47,140 es publiqui cs50.net pàgina d'inici del curs una explicació 13 00:00:47,140 --> 00:00:50,160 de quin tipus d'expectatives que vostè ha de tenir quan es tracta de la primera prova. 14 00:00:50,160 --> 00:00:55,100 En general, serà d'opció múltiple, vertader-fals, resposta curta, talla els problemes de codificació. 15 00:00:55,100 --> 00:00:57,360 No va a esperar per posar en pràctica l'equivalent 16 00:00:57,360 --> 00:01:00,030 d'un problema que vostè veuria en un conjunt de processadors, per a això disposa d'un ordinador 17 00:01:00,030 --> 00:01:03,240 i un depurador i similars, però hi haurà petits problemes de codificació. 18 00:01:03,240 --> 00:01:06,900 >> I, en efecte, la millor guia per tenir una idea del que CS50 concursos són com 19 00:01:06,900 --> 00:01:09,180 és anar a cs50.net, aneu al enllaç de concursos, 20 00:01:09,180 --> 00:01:11,920 i es pot veure en els últims anys per valor de concursos. 21 00:01:11,920 --> 00:01:16,600 Només es donen compte que el pla d'estudis no sempre ha estat igual al llarg dels anys. 22 00:01:16,600 --> 00:01:18,510 De vegades s'afegeix, de vegades, restar, 23 00:01:18,510 --> 00:01:20,670 així que si veus algun tema en un d'aquests vells concursos 24 00:01:20,670 --> 00:01:25,380 que vostè no té idea del que està parlant, o és que el cobreixi 25 00:01:25,380 --> 00:01:27,210 o que no ho cobreixi. 26 00:01:27,210 --> 00:01:31,110 Però en la forma d'opinions, aquest diumenge, dilluns i dimarts 27 00:01:31,110 --> 00:01:34,770 així com un curs de tota la sessió de revisió en la nit - 28 00:01:34,770 --> 00:01:37,500 hora i lloc que s'anunciarà a la pàgina principal del curs - 29 00:01:37,500 --> 00:01:40,120 que tots tinguin l'oportunitat de revisar amb companys docents del curs 30 00:01:40,120 --> 00:01:44,830 el material per a aquest any, tant en la secció i com una classe completa, 31 00:01:44,830 --> 00:01:48,400 i els que es filmarà com sempre també. 32 00:01:48,400 --> 00:01:53,380 >> Està bé. Així que sense més preàmbuls, un comentari sobre passa / no passa i add / drop. 33 00:01:53,380 --> 00:01:57,980 És possible que hagi vist els meus notes ahir a la nit, i això és només una mica de tranquil · litat addicional 34 00:01:57,980 --> 00:02:01,250 que si vostè està entre els menys còmodes en particular o en algun punt intermedi 35 00:02:01,250 --> 00:02:04,870 i et sents una mica endins sobre el seu cap, 36 00:02:04,870 --> 00:02:08,430 adonar-se que és de fet bastant normal, i no hi ha una estructura de suport suficient en el lloc, 37 00:02:08,430 --> 00:02:13,530 un dels quals les hores d'oficina tenien la intenció de millorar encara més per l'última nit de correu electrònic, 38 00:02:13,530 --> 00:02:16,520 i adonar-se també que una opció com apte / no apte per a una classe com aquesta 39 00:02:16,520 --> 00:02:21,540 realment s'entén com un mecanisme per prendre la vora d'un curs com aquest, 40 00:02:21,540 --> 00:02:24,200 de manera que de nou si vostè està gastant aquests 10, 15, 20 hores 41 00:02:24,200 --> 00:02:28,160 tractant d'obtenir algun conjunt de processadors per treballar i vostè sap que vostè és el 90-95% del camí 42 00:02:28,160 --> 00:02:32,100 però no es pot trobar algun bug maleït, en un passa / no passa model que és una espècie de bé. 43 00:02:32,100 --> 00:02:36,230 >> La idea és que amb aquest mecanisme es pot anar focus en els seus conjunts de processadors altres 44 00:02:36,230 --> 00:02:39,530 o dormir o el que sigui que vulgui enfocar. 45 00:02:39,530 --> 00:02:43,390 Així que adonar-se que vostè té fins dimarts - tècnicament el cinquè dilluns, 46 00:02:43,390 --> 00:02:50,840 però és un dia de festa, de manera que el dimarts - per canviar de passa / no passa al revés graduades o viceversa. 47 00:02:50,840 --> 00:02:54,450 I si vostè està realment en el precipici i estan pensant a abandonar del tot, 48 00:02:54,450 --> 00:02:56,440 si us plau m'agafa després de la conferència o mándenme una nota. 49 00:02:56,440 --> 00:02:59,990 Ens encantaria que almenys xerrada abans de dir adéu. 50 00:02:59,990 --> 00:03:03,470 Està bé. Així que vam començar a prendre les rodes d'entrenament fos l'última vegada. 51 00:03:03,470 --> 00:03:06,030 En particular, ens centrem en cadena. 52 00:03:06,030 --> 00:03:09,740 La cadena és una cosa que es va declarar a la biblioteca CS50, 53 00:03:09,740 --> 00:03:14,340 específicament en aquest arxiu anomenat cs50.h que començarem a veure aquesta setmana i la propera. 54 00:03:14,340 --> 00:03:17,250 Però la cadena és en realitat una simplificació d'alguna cosa 55 00:03:17,250 --> 00:03:20,980 que és una mica més arcanely descrit com char *. 56 00:03:20,980 --> 00:03:24,090 Xerrada estem familiaritzats. És només un caràcter únic. 57 00:03:24,090 --> 00:03:28,010 Però a partir de dilluns * denota què? >> [Estudiant] Punter. 58 00:03:28,010 --> 00:03:31,290 Un punter. I el que és un punter? >> [Estudiant] Una adreça. 59 00:03:31,290 --> 00:03:33,420 >> És com una adreça, un lloc en la memòria. 60 00:03:33,420 --> 00:03:35,910 Què és una adreça o ubicació o la memòria? 61 00:03:35,910 --> 00:03:40,290 Un cop més, tots nosaltres tenim ordinadors portàtils amb un giga o 2 gigues de RAM més probable és que en aquests dies, 62 00:03:40,290 --> 00:03:44,160 i això vol dir que tens un bilió o 2 mil milions de bytes per valor de memòria. 63 00:03:44,160 --> 00:03:46,240 I no importa el que físicament s'assembla, 64 00:03:46,240 --> 00:03:51,220 però tingues fe que vostè pot comptar tots els bytes individuals que dona el seu ordinador portàtil - 65 00:03:51,220 --> 00:03:54,580 aquest és el byte 0, es tracta d'un byte, aquest és el byte 2000000000 - 66 00:03:54,580 --> 00:03:56,100 i això és exactament el que fa un ordinador. 67 00:03:56,100 --> 00:04:00,030 En assignar espai per a un sol caràcter, per exemple, 68 00:04:00,030 --> 00:04:02,480 és obvi que ha de viure en algun lloc de la memòria de l'ordinador, 69 00:04:02,480 --> 00:04:05,860 i potser és en el byte nombre 12345, 70 00:04:05,860 --> 00:04:08,470 i que en algun lloc aquí a la memòria del seu ordinador. 71 00:04:08,470 --> 00:04:12,630 I a continuació, la direcció d'aquest caràcter és 12345. 72 00:04:12,630 --> 00:04:16,140 >> Ara, en la setmana 0 i ara fins ara, no hem atès 73 00:04:16,140 --> 00:04:19,170 on en les coses de memòria s'emmagatzemen ja que en general utilitzen símbols, 74 00:04:19,170 --> 00:04:22,540 variables i matrius per aconseguir realment a les nostres dades. 75 00:04:22,540 --> 00:04:24,950 Però a partir de dilluns i tot el dia d'avui més, vostè està ara tindrà 76 00:04:24,950 --> 00:04:27,710 totes les capacitats més expressius amb els programes d'escriptura 77 00:04:27,710 --> 00:04:31,330 per manipular realment la memòria d'un ordinador però li sembli, 78 00:04:31,330 --> 00:04:33,720 tant per a fins bons i dolents, 79 00:04:33,720 --> 00:04:39,620 errors és un resultat molt comú en aquest punt en l'aprenentatge d'aquesta matèria. 80 00:04:39,620 --> 00:04:42,460 Però, què és el que realment significa ser un char *? 81 00:04:42,460 --> 00:04:46,140 Seguirem endavant cap enrere - i tornarem a Binky com va prometre avui. 82 00:04:46,140 --> 00:04:48,670 Anem a un exemple simple aquí. 83 00:04:48,670 --> 00:04:53,060 Deixa desar aquest fitxer compare.c, i em van deixar d'aconseguir una mica de codi de plantilla aquí 84 00:04:53,060 --> 00:05:00,490 així com stdio.h, permetin-me donar-me inclouen cs50.h. Vaig a acostar-hi. 85 00:05:00,490 --> 00:05:05,850 Permetin-me començar a escriure int main, main (void), i ara vull fer alguna cosa com això: 86 00:05:05,850 --> 00:05:13,520 printf ("Dóna'm una cadena:") i després vaig a utilitzar la cadena s es GetString 87 00:05:13,520 --> 00:05:16,750 per obtenir una cadena per part de l'usuari, i després em vaig a preguntar a l'usuari de l'altra. 88 00:05:16,750 --> 00:05:21,870 ("Dóna'm una altra cadena:") i vaig a preguntar per GetString per aconseguir això. 89 00:05:21,870 --> 00:05:27,020 Vaig a trucar a t t perquè ve després de s i s és un bonic nom per a una cadena si és bastant genèric. 90 00:05:27,020 --> 00:05:30,030 Així GetString, i ara només vull fer una comprovació de validesa i jo vaig a dir 91 00:05:30,030 --> 00:05:39,770 if (s == t), llavors jo vaig a dir-li a l'usuari printf ("Vostè escriu el mateix \ n"); 92 00:05:39,770 --> 00:05:45,520 més que vaig a imprimir alguna cosa com ("que ha escrit alguna cosa diferent! \ n") 93 00:05:45,520 --> 00:05:48,460 o qualsevol que sigui la sentència serà. Així que alguna cosa com això. 94 00:05:48,460 --> 00:05:52,200 Llavors, com de costum, vaig a tornar 0, la qual cosa només significava que res dolent ha passat, 95 00:05:52,200 --> 00:05:54,400 i seguiré endavant i compilar i executar aquest programa. 96 00:05:54,400 --> 00:05:56,540 >> Però el dilluns ens trobem amb aquest programa, 97 00:05:56,540 --> 00:06:00,420 i de fet se'ls va dir que no es HOLA hola i adéu no és un adéu. 98 00:06:00,420 --> 00:06:03,140 El comportament que vam veure va ser una mica més d'aquesta manera. 99 00:06:03,140 --> 00:06:11,450 Deixa anar al meu directori de les fonts, zoom aquí, i compararem fan. 100 00:06:11,450 --> 00:06:14,570 Compilat bé. Deixa córrer comparar. Dóna'm una cadena: HOLA. 101 00:06:14,570 --> 00:06:16,300 Dóna'm una altra cadena: HOLA. 102 00:06:16,300 --> 00:06:18,000 Ha escrit alguna cosa diferent! 103 00:06:18,000 --> 00:06:22,650 Bé, vaig a tractar d'alguna cosa més simple com 50, 50. Ha escrit alguna cosa diferent! 104 00:06:22,650 --> 00:06:25,740 hi, hi. Així que, clarament, alguna cosa està passant aquí. 105 00:06:25,740 --> 00:06:28,440 Però quina era l'explicació de per què? 106 00:06:28,440 --> 00:06:33,850 Pel que sembla, la línia 12 és completament disfuncional. 107 00:06:34,300 --> 00:06:39,430 Quin és el problema fonamental aquí? Si. >> [Estudiant] Es comparen les adreces. 108 00:06:39,430 --> 00:06:41,850 Sí, exactament. De fet, és la comparació de les adreces 109 00:06:41,850 --> 00:06:44,580 en el qual HOLA HOLA i s'emmagatzemen. 110 00:06:44,580 --> 00:06:48,290 No és comparar les cartes HOLA una i altra vegada, 111 00:06:48,290 --> 00:06:52,370 perquè el que realment va passar, tot aquest temps que hem estat usant GetString - 112 00:06:52,370 --> 00:06:56,130 Aquesta pissarra és de nou la memòria del nostre ordinador, 113 00:06:56,130 --> 00:07:00,100 i diguem que jo anomeno GetString després de declarar una variable s. 114 00:07:00,100 --> 00:07:01,930 Què fa la meva memòria sembla? 115 00:07:01,930 --> 00:07:07,070 Anem a dir que arbitràriament es són aquestes. És un quadrat. 116 00:07:07,070 --> 00:07:09,040 I gairebé tot el temps que he dibuixat un tros de la memòria a la pantalla 117 00:07:09,040 --> 00:07:12,860 si és de 32 bits que he estat dibuixant quadres com aquest perquè de fet en l'aparell, 118 00:07:12,860 --> 00:07:17,380 un punter, una adreça, és de 32 bits. És el mateix que un int. 119 00:07:17,380 --> 00:07:19,420 Això pot variar basat en el sistema informàtic. 120 00:07:19,420 --> 00:07:24,630 Aquells de vostès que són vagament familiaritzat amb el fet que el teu Mac o PC és de 64 bits, 121 00:07:24,630 --> 00:07:28,120 que en realitat vol dir que l'equip està utilitzant punters de 64 bits, 122 00:07:28,120 --> 00:07:33,730 Adreces de 64-bit, i entre els upsides que els equips 123 00:07:33,730 --> 00:07:35,560 RAM pot tenir molt més que abans. 124 00:07:35,560 --> 00:07:39,240 Llarga història curta, de tornada al dia en què els ordinadors només utilitzen 32 bits 125 00:07:39,240 --> 00:07:42,740 per representar adreces, el major nombre de bytes que pot representar 126 00:07:42,740 --> 00:07:46,280 en aquest cas era el que si vostè té 32 bits? 127 00:07:46,280 --> 00:07:49,590 Així que 4 mil milions, a la dreta, ja que 2 dels 32 és de 4 milions de dòlars. 128 00:07:49,590 --> 00:07:51,370 Aquest número ha estat recurrent al curs. 129 00:07:51,370 --> 00:07:55,240 >> Així que si vostè només té 32 bits, el nombre més alt que es pot comptar fins és aproximadament 4 mil milions. 130 00:07:55,240 --> 00:07:58,750 Però això era una limitació fonamental dels ordinadors fins fa uns anys 131 00:07:58,750 --> 00:08:01,180 perquè si només es pot comptar tan alt com 4 mil milions, 132 00:08:01,180 --> 00:08:05,270 no importa si vostè compra 8 gigabytes de RAM i fins a 5 gigabytes de RAM; 133 00:08:05,270 --> 00:08:07,780 no es pot comptar tan alt, de manera que era inútil. 134 00:08:07,780 --> 00:08:11,430 Només es podia accedir als primers 3 o 4 gigabytes de memòria del seu ordinador. 135 00:08:11,430 --> 00:08:14,410 Això és menys d'un problema ara, i vostè pot comprar MacBook Pro i Dells 136 00:08:14,410 --> 00:08:17,680 amb 8 gigabytes de RAM o fins i tot més en aquests dies. 137 00:08:17,680 --> 00:08:24,100 Però si simplement assignar en aquest programa un punter, un punter anomenat s, 138 00:08:24,100 --> 00:08:28,370 que podria tenir aquest aspecte a la pantalla perquè en realitat hem de pelar aquesta capa. 139 00:08:28,370 --> 00:08:33,520 Segueixo dient cadena, però a partir de dilluns, la cadena és realment char *, 140 00:08:33,520 --> 00:08:35,590 la direcció d'algun personatge. 141 00:08:35,590 --> 00:08:39,280 Així que anem a prendre aquesta roda d'entrenament tot i que seguirem utilitzant GetString per ara. 142 00:08:39,280 --> 00:08:42,600 Així que he declarat s, i això és una porció de la memòria, 32 bits. 143 00:08:42,600 --> 00:08:47,370 Què hi ha aquí a la memòria per defecte? >> [Resposta dels estudiants inaudible] 144 00:08:47,370 --> 00:08:50,040 Què és això? >> [Estudiant] escombraries. >> Escombraries. Exactament. 145 00:08:50,040 --> 00:08:54,610 Si el programador no posar un valor en una variable, que sap el que és? 146 00:08:54,610 --> 00:08:57,990 De vegades es té sort i és 0, que és una espècie d'un valor agradable, net defecte, 147 00:08:57,990 --> 00:09:00,310 però com vam veure dilluns, de vegades és una completa tonteria, 148 00:09:00,310 --> 00:09:04,130 un nombre molt gran positiu o negatiu que ve d'on? 149 00:09:05,350 --> 00:09:07,010 Si. >> [Estudiant] La funció anterior. Sí >>. 150 00:09:07,010 --> 00:09:10,170 >> Sovint, la funció que he anomenat abans perquè recordin, 151 00:09:10,170 --> 00:09:13,920 com es diu a funcions de la memòria, que ocupen cada vegada més espai de baix a dalt, 152 00:09:13,920 --> 00:09:17,040 i tan bon punt la funció retorna, que la memòria es reutilitzen 153 00:09:17,040 --> 00:09:20,890 pel tipus del costat que es diu, qui està utilitzant el mateix segment de la memòria. 154 00:09:20,890 --> 00:09:23,450 I si tens escombraries esquerra hi ha, els valors anteriors, 155 00:09:23,450 --> 00:09:28,190 podríem confondre s com tenir algun valor, quan en realitat no hem posat res allà. 156 00:09:28,190 --> 00:09:30,960 Així que la nostra RAM en aquest punt es veu així. 157 00:09:30,960 --> 00:09:36,030 Ara, al costat dret de la línia 7 que anomenem GetString, 158 00:09:36,030 --> 00:09:40,150 que hem estat fent durant setmanes ara, però el que realment GetString fent? 159 00:09:40,150 --> 00:09:43,350 GetString escrit per membres CS50 és una mica intel · ligent 160 00:09:43,350 --> 00:09:46,500 en què tan aviat com l'usuari inicia premen tecles i parada Intro, 161 00:09:46,500 --> 00:09:50,010 GetString s'adona de com les pulsacions de tecles molts van fer el hit d'usuari, 162 00:09:50,010 --> 00:09:53,360 nombre de caràcters que he de assignarà memòria RAM. 163 00:09:53,360 --> 00:09:55,660 I on RAM que ve, qui sap? 164 00:09:55,660 --> 00:09:58,930 Està en algun lloc de 2 gigabytes del seu ordinador o el que sigui de la memòria. 165 00:09:58,930 --> 00:10:05,200 Però anem a suposar que l'equip va trobar espai per a la paraula HOLA aquí. 166 00:10:05,200 --> 00:10:08,710 La paraula que vaig escriure va ser H-E-L-L-O. 167 00:10:08,710 --> 00:10:13,510 I si traiem això com una seqüència de caràcters, podríem dir així. 168 00:10:13,510 --> 00:10:17,860 Però he de fer una cosa més. El que pertany al final de qualsevol cadena en C? 169 00:10:17,860 --> 00:10:20,710 El caràcter nul, el que s'escriu com \ 0. 170 00:10:20,710 --> 00:10:23,980 És tècnicament el nombre 0, però la barra invertida fa tot més clar 171 00:10:23,980 --> 00:10:28,150 que això és literalment el número 0, el nombre enter 0; 172 00:10:28,150 --> 00:10:32,440 no ho és, per exemple, entre cometes 0 que podria escriure en el teclat. 173 00:10:32,440 --> 00:10:33,940 Així que això és HELLO. 174 00:10:33,940 --> 00:10:36,350 >> I què podem dir avui que una funció com GetString 175 00:10:36,350 --> 00:10:39,580 en realitat està tornant totes aquestes setmanes? 176 00:10:39,580 --> 00:10:43,960 No està tornant una cadena de per si, ja que en realitat no tenen significat 177 00:10:43,960 --> 00:10:47,710 perquè les cadenes no existeixen. Són una espècie d'una fabricació a la biblioteca CS50. 178 00:10:47,710 --> 00:10:51,300 El que és realment una cadena, més tècnicament? >> [Estudiant] És el primer caràcter. 179 00:10:51,300 --> 00:10:55,950 Exactament. És, senzillament, la direcció del primer caràcter que l'usuari va escriure polz 180 00:10:55,950 --> 00:11:02,810 Així que si la meva paraula HOLA acaba en 123 el nombre de bytes i després en el byte número 124, 181 00:11:02,810 --> 00:11:08,320 125, 126, i així successivament, si només el meu número de bytes en un màxim de 0, 182 00:11:08,320 --> 00:11:12,650 el que realment està tornant GetString és, literalment, el número 123. 183 00:11:12,650 --> 00:11:19,270 Així que el que es posa en s és el nombre 123, no la lletra H, no la paraula HOLA, 184 00:11:19,270 --> 00:11:23,130 senzillament, la direcció en la que puc trobar la primera lletra de HELLO. 185 00:11:23,130 --> 00:11:26,500 Però això no sembla ser suficient. Et vaig demanar una cadena, no un personatge. 186 00:11:26,500 --> 00:11:32,970 Llavors, com sap l'ordinador o quin tipus d'AIXÒ vénen juntament amb la H? 187 00:11:35,760 --> 00:11:37,460 Quin és el tipus d'acord que tenim? Si. 188 00:11:37,460 --> 00:11:40,100 [Estudiant] Se segueix dient si mateix per trobar alguns personatges més. >> Exactament. 189 00:11:40,100 --> 00:11:44,570 >> Hi ha una convenció persona-ordinador de manera que quan es tracta de cadenes, 190 00:11:44,570 --> 00:11:49,410 també coneguda ara com estrelles char, simplement has de saber 191 00:11:49,410 --> 00:11:54,350 on al final de cada cadena a la vida és realment només iterar sobre ella amb un bucle for, 192 00:11:54,350 --> 00:11:57,820 un bucle while, el que sigui, perquè quan trobi el final de la cadena 193 00:11:57,820 --> 00:12:02,160 ara es pot inferir d'això, oh, tota la paraula era HELLO. 194 00:12:02,160 --> 00:12:04,820 Aquells de vostès que tenen experiència prèvia en programació pot saber en Java 195 00:12:04,820 --> 00:12:09,880 vostè pot trucar. longitud i en altres idiomes es pot trucar a la longitud o similar. 196 00:12:09,880 --> 00:12:14,060 Això és perquè en una gran quantitat d'idiomes, sobretot coses que es diuen llenguatges orientats a objectes, 197 00:12:14,060 --> 00:12:18,580 la longitud d'alguna cosa és de tipus encapsulat dins de la peça de dades en si, 198 00:12:18,580 --> 00:12:24,000 molt semblant a nosaltres, els ID i noms encapsulats i cases a l'interior d'un estudiant dilluns. 199 00:12:24,000 --> 00:12:28,700 No obstant això, C és el nivell molt més baix. No hi ha objectes o classes, si has escoltat aquests termes abans. 200 00:12:28,700 --> 00:12:31,490 Tot el que tens és realment adreces de memòria. 201 00:12:31,490 --> 00:12:35,540 Així que això és una espècie de la manera tradicional de representar les estructures de dades interessants. 202 00:12:35,540 --> 00:12:38,760 Té un valor d'inici com la direcció del primer caràcter 203 00:12:38,760 --> 00:12:42,340 i després només una convenció arbitrària que tothom està d'acord en seguir. 204 00:12:42,340 --> 00:12:46,420 Llavors, com s'implementa longitud de la cadena, el que proposem? 205 00:12:46,420 --> 00:12:51,360 Strlen, strlen, que alguns de vosaltres heu usat un parell de vegades. És bastant simple, oi? 206 00:12:51,360 --> 00:12:53,060 És com dues línies de codi. 207 00:12:53,060 --> 00:12:56,140 És més o menys un llaç per d'algun tipus, potser amb una variable local addicional. 208 00:12:56,140 --> 00:13:00,540 Però strlen només ha de donar un punter i després començar a buscar \ 0. 209 00:13:00,540 --> 00:13:05,190 >> I tan bon punt el troba, pot tornar el nombre total de passos que ha pres en aquesta cadena. 210 00:13:05,190 --> 00:13:07,150 Així que podem inferir d'això el que passa a continuació. 211 00:13:07,150 --> 00:13:11,850 Suposem llavors declaro t com ho he fet en la línia 10. 212 00:13:11,850 --> 00:13:14,280 Aquest és un valor escombraries. Qui sap al principi? 213 00:13:14,280 --> 00:13:18,490 Però en el costat dret de la línia de 10 Vaig a trucar a GetString nou. 214 00:13:18,490 --> 00:13:20,050 Qui sap on acaba això? 215 00:13:20,050 --> 00:13:23,830 Anem a dir arbitràriament que el sistema operatiu s'ha trobat lloc per a ell fins aquí. 216 00:13:23,830 --> 00:13:28,610 Passa que escriure casualment H-E-L-L-O de nou, 217 00:13:28,610 --> 00:13:31,260 i pel que podem anomenar el mateix tipus d'imatge. 218 00:13:31,260 --> 00:13:34,290 Però el fet que he redibuixat aquesta imatge és deliberada 219 00:13:34,290 --> 00:13:37,720 perquè és una. diferent HOLA que aquest 220 00:13:37,720 --> 00:13:43,920 Així que aquí aquesta podria ser la ubicació 456, és a dir 457, i així successivament. 221 00:13:43,920 --> 00:13:47,170 Així que el que es posa en el signe d'interrogació que una vegada va ser? 222 00:13:47,170 --> 00:13:50,190 En aquest cas 456. 223 00:13:50,190 --> 00:13:53,540 Estem rebent aquests nombres arbitràriament perquè realment a partir d'avui 224 00:13:53,540 --> 00:13:57,110 no anem a tenir cura molt sobre quina és la direcció d'alguna cosa és. 225 00:13:57,110 --> 00:14:02,690 Tot el que importa és que podem esbrinar la direcció d'alguna dada com HELLO. 226 00:14:02,690 --> 00:14:07,100 >> Així que en realitat el que la majoria de la gent fa en ciències de la computació quan es parla de les adreces de memòria 227 00:14:07,100 --> 00:14:10,210 i parlant de punters en concret, 228 00:14:10,210 --> 00:14:14,220 en lloc de preocupar esbrinant 123 - a qui li importa on aquest material és en realitat, 229 00:14:14,220 --> 00:14:17,440 només sabem que és en alguna direcció numèrica - 230 00:14:17,440 --> 00:14:22,180 simplifiquem el món i dir que s està apuntant a aquest personatge 231 00:14:22,180 --> 00:14:25,080 i t s'assenyala a aquest caràcter. 232 00:14:25,080 --> 00:14:27,430 I el fet que és una fletxa és absolutament intencional 233 00:14:27,430 --> 00:14:31,610 perquè, literalment, ara s està apuntant a H i T està assenyalant en l'altre H 234 00:14:31,610 --> 00:14:34,720 perquè al final del dia, no importa el que la direcció és, 235 00:14:34,720 --> 00:14:40,240 però sí importa que tinguem la capacitat d'expressar aquesta direcció amb alguna peça de codi. 236 00:14:40,240 --> 00:14:42,730 Realment no hem manipulat aquestes adreces encara 237 00:14:42,730 --> 00:14:47,770 així que anem a veure on podem intervenir i ordenar de fer les coses amb punters, 238 00:14:47,770 --> 00:14:52,030 però de moment en la línia 12 literalment quins valors estem comparant 239 00:14:52,030 --> 00:14:55,500 d'acord amb aquesta història en la línia 12? 240 00:14:56,570 --> 00:15:01,290 El que estem dient és 123 igual igual a 456? I això no és definitivament el cas. 241 00:15:01,290 --> 00:15:05,320 I fins i tot conceptualment, aquest punter és definitivament no és el mateix que aquest 242 00:15:05,320 --> 00:15:09,500 perquè GetString trucat dues vegades, i GetString no tracta de ser super intel · ligent, 243 00:15:09,500 --> 00:15:12,470 no es tracta de donar-te compte, oh, que va escriure HOLA fa 5 minuts; 244 00:15:12,470 --> 00:15:15,090 et vaig a donar el mateix punter com que et vaig donar abans, 245 00:15:15,090 --> 00:15:18,450 només reserva un espai de memòria cada vegada que en diuen. 246 00:15:18,450 --> 00:15:20,350 >> Llavors, com podem solucionar aquest problema? 247 00:15:20,350 --> 00:15:24,270 Si un nivell més alt que vull comparar les cadenes Hola i hola - 248 00:15:24,270 --> 00:15:28,680 No m'importen els punters - Com puc contestar la pregunta, 249 00:15:28,680 --> 00:15:31,980 Per què l'usuari escrigui la mateixa cosa? El que es necessita aquí? Si. 250 00:15:31,980 --> 00:15:35,200 [Estudiant] Utilitzeu una funció. >> Puc utilitzar una funció fora de la caixa. 251 00:15:35,200 --> 00:15:38,170 Puc utilitzar una funció anomenada strcmp, s-t-r-c-m-p, 252 00:15:38,170 --> 00:15:41,190 només la versió abreujada de dir comparació de cadenes. 253 00:15:41,190 --> 00:15:45,070 I si entrem en, per exemple, comparar 2, que és un dels fullets de avui, 254 00:15:45,070 --> 00:15:46,690 Faig exactament això. 255 00:15:46,690 --> 00:15:51,750 Vaig guardar tota la resta constant de la línia 1 fins al 26 o així, 256 00:15:51,750 --> 00:15:54,360 i ara compte d'aquesta part ha canviat una mica. 257 00:15:54,360 --> 00:15:57,690 Anem a passar per alt la línia 28 per un moment i centrar-se només en aquest cas. 258 00:15:57,690 --> 00:16:00,410 Què ens diuen avui que str comparació fa? 259 00:16:00,410 --> 00:16:05,200 Es maneja el procés de prendre 2 punters, S i T en aquest cas, 260 00:16:05,200 --> 00:16:08,480 tipus de pràcticament posant el dit en aquestes 2 cartes, 261 00:16:08,480 --> 00:16:11,530 i el que ha de fer és una mena de bucle while o bucle for, 262 00:16:11,530 --> 00:16:16,050 i diu que aquests són els mateixos? Si és així, es mou els dits o els punters cap endavant. 263 00:16:16,050 --> 00:16:17,970 Són els mateixos, aquests el mateix, ells, el mateix 264 00:16:17,970 --> 00:16:22,710 aquests mateix, aquests mateix? I ooh, estic al final de la cadena, tant en s i t. 265 00:16:22,710 --> 00:16:26,780 No he trobat cap contradicció. Sí, aquestes cadenes són iguals. 266 00:16:26,780 --> 00:16:31,940 I què str comparar devolució si dues cadenes són iguals, pel que sembla? Zero. 267 00:16:31,940 --> 00:16:35,900 Així que 0 és bo en aquest cas perquè si torna -1 o +1, 268 00:16:35,900 --> 00:16:40,560 que vol dir que es li passa a venir abans o després de t alfabèticament t. 269 00:16:40,560 --> 00:16:43,760 I per què hauria de ser útil disposar d'una funció que li indica quina cadena va abans 270 00:16:43,760 --> 00:16:46,720 o després que en un diccionari? 271 00:16:46,720 --> 00:16:48,740 [Estudiant] Recerques. >> Recerca i ordenació. 272 00:16:48,740 --> 00:16:51,730 >> Així que vostè pot fer coses com a recerca binària o tipus bombolla o fusionar espècie 273 00:16:51,730 --> 00:16:53,230 on vostè ha de comparar les coses. 274 00:16:53,230 --> 00:16:56,420 Fins ara hem espècie de tallar algunes cantonades i només va parlar de classificació 275 00:16:56,420 --> 00:16:59,430 en el context dels nombres, perquè és agradable i fàcil de parlar, 276 00:16:59,430 --> 00:17:02,430 però que sens dubte pot comparar cadenes, poma i plàtan, 277 00:17:02,430 --> 00:17:05,349 perquè si la poma és conegut per venir abans de plàtan, de manera similar, 278 00:17:05,349 --> 00:17:09,319 Pot moure les cadenes al voltant de la memòria igual que va fer amb Rob espècie de barreja en el vídeo 279 00:17:09,319 --> 00:17:15,880 i ho vam fer aquí a l'escenari amb una mena de selecció, ordenació per inserció, i una mena de bombolla. 280 00:17:15,880 --> 00:17:18,710 Llavors, on més podem prendre això? Anem a provar això. 281 00:17:18,710 --> 00:17:23,980 Anem a ordenar d'oblidar aquesta lliçó per un moment i provi i copiar 1.c a fer el següent. 282 00:17:23,980 --> 00:17:26,800 En la línia 21 que estic dient alguna cosa d'impressió, 283 00:17:26,800 --> 00:17:28,520 llavors jo estic fent una cadena de l'usuari, 284 00:17:28,520 --> 00:17:30,690 llavors jo estic comprovant això. 285 00:17:30,690 --> 00:17:33,620 Realment no hem entrat en aquest costum encara, però ara farem això. 286 00:17:33,620 --> 00:17:40,990 Anem a pelar en realitat aquesta capa. Això és realment char *. Aquest tipus és realment char *. 287 00:17:40,990 --> 00:17:45,690 Llavors, què significa estar comprovant si s == NULL? 288 00:17:45,690 --> 00:17:48,380 Resulta que quan es crida a una funció com GetString 289 00:17:48,380 --> 00:17:51,540 o més generalment només demana un ordinador per donar-li una mica de memòria, 290 00:17:51,540 --> 00:17:53,030 alguna cosa podria sortir malament. 291 00:17:53,030 --> 00:17:56,630 Vostè podria estar boig i demanar a l'ordinador per un terabyte de memòria 292 00:17:56,630 --> 00:18:01,780 demanant milers de milions de bytes de memòria que simplement no existeixen en l'equip, 293 00:18:01,780 --> 00:18:05,130 però les funcions GetString i altres necessiten alguna forma de cridar a vostè 294 00:18:05,130 --> 00:18:06,820 si has demanat massa. 295 00:18:06,820 --> 00:18:10,450 I la forma en GetString fa això és si vostè ha demanat més memòria 296 00:18:10,450 --> 00:18:14,250 integrat en l'equip, encara que això probabilitat super, super baix 297 00:18:14,250 --> 00:18:17,730 perquè cap de nosaltres va a escriure un bilió de caràcters i després premeu Enter, 298 00:18:17,730 --> 00:18:21,980 però baixa probabilitat tot i que pot ser, jo encara desitja comprovar per si de cas, 299 00:18:21,980 --> 00:18:26,120 i el valor especial que torna GetString, resposta, i altres funcions 300 00:18:26,120 --> 00:18:30,630 si alguna cosa ha anat malament és NULL en majúscules. 301 00:18:30,630 --> 00:18:36,520 >> I quina és NULL? NULL que passa de representar un punter. És l'adreça de memòria 0. 302 00:18:36,520 --> 00:18:40,800 El món arbitràriament decidir que, si es tracta de la memòria del meu ordinador - saps què? - 303 00:18:40,800 --> 00:18:46,260 anem a robar a 1 byte de memòria cada equip, i aquesta és la posició 0. 304 00:18:46,260 --> 00:18:49,560 Anem a donar-li un sobrenom NULL, i anem a prometre 305 00:18:49,560 --> 00:18:52,660 que en realitat mai posar les dades reals no 306 00:18:52,660 --> 00:18:56,770 perquè simplement arbitràriament necessita un valor especial, 0, NULL aka, 307 00:18:56,770 --> 00:19:00,230 perquè puguem cridar als usuaris si alguna cosa surt malament. 308 00:19:00,230 --> 00:19:03,590 En cas contrari vostè pot no saber què dir 0 posar alguna cosa aquí 309 00:19:03,590 --> 00:19:05,490 o vol dir alguna cosa va sortir malament? 310 00:19:05,490 --> 00:19:09,190 Hem d'estar d'acord tot el que no significa res NULL va ser retornat, 311 00:19:09,190 --> 00:19:11,700 sense direcció real va ser retornat. 312 00:19:11,700 --> 00:19:15,210 Ara, aquí estic adoptant la meva convenció humana de tornada d'un principal 313 00:19:15,210 --> 00:19:17,040 si alguna cosa surt malament. 314 00:19:17,040 --> 00:19:20,650 Això es deu a la convenció principal de retorn és tornar 0 si bé, 315 00:19:20,650 --> 00:19:22,990 1 o algun altre valor si és dolenta. 316 00:19:22,990 --> 00:19:28,200 Però GetString i qualsevol altra funció que s'ocupa dels rendiments de memòria NULL si alguna cosa surt malament. 317 00:19:28,200 --> 00:19:33,480 >> Bé. Així que, lamentablement, la línia 27, super simple que sigui, no pot copiar completament la cadena. 318 00:19:33,480 --> 00:19:35,740 Per què? Podem veure això com segueix. 319 00:19:35,740 --> 00:19:40,120 Estic reclamant en la línia 27 es fa una còpia de s i dir que és t. 320 00:19:40,120 --> 00:19:45,790 Així que no estic preguntant a l'usuari per 2 cadenes en aquesta ocasió, només estic dient que el valor en s 321 00:19:45,790 --> 00:19:47,870 s'ha de posar en t també. 322 00:19:47,870 --> 00:19:52,890 Així que ara només per demostrar com trencada és a dir, en la línia 29 en endavant què estic fent? 323 00:19:52,890 --> 00:19:56,980 En primer lloc estic comprovant si la longitud de t és més gran que 0. 324 00:19:56,980 --> 00:19:59,330 Hi ha una mica de corda allà. L'usuari escriu alguna cosa polz 325 00:19:59,330 --> 00:20:03,410 Quina és la línia 32 fa, pel que sembla? 326 00:20:03,410 --> 00:20:08,910 [Resposta dels estudiants inaudible] Dret. >> Es pot inferir de la mateixa espècie a partir del que he dit que està fent. 327 00:20:08,910 --> 00:20:13,200 Però, tècnicament, el que s'està fent? t [0] representa què? 328 00:20:13,200 --> 00:20:15,140 [Estudiant] El caràcter zero. >> [Malan] El caràcter zero. 329 00:20:15,140 --> 00:20:19,620 O, més semblants als humans, el primer caràcter en t, sigui el que sigui, H potser en aquest cas. 330 00:20:19,620 --> 00:20:24,990 I ToUpper fa el que diu. S'aprofita el caràcter zero de tones i el canvia. 331 00:20:24,990 --> 00:20:28,430 Així que això significa prendre el caràcter zero de t, el converteixen en majúscules, 332 00:20:28,430 --> 00:20:30,320 i posar de nou en aquest mateix lloc. 333 00:20:30,320 --> 00:20:35,540 Així que si jo escrigui hello en minúscules, això ha de canviar la h minúscula a majúscula H. 334 00:20:35,540 --> 00:20:41,400 Però el problema és que a les línies 35 i 36, el que faré és imprimir per a nosaltres s i t. 335 00:20:41,400 --> 00:20:43,120 I quin és el teu pressentiment? 336 00:20:43,120 --> 00:20:47,250 Què és el que realment va a veure si he escrit en hola en minúscules? 337 00:20:47,250 --> 00:20:52,280 Què quedarà imprès? >> [Resposta dels estudiants inaudible] >> Què és això? 338 00:20:52,280 --> 00:20:58,360 [Estudiant] Big H i la resta petites. >> La gran H i la resta petit perquè, s o t? 339 00:20:58,360 --> 00:21:03,170 [Estudiant] Les dues coses. Ambdós >>. Exactament. Així que anem a veure el que està passant aquí. 340 00:21:03,170 --> 00:21:08,380 >> Deixin-me seguir endavant i compilar això. Això és copy1, així que copia1. Està bé. 341 00:21:08,380 --> 00:21:14,840 Zoom in Déjame seguir endavant i executar copy1, Intro, Dir una cosa: hola en minúscules. 342 00:21:14,840 --> 00:21:19,570 Es capitalitza la còpia, però pel que sembla capitalitzen l'original i, 343 00:21:19,570 --> 00:21:22,070 perquè el que ara passa en aquesta història? 344 00:21:22,070 --> 00:21:27,030 En la línia 27 que en realitat no sembla estar copiant la cadena, 345 00:21:27,030 --> 00:21:30,450 però tot i que podria haver esperat intuïtivament que aquest sigui el cas, 346 00:21:30,450 --> 00:21:33,680 si vostè pensa sobre aquesta foto, el que realment he fet? 347 00:21:33,680 --> 00:21:35,410 La meitat de la imatge és el mateix. 348 00:21:35,410 --> 00:21:39,390 Així que anem a retrocedir en el temps perquè t encara no existeix en la història. 349 00:21:39,390 --> 00:21:43,160 S pot existir en la història, però anem a minúscules hola aquest moment. 350 00:21:43,160 --> 00:21:46,710 Així que anem a arreglar el que en realitat escrit polz 351 00:21:46,710 --> 00:21:51,280 En aquest cas aquí tenim h-i-l-l-o. 352 00:21:51,280 --> 00:21:58,050 Anem a dibuixar com una seqüència de caràcters, vaig posar les línies de separació aquí i la meva 0 \. 353 00:21:58,050 --> 00:22:05,980 Així que aquí és on som tan bon punt la línia 1 a la 24-ish, més o menys, s'han executat. 354 00:22:05,980 --> 00:22:07,800 Aquesta és la foto de la meva memòria. 355 00:22:07,800 --> 00:22:10,800 Quan arribo a la línia 27, que passa? 356 00:22:10,800 --> 00:22:14,730 Igual que abans, apareix un punter, el que vaig a dibuixar com aquesta plaça. 357 00:22:14,730 --> 00:22:19,740 Es diu t. I quin és el seu valor per defecte? Qui sap? Alguns valors d'escombraries. 358 00:22:19,740 --> 00:22:22,060 >> Així que em vaig abstracte que fos com un signe d'interrogació. 359 00:22:22,060 --> 00:22:27,670 I tan bon punt la part dreta de la línia 27 s'executa, el que em posa dins de t? 360 00:22:27,670 --> 00:22:30,770 El mateix que hi ha a s. 361 00:22:30,770 --> 00:22:34,120 Així que si per un moment retirar aquesta abstracció de la fletxa i diem, 362 00:22:34,120 --> 00:22:40,330 oh, aquesta és l'adreça de memòria de càrrega 123, quan dius t aconsegueix s, punt i coma, 363 00:22:40,330 --> 00:22:42,700 que està literalment posant 123 aquí. 364 00:22:42,700 --> 00:22:45,200 Ara si que tipus de simplificar el nostre món de nou amb els quadres, 365 00:22:45,200 --> 00:22:48,750 el que ha fet en realitat s'acaba d'afegir una altra fletxa en el seu món 366 00:22:48,750 --> 00:22:52,910 que està assenyalant de t a la cadena exactament el mateix. 367 00:22:52,910 --> 00:22:59,730 Per això, quan en la línia 31 i 32 que van realment sobre el canvi de t [0], 368 00:22:59,730 --> 00:23:05,580 el que és t [0] pel que sembla sinònim d'ara? s [0] 369 00:23:05,580 --> 00:23:07,030 Així que això és tot el que està passant. 370 00:23:07,030 --> 00:23:09,900 I encara que aquest tipus de se sent una mica baix nivell i arcà 371 00:23:09,900 --> 00:23:12,760 i aquest tipus de se sent com potser intuïtivament això hauria d'haver només funcionava - 372 00:23:12,760 --> 00:23:15,410 He fet còpies de coses abans i ha funcionat - 373 00:23:15,410 --> 00:23:18,590 si vostè realment pensa sobre el que realment és una cadena, és un char *. 374 00:23:18,590 --> 00:23:21,700 Bé, què és això? És l'adreça d'algun personatge. 375 00:23:21,700 --> 00:23:24,930 Llavors, potser té més sentit que quan es tracta de fer alguna cosa 376 00:23:24,930 --> 00:23:29,220 súper aparentment simple com això, tot el que estem fent és copiar una adreça de memòria. 377 00:23:29,220 --> 00:23:32,530 No està fent res amb la pròpia cadena. 378 00:23:32,530 --> 00:23:37,500 Així que encara que no té idea de com es podria resoldre aquest problema en el codi, 379 00:23:37,500 --> 00:23:45,080 alt nivell, conceptualment, què és el que hem de fer perquè ta còpia fidel de s, pel que sembla? 380 00:23:46,670 --> 00:23:48,820 Si. >> [Estudiant] Donaria una nova ubicació? >> Exactament. 381 00:23:48,820 --> 00:23:50,800 >> Hem de donar a t un lloc completament nou. 382 00:23:50,800 --> 00:23:55,230 Hem de crear d'alguna manera un món on tenim un espai de memòria, 383 00:23:55,230 --> 00:24:00,090 que només per raons de claredat vaig a trucar a sota d'aquest, però no ha de ser-hi. 384 00:24:00,090 --> 00:24:04,880 Però ha de ser de la mateixa mida, així que vaig a dibuixar aquestes línies verticals en el mateix lloc. 385 00:24:04,880 --> 00:24:09,720 Està molt bé si això és tot escombraries inicialment. Qui sap què hi era? 386 00:24:09,720 --> 00:24:13,850 Però el pas 1 es va a haver de donar-me tanta memòria com que necessito 387 00:24:13,850 --> 00:24:18,630 per adaptar-se a una còpia de hola, a continuació, trobar la manera de copiar el h aquí, el correu aquí, 388 00:24:18,630 --> 00:24:20,390 el l aquí i així successivament. 389 00:24:20,390 --> 00:24:24,880 Però això ja ho deu semblar una mica obvi, encara que alguns dels detalls són encara abstracte. 390 00:24:24,880 --> 00:24:28,690 Per copiar aquesta cadena en aquest, és només un bucle for o while 391 00:24:28,690 --> 00:24:31,580 o alguna cosa amb el que t'has convertit en el més familiar. 392 00:24:31,580 --> 00:24:35,970 Així que anem a provar això. Déjame entrar copy2.c. 393 00:24:35,970 --> 00:24:43,270 En copy2.c tenim gairebé el mateix programa, a excepció de la línia 27. 394 00:24:43,270 --> 00:24:47,260 S'assembla una mica complex, però si es descomponen a poc a poc, 395 00:24:47,260 --> 00:24:48,950 el costat esquerre és el mateix. 396 00:24:48,950 --> 00:24:52,790 Char * t crea aquesta cosa a la memòria, encara que amb un signe d'interrogació 397 00:24:52,790 --> 00:24:54,680 perquè no tenim ni idea del que hi ha per defecte. 398 00:24:54,680 --> 00:24:57,920 A la part dreta estem ara la introducció d'una nova funció malloc,, 399 00:24:57,920 --> 00:25:00,640 per assignar memòria, dóna'm la memòria, 400 00:25:00,640 --> 00:25:06,900 i pel que sembla es quants arguments, quantes coses entre parèntesis? 401 00:25:09,660 --> 00:25:12,130 Vaig sentir murmuris d'1 i 2, però és només 1. 402 00:25:12,130 --> 00:25:15,320 No hi ha una coma, el que significa que només hi ha una cosa dins dels parèntesis. 403 00:25:15,320 --> 00:25:17,720 Tot i que hi ha altres parèntesis, voldria destacar 404 00:25:17,720 --> 00:25:21,460 el que hi ha dins dels parèntesis més externs, i és aquesta expressió: 405 00:25:21,460 --> 00:25:25,880 (Strlen (s) + 1) * sizeof (char). 406 00:25:25,880 --> 00:25:29,190 Així que si realment pensar en això, això diu dóna'm la longitud de s. 407 00:25:29,190 --> 00:25:34,440 Per què sóc, però, afegir 1 a la longitud? >> [Resposta dels estudiants inaudible] 408 00:25:34,440 --> 00:25:40,200 Exactament. Necessitem espai per a aquest tipus de la cua, el sisè personatge que no té cap significat Anglès 409 00:25:40,200 --> 00:25:42,250 però té un significat especial programàtic. 410 00:25:42,250 --> 00:25:46,800 >> Així que necessitem un + 1 per això perquè strlen Retorna l'expectativa humana de longitud, 411 00:25:46,800 --> 00:25:50,890 hola o 5, no li dóna el caràcter nul addicional. 412 00:25:50,890 --> 00:25:52,980 Així que afegir manualment aquest amb + 1. 413 00:25:52,980 --> 00:25:56,060 I després d'això, de mida * (char), no hem vist això abans. 414 00:25:56,060 --> 00:25:57,480 Això no és tècnicament una funció. 415 00:25:57,480 --> 00:26:04,150 És una paraula clau especial que només et diu el que la mida és d'un altre tipus de dades en un ordinador 416 00:26:04,150 --> 00:26:06,980 perquè en realitat, alguns de nosaltres tenim equips de 32 bits. 417 00:26:06,980 --> 00:26:10,900 Tinc un ordinador bastant antic al país, i que només utilitza 32 bits per representar els punters. 418 00:26:10,900 --> 00:26:13,900 I si ho feia mida d'un tipus de dades, pot ser de 32 bits. 419 00:26:13,900 --> 00:26:18,300 Però si estic fent servir el meu ordinador nova fantasia, que podria tornar un valor de 64 bits 420 00:26:18,300 --> 00:26:20,510 una mena direcció. 421 00:26:20,510 --> 00:26:25,400 Així que en aquest cas, només per estar segur super, no anem a codificar alguna cosa com - 422 00:26:25,400 --> 00:26:28,740 així, quin és la mida d'un char d'acord amb el que hem dit fins ara? 423 00:26:28,740 --> 00:26:34,450 Hem pràcticament em va dir verbalment que es tracta d'un byte, i això és bastant cert en tots els àmbits. 424 00:26:34,450 --> 00:26:37,000 Però, de nou, els supòsits tendeixen a ser dolent. 425 00:26:37,000 --> 00:26:40,850 Condueixen a programari defectuós si les persones fan servir el seu programari de maneres que no pensava. 426 00:26:40,850 --> 00:26:44,750 Així que anem a abstreure aquesta lluny i més just dir genèricament 427 00:26:44,750 --> 00:26:46,830 Necessito això molts trossos de la memòria 428 00:26:46,830 --> 00:26:50,210 i cada tros de memòria hauria de ser equivalent a la mida d'un caràcter, 429 00:26:50,210 --> 00:26:54,870 que de fet és igual a 1 en aquest cas, però és una forma més genèrica d'escriure. 430 00:26:54,870 --> 00:27:00,460 Així que si la paraula és hola, quants bytes es malloc aparentment assignar a saludar? 431 00:27:00,460 --> 00:27:04,980 [Estudiant] Sis. >> Six. Exactament com molts ja que tenim signes d'interrogació a la pantalla. 432 00:27:04,980 --> 00:27:07,800 I després prendre una conjectura ara es basa en la comprensió de GetString 433 00:27:07,800 --> 00:27:12,790 Què malloc probablement torni? >> [Estudiant] Una adreça. 434 00:27:12,790 --> 00:27:17,020 Una adreça de què? Pel primer fragment de memòria. 435 00:27:17,020 --> 00:27:20,670 >> No tenim idea del que és allà perquè alguna altra funció 436 00:27:20,670 --> 00:27:23,010 podria haver estat utilitzant aquesta memòria prèviament. 437 00:27:23,010 --> 00:27:28,380 Però malloc, com GetString, torna la direcció del primer byte de la memòria 438 00:27:28,380 --> 00:27:30,540 que s'ha reservat per a vostè. 439 00:27:30,540 --> 00:27:38,380 No obstant això, el que no fa és omplir l'espai en blanc amb un caràcter nul barra invertida 440 00:27:38,380 --> 00:27:43,030 perquè resulta que vostè pot utilitzar malloc per assignar qualsevol cosa: sencers, cadenes, matrius, 441 00:27:43,030 --> 00:27:45,700 flotadors, estructures estudiantils. 442 00:27:45,700 --> 00:27:47,750 Podeu utilitzar malloc totalment genèrica. 443 00:27:47,750 --> 00:27:51,470 No li importa ni ha de saber el que l'assignació de memòria per. 444 00:27:51,470 --> 00:27:55,810 Així que seria presumptuós per malloc posar un 0 \ 445 00:27:55,810 --> 00:27:58,340 al final de cada tros de memòria que t'està donant 446 00:27:58,340 --> 00:28:02,620 perquè \ 0 cosa és només una convenció per les cadenes. 447 00:28:02,620 --> 00:28:06,310 No s'usa per sencers, no s'utilitza per als flotadors, no s'utilitza per als estudiants. 448 00:28:06,310 --> 00:28:11,730 I així el Gotcha amb malloc és que la càrrega és totalment de vostè al programador 449 00:28:11,730 --> 00:28:16,790 per recordar la quantitat de bytes que assignen i no utilitzar mai un bucle for 450 00:28:16,790 --> 00:28:21,570 o un bucle while i anar més enllà del límit de la quantitat de memòria que han donat. 451 00:28:21,570 --> 00:28:23,540 En altres paraules, tan bon punt s'assigna memòria, 452 00:28:23,540 --> 00:28:28,510 no es pot demanar al sistema operatiu, oh, per cert, què tan gran d'un tros de memòria va ser això? 453 00:28:28,510 --> 00:28:32,080 És totalment de vostè per recordar si vostè necessita aquest valor. 454 00:28:32,080 --> 00:28:34,330 >> Així que anem a veure com procedeixo a utilitzar aquesta memòria. 455 00:28:34,330 --> 00:28:38,430 En la línia 28 i 29 per què estic fent això? 456 00:28:39,850 --> 00:28:42,260 Només has de comprovar el seny total. 457 00:28:42,260 --> 00:28:45,110 Només en cas que alguna cosa anava malament, demano una cosa increïble quantitat de memòria 458 00:28:45,110 --> 00:28:48,690 o tinc tantes coses que s'executa en l'equip que simplement no hi ha prou memòria, 459 00:28:48,690 --> 00:28:51,780 una cosa així, jo almenys desitja comprovar nul · la. 460 00:28:51,780 --> 00:28:55,260 En realitat, la majoria de les computadores li donarà la il · lusió que tots els programes 461 00:28:55,260 --> 00:28:57,080 Podeu utilitzar la totalitat de la memòria RAM, 462 00:28:57,080 --> 00:29:00,740 però tot i així, si l'usuari escriu en una corda llarga boig potser perquè ets un noi dolent 463 00:29:00,740 --> 00:29:03,440 i en realitat estan tractant de bloquejar el programa o truc-hi, 464 00:29:03,440 --> 00:29:07,300 desitja comprovar almenys el valor de retorn de malloc i si és igual a null. 465 00:29:07,300 --> 00:29:11,630 I si ho fa, anem a deixar de fumar en aquest moment perquè no sé què fer en aquest cas. 466 00:29:11,630 --> 00:29:13,950 Com puc copiar la cadena? Hi ha algunes maneres de fer això. 467 00:29:13,950 --> 00:29:18,850 Hi ha str copiar funcions en C, però és molt senzill per a nosaltres fer això la manera antiga. 468 00:29:18,850 --> 00:29:23,110 >> En primer lloc anem a esbrinar quina és la longitud de s és. 469 00:29:23,110 --> 00:29:26,930 Jo podria haver posat això en el bucle, però en lloc d'això només cal posar aquí per més claredat. 470 00:29:26,930 --> 00:29:30,610 Així núm ara emmagatzema la longitud de l'original, que aparentment és 5. 471 00:29:30,610 --> 00:29:35,290 Després, en el meu bucle per iterar des que estic en 0 fins an, 472 00:29:35,290 --> 00:29:40,940 i en cada iteració estic posant s [i] dins de la [i]. 473 00:29:40,940 --> 00:29:45,060 Així que això és el que implicava amb els meus dos dits apuntant a les cordes abans. 474 00:29:45,060 --> 00:29:49,260 Com aquest bucle for itera així, jo estaré copiant ha aquí, 475 00:29:49,260 --> 00:29:52,890 i en aquí, jo en aquí perquè aquest és s, aquest és t. 476 00:29:52,890 --> 00:29:58,770 I finalment, en la línia 35 per què estic fent això? 477 00:29:58,770 --> 00:30:03,770 He de assegurar-me que estic acabant la cadena t. 478 00:30:03,770 --> 00:30:06,170 I ho va fer d'aquesta manera a ser súper explícit. 479 00:30:06,170 --> 00:30:09,510 Però proposar a algú, si pogués, una forma diferent de fer això. 480 00:30:09,510 --> 00:30:13,930 Jo realment no necessita la línia 35. Hi ha una altra manera de fer això. 481 00:30:13,930 --> 00:30:18,880 Si. >> [Resposta dels estudiants inaudible] >> Digues-ho fort. 482 00:30:18,880 --> 00:30:20,960 [Estudiant] Menor o igual a. >> Exactament. 483 00:30:20,960 --> 00:30:24,450 Podríem dir inferior o igual a n, que en general ha estat mal 484 00:30:24,450 --> 00:30:28,190 perquè gairebé sempre quan vam pujar a un igual al que estem explicant 485 00:30:28,190 --> 00:30:30,000 anem un pas massa lluny. 486 00:30:30,000 --> 00:30:32,170 Però recordeu, la quantitat de bytes que s'assignen? 487 00:30:32,170 --> 00:30:37,210 Es van assignar de strlen s, de manera que 5 + 1 per a un total de 6. 488 00:30:37,210 --> 00:30:39,980 Així que en aquest cas podríem fer alguna cosa com això 489 00:30:39,980 --> 00:30:46,450 pel que estem copiant no només la salutació sinó també el 0 \ al final. 490 00:30:46,450 --> 00:30:49,860 Alternativament, podríem utilitzar una funció anomenada str còpia, strcpy, 491 00:30:49,860 --> 00:30:51,700 però que no seria divertit gairebé com a molt. 492 00:30:51,700 --> 00:30:54,000 Però això és tot el que fa per sota de la caputxa. 493 00:30:54,000 --> 00:30:56,050 A continuació, finalment, fem el mateix que abans. 494 00:30:56,050 --> 00:31:01,620 Jo t capitalitzar i després em diuen que l'original estan presents i la còpia és així. 495 00:31:01,620 --> 00:31:08,570 Així que anem a tractar ara. Déjame aquí. Fer copy2. Anem a ampliar i executar copy2. 496 00:31:08,570 --> 00:31:13,840 Vaig a escriure hola en minúscules, i de fet tinc minúscules hola que l'original 497 00:31:13,840 --> 00:31:16,930 però el capital Hola per a la còpia. 498 00:31:16,930 --> 00:31:20,300 Però no he acabat encara. He de fer una última cosa aquí. 499 00:31:20,300 --> 00:31:28,000 46 i 47 està clarament com alliberar memòria, però què significa això realment? 500 00:31:28,000 --> 00:31:33,250 Què estic fent, creus que, trucant a la línia 46 i la línia 47? 501 00:31:33,250 --> 00:31:38,900 Quin efecte té això? Si. 502 00:31:38,900 --> 00:31:43,140 [Resposta dels estudiants inaudible] >> Exactament. 503 00:31:43,140 --> 00:31:46,380 >> Vostè s'acaba d'indicar al sistema operatiu, hey, gràcies per aquest record. 504 00:31:46,380 --> 00:31:48,320 Ara pot utilitzar per a una altra persona. 505 00:31:48,320 --> 00:31:50,790 I aquí hi ha un exemple perfecte dels valors d'escombraries. 506 00:31:50,790 --> 00:31:55,430 Acabo d'utilitzar aquesta memòria per escriure la paraula hola en 2 llocs, 507 00:31:55,430 --> 00:31:57,490 aquí, aquí, aquí i aquí. 508 00:31:57,490 --> 00:32:00,910 Així que aquest és h-i-l-l-o-\ 0. 509 00:32:00,910 --> 00:32:06,960 Però llavors truqui a la línia 46 i la línia 47, i ja saps el que passa allà en termes de la imatge? 510 00:32:06,960 --> 00:32:10,010 En realitat, esperar, aquesta imatge és l'antiga. 511 00:32:10,010 --> 00:32:12,550 Una vegada que la còpia sigui, aquest home està apuntant aquí, 512 00:32:12,550 --> 00:32:16,110 així que anem a treure els números i només abstreure com les nostres fletxes de nou. 513 00:32:16,110 --> 00:32:19,370 Què passa en aquest quadre quan dic lliure? 514 00:32:19,370 --> 00:32:22,750 [Resposta dels estudiants inaudible] >> Ni tan sols. 515 00:32:22,750 --> 00:32:29,510 Si dic gratis a s i t - una mena de pregunta capciosa - aquest panorama no canvia en absolut 516 00:32:29,510 --> 00:32:33,880 perquè trucant i trucant s t li diu al sistema operatiu, 517 00:32:33,880 --> 00:32:39,010 hey, vostè pot utilitzar aquesta memòria de nou, però això no canvia aquest valor nul 518 00:32:39,010 --> 00:32:41,840 o algun caràcter especial, no canvia això, 519 00:32:41,840 --> 00:32:47,350 no canvia el h o i el o la l o l o el o ja sigui en el lloc per a qualsevol altra cosa. 520 00:32:47,350 --> 00:32:51,610 Quant a la imatge, tan aviat com es digui canvis lliures, res. 521 00:32:51,610 --> 00:32:56,570 I aquí està l'origen dels valors de fem perquè si després més endavant en aquest programa 522 00:32:56,570 --> 00:33:01,010 acabar amb un sistema operatiu per obtenir més memòria amb malloc o GetString o alguna cosa per l'estil 523 00:33:01,010 --> 00:33:04,900 i el sistema operatiu diu, clar, tinc 12 bytes de memòria només alliberats, 524 00:33:04,900 --> 00:33:08,080 utilitzar aquests, què seràs lliurat? 525 00:33:08,080 --> 00:33:10,830 Vostè serà lliurat un tros de memòria que normalment es basaria 526 00:33:10,830 --> 00:33:13,700 amb signes d'interrogació, però quins són els signes d'interrogació? 527 00:33:13,700 --> 00:33:17,000 Que estiguin h-i-l-l-o, h-i-l-l-o. 528 00:33:17,000 --> 00:33:20,940 Aquests són els nostres valors nous d'escombraries tan aviat com alliberar aquesta memòria. 529 00:33:20,940 --> 00:33:22,750 >> Hi ha una implicació món real aquí també. 530 00:33:22,750 --> 00:33:24,720 Això succeeix a veure amb la RAM, però els equips 531 00:33:24,720 --> 00:33:26,720 en realitat fan el mateix amb el disc. 532 00:33:26,720 --> 00:33:30,620 Parlarem d'això en particular amb un conjunt de problemes futurs que se centra en la medicina forense. 533 00:33:30,620 --> 00:33:36,170 Però el que realment succeeix si té algun arxiu financera sensible a l'escriptori 534 00:33:36,170 --> 00:33:39,600 o alguna vaga JPEG i l'arrossega en les seves escombraries, 535 00:33:39,600 --> 00:33:44,390 el que passa quan l'arrossega a les escombraries o la paperera de reciclatge? 536 00:33:44,390 --> 00:33:47,240 Sabia el que estava parlant. [Rialles] 537 00:33:47,240 --> 00:33:52,370 Què passa quan s'ha arrossegat aquests documents a la paperera de reciclatge o pot d'escombraries? 538 00:33:52,370 --> 00:33:55,920 [Resposta dels estudiants inaudible] 539 00:33:55,920 --> 00:33:58,000 Bé, així que vés amb compte. Què passa quan vostè fa això? 540 00:33:58,000 --> 00:34:01,030 La resposta curta és no, oi? 541 00:34:01,030 --> 00:34:04,790 Expedient incomplet o sensible encara hi assegut en algun lloc del seu disc dur. 542 00:34:04,790 --> 00:34:07,940 La majoria de nosaltres almenys hem après per les males que cal buidar les escombraries 543 00:34:07,940 --> 00:34:10,429 o la paperera de reciclatge per eliminar realment els arxius. 544 00:34:10,429 --> 00:34:13,440 I, en efecte, en fer clic o clic amb el botó de control en el pot d'escombraries 545 00:34:13,440 --> 00:34:15,580 o seleccioneu Fitxer, Buidar paperera o el que sigui 546 00:34:15,580 --> 00:34:21,420 i que en realitat buidar la paperera o paperera de reciclatge, el que realment succeeix llavors amb aquesta imatge? 547 00:34:22,810 --> 00:34:25,969 Més res. Així que res succeeix realment en el disc. 548 00:34:25,969 --> 00:34:30,880 >> I si només temporalment divagar i escriure - I'Ll només ha d'utilitzar la part de darrere d'això. 549 00:34:30,880 --> 00:34:34,639 Així que ara la història està canviant de RAM, que és on hi ha programes 550 00:34:34,639 --> 00:34:39,250 mentre està en funcionament, el disc, que és on s'emmagatzemen a llarg termini 551 00:34:39,250 --> 00:34:42,920 fins i tot quan se'n va la llum, per ara - i tornarem a això en el futur - 552 00:34:42,920 --> 00:34:46,380 anem a pretendre que això representa l'interior del disc dur del seu ordinador 553 00:34:46,380 --> 00:34:50,110 perquè en el seu dia el que solia ser discos circulars, igual que els disquets. 554 00:34:50,110 --> 00:34:55,130 Així que si vostè té una mica de sensibilitat arxiu d'Excel, pot trigar fins aquest tros de memòria 555 00:34:55,130 --> 00:34:59,770 en el disc del seu ordinador, i estic dibuixant 1s i 0s mateix arbitrari. 556 00:34:59,770 --> 00:35:03,970 En arrossegar l'arxiu de la mateixa manera que al seu pot de brossa o la paperera de reciclatge, 557 00:35:03,970 --> 00:35:07,750 literalment no passa res, ja que Apple i Microsoft acaba de decidir 558 00:35:07,750 --> 00:35:10,450 la paperera i paperera de reciclatge és en realitat un marcador de posició temporal. 559 00:35:10,450 --> 00:35:14,710 Potser, finalment, el sistema operatiu es buidar per a vostè, però en general, no fa res, 560 00:35:14,710 --> 00:35:17,090 almenys fins que estiguis realment poc espai. 561 00:35:17,090 --> 00:35:20,870 >> No obstant això, quan es va a les escombraries buida o buida la paperera de reciclatge, 562 00:35:20,870 --> 00:35:23,460 De la mateixa manera, no passa res a aquesta imatge. 563 00:35:23,460 --> 00:35:28,590 Tot el que succeeix està en un altre lloc en l'equip, hi ha una mena de taula. 564 00:35:28,590 --> 00:35:35,400 És una mena de full de trucs poc que diu que, diguem, resume.doc, 565 00:35:35,400 --> 00:35:40,920 de manera que el seu full de vida en un arxiu de Microsoft Word solia viure en el lloc 123 en el disc dur, 566 00:35:40,920 --> 00:35:43,710 no en la memòria i no en la memòria RAM, però en el seu disc dur, 567 00:35:43,710 --> 00:35:49,050 i les seves vides incompletes JPEG amb 456, i l'arxiu d'Excel viu en 789 o on sigui. 568 00:35:49,050 --> 00:35:53,640 En eliminar arxius en realitat buidar les escombraries o la paperera de reciclatge, 569 00:35:53,640 --> 00:35:59,530 aquesta imatge no canvia. La 0s i 1s al seu disc dur no van enlloc. 570 00:35:59,530 --> 00:36:03,930 Però aquesta taula, aquesta base de dades poc de sort, si canvia. 571 00:36:03,930 --> 00:36:08,750 En eliminar el seu full de vida, és com si l'arxiu s'elimina d'alguna manera, 572 00:36:08,750 --> 00:36:12,790 però tot l'equip no s'oblidi que el que viu en el seu disc dur. 573 00:36:12,790 --> 00:36:17,870 El 0 i 1 que componen el seu full de vida o de qualsevol d'aquests arxius es troben encara intactes. 574 00:36:17,870 --> 00:36:21,960 >> Així que si vostè ho va fer accidentalment, encara hi ha una probabilitat diferent de zero 575 00:36:21,960 --> 00:36:25,800 que vostè pot recuperar les seves dades utilitzant Norton Utilities o algun programari comercial 576 00:36:25,800 --> 00:36:29,810 el propòsit en la vida és trobar 0s i 1s que han quedat orfes a causa del tipus, 577 00:36:29,810 --> 00:36:33,300 oblidat aquí, però va sortir d'aquí, perquè pugui recuperar les dades. 578 00:36:33,300 --> 00:36:38,410 O els investigadors forenses amb la policia o l'FBI en realitat tindria un disc dur 579 00:36:38,410 --> 00:36:42,550 i realment buscar patrons de 0s i 1s que s'assemblen a imatges JPEG, s'assemblen als arxius d'Excel, 580 00:36:42,550 --> 00:36:46,400 i recuperar d'aquesta manera, encara que l'equip s'ha oblidat d'ells allà. 581 00:36:46,400 --> 00:36:49,820 Així que l'única manera de realment eliminar les dades, com veurem en el futur, 582 00:36:49,820 --> 00:36:54,190 és fregar o netejar l'arxiu o disc dur - 583 00:36:54,190 --> 00:36:56,540 Realment no es pot eliminar el 0 i 1 584 00:36:56,540 --> 00:36:59,440 perquè si no començaria amb una unitat de disc dur gigabyte 585 00:36:59,440 --> 00:37:02,380 i que acabaria amb un disc dur megabyte si constantment es esborrar, 586 00:37:02,380 --> 00:37:04,380 literalment, 0s i 1s. 587 00:37:04,380 --> 00:37:06,310 Llavors, què faria vostè si realment volia cobrir les seves pistes 588 00:37:06,310 --> 00:37:10,510 i el problema fonamental és que encara hi ha 0s i 1s al disc? 589 00:37:10,510 --> 00:37:14,930 Veig algú que físicament gesticulant trencaria el dispositiu. Això va a funcionar. 590 00:37:14,930 --> 00:37:19,600 [Rialles] Però si això és una cosa d'una solució cara, el que seria més raonable? 591 00:37:19,600 --> 00:37:23,270 Si. >> [Estudiant] Sobreescriure ells. >> Sobreescriure'ls amb què? >> [Estudiant] Altres dades. 592 00:37:23,270 --> 00:37:29,070 Altres dades. Vostè pot sobreescriure el disc amb 0s o 1s o 0s tots, tots 1s. 593 00:37:29,070 --> 00:37:31,230 >> I això és precisament el que alguns dels programes fa. 594 00:37:31,230 --> 00:37:33,570 Vostè pot comprar el programari o fins i tot aconseguir el programari lliure, 595 00:37:33,570 --> 00:37:36,610 i fins i tot integrada en Mac OS en aquests dies, si més no en Windows, 596 00:37:36,610 --> 00:37:38,660 és la capacitat d'esborrar de forma segura. 597 00:37:38,660 --> 00:37:41,960 En realitat, si vostè vol tot jonrones avui si tens un Mac i fer això, 598 00:37:41,960 --> 00:37:45,740 si tens algunes coses al seu pot de brossa, pot fer-ho Secure Empty Trash, 599 00:37:45,740 --> 00:37:47,610 que fa exactament això. 600 00:37:47,610 --> 00:37:53,350 En lloc d'esborrar arxius només aquí, no esborra l'aquí 0s i 1s, 601 00:37:53,350 --> 00:38:01,240 més aviat, només canvia tots ells, per exemple, a 0s i punt, punt, punt. 602 00:38:01,240 --> 00:38:05,330 Així que un dels conjunts de processadors futurs en realitat serà recuperar intencionalment dades - 603 00:38:05,330 --> 00:38:08,430 fotografies que hem pres de les persones, llocs i coses al campus 604 00:38:08,430 --> 00:38:12,810 perquè anem a fer una imatge forense de la targeta de memòria d'una càmera digital, 605 00:38:12,810 --> 00:38:17,120 que és la idea mateixa - i que haurà de ser desafiats a trobar realment 606 00:38:17,120 --> 00:38:20,160 els patrons que representen imatges JPEG al disc dur, 607 00:38:20,160 --> 00:38:23,610 igual que l'ex estudiant el correu electrònic que vaig llegir fa unes setmanes va fer 608 00:38:23,610 --> 00:38:25,860 per recuperar fotografies de la seva germana. 609 00:38:25,860 --> 00:38:30,300 Per què no ens prenem un descans de 5 minuts aquí, i anem a reagrupar amb més memòria. 610 00:38:33,030 --> 00:38:38,610 Així que aquí és on les coses es posen una mica al · lucinant, però aquest és un pas molt potent 611 00:38:38,610 --> 00:38:40,480 cap a la comprensió d'aquest encara més. 612 00:38:40,480 --> 00:38:42,900 Aquí hi ha un programa anomenat pointers.c. 613 00:38:42,900 --> 00:38:45,430 És un codi d'exemple d'avui. 614 00:38:45,430 --> 00:38:51,280 Recordeu que en les primeres línies, 19 a 22, tot el que estem fent és com GetString 615 00:38:51,280 --> 00:38:54,460 i tornar una adreça, emmagatzemant-la en s. 616 00:38:54,460 --> 00:38:58,380 A partir de llavors per pset fins i tot 3 si vols però pset 4 i en 617 00:38:58,380 --> 00:39:01,030 on vostè pot començar a prendre aquestes rodes d'entrenament fora de tu mateix, 618 00:39:01,030 --> 00:39:04,030 no hi ha cap raó per pretendre que les cadenes de deixat d'existir. 619 00:39:04,030 --> 00:39:07,030 És certament correcte començar dient char *. 620 00:39:07,030 --> 00:39:12,610 >> Com acotació al marge, en referències en línia i en els llibres que sovint pot veure l'estrella costat de la variable. 621 00:39:12,610 --> 00:39:15,600 Vostè podria fins i tot veure els espais al voltant dels dos costats de la mateixa. 622 00:39:15,600 --> 00:39:17,680 Tots aquests són funcionalment correcte. 623 00:39:17,680 --> 00:39:21,180 Per ara, però, anem a estandarditzar aquest mètode per fer super clar 624 00:39:21,180 --> 00:39:24,000 char * que és com dir punter a caràcter. 625 00:39:24,000 --> 00:39:25,680 Aquest és el tipus de dades. 626 00:39:25,680 --> 00:39:28,730 I a continuació, el nom de la variable s és en aquest cas. 627 00:39:28,730 --> 00:39:31,180 Per això hem aconseguit una corda i l'hem anomenat s. 628 00:39:31,180 --> 00:39:35,180 I llavors aquí adonar que estic fent en realitat una mica d'engany. 629 00:39:35,180 --> 00:39:39,080 Això s'anomena aritmètica de punters, que és una mena de súper simple. 630 00:39:39,080 --> 00:39:41,790 Només vol dir sumar i restar nombres als punters. 631 00:39:41,790 --> 00:39:43,660 Però això realment funciona. 632 00:39:43,660 --> 00:39:49,170 Aquest programa aparentment imprimeix la cadena es 1 caràcter per línia de tal manera que el resultat final - 633 00:39:49,170 --> 00:39:54,920 Només així podem fer malbé a on va això, fer suggeriments, executeu punters, deixa zoom in 634 00:39:54,920 --> 00:39:58,940 Ara em deixa escriure alguna cosa com HOLA i el tipus Intro 635 00:39:58,940 --> 00:40:01,080 i imprimeix un caràcter per línia. 636 00:40:01,080 --> 00:40:04,730 Fins fa un segon, haguéssim fet això amb notació de claudàtors. 637 00:40:04,730 --> 00:40:09,760 Tindríem un bucle for i que faríem printf de s [i] i ens agradaria fer això una i altra vegada i una altra 638 00:40:09,760 --> 00:40:11,950 amb un n barra invertida al final de cada línia. 639 00:40:11,950 --> 00:40:16,800 Però aquest programa és diferent. Aquest programa s'utilitza, literalment, l'aritmètica. 640 00:40:16,800 --> 00:40:18,860 Llavors, què està passant aquí? 641 00:40:18,860 --> 00:40:24,720 En primer lloc, abans que aquest llaç encara s'executa, el que, per ser clars, és realment s? 642 00:40:24,720 --> 00:40:27,270 S és? >> [Estudiant] Una adreça. >> Una adreça. 643 00:40:27,270 --> 00:40:32,980 >> I és la direcció de, en el cas de hola, el primer caràcter de la paraula, que és h. 644 00:40:32,980 --> 00:40:37,370 Així que s és, en aquest exemple particular, la direcció de h. 645 00:40:37,370 --> 00:40:41,850 Llavors, què significa això per fer s + i? 646 00:40:41,850 --> 00:40:46,280 Bé, i comença en 0 en aquest bucle for. Hem fet moltes vegades. 647 00:40:46,280 --> 00:40:49,760 Em pujarà a la longitud de la cadena, pel que sembla. 648 00:40:49,760 --> 00:40:53,950 Així que en la primera iteració d'aquest bucle, i és evidentment 0. 649 00:40:53,950 --> 00:41:01,740 Així que aquesta expressió està dient s + i - més aviat, es +0, això és, òbviament, només s. 650 00:41:01,740 --> 00:41:04,320 Llavors, què és * s aquí? 651 00:41:04,320 --> 00:41:08,530 Ara estem utilitzant l'estrella d'una manera lleugerament diferent. 652 00:41:08,530 --> 00:41:13,080 Deixa anar per davant i desfer-se de t perquè hem acabat parlant de t i còpies de s. 653 00:41:13,080 --> 00:41:15,540 Ara només vull explicar una història que involucra s. 654 00:41:15,540 --> 00:41:20,090 I així, en aquest moment, després de tipus string, el nostre món es veu absolutament com ho feia abans 655 00:41:20,090 --> 00:41:26,630 amb només s emmagatzemar la direcció de hi de manera més general que s'assenyala en la cadena hola. 656 00:41:26,630 --> 00:41:33,170 Si ara faig una línia com * (s + i), anem a provar això. 657 00:41:33,170 --> 00:41:40,140 Així * (s + i). Permetin-me simplificar això perquè això és 0, de manera que aquest és * (s +0). 658 00:41:40,140 --> 00:41:43,790 Bé, espera un minut. Simplificar encara més. Això és * (s). 659 00:41:43,790 --> 00:41:47,020 Bé, ara els parèntesis són una espècie d'estúpid, així que ara farem * s. 660 00:41:47,020 --> 00:41:50,540 Així, en la primera iteració d'aquest bucle, que la línia que està ressaltat, 26, 661 00:41:50,540 --> 00:41:53,650 és més o menys equivalent a la impressió d'això. 662 00:41:53,650 --> 00:41:56,040 Quin és el tipus de dades * s? 663 00:41:56,040 --> 00:42:00,770 En aquest context, perquè l'estrella passa a ser gairebé el mateix s, 664 00:42:00,770 --> 00:42:04,930 però més específicament, perquè ja no estem declarant s, 665 00:42:04,930 --> 00:42:09,730 no estem creant una variable més, no hi ha cap menció de char * en la línia 26, 666 00:42:09,730 --> 00:42:14,280 no hi ha esment de la cadena de paraules clau, només estem utilitzant una variable anomenada s, 667 00:42:14,280 --> 00:42:19,650 Resulta que ara l'estrella té una mica diferent i, sens dubte, confonent el significat. 668 00:42:19,650 --> 00:42:26,590 * S aquí significa anar a l'adreça de s i imprimir el que està allà. 669 00:42:26,590 --> 00:42:33,750 Així que es aquí, s * és - una cosa així com Serps i Escales, segueixi la fletxa - aquí. 670 00:42:33,750 --> 00:42:35,850 Així que això és * s. 671 00:42:35,850 --> 00:42:39,060 >> Així que el que s'imprimeix en la primera iteració d'aquest bucle en la línia 26? 672 00:42:39,060 --> 00:42:42,170 Puc imprimir% c, que és el marcador de posició per a un caràcter, 673 00:42:42,170 --> 00:42:48,520 llavors un \ n per a una nova línia. * (S + i), on i és 0 és precisament això. 674 00:42:48,520 --> 00:42:53,670 Llavors, què puc fer carbó en lloc de c%? H. 675 00:42:53,670 --> 00:42:56,900 En la següent iteració del bucle - és probable que pugui veure on va això - 676 00:42:56,900 --> 00:43:01,350 la següent iteració i és òbviament 1, de manera que aquest mitjà es +1, 677 00:43:01,350 --> 00:43:05,580 i ara em cal el parèntesi perquè ara l'estrella ha de dir 678 00:43:05,580 --> 00:43:08,620 anar a l'adreça de memòria s +1. 679 00:43:08,620 --> 00:43:14,170 Quin és s? Anem a retrocedir en el temps i dir això ara arrow realitat no se'ns està fent cap favor. 680 00:43:14,170 --> 00:43:18,450 Que és més específicament dir que aquest és l'emmagatzematge de la sèrie 123 681 00:43:18,450 --> 00:43:25,110 ja que l'inici d'aquesta cadena hola, aquesta és l'adreça 123, és a dir 124, i així successivament. 682 00:43:25,110 --> 00:43:30,550 Així que en la segona iteració quan dic s +1, que és com dir que un 123, 683 00:43:30,550 --> 00:43:35,340 també conegut com 124, així que el que s'imprimeix caràcters en la segona iteració? 684 00:43:35,340 --> 00:43:37,850 I en direcció de memòria 124. 685 00:43:37,850 --> 00:43:44,440 Entonces + més, 125, 126, 127, i per sort aquest bucle s'atura abans d'arribar aquí 686 00:43:44,440 --> 00:43:49,040 perquè estic fent servir strlen per assegurar-se que no compta massa alt. 687 00:43:49,040 --> 00:43:50,810 De manera que també ho és. 688 00:43:50,810 --> 00:43:55,000 De nou, això és com si haguéssim fet fa una setmana. 689 00:43:55,000 --> 00:43:59,200 Deixa que ho escrigui en la línia de sota tot i que no volem fer dues coses. 690 00:43:59,200 --> 00:44:02,500 Això és idèntic a aquest ara. 691 00:44:02,500 --> 00:44:08,310 >> Així que, encara que s és una cadena, com ho hem estat trucant durant setmanes, s és realment un char *. 692 00:44:08,310 --> 00:44:13,270 Així que si volem ser súper anal, és molt adequat per escriure el caràcter específic 693 00:44:13,270 --> 00:44:17,490 en la posició i-èsima usant aquestes adreces numèriques i d'aquest operador estrella, 694 00:44:17,490 --> 00:44:20,470 però, francament, això és simplement molt més net. Així que això no és dolent. 695 00:44:20,470 --> 00:44:26,720 No hi ha raó per deixar de fer la línia 27 aquí, però el 26 és funcionalment el mateix, 696 00:44:26,720 --> 00:44:31,570 i és funcionalment el mateix exactament per les raons que hem estat discutint fins ara. 697 00:44:31,570 --> 00:44:33,650 I finalment, 29 és només una bona pràctica. 698 00:44:33,650 --> 00:44:38,420 Trucar gratis de s significa que ara vostè està donant de nou la memòria que li va donar GetString 699 00:44:38,420 --> 00:44:41,630 perquè, de nou, com he esmentat dilluns, GetString per setmana 700 00:44:41,630 --> 00:44:44,180 ha estat la introducció d'un error en el codi. 701 00:44:44,180 --> 00:44:46,490 El seu codi de setmana ha tingut pèrdues de memòria 702 00:44:46,490 --> 00:44:49,970 pel que vostè ha estat preguntant GetString per a la memòria, però mai he estat donant volta. 703 00:44:49,970 --> 00:44:53,410 I això va ser triat deliberadament per nosaltres pedagògicament 704 00:44:53,410 --> 00:44:55,880 perquè és simplement massa com per pensar en el principi. 705 00:44:55,880 --> 00:44:57,710 Però ara necessitem més simetria. 706 00:44:57,710 --> 00:45:00,830 Si li demana a l'equip per a la memòria, com és el cas de GetString, 707 00:45:00,830 --> 00:45:02,820 com és el cas aparentment per malloc, 708 00:45:02,820 --> 00:45:07,970 Ara deu pset 4 en endavant també alliberar la memòria tal. 709 00:45:07,970 --> 00:45:11,650 Tingueu en compte que això és diferent de dir n int. 710 00:45:11,650 --> 00:45:15,040 No és necessari per alliberar això perquè vostè no va cridar a GetString 711 00:45:15,040 --> 00:45:16,890 i vostè no va cridar a malloc. 712 00:45:16,890 --> 00:45:20,610 >> I fins i tot si vostè diu getInt ja que finalment veurà, 713 00:45:20,610 --> 00:45:25,520 GetInt no assigna memòria per a vostè, perquè en realitat es pot passar al voltant dels nombres enters 714 00:45:25,520 --> 00:45:29,430 i flota i caràcters exactament de la manera que hem estat fent durant setmanes. 715 00:45:29,430 --> 00:45:33,960 Cordes, però, són especials perquè en realitat són la concatenació de caràcters múltiples. 716 00:45:33,960 --> 00:45:37,450 Així que són només diferents de caràcters i carrosses i sencers i similars. 717 00:45:37,450 --> 00:45:39,980 Però tornarem a això en poc temps. 718 00:45:39,980 --> 00:45:44,920 Qualsevol pregunta després en aquest inici de punters? Si. 719 00:45:44,920 --> 00:45:49,690 [Pregunta estudiant inaudible] 720 00:45:49,690 --> 00:45:51,440 Ah, molt bona pregunta. 721 00:45:51,440 --> 00:45:55,790 Una de les poques coses en realitat C fa per tu, el que és convenient, 722 00:45:55,790 --> 00:46:00,110 s'adona que per a tu el que la mida és del tipus de dades 723 00:46:00,110 --> 00:46:03,060 i després fa aquest tipus de multiplicació per a vostè. 724 00:46:03,060 --> 00:46:06,610 Això és irrellevant en el cas dels caràcters, ja que gairebé sempre és un char és un byte, 725 00:46:06,610 --> 00:46:08,150 així que això funciona. 726 00:46:08,150 --> 00:46:11,220 Però pel bé de la discussió, si en realitat estaven imprimint els nombres enters 727 00:46:11,220 --> 00:46:15,500 i que estava tractant d'imprimir una mica de s valor que s'apunta a un nombre enter, 728 00:46:15,500 --> 00:46:20,720 De la mateixa manera que no hauria de fer + 4 * i només perquè un int és de 4 bytes. 729 00:46:20,720 --> 00:46:25,780 L'aritmètica de punters significa que C i el compilador fer tot el que càlculs per vostè. 730 00:46:25,780 --> 00:46:29,190 Tot el que has de tenir en compte és el compte en una mena de sentit humà. Si. 731 00:46:29,190 --> 00:46:35,200 [Estudiant] Quan apareixen una cadena dins d'un bucle for, has de alliberar més tard? 732 00:46:35,200 --> 00:46:36,760 Bona pregunta. 733 00:46:36,760 --> 00:46:41,390 >> Si es declara una cadena dins el bucle for, és necessari per alliberar més tard? 734 00:46:41,390 --> 00:46:47,520 Només cal per alliberar la memòria que es pot assignar a GetString o amb malloc. 735 00:46:47,520 --> 00:46:53,110 Així que si vostè acaba de dir alguna cosa com - m'ho dius a mi posar claus ara el que tot el codi està relacionat. 736 00:46:53,110 --> 00:46:58,580 Si va fer alguna cosa, encara que buggily, com aquest, char * t = s, 737 00:46:58,580 --> 00:47:03,450 vostè no necessita t t lliures perquè no incloïa cap menció de malloc o GetString. 738 00:47:03,450 --> 00:47:08,960 Si per contra et va fer això, GetString, llavors sí, vostè hauria de t lliures. 739 00:47:08,960 --> 00:47:14,350 I de fet, l'única oportunitat de fer-ho és ara dins d'aquest bucle, per a la mateixa edició d'abast 740 00:47:14,350 --> 00:47:16,060 que hem discutit en el passat. 741 00:47:16,060 --> 00:47:18,830 En cas contrari, estaria l'assignació de memòria, assignació de memòria, assignació de memòria, 742 00:47:18,830 --> 00:47:21,230 i al final del programa, perquè estàs fora d'aquest circuit, 743 00:47:21,230 --> 00:47:24,240 t no existeix, però mai es va dir que el sistema operatiu 744 00:47:24,240 --> 00:47:26,750 que no era necessari que la memòria més. 745 00:47:26,750 --> 00:47:30,430 I en poc temps, per pset 4 o 5 et equiparà amb un programa anomenat Valgrind, 746 00:47:30,430 --> 00:47:34,160 que és similar en esperit al BGF ja que té una mena interfície arcà, 747 00:47:34,160 --> 00:47:35,750 però el seu propòsit en la vida és ajudar. 748 00:47:35,750 --> 00:47:39,380 I Valgrind és un programa que en el futur busqui seus programes 749 00:47:39,380 --> 00:47:42,550 a la recerca de fuites de memòria, ja sigui per GetString o malloc, 750 00:47:42,550 --> 00:47:47,800 que començarem a utilitzar amb més raó ara que deixi d'utilitzar la biblioteca CS50 tant. 751 00:47:47,800 --> 00:47:53,030 Per fi ara tenim una mena de vocabulari i el tipus de model mental en la teoria 752 00:47:53,030 --> 00:47:55,170 amb els de resoldre aquest programa trencada. 753 00:47:55,170 --> 00:47:59,410 >> Així que en aquest programa trencada o intercanvi treballa dins de swap, 754 00:47:59,410 --> 00:48:05,280 però en realitat mai va funcionar en la principal causa principal passava a x i i, recordem, 755 00:48:05,280 --> 00:48:07,260 i els que van ser passats per a valors, per així dir-ho. 756 00:48:07,260 --> 00:48:09,330 Les còpies d'ells van ser donats a canviar. 757 00:48:09,330 --> 00:48:12,520 Al final de l'intercanvi, a i b s'havia fet intercanviat, 758 00:48:12,520 --> 00:48:16,120 però, és clar, x i i, com vam veure el dilluns, no ho havia estat. 759 00:48:16,120 --> 00:48:19,940 Així que proposo en verd aquí que aquesta és en realitat la solució aquí. 760 00:48:19,940 --> 00:48:22,640 I, de fet, anem a moure els meus estrelles per estar d'acord 761 00:48:22,640 --> 00:48:24,440 encara que, de nou, funcionalment això no importa. 762 00:48:24,440 --> 00:48:28,730 En les properes setmanes explicarem quan i per què és important. 763 00:48:28,730 --> 00:48:30,600 Així, en verd ara és una solució. 764 00:48:30,600 --> 00:48:33,700 Francament, sembla molt més desordenat perquè tinc totes aquestes estrelles. 765 00:48:33,700 --> 00:48:35,380 Permetin-me assenyalar una cosa. 766 00:48:35,380 --> 00:48:40,040 La línia superior aquí on diu int * a * b i int 767 00:48:40,040 --> 00:48:42,820 fonamentalment fent el mateix que sempre ha fet. 768 00:48:42,820 --> 00:48:47,070 Es declara dos arguments o paràmetres a canviar, 769 00:48:47,070 --> 00:48:49,940 el primer dels quals és un punter int trucada, 770 00:48:49,940 --> 00:48:53,100 el segon dels quals és un punter int anomenat b. 771 00:48:53,100 --> 00:48:55,770 L'únic que hi ha de nou en aquest punt és el fet que hi ha una estrella allà. 772 00:48:55,770 --> 00:48:59,340 >> Què significa això? A no és un int, b no és un int. 773 00:48:59,340 --> 00:49:04,100 Una és la direcció d'un sencer i b és la direcció d'un int diferent. 774 00:49:04,100 --> 00:49:06,980 Aquí baix, aquí és on em admit C torna confús. 775 00:49:06,980 --> 00:49:09,790 Ara estem utilitzant una estrella, però té un significat diferent en aquest context. 776 00:49:09,790 --> 00:49:13,150 Perquè no estem declarant punters com som aquí, 777 00:49:13,150 --> 00:49:15,500 aquí estem dereferencing coses. 778 00:49:15,500 --> 00:49:21,520 Així que, tècnicament, l'estrella en aquest context de la primera línia, segona i tercera dins de swap 779 00:49:21,520 --> 00:49:24,560 és l'operador d'indirecció, la qual cosa significa anar-hi. 780 00:49:24,560 --> 00:49:27,400 Així que com el meu dit seguia la fletxa en h, 781 00:49:27,400 --> 00:49:31,100 * Als mitjans anar a aquesta direcció i em trobareu, el int que hi és. 782 00:49:31,100 --> 00:49:34,250 * B mitjans anar a l'adreça i em passa el que hi ha. 783 00:49:34,250 --> 00:49:40,730 Així que anem a tornar a dibuixar la imatge de dilluns ara usant una pila de marcs, 784 00:49:40,730 --> 00:49:43,130 el fons de la qual serà principal, 785 00:49:43,130 --> 00:49:47,600 el superior dels quals serà swap, 786 00:49:47,600 --> 00:49:50,880 perquè el nostre món es veu, igual que dilluns, així. 787 00:49:50,880 --> 00:49:53,620 Heus aquí un tros de memòria que principal s'utilitzarà. 788 00:49:53,620 --> 00:49:56,520 >> Recordeu de dilluns que el programa només tenia 2 variables, 789 00:49:56,520 --> 00:50:01,930 un anomenat X i una crida i, i jo havia posat els números 1 i 2 hi ha. 790 00:50:01,930 --> 00:50:06,580 Ara, quan jo dic canviar com ho vaig fer el dilluns, 791 00:50:06,580 --> 00:50:11,000 anteriorment quan he utilitzat la versió vermella d'aquest programa, que té aquest aspecte, 792 00:50:11,000 --> 00:50:17,470 Tinc dos paràmetres, a i b, i el que escrivim aquí i aquí? 793 00:50:17,470 --> 00:50:21,160 Només 1 i 2, literalment còpies de x i i. 794 00:50:21,160 --> 00:50:23,070 Avui podem canviar això. 795 00:50:23,070 --> 00:50:28,510 Avui en comptes de passar a enters a i b que passarem en dues direccions. 796 00:50:28,510 --> 00:50:34,290 Les adreces de succeir perquè apunti a INT, però aquestes adreces no són ells mateixos intercepcions. 797 00:50:34,290 --> 00:50:37,330 Són adreces. És com una adreça postal. 798 00:50:37,330 --> 00:50:40,580 Així que ara hem de acaba de donar-me una mica més de detall a la pantalla. 799 00:50:40,580 --> 00:50:43,250 Aquesta és la memòria del meu ordinador, ja que ha estat tot el dia. 800 00:50:43,250 --> 00:50:45,120 Ara necessitem una mica de arbitrari esquema de numeració. 801 00:50:45,120 --> 00:50:50,580 Així que anem a dir, per casualitat, que aquesta és l'adreça de memòria de 123, 124. 802 00:50:50,580 --> 00:50:55,660 Diguem que aquest és de 125, és a dir 126, i així successivament, però això és totalment arbitrària. 803 00:50:55,660 --> 00:50:58,590 Només necessitem un esquema de numeració en la meva memòria. 804 00:50:58,590 --> 00:51:04,030 Així que ara quan realment passa en x i y, no vaig a passar en X i Y; 805 00:51:04,030 --> 00:51:08,400 Vaig a passar a l'adreça postal, per dir-ho, de x i de y 806 00:51:08,400 --> 00:51:11,870 de manera que el que s'emmagatzema aquí i aquí no és 1 i 2, 807 00:51:11,870 --> 00:51:16,030 però si pots veure el meu petit text, el que es passa per aquí i aquí? 808 00:51:16,030 --> 00:51:23,340 [Resposta dels estudiants inaudible] >> Exactament. 123 es va posar aquí i 124 es va posar aquí. 809 00:51:23,340 --> 00:51:28,910 >> Ara, perquè jo l'estrella d'aquesta forma primera línia aquí a la part superior, 810 00:51:28,910 --> 00:51:34,340 meu programa només sap que 123 i 124, encara que són òbviament sencers 811 00:51:34,340 --> 00:51:40,160 que qualsevol humà podria notar, ells han de ser interpretats com adreces, adreces numèriques. 812 00:51:40,160 --> 00:51:43,250 No són en si mateixos sencers, que són les adreces, 813 00:51:43,250 --> 00:51:46,120 i això és perquè m'he posat explícitament les estrelles allà. 814 00:51:46,120 --> 00:51:51,360 Així que ara en la meva línia de primera, segona i tercera de codi real el que passa aquí? 815 00:51:51,360 --> 00:51:53,380 Anem a dibuixar la resta de la imatge. 816 00:51:53,380 --> 00:51:56,980 Tmp és igual que ho va ser el dilluns. Res especial a tmp. 817 00:51:56,980 --> 00:52:03,060 És a uns locals de 32 bits variable, i dins d'aquest parer estic emmagatzemant el valor de * a. 818 00:52:03,060 --> 00:52:08,580 Ara, si m'acaba de dir tmp = a, el que em va posar aquí? >> [Estudiant] 123. 819 00:52:08,580 --> 00:52:10,370 123. Però això no és el que estic fent. 820 00:52:10,370 --> 00:52:13,670 Estic dient tmp = * a. Significa estrella anar-hi. 821 00:52:13,670 --> 00:52:19,370 Així que aquí hi ha una, 123. Com puc anar? Imagina com si hi hagués una fletxa. 822 00:52:19,370 --> 00:52:24,460 Bé, aquí està, 1. Així que el que s'emmagatzema en tmp, pel que sembla? A només 1. 823 00:52:24,460 --> 00:52:29,620 En altres paraules, tmp és * a *, un mitjà de anar a l'adreça que es troba actualment en una, 824 00:52:29,620 --> 00:52:31,320 que aparentment és 123. 825 00:52:31,320 --> 00:52:33,910 >> Bé, aquí estem en la posició 123, veig el número 1, 826 00:52:33,910 --> 00:52:35,670 així que em vaig a posar el número 1 hi. 827 00:52:35,670 --> 00:52:39,020 Ara, què és el que faig en la línia 2, * a * = b? 828 00:52:39,020 --> 00:52:44,570 Aquest és una mica més complicat perquè ara el que és un? És 123. 829 00:52:44,570 --> 00:52:50,220 Així que * a és on? Just on estava abans. Així que anar-hi. Bé. 830 00:52:50,220 --> 00:52:53,420 Ara, finalment, i, finalment, es començarà a tenir sentit, és d'esperar, 831 00:52:53,420 --> 00:53:00,280 * B significa que el que està en b? 124. Així que he d'anar allà, que és 2. 832 00:53:00,280 --> 00:53:03,430 Llavors, què em poso a on? 833 00:53:03,430 --> 00:53:10,100 2 entra aquí perquè va a * b * a. Així que vaig a fer això. 834 00:53:10,100 --> 00:53:13,120 I ja es pot veure, potser, que estem molt més a prop 835 00:53:13,120 --> 00:53:17,710 a la solució d'aquest problema estúpid, simple correctament per primera vegada 836 00:53:17,710 --> 00:53:20,920 perquè ara encara ens queda un record del que era x, 837 00:53:20,920 --> 00:53:23,230 tenim 2 còpies, sens dubte, de i, 838 00:53:23,230 --> 00:53:25,850 però ara diu que la línia 3 * b. 839 00:53:25,850 --> 00:53:31,080 Així que aquí està b. B * significa anar-hi. I on és la ubicació 124? 840 00:53:31,080 --> 00:53:35,560 És pel que sembla aquí. Llavors, què poso aquí? Òbviament, tmp. 841 00:53:35,560 --> 00:53:39,600 Així que ara faig això. Així que tinc una aquí i 2 aquí. 842 00:53:39,600 --> 00:53:43,560 I ara, què passa amb tot això, el 123, el 124, i l'1? 843 00:53:43,560 --> 00:53:47,910 Així que retorns de swap, aquesta memòria és tan bona com perdut 844 00:53:47,910 --> 00:53:51,070 perquè així que retorns d'intercanvi, el sistema operatiu 845 00:53:51,070 --> 00:53:54,190 és lliure d'utilitzar la memòria de nou en el futur. 846 00:53:54,190 --> 00:53:58,870 Només la memòria principal a la part inferior d'aquesta pila de trucada s'enganxa al voltant. 847 00:53:58,870 --> 00:54:01,470 >> I així, per fi tenim ara una versió de treball. 848 00:54:01,470 --> 00:54:06,310 Déjame entrar swap.c i observeu el següent. 849 00:54:06,310 --> 00:54:11,280 A la part superior del programa que he canviat el meu prototip per ser int * a * b i int. 850 00:54:11,280 --> 00:54:15,000 Així que l'únic que vaig canviar per anar de vermell, que era dolent, al verd, la qual cosa és bo, 851 00:54:15,000 --> 00:54:17,350 se li vaig afegir aquestes estrelles d'avui. 852 00:54:17,350 --> 00:54:21,520 Però aquí baix, en si mateix canviar vaig haver copiar, enganxar el que era just a la diapositiva. 853 00:54:21,520 --> 00:54:24,140 Tinc aquí un estel, l'estrella aquí - que coincideix amb el prototip - 854 00:54:24,140 --> 00:54:27,930 i llavors totes aquestes coses ara tenen estrelles excepte tmp 855 00:54:27,930 --> 00:54:30,680 perquè l'ús d'una variable temporal, no hi ha res de nou allà. 856 00:54:30,680 --> 00:54:33,040 Només necessito d'emmagatzematge temporal per a un int. 857 00:54:33,040 --> 00:54:34,820 Així que no necessitem un estel allà. 858 00:54:34,820 --> 00:54:39,310 Només necessitem l'estrella perquè puguem travessar aquest tipus de límit arbitrari 859 00:54:39,310 --> 00:54:42,900 entre aquests dos marcs en la memòria del meu ordinador. 860 00:54:42,900 --> 00:54:45,630 Però una última cosa ha de canviar, i que podria haver albirat ja. 861 00:54:45,630 --> 00:54:48,810 Quina altra línia és òbviament diferent ara? >> [Els estudiants] i x. 862 00:54:48,810 --> 00:54:53,270 >> Sí, així que 25 és l'última línia de codi que necessita canviar perquè això funcioni. 863 00:54:53,270 --> 00:54:58,360 Fa una setmana i fins dilluns de la línia 25 es veia així, intercanviï x i i, 864 00:54:58,360 --> 00:55:02,020 i aquesta es va trencar perquè si dius swap (x, i) 865 00:55:02,020 --> 00:55:05,660 li està donant còpies de x i y per intercanviar, llavors està fent el seu, 866 00:55:05,660 --> 00:55:09,080 però mai en realitat està canviant xiy si mateix. 867 00:55:09,080 --> 00:55:12,880 Així que encara que vostè mai ha vist abans a aquest personatge amb el símbol d'unió en el codi, 868 00:55:12,880 --> 00:55:15,860 acaba de prendre una conjectura. Què significa el símbol d'unió fan, pel que sembla? 869 00:55:15,860 --> 00:55:17,890 [Estudiant] neu la. >> Pren la direcció. 870 00:55:17,890 --> 00:55:21,160 De manera que el signe està dient dóna'm la direcció de x. 871 00:55:21,160 --> 00:55:25,590 Qui sap on és? Li passa a ser 123. No m'importa. Només dóna'm la direcció de x. 872 00:55:25,590 --> 00:55:28,340 & I significa dóna'm la direcció de i. 873 00:55:28,340 --> 00:55:34,450 I en aquest punt la història és perfectament coherent amb la imatge que va dibuixar fa un moment. 874 00:55:34,450 --> 00:55:38,310 >> Així que vaig a admetre punters, sens dubte per a mi quan vaig començar a aprendre això, 875 00:55:38,310 --> 00:55:40,570 van ser sens dubte una de les coses més difícils d'embolicar el meu cap al voltant. 876 00:55:40,570 --> 00:55:43,760 Però dese compte, sobretot perquè seguim jugant amb aquest tipus de coses, 877 00:55:43,760 --> 00:55:48,030 si ho desglossem a aquesta classe de súper simple intel · lectualment interessants problemes 878 00:55:48,030 --> 00:55:52,270 de moure només els números més, la resposta a una gran confusió amb els punters 879 00:55:52,270 --> 00:55:56,590 realment es poden derivar d'aquestes mecàniques molt bàsiques. 880 00:55:56,590 --> 00:55:59,070 Aquí està la direcció. Veu allà amb l'estrella. 881 00:55:59,070 --> 00:56:03,830 O al revés, això és un símbol d'unió. Esbrinar quina és l'adreça que realment és. 882 00:56:03,830 --> 00:56:06,270 Està bé. 883 00:56:06,270 --> 00:56:09,000 On és tot això de memòria ve? 884 00:56:09,000 --> 00:56:12,360 Hem elaborat aquesta imatge un parell de vegades, i em segueixen prometent que anem a tornar-hi, 885 00:56:12,360 --> 00:56:14,920 però aquí és la representació de la memòria de l'equip 886 00:56:14,920 --> 00:56:17,420 que és una mica més marcat que el nostre pissarra aquí està. 887 00:56:17,420 --> 00:56:21,590 El segment de text a la part superior representa el que fa al seu programa? 888 00:56:21,590 --> 00:56:26,090 [Resposta dels estudiants inaudible] >> Com? Digues-ho de nou. 889 00:56:26,090 --> 00:56:28,660 [Estudiant] El programa actual. >> El programa en si. 890 00:56:28,660 --> 00:56:32,430 >> Així que el Clang 0 i 1 que ha compilat després d'escriure codi C i que després 891 00:56:32,430 --> 00:56:35,910 ends i la generació de 0s i 1s fins aconseguir amagat allà a la memòria 892 00:56:35,910 --> 00:56:38,570 perquè quan es fa doble clic en una icona en el teu Mac o PC 893 00:56:38,570 --> 00:56:43,010 o executar una ordre com mario en el seu sistema, la seva 0s i 1s de disc 894 00:56:43,010 --> 00:56:45,700 es carreguen a la memòria perquè l'ordinador pugui manipular 895 00:56:45,700 --> 00:56:47,540 i executar amb més rapidesa. 896 00:56:47,540 --> 00:56:50,880 Així dades inicialitzats i dades sense inicialitzar, no parlarem molt d'ells, 897 00:56:50,880 --> 00:56:52,420 però això són només les variables globals. 898 00:56:52,420 --> 00:56:54,710 Establir variables globals significa que va donar a valors; 899 00:56:54,710 --> 00:56:59,300 sense inicialitzar variables globals significa que vostè encara no donen valors a. 900 00:56:59,300 --> 00:57:01,900 Llavors hi ha aquestes variables d'entorn que estic totalment d'ona va la mà menys, 901 00:57:01,900 --> 00:57:04,860 però hi són i que emmagatzema coses com el seu nom d'usuari 902 00:57:04,860 --> 00:57:08,090 i un altre tipus d'informació de nivell inferior. 903 00:57:08,090 --> 00:57:12,880 Però els més sucosos trossos de la disposició de la seva memòria és aquesta cosa anomenada la pila i el heap. 904 00:57:12,880 --> 00:57:17,470 La pila de nou, perquè quedi clar, és la memòria que s'utilitza cada vegada que es diu a funcions, 905 00:57:17,470 --> 00:57:19,710 sempre que hi ha variables locals 906 00:57:19,710 --> 00:57:22,120 i sempre que hi hagi paràmetres que es passen al voltant. 907 00:57:22,120 --> 00:57:24,490 Tot això passa a la pila. 908 00:57:24,490 --> 00:57:29,570 El munt no hem parlat, però prendre una conjectura que utilitza la pila. 909 00:57:31,120 --> 00:57:32,690 Només una part diferent de la memòria. 910 00:57:32,690 --> 00:57:36,620 Li passa a ser dibuixat aquí a la part superior, però això és una convenció pictòrica arbitrària. 911 00:57:36,620 --> 00:57:41,670 Qui està pel que sembla s'utilitza la memòria del munt per setmanes? 912 00:57:41,670 --> 00:57:44,830 És tècnicament però indirectament. >> [Estudiant] GetString. 913 00:57:44,830 --> 00:57:47,950 GetString i malloc. Així que aquí està la diferència fonamental. 914 00:57:47,950 --> 00:57:51,300 >> Saps per les últimes setmanes que si necessites memòria, només declarar una variable. 915 00:57:51,300 --> 00:57:54,560 Si vostè necessita molta memòria, declarar una matriu de dret dins de la seva funció. 916 00:57:54,560 --> 00:57:59,620 Però el problema que hem mantingut enfrontem és si declara les variables locals dins de funcions, 917 00:57:59,620 --> 00:58:05,340 tan bon punt la funció retorna, el que passa amb la memòria i les variables d'aquests? 918 00:58:05,340 --> 00:58:09,620 Només espècie que ja no és teu, no? Simplement desapareix una espècie de vista conceptual. 919 00:58:09,620 --> 00:58:13,950 Segueix sent físicament allà, òbviament, però ja no és el seu dret d'ús. 920 00:58:13,950 --> 00:58:17,160 Això és òbviament problemàtic si vols escriure funcions en la vida 921 00:58:17,160 --> 00:58:20,440 que en realitat assignar memòria i no tornar immediatament. 922 00:58:20,440 --> 00:58:24,180 Cas en qüestió: GetString propòsit en la vida és no tenir idea per endavant 923 00:58:24,180 --> 00:58:26,390 el gran d'una cadena que vaig a escriure en el teclat, 924 00:58:26,390 --> 00:58:30,390 sinó que ha de ser capaç d'assignar memòria per contenir David o hola 925 00:58:30,390 --> 00:58:32,860 o un assaig sencer que l'usuari podria haver escrit polz 926 00:58:32,860 --> 00:58:35,280 Així GetString ha estat usant malloc. 927 00:58:35,280 --> 00:58:38,910 Malloc per tant no ha d'utilitzar la pila; 928 00:58:38,910 --> 00:58:40,770 sinó que està fent servir aquesta cosa anomenada el munt. 929 00:58:40,770 --> 00:58:44,430 No hi ha res diferent a la memòria. No és més ràpid o més lent o alguna cosa per l'estil. 930 00:58:44,430 --> 00:58:46,570 És només físicament en un lloc diferent. 931 00:58:46,570 --> 00:58:50,120 >> Però la regla és que la memòria que està assignada a la pila 932 00:58:50,120 --> 00:58:56,180 Mai serà pres de vosaltres, fins que es diu - prendre una conjectura - lliure. 933 00:58:56,180 --> 00:59:00,510 Per contra, qualsevol memòria de demanar a la pila amb només declarar una matriu 934 00:59:00,510 --> 00:59:03,320 o declarar una variable com la que hem estat fent durant setmanes, 935 00:59:03,320 --> 00:59:05,640 que, per defecte acaba a la pila. 936 00:59:05,640 --> 00:59:09,550 I que funciona molt bé 90% del temps, però en aquestes ocasions més rares 937 00:59:09,550 --> 00:59:12,470 en la qual voleu assignar la memòria i mantenir al seu voltant, 938 00:59:12,470 --> 00:59:14,730 llavors vostè necessita utilitzar una funció com malloc. 939 00:59:14,730 --> 00:59:19,370 O hem utilitzat una funció com GetString, que al seu torn utilitza malloc. 940 00:59:19,370 --> 00:59:23,300 Anem a veure on podria trencar cap avall i després fer una ullada a Binky. 941 00:59:23,300 --> 00:59:25,820 Tornarem a que en el futur. 942 00:59:25,820 --> 00:59:29,270 Aquí hi ha un programa super senzill que en les primeres 2 línies fa què? 943 00:59:29,270 --> 00:59:33,460 En Anglès, què aquestes primeres 2 línies de codi realitzen dins de la principal? 944 00:59:33,460 --> 00:59:35,600 [Resposta dels estudiants inaudible] 945 00:59:35,600 --> 00:59:37,880 Amb cura. No em dóna la direcció de x o i. 946 00:59:37,880 --> 00:59:41,840 [Estudiant] Proporciona punters a sencers. Bé >>. Dóna'm 2 punteres a sencers. 947 00:59:41,840 --> 00:59:45,130 En altres paraules, em donen 2 trossos de memòria que guardo dibuix avui, 948 00:59:45,130 --> 00:59:46,950 tot i que l'ha esborrat ara, com quadrats. 949 00:59:46,950 --> 00:59:50,000 Dóna'm dos trossos de memòria, una trucada x, que es diu i - 950 00:59:50,000 --> 00:59:54,320 abans em deien s i t - i quin és el tipus d'aquest tros de memòria? 951 00:59:54,320 --> 00:59:57,160 Es va a emmagatzemar una adreça. 952 00:59:57,160 --> 00:59:59,110 * És de tipus int. 953 00:59:59,110 --> 01:00:01,630 >> Així que la direcció d'un int amb el temps va a viure en x, 954 01:00:01,630 --> 01:00:03,860 la direcció d'un int amb el temps va a viure en i, 955 01:00:03,860 --> 01:00:08,460 però en un principi, el que hi ha dins de x i y? Qui sap? Valors d'escombraries. 956 01:00:08,460 --> 01:00:10,180 No té res a veure amb punters. 957 01:00:10,180 --> 01:00:12,720 Si no hem posat una mica allà, qui sap el que està realment allà? 958 01:00:12,720 --> 01:00:18,950 Ara, x. Què passa aquí? Això és legítima perquè ara x un punter. És un * int. 959 01:00:18,950 --> 01:00:21,870 Així que això significa que puc posar en la direcció x d'algun tros de memòria. 960 01:00:21,870 --> 01:00:25,120 Què malloc tornar? Perfecte, retorna les adreces, 961 01:00:25,120 --> 01:00:28,510 la direcció del primer byte d'un tros sencer de memòria. 962 01:00:28,510 --> 01:00:31,140 Quants bytes s'està assignant pel que sembla, per exemple, en l'aparell? 963 01:00:31,140 --> 01:00:33,510 Quina és la mida d'un int? 4. 964 01:00:33,510 --> 01:00:36,600 Si penses en la setmana 1, no és super important recordar sempre que, 965 01:00:36,600 --> 01:00:38,870 però en aquest cas, és útil saber, 4 bytes. 966 01:00:38,870 --> 01:00:41,770 Així que aquesta és l'assignació en el munt de 4 bytes 967 01:00:41,770 --> 01:00:46,110 i es torna la direcció de la primera que em arbitràriament. 968 01:00:46,110 --> 01:00:47,700 Ara, què està fent x? 969 01:00:47,700 --> 01:00:52,200 A * x = 42 està fent què? 970 01:00:52,200 --> 01:00:57,150 Si en aquest punt de la història que tenim x, que té aquest aspecte amb un valor escombraries, 971 01:00:57,150 --> 01:01:04,120 això és ara i amb un valor escombraries, ara en la línia 3 que he assignat 4 bytes. 972 01:01:04,120 --> 01:01:06,950 Aquest quadre essencialment són aquestes. 973 01:01:06,950 --> 01:01:12,010 O més específicament, si aquesta és la direcció arbitrària 123, això és el que la nostra història ara sembla. 974 01:01:12,010 --> 01:01:23,940 * X = 42 ara què significa? Això vol dir anar a la direcció 123 i posar el número 42 hi. 975 01:01:23,940 --> 01:01:26,220 No cal dibuixar aquestes línies perquè no estem fent cadenes. 976 01:01:26,220 --> 01:01:29,480 >> Hi hauria d'haver escrit així, i només per causa de la manifestació, 977 01:01:29,480 --> 01:01:33,240 42 com un tipus int ocupa molt espai, 4 bytes. 978 01:01:33,240 --> 01:01:35,960 Així que això és el que ha passat allà, però hi ha un problema ara. 979 01:01:35,960 --> 01:01:40,580 * I = 13. ¿Què passarà aquí? 980 01:01:40,580 --> 01:01:46,470 El problema és i * en el nostre món simplificat només significa anar a la direcció en i. 981 01:01:46,470 --> 01:01:48,590 Què hi ha a i? És cert valor escombraries. 982 01:01:48,590 --> 01:01:53,150 Així que anem a suposar que aquest valor és 5551212 escombraries, una mica de boig. 983 01:01:53,150 --> 01:01:56,750 * Significa que I s'abordaran 5551212. 984 01:01:56,750 --> 01:02:00,450 Això és així per aquí. No hi ha, per exemple. 985 01:02:00,450 --> 01:02:05,310 Així obté 13 * i mig que estic tractant de dibuixar 13 aquí. No existeix. 986 01:02:05,310 --> 01:02:08,790 He superat el segment de la pissarra. Què obtinc? 987 01:02:08,790 --> 01:02:14,930 Aquest missatge críptic error de segmentació perquè estic tractant de posar en la memòria 988 01:02:14,930 --> 01:02:19,470 un valor com 13 en un lloc que no existeix. 989 01:02:19,470 --> 01:02:23,900 La resta del programa pot funcionar bé, però fins a aquest moment no ho fa. 990 01:02:23,900 --> 01:02:25,350 Així que anem a tractar d'explicar aquesta història. 991 01:02:25,350 --> 01:02:27,830 Tornarem al fet que una vegada que hem parlat hexagonal. 992 01:02:27,830 --> 01:02:30,290 Tornem a això i concloure amb aquesta cosa anomenada Binky, 993 01:02:30,290 --> 01:02:33,710 que recordo és un professor de Stanford que se senti a casa jugant amb plastilina, 994 01:02:33,710 --> 01:02:36,380 per explicar la història de exactament el mateix programa. 995 01:02:36,380 --> 01:02:40,580 És només al voltant de 3 minuts de durada. Aquí tenim Binky. 996 01:02:40,580 --> 01:02:45,030 [Parlant masculí al vídeo] Hey Binky, desperta. És temps per a la diversió punter. 997 01:02:45,030 --> 01:02:50,080 [Binky] Què és això? Aprendre sobre els punters? Oh, que bé! 998 01:02:50,080 --> 01:02:53,700 [Parlant masculí] Bé, per començar, crec que necessitarem un parell de punters. 999 01:02:53,700 --> 01:02:57,890 >> [Binky] Bé. Aquest codi assigna 2 punteres que poden apuntar a sencers. 1000 01:02:57,890 --> 01:03:02,220 [Parlant masculí] Bé. Bé, veig que els dos punters, però no semblen estar apuntant a res. 1001 01:03:02,220 --> 01:03:05,550 [Binky] Això és correcte. Inicialment, els punters no apunten a res. 1002 01:03:05,550 --> 01:03:09,270 Les coses que apunten són anomenats pointees i configurar és un pas separat. 1003 01:03:09,270 --> 01:03:12,330 [Parlant masculí] Oh, és clar, és clar. Ja ho sabia. Els pointees estan separats. 1004 01:03:12,330 --> 01:03:15,630 Er, així que com assignar un pointee? 1005 01:03:15,630 --> 01:03:21,510 [Binky] Bé. Aquest codi assigna un nombre enter pointee nou, i aquesta part es presenten x perquè apunti a ell. 1006 01:03:21,510 --> 01:03:23,500 [Parlant masculí] Hey, això es veu millor. 1007 01:03:23,500 --> 01:03:26,030 Així que faci alguna cosa. >> [Binky] Bé. 1008 01:03:26,030 --> 01:03:30,300 Vaig a eliminar la referència al punter x per emmagatzemar el número 42 en el seu pointee. 1009 01:03:30,300 --> 01:03:34,410 Per aquest truc que vaig a necessitar la meva vareta màgica de la cancel · lació de referència. 1010 01:03:34,410 --> 01:03:38,610 [Parlant masculí] La teva vareta màgica de l'eliminació de referències? Això és genial. 1011 01:03:38,610 --> 01:03:44,230 [Binky] Això és el que el codi sembla. Vaig a establir el nombre i la ... [Apareixent de so] 1012 01:03:44,230 --> 01:03:46,100 [Parlant masculí] Hey mira, aquí va. 1013 01:03:46,100 --> 01:03:50,990 Així que fer una desreferencia de x segueix la fletxa per accedir al seu pointee, 1014 01:03:50,990 --> 01:03:53,230 en aquest cas per emmagatzemar 42 a allà. 1015 01:03:53,230 --> 01:03:57,630 Hey, tracta d'usar-lo per emmagatzemar el número 13 a través de l'altre punter, i. 1016 01:03:57,630 --> 01:04:03,250 [Binky] Bé. Vaig a repassar aquí per obtenir ii el número 13 estableix 1017 01:04:03,250 --> 01:04:08,360 i després prendre la vara d'eliminació de referències i només ... [Buzz] Whoa! 1018 01:04:08,360 --> 01:04:10,980 [Parlant masculí] Oh bé, això no va funcionar. 1019 01:04:10,980 --> 01:04:14,870 >> Diguem, Binky, no crec dereferencing i és una bona idea 1020 01:04:14,870 --> 01:04:17,880 perquè la creació de la pointee és un pas separat 1021 01:04:17,880 --> 01:04:19,850 i no crec que alguna vegada ho va fer. 1022 01:04:19,850 --> 01:04:21,770 [Binky] Hmm, bon punt. 1023 01:04:21,770 --> 01:04:26,640 [Parlant masculí] Yeah. Ens van assignar el punter i però mai posar perquè apunti a un pointee. 1024 01:04:26,640 --> 01:04:28,780 [Binky] Hmm, molt observador. 1025 01:04:28,780 --> 01:04:30,690 [Parlant masculí] Hey, et veus molt bé allà, Binky. 1026 01:04:30,690 --> 01:04:34,160 Pots arreglar perquè i apunta a la pointee mateix que x? >> [Binky] Clar. 1027 01:04:34,160 --> 01:04:37,100 Vaig a utilitzar el meu vareta màgica de l'assignació de punter. 1028 01:04:37,100 --> 01:04:39,070 [Parlant masculí] És que serà un problema com abans? 1029 01:04:39,070 --> 01:04:40,840 [Binky] No, això no toca les pointees. 1030 01:04:40,840 --> 01:04:44,780 Només canvia un punter per assenyalar a la mateixa cosa que una altra. [Apareixent de so] 1031 01:04:44,780 --> 01:04:48,570 [Parlant masculí] Oh, ja veig. Ara i apunta al mateix lloc que x. 1032 01:04:48,570 --> 01:04:51,140 Així que esperar. Ara i és fix. Té un pointee. 1033 01:04:51,140 --> 01:04:54,520 Així que vostè pot provar la vareta d'eliminació de referències tornar a enviar els més de 13 anys. 1034 01:04:54,520 --> 01:04:58,130 [Binky] Uh, està bé. Heus aquí. [Apareixent de so] 1035 01:04:58,130 --> 01:05:01,250 [Parlant masculí] Hey, mira això. Ara eliminació de referències a obres i. 1036 01:05:01,250 --> 01:05:05,200 I pel fet que els punters que estan compartint un pointee, ambdós veuen el 13. 1037 01:05:05,200 --> 01:05:06,910 [Binky] Sí, compartir. El que sigui. 1038 01:05:06,910 --> 01:05:08,880 >> Així que anem a canviar de lloc ara? 1039 01:05:08,880 --> 01:05:11,420 [Parlant masculí] Oh, mira, estem fora de temps. >> [Binky] Però - 1040 01:05:11,420 --> 01:05:13,880 [Parlant masculí] Només recorda les 3 regles de punter. 1041 01:05:13,880 --> 01:05:18,630 El número 1, l'estructura bàsica és que vostè té un punter i apunta a un pointee. 1042 01:05:18,630 --> 01:05:23,120 Però el punter i pointee estan separats, i l'error comú és la creació d'un punter 1043 01:05:23,120 --> 01:05:25,680 però us oblideu de donar-li un pointee. 1044 01:05:25,680 --> 01:05:29,580 Número 2, desreferencia punter comença al punter i segueix el seu ratolí a sobre 1045 01:05:29,580 --> 01:05:31,060 per accedir al seu pointee. 1046 01:05:31,060 --> 01:05:34,340 Com tots sabem, això només funciona si hi ha un pointee, 1047 01:05:34,340 --> 01:05:36,460 quin tipus de torni a la regla número 1. 1048 01:05:36,460 --> 01:05:39,870 Número 3, assignació de punter pren un punter i el canvia 1049 01:05:39,870 --> 01:05:42,390 perquè apunti a la pointee mateix com un altre punter. 1050 01:05:42,390 --> 01:05:45,890 Així que després de la cessió, els 2 punters que apunten a la pointee mateix. 1051 01:05:45,890 --> 01:05:47,800 De vegades això es diu compartir. 1052 01:05:47,800 --> 01:05:50,910 >> I això és tot el que hi ha en realitat. Bye-bye ara. 1053 01:05:50,910 --> 01:05:55,840 Això és Binky. Això és CS50. Ens veiem la setmana que ve. [Aplaudiment] 1054 01:05:55,840 --> 01:05:59,000 >> [CS50.TV]