1 00:00:00,000 --> 00:00:11,320 2 00:00:11,320 --> 00:00:13,260 >> DAVID Malan: Hola, i benvinguts a CS50. 3 00:00:13,260 --> 00:00:14,860 Així que aquest és el final de la quarta setmana. 4 00:00:14,860 --> 00:00:16,680 Només un anunci primer. 5 00:00:16,680 --> 00:00:19,600 Així l'anomenada cinquena dilluns és ve dilluns que ve. 6 00:00:19,600 --> 00:00:22,800 Aquesta és l'oportunitat de canviar de SAT / UNSAT a un grau de la lletra, o de 7 00:00:22,800 --> 00:00:24,130 grau de la lletra SAT / UNSAT. 8 00:00:24,130 --> 00:00:27,130 Molest, el procés requereix una signatura, perquè cal omplir 9 00:00:27,130 --> 00:00:28,770 a terme una de les formes d'inserció / extracció de color rosa. 10 00:00:28,770 --> 00:00:31,680 >> Perquè tècnicament, el SAT / UNSAT versió i la versió qualificació de lletra 11 00:00:31,680 --> 00:00:33,320 tenen números de catàleg diferents. 12 00:00:33,320 --> 00:00:34,240 Però no és gran cosa. 13 00:00:34,240 --> 00:00:36,620 Només vine a mi o a Rob o a Lauren en qualsevol punt. 14 00:00:36,620 --> 00:00:39,550 O envieu-nos un correu electrònic si vostè no té el tipus de paperassa que necessita avui, i 15 00:00:39,550 --> 00:00:43,410 serà segur per ajudar a prendre compte que abans de dilluns. 16 00:00:43,410 --> 00:00:45,780 >> Molt bé, així que avui - 17 00:00:45,780 --> 00:00:47,630 En realitat, hi ha una mica d'eco. 18 00:00:47,630 --> 00:00:51,070 Podem to em una mica? 19 00:00:51,070 --> 00:00:51,730 D'acord. 20 00:00:51,730 --> 00:00:54,850 Així que avui, s'introdueix un tema conegut com punters. 21 00:00:54,850 --> 00:00:57,770 I vaig a admetre que aquest és un dels els temes més complexos que tendim a 22 00:00:57,770 --> 00:01:00,960 cobrir en aquesta classe, o en realitat qualsevol curs introductori que utilitza C. 23 00:01:00,960 --> 00:01:05,510 >> Però prengui la meva paraula per a ella, sobretot si la seva ment se sent una mica més inclinada 24 00:01:05,510 --> 00:01:07,100 avui i en les properes setmanes. 25 00:01:07,100 --> 00:01:10,340 No és representatiu de vostè aconseguir pitjor en aquest només vol dir que 26 00:01:10,340 --> 00:01:13,360 és un tema particularment sofisticat que prometen, un parell de setmanes 27 00:01:13,360 --> 00:01:17,610 per tant, li semblarà molt cridaner directa en retrospectiva. 28 00:01:17,610 --> 00:01:18,720 >> Encara recordo a aquest dia. 29 00:01:18,720 --> 00:01:22,190 Jo estava assegut a Elliott Dining Hall, assegut al costat de la meva TF Nishat Mehta, 30 00:01:22,190 --> 00:01:24,070 que era un resident d'Elliott casa. 31 00:01:24,070 --> 00:01:26,340 I per alguna raó, aquesta tema simplement fa clic. 32 00:01:26,340 --> 00:01:29,430 Què vol dir que jo també vaig lluitar amb ell durant algun temps, però 33 00:01:29,430 --> 00:01:33,610 Faré el meu millor per ajudar a evitar qualsevol lluita amb un tema que en última instància, 34 00:01:33,610 --> 00:01:34,580 és bastant potent. 35 00:01:34,580 --> 00:01:37,350 >> De fet, un dels temes que anem a discutir en les properes setmanes és que 36 00:01:37,350 --> 00:01:41,130 de seguretat, i com en realitat es pot explotar màquines en formes 37 00:01:41,130 --> 00:01:42,320 que no es pretenia. 38 00:01:42,320 --> 00:01:45,850 I aquestes explotacions són típicament el resultat d'errors, errors que 39 00:01:45,850 --> 00:01:49,740 la gent fa per no entendre alguns de la implementació subjacent 40 00:01:49,740 --> 00:01:52,250 detalls a través de la qual es fan els programes. 41 00:01:52,250 --> 00:01:55,410 >> Ara, per fer que això sembli encara més usuaris amable, vaig pensar que jugaria a 10 42 00:01:55,410 --> 00:01:59,680 segona vista prèvia d'una mica d'animació amb plastilina xifra anomenat Binky, que va ser portat a 43 00:01:59,680 --> 00:02:03,020 vida per un amic nostre a Stanford, professor Nick Parlant. 44 00:02:03,020 --> 00:02:06,753 Així que permeteu-me que li dono a aquest teaser del Binky aquí. 45 00:02:06,753 --> 00:02:09,520 >> [REPRODUIR VIDEO] 46 00:02:09,520 --> 00:02:10,380 >> -Ei, Binky. 47 00:02:10,380 --> 00:02:11,050 Desperta. 48 00:02:11,050 --> 00:02:13,610 És temps per a la diversió punter. 49 00:02:13,610 --> 00:02:14,741 >> -Què és això? 50 00:02:14,741 --> 00:02:16,440 Assabenti dels punters? 51 00:02:16,440 --> 00:02:17,928 Oh, que bé. 52 00:02:17,928 --> 00:02:18,920 >> [FI REPRODUCCIÓ DE VÍDEO] 53 00:02:18,920 --> 00:02:20,670 >> DAVID Malan: És Stanford la informàtica. 54 00:02:20,670 --> 00:02:23,194 Així que més del que vindria. 55 00:02:23,194 --> 00:02:24,930 >> [Aplaudiments] 56 00:02:24,930 --> 00:02:26,660 >> DAVID Malan: Ho sento, Nick. 57 00:02:26,660 --> 00:02:30,680 >> Així que recorda que l'última vegada que vam acabar de això realment emocionant melodrama 58 00:02:30,680 --> 00:02:32,960 pel que aquesta funció simplement no va funcionar. 59 00:02:32,960 --> 00:02:34,960 Almenys intuïtivament, se sentia com ha de funcionar. 60 00:02:34,960 --> 00:02:37,600 Simplement canviant els valors de dos nombres enters. 61 00:02:37,600 --> 00:02:40,915 Però recordo que quan imprimim la valors originals en principal, una i 62 00:02:40,915 --> 00:02:44,210 dos, que seguien una i dos i no dos i un. 63 00:02:44,210 --> 00:02:46,070 >> Així que en realitat m'encenc sobre l'aparell. 64 00:02:46,070 --> 00:02:50,180 I vaig escriure una mica de codi esquelètic en avançar aquí, on afirmo que x 65 00:02:50,180 --> 00:02:52,500 serà 1, i serà 2. 66 00:02:52,500 --> 00:02:54,810 Llavors jo imprimeixo tant de la seva valors amb print f. 67 00:02:54,810 --> 00:02:57,540 >> Llavors jo sostinc aquí que anem a canviar-los. 68 00:02:57,540 --> 00:03:00,800 He deixat un espai en blanc aquí perquè ompli avui en un moment. 69 00:03:00,800 --> 00:03:03,380 Llavors, vaig a afirmar que el dues variables que s'han intercanviat. 70 00:03:03,380 --> 00:03:04,770 A continuació, vaig a imprimir cap a fora una altra vegada. 71 00:03:04,770 --> 00:03:07,090 I així, amb sort, he de veure 1, 2. 72 00:03:07,090 --> 00:03:07,380 2, 1. 73 00:03:07,380 --> 00:03:09,830 Aquest és el super simple objectiu en aquests moments. 74 00:03:09,830 --> 00:03:12,430 >> Llavors, com fem per intercanviar dues variables? 75 00:03:12,430 --> 00:03:17,220 Bé, si em proposo aquí que aquestes copes podria representar la memòria en un ordinador. 76 00:03:17,220 --> 00:03:19,070 Es tracta d'uns pocs mossos, això és una altra de les picades. 77 00:03:19,070 --> 00:03:23,260 Podríem haver arribat a un voluntari en un màxim i ens barregi algunes begudes, si resulta familiar? 78 00:03:23,260 --> 00:03:23,920 Anem amunt. 79 00:03:23,920 --> 00:03:24,815 Com et dius? 80 00:03:24,815 --> 00:03:25,260 >> JESS: Jess. 81 00:03:25,260 --> 00:03:25,690 >> DAVID Malan: Jess? 82 00:03:25,690 --> 00:03:26,540 Anem amunt, Jess. 83 00:03:26,540 --> 00:03:29,180 Si no t'importa, hem de posar el Google Glass en vostè perquè puguem 84 00:03:29,180 --> 00:03:30,430 immortalitzar això. 85 00:03:30,430 --> 00:03:32,800 86 00:03:32,800 --> 00:03:34,670 Acceptar, vidre. 87 00:03:34,670 --> 00:03:37,250 Gravar un vídeo. 88 00:03:37,250 --> 00:03:43,103 I bé, estem ben anar amb Jess aquí. 89 00:03:43,103 --> 00:03:43,810 Està bé. 90 00:03:43,810 --> 00:03:45,120 Gust a conèixer-lo. 91 00:03:45,120 --> 00:03:47,720 >> Així que el que m'agradaria fer aquí - si es pogués, amb força rapidesa - 92 00:03:47,720 --> 00:03:51,040 només ens aboca la meitat d'un got de taronja suc i la meitat d'un got de llet, 93 00:03:51,040 --> 00:03:55,710 representa efectivament els nombres 1 en una tassa i 2 en l'altre got. 94 00:03:55,710 --> 00:04:01,380 95 00:04:01,380 --> 00:04:02,630 >> Això serà bo metratge. 96 00:04:02,630 --> 00:04:04,910 97 00:04:04,910 --> 00:04:05,860 >> JESS: Ho sento. 98 00:04:05,860 --> 00:04:06,330 >> DAVID Malan: No, no. 99 00:04:06,330 --> 00:04:08,703 Està bé. 100 00:04:08,703 --> 00:04:10,120 Niça. 101 00:04:10,120 --> 00:04:12,950 Molt bé, així que tenim quatre octets val la pena de suc de taronja. 102 00:04:12,950 --> 00:04:14,460 Ens dèiem el valor 1. 103 00:04:14,460 --> 00:04:16,579 Ara quatre bytes de valor de la llet. 104 00:04:16,579 --> 00:04:18,519 Anomenarem valor 2. 105 00:04:18,519 --> 00:04:20,440 Així que x i y, respectivament. 106 00:04:20,440 --> 00:04:23,450 >> Molt bé, així que ara si la tasca en qüestió - per a tu, Jess, davant de tots 107 00:04:23,450 --> 00:04:24,270 dels seus companys de classe - 108 00:04:24,270 --> 00:04:28,510 és per intercanviar els valors de x i y tals que volem que el suc de taronja a la 109 00:04:28,510 --> 00:04:32,070 altra tassa i la llet en aquesta copa, com podria vostè - abans que vostè faci 110 00:04:32,070 --> 00:04:34,020 ella - anar fent això? 111 00:04:34,020 --> 00:04:35,220 >> Bé, sàvia decisió. 112 00:04:35,220 --> 00:04:36,340 Així que hi ha una mica més de memòria. 113 00:04:36,340 --> 00:04:38,190 Així que anem a assignar un temporal tassa, si es vol. 114 00:04:38,190 --> 00:04:40,540 I ara procedir a canviar x i y. 115 00:04:40,540 --> 00:04:52,950 116 00:04:52,950 --> 00:04:53,530 >> Excel · lent. 117 00:04:53,530 --> 00:04:54,420 Així que molt ben fet. 118 00:04:54,420 --> 00:04:55,670 Moltes gràcies, Jess. 119 00:04:55,670 --> 00:04:59,520 120 00:04:59,520 --> 00:05:00,020 Aquí té. 121 00:05:00,020 --> 00:05:01,950 Un petit record. 122 00:05:01,950 --> 00:05:04,350 >> OK, així que òbviament, idea super simple. 123 00:05:04,350 --> 00:05:07,500 Totalment intuïtiu que necessitem una mica més espai d'emmagatzematge - d'aquesta manera, 124 00:05:07,500 --> 00:05:09,750 una tassa - si en realitat volen intercanviar aquestes dues variables. 125 00:05:09,750 --> 00:05:11,110 Així que anem a fer exactament això. 126 00:05:11,110 --> 00:05:14,330 Fins aquí, al mig, on afirmo que sóc va a fer una mica d'intercanvi, ho faré 127 00:05:14,330 --> 00:05:15,720 seguir endavant i declarar la temp. 128 00:05:15,720 --> 00:05:17,980 I em vaig posar igual a, diguem, x. 129 00:05:17,980 --> 00:05:21,110 >> Llavors em canviaré el valor de x igual que Jess va fer aquí amb el 130 00:05:21,110 --> 00:05:23,200 llet i suc de taronja perquè sigui igual a i. 131 00:05:23,200 --> 00:05:27,460 I jo canviaré i ser igual a no x, perquè ara estaríem 132 00:05:27,460 --> 00:05:29,530 atrapat en un cercle, sinó més aviat TEMP. 133 00:05:29,530 --> 00:05:33,170 On temporalment - o on Jess aparcar temporalment el suc de taronja 134 00:05:33,170 --> 00:05:35,460 abans que apallissar tassa amb la llet. 135 00:05:35,460 --> 00:05:37,250 >> Així que permetin-me anar endavant ara i faig això. 136 00:05:37,250 --> 00:05:39,210 Es diu noswap.c. 137 00:05:39,210 --> 00:05:41,190 I ara m'ho dius córrer cap intercanvi. 138 00:05:41,190 --> 00:05:43,910 I de fet ho veig, si puc ampliar la finestra una mica, que 139 00:05:43,910 --> 00:05:45,160 x és 1, i és 2. 140 00:05:45,160 --> 00:05:47,230 I llavors x és 2, i és 1. 141 00:05:47,230 --> 00:05:51,910 >> Però recordem que dilluns vam fer coses una mica diferent pel que 142 00:05:51,910 --> 00:05:56,760 vegada implementat una funció auxiliar, si es vol, que en realitat era nul · la. 143 00:05:56,760 --> 00:05:58,010 El vaig trucar intercanviar. 144 00:05:58,010 --> 00:06:01,600 Li vaig donar dos paràmetres, i vaig trucar ells una i em deien b. 145 00:06:01,600 --> 00:06:04,380 >> Francament, jo podria anomenar x i y. 146 00:06:04,380 --> 00:06:06,040 Res li deté jo faci això. 147 00:06:06,040 --> 00:06:08,140 Però jo diria que és llavors una mica ambigua. 148 00:06:08,140 --> 00:06:11,910 Com recordatori per dilluns que Van al · legar que aquests paràmetres van ser 149 00:06:11,910 --> 00:06:13,650 còpies dels valors passats polz 150 00:06:13,650 --> 00:06:15,640 Pel que només es fica amb el seu ment, crec que, si utilitza 151 00:06:15,640 --> 00:06:17,370 exactament les mateixes variables. 152 00:06:17,370 --> 00:06:20,150 >> Així que vaig a trucar a ells en lloc d'una i b, només per a major claredat. 153 00:06:20,150 --> 00:06:21,840 Però podríem anomenar més el que vulguem. 154 00:06:21,840 --> 00:06:26,280 I jo vaig a copiar i enganxar efectivament aquest codi des d'allà 155 00:06:26,280 --> 00:06:27,170 baix a aquí. 156 00:06:27,170 --> 00:06:29,110 Perquè acabo de veure que funciona. 157 00:06:29,110 --> 00:06:30,790 Així que això és en molt bona forma. 158 00:06:30,790 --> 00:06:37,390 I vaig a canviar el meu x a una, el meu x a una, i per a mi i la meva b i a b. 159 00:06:37,390 --> 00:06:39,130 >> En altres paraules, exactament la mateixa lògica. 160 00:06:39,130 --> 00:06:40,850 Exactament el mateix que Jess va fer. 161 00:06:40,850 --> 00:06:44,350 I llavors l'únic que he de fer fins aquí, per descomptat, ara invocar aquest 162 00:06:44,350 --> 00:06:45,990 funció, o trucar a aquesta funció. 163 00:06:45,990 --> 00:06:50,430 Així que vaig a cridar a aquesta funció amb dos entrades, x i y, i premeu Desa. 164 00:06:50,430 --> 00:06:52,300 >> D'acord, fonamentalment, la mateixa cosa. 165 00:06:52,300 --> 00:06:55,570 De fet, probablement he fet el programa innecessàriament complexa per 166 00:06:55,570 --> 00:07:00,820 escriure una funció que acaba de prendre uns sis línies de codi mentre que jo 167 00:07:00,820 --> 00:07:02,970 prèviament havien implementat això en tan sols tres. 168 00:07:02,970 --> 00:07:06,230 >> Així que permetin-me anar endavant ara i refer això, no fan swap. 169 00:07:06,230 --> 00:07:07,920 Bé, em vaig cagar aquí. 170 00:07:07,920 --> 00:07:11,290 Això ha de ser un error que podria veure cada vegada més comunament com el 171 00:07:11,290 --> 00:07:12,380 programes es tornen més complexes. 172 00:07:12,380 --> 00:07:13,470 Però hi ha una solució fàcil. 173 00:07:13,470 --> 00:07:15,650 Permetin-me retrocedir fins aquí. 174 00:07:15,650 --> 00:07:18,190 >> I el que és el primer error que estic veient? 175 00:07:18,190 --> 00:07:19,520 Declaració implícita. 176 00:07:19,520 --> 00:07:21,466 Què és el que sol indicar? 177 00:07:21,466 --> 00:07:22,830 Ah, se va oblidar el prototip. 178 00:07:22,830 --> 00:07:26,900 Em vaig oblidar d'ensenyar al compilador que permuta va a existir tot i que 179 00:07:26,900 --> 00:07:28,920 no hi ha al principi del programa. 180 00:07:28,920 --> 00:07:35,780 Així que només vaig a dir nul · la, swap, int, int a b, punt i coma. 181 00:07:35,780 --> 00:07:37,280 >> Així que no vaig a tornar a implementar. 182 00:07:37,280 --> 00:07:39,140 Però ara que coincideix amb el que està aquí baix. 183 00:07:39,140 --> 00:07:42,530 I fixin-se, l'absència d'un punt i coma aquí, la qual cosa no és necessari quan 184 00:07:42,530 --> 00:07:43,200 implementar. 185 00:07:43,200 --> 00:07:46,010 >> Així que permetin refer això, no ens swap. 186 00:07:46,010 --> 00:07:46,910 Molt millor manera. 187 00:07:46,910 --> 00:07:48,130 Executar sense swap. 188 00:07:48,130 --> 00:07:48,740 I maleïda sigui. 189 00:07:48,740 --> 00:07:51,650 Ara estem de tornada on érem el dilluns, on la cosa no intercanviar. 190 00:07:51,650 --> 00:07:55,410 >> I quina és l'explicació intuïtiva de per què això és així? 191 00:07:55,410 --> 00:07:56,380 Sí? 192 00:07:56,380 --> 00:07:57,630 >> ESTUDIANT: [inaudible]. 193 00:07:57,630 --> 00:08:04,140 194 00:08:04,140 --> 00:08:05,230 >> DAVID Malan: Exactament. 195 00:08:05,230 --> 00:08:07,330 Així que a i b són còpies de x i y. 196 00:08:07,330 --> 00:08:10,680 I, de fet, cada vegada que he estat cridar a una funció que fins ara 197 00:08:10,680 --> 00:08:12,540 passa variables com ints - 198 00:08:12,540 --> 00:08:14,470 així com intercanvi d'espera aquí - 199 00:08:14,470 --> 00:08:16,270 vostès han estat passant en les còpies. 200 00:08:16,270 --> 00:08:19,150 >> Ara que significa que es necessita una mica de temps, una fracció de segon, per al 201 00:08:19,150 --> 00:08:23,270 ordinador per copiar els bits d'un variables en els bits de l'altre. 202 00:08:23,270 --> 00:08:24,610 Però això no és una cosa molt important. 203 00:08:24,610 --> 00:08:25,920 Però són, però, una còpia. 204 00:08:25,920 --> 00:08:30,020 >> I ara, en el context de l'intercanvi, De fet, estic amb èxit 205 00:08:30,020 --> 00:08:31,180 canviar a i b. 206 00:08:31,180 --> 00:08:33,000 De fet, farem una ràpida comprovació de validesa. 207 00:08:33,000 --> 00:08:36,830 Imprimir f a és% i, nova línia. 208 00:08:36,830 --> 00:08:38,770 I introduïm a. 209 00:08:38,770 --> 00:08:41,830 Ara farem el mateix amb b. 210 00:08:41,830 --> 00:08:43,640 I farem el mateix aquí. 211 00:08:43,640 --> 00:08:47,260 >> I ara, permetin-me copiar la mateixa línia de nou a la part inferior de la funció 212 00:08:47,260 --> 00:08:51,250 després dels meus tres línies d'interès podria haver executat, i 213 00:08:51,250 --> 00:08:53,270 imprimir una i altra vegada b. 214 00:08:53,270 --> 00:08:56,030 Així que ara anem a fer això, assegureu-vos de no intercanvi. 215 00:08:56,030 --> 00:08:58,430 Vull deixar la finestra de terminal d'un mica més alt, pel que podem veure 216 00:08:58,430 --> 00:08:59,520 més del mateix alhora. 217 00:08:59,520 --> 00:09:00,860 >> I corre cap intercanvi. 218 00:09:00,860 --> 00:09:04,000 x és 1, i és 2. a és 1, b és 2. 219 00:09:04,000 --> 00:09:06,070 I després, a és 2, b és 1. 220 00:09:06,070 --> 00:09:09,390 Així que s'està treballant, igual que Jess va fer aquí, dins de swap. 221 00:09:09,390 --> 00:09:13,090 Però, és clar, és que no té efecte en les variables de principal. 222 00:09:13,090 --> 00:09:15,360 >> Així que vam veure un truc que puguem podria solucionar aquest problema, oi? 223 00:09:15,360 --> 00:09:19,560 Quan t'enfrontes a aquesta determinació de l'abast tema, només va poder aclarir i fer x 224 00:09:19,560 --> 00:09:22,400 e i quin tipus de variables en el seu lloc? 225 00:09:22,400 --> 00:09:23,390 >> Vostè podria fer global. 226 00:09:23,390 --> 00:09:27,560 Poseu-los en la part superior de l'arxiu com ho vam fer, fins i tot en el joc de la 15. 227 00:09:27,560 --> 00:09:28,890 Utilitzem una variable global. 228 00:09:28,890 --> 00:09:32,420 Però en el context del joc un 15, és raonable tenir un mundial 229 00:09:32,420 --> 00:09:37,170 variable que representa el tauler, perquè la totalitat 15.c és tot 230 00:09:37,170 --> 00:09:38,650 sobre la implementació d'aquest joc. 231 00:09:38,650 --> 00:09:41,470 Això és el que hi ha a l'arxiu per fer. 232 00:09:41,470 --> 00:09:44,170 >> Però en aquest cas aquí, estic cridar a una funció d'intercanvi. 233 00:09:44,170 --> 00:09:45,380 Vull intercanviar dues variables. 234 00:09:45,380 --> 00:09:48,950 I ha de començar a sentir només descuidat si la solució a tots els nostres 235 00:09:48,950 --> 00:09:51,300 problemes quan ens trobem amb l'abast qüestions és que sigui global. 236 00:09:51,300 --> 00:09:54,730 Com que molt aviat el nostre programa és va a convertir en un bon embolic. 237 00:09:54,730 --> 00:09:57,760 I ho vam fer amb molta moderació com a resultat en 15.c 238 00:09:57,760 --> 00:10:00,470 >> Però resulta que hi ha una millor manera per complet. 239 00:10:00,470 --> 00:10:05,600 Permetin-me realment tornar enrere i eliminar la imprimir f de, només per simplificar el codi. 240 00:10:05,600 --> 00:10:09,160 I permetin-me proposo això, de fet, és dolent. 241 00:10:09,160 --> 00:10:15,990 Però si en lloc d'afegir en alguns asteriscs i les estrelles, que en canvi poden convertir aquesta 242 00:10:15,990 --> 00:10:18,670 funció en un que és en realitat operativa. 243 00:10:18,670 --> 00:10:25,020 >> Així que permetin-me tornar aquí i admetre dient asteriscs és sempre difícil, 244 00:10:25,020 --> 00:10:26,170 així que li dic estrelles. 245 00:10:26,170 --> 00:10:27,660 Vaig a confessar a aquella. 246 00:10:27,660 --> 00:10:28,190 Està bé. 247 00:10:28,190 --> 00:10:30,190 I ara, què vaig fer en el seu lloc? 248 00:10:30,190 --> 00:10:34,130 >> Així que en primer lloc, vaig a especificar que en lloc de passar un int en 249 00:10:34,130 --> 00:10:37,980 la funció d'intercanvi, estic en el seu lloc d'anar a dir estrella int. 250 00:10:37,980 --> 00:10:39,170 Ara, què indica l'estrella? 251 00:10:39,170 --> 00:10:41,970 Aquesta és la noció d'un punter que Binky, el personatge d'animació amb plastilina, va ser 252 00:10:41,970 --> 00:10:43,465 es fa referència a fa un moment. 253 00:10:43,465 --> 00:10:47,610 >> Així que si diem int estrella, el significat de això ara és que no serà 254 00:10:47,610 --> 00:10:49,110 aprovada en pel seu valor. 255 00:10:49,110 --> 00:10:50,350 No va a copiar polz 256 00:10:50,350 --> 00:10:54,700 Més aviat, la direcció d'una és passarà polz 257 00:10:54,700 --> 00:10:57,840 >> Així que recorda que en l'interior del seu equip és un munt de memòria, en cas contrari 258 00:10:57,840 --> 00:10:58,760 coneguda com RAM. 259 00:10:58,760 --> 00:11:00,520 I que la memòria RAM és només un manat sencer de bytes. 260 00:11:00,520 --> 00:11:03,320 Així que si el teu Mac o el teu PC té dos gigabytes, té 2 261 00:11:03,320 --> 00:11:05,760 milers de milions de bytes de memòria. 262 00:11:05,760 --> 00:11:08,440 >> Ara anem a suposar que només per mantenir les coses bé i ordenat, que 263 00:11:08,440 --> 00:11:09,450 assignar una adreça - 264 00:11:09,450 --> 00:11:10,170 un nombre - 265 00:11:10,170 --> 00:11:12,270 a cada byte de RAM en el seu ordinador. 266 00:11:12,270 --> 00:11:15,410 El primer byte dels 2 MIL MILIONS és pel nombre zero. 267 00:11:15,410 --> 00:11:18,572 El següent és el byte número u, nombre 2, tot el camí cap amunt, punt punt 268 00:11:18,572 --> 00:11:20,530 punt, a prop de 2 mil milions. 269 00:11:20,530 --> 00:11:23,640 >> Així que vostè pot comptar dels bytes de la memòria en el seu ordinador. 270 00:11:23,640 --> 00:11:26,460 Així que anem a suposar que això és el que que entenem per una adreça. 271 00:11:26,460 --> 00:11:31,360 Així que quan veig una int estrelles, el que està passant hauran de ser introduïts en bescanvi ara és el 272 00:11:31,360 --> 00:11:32,830 direcció d'una. 273 00:11:32,830 --> 00:11:37,150 No és el seu valor, però sigui quina sigui la seva postal direcció és, per dir-ho - 274 00:11:37,150 --> 00:11:38,810 la seva ubicació en la memòria RAM. 275 00:11:38,810 --> 00:11:41,250 >> I el mateix per b, vaig dir el mateix. 276 00:11:41,250 --> 00:11:42,720 Int, estel, b. 277 00:11:42,720 --> 00:11:46,350 Com acotació al marge, tècnicament l'estrella podria anar en altres llocs. 278 00:11:46,350 --> 00:11:50,140 Però anem a estandarditzar en l'estrella de ser just al costat del tipus de dades. 279 00:11:50,140 --> 00:11:54,080 >> Així intercanviar signatura significa ara, dóna'm la direcció d'un int, i anomenada 280 00:11:54,080 --> 00:11:55,400 que la direcció a. 281 00:11:55,400 --> 00:11:58,690 I dóna'm una altra direcció d'un int i trucar a aquesta direcció b. 282 00:11:58,690 --> 00:12:01,120 >> Però ara el meu codi aquí ha de canviar. 283 00:12:01,120 --> 00:12:03,470 Perquè si jo declaro temp int - 284 00:12:03,470 --> 00:12:05,580 que encara és de tipus int - 285 00:12:05,580 --> 00:12:08,700 però guardo en una, quin tipus de valor? 286 00:12:08,700 --> 00:12:12,870 Perquè quedi clar, m'estic posant una amb una el codi com està escrit en aquest moment? 287 00:12:12,870 --> 00:12:14,360 >> Estic posant la ubicació en un arxiu. 288 00:12:14,360 --> 00:12:16,500 Però no importa l' lloc, no? 289 00:12:16,500 --> 00:12:21,940 Temperatura hi ha just tercera tassa de Jess existit, amb quin propòsit? 290 00:12:21,940 --> 00:12:23,090 Per emmagatzemar un valor. 291 00:12:23,090 --> 00:12:24,830 Llet o suc de taronja. 292 00:12:24,830 --> 00:12:28,520 No és realment el d'emmagatzemar la direcció de cap d'aquestes coses, que se sent una 293 00:12:28,520 --> 00:12:31,200 poc sense sentit, en aquest veritable context mundial de totes maneres. 294 00:12:31,200 --> 00:12:34,990 >> Així que en realitat, el que jo vull posar en temp no és l'adreça d'una, però el 295 00:12:34,990 --> 00:12:36,180 contingut d'una. 296 00:12:36,180 --> 00:12:41,930 Així que si a és un nombre com 123, aquest és el byte 123 de memòria que un sol 297 00:12:41,930 --> 00:12:45,090 passa a ser ocupant, que el valor en una passa a ser ocupant. 298 00:12:45,090 --> 00:12:49,040 >> Si vull anar a aquesta direcció, He de dir que un estel. 299 00:12:49,040 --> 00:12:52,610 De la mateixa manera, si hagués de canviar el que en la direcció d'una, canvi 300 00:12:52,610 --> 00:12:53,570 aquest per iniciar una. 301 00:12:53,570 --> 00:12:58,185 Si vull emmagatzemar en el que està en el lloc a amb el que està en el lloc 302 00:12:58,185 --> 00:13:02,180 en b, b estrella estrelles. 303 00:13:02,180 --> 00:13:05,340 >> Així que en resum, fins i tot si això no és prou enfonsant encara - i jo no esperaria 304 00:13:05,340 --> 00:13:06,560 que seria tan ràpid - 305 00:13:06,560 --> 00:13:11,100 adonar que tot el que estic fent és prefixar aquestes estrelles als meus variables, 306 00:13:11,100 --> 00:13:13,350 dient que no prendre els valors. 307 00:13:13,350 --> 00:13:14,520 No canvieu els valors. 308 00:13:14,520 --> 00:13:17,600 Però més aviat, anar a les adreces i obtenir el valor. 309 00:13:17,600 --> 00:13:21,430 Anar a aquesta adreça i el canvi el valor allà. 310 00:13:21,430 --> 00:13:25,500 >> Ara permetin-me retrocedir fins al cim, només per corregir aquesta línia aquí, per 311 00:13:25,500 --> 00:13:27,690 canviar el prototip d'igualar. 312 00:13:27,690 --> 00:13:30,280 Però ara he de fer una cosa més. 313 00:13:30,280 --> 00:13:35,500 Intuïtivament, si he canviat els tipus intercanvi d'arguments que està esperant, 314 00:13:35,500 --> 00:13:37,245 Què més he de canviar en el meu codi? 315 00:13:37,245 --> 00:13:39,750 316 00:13:39,750 --> 00:13:40,840 >> Quan dic swap. 317 00:13:40,840 --> 00:13:43,340 Perquè ara mateix, què sóc Em passa de canviar encara? 318 00:13:43,340 --> 00:13:47,450 El valor de x i el valor de i, o la llet i el suc de taronja. 319 00:13:47,450 --> 00:13:48,510 Però jo no vull fer això. 320 00:13:48,510 --> 00:13:51,060 En lloc vull transmetre en què? 321 00:13:51,060 --> 00:13:53,050 La ubicació de xi la ubicació de i. 322 00:13:53,050 --> 00:13:55,300 Quines són les seves adreces postals, per dir-ho. 323 00:13:55,300 --> 00:13:57,600 >> Així que per fer això, hi ha un símbol d'unió. 324 00:13:57,600 --> 00:13:59,260 Ampersand tipus de sons com la direcció. 325 00:13:59,260 --> 00:14:03,240 per a n, signe, la direcció de x, i la direcció d'i. 326 00:14:03,240 --> 00:14:06,790 Així que és deliberat que fem servir símbols d'unió quan es crida a la funció, 327 00:14:06,790 --> 00:14:10,230 i les estrelles quan es declara que l'aplicació de la funció. 328 00:14:10,230 --> 00:14:14,220 >> I pensa en signe com direcció de l'operador, i l'estrella que el 329 00:14:14,220 --> 00:14:15,490 anar-hi operador - 330 00:14:15,490 --> 00:14:18,640 o, més correctament, el operador d'indirecció. 331 00:14:18,640 --> 00:14:23,480 Així que això és un munt de paraules només per diuen que ara, amb sort, bescanvi va 332 00:14:23,480 --> 00:14:24,440 ser correcte. 333 00:14:24,440 --> 00:14:26,550 >> Deixin-me seguir endavant i fer - 334 00:14:26,550 --> 00:14:30,940 anem a realment canviar el nom del fitxer, perquè no Aquest programa encara no es dirà swap. 335 00:14:30,940 --> 00:14:33,240 Jo sostinc que l'anomenarem swap.c ara. 336 00:14:33,240 --> 00:14:35,670 Així que, d'intercanvi. 337 00:14:35,670 --> 00:14:37,520 Dot, slash, intercanviar. 338 00:14:37,520 --> 00:14:40,210 >> I ara de fet, x és 1, i és 2. 339 00:14:40,210 --> 00:14:44,040 I llavors, x és 2, I és un. 340 00:14:44,040 --> 00:14:46,500 Bé anem a veure si podem fer-ho una mica diferent del que és 341 00:14:46,500 --> 00:14:47,180 passant aquí. 342 00:14:47,180 --> 00:14:51,250 En primer lloc, permetin-me apropar una nostre pantalla de dibuix aquí. 343 00:14:51,250 --> 00:14:54,160 I permetin-me proposar un moment - i cada vegada que trec aquí es reflectirà 344 00:14:54,160 --> 00:14:58,660 hi ara - permetin-me proposar que aquí hi ha un munt de memòria o 345 00:14:58,660 --> 00:15:00,540 RAM, dins del meu ordinador. 346 00:15:00,540 --> 00:15:04,140 >> I aquest serà el nombre mossegada, diguem, 1. 347 00:15:04,140 --> 00:15:05,720 Aquest serà bytes número 2. 348 00:15:05,720 --> 00:15:08,220 I vaig a fer un munt més, i després un munt de punts punt punts a 349 00:15:08,220 --> 00:15:10,880 indiquen que hi ha 2000000000 d'aquestes coses. 350 00:15:10,880 --> 00:15:13,520 4, 5, i així successivament. 351 00:15:13,520 --> 00:15:17,055 >> Així estan els primers cinc bytes de la memòria de l'ordinador. 352 00:15:17,055 --> 00:15:17,560 D'acord? 353 00:15:17,560 --> 00:15:19,060 Molt pocs de 2 milions de dòlars. 354 00:15:19,060 --> 00:15:21,120 Però ara vaig a proposar el següent. 355 00:15:21,120 --> 00:15:27,490 Vaig a proposar que x va a emmagatzemar el número 1, i i va 356 00:15:27,490 --> 00:15:29,690 per emmagatzemar el número 2. 357 00:15:29,690 --> 00:15:35,000 I me n'aniré endavant ara i representa aquests valors de la següent manera. 358 00:15:35,000 --> 00:15:41,510 >> Farem això de la següent manera. 359 00:15:41,510 --> 00:15:42,870 Dóna'm només un segon. 360 00:15:42,870 --> 00:15:44,150 Un segon. 361 00:15:44,150 --> 00:15:45,680 D'acord. 362 00:15:45,680 --> 00:15:47,560 Vull fer això una mica més - 363 00:15:47,560 --> 00:15:50,440 farem això una altra vegada. 364 00:15:50,440 --> 00:15:53,250 En cas contrari vaig a utilitzar i el mateixos números, sense voler, 365 00:15:53,250 --> 00:15:54,230 múltiples vegades. 366 00:15:54,230 --> 00:15:57,320 >> Així que el que tenim diferents nombres parlar, anem a trucar a aquest byte 367 00:15:57,320 --> 00:16:03,391 nombre 123, 124, 125, 126, i punts suspensius. 368 00:16:03,391 --> 00:16:08,400 I permetin-me pretenc ara que vaig a posar el valor 1 aquí, i el valor 2 369 00:16:08,400 --> 00:16:11,990 aquí, també conegut com x i y. 370 00:16:11,990 --> 00:16:15,300 Així que dóna la casualitat que aquest és x, aquesta és i. 371 00:16:15,300 --> 00:16:18,180 >> I només per algun atzar, la ordinador, el sistema operatiu, 372 00:16:18,180 --> 00:16:21,890 va passar a posar en la posició x nombre 123. 373 00:16:21,890 --> 00:16:25,590 I i va acabar en la posició 124 - 374 00:16:25,590 --> 00:16:26,330 maleïda sigui. 375 00:16:26,330 --> 00:16:28,700 Hi hauria d'haver fixat això. 376 00:16:28,700 --> 00:16:34,040 Oh home, és el que realment vull fer això? 377 00:16:34,040 --> 00:16:37,340 Sí, vull solucionar aquest problema i b adequada sobre això avui. 378 00:16:37,340 --> 00:16:39,950 Ho sentim, nou en això. 379 00:16:39,950 --> 00:16:45,020 >> 127, 131, i jo no volia ser tan complex, però per què es canvia el 380 00:16:45,020 --> 00:16:46,340 nombres allà? 381 00:16:46,340 --> 00:16:48,360 Perquè vull que els punts a en realitat ser de quatre bytes. 382 00:16:48,360 --> 00:16:49,810 Així que serem super anal sobre això. 383 00:16:49,810 --> 00:16:53,800 Així que si 1 passa a ser tractats 123, el 2 serà en la direcció 384 00:16:53,800 --> 00:16:55,730 127, ja que són només 4 byes de distància. 385 00:16:55,730 --> 00:16:56,210 Això és tot. 386 00:16:56,210 --> 00:16:58,640 I ens oblidem de tot el altres direccions del món. 387 00:16:58,640 --> 00:17:03,320 >> Així que x és en la ubicació 123, I és en la ubicació 127. 388 00:17:03,320 --> 00:17:05,770 I ara, què faig jo en realitat vol fer? 389 00:17:05,770 --> 00:17:10,099 Quan dic intercanvi ara, quin és realment està passant? 390 00:17:10,099 --> 00:17:14,920 Bé, quan jo dic swap, que estic passant la direcció de xi la direcció de i. 391 00:17:14,920 --> 00:17:18,540 Així, per exemple, si aquestes dues peces de paper ara representen els dos 392 00:17:18,540 --> 00:17:23,510 arguments a i b per intercanviar, què sóc jo va a escriure a la primera d'elles, 393 00:17:23,510 --> 00:17:27,720 que vaig a trucar a referir-se com a? 394 00:17:27,720 --> 00:17:30,610 >> Exactament, 123. 395 00:17:30,610 --> 00:17:31,905 Així que això és un reclam. 396 00:17:31,905 --> 00:17:32,955 Aquest és el paràmetre a. 397 00:17:32,955 --> 00:17:35,856 Vaig a posar l'adreça de x en aquest país. 398 00:17:35,856 --> 00:17:38,152 >> Què és això? 399 00:17:38,152 --> 00:17:40,890 >> Què és això? 400 00:17:40,890 --> 00:17:41,190 >> No, no. 401 00:17:41,190 --> 00:17:41,720 Això està bé. 402 00:17:41,720 --> 00:17:42,570 Segueix sent bo, segueix sent bo. 403 00:17:42,570 --> 00:17:43,530 Així que aquesta és una. 404 00:17:43,530 --> 00:17:46,240 I ara en el segon full de paper, això serà b, i el que estic 405 00:17:46,240 --> 00:17:49,010 serà escrit en aquest tros de paper? 406 00:17:49,010 --> 00:17:50,080 127. 407 00:17:50,080 --> 00:17:53,720 >> Així que l'únic que ha canviat des nostre relat anterior d'aquesta història és, 408 00:17:53,720 --> 00:17:58,590 en lloc de literalment 1 i 2, estic passarà l'any 123 i 127. 409 00:17:58,590 --> 00:18:02,130 I ara vaig a posar això a l'interior d'aquesta caixa de text, d'acord? 410 00:18:02,130 --> 00:18:04,640 Així que aquest quadre negre representa ara la funció d'intercanvi. 411 00:18:04,640 --> 00:18:07,230 >> Mentrestant, anem ara tenen algú implementar la funció d'intercanvi. 412 00:18:07,230 --> 00:18:09,090 Podria algú per aquí Vols ser voluntari? 413 00:18:09,090 --> 00:18:09,560 Anem amunt. 414 00:18:09,560 --> 00:18:11,080 Com et dius? 415 00:18:11,080 --> 00:18:11,460 Charlie. 416 00:18:11,460 --> 00:18:12,080 D'acord, Charlie. 417 00:18:12,080 --> 00:18:14,810 Anem amunt. 418 00:18:14,810 --> 00:18:17,310 >> Així que Charlie jugarà el paper del nostre quadre negre. 419 00:18:17,310 --> 00:18:21,460 I Charlie, el que m'agradaria que vostè faci ara està implementar intercanvi de tal manera 420 00:18:21,460 --> 00:18:25,320 que, donades aquestes dues direccions, estigués realment va 421 00:18:25,320 --> 00:18:26,330 per canviar els valors. 422 00:18:26,330 --> 00:18:28,290 I vaig a xiuxiuejar a l'orella com executar la TV aquí. 423 00:18:28,290 --> 00:18:29,930 >> Així que endavant, i vostè és el quadre negre. 424 00:18:29,930 --> 00:18:30,920 Arribar allà. 425 00:18:30,920 --> 00:18:34,054 Quins valors li veu a una, i quins valors li veu a b? 426 00:18:34,054 --> 00:18:36,740 >> CHARLIE: a és 123 i b és 127. 427 00:18:36,740 --> 00:18:37,530 >> DAVID Malan: OK, exactament. 428 00:18:37,530 --> 00:18:38,940 Ara hi ha una pausa per un moment. 429 00:18:38,940 --> 00:18:41,680 El primer que farem ara, d'acord amb el codi - que 430 00:18:41,680 --> 00:18:43,220 Ara vaig a tirar a la pantalla - 431 00:18:43,220 --> 00:18:46,750 serà la d'assignar una mica mica de memòria anomenat temp. 432 00:18:46,750 --> 00:18:48,850 Així que seguiré endavant i que te de la memòria. 433 00:18:48,850 --> 00:18:52,210 >> Així que això serà una tercera variable que té accés a la 434 00:18:52,210 --> 00:18:54,080 vas temp. 435 00:18:54,080 --> 00:18:57,120 I què vas a escriure en la peça de temp de paper? 436 00:18:57,120 --> 00:19:02,524 437 00:19:02,524 --> 00:19:03,470 >> CHARLIE: Punters, oi? 438 00:19:03,470 --> 00:19:04,790 >> DAVID Malan: OK, bé, no necessàriament punters. 439 00:19:04,790 --> 00:19:07,230 Així que la línia de codi que he ressaltat en la part dreta, 440 00:19:07,230 --> 00:19:07,900 anem a començar per aquí. 441 00:19:07,900 --> 00:19:08,890 Es diu que una estrella. 442 00:19:08,890 --> 00:19:11,670 Així que un emmagatzema actualment el nombre 123. 443 00:19:11,670 --> 00:19:16,660 I només intuïtivament, el que significava estrelles 123? 444 00:19:16,660 --> 00:19:21,630 >> Però específicament, si a és 123, un estel vol dir què? 445 00:19:21,630 --> 00:19:22,560 El valor de a. 446 00:19:22,560 --> 00:19:24,580 O més casual, anar-hi. 447 00:19:24,580 --> 00:19:28,620 Així que em proposo, la celebració de la a en la mà, seguir endavant i intentar que 448 00:19:28,620 --> 00:19:29,430 com si fos un mapa. 449 00:19:29,430 --> 00:19:32,940 I caminar a tu mateix a l'ordinador d' memòria i ens trobarà el que és 450 00:19:32,940 --> 00:19:36,520 en la ubicació 123. 451 00:19:36,520 --> 00:19:37,720 Exactament. 452 00:19:37,720 --> 00:19:41,100 >> Així veiem en la ubicació 123 és el que, òbviament? 453 00:19:41,100 --> 00:19:44,240 OK, llavors quin valor ara és vostè posarà en temperatura? 454 00:19:44,240 --> 00:19:44,750 Exactament. 455 00:19:44,750 --> 00:19:45,600 Així que endavant i fer això. 456 00:19:45,600 --> 00:19:51,280 I escriviu el número 1 en el full de paper que està actualment titulat temp. 457 00:19:51,280 --> 00:19:53,540 >> I ara el següent pas que vostè va a posar en pràctica 458 00:19:53,540 --> 00:19:54,310 serà el. 459 00:19:54,310 --> 00:19:57,820 Doncs bé, en el costat dret de la següent línia de codi és l'estrella b. b, de 460 00:19:57,820 --> 00:19:59,260 Per descomptat, emmagatzema una adreça. 461 00:19:59,260 --> 00:20:02,270 Que s'ocupa 127. 462 00:20:02,270 --> 00:20:06,620 Estrella b vol dir que, casualment parlant? 463 00:20:06,620 --> 00:20:08,700 >> Aneu a la ubicació. 464 00:20:08,700 --> 00:20:14,988 Així que endavant i ens trobar el que és en la ubicació 127. 465 00:20:14,988 --> 00:20:15,480 D'acord. 466 00:20:15,480 --> 00:20:19,170 Per descomptat, en la ubicació 127, segueix sent el valor de 2. 467 00:20:19,170 --> 00:20:24,060 Llavors, què vas ara botiga a el que està en el lloc en el a? 468 00:20:24,060 --> 00:20:26,860 Així que estrella un mitjà aneu a la ubicació a. 469 00:20:26,860 --> 00:20:29,770 Quina és la ubicació d'una? 470 00:20:29,770 --> 00:20:30,430 >> Exactament. 471 00:20:30,430 --> 00:20:34,190 Així que ara, si vostè vol canviar el que està en aquest lloc - 472 00:20:34,190 --> 00:20:36,470 Vaig a seguir endavant i executar l'esborrany és aquí. 473 00:20:36,470 --> 00:20:37,760 I ara posar de nou en el raspall. 474 00:20:37,760 --> 00:20:42,190 Quin nombre vas a escriure en aquest quadre en blanc ara? 475 00:20:42,190 --> 00:20:42,850 >> Exactament. 476 00:20:42,850 --> 00:20:46,470 Així que aquesta línia de codi, que quedi clar - i molt m'aturo el que Charlie està fent i 477 00:20:46,470 --> 00:20:51,730 assenyalar aquí, el que acaba de fer és escriure a la caixa en la posició 123 478 00:20:51,730 --> 00:20:55,150 el valor que estava prèviament en b. 479 00:20:55,150 --> 00:20:59,140 I pel que hem fet ara implementem aquesta segona línia de codi. 480 00:20:59,140 --> 00:21:01,920 >> Ara, per desgràcia, no hi ha segueix una línia que queda. 481 00:21:01,920 --> 00:21:04,900 Ara el que està en temp, literalment? 482 00:21:04,900 --> 00:21:06,200 És obvi que és el número u. 483 00:21:06,200 --> 00:21:07,020 No és una adreça. 484 00:21:07,020 --> 00:21:09,380 És només un nombre, tipus de una variable d'una setmana. 485 00:21:09,380 --> 00:21:13,520 >> I ara quan dius estrelles b, que significa anar a l'adreça b, que és de 486 00:21:13,520 --> 00:21:15,090 curs aquí. 487 00:21:15,090 --> 00:21:16,020 Així que una vegada que arribi allà - 488 00:21:16,020 --> 00:21:18,320 Vaig a seguir endavant i esborrar el que en realitat és allà - ¿I què estàs 489 00:21:18,320 --> 00:21:20,820 vaig a escriure ara en 127 ubicació? 490 00:21:20,820 --> 00:21:22,010 >> CHARLIE: Temp, que és un. 491 00:21:22,010 --> 00:21:23,430 >> DAVID Malan: Temp, que és un. 492 00:21:23,430 --> 00:21:25,670 I el que passa a la temperatura a la final? 493 00:21:25,670 --> 00:21:26,600 Bé, en realitat no ho sabem. 494 00:21:26,600 --> 00:21:27,420 En realitat no importa. 495 00:21:27,420 --> 00:21:31,090 Cada vegada que hem implementat una funció fins al moment, cap de les variables locals que tenen 496 00:21:31,090 --> 00:21:31,890 són, en efecte local. 497 00:21:31,890 --> 00:21:33,060 I simplement desapareixen. 498 00:21:33,060 --> 00:21:35,040 Estan reclamats per l'operació sistema amb el temps. 499 00:21:35,040 --> 00:21:39,800 >> Per tant el fet que la temperatura encara té valor 1 és fonamental 500 00:21:39,800 --> 00:21:41,150 poc interessant per a nosaltres. 501 00:21:41,150 --> 00:21:43,100 Molt bé, així que un aplaudiment si poguéssim de Charlie. 502 00:21:43,100 --> 00:21:46,400 Molt ben fet. 503 00:21:46,400 --> 00:21:51,520 >> Molt bé, així que què més fa Això significa que podem fer? 504 00:21:51,520 --> 00:21:54,400 Així que resulta que hem estat dient algunes mentides piadoses 505 00:21:54,400 --> 00:21:55,540 des de fa força temps. 506 00:21:55,540 --> 00:21:59,990 En efecte, resulta que una cadena, tot aquest temps, no és realment un 507 00:21:59,990 --> 00:22:02,190 seqüència de caràcters per se. 508 00:22:02,190 --> 00:22:03,980 En certa manera és que intuïtivament. 509 00:22:03,980 --> 00:22:08,270 >> Però tècnicament parlant, la cadena és una tipus de dades que es declaren dins de la 510 00:22:08,270 --> 00:22:12,170 la biblioteca CS50 per simplificar el món durant les primeres setmanes de classe. 511 00:22:12,170 --> 00:22:20,130 El que realment és una cadena és l'adreça d'un caràcter en la memòria RAM en algun lloc. 512 00:22:20,130 --> 00:22:25,530 Una cadena és realment un nombre, com 123 o 127, que passa a delimitar 513 00:22:25,530 --> 00:22:28,420 on una cadena comença a la memòria de l'equip. 514 00:22:28,420 --> 00:22:31,870 >> No obstant això, no representa la cadena, per si mateix, a si mateix. 515 00:22:31,870 --> 00:22:33,460 I podem veure això com segueix. 516 00:22:33,460 --> 00:22:35,980 Déjame anar per davant i obrir un codi que està entre 517 00:22:35,980 --> 00:22:38,340 exemples de codi font de l'actualitat. 518 00:22:38,340 --> 00:22:42,225 I jo vaig a seguir endavant i obrir fins, diguem, compari-0.C. 519 00:22:42,225 --> 00:22:44,830 520 00:22:44,830 --> 00:22:48,790 Aquest és un programa amb errors que va per ser implementat de la següent manera. 521 00:22:48,790 --> 00:22:49,040 >> En primer lloc. 522 00:22:49,040 --> 00:22:50,420 Vaig a dir alguna cosa. 523 00:22:50,420 --> 00:22:52,660 A continuació, vaig a seguir endavant i obtenir una cadena de l'usuari 524 00:22:52,660 --> 00:22:53,750 en aquesta línia següent. 525 00:22:53,750 --> 00:22:55,370 A continuació, vaig a dir-ho una vegada més. 526 00:22:55,370 --> 00:22:57,540 Llavors vaig a tenir una altra cadena de l'usuari. 527 00:22:57,540 --> 00:23:00,390 >> I fixin-se, estic mostrant una de les cadenes en una variable anomenada s, i 528 00:23:00,390 --> 00:23:03,040 altra d'aquestes cadenes en una variable anomenada t. 529 00:23:03,040 --> 00:23:07,480 I ara vaig a reclamar, molt raonablement, que si s és igual a és igual a t, 530 00:23:07,480 --> 00:23:08,940 les cadenes són iguals. 531 00:23:08,940 --> 00:23:09,970 Vostè escriu el mateix. 532 00:23:09,970 --> 00:23:11,830 Si no, les cadenes són no és el mateix. 533 00:23:11,830 --> 00:23:15,440 >> Després de tot, si l'entrada de dos enters, dues caràcters, dues carrosses, dues d'elles dobles, qualsevol de 534 00:23:15,440 --> 00:23:18,400 els tipus de dades de què hem parlat fins ara per comparar - 535 00:23:18,400 --> 00:23:22,070 recordem que vam fer molt clar fa un temps que no ho fa, perquè un 536 00:23:22,070 --> 00:23:25,840 signe igual senzill, per descomptat, l'operador d'assignació. 537 00:23:25,840 --> 00:23:26,820 Així que això seria un error. 538 00:23:26,820 --> 00:23:29,260 >> Fem servir el signe igual igual, que de fet compara 539 00:23:29,260 --> 00:23:31,050 coses per a la veritable igualtat. 540 00:23:31,050 --> 00:23:32,275 Però jo afirmo això és erroni. 541 00:23:32,275 --> 00:23:37,400 Si segueixo endavant i fer comparació de zero, i després quin punt slash comparar zero. 542 00:23:37,400 --> 00:23:39,700 I escric en, diguem, hola. 543 00:23:39,700 --> 00:23:41,590 I després direm hola de nou. 544 00:23:41,590 --> 00:23:46,040 Literalment el mateix, l'equip Reclamacions escriure coses diferents. 545 00:23:46,040 --> 00:23:47,640 >> Ara potser jo escrit malament alguna cosa. 546 00:23:47,640 --> 00:23:49,910 Jo escric el meu nom en aquesta ocasió. 547 00:23:49,910 --> 00:23:52,580 Vull dir, hola. 548 00:23:52,580 --> 00:23:54,770 Hola. 549 00:23:54,770 --> 00:23:57,360 És diferent cada vegada. 550 00:23:57,360 --> 00:23:58,430 >> Bé, per què és això? 551 00:23:58,430 --> 00:24:00,140 Què està passant en realitat sota de la caputxa? 552 00:24:00,140 --> 00:24:03,270 Bé, el que realment està passant per sota la campana és la cadena a continuació 553 00:24:03,270 --> 00:24:07,410 He escrit en la primera vegada, per exemple, és la paraula hola, és clar. 554 00:24:07,410 --> 00:24:11,660 Però si representem aquesta sota el capó, recordem que un 555 00:24:11,660 --> 00:24:13,470 cadena té una matriu. 556 00:24:13,470 --> 00:24:15,040 I hem dit tant en el passat. 557 00:24:15,040 --> 00:24:20,200 >> Així que si em baso aquesta matriu com aquesta, estic va a representar alguna cosa molt 558 00:24:20,200 --> 00:24:23,030 similar al que vam fer fa un moment. 559 00:24:23,030 --> 00:24:25,390 I en realitat hi ha alguna cosa especial aquí, també. 560 00:24:25,390 --> 00:24:28,090 Què va ser el que determinem ser en Al final de cada cadena? 561 00:24:28,090 --> 00:24:30,760 No, aquest zero barra invertida, que és només la forma de representar, 562 00:24:30,760 --> 00:24:33,610 literalment, 00000000. 563 00:24:33,610 --> 00:24:35,680 Vuit bits 0 en una fila. 564 00:24:35,680 --> 00:24:37,610 >> No ho sé, la veritat, el que és després d'això. 565 00:24:37,610 --> 00:24:40,090 Això és només un munt més memòria RAM dins del meu ordinador. 566 00:24:40,090 --> 00:24:40,970 Però aquesta és una matriu. 567 00:24:40,970 --> 00:24:42,260 Parlem sobre les matrius abans. 568 00:24:42,260 --> 00:24:45,010 I en general parlem d'arrays com a posició zero, 569 00:24:45,010 --> 00:24:46,580 llavors un, després dos. 570 00:24:46,580 --> 00:24:47,950 Però això és només per conveniència. 571 00:24:47,950 --> 00:24:49,380 I això és totalment relativa. 572 00:24:49,380 --> 00:24:53,010 >> Quan vostè està aconseguint realment la memòria de l'equip, és per descomptat, qualsevol 573 00:24:53,010 --> 00:24:55,450 2 mil milions de alguns bytes imparells, potencialment. 574 00:24:55,450 --> 00:24:59,100 Així que en realitat sota de la caputxa, tot aquest temps, si. 575 00:24:59,100 --> 00:25:01,670 Això podria molt bé ser zero suport. 576 00:25:01,670 --> 00:25:04,780 Però si vostè cava més profund sota el capó, que és realment 577 00:25:04,780 --> 00:25:07,000 abordar nombre 123. 578 00:25:07,000 --> 00:25:09,150 Aquesta és l'adreça 124. 579 00:25:09,150 --> 00:25:11,040 Aquesta és l'adreça 125. 580 00:25:11,040 --> 00:25:12,540 >> I no m'equivoco aquest moment. 581 00:25:12,540 --> 00:25:15,840 Aquests són convertit en un octets més per quina raó? 582 00:25:15,840 --> 00:25:17,930 Què tan gran és un char? 583 00:25:17,930 --> 00:25:19,170 Un char és només un byte. 584 00:25:19,170 --> 00:25:20,570 Un int és típicament quatre bytes. 585 00:25:20,570 --> 00:25:24,850 Així que per això ho vaig fer 123, 127, 131 i així successivament. 586 00:25:24,850 --> 00:25:27,560 Ara puc mantenir la matemàtica més simple i simplement ho fan més 1. 587 00:25:27,560 --> 00:25:30,510 I això és ara el que realment està passant de sota el capó. 588 00:25:30,510 --> 00:25:37,760 >> Així que quan es declara alguna cosa com això, string s, això és en realitat - 589 00:25:37,760 --> 00:25:39,170 resulta - 590 00:25:39,170 --> 00:25:41,190 estrelles caràcters. 591 00:25:41,190 --> 00:25:44,640 Estrella, per descomptat, significa direcció, també conegut com a punter. 592 00:25:44,640 --> 00:25:46,200 Així que és la direcció d'alguna cosa. 593 00:25:46,200 --> 00:25:47,510 Què és l'adreça? 594 00:25:47,510 --> 00:25:47,760 >> Bé - 595 00:25:47,760 --> 00:25:51,680 Sóc l'únic que pot veure el punt important que estic fent, o pensar 596 00:25:51,680 --> 00:25:52,560 Estic fent. 597 00:25:52,560 --> 00:25:55,270 Així cadena - 598 00:25:55,270 --> 00:25:57,180 el trist és que tinc un monitor allà on 599 00:25:57,180 --> 00:25:58,100 podria haver vist que. 600 00:25:58,100 --> 00:26:00,990 >> Bé, llavors cadena s és el Jo vaig declarar anteriorment. 601 00:26:00,990 --> 00:26:04,600 Però resulta que, gràcies a un petit màgia a la biblioteca CS50, tot això 602 00:26:04,600 --> 00:26:08,780 cadena de temps té, literalment, estat estrelles caràcters. 603 00:26:08,780 --> 00:26:11,310 L'estrella significa nou punter o direcció. 604 00:26:11,310 --> 00:26:14,180 El fet que està flanquejant la paraula caràcters significa que és la 605 00:26:14,180 --> 00:26:15,970 direcció d'un personatge. 606 00:26:15,970 --> 00:26:23,100 >> Així que si aconsegueix cadena es diu, i escriviu en H-I-L-L-O, proposar ara el que ha aconseguir 607 00:26:23,100 --> 00:26:27,330 literalment cadena estat tornant tots aquesta vegada, tot i que he lloc 608 00:26:27,330 --> 00:26:29,980 simplificada del món? 609 00:26:29,980 --> 00:26:33,310 Què vol aconseguir string realitat tornar com el seu valor de retorn? 610 00:26:33,310 --> 00:26:35,830 611 00:26:35,830 --> 00:26:38,720 >> 123, en aquest cas, per exemple. 612 00:26:38,720 --> 00:26:42,630 Hem dit anteriorment que arribar cadena simplement retorna una cadena, una seqüència de 613 00:26:42,630 --> 00:26:43,300 personatges. 614 00:26:43,300 --> 00:26:44,790 Però això és una mica d'una mentida piadosa. 615 00:26:44,790 --> 00:26:48,010 La forma obtenir string realment funciona sota de la caputxa és que es posa una 616 00:26:48,010 --> 00:26:48,930 cadena de l'usuari. 617 00:26:48,930 --> 00:26:51,530 Es deixa caure els personatges que ell o ella els tipus en la memòria. 618 00:26:51,530 --> 00:26:54,680 Posa un zero barra invertida al final dels quals la seqüència de caràcters. 619 00:26:54,680 --> 00:26:57,310 >> Però llavors, ¿què no aconseguir string literalment, tornar? 620 00:26:57,310 --> 00:27:02,710 És, literalment, torna la direcció del molt primers bytes en RAM que 621 00:27:02,710 --> 00:27:04,130 s'utilitza perquè la força. 622 00:27:04,130 --> 00:27:07,500 I resulta que només mitjançant la devolució una sola direcció de l' 623 00:27:07,500 --> 00:27:12,120 primer caràcter en la cadena, que és suficient per a la recerca de la totalitat de 624 00:27:12,120 --> 00:27:12,630 la cadena. 625 00:27:12,630 --> 00:27:16,930 >> En altres paraules, arribar cadena no té tornar 123 i 124 i 125. 626 00:27:16,930 --> 00:27:19,950 No m'ha de donar un llarg llista de tots els bytes que 627 00:27:19,950 --> 00:27:20,740 la meva cadena està utilitzant. 628 00:27:20,740 --> 00:27:22,670 Perquè un, tots estan esquena contra esquena. 629 00:27:22,670 --> 00:27:28,160 I dos, la base de la primera adreça, em pot esbrinar on acaba la cadena. 630 00:27:28,160 --> 00:27:29,910 Com? 631 00:27:29,910 --> 00:27:33,490 >> El caràcter nul especial, el barra invertida zero al final. 632 00:27:33,490 --> 00:27:35,430 Així, en altres paraules, si es passa al voltant - 633 00:27:35,430 --> 00:27:36,530 dins de les variables - 634 00:27:36,530 --> 00:27:41,300 la direcció d'un char, i assumeix que al final de qualsevol cadena, qualsevol 635 00:27:41,300 --> 00:27:45,040 seqüència de caràcters com els éssers humans pensar en cadenes, si s'assumeix que 636 00:27:45,040 --> 00:27:48,600 al final de la cadena hi un zero barra invertida, ets d'or. 637 00:27:48,600 --> 00:27:52,430 Perquè sempre es pot trobar el final d'una cadena. 638 00:27:52,430 --> 00:27:54,870 >> Ara el que realment està passant després en aquest programa? 639 00:27:54,870 --> 00:27:59,990 Per què és aquest programa, comparar-0.C, amb errors? 640 00:27:59,990 --> 00:28:01,690 El que en realitat s'està comparant? 641 00:28:01,690 --> 00:28:02,420 Sí? 642 00:28:02,420 --> 00:28:05,000 >> ESTUDIANT: [inaudible]. 643 00:28:05,000 --> 00:28:05,730 >> DAVID Malan: Exactament. 644 00:28:05,730 --> 00:28:08,350 És la comparació dels llocs de les cadenes. 645 00:28:08,350 --> 00:28:12,420 Així que si l'usuari ha escrit en hola una vegada, com jo, la memòria podria acabar 646 00:28:12,420 --> 00:28:13,430 buscant d'aquesta manera. 647 00:28:13,430 --> 00:28:18,210 Si l'usuari llavors envia a Hola de nou, però cridant obtenir string nou, c és 648 00:28:18,210 --> 00:28:21,800 no particularment intel · ligent a menys que vostè ensenya que sigui intel · ligent escrivint codi. 649 00:28:21,800 --> 00:28:22,430 >> C - 650 00:28:22,430 --> 00:28:23,860 i els ordinadors en general - 651 00:28:23,860 --> 00:28:27,370 si escriu en la paraula hola de nou, ja saps el que vas a obtenir. 652 00:28:27,370 --> 00:28:31,480 No ets més que va a aconseguir una segona matriu de memòria que, sí, passa ser 653 00:28:31,480 --> 00:28:35,510 emmagatzemar H-I-L-L-O i així successivament. 654 00:28:35,510 --> 00:28:38,240 >> Va a tenir el mateix aspecte que nosaltres els éssers humans, però aquesta adreça 655 00:28:38,240 --> 00:28:39,460 podria no ser 123. 656 00:28:39,460 --> 00:28:42,470 Només podria passar que la sistema operatiu compta amb alguns 657 00:28:42,470 --> 00:28:45,430 espai, per exemple en el lloc - 658 00:28:45,430 --> 00:28:49,820 direm alguna cosa arbitrària, com això és la ubicació 200. 659 00:28:49,820 --> 00:28:51,620 I aquesta és la ubicació 201. 660 00:28:51,620 --> 00:28:53,060 I aquesta és la ubicació 202. 661 00:28:53,060 --> 00:28:55,730 No tenim ni idea d'on és estarà en la memòria. 662 00:28:55,730 --> 00:28:59,110 >> Però el que això vol dir és que el que és va a ser emmagatzemat en última instància, en si? 663 00:28:59,110 --> 00:29:00,750 El nombre 123. 664 00:29:00,750 --> 00:29:04,860 Què va a ser emmagatzemat en t, en aquest exemple arbitrària? 665 00:29:04,860 --> 00:29:06,300 El nombre 200. 666 00:29:06,300 --> 00:29:11,410 I tot això significa és, llavors, òbviament, 123 no és igual a 200. 667 00:29:11,410 --> 00:29:14,940 I així, aquesta condició si no s'avalua en true. 668 00:29:14,940 --> 00:29:18,430 A causa cadena get utilitza diferents trossos de memòria cada vegada. 669 00:29:18,430 --> 00:29:20,360 >> Ara podem veure això de nou en un altre exemple. 670 00:29:20,360 --> 00:29:23,764 Déjame anar per davant i obrir copy-0.C. 671 00:29:23,764 --> 00:29:28,770 Sostinc que aquest exemple es va a provar - però fallen - copiar dues cadenes 672 00:29:28,770 --> 00:29:29,910 de la següent manera. 673 00:29:29,910 --> 00:29:31,730 >> Vaig a dir alguna cosa per a l'usuari. 674 00:29:31,730 --> 00:29:34,490 Llavors vaig a tenir una corda i cridar s. 675 00:29:34,490 --> 00:29:36,400 I ara, que estic fent aquesta prova aquí. 676 00:29:36,400 --> 00:29:37,990 Comptem això fa un temps. 677 00:29:37,990 --> 00:29:42,490 Però quan pot obtenir retorn cadena nul · la, altre caràcter especial, o especials 678 00:29:42,490 --> 00:29:45,050 símbol direm. 679 00:29:45,050 --> 00:29:45,900 Si està fora de la memòria. 680 00:29:45,900 --> 00:29:48,970 >> Per exemple, si l'usuari és realment sent difícil i escriu un atroç 681 00:29:48,970 --> 00:29:51,220 nombre de caràcters en la teclat i accessos Retorn. 682 00:29:51,220 --> 00:29:54,580 Si aquest nombre de caràcters no pot cabre a la RAM per la babalà 683 00:29:54,580 --> 00:29:57,820 raó, també aconsegueixi cadena podria molt bé tornar null. 684 00:29:57,820 --> 00:30:01,080 >> O si el seu programa en si està fent molt d'altres coses i no només 685 00:30:01,080 --> 00:30:03,790 No hi ha prou memòria per a la cadena get Per tenir èxit, podria acabar 686 00:30:03,790 --> 00:30:05,240 tornant nul. 687 00:30:05,240 --> 00:30:07,160 Però siguem més precisos pel que fa al que és això. 688 00:30:07,160 --> 00:30:10,280 Què és el tipus de dades de s realment? 689 00:30:10,280 --> 00:30:11,610 Estrelles Char. 690 00:30:11,610 --> 00:30:14,560 >> Així que resulta que ara ens pot pelar còpies de la capa d'nul. 691 00:30:14,560 --> 00:30:17,500 Resulta que, null és - sí, òbviament, un símbol especial. 692 00:30:17,500 --> 00:30:19,190 Però què és realment? 693 00:30:19,190 --> 00:30:25,220 Realment, nul · la és només un símbol que els éssers humans utilitzen per representar a zero també. 694 00:30:25,220 --> 00:30:29,010 >> Així que els autors de C i ordinadors més en general, va decidir fa anys 695 00:30:29,010 --> 00:30:30,010 que, ja saps què. 696 00:30:30,010 --> 00:30:34,850 Per què no ens assegurem que cap usuari les dades són sempre, sempre, sempre 697 00:30:34,850 --> 00:30:36,730 emmagatzemat en zero adéu? 698 00:30:36,730 --> 00:30:39,610 De fet, fins i tot en el meu exemple arbitrària abans, jo no vaig començar la numeració 699 00:30:39,610 --> 00:30:40,390 bytes en zero. 700 00:30:40,390 --> 00:30:41,540 Vaig començar a un. 701 00:30:41,540 --> 00:30:44,950 Perquè sabia que la gent en el món han decidit reservar el zero 702 00:30:44,950 --> 00:30:47,970 octet en la memòria RAM de ningú com alguna cosa especial. 703 00:30:47,970 --> 00:30:52,020 >> La raó és que, en qualsevol moment que desitgi un senyal que alguna cosa ha anat malament 704 00:30:52,020 --> 00:30:55,960 respecte de les adreces, que va tornar null - també conegut com a zero - 705 00:30:55,960 --> 00:30:59,410 i perquè saps que no hi ha fiar de dades a l'adreça zero, clarament 706 00:30:59,410 --> 00:31:00,400 que significa un error. 707 00:31:00,400 --> 00:31:04,080 I és per això que, per convenció, el registre de nul · la i tornada una mica 708 00:31:04,080 --> 00:31:06,260 com un d'aquests casos. 709 00:31:06,260 --> 00:31:09,300 >> Així que si ens desplacem fins ara, això és només a continuació, alguns de comprovació d'errors, per si de cas 710 00:31:09,300 --> 00:31:10,610 alguna cosa va sortir malament amb [? rescatar?] 711 00:31:10,610 --> 00:31:13,470 en conjunt i sortir del programa mitjançant la devolució primerenca. 712 00:31:13,470 --> 00:31:19,030 Aquesta línia ara podria reescriure com aquest, el que significa què? 713 00:31:19,030 --> 00:31:23,155 A la banda esquerra, dóna'm una altra punter a un caràcter, i en diuen t. 714 00:31:23,155 --> 00:31:26,935 Què estic emmagatzemant dins de t, amb base en aquesta línia de codi? 715 00:31:26,935 --> 00:31:30,950 716 00:31:30,950 --> 00:31:32,170 >> Estic emmagatzemar una ubicació. 717 00:31:32,170 --> 00:31:34,742 Específicament la ubicació això va ser en si. 718 00:31:34,742 --> 00:31:39,000 Així que si l'usuari ha escrit en hola, i aquest primer hola passi a acabar 719 00:31:39,000 --> 00:31:42,567 aquí, a continuació, el nombre 123 és tornarà a aconseguir 720 00:31:42,567 --> 00:31:43,810 corda i ser emmagatzemats - 721 00:31:43,810 --> 00:31:44,780 com hem dit abans - 722 00:31:44,780 --> 00:31:45,440 al s. 723 00:31:45,440 --> 00:31:50,560 >> Quan ara em declaro un altre punter a un char i cridar t, quin nombre és 724 00:31:50,560 --> 00:31:53,940 literalment, va a acabar en t segons la història? 725 00:31:53,940 --> 00:31:55,420 Així que 123. 726 00:31:55,420 --> 00:32:00,310 >> Així que tècnicament ara tant s com t apunten a l'exacta 727 00:32:00,310 --> 00:32:02,410 mateixos fragments de memòria. 728 00:32:02,410 --> 00:32:06,140 Així adonar del que faré ara per demostrar que aquest programa està lliure d'errors. 729 00:32:06,140 --> 00:32:08,820 >> Primer vaig a reclamar, amb 1 f impressió, capitalitzant 730 00:32:08,820 --> 00:32:10,080 la còpia de la cadena. 731 00:32:10,080 --> 00:32:11,660 A continuació, faré una mica de Comprovació d'errors. 732 00:32:11,660 --> 00:32:12,160 Vaig a estar segur. 733 00:32:12,160 --> 00:32:16,710 Anem a fer de la cadena es troba en t com a mínim major que zero de longitud, 734 00:32:16,710 --> 00:32:19,190 així que hi ha una mica de caràcter no per capitalitzar en realitat. 735 00:32:19,190 --> 00:32:22,840 >> I llavors vostè pot recordar aquesta dels exemples anteriors. 736 00:32:22,840 --> 00:32:25,630 2 superior - que és en l'arxiu ctype.h. 737 00:32:25,630 --> 00:32:30,800 T bracket zero em dóna zero caràcter de la cadena t. 738 00:32:30,800 --> 00:32:34,360 I 2 superior d'aquest mateix valor, de Per descomptat, la converteix a majúscules. 739 00:32:34,360 --> 00:32:38,230 >> Així intuïtiva, aquesta línia va destacar de codi és majúscula la primera 740 00:32:38,230 --> 00:32:40,250 lletra t. 741 00:32:40,250 --> 00:32:44,485 Però no és la capitalització, de manera intuïtiva, la primera lletra s. 742 00:32:44,485 --> 00:32:48,130 Però si vostè està pensant en el futur, ¿què sóc jo a veure quan executo aquest programa 743 00:32:48,130 --> 00:32:54,220 i imprimir tant en l'original, s, i l'anomenada còpia, t? 744 00:32:54,220 --> 00:32:55,350 >> Són en realitat va a ser la mateixa. 745 00:32:55,350 --> 00:32:56,600 ¿I per què van a ser els mateixos? 746 00:32:56,600 --> 00:32:58,970 747 00:32:58,970 --> 00:33:01,020 Els dos estan apuntant a exactament el mateix. 748 00:33:01,020 --> 00:33:01,610 Així que anem a fer això. 749 00:33:01,610 --> 00:33:03,160 >> Fer còpia zero. 750 00:33:03,160 --> 00:33:04,070 Compila acord. 751 00:33:04,070 --> 00:33:06,500 Déjame córrer zero còpia. 752 00:33:06,500 --> 00:33:10,110 Permetin-me Escriu alguna cosa com hola a en minúscules feu clic a D'acord. 753 00:33:10,110 --> 00:33:16,520 I afirma que tant la s original, i la còpia són de fet idèntics. 754 00:33:16,520 --> 00:33:17,920 >> Així que el que realment ha passat aquí? 755 00:33:17,920 --> 00:33:20,100 Permetin-me tornar a dibuixar la imatge només per explicar la història d'una 756 00:33:20,100 --> 00:33:21,340 lleugerament diferent manera. 757 00:33:21,340 --> 00:33:26,060 El que realment està passant per sota de la campana quan em declaro una cosa així com 758 00:33:26,060 --> 00:33:30,410 Char inici s, o una cadena s, M'estic fent un punter - 759 00:33:30,410 --> 00:33:33,090 que passa a ser 4 bytes en l'aparell CS50 760 00:33:33,090 --> 00:33:34,410 i en una gran quantitat d'ordinadors. 761 00:33:34,410 --> 00:33:36,008 I jo vaig a trucar a aquest s. 762 00:33:36,008 --> 00:33:39,810 I això té actualment algun valor desconegut. 763 00:33:39,810 --> 00:33:43,900 >> Quan es declara una variable, llevat que vostè posar un valor no, que 764 00:33:43,900 --> 00:33:44,570 sap el que hi ha. 765 00:33:44,570 --> 00:33:48,110 Podria ser una seqüència aleatòria de bits de l'execució anterior. 766 00:33:48,110 --> 00:33:52,490 Així que quan jo, en la meva línia de codi poso cadena i, a continuació, guardar la tornada 767 00:33:52,490 --> 00:33:54,800 valor de s aconsegueix cadena d'alguna manera - 768 00:33:54,800 --> 00:33:58,520 i que finalment va a pelar com arribar obres de corda, d'alguna manera assigna un 769 00:33:58,520 --> 00:34:00,480 matriu que sembla probable una mica com això. 770 00:34:00,480 --> 00:34:05,390 H-I-L-L-O, la barra invertida zero. 771 00:34:05,390 --> 00:34:09,510 >> Suposem que aquesta és l'adreça 123 acaba primer consistència. 772 00:34:09,510 --> 00:34:13,000 Així que torna de corda, al línia ressaltada no, torna el 773 00:34:13,000 --> 00:34:15,000 nombre vam dir, 123. 774 00:34:15,000 --> 00:34:17,420 Així que el que realment succeeix a l'interior de s aquí? 775 00:34:17,420 --> 00:34:26,590 >> Bé, el que realment passa interior de s és 123. 776 00:34:26,590 --> 00:34:29,250 Però, francament, m'estic posant una mica confós per totes aquestes direccions, 777 00:34:29,250 --> 00:34:30,320 tots aquests nombres arbitraris. 778 00:34:30,320 --> 00:34:32,290 123, 124, 127. 779 00:34:32,290 --> 00:34:34,570 Així que anem a simplificar la realitat el món una mica. 780 00:34:34,570 --> 00:34:38,800 >> Quan parlem de punters, francament, a nosaltres els éssers humans, qui diables li importa d'on 781 00:34:38,800 --> 00:34:39,870 les coses són a la memòria? 782 00:34:39,870 --> 00:34:41,080 Això és completament arbitrària. 783 00:34:41,080 --> 00:34:43,370 Això dependrà de com quantitat de RAM que té l'usuari. 784 00:34:43,370 --> 00:34:46,590 Això dependrà del moment en el dia d'executar el programa, potser, i 785 00:34:46,590 --> 00:34:48,250 el que d'entrada l'usuari li dóna. 786 00:34:48,250 --> 00:34:50,060 Estem aturar-se en detalls sense importància. 787 00:34:50,060 --> 00:34:54,230 >> Així que anem a abstreure i dir que, quan s'executa una línia de codi com aquest, 788 00:34:54,230 --> 00:34:57,320 caràcters estrelles s 'aconsegueix el retorn valor de cadena get. 789 00:34:57,320 --> 00:35:02,720 Per què no en lloc de simplement dibuixem el que seguir trucant a un punter com si fos 790 00:35:02,720 --> 00:35:04,140 que apunta a alguna cosa? 791 00:35:04,140 --> 00:35:07,000 Així que pretenc ara que s fins hi ha un punter - 792 00:35:07,000 --> 00:35:08,480 sota de la caputxa és una direcció. 793 00:35:08,480 --> 00:35:11,330 Però és només apunta el primer byte al 794 00:35:11,330 --> 00:35:12,780 cadena que ha estat retornat. 795 00:35:12,780 --> 00:35:16,710 >> Si ara torno al codi aquí, el que està passant en aquesta línia? 796 00:35:16,710 --> 00:35:20,020 Bé, en aquesta línia ressaltada ara, Estic declarant semblar una altra 797 00:35:20,020 --> 00:35:21,070 variable anomenada t. 798 00:35:21,070 --> 00:35:25,700 Però també és un punter, així que vaig treure, ja que, en teoria, l'exacta 799 00:35:25,700 --> 00:35:26,710 mateix quadre de mida. 800 00:35:26,710 --> 00:35:28,160 I jo vaig a dir-t. 801 00:35:28,160 --> 00:35:33,500 >> I ara, si ens remuntem al codi nou, quan guardo s dins de t, 802 00:35:33,500 --> 00:35:36,920 el que estic tècnicament posar dins t? 803 00:35:36,920 --> 00:35:39,350 Bé, tècnicament, aquest va ser el número 123. 804 00:35:39,350 --> 00:35:42,270 Així que en realitat hauria d'estar escrivint el número 123 allà. 805 00:35:42,270 --> 00:35:43,900 Però anem a prendre més alt nivell. 806 00:35:43,900 --> 00:35:48,090 t, si és només un punter, intuïtivament, és només això. 807 00:35:48,090 --> 00:35:49,800 Això és tot el que s'està emmagatzemat allà. 808 00:35:49,800 --> 00:35:54,970 >> Així que ara a les últimes línies interessants del Codi, quan en realitat vaig sobre 809 00:35:54,970 --> 00:36:00,680 aprofitant el caràcter zero en t, el que està passant? 810 00:36:00,680 --> 00:36:06,310 Bé, t bracket zero ara apunta a quin personatge, presumiblement? 811 00:36:06,310 --> 00:36:07,460 >> Està assenyalant h. 812 00:36:07,460 --> 00:36:08,870 Perquè t bracket zero - 813 00:36:08,870 --> 00:36:12,490 recorda, aquesta és la sintaxi antiga. t suport zero simplement vol dir que si t és una cadena, t 814 00:36:12,490 --> 00:36:15,590 Suport de zero significa aconseguir el zero caràcter en que la força. 815 00:36:15,590 --> 00:36:18,650 Així que el que realment significa és anar a aquesta sèrie - 816 00:36:18,650 --> 00:36:21,520 i sí, això podria ser 123, això podria ser 124. 817 00:36:21,520 --> 00:36:22,790 Però tot és relatiu, recorda. 818 00:36:22,790 --> 00:36:25,640 Sempre parlant d'una matriu, tenim l'avantatge de parlar de 819 00:36:25,640 --> 00:36:27,000 índexs relatius. 820 00:36:27,000 --> 00:36:31,120 >> I així que ara només podem suposar que t és zero suport h. 821 00:36:31,120 --> 00:36:35,090 Així que si et dic 2 amunt en ell, el que és realment fent és aprofitar 822 00:36:35,090 --> 00:36:38,290 la h minúscula a majúscula H. Però, és clar, el que és s? 823 00:36:38,290 --> 00:36:41,010 S'assenyala a la mateixa corda donaran. 824 00:36:41,010 --> 00:36:44,200 >> Així que això és tot el que està passant en aquest codi fins ara. 825 00:36:44,200 --> 00:36:45,960 Quina és llavors la conseqüència? 826 00:36:45,960 --> 00:36:48,300 Com podem solucionar aquests dos problemes? 827 00:36:48,300 --> 00:36:50,870 Com ens comparem amb cordes reals? 828 00:36:50,870 --> 00:36:53,720 >> Bé intuïtivament, com vostè va sobre la comparació de dues 829 00:36:53,720 --> 00:36:55,090 cadenes per a la igualtat real? 830 00:36:55,090 --> 00:36:58,920 831 00:36:58,920 --> 00:37:00,750 >> Què vol dir que si dos cadenes són iguals? 832 00:37:00,750 --> 00:37:04,330 És evident que no és que les seves adreces són igual en la memòria, perquè això és un baix 833 00:37:04,330 --> 00:37:06,590 detall d'implementació de nivell. 834 00:37:06,590 --> 00:37:08,360 Tots els caràcters són els mateixos. 835 00:37:08,360 --> 00:37:12,810 Així que em proposo, i permetin-me presentar en la versió un compare.c 836 00:37:12,810 --> 00:37:14,970 aquí, així que compari-1.c. 837 00:37:14,970 --> 00:37:19,590 >> Permetin-me proposar que encara obtenim un punter anomenat s, i emmagatzemar en ella el 838 00:37:19,590 --> 00:37:20,610 tornar el valor de la cadena de get. 839 00:37:20,610 --> 00:37:21,750 Farem el mateix amb t. 840 00:37:21,750 --> 00:37:23,230 Així que res que el codi és diferent. 841 00:37:23,230 --> 00:37:25,420 Vaig a afegir una mica de més comprovació d'errors ara. 842 00:37:25,420 --> 00:37:29,390 Així que ara que estem en una mena de pelar això capes en CS50 del que una cadena 843 00:37:29,390 --> 00:37:33,520 és en realitat, hem de ser més anal tracta d'assegurar-se que no abusem 844 00:37:33,520 --> 00:37:35,330 valors no vàlids com nul · la. 845 00:37:35,330 --> 00:37:36,440 >> Així que només vaig a comprovar. 846 00:37:36,440 --> 00:37:41,490 Si s no fa iguals nul · la i T no igual null, el que significa que estem bé. 847 00:37:41,490 --> 00:37:44,460 Get string no ficar la pota aconseguir cap d'aquestes cadenes. 848 00:37:44,460 --> 00:37:51,270 I vostè pot potser endevinar ara, què Què STR CMP presumiblement fer? 849 00:37:51,270 --> 00:37:52,000 Cadena comparar. 850 00:37:52,000 --> 00:37:55,470 >> Així que si vostè té el programa en Java abans, això és com el mètode és igual al 851 00:37:55,470 --> 00:37:56,490 classe string. 852 00:37:56,490 --> 00:37:57,890 Però per a aquells de vostès que no tenen programat abans, 853 00:37:57,890 --> 00:37:59,320 això és només una funció de c. 854 00:37:59,320 --> 00:38:02,180 Passa que vénen en un arxiu anomenat string.h. 855 00:38:02,180 --> 00:38:03,830 Aquí és on està declarat. 856 00:38:03,830 --> 00:38:05,110 >> I string comparar - 857 00:38:05,110 --> 00:38:07,530 En realitat no recordo el seu ús, però això no importa. 858 00:38:07,530 --> 00:38:10,470 Recordem que podem fer home, regiri comparar. 859 00:38:10,470 --> 00:38:12,590 I això portarà el Manual de programadors Linux. 860 00:38:12,590 --> 00:38:14,060 I és, francament, una mica críptic. 861 00:38:14,060 --> 00:38:15,270 Però puc veure que aquí, si. 862 00:38:15,270 --> 00:38:17,570 He de incloure string.h. 863 00:38:17,570 --> 00:38:20,590 >> I aquí diu en la descripció, "la funció de comparació de cadena compara 864 00:38:20,590 --> 00:38:24,560 les dues cadenes S1 i S2. "I S1 i S2 són pel que sembla els dos 865 00:38:24,560 --> 00:38:26,120 arguments passats polz 866 00:38:26,120 --> 00:38:28,650 Realment no recordo el que const és, però ara es va adonar - 867 00:38:28,650 --> 00:38:31,480 i vostè va poder haver vist això ja quan has utilitza les pàgines de manual 868 00:38:31,480 --> 00:38:32,390 tenir-ho tot - 869 00:38:32,390 --> 00:38:36,220 aquesta estrella char és només sinònim de amb una corda. 870 00:38:36,220 --> 00:38:40,440 >> Per tant, compara les dues seqüències, S1 i S2, i que retorna un enter menor 871 00:38:40,440 --> 00:38:44,930 o igual que o major que zero si es troba S1, respectivament, per a ser 872 00:38:44,930 --> 00:38:47,450 menor que, o el partit, o ser més gran que S2. 873 00:38:47,450 --> 00:38:51,220 Aquesta és una forma molt complexa de dir aquesta cadena comparar rendiments 874 00:38:51,220 --> 00:38:55,760 zero si dues cadenes són intuïtivament idèntiques, caràcter de 875 00:38:55,760 --> 00:38:57,120 caràcter a caràcter. 876 00:38:57,120 --> 00:38:59,970 >> Es retorna un nombre negatiu si s, per ordre alfabètic, se suposa 877 00:38:59,970 --> 00:39:01,010 venir abans de t. 878 00:39:01,010 --> 00:39:05,300 O retorna un nombre positiu si s se suposa que vénen després de t 879 00:39:05,300 --> 00:39:06,170 alfabèticament. 880 00:39:06,170 --> 00:39:08,360 Així, amb aquesta simple funció, podria que, per exemple, ordenar una 881 00:39:08,360 --> 00:39:09,770 manat sencer de paraules? 882 00:39:09,770 --> 00:39:13,984 >> Així que en aquesta nova versió, vaig per seguir endavant i fer Comparación1. 883 00:39:13,984 --> 00:39:15,750 Dot slash comparar un. 884 00:39:15,750 --> 00:39:18,030 Jo escric en hola en minúscules. 885 00:39:18,030 --> 00:39:20,300 Vaig a escriure hola en minúscules nou. 886 00:39:20,300 --> 00:39:23,340 I per sort ara s'adona He escrit el mateix. 887 00:39:23,340 --> 00:39:27,520 >> Mentrestant, si escric en hola a menor HOLA cas i en majúscules i 888 00:39:27,520 --> 00:39:29,710 comparar, vaig escriure coses diferents. 889 00:39:29,710 --> 00:39:32,530 Com que no només són les adreces diferent, però estem comparant 890 00:39:32,530 --> 00:39:35,350 diferents personatges una i altra vegada. 891 00:39:35,350 --> 00:39:37,320 >> Bé, anirem a arreglar un un altre problema ara. 892 00:39:37,320 --> 00:39:41,590 Permetin-me obro una versió de còpia, que ara dirigeix 893 00:39:41,590 --> 00:39:42,900 aquest problema de la següent manera. 894 00:39:42,900 --> 00:39:45,650 I aquest va a buscar una mica més complex. 895 00:39:45,650 --> 00:39:49,320 Però si es pensa en quin és el problema que necessitat de resoldre, espero que això serà 896 00:39:49,320 --> 00:39:51,870 esborrar en un moment ara. 897 00:39:51,870 --> 00:39:57,280 >> Així que aquesta primera línia, caràcters d'inici t, en termes senzills podria algú proposar 898 00:39:57,280 --> 00:39:59,450 el que aquí significa aquesta línia? 899 00:39:59,450 --> 00:40:01,050 Char estrella t, el que fa? 900 00:40:01,050 --> 00:40:06,660 901 00:40:06,660 --> 00:40:07,210 >> Bé. 902 00:40:07,210 --> 00:40:09,500 Crear un punter a alguna lloc en la memòria. 903 00:40:09,500 --> 00:40:10,930 I m'ho dius perfeccionar una mica. 904 00:40:10,930 --> 00:40:17,180 Declari una variable que emmagatzemarà la direcció d'algunes xerrades a la memòria, simplement 905 00:40:17,180 --> 00:40:18,480 a ser una mica més adequat. 906 00:40:18,480 --> 00:40:21,210 >> OK, així que ara en el costat dret, no tinc mai havia vist una d'aquestes funcions 907 00:40:21,210 --> 00:40:22,660 abans, malloc. 908 00:40:22,660 --> 00:40:26,980 Però, què pot significar això? 909 00:40:26,980 --> 00:40:28,050 L'assignació de memòria. 910 00:40:28,050 --> 00:40:29,410 L'assignació de memòria. 911 00:40:29,410 --> 00:40:33,050 >> Així resulta que, fins ara, realment no han tingut una poderosa manera de 912 00:40:33,050 --> 00:40:36,210 demanant el sistema operatiu, dóna'm una mica de memòria. 913 00:40:36,210 --> 00:40:39,980 Més aviat, ara tenim una funció anomenada malloc que fa exactament això. 914 00:40:39,980 --> 00:40:42,960 Tot i que això és una mica d'un distracció en aquest moment, notar que en 915 00:40:42,960 --> 00:40:46,200 entre els dos parèntesis és només serà un nombre. 916 00:40:46,200 --> 00:40:48,510 On he escrit en qüestió les marques poden ser un nombre. 917 00:40:48,510 --> 00:40:51,020 >> I aquest nombre significa, dóna'm 10 bytes. 918 00:40:51,020 --> 00:40:52,320 Dóna'm 20 bytes. 919 00:40:52,320 --> 00:40:53,820 Dóna'm 100 bytes. 920 00:40:53,820 --> 00:40:56,500 I malloc farà tot el possible per demanar al sistema operatiu - 921 00:40:56,500 --> 00:40:57,630 Linux, en aquest cas - 922 00:40:57,630 --> 00:40:59,630 bo, són els seus 100 bytes de RAM? 923 00:40:59,630 --> 00:41:04,320 Si és així, tornar aquests bytes a mi per tornar la direcció de 924 00:41:04,320 --> 00:41:06,610 aquests bytes, potser? 925 00:41:06,610 --> 00:41:07,610 El primer de tots. 926 00:41:07,610 --> 00:41:10,460 >> Així que aquí també - i això és predominant en C, en qualsevol moment que ets 927 00:41:10,460 --> 00:41:11,680 tractar amb adreces? 928 00:41:11,680 --> 00:41:15,830 Estàs gairebé sempre es tracta de la primer com la direcció, no importa el gran 929 00:41:15,830 --> 00:41:19,490 un tros de memòria que està sent retornat, per dir-ho. 930 00:41:19,490 --> 00:41:20,880 >> Així que anem a bussejar aquí. 931 00:41:20,880 --> 00:41:23,940 Estic intentant assignar la forma molts bytes, exactament? 932 00:41:23,940 --> 00:41:24,080 Bé. 933 00:41:24,080 --> 00:41:26,090 Longitud de la seqüència de s - anem a fer un exemple concret. 934 00:41:26,090 --> 00:41:30,700 Si s és hola, H-I-L-L-O, quin és el longitud de la cadena de s, per descomptat? 935 00:41:30,700 --> 00:41:32,010 Així que és de cinc anys. 936 00:41:32,010 --> 00:41:34,590 Però estic fent un plus 1 en això, per què? 937 00:41:34,590 --> 00:41:37,700 Per què vull 06:00 bytes en lloc de cinc? 938 00:41:37,700 --> 00:41:38,790 El caràcter nul. 939 00:41:38,790 --> 00:41:41,210 >> No vull deixar fora d'aquest caràcter nul especial. 940 00:41:41,210 --> 00:41:45,160 Perquè si faig una còpia de Hola i Acabo de fer H-I-L-L-O, però no poso 941 00:41:45,160 --> 00:41:50,160 aquest caràcter especial, l'equip potser no tingui, per casualitat, una barra invertida 942 00:41:50,160 --> 00:41:51,730 zero allà per a mi. 943 00:41:51,730 --> 00:41:55,570 I pel que si que estic tractant d'esbrinar la La longitud de la còpia, jo podria pensar que 944 00:41:55,570 --> 00:41:59,360 és 20 caràcters de llarg, o un milió caràcters si mai passa 945 00:41:59,360 --> 00:42:01,050 per colpejar una barra invertida zero. 946 00:42:01,050 --> 00:42:05,780 >> Així que necessitem 6 bytes per emmagatzemar H-I-L-L-O, la barra invertida zero. 947 00:42:05,780 --> 00:42:07,870 I a continuació, això és només ser super anal. 948 00:42:07,870 --> 00:42:10,700 Suposem que se m'oblida el que la grandària d'un char és. 949 00:42:10,700 --> 00:42:12,020 Seguim dient que és un byte. 950 00:42:12,020 --> 00:42:12,860 I en general és. 951 00:42:12,860 --> 00:42:15,425 En teoria, podria ser alguna cosa diferent, en un Mac diferent o una 952 00:42:15,425 --> 00:42:16,250 diferents PC. 953 00:42:16,250 --> 00:42:19,650 >> Així que resulta que hi ha aquest operador anomenat sizeof que si se li passa la 954 00:42:19,650 --> 00:42:22,680 nom d'un tipus de dades - com char o int o float - 955 00:42:22,680 --> 00:42:26,930 se li informarà, de forma dinàmica, el nombre de bytes un char ocupa en aquest 956 00:42:26,930 --> 00:42:28,090 en particular equip. 957 00:42:28,090 --> 00:42:31,360 >> Així que això és efectivament només com temps de 1 o dient 958 00:42:31,360 --> 00:42:32,440 vegades res en absolut. 959 00:42:32,440 --> 00:42:36,340 Però ho estic fent per estar súper anal, que en cas d'un char difereix 960 00:42:36,340 --> 00:42:40,610 en el seu equip davant la meva, així les matemàtiques sempre va a la sortida. 961 00:42:40,610 --> 00:42:43,720 >> Finalment, aquí puc comprovar null, que és sempre una bona pràctica - de nou, 962 00:42:43,720 --> 00:42:44,920 qualsevol moment que estem tractant amb punters. 963 00:42:44,920 --> 00:42:47,520 Si malloc no era capaç de donar em 06:00 byes - que és 964 00:42:47,520 --> 00:42:49,210 poc probable, però per si de cas - 965 00:42:49,210 --> 00:42:50,730 tornar immediatament. 966 00:42:50,730 --> 00:42:53,290 I ara, endavant i copiar la cadena com segueix. 967 00:42:53,290 --> 00:42:57,240 I aquesta és la sintaxi familiar, encara que en un paper diferent. 968 00:42:57,240 --> 00:43:01,210 >> Vaig a seguir endavant i obtenir la cadena longitud s i deseu-lo en n. 969 00:43:01,210 --> 00:43:06,620 Llavors repetiré d'i és igual zero fins i incloent N, 970 00:43:06,620 --> 00:43:08,410 més gran que o igual a. 971 00:43:08,410 --> 00:43:13,540 Així que en cada iteració, vaig posar el caràcter i-èsim de s en l'i-èsim 972 00:43:13,540 --> 00:43:15,380 caràcter de t. 973 00:43:15,380 --> 00:43:18,190 >> Així que el que realment està passant per sota la campana d'aquí? 974 00:43:18,190 --> 00:43:22,140 Bé, si aquest, per exemple, és s - 975 00:43:22,140 --> 00:43:26,400 i he escrit en la paraula H-I-L-L-O i hi ha una barra invertida zero. 976 00:43:26,400 --> 00:43:29,020 I de nou, això és s apuntant aquí. 977 00:43:29,020 --> 00:43:30,830 I aquí és t. 978 00:43:30,830 --> 00:43:34,860 >> I això està apuntant ara a una còpia de la memòria, oi? 979 00:43:34,860 --> 00:43:37,340 Malloc m'ha donat un conjunt tros de memòria. 980 00:43:37,340 --> 00:43:41,440 No sé el que és un principi en qualsevol d'aquestes ubicacions. 981 00:43:41,440 --> 00:43:44,340 Així que vaig a pensar en ells com un munt de signes d'interrogació. 982 00:43:44,340 --> 00:43:50,190 >> Però tan aviat com em poso un bucle de zero en un màxim a través de la longitud de s, t 983 00:43:50,190 --> 00:43:52,790 suport de zero i t suport de 1 - 984 00:43:52,790 --> 00:43:55,080 i vaig a posar això ara a la sobrecàrrega - 985 00:43:55,080 --> 00:44:04,190 t suport de zero i s suport de mitjana zero que vaig a copiar 986 00:44:04,190 --> 00:44:09,875 iterativa h aquí, E-L-L-O. A més, com ho vaig fer en el signe més 987 00:44:09,875 --> 00:44:12,370 1, la barra invertida zero. 988 00:44:12,370 --> 00:44:19,060 >> Així que ara en el cas de comparació-1.c, al final, si imprimeixo el 989 00:44:19,060 --> 00:44:24,760 capitalització de t, hem veure que s ha canviat. 990 00:44:24,760 --> 00:44:26,090 Déjame anar endavant ara i fer això. 991 00:44:26,090 --> 00:44:28,630 Així que copy1. 992 00:44:28,630 --> 00:44:30,860 Dot slash copy1. 993 00:44:30,860 --> 00:44:33,670 Vaig a escriure hola, Retorn. 994 00:44:33,670 --> 00:44:37,430 I ara compte, només la còpia s'ha capitalitzat. 995 00:44:37,430 --> 00:44:40,890 Perquè jo realment tinc dos fragments de memòria. 996 00:44:40,890 --> 00:44:44,390 >> Desafortunadament, vostè pot fer alguna cosa bonica les coses dolentes i molt perillós aquí. 997 00:44:44,390 --> 00:44:49,290 Permetin-me llevo un exemple aquí ara, que ens dóna un exemple d'uns pocs 998 00:44:49,290 --> 00:44:51,540 diferents línies. 999 00:44:51,540 --> 00:44:56,040 Així que intuïtivament aquí, la primera línia de codi, int estrelles x, està declarant 1000 00:44:56,040 --> 00:44:57,340 una variable anomenada x. 1001 00:44:57,340 --> 00:44:58,810 ¿I quin és el tipus de dades d'aquesta variable? 1002 00:44:58,810 --> 00:45:01,820 1003 00:45:01,820 --> 00:45:04,290 Quin és el tipus de dades d'aquesta variable? 1004 00:45:04,290 --> 00:45:06,980 Aquest no va ser el melodrama. 1005 00:45:06,980 --> 00:45:08,350 >> El tipus de dades és l'estrella int. 1006 00:45:08,350 --> 00:45:12,600 Llavors, què significa això? x emmagatzemar la direcció d'un int. 1007 00:45:12,600 --> 00:45:13,520 Tan simple com això. 1008 00:45:13,520 --> 00:45:16,220 I es va a emmagatzemar el direcció d'un int. 1009 00:45:16,220 --> 00:45:18,390 Quina és la tercera línia de codi fent allà? 1010 00:45:18,390 --> 00:45:21,850 Es assignació de quants bytes, més probable? 1011 00:45:21,850 --> 00:45:22,350 Quatre. 1012 00:45:22,350 --> 00:45:25,460 Degut a la mida d'un int és generalment 4, malloc de quatre dóna 1013 00:45:25,460 --> 00:45:29,950 em torna la direcció d'una part de la memòria, el primer de els bytes és 1014 00:45:29,950 --> 00:45:32,110 emmagatzemat ara en x. 1015 00:45:32,110 --> 00:45:34,410 >> Ara ens estem movent una mica més ràpid. 1016 00:45:34,410 --> 00:45:35,760 Estrella x significa què? 1017 00:45:35,760 --> 00:45:38,480 1018 00:45:38,480 --> 00:45:42,590 Significa anar a aquesta adreça i posar el que el nombre allà? 1019 00:45:42,590 --> 00:45:43,870 Poseu el número 42 allà. 1020 00:45:43,870 --> 00:45:47,590 Star i significa anar al que és a i i posar el número 13 allà. 1021 00:45:47,590 --> 00:45:48,600 >> Però espereu un minut. 1022 00:45:48,600 --> 00:45:51,640 El que està en i en aquest moment? 1023 00:45:51,640 --> 00:45:54,950 Quina és l'adreça i l'emmagatzematge? 1024 00:45:54,950 --> 00:45:55,770 No ho sabem, oi? 1025 00:45:55,770 --> 00:45:59,230 Mai hem una vegada utilitzar l'assignació i la participació d'operador. 1026 00:45:59,230 --> 00:46:03,370 Per tant i com es va declarar en la segona línia de codi és només un valor del fem, un gran 1027 00:46:03,370 --> 00:46:04,760 signe d'interrogació per dir-ho. 1028 00:46:04,760 --> 00:46:07,230 Podria estar apuntant a l'atzar a res en la memòria, el qual 1029 00:46:07,230 --> 00:46:08,340 en general és dolent. 1030 00:46:08,340 --> 00:46:13,540 >> Així que tan aviat com arribem a aquesta línia allà, estrella i és igual a 13, una cosa dolenta, 1031 00:46:13,540 --> 00:46:17,220 una cosa molt dolenta està a punt a passar a Binky. 1032 00:46:17,220 --> 00:46:25,810 Així que anem a veure el que va a acabar passant a Binky aquí en aquest moment 1033 00:46:25,810 --> 00:46:26,200 o així que busca. 1034 00:46:26,200 --> 00:46:26,490 >> [REPRODUIR VIDEO] 1035 00:46:26,490 --> 00:46:26,745 >> -Ei, Binky. 1036 00:46:26,745 --> 00:46:27,000 Desperta. 1037 00:46:27,000 --> 00:46:29,296 És temps per a la diversió punter. 1038 00:46:29,296 --> 00:46:30,680 >> -Què és això? 1039 00:46:30,680 --> 00:46:31,980 Assabenti dels punters? 1040 00:46:31,980 --> 00:46:34,010 Oh, que bé. 1041 00:46:34,010 --> 00:46:37,220 >> -Bé, per començar, crec que estem Va a necessitar un parell de punters. 1042 00:46:37,220 --> 00:46:37,930 >> -OK. 1043 00:46:37,930 --> 00:46:41,650 Aquest codi assigna dos punters que pot apuntar a nombres enters. 1044 00:46:41,650 --> 00:46:43,760 >> -OK, bé, veig els dos punters. 1045 00:46:43,760 --> 00:46:45,850 Però no semblen ser apuntant a res. 1046 00:46:45,850 --> 00:46:46,490 >> -Això és. 1047 00:46:46,490 --> 00:46:48,630 Inicialment, els punters no ho fan apuntar a res. 1048 00:46:48,630 --> 00:46:51,700 Les coses que apunten són anomenats pointees i configurar és un 1049 00:46:51,700 --> 00:46:52,850 etapa separada. 1050 00:46:52,850 --> 00:46:53,740 >> -Oh, és clar, és clar. 1051 00:46:53,740 --> 00:46:54,500 Ja ho sabia. 1052 00:46:54,500 --> 00:46:56,270 Els pointees estan separats. 1053 00:46:56,270 --> 00:46:58,553 Llavors, com s'assigna un pointee? 1054 00:46:58,553 --> 00:46:59,480 >> -OK. 1055 00:46:59,480 --> 00:47:03,707 Bé, el codi assigna una nova sencers pointee, i aquesta part fixa x 1056 00:47:03,707 --> 00:47:05,520 perquè apunti a ell. 1057 00:47:05,520 --> 00:47:06,760 >> -Escolta, que es veu millor. 1058 00:47:06,760 --> 00:47:08,520 Així que faci alguna cosa. 1059 00:47:08,520 --> 00:47:09,530 >> -OK. 1060 00:47:09,530 --> 00:47:14,110 Vaig a eliminar la referència del punter x per emmagatzemar el número 42 en el seu pointee. 1061 00:47:14,110 --> 00:47:17,660 Per aquest truc, necessitaré meva màgia vareta d'eliminació de referències. 1062 00:47:17,660 --> 00:47:20,695 >> -La teva vareta màgica de l'eliminació de referències? 1063 00:47:20,695 --> 00:47:22,632 Uh, això és genial. 1064 00:47:22,632 --> 00:47:24,620 >> -Això és el que el codi es sembla. 1065 00:47:24,620 --> 00:47:27,526 Vaig a configurar el nombre, i - 1066 00:47:27,526 --> 00:47:28,250 >> -Ei, mira. 1067 00:47:28,250 --> 00:47:29,680 Aquí va. 1068 00:47:29,680 --> 00:47:34,520 Així que fent un dereference en x segueix la fletxa per accedir al seu pointee. 1069 00:47:34,520 --> 00:47:36,690 En aquest cas, per emmagatzemar 42 en allà. 1070 00:47:36,690 --> 00:47:40,890 Ei, intenteu fer servir per emmagatzemar el nombre 13 a través de l'altre punter, i. 1071 00:47:40,890 --> 00:47:42,125 >> -OK. 1072 00:47:42,125 --> 00:47:46,810 Jo vaig a anar d'aquí cap ii Obtenir el número 13 establert. 1073 00:47:46,810 --> 00:47:50,890 I després prendre la vara de eliminació de referències i just - 1074 00:47:50,890 --> 00:47:52,430 Whoa! 1075 00:47:52,430 --> 00:47:53,030 >> -Oh, hey. 1076 00:47:53,030 --> 00:47:54,610 Això no va funcionar. 1077 00:47:54,610 --> 00:47:58,200 Diguem, Binky, jo no crec que la eliminar la referència i és una bona idea, 1078 00:47:58,200 --> 00:48:01,370 perquè la creació de la pointee és un pas separat. 1079 00:48:01,370 --> 00:48:03,460 I jo no crec que mai ho vam fer. 1080 00:48:03,460 --> 00:48:03,810 >> -Hmm. 1081 00:48:03,810 --> 00:48:05,160 Bon punt. 1082 00:48:05,160 --> 00:48:07,410 >> -Sí, ens van donar la i punter. 1083 00:48:07,410 --> 00:48:10,045 Però mai ens vam posar a apuntar a una pointee. 1084 00:48:10,045 --> 00:48:10,490 >> -Hmm. 1085 00:48:10,490 --> 00:48:12,170 Molt observador. 1086 00:48:12,170 --> 00:48:13,790 >> -Ei, vostè està buscant bo allà, Binky. 1087 00:48:13,790 --> 00:48:16,920 Pots arreglar-ho de manera que i punts a la mateixa pointee com x? 1088 00:48:16,920 --> 00:48:17,810 >> -És clar. 1089 00:48:17,810 --> 00:48:20,300 Vaig a utilitzar el meu vareta màgica de la assignació de punter. 1090 00:48:20,300 --> 00:48:22,240 >> -És que serà un problema com abans? 1091 00:48:22,240 --> 00:48:22,665 >> -No. 1092 00:48:22,665 --> 00:48:24,300 Això no toca els pointees. 1093 00:48:24,300 --> 00:48:27,880 Només canvia un punter per assenyalar a la mateixa cosa que una altra. 1094 00:48:27,880 --> 00:48:28,970 >> -Oh, ja veig. 1095 00:48:28,970 --> 00:48:31,730 Ara i apunta al mateix lloc que x. 1096 00:48:31,730 --> 00:48:32,450 Així que esperar. 1097 00:48:32,450 --> 00:48:33,490 Ara i és fix. 1098 00:48:33,490 --> 00:48:34,630 Té una pointee. 1099 00:48:34,630 --> 00:48:36,520 Així que vostè pot provar la vareta d'eliminar la referència de nou 1100 00:48:36,520 --> 00:48:39,200 per enviar el 13 més. 1101 00:48:39,200 --> 00:48:39,840 >> -OK. 1102 00:48:39,840 --> 00:48:41,570 Heus aquí. 1103 00:48:41,570 --> 00:48:42,870 >> -Ei, mira això. 1104 00:48:42,870 --> 00:48:44,320 Ara dereferencing obres i. 1105 00:48:44,320 --> 00:48:47,020 I pel fet que els punters estan compartint que un pointee, es 1106 00:48:47,020 --> 00:48:48,585 tant veure el 13. 1107 00:48:48,585 --> 00:48:49,040 >> -Sí. 1108 00:48:49,040 --> 00:48:49,670 Compartint. 1109 00:48:49,670 --> 00:48:50,380 El que sigui. 1110 00:48:50,380 --> 00:48:52,290 Així que anem canvien de lloc ara? 1111 00:48:52,290 --> 00:48:52,970 >> -Oh, mira. 1112 00:48:52,970 --> 00:48:54,150 Se'ns acaba el temps. 1113 00:48:54,150 --> 00:48:55,200 >> -Però - 1114 00:48:55,200 --> 00:48:57,060 >> -Només recorda els tres normes punter. 1115 00:48:57,060 --> 00:49:00,100 Número u, l'estructura bàsica és que vostè té un punter. 1116 00:49:00,100 --> 00:49:02,170 I apunta a un pointee. 1117 00:49:02,170 --> 00:49:04,160 Però el punter i pointee estan separats. 1118 00:49:04,160 --> 00:49:06,460 I l'error comú és establir un punter, però a 1119 00:49:06,460 --> 00:49:08,540 oblidi donat un pointee. 1120 00:49:08,540 --> 00:49:12,460 >> Número dos, el punter comença desreferenciació en el punter i segueix el seu 1121 00:49:12,460 --> 00:49:14,570 fletxa per accedir al seu pointee. 1122 00:49:14,570 --> 00:49:18,640 Com tots sabem, això només funciona si hi ha és un pointee, que torna a 1123 00:49:18,640 --> 00:49:19,790 la regla número u. 1124 00:49:19,790 --> 00:49:23,670 >> Número tres, assignació de punter pren un punter i canvis perquè apunti a 1125 00:49:23,670 --> 00:49:25,850 la mateixa pointee com un altre punter. 1126 00:49:25,850 --> 00:49:27,840 Així que després de la cessió, els dos punters es 1127 00:49:27,840 --> 00:49:29,430 apuntar a la mateixa pointee. 1128 00:49:29,430 --> 00:49:31,600 A vegades això es diu compartir. 1129 00:49:31,600 --> 00:49:33,430 I això és tot el que cal fer, de veritat. 1130 00:49:33,430 --> 00:49:33,840 Bye bye ara. 1131 00:49:33,840 --> 00:49:34,300 >> [FI REPRODUCCIÓ DE VÍDEO] 1132 00:49:34,300 --> 00:49:36,940 >> DAVID Malan: Així que més de punters, més en Binky setmana. 1133 00:49:36,940 --> 00:49:38,190 Ens veiem el dilluns. 1134 00:49:38,190 --> 00:49:42,187