1 00:00:00,000 --> 00:00:01,110 >> [REPRODUCCIÓN DE MÚSICA] 2 00:00:01,110 --> 00:00:10,567 3 00:00:10,567 --> 00:00:11,650 DAVID J. MALAN: Muy bien. 4 00:00:11,650 --> 00:00:15,610 Esto es CS50, y esto es el fin de semana cuatro. 5 00:00:15,610 --> 00:00:19,420 Y uno de los temas hoy es el de la ciencia forense digital, 6 00:00:19,420 --> 00:00:20,989 el arte de la recuperación de la información. 7 00:00:20,989 --> 00:00:22,780 Y, en efecto, a pesar de que usted está en el medio 8 00:00:22,780 --> 00:00:25,070 en estos momentos de la Paz en Tres y Breakout, la próxima semana, 9 00:00:25,070 --> 00:00:27,880 la atención se centrará en precisamente este dominio. 10 00:00:27,880 --> 00:00:30,686 >> Así que uno de los trabajos más maravillosos que jamás tenía estaba de vuelta en la escuela de posgrado, 11 00:00:30,686 --> 00:00:33,560 cuando trabajaba para el local de Middlesex County District Attorney de 12 00:00:33,560 --> 00:00:34,950 oficina, haciendo los forenses trabajan. 13 00:00:34,950 --> 00:00:37,450 Así que, esencialmente, el Massachusetts Policía del Estado, en ocasiones, 14 00:00:37,450 --> 00:00:40,100 cuando se trabaja en los casos haría traer cosas como discos duros 15 00:00:40,100 --> 00:00:42,185 y disquetes y tarjetas de memoria y similares. 16 00:00:42,185 --> 00:00:44,060 Y se les entregara para mí y mi mentor, 17 00:00:44,060 --> 00:00:48,070 y nuestro objetivo era encontrar pruebas, si había alguna, en estos medios. 18 00:00:48,070 --> 00:00:50,700 Atisbos Ahora, es posible que haya visto de este mundo de la ciencia forense 19 00:00:50,700 --> 00:00:53,000 en los medios de comunicación, la televisión y las películas. 20 00:00:53,000 --> 00:00:55,730 Pero el trabajo que tenía, y atrevería a decir que ese mundo, 21 00:00:55,730 --> 00:00:57,550 no es bastante como usted verá. 22 00:00:57,550 --> 00:01:00,794 Echemos un vistazo a lo que lo que has visto. 23 00:01:00,794 --> 00:01:01,460 [REPRODUCCIÓN DE VÍDEO] 24 00:01:01,460 --> 00:01:02,930 -OK. 25 00:01:02,930 --> 00:01:05,380 Ahora, vamos a obtener un buen vistazo. 26 00:01:05,380 --> 00:01:06,850 >> [REPRODUCCIÓN DE MÚSICA] 27 00:01:06,850 --> 00:01:12,260 28 00:01:12,260 --> 00:01:12,932 >> -Mantenga Ella. 29 00:01:12,932 --> 00:01:13,657 Corre que volver. 30 00:01:13,657 --> 00:01:14,733 >> Espera un minuto. 31 00:01:14,733 --> 00:01:15,233 Ir a la derecha. 32 00:01:15,233 --> 00:01:16,371 33 00:01:16,371 --> 00:01:16,870 -Hay. 34 00:01:16,870 --> 00:01:17,369 Congele eso. 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 Congele eso. 38 00:01:18,875 --> 00:01:20,160 Endurecerá hasta en eso, ¿verdad? 39 00:01:20,160 --> 00:01:22,126 >> -vector En el que chico por la rueda trasera. 40 00:01:22,126 --> 00:01:24,435 >> -zoom En aquí en este lugar. 41 00:01:24,435 --> 00:01:28,580 >> -Con El equipo adecuado, la imagen se puede ampliar y afilada. 42 00:01:28,580 --> 00:01:29,330 >> ¿Qué es eso? 43 00:01:29,330 --> 00:01:30,780 >> -Es Un programa de mejora. 44 00:01:30,780 --> 00:01:32,170 >> -¿Puedes Claro que cualquier? 45 00:01:32,170 --> 00:01:33,070 >> -No Sé. 46 00:01:33,070 --> 00:01:34,150 Vamos a mejorarlo. 47 00:01:34,150 --> 00:01:35,440 >> -Mejorar Sección A6. 48 00:01:35,440 --> 00:01:36,570 49 00:01:36,570 --> 00:01:38,562 Aumenté el detalle, y-- 50 00:01:38,562 --> 00:01:40,020 -Creo Hay suficiente para mejorar. 51 00:01:40,020 --> 00:01:40,976 Suelte a mi pantalla. 52 00:01:40,976 --> 00:01:42,559 >> -I Mejoró la reflexión en su ojo. 53 00:01:42,559 --> 00:01:44,322 -Vamos Ejecutar esto a través de mejora de vídeo. 54 00:01:44,322 --> 00:01:45,210 >> -Edgar, Puedes mejorar esto? 55 00:01:45,210 --> 00:01:45,710 >> -hang Sucesivamente. 56 00:01:45,710 --> 00:01:47,570 57 00:01:47,570 --> 00:01:49,458 >> -Llevo Trabajando en esta reflexión. 58 00:01:49,458 --> 00:01:50,402 >> Reflexión de alguien -Hay. 59 00:01:50,402 --> 00:01:50,902 >> -Reflexión. 60 00:01:50,902 --> 00:01:52,870 -Hay Un reflejo de la cara del hombre. 61 00:01:52,870 --> 00:01:53,694 >> Reflexión -El! 62 00:01:53,694 --> 00:01:54,610 -Hay Una reflexión. 63 00:01:54,610 --> 00:01:55,880 -zoom En el espejo. 64 00:01:55,880 --> 00:01:57,860 Se puede ver un reflejo. 65 00:01:57,860 --> 00:01:59,630 >> -CAN A mejorar la imagen de aquí? 66 00:01:59,630 --> 00:02:00,377 67 00:02:00,377 --> 00:02:01,210 -CAN A potenciarlo? 68 00:02:01,210 --> 00:02:02,190 -CAN A potenciarlo? 69 00:02:02,190 --> 00:02:03,066 -¿Podemos Mejoramos esto? 70 00:02:03,066 --> 00:02:03,898 -CAN A potenciarlo? 71 00:02:03,898 --> 00:02:04,740 -Mantenga En un segundo. 72 00:02:04,740 --> 00:02:05,281 Voy a Mejorar. 73 00:02:05,281 --> 00:02:06,470 -zoom En la puerta. 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 -Mover En. 77 00:02:08,509 --> 00:02:09,340 -Más. 78 00:02:09,340 --> 00:02:10,094 Espera, detente. 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 Nos -Girar 75 grados alrededor de la vertical, por favor. 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 Volver a la parte sobre la puerta de nuevo. 85 00:02:19,330 --> 00:02:21,420 >> -Consiguió Una mejora de imagen de mapa de bits que pueden? 86 00:02:21,420 --> 00:02:24,420 >> -Quizá Podemos utilizar el Pradeep Singh método para ver por las ventanas. 87 00:02:24,420 --> 00:02:25,902 >> -El Software es estado de la técnica. 88 00:02:25,902 --> 00:02:26,866 >> -El Valor propio está apagado. 89 00:02:26,866 --> 00:02:29,758 >> -Con La derecha combinación de algorithms-- 90 00:02:29,758 --> 00:02:32,168 >> Iluminación llevado de -Él algoritmos para el siguiente nivel, 91 00:02:32,168 --> 00:02:34,110 y puedo utilizarlos para mejorar esta fotografía. 92 00:02:34,110 --> 00:02:36,840 >> -lock En agrandar y el eje z. 93 00:02:36,840 --> 00:02:37,351 >> -Mejorar. 94 00:02:37,351 --> 00:02:37,850 Mejorar. 95 00:02:37,850 --> 00:02:38,720 -Mejorar. 96 00:02:38,720 --> 00:02:40,070 -Freeze Y mejorar. 97 00:02:40,070 --> 00:02:43,420 [FIN REPRODUCCIÓN DE VÍDEO] 98 00:02:43,420 --> 00:02:45,830 DAVID J. MALAN: Así que estos son todas las palabras, pero no eran 99 00:02:45,830 --> 00:02:47,870 usado en oraciones correctamente. 100 00:02:47,870 --> 00:02:52,370 Y de hecho, en el futuro, en cualquier momento, por favor, escuche a alguien decir la palabra, 101 00:02:52,370 --> 00:02:54,250 "Mejorar" risa un poco. 102 00:02:54,250 --> 00:02:57,190 Porque cuando se trata de mejorar, por ejemplo, esto es lo que sucede. 103 00:02:57,190 --> 00:02:58,580 >> Así que aquí está una foto magnífica. 104 00:02:58,580 --> 00:02:59,720 Esto es propio de Daven CS50. 105 00:02:59,720 --> 00:03:03,740 Y suponemos que queríamos centrarse en el brillo en sus ojos, 106 00:03:03,740 --> 00:03:05,870 o el reflejo de la malo que era claramente 107 00:03:05,870 --> 00:03:07,820 capturado por la cámara de seguridad. 108 00:03:07,820 --> 00:03:10,330 Esto es lo que ocurre cuando hacer zoom en una imagen que 109 00:03:10,330 --> 00:03:14,060 tiene sólo un número finito de bits asociados. 110 00:03:14,060 --> 00:03:15,420 >> Eso es lo que puedes conseguir. 111 00:03:15,420 --> 00:03:19,190 Y, en efecto, en el ojo de Daven no es más que cuatro, tal vez seis píxeles 112 00:03:19,190 --> 00:03:22,110 que componen exactamente lo estaba brillando allí. 113 00:03:22,110 --> 00:03:25,890 Así de problemas Cuatro tendrá en última instancia explorar este mundo, en particular 114 00:03:25,890 --> 00:03:28,090 por la naturaleza de algo que llamamos archivo i / o, en su 115 00:03:28,090 --> 00:03:31,000 I / O es sólo una forma elegante de diciendo de entrada y salida. 116 00:03:31,000 --> 00:03:34,280 >> Así hasta el momento, todas las interacciones que hemos tenido con una computadora 117 00:03:34,280 --> 00:03:36,770 han sido en gran parte con su teclado y la pantalla, 118 00:03:36,770 --> 00:03:40,770 pero no tanto con el disco duro, o el ahorro de los archivos más allá de los que 119 00:03:40,770 --> 00:03:41,620 mismo escribe. 120 00:03:41,620 --> 00:03:44,570 Sus programas hasta ahora tienen no estado creando, y el ahorro, 121 00:03:44,570 --> 00:03:46,270 y la actualización de sus propios archivos. 122 00:03:46,270 --> 00:03:47,150 >> Bueno, ¿qué es un archivo? 123 00:03:47,150 --> 00:03:48,105 Bueno, algo así como un archivo JPEG. 124 00:03:48,105 --> 00:03:50,520 Esta es una imagen que te pueden tener o subir a Facebook, 125 00:03:50,520 --> 00:03:51,690 o ver cualquier parte de la web. 126 00:03:51,690 --> 00:03:54,460 De hecho, esa foto que acabamos de sierra de Daven era un JPEG. 127 00:03:54,460 --> 00:03:57,570 Y lo que es interesante acerca de los archivos, como los archivos JPEG 128 00:03:57,570 --> 00:04:02,170 es que pueden ser identificadas, típicamente, mediante ciertos patrones de bits. 129 00:04:02,170 --> 00:04:05,200 >> En otras palabras, ¿qué es lo que distingue a un JPEG desde un GIF 130 00:04:05,200 --> 00:04:08,109 desde un PING desde una Palabra documento de un archivo de Excel? 131 00:04:08,109 --> 00:04:09,900 Bueno, es simplemente diferente patrones de bits. 132 00:04:09,900 --> 00:04:12,820 Y esos patrones son diferentes por lo general en el inicio de esos archivos. 133 00:04:12,820 --> 00:04:18,200 >> Así que cuando el equipo abre una Palabra doc, o cuando un equipo se abre un archivo JPEG, 134 00:04:18,200 --> 00:04:20,940 se ve normalmente en la primero varios bits en el archivo. 135 00:04:20,940 --> 00:04:24,059 Y si se reconoce un patrón, que dice, oh, esto es una imagen. 136 00:04:24,059 --> 00:04:25,850 Permítanme exhibo a el usuario como un gráfico. 137 00:04:25,850 --> 00:04:27,870 O, oh, esto se parece a un documento de Word. 138 00:04:27,870 --> 00:04:30,480 Déjame mostrarte al usuario como un ensayo. 139 00:04:30,480 --> 00:04:33,020 >> Así, por ejemplo, archivos JPEG, Resulta que son 140 00:04:33,020 --> 00:04:35,460 bastante sofisticado debajo de la capucha. 141 00:04:35,460 --> 00:04:40,140 Pero los tres primeros bytes en la mayoría de cada JPEG empezar con estos tres números. 142 00:04:40,140 --> 00:04:44,680 Así byte cero, uno, y dos son, en la mayoría de cada JPEG, 255, entonces el número 143 00:04:44,680 --> 00:04:46,675 216, entonces el número 255. 144 00:04:46,675 --> 00:04:48,990 >> Y lo que podrás para empezar a hacer la semana que viene 145 00:04:48,990 --> 00:04:52,920 en realidad está metiendo debajo el capó de archivos como archivos JPEG 146 00:04:52,920 --> 00:04:57,210 y al igual que los archivos de mapa de bits, y ver Lo que siempre ha estado ahí todo el tiempo 147 00:04:57,210 --> 00:04:58,650 como usted ha estado usando una computadora. 148 00:04:58,650 --> 00:05:01,860 >> Pero lo que hay allí no es típicamente escrita como números decimales como este. 149 00:05:01,860 --> 00:05:04,620 Los informáticos no hacen tienden a hablar en decimal. 150 00:05:04,620 --> 00:05:06,139 En realidad, no hablan en binario. 151 00:05:06,139 --> 00:05:07,930 Normalmente, cuando queremos para expresar números, 152 00:05:07,930 --> 00:05:10,710 realmente usamos hexadecimal, que usted puede recordar 153 00:05:10,710 --> 00:05:13,027 de, por ejemplo, de problemas Uno, que desafió 154 00:05:13,027 --> 00:05:14,610 a pensar en un sistema diferente. 155 00:05:14,610 --> 00:05:17,170 >> Nosotros, por supuesto, estamos familiarizados con decimales, del cero al nueve. 156 00:05:17,170 --> 00:05:18,215 Hablamos de binario. 157 00:05:18,215 --> 00:05:20,710 Y nosotros realmente no tenemos de usar que mucho aquí 158 00:05:20,710 --> 00:05:22,470 en adelante, porque los ordenadores que utilizarán. 159 00:05:22,470 --> 00:05:24,900 Pero los programadores lo hará muy a menudo, pero no siempre, 160 00:05:24,900 --> 00:05:29,360 utilizar hexadecimal, que sólo significa usted tiene 16 letras en su alfabeto, 161 00:05:29,360 --> 00:05:31,330 en lugar de dos o 10. 162 00:05:31,330 --> 00:05:34,530 >> Entonces, ¿cómo contar a un mayor de nueve 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, sólo por convención. 164 00:05:41,120 --> 00:05:43,540 Pero lo que es fundamental es que cada de ellos es un solo símbolo. 165 00:05:43,540 --> 00:05:44,340 No hay 10. 166 00:05:44,340 --> 00:05:48,400 No hay 11, per se, debido a que cada de sus cifras, al igual que en decimal 167 00:05:48,400 --> 00:05:51,940 y al igual que en el sistema binario, sólo debe ser un solo carácter, por convención. 168 00:05:51,940 --> 00:05:55,280 >> Así que a continuación es el alfabeto que tenemos a nuestra disposición para hexadecimal. 169 00:05:55,280 --> 00:05:58,600 Así que lo que tiene un aspecto un JPEG como si eran para escribir los tres primeros 170 00:05:58,600 --> 00:06:01,980 No bytes como decimal, pero, por ejemplo, como hexadecimal? 171 00:06:01,980 --> 00:06:03,640 ¿Y por qué es hexagonal incluso tan útil? 172 00:06:03,640 --> 00:06:05,290 >> Bueno, un rápido vistazo a un ejemplo. 173 00:06:05,290 --> 00:06:09,030 Así que si yo escribo los bits que representar estos numbers-- decimal 174 00:06:09,030 --> 00:06:12,450 esto podría ser un poco oxidado ahora desde hace unas semanas, 175 00:06:12,450 --> 00:06:14,820 pero el de la izquierda y la derecho son bastante fácil. 176 00:06:14,820 --> 00:06:17,990 255 era el número más grande que podría representar con ocho bits. 177 00:06:17,990 --> 00:06:18,820 Fue todo unos. 178 00:06:18,820 --> 00:06:21,320 Así que el único que está ligeramente interesante es el del medio. 179 00:06:21,320 --> 00:06:24,700 Y si lo haces tipo de la matemáticas, se deduce que, de hecho, 180 00:06:24,700 --> 00:06:27,949 que el patrón de una y ceros representa 216. 181 00:06:27,949 --> 00:06:30,240 Así que vamos a estipular ahora que estos son correctos. 182 00:06:30,240 --> 00:06:31,730 Pero ¿por qué es interesante? 183 00:06:31,730 --> 00:06:33,970 >> Bueno, un byte, por supuesto, es de ocho bits. 184 00:06:33,970 --> 00:06:38,980 Y resulta que si usted piensa de un byte como dos trozos de cuatro bits, 185 00:06:38,980 --> 00:06:39,500 como este. 186 00:06:39,500 --> 00:06:41,000 Quisiera añadir algo de espacio. 187 00:06:41,000 --> 00:06:42,550 Así que antes, después. 188 00:06:42,550 --> 00:06:46,520 Acabo de añadir un poco de espacio en blanco por el amor de la visualización aquí. 189 00:06:46,520 --> 00:06:51,840 ¿Cómo podemos ahora representar en, digamos, hexadecimal cada quad de bits, 190 00:06:51,840 --> 00:06:52,880 cada conjunto de cuatro bits? 191 00:06:52,880 --> 00:06:56,420 >> Así, por ejemplo, a la izquierda ahora, tenemos 1111 en binario. 192 00:06:56,420 --> 00:07:00,420 ¿Cuál es ese número en decimal, si lo hace fuera de las matemáticas? 193 00:07:00,420 --> 00:07:03,780 Usted tiene el lugar de las unidades, el lugar de dos en dos, el lugar a cuatro patas, y el lugar ochos. 194 00:07:03,780 --> 00:07:04,341 >> AUDIENCIA: 15. 195 00:07:04,341 --> 00:07:05,340 DAVID J. MALAN: Es 15. 196 00:07:05,340 --> 00:07:08,340 Así que si lo hacemos ocho más cuatro más dos más uno, obtenemos 15. 197 00:07:08,340 --> 00:07:11,790 Así que podría anotar 15 infra 1111, pero el punto aquí 198 00:07:11,790 --> 00:07:13,190 es hexadecimal, no decimal. 199 00:07:13,190 --> 00:07:17,310 Así que en lugar de escribir 15, 1-5, Voy a escribir que en hexadecimal, 200 00:07:17,310 --> 00:07:22,311 que si piensa volver, si usted tiene cero a través de f, lo que se 15 va a ser? 201 00:07:22,311 --> 00:07:22,810 AUDIENCIA: f. 202 00:07:22,810 --> 00:07:24,434 DAVID J. MALAN: Así que resulta que del f. 203 00:07:24,434 --> 00:07:29,140 Y usted puede trabajar en eso, diciendo: así, si a es 10, entonces bien, f es de 15. 204 00:07:29,140 --> 00:07:33,250 Así que de hecho, podríamos reescribir Este mismo conjunto de números como f f. 205 00:07:33,250 --> 00:07:35,750 Y luego, si hacemos un poco de matemáticas, vamos a deducir que eso es d. 206 00:07:35,750 --> 00:07:38,650 Ocho es bastante fácil, ya que tener un uno en el lugar ochos. 207 00:07:38,650 --> 00:07:40,620 Y luego, tenemos un par más de f f. 208 00:07:40,620 --> 00:07:44,669 >> Así que lo que los humanos tienden a hacer por convención cuando utilizan hexadecimal es simplemente 209 00:07:44,669 --> 00:07:47,710 escribir esto un poco más sucinta, deshacerse de la mayor parte de ese espacio en blanco. 210 00:07:47,710 --> 00:07:50,890 Y sólo para ser súper claro para lectores que esta es hexadecimal, 211 00:07:50,890 --> 00:07:54,670 el simple convención entre los seres humanos se le escriben cero 212 00:07:54,670 --> 00:07:58,000 x, que no tiene otro significado de un identificador visual de, 213 00:07:58,000 --> 00:07:59,590 aquí viene un número hexadecimal. 214 00:07:59,590 --> 00:08:04,210 >> Y entonces, de poner los dos dígitos, f f en este caso, a continuación, d a, entonces f f. 215 00:08:04,210 --> 00:08:06,700 Así que cuento largo, hexadecimal sólo tiende 216 00:08:06,700 --> 00:08:11,990 para ser útil porque cada uno de sus dígitos, del cero al f, perfectamente líneas 217 00:08:11,990 --> 00:08:13,880 con un patrón de cuatro bits. 218 00:08:13,880 --> 00:08:18,080 >> Así que si usted tiene dos dígitos hexadecimales, cero a la F, y otra vez, 219 00:08:18,080 --> 00:08:20,256 que le da a la perfección ocho bits o un byte. 220 00:08:20,256 --> 00:08:22,380 Así que por eso se tiende a ser útil convencionalmente. 221 00:08:22,380 --> 00:08:24,990 No hay intelectual contenido realmente más allá de eso, 222 00:08:24,990 --> 00:08:27,010 aparte de su utilidad real. 223 00:08:27,010 --> 00:08:29,310 >> Ahora los archivos JPEG no son la única formatos de archivos de gráficos. 224 00:08:29,310 --> 00:08:33,230 Usted puede recordar que hay archivos de este tipo en el mundo, 225 00:08:33,230 --> 00:08:34,830 por lo menos desde hace unos años. 226 00:08:34,830 --> 00:08:37,580 >> Así que esto era en realidad instalado en Windows XP 227 00:08:37,580 --> 00:08:39,960 en millones de ordenadores de todo el mundo. 228 00:08:39,960 --> 00:08:43,000 Y este era un archivo de mapa de bits, BMP. 229 00:08:43,000 --> 00:08:47,690 Y un archivo de mapa de bits, como se verá el próximo semana, sólo significa un patrón de puntos, 230 00:08:47,690 --> 00:08:51,710 píxeles como se les llama, un mapa a partir de los bits, de verdad. 231 00:08:51,710 --> 00:08:55,160 >> Así que lo que es interesante, sin embargo, acerca de este formato de archivo, BMP, es 232 00:08:55,160 --> 00:08:58,590 que debajo de la capilla, que cuenta con más de sólo tres bytes 233 00:08:58,590 --> 00:09:01,020 que componen su cabecera, por lo hablar, los primeros bocados. 234 00:09:01,020 --> 00:09:03,330 En realidad se ve un poco complicado a primera vista. 235 00:09:03,330 --> 00:09:04,704 Y verá esto en el conjunto P. 236 00:09:04,704 --> 00:09:06,810 Y conseguir algo en particular de esta empresa 237 00:09:06,810 --> 00:09:10,720 que no es tan importante, ya que sólo el hecho de que al comienzo de cada mapa de bits 238 00:09:10,720 --> 00:09:13,823 archivo, un formato gráfico, hay todo un montón de números. 239 00:09:13,823 --> 00:09:14,980 240 00:09:14,980 --> 00:09:16,720 >> Ahora Microsoft, el autor de este formato, 241 00:09:16,720 --> 00:09:18,820 tiende a llamar a los Las cosas no enteros y caracteres 242 00:09:18,820 --> 00:09:22,259 y flotadores pero las palabras y d palabras y largos y bytes. 243 00:09:22,259 --> 00:09:23,800 Así que son sólo diferentes tipos de datos. 244 00:09:23,800 --> 00:09:25,170 Son diferentes nombres para la misma cosa. 245 00:09:25,170 --> 00:09:26,740 Pero verás que en P Set Four. 246 00:09:26,740 --> 00:09:31,450 >> Pero esto es sólo para decir que si un ser humano doble clics algún archivo BMP en su 247 00:09:31,450 --> 00:09:35,015 o su disco duro, y una ventana se abre hasta él o ella que la imagen que muestra, 248 00:09:35,015 --> 00:09:38,500 eso sucedió porque el operativo sistema presumiblemente notó no sólo 249 00:09:38,500 --> 00:09:41,460 la extensión de archivo BMP en el nombre del archivo, 250 00:09:41,460 --> 00:09:45,010 sino también el hecho de que hay algo de convención para el patrón de bits 251 00:09:45,010 --> 00:09:47,490 en el comienzo de ese archivo de mapa de bits. 252 00:09:47,490 --> 00:09:50,270 >> Pero ahora vamos a centrarnos en un archivo complicada tal, 253 00:09:50,270 --> 00:09:52,120 sino en algo como esto. 254 00:09:52,120 --> 00:09:55,190 Supongamos que aquí en GEdit, I sólo tienen los inicios 255 00:09:55,190 --> 00:09:57,070 de un programa que es bastante simple. 256 00:09:57,070 --> 00:09:58,860 Tengo un poco incluye hasta arriba. 257 00:09:58,860 --> 00:10:02,120 Ahora tengo "structs.h" # include pero Voy a volver a eso en un momento. 258 00:10:02,120 --> 00:10:03,974 Pero esto es útil por ahora. 259 00:10:03,974 --> 00:10:05,890 Así que este es un programa eso va a aplicar 260 00:10:05,890 --> 00:10:07,335 como la base de datos del registrador. 261 00:10:07,335 --> 00:10:09,710 Así que una base de datos de los estudiantes, y todos los estudiantes en el mundo 262 00:10:09,710 --> 00:10:13,190 tiene un nombre y una casa y probablemente algunos otras cosas, pero vamos a mantener las cosas simples. 263 00:10:13,190 --> 00:10:15,140 Cada estudiante tiene un nombre y una casa. 264 00:10:15,140 --> 00:10:17,700 >> Así que si yo quería escribir una programa cuyo propósito en la vida 265 00:10:17,700 --> 00:10:19,860 fue simplemente para recorrer desde cero en un máximo de tres, 266 00:10:19,860 --> 00:10:22,070 si hay tres estudiantes en la Universidad de Harvard. 267 00:10:22,070 --> 00:10:25,350 Y yo sólo quiero llegar, mediante GetString, el nombre de cada estudiante y de la casa, 268 00:10:25,350 --> 00:10:26,600 y luego simplemente imprimir aquellos cabo. 269 00:10:26,600 --> 00:10:28,630 >> Esto es algo así como la Semana Uno, Semana Dos cosas ahora, 270 00:10:28,630 --> 00:10:30,810 donde yo sólo quiero una para bucle o algo por el estilo. 271 00:10:30,810 --> 00:10:34,500 Y quiero llamar GetString algunos veces y, a continuación, se imprimen f varias veces. 272 00:10:34,500 --> 00:10:37,340 Entonces, ¿cómo podría yo hacer esto, sin embargo, cuando un nombre y una casa 273 00:10:37,340 --> 00:10:39,070 están involucrados para cada estudiante? 274 00:10:39,070 --> 00:10:42,830 >> Así que mi primer instinto podría la de hacer algo como esto. 275 00:10:42,830 --> 00:10:49,620 Yo podría decir primero, bueno, dame, decir, una matriz de cadenas llamados nombres. 276 00:10:49,620 --> 00:10:51,530 Y yo no quiero un hardcode tres aquí. 277 00:10:51,530 --> 00:10:53,064 ¿Qué quiero poner allí? 278 00:10:53,064 --> 00:10:55,730 Para que los estudiantes, porque eso es sólo una constante declarada en la parte superior, 279 00:10:55,730 --> 00:10:57,860 sólo para que yo no tengo que codificar tres en múltiples lugares. 280 00:10:57,860 --> 00:11:00,859 De esta manera, puedo cambiarlo un solo lugar, y que afecta a un cambio en todas partes. 281 00:11:00,859 --> 00:11:04,470 Y entonces, yo podría hacer cadena alberga ESTUDIANTES. 282 00:11:04,470 --> 00:11:10,250 >> Y ahora, yo podría hacer algo como for (int i = 0; i 00:11:14,390 Así que estoy escribiendo rápido, pero esto es probablemente sintaxis familiar ahora. 284 00:11:14,390 --> 00:11:17,030 >> Y ahora, esto era más reciente. 285 00:11:17,030 --> 00:11:22,890 Si quiero poner en el i-th el nombre del estudiante, creo que hago esto. 286 00:11:22,890 --> 00:11:26,480 Y entonces, no nombres pero las casas ménsula. 287 00:11:26,480 --> 00:11:29,930 Hago esto, GetString, y dejo me volver atrás y corregir esta línea. 288 00:11:29,930 --> 00:11:30,430 De acuerdo? 289 00:11:30,430 --> 00:11:31,200 En desacuerdo? 290 00:11:31,200 --> 00:11:32,366 No es muy fácil de usar. 291 00:11:32,366 --> 00:11:33,890 No le he dicho al usuario qué hacer. 292 00:11:33,890 --> 00:11:36,520 >> Pero ahora, si yo también quería más tarde, vamos a 293 00:11:36,520 --> 00:11:40,060 digamos, imprima estas cosas salir-- TODO lo más tarde. 294 00:11:40,060 --> 00:11:42,330 Voy a hacer más con esto-- este es sin duda 295 00:11:42,330 --> 00:11:45,970 una correcta aplicación de la conseguir nombres y casas, tres 296 00:11:45,970 --> 00:11:48,870 de ellos total de cada uno, de un usuario. 297 00:11:48,870 --> 00:11:51,280 >> Pero esto no es muy buen diseño, ¿no? 298 00:11:51,280 --> 00:11:55,220 ¿Qué pasa si un estudiante tiene no sólo un nombre y una casa, pero también un número de identificación, 299 00:11:55,220 --> 00:11:57,770 y un número de teléfono, y una dirección de correo electrónico, 300 00:11:57,770 --> 00:12:00,280 y tal vez una página de inicio, y tal vez un mango Twitter, 301 00:12:00,280 --> 00:12:03,730 y cualquier número de otros detalles asociada a un estudiante 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 ¿Cómo podemos empezar a añadir funcionalidad de este programa? 304 00:12:07,720 --> 00:12:14,080 >> Bueno, siento que la manera más simple podría ser para hacer algo como, digamos, 305 00:12:14,080 --> 00:12:16,490 int ids ESTUDIANTES. 306 00:12:16,490 --> 00:12:18,380 Así que puedo poner todos sus documentos de identidad en ese país. 307 00:12:18,380 --> 00:12:22,240 Y entonces, algo como números de teléfono, 308 00:12:22,240 --> 00:12:24,400 No estoy seguro de cómo representar eso todavía. 309 00:12:24,400 --> 00:12:30,280 Así que vamos a seguir adelante y simplemente llamada este twitters ESTUDIANTES, que 310 00:12:30,280 --> 00:12:33,550 es un poco extraño, pero-- y un montón más campos. 311 00:12:33,550 --> 00:12:36,360 >> He empezado a con eficacia copie y pegue aquí. 312 00:12:36,360 --> 00:12:39,416 Y esto va a crecer bastante difícil de manejar bastante rápido, ¿verdad? 313 00:12:39,416 --> 00:12:42,290 ¿No sería agradable si había en el mundo una estructura de datos conocida 314 00:12:42,290 --> 00:12:45,600 no como un int o una cadena, pero algo nivel superior, una abstracción, por lo 315 00:12:45,600 --> 00:12:47,570 hablar, conocida como estudiante? 316 00:12:47,570 --> 00:12:50,220 C no vino con una función de funcionalidad para los estudiantes, 317 00:12:50,220 --> 00:12:52,260 pero lo que si quería darle tal? 318 00:12:52,260 --> 00:12:55,640 >> Bueno, resulta que voy a abrir un archivo llamado structs.h aquí, 319 00:12:55,640 --> 00:12:57,090 y usted puede hacer exactamente eso. 320 00:12:57,090 --> 00:12:58,290 Y vamos a empezar a hacer esto ahora. 321 00:12:58,290 --> 00:13:01,490 Y debajo de la capucha de P Set de tres, que ya ha estado haciendo esto ahora. 322 00:13:01,490 --> 00:13:05,920 No hay tal cosa como un g rect o un g ovalada en el lenguaje de programación C. 323 00:13:05,920 --> 00:13:10,570 >> La gente en Stanford implementan los tipos de datos mediante el uso de este enfoque aquí, 324 00:13:10,570 --> 00:13:13,900 declarando su propia nuevos datos tipos utilizando una nueva palabra clave 325 00:13:13,900 --> 00:13:16,744 denominada struct y otro uno llamado typedef. 326 00:13:16,744 --> 00:13:19,660 Y de hecho, a pesar de que la sintaxis se ve un poco diferente de las cosas 327 00:13:19,660 --> 00:13:23,550 que hemos visto antes, en principio, es super simple. 328 00:13:23,550 --> 00:13:25,297 >> Esto sólo significa "definir un tipo." 329 00:13:25,297 --> 00:13:27,255 Eso va a ser un estructura, y una estructura 330 00:13:27,255 --> 00:13:29,400 es como un contenedor para múltiples cosas. 331 00:13:29,400 --> 00:13:31,780 Y esa estructura se va tener una cadena denominada nombre, 332 00:13:31,780 --> 00:13:33,210 y una cadena llama casa. 333 00:13:33,210 --> 00:13:37,520 Y vamos a llamar, sólo por conveniencia, todo este estudiante estructura de datos. 334 00:13:37,520 --> 00:13:40,320 >> Así que el momento en que llegue a el punto y coma, que tiene ahora 335 00:13:40,320 --> 00:13:43,280 creado sus propios datos tipo denominado estudiante 336 00:13:43,280 --> 00:13:46,420 que ahora está junto a int, y el flotador, y char, y la cadena, 337 00:13:46,420 --> 00:13:50,270 y g rect, y g oval, y cualquier número de otras cosas que la gente ha inventado. 338 00:13:50,270 --> 00:13:53,340 >> Así que lo que es útil sobre ahora es que si vuelvo 339 00:13:53,340 --> 00:13:57,430 a struct 0 y terminar este aplicación, que escribí 340 00:13:57,430 --> 00:14:02,080 por adelantado aquí, observe que todos del desorden inevitable que 341 00:14:02,080 --> 00:14:05,490 estaba a punto de empezar a suceder como agregué números y twitters de teléfono y todo 342 00:14:05,490 --> 00:14:07,370 estas otras cosas definición de un estudiante, 343 00:14:07,370 --> 00:14:11,810 ahora está sucintamente concluyó tan sólo una variedad de estudiantes. 344 00:14:11,810 --> 00:14:15,500 >> Y cada uno de esos estudiantes ahora tiene varias cosas dentro de ella. 345 00:14:15,500 --> 00:14:16,930 Así que sólo deja una pregunta. 346 00:14:16,930 --> 00:14:19,700 ¿Cómo se llega en el nombre, y la casa, y la ID, 347 00:14:19,700 --> 00:14:21,640 y para cuanto se interior del estudiante? 348 00:14:21,640 --> 00:14:22,930 Súper simple, también. 349 00:14:22,930 --> 00:14:25,730 Nueva sintaxis, sino una idea simple. 350 00:14:25,730 --> 00:14:29,239 >> Simplemente índice en la matriz, como lo hicimos la semana pasada y esta. 351 00:14:29,239 --> 00:14:31,030 Y lo que es claramente la nueva pieza de sintaxis? 352 00:14:31,030 --> 00:14:32,590 353 00:14:32,590 --> 00:14:35,880 Just., Que significa "ir dentro de la estructura y hacer el campo llamado 354 00:14:35,880 --> 00:14:39,030 nombre, obtener el campo llamado casa, obtener el campo llamado estudiante ". 355 00:14:39,030 --> 00:14:41,940 >> Así que en el conjunto P de tres, si eres sigue trabajando en eso, 356 00:14:41,940 --> 00:14:44,020 y la mayoría de la gente todavía son, darse cuenta de que a medida que 357 00:14:44,020 --> 00:14:46,130 empezar a utilizar cosas como g rectas y g óvalos 358 00:14:46,130 --> 00:14:50,201 y otras cosas que no parecen provenir de la Semana Cero, uno, o dos, 359 00:14:50,201 --> 00:14:52,950 se dan cuenta de que eso es porque Stanford declarado algunos nuevos tipos de datos. 360 00:14:52,950 --> 00:14:56,160 >> Y de hecho, eso es exactamente lo que vamos a hacer, así, en el conjunto P de Cuatro, cuando 361 00:14:56,160 --> 00:14:59,880 empezamos a tratar con las cosas como imágenes, mapas de bits y mucho más. 362 00:14:59,880 --> 00:15:02,882 Así que eso es sólo un avance y un modelo mental de lo que está por venir. 363 00:15:02,882 --> 00:15:04,590 Ahora, he demorado un poco esta mañana. 364 00:15:04,590 --> 00:15:09,560 Yo era una especie de curiosidad por ver lo que el fondo de pantalla Microsoft realidad 365 00:15:09,560 --> 00:15:10,310 parece que hoy. 366 00:15:10,310 --> 00:15:15,200 Y resulta que alguien en 2006 en realidad fue a casi exactamente 367 00:15:15,200 --> 00:15:19,210 el mismo lugar para fotografiar en la realidad lo que parece que en estos días. 368 00:15:19,210 --> 00:15:21,380 El campo es ahora un poco de maleza. 369 00:15:21,380 --> 00:15:24,850 >> Así que hablar ahora de las imágenes, vamos a traer de vuelta a Daven aquí 370 00:15:24,850 --> 00:15:26,890 en la pantalla y Nicholas, y justo recordarle 371 00:15:26,890 --> 00:15:30,540 que si desea unirse a nosotros para el almuerzo este viernes, la cabeza a nuestra dirección habitual 372 00:15:30,540 --> 00:15:31,440 Aquí. 373 00:15:31,440 --> 00:15:33,530 >> Entonces, ¿dónde nos dejamos fuera el lunes? 374 00:15:33,530 --> 00:15:35,140 Hemos introducido este problema, ¿verdad? 375 00:15:35,140 --> 00:15:37,610 Este fue aparentemente una correcta implementación de swap, 376 00:15:37,610 --> 00:15:40,460 mediante el cual se toma dos enteros, un llamado, un llamado b, 377 00:15:40,460 --> 00:15:44,130 intercambiarlos, al igual que Laura hizo aquí en el escenario con la leche y el agua, 378 00:15:44,130 --> 00:15:46,820 mediante el uso de un temporal variable o una taza vacía, 379 00:15:46,820 --> 00:15:50,540 para que pudiéramos poner b en una y una en b sin hacer un lío de cosas. 380 00:15:50,540 --> 00:15:51,560 Se utilizó una variable. 381 00:15:51,560 --> 00:15:52,870 Se llama temp. 382 00:15:52,870 --> 00:15:55,520 >> Pero lo que era la fundamental problema con este código el lunes? 383 00:15:55,520 --> 00:15:57,700 384 00:15:57,700 --> 00:15:58,870 ¿Cuál fue 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 >> AUDIENCIA: Se necesita más espacio. 388 00:16:01,970 --> 00:16:04,719 >> DAVID J. MALAN: ocupa más espacio, porque estoy usando una variable, 389 00:16:04,719 --> 00:16:05,400 y eso está bien. 390 00:16:05,400 --> 00:16:07,300 Eso es cierto, pero estoy va a decir que está bien. 391 00:16:07,300 --> 00:16:10,030 Está a sólo 32 bits en la gran esquema de las cosas, así que no es gran cosa. 392 00:16:10,030 --> 00:16:10,655 Otros pensamientos? 393 00:16:10,655 --> 00:16:12,572 AUDIENCIA: Sólo se intercambia las variables a nivel local. 394 00:16:12,572 --> 00:16:13,571 DAVID J. MALAN: Exactamente. 395 00:16:13,571 --> 00:16:15,090 Sólo cambia las variables de forma local. 396 00:16:15,090 --> 00:16:18,173 Porque cada vez que te llame un function-- cuando tuve las bandejas de Annenberg 397 00:16:18,173 --> 00:16:19,840 la última vez, tienes principal en la parte inferior. 398 00:16:19,840 --> 00:16:23,560 Tan pronto como se llama a una función llamada intercambio, canje no obtiene x e y, 399 00:16:23,560 --> 00:16:24,400 los valores originales. 400 00:16:24,400 --> 00:16:26,392 ¿Qué significa intercambio get, nos reclamamos? 401 00:16:26,392 --> 00:16:27,100 AUDIENCIA: Copias. 402 00:16:27,100 --> 00:16:28,090 DAVID J. MALAN: Así copias de ellos. 403 00:16:28,090 --> 00:16:31,120 Así se pone uno y dos, si recordar el ejemplo de la última vez, 404 00:16:31,120 --> 00:16:34,730 pero una copia de uno y dos que se intercambian con éxito. 405 00:16:34,730 --> 00:16:38,550 Pero, por desgracia, al final, esos valores siguen siendo los mismos. 406 00:16:38,550 --> 00:16:41,880 Así que podemos ver esto con nuestra nuevo amigo, espero GDB, 407 00:16:41,880 --> 00:16:45,180 que usted o los TFS y Ca de tener sido guiándole hacia la siguiente manera. 408 00:16:45,180 --> 00:16:51,210 >> Así que no hay memoria de intercambio se ve como-- vamos abrir esto-- se parece a esto. 409 00:16:51,210 --> 00:16:54,160 Inicializamos x para uno, y para dos. 410 00:16:54,160 --> 00:16:55,620 Tenía un montón de impresión de f. 411 00:16:55,620 --> 00:16:58,080 Pero entonces, la llamada clave aquí había que cambiar, que 412 00:16:58,080 --> 00:17:00,260 es exactamente lo que el código acabo de ver hace un momento. 413 00:17:00,260 --> 00:17:03,180 ¿Qué es correcta en primera vista, pero funcionalmente, 414 00:17:03,180 --> 00:17:06,800 este programa no funciona, porque no intercambiar de forma permanente x e y. 415 00:17:06,800 --> 00:17:10,190 >> Así que veamos esto, un calentamiento rápido hasta aquí con el BGF, una ./noswap. 416 00:17:10,190 --> 00:17:11,867 417 00:17:11,867 --> 00:17:15,200 Un montón de información abrumadora que Me desharé de L con control por ahora. 418 00:17:15,200 --> 00:17:17,516 Y ahora, me voy a seguir adelante y ejecutarlo. 419 00:17:17,516 --> 00:17:19,349 Y, por desgracia, que no era tan útil. 420 00:17:19,349 --> 00:17:22,355 Se corrió el programa dentro de este programa llamado GDB, un depurador, 421 00:17:22,355 --> 00:17:23,730 pero no me dejó hurgar. 422 00:17:23,730 --> 00:17:26,229 >> Entonces, ¿cómo puedo realmente hacer una pausa ejecución dentro de este programa? 423 00:17:26,229 --> 00:17:27,410 424 00:17:27,410 --> 00:17:28,329 Así romper. 425 00:17:28,329 --> 00:17:32,340 Y podría romper en cualquier número, uno, 10, 15 de línea. 426 00:17:32,340 --> 00:17:35,530 Pero también puedo romper simbólicamente diciendo ruptura principal. 427 00:17:35,530 --> 00:17:38,980 Y eso va a establecer un descanso punto, al parecer, en la línea 16 en la principal. 428 00:17:38,980 --> 00:17:40,050 ¿Y dónde está la línea 16? 429 00:17:40,050 --> 00:17:42,960 Vamos a ir hasta el código y subir a noswap. 430 00:17:42,960 --> 00:17:46,930 Y, de hecho, la línea 16 es la muy primero en el programa. 431 00:17:46,930 --> 00:17:52,130 >> Así que ahora, si me voy por delante y el tipo ejecutar este tiempo, Enter, se detuvo. 432 00:17:52,130 --> 00:17:53,080 Así que vamos a hurgar. 433 00:17:53,080 --> 00:17:55,716 Imprimir x-- qué es x cero? 434 00:17:55,716 --> 00:17:56,705 435 00:17:56,705 --> 00:17:57,830 Y ignorar el signo de dólar. 436 00:17:57,830 --> 00:17:59,725 Eso es sólo para los más de lujo uso del programa. 437 00:17:59,725 --> 00:18:00,780 438 00:18:00,780 --> 00:18:03,140 ¿Por qué es x cero en este momento? 439 00:18:03,140 --> 00:18:03,640 Sí. 440 00:18:03,640 --> 00:18:07,061 >> AUDIENCIA: Se detuvo justo antes de línea 16, no realmente en la línea 16. 441 00:18:07,061 --> 00:18:08,060 DAVID J. MALAN: Exactamente. 442 00:18:08,060 --> 00:18:11,630 GDB, por defecto, se ha detenido ejecución justo antes de la línea 16. 443 00:18:11,630 --> 00:18:14,820 Así que no se ha ejecutado, lo que significa x es de algún valor desconocido. 444 00:18:14,820 --> 00:18:17,150 Y tenemos la suerte de que es algo limpio como cero. 445 00:18:17,150 --> 00:18:20,310 Así que ahora si escribo siguiente, ahora es ejecutado 16. 446 00:18:20,310 --> 00:18:22,000 Está esperando a que yo ejecuto 17. 447 00:18:22,000 --> 00:18:23,400 Déjame ir adelante y print x. 448 00:18:23,400 --> 00:18:24,094 Es uno. 449 00:18:24,094 --> 00:18:25,260 Déjame ir adelante y de impresión y. 450 00:18:25,260 --> 00:18:26,176 ¿Qué debo ver ahora? 451 00:18:26,176 --> 00:18:27,660 452 00:18:27,660 --> 00:18:28,560 >> AUDIENCIA: [inaudible] 453 00:18:28,560 --> 00:18:29,165 >> DAVID J. MALAN: Un poco más fuerte. 454 00:18:29,165 --> 00:18:30,040 >> AUDIENCIA: [inaudible] 455 00:18:30,040 --> 00:18:30,537 456 00:18:30,537 --> 00:18:32,120 DAVID J. MALAN: No hace ni un consenso. 457 00:18:32,120 --> 00:18:34,760 Así que sí, vemos un cierto valor de la basura. 458 00:18:34,760 --> 00:18:37,862 Ahora, y es 134514064 allí. 459 00:18:37,862 --> 00:18:39,320 Bueno, es sólo un valor de la basura. 460 00:18:39,320 --> 00:18:41,350 Mi programa utiliza memoria RAM para diferentes propósitos. 461 00:18:41,350 --> 00:18:42,350 Hay otras funciones. 462 00:18:42,350 --> 00:18:44,040 Otras personas escribieron dentro de mi ordenador. 463 00:18:44,040 --> 00:18:46,789 Así que esos bits se han utilizado para otros valores, y lo que estoy viendo 464 00:18:46,789 --> 00:18:49,470 es los restos de algunos utilización anterior de esta memoria. 465 00:18:49,470 --> 00:18:53,350 >> Así que no es gran cosa, porque tan pronto mientras escribo siguiente y luego imprimir y, 466 00:18:53,350 --> 00:18:55,640 se inicializa a el valor que quiero. 467 00:18:55,640 --> 00:18:57,400 Así que ahora, vamos a seguir adelante un poco más rápido. 468 00:18:57,400 --> 00:18:58,540 N para el siguiente. 469 00:18:58,540 --> 00:18:59,570 Vamos a hacerlo de nuevo. 470 00:18:59,570 --> 00:19:00,530 Vamos a hacerlo de nuevo. 471 00:19:00,530 --> 00:19:02,404 Pero yo no quiero golpear aquí, porque si 472 00:19:02,404 --> 00:19:05,110 querer ver lo que está pasando en el interior de intercambio, lo que es el comando? 473 00:19:05,110 --> 00:19:05,520 >> AUDIENCIA: pasos. 474 00:19:05,520 --> 00:19:06,436 >> DAVID J. MALAN: pasos. 475 00:19:06,436 --> 00:19:09,800 Así que esto me mete en un función, en lugar de sobre ella. 476 00:19:09,800 --> 00:19:12,270 Y ahora, que es un poco críptico honestamente, pero esto es sólo 477 00:19:12,270 --> 00:19:14,581 me dice que estoy en la línea 33 ahora. 478 00:19:14,581 --> 00:19:15,580 Y vamos a hacer esto de nuevo. 479 00:19:15,580 --> 00:19:16,080 Temp impresión. 480 00:19:16,080 --> 00:19:17,129 481 00:19:17,129 --> 00:19:20,170 Valor basura, negativo esta vez, pero eso es sólo todavía un valor basura. 482 00:19:20,170 --> 00:19:22,810 Así que vamos a hacer a continuación, la temperatura de impresión. 483 00:19:22,810 --> 00:19:27,130 Se inicializa a 1, lo cual era el valor de x, también conocido como una. 484 00:19:27,130 --> 00:19:29,110 >> Ahora, ¿dónde están nuestros A y X viene? 485 00:19:29,110 --> 00:19:32,510 Pues bien, advertimos en principal, llamado a estos valores x e y. 486 00:19:32,510 --> 00:19:34,740 A continuación, pasamos a intercambiar la siguiente manera. 487 00:19:34,740 --> 00:19:37,010 X fue primero, coma y. 488 00:19:37,010 --> 00:19:40,020 Y entonces, de intercambio podría llamarlos xe y. 489 00:19:40,020 --> 00:19:42,630 Pero para mayor claridad, es llamándolos a y b. 490 00:19:42,630 --> 00:19:45,970 Pero ayb ahora van a ser copias de x e y, respectivamente. 491 00:19:45,970 --> 00:19:50,660 >> Así que si vuelvo a GDB, temp es ahora un año y es ahora uno. 492 00:19:50,660 --> 00:19:56,130 Pero si lo hago al lado y ahora hacer de impresión A, A ya se ha movido más. 493 00:19:56,130 --> 00:20:00,030 La leche ha sido derramado en la antigua el vaso de zumo de naranja, o viceversa. 494 00:20:00,030 --> 00:20:04,750 >> Y si hago lo siguiente otra vez, y ahora si imprimo como una comprobación de validez, 495 00:20:04,750 --> 00:20:07,687 una sigue siendo dos, pero b es ahora uno. 496 00:20:07,687 --> 00:20:08,770 Francamente, todavía está allí. 497 00:20:08,770 --> 00:20:10,670 No me importa lo que la temperatura es. 498 00:20:10,670 --> 00:20:16,850 Pero tan pronto como ahora escribo, digamos, continúe a volver, ahora estoy en el final 499 00:20:16,850 --> 00:20:17,480 el programa. 500 00:20:17,480 --> 00:20:20,730 Y, por desgracia, x es siendo uno e y sigue siendo dos. 501 00:20:20,730 --> 00:20:22,272 >> Entonces, ¿cuál era la utilidad de GDB allí? 502 00:20:22,272 --> 00:20:23,980 No ayudó a arreglarlo el problema per se, 503 00:20:23,980 --> 00:20:26,265 pero espero que me ayude entenderlo realizando 504 00:20:26,265 --> 00:20:30,000 eso sí, mi lógica es correcta, pero mi código es no tener en última instancia 505 00:20:30,000 --> 00:20:31,450 un impacto permanente. 506 00:20:31,450 --> 00:20:34,570 Así que eso es un problema que estamos va a resolver ahora hoy. 507 00:20:34,570 --> 00:20:37,870 >> Pero vamos a llegar allí a través de este. 508 00:20:37,870 --> 00:20:39,230 La cadena es una mentira. 509 00:20:39,230 --> 00:20:41,860 Es, también, no un tipo de datos que existe en C. Es 510 00:20:41,860 --> 00:20:44,750 sido sinónimo de algunos tiempo para otra cosa, 511 00:20:44,750 --> 00:20:47,300 y podemos revelar que como sigue. 512 00:20:47,300 --> 00:20:53,282 >> Déjame ir por delante y abro Un programa llamado compara-0. 513 00:20:53,282 --> 00:20:56,240 Y en lugar de escribir éste hacia fuera, vamos a empezar a caminar a través del código 514 00:20:56,240 --> 00:20:58,040 Ya he escrito, pero es sólo unas pocas líneas. 515 00:20:58,040 --> 00:20:59,570 Así que esto se compara-0. 516 00:20:59,570 --> 00:21:02,380 Y lo primero que estoy haciendo es conseguir una línea de texto. 517 00:21:02,380 --> 00:21:05,610 >> Pero noto lo que estoy haciendo por primera vez. 518 00:21:05,610 --> 00:21:07,910 Lo que es diferente con claridad acerca de la línea 21? 519 00:21:07,910 --> 00:21:10,020 520 00:21:10,020 --> 00:21:11,402 De hecho, espera un minuto. 521 00:21:11,402 --> 00:21:12,110 Esta es la copia de dos. 522 00:21:12,110 --> 00:21:13,568 Eso no es ni siquiera el programa adecuado. 523 00:21:13,568 --> 00:21:14,780 Muy bien, spoiler alert. 524 00:21:14,780 --> 00:21:16,890 Muy bien, así que no importa que. 525 00:21:16,890 --> 00:21:18,520 Esa es la respuesta a una pregunta futuro. 526 00:21:18,520 --> 00:21:21,450 >> Aquí se compara-0, y estoy a punto de conseguir una línea de texto. 527 00:21:21,450 --> 00:21:22,435 De mucho más simple programa. 528 00:21:22,435 --> 00:21:23,560 Así que esto es sencillo. 529 00:21:23,560 --> 00:21:28,070 Esto es como la Semana Uno, Semana Dos cosas En el momento. string s = GetString. 530 00:21:28,070 --> 00:21:29,700 Ahora, lo digo de nuevo aquí. 531 00:21:29,700 --> 00:21:31,830 cadena t = GetString. 532 00:21:31,830 --> 00:21:35,300 Y luego, la última cosa en este programa, como su nombre indica, 533 00:21:35,300 --> 00:21:37,090 es que me voy a tratar de compararlas. 534 00:21:37,090 --> 00:21:40,709 >> Así que si s, la primera cadena, es igual a = t, entonces yo soy 535 00:21:40,709 --> 00:21:42,250 va a decir que escribe lo mismo. 536 00:21:42,250 --> 00:21:44,291 Si no, yo voy a decir escribe cosas diferentes. 537 00:21:44,291 --> 00:21:45,880 Así que vamos a compilar y ejecutar este programa. 538 00:21:45,880 --> 00:21:48,481 Así que compara cero. 539 00:21:48,481 --> 00:21:48,980 Se ve bien. 540 00:21:48,980 --> 00:21:50,490 No hay errores de compilación. 541 00:21:50,490 --> 00:21:52,386 >> Déjame ir por delante ahora y escriba ./compare-0. 542 00:21:52,386 --> 00:21:55,230 543 00:21:55,230 --> 00:21:59,220 Déjenme seguir adelante y decir algo : Daven y algo: Rob. 544 00:21:59,220 --> 00:22:00,450 Y escribo cosas diferentes. 545 00:22:00,450 --> 00:22:01,250 Hasta ahora, todo bien. 546 00:22:01,250 --> 00:22:02,680 Programa parece ser correcta. 547 00:22:02,680 --> 00:22:03,880 >> Pero vamos a correr de nuevo. 548 00:22:03,880 --> 00:22:05,800 Decir algo: Gabe. 549 00:22:05,800 --> 00:22:07,140 Decir algo: Gabe. 550 00:22:07,140 --> 00:22:08,520 551 00:22:08,520 --> 00:22:09,020 Bien. 552 00:22:09,020 --> 00:22:10,851 Tal vez me golpeó la barra espaciadora o algo funky. 553 00:22:10,851 --> 00:22:11,600 Vamos a hacerlo de nuevo. 554 00:22:11,600 --> 00:22:13,020 Así 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 Diferentes cosas. 559 00:22:17,330 --> 00:22:19,430 Entonces, ¿qué está pasando? 560 00:22:19,430 --> 00:22:23,200 >> Así que tenemos estas dos líneas de código, GetString se llama dos veces. 561 00:22:23,200 --> 00:22:25,760 Y entonces, estoy simplemente tratar de comparar s y t. 562 00:22:25,760 --> 00:22:28,370 Pero lo que realmente está pasando entonces? 563 00:22:28,370 --> 00:22:31,180 Bueno, acerca de mi puño y letra a carnicero este ejemplo algo. 564 00:22:31,180 --> 00:22:34,630 Y seamos realmente tiran esto aquí, también. 565 00:22:34,630 --> 00:22:37,390 566 00:22:37,390 --> 00:22:45,712 >> Así que tenemos una línea como string s = GetString. 567 00:22:45,712 --> 00:22:48,295 Así que eso es simplemente la primera interesante línea de ese programa. 568 00:22:48,295 --> 00:22:49,920 569 00:22:49,920 --> 00:22:52,974 Pero lo que todo este tiempo ha sido pasando por debajo de la capucha? 570 00:22:52,974 --> 00:22:55,890 Bueno, en la izquierda lateral es una cadena, que es algún tipo de variable, 571 00:22:55,890 --> 00:22:56,785 y se llama s. 572 00:22:56,785 --> 00:23:00,019 Así que sé que esto es usar la memoria, o RAM, en mi equipo de alguna manera. 573 00:23:00,019 --> 00:23:02,060 Así que voy a abstractamente dibujar que como un cuadrado. 574 00:23:02,060 --> 00:23:04,820 32 bits, resulta, pero más sobre esto en el futuro. 575 00:23:04,820 --> 00:23:06,410 Y entonces, ¿qué está pasando aquí? 576 00:23:06,410 --> 00:23:08,700 >> Bueno, obviamente GetString para crear una cadena del usuario. 577 00:23:08,700 --> 00:23:11,360 Y GetString consiguió Zamyla o Gabe o Daven. 578 00:23:11,360 --> 00:23:14,640 Así que vamos a elegir la primera de esos, que era Daven. 579 00:23:14,640 --> 00:23:19,174 Así que efectivamente, lo consiguió GetString mí en ese primer caso era D-a-v-s-n. 580 00:23:19,174 --> 00:23:22,690 581 00:23:22,690 --> 00:23:25,045 Y entonces, ¿qué otra cosa hizo que me da en secreto? 582 00:23:25,045 --> 00:23:25,920 AUDIENCIA: [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 Así que me dio efectivamente una cadena. 585 00:23:30,550 --> 00:23:34,550 Pero ya sabemos de anteriores Parece que una cadena es simplemente un arreglo 586 00:23:34,550 --> 00:23:37,895 de caracteres, y se termina por este carácter especial centinela, / 0. 587 00:23:37,895 --> 00:23:39,220 588 00:23:39,220 --> 00:23:42,310 >> Pero si esto es cierto y esto es un cuadrado, 589 00:23:42,310 --> 00:23:44,160 esto es claramente un rectángulo mucho más grande. 590 00:23:44,160 --> 00:23:46,830 Y, de hecho, esto es, Yo reclamo, sólo 32 bits. 591 00:23:46,830 --> 00:23:49,500 Y esto es claramente más de 32 bits, ya que esta es probablemente 592 00:23:49,500 --> 00:23:51,583 ocho más ocho más ocho más ocho más ocho, 593 00:23:51,583 --> 00:23:53,320 sólo porque de bytes en ASCII. 594 00:23:53,320 --> 00:23:57,030 ¿Cómo diablos vamos a caber Daven en este pequeño cuadro aquí? 595 00:23:57,030 --> 00:23:59,880 >> Bueno, lo que está haciendo en realidad GetString? 596 00:23:59,880 --> 00:24:03,680 Bueno, esta cuadrícula representa aquí de memoria o la memoria RAM del ordenador. 597 00:24:03,680 --> 00:24:07,564 Así que vamos a decir que si arbitrariamente cada uno de ellos representa un byte, 598 00:24:07,564 --> 00:24:09,730 entonces podemos pensar en cada byte como teniendo una dirección, 599 00:24:09,730 --> 00:24:13,830 como 33 Oxford Street, o 34 Oxford Street, o 35 Oxford Street. 600 00:24:13,830 --> 00:24:16,700 >> Así que al igual que las casas tienen direcciones y los edificios tienen direcciones, 601 00:24:16,700 --> 00:24:19,810 también lo hacen bytes individuales de memoria tiene direcciones o números 602 00:24:19,810 --> 00:24:21,042 que la identificación exclusiva de ellos. 603 00:24:21,042 --> 00:24:22,000 Ahora, esto es arbitrario. 604 00:24:22,000 --> 00:24:25,370 Pero que sea sencillo, que voy a utilizar hexadecimal sólo por convención, 605 00:24:25,370 --> 00:24:28,200 pero el 0x no significa otra cosa que "este es hexadecimal." 606 00:24:28,200 --> 00:24:31,030 y yo voy a afirmar que el "D" termina en Byte One en la memoria. 607 00:24:31,030 --> 00:24:34,210 >> No tengo nada más que hacer en memoria, por lo Daven obtuvo el primer lugar 608 00:24:34,210 --> 00:24:35,509 Uno de Byte. 609 00:24:35,509 --> 00:24:36,800 Esto, entonces, va a ser 0x2. 610 00:24:36,800 --> 00:24:37,831 611 00:24:37,831 --> 00:24:38,705 Esto va a 0x3. 612 00:24:38,705 --> 00:24:39,840 613 00:24:39,840 --> 00:24:41,800 Esto va a ser 0x4. 614 00:24:41,800 --> 00:24:43,025 Esto va a 0x5. 615 00:24:43,025 --> 00:24:44,025 Esto va a ser 0x6. 616 00:24:44,025 --> 00:24:45,560 617 00:24:45,560 --> 00:24:48,290 >> Pero una vez que empezar a pensar acerca de lo que está haciendo el equipo 618 00:24:48,290 --> 00:24:50,710 debajo de la campana, usted puede comenzar a inferir 619 00:24:50,710 --> 00:24:54,960 cómo, hace unos años, lo haría han implementado C sí. 620 00:24:54,960 --> 00:24:58,360 ¿Qué es GetString probablemente returning-- porque 621 00:24:58,360 --> 00:25:00,946 se siente como que no es volver Daven, per se, 622 00:25:00,946 --> 00:25:03,320 porque seguramente no va para encajar en este pequeño box-- 623 00:25:03,320 --> 00:25:05,090 así que lo que se GetString probablemente regresando? 624 00:25:05,090 --> 00:25:07,958 625 00:25:07,958 --> 00:25:08,920 >> AUDIENCIA: [inaudible] 626 00:25:08,920 --> 00:25:10,540 >> DAVID J. MALAN: La ubicación de Daven. 627 00:25:10,540 --> 00:25:12,770 Y ha estado haciendo esto desde la semana uno. 628 00:25:12,770 --> 00:25:16,150 ¿Qué es realmente GetString volver no es una cadena, per se. 629 00:25:16,150 --> 00:25:17,780 Esa es una de las mentiras piadosas. 630 00:25:17,780 --> 00:25:22,520 Se devuelve la dirección de la cadena en la memoria, la dirección única. 631 00:25:22,520 --> 00:25:24,820 Daven vive en 33 Oxford Street. 632 00:25:24,820 --> 00:25:29,310 Pero de forma más sucinta, Gavin vive en 0x1, Dirección Número Uno. 633 00:25:29,310 --> 00:25:32,280 >> Así que lo que se puso en este pequeña caja a continuación, para ser claros, 634 00:25:32,280 --> 00:25:35,930 es sólo la dirección de esa cadena. 635 00:25:35,930 --> 00:25:38,110 Así que todo este tiempo, este que ha estado sucediendo. 636 00:25:38,110 --> 00:25:41,650 Pero lo que esto apunta a ahora es que si todo s tiene 637 00:25:41,650 --> 00:25:44,710 es un número dentro de ella, que es para detenerte, el programador, 638 00:25:44,710 --> 00:25:47,970 de poner cualquier número en cualquier variable y sólo saltar 639 00:25:47,970 --> 00:25:49,080 a ese trozo de memoria? 640 00:25:49,080 --> 00:25:51,320 Y, de hecho, ya veremos eso es una amenaza próxima vez. 641 00:25:51,320 --> 00:25:53,500 >> Pero por ahora, esto se siente insuficiente. 642 00:25:53,500 --> 00:25:55,630 Si digo, conseguirme un cadena, dame Daven. 643 00:25:55,630 --> 00:25:57,230 Pero en realidad no me das Daven. 644 00:25:57,230 --> 00:25:59,310 Todo lo que me das es la dirección de Daven. 645 00:25:59,310 --> 00:26:04,310 ¿Cómo puedo entonces sé con seguridad donde Daven comienza y ends-- 646 00:26:04,310 --> 00:26:07,140 la historia de conseguir weird-- donde Daven comienza y termina, 647 00:26:07,140 --> 00:26:10,435 y, a continuación, el siguiente cadena en la memoria comienza? 648 00:26:10,435 --> 00:26:11,520 649 00:26:11,520 --> 00:26:13,620 >> Bueno, si usted está entregando me al principio de Daven, 650 00:26:13,620 --> 00:26:17,230 en esencia, ¿cómo puedo saber donde al final de su nombre es? 651 00:26:17,230 --> 00:26:20,550 Ese carácter nulo especial, que es aún más importante ahora 652 00:26:20,550 --> 00:26:23,040 Si cuerdas debajo de la campana son simplemente identifica 653 00:26:23,040 --> 00:26:25,820 de forma única por su ubicación en la memoria. 654 00:26:25,820 --> 00:26:28,130 Así que todo este tiempo, que es lo que ha estado pasando. 655 00:26:28,130 --> 00:26:32,470 >> Así que cuando nos fijamos ahora en el código aquí, explicar 656 00:26:32,470 --> 00:26:35,790 si lo haría el error en la línea 26. 657 00:26:35,790 --> 00:26:39,560 ¿Por qué es Zamyla y Zamyla diferente? 658 00:26:39,560 --> 00:26:41,330 ¿Por qué es Gabe Gabe y diferente? 659 00:26:41,330 --> 00:26:42,154 Sí, en la parte trasera. 660 00:26:42,154 --> 00:26:43,390 >> AUDIENCIA: Tienen diferentes direcciones. 661 00:26:43,390 --> 00:26:45,931 >> DAVID J. MALAN: Simplemente porque tienen diferentes direcciones. 662 00:26:45,931 --> 00:26:48,820 Porque cuando usted llama GetString de nuevo, lo que voy a hacer rápidamente aquí, 663 00:26:48,820 --> 00:26:52,870 si esta es la segunda línea, cadena t, como lo hice en ese programa, 664 00:26:52,870 --> 00:26:55,030 es igual a otra llamada a GetString. 665 00:26:55,030 --> 00:26:56,370 666 00:26:56,370 --> 00:26:58,670 La próxima vez que llamo GetString, voy 667 00:26:58,670 --> 00:27:00,190 para obtener un trozo diferente de la memoria. 668 00:27:00,190 --> 00:27:02,220 >> GetString se permite preguntar al operativo 669 00:27:02,220 --> 00:27:03,800 sistema para obtener más y más memoria. 670 00:27:03,800 --> 00:27:07,894 No va a volver a utilizar la misma seis bytes cada vez. 671 00:27:07,894 --> 00:27:09,810 Se va a obtener un nuevo trozo de memoria, que 672 00:27:09,810 --> 00:27:12,780 significa t va a conseguir algún otro valor aquí. 673 00:27:12,780 --> 00:27:15,380 >> Así que cuando lo hago s es igual a = t, que no está comparando 674 00:27:15,380 --> 00:27:17,880 D y A en contra de este contra esto y V contra de esto. 675 00:27:17,880 --> 00:27:19,588 Usted está comparando este en contra de esta, que 676 00:27:19,588 --> 00:27:24,020 francamente es bastante useless-- useful-- es bastante inútil, ya que realmente 677 00:27:24,020 --> 00:27:25,830 le importa donde las cuerdas están en la memoria? 678 00:27:25,830 --> 00:27:26,850 >> Y, de hecho, no lo hemos hecho. 679 00:27:26,850 --> 00:27:28,980 Y no vamos a iniciar particularmente cuidado. 680 00:27:28,980 --> 00:27:34,180 Sólo en la medida en que pueden surgir errores y las amenazas de seguridad pueden surgir voluntad 681 00:27:34,180 --> 00:27:36,100 que en realidad empezamos a preocuparse por esto. 682 00:27:36,100 --> 00:27:37,230 Así que vamos a arreglar este problema. 683 00:27:37,230 --> 00:27:39,650 Resulta que, a solucionarlo súper simple. 684 00:27:39,650 --> 00:27:42,600 >> Y vamos realidad, antes de que yo revelan que una vez más, lo que haría 685 00:27:42,600 --> 00:27:47,170 que hacer si en una clase CS50, y ha tenido que poner en práctica 686 00:27:47,170 --> 00:27:48,600 una comparación con dos cadenas. 687 00:27:48,600 --> 00:27:51,440 Usted claramente no sólo puede utilizar s es igual a = t. 688 00:27:51,440 --> 00:27:54,090 Pero así, lógicamente, cómo compararía esta cadena 689 00:27:54,090 --> 00:27:56,370 contra esta cadena utilizando código C? 690 00:27:56,370 --> 00:27:56,880 Sí. 691 00:27:56,880 --> 00:27:58,780 >> AUDIENCIA: Sólo hacer el de lazo [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 AUDIENCIA: [inaudible] 695 00:28:02,900 --> 00:28:03,310 DAVID J. MALAN: Si. 696 00:28:03,310 --> 00:28:05,390 Sólo tiene que utilizar un bucle for o un while o lo que sea. 697 00:28:05,390 --> 00:28:08,710 Pero solo se aplica la idea básica de que si este es un trozo de memoria o una matriz 698 00:28:08,710 --> 00:28:11,590 y esto es, iterar sobre ambos al mismo tiempo. 699 00:28:11,590 --> 00:28:12,960 Y justo comparar las letras. 700 00:28:12,960 --> 00:28:14,260 >> Y tienes que ser un poco cuidado, porque 701 00:28:14,260 --> 00:28:16,247 no quieren un dedo para ir más allá de la otra 702 00:28:16,247 --> 00:28:18,080 porque una cadena es ya que el otro. 703 00:28:18,080 --> 00:28:21,380 Así que vas a querer comprobar si hay Este valor especial al final, null. 704 00:28:21,380 --> 00:28:24,017 Pero lo que realmente es, en el final, tan simple como eso. 705 00:28:24,017 --> 00:28:26,100 Y, francamente, no necesitamos reinventar la rueda. 706 00:28:26,100 --> 00:28:27,960 Aquí está la versión dos. 707 00:28:27,960 --> 00:28:32,910 Y lo que voy a decir aquí es que en lugar de comparar s es igual a = t, 708 00:28:32,910 --> 00:28:38,964 Estoy en vez de ir a decir, si la cadena comparación de coma s es igual a t = 0. 709 00:28:38,964 --> 00:28:40,130 Ahora, lo que se compara la cadena? 710 00:28:40,130 --> 00:28:43,046 >> Resulta, que es una función que viene con C, cuyo propósito en la vida 711 00:28:43,046 --> 00:28:44,650 es comparar dos cadenas. 712 00:28:44,650 --> 00:28:48,300 Y revuelva comparar, si leemos su página de manual o documentación o CS50 713 00:28:48,300 --> 00:28:50,630 referencia, lo hará simplemente decirles que revuelo 714 00:28:50,630 --> 00:28:55,730 comparar los rendimientos, ya sea un cable negativo número o un número positivo o cero, 715 00:28:55,730 --> 00:28:57,660 donde cero significa que son iguales. 716 00:28:57,660 --> 00:28:58,570 >> Así que sólo conjeturas. 717 00:28:58,570 --> 00:29:00,390 ¿Qué podría significar si revuelva retornos comparar 718 00:29:00,390 --> 00:29:02,110 valor negativo o el valor positivo? 719 00:29:02,110 --> 00:29:02,785 720 00:29:02,785 --> 00:29:04,285 AUDIENCIA: Mayor o menor que. 721 00:29:04,285 --> 00:29:05,570 DAVID J. MALAN: Sí, mayor que o menor que. 722 00:29:05,570 --> 00:29:08,640 Así que si queremos ordenar su conjunto manojo de cuerdas en un dictionary-- 723 00:29:08,640 --> 00:29:12,975 como lo haremos con el tiempo por la road-- función perfecta para usar potencialmente, 724 00:29:12,975 --> 00:29:15,850 porque va a hacer que comparación de cadenas para usted, y decirle 725 00:29:15,850 --> 00:29:20,060 usted hace una viene antes de b, o hace b venir antes de un orden alfabético. 726 00:29:20,060 --> 00:29:21,490 Podemos hacer exactamente eso. 727 00:29:21,490 --> 00:29:23,620 >> Y note que hice otro cosa en este ejemplo. 728 00:29:23,620 --> 00:29:26,870 ¿Qué más ha cambiado más alta en esta función 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 Y es que otra mentira blanca. 732 00:29:31,150 --> 00:29:33,750 Durante todo este tiempo, cuando has estado escribiendo cadena, 733 00:29:33,750 --> 00:29:38,350 hemos estado reescribiendo en secreto cadena como char * para que clang realidad 734 00:29:38,350 --> 00:29:39,270 usted entiende. 735 00:29:39,270 --> 00:29:42,450 >> En otras palabras, en CS50.h y como veremos finalmente vemos, 736 00:29:42,450 --> 00:29:45,950 hicimos una cadena de sinónimos en llamada eso es lo mismo que char *. 737 00:29:45,950 --> 00:29:49,910 Y por ahora, sólo saber que el *, En este contexto, por lo menos, 738 00:29:49,910 --> 00:29:51,286 significa la dirección. 739 00:29:51,286 --> 00:29:52,210 >> La dirección de qué? 740 00:29:52,210 --> 00:29:56,390 Bueno, el hecho de que te dije char *, y no int * o flotar *, 741 00:29:56,390 --> 00:30:00,820 significa que char * es la dirección de un char. 742 00:30:00,820 --> 00:30:06,770 Así que este pequeño cuadro aquí, también conocido como cadena, es realmente de tipo char *, 743 00:30:06,770 --> 00:30:10,490 que es simplemente una manera elegante de decir, En este cuadro se destinará una dirección. 744 00:30:10,490 --> 00:30:12,430 ¿Y qué hace que la dirección se refiere? 745 00:30:12,430 --> 00:30:13,780 Al parecer, un char. 746 00:30:13,780 --> 00:30:16,410 >> Pero pudimos absolutamente tener int * y otras cosas. 747 00:30:16,410 --> 00:30:20,790 Pero por ahora, char * es realmente el más sencillo y uno de interés. 748 00:30:20,790 --> 00:30:23,310 Así que este problema se va aumentando, aunque, de nuevo. 749 00:30:23,310 --> 00:30:24,830 >> Supongamos que yo abro este programa. 750 00:30:24,830 --> 00:30:27,670 A ver si ahora podemos predecir lo que está mal con este código. 751 00:30:27,670 --> 00:30:31,140 Así que en este programa, copiar-0, estoy va a seguir adelante y llamar de nuevo 752 00:30:31,140 --> 00:30:34,190 GetString y almacenar el valor en s. 753 00:30:34,190 --> 00:30:38,800 >> Y entonces, ¿por qué estoy haciendo esto, sólo como un recordatorio de la semana pasada? 754 00:30:38,800 --> 00:30:40,960 Hicimos decir que GetString a veces devuelve null. 755 00:30:40,960 --> 00:30:42,793 ¿Qué significa si GetString devuelve null? 756 00:30:42,793 --> 00:30:45,040 757 00:30:45,040 --> 00:30:46,034 Algo salió mal. 758 00:30:46,034 --> 00:30:48,950 Probablemente significa la cadena es demasiado grande, fuera de la computadora de la memoria. 759 00:30:48,950 --> 00:30:51,724 Sucede super, super, super rara vez, pero podría suceder. 760 00:30:51,724 --> 00:30:53,890 Queremos encontrarlo, y eso es todo lo que estamos haciendo. 761 00:30:53,890 --> 00:30:57,910 >> Porque vamos a ver ahora, si no lo hace empezar a comprobar habitualmente por las cosas 762 00:30:57,910 --> 00:31:00,870 como nulo, que te pueden en realidad empezar a ir 763 00:31:00,870 --> 00:31:03,106 a direcciones de memoria que no son válidos. 764 00:31:03,106 --> 00:31:05,980 Y usted va a empezar a inducir más y más violaciones de segmento. 765 00:31:05,980 --> 00:31:08,360 O en un Mac o un PC, simplemente hacer que un ordenador para colgar 766 00:31:08,360 --> 00:31:10,340 o un programa para congelar, potencialmente. 767 00:31:10,340 --> 00:31:14,930 >> Así que ahora, yo reclamo en copia-0.c, que Voy a copiar estas cadenas a modo 768 00:31:14,930 --> 00:31:15,685 de la línea 28. 769 00:31:15,685 --> 00:31:16,850 770 00:31:16,850 --> 00:31:18,750 Y entonces, me voy para reclamar en la parte inferior 771 00:31:18,750 --> 00:31:21,430 aquí que voy para cambiar uno de ellos. 772 00:31:21,430 --> 00:31:22,330 >> Así notar esto. 773 00:31:22,330 --> 00:31:24,370 Voy a llamar a nuestro viejo amigo strlen. 774 00:31:24,370 --> 00:31:28,960 Y sólo explicar en Inglés lo que esta línea 34 está haciendo? 775 00:31:28,960 --> 00:31:32,480 ¿Qué soporte t 0 representar a la izquierda. 776 00:31:32,480 --> 00:31:32,980 Sí. 777 00:31:32,980 --> 00:31:34,339 >> AUDIENCIA: 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 Eso es todo. 780 00:31:36,379 --> 00:31:40,024 El primer carácter de t, quiero para asignar la versión mayú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 Así que esta es la capitalización la primera letra. 783 00:31:43,200 --> 00:31:46,340 Y luego, lo último que hago en este programa es que pretendo aquí es 784 00:31:46,340 --> 00:31:50,340 el original, es, y aquí está la copia, t. 785 00:31:50,340 --> 00:31:54,610 >> Pero en base a la historia que acabamos de hablado de lo que realmente son las cadenas, 786 00:31:54,610 --> 00:31:57,520 lo que es realmente la línea 28 haciendo, y lo que es 787 00:31:57,520 --> 00:31:59,405 el fallo que resulta ir para estar en la pantalla? 788 00:31:59,405 --> 00:32:01,300 789 00:32:01,300 --> 00:32:03,500 >> Así que primero, la primera pregunta, 28. 790 00:32:03,500 --> 00:32:09,040 ¿Qué es String t = s haciendo en realidad? 791 00:32:09,040 --> 00:32:16,430 Si tenemos en la mano izquierda lado aquí string t = s; 792 00:32:16,430 --> 00:32:19,400 eso me da una caja aquí y una caja aquí. 793 00:32:19,400 --> 00:32:25,530 Y supongamos que esta dirección es 0x, digamos, 50 esta vez, de manera arbitraria. 794 00:32:25,530 --> 00:32:28,847 ¿Qué cadena de t = s hacer debajo de la capucha? 795 00:32:28,847 --> 00:32:30,340 >> AUDIENCIA: [inaudible] 796 00:32:30,340 --> 00:32:34,100 >> DAVID J. MALAN: Almacena la memoria abordan allí, así 0x50 va allí. 797 00:32:34,100 --> 00:32:37,980 Así que si ahora, voy a la primera personaje en t y mayúsculas que, 798 00:32:37,980 --> 00:32:39,535 ¿qué estoy haciendo con eficacia para s? 799 00:32:39,535 --> 00:32:41,300 800 00:32:41,300 --> 00:32:43,450 Realmente estoy haciendo lo mismo, ¿verdad? 801 00:32:43,450 --> 00:32:47,680 Porque si Dirección 0x50-- y justo, me no tienen mucho espacio en el tablero aquí, 802 00:32:47,680 --> 00:32:51,750 pero asumir que esto es 0x50 aquí abajo, en algún lugar de la memoria de mi ordenador. 803 00:32:51,750 --> 00:32:55,825 >> Y he, por ejemplo, Gabe en minúscula aquí, así. 804 00:32:55,825 --> 00:32:57,120 805 00:32:57,120 --> 00:33:01,980 Y he dicho soporte t 0 consigue capitalizados. 806 00:33:01,980 --> 00:33:04,860 Bueno, t 0 es el soporte la primera letra t. 807 00:33:04,860 --> 00:33:07,840 Tan poco g va a convertido en un gran G. Pero el problema 808 00:33:07,840 --> 00:33:09,410 se, lo que no s también señalar? 809 00:33:09,410 --> 00:33:10,300 >> AUDIENCIA: La misma. 810 00:33:10,300 --> 00:33:11,841 >> DAVID J. MALAN: Exactamente lo mismo. 811 00:33:11,841 --> 00:33:16,342 Así que una simple explicación tal vez, incluso si la sintaxis es un poco raro. 812 00:33:16,342 --> 00:33:17,050 Así que vamos a hacer esto. 813 00:33:17,050 --> 00:33:20,210 Hacer copia-0 y luego ./copy-0. 814 00:33:20,210 --> 00:33:21,820 815 00:33:21,820 --> 00:33:24,110 Decir algo: Gabe. 816 00:33:24,110 --> 00:33:26,760 Y, por desgracia, tanto de ellos ahora se han capitalizado, 817 00:33:26,760 --> 00:33:29,500 pero para ese subyacente razón por la que estamos simplemente 818 00:33:29,500 --> 00:33:32,350 ahora se trata de direcciones. 819 00:33:32,350 --> 00:33:36,470 >> Entonces, ¿cómo comenzamos a address-- sin doble intended-- 820 00:33:36,470 --> 00:33:39,270 ¿cómo empezamos a abordar este problema en particular? 821 00:33:39,270 --> 00:33:44,400 Bueno, en copy1.c, las cosas van a ser un poco más complicado. 822 00:33:44,400 --> 00:33:49,310 Pero me gustaría reclamar un solución conceptualmente simple. 823 00:33:49,310 --> 00:33:50,852 >> Tan difícil de conseguir a primera vista. 824 00:33:50,852 --> 00:33:53,560 No va a ser fácil para el primer vez que escriba a cabo, tal vez, 825 00:33:53,560 --> 00:33:57,440 pero si el problema es que simplemente haciendo t = s sólo 826 00:33:57,440 --> 00:33:59,694 copia la dirección, lo que, de nuevo si puedo escoger en usted, 827 00:33:59,694 --> 00:34:02,110 va a ser la solución para copiar realmente una cadena? 828 00:34:02,110 --> 00:34:04,906 829 00:34:04,906 --> 00:34:06,770 >> AUDIENCIA: Nosotros probablemente utilizar un bucle de nuevo. 830 00:34:06,770 --> 00:34:06,890 >> DAVID J. MALAN: Si. 831 00:34:06,890 --> 00:34:08,390 Así que vamos a necesitar un bucle de nuevo. 832 00:34:08,390 --> 00:34:11,800 Y porque si queremos copiar una cadena s en otra cadena, 833 00:34:11,800 --> 00:34:14,120 probablemente queremos hacerlo carácter por carácter. 834 00:34:14,120 --> 00:34:17,199 Pero el problema es, si este es un principio s, 835 00:34:17,199 --> 00:34:22,159 ahora tenemos que empezar de forma explícita la asignación de memoria para t. 836 00:34:22,159 --> 00:34:24,320 >> En otras palabras, vamos redibujar esta última vez. 837 00:34:24,320 --> 00:34:28,659 Si esta es string s = GetString. 838 00:34:28,659 --> 00:34:30,956 839 00:34:30,956 --> 00:34:32,455 Y vamos a poner esto aquí, también. 840 00:34:32,455 --> 00:34:36,639 841 00:34:36,639 --> 00:34:37,420 Esto es GetString. 842 00:34:37,420 --> 00:34:39,070 843 00:34:39,070 --> 00:34:43,860 Y entonces, la imagen de algo así que va a ser como antes, 844 00:34:43,860 --> 00:34:44,360 g-a-b-e / 0. 845 00:34:44,360 --> 00:34:47,294 846 00:34:47,294 --> 00:34:48,960 Eso se ve un poco de algo como esto. 847 00:34:48,960 --> 00:34:53,650 Y s, por lo tanto, nos llaman a este 0x50, y que va a ser 51, 52. 848 00:34:53,650 --> 00:34:54,409 >> Así que esto es 0x50. 849 00:34:54,409 --> 00:34:55,679 850 00:34:55,679 --> 00:34:59,690 Y luego, lo hago cadena t. 851 00:34:59,690 --> 00:35:02,450 En la memoria, que sólo va a dame una pequeña plaza como esta. 852 00:35:02,450 --> 00:35:04,080 Así que ¿cuál es el paso clave ahora? 853 00:35:04,080 --> 00:35:09,870 Si quiero copiar s en t, lo que blank qué necesitamos para llenar aquí? 854 00:35:09,870 --> 00:35:12,050 O lo que es lo que necesitamos hacer a un alto nivel? 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 Alguien? 859 00:35:17,020 --> 00:35:17,690 Sí. 860 00:35:17,690 --> 00:35:19,214 >> AUDIENCIA: Tenemos que [inaudible]. 861 00:35:19,214 --> 00:35:21,380 DAVID J. MALAN: Sí, deberán ingresar en este espacio en blanco. 862 00:35:21,380 --> 00:35:24,340 No puedo copiar y luego capitalizar el nombre de Gabe 863 00:35:24,340 --> 00:35:28,120 hasta que le pido al sistema operativo por otro trozo de memoria 864 00:35:28,120 --> 00:35:30,640 eso es por lo menos tan grande como el original. 865 00:35:30,640 --> 00:35:32,130 Así que nos deja con una pregunta. 866 00:35:32,130 --> 00:35:36,080 >> ¿Cómo solicito el sistema operativo no sólo por un pointer-- sencilla 867 00:35:36,080 --> 00:35:38,530 como esto se llama, una dirección, un no pointer-- 868 00:35:38,530 --> 00:35:40,980 por un poco simple caja como esto se llama una cadena? 869 00:35:40,980 --> 00:35:44,200 ¿Cómo solicito el operativo sistema para una gran parte de la memoria? 870 00:35:44,200 --> 00:35:48,430 Hasta ahora, sólo he conseguido que volver indirectamente llamando GetString. 871 00:35:48,430 --> 00:35:50,740 Entonces, ¿cómo se GetString incluso conseguir su memoria? 872 00:35:50,740 --> 00:35:53,430 >> Bueno, resulta que hay esta otra función aquí 873 00:35:53,430 --> 00:35:55,160 que ahora vamos a empezar a utilizar. 874 00:35:55,160 --> 00:35:59,780 Ahora, esto parece que-- manera más críptica y yo soy el único que puede ver it-- 875 00:35:59,780 --> 00:36:03,150 esta línea se ve mucho más críptico entonces debería a primera vista. 876 00:36:03,150 --> 00:36:04,650 Pero vamos a burles aparte. 877 00:36:04,650 --> 00:36:07,950 >> En el lado izquierdo, tengo char * t. 878 00:36:07,950 --> 00:36:13,280 Así que en Inglés, vamos a empezar a formular oraciones correctas en la jerga técnica. 879 00:36:13,280 --> 00:36:19,757 Así que esta es la asignación de un variable de tipo char * llama t. 880 00:36:19,757 --> 00:36:21,090 Ahora, ¿qué significa esto realmente? 881 00:36:21,090 --> 00:36:23,881 >> Bueno, eso significa, ¿qué voy para poner en esta variable llamada t? 882 00:36:23,881 --> 00:36:24,780 883 00:36:24,780 --> 00:36:26,402 Una dirección de un char. 884 00:36:26,402 --> 00:36:28,360 Así que eso es sólo el más simple, de manera más razonable 885 00:36:28,360 --> 00:36:29,930 de describir el lado izquierdo. 886 00:36:29,930 --> 00:36:32,890 Así que crea esta caja aquí solamente. 887 00:36:32,890 --> 00:36:34,760 Así que el lado derecho, presumiblemente, va 888 00:36:34,760 --> 00:36:37,170 asignar que más grande trozo de memoria, ¿cómo? 889 00:36:37,170 --> 00:36:38,340 Así que vamos a burlan de esta separación. 890 00:36:38,340 --> 00:36:41,131 >> Es abrumador a primera vista, pero lo que está pasando aquí dentro? 891 00:36:41,131 --> 00:36:43,740 En primer lugar, hay malloc, que aparentemente es nuestro nuevo amigo, 892 00:36:43,740 --> 00:36:45,450 "Memoria asignar." 893 00:36:45,450 --> 00:36:49,560 Así que este es el argumento que se pasa en ella, por lo que es un argumento bastante grande. 894 00:36:49,560 --> 00:36:50,970 Así que vamos a burlan de esta separación. 895 00:36:50,970 --> 00:36:53,410 >> strlen de s, por supuesto, representa el-- 896 00:36:53,410 --> 00:36:54,142 897 00:36:54,142 --> 00:36:55,600 AUDIENCIA: El número de caracteres. 898 00:36:55,600 --> 00:36:56,710 DAVID J. MALAN: Sólo el número de caracteres en s. 899 00:36:56,710 --> 00:36:59,040 Así la longitud de s, la cadena original. 900 00:36:59,040 --> 00:37:00,350 Así G-a-b-e. 901 00:37:00,350 --> 00:37:02,320 Así que es probable que cuatro en este caso. 902 00:37:02,320 --> 00:37:05,485 ¿Por qué hago después de 1 llamando strlen de s? 903 00:37:05,485 --> 00:37:06,360 AUDIENCIA: [inaudible] 904 00:37:06,360 --> 00:37:07,590 DAVID J. MALAN: Para que carácter especial nulo. 905 00:37:07,590 --> 00:37:11,260 Si me preguntan cuál es la longitud de El nombre de Gabe, yo voy a decir cuatro. 906 00:37:11,260 --> 00:37:14,480 Debajo del capó, sin embargo, tengo que que el quinto byte para el carácter nulo. 907 00:37:14,480 --> 00:37:16,100 Así que por eso estoy haciendo el 1. 908 00:37:16,100 --> 00:37:21,730 >> Ahora en caso de que está ejecutando este programa en un equipo que no sea, por ejemplo, 909 00:37:21,730 --> 00:37:24,610 el aparato CS50, donde el tamaño de un char 910 00:37:24,610 --> 00:37:26,350 podría ser diferente de mi propia computer-- 911 00:37:26,350 --> 00:37:30,590 resulta que yo puedo llamar a este sizeof operador, simplemente hacer que el equipo, 912 00:37:30,590 --> 00:37:32,870 lo que es del tamaño de un charlas en este equipo? 913 00:37:32,870 --> 00:37:37,400 >> Y multiplicando cinco en este ejemplo por el tamaño de un char, que 914 00:37:37,400 --> 00:37:40,440 en la mayoría de las computadoras sólo uno, malloc 915 00:37:40,440 --> 00:37:44,830 se va a asignar a mí esta gran trozo de memoria más de aquí a la derecha. 916 00:37:44,830 --> 00:37:47,140 Y va a return-- se trata de un function-- por lo que es 917 00:37:47,140 --> 00:37:48,265 va a volver a mí qué? 918 00:37:48,265 --> 00:37:50,914 919 00:37:50,914 --> 00:37:51,830 AUDIENCIA: ¿La dirección? 920 00:37:51,830 --> 00:37:53,709 DAVID J. MALAN: La dirección de qué? 921 00:37:53,709 --> 00:37:55,250 AUDIENCIA: De la memoria se asigna? 922 00:37:55,250 --> 00:37:56,450 DAVID J. MALAN: De la la memoria se asigna. 923 00:37:56,450 --> 00:37:59,189 Así que no tengo ni idea, francamente, dónde va a terminar. 924 00:37:59,189 --> 00:38:01,480 Voy a proponer que que va a terminar en 0x88. 925 00:38:01,480 --> 00:38:02,770 926 00:38:02,770 --> 00:38:06,009 Completamente arbitraria, pero en algún lugar que no sea 0x50, 927 00:38:06,009 --> 00:38:08,800 porque el sistema operativo, lo Windows y Mac OS hacen por mí, es 928 00:38:08,800 --> 00:38:11,230 asegurarse de que se está dando Me diferentes trozos de RAM. 929 00:38:11,230 --> 00:38:14,210 >> Así que este es el valor que esta trozo de memoria podría terminar. 930 00:38:14,210 --> 00:38:16,060 Así que esto es lo que termina aquí, 0x88. 931 00:38:16,060 --> 00:38:17,480 932 00:38:17,480 --> 00:38:21,570 Así que ahora claramente, puedo entender que esto no es lo mismo que esto, 933 00:38:21,570 --> 00:38:23,960 porque están señalando a diferentes fragmentos de memoria. 934 00:38:23,960 --> 00:38:29,980 Así que si ahora realmente quiero copiar este en, vamos a hacer su propuesta de solución. 935 00:38:29,980 --> 00:38:36,870 >> Vamos a ir, crear un bucle, y hacer t soporte i Obtiene s soporte de i. 936 00:38:36,870 --> 00:38:39,760 Porque ahora puedo usar este tipo array notación, 937 00:38:39,760 --> 00:38:43,390 porque a pesar de malloc muy genéricamente me asigna memoria, 938 00:38:43,390 --> 00:38:45,290 bytes de memoria es sólo contiguos. 939 00:38:45,290 --> 00:38:47,240 Byte, byte, byte, espalda con espalda con espalda. 940 00:38:47,240 --> 00:38:50,030 >> Puedo ciertamente como un programador tratarlo como una matriz, que 941 00:38:50,030 --> 00:38:55,090 significa que puedo usar esto finalmente familiarizado notación de sólo algunos corchetes. 942 00:38:55,090 --> 00:38:56,462 943 00:38:56,462 --> 00:39:00,020 >> Así que permítanme detenerme allí, porque esta es una gran cantidad de una sola vez, incluso 944 00:39:00,020 --> 00:39:03,530 aunque la idea básica para recapitular es esa cadena, todo este tiempo, 945 00:39:03,530 --> 00:39:05,550 no es un nuevo tipo de datos en sí. 946 00:39:05,550 --> 00:39:10,150 Es sólo una llamada puntero, la dirección de un personaje, 947 00:39:10,150 --> 00:39:12,650 que sólo significa que es un número que por convención humana 948 00:39:12,650 --> 00:39:15,350 tendemos a escribir como 0x algo. 949 00:39:15,350 --> 00:39:18,590 >> Pero es sólo un número, como 33 Oxford Street, 950 00:39:18,590 --> 00:39:20,530 que pasa a ser el La dirección del CS edificio. 951 00:39:20,530 --> 00:39:22,000 952 00:39:22,000 --> 00:39:23,545 Cualquier pregunta sobre estos detalles? 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 >> AUDIENCIA: ¿Por qué, comprobamos para t igual a null? 956 00:39:28,530 --> 00:39:30,740 >> DAVID J. MALAN: ¿Por qué nosotros comprobar si t igual a null? 957 00:39:30,740 --> 00:39:33,250 Si leemos la documentation-- gran pregunta-- para malloc, 958 00:39:33,250 --> 00:39:37,020 que va a decir en la letra pequeña, a veces malloc podría devolver null, 959 00:39:37,020 --> 00:39:38,080 al igual que GetString. 960 00:39:38,080 --> 00:39:41,820 Y, en efecto, GetString devuelve null Si, a su vez, malloc devuelve un valor nulo, 961 00:39:41,820 --> 00:39:43,130 porque GetString utiliza malloc. 962 00:39:43,130 --> 00:39:46,400 >> Y eso podría suceder si el sistema operativo, Mac OS, Windows, lo que sea, es simplemente 963 00:39:46,400 --> 00:39:48,130 sin memoria para usted. 964 00:39:48,130 --> 00:39:49,820 Así que eso es lo que pasó allí. 965 00:39:49,820 --> 00:39:52,910 >> Y permítanme revelar otra cosa eso podría volar tu mente 966 00:39:52,910 --> 00:39:55,100 o completamente estar demasiado lejos de la raya. 967 00:39:55,100 --> 00:39:59,770 Pero déjame tire hacia arriba la mismo bucle para copiar, 968 00:39:59,770 --> 00:40:05,480 que hace un momento, el recuerdo era esto. t soporte i consigue s soporte de i. 969 00:40:05,480 --> 00:40:06,740 >> Agradable y fácil de usar. 970 00:40:06,740 --> 00:40:09,330 Se siente como la segunda semana de nuevo. 971 00:40:09,330 --> 00:40:14,920 Pero esta versión puede ser en realidad reescrito como este, que parece críptica. 972 00:40:14,920 --> 00:40:18,280 Es un puntero técnica llamada aritmética, aritmética de direcciones. 973 00:40:18,280 --> 00:40:19,600 Pero ¿por qué funciona esto? 974 00:40:19,600 --> 00:40:22,220 >> Ahora era un fastidio, la autores de C decidió utilizar 975 00:40:22,220 --> 00:40:25,070 el símbolo * para diferentes propósitos. 976 00:40:25,070 --> 00:40:29,020 Hemos visto que se usa una vez ya, char *, que significa "dame una variable 977 00:40:29,020 --> 00:40:31,210 eso va a contener la dirección de un char ". 978 00:40:31,210 --> 00:40:33,990 * Así carbón en ese contexto significa "dame una variable." 979 00:40:33,990 --> 00:40:40,050 >> Por desgracia, si se utiliza el * sin una palabra delante de él, como char, 980 00:40:40,050 --> 00:40:41,905 es ahora llamado el operador para deshacer referencias. 981 00:40:41,905 --> 00:40:43,530 Y veremos más de esto en poco tiempo. 982 00:40:43,530 --> 00:40:44,930 Pero sólo significa "ir allí." 983 00:40:44,930 --> 00:40:49,070 Es como decir, si alguien me entregó en un pedazo de papel "33 Oxford Street," 984 00:40:49,070 --> 00:40:53,830 si lo hago "* 33 Oxford Street," que significa "Ir por el camino de la construcción de CS." 985 00:40:53,830 --> 00:40:57,220 >> Así que * simplemente significa ir allí si no hay una palabra en frente de ella. 986 00:40:57,220 --> 00:40:59,100 Entonces, ¿qué es t, para ser claros? 987 00:40:59,100 --> 00:41:03,250 t es la dirección de la parte de memoria que se le dio de nuevo a mí. 988 00:41:03,250 --> 00:41:06,650 s es la dirección de lo que, para ser claros, en el ejemplo que hemos estado discutiendo, 989 00:41:06,650 --> 00:41:07,500 de gabe minúsculas? 990 00:41:07,500 --> 00:41:08,990 991 00:41:08,990 --> 00:41:10,005 s es la dirección de-- 992 00:41:10,005 --> 00:41:11,585 993 00:41:11,585 --> 00:41:12,460 AUDIENCIA: La cadena. 994 00:41:12,460 --> 00:41:14,126 DAVID J. MALAN: De nombre original de Gabe. 995 00:41:14,126 --> 00:41:16,660 Así que es la dirección de este trozo de memoria. 996 00:41:16,660 --> 00:41:22,220 Así que si digo t + i i--, aviso, es sólo nuestro viejo amigo. 997 00:41:22,220 --> 00:41:24,770 Es sólo una variable índice eso es la iteración de cero en un máximo 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 Así que va a ser cero, uno, luego dos, luego tres, luego cuatro. 1000 00:41:30,367 --> 00:41:33,200 Así que vamos a montar estos nuevos Piezas del rompecabezas-cero como, si se quiere, 1001 00:41:33,200 --> 00:41:36,140 aunque, de nuevo, la sintaxis es mucho más arcano de los arañazos. 1002 00:41:36,140 --> 00:41:39,522 Así que t es una dirección + i me va a dar 1003 00:41:39,522 --> 00:41:42,480 un número, ya que estos son todos números que hemos venido señalando como hexadecimal. 1004 00:41:42,480 --> 00:41:43,560 Pero son sólo números. 1005 00:41:43,560 --> 00:41:49,960 >> Así que si la dirección de t nos dijo era 0x88, lo que es 0x88 más cero. 1006 00:41:49,960 --> 00:41:51,564 1007 00:41:51,564 --> 00:41:53,980 Incluso si usted no se siente cómodo con hex aún, tomar una conjetura. 1008 00:41:53,980 --> 00:41:54,410 >> AUDIENCIA: El original. 1009 00:41:54,410 --> 00:41:55,850 >> DAVID J. MALAN: Todavía 0x88. 1010 00:41:55,850 --> 00:41:58,910 Entonces, ¿qué quiere decir * 0x88? 1011 00:41:58,910 --> 00:42:02,670 Significa, "ir allí", que significa efectivamente, "poner el dedo aquí." 1012 00:42:02,670 --> 00:42:06,930 Y ahora en el lado derecho de esta expresión, * y luego en parens, 1013 00:42:06,930 --> 00:42:11,586 s + s i significa, que es el tratar aquí de la pequeña g. 1014 00:42:11,586 --> 00:42:16,220 s + 0 es, por supuesto, s, s lo es. 1015 00:42:16,220 --> 00:42:21,230 >> Así que ahora, es s *, que al igual que * 33 Oxford Street significa ir a la dirección 1016 00:42:21,230 --> 00:42:22,010 s. 1017 00:42:22,010 --> 00:42:24,170 Así que aquí está este dedo, la mano derecha. 1018 00:42:24,170 --> 00:42:26,050 Entonces, ¿qué voy a copiar en qué? 1019 00:42:26,050 --> 00:42:30,260 La cosa a la derecha, que es gabe, poco g aquí, en aquí. 1020 00:42:30,260 --> 00:42:32,750 >> Y por lo que el efecto de esa primera iteración del bucle, 1021 00:42:32,750 --> 00:42:36,200 como usted propuso, a pesar de lo que parece loco más complicado que cualquier cosa 1022 00:42:36,200 --> 00:42:42,110 que hemos visto antes, es simplemente decir ir aquí y copiar ese personaje aquí. 1023 00:42:42,110 --> 00:42:44,700 Te está dando un mapa para ambas localidades. 1024 00:42:44,700 --> 00:42:46,130 >> Y vamos a ver mucho más de esto. 1025 00:42:46,130 --> 00:42:50,600 Pero por ahora, la esperanza es sólo para introducir algunas de estas ideas básicas. 1026 00:42:50,600 --> 00:42:53,550 Y, de hecho, vamos a ver un programa final aquí, 1027 00:42:53,550 --> 00:42:57,480 y luego el claymation prometido, lo que hará que todo bien. 1028 00:42:57,480 --> 00:42:57,980 Bien. 1029 00:42:57,980 --> 00:43:01,680 Así que permítanme abro up-- ahí vamos. 1030 00:43:01,680 --> 00:43:02,850 1031 00:43:02,850 --> 00:43:05,440 Así que vamos Me-- volveremos a este cuadro en poco tiempo. 1032 00:43:05,440 --> 00:43:08,360 Permítanme abrir este último ejemplo aquí. 1033 00:43:08,360 --> 00:43:09,440 1034 00:43:09,440 --> 00:43:12,710 >> Así que aquí es un super, super programa que lleva a cabo 1035 00:43:12,710 --> 00:43:15,050 nada en la vida que hace lo siguiente. 1036 00:43:15,050 --> 00:43:18,740 En primer lugar, declara dos variables, x e y, que no son números de este tiempo, 1037 00:43:18,740 --> 00:43:19,240 per se. 1038 00:43:19,240 --> 00:43:20,448 No son números enteros, per se. 1039 00:43:20,448 --> 00:43:22,899 Ellos son aparentemente int *. 1040 00:43:22,899 --> 00:43:25,690 Así que a nadie, ¿qué significa si su tipo de datos, la variable, 1041 00:43:25,690 --> 00:43:26,860 es de tipo int * estrellas? 1042 00:43:26,860 --> 00:43:30,240 Esa es la dirección de un int. 1043 00:43:30,240 --> 00:43:31,990 >> Así que no tengo ni idea de donde está todavía. 1044 00:43:31,990 --> 00:43:35,150 Sólo significa "poner, eventualmente, la dirección de un int aquí ". 1045 00:43:35,150 --> 00:43:38,340 0x50, 0x88, donde quiera que esté en memoria, una dirección se va allí. 1046 00:43:38,340 --> 00:43:40,200 Y eso es lo que y es va a ser, también. 1047 00:43:40,200 --> 00:43:44,920 >> Si ahora digo x = malloc (sizeof (int)), esta es una manera elegante de decir, 1048 00:43:44,920 --> 00:43:49,000 oye sistema operativo, a través de malloc, dame suficiente memoria para el tamaño 1049 00:43:49,000 --> 00:43:52,370 de un int, que es probablemente va a ser de 32 bits o cuatro bytes. 1050 00:43:52,370 --> 00:43:53,680 >> Entonces, ¿qué volver malloc? 1051 00:43:53,680 --> 00:43:55,250 Malloc devuelve una dirección. 1052 00:43:55,250 --> 00:43:57,020 Entonces, ¿qué va a quedar almacenado en x? 1053 00:43:57,020 --> 00:44:00,600 La dirección de la parte de memoria, los cuatro bytes, que malloc 1054 00:44:00,600 --> 00:44:03,360 acaba de encontrar para mí preguntando el sistema operativo. 1055 00:44:03,360 --> 00:44:08,240 >> Ahora Mientras tanto, la línea cuatro aquí, el * x = 42. 1056 00:44:08,240 --> 00:44:09,990 Para que quede claro, lo que está pasando ahí abajo? 1057 00:44:09,990 --> 00:44:11,530 En la parte izquierda, * x. 1058 00:44:11,530 --> 00:44:13,610 eso es como * 33 Oxford Street. 1059 00:44:13,610 --> 00:44:15,523 Así * x significa qué? 1060 00:44:15,523 --> 00:44:16,450 >> AUDIENCIA: Ir a. 1061 00:44:16,450 --> 00:44:17,908 >> DAVID J. MALAN: Ir a esa dirección. 1062 00:44:17,908 --> 00:44:20,466 Dondequiera que parte de la memoria es, ir a ella. 1063 00:44:20,466 --> 00:44:21,979 Y poner lo que hay, obviamente? 1064 00:44:21,979 --> 00:44:22,520 AUDIENCIA: 42. 1065 00:44:22,520 --> 00:44:23,580 DAVID J. MALAN: 42. 1066 00:44:23,580 --> 00:44:25,650 Muy bien, * y, misma idea. 1067 00:44:25,650 --> 00:44:26,860 Vaya a la dirección en y. 1068 00:44:26,860 --> 00:44:31,740 Ponga el número 13 allí, pero lo que es y en este momento? 1069 00:44:31,740 --> 00:44:33,172 1070 00:44:33,172 --> 00:44:34,630 AUDIENCIA: No hay memoria para y. 1071 00:44:34,630 --> 00:44:35,710 DAVID J. MALAN: Hay hay memoria para y. 1072 00:44:35,710 --> 00:44:38,215 Así que lo que hace y, probablemente, contener, como hemos venido diciendo? 1073 00:44:38,215 --> 00:44:38,520 >> AUDIENCIA: Garbage. 1074 00:44:38,520 --> 00:44:39,480 >> DAVID J. MALAN: Algunos valor basura. 1075 00:44:39,480 --> 00:44:41,320 Ahora, el valor de la basura es todavía un número. 1076 00:44:41,320 --> 00:44:43,160 Todavía se puede confundir con una dirección. 1077 00:44:43,160 --> 00:44:45,160 Es como si alguien garabateó algo hacia abajo, 1078 00:44:45,160 --> 00:44:48,002 y me malinterpretó el sentido de algún edificio por la calle. 1079 00:44:48,002 --> 00:44:50,460 Y si lo que intenta entrar en algún edificio que no es dueño, 1080 00:44:50,460 --> 00:44:53,710 o algún trozo de memoria que no tiene sido dado, las cosas malas pueden suceder. 1081 00:44:53,710 --> 00:44:57,740 Ordenador podría bloquearse, o algún otro comportamiento indeterminado podría suceder. 1082 00:44:57,740 --> 00:45:01,310 >> Así que la introducción, a continuación, a Binky es esto. 1083 00:45:01,310 --> 00:45:04,290 Todavía recuerdo, 20 y tantos años más tarde, 1084 00:45:04,290 --> 00:45:07,200 donde estaba cuando finalmente entendido punteros. 1085 00:45:07,200 --> 00:45:09,520 >> Es decir, si usted salir de aquí en tres minutos 1086 00:45:09,520 --> 00:45:12,170 y creo que no lo hago entender punteros, se dan cuenta 1087 00:45:12,170 --> 00:45:14,410 Me he acordado de 20 años, por alguna razón loca 1088 00:45:14,410 --> 00:45:17,140 cuándo y por qué finalmente se hundió en, sentado con mi enseñanza 1089 00:45:17,140 --> 00:45:19,501 compañero, Nishat Mehta en el parte posterior de Eliot Dining Hall. 1090 00:45:19,501 --> 00:45:21,250 Ahora, me he acordado esto porque esto era 1091 00:45:21,250 --> 00:45:23,920 uno de los temas que, en particular, luchado con. 1092 00:45:23,920 --> 00:45:26,470 Y entonces, por fin se hace clic, como me atrevo a decir un montón de temas 1093 00:45:26,470 --> 00:45:27,460 finalmente lo hará. 1094 00:45:27,460 --> 00:45:32,590 Y ahora, para hacer que se sienta todo el más feliz y más convincente, 1095 00:45:32,590 --> 00:45:35,360 vamos a echar un último vistazo en nuestra últimos tres minutos aquí en Binky, 1096 00:45:35,360 --> 00:45:37,675 de nuestro amigo, Nick Parlante de Stanford. 1097 00:45:37,675 --> 00:45:38,910 1098 00:45:38,910 --> 00:45:41,580 >> [REPRODUCCIÓN DE VÍDEO] 1099 00:45:41,580 --> 00:45:42,750 >> Oye, Binky. 1100 00:45:42,750 --> 00:45:43,500 Despertarse! 1101 00:45:43,500 --> 00:45:45,960 Es tiempo para la diversión puntero. 1102 00:45:45,960 --> 00:45:47,012 >> ¿Qué es eso? 1103 00:45:47,012 --> 00:45:48,723 Aprenda acerca de los punteros? 1104 00:45:48,723 --> 00:45:50,580 Qué bien! 1105 00:45:50,580 --> 00:45:53,563 >> Bueno, para empezar, creo que estamos Va a necesitar un par de punteros. 1106 00:45:53,563 --> 00:45:54,390 >> -OK. 1107 00:45:54,390 --> 00:45:57,930 Este código asigna dos punteros, que puede apuntar a números enteros. 1108 00:45:57,930 --> 00:45:58,430 -OK. 1109 00:45:58,430 --> 00:46:02,140 Bueno, veo los dos punteros, pero no parecen estar apuntando a nada. 1110 00:46:02,140 --> 00:46:02,980 >> Eso es correcto. 1111 00:46:02,980 --> 00:46:05,100 Inicialmente, punteros no apuntan a nada. 1112 00:46:05,100 --> 00:46:08,030 Las cosas que apuntan a los llamados pointees, y que fueron creados de 1113 00:46:08,030 --> 00:46:09,370 una etapa separada. 1114 00:46:09,370 --> 00:46:10,220 >> Oh, cierto, cierto. 1115 00:46:10,220 --> 00:46:10,950 Lo sabía. 1116 00:46:10,950 --> 00:46:12,385 Los pointees están separados. 1117 00:46:12,385 --> 00:46:14,315 Er, así que ¿cómo asignar 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 Bueno, el código asigna un nuevo pointee número entero, 1121 00:46:18,970 --> 00:46:20,950 y esta parte se presentan xa apuntan a la misma. 1122 00:46:20,950 --> 00:46:22,050 1123 00:46:22,050 --> 00:46:23,230 >> Oye, que se ve mejor. 1124 00:46:23,230 --> 00:46:25,060 Así que haga algo. 1125 00:46:25,060 --> 00:46:25,990 >> -OK. 1126 00:46:25,990 --> 00:46:30,455 Voy a eliminar la referencia al puntero x para almacenar el número 42 en su pointee. 1127 00:46:30,455 --> 00:46:32,830 Para este truco, voy a necesitar mi Varita mágica de anulación de referencia. 1128 00:46:32,830 --> 00:46:34,130 1129 00:46:34,130 --> 00:46:36,080 >> -Tu Varita mágica de Desreferenciar? 1130 00:46:36,080 --> 00:46:37,357 1131 00:46:37,357 --> 00:46:38,190 Eso-- eso es genial. 1132 00:46:38,190 --> 00:46:39,340 1133 00:46:39,340 --> 00:46:41,080 >> : Este es lo que el código se parece. 1134 00:46:41,080 --> 00:46:44,110 Voy a configurar el número, y [POP] 1135 00:46:44,110 --> 00:46:44,700 >> Oye, mira. 1136 00:46:44,700 --> 00:46:46,140 Ahí va. 1137 00:46:46,140 --> 00:46:50,980 >> -Así Haciendo un desreferenciar en x sigue la flecha para acceder a su pointee. 1138 00:46:50,980 --> 00:46:53,160 En este caso, una tienda 42 en allí. 1139 00:46:53,160 --> 00:46:57,710 Hey tratar de usarlo para almacenar el número 13 a través del otro puntero, y. 1140 00:46:57,710 --> 00:46:58,760 >> -OK. 1141 00:46:58,760 --> 00:47:03,270 Voy a ir por aquí ay, y obtener el número 13 de puesta en marcha. 1142 00:47:03,270 --> 00:47:07,930 Y luego, tomar la varita de Eliminación de referencias y justo [BUZZ] 1143 00:47:07,930 --> 00:47:08,960 >> Oh! 1144 00:47:08,960 --> 00:47:09,500 >> Oh, bueno! 1145 00:47:09,500 --> 00:47:11,090 Eso no funcionó. 1146 00:47:11,090 --> 00:47:15,630 Diga, Binky, no creo dereferencing y es una buena idea, porque usted sabe, 1147 00:47:15,630 --> 00:47:17,850 la creación de la pointee es un paso separado. 1148 00:47:17,850 --> 00:47:20,450 Y yo no creo que nunca lo hicimos. 1149 00:47:20,450 --> 00:47:21,480 >> Punto Bien. 1150 00:47:21,480 --> 00:47:21,980 -Si. 1151 00:47:21,980 --> 00:47:25,680 Asignamos el puntero y, pero que Nunca configurarlo para que apunte a un pointee. 1152 00:47:25,680 --> 00:47:27,190 1153 00:47:27,190 --> 00:47:28,616 >> -Muy Observador. 1154 00:47:28,616 --> 00:47:30,240 Oye, te ves muy bien allí, Binky. 1155 00:47:30,240 --> 00:47:33,400 ¿Se puede arreglar para que los puntos de Y a la misma pointee como x? 1156 00:47:33,400 --> 00:47:34,000 >> -Seguro. 1157 00:47:34,000 --> 00:47:36,780 Voy a usar mi varita mágica Puntero de Asignación. 1158 00:47:36,780 --> 00:47:38,740 >> -¿Es Que va a ser un problema como antes? 1159 00:47:38,740 --> 00:47:39,240 -No. 1160 00:47:39,240 --> 00:47:40,660 Esto no toca los pointees. 1161 00:47:40,660 --> 00:47:44,450 Sólo cambia un puntero a apuntar a la misma cosa que otra. 1162 00:47:44,450 --> 00:47:45,450 >> Oh, ya veo. 1163 00:47:45,450 --> 00:47:48,200 Ahora y apunta al mismo lugar que x. 1164 00:47:48,200 --> 00:47:48,910 Así que esperar. 1165 00:47:48,910 --> 00:47:49,950 Ahora, y se fija. 1166 00:47:49,950 --> 00:47:51,120 Tiene un pointee. 1167 00:47:51,120 --> 00:47:54,510 Así que usted puede probar la Varita de Eliminación de referencias volver 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 >> Oye, mira eso. 1171 00:47:59,340 --> 00:48:00,750 Ahora dereferencing obras en y. 1172 00:48:00,750 --> 00:48:04,991 Y debido a que los punteros están compartiendo que uno pointee, ambos ven el 13. 1173 00:48:04,991 --> 00:48:05,490 -Si. 1174 00:48:05,490 --> 00:48:06,870 Compartir, lo que sea. 1175 00:48:06,870 --> 00:48:08,820 Así que vamos a cambiar de lugar ahora? 1176 00:48:08,820 --> 00:48:09,440 >> Oh, mira. 1177 00:48:09,440 --> 00:48:10,830 Estamos fuera de tiempo. 1178 00:48:10,830 --> 00:48:11,570 >> -But-- 1179 00:48:11,570 --> 00:48:13,530 >> -Simplemente Recordar las tres reglas de puntero. 1180 00:48:13,530 --> 00:48:16,560 Número Uno, la estructura básica es que usted tiene un puntero, 1181 00:48:16,560 --> 00:48:18,680 y apunta a un pointee. 1182 00:48:18,680 --> 00:48:20,640 Pero el puntero y pointee están separados, 1183 00:48:20,640 --> 00:48:22,610 y el error común es la creación de un puntero, 1184 00:48:22,610 --> 00:48:25,000 pero que se olvide de darle una pointee. 1185 00:48:25,000 --> 00:48:28,170 >> Número Dos, desreferencia puntero comienza en el puntero 1186 00:48:28,170 --> 00:48:31,050 y sigue su flecha sobre para acceder a su pointee. 1187 00:48:31,050 --> 00:48:33,400 Como todos sabemos, este sólo funciona si hay 1188 00:48:33,400 --> 00:48:36,270 un pointee, qué tipo de vuelve a la Regla Número Uno. 1189 00:48:36,270 --> 00:48:39,000 >> Número Tres, puntero asignación tiene un puntero 1190 00:48:39,000 --> 00:48:42,320 y cambia para que apunte a la pointee mismo como otro puntero. 1191 00:48:42,320 --> 00:48:44,160 Así que después de la cesión, los dos punteros 1192 00:48:44,160 --> 00:48:45,910 apuntará a la misma pointee. 1193 00:48:45,910 --> 00:48:47,990 A veces, eso se llama intercambio. 1194 00:48:47,990 --> 00:48:49,740 Y eso es todo lo que hay que hacer, de verdad. 1195 00:48:49,740 --> 00:48:50,277 Bye-bye ahora. 1196 00:48:50,277 --> 00:48:51,110 [FIN REPRODUCCIÓN DE VÍDEO] 1197 00:48:51,110 --> 00:48:52,568 DAVID J. MALAN: Eso es todo por CS50. 1198 00:48:52,568 --> 00:48:55,110 Nos vemos la semana que viene. 1199 00:48:55,110 --> 00:48:56,064