1 00:00:00,000 --> 00:00:03,395 >> [REPRODUCCIÓN DE MÚSICA] 2 00:00:03,395 --> 00:00:11,031 3 00:00:11,031 --> 00:00:13,280 DAVID J. MALAN: Esto es como un seminario de primer año en la actualidad. 4 00:00:13,280 --> 00:00:14,060 OK. 5 00:00:14,060 --> 00:00:15,024 Así que muy lluvioso cabo. 6 00:00:15,024 --> 00:00:17,690 Esto tiende a ocurrir los miércoles, pero aún más oportunidad 7 00:00:17,690 --> 00:00:18,700 para preguntas hoy. 8 00:00:18,700 --> 00:00:22,210 Así que vamos a empezar en realidad con la película en un momento. 9 00:00:22,210 --> 00:00:24,560 Pero vamos a empezar con grandilocuencia como siempre. 10 00:00:24,560 --> 00:00:28,000 >> Esto es CS50, y esto Es el fin de semana 4. 11 00:00:28,000 --> 00:00:30,820 Así que si alguna vez has visto La TV o una película en la que 12 00:00:30,820 --> 00:00:34,690 hay algunos expertos en informática y la policía o el FBI, o alguna agencia 13 00:00:34,690 --> 00:00:36,930 está tratando de tomar un poco de adversario, así, que haya 14 00:00:36,930 --> 00:00:40,850 probablemente escuchado la expresión "mejorar" por la que ese técnico de alguna manera 15 00:00:40,850 --> 00:00:44,750 zooms mágicamente en infinitamente para poder ver a los criminales 16 00:00:44,750 --> 00:00:48,640 identidad o el número de matrícula incluso en el brillo de un espejo 17 00:00:48,640 --> 00:00:50,390 o el brillo de los ojos de alguien. 18 00:00:50,390 --> 00:00:55,196 Así que de hecho, vamos a echar un vistazo a algunas de esas escenas de Hollywood. 19 00:00:55,196 --> 00:00:55,862 [REPRODUCCIÓN DE VÍDEO] 20 00:00:55,862 --> 00:00:59,243 -OK, Ahora vamos a obtener un buen vistazo. 21 00:00:59,243 --> 00:01:06,488 22 00:01:06,488 --> 00:01:07,415 >> -Mantenga Ella. 23 00:01:07,415 --> 00:01:08,267 Corre que volver. 24 00:01:08,267 --> 00:01:09,121 >> -Espera un minuto. 25 00:01:09,121 --> 00:01:11,300 Ve a la derecha. 26 00:01:11,300 --> 00:01:12,209 >> -No, Congelar eso. 27 00:01:12,209 --> 00:01:12,750 -Pantalla completa. 28 00:01:12,750 --> 00:01:13,558 -OK, Congelar eso. 29 00:01:13,558 --> 00:01:14,820 Endurecerá hasta en eso, ¿verdad? 30 00:01:14,820 --> 00:01:16,530 -Vector en el que chico por la rueda trasera. 31 00:01:16,530 --> 00:01:19,400 -zoom En aquí en este lugar. 32 00:01:19,400 --> 00:01:22,846 -Con El equipo adecuado, la imagen podría ser ampliado y agudizado. 33 00:01:22,846 --> 00:01:24,065 -¿Que es eso? 34 00:01:24,065 --> 00:01:25,600 -Es Un programa de mejora. 35 00:01:25,600 --> 00:01:26,860 -¿Puedes Claro que cualquier? 36 00:01:26,860 --> 00:01:27,890 -No lo sé. 37 00:01:27,890 --> 00:01:29,050 Vamos a mejorarlo. 38 00:01:29,050 --> 00:01:31,575 >> Sección A6 -Mejorar. 39 00:01:31,575 --> 00:01:33,642 >> -I Mejora el detalle, y- Creo que hay 40 00:01:33,642 --> 00:01:35,433 suficiente para mejorar, liberar a mi pantalla. 41 00:01:35,433 --> 00:01:37,080 -I Mejoró la reflexión en su ojo. 42 00:01:37,080 --> 00:01:38,830 >> -Vamos A ejecutar esto a través de mejora de vídeo. 43 00:01:38,830 --> 00:01:40,100 -Edgar, Puedes mejorar esto? 44 00:01:40,100 --> 00:01:41,875 >> -Aférrate. 45 00:01:41,875 --> 00:01:44,010 >> -He Estado trabajando en esta reflexión. 46 00:01:44,010 --> 00:01:44,995 >> La reflexión de -Alguien. 47 00:01:44,995 --> 00:01:45,495 -Reflexión. 48 00:01:45,495 --> 00:01:47,399 -Hay Un reflejo de la cara del hombre. 49 00:01:47,399 --> 00:01:48,065 -El reflejo. 50 00:01:48,065 --> 00:01:48,981 -Hay Una reflexión. 51 00:01:48,981 --> 00:01:50,600 -zoom En el espejo. 52 00:01:50,600 --> 00:01:52,712 -Usted Puede ver un reflejo. 53 00:01:52,712 --> 00:01:54,350 -Puede A mejorar la imagen de aquí? 54 00:01:54,350 --> 00:01:55,370 -Puede Que lo mejorar aquí? 55 00:01:55,370 --> 00:01:56,210 -¿Puedes Potenciarlo? 56 00:01:56,210 --> 00:01:56,900 ¿Puedes mejorarla? 57 00:01:56,900 --> 00:01:57,870 >> -¿Podemos Mejoramos esto? 58 00:01:57,870 --> 00:01:58,717 >> -¿Puedes Potenciarlo? 59 00:01:58,717 --> 00:02:00,050 -Mantenga En un segundo, voy a Mejorar. 60 00:02:00,050 --> 00:02:00,924 -zoom En la puerta. 61 00:02:00,924 --> 00:02:01,700 -los Tiempos 10. 62 00:02:01,700 --> 00:02:02,586 -zoom. 63 00:02:02,586 --> 00:02:03,490 -Mudarse. 64 00:02:03,490 --> 00:02:03,990 -Más. 65 00:02:03,990 --> 00:02:04,690 -Espera, Deténgase. 66 00:02:04,690 --> 00:02:05,190 -Deténgase. 67 00:02:05,190 --> 00:02:05,970 -PAUSE Ella. 68 00:02:05,970 --> 00:02:09,460 Nos -Girar 75 grados alrededor de la vertical, por favor. 69 00:02:09,460 --> 00:02:10,962 -Deténgase. 70 00:02:10,962 --> 00:02:14,040 Volver a la parte sobre la puerta, de nuevo. 71 00:02:14,040 --> 00:02:15,860 >> -Got Un promotor de imagen que puede mapa de bits? 72 00:02:15,860 --> 00:02:18,776 >> -Oye, Tal vez podemos usar el Pradeep Método de Sen para ver por las ventanas. 73 00:02:18,776 --> 00:02:20,372 Software -Este es el estado de la técnica. 74 00:02:20,372 --> 00:02:21,845 >> -El Valor propio está apagado. 75 00:02:21,845 --> 00:02:24,300 >> -Con La derecha combinación de algorithm-- 76 00:02:24,300 --> 00:02:26,755 >> Eliminación tomada de -Él algoritmos para el siguiente nivel, 77 00:02:26,755 --> 00:02:28,730 y puedo utilizarlos para mejorar esta fotografía. 78 00:02:28,730 --> 00:02:31,286 >> -Lock Encendido y ampliar el eje z. 79 00:02:31,286 --> 00:02:32,560 >> -Mejorar. 80 00:02:32,560 --> 00:02:33,100 >> -Mejorar. 81 00:02:33,100 --> 00:02:33,600 >> -Mejorar. 82 00:02:33,600 --> 00:02:34,960 -Freeze Y mejorar. 83 00:02:34,960 --> 00:02:37,180 >> [FIN DE REPRODUCCIÓN] 84 00:02:37,180 --> 00:02:41,160 >> DAVID J. MALAN: Muy bien, así todos esos son en realidad palabras. 85 00:02:41,160 --> 00:02:44,450 Sólo están ensartados en un de manera que no es en realidad sensible. 86 00:02:44,450 --> 00:02:48,400 Y, de hecho, CS50 y cursos como es tiende a arruinar un montón de TV y películas 87 00:02:48,400 --> 00:02:48,900 para ti. 88 00:02:48,900 --> 00:02:52,330 Porque cuando los expertos en informática se recitar términos y diciendo 89 00:02:52,330 --> 00:02:56,860 cosas de lujo como vectores propios, y el eje z, 90 00:02:56,860 --> 00:02:59,572 y cualquier número de otra en realidad términos más técnicos, 91 00:02:59,572 --> 00:03:02,030 que realmente están simplemente tensando palabras juntas con demasiada frecuencia. 92 00:03:02,030 --> 00:03:05,020 ¿Es eso una de nuestras esperanzas es que, como un efecto secundario de tomar cursos 93 00:03:05,020 --> 00:03:08,245 como éste, lo hará más personas en el mundo realmente sea capaz de pesar en 94 00:03:08,245 --> 00:03:12,040 y solo muy ligeramente influir en el la calidad y la exactitud de esas películas? 95 00:03:12,040 --> 00:03:14,350 >> De hecho, vamos a echar un vistazo a la realidad. 96 00:03:14,350 --> 00:03:18,070 Así que aquí está la foto personal de María, uno de nuestros compañeros docentes. 97 00:03:18,070 --> 00:03:20,050 Y supongo que es sospechoso de algo. 98 00:03:20,050 --> 00:03:23,730 Y, sin embargo, hay un atisbo de alguna pieza de evidencia en su ojo, 99 00:03:23,730 --> 00:03:25,480 o en el reflejo de sus gafas. 100 00:03:25,480 --> 00:03:30,760 Bueno, si lo hacemos exactamente como las películas proponer, en el que nos acercamos y "mejoramos", 101 00:03:30,760 --> 00:03:34,080 esto es la cantidad de información es en el rostro de María 102 00:03:34,080 --> 00:03:36,795 cuando se captura una imagen con la resolución original. 103 00:03:36,795 --> 00:03:39,120 >> Y, de hecho, se puede ver estos puntos. 104 00:03:39,120 --> 00:03:41,900 Y estos son los que son denominados píxeles, P-I-X-E-L-S, 105 00:03:41,900 --> 00:03:45,740 que es sólo una plaza típicamente que es un punto que compone una imagen. 106 00:03:45,740 --> 00:03:49,200 Y de vuelta en el día, y de hecho aun hoy con algunos de los televisores LED de hoy 107 00:03:49,200 --> 00:03:51,950 o televisores LCD, si tienes una en su habitación o en el hogar, 108 00:03:51,950 --> 00:03:55,100 si subes muy cerca de ella, y especialmente si se trata de un televisor algo mayor, 109 00:03:55,100 --> 00:03:58,760 es probable que incluso se puede ver estos puntos y eso es lo que componer una imagen. 110 00:03:58,760 --> 00:04:00,980 >> Y no hay más la información que esto. 111 00:04:00,980 --> 00:04:05,400 Podríamos "mejorar", en el sentido de suavizar las cosas una y tipo de 112 00:04:05,400 --> 00:04:09,040 inferir la clase de, clase de lo color debe estar al lado de los ojos de María 113 00:04:09,040 --> 00:04:10,910 por lo que no es en realidad tan pixelada. 114 00:04:10,910 --> 00:04:14,510 Pero si sigo zoom, hay es el malo de la película en los ojos. 115 00:04:14,510 --> 00:04:16,600 Al igual que es tanto información que tenemos. 116 00:04:16,600 --> 00:04:18,920 No puede crear Información de la nada. 117 00:04:18,920 --> 00:04:20,790 Sólo hay una finita número de bits allí. 118 00:04:20,790 --> 00:04:22,873 >> Así que en el problema Set 4, donde usted tiene una oportunidad 119 00:04:22,873 --> 00:04:24,580 jugar con este tipo de mundo. 120 00:04:24,580 --> 00:04:27,610 En el problema Set 4, explorará la mundo de los gráficos y análisis forense, 121 00:04:27,610 --> 00:04:30,870 y en realidad escribir código que recupera imágenes perdidas. 122 00:04:30,870 --> 00:04:33,510 Vas a escribir código que manipula imágenes existentes 123 00:04:33,510 --> 00:04:36,120 y, finalmente, entender lo que está pasando por debajo de la capucha. 124 00:04:36,120 --> 00:04:38,540 >> Y, resulta que, en realidad no tan complicado. 125 00:04:38,540 --> 00:04:41,320 Por ejemplo, si quisiéramos representar una cara sonriente en 126 00:04:41,320 --> 00:04:44,160 con estos píxeles negros, o estos puntos negros, 127 00:04:44,160 --> 00:04:47,230 así, podríamos simplemente representar como un verdadero mapa de bits. 128 00:04:47,230 --> 00:04:50,040 Y si había oído hablar alguna vez de que mapa de bits expresión, tal vez 129 00:04:50,040 --> 00:04:52,330 ahora empieza a hacer una poco más hoy sentido. 130 00:04:52,330 --> 00:04:53,580 >> Ya sabemos lo que un poco es. 131 00:04:53,580 --> 00:04:54,160 Es 0 o 1. 132 00:04:54,160 --> 00:04:56,201 Y un mapa es sólo algo como un trozo de papel 133 00:04:56,201 --> 00:04:59,180 que ofrece direcciones y tiene tal vez una cuadrícula de x e y coordenadas. 134 00:04:59,180 --> 00:05:00,540 Así que aquí es un mapa de bits. 135 00:05:00,540 --> 00:05:03,680 Es un mapa de bits mediante el cual un 1 es aparentemente 136 00:05:03,680 --> 00:05:07,857 pasando de representar un píxel blanco, y un 0 va a representar un pixel negro. 137 00:05:07,857 --> 00:05:09,440 Pero sin duda podríamos darle la vuelta alrededor. 138 00:05:09,440 --> 00:05:11,648 Realmente no importa lo Mientras estemos consistente. 139 00:05:11,648 --> 00:05:15,570 Y aquí es cómo, en el interior binary-- de la memoria de una computadora, o incluso en el interior 140 00:05:15,570 --> 00:05:18,160 de un archivo en su disco drive-- podrías guardar 141 00:05:18,160 --> 00:05:20,240 el más simple de imágenes de caras sonrientes. 142 00:05:20,240 --> 00:05:23,990 Pero, ¿qué somos nosotros, por supuesto, carente de esta imagen? 143 00:05:23,990 --> 00:05:24,610 Color, ¿no? 144 00:05:24,610 --> 00:05:28,220 Es un siguiente paso obvio o mejora para mejorar esto con color. 145 00:05:28,220 --> 00:05:32,230 Así que por desgracia con un solo poco, 0 o 1, que podría representar el color. 146 00:05:32,230 --> 00:05:36,100 Eso podría ser de color rojo o azul, o negro, o blanco, o verde o rosa, 147 00:05:36,100 --> 00:05:37,420 o cualquier pares de colores. 148 00:05:37,420 --> 00:05:40,860 Sin embargo, para simplificar, vamos a simplemente asumir blanco y negro. 149 00:05:40,860 --> 00:05:45,930 >> Así que lo que lógicamente necesitamos si queremos quiere aplicar color en una imagen? 150 00:05:45,930 --> 00:05:49,080 ¿Que tenemos que hacer? 151 00:05:49,080 --> 00:05:51,900 Al igual que si el factor limitante aquí es que con un bit sólo se puede 152 00:05:51,900 --> 00:05:55,977 representar a dos estados, 0 o 1, blanco o negro, ¿qué quieres que haga? 153 00:05:55,977 --> 00:05:56,810 AUDIENCIA: Más datos. 154 00:05:56,810 --> 00:05:58,813 DAVID J. MALAN: más bits, yeah más datos, más bits. 155 00:05:58,813 --> 00:06:01,440 Y, de hecho, eso es exactamente cómo imágenes en color están representados. 156 00:06:01,440 --> 00:06:05,120 En lugar de utilizar un solo bit, una 0 o 1 para cada píxel, cada punto, 157 00:06:05,120 --> 00:06:06,170 sólo tiene que utilizar múltiples. 158 00:06:06,170 --> 00:06:09,660 Utilizar Tal 8, tal vez, más comúnmente utilizar 24, y de hecho, en la Serie de problemas 159 00:06:09,660 --> 00:06:13,300 4, ¿quieres jugar con un archivo formato de 24 bits que utiliza normalmente. 160 00:06:13,300 --> 00:06:15,430 >> Pero la mayoría de ustedes probablemente familiarizados con los archivos JPEG. 161 00:06:15,430 --> 00:06:17,460 Si alguna vez has tomado una foto en su teléfono, 162 00:06:17,460 --> 00:06:20,360 o subido o ha visto algo en Facebook o Flickr, cualquier número 163 00:06:20,360 --> 00:06:24,882 de sitios web basados ​​en las fotos, no tienes Probablemente visto una imagen JPEG antes. 164 00:06:24,882 --> 00:06:27,840 Y resulta que, este es el archivo formato que vamos a utilizar en PSet 4, 165 00:06:27,840 --> 00:06:30,340 por el que se va a tiene que recuperar imágenes 166 00:06:30,340 --> 00:06:35,160 que he borrado accidentalmente de un tarjeta de memoria dañada en la cámara, 167 00:06:35,160 --> 00:06:35,800 si se quiere. 168 00:06:35,800 --> 00:06:38,490 >> Y resulta que a pesar de que JPEG es bastante sophisticated-- 169 00:06:38,490 --> 00:06:40,906 es mucho más sofisticado que los puntos blancos y negros 170 00:06:40,906 --> 00:06:44,480 que vimos hace un momento, porque hay algoritmos realidad de fantasía que 171 00:06:44,480 --> 00:06:47,410 se utilizan para comprimir un JPEG, por lo que se puede tener una muy buena, 172 00:06:47,410 --> 00:06:49,832 calidad de imagen, pero utilizando relativamente pocos bits. 173 00:06:49,832 --> 00:06:51,790 Y volveremos a compresión en poco tiempo. 174 00:06:51,790 --> 00:06:56,280 Resulta que la primera tres bytes en un image-- JPEG 175 00:06:56,280 --> 00:07:02,750 no importa lo que usted ha tomado una fotografía de-- son los valores 255, 216, 255. 176 00:07:02,750 --> 00:07:05,990 >> En otras palabras, si sólo ver que el patrón de bits, 177 00:07:05,990 --> 00:07:09,180 representado aquí como de tres bytes o 24 bits en total, 178 00:07:09,180 --> 00:07:13,810 con alta probabilidad se puede inferir que usted está buscando en esta primera de tres 179 00:07:13,810 --> 00:07:15,230 bytes de un archivo JPEG. 180 00:07:15,230 --> 00:07:18,040 Y esto es lo que se conoce como la firma de un JPEG. 181 00:07:18,040 --> 00:07:20,540 Una gran cantidad de formatos de archivo por ahí tienden a comenzar 182 00:07:20,540 --> 00:07:23,735 con ciertos patrones de 0s y 1s, para que Windows y Mac OS y iOS, 183 00:07:23,735 --> 00:07:28,272 y Android sabe qué tipo de archivo que son, además del archivo de llamada 184 00:07:28,272 --> 00:07:29,730 extensión que una gran cantidad de archivos tiene. 185 00:07:29,730 --> 00:07:32,590 Si ha .jpg, eso es otra pista a la computadora. 186 00:07:32,590 --> 00:07:35,310 >> Así que vamos ahora mira esto un poco más técnicamente. 187 00:07:35,310 --> 00:07:37,390 Sabemos que el decimal sistema es del 0 al 9. 188 00:07:37,390 --> 00:07:38,740 Sabemos binario es 0 y 1. 189 00:07:38,740 --> 00:07:41,842 Y si usted piensa de nuevo a PSet 0, tuvimos que luchas con, 190 00:07:41,842 --> 00:07:43,800 para un poco, algo llamado hexadecimal, 191 00:07:43,800 --> 00:07:47,320 donde usted tiene 16 dígitos, en lugar de 10 o en lugar de 2. 192 00:07:47,320 --> 00:07:50,405 Y esas cifras, por convención, son del 0 al 9 y luego un 193 00:07:50,405 --> 00:07:55,040 a través de f, donde f representa lo que número decimal, al igual que una cordura rápida 194 00:07:55,040 --> 00:07:56,640 comprobar? 195 00:07:56,640 --> 00:07:57,610 Por lo tanto, 15. 196 00:07:57,610 --> 00:08:01,390 Y algo que debe representar el 10, justo por naturaleza de la orden que he dado. 197 00:08:01,390 --> 00:08:04,350 Es sólo una convención arbitraria, pero es bastante estándar. 198 00:08:04,350 --> 00:08:06,870 >> Así que si nos fijamos en este patrón tres bytes-- vamos 199 00:08:06,870 --> 00:08:09,620 acaba de empezar a mirar en de una manera consistente con la forma 200 00:08:09,620 --> 00:08:12,450 científicos de la computación en general mirar y pensar acerca de los archivos. 201 00:08:12,450 --> 00:08:15,580 Por supuesto que puede pensar archivos en 0s y 1s, y decimal, 202 00:08:15,580 --> 00:08:19,340 pero en realidad, tendemos a usar binaria o más típicamente hexadecimal-- 203 00:08:19,340 --> 00:08:20,760 de vuelta de PSet 0. 204 00:08:20,760 --> 00:08:25,857 Así que permítanme propongo 255, 216, y 255 son sólo estos patrones de 0s y 1s. 205 00:08:25,857 --> 00:08:28,440 Y se puede comprobar esto si quieren hacer los cálculos de la Semana 0. 206 00:08:28,440 --> 00:08:30,810 Pero, por ahora, sólo asumir que esto es correcto. 207 00:08:30,810 --> 00:08:33,850 Yo sólo he reescrito de tres decimales números como tres valores binarios. 208 00:08:33,850 --> 00:08:36,100 Ahora lo que voy a hacer es sólo tiene que añadir un poco de espacio blanco, 209 00:08:36,100 --> 00:08:37,266 sólo por el bien de la legibilidad. 210 00:08:37,266 --> 00:08:39,940 Y fíjense, yo sólo voy para mover cosas aparte. 211 00:08:39,940 --> 00:08:43,090 Así que antes, después, antes, después. 212 00:08:43,090 --> 00:08:46,180 Yo estoy haciendo nada interesante otra que sólo la difusión de las cosas de modo 213 00:08:46,180 --> 00:08:50,380 que la notificación cada conjunto de ocho años bits es ahora dos conjuntos de cuatro bits. 214 00:08:50,380 --> 00:08:54,920 Esto es útil porque hexadecimal es particularmente moda 215 00:08:54,920 --> 00:09:00,930 porque cada dígito hexadecimal de 0 a f, o más específicamente de 0 a 15, 216 00:09:00,930 --> 00:09:03,430 puede ser representada con exactamente cuatro bits. 217 00:09:03,430 --> 00:09:07,960 En otras palabras, en hexadecimal si quiere representar un 0, es sólo 0000, 218 00:09:07,960 --> 00:09:08,780 cuatro ceros. 219 00:09:08,780 --> 00:09:13,997 Y si usted quiere representar 15, es 1,111, que es de cuatro bits. 220 00:09:13,997 --> 00:09:16,080 Y si se hacen las cuentas, si este es el lugar de las unidades, 221 00:09:16,080 --> 00:09:18,210 este es el lugar 16, eso va a dar usted-- 222 00:09:18,210 --> 00:09:19,960 más bien, que va a-- lo siento, en binario, 223 00:09:19,960 --> 00:09:23,660 eso va a dar 15, queridos lugar, twos lugar, a cuatro patas y ochos lugar. 224 00:09:23,660 --> 00:09:26,821 Así que permítanme propongo que un conjunto de cuatro bits de la izquierda 225 00:09:26,821 --> 00:09:28,070 es lo que vamos a llamar a f. 226 00:09:28,070 --> 00:09:30,110 Es el mayor número que puede representar con cuatro bits. 227 00:09:30,110 --> 00:09:33,300 Y ya sabemos de hexadecimal, f es la más grande de dígitos en hexadecimal. 228 00:09:33,300 --> 00:09:36,020 Tenemos otro f allí, dos más allá. 229 00:09:36,020 --> 00:09:38,980 Y por ahora, acaba de tomar en la fe que he hecho el derecho de matemáticas 230 00:09:38,980 --> 00:09:41,890 y que la mitad izquierda de esos bits, 1101, 231 00:09:41,890 --> 00:09:43,980 es lo mismo que d en hexadecimal. 232 00:09:43,980 --> 00:09:46,490 Y la mano derecha, 1000, está a sólo 8. 233 00:09:46,490 --> 00:09:48,140 >> Y de que uno fácil de ver, ¿no? 234 00:09:48,140 --> 00:09:51,670 El 8 represents-- es correcto debajo de ese lugar ochos. 235 00:09:51,670 --> 00:09:56,040 Así que tenemos una en la columna de la ochos y nada en las cuatro patas, dos en dos queridos o. 236 00:09:56,040 --> 00:09:59,830 Así que ahora más convencional, los seres humanos tienden escribir dígitos hexadecimales como este, 237 00:09:59,830 --> 00:10:03,000 sólo les aplastas juntos, y luego se les prefijo 0x. 238 00:10:03,000 --> 00:10:05,920 No significa nada que no sea una pista visual a un human-- 239 00:10:05,920 --> 00:10:10,350 aquí viene un value-- hexadecimal porque puede que no de otra manera sería obvio. 240 00:10:10,350 --> 00:10:13,629 >> Es decir, en última instancia, que el patrón de ceros y unos, 241 00:10:13,629 --> 00:10:16,170 o el patrón de hexadecimal dígitos equivalentemente que eres 242 00:10:16,170 --> 00:10:18,990 va a empezar a buscar en Boletín de problemas 4 es esto-- 243 00:10:18,990 --> 00:10:22,120 y el problema Set 4 spec caminará a través de esto con más detail-- 244 00:10:22,120 --> 00:10:25,344 pero se dan cuenta como una especie de arcano como esto podría parecer a primera vista, 245 00:10:25,344 --> 00:10:27,010 vas a empezar a ver esto mucho. 246 00:10:27,010 --> 00:10:30,320 Y de hecho, incluso en GDB, el depurador introdujimos el lunes 247 00:10:30,320 --> 00:10:35,440 y Dan introduce en PSet 3, va a menudo le mostrará valores hexadecimales 248 00:10:35,440 --> 00:10:39,910 sólo porque tienden a ser más convencional que decimal o binario 249 00:10:39,910 --> 00:10:41,157 en el mundo de las computadoras. 250 00:10:41,157 --> 00:10:42,490 Ahora vamos a poner esto en contexto. 251 00:10:42,490 --> 00:10:48,040 Muchos de ustedes pueden recordar esto imagen aquí, que vino de qué? 252 00:10:48,040 --> 00:10:51,240 Vista, por lo que incluso antes de lo que, Windows XP hicieron este debut. 253 00:10:51,240 --> 00:10:52,620 Así que este es un hermoso paisaje. 254 00:10:52,620 --> 00:10:55,940 Y de hecho, si te asomas alrededor online-- Creo que es un artículo de Wikipedia, 255 00:10:55,940 --> 00:11:00,110 en donde alguien muy sorprendentemente salió encontrado este lugar en el mundo creado 256 00:11:00,110 --> 00:11:02,240 su cámara en precisamente el lugar-- derecho 257 00:11:02,240 --> 00:11:06,510 y esto hoy parece como-- pero es exactamente la misma configuración. 258 00:11:06,510 --> 00:11:10,060 Esta imagen, sin embargo, está en un archivo formato llamado mapa de bits, b-m-p. 259 00:11:10,060 --> 00:11:12,910 Y vamos a tomar un super rápido vistazo a lo que eso significa. 260 00:11:12,910 --> 00:11:17,770 >> Pero de mapa de bits es sólo una forma diferente de imágenes que representan todavía con píxeles 261 00:11:17,770 --> 00:11:19,580 en 0 y 1, en última instancia. 262 00:11:19,580 --> 00:11:23,282 Pero al rápido vistazo, tiene una firma más interesante 263 00:11:23,282 --> 00:11:24,490 en el principio del archivo. 264 00:11:24,490 --> 00:11:26,670 No se trata sólo de tres bytes, en lugar hay 265 00:11:26,670 --> 00:11:30,770 un montón de patrones de bytes que han determinado significado. 266 00:11:30,770 --> 00:11:34,490 Por ejemplo, en algún lugar de la primeros bytes de la imagen de mapa de bits 267 00:11:34,490 --> 00:11:37,440 va a ser el tamaño de la imagen, la anchura de la imagen, 268 00:11:37,440 --> 00:11:40,390 la altura de la imagen, por lo metadatos útiles, si se quiere. 269 00:11:40,390 --> 00:11:43,940 Información útil que Photoshop o cualquier gráfico programa que utiliza 270 00:11:43,940 --> 00:11:45,180 en realidad podría preocuparse. 271 00:11:45,180 --> 00:11:47,170 >> Así más sobre esto en Problema Set 4, pero esto 272 00:11:47,170 --> 00:11:49,220 es sólo para decir que al final del dia 273 00:11:49,220 --> 00:11:52,390 todos los formatos de archivo que usted ha estado utilizando para los archivos de Microsoft Word años--, 274 00:11:52,390 --> 00:11:55,820 Números archivos, archivos de Excel, cualquier número de formatos de archivo 275 00:11:55,820 --> 00:11:57,770 que podría tener alguna extensión de archivo conocido 276 00:11:57,770 --> 00:12:00,130 son sólo 0s y 1s debajo del capó. 277 00:12:00,130 --> 00:12:02,970 Y los seres humanos han decidido lo que las convenciones son, 278 00:12:02,970 --> 00:12:08,340 lo que los patrones de 0s y 1s representan presentar una palabra frente a un archivo de Excel, 279 00:12:08,340 --> 00:12:10,322 frente a cualquier número de otros formatos de archivo. 280 00:12:10,322 --> 00:12:12,780 Así que en PSet 4, tendrá un oportunidad de jugar con eso. 281 00:12:12,780 --> 00:12:14,405 >> Pero ¿qué significa tener una estructura. 282 00:12:14,405 --> 00:12:18,012 Esto es realmente una buena segue ahora en C, que tiene sólo un par 283 00:12:18,012 --> 00:12:20,220 características de adicionales que no hemos mirado todavía. 284 00:12:20,220 --> 00:12:24,230 Es una muy pequeña lengua y uno de las características buenas de C es una estructura. 285 00:12:24,230 --> 00:12:27,300 Por ejemplo, si usted querido represent-- vamos 286 00:12:27,300 --> 00:12:33,690 Dices que quería tener una variable que representa un estudiante en algún programa. 287 00:12:33,690 --> 00:12:37,330 Tal vez estuviera escribiendo un curso programa de registro, o de compras núcleo 288 00:12:37,330 --> 00:12:38,870 herramienta, o algo así. 289 00:12:38,870 --> 00:12:42,922 ¿Cuáles son piezas de datos relacionados a un estudiante que viene a la mente? 290 00:12:42,922 --> 00:12:44,880 Como un estudiante es representado con qué valores? 291 00:12:44,880 --> 00:12:45,732 ¿Sí? 292 00:12:45,732 --> 00:12:46,940 Usted tiene un nombre como estudiante. 293 00:12:46,940 --> 00:12:48,900 ¿Qué más tiene un estudiante típico? 294 00:12:48,900 --> 00:12:49,320 >> AUDIENCIA: [inaudible] 295 00:12:49,320 --> 00:12:50,200 >> DAVID J. MALAN: Así que, lo siento. 296 00:12:50,200 --> 00:12:50,660 >> AUDIENCIA: Edad. 297 00:12:50,660 --> 00:12:52,980 >> DAVID J. MALAN: Una edad o cumpleaños equivalentemente, sí. 298 00:12:52,980 --> 00:12:53,557 ¿Qué otra cosa? 299 00:12:53,557 --> 00:12:54,390 AUDIENCIA: número de identificación? 300 00:12:54,390 --> 00:12:57,460 DAVID J. MALAN: Así que un número de identificación, tal vez un número de teléfono, tal vez un dormitorio, o casa, 301 00:12:57,460 --> 00:12:58,670 o la universidad, o algo así. 302 00:12:58,670 --> 00:13:01,820 Cualquier número de piezas de datos que que pueda tener en su lista de contactos 303 00:13:01,820 --> 00:13:03,890 es lo que se podría definir un estudiante. 304 00:13:03,890 --> 00:13:08,490 Así que si lo que queríamos hacer esto, en el código, que podríamos hacer algo tan simple como esto. 305 00:13:08,490 --> 00:13:15,670 Puede ser que tengamos un programa para que tiene digamos, int main (void). 306 00:13:15,670 --> 00:13:18,920 Y si quiero representar una estudiante que podría tener, por ejemplo, 307 00:13:18,920 --> 00:13:24,330 una cadena llamado nombre para ese estudiante, una cadena llamada dormitorio para ese estudiante, 308 00:13:24,330 --> 00:13:26,900 tal vez un int llamado ID para ese estudiante. 309 00:13:26,900 --> 00:13:30,840 Y porque estoy usando cuerdas, me tenga que volver atrás y aguantar CS50.h. 310 00:13:30,840 --> 00:13:33,300 Tal vez voy a necesitar stdio.h. 311 00:13:33,300 --> 00:13:38,190 Así que permítanme preventivamente hago esas y estoy va a llamar a este student.c por ahora 312 00:13:38,190 --> 00:13:40,080 y guarde este. 313 00:13:40,080 --> 00:13:44,206 >> Y ahora puedo hacer algo con estas variables. 314 00:13:44,206 --> 00:13:46,830 Y sólo vamos a escribir que como un comentario en pseudo código, 315 00:13:46,830 --> 00:13:48,829 porque no es interesante lo que hacemos por el momento. 316 00:13:48,829 --> 00:13:51,242 Aceptar, por lo que este es un programa que de alguna manera almacena un estudiante. 317 00:13:51,242 --> 00:13:53,450 ¿Qué es lo que quiero hacer si desea almacenar dos estudiantes? 318 00:13:53,450 --> 00:13:55,991 Así que mi primer instinto va a estar bien, espera un minuto, 319 00:13:55,991 --> 00:14:01,920 si tengo otro estudiante por qué no hacer yo acaba de hacer nombre de la cadena 2, cadena de dormitorio 2, 320 00:14:01,920 --> 00:14:04,190 int id2. 321 00:14:04,190 --> 00:14:06,540 Y lo hemos hecho se ha ido por esto antes 322 00:14:06,540 --> 00:14:10,890 y lo que era nuestra solución a lo que parece a ser una especie de pasta de copia hackish 323 00:14:10,890 --> 00:14:11,555 trabajo aquí? 324 00:14:11,555 --> 00:14:12,346 AUDIENCIA: Una matriz. 325 00:14:12,346 --> 00:14:13,830 DAVID J. MALAN: Sí, podríamos utilizar una matriz. 326 00:14:13,830 --> 00:14:15,620 Haga esto muy rápidamente se vuelve difícil de manejar. 327 00:14:15,620 --> 00:14:18,453 Usted tiene que ordenar de forma arbitraria iniciar nombrar todas estas variables. 328 00:14:18,453 --> 00:14:22,190 Y usted, el ser humano, tiene que mantener seguimiento que corresponde OK nombre2 329 00:14:22,190 --> 00:14:25,060 con dorm2 corresponde con id2. 330 00:14:25,060 --> 00:14:26,200 Sólo se convierte en un desastre. 331 00:14:26,200 --> 00:14:29,350 Así que es mucho más fácil, recordar desde hace unas semanas, 332 00:14:29,350 --> 00:14:34,300 sólo tener que llamados nombres de cadena y tal vez nos dé tres de ellos. 333 00:14:34,300 --> 00:14:36,940 Y entonces tal vez tenemos dormitorios cadena y tienen 334 00:14:36,940 --> 00:14:41,900 tres de ellos, o con una constante, int identificadores y tienen tres de ellos. 335 00:14:41,900 --> 00:14:45,250 Pero incluso ahora, esto se siente un poco descuidado, derecha. 336 00:14:45,250 --> 00:14:49,440 Estamos hablando de los estudiantes y sin embargo, Estoy realmente detenerse en el nivel bajo 337 00:14:49,440 --> 00:14:50,470 detalles de implementación. 338 00:14:50,470 --> 00:14:52,790 El estudiante es un nombre y una residencia de estudiantes y el ID. 339 00:14:52,790 --> 00:14:59,814 >> ¿Por qué no puedo simplemente declarar una variable llamó estudiante y lo llaman es. 340 00:14:59,814 --> 00:15:02,230 Y si quiero otro estudiante, ¿por qué no simplemente lo llamo t. 341 00:15:02,230 --> 00:15:05,260 O si quiero un montón de los estudiantes, ¿por qué no lo hago yo sólo 342 00:15:05,260 --> 00:15:09,740 decir que tengo toda una clase de estudiantes, y es tres de ellos. 343 00:15:09,740 --> 00:15:12,470 En otras palabras, ¿por qué no puedo ir con mi propio tipo de datos, llamada 344 00:15:12,470 --> 00:15:15,641 Los estudiantes, dentro de los cuales es un nombre, es una identificación, es una residencia de estudiantes, 345 00:15:15,641 --> 00:15:16,890 es cualquier número de otros campos. 346 00:15:16,890 --> 00:15:19,030 Y resulta que puede hacer exactamente eso. 347 00:15:19,030 --> 00:15:21,850 >> Así que C tiene esta característica denominada struct. 348 00:15:21,850 --> 00:15:24,700 Esa es una característica de un lenguaje que nos permite hacer exactamente esto. 349 00:15:24,700 --> 00:15:28,370 Voy a seguir adelante y abrir structs.h 350 00:15:28,370 --> 00:15:32,299 donde vamos a ver el siguiente definición de un estudiante. 351 00:15:32,299 --> 00:15:35,215 Resulta - y éste es incluso más sencillo que el que implica un ID 352 00:15:35,215 --> 00:15:36,080 hace un momento. 353 00:15:36,080 --> 00:15:39,120 Si quieres llegar a su tipo de datos hecha en casa, 354 00:15:39,120 --> 00:15:42,750 y además de int y carbón y flotar y todos esos otros que existen, 355 00:15:42,750 --> 00:15:45,810 usted puede hacerlo, literalmente, escribir typedef struct, 356 00:15:45,810 --> 00:15:47,880 a continuación, algunas llaves, dentro de los cuales usted 357 00:15:47,880 --> 00:15:51,460 una lista de las variables que desea asociar con estos nuevos datos a medida 358 00:15:51,460 --> 00:15:55,670 escriba como un nombre y un dormitorio, y luego después de las llaves 359 00:15:55,670 --> 00:15:57,860 le das un nombre al nuevo tipo de datos. 360 00:15:57,860 --> 00:15:59,220 Así, por ejemplo, de los estudiantes. 361 00:15:59,220 --> 00:16:03,247 >> Y lo que es bueno de esto es que ahora si nos fijamos en el código correspondiente, 362 00:16:03,247 --> 00:16:05,080 la convención, primero de todos, es poner este 363 00:16:05,080 --> 00:16:08,230 en un archivo llamado algo dot h, un archivo de cabecera, que no tenemos 364 00:16:08,230 --> 00:16:09,780 comenzado a usar nosotros mismos demasiado. 365 00:16:09,780 --> 00:16:12,120 Pero vamos a empezar usando un poco ahora. 366 00:16:12,120 --> 00:16:18,650 Y lo que podemos hacer con esto, en última instancia, en estas pocas líneas de código 367 00:16:18,650 --> 00:16:22,130 se declare exactamente eso tipo de datos, un estudiante. 368 00:16:22,130 --> 00:16:23,230 Y ahora vamos a utilizar la misma. 369 00:16:23,230 --> 00:16:27,274 >> Voy ahora a entrar en un archivo llamado structs1.c. 370 00:16:27,274 --> 00:16:29,440 Y vamos a echar un vistazo a una algunas características aquí. 371 00:16:29,440 --> 00:16:32,250 Así las cosas aquí es sobre todo familiar, y vamos a 372 00:16:32,250 --> 00:16:35,040 volver a lo que no lo es familiar en un momento. 373 00:16:35,040 --> 00:16:39,880 Por supuesto, esto es incluyendo mi propia archivo de cabecera, que es nuevo, así, 374 00:16:39,880 --> 00:16:42,580 a excepción de PSet 3 donde, retiro, tenemos helpers.h. 375 00:16:42,580 --> 00:16:45,150 Así que usted puede recordar helpers.h #include. 376 00:16:45,150 --> 00:16:49,381 >> ¿Por qué aunque estoy usando comillas en lugar de corchetes angulares? 377 00:16:49,381 --> 00:16:50,630 ¿Cuándo puedo elegir entre ellos? 378 00:16:50,630 --> 00:16:52,310 Casi siempre me parece utilizar paréntesis angulares. 379 00:16:52,310 --> 00:16:55,040 Y luego, de repente, en línea de seis estoy usando comillas dobles. 380 00:16:55,040 --> 00:16:55,860 ¿Por qué podría ser? 381 00:16:55,860 --> 00:16:56,700 ¿Sí? 382 00:16:56,700 --> 00:16:57,725 >> AUDIENCIA: [inaudible] 383 00:16:57,725 --> 00:16:59,350 DAVID J. MALAN: Eso es un real, ¿qué? 384 00:16:59,350 --> 00:17:00,559 AUDIENCIA: Eso está en su IDE. 385 00:17:00,559 --> 00:17:02,475 DAVID J. MALAN: Sí, eso es en mi IDE real. 386 00:17:02,475 --> 00:17:05,690 Y no habitan en el IDE, porque eso es sólo una herramienta que estoy usando. 387 00:17:05,690 --> 00:17:08,119 Eso es en mi actual directorio, específicamente. 388 00:17:08,119 --> 00:17:11,647 Así structs.h es mi propio archivo no se instala en el IDE, 389 00:17:11,647 --> 00:17:14,480 en el sistema operativo en sí mismo, sino que es en mi directorio actual. 390 00:17:14,480 --> 00:17:16,910 Así que la convención es que si quieres para incluir su propio archivo de cabecera, 391 00:17:16,910 --> 00:17:18,200 sólo tiene que utilizar comillas dobles. 392 00:17:18,200 --> 00:17:23,290 >> ¿Cómo se llama esto en línea 8, en términos generales? 393 00:17:23,290 --> 00:17:25,200 ¿Esto es lo que? 394 00:17:25,200 --> 00:17:28,220 algo #define. 395 00:17:28,220 --> 00:17:31,040 Esto representa constantes, ¿verdad? 396 00:17:31,040 --> 00:17:33,140 Si usted quiere tener un valor en su programa 397 00:17:33,140 --> 00:17:35,110 que se utiliza en su totalidad montón de veces, es 398 00:17:35,110 --> 00:17:39,330 buena convención para factorizar a cabo, declarará, con el símbolo de hash 399 00:17:39,330 --> 00:17:43,340 definir, entonces, por convención, en todo mayúsculas palabra-- aunque no es 400 00:17:43,340 --> 00:17:45,320 estrictamente necesario, pero es convención humana 401 00:17:45,320 --> 00:17:47,210 para capitalizar constantes para que saltan 402 00:17:47,210 --> 00:17:50,380 por lo que el espacio y el visually-- entonces el valor que desea ser 403 00:17:50,380 --> 00:17:52,250 equivalente a nombre de esa constante. 404 00:17:52,250 --> 00:17:56,110 No coma, pero simplemente seguir ese patrón de allí. 405 00:17:56,110 --> 00:17:57,770 >> Así que lo que estoy haciendo en este código real. 406 00:17:57,770 --> 00:18:00,660 Así que echemos un vistazo a el programa principal aquí. 407 00:18:00,660 --> 00:18:04,080 En la línea 12 porque yo han incluido structs.h, 408 00:18:04,080 --> 00:18:06,492 Ahora tengo mágicamente en mi disposición un nuevo tipo de datos. 409 00:18:06,492 --> 00:18:09,200 Yo no sólo tengo acceso a int, y char, y el flotador, y la cadena, 410 00:18:09,200 --> 00:18:10,060 y azul y otros. 411 00:18:10,060 --> 00:18:12,470 Ahora tengo acceso a un tipo de datos de los estudiantes. 412 00:18:12,470 --> 00:18:17,740 Así, en la línea 12, que estoy combinando dos ideas-- solo un tipo de datos personalizados y dos, 413 00:18:17,740 --> 00:18:18,940 utilizando una matriz. 414 00:18:18,940 --> 00:18:21,700 Y así, en este programa si Quiero apoyar realidad 415 00:18:21,700 --> 00:18:24,320 tres estudiantes de diferentes en mi programa, 416 00:18:24,320 --> 00:18:30,480 simplemente puede decir dame una variable llamados estudiantes, cada uno de los cuales 417 00:18:30,480 --> 00:18:32,970 es de los estudiantes de tipo, que es mi tipo de datos personalizado. 418 00:18:32,970 --> 00:18:35,890 Y, en concreto, dame tres de ellos en mi matriz. 419 00:18:35,890 --> 00:18:37,750 >> Así que ahora, ¿qué hacemos en este programa? 420 00:18:37,750 --> 00:18:40,670 He aquí sólo para la iteración del bucle de 0 a 3, porque eso es 421 00:18:40,670 --> 00:18:42,110 lo que el valor de los estudiantes es. 422 00:18:42,110 --> 00:18:44,420 Sólo estoy pidiendo al usuario dame el nombre del estudiante. 423 00:18:44,420 --> 00:18:48,090 Y luego, en la línea 17, que tener una línea sobre todo familiar. 424 00:18:48,090 --> 00:18:50,370 Tenemos nuestro viejo amigo GetString a la derecha. 425 00:18:50,370 --> 00:18:52,345 ¿Y qué pedazo de sintaxis es aparentemente nueva, 426 00:18:52,345 --> 00:18:55,130 si nunca has programado en C antes, y nunca han utilizado las estructuras? 427 00:18:55,130 --> 00:18:55,510 ¿Sí? 428 00:18:55,510 --> 00:18:56,417 >> AUDIENCIA: El .name. 429 00:18:56,417 --> 00:18:57,500 DAVID J. MALAN: El .name. 430 00:18:57,500 --> 00:19:01,220 Pero esto no es demasiado de un salto, porque ahora los estudiantes soporte de E 431 00:19:01,220 --> 00:19:02,590 le da al estudiante de orden i. 432 00:19:02,590 --> 00:19:04,730 Y si quieres bucear dentro de esa estructura, 433 00:19:04,730 --> 00:19:09,490 sólo tiene que utilizar un solo período y a continuación, el nombre de la variable dentro, 434 00:19:09,490 --> 00:19:11,900 o la propiedad dentro de ese Quieres tener acceso a. 435 00:19:11,900 --> 00:19:14,816 Del mismo modo entonces, si a continuación, pedir al usuario, dame residencia del estudiante, 436 00:19:14,816 --> 00:19:18,390 se puede almacenar de manera similar que cadena en la variable de residencia en el interior 437 00:19:18,390 --> 00:19:19,940 de que la estructura de los estudiantes. 438 00:19:19,940 --> 00:19:21,410 >> Y ahora las cosas se ponen un poco de fantasía. 439 00:19:21,410 --> 00:19:24,420 Y esto se va a ver en tal vez un montón bastante pronto. 440 00:19:24,420 --> 00:19:27,970 Pero verás esto mucho más en PSet 4, por lo que vamos a simplemente mirar a ahora. 441 00:19:27,970 --> 00:19:33,364 Resulta que en la línea 23 a través 38, ¿qué crees que tal vez estoy haciendo? 442 00:19:33,364 --> 00:19:35,530 He quitado los comentarios para hoy, pero la versión 443 00:19:35,530 --> 00:19:38,660 del código en línea para referencia tiene todos los comentarios. 444 00:19:38,660 --> 00:19:40,171 ¿Qué me parece que estoy haciendo? 445 00:19:40,171 --> 00:19:42,530 >> AUDIENCIA: Guardar el archivo con todo la información que el usuario ha introducido. 446 00:19:42,530 --> 00:19:44,530 >> DAVID J. MALAN: Sí, exactamente, esta es una nueva forma 447 00:19:44,530 --> 00:19:46,370 que estamos viendo dos, otra característica de C, 448 00:19:46,370 --> 00:19:48,700 mediante el cual puedo crear mis propios archivos. 449 00:19:48,700 --> 00:19:51,580 Hasta ahora, casi todos los programas que has escrito es apátrida. 450 00:19:51,580 --> 00:19:53,334 Tan pronto como se hace correr, eso es todo. 451 00:19:53,334 --> 00:19:55,000 No hay memoria o recuerdo de ella. 452 00:19:55,000 --> 00:19:56,110 No hay archivo guardado. 453 00:19:56,110 --> 00:19:58,120 Pero si usted quiere guardar entrada que tiene 454 00:19:58,120 --> 00:20:02,100 sucedido, como en un juego o un programa así, resulta que podemos hacerlo. 455 00:20:02,100 --> 00:20:04,360 Y verás esto más en PSet 4 y en la Sección. 456 00:20:04,360 --> 00:20:08,661 Pero esta línea 23 esencialmente crea un archivo llamado students.csv. 457 00:20:08,661 --> 00:20:10,160 Y que podría haber visto esto antes. 458 00:20:10,160 --> 00:20:14,250 Incluso si nunca has estudiado CS antes, CSV es de variables separadas por comas. 459 00:20:14,250 --> 00:20:19,000 Es como una muy pobre hombre versión de un archivo de Excel, 460 00:20:19,000 --> 00:20:22,270 lo que significa que se puede abrir en Excel y en Números de Apple, 461 00:20:22,270 --> 00:20:23,830 y tiene filas y columnas. 462 00:20:23,830 --> 00:20:26,485 Pero no es una propiedad formato como Microsoft o Apple. 463 00:20:26,485 --> 00:20:29,840 Son sólo las comas que separan el valores que veremos en un momento. 464 00:20:29,840 --> 00:20:31,010 >> Y acaba de tomar una conjetura. 465 00:20:31,010 --> 00:20:33,480 En la línea 23, en el mismo final, mi segundo argumento 466 00:20:33,480 --> 00:20:37,700 a esta nueva función llamada f abierto para abrir el archivo es w. 467 00:20:37,700 --> 00:20:39,430 Lo que podría denotar w? 468 00:20:39,430 --> 00:20:40,022 ¿Sí? 469 00:20:40,022 --> 00:20:41,260 >> AUDIENCIA: Se le permite escribir en el fichero? 470 00:20:41,260 --> 00:20:42,630 >> DAVID J. MALAN: Permite se escribe en el archivo. 471 00:20:42,630 --> 00:20:44,810 Así que hay un par de variantes que podemos enchufar aquí. 472 00:20:44,810 --> 00:20:47,184 Pero si lo que quieres leer el archivo, es mirarlo 473 00:20:47,184 --> 00:20:50,010 y leerlo en la memoria, sólo tiene que utilizar comillas "r". 474 00:20:50,010 --> 00:20:53,110 Si desea escribir en el archivo, utilice comillas "w". 475 00:20:53,110 --> 00:20:55,190 También ha anexar y un par de otras cosas 476 00:20:55,190 --> 00:20:57,356 si desea modificar los archivos existentes. 477 00:20:57,356 --> 00:21:00,480 Ahora vamos a seguir viendo a esta cosa, entonces nos va a volver a la línea 24. 478 00:21:00,480 --> 00:21:02,640 NULL, resulta, es un valor especial que 479 00:21:02,640 --> 00:21:06,070 pueden ser devueltos por ciertas funciones si algo ha ido wrong-- 480 00:21:06,070 --> 00:21:08,490 si el archivo no existe, si has quedado sin memoria, 481 00:21:08,490 --> 00:21:09,620 o un montón de otros errores. 482 00:21:09,620 --> 00:21:13,470 Pero por ahora, vamos a suponer que esta es la comprobación de errores simplemente convencional. 483 00:21:13,470 --> 00:21:17,090 Aquí, en la línea 26, que estoy iteración de 0 a 3 sobre todos mis estudiantes. 484 00:21:17,090 --> 00:21:20,470 Y esto es una especie de clase de una nueva función, fprintf, 485 00:21:20,470 --> 00:21:21,460 pero sólo tomar una conjetura. 486 00:21:21,460 --> 00:21:24,370 Si printf es sólo de impresión una cadena con formato, 487 00:21:24,370 --> 00:21:26,507 ¿qué significa probablemente fprintf? 488 00:21:26,507 --> 00:21:27,590 AUDIENCIA: Imprimir a un archivo. 489 00:21:27,590 --> 00:21:29,290 DAVID J. MALAN: Imprima una cadena con formato a un archivo. 490 00:21:29,290 --> 00:21:31,180 Eso es lo que la tasa adicional medios f es archivo. 491 00:21:31,180 --> 00:21:36,420 Y el nuevo primer argumento tiene que ser la variable que representa el archivo. 492 00:21:36,420 --> 00:21:38,866 Entonces sólo tenemos un formato cadena como printf. 493 00:21:38,866 --> 00:21:40,740 Y a pesar de que este la sintaxis es nuevo, esto sólo 494 00:21:40,740 --> 00:21:44,610 significa conectar el nombre del estudiante, plug-in de la residencia de estudiantes, y luego 495 00:21:44,610 --> 00:21:47,160 con fclose, cierre el archivo. 496 00:21:47,160 --> 00:21:49,730 Y luego lastly-- esto es nuevo y volveremos a este 497 00:21:49,730 --> 00:21:53,240 antes long-- estoy liberando el estudiante por razones 498 00:21:53,240 --> 00:21:54,860 eso pasó por encima de allí. 499 00:21:54,860 --> 00:21:56,820 Pero volveremos a que antes de long-- 500 00:21:56,820 --> 00:21:59,820 eso es debido a cómo es GetString en realidad trabajan debajo de la campana. 501 00:21:59,820 --> 00:22:01,280 >> Así que vamos a echar un vistazo rápido aquí. 502 00:22:01,280 --> 00:22:04,380 Si escribo ls en mi directorio, cuenta de que no lo hago 503 00:22:04,380 --> 00:22:09,360 tener un archivo llamado students.csv, simplemente no hay, no existe. 504 00:22:09,360 --> 00:22:14,965 Así que si ahora puedo compilar este programa, hacer estructuras-1,. / estructuras-1, 505 00:22:14,965 --> 00:22:20,570 y yo voy a seguir adelante y escribir Andi, que vive en Berkeley en Yale. 506 00:22:20,570 --> 00:22:26,350 Vamos a tener que Rob vive en Thayer estos días. 507 00:22:26,350 --> 00:22:33,760 Y vamos a llegar con el lugar donde es, creo, María está en Mather, 508 00:22:33,760 --> 00:22:35,100 si he recordado correctamente. 509 00:22:35,100 --> 00:22:36,460 >> Así que nada parece suceder. 510 00:22:36,460 --> 00:22:40,680 Pero si escribo ls ahora, hay students.csv. 511 00:22:40,680 --> 00:22:43,080 Vamos a seguir adelante y students.csv abierta. 512 00:22:43,080 --> 00:22:46,050 Esto es de nuevo una muy formato de archivo de peso ligero. 513 00:22:46,050 --> 00:22:49,570 Pero simplemente he adoptado una convención que tengo dos filas y columnas aquí. 514 00:22:49,570 --> 00:22:52,020 La primera columna es primeros nombres de las personas. 515 00:22:52,020 --> 00:22:55,740 La segunda columna es el estudiante de dormitorio, o universidad, o una casa, o lo que sea. 516 00:22:55,740 --> 00:22:57,900 Y ahora me he ahorrado este permanentemente en un archivo. 517 00:22:57,900 --> 00:22:59,280 >> Así que no es tan interesante. 518 00:22:59,280 --> 00:23:02,980 Pero esto es sólo un peldaño en el camino ahora de ser capaz de mantener la información 519 00:23:02,980 --> 00:23:04,040 de forma permanente. 520 00:23:04,040 --> 00:23:08,340 Así que vamos a ver ahora qué más podemos ver con estas y otras características. 521 00:23:08,340 --> 00:23:10,729 Pero primero, cualquier pregunta? 522 00:23:10,729 --> 00:23:12,145 Eso era mucho, y eso fue rápido. 523 00:23:12,145 --> 00:23:16,131 Pero verás un montón más en PSet 4, también. 524 00:23:16,131 --> 00:23:16,630 ¿Sí? 525 00:23:16,630 --> 00:23:19,360 >> AUDIENCIA: ¿Hay una manera de seguir añadiendo nombres a ese archivo? 526 00:23:19,360 --> 00:23:19,880 >> DAVID J. MALAN: Buena pregunta. 527 00:23:19,880 --> 00:23:21,800 ¿Hay una manera de continuar añadiendo nombres a ese archivo? 528 00:23:21,800 --> 00:23:22,340 Sí. 529 00:23:22,340 --> 00:23:24,630 Y, de hecho, si al final hasta volver a abrir el archivo, 530 00:23:24,630 --> 00:23:26,780 usted utilizaría cotización fin de la cita "a" para añadir, 531 00:23:26,780 --> 00:23:31,090 que acaba de añadir una nueva línea, un nueva línea una y otra vez, exactamente. 532 00:23:31,090 --> 00:23:32,010 Buena pregunta. 533 00:23:32,010 --> 00:23:32,950 ¿Otras preguntas? 534 00:23:32,950 --> 00:23:33,450 ¿Sí? 535 00:23:33,450 --> 00:23:35,580 AUDIENCIA: Si ejecutó el programa de nuevo en este momento, 536 00:23:35,580 --> 00:23:38,000 habría que seguir añadiendo nombres a la Archivo o tendría que abrir un nuevo archivo? 537 00:23:38,000 --> 00:23:38,740 >> DAVID J. MALAN: Ah, buena pregunta. 538 00:23:38,740 --> 00:23:41,448 Si ejecutó el programa de nuevo a la derecha Ahora, tal vez escrito en nuevos nombres, 539 00:23:41,448 --> 00:23:44,820 habría que añadir al archivo o sobrescribir el archivo? 540 00:23:44,820 --> 00:23:47,420 Esto último, porque estoy No se utiliza el modo de agregación. 541 00:23:47,420 --> 00:23:49,930 Y porque estoy ciegamente abrir el archivo para escritura, 542 00:23:49,930 --> 00:23:51,310 que sólo va a sobrescribir el archivo. 543 00:23:51,310 --> 00:23:54,570 Así que yo de hecho que tenga que hacer es añadir, si yo quiero tener en realidad un largo plazo 544 00:23:54,570 --> 00:23:55,350 base de datos. 545 00:23:55,350 --> 00:23:58,220 >> Ahora CSV es útil, francamente, incluso para como si eres writing-- 546 00:23:58,220 --> 00:24:00,100 y finalmente veremos este más tarde en el semestre cuando 547 00:24:00,100 --> 00:24:01,455 usamos CSVs para otros fines. 548 00:24:01,455 --> 00:24:04,920 Si desea almacenar toda la gente que se han registrado para algún evento, 549 00:24:04,920 --> 00:24:07,420 o inscrito para su estudiante grupo, o algo así, 550 00:24:07,420 --> 00:24:10,330 almacenar los datos en este tipo de formato es muy práctico. 551 00:24:10,330 --> 00:24:12,580 Debido a que, literalmente, si eran para descargar este archivo. 552 00:24:12,580 --> 00:24:14,540 Podía double-- y vamos a tratar esta realidad 553 00:24:14,540 --> 00:24:16,720 si tengo Excel o números aquí. 554 00:24:16,720 --> 00:24:19,130 >> Voy a botón derecho del ratón o control clic en mi archivo. 555 00:24:19,130 --> 00:24:20,020 ¡Vaya. 556 00:24:20,020 --> 00:24:21,830 Haga clic derecho o control clic en mi archivo. 557 00:24:21,830 --> 00:24:24,960 Vamos, mi ratón no está cooperando. 558 00:24:24,960 --> 00:24:32,694 Download-- voy a descargar todos los archivos de aquí, así 559 00:24:32,694 --> 00:24:33,860 para que yo pueda tomar éste. 560 00:24:33,860 --> 00:24:37,850 Y vamos a ver si esto funciona students.csv-- primera vez 561 00:24:37,850 --> 00:24:39,310 He activado. 562 00:24:39,310 --> 00:24:41,360 Ahora quieren ver mis contactos. 563 00:24:41,360 --> 00:24:44,310 Ahora, me tengo que registrar. 564 00:24:44,310 --> 00:24:47,620 Vea lo fácil que es utilizar CSV? 565 00:24:47,620 --> 00:24:50,840 Sí, sigue así hasta la fecha. 566 00:24:50,840 --> 00:24:52,375 OK, ahora estamos listos para la clase. 567 00:24:52,375 --> 00:24:58,750 568 00:24:58,750 --> 00:25:00,370 OK, oh, ¿qué hay de nuevo? 569 00:25:00,370 --> 00:25:02,920 OK, cerca. 570 00:25:02,920 --> 00:25:04,750 Fue mágico. 571 00:25:04,750 --> 00:25:07,280 Bien, ahora tenemos que actualizar. 572 00:25:07,280 --> 00:25:10,890 Y ahora, se olvidó de lo presento abrí originalmente, 573 00:25:10,890 --> 00:25:13,090 pero lo que A-- ahí vamos. 574 00:25:13,090 --> 00:25:16,341 OK, así que ahora tenemos un archivo de Excel. 575 00:25:16,341 --> 00:25:18,290 Gracias. 576 00:25:18,290 --> 00:25:20,764 >> OK, así que lo que hice fue la parte fácil. 577 00:25:20,764 --> 00:25:23,930 Por supuesto que podría haber instalado previamente Excel o Numbers, o cualquier programa. 578 00:25:23,930 --> 00:25:25,846 Pero esto es bueno, porque ahora puedo manipular 579 00:25:25,846 --> 00:25:28,090 los datos en un formato estándar. 580 00:25:28,090 --> 00:25:30,294 >> Así que ahora vamos contexto cambiar a donde lo dejamos 581 00:25:30,294 --> 00:25:32,710 la última vez, que iba a comenzar para despegar las ruedas de entrenamiento. 582 00:25:32,710 --> 00:25:34,543 Pero primero, no lo hiciste ver este almuerzo anterior 583 00:25:34,543 --> 00:25:38,150 de nuevo está sucediendo aquí en Fuego y Hielo en Cambridge, Sitar en New Haven. 584 00:25:38,150 --> 00:25:43,150 Regístrate en la página web CS50s ASAP para unirse a los estudiantes CS50 y el personal. 585 00:25:43,150 --> 00:25:46,090 >> Así que tomamos las ruedas de entrenamiento fuera el lunes debido a follows-- 586 00:25:46,090 --> 00:25:49,120 cuerdas ha sido declarado en Biblioteca CS50s durante algún tiempo. 587 00:25:49,120 --> 00:25:52,650 Y es bueno, porque permite que hablemos de las variables como 588 00:25:52,650 --> 00:25:54,660 palabras y frases completas y más. 589 00:25:54,660 --> 00:25:56,710 Pero resulta que la cadena no existe. 590 00:25:56,710 --> 00:26:00,200 Eso es sólo un sinónimo o un alias, que hemos creado algo que 591 00:26:00,200 --> 00:26:03,780 en realidad es un poco más técnica llamada char *. 592 00:26:03,780 --> 00:26:07,900 >> Y de hecho, vimos un ejemplo de un programa de este lunes 593 00:26:07,900 --> 00:26:11,200 que no se comportó bastante como esperábamos. 594 00:26:11,200 --> 00:26:13,630 Este fue el archivo, comparar-0. 595 00:26:13,630 --> 00:26:17,910 Y recuerdan que comparar-0, si Yo recompilar el programa del lunes 596 00:26:17,910 --> 00:26:22,670 y ejecutar compare-0 y el tipo de madre en minúsculas, y la mamá en minúsculas nuevo. 597 00:26:22,670 --> 00:26:25,320 El programa insistió en que escribir cosas diferentes, 598 00:26:25,320 --> 00:26:29,210 a pesar de que mamá, todo en minúsculas, es idéntico visualmente. 599 00:26:29,210 --> 00:26:31,990 Entonces, ¿cuál fue la respuesta corta por qué el equipo piensa 600 00:26:31,990 --> 00:26:34,500 esas dos cadenas son diferentes? 601 00:26:34,500 --> 00:26:35,250 ¿Sí? 602 00:26:35,250 --> 00:26:36,534 >> AUDIENCIA: [inaudible] 603 00:26:36,534 --> 00:26:37,450 DAVID J. MALAN: Correcto. 604 00:26:37,450 --> 00:26:39,600 Así, la mamá, la primera vez Escribo en ella, está siendo 605 00:26:39,600 --> 00:26:42,710 almacenada en algún lugar de mi equipo memoria, pero en una ubicación diferente 606 00:26:42,710 --> 00:26:44,690 que la segunda vez que escribo en mamá. 607 00:26:44,690 --> 00:26:46,580 Ahora sin duda podría ser optimizado. 608 00:26:46,580 --> 00:26:49,205 El equipo podría ser inteligente y darse cuenta de estas dos cadenas, hey, 609 00:26:49,205 --> 00:26:49,954 son idénticos. 610 00:26:49,954 --> 00:26:51,520 Permítanme no redundante almacenarlo. 611 00:26:51,520 --> 00:26:54,229 Pero las computadoras no hacen eso optimización a menos que diga que lo hagan. 612 00:26:54,229 --> 00:26:56,061 Así que, por defecto, que son sólo va a terminar 613 00:26:56,061 --> 00:26:57,670 en dos lugares diferentes en la memoria. 614 00:26:57,670 --> 00:27:01,570 Y así, para ser más claro, cuando comparamos las dos cadenas, 615 00:27:01,570 --> 00:27:03,950 El primero fue llamado s, el segundo fue llamado 616 00:27:03,950 --> 00:27:08,530 t, lo que era específicamente I comparando aquí en la línea 13? 617 00:27:08,530 --> 00:27:09,494 Sí. 618 00:27:09,494 --> 00:27:12,390 >> AUDIENCIA: Es el lugar en la memoria que la variable apuntará a. 619 00:27:12,390 --> 00:27:14,900 >> DAVID J. MALAN: Exactamente, yo era comparando el lugar en la memoria 620 00:27:14,900 --> 00:27:16,300 aquellas variables que apuntaban a. 621 00:27:16,300 --> 00:27:20,560 Así en concreto, si la madre estaba en el byte número 1, y 2, y 3, 622 00:27:20,560 --> 00:27:24,020 y 4-- porque recuerdan la barra invertida 0 tiene que ser todo el camino al final. 623 00:27:24,020 --> 00:27:29,420 Y la otra instancia de la madre, m-o-m, fue en la dirección 10, 11, 12 y 13. 624 00:27:29,420 --> 00:27:33,100 Yo estaba comparando 1, esa dirección, que la ubicación en la memoria, 625 00:27:33,100 --> 00:27:35,160 contra 10, que es obviamente no es el mismo. 626 00:27:35,160 --> 00:27:36,260 1 no es 10. 627 00:27:36,260 --> 00:27:39,620 >> Así que esto es agradable en que es bastante sencillo. 628 00:27:39,620 --> 00:27:42,870 Pero es problemático en la medida en parece que no podemos comparar cadenas. 629 00:27:42,870 --> 00:27:44,930 Así fundamentally-- y en este bajo nivel, 630 00:27:44,930 --> 00:27:47,300 si usted quiere poner en práctica un programa para comparar 631 00:27:47,300 --> 00:27:50,270 dos palabras separadas que la usuario ha escrito en cuanto a calidad, 632 00:27:50,270 --> 00:27:53,944 hacen que se alinean carbón para char, sólo en términos generales, 633 00:27:53,944 --> 00:27:55,360 ¿qué es lo que tenemos que hacer, por lo visto? 634 00:27:55,360 --> 00:27:57,940 No es suficiente sólo para mirar esas dos direcciones. 635 00:27:57,940 --> 00:27:58,860 ¿Qué necesitamos hacer? 636 00:27:58,860 --> 00:27:59,360 ¿Sí? 637 00:27:59,360 --> 00:28:01,120 >> AUDIENCIA: Iterar a través la cadena [inaudible]. 638 00:28:01,120 --> 00:28:02,600 >> DAVID J. MALAN: Sí, vamos a iterar a través de la cadena. 639 00:28:02,600 --> 00:28:05,808 Vamos a utilizar un bucle for, un bucle while, o lo que está más cómodo. 640 00:28:05,808 --> 00:28:08,840 Y si tenemos dos cadenas en alguna parte en la memoria, echemos un vistazo a cada uno de 641 00:28:08,840 --> 00:28:11,770 primer carácter, entonces cada uno es segundo carácter, a continuación, tercero, y cuarto, 642 00:28:11,770 --> 00:28:15,206 y quinto, hasta que golpeó qué valor especial centinela? 643 00:28:15,206 --> 00:28:16,080 AUDIENCIA: [inaudible] 644 00:28:16,080 --> 00:28:18,800 DAVID J. MALAN: Sí, la barra invertida cero, en cuyo punto, ya sea en cadena de 645 00:28:18,800 --> 00:28:20,100 podemos decidir que eso es todo. 646 00:28:20,100 --> 00:28:21,970 ¿Hemos emparejado cada personaje? 647 00:28:21,970 --> 00:28:22,990 En caso contrario, devuelve falso. 648 00:28:22,990 --> 00:28:24,770 Si es así, vuelva realidad. 649 00:28:24,770 --> 00:28:28,800 Y eso es exactamente lo que esta versión del programa compara-1.c hace. 650 00:28:28,800 --> 00:28:31,677 Es idéntico a lo que mirado Lunes excepto que he I 651 00:28:31,677 --> 00:28:34,760 librado de la palabra string-- aunque que no tiene impact-- funcional todo 652 00:28:34,760 --> 00:28:37,450 Que estoy haciendo ahora es la eliminación algunas ruedas de entrenamiento visual, 653 00:28:37,450 --> 00:28:40,880 sino para ver claramente que s y t son direcciones. 654 00:28:40,880 --> 00:28:43,020 Y eso es lo que la estrella, el asterisco, representa 655 00:28:43,020 --> 00:28:46,690 es una dirección, también conocida más técnicamente como un puntero. 656 00:28:46,690 --> 00:28:49,880 >> Así que cuando me declaro en s la línea 9 y decir char * s, 657 00:28:49,880 --> 00:28:52,160 eso no significa que me diera una cadena. 658 00:28:52,160 --> 00:28:56,360 Eso significa que me dé una variable cuyo propósito en la vida es almacenar una dirección. 659 00:28:56,360 --> 00:29:00,400 Porque yo estoy a punto de poner el dirección de una cadena en el mismo. 660 00:29:00,400 --> 00:29:03,500 Y, en efecto, GetString, para ser claro, no devuelve una cadena. 661 00:29:03,500 --> 00:29:06,110 No devuelve mamá barra invertida cero, per se. 662 00:29:06,110 --> 00:29:10,005 ¿Qué significa GetString específicamente y volver precisamente? 663 00:29:10,005 --> 00:29:10,880 AUDIENCIA: [inaudible] 664 00:29:10,880 --> 00:29:14,080 DAVID J. MALAN: Una dirección, la dirección del primer carácter 665 00:29:14,080 --> 00:29:16,070 en alguna cadena se ha conseguido. 666 00:29:16,070 --> 00:29:19,250 Y por lo que ahora estamos viendo una palabra clave especial de nuevo. 667 00:29:19,250 --> 00:29:20,640 Y, aludí a esta antes. 668 00:29:20,640 --> 00:29:23,620 Esto va a ser bueno de convenciones que vamos a ver una y otra vez ahora. 669 00:29:23,620 --> 00:29:27,540 Estoy comprobando para asegurarse de que s no es nulo y t no es nulo. 670 00:29:27,540 --> 00:29:30,100 Debido a que la base de mi realidad mención rápida antes, 671 00:29:30,100 --> 00:29:35,510 lo que podría significar si GetString no regresa una dirección, pero N-U-L-L, que es de nuevo, 672 00:29:35,510 --> 00:29:36,990 algún valor especial? 673 00:29:36,990 --> 00:29:37,890 >> AUDIENCIA: Error. 674 00:29:37,890 --> 00:29:38,600 >> DAVID J. MALAN: Es un error. 675 00:29:38,600 --> 00:29:39,550 Algo salió mal. 676 00:29:39,550 --> 00:29:41,341 Y lo que normalmente que podría suceder, especialmente 677 00:29:41,341 --> 00:29:45,162 con lo que podría ser strings-- de longitud desconocida en advance-- 678 00:29:45,162 --> 00:29:46,870 tal vez los equipos de los sin memoria, tal vez 679 00:29:46,870 --> 00:29:49,280 que ha escrito de tal larga palabra o frase 680 00:29:49,280 --> 00:29:51,880 o pegado un gran ensayo tales que no hay suficiente memoria. 681 00:29:51,880 --> 00:29:55,340 Y así GetString no puede regresar la dirección de todo el asunto, 682 00:29:55,340 --> 00:29:56,620 por lo que sólo devuelve nada. 683 00:29:56,620 --> 00:30:00,580 Y dice un error ha ocurrido devolviendo el valor especial NULL. 684 00:30:00,580 --> 00:30:02,890 Es la dirección de cero, por así decirlo. 685 00:30:02,890 --> 00:30:06,157 >> Ahora resulta que C viene con un función que hace que iteración. 686 00:30:06,157 --> 00:30:09,240 No tenemos para implementar esto con un bucle o un bucle while nosotros mismos. 687 00:30:09,240 --> 00:30:11,150 Podemos utilizar una función, llamada de manera sucinta, 688 00:30:11,150 --> 00:30:15,400 revuelva un borrador, o cadena comparar, cuya propósito en la vida es hacer exactamente eso. 689 00:30:15,400 --> 00:30:19,990 Se le da dos punteros, dos direcciones, y va a ir a esas direcciones 690 00:30:19,990 --> 00:30:23,130 y luego comparar carta para letra por letra por la calidad, 691 00:30:23,130 --> 00:30:26,610 deteniéndose sólo cuando lo que es verdad? 692 00:30:26,610 --> 00:30:31,540 Cuando intuitivamente debe agitar un borrador dejan de iteración, para ser claros? 693 00:30:31,540 --> 00:30:35,400 Cuando se realiza un barra invertida 0 en cualquiera cadena, en cuyo punto se puede decidir 694 00:30:35,400 --> 00:30:38,910 tiene todo igualado, o ha habido una discrepancia? 695 00:30:38,910 --> 00:30:42,740 >> Por lo tanto, si corremos esto ahora y tratar nuestro pequeño juego de capitalización, 696 00:30:42,740 --> 00:30:49,260 así que compare-1, ./compare-1, y escriba madre en minúsculas en ambas ocasiones. 697 00:30:49,260 --> 00:30:50,560 Ahora es lo mismo. 698 00:30:50,560 --> 00:30:54,080 Y si lo hago de nuevo con minúscula y luego tal vez mayúsculas. 699 00:30:54,080 --> 00:30:56,720 Ahora en verdad distingue entre mayúsculas y minúsculas. 700 00:30:56,720 --> 00:31:00,440 Así que no es tan difícil o mágico, pero sí ahora explicar 701 00:31:00,440 --> 00:31:03,140 lo que está pasando debajo de la campana. 702 00:31:03,140 --> 00:31:07,640 >> Entonces, ¿qué más se puede extraer que de este tipo de lección? 703 00:31:07,640 --> 00:31:08,980 Así que vamos a echar un vistazo a esto. 704 00:31:08,980 --> 00:31:15,380 Voy a seguir adelante y escribir una programa rápido aquí llamado copia-0. 705 00:31:15,380 --> 00:31:21,594 Y ahora vamos a seguir adelante y de hecho vamos a hacer esto-- con el copia-0, 706 00:31:21,594 --> 00:31:23,010 echar un vistazo a lo que tengo aquí. 707 00:31:23,010 --> 00:31:24,712 La primera vez que digo que el usuario, decir algo. 708 00:31:24,712 --> 00:31:26,420 Entonces consigo una cadena y guardé en s. 709 00:31:26,420 --> 00:31:29,810 Entonces puedo comprobar si s es igual a es igual a NULL, simplemente volver 1. 710 00:31:29,810 --> 00:31:31,590 Así que esto es sólo la comprobación de errores estándar. 711 00:31:31,590 --> 00:31:33,112 Nada interesante ha sucedido. 712 00:31:33,112 --> 00:31:36,320 Y de hecho, si nos deshacemos del error cheques, esto se parece a la semana 1 código 713 00:31:36,320 --> 00:31:36,985 En el momento. 714 00:31:36,985 --> 00:31:39,110 Pero he empezado a conseguir un poco mejor por eso. 715 00:31:39,110 --> 00:31:43,340 >> Ahora bien, en la línea 16, hace una semana, tal vez día incluso un par de minutos o hace, 716 00:31:43,340 --> 00:31:46,720 se podría decir la línea 16 es la creación de una variable llamada t 717 00:31:46,720 --> 00:31:48,219 y la copia es en ella. 718 00:31:48,219 --> 00:31:50,010 Y eso es una perfecta comida para llevar razonable. 719 00:31:50,010 --> 00:31:51,560 Pero más exactamente ahora. 720 00:31:51,560 --> 00:31:54,190 Lo que está sucediendo en la línea 16? 721 00:31:54,190 --> 00:31:56,170 Lo que está siendo copiado ¿de derecha a izquierda? 722 00:31:56,170 --> 00:31:56,669 ¿Sí? 723 00:31:56,669 --> 00:31:58,490 AUDIENCIA: ¿Es t recibiendo una dirección de s? 724 00:31:58,490 --> 00:32:01,220 >> DAVID J. MALAN: Exactamente, t es conseguir la dirección de s. 725 00:32:01,220 --> 00:32:05,170 Así que para ser claro ahora, si me voy de nuevo a ese ejemplo anterior 726 00:32:05,170 --> 00:32:08,520 y extraigo lo que he escrito en. 727 00:32:08,520 --> 00:32:11,640 Y lo que he escribí en-- aquí está s, y aquí 728 00:32:11,640 --> 00:32:15,830 es lo que he escrito en algún lugar de la memoria, la mamá y luego una barra invertida 729 00:32:15,830 --> 00:32:17,840 0 que se agrega para mí. 730 00:32:17,840 --> 00:32:23,060 Lo guardé aquí, recordar, esto es en la posición 1, 2, 3, 4, 731 00:32:23,060 --> 00:32:24,655 esto es lo que hay actualmente en el s. 732 00:32:24,655 --> 00:32:29,220 Así que si en la línea 16, digo dame otra variable llamada ty tienda 733 00:32:29,220 --> 00:32:33,590 en en el valor de s, lo se almacena aquí no será mamá 734 00:32:33,590 --> 00:32:35,480 sino sólo el número 1. 735 00:32:35,480 --> 00:32:38,520 >> Así que si miramos hacia el futuro en este programa ahora, ¿qué va a pasar? 736 00:32:38,520 --> 00:32:40,690 Así que observe que hay esta función podría 737 00:32:40,690 --> 00:32:44,410 han usado este tiempo atrás para César, o Vigenére, o tal vez no del todo. 738 00:32:44,410 --> 00:32:48,170 Yo reclamo con mi printf, estoy va a capitalizar la copia t. 739 00:32:48,170 --> 00:32:51,616 Primero en la línea 19, la cordura rápida control, controles strlen la longitud del t. 740 00:32:51,616 --> 00:32:53,740 Porque no quiero tratar de capitalizar algo 741 00:32:53,740 --> 00:32:55,104 si no hay cadena de allí. 742 00:32:55,104 --> 00:32:57,520 Si el usuario simplemente pulse Enter, no hay nada para sacar provecho. 743 00:32:57,520 --> 00:33:01,100 Así que no quiero hacer la línea 21. 744 00:33:01,100 --> 00:33:05,758 Así que la línea 21 está capitalizando qué letra, al parecer, en t? 745 00:33:05,758 --> 00:33:06,514 >> AUDIENCIA: m? 746 00:33:06,514 --> 00:33:08,722 DAVID J. MALAN: Parece como si fuera la copia cuál? 747 00:33:08,722 --> 00:33:09,486 AUDIENCIA: m. 748 00:33:09,486 --> 00:33:10,450 DAVID J. MALAN: Uh, m. 749 00:33:10,450 --> 00:33:12,685 OK, así que la primera m, debido aviso de que estoy 750 00:33:12,685 --> 00:33:14,935 pasando a toupper, que si nunca has visto es 751 00:33:14,935 --> 00:33:16,980 sólo una función de capitalizar como su entrada. 752 00:33:16,980 --> 00:33:20,240 t soporte de cero significa dar me el carácter cero del t. 753 00:33:20,240 --> 00:33:22,550 Y entonces, ¿cómo funciona esto cambio de imagen, para ser claro? 754 00:33:22,550 --> 00:33:25,490 755 00:33:25,490 --> 00:33:29,160 ¿Qué se necesita para ser reescrito o modificado con respecto a s y t y la mamá 756 00:33:29,160 --> 00:33:30,097 cero barra invertida. 757 00:33:30,097 --> 00:33:31,470 >> AUDIENCIA: [inaudible] 758 00:33:31,470 --> 00:33:34,030 >> DAVID J. MALAN: Sí, así que éste aquí simplemente 759 00:33:34,030 --> 00:33:40,860 necesita para cambiarse a-- fijar esto-- debe cambiarse a una capital m. 760 00:33:40,860 --> 00:33:44,330 Pero ahora, y mira adelante en el programa, si imprimo 761 00:33:44,330 --> 00:33:49,800 s y t como puedo limpiar aquí, ver lo que hay va a pasar imprimiendo s y t. 762 00:33:49,800 --> 00:33:54,310 Así que copia-0, ./copy-0. 763 00:33:54,310 --> 00:33:57,140 Déjame ir adelante y escribo en mamá en minúsculas. 764 00:33:57,140 --> 00:34:00,140 Observe el original y la copia se han capitalizado. 765 00:34:00,140 --> 00:34:00,850 ¿Por qué? 766 00:34:00,850 --> 00:34:04,431 Bueno, s y t son ambos apuntan a, si se quiere, la misma cantidad de memoria. 767 00:34:04,431 --> 00:34:06,930 Y, francamente, esto se está poniendo Realmente uninteresting-- el hecho 768 00:34:06,930 --> 00:34:09,150 que estamos utilizando cero dirección aquí. 769 00:34:09,150 --> 00:34:11,719 Quiero decir, no me importa donde la materia está en la memoria. 770 00:34:11,719 --> 00:34:13,550 Lo siento, estoy borrando un poco demasiado. 771 00:34:13,550 --> 00:34:15,674 Pero yo no me importa dónde están las cosas en la memoria. 772 00:34:15,674 --> 00:34:18,510 Y así, de hecho, lo que programadores tienden a pensar 773 00:34:18,510 --> 00:34:21,080 es que cuando se habla de una dirección, o un puntero, 774 00:34:21,080 --> 00:34:22,679 a quién le importa donde está en la memoria. 775 00:34:22,679 --> 00:34:24,989 No me importa si es en byte uno o mil millones. 776 00:34:24,989 --> 00:34:27,920 Yo sólo me importa que esta variable es efectivamente 777 00:34:27,920 --> 00:34:29,620 señalando en ese trozo de memoria. 778 00:34:29,620 --> 00:34:33,350 Y así, a partir de ahora, en lugar de objeción sobre las direcciones de memoria arbitrarias, vamos a 779 00:34:33,350 --> 00:34:36,710 simplemente comenzar a dibujar punteros como punteros, como flechas. 780 00:34:36,710 --> 00:34:39,340 Así que lo que S y T son en realidad, de acuerdo con este programa, 781 00:34:39,340 --> 00:34:42,130 por la forma en que he creado t, es sólo dos variables separadas 782 00:34:42,130 --> 00:34:43,840 señalando al mismo trozo de memoria. 783 00:34:43,840 --> 00:34:45,215 Y no nos importa dónde se encuentren. 784 00:34:45,215 --> 00:34:47,130 Así que podemos abstraer ese detalle. 785 00:34:47,130 --> 00:34:48,780 >> Entonces, ¿cómo puedo solucionar esto? 786 00:34:48,780 --> 00:34:54,120 Si quiero escribir una versión de la copia programa que en realidad copia la cadena 787 00:34:54,120 --> 00:34:56,840 y capitaliza sólo el copia, simplemente intuitivamente, 788 00:34:56,840 --> 00:34:59,766 lo que tiene que haber una ingrediente para nuestra solución? 789 00:34:59,766 --> 00:35:00,640 AUDIENCIA: [inaudible] 790 00:35:00,640 --> 00:35:01,420 DAVID J. MALAN: Necesitamos un qué? 791 00:35:01,420 --> 00:35:01,820 AUDIENCIA: Pedazo de la memoria. 792 00:35:01,820 --> 00:35:03,280 DAVID J. MALAN: Necesitamos otra parte de la memoria, ¿no? 793 00:35:03,280 --> 00:35:05,360 No sabemos cómo hacerlo, sin embargo, necesariamente. 794 00:35:05,360 --> 00:35:11,330 Pero que tipo de necesidad que esto suceda de manera que la madre original en caso de baja 795 00:35:11,330 --> 00:35:14,170 termina en ese pedazo extra de memoria. 796 00:35:14,170 --> 00:35:19,770 Y luego cuando cambio la copia, yo no quieren cambiar esta copia aquí. 797 00:35:19,770 --> 00:35:26,020 Yo en cambio quiero cambiar sólo esto copia para que el original no se modifica. 798 00:35:26,020 --> 00:35:27,980 >> Así que, vamos a ver cómo podemos hacer esto. 799 00:35:27,980 --> 00:35:31,800 En copy-1, que ya tiene sido despojado de comentario, 800 00:35:31,800 --> 00:35:33,250 pero se comenta en línea. 801 00:35:33,250 --> 00:35:36,710 En su lugar hacemos la following-- éstos líneas son idénticos, tráeme una cadena 802 00:35:36,710 --> 00:35:38,340 y lo llaman es. 803 00:35:38,340 --> 00:35:43,500 Pero ahora vamos a ver uno de nuestros más complejo, pero el último de la complejidad 804 00:35:43,500 --> 00:35:47,340 por un tiempo, la línea 16 hace exactamente esto. 805 00:35:47,340 --> 00:35:49,400 Así que si su cómoda, con la foto acabamos drew-- 806 00:35:49,400 --> 00:35:51,790 dame un nuevo trozo de memoria, copiar todo en él, 807 00:35:51,790 --> 00:35:53,730 vamos a ver cómo traducimos eso a código. 808 00:35:53,730 --> 00:35:59,400 >> Así que la línea 16, en el lado de la mano izquierda, char * t me da esta caja aquí. 809 00:35:59,400 --> 00:36:00,230 Eso es todo lo que hace. 810 00:36:00,230 --> 00:36:03,240 Al lado derecho, m alloc o malloc, 811 00:36:03,240 --> 00:36:06,480 es la asignación de memoria, super lujoso, una forma críptica de decir simplemente 812 00:36:06,480 --> 00:36:07,640 dame un trozo de memoria. 813 00:36:07,640 --> 00:36:09,290 ¿Cuánta memoria necesitamos? 814 00:36:09,290 --> 00:36:10,910 Bueno, es una especie de gran expresión. 815 00:36:10,910 --> 00:36:12,570 Pero vamos a ver lo que dice aquí. 816 00:36:12,570 --> 00:36:15,940 Así que esto, por supuesto, es dar me la longitud de cadena del s. 817 00:36:15,940 --> 00:36:19,094 Así, la mamá debe ser qué? 818 00:36:19,094 --> 00:36:21,010 Así que sólo tres, ¿no? mamá es de tres caracteres. 819 00:36:21,010 --> 00:36:22,830 No contamos el barra invertida cero cuando 820 00:36:22,830 --> 00:36:25,960 hablar de la longitud de una cadena que es en realidad las letras visibles humanos. 821 00:36:25,960 --> 00:36:28,020 Así que mamá, así que esto me da 3. 822 00:36:28,020 --> 00:36:31,170 Pero espere un minuto, yo ahora estoy añadiendo 1. 823 00:36:31,170 --> 00:36:34,861 ¿Por qué en realidad quiero asignar los 4 bytes y no sólo 3? 824 00:36:34,861 --> 00:36:35,360 ¿Sí? 825 00:36:35,360 --> 00:36:36,910 >> AUDIENCIA: Para el valor centinela? 826 00:36:36,910 --> 00:36:38,951 >> DAVID J. MALAN: Exactamente, para ese valor centinela. 827 00:36:38,951 --> 00:36:40,840 Para la barra invertida cero, Necesito 4 bytes en total. 828 00:36:40,840 --> 00:36:42,870 Así que necesito la longitud de la cadena plus 1. 829 00:36:42,870 --> 00:36:45,400 Y a continuación, sólo para el bien measure-- a pesar de que en este sistema, 830 00:36:45,400 --> 00:36:49,390 Siempre va a ser 1-- que estoy diciendo multiplicar este por el tamaño de un char. 831 00:36:49,390 --> 00:36:51,552 Resulta que es sizeof un operador en C que 832 00:36:51,552 --> 00:36:53,260 sólo te la dice número de bytes que es 833 00:36:53,260 --> 00:36:54,700 requerida para un cierto tipo de datos. 834 00:36:54,700 --> 00:36:57,740 No funciona para las matrices, típicamente, a veces lo hace. 835 00:36:57,740 --> 00:36:59,210 Pero en el caso general, no. 836 00:36:59,210 --> 00:37:02,330 Pero me dirá cuántos bytes de un Char es, que resulta es siempre 1. 837 00:37:02,330 --> 00:37:04,080 Así que esto es como multiplicar por 1. 838 00:37:04,080 --> 00:37:05,900 >> Línea de mira tan super críptica de código. 839 00:37:05,900 --> 00:37:09,320 Pero todo lo que hace es da mí un trozo de memoria. 840 00:37:09,320 --> 00:37:13,590 Pero tampoco parece estar copiando nada en esa memoria? 841 00:37:13,590 --> 00:37:14,560 Aún no. 842 00:37:14,560 --> 00:37:22,040 Y así, ¿qué tengo en la línea 22 y 23, 24, 25, bueno, yo simplemente hago esto. 843 00:37:22,040 --> 00:37:23,760 Y esto es una especie de antiguo cosas de la escuela ahora. 844 00:37:23,760 --> 00:37:26,010 Esto es como PSet 2, donde estás moviendo cosas 845 00:37:26,010 --> 00:37:28,620 alrededor en la memoria, o más bien en las cadenas. 846 00:37:28,620 --> 00:37:31,920 >> Así que estoy iteración de 0 a la longitud de la cadena s. 847 00:37:31,920 --> 00:37:37,820 Y estoy copiando el carácter de orden i en s en el carácter de orden i en t. 848 00:37:37,820 --> 00:37:41,820 Y porque yo, el programador, hizo Asegúrese de asignar exactamente tantos bytes 849 00:37:41,820 --> 00:37:44,600 ya que necesito, es perfecto uno-a-one relación. 850 00:37:44,600 --> 00:37:47,060 Y copio madre en minúsculas a la nueva. 851 00:37:47,060 --> 00:37:50,170 Y luego, por último, hago esta línea. 852 00:37:50,170 --> 00:37:54,637 Y por lo que el efecto es sólo para capitalizar este t aquí. 853 00:37:54,637 --> 00:37:56,470 Así que mucho que absorber, pero si sólo consideras 854 00:37:56,470 --> 00:37:58,220 lo que realmente está pasando de debajo del capó 855 00:37:58,220 --> 00:38:00,880 se acaba de mover estos bytes alrededor, todo lo que 856 00:38:00,880 --> 00:38:06,617 que se necesita para resolver este problema es justo para dar a este pedazo de la memoria. 857 00:38:06,617 --> 00:38:08,450 Ahora con el riesgo de abrumadora, déjame mostrarte 858 00:38:08,450 --> 00:38:13,200 otro ejemplo que es casi idéntica, a excepción de éste 859 00:38:13,200 --> 00:38:14,350 línea de código. 860 00:38:14,350 --> 00:38:18,870 Así que esta es la versión pirata de este programa, si se quiere. 861 00:38:18,870 --> 00:38:21,050 Pero vamos a destilar en lo que está pasando. 862 00:38:21,050 --> 00:38:28,920 Línea 24 solía ser este t soporte de I consigue s abrazadera i. 863 00:38:28,920 --> 00:38:33,370 Ahora, voy a cambiar esto a la estrella mucho más críptico t 864 00:38:33,370 --> 00:38:36,280 más 1 es igual a la estrella s más 1. 865 00:38:36,280 --> 00:38:38,702 >> Así que lo que está pasando y por qué tenemos un personaje estrella? 866 00:38:38,702 --> 00:38:41,410 Hemos visto la estrella antes, y se está utilizando de manera diferente aquí. 867 00:38:41,410 --> 00:38:45,490 Anteriormente vimos char *, ahora que estoy viendo Una estrella en el principio, y eso está bien. 868 00:38:45,490 --> 00:38:48,190 Porque resulta que puede tipo de inferir solo 869 00:38:48,190 --> 00:38:50,280 de los primero principios de lo que está pasando. 870 00:38:50,280 --> 00:38:53,860 Así que para que quede claro, lo que es s? 871 00:38:53,860 --> 00:38:55,052 La semana pasada, era una cadena. 872 00:38:55,052 --> 00:38:56,260 Eso no basta ya. 873 00:38:56,260 --> 00:38:57,690 ¿Qué es s, específicamente? 874 00:38:57,690 --> 00:38:58,590 >> AUDIENCIA: [inaudible] 875 00:38:58,590 --> 00:38:59,881 >> DAVID J. MALAN: Es un puntero. 876 00:38:59,881 --> 00:39:02,610 Es la dirección del primer carácter que escribió en. 877 00:39:02,610 --> 00:39:04,780 OK, ¿cuál es t? 878 00:39:04,780 --> 00:39:05,660 >> AUDIENCIA: [inaudible] 879 00:39:05,660 --> 00:39:07,950 >> DAVID J. MALAN: La dirección del primer byte 880 00:39:07,950 --> 00:39:10,490 en t, que parte de la memoria reasignada. 881 00:39:10,490 --> 00:39:14,720 Así que resulta que cuando iterar desde 0 hasta en la cadena 882 00:39:14,720 --> 00:39:17,424 longitud-- en primer lugar, i comienza en 0, ya que 883 00:39:17,424 --> 00:39:18,840 de esta vieja escuela por lo bucle. 884 00:39:18,840 --> 00:39:22,400 Así que por simplicidad, vamos a asumir que la primera línea de código 885 00:39:22,400 --> 00:39:23,760 es realmente sólo esto, la derecha. 886 00:39:23,760 --> 00:39:26,080 Si i es cero, añadiendo cero a algo presumiblemente 887 00:39:26,080 --> 00:39:27,540 no va a tener un efecto. 888 00:39:27,540 --> 00:39:28,560 >> Entonces, ¿qué es esta palabra? 889 00:39:28,560 --> 00:39:31,600 Resulta que la estrella operador en este contexto 890 00:39:31,600 --> 00:39:33,700 es la dereference operador, que es justo 891 00:39:33,700 --> 00:39:37,530 una forma elegante de decir ir a la siguiente dirección. 892 00:39:37,530 --> 00:39:42,080 Así que si s es la dirección de la primera personaje en esta parte de la memoria, 893 00:39:42,080 --> 00:39:43,630 * s medios van allí. 894 00:39:43,630 --> 00:39:45,630 Y porque hemos dibujado la imagen de esta manera, 895 00:39:45,630 --> 00:39:47,430 puede adoptar el siguiente modelo mental. 896 00:39:47,430 --> 00:39:51,030 Si esto es s, y dices * s * s, algo así como rampas y escaleras, 897 00:39:51,030 --> 00:39:54,540 si usted recuerda el juego de la infancia, es como seguir la flecha e ir 898 00:39:54,540 --> 00:39:55,570 a la dirección. 899 00:39:55,570 --> 00:39:57,080 >> * t es la misma cosa. 900 00:39:57,080 --> 00:39:59,855 Así que empieza aquí, vaya a su trozo. 901 00:39:59,855 --> 00:40:03,350 No puedo dibujar en esta pantalla de esa manera. 902 00:40:03,350 --> 00:40:05,560 * t significa ir aquí. 903 00:40:05,560 --> 00:40:08,830 Y luego, el bucle for es sólo diciendo mover este personaje aquí, 904 00:40:08,830 --> 00:40:11,330 mover este personaje aquí, mover este personaje aquí. 905 00:40:11,330 --> 00:40:12,890 Pero, ¿cómo lo hago incrementación? 906 00:40:12,890 --> 00:40:15,430 Tengo que deshacer lo que acaba de eliminar. 907 00:40:15,430 --> 00:40:18,140 Esto es lo que generalmente se llama aritmética de punteros, que 908 00:40:18,140 --> 00:40:20,040 significa matemáticas con direcciones. 909 00:40:20,040 --> 00:40:22,460 >> Si, en este bucle, Sigo incrementando i, 910 00:40:22,460 --> 00:40:26,880 y s es una dirección y t es un dirección, si yo sigo añadiendo 1, 911 00:40:26,880 --> 00:40:31,406 eso sólo significa seguir adelante, y hacia adelante, y adelante en la memoria. 912 00:40:31,406 --> 00:40:34,030 Es como Oxford Street, el calle que el edificio está en CS. 913 00:40:34,030 --> 00:40:36,490 Los edificios CS está en 33 Oxford Street. 914 00:40:36,490 --> 00:40:39,870 Así que si usted fuera a hacer 33 Oxford Street, más 1, 915 00:40:39,870 --> 00:40:42,870 que lleva a 34 Oxford Street, luego 35 Oxford Street, 916 00:40:42,870 --> 00:40:46,380 entonces 36 Oxford Street, cualesquiera que edificios son en realidad - si es que existen. 917 00:40:46,380 --> 00:40:50,540 Y así, eso es todo lo que estamos haciendo aquí con la aritmética de punteros. 918 00:40:50,540 --> 00:40:53,820 >> Así que es una manera estupenda arcana de expresarnos. 919 00:40:53,820 --> 00:40:56,160 Pero todo lo que está sucediendo debajo de la campana 920 00:40:56,160 --> 00:40:59,330 es sólo seguir estas direcciones, como seguir un mapa, si se quiere, 921 00:40:59,330 --> 00:41:02,692 o siguiendo las flechas como hemos dibujado en la pantalla. 922 00:41:02,692 --> 00:41:04,910 OK, una gran cantidad de digerir. 923 00:41:04,910 --> 00:41:10,410 Cualquier pregunta sobre la sintaxis, los conceptos, punteros, malloc, o similares. 924 00:41:10,410 --> 00:41:11,480 Sí, por aquí primero. 925 00:41:11,480 --> 00:41:13,755 >> AUDIENCIA: Entonces, ¿dónde que dice * t es igual a toupper * t, 926 00:41:13,755 --> 00:41:15,575 es que va a capitalizar todas las letras o sólo-- 927 00:41:15,575 --> 00:41:17,283 >> DAVID J. MALAN: Ah, muy buena pregunta. 928 00:41:17,283 --> 00:41:19,805 Así que en esta línea de aquí, 31, ¿Esto va a capitalizar 929 00:41:19,805 --> 00:41:21,430 la primera letra o la totalidad de las letras. 930 00:41:21,430 --> 00:41:23,460 Así que vamos a responder que al ir volver a los primeros principios. 931 00:41:23,460 --> 00:41:26,168 Y los primeros principios aquí me refiero basta con ir a las definiciones básicas 932 00:41:26,168 --> 00:41:27,000 de lo que está involucrado. 933 00:41:27,000 --> 00:41:29,770 Así toupper es una función que capitaliza un char. 934 00:41:29,770 --> 00:41:30,530 Eso es todo. 935 00:41:30,530 --> 00:41:36,740 * t significa ir al primero-- ir a la dirección en t. 936 00:41:36,740 --> 00:41:40,350 Por lo tanto, en la imagen, si este es el trozo de la memoria nos asignaron con malloc, 937 00:41:40,350 --> 00:41:43,310 y esto es t, * t significa ir aquí. 938 00:41:43,310 --> 00:41:46,710 >> Mientras tanto, usted está pasando ese valor, minúsculas m 939 00:41:46,710 --> 00:41:50,040 a toupper, que está recibiendo de vuelta M mayúscula, donde estás poniendo él? 940 00:41:50,040 --> 00:41:52,410 Estás poniendo en ese mismo lugar. 941 00:41:52,410 --> 00:41:55,540 Y así por que la lógica de aquellos definiciones básicas es sólo 942 00:41:55,540 --> 00:41:58,792 mayúscula la primera letra a menos que iterar con i o una 943 00:41:58,792 --> 00:42:02,000 de lazo o un bucle while, no va para hacer algo más de lo que pides. 944 00:42:02,000 --> 00:42:02,583 Buena pregunta. 945 00:42:02,583 --> 00:42:03,237 ¿Sí? 946 00:42:03,237 --> 00:42:05,369 >> AUDIENCIA: ¿Por qué se utiliza el dereference método en lugar de 947 00:42:05,369 --> 00:42:05,979 la matriz? 948 00:42:05,979 --> 00:42:07,395 >> DAVID J. MALAN: Ah, buena pregunta. 949 00:42:07,395 --> 00:42:10,672 ¿Por qué utilizar el dereference método en lugar del método de matriz? 950 00:42:10,672 --> 00:42:12,130 No hay ninguna razón en particular, para ser honesto. 951 00:42:12,130 --> 00:42:15,290 Y, de hecho, para este clase de ejemplo, a la derecha, 952 00:42:15,290 --> 00:42:17,556 Sólo estoy argumentando hacer la programa más complicado, 953 00:42:17,556 --> 00:42:19,680 más ojos están vidriosos, la gente está mirando 954 00:42:19,680 --> 00:42:22,830 porque esto se ve super arcano, pero a pesar de que está haciendo lo mismo. 955 00:42:22,830 --> 00:42:26,695 Y así, francamente, se trata de una solución innecesariamente visualmente compleja 956 00:42:26,695 --> 00:42:27,320 al problema. 957 00:42:27,320 --> 00:42:29,580 >> Sigue siendo un buen diseño, cinco de cinco para el diseño, 958 00:42:29,580 --> 00:42:33,140 ya sea en el soporte notación o la notación puntero. 959 00:42:33,140 --> 00:42:36,299 Pero- especialmente cuando lleguemos más tarde en el curso de PSet 5 960 00:42:36,299 --> 00:42:39,340 cuando ponemos en práctica ese diccionario que He mencionado un par de veces-- 961 00:42:39,340 --> 00:42:42,300 vamos realmente se preocupan por la direcciones de memoria de bajo nivel 962 00:42:42,300 --> 00:42:44,140 que realmente entendemos que esta pasando. 963 00:42:44,140 --> 00:42:48,300 >> Pero, por ahora, resulta que esta línea de código entre paréntesis aquí cuadrados 964 00:42:48,300 --> 00:42:49,900 en realidad no existe. 965 00:42:49,900 --> 00:42:52,230 Ellos son lo que se llama azúcar sintáctico, que 966 00:42:52,230 --> 00:42:58,390 es sólo una manera extrañamente fría de decir la compilador convierte corchetes sean 967 00:42:58,390 --> 00:43:00,420 que la expresión matemática. 968 00:43:00,420 --> 00:43:02,660 Así que es una convención humana para poder simplemente escribir 969 00:43:02,660 --> 00:43:04,220 estos soportes muy fácil de usar. 970 00:43:04,220 --> 00:43:06,850 Pero lo que el compilador, sonido metálico, que realmente está haciendo cualquier momento 971 00:43:06,850 --> 00:43:10,970 usted escribe lo que está resaltado en línea 24, debajo de la capilla que es realmente 972 00:43:10,970 --> 00:43:12,330 la conversión a esto. 973 00:43:12,330 --> 00:43:16,200 Es sólo más placentero como un ser humano a leer y escribir código como la línea 24. 974 00:43:16,200 --> 00:43:18,530 Pero con el tiempo los ruedas de entrenamiento también se desprenden 975 00:43:18,530 --> 00:43:21,780 cuando la propia comodidad se hace más fuerte. 976 00:43:21,780 --> 00:43:27,240 >> Muy bien, así que recordar entonces que este Era el tipo de problema más grande 977 00:43:27,240 --> 00:43:27,807 nos encontramos. 978 00:43:27,807 --> 00:43:30,640 Y eso es lo que provocó todo este maldita conversación acerca de los punteros, 979 00:43:30,640 --> 00:43:32,340 y direcciones, y cosas de copiado. 980 00:43:32,340 --> 00:43:35,410 Fue porque nos estropeó sobre esta estúpida, estúpida cuestión, por lo que 981 00:43:35,410 --> 00:43:38,830 He implementado logically-- con Lauren aquí en la demo y el zumo de naranja 982 00:43:38,830 --> 00:43:43,770 en el milk-- un perfectamente función algorítmica correcta 983 00:43:43,770 --> 00:43:47,010 para el bombeo de dos variables ' valores, pero la maldita cosa 984 00:43:47,010 --> 00:43:50,550 no tenía ninguna persistente o permanente, efecto en mi código. 985 00:43:50,550 --> 00:43:51,820 >> ¿Y por qué fue eso? 986 00:43:51,820 --> 00:43:54,650 En pocas palabras, ¿por qué es esto implementación de canje 987 00:43:54,650 --> 00:43:58,740 lógicamente correcto, pero no tiene ningún impacto sobre las variables que se pasan a la misma, 988 00:43:58,740 --> 00:44:01,119 como x e y para la principal? 989 00:44:01,119 --> 00:44:02,410 ¿Cuál fue la esencia de la cuestión? 990 00:44:02,410 --> 00:44:02,909 ¿Sí? 991 00:44:02,909 --> 00:44:05,532 AUDIENCIA: Debido a la variable hace copias de la variable en el pase 992 00:44:05,532 --> 00:44:06,240 a través de la función. 993 00:44:06,240 --> 00:44:09,060 >> DAVID J. MALAN: Exactamente, cuando se pasa variables en una función, o argumentos 994 00:44:09,060 --> 00:44:11,030 en una función, son aprobada por copia, que 995 00:44:11,030 --> 00:44:14,770 significa que usted obtiene un aspecto idéntico patrón de bits para ambos X e Y, 996 00:44:14,770 --> 00:44:15,955 llamado aquí a y b. 997 00:44:15,955 --> 00:44:18,080 Y usted puede hacer cualquier cosa que quiera con esas copias, 998 00:44:18,080 --> 00:44:20,657 pero van a tener ninguna efecto sobre la función de llamada. 999 00:44:20,657 --> 00:44:22,990 Y, de hecho, dibujamos que imagen en la pantalla, el recuerdo 1000 00:44:22,990 --> 00:44:25,520 la última vez, por lo que si usted realmente pensar en lo que es 1001 00:44:25,520 --> 00:44:28,570 pasando por debajo de la hood-- si esto es la memoria del equipo, 1002 00:44:28,570 --> 00:44:31,650 y aquí está la parte de memoria que se utiliza para el principal, 1003 00:44:31,650 --> 00:44:34,020 esta es la parte de memoria que se utiliza para el intercambio, 1004 00:44:34,020 --> 00:44:37,090 y tiene por lo que incluso si principal dos variables, X e Y, 1005 00:44:37,090 --> 00:44:41,840 intercambio podría tener mirando idéntica valores, ambos de los cuales son 1 y 2, 1006 00:44:41,840 --> 00:44:44,520 pero son completamente diferentes trozos de memoria. 1007 00:44:44,520 --> 00:44:46,130 >> Así que tenemos una solución a esto. 1008 00:44:46,130 --> 00:44:51,580 Y, francamente, parece que ahora tener una solución a este problema, a la derecha. 1009 00:44:51,580 --> 00:44:55,760 Si ahora tenemos la capacidad de manipular las cosas a través de las direcciones 1010 00:44:55,760 --> 00:44:59,310 y, tipo de rampas y escaleras estilo, siga estas flechas 1011 00:44:59,310 --> 00:45:02,820 e ir a donde queramos en la memoria, ¿no nos 1012 00:45:02,820 --> 00:45:06,220 resolver este problema pasando de principal para intercambiar 1013 00:45:06,220 --> 00:45:09,650 no los valores que quieren swap, pero sólo intuitivamente 1014 00:45:09,650 --> 00:45:11,630 ¿qué podríamos pasar para cambiar su lugar? 1015 00:45:11,630 --> 00:45:12,620 >> [Interponiendo VOCES] 1016 00:45:12,620 --> 00:45:15,244 >> DAVID J. MALAN: ¿Por qué no lo hacemos sólo pasarlo las direcciones, ¿verdad? 1017 00:45:15,244 --> 00:45:17,470 ¿Por qué no le damos una permuta mapa del tesoro, si se quiere, 1018 00:45:17,470 --> 00:45:20,950 que conduce a la valores reales x e y. 1019 00:45:20,950 --> 00:45:24,340 Vamos swap, en realidad cambiar esos bits originales, en lugar de 1020 00:45:24,340 --> 00:45:26,797 de paso copias de los bits. 1021 00:45:26,797 --> 00:45:29,130 Y así, de hecho, eso es lo que hay va a ser la solución. 1022 00:45:29,130 --> 00:45:31,899 Esta versión aquí es claramente malo y defectuoso. 1023 00:45:31,899 --> 00:45:35,190 Y ahora, a primera vista, que sólo se ve como hemos añadido un montón de estrellas al azar 1024 00:45:35,190 --> 00:45:37,106 y cruzó los dedos que sería compilar. 1025 00:45:37,106 --> 00:45:38,460 Pero, sería ahora compilar. 1026 00:45:38,460 --> 00:45:40,090 >> Pero vamos a ver qué quiere decir esto. 1027 00:45:40,090 --> 00:45:43,990 Y, por desgracia, los autores de C podría haber elegido otro símbolo 1028 00:45:43,990 --> 00:45:46,380 para hacer esto un poco más clara, pero el operador estrella 1029 00:45:46,380 --> 00:45:48,610 tiene significado diferente en dos contextos diferentes. 1030 00:45:48,610 --> 00:45:50,890 Y hemos visto tanto, pero vamos a distinguir. 1031 00:45:50,890 --> 00:45:55,310 >> Así que en la parte superior existe, cuando he cambiado a y b 1032 00:45:55,310 --> 00:46:00,470 de ser int de la mala versión a int estrellas, a y b, 1033 00:46:00,470 --> 00:46:01,740 Anteriormente, se enteros. 1034 00:46:01,740 --> 00:46:05,752 ¿Cuáles son ayb ahora el bien, la versión verde? 1035 00:46:05,752 --> 00:46:06,900 Son direcciones. 1036 00:46:06,900 --> 00:46:09,610 Direcciones de lo que, para ser claro? 1037 00:46:09,610 --> 00:46:10,770 Direcciones de números enteros. 1038 00:46:10,770 --> 00:46:12,520 Así que el hecho de que soy diciendo medios int estrella 1039 00:46:12,520 --> 00:46:15,440 esta es la dirección de un entero, específicamente. 1040 00:46:15,440 --> 00:46:19,120 >> Así que ahora cuenta en las líneas de código, algo más ha cambiado demasiado. 1041 00:46:19,120 --> 00:46:22,770 tmp sigue siendo el mismo, porque es sólo el número entero temporal, 1042 00:46:22,770 --> 00:46:24,110 hay magia memoria allí. 1043 00:46:24,110 --> 00:46:26,370 Pero ahora necesita una estrella. 1044 00:46:26,370 --> 00:46:28,560 Y, de hecho, cada otra mención de a y b, 1045 00:46:28,560 --> 00:46:31,780 cuenta de que todo lo que es cambiar de rojo a verde 1046 00:46:31,780 --> 00:46:34,209 es que estoy anteponiendo las variables con las estrellas. 1047 00:46:34,209 --> 00:46:35,750 Porque yo no quiero copiar a y b. 1048 00:46:35,750 --> 00:46:40,350 Porque si yo copio a y b y de intercambio ayb, ¿qué estoy hecho el canje? 1049 00:46:40,350 --> 00:46:43,760 A sólo direcciones, quiero cambiar lo que está en esas direcciones. 1050 00:46:43,760 --> 00:46:44,860 Quiero ir ahí. 1051 00:46:44,860 --> 00:46:48,000 Y por lo que el operador de la estrella dentro de mi función, 1052 00:46:48,000 --> 00:46:51,700 no dentro de la lista de parámetros, implica que vaya a esas direcciones 1053 00:46:51,700 --> 00:46:54,490 y en realidad cambiar esos valores. 1054 00:46:54,490 --> 00:46:56,500 >> Entonces, ¿qué hace la foto ahora verá como su lugar. 1055 00:46:56,500 --> 00:47:03,250 Bueno, si en vez estoy pasando por A y B no 1 y 2-- 1056 00:47:03,250 --> 00:47:05,790 Yo realmente necesito agregar otra definición aquí. 1057 00:47:05,790 --> 00:47:09,030 Así que supongo que este trozo de la memoria está en la posición 10. 1058 00:47:09,030 --> 00:47:12,960 >> Esto es en la posición 11, pero esto es un poco de una simplificación, 1059 00:47:12,960 --> 00:47:18,900 Ahora tengo dos opciones hacen que pase x ey o puedo pasar sus direcciones? 1060 00:47:18,900 --> 00:47:22,500 Si paso sus direcciones como éste, sólo 1061 00:47:22,500 --> 00:47:25,390 ahora tenemos que poner en práctica intercambio por el código de color verde 1062 00:47:25,390 --> 00:47:29,080 de modo que cuando se ve una y cuando b ve, no sólo tienes que copiar a y b 1063 00:47:29,080 --> 00:47:30,540 y mover la leche y zumo de naranja. 1064 00:47:30,540 --> 00:47:32,664 El jugo de la leche y naranja metáfora ahora se rompe, 1065 00:47:32,664 --> 00:47:35,060 porque esas son las tazas de los mapas de líquidos y no. 1066 00:47:35,060 --> 00:47:37,750 Nosotros en cambio tenemos que ir para hacer frente a 10 y nos 1067 00:47:37,750 --> 00:47:42,420 tenga que ir al frente 11, y a continuación, realizar esa lógica intercambio. 1068 00:47:42,420 --> 00:47:45,580 >> Así que la lógica es la misma, pero necesitamos una manera ligeramente diferente 1069 00:47:45,580 --> 00:47:47,160 de acceder a dichas variables. 1070 00:47:47,160 --> 00:47:52,400 Y así, al final, lo que el programa tiene que verse como es esto. 1071 00:47:52,400 --> 00:47:56,610 En swap.c copiado literalmente, y pegar la versión verde. 1072 00:47:56,610 --> 00:47:58,450 Pero tengo que hacer un cambio. 1073 00:47:58,450 --> 00:48:00,180 No es suficiente sólo para cambiar de intercambio. 1074 00:48:00,180 --> 00:48:03,830 ¿Qué otra línea de código Qué tengo que cambiar? 1075 00:48:03,830 --> 00:48:04,330 ¿Sí? 1076 00:48:04,330 --> 00:48:05,770 >> AUDIENCIA: ¿Dónde toma los argumentos. 1077 00:48:05,770 --> 00:48:07,603 >> DAVID J. MALAN: Dónde toma su argumento. 1078 00:48:07,603 --> 00:48:09,985 Así que si me desplazo hasta principal, me no sólo puede pasar en x e y, 1079 00:48:09,985 --> 00:48:12,820 y, lo prometo, la última pieza de nueva sintaxis hoy. 1080 00:48:12,820 --> 00:48:17,200 Tengo que pasar no xy y, pero la dirección de x e y. 1081 00:48:17,200 --> 00:48:20,400 Y resulta que, el símbolo que los autores de C escogieron 1082 00:48:20,400 --> 00:48:23,860 es si se utiliza un signo aquí, no para debe confundirse con el signo bit a bit, 1083 00:48:23,860 --> 00:48:27,130 si se utiliza un símbolo de unión aquí y un signo aquí, 1084 00:48:27,130 --> 00:48:29,570 esto se da cuenta de que, ¿cuál es la dirección de x, 1085 00:48:29,570 --> 00:48:31,740 tal vez es 10, ¿cuál es el dirección de y, tal vez es 1086 00:48:31,740 --> 00:48:35,400 11, y pasa aquellos en su lugar. 1087 00:48:35,400 --> 00:48:37,210 >> Así que mucho que absorber todos a la vez. 1088 00:48:37,210 --> 00:48:40,190 Pero veamos ahora rápidamente nuestros cuatro minutos para el final 1089 00:48:40,190 --> 00:48:42,150 donde las cosas pueden salir mal. 1090 00:48:42,150 --> 00:48:45,120 Y como un aparte, en realidad Tomé esta imagen, 1091 00:48:45,120 --> 00:48:46,920 TF tomó esta fotografía de un año o dos atrás. 1092 00:48:46,920 --> 00:48:49,190 Así que esta es la esquina trasera de Eliot Dining Hall. 1093 00:48:49,190 --> 00:48:52,310 Los punteros son quizás los más difíciles tema que cubrimos en CS50. 1094 00:48:52,310 --> 00:48:54,810 Así que si usted se preocupa el tipo de la pendiente es como tal vez es 1095 00:48:54,810 --> 00:48:56,770 más de un palo de hockey así, darse cuenta 1096 00:48:56,770 --> 00:49:00,160 estamos a punto de tipo de un pico en términos de la complejidad conceptual. 1097 00:49:00,160 --> 00:49:02,300 >> Y traigo a colación este foto, porque te juro 1098 00:49:02,300 --> 00:49:05,920 a dios, en el otoño de 1996, cuando tomé CS50 con mi compañero de enseñanza, 1099 00:49:05,920 --> 00:49:09,620 Nishat Mehta, me sentó en el esquina de la Eliot D. Hall durante el almuerzo, 1100 00:49:09,620 --> 00:49:12,330 o la cena, o algo para tratar de para ayudarme a entender punteros. 1101 00:49:12,330 --> 00:49:16,520 Y aquí es donde estuve semanas después que se introdujo en la conferencia cuando 1102 00:49:16,520 --> 00:49:18,170 Finalmente entendí punteros. 1103 00:49:18,170 --> 00:49:20,590 Y tengo la esperanza de que este haremos clic mucho antes para usted. 1104 00:49:20,590 --> 00:49:23,540 Pero darse cuenta de esto absolutamente entre los temas más sofisticados 1105 00:49:23,540 --> 00:49:24,420 hemos visto. 1106 00:49:24,420 --> 00:49:25,819 Pero es uno de los más poderosos. 1107 00:49:25,819 --> 00:49:28,860 Y cuando lo consigues, es realmente todo sólo va a finalmente se unen. 1108 00:49:28,860 --> 00:49:31,460 Así que puede estar seguro de que no lo hace necesitará toda lavabo en la actualidad. 1109 00:49:31,460 --> 00:49:32,980 >> Así que aquí está el último programa vamos a ver. 1110 00:49:32,980 --> 00:49:35,605 Y vamos a terminar con una rápidos tres minutos de animación con plastilina 1111 00:49:35,605 --> 00:49:37,030 tomada por nuestro amigo, Nick Parlante. 1112 00:49:37,030 --> 00:49:41,440 Aquí hay un programa, que en los dos primeros líneas declara una variable x e y. 1113 00:49:41,440 --> 00:49:44,780 Ambos de los cuales son direcciones de enteros, punteros AKA. 1114 00:49:44,780 --> 00:49:48,125 A continuación, asignar suficiente memoria para almacenar un int 1115 00:49:48,125 --> 00:49:51,344 y almacenar la dirección de que la memoria en x. 1116 00:49:51,344 --> 00:49:53,260 Por lo tanto, es aún más simple que el ejemplo anterior. 1117 00:49:53,260 --> 00:49:56,100 Dame cuatro bytes de memoria, ese es el tamaño de un int, 1118 00:49:56,100 --> 00:49:58,000 y poner esa dirección en x. 1119 00:49:58,000 --> 00:50:01,070 Esta línea significa aquí ir a la dirección de x 1120 00:50:01,070 --> 00:50:05,270 y poner el significado de la vida, el número 42 allí. 1121 00:50:05,270 --> 00:50:07,710 Pero esta línea me preocupa. 1122 00:50:07,710 --> 00:50:12,620 Star y significa ir a la dirección en y, y poner el número de mala suerte 13 allí. 1123 00:50:12,620 --> 00:50:15,780 ¿Por qué es peligroso, en este punto en la historia-- aunque dijo rápidamente 1124 00:50:15,780 --> 00:50:17,980 en nuestros últimos minutos aquí-- ¿por qué es malo 1125 00:50:17,980 --> 00:50:19,660 para mí decir, ir a la dirección de y? 1126 00:50:19,660 --> 00:50:21,077 >> AUDIENCIA: Usted no tiene [inaudible]. 1127 00:50:21,077 --> 00:50:22,910 DAVID J. MALAN: Yo no tengo poner nada en y. 1128 00:50:22,910 --> 00:50:25,520 Entonces, ¿cuál es el valor de y, en este punto de la historia? 1129 00:50:25,520 --> 00:50:26,570 No tenemos ni idea. 1130 00:50:26,570 --> 00:50:29,190 Es cierto valor de basura y ni sabe Binky. 1131 00:50:29,190 --> 00:50:32,532 Si pudiéramos terminar con esta nota. 1132 00:50:32,532 --> 00:50:34,832 >> [REPRODUCCIÓN DE VÍDEO] 1133 00:50:34,832 --> 00:50:36,500 >> -Oye, Binky, despierta. 1134 00:50:36,500 --> 00:50:39,140 Es tiempo para la diversión puntero. 1135 00:50:39,140 --> 00:50:40,210 >> -¿Que es eso? 1136 00:50:40,210 --> 00:50:41,690 Entérese de los punteros? 1137 00:50:41,690 --> 00:50:43,570 Oh, chuchería. 1138 00:50:43,570 --> 00:50:46,600 >> -Bueno, Para empezar, creo que estamos va a necesitar un par de punteros. 1139 00:50:46,600 --> 00:50:47,380 >> -OK. 1140 00:50:47,380 --> 00:50:51,120 Este código asigna dos punteros que puede apuntar a números enteros. 1141 00:50:51,120 --> 00:50:53,557 >> -OK, Así veo el dos punteros, pero ellos 1142 00:50:53,557 --> 00:50:55,140 no parecen estar apuntando a nada. 1143 00:50:55,140 --> 00:50:55,970 >> -Eso es correcto. 1144 00:50:55,970 --> 00:50:58,100 Inicialmente punteros no apunte a nada. 1145 00:50:58,100 --> 00:51:00,950 Las cosas que apuntan son llamada pointees y la que fueron creados 1146 00:51:00,950 --> 00:51:02,330 es un paso separado. 1147 00:51:02,330 --> 00:51:03,210 >> -Oh, Derecha, derecha. 1148 00:51:03,210 --> 00:51:03,940 Lo sabía. 1149 00:51:03,940 --> 00:51:05,730 Los pointees están separados. 1150 00:51:05,730 --> 00:51:08,310 Entonces, ¿cómo asignar un pointee? 1151 00:51:08,310 --> 00:51:11,960 >> -Ok, Bueno este código asigna un nuevo pointee número entero, 1152 00:51:11,960 --> 00:51:15,050 y esta parte fija xa apuntan a la misma. 1153 00:51:15,050 --> 00:51:16,240 >> -Oye, Que se ve mejor. 1154 00:51:16,240 --> 00:51:17,743 Así que haga algo. 1155 00:51:17,743 --> 00:51:23,580 >> -OK, Voy a eliminar la referencia del puntero x para almacenar el número 42 en su pointee. 1156 00:51:23,580 --> 00:51:27,130 Para este truco, necesitaré mi varita mágica de la eliminación de referencias. 1157 00:51:27,130 --> 00:51:30,200 >> -Su Varita mágica de la eliminación de referencias? 1158 00:51:30,200 --> 00:51:32,310 Uh, eso, eso es genial. 1159 00:51:32,310 --> 00:51:34,270 >> -Esto Es lo que el código se parece. 1160 00:51:34,270 --> 00:51:35,970 Voy a configurar el número y- 1161 00:51:35,970 --> 00:51:37,070 >> [POP SONIDO] 1162 00:51:37,070 --> 00:51:39,140 >> -Oye, Mira ahí va. 1163 00:51:39,140 --> 00:51:43,980 Así, haciendo un dereference en x sigue la flecha para acceder a su pointee. 1164 00:51:43,980 --> 00:51:46,150 En este caso, para almacenar 42 allí. 1165 00:51:46,150 --> 00:51:50,700 Hey, pruebe a utilizar para almacenar el número 13 a través del otro puntero, y. 1166 00:51:50,700 --> 00:51:51,840 >> -OK. 1167 00:51:51,840 --> 00:51:56,270 Voy a ir por aquí ay, y obtener el número 13 de puesta en marcha. 1168 00:51:56,270 --> 00:52:00,380 Y luego tomar la varita de eliminación de referencias y sólo-- 1169 00:52:00,380 --> 00:52:01,646 >> [BUZZER SOUND] 1170 00:52:01,646 --> 00:52:04,080 >> Oh, bueno eso no funcionó. 1171 00:52:04,080 --> 00:52:06,470 Diga, uh, Binky, no lo hago pensar eliminación de referencias 1172 00:52:06,470 --> 00:52:10,850 y es una buena idea, porque el establecimiento el pointee es un paso separado. 1173 00:52:10,850 --> 00:52:12,480 Y yo no creo que nunca hicimos. 1174 00:52:12,480 --> 00:52:14,620 >> -Hmm, Buen punto. 1175 00:52:14,620 --> 00:52:19,810 >> -Sí, Nos asignaron el puntero, y, pero nunca nos pusimos a apuntar a un pointee. 1176 00:52:19,810 --> 00:52:21,590 >> -Hmm, Muy observador. 1177 00:52:21,590 --> 00:52:23,215 -Oye, Te ves bien allí, Binky. 1178 00:52:23,215 --> 00:52:26,390 ¿Se puede arreglar para que los puntos Y a la misma pointee como x. 1179 00:52:26,390 --> 00:52:29,290 >> -Claro, Yo uso mi varita mágica de asignación de puntero. 1180 00:52:29,290 --> 00:52:31,970 >> -Es Que va a ser un problema, al igual que antes? 1181 00:52:31,970 --> 00:52:33,790 >> -No, Esto no toca los pointees. 1182 00:52:33,790 --> 00:52:35,840 Sólo cambia un puntero para que apunte a la misma cosa-- 1183 00:52:35,840 --> 00:52:36,465 >> [POPPING SONIDO] 1184 00:52:36,465 --> 00:52:37,450 --como otra. 1185 00:52:37,450 --> 00:52:38,440 >> -Ah, ya veo. 1186 00:52:38,440 --> 00:52:41,200 Ahora Y apunta al mismo lugar que x. 1187 00:52:41,200 --> 00:52:42,950 Así, espera, ahora y se fija. 1188 00:52:42,950 --> 00:52:44,110 Tiene un pointee. 1189 00:52:44,110 --> 00:52:47,779 Así que usted puede probar la varita de eliminación de referencias volver a enviar el 13 más. 1190 00:52:47,779 --> 00:52:51,110 >> Oh, bien, aquí va. 1191 00:52:51,110 --> 00:52:52,330 >> Oye, mira eso. 1192 00:52:52,330 --> 00:52:53,570 Ahora dereferencing obras en y. 1193 00:52:53,570 --> 00:52:57,900 Y debido a que los punteros están compartiendo que uno pointee, ambos ven el 13. 1194 00:52:57,900 --> 00:52:59,952 >> -Sí, Compartir, eh, lo que sea. 1195 00:52:59,952 --> 00:53:01,535 Por lo tanto, vamos a cambiar de lugar ahora? 1196 00:53:01,535 --> 00:53:03,730 >> Oh, mira que estamos fuera de tiempo. 1197 00:53:03,730 --> 00:53:04,660 >> -Pero-- 1198 00:53:04,660 --> 00:53:06,520 >> -Sólo Recuerda las tres reglas de puntero. 1199 00:53:06,520 --> 00:53:09,550 Número 1, la estructura básica es que usted tiene un puntero, 1200 00:53:09,550 --> 00:53:11,630 y apunta a un pointee. 1201 00:53:11,630 --> 00:53:13,740 Pero el puntero y pointee están separados. 1202 00:53:13,740 --> 00:53:15,620 Y el error común es la creación de un puntero 1203 00:53:15,620 --> 00:53:18,000 pero que se olvide de darle una pointee. 1204 00:53:18,000 --> 00:53:21,170 >> Número 2, desreferencia puntero comienza en el puntero 1205 00:53:21,170 --> 00:53:24,020 y sigue su flecha sobre para acceder a su pointee. 1206 00:53:24,020 --> 00:53:27,815 Como todos sabemos, esto sólo funciona si hay es un pointee, qué tipo de vuelva 1207 00:53:27,815 --> 00:53:29,260 a la regla número 1. 1208 00:53:29,260 --> 00:53:31,990 >> Número 3, puntero asignación tiene un puntero 1209 00:53:31,990 --> 00:53:35,330 y cambia a apuntar a la pointee mismo como otro puntero. 1210 00:53:35,330 --> 00:53:37,150 Así que después de la cesión, los dos punteros 1211 00:53:37,150 --> 00:53:40,927 apuntará a la misma pointee, A veces eso se llama compartir. 1212 00:53:40,927 --> 00:53:42,510 Y eso es todo lo que hay que hacer, de verdad. 1213 00:53:42,510 --> 00:53:43,130 Adiós ahora. 1214 00:53:43,130 --> 00:53:43,475 >> [FIN DE REPRODUCCIÓN] 1215 00:53:43,475 --> 00:53:44,830 >> DAVID J. MALAN: Eso es todo por CS50. 1216 00:53:44,830 --> 00:53:46,246 Gracias al profesor Nick Parlante. 1217 00:53:46,246 --> 00:53:47,730 Nos vemos la semana que viene. 1218 00:53:47,730 --> 00:53:51,706 1219 00:53:51,706 --> 00:53:56,435 >> [REPRODUCCIÓN DE MÚSICA ELECTRÓNICA] 1220 00:53:56,435 --> 00:57:22,775