1 00:00:00,000 --> 00:00:01,110 >> [REPRODUCCIÓ DE MÚSICA] 2 00:00:01,110 --> 00:00:10,567 3 00:00:10,567 --> 00:00:11,650 DAVID J. Malan: Molt bé. 4 00:00:11,650 --> 00:00:15,610 Això és CS50, i això és el cap de setmana quatre. 5 00:00:15,610 --> 00:00:19,420 I un dels temes avui és el de la ciència forense digital, 6 00:00:19,420 --> 00:00:20,989 l'art de la recuperació de la informació. 7 00:00:20,989 --> 00:00:22,780 I, en efecte, tot i que vostè està en el medi 8 00:00:22,780 --> 00:00:25,070 en aquests moments de la Pau a Tres i Breakout, la setmana que ve, 9 00:00:25,070 --> 00:00:27,880 l'atenció se centrarà en precisament aquest domini. 10 00:00:27,880 --> 00:00:30,686 >> Així que un dels treballs més meravellosos que mai tenia estava de tornada a l'escola de postgrau, 11 00:00:30,686 --> 00:00:33,560 quan treballava per al local de Middlesex County District Attorney de 12 00:00:33,560 --> 00:00:34,950 oficina, fent els forenses treballen. 13 00:00:34,950 --> 00:00:37,450 Així que, essencialment, el Massachusetts Policia de l'Estat, en ocasions, 14 00:00:37,450 --> 00:00:40,100 quan es treballa en els casos faria portar coses com discs durs 15 00:00:40,100 --> 00:00:42,185 i disquets i targetes de memòria i similars. 16 00:00:42,185 --> 00:00:44,060 I se'ls lliurés per a mi i el meu mentor, 17 00:00:44,060 --> 00:00:48,070 i el nostre objectiu era trobar proves, si hi havia alguna, en aquests mitjans. 18 00:00:48,070 --> 00:00:50,700 Indicis Ara, és possible que hagi vist d'aquest món de la ciència forense 19 00:00:50,700 --> 00:00:53,000 en els mitjans de comunicació, la televisió i les pel · lícules. 20 00:00:53,000 --> 00:00:55,730 Però el treball que tenia, i m'atreviria a dir que aquest món, 21 00:00:55,730 --> 00:00:57,550 no és prou com vostè veurà. 22 00:00:57,550 --> 00:01:00,794 Fem una ullada al que el que has vist. 23 00:01:00,794 --> 00:01:01,460 [REPRODUCCIÓ DE VÍDEO] 24 00:01:01,460 --> 00:01:02,930 -ok. 25 00:01:02,930 --> 00:01:05,380 Ara, anem a obtenir un bon cop d'ull. 26 00:01:05,380 --> 00:01:06,850 >> [REPRODUCCIÓ DE MÚSICA] 27 00:01:06,850 --> 00:01:12,260 28 00:01:12,260 --> 00:01:12,932 >> -Mantenir Ella. 29 00:01:12,932 --> 00:01:13,657 Corre de tornar. 30 00:01:13,657 --> 00:01:14,733 >> Espera un minut. 31 00:01:14,733 --> 00:01:15,233 Anar a la dreta. 32 00:01:15,233 --> 00:01:16,371 33 00:01:16,371 --> 00:01:16,870 Hi ha. 34 00:01:16,870 --> 00:01:17,369 Congeli això. 35 00:01:17,369 --> 00:01:17,930 De pantalla Full. 36 00:01:17,930 --> 00:01:18,376 >> -ok. 37 00:01:18,376 --> 00:01:18,875 Congeli això. 38 00:01:18,875 --> 00:01:20,160 Endurirà fins en això, oi? 39 00:01:20,160 --> 00:01:22,126 >> -vector En el qual noi per la roda del darrere. 40 00:01:22,126 --> 00:01:24,435 >> -Zoom En aquí en aquest lloc. 41 00:01:24,435 --> 00:01:28,580 >> -Amb L'equip adequat, la imatge es pot ampliar i afilada. 42 00:01:28,580 --> 00:01:29,330 >> Què és això? 43 00:01:29,330 --> 00:01:30,780 >> És un programa de millora. 44 00:01:30,780 --> 00:01:32,170 >> -Pots Clar que qualsevol? 45 00:01:32,170 --> 00:01:33,070 >> No Sé. 46 00:01:33,070 --> 00:01:34,150 Anem a millorar-lo. 47 00:01:34,150 --> 00:01:35,440 >> Millorar Secció A6. 48 00:01:35,440 --> 00:01:36,570 49 00:01:36,570 --> 00:01:38,562 Vaig augmentar el detall, y-- 50 00:01:38,562 --> 00:01:40,020 Crec Hi ha prou per millorar. 51 00:01:40,020 --> 00:01:40,976 Deixeu anar a la meva pantalla. 52 00:01:40,976 --> 00:01:42,559 >> -I Va millorar la reflexió en el seu ull. 53 00:01:42,559 --> 00:01:44,322 -Anem Executar això a través de millora de vídeo. 54 00:01:44,322 --> 00:01:45,210 >> -Edgar, Pots millorar això? 55 00:01:45,210 --> 00:01:45,710 >> -hang Successivament. 56 00:01:45,710 --> 00:01:47,570 57 00:01:47,570 --> 00:01:49,458 >> -Fa Treballant en aquesta reflexió. 58 00:01:49,458 --> 00:01:50,402 >> Reflexió d'algú -Hi. 59 00:01:50,402 --> 00:01:50,902 >> Reflexió. 60 00:01:50,902 --> 00:01:52,870 Hi ha un reflex de la cara de l'home. 61 00:01:52,870 --> 00:01:53,694 >> Reflexió -El! 62 00:01:53,694 --> 00:01:54,610 Hi ha una reflexió. 63 00:01:54,610 --> 00:01:55,880 -Zoom En el mirall. 64 00:01:55,880 --> 00:01:57,860 Es pot veure un reflex. 65 00:01:57,860 --> 00:01:59,630 >> -CAN A millorar la imatge d'aquí? 66 00:01:59,630 --> 00:02:00,377 67 00:02:00,377 --> 00:02:01,210 -CAN A potenciar? 68 00:02:01,210 --> 00:02:02,190 -CAN A potenciar? 69 00:02:02,190 --> 00:02:03,066 -Podem Millorem això? 70 00:02:03,066 --> 00:02:03,898 -CAN A potenciar? 71 00:02:03,898 --> 00:02:04,740 -Mantenir En un segon. 72 00:02:04,740 --> 00:02:05,281 Vaig a Millorar. 73 00:02:05,281 --> 00:02:06,470 -Zoom A la porta. 74 00:02:06,470 --> 00:02:06,970 -veces 10. 75 00:02:06,970 --> 00:02:08,009 -Zoom. 76 00:02:08,009 --> 00:02:08,509 -Moure En. 77 00:02:08,509 --> 00:02:09,340 -Més. 78 00:02:09,340 --> 00:02:10,094 Espera, atura't. 79 00:02:10,094 --> 00:02:10,750 -STOP. 80 00:02:10,750 --> 00:02:11,250 -PAUSE Ella. 81 00:02:11,250 --> 00:02:13,542 Ens -Girar 75 graus al voltant de la vertical, si us plau. 82 00:02:13,542 --> 00:02:14,750 83 00:02:14,750 --> 00:02:16,127 >> -STOP. 84 00:02:16,127 --> 00:02:19,330 Tornar a la part sobre la porta de nou. 85 00:02:19,330 --> 00:02:21,420 >> -va Una millora d'imatge de mapa de bits que poden? 86 00:02:21,420 --> 00:02:24,420 >> -Potser Podem utilitzar el Pradeep Singh mètode per veure per les finestres. 87 00:02:24,420 --> 00:02:25,902 >> -El Software és estat de la tècnica. 88 00:02:25,902 --> 00:02:26,866 >> -El Valor propi està apagat. 89 00:02:26,866 --> 00:02:29,758 >> -Amb La dreta combinació de algorithms-- 90 00:02:29,758 --> 00:02:32,168 >> Il · luminació portat de -Ell algoritmes per al següent nivell, 91 00:02:32,168 --> 00:02:34,110 i puc utilitzar-los per millorar aquesta fotografia. 92 00:02:34,110 --> 00:02:36,840 >> -lock En engrandir i l'eix z. 93 00:02:36,840 --> 00:02:37,351 >> Millorar. 94 00:02:37,351 --> 00:02:37,850 Millorar. 95 00:02:37,850 --> 00:02:38,720 Millorar. 96 00:02:38,720 --> 00:02:40,070 -Freeze I millorar. 97 00:02:40,070 --> 00:02:43,420 [FI REPRODUCCIÓ DE VÍDEO] 98 00:02:43,420 --> 00:02:45,830 DAVID J. Malan: Així que aquests són totes les paraules, però no eren 99 00:02:45,830 --> 00:02:47,870 usat en oracions correctament. 100 00:02:47,870 --> 00:02:52,370 I de fet, en el futur, en qualsevol moment, si us plau, escolti algú dir la paraula, 101 00:02:52,370 --> 00:02:54,250 "Millorar" riure una mica. 102 00:02:54,250 --> 00:02:57,190 Perquè quan es tracta de millorar, per exemple, això és el que passa. 103 00:02:57,190 --> 00:02:58,580 >> Així que aquí està una foto magnífica. 104 00:02:58,580 --> 00:02:59,720 Això és propi de Daven CS50. 105 00:02:59,720 --> 00:03:03,740 I suposem que volíem centrar-se en la brillantor en els seus ulls, 106 00:03:03,740 --> 00:03:05,870 o el reflex de la dolent que era clarament 107 00:03:05,870 --> 00:03:07,820 capturat per la càmera de seguretat. 108 00:03:07,820 --> 00:03:10,330 Això és el que passa quan fer zoom en una imatge que 109 00:03:10,330 --> 00:03:14,060 té només un nombre finit de bits associats. 110 00:03:14,060 --> 00:03:15,420 >> Això és el que pots aconseguir. 111 00:03:15,420 --> 00:03:19,190 I, en efecte, a l'ull de Daven no és més que 4, potser sis píxels 112 00:03:19,190 --> 00:03:22,110 que componen exactament el estava brillant allà. 113 00:03:22,110 --> 00:03:25,890 Així de problemes Quatre tindrà en última instància explorar aquest món, en particular 114 00:03:25,890 --> 00:03:28,090 per la naturalesa d'alguna cosa que anomenem arxiu i / o, si 115 00:03:28,090 --> 00:03:31,000 I / O és només una forma elegant de dient d'entrada i sortida. 116 00:03:31,000 --> 00:03:34,280 >> Així fins al moment, totes les interaccions que hem tingut amb un ordinador 117 00:03:34,280 --> 00:03:36,770 han estat en gran part amb el seu teclat i la pantalla, 118 00:03:36,770 --> 00:03:40,770 però no tant amb el disc dur, o l'estalvi dels arxius més enllà dels quals 119 00:03:40,770 --> 00:03:41,620 mateix escriu. 120 00:03:41,620 --> 00:03:44,570 Els seus programes fins ara tenen no estat creant, i l'estalvi, 121 00:03:44,570 --> 00:03:46,270 i l'actualització dels seus propis arxius. 122 00:03:46,270 --> 00:03:47,150 >> Bé, què és un arxiu? 123 00:03:47,150 --> 00:03:48,105 Bé, alguna cosa així com un arxiu JPEG. 124 00:03:48,105 --> 00:03:50,520 Aquesta és una imatge que et poden tenir o pujar a Facebook, 125 00:03:50,520 --> 00:03:51,690 o veure qualsevol part del web. 126 00:03:51,690 --> 00:03:54,460 De fet, aquesta foto que acabem de serra de Daven era un JPEG. 127 00:03:54,460 --> 00:03:57,570 I el que és interessant sobre els arxius, com els arxius JPEG 128 00:03:57,570 --> 00:04:02,170 és que poden ser identificades, típicament, mitjançant certs patrons de bits. 129 00:04:02,170 --> 00:04:05,200 >> En altres paraules, ¿què és el que distingeix un JPEG des d'un GIF 130 00:04:05,200 --> 00:04:08,109 des d'un PING des d'una Paraula document d'un arxiu d'Excel? 131 00:04:08,109 --> 00:04:09,900 Bé, és simplement diferent patrons de bits. 132 00:04:09,900 --> 00:04:12,820 I aquests patrons són diferents en general en l'inici d'aquests arxius. 133 00:04:12,820 --> 00:04:18,200 >> Així que quan l'equip obre una Paraula doc, o quan un equip s'obre un arxiu JPEG, 134 00:04:18,200 --> 00:04:20,940 es veu normalment en la primer diversos bits a l'arxiu. 135 00:04:20,940 --> 00:04:24,059 I si es reconeix un patró, que diu, oh, això és una imatge. 136 00:04:24,059 --> 00:04:25,850 Permetin-me exhibeixo a l'usuari com un gràfic. 137 00:04:25,850 --> 00:04:27,870 O, oh, això s'assembla a un document de Word. 138 00:04:27,870 --> 00:04:30,480 Déjame mostrar a l'usuari com un assaig. 139 00:04:30,480 --> 00:04:33,020 >> Així, per exemple, arxius JPEG, Resulta que són 140 00:04:33,020 --> 00:04:35,460 bastant sofisticat sota de la caputxa. 141 00:04:35,460 --> 00:04:40,140 Però els tres primers bytes en la majoria de cada JPEG començar amb aquests tres nombres. 142 00:04:40,140 --> 00:04:44,680 Així byte zero, un, i dos són, en la majoria de cada JPEG, 255, llavors el nombre 143 00:04:44,680 --> 00:04:46,675 216, llavors el nombre 255. 144 00:04:46,675 --> 00:04:48,990 >> I el que podràs per començar a fer la setmana vinent 145 00:04:48,990 --> 00:04:52,920 en realitat està ficant sota el capó d'arxius com fitxers JPEG 146 00:04:52,920 --> 00:04:57,210 i igual que els arxius de mapa de bits, i veure El que sempre ha estat aquí tot el temps 147 00:04:57,210 --> 00:04:58,650 com vostè ha estat utilitzant un ordinador. 148 00:04:58,650 --> 00:05:01,860 >> Però el que hi ha allà no és típicament escrita com nombres decimals com aquest. 149 00:05:01,860 --> 00:05:04,620 Els informàtics no fan tendeixen a parlar en decimal. 150 00:05:04,620 --> 00:05:06,139 En realitat, no parlen en binari. 151 00:05:06,139 --> 00:05:07,930 Normalment, quan volem per expressar nombres, 152 00:05:07,930 --> 00:05:10,710 realment fem servir hexadecimal, que vostè pot recordar 153 00:05:10,710 --> 00:05:13,027 de, per exemple, de problemes Un, que va desafiar 154 00:05:13,027 --> 00:05:14,610 a pensar en un sistema diferent. 155 00:05:14,610 --> 00:05:17,170 >> Nosaltres, per descomptat, estem familiaritzats amb decimals, del zero al nou. 156 00:05:17,170 --> 00:05:18,215 Parlem d'binari. 157 00:05:18,215 --> 00:05:20,710 I nosaltres realment no tenim d'usar que molt aquí 158 00:05:20,710 --> 00:05:22,470 des d'ara, perquè els ordinadors que utilitzaran. 159 00:05:22,470 --> 00:05:24,900 Però els programadors ho farà molt sovint, però no sempre, 160 00:05:24,900 --> 00:05:29,360 utilitzar hexadecimal, que només significa vostè té 16 lletres en el seu alfabet, 161 00:05:29,360 --> 00:05:31,330 en lloc de dos o 10. 162 00:05:31,330 --> 00:05:34,530 >> Llavors, ¿com explicar a un major de nou de cada hexadecimal? 163 00:05:34,530 --> 00:05:41,120 Vas 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, només per convenció. 164 00:05:41,120 --> 00:05:43,540 Però el que és fonamental és que cada d'ells és un sol símbol. 165 00:05:43,540 --> 00:05:44,340 No hi ha 10. 166 00:05:44,340 --> 00:05:48,400 No hi ha 11, per se, ja que cada de les seves xifres, igual que en decimal 167 00:05:48,400 --> 00:05:51,940 i igual que en el sistema binari, només ha ser un sol caràcter, per convenció. 168 00:05:51,940 --> 00:05:55,280 >> Així que a continuació és l'alfabet que tenim a la nostra disposició per hexadecimal. 169 00:05:55,280 --> 00:05:58,600 Així que el que té un aspecte una JPEG com si eren per escriure els tres primers 170 00:05:58,600 --> 00:06:01,980 No bytes com decimal, però, per exemple, com hexadecimal? 171 00:06:01,980 --> 00:06:03,640 I per què és hexagonal fins i tot tan útil? 172 00:06:03,640 --> 00:06:05,290 >> Bé, una ràpida ullada a un exemple. 173 00:06:05,290 --> 00:06:09,030 Així que si jo escric els bits que representar aquests numbers-- decimal 174 00:06:09,030 --> 00:06:12,450 això pot resultar una mica rovellat ara des de fa unes setmanes, 175 00:06:12,450 --> 00:06:14,820 però el de l'esquerra i la dret són bastant fàcil. 176 00:06:14,820 --> 00:06:17,990 255 era el nombre més gran que podria representar amb vuit bits. 177 00:06:17,990 --> 00:06:18,820 Va ser tot uns. 178 00:06:18,820 --> 00:06:21,320 Així que l'únic que està lleugerament interessant és el del mig. 179 00:06:21,320 --> 00:06:24,700 I si ho fas tipus de la matemàtiques, es dedueix que, de fet, 180 00:06:24,700 --> 00:06:27,949 que el patró d'una i zeros representa 216. 181 00:06:27,949 --> 00:06:30,240 Així que anem a estipular ara que aquests són correctes. 182 00:06:30,240 --> 00:06:31,730 Però per què és interessant? 183 00:06:31,730 --> 00:06:33,970 >> Bé, un byte, per descomptat, és de vuit bits. 184 00:06:33,970 --> 00:06:38,980 I resulta que si vostè pensa d'un byte com dos trossos de quatre bits, 185 00:06:38,980 --> 00:06:39,500 com aquest. 186 00:06:39,500 --> 00:06:41,000 Voldria afegir una mica d'espai. 187 00:06:41,000 --> 00:06:42,550 Així que abans, després. 188 00:06:42,550 --> 00:06:46,520 Acabo d'afegir una mica d'espai en blanc per l'amor de la visualització aquí. 189 00:06:46,520 --> 00:06:51,840 Com podem ara representar a, diguem, hexadecimal cada quad de bits, 190 00:06:51,840 --> 00:06:52,880 cada conjunt de quatre bits? 191 00:06:52,880 --> 00:06:56,420 >> Així, per exemple, a l'esquerra ara, tenim 1111 en binari. 192 00:06:56,420 --> 00:07:00,420 Quin és aquest nombre en decimal, si ho fa fora de les matemàtiques? 193 00:07:00,420 --> 00:07:03,780 Vostè té el lloc de les unitats, el lloc de dos en dos, el lloc de quatre grapes, i el lloc vuits. 194 00:07:03,780 --> 00:07:04,341 >> AUDIÈNCIA: 15. 195 00:07:04,341 --> 00:07:05,340 DAVID J. Malan: És 15. 196 00:07:05,340 --> 00:07:08,340 Així que si ho fem huit més 4 més dos més un, obtenim 15. 197 00:07:08,340 --> 00:07:11,790 Així que podria anotar 15 infra 1111, però el punt aquí 198 00:07:11,790 --> 00:07:13,190 és hexadecimal, no decimal. 199 00:07:13,190 --> 00:07:17,310 Així que en lloc d'escriure 15, 1-5, Vaig a escriure que en hexadecimal, 200 00:07:17,310 --> 00:07:22,311 que si pensa tornar, si vostè té zero a través de f, que 15 serà? 201 00:07:22,311 --> 00:07:22,810 AUDIÈNCIA: f. 202 00:07:22,810 --> 00:07:24,434 DAVID J. Malan: Així que resulta que de l'f. 203 00:07:24,434 --> 00:07:29,140 I vostè pot treballar en això, dient: així, si a és 10, llavors bé, f és de 15. 204 00:07:29,140 --> 00:07:33,250 Així que de fet, podríem reescriure Aquest mateix conjunt de nombres com f f. 205 00:07:33,250 --> 00:07:35,750 I després, si fem una mica de matemàtiques, anem a deduir que això és d. 206 00:07:35,750 --> 00:07:38,650 Vuit és bastant fàcil, ja que tenir un un al lloc vuits. 207 00:07:38,650 --> 00:07:40,620 I després, tenim un parell més de f f. 208 00:07:40,620 --> 00:07:44,669 >> Així que el que els humans tendeixen a fer per convenció quan utilitzen hexadecimal és simplement 209 00:07:44,669 --> 00:07:47,710 escriure això una mica més succinta, desfer-se de la major part d'aquest espai en blanc. 210 00:07:47,710 --> 00:07:50,890 I només per ser súper clar per lectors que aquesta és hexadecimal, 211 00:07:50,890 --> 00:07:54,670 simple convenció entre els éssers humans li escriuen zero 212 00:07:54,670 --> 00:07:58,000 x, que no té un altre significat d'un identificador visual de, 213 00:07:58,000 --> 00:07:59,590 aquí ve un nombre hexadecimal. 214 00:07:59,590 --> 00:08:04,210 >> I llavors, de posar els dos dígits, f f en aquest cas, a continuació, d a, llavors f f. 215 00:08:04,210 --> 00:08:06,700 Així que conte llarg, hexadecimal només tendeix 216 00:08:06,700 --> 00:08:11,990 per a ser útil perquè cadascun dels seus dígits, del zero al f, perfectament línies 217 00:08:11,990 --> 00:08:13,880 amb un patró de quatre bits. 218 00:08:13,880 --> 00:08:18,080 >> Així que si vostè té dos dígits hexadecimals, zero a la F, i una altra, 219 00:08:18,080 --> 00:08:20,256 que li dóna a la perfecció vuit bits o un byte. 220 00:08:20,256 --> 00:08:22,380 Així que per això es tendeix a ser útil convencionalment. 221 00:08:22,380 --> 00:08:24,990 No hi ha intel · lectual contingut realment més enllà d'això, 222 00:08:24,990 --> 00:08:27,010 a part de la seva utilitat real. 223 00:08:27,010 --> 00:08:29,310 >> Ara els fitxers JPEG no són l'única formats d'arxius de gràfics. 224 00:08:29,310 --> 00:08:33,230 Vostè pot recordar que hi ha arxius d'aquest tipus al món, 225 00:08:33,230 --> 00:08:34,830 almenys des de fa uns anys. 226 00:08:34,830 --> 00:08:37,580 >> Així que això era en realitat instal · lat en Windows XP 227 00:08:37,580 --> 00:08:39,960 en milions d'ordinadors de tot el món. 228 00:08:39,960 --> 00:08:43,000 I aquest era un arxiu de mapa de bits, BMP. 229 00:08:43,000 --> 00:08:47,690 I un arxiu de mapa de bits, com es veurà el proper setmana, només significa un patró de punts, 230 00:08:47,690 --> 00:08:51,710 píxels com se'ls anomena, un mapa a partir dels bits, de veritat. 231 00:08:51,710 --> 00:08:55,160 >> Així que el que és interessant, però, sobre aquest format d'arxiu, BMP, és 232 00:08:55,160 --> 00:08:58,590 que sota la capella, que compta amb més de només tres bytes 233 00:08:58,590 --> 00:09:01,020 que componen la seva capçalera, de manera parlar, els primers mossos. 234 00:09:01,020 --> 00:09:03,330 En realitat es veu una mica complicat a primera vista. 235 00:09:03,330 --> 00:09:04,704 I veurà això en el conjunt P. 236 00:09:04,704 --> 00:09:06,810 I aconseguir alguna cosa en particular d'aquesta empresa 237 00:09:06,810 --> 00:09:10,720 que no és tan important, ja que només el fet de que al començament de cada mapa de bits 238 00:09:10,720 --> 00:09:13,823 arxiu, un format gràfic, hi ha tot un munt de nombres. 239 00:09:13,823 --> 00:09:14,980 240 00:09:14,980 --> 00:09:16,720 >> Ara Microsoft, el autor d'aquest format, 241 00:09:16,720 --> 00:09:18,820 tendeix a cridar als Les coses no sencers i caràcters 242 00:09:18,820 --> 00:09:22,259 i flotadors però les paraules i d paraules i llargs i bytes. 243 00:09:22,259 --> 00:09:23,800 Així que són només diferents tipus de dades. 244 00:09:23,800 --> 00:09:25,170 Són diferents noms per a la mateixa cosa. 245 00:09:25,170 --> 00:09:26,740 Però veuràs que a P setembre Four. 246 00:09:26,740 --> 00:09:31,450 >> Però això és només per dir que si un ésser humà doble clics algun arxiu BMP en el seu 247 00:09:31,450 --> 00:09:35,015 o el seu disc dur, i una finestra s'obre fins a ell o ella que la imatge que mostra, 248 00:09:35,015 --> 00:09:38,500 això va succeir perquè l'operatiu sistema presumiblement va notar no només 249 00:09:38,500 --> 00:09:41,460 l'extensió d'arxiu BMP en el nom del fitxer, 250 00:09:41,460 --> 00:09:45,010 sinó també el fet que hi ha una mica de convenció per al patró de bits 251 00:09:45,010 --> 00:09:47,490 en el començament d'aquest arxiu de mapa de bits. 252 00:09:47,490 --> 00:09:50,270 >> Però ara ens centrarem en un arxiu complicada tal, 253 00:09:50,270 --> 00:09:52,120 sinó en alguna cosa com això. 254 00:09:52,120 --> 00:09:55,190 Suposem que aquí a gedit, I només tenen els inicis 255 00:09:55,190 --> 00:09:57,070 d'un programa que és bastant simple. 256 00:09:57,070 --> 00:09:58,860 Tinc una mica inclou fins a dalt. 257 00:09:58,860 --> 00:10:02,120 Ara tinc "structs.h" # include però Vaig a tornar a això en un moment. 258 00:10:02,120 --> 00:10:03,974 Però això és útil per ara. 259 00:10:03,974 --> 00:10:05,890 Així que aquest és un programa això va a aplicar 260 00:10:05,890 --> 00:10:07,335 com la base de dades del registrador. 261 00:10:07,335 --> 00:10:09,710 Així que una base de dades dels estudiants, i tots els estudiants en el món 262 00:10:09,710 --> 00:10:13,190 té un nom i una casa i probablement alguns altres coses, però anem a mantenir les coses simples. 263 00:10:13,190 --> 00:10:15,140 Cada estudiant té un nom i una casa. 264 00:10:15,140 --> 00:10:17,700 >> Així que si jo volia escriure una programa el propòsit a la vida 265 00:10:17,700 --> 00:10:19,860 va ser simplement per recórrer des zero en un màxim de tres, 266 00:10:19,860 --> 00:10:22,070 si hi ha tres estudiants a la Universitat de Harvard. 267 00:10:22,070 --> 00:10:25,350 I jo només vull arribar, mitjançant GetString, el nom de cada estudiant i de la casa, 268 00:10:25,350 --> 00:10:26,600 i després simplement imprimir aquells terme. 269 00:10:26,600 --> 00:10:28,630 >> Això és una mena de Setmana Un, Setmana Dues coses ara, 270 00:10:28,630 --> 00:10:30,810 on jo només vull una per bucle o alguna cosa per l'estil. 271 00:10:30,810 --> 00:10:34,500 I vull cridar GetString alguns vegades i, a continuació, s'imprimeixen f diverses vegades. 272 00:10:34,500 --> 00:10:37,340 Llavors, ¿com podria jo fer això, però, quan un nom i una casa 273 00:10:37,340 --> 00:10:39,070 estan involucrats per a cada estudiant? 274 00:10:39,070 --> 00:10:42,830 >> Així que el meu primer instint podria la de fer alguna cosa com això. 275 00:10:42,830 --> 00:10:49,620 Jo podria dir primer, bé, dóna'm, dir, una matriu de cadenes anomenats noms. 276 00:10:49,620 --> 00:10:51,530 I jo no vull un hardcode tres aquí. 277 00:10:51,530 --> 00:10:53,064 Què vull posar-hi? 278 00:10:53,064 --> 00:10:55,730 Perquè els estudiants, perquè això és només una constant declarada a la part superior, 279 00:10:55,730 --> 00:10:57,860 només perquè jo no he de codificar tres a múltiples llocs. 280 00:10:57,860 --> 00:11:00,859 D'aquesta manera, puc canviar un sol lloc, i que afecta un canvi a tot arreu. 281 00:11:00,859 --> 00:11:04,470 I llavors, jo podria fer cadena alberga ESTUDIANTS. 282 00:11:04,470 --> 00:11:10,250 >> I ara, jo podria fer alguna cosa com for (int i = 0; i 00:11:14,390 Així que estic escrivint ràpid, però això és probablement sintaxi familiar ara. 284 00:11:14,390 --> 00:11:17,030 >> I ara, això era més recent. 285 00:11:17,030 --> 00:11:22,890 Si vull posar en l'i-th el nom de l'estudiant, crec que faig això. 286 00:11:22,890 --> 00:11:26,480 I llavors, no noms però les cases mènsula. 287 00:11:26,480 --> 00:11:29,930 Faig això, GetString, i deixo em tornar enrere i corregir aquesta línia. 288 00:11:29,930 --> 00:11:30,430 D'acord? 289 00:11:30,430 --> 00:11:31,200 En desacord? 290 00:11:31,200 --> 00:11:32,366 No és molt fàcil d'utilitzar. 291 00:11:32,366 --> 00:11:33,890 No li he dit a l'usuari què fer. 292 00:11:33,890 --> 00:11:36,520 >> Però ara, si jo també volia més tard, anem a 293 00:11:36,520 --> 00:11:40,060 diguem, imprimiu aquestes coses sortir-- TOT el més tard. 294 00:11:40,060 --> 00:11:42,330 Vaig a fer més amb esto-- aquest és sens dubte 295 00:11:42,330 --> 00:11:45,970 una correcta aplicació de la aconseguir noms i cases, 03:00 296 00:11:45,970 --> 00:11:48,870 d'ells total de cada un, d'un usuari. 297 00:11:48,870 --> 00:11:51,280 >> Però això no és molt bon disseny, no? 298 00:11:51,280 --> 00:11:55,220 Què passa si un estudiant té no només un nom i una casa, però també un nombre d'identificació, 299 00:11:55,220 --> 00:11:57,770 i un nombre de telèfon, i una adreça de correu electrònic, 300 00:11:57,770 --> 00:12:00,280 i potser una pàgina d'inici, i potser un mànec Twitter, 301 00:12:00,280 --> 00:12:03,730 i qualsevol nombre d'altres detalls associada a un estudiant o una persona, 302 00:12:03,730 --> 00:12:04,610 de manera més general. 303 00:12:04,610 --> 00:12:07,720 Com podem començar a afegir funcionalitat d'aquest programa? 304 00:12:07,720 --> 00:12:14,080 >> Bé, sento que la manera més simple podria ser per fer alguna cosa com, diguem, 305 00:12:14,080 --> 00:12:16,490 int ids ESTUDIANTS. 306 00:12:16,490 --> 00:12:18,380 Així que puc posar tots els seus documents d'identitat en aquest país. 307 00:12:18,380 --> 00:12:22,240 I llavors, una cosa com números de telèfon, 308 00:12:22,240 --> 00:12:24,400 No estic segur de com representar això encara. 309 00:12:24,400 --> 00:12:30,280 Així que seguirem endavant i simplement anomenada aquest twitters ESTUDIANTS, que 310 00:12:30,280 --> 00:12:33,550 és una mica estrany, pero-- i un munt més camps. 311 00:12:33,550 --> 00:12:36,360 >> He començat a amb eficàcia copieu i enganxeu aquí. 312 00:12:36,360 --> 00:12:39,416 I això creixerà bastant difícil de manejar bastant ràpid, oi? 313 00:12:39,416 --> 00:12:42,290 ¿No seria agradable si hi havia al món una estructura de dades coneguda 314 00:12:42,290 --> 00:12:45,600 no com un int o una cadena, però alguna cosa nivell superior, una abstracció, per la qual 315 00:12:45,600 --> 00:12:47,570 parlar, coneguda com a estudiant? 316 00:12:47,570 --> 00:12:50,220 C no va venir amb una funció de funcionalitat per als estudiants, 317 00:12:50,220 --> 00:12:52,260 però el que si volia donar-li tal? 318 00:12:52,260 --> 00:12:55,640 >> Bé, resulta que vaig a obrir un fitxer anomenat structs.h aquí, 319 00:12:55,640 --> 00:12:57,090 i vostè pot fer exactament això. 320 00:12:57,090 --> 00:12:58,290 I anem a començar a fer això ara. 321 00:12:58,290 --> 00:13:01,490 I sota de la caputxa de P Set de tres, que ja ha estat fent això ara. 322 00:13:01,490 --> 00:13:05,920 No hi ha tal cosa com un g rect o 1 g ovalada en el llenguatge de programació C. 323 00:13:05,920 --> 00:13:10,570 >> La gent a Stanford implementen els tipus de dades mitjançant l'ús d'aquest enfocament aquí, 324 00:13:10,570 --> 00:13:13,900 declarant la seva pròpia noves dades tipus utilitzant una nova paraula clau 325 00:13:13,900 --> 00:13:16,744 anomenada struct i un altre un anomenat typedef. 326 00:13:16,744 --> 00:13:19,660 I de fet, tot i que la sintaxi es veu una mica diferent de les coses 327 00:13:19,660 --> 00:13:23,550 que hem vist abans, en principi, és super simple. 328 00:13:23,550 --> 00:13:25,297 >> Això només vol dir "definir un tipus." 329 00:13:25,297 --> 00:13:27,255 Això serà un estructura, i una estructura 330 00:13:27,255 --> 00:13:29,400 és com un contenidor per a múltiples coses. 331 00:13:29,400 --> 00:13:31,780 I aquesta estructura es va tenir una cadena anomenada nom, 332 00:13:31,780 --> 00:13:33,210 i una cadena flama casa. 333 00:13:33,210 --> 00:13:37,520 I anem a cridar, només per conveniència, tot aquest estudiant estructura de dades. 334 00:13:37,520 --> 00:13:40,320 >> Així que el moment en què arribi a el punt i coma, que té ara 335 00:13:40,320 --> 00:13:43,280 creat les seves pròpies dades tipus anomenat estudiant 336 00:13:43,280 --> 00:13:46,420 que ara està al costat de int, i el flotador, i char, i la cadena, 337 00:13:46,420 --> 00:13:50,270 ig rect, i g oval, i qualsevol nombre d'altres coses que la gent ha inventat. 338 00:13:50,270 --> 00:13:53,340 >> Així que el que és útil sobre ara és que si torno 339 00:13:53,340 --> 00:13:57,430 a struct 0 i acabar aquest aplicació, que vaig escriure 340 00:13:57,430 --> 00:14:02,080 per avançat aquí, observi que tots del desordre inevitable que 341 00:14:02,080 --> 00:14:05,490 estava a punt de començar a succeir com vaig agregar números i twitters de telèfon i tot 342 00:14:05,490 --> 00:14:07,370 aquestes altres coses definició d'un estudiant, 343 00:14:07,370 --> 00:14:11,810 ara està succintament concloure tan sols una varietat d'estudiants. 344 00:14:11,810 --> 00:14:15,500 >> I cada un d'aquests estudiants ara té diverses coses dins d'ella. 345 00:14:15,500 --> 00:14:16,930 Així que només deixa una pregunta. 346 00:14:16,930 --> 00:14:19,700 Com s'arriba al nom, i la casa, i la ID, 347 00:14:19,700 --> 00:14:21,640 i per tot el que interior de l'estudiant? 348 00:14:21,640 --> 00:14:22,930 Súper simple, també. 349 00:14:22,930 --> 00:14:25,730 Nova sintaxi, sinó una idea simple. 350 00:14:25,730 --> 00:14:29,239 >> Simplement índex en la matriu, com ho vam fer la setmana passada i aquesta. 351 00:14:29,239 --> 00:14:31,030 I el que és clarament la nova peça de sintaxi? 352 00:14:31,030 --> 00:14:32,590 353 00:14:32,590 --> 00:14:35,880 Just., Que significa "anar dins la estructura i fer el camp anomenat 354 00:14:35,880 --> 00:14:39,030 nom, obtenir el camp anomenat casa, obtenir el camp anomenat estudiant ". 355 00:14:39,030 --> 00:14:41,940 >> Així que en el conjunt P de tres, si ets segueix treballant en això, 356 00:14:41,940 --> 00:14:44,020 i la majoria de la gent encara són, adonar-se que a mesura que 357 00:14:44,020 --> 00:14:46,130 començar a utilitzar coses com g rectes i g ovals 358 00:14:46,130 --> 00:14:50,201 i altres coses que no semblen provenir de la Setmana Zero, un, o dos, 359 00:14:50,201 --> 00:14:52,950 s'adonen que això és perquè Stanford declarat alguns nous tipus de dades. 360 00:14:52,950 --> 00:14:56,160 >> I de fet, això és exactament el que farem fer, així, en el conjunt P de Cuatro, quan 361 00:14:56,160 --> 00:14:59,880 vam començar a tractar amb les coses com imatges, mapes de bits i molt més. 362 00:14:59,880 --> 00:15:02,882 Així que això és només un avanç i un model mental del que està per venir. 363 00:15:02,882 --> 00:15:04,590 Ara, he demorat una mica aquest matí. 364 00:15:04,590 --> 00:15:09,560 Jo era una mena de curiositat per veure el que el fons de pantalla Microsoft realitat 365 00:15:09,560 --> 00:15:10,310 sembla que avui. 366 00:15:10,310 --> 00:15:15,200 I resulta que algú el 2006 en realitat va ser gairebé exactament 367 00:15:15,200 --> 00:15:19,210 el mateix lloc per fotografiar a la realitat el que sembla que en aquests dies. 368 00:15:19,210 --> 00:15:21,380 El camp és ara una mica de mala herba. 369 00:15:21,380 --> 00:15:24,850 >> Així que parlar ara de les imatges, anem a portar de tornada a Daven aquí 370 00:15:24,850 --> 00:15:26,890 a la pantalla i Nicholas, i just recordar 371 00:15:26,890 --> 00:15:30,540 que si voleu unir-se a nosaltres per dinar aquest divendres, el cap a la nostra adreça habitual 372 00:15:30,540 --> 00:15:31,440 Aquí. 373 00:15:31,440 --> 00:15:33,530 >> Llavors, on ens deixem fos el dilluns? 374 00:15:33,530 --> 00:15:35,140 Hem introduït aquest problema, oi? 375 00:15:35,140 --> 00:15:37,610 Aquest va ser aparentment una correcta implementació de swap, 376 00:15:37,610 --> 00:15:40,460 mitjançant el qual es pren dos enters, una crida, una crida b, 377 00:15:40,460 --> 00:15:44,130 intercanviar, igual que Laura va fer aquí a l'escenari amb la llet i l'aigua, 378 00:15:44,130 --> 00:15:46,820 mitjançant l'ús d'un temporal variable o una tassa buida, 379 00:15:46,820 --> 00:15:50,540 perquè poguéssim posar b en una i una a b sense fer un embolic de coses. 380 00:15:50,540 --> 00:15:51,560 Es va utilitzar una variable. 381 00:15:51,560 --> 00:15:52,870 Es diu temp. 382 00:15:52,870 --> 00:15:55,520 >> Però el que era la fonamental problema amb aquest codi dilluns? 383 00:15:55,520 --> 00:15:57,700 384 00:15:57,700 --> 00:15:58,870 Quin va ser el problema? 385 00:15:58,870 --> 00:16:00,106 386 00:16:00,106 --> 00:16:00,605 Sí. 387 00:16:00,605 --> 00:16:01,970 >> AUDIÈNCIA: Es necessita més espai. 388 00:16:01,970 --> 00:16:04,719 >> DAVID J. Malan: ocupa més espai, perquè estic fent servir una variable, 389 00:16:04,719 --> 00:16:05,400 i això està bé. 390 00:16:05,400 --> 00:16:07,300 Això és cert, però estic dirà que està bé. 391 00:16:07,300 --> 00:16:10,030 És a 32 bits en la gran esquema de les coses, així que no és gran cosa. 392 00:16:10,030 --> 00:16:10,655 Altres pensaments? 393 00:16:10,655 --> 00:16:12,572 AUDIÈNCIA: Només s'intercanvia les variables a nivell local. 394 00:16:12,572 --> 00:16:13,571 DAVID J. Malan: Exactament. 395 00:16:13,571 --> 00:16:15,090 Només canvia les variables de forma local. 396 00:16:15,090 --> 00:16:18,173 Perquè cada vegada que et truqui un function-- quan vaig tenir les safates de Annenberg 397 00:16:18,173 --> 00:16:19,840 l'última vegada, tens principal a la part inferior. 398 00:16:19,840 --> 00:16:23,560 Tan aviat com es crida a una funció anomenada intercanvi, bescanvi no obté x i y, 399 00:16:23,560 --> 00:16:24,400 els valors originals. 400 00:16:24,400 --> 00:16:26,392 Què significa intercanvi get, ens reclamem? 401 00:16:26,392 --> 00:16:27,100 AUDIÈNCIA: Còpies. 402 00:16:27,100 --> 00:16:28,090 DAVID J. Malan: Així còpies d'ells. 403 00:16:28,090 --> 00:16:31,120 Així es posa un i dos, si recordar l'exemple de l'última vegada, 404 00:16:31,120 --> 00:16:34,730 però una còpia d'un i dos que s'intercanvien amb èxit. 405 00:16:34,730 --> 00:16:38,550 Però, per desgràcia, al final, aquests valors segueixen sent els mateixos. 406 00:16:38,550 --> 00:16:41,880 Així que podem veure això amb la nostra nou amic, espero GDB, 407 00:16:41,880 --> 00:16:45,180 que vostè o els TFS i Ca de tenir estat guiant cap a la següent manera. 408 00:16:45,180 --> 00:16:51,210 >> Així que no hi ha memòria d'intercanvi es veu com-- anem obrir esto-- són aquestes. 409 00:16:51,210 --> 00:16:54,160 Inicialitzem x per un, i per a dos. 410 00:16:54,160 --> 00:16:55,620 Tenia un munt d'impressió de f. 411 00:16:55,620 --> 00:16:58,080 Però llavors, l'anomenada clau aquí calia canviar, que 412 00:16:58,080 --> 00:17:00,260 és exactament el que el codi acabo de veure fa un moment. 413 00:17:00,260 --> 00:17:03,180 Què és correcta en primera vista, però funcionalment, 414 00:17:03,180 --> 00:17:06,800 aquest programa no funciona, perquè no intercanviar de manera permanent x i y. 415 00:17:06,800 --> 00:17:10,190 >> Així que vegem això, un escalfament ràpid fins aquí amb el BGF, un ./noswap. 416 00:17:10,190 --> 00:17:11,867 417 00:17:11,867 --> 00:17:15,200 Un munt d'informació aclaparadora que Em desfaré de L amb control per ara. 418 00:17:15,200 --> 00:17:17,516 I ara, me'n vaig a seguir endavant i executar-lo. 419 00:17:17,516 --> 00:17:19,349 I, per desgràcia, que no era tan útil. 420 00:17:19,349 --> 00:17:22,355 Es va córrer el programa dins d'aquest programa anomenat GDB, un depurador, 421 00:17:22,355 --> 00:17:23,730 però no em va deixar furgar. 422 00:17:23,730 --> 00:17:26,229 >> Llavors, com puc realment fer una pausa execució dins d'aquest programa? 423 00:17:26,229 --> 00:17:27,410 424 00:17:27,410 --> 00:17:28,329 Així trencar. 425 00:17:28,329 --> 00:17:32,340 I podria trencar en qualsevol número, un, 10, 15 de línia. 426 00:17:32,340 --> 00:17:35,530 Però també puc trencar simbòlicament dient ruptura principal. 427 00:17:35,530 --> 00:17:38,980 I això va a establir un descans punt, pel que sembla, en la línia 16 a la principal. 428 00:17:38,980 --> 00:17:40,050 ¿I on és la línia 16? 429 00:17:40,050 --> 00:17:42,960 Anem a anar fins al codi i pujar a noswap. 430 00:17:42,960 --> 00:17:46,930 I, de fet, la línia 16 és la molt primer en el programa. 431 00:17:46,930 --> 00:17:52,130 >> Així que ara, si em vaig per davant i el tipus executar aquest temps, Enter, es va aturar. 432 00:17:52,130 --> 00:17:53,080 Així que anem a furgar. 433 00:17:53,080 --> 00:17:55,716 Imprimir x-- què és x zero? 434 00:17:55,716 --> 00:17:56,705 435 00:17:56,705 --> 00:17:57,830 I ignorar el signe de dòlar. 436 00:17:57,830 --> 00:17:59,725 Això és només per als més de luxe ús del programa. 437 00:17:59,725 --> 00:18:00,780 438 00:18:00,780 --> 00:18:03,140 Per què és x zero en aquest moment? 439 00:18:03,140 --> 00:18:03,640 Sí. 440 00:18:03,640 --> 00:18:07,061 >> AUDIÈNCIA: Es va aturar just abans de línia 16, no realment en la línia 16. 441 00:18:07,061 --> 00:18:08,060 DAVID J. Malan: Exactament. 442 00:18:08,060 --> 00:18:11,630 GDB, per defecte, s'ha aturat execució just abans de la línia 16. 443 00:18:11,630 --> 00:18:14,820 Així que no s'ha executat, el que significa x és d'algun valor desconegut. 444 00:18:14,820 --> 00:18:17,150 I tenim la sort que és alguna cosa net com zero. 445 00:18:17,150 --> 00:18:20,310 Així que ara si escric següent, ara és executat 16. 446 00:18:20,310 --> 00:18:22,000 Està esperant que jo executo 17. 447 00:18:22,000 --> 00:18:23,400 Déjame anar endavant i print x. 448 00:18:23,400 --> 00:18:24,094 És un. 449 00:18:24,094 --> 00:18:25,260 Déjame anar endavant i d'impressió i. 450 00:18:25,260 --> 00:18:26,176 Què he de veure ara? 451 00:18:26,176 --> 00:18:27,660 452 00:18:27,660 --> 00:18:28,560 >> AUDIÈNCIA: [inaudible] 453 00:18:28,560 --> 00:18:29,165 >> DAVID J. Malan: Una mica més fort. 454 00:18:29,165 --> 00:18:30,040 >> AUDIÈNCIA: [inaudible] 455 00:18:30,040 --> 00:18:30,537 456 00:18:30,537 --> 00:18:32,120 DAVID J. Malan: No fa ni un consens. 457 00:18:32,120 --> 00:18:34,760 Així que sí, veiem un cert valor de les escombraries. 458 00:18:34,760 --> 00:18:37,862 Ara, i és 134514064 allà. 459 00:18:37,862 --> 00:18:39,320 Bé, és només un valor de les escombraries. 460 00:18:39,320 --> 00:18:41,350 El meu programa utilitza memòria RAM per a diferents propòsits. 461 00:18:41,350 --> 00:18:42,350 Hi ha altres funcions. 462 00:18:42,350 --> 00:18:44,040 Altres persones van escriure dins del meu ordinador. 463 00:18:44,040 --> 00:18:46,789 Així que aquests bits s'han utilitzat per altres valors, i el que estic veient 464 00:18:46,789 --> 00:18:49,470 és les restes d'alguns utilització anterior d'aquesta memòria. 465 00:18:49,470 --> 00:18:53,350 >> Així que no és gran cosa, perquè tan aviat mentre escric següent i després imprimir i, 466 00:18:53,350 --> 00:18:55,640 s'inicialitza a el valor que vull. 467 00:18:55,640 --> 00:18:57,400 Així que ara, seguirem endavant una mica més ràpid. 468 00:18:57,400 --> 00:18:58,540 N per al següent. 469 00:18:58,540 --> 00:18:59,570 Anem a fer-ho de nou. 470 00:18:59,570 --> 00:19:00,530 Anem a fer-ho de nou. 471 00:19:00,530 --> 00:19:02,404 Però jo no vull colpejar aquí, perquè si 472 00:19:02,404 --> 00:19:05,110 voler veure el que està passant a l'interior d'intercanvi, el que és la comanda? 473 00:19:05,110 --> 00:19:05,520 >> AUDIÈNCIA: passos. 474 00:19:05,520 --> 00:19:06,436 >> DAVID J. Malan: passos. 475 00:19:06,436 --> 00:19:09,800 Així que això em fica en un funció, en lloc de sobre ella. 476 00:19:09,800 --> 00:19:12,270 I ara, que és una mica críptic honestament, però això és només 477 00:19:12,270 --> 00:19:14,581 em diu que estic en la línia 33 ara. 478 00:19:14,581 --> 00:19:15,580 I farem això de nou. 479 00:19:15,580 --> 00:19:16,080 Temp impressió. 480 00:19:16,080 --> 00:19:17,129 481 00:19:17,129 --> 00:19:20,170 Valor escombraries, negatiu aquest cop, però això és només encara un valor escombraries. 482 00:19:20,170 --> 00:19:22,810 Així que farem a continuació, la temperatura d'impressió. 483 00:19:22,810 --> 00:19:27,130 S'inicialitza a 1, la qual cosa era el valor de x, també conegut com un. 484 00:19:27,130 --> 00:19:29,110 >> Ara, ¿on són els nostres A i X ve? 485 00:19:29,110 --> 00:19:32,510 Doncs bé, advertim en principal, cridat a aquests valors x i y. 486 00:19:32,510 --> 00:19:34,740 A continuació, passem a intercanviar la següent manera. 487 00:19:34,740 --> 00:19:37,010 X va ser primer, coma i. 488 00:19:37,010 --> 00:19:40,020 I llavors, d'intercanvi podria anomenar xi y. 489 00:19:40,020 --> 00:19:42,630 Però per a major claredat, és cridant a i b. 490 00:19:42,630 --> 00:19:45,970 Però aib ara seran còpies de x i y, respectivament. 491 00:19:45,970 --> 00:19:50,660 >> Així que si torno a GDB, temp és ara un any i s'ha convertit en un. 492 00:19:50,660 --> 00:19:56,130 Però si ho faig al costat i ara fer d'impressió A, A ja s'ha mogut més. 493 00:19:56,130 --> 00:20:00,030 La llet ha estat vessat a l'antiga el got de suc de taronja, o viceversa. 494 00:20:00,030 --> 00:20:04,750 >> I si faig el següent una altra vegada, i ara si imprimeixo com una comprovació de validesa, 495 00:20:04,750 --> 00:20:07,687 una continua sent dos, però b és ara un. 496 00:20:07,687 --> 00:20:08,770 Francament, encara és allà. 497 00:20:08,770 --> 00:20:10,670 No m'importa el que la temperatura és. 498 00:20:10,670 --> 00:20:16,850 Però tan aviat com ara escric, diguem, continuï a tornar, ara sóc al final 499 00:20:16,850 --> 00:20:17,480 el programa. 500 00:20:17,480 --> 00:20:20,730 I, per desgràcia, x és sent un e i segueix sent dos. 501 00:20:20,730 --> 00:20:22,272 >> Llavors, ¿quina era la utilitat de GDB allà? 502 00:20:22,272 --> 00:20:23,980 No va ajudar a arreglar- el problema per se, 503 00:20:23,980 --> 00:20:26,265 però espero que m'ajudi entendre realitzant 504 00:20:26,265 --> 00:20:30,000 això sí, la meva lògica és correcta, però el meu codi és no tenir en última instància 505 00:20:30,000 --> 00:20:31,450 un impacte permanent. 506 00:20:31,450 --> 00:20:34,570 Així que això és un problema que estem resoldrà ara avui. 507 00:20:34,570 --> 00:20:37,870 >> Però anem a arribar-hi a través d'aquest. 508 00:20:37,870 --> 00:20:39,230 La cadena és una mentida. 509 00:20:39,230 --> 00:20:41,860 És, també, no un tipus de dades que existeix en C. És 510 00:20:41,860 --> 00:20:44,750 estat sinònim d'alguns temps per a una altra cosa, 511 00:20:44,750 --> 00:20:47,300 i podem revelar que la manera següent. 512 00:20:47,300 --> 00:20:53,282 >> Déjame anar per davant i obro Un programa anomenat compara-0. 513 00:20:53,282 --> 00:20:56,240 I en lloc d'escriure aquest cap a fora, començarem a caminar a través del codi 514 00:20:56,240 --> 00:20:58,040 Ja he escrit, però és només unes poques línies. 515 00:20:58,040 --> 00:20:59,570 Així que això es compara-0. 516 00:20:59,570 --> 00:21:02,380 I el primer que estic fent és aconseguir una línia de text. 517 00:21:02,380 --> 00:21:05,610 >> Però noto que estic fent per primera vegada. 518 00:21:05,610 --> 00:21:07,910 El que és diferent amb claredat sobre la línia 21? 519 00:21:07,910 --> 00:21:10,020 520 00:21:10,020 --> 00:21:11,402 De fet, espera un minut. 521 00:21:11,402 --> 00:21:12,110 Aquesta és la còpia de dos. 522 00:21:12,110 --> 00:21:13,568 Això no és ni tan sols el programa adequat. 523 00:21:13,568 --> 00:21:14,780 Molt bé, spoiler alert. 524 00:21:14,780 --> 00:21:16,890 Molt bé, així que no importa que. 525 00:21:16,890 --> 00:21:18,520 Aquesta és la resposta a una pregunta futur. 526 00:21:18,520 --> 00:21:21,450 >> Aquí es compara-0, i estic a punt d'aconseguir una línia de text. 527 00:21:21,450 --> 00:21:22,435 De molt més simple programa. 528 00:21:22,435 --> 00:21:23,560 Així que això és senzill. 529 00:21:23,560 --> 00:21:28,070 Això és com la Setmana Un, Setmana Dues coses En el moment. string s = GetString. 530 00:21:28,070 --> 00:21:29,700 Ara, ho dic de nou aquí. 531 00:21:29,700 --> 00:21:31,830 cadena t = GetString. 532 00:21:31,830 --> 00:21:35,300 I després, l'última cosa en aquest programa, com el seu nom indica, 533 00:21:35,300 --> 00:21:37,090 és que em vaig a tractar de comparar-les. 534 00:21:37,090 --> 00:21:40,709 >> Així que si s, la primera cadena, és igual a = t, aleshores jo sóc 535 00:21:40,709 --> 00:21:42,250 dirà que escriu el mateix. 536 00:21:42,250 --> 00:21:44,291 Si no, jo vaig a dir escriu coses diferents. 537 00:21:44,291 --> 00:21:45,880 Així que anem a compilar i executar aquest programa. 538 00:21:45,880 --> 00:21:48,481 Així que compara zero. 539 00:21:48,481 --> 00:21:48,980 Es veu bé. 540 00:21:48,980 --> 00:21:50,490 No hi ha errors de compilació. 541 00:21:50,490 --> 00:21:52,386 >> Déjame anar per davant ara i escriviu ./compare-0. 542 00:21:52,386 --> 00:21:55,230 543 00:21:55,230 --> 00:21:59,220 Deixin-me seguir endavant i dir alguna cosa : Daven i una mica: Rob. 544 00:21:59,220 --> 00:22:00,450 I escric coses diferents. 545 00:22:00,450 --> 00:22:01,250 Fins ara, tot bé. 546 00:22:01,250 --> 00:22:02,680 Programa sembla ser correcta. 547 00:22:02,680 --> 00:22:03,880 >> Però anem a córrer de nou. 548 00:22:03,880 --> 00:22:05,800 Dir alguna cosa: Gabe. 549 00:22:05,800 --> 00:22:07,140 Dir alguna cosa: Gabe. 550 00:22:07,140 --> 00:22:08,520 551 00:22:08,520 --> 00:22:09,020 Bé. 552 00:22:09,020 --> 00:22:10,851 Potser em va colpejar la barra d'espai o alguna cosa funky. 553 00:22:10,851 --> 00:22:11,600 Anem a fer-ho de nou. 554 00:22:11,600 --> 00:22:13,020 Així Zamyla. 555 00:22:13,020 --> 00:22:13,970 556 00:22:13,970 --> 00:22:14,470 Zamyla. 557 00:22:14,470 --> 00:22:15,740 558 00:22:15,740 --> 00:22:17,330 Diferents coses. 559 00:22:17,330 --> 00:22:19,430 Llavors, què està passant? 560 00:22:19,430 --> 00:22:23,200 >> Així que tenim aquestes dues línies de codi, GetString es truca dues vegades. 561 00:22:23,200 --> 00:22:25,760 I llavors, estic simplement tractar de comparar s i t. 562 00:22:25,760 --> 00:22:28,370 Però el que realment està passant llavors? 563 00:22:28,370 --> 00:22:31,180 Bé, sobre la meva pròpia mà a carnisser aquest exemple alguna cosa. 564 00:22:31,180 --> 00:22:34,630 I siguem realment tiren això aquí, també. 565 00:22:34,630 --> 00:22:37,390 566 00:22:37,390 --> 00:22:45,712 >> Així que tenim una línia com string s = GetString. 567 00:22:45,712 --> 00:22:48,295 Així que això és simplement la primera interessant línia d'aquest programa. 568 00:22:48,295 --> 00:22:49,920 569 00:22:49,920 --> 00:22:52,974 Però el que tot aquest temps ha estat passant per sota de la caputxa? 570 00:22:52,974 --> 00:22:55,890 Bé, a la esquerra lateral és una cadena, que és algun tipus de variable, 571 00:22:55,890 --> 00:22:56,785 i es diu s. 572 00:22:56,785 --> 00:23:00,019 Així que sé que això és usar la memòria, o RAM, en el meu equip d'alguna manera. 573 00:23:00,019 --> 00:23:02,060 Així que vaig a abstractament dibuixar que com un quadrat. 574 00:23:02,060 --> 00:23:04,820 32 bits, resulta, però més sobre això en el futur. 575 00:23:04,820 --> 00:23:06,410 I llavors, ¿què està passant aquí? 576 00:23:06,410 --> 00:23:08,700 >> Bé, òbviament GetString per crear una cadena de l'usuari. 577 00:23:08,700 --> 00:23:11,360 I GetString aconseguir Zamyla o Gabe o Daven. 578 00:23:11,360 --> 00:23:14,640 Així que anem a triar la primera d'aquests, que era Daven. 579 00:23:14,640 --> 00:23:19,174 Així que efectivament, ho va aconseguir GetString mi en aquest primer cas era D-a-v-s-n. 580 00:23:19,174 --> 00:23:22,690 581 00:23:22,690 --> 00:23:25,045 I llavors, què més va fer que em dóna en secret? 582 00:23:25,045 --> 00:23:25,920 AUDIÈNCIA: [inaudible] 583 00:23:25,920 --> 00:23:28,720 DAVID J. Malan: Sí, el / 0 o null caràcter. 584 00:23:28,720 --> 00:23:30,550 Així que em va donar efectivament una cadena. 585 00:23:30,550 --> 00:23:34,550 Però ja sabem d'anteriors Sembla que una cadena és simplement un arranjament 586 00:23:34,550 --> 00:23:37,895 de caràcters, i s'acaba per aquest caràcter especial sentinella, / 0. 587 00:23:37,895 --> 00:23:39,220 588 00:23:39,220 --> 00:23:42,310 >> Però si això és cert i això és un quadrat, 589 00:23:42,310 --> 00:23:44,160 això és clarament un rectangle molt més gran. 590 00:23:44,160 --> 00:23:46,830 I, de fet, és a dir, Jo reclam, només 32 bits. 591 00:23:46,830 --> 00:23:49,500 I això és clarament més de 32 bits, ja que aquesta és probablement 592 00:23:49,500 --> 00:23:51,583 vuit més vuit més vuit més vuit més vuit, 593 00:23:51,583 --> 00:23:53,320 només perquè de bytes ASCII. 594 00:23:53,320 --> 00:23:57,030 Com diables anem a cabre Daven en aquest petit quadre aquí? 595 00:23:57,030 --> 00:23:59,880 >> Bé, el que està fent en realitat GetString? 596 00:23:59,880 --> 00:24:03,680 Bé, aquesta quadrícula representa aquí de memòria o la memòria RAM de l'ordinador. 597 00:24:03,680 --> 00:24:07,564 Així que anem a dir que si arbitràriament cadascun d'ells representa un byte, 598 00:24:07,564 --> 00:24:09,730 llavors podem pensar en cada byte com tenint una adreça, 599 00:24:09,730 --> 00:24:13,830 com 33 Oxford Street, o 34 Oxford Street, o 35 Oxford Street. 600 00:24:13,830 --> 00:24:16,700 >> Així que igual que les cases tenen direccions i els edificis tenen adreces, 601 00:24:16,700 --> 00:24:19,810 també ho fan bytes individuals de memòria té adreces o números 602 00:24:19,810 --> 00:24:21,042 que la identificació exclusiva d'ells. 603 00:24:21,042 --> 00:24:22,000 Ara, això és arbitrari. 604 00:24:22,000 --> 00:24:25,370 Però que sigui senzill, que vaig a utilitzar hexadecimal només per convenció, 605 00:24:25,370 --> 00:24:28,200 però el 0x no significa una altra cosa que "aquest és hexadecimal." 606 00:24:28,200 --> 00:24:31,030 i jo vaig a afirmar que el "D" acaba en Byte One a la memòria. 607 00:24:31,030 --> 00:24:34,210 >> No tinc res més a fer a memòria, de manera Daven va obtenir el primer lloc 608 00:24:34,210 --> 00:24:35,509 Un Byte. 609 00:24:35,509 --> 00:24:36,800 Això, llavors, serà 0x2. 610 00:24:36,800 --> 00:24:37,831 611 00:24:37,831 --> 00:24:38,705 Això va a 0x3. 612 00:24:38,705 --> 00:24:39,840 613 00:24:39,840 --> 00:24:41,800 Això serà 0x4. 614 00:24:41,800 --> 00:24:43,025 Això va a 0x5. 615 00:24:43,025 --> 00:24:44,025 Això serà 0x6. 616 00:24:44,025 --> 00:24:45,560 617 00:24:45,560 --> 00:24:48,290 >> Però una vegada de començar a pensar sobre el que està fent l'equip 618 00:24:48,290 --> 00:24:50,710 sota de la campana, vostè pot començar a inferir 619 00:24:50,710 --> 00:24:54,960 com, fa uns anys, ho faria han implementat C si. 620 00:24:54,960 --> 00:24:58,360 Què és GetString probablement returning-- perquè 621 00:24:58,360 --> 00:25:00,946 se sent com que no és tornar Daven, per se, 622 00:25:00,946 --> 00:25:03,320 perquè segurament no per encaixar en aquest petit box-- 623 00:25:03,320 --> 00:25:05,090 així que el que es GetString probablement tornant? 624 00:25:05,090 --> 00:25:07,958 625 00:25:07,958 --> 00:25:08,920 >> AUDIÈNCIA: [inaudible] 626 00:25:08,920 --> 00:25:10,540 >> DAVID J. Malan: La ubicació de Daven. 627 00:25:10,540 --> 00:25:12,770 I ha estat fent això des de la setmana 1. 628 00:25:12,770 --> 00:25:16,150 Què és realment GetString tornar no és una cadena, per se. 629 00:25:16,150 --> 00:25:17,780 Aquesta és una de les mentides piadoses. 630 00:25:17,780 --> 00:25:22,520 Es retorna l'adreça de la cadena a la memòria, la direcció única. 631 00:25:22,520 --> 00:25:24,820 Daven viu a 33 Oxford Street. 632 00:25:24,820 --> 00:25:29,310 Però de forma més succinta, Gavin viu en 0x1, Direcció Nombre Un. 633 00:25:29,310 --> 00:25:32,280 >> Així que el que es va posar en aquest petita caixa a continuació, per ser clars, 634 00:25:32,280 --> 00:25:35,930 és només la direcció d'aquesta cadena. 635 00:25:35,930 --> 00:25:38,110 Així que tot aquest temps, aquest que ha estat succeint. 636 00:25:38,110 --> 00:25:41,650 Però el que això apunta ara és que si tot s té 637 00:25:41,650 --> 00:25:44,710 és un número dins d'ella, que és per aturar, el programador, 638 00:25:44,710 --> 00:25:47,970 de posar qualsevol nombre en qualsevol variable i només saltar 639 00:25:47,970 --> 00:25:49,080 a aquest tros de memòria? 640 00:25:49,080 --> 00:25:51,320 I, de fet, ja veurem això és una amenaça propera vegada. 641 00:25:51,320 --> 00:25:53,500 >> Però per ara, això se sent insuficient. 642 00:25:53,500 --> 00:25:55,630 Si dic, aconseguir-me un cadena, dóna'm Daven. 643 00:25:55,630 --> 00:25:57,230 Però en realitat no em dones Daven. 644 00:25:57,230 --> 00:25:59,310 Tot el que em dones és l'adreça de Daven. 645 00:25:59,310 --> 00:26:04,310 Com puc llavors sé amb seguretat on Daven comença i ends-- 646 00:26:04,310 --> 00:26:07,140 la història d'aconseguir weird-- on Daven comença i acaba, 647 00:26:07,140 --> 00:26:10,435 i, a continuació, el següent cadena en la memòria comença? 648 00:26:10,435 --> 00:26:11,520 649 00:26:11,520 --> 00:26:13,620 >> Bé, si vostè està lliurant em al principi de Daven, 650 00:26:13,620 --> 00:26:17,230 en essència, com puc saber on al final del seu nom és? 651 00:26:17,230 --> 00:26:20,550 Aquest caràcter nul especial, que és encara més important ara 652 00:26:20,550 --> 00:26:23,040 Si cordes sota de la campana són simplement identifica 653 00:26:23,040 --> 00:26:25,820 de forma única per la seva ubicació en la memòria. 654 00:26:25,820 --> 00:26:28,130 Així que tot aquest temps, que és el que ha estat passant. 655 00:26:28,130 --> 00:26:32,470 >> Així que quan ens fixem ara en el codi aquí, explicar 656 00:26:32,470 --> 00:26:35,790 si ho faria l'error en la línia 26. 657 00:26:35,790 --> 00:26:39,560 Per què és Zamyla i Zamyla diferent? 658 00:26:39,560 --> 00:26:41,330 Per què és Gabe Gabe i diferent? 659 00:26:41,330 --> 00:26:42,154 Sí, a la part posterior. 660 00:26:42,154 --> 00:26:43,390 >> AUDIÈNCIA: Tenen diferents direccions. 661 00:26:43,390 --> 00:26:45,931 >> DAVID J. Malan: Simplement perquè tenen diferents direccions. 662 00:26:45,931 --> 00:26:48,820 Perquè quan vostè diu GetString de nou, el que faré ràpidament aquí, 663 00:26:48,820 --> 00:26:52,870 si aquesta és la segona línia, cadena t, com ho vaig fer en aquest programa, 664 00:26:52,870 --> 00:26:55,030 és igual a una altra crida a GetString. 665 00:26:55,030 --> 00:26:56,370 666 00:26:56,370 --> 00:26:58,670 La propera vegada que dic GetString, vaig 667 00:26:58,670 --> 00:27:00,190 per obtenir un tros diferent de la memòria. 668 00:27:00,190 --> 00:27:02,220 >> GetString es permet preguntar a l'operatiu 669 00:27:02,220 --> 00:27:03,800 sistema per obtenir més i més memòria. 670 00:27:03,800 --> 00:27:07,894 No tornarà a utilitzar la mateixa 6 bytes cada vegada. 671 00:27:07,894 --> 00:27:09,810 Es va a obtenir un nou tros de memòria, que 672 00:27:09,810 --> 00:27:12,780 significa t aconseguirà algun altre valor aquí. 673 00:27:12,780 --> 00:27:15,380 >> Així que quan ho faig s és igual a = t, que no està comparant 674 00:27:15,380 --> 00:27:17,880 D i A en contra d'aquest contra això i V contra d'això. 675 00:27:17,880 --> 00:27:19,588 Vostè està comparant aquest en contra d'aquesta, que 676 00:27:19,588 --> 00:27:24,020 francament és força useless-- useful-- és bastant inútil, ja que realment 677 00:27:24,020 --> 00:27:25,830 li importa on les cordes són a la memòria? 678 00:27:25,830 --> 00:27:26,850 >> I, de fet, no ho hem fet. 679 00:27:26,850 --> 00:27:28,980 I no anem a iniciar particularment cura. 680 00:27:28,980 --> 00:27:34,180 Només en la mesura que poden sorgir errors i les amenaces de seguretat poden sorgir voluntat 681 00:27:34,180 --> 00:27:36,100 que en realitat vam començar a preocupar per això. 682 00:27:36,100 --> 00:27:37,230 Així que anem a resoldre aquest problema. 683 00:27:37,230 --> 00:27:39,650 Resulta que, a solucionar súper simple. 684 00:27:39,650 --> 00:27:42,600 >> I anem realitat, abans que jo revelen que una vegada més, el que faria 685 00:27:42,600 --> 00:27:47,170 de fer si en una classe CS50, i ha hagut de posar en pràctica 686 00:27:47,170 --> 00:27:48,600 una comparació amb dues cadenes. 687 00:27:48,600 --> 00:27:51,440 Vostè clarament no només pot utilitzar s és igual a = t. 688 00:27:51,440 --> 00:27:54,090 Però així, lògicament, com compararia aquesta cadena 689 00:27:54,090 --> 00:27:56,370 contra aquesta cadena utilitzant codi C? 690 00:27:56,370 --> 00:27:56,880 Sí. 691 00:27:56,880 --> 00:27:58,780 >> AUDIÈNCIA: Només fer el de llaç [inaudible] 692 00:27:58,780 --> 00:28:00,670 693 00:28:00,670 --> 00:28:01,670 DAVID J. Malan: Perfect. 694 00:28:01,670 --> 00:28:02,900 AUDIÈNCIA: [inaudible] 695 00:28:02,900 --> 00:28:03,310 DAVID J. Malan: Si. 696 00:28:03,310 --> 00:28:05,390 Només ha d'utilitzar un bucle for o un while o el que sigui. 697 00:28:05,390 --> 00:28:08,710 Però només s'aplica la idea bàsica que si aquest és un tros de memòria o una matriu 698 00:28:08,710 --> 00:28:11,590 i això és, iterar sobre tots dos a la vegada. 699 00:28:11,590 --> 00:28:12,960 I just comparar les lletres. 700 00:28:12,960 --> 00:28:14,260 >> I has de ser un poca cura, perquè 701 00:28:14,260 --> 00:28:16,247 no volen un dit per anar més enllà de l'altra 702 00:28:16,247 --> 00:28:18,080 perquè una cadena és ja que l'altre. 703 00:28:18,080 --> 00:28:21,380 Així que vas a voler comprovar si hi ha Aquest valor especial al final, null. 704 00:28:21,380 --> 00:28:24,017 Però el que realment és, al final, tan simple com això. 705 00:28:24,017 --> 00:28:26,100 I, francament, no necessitem reinventar la roda. 706 00:28:26,100 --> 00:28:27,960 Aquí hi ha la versió 2. 707 00:28:27,960 --> 00:28:32,910 I el que vaig a dir aquí és que en lloc de comparar s és igual a = t, 708 00:28:32,910 --> 00:28:38,964 Estic en comptes d'anar a dir, si la cadena comparació de coma s és igual a t = 0. 709 00:28:38,964 --> 00:28:40,130 Ara, el que es compara la cadena? 710 00:28:40,130 --> 00:28:43,046 >> Resulta, que és una funció que ve amb C, el propòsit a la vida 711 00:28:43,046 --> 00:28:44,650 és comparar dues cadenes. 712 00:28:44,650 --> 00:28:48,300 I regiri comparar, si llegim la seva pàgina de manual o documentació o CS50 713 00:28:48,300 --> 00:28:50,630 referència, ho farà simplement dir-los que enrenou 714 00:28:50,630 --> 00:28:55,730 comparar els rendiments, ja sigui un cable negatiu nombre o un nombre positiu o zero, 715 00:28:55,730 --> 00:28:57,660 on zero significa que són iguals. 716 00:28:57,660 --> 00:28:58,570 >> Així que només conjectures. 717 00:28:58,570 --> 00:29:00,390 Què podria significar si regiri retorns comparar 718 00:29:00,390 --> 00:29:02,110 valor negatiu o el valor positiu? 719 00:29:02,110 --> 00:29:02,785 720 00:29:02,785 --> 00:29:04,285 AUDIÈNCIA: Major o menor que. 721 00:29:04,285 --> 00:29:05,570 DAVID J. Malan: Sí, més gran que o menys que. 722 00:29:05,570 --> 00:29:08,640 Així que si volem ordenar el seu conjunt manat de cordes en un dictionary-- 723 00:29:08,640 --> 00:29:12,975 com ho farem amb el temps per la road-- funció perfecta per utilitzar potencialment, 724 00:29:12,975 --> 00:29:15,850 perquè farà que comparació de cadenes per a vostè, i dir-li 725 00:29:15,850 --> 00:29:20,060 vostè fa una ve abans de b, o fa b venir abans d'un ordre alfabètic. 726 00:29:20,060 --> 00:29:21,490 Podem fer exactament això. 727 00:29:21,490 --> 00:29:23,620 >> I noti que vaig fer un altre cosa en aquest exemple. 728 00:29:23,620 --> 00:29:26,870 Què més ha canviat més alta en aquesta funció principal? 729 00:29:26,870 --> 00:29:28,500 730 00:29:28,500 --> 00:29:29,350 Char *. 731 00:29:29,350 --> 00:29:31,150 I és que una altra mentida blanca. 732 00:29:31,150 --> 00:29:33,750 Durant tot aquest temps, quan has estat escrivint cadena, 733 00:29:33,750 --> 00:29:38,350 hem estat reescrivint en secret cadena com char * perquè Clang realitat 734 00:29:38,350 --> 00:29:39,270 vostè entén. 735 00:29:39,270 --> 00:29:42,450 >> En altres paraules, en CS50.h i com veurem finalment veiem, 736 00:29:42,450 --> 00:29:45,950 vam fer una cadena de sinònims en crida això és el mateix que char *. 737 00:29:45,950 --> 00:29:49,910 I per ara, només saber que el *, En aquest context, almenys, 738 00:29:49,910 --> 00:29:51,286 significa la direcció. 739 00:29:51,286 --> 00:29:52,210 >> La direcció de què? 740 00:29:52,210 --> 00:29:56,390 Bé, el fet que et vaig dir char *, i no int * o surar *, 741 00:29:56,390 --> 00:30:00,820 significa que char * és la direcció d'un char. 742 00:30:00,820 --> 00:30:06,770 Així que aquest petit quadre aquí, també conegut com cadena, és realment de tipus char *, 743 00:30:06,770 --> 00:30:10,490 que és simplement una manera elegant de dir, En aquest quadre es destinarà una adreça. 744 00:30:10,490 --> 00:30:12,430 I què fa que la direcció es refereix? 745 00:30:12,430 --> 00:30:13,780 Pel que sembla, un char. 746 00:30:13,780 --> 00:30:16,410 >> Però vam poder absolutament tenir int * i altres coses. 747 00:30:16,410 --> 00:30:20,790 Però per ara, char * és realment el més senzill i un interès. 748 00:30:20,790 --> 00:30:23,310 Així que aquest problema es va augmentant, tot i que, de nou. 749 00:30:23,310 --> 00:30:24,830 >> Suposem que jo obro aquest programa. 750 00:30:24,830 --> 00:30:27,670 A veure si ara podem predir el que està malament amb aquest codi. 751 00:30:27,670 --> 00:30:31,140 Així que en aquest programa, copiar-0, estic seguirà endavant i cridar de nou 752 00:30:31,140 --> 00:30:34,190 GetString i emmagatzemar el valor en s. 753 00:30:34,190 --> 00:30:38,800 >> I llavors, per què estic fent això, només com un recordatori de la setmana passada? 754 00:30:38,800 --> 00:30:40,960 Vam dir que GetString de vegades retorna null. 755 00:30:40,960 --> 00:30:42,793 Què significa si GetString retorna null? 756 00:30:42,793 --> 00:30:45,040 757 00:30:45,040 --> 00:30:46,034 Quelcom ha fallat. 758 00:30:46,034 --> 00:30:48,950 Probablement significa la cadena és massa gran, fora de l'ordinador de la memòria. 759 00:30:48,950 --> 00:30:51,724 Succeeix super, super, super poques vegades, però podria succeir. 760 00:30:51,724 --> 00:30:53,890 Volem trobar-lo, i això és tot el que estem fent. 761 00:30:53,890 --> 00:30:57,910 >> Perquè anem a veure ara, si no ho fa començar a comprovar habitualment per les coses 762 00:30:57,910 --> 00:31:00,870 com nul, que et poden en realitat començar a anar 763 00:31:00,870 --> 00:31:03,106 a adreces de memòria que no són vàlids. 764 00:31:03,106 --> 00:31:05,980 I vostè va a començar a induir més i més violacions de segment. 765 00:31:05,980 --> 00:31:08,360 O en un Mac o un PC, simplement fer que un ordinador per penjar 766 00:31:08,360 --> 00:31:10,340 o un programa per congelar, potencialment. 767 00:31:10,340 --> 00:31:14,930 >> Així que ara, jo reclamo en còpia-0.c, que Vaig a copiar aquestes cadenes a manera 768 00:31:14,930 --> 00:31:15,685 de la línia 28. 769 00:31:15,685 --> 00:31:16,850 770 00:31:16,850 --> 00:31:18,750 I llavors, em vaig per reclamar a la part inferior 771 00:31:18,750 --> 00:31:21,430 aquí que vaig per canviar un d'ells. 772 00:31:21,430 --> 00:31:22,330 >> Així notar això. 773 00:31:22,330 --> 00:31:24,370 Vaig a trucar al nostre vell amic strlen. 774 00:31:24,370 --> 00:31:28,960 I només explicar en anglès la qual cosa aquesta línia 34 està fent? 775 00:31:28,960 --> 00:31:32,480 Què suport t 0 representar a l'esquerra. 776 00:31:32,480 --> 00:31:32,980 Sí. 777 00:31:32,980 --> 00:31:34,339 >> AUDIÈNCIA: Primer caràcter de t? 778 00:31:34,339 --> 00:31:35,880 DAVID J. Malan: Primer caràcter de t. 779 00:31:35,880 --> 00:31:36,379 Això és tot. 780 00:31:36,379 --> 00:31:40,024 El primer caràcter de te, vull per assignar la versió majúscula 781 00:31:40,024 --> 00:31:41,190 del primer caràcter en t. 782 00:31:41,190 --> 00:31:43,200 Així que aquesta és la capitalització la primera lletra. 783 00:31:43,200 --> 00:31:46,340 I després, l'últim que faig en aquest programa és que pretenc aquí és 784 00:31:46,340 --> 00:31:50,340 l'original, és, i aquí hi ha la còpia, t. 785 00:31:50,340 --> 00:31:54,610 >> Però sobre la base de la història que acabem de parlat del que realment són les cadenes, 786 00:31:54,610 --> 00:31:57,520 el que és realment la línia 28 fent, i el que és 787 00:31:57,520 --> 00:31:59,405 la sentència que resulta anar per estar a la pantalla? 788 00:31:59,405 --> 00:32:01,300 789 00:32:01,300 --> 00:32:03,500 >> Així que primer, la primera pregunta, 28. 790 00:32:03,500 --> 00:32:09,040 Què és String t = s fent en realitat? 791 00:32:09,040 --> 00:32:16,430 Si tenim a la mà esquerra banda aquí string t = s; 792 00:32:16,430 --> 00:32:19,400 això em dóna una caixa aquí i una caixa aquí. 793 00:32:19,400 --> 00:32:25,530 I suposem que aquesta direcció és 0x, diguem, 50 aquest cop, de manera arbitrària. 794 00:32:25,530 --> 00:32:28,847 Què cadena de t = s fer sota de la caputxa? 795 00:32:28,847 --> 00:32:30,340 >> AUDIÈNCIA: [inaudible] 796 00:32:30,340 --> 00:32:34,100 >> DAVID J. Malan: Emmagatzema la memòria aborden allà, així 0x50 va allà. 797 00:32:34,100 --> 00:32:37,980 Així que si ara, vaig a la primera personatge en t i majúscules que, 798 00:32:37,980 --> 00:32:39,535 ¿Què estic fent amb eficàcia per s? 799 00:32:39,535 --> 00:32:41,300 800 00:32:41,300 --> 00:32:43,450 Realment estic fent el mateix, oi? 801 00:32:43,450 --> 00:32:47,680 Perquè si Direcció 0x50-- i just, em no tenen molt espai al tauler aquí, 802 00:32:47,680 --> 00:32:51,750 però assumir que això és 0x50 aquí baix, en algun lloc de la memòria del meu ordinador. 803 00:32:51,750 --> 00:32:55,825 >> I he, per exemple, Gabe en minúscula aquí, així. 804 00:32:55,825 --> 00:32:57,120 805 00:32:57,120 --> 00:33:01,980 I he dit suport t 0 aconsegueix capitalitzats. 806 00:33:01,980 --> 00:33:04,860 Bé, t 0 és el suport la primera lletra t. 807 00:33:04,860 --> 00:33:07,840 Tan poc g va a convertit en un gran G. Però el problema 808 00:33:07,840 --> 00:33:09,410 es, el que no s també assenyalar? 809 00:33:09,410 --> 00:33:10,300 >> AUDIÈNCIA: La mateixa. 810 00:33:10,300 --> 00:33:11,841 >> DAVID J. Malan: Exactament el mateix. 811 00:33:11,841 --> 00:33:16,342 Així que una simple explicació potser, encara que la sintaxi és una mica estrany. 812 00:33:16,342 --> 00:33:17,050 Així que farem això. 813 00:33:17,050 --> 00:33:20,210 Fer còpia-0 i després ./copy-0. 814 00:33:20,210 --> 00:33:21,820 815 00:33:21,820 --> 00:33:24,110 Dir alguna cosa: Gabe. 816 00:33:24,110 --> 00:33:26,760 I, per desgràcia, tant ells ara s'han capitalitzat, 817 00:33:26,760 --> 00:33:29,500 però per a aquest subjacent raó per la qual estem simplement 818 00:33:29,500 --> 00:33:32,350 ara es tracta d'adreces. 819 00:33:32,350 --> 00:33:36,470 >> Llavors, com començar a address-- sense doble intended-- 820 00:33:36,470 --> 00:33:39,270 Com vam començar a abordar aquest problema en particular? 821 00:33:39,270 --> 00:33:44,400 Bé, en copy1.c, les coses van a ser una mica més complicat. 822 00:33:44,400 --> 00:33:49,310 Però m'agradaria reclamar un solució conceptualment simple. 823 00:33:49,310 --> 00:33:50,852 >> Tan difícil d'aconseguir a primera vista. 824 00:33:50,852 --> 00:33:53,560 No serà fàcil per al primer vegada que escrigui a terme, potser, 825 00:33:53,560 --> 00:33:57,440 però si el problema és que simplement fent t = s només 826 00:33:57,440 --> 00:33:59,694 copia la direcció, el que, de nou si puc triar en vostè, 827 00:33:59,694 --> 00:34:02,110 serà la solució per copiar realment una cadena? 828 00:34:02,110 --> 00:34:04,906 829 00:34:04,906 --> 00:34:06,770 >> AUDIÈNCIA: Nosaltres probablement utilitzar un bucle de nou. 830 00:34:06,770 --> 00:34:06,890 >> DAVID J. Malan: Si. 831 00:34:06,890 --> 00:34:08,390 Així que necessitarem un bucle de nou. 832 00:34:08,390 --> 00:34:11,800 I perquè si volem copiar una cadena s en una altra cadena, 833 00:34:11,800 --> 00:34:14,120 probablement volem fer-ho caràcter per caràcter. 834 00:34:14,120 --> 00:34:17,199 Però el problema és, si aquest és un principi s, 835 00:34:17,199 --> 00:34:22,159 ara hem de començar de forma explícita l'assignació de memòria per at. 836 00:34:22,159 --> 00:34:24,320 >> En altres paraules, anem redibuixar aquesta última vegada. 837 00:34:24,320 --> 00:34:28,659 Si aquesta és string s = GetString. 838 00:34:28,659 --> 00:34:30,956 839 00:34:30,956 --> 00:34:32,455 I anem a posar això aquí, també. 840 00:34:32,455 --> 00:34:36,639 841 00:34:36,639 --> 00:34:37,420 Això és GetString. 842 00:34:37,420 --> 00:34:39,070 843 00:34:39,070 --> 00:34:43,860 I llavors, la imatge d'alguna cosa així que serà com abans, 844 00:34:43,860 --> 00:34:44,360 g-a-b-i / 0. 845 00:34:44,360 --> 00:34:47,294 846 00:34:47,294 --> 00:34:48,960 Això es veu una mica d'alguna cosa com això. 847 00:34:48,960 --> 00:34:53,650 I s, per tant, ens criden a aquest 0x50, i que serà 51, 52. 848 00:34:53,650 --> 00:34:54,409 >> Així que això és 0x50. 849 00:34:54,409 --> 00:34:55,679 850 00:34:55,679 --> 00:34:59,690 I després, ho faig cadena t. 851 00:34:59,690 --> 00:35:02,450 En la memòria, que només va a dóna'm una petita plaça com aquesta. 852 00:35:02,450 --> 00:35:04,080 Així que quin és el pas clau ara? 853 00:35:04,080 --> 00:35:09,870 Si vull copiar s en t, el que blank què necessitem per omplir aquí? 854 00:35:09,870 --> 00:35:12,050 O el que és el que necessitem fer a un alt nivell? 855 00:35:12,050 --> 00:35:14,101 856 00:35:14,101 --> 00:35:14,600 Sí? 857 00:35:14,600 --> 00:35:16,200 858 00:35:16,200 --> 00:35:17,020 Algú? 859 00:35:17,020 --> 00:35:17,690 Sí. 860 00:35:17,690 --> 00:35:19,214 >> AUDIÈNCIA: Hem de [inaudible]. 861 00:35:19,214 --> 00:35:21,380 DAVID J. Malan: Sí, hauran d'ingressar en aquest espai en blanc. 862 00:35:21,380 --> 00:35:24,340 No puc copiar i després capitalitzar el nom de Gabe 863 00:35:24,340 --> 00:35:28,120 fins que li demano al sistema operatiu per un altre tros de memòria 864 00:35:28,120 --> 00:35:30,640 això és almenys tan gran com l'original. 865 00:35:30,640 --> 00:35:32,130 Així que ens deixa amb una pregunta. 866 00:35:32,130 --> 00:35:36,080 >> Com sol · licito el sistema operatiu no només per un pointer-- senzilla 867 00:35:36,080 --> 00:35:38,530 com això es diu, un adreça, un no pointer-- 868 00:35:38,530 --> 00:35:40,980 per una mica simple caixa com això es diu una cadena? 869 00:35:40,980 --> 00:35:44,200 Com sol · licito l'operatiu sistema per a una gran part de la memòria? 870 00:35:44,200 --> 00:35:48,430 Fins ara, només he aconseguit que tornar indirectament trucant GetString. 871 00:35:48,430 --> 00:35:50,740 Llavors, com es GetString fins i tot aconseguir la seva memòria? 872 00:35:50,740 --> 00:35:53,430 >> Bé, resulta que hi ha aquesta altra funció aquí 873 00:35:53,430 --> 00:35:55,160 que ara començarem a utilitzar. 874 00:35:55,160 --> 00:35:59,780 Ara, això sembla què-- manera més críptica i jo sóc l'únic que pot veure it-- 875 00:35:59,780 --> 00:36:03,150 aquesta línia es veu molt més críptic llavors deuria a primera vista. 876 00:36:03,150 --> 00:36:04,650 Però anem a burlis part. 877 00:36:04,650 --> 00:36:07,950 >> Al costat esquerre, tinc char * t. 878 00:36:07,950 --> 00:36:13,280 Així que en anglès, anem a començar a formular oracions correctes en l'argot tècnic. 879 00:36:13,280 --> 00:36:19,757 Així que aquesta és l'assignació d'un variable de tipus char * diu t. 880 00:36:19,757 --> 00:36:21,090 Ara, què significa això realment? 881 00:36:21,090 --> 00:36:23,881 >> Bé, això significa, què vaig per posar en aquesta variable anomenada t? 882 00:36:23,881 --> 00:36:24,780 883 00:36:24,780 --> 00:36:26,402 Una adreça d'un char. 884 00:36:26,402 --> 00:36:28,360 Així que això és només el més simple, de manera més raonable 885 00:36:28,360 --> 00:36:29,930 de descriure la banda esquerra. 886 00:36:29,930 --> 00:36:32,890 Així que crea aquesta caixa aquí només. 887 00:36:32,890 --> 00:36:34,760 Així que el costat dret, presumiblement, va 888 00:36:34,760 --> 00:36:37,170 assignar que més gran tros de memòria, com? 889 00:36:37,170 --> 00:36:38,340 Així que anem a burlen d'aquesta separació. 890 00:36:38,340 --> 00:36:41,131 >> És aclaparador a primera vista, però el que està passant aquí dins? 891 00:36:41,131 --> 00:36:43,740 En primer lloc, cal malloc, que aparentment és el nostre nou amic, 892 00:36:43,740 --> 00:36:45,450 "Memòria assignar." 893 00:36:45,450 --> 00:36:49,560 Així que aquest és l'argument que es passa en ella, per la qual cosa és un argument bastant gran. 894 00:36:49,560 --> 00:36:50,970 Així que anem a burlen d'aquesta separació. 895 00:36:50,970 --> 00:36:53,410 >> strlen de s, per descomptat, representa ell-- 896 00:36:53,410 --> 00:36:54,142 897 00:36:54,142 --> 00:36:55,600 AUDIÈNCIA: El nombre de caràcters. 898 00:36:55,600 --> 00:36:56,710 DAVID J. Malan: Només el nombre de caràcters en s. 899 00:36:56,710 --> 00:36:59,040 Així la longitud de s, l'original. 900 00:36:59,040 --> 00:37:00,350 Així G-a-b-e. 901 00:37:00,350 --> 00:37:02,320 Així que és probable que quatre a aquest cas. 902 00:37:02,320 --> 00:37:05,485 Per què faig després d'1 trucant strlen de s? 903 00:37:05,485 --> 00:37:06,360 AUDIÈNCIA: [inaudible] 904 00:37:06,360 --> 00:37:07,590 DAVID J. Malan: Perquè caràcter especial nul. 905 00:37:07,590 --> 00:37:11,260 Si em pregunten quina és la longitud d' El nom de Gabe, jo vaig a dir quatre. 906 00:37:11,260 --> 00:37:14,480 Sota el capó, però, he de que el cinquè byte per al caràcter nul. 907 00:37:14,480 --> 00:37:16,100 Així que per això estic fent l'1. 908 00:37:16,100 --> 00:37:21,730 >> Ara en cas que està executant aquest programa en un equip que no sigui, per exemple, 909 00:37:21,730 --> 00:37:24,610 l'aparell CS50, on la mida d'un char 910 00:37:24,610 --> 00:37:26,350 podria ser diferent de la meva pròpia computer-- 911 00:37:26,350 --> 00:37:30,590 resulta que jo puc trucar a aquest sizeof operador, simplement fer que l'equip, 912 00:37:30,590 --> 00:37:32,870 el que és de la mida d'un xerrades en aquest equip? 913 00:37:32,870 --> 00:37:37,400 >> I multiplicant cinc en aquest exemple per la grandària d'un char, que 914 00:37:37,400 --> 00:37:40,440 en la majoria de les computadores només un, malloc 915 00:37:40,440 --> 00:37:44,830 es va a assignar a mi aquesta gran tros de memòria més d'aquí a la dreta. 916 00:37:44,830 --> 00:37:47,140 I va a return-- es tracta d'un function-- pel que és 917 00:37:47,140 --> 00:37:48,265 tornarà a mi què? 918 00:37:48,265 --> 00:37:50,914 919 00:37:50,914 --> 00:37:51,830 AUDIÈNCIA: La direcció? 920 00:37:51,830 --> 00:37:53,709 DAVID J. Malan: La direcció de què? 921 00:37:53,709 --> 00:37:55,250 AUDIÈNCIA: De la memòria s'assigna? 922 00:37:55,250 --> 00:37:56,450 DAVID J. Malan: De la la memòria s'assigna. 923 00:37:56,450 --> 00:37:59,189 Així que no tinc ni idea, francament, on va a acabar. 924 00:37:59,189 --> 00:38:01,480 Vaig a proposar que que acabarà a 0x88. 925 00:38:01,480 --> 00:38:02,770 926 00:38:02,770 --> 00:38:06,009 Completament arbitrària, però en algun lloc que no sigui 0x50, 927 00:38:06,009 --> 00:38:08,800 perquè el sistema operatiu, el Windows i Mac OS fan per mi, és 928 00:38:08,800 --> 00:38:11,230 assegurar-se que s'està donant Em diferents trossos de RAM. 929 00:38:11,230 --> 00:38:14,210 >> Així que aquest és el valor que aquesta tros de memòria podria acabar. 930 00:38:14,210 --> 00:38:16,060 Així que això és el que acaba aquí, 0x88. 931 00:38:16,060 --> 00:38:17,480 932 00:38:17,480 --> 00:38:21,570 Així que ara clarament, puc entendre que això no és el mateix que això, 933 00:38:21,570 --> 00:38:23,960 perquè estan assenyalant a diferents fragments de memòria. 934 00:38:23,960 --> 00:38:29,980 Així que si ara realment vull copiar aquest en, anem a fer la seva proposta de solució. 935 00:38:29,980 --> 00:38:36,870 >> Anirem, crear un bucle, i fer t suport i Obté s suport de i. 936 00:38:36,870 --> 00:38:39,760 Perquè ara puc utilitzar aquest tipus array notació, 937 00:38:39,760 --> 00:38:43,390 perquè tot i malloc molt genèricament em assigna memòria, 938 00:38:43,390 --> 00:38:45,290 bytes de memòria és només contigus. 939 00:38:45,290 --> 00:38:47,240 Byte, byte, byte, esquena amb esquena amb esquena. 940 00:38:47,240 --> 00:38:50,030 >> Puc certament com un programador tractar-lo com una matriu, que 941 00:38:50,030 --> 00:38:55,090 vol dir que puc usar això finalment familiaritzat notació de només alguns claudàtors. 942 00:38:55,090 --> 00:38:56,462 943 00:38:56,462 --> 00:39:00,020 >> Així que permetin-me aturar-me allà, perquè aquesta és una gran quantitat d'una sola vegada, fins i tot 944 00:39:00,020 --> 00:39:03,530 encara que la idea bàsica per recapitular és aquesta cadena, tot aquest temps, 945 00:39:03,530 --> 00:39:05,550 no és un nou tipus de dades en si. 946 00:39:05,550 --> 00:39:10,150 És només una trucada punter, la direcció d'un personatge, 947 00:39:10,150 --> 00:39:12,650 que només vol dir que és un nombre que per convenció humana 948 00:39:12,650 --> 00:39:15,350 tendim a escriure com 0x alguna cosa. 949 00:39:15,350 --> 00:39:18,590 >> Però és només un nombre, com 33 Oxford Street, 950 00:39:18,590 --> 00:39:20,530 que passa a ser el La direcció del CS edifici. 951 00:39:20,530 --> 00:39:22,000 952 00:39:22,000 --> 00:39:23,545 Qualsevol pregunta sobre aquests detalls? 953 00:39:23,545 --> 00:39:24,790 954 00:39:24,790 --> 00:39:25,289 Sí? 955 00:39:25,289 --> 00:39:28,530 >> AUDIÈNCIA: Per què, comprovem per t igual a null? 956 00:39:28,530 --> 00:39:30,740 >> DAVID J. Malan: Per què nosaltres comprovar si t igual a null? 957 00:39:30,740 --> 00:39:33,250 Si llegim la documentation-- gran pregunta-- per malloc, 958 00:39:33,250 --> 00:39:37,020 que dirà en la lletra petita, de vegades malloc podria tornar null, 959 00:39:37,020 --> 00:39:38,080 igual que GetString. 960 00:39:38,080 --> 00:39:41,820 I, en efecte, GetString retorna null Si, al seu torn, malloc retorna un valor nul, 961 00:39:41,820 --> 00:39:43,130 perquè GetString utilitza malloc. 962 00:39:43,130 --> 00:39:46,400 >> I això podria succeir si el sistema operatiu, Mac OS, Windows, el que sigui, és simplement 963 00:39:46,400 --> 00:39:48,130 sense memòria per a vostè. 964 00:39:48,130 --> 00:39:49,820 Així que això és el que va passar allà. 965 00:39:49,820 --> 00:39:52,910 >> I permetin-me revelar altra cosa això podria volar la teva ment 966 00:39:52,910 --> 00:39:55,100 o completament estar massa lluny de la ratlla. 967 00:39:55,100 --> 00:39:59,770 Però m'ho dius a mi tiri cap amunt la mateix bucle per copiar, 968 00:39:59,770 --> 00:40:05,480 que fa un moment, el record era això. t suport i aconsegueix s suport de i. 969 00:40:05,480 --> 00:40:06,740 >> Agradable i fàcil d'utilitzar. 970 00:40:06,740 --> 00:40:09,330 Se sent com la segona setmana de nou. 971 00:40:09,330 --> 00:40:14,920 Però aquesta versió pot ser en realitat reescrit com aquest, que sembla críptica. 972 00:40:14,920 --> 00:40:18,280 És un punter tècnica anomenada aritmètica, aritmètica d'adreces. 973 00:40:18,280 --> 00:40:19,600 Però per què funciona això? 974 00:40:19,600 --> 00:40:22,220 >> Ara era una nosa, la autors de C decidir utilitzar 975 00:40:22,220 --> 00:40:25,070 el símbol * per a diferents propòsits. 976 00:40:25,070 --> 00:40:29,020 Hem vist que s'usa un cop ja, char *, que significa "dóna'm una variable 977 00:40:29,020 --> 00:40:31,210 això va a contenir la direcció d'un char ". 978 00:40:31,210 --> 00:40:33,990 * Així carbó en aquest context significa "dóna'm una variable." 979 00:40:33,990 --> 00:40:40,050 >> Per desgràcia, si s'utilitza el * sense una paraula davant d'ell, com char, 980 00:40:40,050 --> 00:40:41,905 és ara cridat el operador per desfer referències. 981 00:40:41,905 --> 00:40:43,530 I veurem més d'això en poc temps. 982 00:40:43,530 --> 00:40:44,930 Però només significa "anar-hi." 983 00:40:44,930 --> 00:40:49,070 És com dir, si algú em va lliurar en un tros de paper "33 Oxford Street," 984 00:40:49,070 --> 00:40:53,830 si ho faig "* 33 Oxford Street," que significa "Anar pel camí de la construcció de CS." 985 00:40:53,830 --> 00:40:57,220 >> Així que * simplement vol dir anar-hi si no hi ha una paraula al davant d'ella. 986 00:40:57,220 --> 00:40:59,100 Llavors, què és t, per ser clars? 987 00:40:59,100 --> 00:41:03,250 t és la direcció de la part de memòria que se li va donar de nou a mi. 988 00:41:03,250 --> 00:41:06,650 s és la direcció del que, per ser clars, en l'exemple que hem estat discutint, 989 00:41:06,650 --> 00:41:07,500 de gabe minúscules? 990 00:41:07,500 --> 00:41:08,990 991 00:41:08,990 --> 00:41:10,005 s és la direcció de-- 992 00:41:10,005 --> 00:41:11,585 993 00:41:11,585 --> 00:41:12,460 AUDIÈNCIA: La cadena. 994 00:41:12,460 --> 00:41:14,126 DAVID J. Malan: De nom original de Gabe. 995 00:41:14,126 --> 00:41:16,660 Així que és l'adreça d' aquest tros de memòria. 996 00:41:16,660 --> 00:41:22,220 Així que si dic t + I I--, avís, és només el nostre vell amic. 997 00:41:22,220 --> 00:41:24,770 És només una variable índex això és la iteració de zero en un màxim 998 00:41:24,770 --> 00:41:26,960 a la longitud de la cadena s. 999 00:41:26,960 --> 00:41:30,367 Així que serà zero, un, després dos, després tres, després quatre. 1000 00:41:30,367 --> 00:41:33,200 Així que anem a muntar aquests nous Peces del trencaclosques-zero com, si es vol, 1001 00:41:33,200 --> 00:41:36,140 tot i que, de nou, la sintaxi és molt més arcà de les ratllades. 1002 00:41:36,140 --> 00:41:39,522 Així que t és una adreça + i em donarà 1003 00:41:39,522 --> 00:41:42,480 un nombre, ja que aquests són tots números que hem vingut assenyalant com hexadecimal. 1004 00:41:42,480 --> 00:41:43,560 Però són només nombres. 1005 00:41:43,560 --> 00:41:49,960 >> Així que si la direcció de t ens va dir era 0x88, el que és 0x88 més zero. 1006 00:41:49,960 --> 00:41:51,564 1007 00:41:51,564 --> 00:41:53,980 Encara que no se sent còmode amb hex encara, prendre una conjectura. 1008 00:41:53,980 --> 00:41:54,410 >> AUDIÈNCIA: L'original. 1009 00:41:54,410 --> 00:41:55,850 >> DAVID J. Malan: Encara 0x88. 1010 00:41:55,850 --> 00:41:58,910 Llavors, ¿què vol dir * 0x88? 1011 00:41:58,910 --> 00:42:02,670 Significa, "anar-hi", que significa efectivament, "posar el dit aquí." 1012 00:42:02,670 --> 00:42:06,930 I ara al costat dret de aquesta expressió, * i després a parens, 1013 00:42:06,930 --> 00:42:11,586 s + s i significa, que és el tractar aquí de la petita g. 1014 00:42:11,586 --> 00:42:16,220 s + 0 és, per descomptat, s, s ho és. 1015 00:42:16,220 --> 00:42:21,230 >> Així que ara, és s *, que igual que * 33 Oxford Street significa anar a l'adreça 1016 00:42:21,230 --> 00:42:22,010 s. 1017 00:42:22,010 --> 00:42:24,170 Així que aquí està aquest dit, la mà dreta. 1018 00:42:24,170 --> 00:42:26,050 Llavors, què vaig a copiar en què? 1019 00:42:26,050 --> 00:42:30,260 La cosa a la dreta, que és gabe, poc g aquí, a aquí. 1020 00:42:30,260 --> 00:42:32,750 >> I pel que l'efecte d'aquesta primera iteració del bucle, 1021 00:42:32,750 --> 00:42:36,200 com vostè va proposar, tot i que sembla boig més complicat que qualsevol cosa 1022 00:42:36,200 --> 00:42:42,110 que hem vist abans, és simplement dir anar aquí i copiar aquest personatge aquí. 1023 00:42:42,110 --> 00:42:44,700 T'està donant un mapa per ambdues localitats. 1024 00:42:44,700 --> 00:42:46,130 >> I anem a veure molt més d'això. 1025 00:42:46,130 --> 00:42:50,600 Però per ara, l'esperança és només per introduir algunes d'aquestes idees bàsiques. 1026 00:42:50,600 --> 00:42:53,550 I, de fet, anem a veure un programa final aquí, 1027 00:42:53,550 --> 00:42:57,480 i després el claymation promès, el que farà que tot bé. 1028 00:42:57,480 --> 00:42:57,980 Bé. 1029 00:42:57,980 --> 00:43:01,680 Així que permetin-me obro up-- aquí anem. 1030 00:43:01,680 --> 00:43:02,850 1031 00:43:02,850 --> 00:43:05,440 Així que anem Me-- tornarem a aquest quadre en poc temps. 1032 00:43:05,440 --> 00:43:08,360 Permetin-me obrir aquest últim exemple aquí. 1033 00:43:08,360 --> 00:43:09,440 1034 00:43:09,440 --> 00:43:12,710 >> Així que aquí és un super, super programa que porta a terme 1035 00:43:12,710 --> 00:43:15,050 res a la vida que fa el següent. 1036 00:43:15,050 --> 00:43:18,740 En primer lloc, declara dues variables, x i i, que no són nombres d'aquest temps, 1037 00:43:18,740 --> 00:43:19,240 per se. 1038 00:43:19,240 --> 00:43:20,448 No són nombres enters, per se. 1039 00:43:20,448 --> 00:43:22,899 Ells són aparentment int *. 1040 00:43:22,899 --> 00:43:25,690 Així que ningú, què significa si el seu tipus de dades, la variable, 1041 00:43:25,690 --> 00:43:26,860 és de tipus int * estrelles? 1042 00:43:26,860 --> 00:43:30,240 Aquesta és la direcció d'un int. 1043 00:43:30,240 --> 00:43:31,990 >> Així que no tinc ni idea d'on està encara. 1044 00:43:31,990 --> 00:43:35,150 Només significa "posar, eventualment, la direcció d'un int aquí ". 1045 00:43:35,150 --> 00:43:38,340 0x50, 0x88, allà on estigui en memòria, una adreça es va allà. 1046 00:43:38,340 --> 00:43:40,200 I això és el que i és serà, també. 1047 00:43:40,200 --> 00:43:44,920 >> Si ara dic x = malloc (sizeof (int)), aquesta és una manera elegant de dir, 1048 00:43:44,920 --> 00:43:49,000 escolta sistema operatiu, mitjançant malloc, dóna'm prou memòria per a la grandària 1049 00:43:49,000 --> 00:43:52,370 d'un int, que és probablement serà de 32 bits o quatre bytes. 1050 00:43:52,370 --> 00:43:53,680 >> Llavors, ¿què tornar malloc? 1051 00:43:53,680 --> 00:43:55,250 Malloc retorna una adreça. 1052 00:43:55,250 --> 00:43:57,020 Llavors, què quedarà emmagatzemat en x? 1053 00:43:57,020 --> 00:44:00,600 La direcció de la part de memòria, els quatre bytes, que malloc 1054 00:44:00,600 --> 00:44:03,360 acaba de trobar per a mi preguntant el sistema operatiu. 1055 00:44:03,360 --> 00:44:08,240 >> Ara Mentrestant, la línia 04:00 aquí, el * x = 42. 1056 00:44:08,240 --> 00:44:09,990 Perquè quedi clar, el que està passant allà baix? 1057 00:44:09,990 --> 00:44:11,530 A la part esquerra, * x. 1058 00:44:11,530 --> 00:44:13,610 això és com * 33 Oxford Street. 1059 00:44:13,610 --> 00:44:15,523 Així * x vol dir què? 1060 00:44:15,523 --> 00:44:16,450 >> AUDIÈNCIA: Anar a. 1061 00:44:16,450 --> 00:44:17,908 >> DAVID J. Malan: Anar a aquesta direcció. 1062 00:44:17,908 --> 00:44:20,466 On sigui que parteix de la memòria és, anar-hi. 1063 00:44:20,466 --> 00:44:21,979 I posar el que hi ha, òbviament? 1064 00:44:21,979 --> 00:44:22,520 AUDIÈNCIA: 42. 1065 00:44:22,520 --> 00:44:23,580 DAVID J. Malan: 42. 1066 00:44:23,580 --> 00:44:25,650 Molt bé, * i, mateixa idea. 1067 00:44:25,650 --> 00:44:26,860 Aneu a la direcció en i. 1068 00:44:26,860 --> 00:44:31,740 Poseu el número 13 allà, però el que és i en aquest moment? 1069 00:44:31,740 --> 00:44:33,172 1070 00:44:33,172 --> 00:44:34,630 AUDIÈNCIA: No hi ha memòria per i. 1071 00:44:34,630 --> 00:44:35,710 DAVID J. Malan: Hi ha hi ha memòria per i. 1072 00:44:35,710 --> 00:44:38,215 Així que el que fa i, probablement, contenir, com hem vingut dient? 1073 00:44:38,215 --> 00:44:38,520 >> AUDIÈNCIA: Garbage. 1074 00:44:38,520 --> 00:44:39,480 >> DAVID J. Malan: Alguns valor escombraries. 1075 00:44:39,480 --> 00:44:41,320 Ara, el valor de les escombraries és encara un nombre. 1076 00:44:41,320 --> 00:44:43,160 Encara es pot confondre amb una adreça. 1077 00:44:43,160 --> 00:44:45,160 És com si algú gargotejar alguna cosa cap avall, 1078 00:44:45,160 --> 00:44:48,002 i em va malinterpretar el sentit de algun edifici pel carrer. 1079 00:44:48,002 --> 00:44:50,460 I si el que intenta entrar en algun edifici que no és amo, 1080 00:44:50,460 --> 00:44:53,710 o algun tros de memòria que no té estat donat, les coses dolentes poden succeir. 1081 00:44:53,710 --> 00:44:57,740 Ordinador podria bloquejar, o algun altre comportament indeterminat podria succeir. 1082 00:44:57,740 --> 00:45:01,310 >> Així que la introducció, a continuació, a Binky és això. 1083 00:45:01,310 --> 00:45:04,290 Encara recordo, 20 i tants anys més tard, 1084 00:45:04,290 --> 00:45:07,200 on era quan finalment entès punters. 1085 00:45:07,200 --> 00:45:09,520 >> És a dir, si vostè sortir d'aquí en tres minuts 1086 00:45:09,520 --> 00:45:12,170 i crec que no ho faig entendre punters, s'adonen 1087 00:45:12,170 --> 00:45:14,410 M'he recordat de 20 anys, per alguna raó boja 1088 00:45:14,410 --> 00:45:17,140 quan i per què finalment es va enfonsar en, assegut amb el meu ensenyament 1089 00:45:17,140 --> 00:45:19,501 company, Nishat Mehta al part posterior d'Eliot Dining Hall. 1090 00:45:19,501 --> 00:45:21,250 Ara, m'he acordat això perquè això era 1091 00:45:21,250 --> 00:45:23,920 un dels temes que, en particular, lluitat amb. 1092 00:45:23,920 --> 00:45:26,470 I llavors, per fi es fa clic, com m'atreveixo a dir un munt de temes 1093 00:45:26,470 --> 00:45:27,460 finalment ho farà. 1094 00:45:27,460 --> 00:45:32,590 I ara, per fer que se senti tot el més feliç i més convincent, 1095 00:45:32,590 --> 00:45:35,360 anem a fer un últim cop d'ull a la nostra últims tres minuts aquí a Binky, 1096 00:45:35,360 --> 00:45:37,675 del nostre amic, Nick Parlant de Stanford. 1097 00:45:37,675 --> 00:45:38,910 1098 00:45:38,910 --> 00:45:41,580 >> [REPRODUCCIÓ DE VÍDEO] 1099 00:45:41,580 --> 00:45:42,750 >> Escolta, Binky. 1100 00:45:42,750 --> 00:45:43,500 Despertar! 1101 00:45:43,500 --> 00:45:45,960 És temps per a la diversió punter. 1102 00:45:45,960 --> 00:45:47,012 >> Què és això? 1103 00:45:47,012 --> 00:45:48,723 Aprendre sobre els punters? 1104 00:45:48,723 --> 00:45:50,580 Que bé! 1105 00:45:50,580 --> 00:45:53,563 >> Bé, per començar, crec que estem Necessitarà un parell de punters. 1106 00:45:53,563 --> 00:45:54,390 >> -ok. 1107 00:45:54,390 --> 00:45:57,930 Aquest codi assigna dos punters, que pot apuntar a nombres enters. 1108 00:45:57,930 --> 00:45:58,430 -ok. 1109 00:45:58,430 --> 00:46:02,140 Bé, veig els dos punters, però no semblen estar apuntant a res. 1110 00:46:02,140 --> 00:46:02,980 >> Això és correcte. 1111 00:46:02,980 --> 00:46:05,100 Inicialment, punters no apunten a res. 1112 00:46:05,100 --> 00:46:08,030 Les coses que apunten als anomenats pointees, i que van ser creats d' 1113 00:46:08,030 --> 00:46:09,370 una etapa separada. 1114 00:46:09,370 --> 00:46:10,220 >> Oh, cert, cert. 1115 00:46:10,220 --> 00:46:10,950 Ho sabia. 1116 00:46:10,950 --> 00:46:12,385 Els pointees estan separats. 1117 00:46:12,385 --> 00:46:14,315 Er, així que com assignar un pointee? 1118 00:46:14,315 --> 00:46:15,340 1119 00:46:15,340 --> 00:46:15,960 >> -ok. 1120 00:46:15,960 --> 00:46:18,970 Bé, el codi assigna un nou pointee nombre enter, 1121 00:46:18,970 --> 00:46:20,950 i aquesta part es presenten xa apunten a la mateixa. 1122 00:46:20,950 --> 00:46:22,050 1123 00:46:22,050 --> 00:46:23,230 >> Escolta, que es veu millor. 1124 00:46:23,230 --> 00:46:25,060 Així que faci alguna cosa. 1125 00:46:25,060 --> 00:46:25,990 >> -ok. 1126 00:46:25,990 --> 00:46:30,455 Vaig a eliminar la referència al punter x per emmagatzemar el nombre 42 en el seu pointee. 1127 00:46:30,455 --> 00:46:32,830 Per a aquest truc, vaig a necessitar la meva Vareta màgica · lació de referència. 1128 00:46:32,830 --> 00:46:34,130 1129 00:46:34,130 --> 00:46:36,080 >> El teu Vareta màgica de Desreferenciar? 1130 00:46:36,080 --> 00:46:37,357 1131 00:46:37,357 --> 00:46:38,190 Això-- això és genial. 1132 00:46:38,190 --> 00:46:39,340 1133 00:46:39,340 --> 00:46:41,080 >> : Aquest és el que el codi es sembla. 1134 00:46:41,080 --> 00:46:44,110 Vaig a configurar el nombre, i [POP] 1135 00:46:44,110 --> 00:46:44,700 >> Escolta, mira. 1136 00:46:44,700 --> 00:46:46,140 Aquí va. 1137 00:46:46,140 --> 00:46:50,980 >> -Així Fent un desreferenciar en x segueix la fletxa per accedir al seu pointee. 1138 00:46:50,980 --> 00:46:53,160 En aquest cas, una botiga 42 en allà. 1139 00:46:53,160 --> 00:46:57,710 Hey tractar d'usar-lo per emmagatzemar el nombre 13 a través de l'altre punter, i. 1140 00:46:57,710 --> 00:46:58,760 >> -ok. 1141 00:46:58,760 --> 00:47:03,270 Vaig a anar per aquí ai, i obtenir el número 13 de posada en marxa. 1142 00:47:03,270 --> 00:47:07,930 I després, prendre la vareta de Eliminació de referències i just [BUZZ] 1143 00:47:07,930 --> 00:47:08,960 >> Oh! 1144 00:47:08,960 --> 00:47:09,500 >> Oh, bé! 1145 00:47:09,500 --> 00:47:11,090 Això no va funcionar. 1146 00:47:11,090 --> 00:47:15,630 Digui, Binky, no crec dereferencing i és una bona idea, perquè vostè sap, 1147 00:47:15,630 --> 00:47:17,850 la creació de la pointee és un pas separat. 1148 00:47:17,850 --> 00:47:20,450 I jo no crec que mai ho vam fer. 1149 00:47:20,450 --> 00:47:21,480 >> Punt Bé. 1150 00:47:21,480 --> 00:47:21,980 Si. 1151 00:47:21,980 --> 00:47:25,680 Assignem el punter i, però que Mai configurar perquè apunti a un pointee. 1152 00:47:25,680 --> 00:47:27,190 1153 00:47:27,190 --> 00:47:28,616 >> Molt Observador. 1154 00:47:28,616 --> 00:47:30,240 Escolta, et veus molt bé, Binky. 1155 00:47:30,240 --> 00:47:33,400 Es pot arreglar perquè els punts de Y a la mateixa pointee com x? 1156 00:47:33,400 --> 00:47:34,000 >> Assegurança. 1157 00:47:34,000 --> 00:47:36,780 Vaig a utilitzar el meu vareta màgica Punter d'assignació. 1158 00:47:36,780 --> 00:47:38,740 >> ¿És Que serà un problema com abans? 1159 00:47:38,740 --> 00:47:39,240 No. 1160 00:47:39,240 --> 00:47:40,660 Això no toca els pointees. 1161 00:47:40,660 --> 00:47:44,450 Només canvia un punter a apuntar a la mateixa cosa que una altra. 1162 00:47:44,450 --> 00:47:45,450 >> Oh, ja veig. 1163 00:47:45,450 --> 00:47:48,200 Ara i apunta al mateix lloc que x. 1164 00:47:48,200 --> 00:47:48,910 Així que esperar. 1165 00:47:48,910 --> 00:47:49,950 Ara, i es fixa. 1166 00:47:49,950 --> 00:47:51,120 Té un pointee. 1167 00:47:51,120 --> 00:47:54,510 Així que vostè pot provar la Vareta de Eliminació de referències tornar a enviar el 13 més. 1168 00:47:54,510 --> 00:47:56,510 >> Uh, OK. 1169 00:47:56,510 --> 00:47:58,160 Aquí va. [POP] 1170 00:47:58,160 --> 00:47:59,340 >> Escolta, mira això. 1171 00:47:59,340 --> 00:48:00,750 Ara dereferencing obres a i. 1172 00:48:00,750 --> 00:48:04,991 I pel fet que els punters estan compartint que un pointee, tots dos veuen el 13. 1173 00:48:04,991 --> 00:48:05,490 Si. 1174 00:48:05,490 --> 00:48:06,870 Compartir, el que sigui. 1175 00:48:06,870 --> 00:48:08,820 Així que anem a canviar de lloc ara? 1176 00:48:08,820 --> 00:48:09,440 >> Oh, mira. 1177 00:48:09,440 --> 00:48:10,830 Estem fora de temps. 1178 00:48:10,830 --> 00:48:11,570 >> -But-- 1179 00:48:11,570 --> 00:48:13,530 >> -Simplement Recordar les tres regles de punter. 1180 00:48:13,530 --> 00:48:16,560 Nombre Un, l'estructura bàsica és que vostè té un punter, 1181 00:48:16,560 --> 00:48:18,680 i apunta a un pointee. 1182 00:48:18,680 --> 00:48:20,640 Però el punter i pointee estan separats, 1183 00:48:20,640 --> 00:48:22,610 i l'error comú és la creació d'un punter, 1184 00:48:22,610 --> 00:48:25,000 però que s'oblidi de donar-li una pointee. 1185 00:48:25,000 --> 00:48:28,170 >> Nombre Dos, desreferència punter comença en el punter 1186 00:48:28,170 --> 00:48:31,050 i segueix el seu ratolí a sobre per accedir al seu pointee. 1187 00:48:31,050 --> 00:48:33,400 Com tots sabem, aquest només funciona si hi ha 1188 00:48:33,400 --> 00:48:36,270 1 pointee, quin tipus de torna a la Regla Nombre Un. 1189 00:48:36,270 --> 00:48:39,000 >> Nombre Tres, punter assignació té un punter 1190 00:48:39,000 --> 00:48:42,320 i canvia perquè apunti a la pointee mateix com un altre punter. 1191 00:48:42,320 --> 00:48:44,160 Així que després de la cessió, els dos punters 1192 00:48:44,160 --> 00:48:45,910 apuntarà a aquesta pointee. 1193 00:48:45,910 --> 00:48:47,990 A vegades, això es diu intercanvi. 1194 00:48:47,990 --> 00:48:49,740 I això és tot el que cal fer, de veritat. 1195 00:48:49,740 --> 00:48:50,277 Bye-bye ara. 1196 00:48:50,277 --> 00:48:51,110 [FI REPRODUCCIÓ DE VÍDEO] 1197 00:48:51,110 --> 00:48:52,568 DAVID J. Malan: Això és tot per CS50. 1198 00:48:52,568 --> 00:48:55,110 Ens veiem la setmana que ve. 1199 00:48:55,110 --> 00:48:56,064