DAVID MALAN: Hola, y bienvenidos de nuevo a CS50. Así que este es el final de la cuarta semana. Sólo un anuncio de primera. Así la llamada quinta Lunes es subiendo el próximo lunes. Esta es la oportunidad de cambiar de SAT / UNSAT a un grado de la letra, o de grado de la letra SAT / UNSAT. Era un fastidio, ese proceso no requiere una firma, porque hay que llenar una de esas formas de inserción / extracción de color rosa. Porque técnicamente, el SAT / UNSAT versión y la versión de la letra de grado tienen números de catálogo distintos. Pero no es gran cosa. Solo tiene que venir a mí o para Rob o para Lauren en cualquier punto. O envíenos un correo electrónico si usted no tiene el tipo de papeleo que necesita hoy, y nosotros será seguro para ayudarle a tomar cuidado de que antes del lunes. Muy bien, así que hoy - de hecho, hay un poco de eco. ¿Podemos me atenuar un poco? Aceptar. Así que hoy, se introduce un tema conocido como punteros. Y voy a admitir que este es uno de los los temas más complejos que tendemos a cubrir en esta clase, o en realidad cualquier curso introductorio que utiliza C. Pero tome mi palabra para ella, sobre todo si su mente se siente un poco más dobladas hoy y en las próximas semanas. No es representativo de usted que consigue peor en este sólo significa que se trata de un tema particularmente sofisticado que prometo, un par de semanas por lo tanto, le parecerá muy llamativo sencillo en retrospectiva. Todavía recuerdo a este día. Yo estaba sentado en Elliott Dining Hall, sentado al lado de mi TF Nishat Mehta, que era un residente de la casa de Elliott. Y por alguna razón, esta tema simplemente haga clic. Lo que quiere decir que yo también luché con él durante una cierta cantidad de tiempo, pero me Haré mi mejor para ayudar a evitar cualquier luchar con un tema que en última instancia, es bastante potente. De hecho, uno de los temas que vamos a discutir en las próximas semanas es que de seguridad, y cómo en realidad se puede explotar las máquinas de manera que no se pretendía. Y esas explotaciones son típicamente el resultado de los errores, equivocaciones que nos la gente comete al no entender algunas de la implementación subyacente detalles a través del cual se realizan los programas. Ahora, para hacer que esto parezca aún más usuarios amable, pensé que jugaría un 10 segunda vista previa de un poco de animación con plastilina figura llamada Binky que fue llevado a la vida por un amigo nuestro en Stanford, profesor Nick Parlante. Así que permítame que le doy a este teaser del Binky aquí. [REPRODUCCIÓN DE VÍDEO] -Hey, Binky. Despierta. Es tiempo para la diversión puntero. ¿Qué es eso? Entérese de los punteros? Oh, qué bien. [VIDEO PLAYBACK FIN] DAVID MALAN: Es Stanford ciencias de la computación. Así que más en el venidero. [Aplausos] DAVID MALAN: Lo siento, Nick. Así que recordar que la última vez que terminamos en esto realmente emocionante melodrama por lo que esta función simplemente no funcionó. Por lo menos intuitivamente, se sentía como tiene que funcionar. Simplemente intercambiando los valores de dos números enteros. Pero recordar que cuando imprimimos la valores originales en principal, una y dos, que eran todavía uno y dos y no dos y uno. Así que permítanme realidad enciendo sobre el aparato. Y escribí un poco de código esquelético en adelantar aquí, donde afirmo que x será 1, y habrá 2. Luego imprimo tanto de su valores con la impresión f. Entonces yo sostengo aquí que vamos a intercambiarlas. He dejado un espacio en blanco aquí para nosotros rellene hoy en un momento. Entonces, voy a reclamar que el dos variables se han intercambiado. Entonces voy a imprimir ellos de nuevo. Y así, con suerte, yo debería ver 1, 2. 2, 1. Ese es el super simple objetivo ahora mismo. Entonces, ¿cómo hacemos para intercambiar dos variables? Bueno, si me propongo aquí que estas copas podría representar la memoria en un ordenador. Se trata de un par de bocados, este es otra de las picaduras. ¿Podríamos tener un voluntario se enciende y nos mezcle algunas bebidas, si resulta familiar? Vamos arriba. ¿Cómo te llamas? JESS: Jess. DAVID MALAN: Jess? Vamos arriba, Jess. Si no te importa, tenemos que poner el Google Glass en usted para que podamos inmortalizar esto. Aceptar, vidrio. Grabar un vídeo. Y bien, somos buenos para ir con Jess aquí. Está bien. Gusto en conocerlo. Así que lo que me gustaría que ustedes hacen aquí - si se pudiera, con bastante rapidez - sólo nos vierte la mitad de un vaso de naranja jugo y la mitad de un vaso de leche, representar efectivamente los números 1 en una taza y 2 en el otro vaso. Esto va a ser bueno metraje. JESS: Lo siento. DAVID MALAN: No, no. Está bien. Niza. Muy bien, así que tenemos cuatro bytes pena de jugo de naranja. Vamos a llamábamos el valor 1. Ahora, otro cuatro bytes por valor de la leche. Llamaremos valor 2. Así que x e y, respectivamente. Muy bien, así que ahora si la tarea en cuestión - para ti, Jess, delante de todos de sus compañeros de clase - es para cambiar los valores de x e y tales que queremos que el jugo de naranja en la otra taza y la leche en esta copa, cómo podría usted - antes de que realmente lo hace ella - ir haciendo esto? Bueno, sabia decisión. Por lo que necesita un poco más de memoria. Así que vamos a asignar un temporal taza, si se quiere. Y ahora proceder a cambiar xe y. Excelente. Así que muy bien hecho. Muchas Gracias, Jess. Aquí tiene. Un pequeño recuerdo. Aceptar, por lo que, obviamente, idea super simple. Totalmente intuitivo que necesitamos un poco más espacio de almacenamiento - en esta forma, una taza - si realmente queremos intercambiar estas dos variables. Así que vamos a hacer exactamente eso. Hasta aquí entre donde yo afirmo que soy va a estar haciendo un poco de intercambio, lo voy a hacer seguir adelante y declarar temp. Y me puse igual a, digamos, x. Entonces me voy a cambiar el valor de x igual que Jess hizo aquí con el leche y zumo de naranja para que sea igual a y. Y yo voy a cambiar y que es igual no x, porque ahora estaríamos atrapado en un círculo, sino más bien la temperatura. Donde temporalmente - o donde Jess aparcar temporalmente el jugo de naranja antes de que clobbering taza con la leche. Así que déjame ir adelante ahora y hago esto. Se llama noswap.c. Y ahora déjame correr ningún intercambio. Y de hecho lo veo, si puedo ampliar la ventana un poco, que x es 1, y es 2. Y entonces x es 2, y es 1. Pero recordar que el lunes hicimos las cosas un poco diferente por el cual yo en vez implementada una función auxiliar, si se quiere, que en realidad era nula. Lo llamé swap. Le di dos parámetros, y llamé ellos una y yo los llamaba b. Francamente, yo podría llamarlos xe y. Nada le detiene me hagan eso. Pero yo diría que es entonces un poco ambigua. Porque recuerdo para el lunes que Alegaron que estos parámetros fueron copias de los valores pasados ​​pulg Por lo que sólo se mete con su mente, creo que, si utiliza exactamente las mismas variables. Así que en lugar de ellos a llamar a un y b, sólo para mayor claridad. Pero podríamos llamarlos más lo que queramos. Y yo voy a copiar y pegar efectivamente este código desde allí arriba abajo en aquí. Porque acabo de ver que funciona. Así que eso es en muy buena forma. Y voy a cambiar mi xa una, mi x a una, a mi y a B y mi y para b. Así, en otras palabras, la misma lógica exacta. Exactamente lo mismo que Jess hizo. Y entonces lo único que tengo que hacer hasta aquí, por supuesto, ahora es invocar esta funcionar, o llamar a esta función. Así que voy a llamar a esta función con dos insumos, x e y, y pulse Guardar. Muy bien, así que fundamentalmente la misma cosa. De hecho, probablemente he hecho el programa innecesariamente compleja por escribir una función que acaba de tomar unas seis líneas de código mientras que yo previamente habían implementado esto en tan sólo tres. Así que déjame ir adelante ahora y rehacer esto, no nos swap. Muy bien, la he cagado aquí. Esto debe ser un error que podría ver cada vez más comúnmente como su programas se vuelven más complejos. Pero hay una solución fácil. Permítanme retroceder hasta aquí. Y lo que es el primer error que estoy viendo? Declaración implícita. Lo que sí que suelen indicar? Ah, se me olvidó el prototipo. Me olvidé de enseñar al compilador que intercambie va a existir a pesar de que no existe en el principio del programa. Así que sólo voy a decir nula, de intercambio, int, un int b, punto y coma. Así que no voy a volverlo a implementar. Pero ahora que coincide con lo que está aquí abajo. Y note, la ausencia de un punto y coma aquí, que no es necesario cuando ejecución. Así que rehacerme esto, asegúrese de no intercambio. Mucho mejor forma. Correr sin swap. Y maldita sea. Ahora estamos de vuelta donde estábamos el lunes, donde la cosa no intercambiar. Y lo que es la explicación intuitiva de por qué esto es así? ¿Sí? ESTUDIANTE: [inaudible]. DAVID MALAN: Exactamente. Así que a y b son copias de x e y. Y, de hecho, cada vez que he estado llamar a una función que hasta ahora pasa variables como ints - simplemente como swap está esperando aquí - ustedes han estado pasando en las copias. Ahora que significa que se necesita un poco de tiempo, una fracción de segundo, para el ordenador para copiar los bits de un variable en los bits de otro. Pero eso no es una cosa muy importante. Pero, sin embargo, son una copia. Y ahora, en el contexto del intercambio, Yo soy, de hecho, con éxito cambiar a y b. De hecho, vamos a hacer una rápida comprobación de validez. Imprimir f a es% i, nueva línea. Y vamos a enchufar a. Ahora vamos a hacer lo mismo con b. Y vamos a hacer lo mismo aquí. Y ahora, permítanme copiar esas mismas líneas de nuevo en la parte inferior de la función después de mis tres líneas de interés podría haber ejecutado y impresión a y b con todo otra vez. Así que ahora vamos a hacer esto, asegúrese de no intercambio. Quiero dejar la ventana de terminal de un poco más alto, por lo que podemos ver más de lo mismo al mismo tiempo. Y corre ningún intercambio. x es 1, y es 2. a es 1, b es 2. Y luego, a es 2, b es 1. Así que se está trabajando, al igual que Jess no aquí en el interior del swap. Pero, por supuesto, es que no tiene efecto en las variables en principal. Así que vimos un truco por el cual nos podría solucionar este problema, ¿verdad? Cuando te enfrentas a esta determinación del alcance problema, sólo podía despejar y hacer x e y qué tipo de variables que en su lugar? Usted podría hacerlos global. Póngalos en la parte superior del archivo como lo hicimos, incluso en el juego de 15. Utilizamos una variable global. Pero en el contexto del juego un 15, es razonable tener un mundial variable que representa el tablero, porque la totalidad de 15.c es todo sobre la implementación de ese juego. Eso es lo que existe en el archivo para hacer. Pero en este caso aquí, estoy pidiendo un intercambio de funciones. Quiero intercambiar dos variables. Y debe empezar a sentir sólo descuidado Si la solución a todos nuestros problemas cuando nos topamos con alcance cuestiones es que sea global. Debido a que muy rápidamente nuestro programa es va a convertir en un buen lío. Y lo hicimos con mucha moderación Como resultado, en 15.c Pero resulta que hay una mejor manera por completo. Permítanme realmente volver atrás y borrar la imprimir f de, sólo para simplificar el código. Y permítanme proponer que esto, de hecho, es malo. Pero si en lugar de añadir en algunos asteriscos y las estrellas, Yo en cambio pueden convertir este funcionar en una que es realidad operativa. Así que déjame volver aquí y admito que dice asteriscos es siempre difícil, así que voy a decir las estrellas. Voy a confesar a aquella. Está bien. Y ahora, ¿qué voy hacer en su lugar? Así que en primer lugar, voy a especificar que en lugar de pasar un int en la función de intercambio, estoy en su lugar de ir a decir int estrellas. Ahora, ¿qué indica la estrella? Esta es la noción de un puntero que Binky, el personaje de animación con plastilina, era refiriéndose a un momento anterior. Así que si decimos int estrella, el significado de esto ahora es que no va a ser pasada por su valor. No va a ser copiado pulg Más bien, la dirección de una es va a ser pasado pulg Así que recordar que en el interior de su equipo es un montón de memoria, de lo contrario conocida como RAM. Y que la memoria RAM es sólo un manojo entero de bytes. Así que si tu Mac o tu PC tiene dos gigabytes, tiene 2 miles de millones de bytes de memoria. Ahora vamos a suponer que sólo para mantener las cosas bonitas y ordenadas, que asignar una dirección - un número - a cada byte de RAM en su ordenador. El primer byte de los 2 mil millones es por número cero. El siguiente es el byte número uno, número dos, todo el camino hacia arriba, punto punto punto, a unos 2 millones de dólares. Así que usted puede contar de los bytes de la memoria en su ordenador. Así que vamos a suponer que eso es lo que queremos decir con una dirección. Así que cuando veo una estrella int, ¿qué está pasando para ser pasado a la permuta ahora es el dirección de una. No su valor, pero sea cual sea su postal dirección es, por así decirlo - su ubicación en la RAM. Y lo mismo para b, voy para decir la misma cosa. Int, estrella, b. Como acotación al margen, técnicamente la estrella podría ir en otros lugares. Pero vamos a estandarizar en la estrella de ser justo al lado del tipo de datos. Así firma de intercambio significa que ahora, dame la dirección de un int, y llamada que la dirección a. Y dame otra dirección de una int y llamar a esa dirección b. Pero ahora mi código aquí tiene que cambiar. Porque si yo declaro int temp - que todavía es de tipo int - pero guardo en ella una, qué tipo de valor? Para que quede claro, ¿me estoy poniendo una a con el código como está escrito en este momento? Estoy poniendo la ubicación en un archivo. Pero yo no me preocupo por el lugar, ¿no? Temperatura existe justo tercera taza Jess ' existido, con qué propósito? Para almacenar un valor. Leche o jugo de naranja. No almacenar en realidad la dirección de ninguna de esas cosas, que se siente un poco sin sentido en este verdadero contexto mundial de todos modos. Así que en realidad, de lo que quiero poner en temp no es la dirección de una, pero el contenido de un archivo. Así que si a es un número como 123, este es el byte 123a de memoria que un solo pasa a ser ocupante, de que el valor en una pasa a ser de ocupación. Si quiero ir a esa dirección, Tengo que decir una estrella. Del mismo modo, si tuviera que cambiar lo que está a la dirección un cambio esto para comenzar a. Si quiero almacenar en lo que está en el ubicación a con lo que está en la ubicación en b, b estrella estrella. Así que en resumen, ni siquiera si esto es bastante hundimiento en todo - y yo no esperaría que sería tan rápido - dan cuenta de que todo lo que estoy haciendo es prefijar estas estrellas a mis variables, decir no agarrar los valores. No cambie los valores. Sino más bien, ir a esas direcciones y obtener el valor. Ir a esa dirección y el cambio el valor allí. Así que ahora déjame retroceder hasta la cima, sólo para solucionar esta línea aquí, para cambiar el prototipo de igualar. Pero ahora tengo que hacer una cosa más. Intuitivamente, si he cambiado los tipos de argumentos que está a la espera de intercambio, lo que más necesito para cambiar en mi código? Cuando llamo a swap. Porque en este momento, lo que am Me pasa que cambiar todavía? El valor de x y el valor de y, o la leche y el zumo de naranja. Pero yo no quiero hacer eso. Yo en cambio quiero transmitir en qué? La ubicación de x y la ubicación de y. ¿Cuáles son sus direcciones postales, por así decirlo. Así que para hacer eso, hay un símbolo de unión. Ampersand tipo de sonidos como la dirección. por lo que n, signo, la dirección de x, y la dirección de y. Así que es deliberado que utilizamos los símbolos de unión al llamar a la función, y las estrellas cuando se declara y cuando la aplicación de la función. Y piensa en signo como la dirección del operador, y la estrella que el ir allí operador - o, más correctamente, la operador de eliminación de referencias. Así que eso es un montón de palabras sólo para dicen que ahora, con suerte, de intercambio va que es correcta. Déjenme seguir adelante y hacer - vamos a cambiar el nombre del archivo en realidad, no sea este programa todavía se invoca ninguna de intercambio. Afirmo que lo vamos a llamar swap.c ahora. Así que, de intercambio. Dot, barra, de intercambio. Y ahora de hecho, x es 1, y es 2. Y entonces, x es 2, Y es uno. Bueno vamos a ver si no podemos hacer esto una poco diferente en cuanto a lo que es pasando aquí. En primer lugar, permítanme acercar un nuestro pantalla de dibujo aquí. Y permítanme proponer un momento - y cada vez que dibujo aquí se reflejará hasta ahora - permítanme proponer que aquí hay un montón de memoria o RAM, dentro de mi ordenador. Y este será el número mordedura, digamos, 1. Este será bytes número 2. Y voy a hacer un montón más, y luego un montón de puntos de puntos de puntos de indican que hay 2000 millones de estas cosas. 4, 5, y así sucesivamente. Así están los primeros cinco bytes de la memoria de mi ordenador. ¿De acuerdo? Muy pocos de 2 millones de dólares. Pero ahora voy a proponer el siguiente. Voy a proponer que x va a almacenar el número 1, e y va para almacenar el número 2. Y déjame ir adelante ahora y representa estos valores como sigue. Vamos a hacer esto de la siguiente manera. Dame sólo un segundo. Un segundo. Aceptar. Quiero hacer esto un poco más - vamos a hacer esto de nuevo. De lo contrario voy a utilizar y el mismos números, sin querer, múltiples veces. Así que lo que tenemos diferentes números de qué hablar, vamos a llamar a este byte número 123, 124, 125, 126, y puntos suspensivos. Y permítanme pretendo ahora que voy a poner el valor 1 aquí, y el valor 2 aquí, también conocido como x e y. Así que da la casualidad de que este es x, esta es y. Y sólo por algún azar, la ordenador, el sistema operativo, sucedido a poner en la posición x número 123. Y y terminó en la posición 124 - maldita sea. Debería haber arreglado este. ¡Oh hombre, es lo que realmente quiero hacer esto? Sí, quiero solucionar este problema y b adecuada acerca de esto hoy. Lo sentimos, nuevo en esto. 127, 131, y yo no quiero ser esto complejo, pero ¿por qué se cambia el números ahí? Porque quiero que los enteros a ser en realidad cuatro bytes. Así que vamos a ser muy anal sobre esto. Así que si 1 pasa a ser abordados 123, el 2 va a ser en la dirección 127, ya que son sólo 4 byes de distancia. Eso es todo. Y nos olvidamos de toda la otras direcciones del mundo. Así que x está en la ubicación 123, Y es en la ubicación 127. Y ahora, ¿qué hago en realidad quiere hacer? Cuando llamo intercambio ahora, ¿cuál es realmente está pasando? Bueno, cuando yo llamo swap, que estoy pasando en la dirección de x y la dirección de y. Así, por ejemplo, si estas dos piezas de papel ahora representan los dos argumentos a y b para cambiar, ¿qué soy yo va a escribir en la primera de ellas, que voy a llamar a referirse como un? Exactamente, 123. Así que esta afirmación que es una. Este es el parámetro a. Estoy poniendo la dirección de x en ese país. ¿Qué es eso? ¿Qué es eso? No, no. Eso está bien. Sigue siendo bueno, sigue siendo buena. Así que esta es una. Y ahora en la segunda hoja de papel, esto va a ser b, y lo que estoy va a ser escrito en este pedazo de papel? 127. Así que lo único que ha cambiado desde nuestro relato anterior de esta historia es, en lugar de, literalmente, 1 y 2, que soy va a pasar en el año 123 y 127. Y ahora voy a poner estos en el interior de esta caja de texto, ¿de acuerdo? Así que esa caja negro representa ahora la función de intercambio. Mientras tanto, vamos ahora tienen a alguien implementar la función de intercambio. ¿Podría alguien por aquí gustaría ser voluntario? Vamos arriba. ¿Cómo te llamas? Charlie. Muy bien, Charlie. Vamos arriba. Así que Charlie va a jugar el papel de nuestro cuadro negro. Y Charlie, lo que me gustaría que hicieras ahora está implementar de intercambio de tal manera que, habida cuenta de esas dos direcciones, estuviera realmente va para cambiar los valores. Y te susurre al oído cómo manejar el televisor aquí. Así que adelante, y usted es el cuadro negro. Llegar allí. ¿Qué valores ve usted para una, y qué valores ve usted para b? CHARLIE: una es 123 y b es 127. DAVID MALAN: OK, exactamente. Ahora hay una pausa por un momento. Lo primero que vamos a hacer ahora, de acuerdo con el código - que Ahora voy a tirar en la pantalla - va a ser la de asignar un poco poco de memoria llamada temp. Así que voy a seguir adelante y darle esa memoria. Así que esto va a ser una tercera variable que tiene al alcance de llamaste temp. Y ¿qué vas a escribir en la pieza de temp de papel? CHARLIE: Punteros, ¿verdad? DAVID MALAN: OK, bueno, no necesariamente punteros. De modo que la línea de código que tengo puesto de relieve en el lado derecho, vamos a empezar por ahí. Dice estrella a. Así que un almacena actualmente el número 123. Y sólo intuitivamente, lo que significaba estrellas 123? Pero específicamente, si A es 123, estrella de una significa eso? El valor de a. O de manera más casual, ir allí. Así que permítanme proponer que, continuando con la a en la mano, seguir adelante y tratar de que como si fuera un mapa. Y caminar a ti mismo a la computadora de memoria, y nos encontrar lo que es en la ubicación 123. Exactamente. Así que vemos en la ubicación 123 es lo que, obviamente? OK, entonces ¿qué valor ahora es usted va a poner en la temperatura? Exactamente. Así que adelante y hacer eso. Y escriba el número 1 en la pieza de papel que está actualmente titula temp. Y ahora el siguiente paso que usted va a poner en práctica va a ser lo. Pues bien, en el lado derecho de la siguiente línea de código es la estrella b. b, de Por supuesto, almacena una dirección. Que se ocupa de 127. Estrella b significa qué, casualmente hablando? Ir a esa ubicación. Así que adelante y nos encontrar lo que es en la ubicación 127. Aceptar. Por supuesto, en la ubicación 127, sigue siendo el valor de 2. Entonces, ¿qué vas ahora almacenar a lo es en el lugar en una? Así que protagonizan un medio vaya a la ubicación a. ¿Cuál es la ubicación de una? Exactamente. Así que ahora, si usted quiere cambiar lo que hay en ese lugar - Voy a seguir adelante y corro el borrador está aquí. Y ahora poner de nuevo en el cepillo. ¿A qué número vas a escribir en ese cuadro en blanco ahora? Exactamente. Así que esta línea de código, que quede claro - deje me detengo lo que Charlie está haciendo y señalar aquí, lo que acaba de hacer es escribir en esa caja en la posición 123 el valor que estaba previamente en b. Y por lo que hemos hecho ahora implementamos esta segunda línea de código. Ahora, por desgracia, no hay sigue una línea restante. Ahora lo que está en la temperatura, literalmente? Es obvio que es el número uno. Eso no es una dirección. Es sólo un número, tipo de una variable de una semana. Y ahora, cuando usted dice la estrella b, que los medios ir a la dirección B, que es de curso aquí. Así que una vez que estás allí - Voy a seguir adelante y borrar lo que en realidad es allí - y lo que eres voy a escribir ahora en el lugar 127? CHARLIE: Temp, que es uno. DAVID MALAN: Temp, que es uno. ¿Y qué pasa con la temperatura en el final? Bueno, no lo sabemos. En realidad no importa. Cada vez que hemos implementado una función hasta el momento, cualquier variable local que tiene son, en efecto local. Y simplemente desaparecen. Están reclamados por el operativo sistema con el tiempo. Así que el hecho de que la temperatura todavía tiene la valor 1 es algo fundamentalmente poco interesante para nosotros. Muy bien, así que un aplauso si lo que pudimos por Charlie. Muy bien hecho. Muy bien, así que ¿qué más hace Significa esto que podemos hacer? Así que resulta que hemos sido diciendo algunas mentiras blancas desde hace bastante tiempo. De hecho, resulta que una cadena, todo este tiempo, no es realmente una secuencia de caracteres por se. En cierto modo es que intuitivamente. Pero técnicamente hablando, cadena es una tipo de datos que declaramos en el interior de la biblioteca CS50 para simplificar el mundo durante las primeras semanas de clase. Lo que realmente es una cadena es la dirección de un carácter en algún lugar de la memoria RAM. Una cadena es realmente un número, como 123 o 127, que pasa a delimitar donde una cadena comienza en la memoria del equipo. Pero no representa la cadena, de por sí, sí. Y podemos ver esto como sigue. Déjame ir por delante, ya abrir algo de código que está entre ejemplos de código fuente de la actualidad. Y yo voy a seguir adelante y abrir hasta, digamos, compare-0.C. Este es un programa con errores que se va para ser implementado de la siguiente manera. En primer lugar. Voy a decir algo. Entonces voy a seguir adelante y obtener una cadena del usuario en esa línea siguiente. Entonces voy a decirlo de nuevo. Entonces me voy a conseguir otro cadena del usuario. Y fíjense, estoy mostrando una de las cadenas en una variable llamada s, y otra de estas cadenas en una variable llamada t. Y ahora voy a reclamar, muy razonablemente, que si s es igual a es igual a T, las cadenas son iguales. Usted escribe lo mismo. Si no, las cadenas son No es lo mismo. Después de todo, si nosotros, de entrada dos enteros, dos caracteres, dos carrozas, dos dobles, cualquiera de los tipos de datos de las que hemos hablado hasta el momento de compararlos - Recordamos que hicimos muy claro hace un tiempo que usted no hace esto, porque un único signo de igualdad es, por supuesto, el operador de asignación. Así que eso sería un error. Usamos el signo igual igual, que de hecho se compara cosas para la verdadera igualdad. Pero afirmo esto está libre de errores. Si sigo adelante y hacer comparación de cero, y luego hacer slash dot comparar cero. Y escribo en, digamos, hola. Y luego vamos a decir hola de nuevo. Literalmente lo mismo, el ordenador reclamaciones pasé a máquina diferentes cosas. Ahora tal vez yo escrito mal algo. Yo escribo mi nombre en esta ocasión. Quiero decir, hola. Hola. Es diferente cada vez. Bueno, ¿por qué es eso? ¿Qué está pasando en realidad debajo de la capucha? Bueno, ¿qué está pasando en realidad por debajo la campana es la cadena a continuación He escrito en esa primera vez, por ejemplo, es la palabra hola, por supuesto. Pero si representamos esta debajo el capó, recordemos que una cadena está en una matriz. Y hemos dicho tanto en el pasado. Así que si me baso esa matriz como esta, estoy va a representar algo muy similar a lo que hicimos hace un momento. Y de hecho hay algo aquí especial, también. ¿Qué fue lo que determinamos fue en Al final de cada cadena? Sí, esta barra invertida cero, que es sólo la forma de representar, literalmente, 00 millones. Ocho 0 bits en una fila. No sé, francamente, lo que es después de esto. Eso es sólo un montón más memoria RAM dentro de mi ordenador. Pero esto es una matriz. Hablamos acerca de las matrices antes. Y por lo general hablamos de arrays como posición cero, entonces uno, luego dos. Pero eso es sólo por conveniencia. Y eso es totalmente relativa. Cuando usted está consiguiendo realmente la memoria de la computadora, que es, por supuesto, cualquier 2000000000 algunos bytes impares, potencialmente. Así que en realidad debajo de la capucha, todo este tiempo, sí. Esto podría muy bien ser soporte de cero. Pero si usted cava más profundo debajo el capó, que es realmente abordar número 123. Esta es la dirección 124. Esta es la dirección 125. Y no me equivoco este momento. Estos son ahora uno bytes además por qué razón? ¿Qué tan grande es un char? Un char es sólo un byte. Un int es típicamente cuatro bytes. Así que por eso lo hice 123, 127, 131 y así sucesivamente. Ahora puedo mantener la matemática más simple y simplemente lo hacen más 1. Y esto es ahora lo que realmente está pasando de debajo del capó. Así que cuando se declara algo como esto, cadena s, esto es en realidad - resulta - estrellas caracteres. Estrellas, por supuesto, significa dirección, puntero aka. Así que es la dirección de algo. ¿Qué es la dirección de? Bueno - Soy el único que puede ver el punto importante que estoy haciendo, o pensar Estoy haciendo. Así cadena - lo triste es que tengo un monitor justo ahí donde me podría haber visto eso. Muy bien, así que la cadena s es lo que Declaré anteriormente. Pero resulta que, gracias a un poco de magia en la biblioteca CS50, todo esto cadena de tiempo, literalmente, tiene sido estrellas caracteres. La estrella significa de nuevo puntero o dirección. El hecho de que esté flanqueando el palabra caracteres significa que es la dirección de un personaje. Así que si la cadena get se llama, y ​​escriba en H-E-L-L-O, propone ahora lo ha llegar literalmente cadena estado volviendo todos esta vez, a pesar de que he lugar simplificada del mundo? ¿Qué quiere conseguir realmente cadena volver como su valor de retorno? 123, en este caso, por ejemplo. Hemos dicho anteriormente que la cadena get simplemente devuelve una cadena, una secuencia de personajes. Pero eso es un poco de una mentira piadosa. La forma de cadena get realmente funciona debajo de la capucha es crear una cadena del usuario. Se deja caer los personajes que él o ella los tipos de memoria. Pone una barra invertida a cero al final de las secuencia de caracteres. Pero entonces, ¿qué pone cadena literalmente, volver? Es, literalmente, devuelve la dirección de la muy primeros bytes en la RAM que se utiliza para que la fuerza. Y resulta que sólo mediante la devolución de una única dirección de la primer carácter de la cadena, que es suficiente para la búsqueda de la totalidad de los la cadena. En otras palabras, obtener cadena no tiene para volver 123 y 124 y 125. No tiene que darme un largo lista de todos los bytes que mi cadena está utilizando. Porque uno, todos están espalda con espalda. Y dos, basado en la primera dirección, me puede averiguar dónde termina la cadena. ¿Cómo? El carácter especial nulo, el barra invertida cero al final. Así, en otras palabras, si se pasa alrededor de - dentro de las variables - la dirección de un char, y usted asume que al final de cualquier cadena, cualquier secuencia de caracteres como los humanos pensar en las cadenas, si se asume que al final de dicha cadena hay una barra invertida cero, eres de oro. Porque siempre se puede encontrar el final de una cadena. Ahora lo que realmente está pasando luego en este programa? ¿Por qué es este programa, comparar-0.C, con errores? Lo que en realidad se está comparando? ¿Sí? ESTUDIANTE: [inaudible]. DAVID MALAN: Exactamente. Es la comparación de los lugares de las cadenas. Así que si el usuario ha escrito en hola una vez, como yo lo hice, la memoria podría terminar con este aspecto. Si el usuario entonces los tipos de hola de nuevo, pero llamando cadena get nuevo, c es no particularmente inteligente a menos que usted enseña que sea inteligente escribiendo código. C - y ordenadores, más en general - si escribe en la palabra hola de nuevo, ya sabes lo que vas a obtener. No eres más que va a obtener una segunda matriz de memoria que, sí, sucede ser almacenar H-E-L-L-O y así sucesivamente. Va a tener el mismo aspecto que nosotros los seres humanos, pero esta dirección podría no ser 123. Sólo podría ocurrir que la sistema operativo cuenta con algunos de espacio, por ejemplo, en la ubicación - digamos algo arbitraria, como esto es la ubicación 200. Y esta es la ubicación 201. Y esta es la ubicación 202. No tenemos ni idea de dónde es va a estar en la memoria. Pero lo que esto significa es que lo que es va a ser almacenado en última instancia, en s? El número 123. ¿Qué va a ser almacenado en t, en este ejemplo arbitraria? El número 200. Y todo lo que significa es, entonces, obviamente, 123 no es igual a 200. Y así, esta condición nunca si evalúa en true. Debido cadena get utiliza diferentes trozos de memoria cada vez. Ahora podemos ver esto otra vez en otro ejemplo. Déjame ir adelante y abro copy-0.C. Sostengo que este ejemplo se va a probar - pero fallan - para copiar dos cadenas de la siguiente manera. Voy a decir algo para el usuario. Entonces voy a conseguir un cadena y llamarlo s. Y ahora, estoy haciendo este cheque aquí. Contamos esto hace un tiempo. Pero cuando puede ser que consiga cadena de retorno nulo, otro carácter especial, o especial símbolo digamos. Si está fuera de la memoria. Por ejemplo, si el usuario es realmente siendo difícil y los tipos de una atroz número de caracteres en el teclado y accesos Intro. Si ese número de caracteres no puede caber en la RAM para lo loco razón, también conseguir poderío cadena muy bien devolver null. O si su programa en sí está haciendo mucho de otras cosas y no sólo No hay suficiente memoria para la cadena get Para tener éxito, podría terminar volviendo nulo. Pero seamos más precisos en cuanto a lo que es esto. ¿Qué es el tipo de datos de s realmente? Estrella de Char. Así que resulta que ahora podemos pelar copias de la capa de null. Resulta, nula es - sí, obviamente, un símbolo especial. Pero, ¿qué es realmente? Realmente, nula es sólo un símbolo que los seres humanos utilizan para representar cero también. Así que los autores de C, y las computadoras más en general, decidió hace años que, ya sabes qué. ¿Por qué no nos aseguramos de que ningún usuario datos es nunca, nunca, nunca almacenado a bye cero? De hecho, incluso en mi ejemplo arbitrario antes, no empecé la numeración bytes en cero. Empecé en una. Porque sabía que la gente en el mundo han decidido reservar el cero byte en la memoria RAM de nadie como algo especial. La razón es que en cualquier momento que quieran señal de que algo ha ido mal respecto de las direcciones, que regresó nula - también conocida como cero - y porque usted sabe que no hay es datos de fiar en la dirección cero, claramente eso significa un error. Y es por eso que, por convención, comprobamos algo nulo y regreso como uno de esos casos. Así que si nos desplazamos hacia abajo ahora, esto es sólo a continuación, algunos de comprobación de errores, por si acaso algo salió mal con [? rescatar?] en conjunto y salir del programa devolviendo temprana. Esta línea ahora podría reescribirse ya que esto, lo que significa qué? Por el lado de la mano izquierda, dame otro puntero a un carácter, y lo llaman t. ¿Qué estoy almacenando dentro de t, en base en esta línea de código? Estoy almacenando una ubicación. Específicamente la ubicación eso fue en s. Así que si el usuario ha escrito en hola, y ese primer hola sucede a terminar aquí, a continuación, el número 123 es va a volver desde get cadena y ser almacenado - como hemos dicho antes - en s. Cuando ahora me declaro otro puntero a un char y llamarlo t, ¿qué número es literalmente, va a terminar en t de acuerdo a la historia? Así 123. Así que técnicamente ahora ambos s y t están apuntando a la exacta mismos trozos de memoria. Así cuenta de lo que voy a hacer ahora para demostrar que este programa está libre de errores. Primero voy a reclamar, con una f impresión, capitalizando la copia de la cadena. Entonces me voy a hacer un poco de la comprobación de errores. Voy a estar seguro. Vamos a asegurarnos de que la cadena de t está en menos mayor que cero en longitud, así que hay un poco de carácter no para capitalizar en realidad. Y entonces usted puede ser que recuerde este de los ejemplos anteriores. 2 superior - que se encuentra en el archivo ctype.h. T abrazadera cero me da el cero carácter de la cadena de t. Y 2 superior de ese mismo valor, de Por supuesto, la convierte a mayúsculas. Así que de manera intuitiva, esto pone de relieve la línea del código está en mayúscula la primera carta en la t. Pero no es la capitalización, de manera intuitiva, la primera letra s. Pero si usted está pensando en el futuro, ¿qué soy yo a punto de ver cuando ejecuto este programa e imprimir tanto el original, s, y la copia de la llamada, t? Están en realidad va a ser el mismo. ¿Y por qué van a ser los mismos? Los dos están señalando exactamente lo mismo. Así que vamos a hacer esto. Hacer copia cero. Compila Aceptar. Déjame correr copia cero. Permítanme escribo algo como hola en todo en minúscula y luego pulse Enter. Y sostiene que tanto los s originales y la copia son de hecho idénticos. Así que lo que realmente ha pasado aquí? Permítanme volver a dibujar la imagen sólo para contar la historia de una ligeramente diferente manera. ¿Qué está pasando en realidad por debajo de la campana cuando yo declaro algo así como carácter de inicio s, o una cadena s, Me estoy haciendo un puntero - que pasa a ser de cuatro bytes en el aparato CS50 y en una gran cantidad de computadoras. Y yo voy a llamar a este s. Y esto tiene en la actualidad algún valor desconocido. Cuando se declara una variable, a menos que usted mismo poner un valor allí, que sabe lo que hay. Podría ser una secuencia aleatoria de bits de la ejecución anterior. Así que cuando yo, en mi línea de código lo entiendo cadena y, a continuación, almacenar el retorno valor en s get string de alguna manera - y vamos finalmente pelar cómo llegar obras de cuerda, de alguna manera asigna un matriz que probablemente se ve un poco como esto. H-E-L-L-O, la barra invertida cero. Vamos a suponer que esta es la dirección 123 acaba primero consistencia. Así que los retornos de la secuencia, en el línea resaltada existe, devuelve el número dijimos, 123. Así que lo que realmente sucede en el interior de s aquí? Bueno, lo que realmente sucede interior de s es 123. Pero, francamente, me estoy poniendo un poco confundido por todas estas direcciones, todos estos números arbitrarios. 123, 124, 127. Así que vamos a realmente simplificar el mundo un poco. Cuando hablamos de los punteros, francamente, a nosotros los seres humanos, a quién le importa dónde diablos las cosas están en la memoria? Eso es completamente arbitraria. Esto va a depender de cómo cantidad de RAM que el usuario tiene. Esto va a depender del momento en el día de ejecutar el programa, tal vez, y lo que introduce el usuario le da. Estamos detenerse en detalles sin importancia. Así que vamos a abstraer y decir que, cuando se ejecuta una línea de código como este, estrella de caracteres s consigue el retorno valor de la cadena de obtención. ¿Por qué no en lugar de simplemente dibujamos lo que seguir llamando a un puntero como si fuera que apunta a algo? Así que yo pretendo ahora que s hasta hay un puntero - debajo de la capucha es una dirección. Pero es sólo apunta a el primer byte en el cadena que se ha devuelto. Si ahora vuelvo al código aquí, ¿qué está pasando en esta línea? Bueno, en esta línea destacó hoy, Estoy declarando al parecer otra variable llamada t. Pero también es un puntero, así que voy dibujarlo como, en teoría, la exacta mismo cuadro de tamaño. Y yo voy a llamarlo t. Y ahora, si nos remontamos al código de nuevo, cuando guardo s dentro de t, ¿qué soy técnicamente poner dentro de t? Bueno, técnicamente, este fue el número 123. Así que en realidad yo debería estar escribiendo el número 123 allí. Pero vamos a tomar el nivel más alto. t, si es sólo un puntero, intuitivamente, es precisamente eso. Eso es todo lo que ha de ser almacenada allí. Así que ahora en las últimas líneas interesantes del Código, cuando en realidad voy sobre capitalizando el carácter cero en t, lo que está pasando? Bueno, t bracket cero ahora apunta a qué personaje, presumiblemente? Está señalando h. Porque t bracket cero - recuerda, esta es la sintaxis de edad. t soporte cero simplemente significa que si t es una cadena, t soporte de cero significa conseguir el cero carácter en que la fuerza. Así que lo que realmente significa es ir a esta matriz - y sí, esto podría ser 123, esto podría ser 124. Pero todo es relativo, recuerda. Siempre hablando de una matriz, tenemos la ventaja de hablar de índices relativos. Y así que ahora sólo podemos suponer que t soporte de cero es h. Así que si yo llamo 2 superior en él, lo que es haciendo realmente está aprovechando la h minúscula a mayúscula H. Pero, por supuesto, lo que es s? Se apunta a la misma cadena maldita. Así que esto es todo lo que está ocurriendo en este código hasta ahora. ¿Cuál es entonces la implicación? ¿Cómo podemos solucionar estos dos problemas? ¿Cómo nos comparamos con cuerdas reales? Bueno intuitivamente, ¿cómo vas sobre la comparación de dos cadenas para la igualdad real? ¿Qué significa si dos cadenas son iguales? Es evidente que no es que sus direcciones son igual en la memoria, porque eso es un bajo detalle de implementación de nivel. Todos los personajes son los mismos. Así que permítanme proponer, y permítanme presentarles en la versión uno de compare.c aquí, así que compare-1.c. Permítanme proponer que todavía conseguimos un puntero llamado s, y almacenar en ella la valor de cadena get volver. Vamos a hacer lo mismo con t. Así que nada de que el código es diferente. Voy a añadir un poco de más la comprobación de errores ahora. Así que ahora que estamos especie de pelar este capas en CS50 de lo que una cadena en realidad es, que tenemos que ser más anal trata de asegurarse de que no abusamos valores no válidos como nulo. Así que sólo voy a comprobar. Si s no es igual a nula y t no lo hace igual nula, eso significa que estamos bien. Obtenga cadena no meter la pata conseguir cualquiera de esas cadenas. Y usted puede quizás adivinar ahora, qué Qué STR CMP presumiblemente hacer? Cadena comparar. Así que si no tienes el programa en java antes, esto es como el método es igual en el clase string. Pero para aquellos de ustedes que no tienen programada antes, esto es sólo una función de c. Le pasa a venir en una archivo llamado string.h. Ahí es donde está declarado. Y string comparar - De hecho, me olvidaré de su uso, pero eso no importa. Recordemos que podemos hacer hombre, revuelva comparar. Y esto va a abrir el Linux manual de programadores. Y es, francamente, un poco críptico. Pero puedo ver que aquí, sí. Tengo que incluir string.h. Y aquí dice en la descripción, "el función de comparación de cadena compara las dos cadenas S1 y S2 y S1. " y S2 son aparentemente las dos argumentos pasados ​​pulg Yo no me acuerdo de lo que const es, pero ahora cuenta - y es posible que haya visto ya esto cuando has utiliza las páginas de manual si tenerlo todo - esa estrella char es simplemente sinónimo de con una cuerda. Por lo tanto, compara las dos cadenas, S1 y S2, y que devuelve un entero menor que o igual a o mayor que cero si se encuentra S1, respectivamente, para ser menor que, o el partido, o ser mayor que S2. Eso es sólo una forma muy compleja de decir esa cadena comparación de rentabilidad cero si dos cadenas son intuitivamente idéntica, carácter para carácter a carácter. Se devuelve un número negativo si s, por orden alfabético, se supone venir antes de t. O devuelve un número positivo si s se supone que vendrá después de t alfabéticamente. Así, con esta simple función, podría que, por ejemplo, ordenar una manojo entero de las palabras? Así que en esta nueva versión, voy para seguir adelante y hacer Comparación1. Dot slash comparar uno. Te escribo en hola en minúsculas. Voy a escribir hola en minúsculas nuevo. Y por suerte ahora se da cuenta de He escrito lo mismo. Mientras tanto, si escribo en hola en menor HOLA caso y en mayúsculas y compararlos, escribí cosas diferentes. Debido a que no sólo son las direcciones diferente, pero estamos comparando diferentes personajes una y otra vez. Bueno, vamos a ir a arreglar una otro problema ahora. Permítanme abro versión uno de copia, que ahora las direcciones este problema de la siguiente manera. Y ésta va a ver un poco más complejo. Pero si se piensa en qué problema nos necesidad de resolver, espero que esto será borrar en un momento ahora. Así que esta primera línea, el carácter de inicio t, en términos sencillos podría alguien proponer lo que esta línea significa aquí? Carácter estrella t, lo que es que hacer? Bueno. Crear un puntero a alguna detectar en la memoria. Y déjame perfeccionarlo un poco. Declare una variable que almacenará la Dirección de algunos caracteres en la memoria, sólo a ser un poco más adecuada. OK, así que ahora en el lado derecho, no tengo nunca había visto una de estas funciones antes, malloc. Pero, ¿qué podría significar eso? Asignación de memoria. La asignación de memoria. Así resulta que, hasta ahora, hemos realmente no han tenido una poderosa manera de pidiendo el sistema operativo, dame un poco de memoria. Más bien, ahora tenemos una función llamada malloc que hace exactamente eso. A pesar de que esto es un poco de un distracción en este momento, observe que en entre los dos paréntesis es sólo va a ser un número. Donde he escrito en cuestión marcas pueden ser un número. Y ese número significa, dame 10 bytes. Dame 20 bytes. Dame 100 bytes. Y malloc hará todo lo posible para pedir al sistema operativo - Linux, en este caso - bueno, son sus 100 bytes de RAM disponible? Si es así, devolver esos bytes a mí por devuelve la dirección de la cual de esos bytes, tal vez? El primero de todos. Así que aquí también - y esto es predominante en C, en cualquier momento que estés tratar con direcciones? Ya casi siempre se trata de la primero como la dirección, no importa lo grande un trozo de memoria que está siendo devuelto, por así decirlo. Así que vamos a bucear aquí. Estoy tratando de asignar la forma muchos bytes, exactamente? Bueno. Longitud de la secuencia de s - vamos a hacer un ejemplo concreto. Si s es hola, H-E-L-L-O, lo que es la longitud de la cadena de s, obviamente? Así que es de cinco años. Pero yo estoy haciendo un punto a favor 1 en eso, ¿por qué? ¿Por qué quiero seis bytes en lugar de cinco? El carácter nulo. No quiero dejar fuera de este carácter especial nulo. Porque si hago una copia de Hola y acaba de hacer H-E-L-L-O, pero no pongo ese carácter especial, el equipo puede que no tenga, por casualidad, una barra invertida cero allí para mí. Y por lo que si estoy tratando de averiguar la La longitud de la copia, yo podría pensar que es 20 caracteres de largo, o un millón caracteres de largo si nunca se me ocurre para golpear un cero barra invertida. Así que necesitamos seis bytes para almacenar H-E-L-L-O, la barra invertida cero. Y entonces esto es sólo que ser super anal. Supongamos que se me olvida lo que el tamaño de un char es. Seguimos diciendo que es un byte. Y por lo general es. En teoría, podría ser algo diferente, en un Mac diferente o una diferentes PC. Así que resulta que hay este operador llamado sizeof que si se le pasa la nombre de un tipo de datos - como char, o int o float - que le dirá, dinámicamente, ¿cuántos bytes de un char ocupa en este en particular del equipo. Así que esto es efectivamente sólo como veces diciendo 1 o veces nada en absoluto. Pero lo estoy haciendo para estar súper anal, que sólo en caso de una diferencia carac en su equipo frente a la mía, de esta manera las matemáticas siempre va a la salida. Por último, aquí puedo comprobar nulo, que es siempre una buena práctica - de nuevo, cualquier momento que estamos tratando con punteros. Si malloc no era capaz de dar me seis byes - que es poco probable, pero por si acaso - volver inmediatamente. Y ahora, adelante y copiar la cadena como sigue. Y esta es la sintaxis familiar, aunque en un rol diferente. Voy a seguir adelante y obtener la cadena longitud s y almacenarlo en el n. Entonces voy a repetir de i es igual a cero hasta e incluyendo N, mayor que o igual a. Así que en cada iteración, pongo el carácter i de s en el ith carácter de t. Así que lo que realmente está pasando debajo el capó aquí? Bueno, si este, por ejemplo, es s - y he escrito en la palabra H-E-L-L-O y hay una barra invertida cero. Y de nuevo, esto es s apuntando aquí. Y aquí ahora es t. Y esto está apuntando ahora a una copia de la memoria, ¿no? Malloc me ha dado en su conjunto trozo de memoria. No sé lo que es un principio en cualquiera de estas ubicaciones. Así que voy a pensar en ellos como un montón de signos de interrogación. Pero tan pronto como me pongo en bucle de cero en un máximo a través de la longitud de s, t soporte de cero y t soporte de 1 - y voy a poner esto ahora en la cabeza - t soporte de cero y s soporte de media cero que yo voy a copiar iterativa h aquí, E-L-L-O. Además, como lo hice el signo más 1, la barra invertida cero. Así que ahora en el caso de-1.c comparar, al final, si imprimo la capitalización de t, debemos ver que s no ha cambiado. Déjame ir adelante ahora y hago esto. Así que copy1. Dot slash copy1. Voy a escribir hola, Intro. Y ahora fíjense, sólo la copia se ha capitalizado. Porque yo realmente tengo dos trozos de memoria. Desafortunadamente, usted puede hacer algo bonito las cosas malas y muy peligroso aquí. Déjame sacar hasta un ejemplo ahora aquí, eso nos da un ejemplo de unos pocos diferentes líneas. Por lo que sólo intuitivamente aquí, la primera línea de código, int x estrella, está declarando una variable llamada x. ¿Y cuál es el tipo de datos de esa variable? ¿Cuál es el tipo de datos de esta variable? Ese no fue el melodrama. El tipo de datos es int estrellas. Entonces, ¿qué significa eso? x voluntad almacenar la dirección de un int. Tan simple como eso. Y se va a almacenar el dirección de un int. ¿Cuál es la tercera línea de código haciendo allí? Se asignación de cuántos bytes, más probable? Cuatro. Debido al tamaño de un int es generalmente cuatro, malloc de cuatro da me apoyaré la dirección de un trozo de memoria, el primero de cuyos bytes es almacenado ahora en x. Ahora nos estamos moviendo un poco rápido. Estrella x significa qué? Significa ir a esa dirección y poner lo que el número allí? Ponga el número 42 allí. Medio alguno de estrellas van a lo que es en y y poner el número 13 allí. Pero espere un minuto. Lo que está en y en este momento? ¿Qué dirección es y almacenamiento? No lo sabemos, ¿verdad? Nunca una vez hayamos utilizar la asignación operador que implica y. 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 signo de interrogación por así decirlo. Podría estar apuntando al azar a cualquier cosa en la memoria, que es generalmente malo. Así que tan pronto como llegamos a esa línea existe, estrella y es igual a 13, algo malo, algo muy malo está a punto a pasar a Binky. Así que vamos a ver lo que va a acabar pasando a Binky aquí en este minuto o así que busca. [REPRODUCCIÓN DE VÍDEO] -Hey, Binky. Despierta. Es tiempo para la diversión puntero. ¿Qué es eso? Entérese de los punteros? Oh, qué bien. -Bueno, para empezar, creo que estamos Va a necesitar un par de punteros. -OK. Este código asigna dos punteros que puede apuntar a números enteros. -OK, bueno, veo los dos punteros. Pero ellos no parecen ser apuntando a nada. -Eso es correcto. Inicialmente, los punteros no lo hacen apuntar a nada. Las cosas que apuntan son llamados pointees, y que fueron creados es una etapa separada. -Oh, claro, claro. Lo sabía. Los pointees están separados. Entonces, ¿cómo se asigna un pointee? -OK. Bueno, el código asigna una nueva enteros pointee, y esta parte se presentan x para que apunte a él. -Oye, que se ve mejor. Así que haga algo. -OK. Voy a eliminar la referencia al puntero x para almacenar el número 42 en su pointee. Para este truco, necesitaré mi magia varita de eliminación de referencias. -Tu varita mágica de la eliminación de referencias? Uh, eso es genial. -Esto es lo que el código se parece. Voy a configurar el número, y - -Oye, mira. Ahí va. Así que haciendo un dereference en X sigue la flecha para acceder a su pointee. En este caso, para almacenar 42 allí. Hey, trata de usarlo para almacenar el número 13 a través del otro puntero, y. -OK. Voy a ir por aquí ayy conseguir el número 13 para este compromiso. Y luego tomar la varita de eliminación de referencias y justo - Whoa! -Oh, hey. Eso no funcionó. Digamos, Binky, yo no creo que el eliminación de referencias y es una buena idea, porque la creación de la pointee es un paso separado. Y yo no creo que nunca lo hicimos. -Hmm. Buen punto. -Sí, hemos destinado el puntero y. Pero nunca nos pusimos a apuntar a una pointee. -Hmm. Muy observador. -Oye, que está buscando bueno allí, Binky. ¿Puedes arreglarlo de manera que los puntos de Y a la misma pointee cuando x? -Por supuesto. Voy a usar mi varita mágica de la asignación de puntero. -Es que va a ser un problema como antes? -No. Esto no toca los pointees. Sólo cambia un puntero para señalar a la misma cosa que otra. -Oh, ya veo. Ahora y apunta al mismo lugar que x. Así que esperar. Ahora y se fija. Tiene una pointee. Así que usted puede probar la varita de eliminación de referencias de nuevo para enviar el 13 de nuevo. -OK. Aquí va. -Oye, mira eso. Ahora dereferencing obras en y. Y debido a que los punteros están compartiendo que uno pointee, se tanto ver el 13. -Sí. Compartiendo. Lo que sea. Así que vamos cambiar lugares ahora? -Oh, mira. Estamos fuera de tiempo. -Pero - -Sólo recuerda los tres normas puntero. Número uno, la estructura básica es que usted tiene un puntero. Y apunta a una pointee. Pero el puntero y pointee están separados. Y el error común es establecer un puntero, pero a olvide dado un pointee. Número dos, comienza referencia de puntero en el puntero y sigue su flecha para acceder a su pointee. Como todos sabemos, esto sólo funciona si hay es un pointee, que vuelve a la regla número uno. Número tres, la asignación de puntero toma un puntero y cambios para que apunte a la misma pointee como otro puntero. Así que después de la cesión, los dos punteros apuntar a la misma pointee. A veces eso se llama compartir. Y eso es todo lo que hay que hacer, de verdad. Bye bye ahora. [VIDEO PLAYBACK FIN] DAVID MALAN: Así que más de los punteros, más en Binky próxima semana. Nos vemos el lunes.