1 00:00:00,000 --> 00:00:11,320 2 00:00:11,320 --> 00:00:13,260 >> DAVID MALAN: Hola, y bienvenidos de nuevo a CS50. 3 00:00:13,260 --> 00:00:14,860 Así que este es el final de la cuarta semana. 4 00:00:14,860 --> 00:00:16,680 Sólo un anuncio de primera. 5 00:00:16,680 --> 00:00:19,600 Así la llamada quinta Lunes es subiendo el próximo lunes. 6 00:00:19,600 --> 00:00:22,800 Esta es la oportunidad de cambiar de SAT / UNSAT a un grado de la letra, o de 7 00:00:22,800 --> 00:00:24,130 grado de la letra SAT / UNSAT. 8 00:00:24,130 --> 00:00:27,130 Era un fastidio, ese proceso no requiere una firma, porque hay que llenar 9 00:00:27,130 --> 00:00:28,770 una de esas formas de inserción / extracción de color rosa. 10 00:00:28,770 --> 00:00:31,680 >> Porque técnicamente, el SAT / UNSAT versión y la versión de la letra de grado 11 00:00:31,680 --> 00:00:33,320 tienen números de catálogo distintos. 12 00:00:33,320 --> 00:00:34,240 Pero no es gran cosa. 13 00:00:34,240 --> 00:00:36,620 Solo tiene que venir a mí o para Rob o para Lauren en cualquier punto. 14 00:00:36,620 --> 00:00:39,550 O envíenos un correo electrónico si usted no tiene el tipo de papeleo que necesita hoy, y nosotros 15 00:00:39,550 --> 00:00:43,410 será seguro para ayudarle a tomar cuidado de que antes del lunes. 16 00:00:43,410 --> 00:00:45,780 >> Muy bien, así que hoy - 17 00:00:45,780 --> 00:00:47,630 de hecho, hay un poco de eco. 18 00:00:47,630 --> 00:00:51,070 ¿Podemos me atenuar un poco? 19 00:00:51,070 --> 00:00:51,730 Aceptar. 20 00:00:51,730 --> 00:00:54,850 Así que hoy, se introduce un tema conocido como punteros. 21 00:00:54,850 --> 00:00:57,770 Y voy a admitir que este es uno de los los temas más complejos que tendemos a 22 00:00:57,770 --> 00:01:00,960 cubrir en esta clase, o en realidad cualquier curso introductorio que utiliza C. 23 00:01:00,960 --> 00:01:05,510 >> Pero tome mi palabra para ella, sobre todo si su mente se siente un poco más dobladas 24 00:01:05,510 --> 00:01:07,100 hoy y en las próximas semanas. 25 00:01:07,100 --> 00:01:10,340 No es representativo de usted que consigue peor en este sólo significa que 26 00:01:10,340 --> 00:01:13,360 se trata de un tema particularmente sofisticado que prometo, un par de semanas 27 00:01:13,360 --> 00:01:17,610 por lo tanto, le parecerá muy llamativo sencillo en retrospectiva. 28 00:01:17,610 --> 00:01:18,720 >> Todavía recuerdo a este día. 29 00:01:18,720 --> 00:01:22,190 Yo estaba sentado en Elliott Dining Hall, sentado al lado de mi TF Nishat Mehta, 30 00:01:22,190 --> 00:01:24,070 que era un residente de la casa de Elliott. 31 00:01:24,070 --> 00:01:26,340 Y por alguna razón, esta tema simplemente haga clic. 32 00:01:26,340 --> 00:01:29,430 Lo que quiere decir que yo también luché con él durante una cierta cantidad de tiempo, pero me 33 00:01:29,430 --> 00:01:33,610 Haré mi mejor para ayudar a evitar cualquier luchar con un tema que en última instancia, 34 00:01:33,610 --> 00:01:34,580 es bastante potente. 35 00:01:34,580 --> 00:01:37,350 >> De hecho, uno de los temas que vamos a discutir en las próximas semanas es que 36 00:01:37,350 --> 00:01:41,130 de seguridad, y cómo en realidad se puede explotar las máquinas de manera 37 00:01:41,130 --> 00:01:42,320 que no se pretendía. 38 00:01:42,320 --> 00:01:45,850 Y esas explotaciones son típicamente el resultado de los errores, equivocaciones que nos 39 00:01:45,850 --> 00:01:49,740 la gente comete al no entender algunas de la implementación subyacente 40 00:01:49,740 --> 00:01:52,250 detalles a través del cual se realizan los programas. 41 00:01:52,250 --> 00:01:55,410 >> Ahora, para hacer que esto parezca aún más usuarios amable, pensé que jugaría un 10 42 00:01:55,410 --> 00:01:59,680 segunda vista previa de un poco de animación con plastilina figura llamada Binky que fue llevado a 43 00:01:59,680 --> 00:02:03,020 la vida por un amigo nuestro en Stanford, profesor Nick Parlante. 44 00:02:03,020 --> 00:02:06,753 Así que permítame que le doy a este teaser del Binky aquí. 45 00:02:06,753 --> 00:02:09,520 >> [REPRODUCCIÓN DE VÍDEO] 46 00:02:09,520 --> 00:02:10,380 >> -Hey, Binky. 47 00:02:10,380 --> 00:02:11,050 Despierta. 48 00:02:11,050 --> 00:02:13,610 Es tiempo para la diversión puntero. 49 00:02:13,610 --> 00:02:14,741 >> ¿Qué es eso? 50 00:02:14,741 --> 00:02:16,440 Entérese de los punteros? 51 00:02:16,440 --> 00:02:17,928 Oh, qué bien. 52 00:02:17,928 --> 00:02:18,920 >> [VIDEO PLAYBACK FIN] 53 00:02:18,920 --> 00:02:20,670 >> DAVID MALAN: Es Stanford ciencias de la computación. 54 00:02:20,670 --> 00:02:23,194 Así que más en el venidero. 55 00:02:23,194 --> 00:02:24,930 >> [Aplausos] 56 00:02:24,930 --> 00:02:26,660 >> DAVID MALAN: Lo siento, Nick. 57 00:02:26,660 --> 00:02:30,680 >> Así que recordar que la última vez que terminamos en esto realmente emocionante melodrama 58 00:02:30,680 --> 00:02:32,960 por lo que esta función simplemente no funcionó. 59 00:02:32,960 --> 00:02:34,960 Por lo menos intuitivamente, se sentía como tiene que funcionar. 60 00:02:34,960 --> 00:02:37,600 Simplemente intercambiando los valores de dos números enteros. 61 00:02:37,600 --> 00:02:40,915 Pero recordar que cuando imprimimos la valores originales en principal, una y 62 00:02:40,915 --> 00:02:44,210 dos, que eran todavía uno y dos y no dos y uno. 63 00:02:44,210 --> 00:02:46,070 >> Así que permítanme realidad enciendo sobre el aparato. 64 00:02:46,070 --> 00:02:50,180 Y escribí un poco de código esquelético en adelantar aquí, donde afirmo que x 65 00:02:50,180 --> 00:02:52,500 será 1, y habrá 2. 66 00:02:52,500 --> 00:02:54,810 Luego imprimo tanto de su valores con la impresión f. 67 00:02:54,810 --> 00:02:57,540 >> Entonces yo sostengo aquí que vamos a intercambiarlas. 68 00:02:57,540 --> 00:03:00,800 He dejado un espacio en blanco aquí para nosotros rellene hoy en un momento. 69 00:03:00,800 --> 00:03:03,380 Entonces, voy a reclamar que el dos variables se han intercambiado. 70 00:03:03,380 --> 00:03:04,770 Entonces voy a imprimir ellos de nuevo. 71 00:03:04,770 --> 00:03:07,090 Y así, con suerte, yo debería ver 1, 2. 72 00:03:07,090 --> 00:03:07,380 2, 1. 73 00:03:07,380 --> 00:03:09,830 Ese es el super simple objetivo ahora mismo. 74 00:03:09,830 --> 00:03:12,430 >> Entonces, ¿cómo hacemos para intercambiar dos variables? 75 00:03:12,430 --> 00:03:17,220 Bueno, si me propongo aquí que estas copas podría representar la memoria en un ordenador. 76 00:03:17,220 --> 00:03:19,070 Se trata de un par de bocados, este es otra de las picaduras. 77 00:03:19,070 --> 00:03:23,260 ¿Podríamos tener un voluntario se enciende y nos mezcle algunas bebidas, si resulta familiar? 78 00:03:23,260 --> 00:03:23,920 Vamos arriba. 79 00:03:23,920 --> 00:03:24,815 ¿Cómo te llamas? 80 00:03:24,815 --> 00:03:25,260 >> JESS: Jess. 81 00:03:25,260 --> 00:03:25,690 >> DAVID MALAN: Jess? 82 00:03:25,690 --> 00:03:26,540 Vamos arriba, Jess. 83 00:03:26,540 --> 00:03:29,180 Si no te importa, tenemos que poner el Google Glass en usted para que podamos 84 00:03:29,180 --> 00:03:30,430 inmortalizar esto. 85 00:03:30,430 --> 00:03:32,800 86 00:03:32,800 --> 00:03:34,670 Aceptar, vidrio. 87 00:03:34,670 --> 00:03:37,250 Grabar un vídeo. 88 00:03:37,250 --> 00:03:43,103 Y bien, somos buenos para ir con Jess aquí. 89 00:03:43,103 --> 00:03:43,810 Está bien. 90 00:03:43,810 --> 00:03:45,120 Gusto en conocerlo. 91 00:03:45,120 --> 00:03:47,720 >> Así que lo que me gustaría que ustedes hacen aquí - si se pudiera, con bastante rapidez - 92 00:03:47,720 --> 00:03:51,040 sólo nos vierte la mitad de un vaso de naranja jugo y la mitad de un vaso de leche, 93 00:03:51,040 --> 00:03:55,710 representar efectivamente los números 1 en una taza y 2 en el otro vaso. 94 00:03:55,710 --> 00:04:01,380 95 00:04:01,380 --> 00:04:02,630 >> Esto va a ser bueno metraje. 96 00:04:02,630 --> 00:04:04,910 97 00:04:04,910 --> 00:04:05,860 >> JESS: Lo siento. 98 00:04:05,860 --> 00:04:06,330 >> DAVID MALAN: No, no. 99 00:04:06,330 --> 00:04:08,703 Está bien. 100 00:04:08,703 --> 00:04:10,120 Niza. 101 00:04:10,120 --> 00:04:12,950 Muy bien, así que tenemos cuatro bytes pena de jugo de naranja. 102 00:04:12,950 --> 00:04:14,460 Vamos a llamábamos el valor 1. 103 00:04:14,460 --> 00:04:16,579 Ahora, otro cuatro bytes por valor de la leche. 104 00:04:16,579 --> 00:04:18,519 Llamaremos valor 2. 105 00:04:18,519 --> 00:04:20,440 Así que x e y, respectivamente. 106 00:04:20,440 --> 00:04:23,450 >> Muy bien, así que ahora si la tarea en cuestión - para ti, Jess, delante de todos 107 00:04:23,450 --> 00:04:24,270 de sus compañeros de clase - 108 00:04:24,270 --> 00:04:28,510 es para cambiar los valores de x e y tales que queremos que el jugo de naranja en la 109 00:04:28,510 --> 00:04:32,070 otra taza y la leche en esta copa, cómo podría usted - antes de que realmente lo hace 110 00:04:32,070 --> 00:04:34,020 ella - ir haciendo esto? 111 00:04:34,020 --> 00:04:35,220 >> Bueno, sabia decisión. 112 00:04:35,220 --> 00:04:36,340 Por lo que necesita un poco más de memoria. 113 00:04:36,340 --> 00:04:38,190 Así que vamos a asignar un temporal taza, si se quiere. 114 00:04:38,190 --> 00:04:40,540 Y ahora proceder a cambiar xe y. 115 00:04:40,540 --> 00:04:52,950 116 00:04:52,950 --> 00:04:53,530 >> Excelente. 117 00:04:53,530 --> 00:04:54,420 Así que muy bien hecho. 118 00:04:54,420 --> 00:04:55,670 Muchas Gracias, Jess. 119 00:04:55,670 --> 00:04:59,520 120 00:04:59,520 --> 00:05:00,020 Aquí tiene. 121 00:05:00,020 --> 00:05:01,950 Un pequeño recuerdo. 122 00:05:01,950 --> 00:05:04,350 >> Aceptar, por lo que, obviamente, idea super simple. 123 00:05:04,350 --> 00:05:07,500 Totalmente intuitivo que necesitamos un poco más espacio de almacenamiento - en esta forma, 124 00:05:07,500 --> 00:05:09,750 una taza - si realmente queremos intercambiar estas dos variables. 125 00:05:09,750 --> 00:05:11,110 Así que vamos a hacer exactamente eso. 126 00:05:11,110 --> 00:05:14,330 Hasta aquí entre donde yo afirmo que soy va a estar haciendo un poco de intercambio, lo voy a hacer 127 00:05:14,330 --> 00:05:15,720 seguir adelante y declarar temp. 128 00:05:15,720 --> 00:05:17,980 Y me puse igual a, digamos, x. 129 00:05:17,980 --> 00:05:21,110 >> Entonces me voy a cambiar el valor de x igual que Jess hizo aquí con el 130 00:05:21,110 --> 00:05:23,200 leche y zumo de naranja para que sea igual a y. 131 00:05:23,200 --> 00:05:27,460 Y yo voy a cambiar y que es igual no x, porque ahora estaríamos 132 00:05:27,460 --> 00:05:29,530 atrapado en un círculo, sino más bien la temperatura. 133 00:05:29,530 --> 00:05:33,170 Donde temporalmente - o donde Jess aparcar temporalmente el jugo de naranja 134 00:05:33,170 --> 00:05:35,460 antes de que clobbering taza con la leche. 135 00:05:35,460 --> 00:05:37,250 >> Así que déjame ir adelante ahora y hago esto. 136 00:05:37,250 --> 00:05:39,210 Se llama noswap.c. 137 00:05:39,210 --> 00:05:41,190 Y ahora déjame correr ningún intercambio. 138 00:05:41,190 --> 00:05:43,910 Y de hecho lo veo, si puedo ampliar la ventana un poco, que 139 00:05:43,910 --> 00:05:45,160 x es 1, y es 2. 140 00:05:45,160 --> 00:05:47,230 Y entonces x es 2, y es 1. 141 00:05:47,230 --> 00:05:51,910 >> Pero recordar que el lunes hicimos las cosas un poco diferente por el cual yo 142 00:05:51,910 --> 00:05:56,760 en vez implementada una función auxiliar, si se quiere, que en realidad era nula. 143 00:05:56,760 --> 00:05:58,010 Lo llamé swap. 144 00:05:58,010 --> 00:06:01,600 Le di dos parámetros, y llamé ellos una y yo los llamaba b. 145 00:06:01,600 --> 00:06:04,380 >> Francamente, yo podría llamarlos xe y. 146 00:06:04,380 --> 00:06:06,040 Nada le detiene me hagan eso. 147 00:06:06,040 --> 00:06:08,140 Pero yo diría que es entonces un poco ambigua. 148 00:06:08,140 --> 00:06:11,910 Porque recuerdo para el lunes que Alegaron que estos parámetros fueron 149 00:06:11,910 --> 00:06:13,650 copias de los valores pasados ​​pulg 150 00:06:13,650 --> 00:06:15,640 Por lo que sólo se mete con su mente, creo que, si utiliza 151 00:06:15,640 --> 00:06:17,370 exactamente las mismas variables. 152 00:06:17,370 --> 00:06:20,150 >> Así que en lugar de ellos a llamar a un y b, sólo para mayor claridad. 153 00:06:20,150 --> 00:06:21,840 Pero podríamos llamarlos más lo que queramos. 154 00:06:21,840 --> 00:06:26,280 Y yo voy a copiar y pegar efectivamente este código desde allí arriba 155 00:06:26,280 --> 00:06:27,170 abajo en aquí. 156 00:06:27,170 --> 00:06:29,110 Porque acabo de ver que funciona. 157 00:06:29,110 --> 00:06:30,790 Así que eso es en muy buena forma. 158 00:06:30,790 --> 00:06:37,390 Y voy a cambiar mi xa una, mi x a una, a mi y a B y mi y para b. 159 00:06:37,390 --> 00:06:39,130 >> Así, en otras palabras, la misma lógica exacta. 160 00:06:39,130 --> 00:06:40,850 Exactamente lo mismo que Jess hizo. 161 00:06:40,850 --> 00:06:44,350 Y entonces lo único que tengo que hacer hasta aquí, por supuesto, ahora es invocar esta 162 00:06:44,350 --> 00:06:45,990 funcionar, o llamar a esta función. 163 00:06:45,990 --> 00:06:50,430 Así que voy a llamar a esta función con dos insumos, x e y, y pulse Guardar. 164 00:06:50,430 --> 00:06:52,300 >> Muy bien, así que fundamentalmente la misma cosa. 165 00:06:52,300 --> 00:06:55,570 De hecho, probablemente he hecho el programa innecesariamente compleja por 166 00:06:55,570 --> 00:07:00,820 escribir una función que acaba de tomar unas seis líneas de código mientras que yo 167 00:07:00,820 --> 00:07:02,970 previamente habían implementado esto en tan sólo tres. 168 00:07:02,970 --> 00:07:06,230 >> Así que déjame ir adelante ahora y rehacer esto, no nos swap. 169 00:07:06,230 --> 00:07:07,920 Muy bien, la he cagado aquí. 170 00:07:07,920 --> 00:07:11,290 Esto debe ser un error que podría ver cada vez más comúnmente como su 171 00:07:11,290 --> 00:07:12,380 programas se vuelven más complejos. 172 00:07:12,380 --> 00:07:13,470 Pero hay una solución fácil. 173 00:07:13,470 --> 00:07:15,650 Permítanme retroceder hasta aquí. 174 00:07:15,650 --> 00:07:18,190 >> Y lo que es el primer error que estoy viendo? 175 00:07:18,190 --> 00:07:19,520 Declaración implícita. 176 00:07:19,520 --> 00:07:21,466 Lo que sí que suelen indicar? 177 00:07:21,466 --> 00:07:22,830 Ah, se me olvidó el prototipo. 178 00:07:22,830 --> 00:07:26,900 Me olvidé de enseñar al compilador que intercambie va a existir a pesar de que 179 00:07:26,900 --> 00:07:28,920 no existe en el principio del programa. 180 00:07:28,920 --> 00:07:35,780 Así que sólo voy a decir nula, de intercambio, int, un int b, punto y coma. 181 00:07:35,780 --> 00:07:37,280 >> Así que no voy a volverlo a implementar. 182 00:07:37,280 --> 00:07:39,140 Pero ahora que coincide con lo que está aquí abajo. 183 00:07:39,140 --> 00:07:42,530 Y note, la ausencia de un punto y coma aquí, que no es necesario cuando 184 00:07:42,530 --> 00:07:43,200 ejecución. 185 00:07:43,200 --> 00:07:46,010 >> Así que rehacerme esto, asegúrese de no intercambio. 186 00:07:46,010 --> 00:07:46,910 Mucho mejor forma. 187 00:07:46,910 --> 00:07:48,130 Correr sin swap. 188 00:07:48,130 --> 00:07:48,740 Y maldita sea. 189 00:07:48,740 --> 00:07:51,650 Ahora estamos de vuelta donde estábamos el lunes, donde la cosa no intercambiar. 190 00:07:51,650 --> 00:07:55,410 >> Y lo que es la explicación intuitiva de por qué esto es así? 191 00:07:55,410 --> 00:07:56,380 ¿Sí? 192 00:07:56,380 --> 00:07:57,630 >> ESTUDIANTE: [inaudible]. 193 00:07:57,630 --> 00:08:04,140 194 00:08:04,140 --> 00:08:05,230 >> DAVID MALAN: Exactamente. 195 00:08:05,230 --> 00:08:07,330 Así que a y b son copias de x e y. 196 00:08:07,330 --> 00:08:10,680 Y, de hecho, cada vez que he estado llamar a una función que hasta ahora 197 00:08:10,680 --> 00:08:12,540 pasa variables como ints - 198 00:08:12,540 --> 00:08:14,470 simplemente como swap está esperando aquí - 199 00:08:14,470 --> 00:08:16,270 ustedes han estado pasando en las copias. 200 00:08:16,270 --> 00:08:19,150 >> Ahora que significa que se necesita un poco de tiempo, una fracción de segundo, para el 201 00:08:19,150 --> 00:08:23,270 ordenador para copiar los bits de un variable en los bits de otro. 202 00:08:23,270 --> 00:08:24,610 Pero eso no es una cosa muy importante. 203 00:08:24,610 --> 00:08:25,920 Pero, sin embargo, son una copia. 204 00:08:25,920 --> 00:08:30,020 >> Y ahora, en el contexto del intercambio, Yo soy, de hecho, con éxito 205 00:08:30,020 --> 00:08:31,180 cambiar a y b. 206 00:08:31,180 --> 00:08:33,000 De hecho, vamos a hacer una rápida comprobación de validez. 207 00:08:33,000 --> 00:08:36,830 Imprimir f a es% i, nueva línea. 208 00:08:36,830 --> 00:08:38,770 Y vamos a enchufar a. 209 00:08:38,770 --> 00:08:41,830 Ahora vamos a hacer lo mismo con b. 210 00:08:41,830 --> 00:08:43,640 Y vamos a hacer lo mismo aquí. 211 00:08:43,640 --> 00:08:47,260 >> Y ahora, permítanme copiar esas mismas líneas de nuevo en la parte inferior de la función 212 00:08:47,260 --> 00:08:51,250 después de mis tres líneas de interés podría haber ejecutado y 213 00:08:51,250 --> 00:08:53,270 impresión a y b con todo otra vez. 214 00:08:53,270 --> 00:08:56,030 Así que ahora vamos a hacer esto, asegúrese de no intercambio. 215 00:08:56,030 --> 00:08:58,430 Quiero dejar la ventana de terminal de un poco más alto, por lo que podemos ver 216 00:08:58,430 --> 00:08:59,520 más de lo mismo al mismo tiempo. 217 00:08:59,520 --> 00:09:00,860 >> Y corre ningún intercambio. 218 00:09:00,860 --> 00:09:04,000 x es 1, y es 2. a es 1, b es 2. 219 00:09:04,000 --> 00:09:06,070 Y luego, a es 2, b es 1. 220 00:09:06,070 --> 00:09:09,390 Así que se está trabajando, al igual que Jess no aquí en el interior del swap. 221 00:09:09,390 --> 00:09:13,090 Pero, por supuesto, es que no tiene efecto en las variables en principal. 222 00:09:13,090 --> 00:09:15,360 >> Así que vimos un truco por el cual nos podría solucionar este problema, ¿verdad? 223 00:09:15,360 --> 00:09:19,560 Cuando te enfrentas a esta determinación del alcance problema, sólo podía despejar y hacer x 224 00:09:19,560 --> 00:09:22,400 e y qué tipo de variables que en su lugar? 225 00:09:22,400 --> 00:09:23,390 >> Usted podría hacerlos global. 226 00:09:23,390 --> 00:09:27,560 Póngalos en la parte superior del archivo como lo hicimos, incluso en el juego de 15. 227 00:09:27,560 --> 00:09:28,890 Utilizamos una variable global. 228 00:09:28,890 --> 00:09:32,420 Pero en el contexto del juego un 15, es razonable tener un mundial 229 00:09:32,420 --> 00:09:37,170 variable que representa el tablero, porque la totalidad de 15.c es todo 230 00:09:37,170 --> 00:09:38,650 sobre la implementación de ese juego. 231 00:09:38,650 --> 00:09:41,470 Eso es lo que existe en el archivo para hacer. 232 00:09:41,470 --> 00:09:44,170 >> Pero en este caso aquí, estoy pidiendo un intercambio de funciones. 233 00:09:44,170 --> 00:09:45,380 Quiero intercambiar dos variables. 234 00:09:45,380 --> 00:09:48,950 Y debe empezar a sentir sólo descuidado Si la solución a todos nuestros 235 00:09:48,950 --> 00:09:51,300 problemas cuando nos topamos con alcance cuestiones es que sea global. 236 00:09:51,300 --> 00:09:54,730 Debido a que muy rápidamente nuestro programa es va a convertir en un buen lío. 237 00:09:54,730 --> 00:09:57,760 Y lo hicimos con mucha moderación Como resultado, en 15.c 238 00:09:57,760 --> 00:10:00,470 >> Pero resulta que hay una mejor manera por completo. 239 00:10:00,470 --> 00:10:05,600 Permítanme realmente volver atrás y borrar la imprimir f de, sólo para simplificar el código. 240 00:10:05,600 --> 00:10:09,160 Y permítanme proponer que esto, de hecho, es malo. 241 00:10:09,160 --> 00:10:15,990 Pero si en lugar de añadir en algunos asteriscos y las estrellas, Yo en cambio pueden convertir este 242 00:10:15,990 --> 00:10:18,670 funcionar en una que es realidad operativa. 243 00:10:18,670 --> 00:10:25,020 >> Así que déjame volver aquí y admito que dice asteriscos es siempre difícil, 244 00:10:25,020 --> 00:10:26,170 así que voy a decir las estrellas. 245 00:10:26,170 --> 00:10:27,660 Voy a confesar a aquella. 246 00:10:27,660 --> 00:10:28,190 Está bien. 247 00:10:28,190 --> 00:10:30,190 Y ahora, ¿qué voy hacer en su lugar? 248 00:10:30,190 --> 00:10:34,130 >> Así que en primer lugar, voy a especificar que en lugar de pasar un int en 249 00:10:34,130 --> 00:10:37,980 la función de intercambio, estoy en su lugar de ir a decir int estrellas. 250 00:10:37,980 --> 00:10:39,170 Ahora, ¿qué indica la estrella? 251 00:10:39,170 --> 00:10:41,970 Esta es la noción de un puntero que Binky, el personaje de animación con plastilina, era 252 00:10:41,970 --> 00:10:43,465 refiriéndose a un momento anterior. 253 00:10:43,465 --> 00:10:47,610 >> Así que si decimos int estrella, el significado de esto ahora es que no va a ser 254 00:10:47,610 --> 00:10:49,110 pasada por su valor. 255 00:10:49,110 --> 00:10:50,350 No va a ser copiado pulg 256 00:10:50,350 --> 00:10:54,700 Más bien, la dirección de una es va a ser pasado pulg 257 00:10:54,700 --> 00:10:57,840 >> Así que recordar que en el interior de su equipo es un montón de memoria, de lo contrario 258 00:10:57,840 --> 00:10:58,760 conocida como RAM. 259 00:10:58,760 --> 00:11:00,520 Y que la memoria RAM es sólo un manojo entero de bytes. 260 00:11:00,520 --> 00:11:03,320 Así que si tu Mac o tu PC tiene dos gigabytes, tiene 2 261 00:11:03,320 --> 00:11:05,760 miles de millones de bytes de memoria. 262 00:11:05,760 --> 00:11:08,440 >> Ahora vamos a suponer que sólo para mantener las cosas bonitas y ordenadas, que 263 00:11:08,440 --> 00:11:09,450 asignar una dirección - 264 00:11:09,450 --> 00:11:10,170 un número - 265 00:11:10,170 --> 00:11:12,270 a cada byte de RAM en su ordenador. 266 00:11:12,270 --> 00:11:15,410 El primer byte de los 2 mil millones es por número cero. 267 00:11:15,410 --> 00:11:18,572 El siguiente es el byte número uno, número dos, todo el camino hacia arriba, punto punto 268 00:11:18,572 --> 00:11:20,530 punto, a unos 2 millones de dólares. 269 00:11:20,530 --> 00:11:23,640 >> Así que usted puede contar de los bytes de la memoria en su ordenador. 270 00:11:23,640 --> 00:11:26,460 Así que vamos a suponer que eso es lo que queremos decir con una dirección. 271 00:11:26,460 --> 00:11:31,360 Así que cuando veo una estrella int, ¿qué está pasando para ser pasado a la permuta ahora es el 272 00:11:31,360 --> 00:11:32,830 dirección de una. 273 00:11:32,830 --> 00:11:37,150 No su valor, pero sea cual sea su postal dirección es, por así decirlo - 274 00:11:37,150 --> 00:11:38,810 su ubicación en la RAM. 275 00:11:38,810 --> 00:11:41,250 >> Y lo mismo para b, voy para decir la misma cosa. 276 00:11:41,250 --> 00:11:42,720 Int, estrella, b. 277 00:11:42,720 --> 00:11:46,350 Como acotación al margen, técnicamente la estrella podría ir en otros lugares. 278 00:11:46,350 --> 00:11:50,140 Pero vamos a estandarizar en la estrella de ser justo al lado del tipo de datos. 279 00:11:50,140 --> 00:11:54,080 >> Así firma de intercambio significa que ahora, dame la dirección de un int, y llamada 280 00:11:54,080 --> 00:11:55,400 que la dirección a. 281 00:11:55,400 --> 00:11:58,690 Y dame otra dirección de una int y llamar a esa dirección b. 282 00:11:58,690 --> 00:12:01,120 >> Pero ahora mi código aquí tiene que cambiar. 283 00:12:01,120 --> 00:12:03,470 Porque si yo declaro int temp - 284 00:12:03,470 --> 00:12:05,580 que todavía es de tipo int - 285 00:12:05,580 --> 00:12:08,700 pero guardo en ella una, qué tipo de valor? 286 00:12:08,700 --> 00:12:12,870 Para que quede claro, ¿me estoy poniendo una a con el código como está escrito en este momento? 287 00:12:12,870 --> 00:12:14,360 >> Estoy poniendo la ubicación en un archivo. 288 00:12:14,360 --> 00:12:16,500 Pero yo no me preocupo por el lugar, ¿no? 289 00:12:16,500 --> 00:12:21,940 Temperatura existe justo tercera taza Jess ' existido, con qué propósito? 290 00:12:21,940 --> 00:12:23,090 Para almacenar un valor. 291 00:12:23,090 --> 00:12:24,830 Leche o jugo de naranja. 292 00:12:24,830 --> 00:12:28,520 No almacenar en realidad la dirección de ninguna de esas cosas, que se siente un 293 00:12:28,520 --> 00:12:31,200 poco sin sentido en este verdadero contexto mundial de todos modos. 294 00:12:31,200 --> 00:12:34,990 >> Así que en realidad, de lo que quiero poner en temp no es la dirección de una, pero el 295 00:12:34,990 --> 00:12:36,180 contenido de un archivo. 296 00:12:36,180 --> 00:12:41,930 Así que si a es un número como 123, este es el byte 123a de memoria que un solo 297 00:12:41,930 --> 00:12:45,090 pasa a ser ocupante, de que el valor en una pasa a ser de ocupación. 298 00:12:45,090 --> 00:12:49,040 >> Si quiero ir a esa dirección, Tengo que decir una estrella. 299 00:12:49,040 --> 00:12:52,610 Del mismo modo, si tuviera que cambiar lo que está a la dirección un cambio 300 00:12:52,610 --> 00:12:53,570 esto para comenzar a. 301 00:12:53,570 --> 00:12:58,185 Si quiero almacenar en lo que está en el ubicación a con lo que está en la ubicación 302 00:12:58,185 --> 00:13:02,180 en b, b estrella estrella. 303 00:13:02,180 --> 00:13:05,340 >> Así que en resumen, ni siquiera si esto es bastante hundimiento en todo - y yo no esperaría 304 00:13:05,340 --> 00:13:06,560 que sería tan rápido - 305 00:13:06,560 --> 00:13:11,100 dan cuenta de que todo lo que estoy haciendo es prefijar estas estrellas a mis variables, 306 00:13:11,100 --> 00:13:13,350 decir no agarrar los valores. 307 00:13:13,350 --> 00:13:14,520 No cambie los valores. 308 00:13:14,520 --> 00:13:17,600 Sino más bien, ir a esas direcciones y obtener el valor. 309 00:13:17,600 --> 00:13:21,430 Ir a esa dirección y el cambio el valor allí. 310 00:13:21,430 --> 00:13:25,500 >> Así que ahora déjame retroceder hasta la cima, sólo para solucionar esta línea aquí, para 311 00:13:25,500 --> 00:13:27,690 cambiar el prototipo de igualar. 312 00:13:27,690 --> 00:13:30,280 Pero ahora tengo que hacer una cosa más. 313 00:13:30,280 --> 00:13:35,500 Intuitivamente, si he cambiado los tipos de argumentos que está a la espera de intercambio, 314 00:13:35,500 --> 00:13:37,245 lo que más necesito para cambiar en mi código? 315 00:13:37,245 --> 00:13:39,750 316 00:13:39,750 --> 00:13:40,840 >> Cuando llamo a swap. 317 00:13:40,840 --> 00:13:43,340 Porque en este momento, lo que am Me pasa que cambiar todavía? 318 00:13:43,340 --> 00:13:47,450 El valor de x y el valor de y, o la leche y el zumo de naranja. 319 00:13:47,450 --> 00:13:48,510 Pero yo no quiero hacer eso. 320 00:13:48,510 --> 00:13:51,060 Yo en cambio quiero transmitir en qué? 321 00:13:51,060 --> 00:13:53,050 La ubicación de x y la ubicación de y. 322 00:13:53,050 --> 00:13:55,300 ¿Cuáles son sus direcciones postales, por así decirlo. 323 00:13:55,300 --> 00:13:57,600 >> Así que para hacer eso, hay un símbolo de unión. 324 00:13:57,600 --> 00:13:59,260 Ampersand tipo de sonidos como la dirección. 325 00:13:59,260 --> 00:14:03,240 por lo que n, signo, la dirección de x, y la dirección de y. 326 00:14:03,240 --> 00:14:06,790 Así que es deliberado que utilizamos los símbolos de unión al llamar a la función, 327 00:14:06,790 --> 00:14:10,230 y las estrellas cuando se declara y cuando la aplicación de la función. 328 00:14:10,230 --> 00:14:14,220 >> Y piensa en signo como la dirección del operador, y la estrella que el 329 00:14:14,220 --> 00:14:15,490 ir allí operador - 330 00:14:15,490 --> 00:14:18,640 o, más correctamente, la operador de eliminación de referencias. 331 00:14:18,640 --> 00:14:23,480 Así que eso es un montón de palabras sólo para dicen que ahora, con suerte, de intercambio va 332 00:14:23,480 --> 00:14:24,440 que es correcta. 333 00:14:24,440 --> 00:14:26,550 >> Déjenme seguir adelante y hacer - 334 00:14:26,550 --> 00:14:30,940 vamos a cambiar el nombre del archivo en realidad, no sea este programa todavía se invoca ninguna de intercambio. 335 00:14:30,940 --> 00:14:33,240 Afirmo que lo vamos a llamar swap.c ahora. 336 00:14:33,240 --> 00:14:35,670 Así que, de intercambio. 337 00:14:35,670 --> 00:14:37,520 Dot, barra, de intercambio. 338 00:14:37,520 --> 00:14:40,210 >> Y ahora de hecho, x es 1, y es 2. 339 00:14:40,210 --> 00:14:44,040 Y entonces, x es 2, Y es uno. 340 00:14:44,040 --> 00:14:46,500 Bueno vamos a ver si no podemos hacer esto una poco diferente en cuanto a lo que es 341 00:14:46,500 --> 00:14:47,180 pasando aquí. 342 00:14:47,180 --> 00:14:51,250 En primer lugar, permítanme acercar un nuestro pantalla de dibujo aquí. 343 00:14:51,250 --> 00:14:54,160 Y permítanme proponer un momento - y cada vez que dibujo aquí se reflejará 344 00:14:54,160 --> 00:14:58,660 hasta ahora - permítanme proponer que aquí hay un montón de memoria o 345 00:14:58,660 --> 00:15:00,540 RAM, dentro de mi ordenador. 346 00:15:00,540 --> 00:15:04,140 >> Y este será el número mordedura, digamos, 1. 347 00:15:04,140 --> 00:15:05,720 Este será bytes número 2. 348 00:15:05,720 --> 00:15:08,220 Y voy a hacer un montón más, y luego un montón de puntos de puntos de puntos de 349 00:15:08,220 --> 00:15:10,880 indican que hay 2000 millones de estas cosas. 350 00:15:10,880 --> 00:15:13,520 4, 5, y así sucesivamente. 351 00:15:13,520 --> 00:15:17,055 >> Así están los primeros cinco bytes de la memoria de mi ordenador. 352 00:15:17,055 --> 00:15:17,560 ¿De acuerdo? 353 00:15:17,560 --> 00:15:19,060 Muy pocos de 2 millones de dólares. 354 00:15:19,060 --> 00:15:21,120 Pero ahora voy a proponer el siguiente. 355 00:15:21,120 --> 00:15:27,490 Voy a proponer que x va a almacenar el número 1, e y va 356 00:15:27,490 --> 00:15:29,690 para almacenar el número 2. 357 00:15:29,690 --> 00:15:35,000 Y déjame ir adelante ahora y representa estos valores como sigue. 358 00:15:35,000 --> 00:15:41,510 >> Vamos a hacer esto de la siguiente manera. 359 00:15:41,510 --> 00:15:42,870 Dame sólo un segundo. 360 00:15:42,870 --> 00:15:44,150 Un segundo. 361 00:15:44,150 --> 00:15:45,680 Aceptar. 362 00:15:45,680 --> 00:15:47,560 Quiero hacer esto un poco más - 363 00:15:47,560 --> 00:15:50,440 vamos a hacer esto de nuevo. 364 00:15:50,440 --> 00:15:53,250 De lo contrario voy a utilizar y el mismos números, sin querer, 365 00:15:53,250 --> 00:15:54,230 múltiples veces. 366 00:15:54,230 --> 00:15:57,320 >> Así que lo que tenemos diferentes números de qué hablar, vamos a llamar a este byte 367 00:15:57,320 --> 00:16:03,391 número 123, 124, 125, 126, y puntos suspensivos. 368 00:16:03,391 --> 00:16:08,400 Y permítanme pretendo ahora que voy a poner el valor 1 aquí, y el valor 2 369 00:16:08,400 --> 00:16:11,990 aquí, también conocido como x e y. 370 00:16:11,990 --> 00:16:15,300 Así que da la casualidad de que este es x, esta es y. 371 00:16:15,300 --> 00:16:18,180 >> Y sólo por algún azar, la ordenador, el sistema operativo, 372 00:16:18,180 --> 00:16:21,890 sucedido a poner en la posición x número 123. 373 00:16:21,890 --> 00:16:25,590 Y y terminó en la posición 124 - 374 00:16:25,590 --> 00:16:26,330 maldita sea. 375 00:16:26,330 --> 00:16:28,700 Debería haber arreglado este. 376 00:16:28,700 --> 00:16:34,040 ¡Oh hombre, es lo que realmente quiero hacer esto? 377 00:16:34,040 --> 00:16:37,340 Sí, quiero solucionar este problema y b adecuada acerca de esto hoy. 378 00:16:37,340 --> 00:16:39,950 Lo sentimos, nuevo en esto. 379 00:16:39,950 --> 00:16:45,020 >> 127, 131, y yo no quiero ser esto complejo, pero ¿por qué se cambia el 380 00:16:45,020 --> 00:16:46,340 números ahí? 381 00:16:46,340 --> 00:16:48,360 Porque quiero que los enteros a ser en realidad cuatro bytes. 382 00:16:48,360 --> 00:16:49,810 Así que vamos a ser muy anal sobre esto. 383 00:16:49,810 --> 00:16:53,800 Así que si 1 pasa a ser abordados 123, el 2 va a ser en la dirección 384 00:16:53,800 --> 00:16:55,730 127, ya que son sólo 4 byes de distancia. 385 00:16:55,730 --> 00:16:56,210 Eso es todo. 386 00:16:56,210 --> 00:16:58,640 Y nos olvidamos de toda la otras direcciones del mundo. 387 00:16:58,640 --> 00:17:03,320 >> Así que x está en la ubicación 123, Y es en la ubicación 127. 388 00:17:03,320 --> 00:17:05,770 Y ahora, ¿qué hago en realidad quiere hacer? 389 00:17:05,770 --> 00:17:10,099 Cuando llamo intercambio ahora, ¿cuál es realmente está pasando? 390 00:17:10,099 --> 00:17:14,920 Bueno, cuando yo llamo swap, que estoy pasando en la dirección de x y la dirección de y. 391 00:17:14,920 --> 00:17:18,540 Así, por ejemplo, si estas dos piezas de papel ahora representan los dos 392 00:17:18,540 --> 00:17:23,510 argumentos a y b para cambiar, ¿qué soy yo va a escribir en la primera de ellas, 393 00:17:23,510 --> 00:17:27,720 que voy a llamar a referirse como un? 394 00:17:27,720 --> 00:17:30,610 >> Exactamente, 123. 395 00:17:30,610 --> 00:17:31,905 Así que esta afirmación que es una. 396 00:17:31,905 --> 00:17:32,955 Este es el parámetro a. 397 00:17:32,955 --> 00:17:35,856 Estoy poniendo la dirección de x en ese país. 398 00:17:35,856 --> 00:17:38,152 >> ¿Qué es eso? 399 00:17:38,152 --> 00:17:40,890 >> ¿Qué es eso? 400 00:17:40,890 --> 00:17:41,190 >> No, no. 401 00:17:41,190 --> 00:17:41,720 Eso está bien. 402 00:17:41,720 --> 00:17:42,570 Sigue siendo bueno, sigue siendo buena. 403 00:17:42,570 --> 00:17:43,530 Así que esta es una. 404 00:17:43,530 --> 00:17:46,240 Y ahora en la segunda hoja de papel, esto va a ser b, y lo que estoy 405 00:17:46,240 --> 00:17:49,010 va a ser escrito en este pedazo de papel? 406 00:17:49,010 --> 00:17:50,080 127. 407 00:17:50,080 --> 00:17:53,720 >> Así que lo único que ha cambiado desde nuestro relato anterior de esta historia es, 408 00:17:53,720 --> 00:17:58,590 en lugar de, literalmente, 1 y 2, que soy va a pasar en el año 123 y 127. 409 00:17:58,590 --> 00:18:02,130 Y ahora voy a poner estos en el interior de esta caja de texto, ¿de acuerdo? 410 00:18:02,130 --> 00:18:04,640 Así que esa caja negro representa ahora la función de intercambio. 411 00:18:04,640 --> 00:18:07,230 >> Mientras tanto, vamos ahora tienen a alguien implementar la función de intercambio. 412 00:18:07,230 --> 00:18:09,090 ¿Podría alguien por aquí gustaría ser voluntario? 413 00:18:09,090 --> 00:18:09,560 Vamos arriba. 414 00:18:09,560 --> 00:18:11,080 ¿Cómo te llamas? 415 00:18:11,080 --> 00:18:11,460 Charlie. 416 00:18:11,460 --> 00:18:12,080 Muy bien, Charlie. 417 00:18:12,080 --> 00:18:14,810 Vamos arriba. 418 00:18:14,810 --> 00:18:17,310 >> Así que Charlie va a jugar el papel de nuestro cuadro negro. 419 00:18:17,310 --> 00:18:21,460 Y Charlie, lo que me gustaría que hicieras ahora está implementar de intercambio de tal manera 420 00:18:21,460 --> 00:18:25,320 que, habida cuenta de esas dos direcciones, estuviera realmente va 421 00:18:25,320 --> 00:18:26,330 para cambiar los valores. 422 00:18:26,330 --> 00:18:28,290 Y te susurre al oído cómo manejar el televisor aquí. 423 00:18:28,290 --> 00:18:29,930 >> Así que adelante, y usted es el cuadro negro. 424 00:18:29,930 --> 00:18:30,920 Llegar allí. 425 00:18:30,920 --> 00:18:34,054 ¿Qué valores ve usted para una, y qué valores ve usted para b? 426 00:18:34,054 --> 00:18:36,740 >> CHARLIE: una es 123 y b es 127. 427 00:18:36,740 --> 00:18:37,530 >> DAVID MALAN: OK, exactamente. 428 00:18:37,530 --> 00:18:38,940 Ahora hay una pausa por un momento. 429 00:18:38,940 --> 00:18:41,680 Lo primero que vamos a hacer ahora, de acuerdo con el código - que 430 00:18:41,680 --> 00:18:43,220 Ahora voy a tirar en la pantalla - 431 00:18:43,220 --> 00:18:46,750 va a ser la de asignar un poco poco de memoria llamada temp. 432 00:18:46,750 --> 00:18:48,850 Así que voy a seguir adelante y darle esa memoria. 433 00:18:48,850 --> 00:18:52,210 >> Así que esto va a ser una tercera variable que tiene al alcance de 434 00:18:52,210 --> 00:18:54,080 llamaste temp. 435 00:18:54,080 --> 00:18:57,120 Y ¿qué vas a escribir en la pieza de temp de papel? 436 00:18:57,120 --> 00:19:02,524 437 00:19:02,524 --> 00:19:03,470 >> CHARLIE: Punteros, ¿verdad? 438 00:19:03,470 --> 00:19:04,790 >> DAVID MALAN: OK, bueno, no necesariamente punteros. 439 00:19:04,790 --> 00:19:07,230 De modo que la línea de código que tengo puesto de relieve en el lado derecho, 440 00:19:07,230 --> 00:19:07,900 vamos a empezar por ahí. 441 00:19:07,900 --> 00:19:08,890 Dice estrella a. 442 00:19:08,890 --> 00:19:11,670 Así que un almacena actualmente el número 123. 443 00:19:11,670 --> 00:19:16,660 Y sólo intuitivamente, lo que significaba estrellas 123? 444 00:19:16,660 --> 00:19:21,630 >> Pero específicamente, si A es 123, estrella de una significa eso? 445 00:19:21,630 --> 00:19:22,560 El valor de a. 446 00:19:22,560 --> 00:19:24,580 O de manera más casual, ir allí. 447 00:19:24,580 --> 00:19:28,620 Así que permítanme proponer que, continuando con la a en la mano, seguir adelante y tratar de que 448 00:19:28,620 --> 00:19:29,430 como si fuera un mapa. 449 00:19:29,430 --> 00:19:32,940 Y caminar a ti mismo a la computadora de memoria, y nos encontrar lo que es 450 00:19:32,940 --> 00:19:36,520 en la ubicación 123. 451 00:19:36,520 --> 00:19:37,720 Exactamente. 452 00:19:37,720 --> 00:19:41,100 >> Así que vemos en la ubicación 123 es lo que, obviamente? 453 00:19:41,100 --> 00:19:44,240 OK, entonces ¿qué valor ahora es usted va a poner en la temperatura? 454 00:19:44,240 --> 00:19:44,750 Exactamente. 455 00:19:44,750 --> 00:19:45,600 Así que adelante y hacer eso. 456 00:19:45,600 --> 00:19:51,280 Y escriba el número 1 en la pieza de papel que está actualmente titula temp. 457 00:19:51,280 --> 00:19:53,540 >> Y ahora el siguiente paso que usted va a poner en práctica 458 00:19:53,540 --> 00:19:54,310 va a ser lo. 459 00:19:54,310 --> 00:19:57,820 Pues bien, en el lado derecho de la siguiente línea de código es la estrella b. b, de 460 00:19:57,820 --> 00:19:59,260 Por supuesto, almacena una dirección. 461 00:19:59,260 --> 00:20:02,270 Que se ocupa de 127. 462 00:20:02,270 --> 00:20:06,620 Estrella b significa qué, casualmente hablando? 463 00:20:06,620 --> 00:20:08,700 >> Ir a esa ubicación. 464 00:20:08,700 --> 00:20:14,988 Así que adelante y nos encontrar lo que es en la ubicación 127. 465 00:20:14,988 --> 00:20:15,480 Aceptar. 466 00:20:15,480 --> 00:20:19,170 Por supuesto, en la ubicación 127, sigue siendo el valor de 2. 467 00:20:19,170 --> 00:20:24,060 Entonces, ¿qué vas ahora almacenar a lo es en el lugar en una? 468 00:20:24,060 --> 00:20:26,860 Así que protagonizan un medio vaya a la ubicación a. 469 00:20:26,860 --> 00:20:29,770 ¿Cuál es la ubicación de una? 470 00:20:29,770 --> 00:20:30,430 >> Exactamente. 471 00:20:30,430 --> 00:20:34,190 Así que ahora, si usted quiere cambiar lo que hay en ese lugar - 472 00:20:34,190 --> 00:20:36,470 Voy a seguir adelante y corro el borrador está aquí. 473 00:20:36,470 --> 00:20:37,760 Y ahora poner de nuevo en el cepillo. 474 00:20:37,760 --> 00:20:42,190 ¿A qué número vas a escribir en ese cuadro en blanco ahora? 475 00:20:42,190 --> 00:20:42,850 >> Exactamente. 476 00:20:42,850 --> 00:20:46,470 Así que esta línea de código, que quede claro - deje me detengo lo que Charlie está haciendo y 477 00:20:46,470 --> 00:20:51,730 señalar aquí, lo que acaba de hacer es escribir en esa caja en la posición 123 478 00:20:51,730 --> 00:20:55,150 el valor que estaba previamente en b. 479 00:20:55,150 --> 00:20:59,140 Y por lo que hemos hecho ahora implementamos esta segunda línea de código. 480 00:20:59,140 --> 00:21:01,920 >> Ahora, por desgracia, no hay sigue una línea restante. 481 00:21:01,920 --> 00:21:04,900 Ahora lo que está en la temperatura, literalmente? 482 00:21:04,900 --> 00:21:06,200 Es obvio que es el número uno. 483 00:21:06,200 --> 00:21:07,020 Eso no es una dirección. 484 00:21:07,020 --> 00:21:09,380 Es sólo un número, tipo de una variable de una semana. 485 00:21:09,380 --> 00:21:13,520 >> Y ahora, cuando usted dice la estrella b, que los medios ir a la dirección B, que es de 486 00:21:13,520 --> 00:21:15,090 curso aquí. 487 00:21:15,090 --> 00:21:16,020 Así que una vez que estás allí - 488 00:21:16,020 --> 00:21:18,320 Voy a seguir adelante y borrar lo que en realidad es allí - y lo que eres 489 00:21:18,320 --> 00:21:20,820 voy a escribir ahora en el lugar 127? 490 00:21:20,820 --> 00:21:22,010 >> CHARLIE: Temp, que es uno. 491 00:21:22,010 --> 00:21:23,430 >> DAVID MALAN: Temp, que es uno. 492 00:21:23,430 --> 00:21:25,670 ¿Y qué pasa con la temperatura en el final? 493 00:21:25,670 --> 00:21:26,600 Bueno, no lo sabemos. 494 00:21:26,600 --> 00:21:27,420 En realidad no importa. 495 00:21:27,420 --> 00:21:31,090 Cada vez que hemos implementado una función hasta el momento, cualquier variable local que tiene 496 00:21:31,090 --> 00:21:31,890 son, en efecto local. 497 00:21:31,890 --> 00:21:33,060 Y simplemente desaparecen. 498 00:21:33,060 --> 00:21:35,040 Están reclamados por el operativo sistema con el tiempo. 499 00:21:35,040 --> 00:21:39,800 >> Así que el hecho de que la temperatura todavía tiene la valor 1 es algo fundamentalmente 500 00:21:39,800 --> 00:21:41,150 poco interesante para nosotros. 501 00:21:41,150 --> 00:21:43,100 Muy bien, así que un aplauso si lo que pudimos por Charlie. 502 00:21:43,100 --> 00:21:46,400 Muy bien hecho. 503 00:21:46,400 --> 00:21:51,520 >> Muy bien, así que ¿qué más hace Significa esto que podemos hacer? 504 00:21:51,520 --> 00:21:54,400 Así que resulta que hemos sido diciendo algunas mentiras blancas 505 00:21:54,400 --> 00:21:55,540 desde hace bastante tiempo. 506 00:21:55,540 --> 00:21:59,990 De hecho, resulta que una cadena, todo este tiempo, no es realmente una 507 00:21:59,990 --> 00:22:02,190 secuencia de caracteres por se. 508 00:22:02,190 --> 00:22:03,980 En cierto modo es que intuitivamente. 509 00:22:03,980 --> 00:22:08,270 >> Pero técnicamente hablando, cadena es una tipo de datos que declaramos en el interior de 510 00:22:08,270 --> 00:22:12,170 la biblioteca CS50 para simplificar el mundo durante las primeras semanas de clase. 511 00:22:12,170 --> 00:22:20,130 Lo que realmente es una cadena es la dirección de un carácter en algún lugar de la memoria RAM. 512 00:22:20,130 --> 00:22:25,530 Una cadena es realmente un número, como 123 o 127, que pasa a delimitar 513 00:22:25,530 --> 00:22:28,420 donde una cadena comienza en la memoria del equipo. 514 00:22:28,420 --> 00:22:31,870 >> Pero no representa la cadena, de por sí, sí. 515 00:22:31,870 --> 00:22:33,460 Y podemos ver esto como sigue. 516 00:22:33,460 --> 00:22:35,980 Déjame ir por delante, ya abrir algo de código que está entre 517 00:22:35,980 --> 00:22:38,340 ejemplos de código fuente de la actualidad. 518 00:22:38,340 --> 00:22:42,225 Y yo voy a seguir adelante y abrir hasta, digamos, compare-0.C. 519 00:22:42,225 --> 00:22:44,830 520 00:22:44,830 --> 00:22:48,790 Este es un programa con errores que se va para ser implementado de la siguiente manera. 521 00:22:48,790 --> 00:22:49,040 >> En primer lugar. 522 00:22:49,040 --> 00:22:50,420 Voy a decir algo. 523 00:22:50,420 --> 00:22:52,660 Entonces voy a seguir adelante y obtener una cadena del usuario 524 00:22:52,660 --> 00:22:53,750 en esa línea siguiente. 525 00:22:53,750 --> 00:22:55,370 Entonces voy a decirlo de nuevo. 526 00:22:55,370 --> 00:22:57,540 Entonces me voy a conseguir otro cadena del usuario. 527 00:22:57,540 --> 00:23:00,390 >> Y fíjense, estoy mostrando una de las cadenas en una variable llamada s, y 528 00:23:00,390 --> 00:23:03,040 otra de estas cadenas en una variable llamada t. 529 00:23:03,040 --> 00:23:07,480 Y ahora voy a reclamar, muy razonablemente, que si s es igual a es igual a T, 530 00:23:07,480 --> 00:23:08,940 las cadenas son iguales. 531 00:23:08,940 --> 00:23:09,970 Usted escribe lo mismo. 532 00:23:09,970 --> 00:23:11,830 Si no, las cadenas son No es lo mismo. 533 00:23:11,830 --> 00:23:15,440 >> Después de todo, si nosotros, de entrada dos enteros, dos caracteres, dos carrozas, dos dobles, cualquiera de 534 00:23:15,440 --> 00:23:18,400 los tipos de datos de las que hemos hablado hasta el momento de compararlos - 535 00:23:18,400 --> 00:23:22,070 Recordamos que hicimos muy claro hace un tiempo que usted no hace esto, porque un 536 00:23:22,070 --> 00:23:25,840 único signo de igualdad es, por supuesto, el operador de asignación. 537 00:23:25,840 --> 00:23:26,820 Así que eso sería un error. 538 00:23:26,820 --> 00:23:29,260 >> Usamos el signo igual igual, que de hecho se compara 539 00:23:29,260 --> 00:23:31,050 cosas para la verdadera igualdad. 540 00:23:31,050 --> 00:23:32,275 Pero afirmo esto está libre de errores. 541 00:23:32,275 --> 00:23:37,400 Si sigo adelante y hacer comparación de cero, y luego hacer slash dot comparar cero. 542 00:23:37,400 --> 00:23:39,700 Y escribo en, digamos, hola. 543 00:23:39,700 --> 00:23:41,590 Y luego vamos a decir hola de nuevo. 544 00:23:41,590 --> 00:23:46,040 Literalmente lo mismo, el ordenador reclamaciones pasé a máquina diferentes cosas. 545 00:23:46,040 --> 00:23:47,640 >> Ahora tal vez yo escrito mal algo. 546 00:23:47,640 --> 00:23:49,910 Yo escribo mi nombre en esta ocasión. 547 00:23:49,910 --> 00:23:52,580 Quiero decir, hola. 548 00:23:52,580 --> 00:23:54,770 Hola. 549 00:23:54,770 --> 00:23:57,360 Es diferente cada vez. 550 00:23:57,360 --> 00:23:58,430 >> Bueno, ¿por qué es eso? 551 00:23:58,430 --> 00:24:00,140 ¿Qué está pasando en realidad debajo de la capucha? 552 00:24:00,140 --> 00:24:03,270 Bueno, ¿qué está pasando en realidad por debajo la campana es la cadena a continuación 553 00:24:03,270 --> 00:24:07,410 He escrito en esa primera vez, por ejemplo, es la palabra hola, por supuesto. 554 00:24:07,410 --> 00:24:11,660 Pero si representamos esta debajo el capó, recordemos que una 555 00:24:11,660 --> 00:24:13,470 cadena está en una matriz. 556 00:24:13,470 --> 00:24:15,040 Y hemos dicho tanto en el pasado. 557 00:24:15,040 --> 00:24:20,200 >> Así que si me baso esa matriz como esta, estoy va a representar algo muy 558 00:24:20,200 --> 00:24:23,030 similar a lo que hicimos hace un momento. 559 00:24:23,030 --> 00:24:25,390 Y de hecho hay algo aquí especial, también. 560 00:24:25,390 --> 00:24:28,090 ¿Qué fue lo que determinamos fue en Al final de cada cadena? 561 00:24:28,090 --> 00:24:30,760 Sí, esta barra invertida cero, que es sólo la forma de representar, 562 00:24:30,760 --> 00:24:33,610 literalmente, 00 millones. 563 00:24:33,610 --> 00:24:35,680 Ocho 0 bits en una fila. 564 00:24:35,680 --> 00:24:37,610 >> No sé, francamente, lo que es después de esto. 565 00:24:37,610 --> 00:24:40,090 Eso es sólo un montón más memoria RAM dentro de mi ordenador. 566 00:24:40,090 --> 00:24:40,970 Pero esto es una matriz. 567 00:24:40,970 --> 00:24:42,260 Hablamos acerca de las matrices antes. 568 00:24:42,260 --> 00:24:45,010 Y por lo general hablamos de arrays como posición cero, 569 00:24:45,010 --> 00:24:46,580 entonces uno, luego dos. 570 00:24:46,580 --> 00:24:47,950 Pero eso es sólo por conveniencia. 571 00:24:47,950 --> 00:24:49,380 Y eso es totalmente relativa. 572 00:24:49,380 --> 00:24:53,010 >> Cuando usted está consiguiendo realmente la memoria de la computadora, que es, por supuesto, cualquier 573 00:24:53,010 --> 00:24:55,450 2000000000 algunos bytes impares, potencialmente. 574 00:24:55,450 --> 00:24:59,100 Así que en realidad debajo de la capucha, todo este tiempo, sí. 575 00:24:59,100 --> 00:25:01,670 Esto podría muy bien ser soporte de cero. 576 00:25:01,670 --> 00:25:04,780 Pero si usted cava más profundo debajo el capó, que es realmente 577 00:25:04,780 --> 00:25:07,000 abordar número 123. 578 00:25:07,000 --> 00:25:09,150 Esta es la dirección 124. 579 00:25:09,150 --> 00:25:11,040 Esta es la dirección 125. 580 00:25:11,040 --> 00:25:12,540 >> Y no me equivoco este momento. 581 00:25:12,540 --> 00:25:15,840 Estos son ahora uno bytes además por qué razón? 582 00:25:15,840 --> 00:25:17,930 ¿Qué tan grande es un char? 583 00:25:17,930 --> 00:25:19,170 Un char es sólo un byte. 584 00:25:19,170 --> 00:25:20,570 Un int es típicamente cuatro bytes. 585 00:25:20,570 --> 00:25:24,850 Así que por eso lo hice 123, 127, 131 y así sucesivamente. 586 00:25:24,850 --> 00:25:27,560 Ahora puedo mantener la matemática más simple y simplemente lo hacen más 1. 587 00:25:27,560 --> 00:25:30,510 Y esto es ahora lo que realmente está pasando de debajo del capó. 588 00:25:30,510 --> 00:25:37,760 >> Así que cuando se declara algo como esto, cadena s, esto es en realidad - 589 00:25:37,760 --> 00:25:39,170 resulta - 590 00:25:39,170 --> 00:25:41,190 estrellas caracteres. 591 00:25:41,190 --> 00:25:44,640 Estrellas, por supuesto, significa dirección, puntero aka. 592 00:25:44,640 --> 00:25:46,200 Así que es la dirección de algo. 593 00:25:46,200 --> 00:25:47,510 ¿Qué es la dirección de? 594 00:25:47,510 --> 00:25:47,760 >> Bueno - 595 00:25:47,760 --> 00:25:51,680 Soy el único que puede ver el punto importante que estoy haciendo, o pensar 596 00:25:51,680 --> 00:25:52,560 Estoy haciendo. 597 00:25:52,560 --> 00:25:55,270 Así cadena - 598 00:25:55,270 --> 00:25:57,180 lo triste es que tengo un monitor justo ahí donde me 599 00:25:57,180 --> 00:25:58,100 podría haber visto eso. 600 00:25:58,100 --> 00:26:00,990 >> Muy bien, así que la cadena s es lo que Declaré anteriormente. 601 00:26:00,990 --> 00:26:04,600 Pero resulta que, gracias a un poco de magia en la biblioteca CS50, todo esto 602 00:26:04,600 --> 00:26:08,780 cadena de tiempo, literalmente, tiene sido estrellas caracteres. 603 00:26:08,780 --> 00:26:11,310 La estrella significa de nuevo puntero o dirección. 604 00:26:11,310 --> 00:26:14,180 El hecho de que esté flanqueando el palabra caracteres significa que es la 605 00:26:14,180 --> 00:26:15,970 dirección de un personaje. 606 00:26:15,970 --> 00:26:23,100 >> Así que si la cadena get se llama, y ​​escriba en H-E-L-L-O, propone ahora lo ha llegar 607 00:26:23,100 --> 00:26:27,330 literalmente cadena estado volviendo todos esta vez, a pesar de que he lugar 608 00:26:27,330 --> 00:26:29,980 simplificada del mundo? 609 00:26:29,980 --> 00:26:33,310 ¿Qué quiere conseguir realmente cadena volver como su valor de retorno? 610 00:26:33,310 --> 00:26:35,830 611 00:26:35,830 --> 00:26:38,720 >> 123, en este caso, por ejemplo. 612 00:26:38,720 --> 00:26:42,630 Hemos dicho anteriormente que la cadena get simplemente devuelve una cadena, una secuencia de 613 00:26:42,630 --> 00:26:43,300 personajes. 614 00:26:43,300 --> 00:26:44,790 Pero eso es un poco de una mentira piadosa. 615 00:26:44,790 --> 00:26:48,010 La forma de cadena get realmente funciona debajo de la capucha es crear una 616 00:26:48,010 --> 00:26:48,930 cadena del usuario. 617 00:26:48,930 --> 00:26:51,530 Se deja caer los personajes que él o ella los tipos de memoria. 618 00:26:51,530 --> 00:26:54,680 Pone una barra invertida a cero al final de las secuencia de caracteres. 619 00:26:54,680 --> 00:26:57,310 >> Pero entonces, ¿qué pone cadena literalmente, volver? 620 00:26:57,310 --> 00:27:02,710 Es, literalmente, devuelve la dirección de la muy primeros bytes en la RAM que 621 00:27:02,710 --> 00:27:04,130 se utiliza para que la fuerza. 622 00:27:04,130 --> 00:27:07,500 Y resulta que sólo mediante la devolución de una única dirección de la 623 00:27:07,500 --> 00:27:12,120 primer carácter de la cadena, que es suficiente para la búsqueda de la totalidad de los 624 00:27:12,120 --> 00:27:12,630 la cadena. 625 00:27:12,630 --> 00:27:16,930 >> En otras palabras, obtener cadena no tiene para volver 123 y 124 y 125. 626 00:27:16,930 --> 00:27:19,950 No tiene que darme un largo lista de todos los bytes que 627 00:27:19,950 --> 00:27:20,740 mi cadena está utilizando. 628 00:27:20,740 --> 00:27:22,670 Porque uno, todos están espalda con espalda. 629 00:27:22,670 --> 00:27:28,160 Y dos, basado en la primera dirección, me puede averiguar dónde termina la cadena. 630 00:27:28,160 --> 00:27:29,910 ¿Cómo? 631 00:27:29,910 --> 00:27:33,490 >> El carácter especial nulo, el barra invertida cero al final. 632 00:27:33,490 --> 00:27:35,430 Así, en otras palabras, si se pasa alrededor de - 633 00:27:35,430 --> 00:27:36,530 dentro de las variables - 634 00:27:36,530 --> 00:27:41,300 la dirección de un char, y usted asume que al final de cualquier cadena, cualquier 635 00:27:41,300 --> 00:27:45,040 secuencia de caracteres como los humanos pensar en las cadenas, si se asume que 636 00:27:45,040 --> 00:27:48,600 al final de dicha cadena hay una barra invertida cero, eres de oro. 637 00:27:48,600 --> 00:27:52,430 Porque siempre se puede encontrar el final de una cadena. 638 00:27:52,430 --> 00:27:54,870 >> Ahora lo que realmente está pasando luego en este programa? 639 00:27:54,870 --> 00:27:59,990 ¿Por qué es este programa, comparar-0.C, con errores? 640 00:27:59,990 --> 00:28:01,690 Lo que en realidad se está comparando? 641 00:28:01,690 --> 00:28:02,420 ¿Sí? 642 00:28:02,420 --> 00:28:05,000 >> ESTUDIANTE: [inaudible]. 643 00:28:05,000 --> 00:28:05,730 >> DAVID MALAN: Exactamente. 644 00:28:05,730 --> 00:28:08,350 Es la comparación de los lugares de las cadenas. 645 00:28:08,350 --> 00:28:12,420 Así que si el usuario ha escrito en hola una vez, como yo lo hice, la memoria podría terminar 646 00:28:12,420 --> 00:28:13,430 con este aspecto. 647 00:28:13,430 --> 00:28:18,210 Si el usuario entonces los tipos de hola de nuevo, pero llamando cadena get nuevo, c es 648 00:28:18,210 --> 00:28:21,800 no particularmente inteligente a menos que usted enseña que sea inteligente escribiendo código. 649 00:28:21,800 --> 00:28:22,430 >> C - 650 00:28:22,430 --> 00:28:23,860 y ordenadores, más en general - 651 00:28:23,860 --> 00:28:27,370 si escribe en la palabra hola de nuevo, ya sabes lo que vas a obtener. 652 00:28:27,370 --> 00:28:31,480 No eres más que va a obtener una segunda matriz de memoria que, sí, sucede ser 653 00:28:31,480 --> 00:28:35,510 almacenar H-E-L-L-O y así sucesivamente. 654 00:28:35,510 --> 00:28:38,240 >> Va a tener el mismo aspecto que nosotros los seres humanos, pero esta dirección 655 00:28:38,240 --> 00:28:39,460 podría no ser 123. 656 00:28:39,460 --> 00:28:42,470 Sólo podría ocurrir que la sistema operativo cuenta con algunos de 657 00:28:42,470 --> 00:28:45,430 espacio, por ejemplo, en la ubicación - 658 00:28:45,430 --> 00:28:49,820 digamos algo arbitraria, como esto es la ubicación 200. 659 00:28:49,820 --> 00:28:51,620 Y esta es la ubicación 201. 660 00:28:51,620 --> 00:28:53,060 Y esta es la ubicación 202. 661 00:28:53,060 --> 00:28:55,730 No tenemos ni idea de dónde es va a estar en la memoria. 662 00:28:55,730 --> 00:28:59,110 >> Pero lo que esto significa es que lo que es va a ser almacenado en última instancia, en s? 663 00:28:59,110 --> 00:29:00,750 El número 123. 664 00:29:00,750 --> 00:29:04,860 ¿Qué va a ser almacenado en t, en este ejemplo arbitraria? 665 00:29:04,860 --> 00:29:06,300 El número 200. 666 00:29:06,300 --> 00:29:11,410 Y todo lo que significa es, entonces, obviamente, 123 no es igual a 200. 667 00:29:11,410 --> 00:29:14,940 Y así, esta condición nunca si evalúa en true. 668 00:29:14,940 --> 00:29:18,430 Debido cadena get utiliza diferentes trozos de memoria cada vez. 669 00:29:18,430 --> 00:29:20,360 >> Ahora podemos ver esto otra vez en otro ejemplo. 670 00:29:20,360 --> 00:29:23,764 Déjame ir adelante y abro copy-0.C. 671 00:29:23,764 --> 00:29:28,770 Sostengo que este ejemplo se va a probar - pero fallan - para copiar dos cadenas 672 00:29:28,770 --> 00:29:29,910 de la siguiente manera. 673 00:29:29,910 --> 00:29:31,730 >> Voy a decir algo para el usuario. 674 00:29:31,730 --> 00:29:34,490 Entonces voy a conseguir un cadena y llamarlo s. 675 00:29:34,490 --> 00:29:36,400 Y ahora, estoy haciendo este cheque aquí. 676 00:29:36,400 --> 00:29:37,990 Contamos esto hace un tiempo. 677 00:29:37,990 --> 00:29:42,490 Pero cuando puede ser que consiga cadena de retorno nulo, otro carácter especial, o especial 678 00:29:42,490 --> 00:29:45,050 símbolo digamos. 679 00:29:45,050 --> 00:29:45,900 Si está fuera de la memoria. 680 00:29:45,900 --> 00:29:48,970 >> Por ejemplo, si el usuario es realmente siendo difícil y los tipos de una atroz 681 00:29:48,970 --> 00:29:51,220 número de caracteres en el teclado y accesos Intro. 682 00:29:51,220 --> 00:29:54,580 Si ese número de caracteres no puede caber en la RAM para lo loco 683 00:29:54,580 --> 00:29:57,820 razón, también conseguir poderío cadena muy bien devolver null. 684 00:29:57,820 --> 00:30:01,080 >> O si su programa en sí está haciendo mucho de otras cosas y no sólo 685 00:30:01,080 --> 00:30:03,790 No hay suficiente memoria para la cadena get Para tener éxito, podría terminar 686 00:30:03,790 --> 00:30:05,240 volviendo nulo. 687 00:30:05,240 --> 00:30:07,160 Pero seamos más precisos en cuanto a lo que es esto. 688 00:30:07,160 --> 00:30:10,280 ¿Qué es el tipo de datos de s realmente? 689 00:30:10,280 --> 00:30:11,610 Estrella de Char. 690 00:30:11,610 --> 00:30:14,560 >> Así que resulta que ahora podemos pelar copias de la capa de null. 691 00:30:14,560 --> 00:30:17,500 Resulta, nula es - sí, obviamente, un símbolo especial. 692 00:30:17,500 --> 00:30:19,190 Pero, ¿qué es realmente? 693 00:30:19,190 --> 00:30:25,220 Realmente, nula es sólo un símbolo que los seres humanos utilizan para representar cero también. 694 00:30:25,220 --> 00:30:29,010 >> Así que los autores de C, y las computadoras más en general, decidió hace años 695 00:30:29,010 --> 00:30:30,010 que, ya sabes qué. 696 00:30:30,010 --> 00:30:34,850 ¿Por qué no nos aseguramos de que ningún usuario datos es nunca, nunca, nunca 697 00:30:34,850 --> 00:30:36,730 almacenado a bye cero? 698 00:30:36,730 --> 00:30:39,610 De hecho, incluso en mi ejemplo arbitrario antes, no empecé la numeración 699 00:30:39,610 --> 00:30:40,390 bytes en cero. 700 00:30:40,390 --> 00:30:41,540 Empecé en una. 701 00:30:41,540 --> 00:30:44,950 Porque sabía que la gente en el mundo han decidido reservar el cero 702 00:30:44,950 --> 00:30:47,970 byte en la memoria RAM de nadie como algo especial. 703 00:30:47,970 --> 00:30:52,020 >> La razón es que en cualquier momento que quieran señal de que algo ha ido mal 704 00:30:52,020 --> 00:30:55,960 respecto de las direcciones, que regresó nula - también conocida como cero - 705 00:30:55,960 --> 00:30:59,410 y porque usted sabe que no hay es datos de fiar en la dirección cero, claramente 706 00:30:59,410 --> 00:31:00,400 eso significa un error. 707 00:31:00,400 --> 00:31:04,080 Y es por eso que, por convención, comprobamos algo nulo y regreso 708 00:31:04,080 --> 00:31:06,260 como uno de esos casos. 709 00:31:06,260 --> 00:31:09,300 >> Así que si nos desplazamos hacia abajo ahora, esto es sólo a continuación, algunos de comprobación de errores, por si acaso 710 00:31:09,300 --> 00:31:10,610 algo salió mal con [? rescatar?] 711 00:31:10,610 --> 00:31:13,470 en conjunto y salir del programa devolviendo temprana. 712 00:31:13,470 --> 00:31:19,030 Esta línea ahora podría reescribirse ya que esto, lo que significa qué? 713 00:31:19,030 --> 00:31:23,155 Por el lado de la mano izquierda, dame otro puntero a un carácter, y lo llaman t. 714 00:31:23,155 --> 00:31:26,935 ¿Qué estoy almacenando dentro de t, en base en esta línea de código? 715 00:31:26,935 --> 00:31:30,950 716 00:31:30,950 --> 00:31:32,170 >> Estoy almacenando una ubicación. 717 00:31:32,170 --> 00:31:34,742 Específicamente la ubicación eso fue en s. 718 00:31:34,742 --> 00:31:39,000 Así que si el usuario ha escrito en hola, y ese primer hola sucede a terminar 719 00:31:39,000 --> 00:31:42,567 aquí, a continuación, el número 123 es va a volver desde get 720 00:31:42,567 --> 00:31:43,810 cadena y ser almacenado - 721 00:31:43,810 --> 00:31:44,780 como hemos dicho antes - 722 00:31:44,780 --> 00:31:45,440 en s. 723 00:31:45,440 --> 00:31:50,560 >> Cuando ahora me declaro otro puntero a un char y llamarlo t, ¿qué número es 724 00:31:50,560 --> 00:31:53,940 literalmente, va a terminar en t de acuerdo a la historia? 725 00:31:53,940 --> 00:31:55,420 Así 123. 726 00:31:55,420 --> 00:32:00,310 >> Así que técnicamente ahora ambos s y t están apuntando a la exacta 727 00:32:00,310 --> 00:32:02,410 mismos trozos de memoria. 728 00:32:02,410 --> 00:32:06,140 Así cuenta de lo que voy a hacer ahora para demostrar que este programa está libre de errores. 729 00:32:06,140 --> 00:32:08,820 >> Primero voy a reclamar, con una f impresión, capitalizando 730 00:32:08,820 --> 00:32:10,080 la copia de la cadena. 731 00:32:10,080 --> 00:32:11,660 Entonces me voy a hacer un poco de la comprobación de errores. 732 00:32:11,660 --> 00:32:12,160 Voy a estar seguro. 733 00:32:12,160 --> 00:32:16,710 Vamos a asegurarnos de que la cadena de t está en menos mayor que cero en longitud, 734 00:32:16,710 --> 00:32:19,190 así que hay un poco de carácter no para capitalizar en realidad. 735 00:32:19,190 --> 00:32:22,840 >> Y entonces usted puede ser que recuerde este de los ejemplos anteriores. 736 00:32:22,840 --> 00:32:25,630 2 superior - que se encuentra en el archivo ctype.h. 737 00:32:25,630 --> 00:32:30,800 T abrazadera cero me da el cero carácter de la cadena de t. 738 00:32:30,800 --> 00:32:34,360 Y 2 superior de ese mismo valor, de Por supuesto, la convierte a mayúsculas. 739 00:32:34,360 --> 00:32:38,230 >> Así que de manera intuitiva, esto pone de relieve la línea del código está en mayúscula la primera 740 00:32:38,230 --> 00:32:40,250 carta en la t. 741 00:32:40,250 --> 00:32:44,485 Pero no es la capitalización, de manera intuitiva, la primera letra s. 742 00:32:44,485 --> 00:32:48,130 Pero si usted está pensando en el futuro, ¿qué soy yo a punto de ver cuando ejecuto este programa 743 00:32:48,130 --> 00:32:54,220 e imprimir tanto el original, s, y la copia de la llamada, t? 744 00:32:54,220 --> 00:32:55,350 >> Están en realidad va a ser el mismo. 745 00:32:55,350 --> 00:32:56,600 ¿Y por qué van a ser los mismos? 746 00:32:56,600 --> 00:32:58,970 747 00:32:58,970 --> 00:33:01,020 Los dos están señalando exactamente lo mismo. 748 00:33:01,020 --> 00:33:01,610 Así que vamos a hacer esto. 749 00:33:01,610 --> 00:33:03,160 >> Hacer copia cero. 750 00:33:03,160 --> 00:33:04,070 Compila Aceptar. 751 00:33:04,070 --> 00:33:06,500 Déjame correr copia cero. 752 00:33:06,500 --> 00:33:10,110 Permítanme escribo algo como hola en todo en minúscula y luego pulse Enter. 753 00:33:10,110 --> 00:33:16,520 Y sostiene que tanto los s originales y la copia son de hecho idénticos. 754 00:33:16,520 --> 00:33:17,920 >> Así que lo que realmente ha pasado aquí? 755 00:33:17,920 --> 00:33:20,100 Permítanme volver a dibujar la imagen sólo para contar la historia de una 756 00:33:20,100 --> 00:33:21,340 ligeramente diferente manera. 757 00:33:21,340 --> 00:33:26,060 ¿Qué está pasando en realidad por debajo de la campana cuando yo declaro algo así como 758 00:33:26,060 --> 00:33:30,410 carácter de inicio s, o una cadena s, Me estoy haciendo un puntero - 759 00:33:30,410 --> 00:33:33,090 que pasa a ser de cuatro bytes en el aparato CS50 760 00:33:33,090 --> 00:33:34,410 y en una gran cantidad de computadoras. 761 00:33:34,410 --> 00:33:36,008 Y yo voy a llamar a este s. 762 00:33:36,008 --> 00:33:39,810 Y esto tiene en la actualidad algún valor desconocido. 763 00:33:39,810 --> 00:33:43,900 >> Cuando se declara una variable, a menos que usted mismo poner un valor allí, que 764 00:33:43,900 --> 00:33:44,570 sabe lo que hay. 765 00:33:44,570 --> 00:33:48,110 Podría ser una secuencia aleatoria de bits de la ejecución anterior. 766 00:33:48,110 --> 00:33:52,490 Así que cuando yo, en mi línea de código lo entiendo cadena y, a continuación, almacenar el retorno 767 00:33:52,490 --> 00:33:54,800 valor en s get string de alguna manera - 768 00:33:54,800 --> 00:33:58,520 y vamos finalmente pelar cómo llegar obras de cuerda, de alguna manera asigna un 769 00:33:58,520 --> 00:34:00,480 matriz que probablemente se ve un poco como esto. 770 00:34:00,480 --> 00:34:05,390 H-E-L-L-O, la barra invertida cero. 771 00:34:05,390 --> 00:34:09,510 >> Vamos a suponer que esta es la dirección 123 acaba primero consistencia. 772 00:34:09,510 --> 00:34:13,000 Así que los retornos de la secuencia, en el línea resaltada existe, devuelve el 773 00:34:13,000 --> 00:34:15,000 número dijimos, 123. 774 00:34:15,000 --> 00:34:17,420 Así que lo que realmente sucede en el interior de s aquí? 775 00:34:17,420 --> 00:34:26,590 >> Bueno, lo que realmente sucede interior de s es 123. 776 00:34:26,590 --> 00:34:29,250 Pero, francamente, me estoy poniendo un poco confundido por todas estas direcciones, 777 00:34:29,250 --> 00:34:30,320 todos estos números arbitrarios. 778 00:34:30,320 --> 00:34:32,290 123, 124, 127. 779 00:34:32,290 --> 00:34:34,570 Así que vamos a realmente simplificar el mundo un poco. 780 00:34:34,570 --> 00:34:38,800 >> Cuando hablamos de los punteros, francamente, a nosotros los seres humanos, a quién le importa dónde diablos 781 00:34:38,800 --> 00:34:39,870 las cosas están en la memoria? 782 00:34:39,870 --> 00:34:41,080 Eso es completamente arbitraria. 783 00:34:41,080 --> 00:34:43,370 Esto va a depender de cómo cantidad de RAM que el usuario tiene. 784 00:34:43,370 --> 00:34:46,590 Esto va a depender del momento en el día de ejecutar el programa, tal vez, y 785 00:34:46,590 --> 00:34:48,250 lo que introduce el usuario le da. 786 00:34:48,250 --> 00:34:50,060 Estamos detenerse en detalles sin importancia. 787 00:34:50,060 --> 00:34:54,230 >> Así que vamos a abstraer y decir que, cuando se ejecuta una línea de código como este, 788 00:34:54,230 --> 00:34:57,320 estrella de caracteres s consigue el retorno valor de la cadena de obtención. 789 00:34:57,320 --> 00:35:02,720 ¿Por qué no en lugar de simplemente dibujamos lo que seguir llamando a un puntero como si fuera 790 00:35:02,720 --> 00:35:04,140 que apunta a algo? 791 00:35:04,140 --> 00:35:07,000 Así que yo pretendo ahora que s hasta hay un puntero - 792 00:35:07,000 --> 00:35:08,480 debajo de la capucha es una dirección. 793 00:35:08,480 --> 00:35:11,330 Pero es sólo apunta a el primer byte en el 794 00:35:11,330 --> 00:35:12,780 cadena que se ha devuelto. 795 00:35:12,780 --> 00:35:16,710 >> Si ahora vuelvo al código aquí, ¿qué está pasando en esta línea? 796 00:35:16,710 --> 00:35:20,020 Bueno, en esta línea destacó hoy, Estoy declarando al parecer otra 797 00:35:20,020 --> 00:35:21,070 variable llamada t. 798 00:35:21,070 --> 00:35:25,700 Pero también es un puntero, así que voy dibujarlo como, en teoría, la exacta 799 00:35:25,700 --> 00:35:26,710 mismo cuadro de tamaño. 800 00:35:26,710 --> 00:35:28,160 Y yo voy a llamarlo t. 801 00:35:28,160 --> 00:35:33,500 >> Y ahora, si nos remontamos al código de nuevo, cuando guardo s dentro de t, 802 00:35:33,500 --> 00:35:36,920 ¿qué soy técnicamente poner dentro de t? 803 00:35:36,920 --> 00:35:39,350 Bueno, técnicamente, este fue el número 123. 804 00:35:39,350 --> 00:35:42,270 Así que en realidad yo debería estar escribiendo el número 123 allí. 805 00:35:42,270 --> 00:35:43,900 Pero vamos a tomar el nivel más alto. 806 00:35:43,900 --> 00:35:48,090 t, si es sólo un puntero, intuitivamente, es precisamente eso. 807 00:35:48,090 --> 00:35:49,800 Eso es todo lo que ha de ser almacenada allí. 808 00:35:49,800 --> 00:35:54,970 >> Así que ahora en las últimas líneas interesantes del Código, cuando en realidad voy sobre 809 00:35:54,970 --> 00:36:00,680 capitalizando el carácter cero en t, lo que está pasando? 810 00:36:00,680 --> 00:36:06,310 Bueno, t bracket cero ahora apunta a qué personaje, presumiblemente? 811 00:36:06,310 --> 00:36:07,460 >> Está señalando h. 812 00:36:07,460 --> 00:36:08,870 Porque t bracket cero - 813 00:36:08,870 --> 00:36:12,490 recuerda, esta es la sintaxis de edad. t soporte cero simplemente significa que si t es una cadena, t 814 00:36:12,490 --> 00:36:15,590 soporte de cero significa conseguir el cero carácter en que la fuerza. 815 00:36:15,590 --> 00:36:18,650 Así que lo que realmente significa es ir a esta matriz - 816 00:36:18,650 --> 00:36:21,520 y sí, esto podría ser 123, esto podría ser 124. 817 00:36:21,520 --> 00:36:22,790 Pero todo es relativo, recuerda. 818 00:36:22,790 --> 00:36:25,640 Siempre hablando de una matriz, tenemos la ventaja de hablar de 819 00:36:25,640 --> 00:36:27,000 índices relativos. 820 00:36:27,000 --> 00:36:31,120 >> Y así que ahora sólo podemos suponer que t soporte de cero es h. 821 00:36:31,120 --> 00:36:35,090 Así que si yo llamo 2 superior en él, lo que es haciendo realmente está aprovechando 822 00:36:35,090 --> 00:36:38,290 la h minúscula a mayúscula H. Pero, por supuesto, lo que es s? 823 00:36:38,290 --> 00:36:41,010 Se apunta a la misma cadena maldita. 824 00:36:41,010 --> 00:36:44,200 >> Así que esto es todo lo que está ocurriendo en este código hasta ahora. 825 00:36:44,200 --> 00:36:45,960 ¿Cuál es entonces la implicación? 826 00:36:45,960 --> 00:36:48,300 ¿Cómo podemos solucionar estos dos problemas? 827 00:36:48,300 --> 00:36:50,870 ¿Cómo nos comparamos con cuerdas reales? 828 00:36:50,870 --> 00:36:53,720 >> Bueno intuitivamente, ¿cómo vas sobre la comparación de dos 829 00:36:53,720 --> 00:36:55,090 cadenas para la igualdad real? 830 00:36:55,090 --> 00:36:58,920 831 00:36:58,920 --> 00:37:00,750 >> ¿Qué significa si dos cadenas son iguales? 832 00:37:00,750 --> 00:37:04,330 Es evidente que no es que sus direcciones son igual en la memoria, porque eso es un bajo 833 00:37:04,330 --> 00:37:06,590 detalle de implementación de nivel. 834 00:37:06,590 --> 00:37:08,360 Todos los personajes son los mismos. 835 00:37:08,360 --> 00:37:12,810 Así que permítanme proponer, y permítanme presentarles en la versión uno de compare.c 836 00:37:12,810 --> 00:37:14,970 aquí, así que compare-1.c. 837 00:37:14,970 --> 00:37:19,590 >> Permítanme proponer que todavía conseguimos un puntero llamado s, y almacenar en ella la 838 00:37:19,590 --> 00:37:20,610 valor de cadena get volver. 839 00:37:20,610 --> 00:37:21,750 Vamos a hacer lo mismo con t. 840 00:37:21,750 --> 00:37:23,230 Así que nada de que el código es diferente. 841 00:37:23,230 --> 00:37:25,420 Voy a añadir un poco de más la comprobación de errores ahora. 842 00:37:25,420 --> 00:37:29,390 Así que ahora que estamos especie de pelar este capas en CS50 de lo que una cadena 843 00:37:29,390 --> 00:37:33,520 en realidad es, que tenemos que ser más anal trata de asegurarse de que no abusamos 844 00:37:33,520 --> 00:37:35,330 valores no válidos como nulo. 845 00:37:35,330 --> 00:37:36,440 >> Así que sólo voy a comprobar. 846 00:37:36,440 --> 00:37:41,490 Si s no es igual a nula y t no lo hace igual nula, eso significa que estamos bien. 847 00:37:41,490 --> 00:37:44,460 Obtenga cadena no meter la pata conseguir cualquiera de esas cadenas. 848 00:37:44,460 --> 00:37:51,270 Y usted puede quizás adivinar ahora, qué Qué STR CMP presumiblemente hacer? 849 00:37:51,270 --> 00:37:52,000 Cadena comparar. 850 00:37:52,000 --> 00:37:55,470 >> Así que si no tienes el programa en java antes, esto es como el método es igual en el 851 00:37:55,470 --> 00:37:56,490 clase string. 852 00:37:56,490 --> 00:37:57,890 Pero para aquellos de ustedes que no tienen programada antes, 853 00:37:57,890 --> 00:37:59,320 esto es sólo una función de c. 854 00:37:59,320 --> 00:38:02,180 Le pasa a venir en una archivo llamado string.h. 855 00:38:02,180 --> 00:38:03,830 Ahí es donde está declarado. 856 00:38:03,830 --> 00:38:05,110 >> Y string comparar - 857 00:38:05,110 --> 00:38:07,530 De hecho, me olvidaré de su uso, pero eso no importa. 858 00:38:07,530 --> 00:38:10,470 Recordemos que podemos hacer hombre, revuelva comparar. 859 00:38:10,470 --> 00:38:12,590 Y esto va a abrir el Linux manual de programadores. 860 00:38:12,590 --> 00:38:14,060 Y es, francamente, un poco críptico. 861 00:38:14,060 --> 00:38:15,270 Pero puedo ver que aquí, sí. 862 00:38:15,270 --> 00:38:17,570 Tengo que incluir string.h. 863 00:38:17,570 --> 00:38:20,590 >> Y aquí dice en la descripción, "el función de comparación de cadena compara 864 00:38:20,590 --> 00:38:24,560 las dos cadenas S1 y S2 y S1. " y S2 son aparentemente las dos 865 00:38:24,560 --> 00:38:26,120 argumentos pasados ​​pulg 866 00:38:26,120 --> 00:38:28,650 Yo no me acuerdo de lo que const es, pero ahora cuenta - 867 00:38:28,650 --> 00:38:31,480 y es posible que haya visto ya esto cuando has utiliza las páginas de manual si 868 00:38:31,480 --> 00:38:32,390 tenerlo todo - 869 00:38:32,390 --> 00:38:36,220 esa estrella char es simplemente sinónimo de con una cuerda. 870 00:38:36,220 --> 00:38:40,440 >> Por lo tanto, compara las dos cadenas, S1 y S2, y que devuelve un entero menor 871 00:38:40,440 --> 00:38:44,930 que o igual a o mayor que cero si se encuentra S1, respectivamente, para ser 872 00:38:44,930 --> 00:38:47,450 menor que, o el partido, o ser mayor que S2. 873 00:38:47,450 --> 00:38:51,220 Eso es sólo una forma muy compleja de decir esa cadena comparación de rentabilidad 874 00:38:51,220 --> 00:38:55,760 cero si dos cadenas son intuitivamente idéntica, carácter para 875 00:38:55,760 --> 00:38:57,120 carácter a carácter. 876 00:38:57,120 --> 00:38:59,970 >> Se devuelve un número negativo si s, por orden alfabético, se supone 877 00:38:59,970 --> 00:39:01,010 venir antes de t. 878 00:39:01,010 --> 00:39:05,300 O devuelve un número positivo si s se supone que vendrá después de t 879 00:39:05,300 --> 00:39:06,170 alfabéticamente. 880 00:39:06,170 --> 00:39:08,360 Así, con esta simple función, podría que, por ejemplo, ordenar una 881 00:39:08,360 --> 00:39:09,770 manojo entero de las palabras? 882 00:39:09,770 --> 00:39:13,984 >> Así que en esta nueva versión, voy para seguir adelante y hacer Comparación1. 883 00:39:13,984 --> 00:39:15,750 Dot slash comparar uno. 884 00:39:15,750 --> 00:39:18,030 Te escribo en hola en minúsculas. 885 00:39:18,030 --> 00:39:20,300 Voy a escribir hola en minúsculas nuevo. 886 00:39:20,300 --> 00:39:23,340 Y por suerte ahora se da cuenta de He escrito lo mismo. 887 00:39:23,340 --> 00:39:27,520 >> Mientras tanto, si escribo en hola en menor HOLA caso y en mayúsculas y 888 00:39:27,520 --> 00:39:29,710 compararlos, escribí cosas diferentes. 889 00:39:29,710 --> 00:39:32,530 Debido a que no sólo son las direcciones diferente, pero estamos comparando 890 00:39:32,530 --> 00:39:35,350 diferentes personajes una y otra vez. 891 00:39:35,350 --> 00:39:37,320 >> Bueno, vamos a ir a arreglar una otro problema ahora. 892 00:39:37,320 --> 00:39:41,590 Permítanme abro versión uno de copia, que ahora las direcciones 893 00:39:41,590 --> 00:39:42,900 este problema de la siguiente manera. 894 00:39:42,900 --> 00:39:45,650 Y ésta va a ver un poco más complejo. 895 00:39:45,650 --> 00:39:49,320 Pero si se piensa en qué problema nos necesidad de resolver, espero que esto será 896 00:39:49,320 --> 00:39:51,870 borrar en un momento ahora. 897 00:39:51,870 --> 00:39:57,280 >> Así que esta primera línea, el carácter de inicio t, en términos sencillos podría alguien proponer 898 00:39:57,280 --> 00:39:59,450 lo que esta línea significa aquí? 899 00:39:59,450 --> 00:40:01,050 Carácter estrella t, lo que es que hacer? 900 00:40:01,050 --> 00:40:06,660 901 00:40:06,660 --> 00:40:07,210 >> Bueno. 902 00:40:07,210 --> 00:40:09,500 Crear un puntero a alguna detectar en la memoria. 903 00:40:09,500 --> 00:40:10,930 Y déjame perfeccionarlo un poco. 904 00:40:10,930 --> 00:40:17,180 Declare una variable que almacenará la Dirección de algunos caracteres en la memoria, sólo 905 00:40:17,180 --> 00:40:18,480 a ser un poco más adecuada. 906 00:40:18,480 --> 00:40:21,210 >> OK, así que ahora en el lado derecho, no tengo nunca había visto una de estas funciones 907 00:40:21,210 --> 00:40:22,660 antes, malloc. 908 00:40:22,660 --> 00:40:26,980 Pero, ¿qué podría significar eso? 909 00:40:26,980 --> 00:40:28,050 Asignación de memoria. 910 00:40:28,050 --> 00:40:29,410 La asignación de memoria. 911 00:40:29,410 --> 00:40:33,050 >> Así resulta que, hasta ahora, hemos realmente no han tenido una poderosa manera de 912 00:40:33,050 --> 00:40:36,210 pidiendo el sistema operativo, dame un poco de memoria. 913 00:40:36,210 --> 00:40:39,980 Más bien, ahora tenemos una función llamada malloc que hace exactamente eso. 914 00:40:39,980 --> 00:40:42,960 A pesar de que esto es un poco de un distracción en este momento, observe que en 915 00:40:42,960 --> 00:40:46,200 entre los dos paréntesis es sólo va a ser un número. 916 00:40:46,200 --> 00:40:48,510 Donde he escrito en cuestión marcas pueden ser un número. 917 00:40:48,510 --> 00:40:51,020 >> Y ese número significa, dame 10 bytes. 918 00:40:51,020 --> 00:40:52,320 Dame 20 bytes. 919 00:40:52,320 --> 00:40:53,820 Dame 100 bytes. 920 00:40:53,820 --> 00:40:56,500 Y malloc hará todo lo posible para pedir al sistema operativo - 921 00:40:56,500 --> 00:40:57,630 Linux, en este caso - 922 00:40:57,630 --> 00:40:59,630 bueno, son sus 100 bytes de RAM disponible? 923 00:40:59,630 --> 00:41:04,320 Si es así, devolver esos bytes a mí por devuelve la dirección de la cual de 924 00:41:04,320 --> 00:41:06,610 esos bytes, tal vez? 925 00:41:06,610 --> 00:41:07,610 El primero de todos. 926 00:41:07,610 --> 00:41:10,460 >> Así que aquí también - y esto es predominante en C, en cualquier momento que estés 927 00:41:10,460 --> 00:41:11,680 tratar con direcciones? 928 00:41:11,680 --> 00:41:15,830 Ya casi siempre se trata de la primero como la dirección, no importa lo grande 929 00:41:15,830 --> 00:41:19,490 un trozo de memoria que está siendo devuelto, por así decirlo. 930 00:41:19,490 --> 00:41:20,880 >> Así que vamos a bucear aquí. 931 00:41:20,880 --> 00:41:23,940 Estoy tratando de asignar la forma muchos bytes, exactamente? 932 00:41:23,940 --> 00:41:24,080 Bueno. 933 00:41:24,080 --> 00:41:26,090 Longitud de la secuencia de s - vamos a hacer un ejemplo concreto. 934 00:41:26,090 --> 00:41:30,700 Si s es hola, H-E-L-L-O, lo que es la longitud de la cadena de s, obviamente? 935 00:41:30,700 --> 00:41:32,010 Así que es de cinco años. 936 00:41:32,010 --> 00:41:34,590 Pero yo estoy haciendo un punto a favor 1 en eso, ¿por qué? 937 00:41:34,590 --> 00:41:37,700 ¿Por qué quiero seis bytes en lugar de cinco? 938 00:41:37,700 --> 00:41:38,790 El carácter nulo. 939 00:41:38,790 --> 00:41:41,210 >> No quiero dejar fuera de este carácter especial nulo. 940 00:41:41,210 --> 00:41:45,160 Porque si hago una copia de Hola y acaba de hacer H-E-L-L-O, pero no pongo 941 00:41:45,160 --> 00:41:50,160 ese carácter especial, el equipo puede que no tenga, por casualidad, una barra invertida 942 00:41:50,160 --> 00:41:51,730 cero allí para mí. 943 00:41:51,730 --> 00:41:55,570 Y por lo que si estoy tratando de averiguar la La longitud de la copia, yo podría pensar que 944 00:41:55,570 --> 00:41:59,360 es 20 caracteres de largo, o un millón caracteres de largo si nunca se me ocurre 945 00:41:59,360 --> 00:42:01,050 para golpear un cero barra invertida. 946 00:42:01,050 --> 00:42:05,780 >> Así que necesitamos seis bytes para almacenar H-E-L-L-O, la barra invertida cero. 947 00:42:05,780 --> 00:42:07,870 Y entonces esto es sólo que ser super anal. 948 00:42:07,870 --> 00:42:10,700 Supongamos que se me olvida lo que el tamaño de un char es. 949 00:42:10,700 --> 00:42:12,020 Seguimos diciendo que es un byte. 950 00:42:12,020 --> 00:42:12,860 Y por lo general es. 951 00:42:12,860 --> 00:42:15,425 En teoría, podría ser algo diferente, en un Mac diferente o una 952 00:42:15,425 --> 00:42:16,250 diferentes PC. 953 00:42:16,250 --> 00:42:19,650 >> Así que resulta que hay este operador llamado sizeof que si se le pasa la 954 00:42:19,650 --> 00:42:22,680 nombre de un tipo de datos - como char, o int o float - 955 00:42:22,680 --> 00:42:26,930 que le dirá, dinámicamente, ¿cuántos bytes de un char ocupa en este 956 00:42:26,930 --> 00:42:28,090 en particular del equipo. 957 00:42:28,090 --> 00:42:31,360 >> Así que esto es efectivamente sólo como veces diciendo 1 o 958 00:42:31,360 --> 00:42:32,440 veces nada en absoluto. 959 00:42:32,440 --> 00:42:36,340 Pero lo estoy haciendo para estar súper anal, que sólo en caso de una diferencia carac 960 00:42:36,340 --> 00:42:40,610 en su equipo frente a la mía, de esta manera las matemáticas siempre va a la salida. 961 00:42:40,610 --> 00:42:43,720 >> Por último, aquí puedo comprobar nulo, que es siempre una buena práctica - de nuevo, 962 00:42:43,720 --> 00:42:44,920 cualquier momento que estamos tratando con punteros. 963 00:42:44,920 --> 00:42:47,520 Si malloc no era capaz de dar me seis byes - que es 964 00:42:47,520 --> 00:42:49,210 poco probable, pero por si acaso - 965 00:42:49,210 --> 00:42:50,730 volver inmediatamente. 966 00:42:50,730 --> 00:42:53,290 Y ahora, adelante y copiar la cadena como sigue. 967 00:42:53,290 --> 00:42:57,240 Y esta es la sintaxis familiar, aunque en un rol diferente. 968 00:42:57,240 --> 00:43:01,210 >> Voy a seguir adelante y obtener la cadena longitud s y almacenarlo en el n. 969 00:43:01,210 --> 00:43:06,620 Entonces voy a repetir de i es igual a cero hasta e incluyendo N, 970 00:43:06,620 --> 00:43:08,410 mayor que o igual a. 971 00:43:08,410 --> 00:43:13,540 Así que en cada iteración, pongo el carácter i de s en el ith 972 00:43:13,540 --> 00:43:15,380 carácter de t. 973 00:43:15,380 --> 00:43:18,190 >> Así que lo que realmente está pasando debajo el capó aquí? 974 00:43:18,190 --> 00:43:22,140 Bueno, si este, por ejemplo, es s - 975 00:43:22,140 --> 00:43:26,400 y he escrito en la palabra H-E-L-L-O y hay una barra invertida cero. 976 00:43:26,400 --> 00:43:29,020 Y de nuevo, esto es s apuntando aquí. 977 00:43:29,020 --> 00:43:30,830 Y aquí ahora es t. 978 00:43:30,830 --> 00:43:34,860 >> Y esto está apuntando ahora a una copia de la memoria, ¿no? 979 00:43:34,860 --> 00:43:37,340 Malloc me ha dado en su conjunto trozo de memoria. 980 00:43:37,340 --> 00:43:41,440 No sé lo que es un principio en cualquiera de estas ubicaciones. 981 00:43:41,440 --> 00:43:44,340 Así que voy a pensar en ellos como un montón de signos de interrogación. 982 00:43:44,340 --> 00:43:50,190 >> Pero tan pronto como me pongo en bucle de cero en un máximo a través de la longitud de s, t 983 00:43:50,190 --> 00:43:52,790 soporte de cero y t soporte de 1 - 984 00:43:52,790 --> 00:43:55,080 y voy a poner esto ahora en la cabeza - 985 00:43:55,080 --> 00:44:04,190 t soporte de cero y s soporte de media cero que yo voy a copiar 986 00:44:04,190 --> 00:44:09,875 iterativa h aquí, E-L-L-O. Además, como lo hice el signo más 987 00:44:09,875 --> 00:44:12,370 1, la barra invertida cero. 988 00:44:12,370 --> 00:44:19,060 >> Así que ahora en el caso de-1.c comparar, al final, si imprimo la 989 00:44:19,060 --> 00:44:24,760 capitalización de t, debemos ver que s no ha cambiado. 990 00:44:24,760 --> 00:44:26,090 Déjame ir adelante ahora y hago esto. 991 00:44:26,090 --> 00:44:28,630 Así que copy1. 992 00:44:28,630 --> 00:44:30,860 Dot slash copy1. 993 00:44:30,860 --> 00:44:33,670 Voy a escribir hola, Intro. 994 00:44:33,670 --> 00:44:37,430 Y ahora fíjense, sólo la copia se ha capitalizado. 995 00:44:37,430 --> 00:44:40,890 Porque yo realmente tengo dos trozos de memoria. 996 00:44:40,890 --> 00:44:44,390 >> Desafortunadamente, usted puede hacer algo bonito las cosas malas y muy peligroso aquí. 997 00:44:44,390 --> 00:44:49,290 Déjame sacar hasta un ejemplo ahora aquí, eso nos da un ejemplo de unos pocos 998 00:44:49,290 --> 00:44:51,540 diferentes líneas. 999 00:44:51,540 --> 00:44:56,040 Por lo que sólo intuitivamente aquí, la primera línea de código, int x estrella, está declarando 1000 00:44:56,040 --> 00:44:57,340 una variable llamada x. 1001 00:44:57,340 --> 00:44:58,810 ¿Y cuál es el tipo de datos de esa variable? 1002 00:44:58,810 --> 00:45:01,820 1003 00:45:01,820 --> 00:45:04,290 ¿Cuál es el tipo de datos de esta variable? 1004 00:45:04,290 --> 00:45:06,980 Ese no fue el melodrama. 1005 00:45:06,980 --> 00:45:08,350 >> El tipo de datos es int estrellas. 1006 00:45:08,350 --> 00:45:12,600 Entonces, ¿qué significa eso? x voluntad almacenar la dirección de un int. 1007 00:45:12,600 --> 00:45:13,520 Tan simple como eso. 1008 00:45:13,520 --> 00:45:16,220 Y se va a almacenar el dirección de un int. 1009 00:45:16,220 --> 00:45:18,390 ¿Cuál es la tercera línea de código haciendo allí? 1010 00:45:18,390 --> 00:45:21,850 Se asignación de cuántos bytes, más probable? 1011 00:45:21,850 --> 00:45:22,350 Cuatro. 1012 00:45:22,350 --> 00:45:25,460 Debido al tamaño de un int es generalmente cuatro, malloc de cuatro da 1013 00:45:25,460 --> 00:45:29,950 me apoyaré la dirección de un trozo de memoria, el primero de cuyos bytes es 1014 00:45:29,950 --> 00:45:32,110 almacenado ahora en x. 1015 00:45:32,110 --> 00:45:34,410 >> Ahora nos estamos moviendo un poco rápido. 1016 00:45:34,410 --> 00:45:35,760 Estrella x significa qué? 1017 00:45:35,760 --> 00:45:38,480 1018 00:45:38,480 --> 00:45:42,590 Significa ir a esa dirección y poner lo que el número allí? 1019 00:45:42,590 --> 00:45:43,870 Ponga el número 42 allí. 1020 00:45:43,870 --> 00:45:47,590 Medio alguno de estrellas van a lo que es en y y poner el número 13 allí. 1021 00:45:47,590 --> 00:45:48,600 >> Pero espere un minuto. 1022 00:45:48,600 --> 00:45:51,640 Lo que está en y en este momento? 1023 00:45:51,640 --> 00:45:54,950 ¿Qué dirección es y almacenamiento? 1024 00:45:54,950 --> 00:45:55,770 No lo sabemos, ¿verdad? 1025 00:45:55,770 --> 00:45:59,230 Nunca una vez hayamos utilizar la asignación operador que implica y. 1026 00:45:59,230 --> 00:46:03,370 Por lo tanto y como se declaró en la segunda línea de código es sólo un valor de la basura, un gran 1027 00:46:03,370 --> 00:46:04,760 signo de interrogación por así decirlo. 1028 00:46:04,760 --> 00:46:07,230 Podría estar apuntando al azar a cualquier cosa en la memoria, que 1029 00:46:07,230 --> 00:46:08,340 es generalmente malo. 1030 00:46:08,340 --> 00:46:13,540 >> Así que tan pronto como llegamos a esa línea existe, estrella y es igual a 13, algo malo, 1031 00:46:13,540 --> 00:46:17,220 algo muy malo está a punto a pasar a Binky. 1032 00:46:17,220 --> 00:46:25,810 Así que vamos a ver lo que va a acabar pasando a Binky aquí en este minuto 1033 00:46:25,810 --> 00:46:26,200 o así que busca. 1034 00:46:26,200 --> 00:46:26,490 >> [REPRODUCCIÓN DE VÍDEO] 1035 00:46:26,490 --> 00:46:26,745 >> -Hey, Binky. 1036 00:46:26,745 --> 00:46:27,000 Despierta. 1037 00:46:27,000 --> 00:46:29,296 Es tiempo para la diversión puntero. 1038 00:46:29,296 --> 00:46:30,680 >> ¿Qué es eso? 1039 00:46:30,680 --> 00:46:31,980 Entérese de los punteros? 1040 00:46:31,980 --> 00:46:34,010 Oh, qué bien. 1041 00:46:34,010 --> 00:46:37,220 >> -Bueno, para empezar, creo que estamos Va a necesitar un par de punteros. 1042 00:46:37,220 --> 00:46:37,930 >> -OK. 1043 00:46:37,930 --> 00:46:41,650 Este código asigna dos punteros que puede apuntar a números enteros. 1044 00:46:41,650 --> 00:46:43,760 >> -OK, bueno, veo los dos punteros. 1045 00:46:43,760 --> 00:46:45,850 Pero ellos no parecen ser apuntando a nada. 1046 00:46:45,850 --> 00:46:46,490 >> -Eso es correcto. 1047 00:46:46,490 --> 00:46:48,630 Inicialmente, los punteros no lo hacen apuntar a nada. 1048 00:46:48,630 --> 00:46:51,700 Las cosas que apuntan son llamados pointees, y que fueron creados es una 1049 00:46:51,700 --> 00:46:52,850 etapa separada. 1050 00:46:52,850 --> 00:46:53,740 >> -Oh, claro, claro. 1051 00:46:53,740 --> 00:46:54,500 Lo sabía. 1052 00:46:54,500 --> 00:46:56,270 Los pointees están separados. 1053 00:46:56,270 --> 00:46:58,553 Entonces, ¿cómo se asigna un pointee? 1054 00:46:58,553 --> 00:46:59,480 >> -OK. 1055 00:46:59,480 --> 00:47:03,707 Bueno, el código asigna una nueva enteros pointee, y esta parte se presentan x 1056 00:47:03,707 --> 00:47:05,520 para que apunte a él. 1057 00:47:05,520 --> 00:47:06,760 >> -Oye, que se ve mejor. 1058 00:47:06,760 --> 00:47:08,520 Así que haga algo. 1059 00:47:08,520 --> 00:47:09,530 >> -OK. 1060 00:47:09,530 --> 00:47:14,110 Voy a eliminar la referencia al puntero x para almacenar el número 42 en su pointee. 1061 00:47:14,110 --> 00:47:17,660 Para este truco, necesitaré mi magia varita de eliminación de referencias. 1062 00:47:17,660 --> 00:47:20,695 >> -Tu varita mágica de la eliminación de referencias? 1063 00:47:20,695 --> 00:47:22,632 Uh, eso es genial. 1064 00:47:22,632 --> 00:47:24,620 >> -Esto es lo que el código se parece. 1065 00:47:24,620 --> 00:47:27,526 Voy a configurar el número, y - 1066 00:47:27,526 --> 00:47:28,250 >> -Oye, mira. 1067 00:47:28,250 --> 00:47:29,680 Ahí va. 1068 00:47:29,680 --> 00:47:34,520 Así que haciendo un dereference en X sigue la flecha para acceder a su pointee. 1069 00:47:34,520 --> 00:47:36,690 En este caso, para almacenar 42 allí. 1070 00:47:36,690 --> 00:47:40,890 Hey, trata de usarlo para almacenar el número 13 a través del otro puntero, y. 1071 00:47:40,890 --> 00:47:42,125 >> -OK. 1072 00:47:42,125 --> 00:47:46,810 Voy a ir por aquí ayy conseguir el número 13 para este compromiso. 1073 00:47:46,810 --> 00:47:50,890 Y luego tomar la varita de eliminación de referencias y justo - 1074 00:47:50,890 --> 00:47:52,430 Whoa! 1075 00:47:52,430 --> 00:47:53,030 >> -Oh, hey. 1076 00:47:53,030 --> 00:47:54,610 Eso no funcionó. 1077 00:47:54,610 --> 00:47:58,200 Digamos, Binky, yo no creo que el eliminación de referencias y es una buena idea, 1078 00:47:58,200 --> 00:48:01,370 porque la creación de la pointee es un paso separado. 1079 00:48:01,370 --> 00:48:03,460 Y yo no creo que nunca lo hicimos. 1080 00:48:03,460 --> 00:48:03,810 >> -Hmm. 1081 00:48:03,810 --> 00:48:05,160 Buen punto. 1082 00:48:05,160 --> 00:48:07,410 >> -Sí, hemos destinado el puntero y. 1083 00:48:07,410 --> 00:48:10,045 Pero nunca nos pusimos a apuntar a una pointee. 1084 00:48:10,045 --> 00:48:10,490 >> -Hmm. 1085 00:48:10,490 --> 00:48:12,170 Muy observador. 1086 00:48:12,170 --> 00:48:13,790 >> -Oye, que está buscando bueno allí, Binky. 1087 00:48:13,790 --> 00:48:16,920 ¿Puedes arreglarlo de manera que los puntos de Y a la misma pointee cuando x? 1088 00:48:16,920 --> 00:48:17,810 >> -Por supuesto. 1089 00:48:17,810 --> 00:48:20,300 Voy a usar mi varita mágica de la asignación de puntero. 1090 00:48:20,300 --> 00:48:22,240 >> -Es que va a ser un problema como antes? 1091 00:48:22,240 --> 00:48:22,665 >> -No. 1092 00:48:22,665 --> 00:48:24,300 Esto no toca los pointees. 1093 00:48:24,300 --> 00:48:27,880 Sólo cambia un puntero para señalar a la misma cosa que otra. 1094 00:48:27,880 --> 00:48:28,970 >> -Oh, ya veo. 1095 00:48:28,970 --> 00:48:31,730 Ahora y apunta al mismo lugar que x. 1096 00:48:31,730 --> 00:48:32,450 Así que esperar. 1097 00:48:32,450 --> 00:48:33,490 Ahora y se fija. 1098 00:48:33,490 --> 00:48:34,630 Tiene una pointee. 1099 00:48:34,630 --> 00:48:36,520 Así que usted puede probar la varita de eliminación de referencias de nuevo 1100 00:48:36,520 --> 00:48:39,200 para enviar el 13 de nuevo. 1101 00:48:39,200 --> 00:48:39,840 >> -OK. 1102 00:48:39,840 --> 00:48:41,570 Aquí va. 1103 00:48:41,570 --> 00:48:42,870 >> -Oye, mira eso. 1104 00:48:42,870 --> 00:48:44,320 Ahora dereferencing obras en y. 1105 00:48:44,320 --> 00:48:47,020 Y debido a que los punteros están compartiendo que uno pointee, se 1106 00:48:47,020 --> 00:48:48,585 tanto ver el 13. 1107 00:48:48,585 --> 00:48:49,040 >> -Sí. 1108 00:48:49,040 --> 00:48:49,670 Compartiendo. 1109 00:48:49,670 --> 00:48:50,380 Lo que sea. 1110 00:48:50,380 --> 00:48:52,290 Así que vamos cambiar lugares ahora? 1111 00:48:52,290 --> 00:48:52,970 >> -Oh, mira. 1112 00:48:52,970 --> 00:48:54,150 Estamos fuera de tiempo. 1113 00:48:54,150 --> 00:48:55,200 >> -Pero - 1114 00:48:55,200 --> 00:48:57,060 >> -Sólo recuerda los tres normas puntero. 1115 00:48:57,060 --> 00:49:00,100 Número uno, la estructura básica es que usted tiene un puntero. 1116 00:49:00,100 --> 00:49:02,170 Y apunta a una pointee. 1117 00:49:02,170 --> 00:49:04,160 Pero el puntero y pointee están separados. 1118 00:49:04,160 --> 00:49:06,460 Y el error común es establecer un puntero, pero a 1119 00:49:06,460 --> 00:49:08,540 olvide dado un pointee. 1120 00:49:08,540 --> 00:49:12,460 >> Número dos, comienza referencia de puntero en el puntero y sigue su 1121 00:49:12,460 --> 00:49:14,570 flecha para acceder a su pointee. 1122 00:49:14,570 --> 00:49:18,640 Como todos sabemos, esto sólo funciona si hay es un pointee, que vuelve a 1123 00:49:18,640 --> 00:49:19,790 la regla número uno. 1124 00:49:19,790 --> 00:49:23,670 >> Número tres, la asignación de puntero toma un puntero y cambios para que apunte a 1125 00:49:23,670 --> 00:49:25,850 la misma pointee como otro puntero. 1126 00:49:25,850 --> 00:49:27,840 Así que después de la cesión, los dos punteros 1127 00:49:27,840 --> 00:49:29,430 apuntar a la misma pointee. 1128 00:49:29,430 --> 00:49:31,600 A veces eso se llama compartir. 1129 00:49:31,600 --> 00:49:33,430 Y eso es todo lo que hay que hacer, de verdad. 1130 00:49:33,430 --> 00:49:33,840 Bye bye ahora. 1131 00:49:33,840 --> 00:49:34,300 >> [VIDEO PLAYBACK FIN] 1132 00:49:34,300 --> 00:49:36,940 >> DAVID MALAN: Así que más de los punteros, más en Binky próxima semana. 1133 00:49:36,940 --> 00:49:38,190 Nos vemos el lunes. 1134 00:49:38,190 --> 00:49:42,187