>> [REPRODUCCIÓN DE MÚSICA]
DAVID J. MALAN: Muy bien.
Esto es CS50, y esto es el fin de semana cuatro.
Y uno de los temas hoy es el de la ciencia forense digital,
el arte de la recuperación de la información.
Y, en efecto, a pesar de que usted está en el medio
en estos momentos de la Paz en Tres y Breakout, la próxima semana,
la atención se centrará en precisamente este dominio.
>> Así que uno de los trabajos más maravillosos que jamás tenía estaba de vuelta en la escuela de posgrado,
cuando trabajaba para el local de Middlesex County District Attorney de
oficina, haciendo los forenses trabajan.
Así que, esencialmente, el Massachusetts Policía del Estado, en ocasiones,
cuando se trabaja en los casos haría traer cosas como discos duros
y disquetes y tarjetas de memoria y similares.
Y se les entregara para mí y mi mentor,
y nuestro objetivo era encontrar pruebas, si había alguna, en estos medios.
Atisbos Ahora, es posible que haya visto de este mundo de la ciencia forense
en los medios de comunicación, la televisión y las películas.
Pero el trabajo que tenía, y atrevería a decir que ese mundo,
no es bastante como usted verá.
Echemos un vistazo a lo que lo que has visto.
[REPRODUCCIÓN DE VÍDEO]
-OK.
Ahora, vamos a obtener un buen vistazo.
>> [REPRODUCCIÓN DE MÚSICA]
>> -Mantenga Ella.
Corre que volver.
>> Espera un minuto.
Ir a la derecha.
-Hay.
Congele eso.
De pantalla Full.
>> -OK.
Congele eso.
Endurecerá hasta en eso, ¿verdad?
>> -vector En el que chico por la rueda trasera.
>> -zoom En aquí en este lugar.
>> -Con El equipo adecuado, la imagen se puede ampliar y afilada.
>> ¿Qué es eso?
>> -Es Un programa de mejora.
>> -¿Puedes Claro que cualquier?
>> -No Sé.
Vamos a mejorarlo.
>> -Mejorar Sección A6.
Aumenté el detalle, y--
-Creo Hay suficiente para mejorar.
Suelte a mi pantalla.
>> -I Mejoró la reflexión en su ojo.
-Vamos Ejecutar esto a través de mejora de vídeo.
>> -Edgar, Puedes mejorar esto?
>> -hang Sucesivamente.
>> -Llevo Trabajando en esta reflexión.
>> Reflexión de alguien -Hay.
>> -Reflexión.
-Hay Un reflejo de la cara del hombre.
>> Reflexión -El!
-Hay Una reflexión.
-zoom En el espejo.
Se puede ver un reflejo.
>> -CAN A mejorar la imagen de aquí?
-CAN A potenciarlo?
-¿Podemos Mejoramos esto?
-CAN A potenciarlo?
-Mantenga En un segundo.
Voy a Mejorar.
-zoom En la puerta.
-veces 10.
-Zoom.
-Mover En.
-Más.
Espera, detente.
-Stop.
-PAUSE Ella.
Nos -Girar 75 grados alrededor de la vertical, por favor.
>> -Stop.
Volver a la parte sobre la puerta de nuevo.
>> -Consiguió Una mejora de imagen de mapa de bits que pueden?
>> -Quizá Podemos utilizar el Pradeep Singh método para ver por las ventanas.
>> -El Software es estado de la técnica.
>> -El Valor propio está apagado.
>> -Con La derecha combinación de algorithms--
>> Iluminación llevado de -Él algoritmos para el siguiente nivel,
y puedo utilizarlos para mejorar esta fotografía.
>> -lock En agrandar y el eje z.
>> -Mejorar.
Mejorar.
-Mejorar.
-Freeze Y mejorar.
[FIN REPRODUCCIÓN DE VÍDEO]
DAVID J. MALAN: Así que estos son todas las palabras, pero no eran
usado en oraciones correctamente.
Y de hecho, en el futuro, en cualquier momento, por favor, escuche a alguien decir la palabra,
"Mejorar" risa un poco.
Porque cuando se trata de mejorar, por ejemplo, esto es lo que sucede.
>> Así que aquí está una foto magnífica.
Esto es propio de Daven CS50.
Y suponemos que queríamos centrarse en el brillo en sus ojos,
o el reflejo de la malo que era claramente
capturado por la cámara de seguridad.
Esto es lo que ocurre cuando hacer zoom en una imagen que
tiene sólo un número finito de bits asociados.
>> Eso es lo que puedes conseguir.
Y, en efecto, en el ojo de Daven no es más que cuatro, tal vez seis píxeles
que componen exactamente lo estaba brillando allí.
Así de problemas Cuatro tendrá en última instancia explorar este mundo, en particular
por la naturaleza de algo que llamamos archivo i / o, en su
I / O es sólo una forma elegante de diciendo de entrada y salida.
>> Así hasta el momento, todas las interacciones que hemos tenido con una computadora
han sido en gran parte con su teclado y la pantalla,
pero no tanto con el disco duro, o el ahorro de los archivos más allá de los que
mismo escribe.
Sus programas hasta ahora tienen no estado creando, y el ahorro,
y la actualización de sus propios archivos.
>> Bueno, ¿qué es un archivo?
Bueno, algo así como un archivo JPEG.
Esta es una imagen que te pueden tener o subir a Facebook,
o ver cualquier parte de la web.
De hecho, esa foto que acabamos de sierra de Daven era un JPEG.
Y lo que es interesante acerca de los archivos, como los archivos JPEG
es que pueden ser identificadas, típicamente, mediante ciertos patrones de bits.
>> En otras palabras, ¿qué es lo que distingue a un JPEG desde un GIF
desde un PING desde una Palabra documento de un archivo de Excel?
Bueno, es simplemente diferente patrones de bits.
Y esos patrones son diferentes por lo general en el inicio de esos archivos.
>> Así que cuando el equipo abre una Palabra doc, o cuando un equipo se abre un archivo JPEG,
se ve normalmente en la primero varios bits en el archivo.
Y si se reconoce un patrón, que dice, oh, esto es una imagen.
Permítanme exhibo a el usuario como un gráfico.
O, oh, esto se parece a un documento de Word.
Déjame mostrarte al usuario como un ensayo.
>> Así, por ejemplo, archivos JPEG, Resulta que son
bastante sofisticado debajo de la capucha.
Pero los tres primeros bytes en la mayoría de cada JPEG empezar con estos tres números.
Así byte cero, uno, y dos son, en la mayoría de cada JPEG, 255, entonces el número
216, entonces el número 255.
>> Y lo que podrás para empezar a hacer la semana que viene
en realidad está metiendo debajo el capó de archivos como archivos JPEG
y al igual que los archivos de mapa de bits, y ver Lo que siempre ha estado ahí todo el tiempo
como usted ha estado usando una computadora.
>> Pero lo que hay allí no es típicamente escrita como números decimales como este.
Los informáticos no hacen tienden a hablar en decimal.
En realidad, no hablan en binario.
Normalmente, cuando queremos para expresar números,
realmente usamos hexadecimal, que usted puede recordar
de, por ejemplo, de problemas Uno, que desafió
a pensar en un sistema diferente.
>> Nosotros, por supuesto, estamos familiarizados con decimales, del cero al nueve.
Hablamos de binario.
Y nosotros realmente no tenemos de usar que mucho aquí
en adelante, porque los ordenadores que utilizarán.
Pero los programadores lo hará muy a menudo, pero no siempre,
utilizar hexadecimal, que sólo significa usted tiene 16 letras en su alfabeto,
en lugar de dos o 10.
>> Entonces, ¿cómo contar a un mayor de nueve de cada hexadecimal?
Vas 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, sólo por convención.
Pero lo que es fundamental es que cada de ellos es un solo símbolo.
No hay 10.
No hay 11, per se, debido a que cada de sus cifras, al igual que en decimal
y al igual que en el sistema binario, sólo debe ser un solo carácter, por convención.
>> Así que a continuación es el alfabeto que tenemos a nuestra disposición para hexadecimal.
Así que lo que tiene un aspecto un JPEG como si eran para escribir los tres primeros
No bytes como decimal, pero, por ejemplo, como hexadecimal?
¿Y por qué es hexagonal incluso tan útil?
>> Bueno, un rápido vistazo a un ejemplo.
Así que si yo escribo los bits que representar estos numbers-- decimal
esto podría ser un poco oxidado ahora desde hace unas semanas,
pero el de la izquierda y la derecho son bastante fácil.
255 era el número más grande que podría representar con ocho bits.
Fue todo unos.
Así que el único que está ligeramente interesante es el del medio.
Y si lo haces tipo de la matemáticas, se deduce que, de hecho,
que el patrón de una y ceros representa 216.
Así que vamos a estipular ahora que estos son correctos.
Pero ¿por qué es interesante?
>> Bueno, un byte, por supuesto, es de ocho bits.
Y resulta que si usted piensa de un byte como dos trozos de cuatro bits,
como este.
Quisiera añadir algo de espacio.
Así que antes, después.
Acabo de añadir un poco de espacio en blanco por el amor de la visualización aquí.
¿Cómo podemos ahora representar en, digamos, hexadecimal cada quad de bits,
cada conjunto de cuatro bits?
>> Así, por ejemplo, a la izquierda ahora, tenemos 1111 en binario.
¿Cuál es ese número en decimal, si lo hace fuera de las matemáticas?
Usted tiene el lugar de las unidades, el lugar de dos en dos, el lugar a cuatro patas, y el lugar ochos.
>> AUDIENCIA: 15.
DAVID J. MALAN: Es 15.
Así que si lo hacemos ocho más cuatro más dos más uno, obtenemos 15.
Así que podría anotar 15 infra 1111, pero el punto aquí
es hexadecimal, no decimal.
Así que en lugar de escribir 15, 1-5, Voy a escribir que en hexadecimal,
que si piensa volver, si usted tiene cero a través de f, lo que se 15 va a ser?
AUDIENCIA: f.
DAVID J. MALAN: Así que resulta que del f.
Y usted puede trabajar en eso, diciendo: así, si a es 10, entonces bien, f es de 15.
Así que de hecho, podríamos reescribir Este mismo conjunto de números como f f.
Y luego, si hacemos un poco de matemáticas, vamos a deducir que eso es d.
Ocho es bastante fácil, ya que tener un uno en el lugar ochos.
Y luego, tenemos un par más de f f.
>> Así que lo que los humanos tienden a hacer por convención cuando utilizan hexadecimal es simplemente
escribir esto un poco más sucinta, deshacerse de la mayor parte de ese espacio en blanco.
Y sólo para ser súper claro para lectores que esta es hexadecimal,
el simple convención entre los seres humanos se le escriben cero
x, que no tiene otro significado de un identificador visual de,
aquí viene un número hexadecimal.
>> Y entonces, de poner los dos dígitos, f f en este caso, a continuación, d a, entonces f f.
Así que cuento largo, hexadecimal sólo tiende
para ser útil porque cada uno de sus dígitos, del cero al f, perfectamente líneas
con un patrón de cuatro bits.
>> Así que si usted tiene dos dígitos hexadecimales, cero a la F, y otra vez,
que le da a la perfección ocho bits o un byte.
Así que por eso se tiende a ser útil convencionalmente.
No hay intelectual contenido realmente más allá de eso,
aparte de su utilidad real.
>> Ahora los archivos JPEG no son la única formatos de archivos de gráficos.
Usted puede recordar que hay archivos de este tipo en el mundo,
por lo menos desde hace unos años.
>> Así que esto era en realidad instalado en Windows XP
en millones de ordenadores de todo el mundo.
Y este era un archivo de mapa de bits, BMP.
Y un archivo de mapa de bits, como se verá el próximo semana, sólo significa un patrón de puntos,
píxeles como se les llama, un mapa a partir de los bits, de verdad.
>> Así que lo que es interesante, sin embargo, acerca de este formato de archivo, BMP, es
que debajo de la capilla, que cuenta con más de sólo tres bytes
que componen su cabecera, por lo hablar, los primeros bocados.
En realidad se ve un poco complicado a primera vista.
Y verá esto en el conjunto P.
Y conseguir algo en particular de esta empresa
que no es tan importante, ya que sólo el hecho de que al comienzo de cada mapa de bits
archivo, un formato gráfico, hay todo un montón de números.
>> Ahora Microsoft, el autor de este formato,
tiende a llamar a los Las cosas no enteros y caracteres
y flotadores pero las palabras y d palabras y largos y bytes.
Así que son sólo diferentes tipos de datos.
Son diferentes nombres para la misma cosa.
Pero verás que en P Set Four.
>> Pero esto es sólo para decir que si un ser humano doble clics algún archivo BMP en su
o su disco duro, y una ventana se abre hasta él o ella que la imagen que muestra,
eso sucedió porque el operativo sistema presumiblemente notó no sólo
la extensión de archivo BMP en el nombre del archivo,
sino también el hecho de que hay algo de convención para el patrón de bits
en el comienzo de ese archivo de mapa de bits.
>> Pero ahora vamos a centrarnos en un archivo complicada tal,
sino en algo como esto.
Supongamos que aquí en GEdit, I sólo tienen los inicios
de un programa que es bastante simple.
Tengo un poco incluye hasta arriba.
Ahora tengo "structs.h" # include pero Voy a volver a eso en un momento.
Pero esto es útil por ahora.
Así que este es un programa eso va a aplicar
como la base de datos del registrador.
Así que una base de datos de los estudiantes, y todos los estudiantes en el mundo
tiene un nombre y una casa y probablemente algunos otras cosas, pero vamos a mantener las cosas simples.
Cada estudiante tiene un nombre y una casa.
>> Así que si yo quería escribir una programa cuyo propósito en la vida
fue simplemente para recorrer desde cero en un máximo de tres,
si hay tres estudiantes en la Universidad de Harvard.
Y yo sólo quiero llegar, mediante GetString, el nombre de cada estudiante y de la casa,
y luego simplemente imprimir aquellos cabo.
>> Esto es algo así como la Semana Uno, Semana Dos cosas ahora,
donde yo sólo quiero una para bucle o algo por el estilo.
Y quiero llamar GetString algunos veces y, a continuación, se imprimen f varias veces.
Entonces, ¿cómo podría yo hacer esto, sin embargo, cuando un nombre y una casa
están involucrados para cada estudiante?
>> Así que mi primer instinto podría la de hacer algo como esto.
Yo podría decir primero, bueno, dame, decir, una matriz de cadenas llamados nombres.
Y yo no quiero un hardcode tres aquí.
¿Qué quiero poner allí?
Para que los estudiantes, porque eso es sólo una constante declarada en la parte superior,
sólo para que yo no tengo que codificar tres en múltiples lugares.
De esta manera, puedo cambiarlo un solo lugar, y que afecta a un cambio en todas partes.
Y entonces, yo podría hacer cadena alberga ESTUDIANTES.
>> Y ahora, yo podría hacer algo como for (int i = 0; i <ESTUDIANTES; i ++.
Así que estoy escribiendo rápido, pero esto es probablemente sintaxis familiar ahora.
>> Y ahora, esto era más reciente.
Si quiero poner en el i-th el nombre del estudiante, creo que hago esto.
Y entonces, no nombres pero las casas ménsula.
Hago esto, GetString, y dejo me volver atrás y corregir esta línea.
De acuerdo?
En desacuerdo?
No es muy fácil de usar.
No le he dicho al usuario qué hacer.
>> Pero ahora, si yo también quería más tarde, vamos a
digamos, imprima estas cosas salir-- TODO lo más tarde.
Voy a hacer más con esto-- este es sin duda
una correcta aplicación de la conseguir nombres y casas, tres
de ellos total de cada uno, de un usuario.
>> Pero esto no es muy buen diseño, ¿no?
¿Qué pasa si un estudiante tiene no sólo un nombre y una casa, pero también un número de identificación,
y un número de teléfono, y una dirección de correo electrónico,
y tal vez una página de inicio, y tal vez un mango Twitter,
y cualquier número de otros detalles asociada a un estudiante o una persona,
de manera más general.
¿Cómo podemos empezar a añadir funcionalidad de este programa?
>> Bueno, siento que la manera más simple podría ser para hacer algo como, digamos,
int ids ESTUDIANTES.
Así que puedo poner todos sus documentos de identidad en ese país.
Y entonces, algo como números de teléfono,
No estoy seguro de cómo representar eso todavía.
Así que vamos a seguir adelante y simplemente llamada este twitters ESTUDIANTES, que
es un poco extraño, pero-- y un montón más campos.
>> He empezado a con eficacia copie y pegue aquí.
Y esto va a crecer bastante difícil de manejar bastante rápido, ¿verdad?
¿No sería agradable si había en el mundo una estructura de datos conocida
no como un int o una cadena, pero algo nivel superior, una abstracción, por lo
hablar, conocida como estudiante?
C no vino con una función de funcionalidad para los estudiantes,
pero lo que si quería darle tal?
>> Bueno, resulta que voy a abrir un archivo llamado structs.h aquí,
y usted puede hacer exactamente eso.
Y vamos a empezar a hacer esto ahora.
Y debajo de la capucha de P Set de tres, que ya ha estado haciendo esto ahora.
No hay tal cosa como un g rect o un g ovalada en el lenguaje de programación C.
>> La gente en Stanford implementan los tipos de datos mediante el uso de este enfoque aquí,
declarando su propia nuevos datos tipos utilizando una nueva palabra clave
denominada struct y otro uno llamado typedef.
Y de hecho, a pesar de que la sintaxis se ve un poco diferente de las cosas
que hemos visto antes, en principio, es super simple.
>> Esto sólo significa "definir un tipo."
Eso va a ser un estructura, y una estructura
es como un contenedor para múltiples cosas.
Y esa estructura se va tener una cadena denominada nombre,
y una cadena llama casa.
Y vamos a llamar, sólo por conveniencia, todo este estudiante estructura de datos.
>> Así que el momento en que llegue a el punto y coma, que tiene ahora
creado sus propios datos tipo denominado estudiante
que ahora está junto a int, y el flotador, y char, y la cadena,
y g rect, y g oval, y cualquier número de otras cosas que la gente ha inventado.
>> Así que lo que es útil sobre ahora es que si vuelvo
a struct 0 y terminar este aplicación, que escribí
por adelantado aquí, observe que todos del desorden inevitable que
estaba a punto de empezar a suceder como agregué números y twitters de teléfono y todo
estas otras cosas definición de un estudiante,
ahora está sucintamente concluyó tan sólo una variedad de estudiantes.
>> Y cada uno de esos estudiantes ahora tiene varias cosas dentro de ella.
Así que sólo deja una pregunta.
¿Cómo se llega en el nombre, y la casa, y la ID,
y para cuanto se interior del estudiante?
Súper simple, también.
Nueva sintaxis, sino una idea simple.
>> Simplemente índice en la matriz, como lo hicimos la semana pasada y esta.
Y lo que es claramente la nueva pieza de sintaxis?
Just., Que significa "ir dentro de la estructura y hacer el campo llamado
nombre, obtener el campo llamado casa, obtener el campo llamado estudiante ".
>> Así que en el conjunto P de tres, si eres sigue trabajando en eso,
y la mayoría de la gente todavía son, darse cuenta de que a medida que
empezar a utilizar cosas como g rectas y g óvalos
y otras cosas que no parecen provenir de la Semana Cero, uno, o dos,
se dan cuenta de que eso es porque Stanford declarado algunos nuevos tipos de datos.
>> Y de hecho, eso es exactamente lo que vamos a hacer, así, en el conjunto P de Cuatro, cuando
empezamos a tratar con las cosas como imágenes, mapas de bits y mucho más.
Así que eso es sólo un avance y un modelo mental de lo que está por venir.
Ahora, he demorado un poco esta mañana.
Yo era una especie de curiosidad por ver lo que el fondo de pantalla Microsoft realidad
parece que hoy.
Y resulta que alguien en 2006 en realidad fue a casi exactamente
el mismo lugar para fotografiar en la realidad lo que parece que en estos días.
El campo es ahora un poco de maleza.
>> Así que hablar ahora de las imágenes, vamos a traer de vuelta a Daven aquí
en la pantalla y Nicholas, y justo recordarle
que si desea unirse a nosotros para el almuerzo este viernes, la cabeza a nuestra dirección habitual
Aquí.
>> Entonces, ¿dónde nos dejamos fuera el lunes?
Hemos introducido este problema, ¿verdad?
Este fue aparentemente una correcta implementación de swap,
mediante el cual se toma dos enteros, un llamado, un llamado b,
intercambiarlos, al igual que Laura hizo aquí en el escenario con la leche y el agua,
mediante el uso de un temporal variable o una taza vacía,
para que pudiéramos poner b en una y una en b sin hacer un lío de cosas.
Se utilizó una variable.
Se llama temp.
>> Pero lo que era la fundamental problema con este código el lunes?
¿Cuál fue el problema?
Sí.
>> AUDIENCIA: Se necesita más espacio.
>> DAVID J. MALAN: ocupa más espacio, porque estoy usando una variable,
y eso está bien.
Eso es cierto, pero estoy va a decir que está bien.
Está a sólo 32 bits en la gran esquema de las cosas, así que no es gran cosa.
Otros pensamientos?
AUDIENCIA: Sólo se intercambia las variables a nivel local.
DAVID J. MALAN: Exactamente.
Sólo cambia las variables de forma local.
Porque cada vez que te llame un function-- cuando tuve las bandejas de Annenberg
la última vez, tienes principal en la parte inferior.
Tan pronto como se llama a una función llamada intercambio, canje no obtiene x e y,
los valores originales.
¿Qué significa intercambio get, nos reclamamos?
AUDIENCIA: Copias.
DAVID J. MALAN: Así copias de ellos.
Así se pone uno y dos, si recordar el ejemplo de la última vez,
pero una copia de uno y dos que se intercambian con éxito.
Pero, por desgracia, al final, esos valores siguen siendo los mismos.
Así que podemos ver esto con nuestra nuevo amigo, espero GDB,
que usted o los TFS y Ca de tener sido guiándole hacia la siguiente manera.
>> Así que no hay memoria de intercambio se ve como-- vamos abrir esto-- se parece a esto.
Inicializamos x para uno, y para dos.
Tenía un montón de impresión de f.
Pero entonces, la llamada clave aquí había que cambiar, que
es exactamente lo que el código acabo de ver hace un momento.
¿Qué es correcta en primera vista, pero funcionalmente,
este programa no funciona, porque no intercambiar de forma permanente x e y.
>> Así que veamos esto, un calentamiento rápido hasta aquí con el BGF, una ./noswap.
Un montón de información abrumadora que Me desharé de L con control por ahora.
Y ahora, me voy a seguir adelante y ejecutarlo.
Y, por desgracia, que no era tan útil.
Se corrió el programa dentro de este programa llamado GDB, un depurador,
pero no me dejó hurgar.
>> Entonces, ¿cómo puedo realmente hacer una pausa ejecución dentro de este programa?
Así romper.
Y podría romper en cualquier número, uno, 10, 15 de línea.
Pero también puedo romper simbólicamente diciendo ruptura principal.
Y eso va a establecer un descanso punto, al parecer, en la línea 16 en la principal.
¿Y dónde está la línea 16?
Vamos a ir hasta el código y subir a noswap.
Y, de hecho, la línea 16 es la muy primero en el programa.
>> Así que ahora, si me voy por delante y el tipo ejecutar este tiempo, Enter, se detuvo.
Así que vamos a hurgar.
Imprimir x-- qué es x cero?
Y ignorar el signo de dólar.
Eso es sólo para los más de lujo uso del programa.
¿Por qué es x cero en este momento?
Sí.
>> AUDIENCIA: Se detuvo justo antes de línea 16, no realmente en la línea 16.
DAVID J. MALAN: Exactamente.
GDB, por defecto, se ha detenido ejecución justo antes de la línea 16.
Así que no se ha ejecutado, lo que significa x es de algún valor desconocido.
Y tenemos la suerte de que es algo limpio como cero.
Así que ahora si escribo siguiente, ahora es ejecutado 16.
Está esperando a que yo ejecuto 17.
Déjame ir adelante y print x.
Es uno.
Déjame ir adelante y de impresión y.
¿Qué debo ver ahora?
>> AUDIENCIA: [inaudible]
>> DAVID J. MALAN: Un poco más fuerte.
>> AUDIENCIA: [inaudible]
DAVID J. MALAN: No hace ni un consenso.
Así que sí, vemos un cierto valor de la basura.
Ahora, y es 134514064 allí.
Bueno, es sólo un valor de la basura.
Mi programa utiliza memoria RAM para diferentes propósitos.
Hay otras funciones.
Otras personas escribieron dentro de mi ordenador.
Así que esos bits se han utilizado para otros valores, y lo que estoy viendo
es los restos de algunos utilización anterior de esta memoria.
>> Así que no es gran cosa, porque tan pronto mientras escribo siguiente y luego imprimir y,
se inicializa a el valor que quiero.
Así que ahora, vamos a seguir adelante un poco más rápido.
N para el siguiente.
Vamos a hacerlo de nuevo.
Pero yo no quiero golpear aquí, porque si
querer ver lo que está pasando en el interior de intercambio, lo que es el comando?
>> AUDIENCIA: pasos.
>> DAVID J. MALAN: pasos.
Así que esto me mete en un función, en lugar de sobre ella.
Y ahora, que es un poco críptico honestamente, pero esto es sólo
me dice que estoy en la línea 33 ahora.
Y vamos a hacer esto de nuevo.
Temp impresión.
Valor basura, negativo esta vez, pero eso es sólo todavía un valor basura.
Así que vamos a hacer a continuación, la temperatura de impresión.
Se inicializa a 1, lo cual era el valor de x, también conocido como una.
>> Ahora, ¿dónde están nuestros A y X viene?
Pues bien, advertimos en principal, llamado a estos valores x e y.
A continuación, pasamos a intercambiar la siguiente manera.
X fue primero, coma y.
Y entonces, de intercambio podría llamarlos xe y.
Pero para mayor claridad, es llamándolos a y b.
Pero ayb ahora van a ser copias de x e y, respectivamente.
>> Así que si vuelvo a GDB, temp es ahora un año y es ahora uno.
Pero si lo hago al lado y ahora hacer de impresión A, A ya se ha movido más.
La leche ha sido derramado en la antigua el vaso de zumo de naranja, o viceversa.
>> Y si hago lo siguiente otra vez, y ahora si imprimo como una comprobación de validez,
una sigue siendo dos, pero b es ahora uno.
Francamente, todavía está allí.
No me importa lo que la temperatura es.
Pero tan pronto como ahora escribo, digamos, continúe a volver, ahora estoy en el final
el programa.
Y, por desgracia, x es siendo uno e y sigue siendo dos.
>> Entonces, ¿cuál era la utilidad de GDB allí?
No ayudó a arreglarlo el problema per se,
pero espero que me ayude entenderlo realizando
eso sí, mi lógica es correcta, pero mi código es no tener en última instancia
un impacto permanente.
Así que eso es un problema que estamos va a resolver ahora hoy.
>> Pero vamos a llegar allí a través de este.
La cadena es una mentira.
Es, también, no un tipo de datos que existe en C. Es
sido sinónimo de algunos tiempo para otra cosa,
y podemos revelar que como sigue.
>> Déjame ir por delante y abro Un programa llamado compara-0.
Y en lugar de escribir éste hacia fuera, vamos a empezar a caminar a través del código
Ya he escrito, pero es sólo unas pocas líneas.
Así que esto se compara-0.
Y lo primero que estoy haciendo es conseguir una línea de texto.
>> Pero noto lo que estoy haciendo por primera vez.
Lo que es diferente con claridad acerca de la línea 21?
De hecho, espera un minuto.
Esta es la copia de dos.
Eso no es ni siquiera el programa adecuado.
Muy bien, spoiler alert.
Muy bien, así que no importa que.
Esa es la respuesta a una pregunta futuro.
>> Aquí se compara-0, y estoy a punto de conseguir una línea de texto.
De mucho más simple programa.
Así que esto es sencillo.
Esto es como la Semana Uno, Semana Dos cosas En el momento. string s = GetString.
Ahora, lo digo de nuevo aquí.
cadena t = GetString.
Y luego, la última cosa en este programa, como su nombre indica,
es que me voy a tratar de compararlas.
>> Así que si s, la primera cadena, es igual a = t, entonces yo soy
va a decir que escribe lo mismo.
Si no, yo voy a decir escribe cosas diferentes.
Así que vamos a compilar y ejecutar este programa.
Así que compara cero.
Se ve bien.
No hay errores de compilación.
>> Déjame ir por delante ahora y escriba ./compare-0.
Déjenme seguir adelante y decir algo : Daven y algo: Rob.
Y escribo cosas diferentes.
Hasta ahora, todo bien.
Programa parece ser correcta.
>> Pero vamos a correr de nuevo.
Decir algo: Gabe.
Bien.
Tal vez me golpeó la barra espaciadora o algo funky.
Vamos a hacerlo de nuevo.
Así Zamyla.
Zamyla.
Diferentes cosas.
Entonces, ¿qué está pasando?
>> Así que tenemos estas dos líneas de código, GetString se llama dos veces.
Y entonces, estoy simplemente tratar de comparar s y t.
Pero lo que realmente está pasando entonces?
Bueno, acerca de mi puño y letra a carnicero este ejemplo algo.
Y seamos realmente tiran esto aquí, también.
>> Así que tenemos una línea como string s = GetString.
Así que eso es simplemente la primera interesante línea de ese programa.
Pero lo que todo este tiempo ha sido pasando por debajo de la capucha?
Bueno, en la izquierda lateral es una cadena, que es algún tipo de variable,
y se llama s.
Así que sé que esto es usar la memoria, o RAM, en mi equipo de alguna manera.
Así que voy a abstractamente dibujar que como un cuadrado.
32 bits, resulta, pero más sobre esto en el futuro.
Y entonces, ¿qué está pasando aquí?
>> Bueno, obviamente GetString para crear una cadena del usuario.
Y GetString consiguió Zamyla o Gabe o Daven.
Así que vamos a elegir la primera de esos, que era Daven.
Así que efectivamente, lo consiguió GetString mí en ese primer caso era D-a-v-s-n.
Y entonces, ¿qué otra cosa hizo que me da en secreto?
AUDIENCIA: [inaudible]
DAVID J. MALAN: Sí, el / 0 o null carácter.
Así que me dio efectivamente una cadena.
Pero ya sabemos de anteriores Parece que una cadena es simplemente un arreglo
de caracteres, y se termina por este carácter especial centinela, / 0.
>> Pero si esto es cierto y esto es un cuadrado,
esto es claramente un rectángulo mucho más grande.
Y, de hecho, esto es, Yo reclamo, sólo 32 bits.
Y esto es claramente más de 32 bits, ya que esta es probablemente
ocho más ocho más ocho más ocho más ocho,
sólo porque de bytes en ASCII.
¿Cómo diablos vamos a caber Daven en este pequeño cuadro aquí?
>> Bueno, lo que está haciendo en realidad GetString?
Bueno, esta cuadrícula representa aquí de memoria o la memoria RAM del ordenador.
Así que vamos a decir que si arbitrariamente cada uno de ellos representa un byte,
entonces podemos pensar en cada byte como teniendo una dirección,
como 33 Oxford Street, o 34 Oxford Street, o 35 Oxford Street.
>> Así que al igual que las casas tienen direcciones y los edificios tienen direcciones,
también lo hacen bytes individuales de memoria tiene direcciones o números
que la identificación exclusiva de ellos.
Ahora, esto es arbitrario.
Pero que sea sencillo, que voy a utilizar hexadecimal sólo por convención,
pero el 0x no significa otra cosa que "este es hexadecimal."
y yo voy a afirmar que el "D" termina en Byte One en la memoria.
>> No tengo nada más que hacer en memoria, por lo Daven obtuvo el primer lugar
Uno de Byte.
Esto, entonces, va a ser 0x2.
Esto va a 0x3.
Esto va a ser 0x4.
Esto va a 0x5.
Esto va a ser 0x6.
>> Pero una vez que empezar a pensar acerca de lo que está haciendo el equipo
debajo de la campana, usted puede comenzar a inferir
cómo, hace unos años, lo haría han implementado C sí.
¿Qué es GetString probablemente returning-- porque
se siente como que no es volver Daven, per se,
porque seguramente no va para encajar en este pequeño box--
así que lo que se GetString probablemente regresando?
>> AUDIENCIA: [inaudible]
>> DAVID J. MALAN: La ubicación de Daven.
Y ha estado haciendo esto desde la semana uno.
¿Qué es realmente GetString volver no es una cadena, per se.
Esa es una de las mentiras piadosas.
Se devuelve la dirección de la cadena en la memoria, la dirección única.
Daven vive en 33 Oxford Street.
Pero de forma más sucinta, Gavin vive en 0x1, Dirección Número Uno.
>> Así que lo que se puso en este pequeña caja a continuación, para ser claros,
es sólo la dirección de esa cadena.
Así que todo este tiempo, este que ha estado sucediendo.
Pero lo que esto apunta a ahora es que si todo s tiene
es un número dentro de ella, que es para detenerte, el programador,
de poner cualquier número en cualquier variable y sólo saltar
a ese trozo de memoria?
Y, de hecho, ya veremos eso es una amenaza próxima vez.
>> Pero por ahora, esto se siente insuficiente.
Si digo, conseguirme un cadena, dame Daven.
Pero en realidad no me das Daven.
Todo lo que me das es la dirección de Daven.
¿Cómo puedo entonces sé con seguridad donde Daven comienza y ends--
la historia de conseguir weird-- donde Daven comienza y termina,
y, a continuación, el siguiente cadena en la memoria comienza?
>> Bueno, si usted está entregando me al principio de Daven,
en esencia, ¿cómo puedo saber donde al final de su nombre es?
Ese carácter nulo especial, que es aún más importante ahora
Si cuerdas debajo de la campana son simplemente identifica
de forma única por su ubicación en la memoria.
Así que todo este tiempo, que es lo que ha estado pasando.
>> Así que cuando nos fijamos ahora en el código aquí, explicar
si lo haría el error en la línea 26.
¿Por qué es Zamyla y Zamyla diferente?
¿Por qué es Gabe Gabe y diferente?
Sí, en la parte trasera.
>> AUDIENCIA: Tienen diferentes direcciones.
>> DAVID J. MALAN: Simplemente porque tienen diferentes direcciones.
Porque cuando usted llama GetString de nuevo, lo que voy a hacer rápidamente aquí,
si esta es la segunda línea, cadena t, como lo hice en ese programa,
es igual a otra llamada a GetString.
La próxima vez que llamo GetString, voy
para obtener un trozo diferente de la memoria.
>> GetString se permite preguntar al operativo
sistema para obtener más y más memoria.
No va a volver a utilizar la misma seis bytes cada vez.
Se va a obtener un nuevo trozo de memoria, que
significa t va a conseguir algún otro valor aquí.
>> Así que cuando lo hago s es igual a = t, que no está comparando
D y A en contra de este contra esto y V contra de esto.
Usted está comparando este en contra de esta, que
francamente es bastante useless-- useful-- es bastante inútil, ya que realmente
le importa donde las cuerdas están en la memoria?
>> Y, de hecho, no lo hemos hecho.
Y no vamos a iniciar particularmente cuidado.
Sólo en la medida en que pueden surgir errores y las amenazas de seguridad pueden surgir voluntad
que en realidad empezamos a preocuparse por esto.
Así que vamos a arreglar este problema.
Resulta que, a solucionarlo súper simple.
>> Y vamos realidad, antes de que yo revelan que una vez más, lo que haría
que hacer si en una clase CS50, y ha tenido que poner en práctica
una comparación con dos cadenas.
Usted claramente no sólo puede utilizar s es igual a = t.
Pero así, lógicamente, cómo compararía esta cadena
contra esta cadena utilizando código C?
Sí.
>> AUDIENCIA: Sólo hacer el de lazo [inaudible]
DAVID J. MALAN: Perfect.
AUDIENCIA: [inaudible]
DAVID J. MALAN: Si.
Sólo tiene que utilizar un bucle for o un while o lo que sea.
Pero solo se aplica la idea básica de que si este es un trozo de memoria o una matriz
y esto es, iterar sobre ambos al mismo tiempo.
Y justo comparar las letras.
>> Y tienes que ser un poco cuidado, porque
no quieren un dedo para ir más allá de la otra
porque una cadena es ya que el otro.
Así que vas a querer comprobar si hay Este valor especial al final, null.
Pero lo que realmente es, en el final, tan simple como eso.
Y, francamente, no necesitamos reinventar la rueda.
Aquí está la versión dos.
Y lo que voy a decir aquí es que en lugar de comparar s es igual a = t,
Estoy en vez de ir a decir, si la cadena comparación de coma s es igual a t = 0.
Ahora, lo que se compara la cadena?
>> Resulta, que es una función que viene con C, cuyo propósito en la vida
es comparar dos cadenas.
Y revuelva comparar, si leemos su página de manual o documentación o CS50
referencia, lo hará simplemente decirles que revuelo
comparar los rendimientos, ya sea un cable negativo número o un número positivo o cero,
donde cero significa que son iguales.
>> Así que sólo conjeturas.
¿Qué podría significar si revuelva retornos comparar
valor negativo o el valor positivo?
AUDIENCIA: Mayor o menor que.
DAVID J. MALAN: Sí, mayor que o menor que.
Así que si queremos ordenar su conjunto manojo de cuerdas en un dictionary--
como lo haremos con el tiempo por la road-- función perfecta para usar potencialmente,
porque va a hacer que comparación de cadenas para usted, y decirle
usted hace una viene antes de b, o hace b venir antes de un orden alfabético.
Podemos hacer exactamente eso.
>> Y note que hice otro cosa en este ejemplo.
¿Qué más ha cambiado más alta en esta función principal?
Char *.
Y es que otra mentira blanca.
Durante todo este tiempo, cuando has estado escribiendo cadena,
hemos estado reescribiendo en secreto cadena como char * para que clang realidad
usted entiende.
>> En otras palabras, en CS50.h y como veremos finalmente vemos,
hicimos una cadena de sinónimos en llamada eso es lo mismo que char *.
Y por ahora, sólo saber que el *, En este contexto, por lo menos,
significa la dirección.
>> La dirección de qué?
Bueno, el hecho de que te dije char *, y no int * o flotar *,
significa que char * es la dirección de un char.
Así que este pequeño cuadro aquí, también conocido como cadena, es realmente de tipo char *,
que es simplemente una manera elegante de decir, En este cuadro se destinará una dirección.
¿Y qué hace que la dirección se refiere?
Al parecer, un char.
>> Pero pudimos absolutamente tener int * y otras cosas.
Pero por ahora, char * es realmente el más sencillo y uno de interés.
Así que este problema se va aumentando, aunque, de nuevo.
>> Supongamos que yo abro este programa.
A ver si ahora podemos predecir lo que está mal con este código.
Así que en este programa, copiar-0, estoy va a seguir adelante y llamar de nuevo
GetString y almacenar el valor en s.
>> Y entonces, ¿por qué estoy haciendo esto, sólo como un recordatorio de la semana pasada?
Hicimos decir que GetString a veces devuelve null.
¿Qué significa si GetString devuelve null?
Algo salió mal.
Probablemente significa la cadena es demasiado grande, fuera de la computadora de la memoria.
Sucede super, super, super rara vez, pero podría suceder.
Queremos encontrarlo, y eso es todo lo que estamos haciendo.
>> Porque vamos a ver ahora, si no lo hace empezar a comprobar habitualmente por las cosas
como nulo, que te pueden en realidad empezar a ir
a direcciones de memoria que no son válidos.
Y usted va a empezar a inducir más y más violaciones de segmento.
O en un Mac o un PC, simplemente hacer que un ordenador para colgar
o un programa para congelar, potencialmente.
>> Así que ahora, yo reclamo en copia-0.c, que Voy a copiar estas cadenas a modo
de la línea 28.
Y entonces, me voy para reclamar en la parte inferior
aquí que voy para cambiar uno de ellos.
>> Así notar esto.
Voy a llamar a nuestro viejo amigo strlen.
Y sólo explicar en Inglés lo que esta línea 34 está haciendo?
¿Qué soporte t 0 representar a la izquierda.
Sí.
>> AUDIENCIA: Primer carácter de t?
DAVID J. MALAN: Primer carácter de t.
Eso es todo.
El primer carácter de t, quiero para asignar la versión mayúscula
del primer carácter en t.
Así que esta es la capitalización la primera letra.
Y luego, lo último que hago en este programa es que pretendo aquí es
el original, es, y aquí está la copia, t.
>> Pero en base a la historia que acabamos de hablado de lo que realmente son las cadenas,
lo que es realmente la línea 28 haciendo, y lo que es
el fallo que resulta ir para estar en la pantalla?
>> Así que primero, la primera pregunta, 28.
¿Qué es String t = s haciendo en realidad?
Si tenemos en la mano izquierda lado aquí string t = s;
eso me da una caja aquí y una caja aquí.
Y supongamos que esta dirección es 0x, digamos, 50 esta vez, de manera arbitraria.
¿Qué cadena de t = s hacer debajo de la capucha?
>> AUDIENCIA: [inaudible]
>> DAVID J. MALAN: Almacena la memoria abordan allí, así 0x50 va allí.
Así que si ahora, voy a la primera personaje en t y mayúsculas que,
¿qué estoy haciendo con eficacia para s?
Realmente estoy haciendo lo mismo, ¿verdad?
Porque si Dirección 0x50-- y justo, me no tienen mucho espacio en el tablero aquí,
pero asumir que esto es 0x50 aquí abajo, en algún lugar de la memoria de mi ordenador.
>> Y he, por ejemplo, Gabe en minúscula aquí, así.
Y he dicho soporte t 0 consigue capitalizados.
Bueno, t 0 es el soporte la primera letra t.
Tan poco g va a convertido en un gran G. Pero el problema
se, lo que no s también señalar?
>> AUDIENCIA: La misma.
>> DAVID J. MALAN: Exactamente lo mismo.
Así que una simple explicación tal vez, incluso si la sintaxis es un poco raro.
Así que vamos a hacer esto.
Hacer copia-0 y luego ./copy-0.
Decir algo: Gabe.
Y, por desgracia, tanto de ellos ahora se han capitalizado,
pero para ese subyacente razón por la que estamos simplemente
ahora se trata de direcciones.
>> Entonces, ¿cómo comenzamos a address-- sin doble intended--
¿cómo empezamos a abordar este problema en particular?
Bueno, en copy1.c, las cosas van a ser un poco más complicado.
Pero me gustaría reclamar un solución conceptualmente simple.
>> Tan difícil de conseguir a primera vista.
No va a ser fácil para el primer vez que escriba a cabo, tal vez,
pero si el problema es que simplemente haciendo t = s sólo
copia la dirección, lo que, de nuevo si puedo escoger en usted,
va a ser la solución para copiar realmente una cadena?
>> AUDIENCIA: Nosotros probablemente utilizar un bucle de nuevo.
>> DAVID J. MALAN: Si.
Así que vamos a necesitar un bucle de nuevo.
Y porque si queremos copiar una cadena s en otra cadena,
probablemente queremos hacerlo carácter por carácter.
Pero el problema es, si este es un principio s,
ahora tenemos que empezar de forma explícita la asignación de memoria para t.
>> En otras palabras, vamos redibujar esta última vez.
Si esta es string s = GetString.
Y vamos a poner esto aquí, también.
Esto es GetString.
Y entonces, la imagen de algo así que va a ser como antes,
g-a-b-e / 0.
Eso se ve un poco de algo como esto.
Y s, por lo tanto, nos llaman a este 0x50, y que va a ser 51, 52.
>> Así que esto es 0x50.
Y luego, lo hago cadena t.
En la memoria, que sólo va a dame una pequeña plaza como esta.
Así que ¿cuál es el paso clave ahora?
Si quiero copiar s en t, lo que blank qué necesitamos para llenar aquí?
O lo que es lo que necesitamos hacer a un alto nivel?
¿Sí?
Alguien?
Sí.
>> AUDIENCIA: Tenemos que [inaudible].
DAVID J. MALAN: Sí, deberán ingresar en este espacio en blanco.
No puedo copiar y luego capitalizar el nombre de Gabe
hasta que le pido al sistema operativo por otro trozo de memoria
eso es por lo menos tan grande como el original.
Así que nos deja con una pregunta.
>> ¿Cómo solicito el sistema operativo no sólo por un pointer-- sencilla
como esto se llama, una dirección, un no pointer--
por un poco simple caja como esto se llama una cadena?
¿Cómo solicito el operativo sistema para una gran parte de la memoria?
Hasta ahora, sólo he conseguido que volver indirectamente llamando GetString.
Entonces, ¿cómo se GetString incluso conseguir su memoria?
>> Bueno, resulta que hay esta otra función aquí
que ahora vamos a empezar a utilizar.
Ahora, esto parece que-- manera más críptica y yo soy el único que puede ver it--
esta línea se ve mucho más críptico entonces debería a primera vista.
Pero vamos a burles aparte.
>> En el lado izquierdo, tengo char * t.
Así que en Inglés, vamos a empezar a formular oraciones correctas en la jerga técnica.
Así que esta es la asignación de un variable de tipo char * llama t.
Ahora, ¿qué significa esto realmente?
>> Bueno, eso significa, ¿qué voy para poner en esta variable llamada t?
Una dirección de un char.
Así que eso es sólo el más simple, de manera más razonable
de describir el lado izquierdo.
Así que crea esta caja aquí solamente.
Así que el lado derecho, presumiblemente, va
asignar que más grande trozo de memoria, ¿cómo?
Así que vamos a burlan de esta separación.
>> Es abrumador a primera vista, pero lo que está pasando aquí dentro?
En primer lugar, hay malloc, que aparentemente es nuestro nuevo amigo,
"Memoria asignar."
Así que este es el argumento que se pasa en ella, por lo que es un argumento bastante grande.
Así que vamos a burlan de esta separación.
>> strlen de s, por supuesto, representa el--
AUDIENCIA: El número de caracteres.
DAVID J. MALAN: Sólo el número de caracteres en s.
Así la longitud de s, la cadena original.
Así G-a-b-e.
Así que es probable que cuatro en este caso.
¿Por qué hago después de 1 llamando strlen de s?
AUDIENCIA: [inaudible]
DAVID J. MALAN: Para que carácter especial nulo.
Si me preguntan cuál es la longitud de El nombre de Gabe, yo voy a decir cuatro.
Debajo del capó, sin embargo, tengo que que el quinto byte para el carácter nulo.
Así que por eso estoy haciendo el 1.
>> Ahora en caso de que está ejecutando este programa en un equipo que no sea, por ejemplo,
el aparato CS50, donde el tamaño de un char
podría ser diferente de mi propia computer--
resulta que yo puedo llamar a este sizeof operador, simplemente hacer que el equipo,
lo que es del tamaño de un charlas en este equipo?
>> Y multiplicando cinco en este ejemplo por el tamaño de un char, que
en la mayoría de las computadoras sólo uno, malloc
se va a asignar a mí esta gran trozo de memoria más de aquí a la derecha.
Y va a return-- se trata de un function-- por lo que es
va a volver a mí qué?
AUDIENCIA: ¿La dirección?
DAVID J. MALAN: La dirección de qué?
AUDIENCIA: De la memoria se asigna?
DAVID J. MALAN: De la la memoria se asigna.
Así que no tengo ni idea, francamente, dónde va a terminar.
Voy a proponer que que va a terminar en 0x88.
Completamente arbitraria, pero en algún lugar que no sea 0x50,
porque el sistema operativo, lo Windows y Mac OS hacen por mí, es
asegurarse de que se está dando Me diferentes trozos de RAM.
>> Así que este es el valor que esta trozo de memoria podría terminar.
Así que esto es lo que termina aquí, 0x88.
Así que ahora claramente, puedo entender que esto no es lo mismo que esto,
porque están señalando a diferentes fragmentos de memoria.
Así que si ahora realmente quiero copiar este en, vamos a hacer su propuesta de solución.
>> Vamos a ir, crear un bucle, y hacer t soporte i Obtiene s soporte de i.
Porque ahora puedo usar este tipo array notación,
porque a pesar de malloc muy genéricamente me asigna memoria,
bytes de memoria es sólo contiguos.
Byte, byte, byte, espalda con espalda con espalda.
>> Puedo ciertamente como un programador tratarlo como una matriz, que
significa que puedo usar esto finalmente familiarizado notación de sólo algunos corchetes.
>> Así que permítanme detenerme allí, porque esta es una gran cantidad de una sola vez, incluso
aunque la idea básica para recapitular es esa cadena, todo este tiempo,
no es un nuevo tipo de datos en sí.
Es sólo una llamada puntero, la dirección de un personaje,
que sólo significa que es un número que por convención humana
tendemos a escribir como 0x algo.
>> Pero es sólo un número, como 33 Oxford Street,
que pasa a ser el La dirección del CS edificio.
Cualquier pregunta sobre estos detalles?
¿Sí?
>> AUDIENCIA: ¿Por qué, comprobamos para t igual a null?
>> DAVID J. MALAN: ¿Por qué nosotros comprobar si t igual a null?
Si leemos la documentation-- gran pregunta-- para malloc,
que va a decir en la letra pequeña, a veces malloc podría devolver null,
al igual que GetString.
Y, en efecto, GetString devuelve null Si, a su vez, malloc devuelve un valor nulo,
porque GetString utiliza malloc.
>> Y eso podría suceder si el sistema operativo, Mac OS, Windows, lo que sea, es simplemente
sin memoria para usted.
Así que eso es lo que pasó allí.
>> Y permítanme revelar otra cosa eso podría volar tu mente
o completamente estar demasiado lejos de la raya.
Pero déjame tire hacia arriba la mismo bucle para copiar,
que hace un momento, el recuerdo era esto. t soporte i consigue s soporte de i.
>> Agradable y fácil de usar.
Se siente como la segunda semana de nuevo.
Pero esta versión puede ser en realidad reescrito como este, que parece críptica.
Es un puntero técnica llamada aritmética, aritmética de direcciones.
Pero ¿por qué funciona esto?
>> Ahora era un fastidio, la autores de C decidió utilizar
el símbolo * para diferentes propósitos.
Hemos visto que se usa una vez ya, char *, que significa "dame una variable
eso va a contener la dirección de un char ".
* Así carbón en ese contexto significa "dame una variable."
>> Por desgracia, si se utiliza el * sin una palabra delante de él, como char,
es ahora llamado el operador para deshacer referencias.
Y veremos más de esto en poco tiempo.
Pero sólo significa "ir allí."
Es como decir, si alguien me entregó en un pedazo de papel "33 Oxford Street,"
si lo hago "* 33 Oxford Street," que significa "Ir por el camino de la construcción de CS."
>> Así que * simplemente significa ir allí si no hay una palabra en frente de ella.
Entonces, ¿qué es t, para ser claros?
t es la dirección de la parte de memoria que se le dio de nuevo a mí.
s es la dirección de lo que, para ser claros, en el ejemplo que hemos estado discutiendo,
de gabe minúsculas?
s es la dirección de--
AUDIENCIA: La cadena.
DAVID J. MALAN: De nombre original de Gabe.
Así que es la dirección de este trozo de memoria.
Así que si digo t + i i--, aviso, es sólo nuestro viejo amigo.
Es sólo una variable índice eso es la iteración de cero en un máximo
a la longitud de la cadena s.
Así que va a ser cero, uno, luego dos, luego tres, luego cuatro.
Así que vamos a montar estos nuevos Piezas del rompecabezas-cero como, si se quiere,
aunque, de nuevo, la sintaxis es mucho más arcano de los arañazos.
Así que t es una dirección + i me va a dar
un número, ya que estos son todos números que hemos venido señalando como hexadecimal.
Pero son sólo números.
>> Así que si la dirección de t nos dijo era 0x88, lo que es 0x88 más cero.
Incluso si usted no se siente cómodo con hex aún, tomar una conjetura.
>> AUDIENCIA: El original.
>> DAVID J. MALAN: Todavía 0x88.
Entonces, ¿qué quiere decir * 0x88?
Significa, "ir allí", que significa efectivamente, "poner el dedo aquí."
Y ahora en el lado derecho de esta expresión, * y luego en parens,
s + s i significa, que es el tratar aquí de la pequeña g.
s + 0 es, por supuesto, s, s lo es.
>> Así que ahora, es s *, que al igual que * 33 Oxford Street significa ir a la dirección
s.
Así que aquí está este dedo, la mano derecha.
Entonces, ¿qué voy a copiar en qué?
La cosa a la derecha, que es gabe, poco g aquí, en aquí.
>> Y por lo que el efecto de esa primera iteración del bucle,
como usted propuso, a pesar de lo que parece loco más complicado que cualquier cosa
que hemos visto antes, es simplemente decir ir aquí y copiar ese personaje aquí.
Te está dando un mapa para ambas localidades.
>> Y vamos a ver mucho más de esto.
Pero por ahora, la esperanza es sólo para introducir algunas de estas ideas básicas.
Y, de hecho, vamos a ver un programa final aquí,
y luego el claymation prometido, lo que hará que todo bien.
Bien.
Así que permítanme abro up-- ahí vamos.
Así que vamos Me-- volveremos a este cuadro en poco tiempo.
Permítanme abrir este último ejemplo aquí.
>> Así que aquí es un super, super programa que lleva a cabo
nada en la vida que hace lo siguiente.
En primer lugar, declara dos variables, x e y, que no son números de este tiempo,
per se.
No son números enteros, per se.
Ellos son aparentemente int *.
Así que a nadie, ¿qué significa si su tipo de datos, la variable,
es de tipo int * estrellas?
Esa es la dirección de un int.
>> Así que no tengo ni idea de donde está todavía.
Sólo significa "poner, eventualmente, la dirección de un int aquí ".
0x50, 0x88, donde quiera que esté en memoria, una dirección se va allí.
Y eso es lo que y es va a ser, también.
>> Si ahora digo x = malloc (sizeof (int)), esta es una manera elegante de decir,
oye sistema operativo, a través de malloc, dame suficiente memoria para el tamaño
de un int, que es probablemente va a ser de 32 bits o cuatro bytes.
>> Entonces, ¿qué volver malloc?
Malloc devuelve una dirección.
Entonces, ¿qué va a quedar almacenado en x?
La dirección de la parte de memoria, los cuatro bytes, que malloc
acaba de encontrar para mí preguntando el sistema operativo.
>> Ahora Mientras tanto, la línea cuatro aquí, el * x = 42.
Para que quede claro, lo que está pasando ahí abajo?
En la parte izquierda, * x.
eso es como * 33 Oxford Street.
Así * x significa qué?
>> AUDIENCIA: Ir a.
>> DAVID J. MALAN: Ir a esa dirección.
Dondequiera que parte de la memoria es, ir a ella.
Y poner lo que hay, obviamente?
AUDIENCIA: 42.
DAVID J. MALAN: 42.
Muy bien, * y, misma idea.
Vaya a la dirección en y.
Ponga el número 13 allí, pero lo que es y en este momento?
AUDIENCIA: No hay memoria para y.
DAVID J. MALAN: Hay hay memoria para y.
Así que lo que hace y, probablemente, contener, como hemos venido diciendo?
>> AUDIENCIA: Garbage.
>> DAVID J. MALAN: Algunos valor basura.
Ahora, el valor de la basura es todavía un número.
Todavía se puede confundir con una dirección.
Es como si alguien garabateó algo hacia abajo,
y me malinterpretó el sentido de algún edificio por la calle.
Y si lo que intenta entrar en algún edificio que no es dueño,
o algún trozo de memoria que no tiene sido dado, las cosas malas pueden suceder.
Ordenador podría bloquearse, o algún otro comportamiento indeterminado podría suceder.
>> Así que la introducción, a continuación, a Binky es esto.
Todavía recuerdo, 20 y tantos años más tarde,
donde estaba cuando finalmente entendido punteros.
>> Es decir, si usted salir de aquí en tres minutos
y creo que no lo hago entender punteros, se dan cuenta
Me he acordado de 20 años, por alguna razón loca
cuándo y por qué finalmente se hundió en, sentado con mi enseñanza
compañero, Nishat Mehta en el parte posterior de Eliot Dining Hall.
Ahora, me he acordado esto porque esto era
uno de los temas que, en particular, luchado con.
Y entonces, por fin se hace clic, como me atrevo a decir un montón de temas
finalmente lo hará.
Y ahora, para hacer que se sienta todo el más feliz y más convincente,
vamos a echar un último vistazo en nuestra últimos tres minutos aquí en Binky,
de nuestro amigo, Nick Parlante de Stanford.
>> [REPRODUCCIÓN DE VÍDEO]
>> Oye, Binky.
Despertarse!
Es tiempo para la diversión puntero.
>> ¿Qué es eso?
Aprenda acerca de los punteros?
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 no parecen estar apuntando a nada.
>> Eso es correcto.
Inicialmente, punteros no apuntan a nada.
Las cosas que apuntan a los llamados pointees, y que fueron creados de
una etapa separada.
>> Oh, cierto, cierto.
Lo sabía.
Los pointees están separados.
Er, así que ¿cómo asignar un pointee?
>> -OK.
Bueno, el código asigna un nuevo pointee número entero,
y esta parte se presentan xa apuntan a la misma.
>> 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, voy a necesitar mi Varita mágica de anulación de referencia.
>> -Tu Varita mágica de Desreferenciar?
Eso-- eso es genial.
>> : Este es lo que el código se parece.
Voy a configurar el número, y [POP]
>> Oye, mira.
Ahí va.
>> -Así Haciendo un desreferenciar en x sigue la flecha para acceder a su pointee.
En este caso, una tienda 42 en allí.
Hey tratar de usarlo para almacenar el número 13 a través del otro puntero, y.
>> -OK.
Voy a ir por aquí ay, y obtener el número 13 de puesta en marcha.
Y luego, tomar la varita de Eliminación de referencias y justo [BUZZ]
>> Oh!
>> Oh, bueno!
Eso no funcionó.
Diga, Binky, no creo dereferencing y es una buena idea, porque usted sabe,
la creación de la pointee es un paso separado.
Y yo no creo que nunca lo hicimos.
>> Punto Bien.
-Si.
Asignamos el puntero y, pero que Nunca configurarlo para que apunte a un pointee.
>> -Muy Observador.
Oye, te ves muy bien allí, Binky.
¿Se puede arreglar para que los puntos de Y a la misma pointee como x?
>> -Seguro.
Voy a usar mi varita mágica Puntero de Asignación.
>> -¿Es Que va a ser un problema como antes?
-No.
Esto no toca los pointees.
Sólo cambia un puntero a apuntar 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 un pointee.
Así que usted puede probar la Varita de Eliminación de referencias volver a enviar el 13 más.
>> Uh, OK.
Aquí va. [POP]
>> Oye, mira eso.
Ahora dereferencing obras en y.
Y debido a que los punteros están compartiendo que uno pointee, ambos ven el 13.
-Si.
Compartir, lo que sea.
Así que vamos a cambiar de lugar ahora?
>> Oh, mira.
Estamos fuera de tiempo.
>> -But--
>> -Simplemente Recordar las tres reglas de puntero.
Número Uno, la estructura básica es que usted tiene un puntero,
y apunta a un pointee.
Pero el puntero y pointee están separados,
y el error común es la creación de un puntero,
pero que se olvide de darle una pointee.
>> Número Dos, desreferencia puntero comienza en el puntero
y sigue su flecha sobre para acceder a su pointee.
Como todos sabemos, este sólo funciona si hay
un pointee, qué tipo de vuelve a la Regla Número Uno.
>> Número Tres, puntero asignación tiene un puntero
y cambia para que apunte a la pointee mismo como otro puntero.
Así que después de la cesión, los dos punteros
apuntará a la misma pointee.
A veces, eso se llama intercambio.
Y eso es todo lo que hay que hacer, de verdad.
Bye-bye ahora.
[FIN REPRODUCCIÓN DE VÍDEO]
DAVID J. MALAN: Eso es todo por CS50.
Nos vemos la semana que viene.