[TEMA MUSICAL] ALTAVOZ 1: Hola, todo el mundo. Bienvenido de nuevo a la sección. Precioso día fuera-- que es por eso, que soy Seguro, hay solamente cuatro de ustedes están aquí y no nuestro paquete de costumbre. He estado enfermo este fin de semana. Así que no tengo Starburst para ustedes. Y puedo empezar a toser terriblemente largo de este. Así que tengan paciencia conmigo. Voy a tratar realmente y obtener a través de esta primera, sin embargo, antes de que tenga un ataque de tos. Pero apenas ser fácil en mí un poco bit-- eso es todo lo que pido. Así que nuestra agenda para hoy-- sólo un reminder-- su concurso es la próxima semana. Te lo dije la semana pasada por lo que no coger con la guardia baja. Así que me lo estoy recordando de nuevo. La próxima semana su concurso. Con ese fin, la semana próxima de sección será mucho más de-- voy a tratar y trabajar en alguna revisión. Así que si ustedes pudieran ayudarme enviándome las cosas que usted se sienta cómodo con, que te preocupa, temas que le gustaría para me cubro, eso sería genial. Así que puedo tratar de trabajarlos en nuestra sección de la semana que viene o enviar material adicional o preparación que no podría obtener en otros lugares. ¡Sí! Más gente está viniendo! Pensé, qué he hecho tan mal pasado semana, que nadie quiere volver? Tengo miedo. Así que los otros tres cosas que vamos a repasar son redirección, archivo de E / S, y a continuación, los punteros y memoria dinámica. Estoy seguro de que ya está todo súper emocionada acerca de pointers-- tema favorito de todos, tan simple de entender. Estoy seguro de que todos los chicos tienes eso, ¿verdad? Así que lo primero es lo primero, redirection-- esto es básicamente un camino para controlar la forma en que la entrada las cosas en su programa, cómo usted las cosas de salida de su programa. Las principales formas en que ustedes han sido interactuar con él es sólo a través de fuera estándar con su pantalla de impresión aquí. Pero hay maneras de pipe-- como vemos aquí es uno de los nuestros palabras- de la tubería que la información o que los datos en un archivo de un archivo. Es sólo diferentes formas de hacer las cosas en su programa y fuera de su programa, en lugar de acaba de imprimir a esta pantalla o introducir cosas desde la línea de comandos. Así que primero es poco mayor que símbolo de intercalación. Así output-- simplemente imprime la salida a un archivo en lugar de la pantalla. Así que si usted tenía algo que imprime "Hola, mundo!" a la pantalla, si lo pones en su lugar a output.text, que crea este archivo llamado output.text. Y cuando se abre, va a decir "¡Hola, mundo!" en ese país. Esto puede ser muy útil si usted tiene un montón de errores en realidad, como podemos ver en este caso. Si lo haces dos intercalación, que va a imprimir los mensajes de error. Así que si usted está teniendo un problema con compilación, que tiene una gran cantidad de errores y que estés empantanarse en intentar para desplazarse a través de la línea de comandos a través de todos ellos, se puede simplemente imprimir en un archivo, abrir ese archivo para que usted puede desplazarse a través de ellos más fácil. En realidad, yo utilicé que un mucho cuando fui depurando mis 181 conjuntos de procesadores de la máquina de aprendizaje. Así que puede ser muy útil más adelante. También es útil si tiene un programa que tal vez es la generación de una biblioteca o la generación de un conjunto de cadenas, y usted tienen que ser capaces de ver que que les está generando correctamente. Esta es la manera de hacerlo. Así que si usted las imprime en un archivo, puede examinar más fácilmente, ¿no? Versus tratando de desplazarse a través de su línea de comandos. Y luego una cosa a tener en cuenta es que con sólo el mayor de acento circunflejo, si usted está escribiendo a un archivo que ya exists-- así como si nos encontramos con esto la primera tiempo, lo ponemos a output.text, y luego tuvimos un segundo programa que este impreso como programa de dos e hizo un mayor que a output.text, sobrescribirá que-- así sobrescribir lo que fue alguna vez en ese archivo para empezar. Así que si usted desea anexar a un archivo, como vemos aquí, que acaba de hacer dos veces mayor que los signos. Y va a anexar a la misma. No será sobrescrita. Así que si usted necesita para ejecutar múltiples programas y tipo de mantener pista de lo que todos ellos son volver a usted en un archivo, esa es una manera de hacerlo. Si no le importa lo que está en su archivo y ha permitido a sobrescribir, que sólo puede utilizar un solo mayor que. ¿Eso tiene sentido para todo el mundo? AUDIENCIA: Como punto slash hola mayor que el texto del punto de salida, al igual que dos veces, sólo va a mostrar en la salida sólo dot texto una segunda tiempo-- ALTAVOZ 1: Derecho. Por lo que sería básicamente por completo sobrescribir lo que estaba allí para empezar. Si este archivo aquí, el output.text ya existe, básicamente como se llame que de nuevo con un solo mayor que sólo puede pensar en él como al igual que reemplazó el archivo. Al igual que cuando usted está ahorrando una Palabra documento y usted ahorrar como, y se mantiene el mismo nombre, y sobrescribe completamente it-- este es el mismo tipo de cosas. ¿Alguien tiene alguna pregunta sobre sólo dar salida a un archivo? Impresionante. Así que, obviamente, si se invierte el flecha dirección, se puede hacer de entrada. Así que cuando ustedes tenían como César o Visioneer y que tenía a la entrada de algo, usted tenía un argumento de línea de comandos que en realidad entrada de la misma. Esta es otra manera de hacerlo. Así que en lugar de esperar para la línea de comandos, como cuando se le pida para su mensaje de César o Visioneer, si usted tenía un archivo de texto que tenían su mensaje, usted podría escribir en eso. Así que si esto fuera como punto slash César 3 menos de texto de entrada flecha, que es su mensaje, que iría bien. Cuando el programa de César en realidad preguntado por la entrada del usuario, ya lo tendría porque que ha escrito en este archivo. Eso es sólo otra manera. Sólo un reverso de output-- acaba de introducir para sus datos. Y a continuación, el último es la tubería. So cool bastante de éste. Porque le permite tomar la salida de uno programa y lo puso como de entrada a otro programa. No sé si alguno de ustedes jugado con el descifrado CS50 que podría tener te ha dado, pero sería le permiten tomar alguna muestra presentar, escríbalo en su cifrado, y luego desde allí escriba que en su descifrado para asegurarse de que resultó la misma. Así que es una especie de bucle de tres vías. No te lo pienses. AUDIENCIA: Si un programa tiene múltiples entradas, ¿hay una manera de decir que lo que de entrada a utilizar el archivo de texto o la salida de? ALTAVOZ 1: Cuenta con múltiples entradas. Sea cual sea presentar su input-- cuando es pidiendo de entrada que por primera vez, es va a suponer, creo, es ir a la tubería en todo el archivo. Así que si usted tiene múltiples entradas, que estás va a ser de tuberías en varios archivos. Así que si usted está pidiendo mensajes tres veces en su código, usted va a estar poniendo en tres archivos diferentes. Y se pone loco. Y usted no debería tener que preocuparse de eso ahora mismo. Pero esa es la idea. Así que sí, es la tubería de salida de sólo uno programa utiliza la entrada en el otro. Todo el mundo bien allí? Enfriar. Okay. Usted probablemente no tendrá de hacer demasiado con ella. Pero usted debe entender maneras que usted puede utilizar esto. Y hay algunos casos que es posible que desee utilizarlo. Así que presento I / O- Yo sé lo que eres diciendo-- que estamos acostumbrados a la lectura de y por escrito a nuestra pantalla de allí, que es estándar y la salida estándar. Y eso es lo que ustedes han sido haciendo desde el comienzo de la clase aquí. Pero también se puede leer y escribir archivos, que es lo único archivo I / O- modo de entrada de archivo, salida es todo lo que representa. Así que esto significa básicamente que usted puede almacenar sus datos ahora. Cuando usted acaba de imprimir a la pantalla, es básicamente ha ido, ¿verdad? Tan pronto como usted hace "Hola mundo "y ejecutar" Hola mundo " imprime "Hola mundo" en la pantalla. Pero realmente no se puede hacer nada con ella a partir de ahí. Si almacena en un texto archivo, y de repente usted tiene estos datos que se le permite manipular o ponerlo en un archivo, o ponerlo en un programa posterior. Una de las razones razón por la que hacemos esto es sólo como una manera de almacenar datos para su uso posterior. Tengo un par de pasos aquí simplemente caminar a través de estándar I / O. En el paso uno, necesitará crear una referencia al archivo con todo tapas del archivo de estrellas. Así que crea un puntero a un archivo. Así que usted quiere para abrirlo. Y usted dice, literalmente, archivo sólo es igual a fopen. Y esto va a devolver un puntero al archivo que acaba de abrir. Vi un par de ustedes chicos en horas de oficina. Pero una de las cosas es punteros remember-- puede haber alguna dirección o nula, ¿no? Si alguna vez tenemos un caso en el que algo puede devolver null, ¿qué tenemos que hacer antes de que alguna vez lo usamos? Tenemos que comprobar si es nulo o no, ¿verdad? Debido a que algunos de ustedes pueden haber tenido el problema por el que cualquier objeto estaba siendo devuelto en ruptura era nula. Ha intentado realizar alguna función en él. Y su sitio informático criticado. Derecha? Apuesto a que un par de ustedes puede haber tenido ese problema. Así que con fopen, fopen, o bien devolver un puntero al archivo, o si algo sale mal, que va a devolver null. Así que siempre hay que comprobar que no ha vuelto nulo antes de intentar hacer cualquier otra cosa. Esto es como un paradigma estándar que usted va a necesitar aquí. Si alguna vez hay una posibilidad de que algo podría devolver null, comprobar para asegurarse de que no lo hace antes de continuar. De lo contrario, te vas para obtener encantadoras faltas sitio. Y a nadie le gusta tratar con aquellos. Así que como vemos aquí, el primer argumento es sólo la ruta de acceso al archivo. Si no existe ese archivo, que va a crear ese archivo. Y sólo va a estar en blanco. Y a continuación, el segundo argumento es el modo que desee. ¿Queremos leer de este archivo? ¿Quieres escribir de ella? ¿Quieres añadir? Así que en realidad lo que acabo de said-- si el archivo no existe y que está tratando de leer desde ella, que va a lanzar un error. Si el archivo nombre-- como si file.text aún no existe y desea escribir a ella, se creará un archivo en blanco llamado file.text para usted. Y si usted desea anexar, usted debe hacer lo mismo. ¿Eso tiene sentido? Si usted está tratando de leer desde un archivo que aún no existe, que va a lanzar un error. De lo contrario, se creará el archivo para que usted haga lo que quiera con ella. Enfriar. Ahora podemos leer el archivo. Y esto es sólo un poco de ir a través de las diferentes funciones que tenemos para el archivo de E / S. Esta voluntad ser necesario en conjunto de procesadores de esta semana, si no recuerdo mal. Sí, absolutamente será necesaria en conjunto de procesadores de esta semana. Así fgetc devuelve el siguiente carácter. fgets sólo devuelve una línea de texto. Se devolverá nada hasta una nueva línea, y se romperá. Así fread lee un cierto número de bytes y los coloca en una matriz, que es algo que se podría quiero hacer con re-size-- podría ser útil. ¿Cuántas personas han leído la especificación de conjunto de procesadores, por cierto? Okay. [Inaudible] ALTAVOZ 1: OK. Bien. Definitivamente leer que-- es un conjunto de procesadores de la diversión. Tienes la oportunidad de recuperar un recuerdo borrado card-- realmente emocionante cuando funciona. Pero sin duda, comenzar a leer eso. Venga a hablar conmigo si tiene preguntas al respecto. OK, así que como iba diciendo, fread lee un cierto número de bytes. Eso es un número arbitrario que se va a establecer. Y entonces sólo fseek mueve a una determinada posición. Así que tal vez usted no cuida acerca de los próximos 10 bytes. Lo que desea es pasar directamente. Usted no se preocupan por ellos. ¿Quieres leer a partir de las 11 bytes. fseek le permite hacer eso. Por lo tanto, le permite ser selectivo acerca de lo que estás leyendo. Debido fgetc, fgets, y lectura fread a partir de un cierto lugar en el archivo. Una manera de pensar en esto es si esta es nuestro archivo, cuando se abra por primera vez, usted tiene esta posición en el archivo que comienza por el principio. Siempre que llame fgetc, fgetf, o fread, que va a empezar desde esta marca de posición. Digamos que lo que desea es leer este trozo de memoria aquí. No se puede llamar. Tienes que buscar por aquí y luego leer a partir de ahí o leer, consigue, o getc, dependiendo de lo que quieras. Así que busque sólo le permite omitir partes de la memoria. Y esa es la única manera puede omitir cosas sin leerlos en su búfer. ¿Eso tiene sentido para todo el mundo? Obviamente, hay una gran cantidad de aquí-- paralelo nuestra redirección de la salida o de entrada, usted ha leído y escribir. Así fputc simplemente escribe un carácter en el archivo. fputs escribe una línea. Fprintf imprime una salida formateada. Así que si usted tiene pestañas, o en el espacio, o lo que sea. Y entonces fwrite escribe algunos matriz de bytes a un archivo. Así que esto es de la misma manera fwrite y fread son análogos fgets opposites--, fputs, y luego un montón fputc y fgetc-- , cosas rápidas de locos. Sólo tipo de mantener este handy-- usted tendrá diferentes momentos donde tal vez lo que desea un carácter a la vez. Tal vez usted quiere una línea entera. Con su pset-- diccionario que se encuentra en dos conjuntos de procesadores, Yo creo, te damos un todo diccionario en un formato de texto que tiene cada palabra separados por una línea. Así que si querías leer en una palabra a la vez, lo que podría utilizar si estás leyendo y todos están separados en nuevas líneas, y lo que desea es una palabra a la vez? Audiencia: fgets ALTAVOZ 1: Derecho. Fgets-- ya que devuelve lo que está en una línea. Y si cada palabra es su propia línea, podemos utilizar fgets. Enfriar. ¿Eso tiene sentido, todo el mundo? Fresco? Sí, vamos a llegar a la parte divertida con punteros muy pronto, en el que llegar a hacer un poco de matemáticas. Y va a ser grande. Última step-- cerrar el archivo. Con tantas cosas aquí, uno de nuestros paradigmas es si se puede volver nulo, comprobar nula. Si abre algo, será mejor que lo cierre. Aceptar, por lo que no está hecho hasta que esté terminado a menos que haya cerrado la misma. Algo así como que no ha terminado hasta que la señora gorda canta. Eso es como cerrar el archivo. Como se dice aquí, sólo reiterar, siempre abrir el archivo antes de que esté leyendo o escribiendo en ella. Y siempre cerrarla si has abierto. Bien? Enfriar. Así que aquí está un ejemplo. Así tiny-- No sé si usted chicos pueden ver que muy bien. Si tan sólo pudiéramos aumentar el brillo de alguna manera. Déjame hacer esto realidad, si puedo. Bueno, ustedes no pueden realmente ver eso en absoluto, puede usted? Bien, vamos a hacer esto, entonces. [Inaudible] Supongo que esto es mucho mejor para ver. ¿Alguien puede ver donde mi ratón se fue es la pregunta? Ah, ahí lo es-- lucha! Okay. Básicamente, ustedes deben tener tipo de una idea de lo que esto está haciendo. No es perfecto. Pero prefiero explicarlo de gastar más tiempo tratando de formatear correctamente. Básicamente, como se ve aquí, empezamos con abrir el archivo. Y tenemos algunos archivo de base de datos que estamos la apertura que dice que es nuestros estudiantes. Y vamos a escribir en él. Así que por supuesto, devolver null. Así que tenemos que comprobar si hay nula. Y luego, si no es nulo, pasamos por. Y como puedes ver, estamos bucle a través de aquí. Hay estudiantes. Los estudiantes de hash es definida como tres. Y lo que estamos haciendo es que estamos imprimir en el archivo, ¿no? Así que lo que estamos imprimiendo a nuestro archivo? AUDIENCIA: Las calificaciones que se encuentran en la matriz? ALTAVOZ 1: Sí. Las puntuaciones que se encuentran en la array-- exactamente. Así que estamos abriendo este archivo de base de datos, lo que Supongo que es algún tipo base de datos de los grados. Y sólo estamos imprimiendo el puntuaciones de cada estudiante para ese archivo. Fresco? Bueno. Impresionante. Okay. Volvamos a-- AUDIENCIA: Tengo una pregunta rápida. ¿Es el printf no en el bucle for? Eso es sólo en el caso de bucle? ALTAVOZ 1: No, es en el bucle for. No puedo ver mi ratón muy bien aquí. Así que estoy luchando por formato que correctamente. Este soporte debe desaparecer. Debería estar aquí abajo. Esto es lo que está en su ciclo for. Ya está. Ahora que es bastante. Así que es como debe ser: con excepción para ese último tramo que me despedí. Okay. ¿Eso tiene sentido para todo el mundo? Okay. Vamos a seguir adelante a la siguiente cosa entonces-- que, en realidad, vas a tener que ver el código. Así que sólo voy a copiar que en este momento. Okay. Así que voy a mostrarle chicos este código. Y quiero que usted pruebe y figura lo que se supone que debe hacer. Así que dado que-- tomar un minuto más o menos. Trate de averiguar lo que está pasando aquí. ¿Alguna idea? Sabemos que tenemos por lo menos dos argumentos en la línea de comandos, ¿verdad? Supongo que una de las cuales va a ser que [inaudible] de nuestro programa es y luego algo más. Porque si [inaudible] es menor de dos, gritamos en ellos. Derecha? Y a partir de la utilización, se ve como que va a haber algún tipo de archivo. Todos estamos de acuerdo con eso? Así que ahora, ¿cuál es el bucle haciendo? ¿Qué va a través? AUDIENCIA: Todos los archivos. ALTAVOZ 1: Exactamente. Se va a través de todo el los archivos que hemos de entrada hay. Así que para cada archivo, es la apertura de una cuerda allí. Es la apertura de ese archivo. Derecha? Y está la lectura de la misma. Por supuesto, comprobar si es nulo. Y luego está la impresión. Si es nulo, es sólo que nos dice que eso no es un archivo que existe. Porque recuerda, con lea nuestro archivo tiene que existir. Derecha? Con escritura y de anexión, usted puede salirse con la suya. Pero con lectura, nuestro fichero tiene que existir. Y luego, si existe, ¿qué estamos haciendo aquí? Vamos a empezar aquí. ¿Qué es esto hacer-- este primer carácter. ¿Qué hace? Se pone un personaje, ¿no? Entonces, ¿qué está haciendo esto? Se está haciendo el primer carácter. Alguien sabe EOF? AUDIENCIA: Fin de archivo? ALTAVOZ 1: Fin de file-- exactamente. Así que va a ir a través de todo el archivo, ¿no? Y luego se va a actualizar por conseguir todos los personajes posterior. Derecha? ¿Y qué está haciendo? AUDIENCIA: Poner que en-- ALTAVOZ 1: impresiones putchar para el protector de pantalla. [Inaudible] el carácter. Y luego, cuando se [inaudible] esto cerrará el archivo. AUDIENCIA: ¿No necesita un [? otra cosa? ?] ALTAVOZ 1: No necesariamente. Quiero decir, es una especie de implícito en esto. Debido a que este vuelve, sin embargo, siempre ya que esto no coge esto, usted está muy bien. Quiero decir que es probablemente bueno practicar a hacer una cosa. Pero una cosa no es siempre especialmente necesaria si tienes algo como un retorno, que significa que en este caso si las capturas ella, su programa va a terminar y que nunca va a llegar a esto. Es más para el caso de que usted es no necesariamente volviendo algo. Porque si esto no era devolver nada, esto significaría que si esto fuera cierto, el resto de este seguiría funcionando. Y en ese caso, querría un falso. Si se trata de volver, y final de su programa, una persona no es necesario todo el tiempo, dependiendo del contexto. Jacob, ¿sabía usted tiene una pregunta? AUDIENCIA: Sí. También lo hace fgetc obtener el siguiente personaje? ¿Cómo aumenta el carácter? ALTAVOZ 1: Sí. Así fgetc obtiene el siguiente carácter. Usted puede pensar en él como C ++ en un sentido. AUDIENCIA: Entonces, ¿qué era EOF? ALTAVOZ 1: EOF es el final del archivo. Es sólo un marcador que le permite saber que estás en el final de su archivo. Así que esto va a imprimir a su salida estándar. Y luego se va a cerrar el archivo cuando se hace. Y luego vamos a ir a el siguiente archivo, ¿no? Así que en general, lo que hace este programa? [Inaudible] ALTAVOZ 1: Sí. Simplemente imprime todo lo que hay. Así CAT si ustedes han utilizado alguna vez y luego el nombre de algún file-- No sé si alguno de ustedes tiene Alguna vez has hecho eso en su terminal. Pero si alguna vez utiliza el comando CAT-- C-A-T- y entonces cualquier cosa archivo usted tiene que allí-- lo imprime a su terminal, que puede ser muy útil para algunas cosas. Yo lo uso mucho. ¿Eso tiene sentido para todo el mundo? Fresco? Aceptar lo que su tarea sea por ahora-- sí mismo o con la gente alrededor de usted-- es simplemente escribir un programa sencillo que se acaba de escribir "Hola, mundo!" en un archivo. [Inaudible] [Inaudible] ALTAVOZ 1: yo estaba como, lo hizo Lo hago tan mal la última semana? Yo no creo que haya sido tan malo. Me alegro de que estés aquí todo. Realmente me hace feliz. Soy una chica de los placeres simples. A mí me gusta cuando mi sección asiste. Así que me estoy haciendo esto empezó por ustedes para que podamos codificar juntos. No me gusta poner a nadie en el lugar a menos que usted quiere ser. AUDIENCIA: Para el concurso, hacer tenemos que escribir un programa? ALTAVOZ 1: Se le puede pedir a escribir programas sencillos a mano. Sí. AUDIENCIA: El concurso es la semana que viene, ¿no? ALTAVOZ 1: El concurso es el próximo miércoles. Eso significa que hay una encantadora [? CSE?] clasificación de fiesta después, que significa que obtendrá su puntuación espalda que noche-- en qué momento? Quién sabe? Pero va a ser esa noche. Bien. ¿Cómo queremos que empezar esto? Te voy a dar un hint-- comienza con esto. AUDIENCIA: Usted tiene que abrir un archivo. ALTAVOZ 1: Sí. Entonces, ¿qué es lo que quieres llamar a esto? ¿Es lo que desea es llamarla "archivo"? Vamos a hacer que sea fácil. Así que ¿cuál es nuestra fopen-- prueba de salida va a ser? Llámelo "Hola." Y lo que es nuestro modo? ¿Qué estamos haciendo con este archivo? AUDIENCIA: Leer. Escribir. ALTAVOZ 1: Estamos escribiendo a la misma. Precioso. Aceptar, por lo que tenemos este archivo ahora. ¿Qué necesitamos hacer? AUDIENCIA: Compruebe si es nulo. ALTAVOZ 1: Compruebe si es null-- exactamente. Eso es lo que me gusta escuchar. Eso debería ser automática, especialmente más o menos a partir de ahora. Si empiezas en violación de segmento, es probable que no comprobar la nula alguna parte. Nueve de cada diez veces, eso es va a ser su error. Así que si usted podría conseguir en el hábito, compruebe siempre si es nulo, tu vida va a ser agradable y easy-- o más fácil. Así que comprobar para ver si es nulo. Así que si no es nula, lo que es lo que es igual a la explosión significa: no null-- es válida. ¿Qué queremos hacer? Sólo queremos imprimir a ese archivo, ¿no? Entonces, ¿qué vamos a utilizar? AUDIENCIA: fprintf ALTAVOZ 1: Fprintf-- encantadora. Y fprintf toma dos arguments-- donde que va y lo que queremos imprimir. Así que ¿cuál es la primera? ¿Dónde va? AUDIENCIA: Archivo. ALTAVOZ 1: Se va a presentar. ¿Y qué es lo que queremos impresa? "Hola, mundo!" Bien. Tenemos una última cosa-- otro gran paradigma aquí. AUDIENCIA: Cerrar. ALTAVOZ 1: Cerrar. Hay que ir. AUDIENCIA: ¿Esto está ocurriendo si el archivo es nulo? ALTAVOZ 1: No, esto es si no es nulo. AUDIENCIA: ¡Oh, si es no-- Aceptar. Para el fopen y luego el dos argumentos que van dentro, ¿qué significa de nuevo el primer argumento? ALTAVOZ 1: El argumento es al igual que el nombre del archivo que desea ir. Así que después de esto se ejecuta, lo haría tener algún archivo llamado "hola" que tenían "Hola, mundo" dentro de ella. Eso es todo. Sólo el nombre. AUDIENCIA: Y ya que es la escritura, la archivo no tiene que ya existen. ¿Es eso lo que dijiste? ALTAVOZ 1: Derecho. Exactamente. Si "Hola" como un archivo no existe, sin embargo, que es va a crear un archivo llamado Hola "y escribir en él para usted. AUDIENCIA: Cuando usted está diciendo el programa escribió en el fichero, ¿Por qué escribes "archivo" en lugar de el nombre del archivo y fprintf-- ALTAVOZ 1: Debido a que en este caso, tenemos que gran FILE-- todo en estrella caps--, presentar. Así que es un puntero al archivo que usted está hablando. Esta es la forma que que acabamos de referirnos a ella. Así que en este caso, puede pensar en aha file--, podemos utilizar esto-- archivo aquí se refiere a la apertura de "Hola" y dejando que se escriba. AUDIENCIA: ¿Podríamos poner un "Hola" en lugar [? de justo?] archivo f? ALTAVOZ 1: No, porque "Hola" tiene que ser abierto y se pueda escribir. Presente aquí es como un designador que dice bien, que tener este hello-- file-- que estamos viendo. Ha sido abierto. Y vamos a escribir en él. Si usted sólo tiene que utilizar "Hola", que está encapsulado en el mismo. Así que va a flipar. Quiero decir, usted podría haber llamado él. Podrías haber hecho archivo, estrella, "Hola", es igual que. Pero el punto es que usted necesitará un puntero estrella archivo en orden para poder utilizar estas funciones. AUDIENCIA: ¿Podría usted hacer archivo, estrella, archivo, "Hola" o qué tienes que poner presentar estrella, archivo por ella? ALTAVOZ 1: Usted podría hacer archivo, estrella, "Hola." Usted puede cambiar esto a cualquier nombre que desee. Es completamente arbitraria lo que llamo. Usted puede nombrar cualquier cosa. Nombre volando espaguetis, si querías. AUDIENCIA: ¿Qué es la "w" entre comillas para? ALTAVOZ 1: La "w" es sólo el modo. Así que estamos escribiendo a este archivo. Todo el mundo bien? Claro? Sí. AUDIENCIA: Así que cuando se escribe este archivo, ¿dónde nos encontramos entonces ese archivo? ALTAVOZ 1: Va a ser en el mismo directorio que usted está actualmente en. Si estás en conjunto de procesadores de tres y ejecutar este, dentro de su conjunto de procesadores tres carpeta va a ser este archivo se llama "Hola." Fresco? Todo el mundo bien? Me siento como si estuviera todo conseguirlo, lo cual es genial. Okay. Así que de vuelta a mi show-- diapositiva Me encanta cuando las cosas funcionan. Aceptar, pointers-- ¿Son ustedes emocionado? Los punteros son grandes. Toman un poco para envolver su cabeza alrededor. Este es mi segundo año punteros de enseñanza. Y creo que por fin lo conseguí. Así que si usted lucha, que está bien. Como he dicho antes, hacer dibujos ayuda mucho con las cosas en la CS, tanto como yo creo que la gente tiende pensar oh, estamos frente a una computadora. Debemos sólo código. Imágenes de dibujo no-- realmente le ayudará. Y realmente te animo a aprovechar su lado kindergartner y llevar a cabo los creyones o marcadores y tablas. Debido a que le ayudará. Y si me ves en las horas de oficina, yo será llevar alrededor de pilas de papel con las plumas de dibujo las cosas. Así especialmente con pointers-- hacer dibujos. Y estoy seguro de que estamos en realidad va a estar dibujando algunas fotos aquí también. Así que ustedes todos llegamos a ver Binky, esta cosa divertida animación con plastilina. Y pensamos que es realmente divertido cuando que explota en un montón de piezas. Es un poco de alivio cómico para la clase. C [inaudible] esta gran capacidad ser capaz de controlar la memoria. Y es una de las cosas que realmente lo convierte en un lenguaje tan poderoso. Pero con gran poder viene gran responsabilidad. Y las cosas locas que puede suceder si usted no tiene cuidado. Así que cuando usted está utilizando punteros, que quieren hacer Seguro de que realmente entiende exactamente lo que estás haciendo. Esperemos que el próximo poco de el tiempo le ayudará realmente a entender punteros, cómo usarlos, y cómo manipularlos. Así memory-- Estoy seguro de que hemos este diagrama visto antes. Así que esto es sólo un simple diagrama de cómo las cosas podrían ser almacenados memoria. Así que, básicamente, tiene estos grandes arreglos de bloques de un byte es lo que tenemos aquí-- ligero incrementos en uno cada vez. Esto es en hexadecimal [inaudible] por lo que los bloques de ocho bits. Y cada bloque se asocia con un poco de dirección hexadecimal. Así que si alguna vez ve la 0x, eso es sólo notating que se trata de una dirección hexadecimal. Usted puede asumir que esto significa alguna dirección en la memoria. Estamos hablando de las direcciones de memoria cada vez que vea hexadecimal. Tenemos enteros son variables, carrozas son variables que almacenan. Así ints almacenar enteros. Tienda flotadores flota. Así que también tenemos punteros que las direcciones de memoria tienda. Eso es una especie de mapeo. Los punteros son exclusivamente para direcciones de memoria. Así que eso es como el tipo de allí. Su aparato es de 32 bits, lo que significa que su dirección de memoria es de cuatro bytes. Así que cualquier puntero que tienes También va a ser cuatro bytes. O bien si se trata de cuatro bytes, la memoria es de cuatro bytes. Memoria de almacenamiento de punteros. Por lo tanto, son cuatro bytes. Cool-- sólo quieren reforzar eso. Usted debe obtener este cómic ahora. No sé cuántos de ustedes son aficionados xkcd, pero me encanta xkcd. Es genial. Bien. Así que la creación de pointers-- como he dicho, es más o menos como cualquier otra cosa. Usted tiene un tipo. Usted tiene un nombre. Derecha? Eso es lo que tenemos allí. [? Hex?] Significa estrella es un puntero, y luego lo que quieras llamarlo. Así que el tipo representa lo que puede almacenar. Bien? De la misma manera que si lo hacemos enteros, sabemos que estamos almacenando un int allí. Con un puntero, se ejerce en una dirección de memoria. Pero lo que significa es que-- es donde aquí un dibujo va a venir muy bien. Así que en este caso, tenemos algunos value-- digamos cuatro. Cuatro es en dirección de uno. ¿De acuerdo? Esta primera uno aquí significa que es un puntero de 2x. Derecha? Es cierto puntero x. x puede ser algo, lo que sea. Cualquiera que sea x es-- decir x es cuatro. Se va a almacenar el dirección de memoria aquí. Así int, estrella, x-- esto es alguna otra ranura en memory-- que sabe lo que es esto. Pero va a almacenar una dirección aquí. Así que este sería como-- en este caso, lo que, se almacena a 0x1-- lo que se almacena en la dirección que nuestro puntero se mantiene, tiene que coincidir con lo que hemos designado. Así que en 0x1, en este caso, esto es x. Esto sólo puede ser nunca una int mientras estamos usando esto. Del mismo modo, si tenemos 1a otra, cualquiera que sea la dirección se guardan con un y tiene a ser una misma cosa char-- con z. De la misma manera, cada vez que se tratar de hacer INTX es igual a 0,4, que va a gritar a usted y ser como no, dijiste que querías un int. Esto se supone que es un int. Deja de tratar de hacer que sea un flotador. Así que deja que las cosas sean lo que quieren ser. Deje que las cosas sean ellos mismos. Así que algo grande está a sólo cualquiera que sea el tipo de puntero que es, esa es la única que puede almacenar allí. ¿De acuerdo? Con la práctica, como con la semana pasada, todo parece muy amable de abstracto. Vamos a hacer un poco de práctica. Debe tener más sentido. Así referencia y dereferencing-- es realmente importante para obtener estos recta. Todavía tengo que refrescar de vez en cuando. Y yo soy como espera, lo que uno es lo que quiero? Así que el signo realmente dar que la referencia o la dirección de. Por lo tanto, devuelve la dirección en memoria de qué variable se almacena. Así que va a volver realmente a usted un hexadecimal, mientras que eliminación de referencias que realmente se va a dar los datos que se almacena allí. ¿De acuerdo? Así que vamos a ver un ejemplo muy rápido, o en realidad hasta la próxima. Okay. Así que tenemos que pensar realmente cuidadosamente acerca de esto. Así que aquí tenemos algún entero x. Voy a tratar de dibujar este a lo mejor de mis habilidades. Así que vamos a tener esta ranura x. Y está el almacenamiento de cinco. Su dirección es 0x4. Fresco? Todo bien. Así que ahora tenemos este puntero. Fue por aquí. Y el símbolo de unión nos da la dirección de algo. Así, en este caso, es la dirección de x. ¿Cuál es la dirección de x? 04-- y este puntero es a 0x08. Fresco? Así que usted puede pensar en esto puntero, 04, sólo señala hacia aquí. Y se llaman punteros porque a medida que más en esto, vas a ver que apunta a las cosas. Y a una cuadra apuntando a otro bloque hará mucho más sentido. Así que aquí son dos. Y luego tenemos algunos copia, que es 0x0c qué--. Y se va a eliminar la referencia de nuestro puntero. Así que lo que está diciendo es OK, aquí está nuestro puntero. El valor se almacena es 0x04, ¿Y qué que está diciendo es ir a esta dirección y dime lo que está en él. Así que eso es efectivamente lo que esta flecha está haciendo. Usted puede pensar en esto como su estrella. Así que bien, cuando hacemos estrella, que significa seguir. Vaya a esta dirección. Y eso es, básicamente, sólo después de esta flecha para este trozo de memoria. Y nos dan lo que hay en él, que es 5. Es por eso que nuestra copia es igual a 5. ¿Eso tiene sentido? ¿Me necesita a nadie para ir a través de que de nuevo, o más lentamente? ¿Quieres que me vaya a través de él una vez más? Okay. Vamos a volver a dibujar de nuevo. Cuando empezamos, todos estamos de acuerdo que tenemos algún trozo de memoria que es una variable x que nos propusimos igual a 5. Nosotros no controlamos donde está en la memoria. Así que este lugar es sólo arbitrariamente asignado. Bueno allí? Okay. Luego inicializamos un puntero a un int. Es por eso que se le permite apuntar a x porque tenemos un int en aquí. Tenemos otro trozo de memoria porque este puntero es una variable como cualquier otra cosa. Se le asigna arbitrariamente algo de espacio en la memoria. Y lo que se almacena es la dirección de x. Ampersand significa dirección de x. Entonces, ¿cuál es la dirección de x? AUDIENCIA: Es zero-- ALTAVOZ 1: 0x04. Así entonces-- último. Tenemos algunos copy-- de nuevo sólo otra variable. Así que vamos a asignar un lugar arbitrario. Y nosotros desreferenciar nuestro puntero. La estrella significa ir a la dirección almacenada en mi puntero. Dime lo que hay. Así que la dirección almacenada en nuestro puntero es 0x04. Así que vamos a esa dirección. Está apuntando a esa dirección. ¿Qué hay dentro de este bloque de memoria? Es un cinco. Así que eso es lo que nosotros asignamos nuestra copia. Todo el mundo bien? Enfriar. Imágenes nuevo--. Así que el seguimiento de los valores aquí-- Estoy va a dejar que ustedes piensan acerca de esto. Podemos sacar otra foto. Pero quiero que usted pruebe y la razón a través de esto por su cuenta durante un minuto. Como no dan nosotros una dirección de ejemplo, Yo sólo voy a hacer x-- signo lo que debería ayudar a impulsar a casa. Ampersand significa dirección. Así, en el primero, todo el mundo ir con la primera línea. Algunos de x five-- algún conjunto ranura aleatoria en la memoria. Int indicador de la estrella es igual a la dirección de x, ¿verdad? Puntero estrella Int crea este bloque, lo llama el puntero, y asigna a la dirección de x. Soy terrible en símbolos de unión. Ahora lo que estamos haciendo es que decimos Aceptar, eliminar la referencia de nuestro puntero. Así que vamos bien, lo que está en nuestro puntero? Es símbolo de unión x. Ir a ampersand x y reasignarlo. Así que ahora, signo x va a ser 35. Así que, básicamente, cuando estás eliminación de referencias, que vaya bien. Usted va a ser el dibujo foto como esta. Usted va a ser el dibujo sus flechas sobre dónde está. Así que ir a esta ranura en la memoria y, o bien dame ese valor de nuevo, o alterarlo. En este caso, debido a que estamos en este valor, estamos asignando a ser 35. Mientras que en el pasado uno, si te fijas, nos fueron la asignación de lo que era aquí a otra cosa. Así que tienen este cuadro impresionante. No es tan malo. Ustedes trabaja en él. Voy a llamar a cabo en el tablero. Vamos a llenarlo juntos, ¿de acuerdo? Así que coge un poco de papel, agarrar un socio, empezar a trabajar. Voy a conseguir un mayor trozo de tiza. Debido a que va a ser mucho. Okay. PROFESOR: OK. Vamos a empezar con la primera fila. Vamos a empezar ahí, entonces ustedes tal vez puede trabajar a través de un poco más. Okay. una es igual a b c así que lo que es un? No es una pregunta con trampa, te lo prometo. ESTUDIANTE: 4 veces 5. PROFESOR: 4 veces 5. 20. Entonces, ¿qué es b? ESTUDIANTE: 4. PROFESOR: Y c? ESTUDIANTE: 5. PROFESOR: 5. Y entonces este es sólo va a ser un signo, símbolo de unión b, ampersand c, ¿verdad? No está mal. Es bastante simple. Okay. Así que la siguiente. A es igual a veces c, en caso nadie estaba familiarizado con eso. ¿Todo el mundo conoce con los tiempos es igual a? Bien, todo esto significa: esto es abreviada de una es igual a veces c. También puede hacerlo con la división, con la adición, con la resta. Usted puede hacer una iguales, o un punto a favor es igual a c significa que a es igual a un plus c, un menos igual c sería igual a un menos c. Es sólo el azúcar sintáctica. Por lo tanto, en este caso, a es igual a unas veces c nos lo darían? Una vez más, no es una pregunta con trampa. ESTUDIANTE: 100. PROFESOR: 100. ¿Cambia algo más? No. Tal vez voy a conseguir finalmente mejor en mis símbolos de unión. ESTUDIANTE: OK, lo siento, ¿cómo se obtiene el 100? PROFESOR: OK. Así que a es igual a una veces c, así que una veces c. ESTUDIANTE: Oh, estás usando una para el previous-- PROFESOR: Sí. Así que estos son nuestros valores más recientes. Estos son lo que debe ser utilizando a medida que avanzamos hacia abajo, en Aceptar. Por lo tanto, b es la única cosa que cambia, ¿no? Así que vamos a llenar en todo lo demás. B. ¿Qué es b va a ser? Ser o no ser. Entonces, ¿qué está haciendo esto? ¿Cuál es la estrella pa hacer? ESTUDIANTE: El código para la ubicación de pa. ESTUDIANTE: No, no del todo. Así que esta es una referencia d. Estudiante: Entonces b es el valor de la mano de pa. PROFESOR: Sí, así es pa la dirección de una, ¿verdad? Así que está diciendo ir a donde a es almacenada y darle ese valor. Entonces, ¿qué es b? ESTUDIANTE: 100. PROFESOR: 100. Perfect. OK, así que la PC es lo que está cambiando. Todo lo demás se mantiene igual. ¿Qué es PC va a ser? Asignación simple. Pc es igual a pa, y lo que es pa? ESTUDIANTE: Ampersand a. PROFESOR: Perfecto. Ahora estamos llegando interesante. OK, vamos a romper este uno abajo. En primer lugar, ¿cuál es B veces c, porque eso es la parte fácil de este uno, ¿verdad? B veces c es-- ESTUDIANTE: 500. PROFESOR: Sí, así que lo que está haciendo este, Si es pb estrella, lo que está cambiando? ESTUDIANTE: ¿Qué hay en el-- PROFESOR: ¿Qué hay en B? ESTUDIANTE: ¿Qué hay en el espacio que el PP está apuntando. PROFESOR: Y PB está apuntando a-- ESTUDIANTE: B. PROFESOR: B. Así que la única Lo que cambia es b, derecha. Así b veces c, 500. Así que eso es lo que cambia ahora. Enfriar. Precioso. Ustedes están haciendo muy bien. Muy bien, rompiendo este uno abajo. C está cambiando, ¿no? Así que podemos llenar en todo lo demás. Vamos a ver. Okay. Sabemos que c va a ser la producto de dos números, ¿no? ¿Qué dos números, sin embargo? ESTUDIANTE: A y C? PROFESOR: Entonces a es adecuado para la primera. Así que estamos haciendo referencia D p de una, ¿verdad? P de unos puntos a una, así que sabemos que esto va a ser 100 veces más de lo? Los tiempos lo que hace punto PC a? Puntos a una. Así que 100 veces 100 es 10.000. ¿Eso tiene sentido? Enfriar. Recta final, chicos, última fila. Okay. ¿Qué está cambiando en esta lista? ESTUDIANTE: A. PROFESOR: A. perfecto, por lo que todo lo demás puede permanecer igual. Okay. Y lo que es una? Así que es un momento, ¿qué? Esto es pb estrellas. Así pb estrella significa que aquí está pb, pb a puntos b. ESTUDIANTE: 500. PROFESOR: 500. Así que tenemos 500 veces 100. Eso es 50.000. ¡Menos mal! Mira eso. ESTUDIANTE: ¿Por qué tenemos el & c de la last-- PROFESOR: Lo sentimos. ESTUDIANTE: Oh, OK. PROFESOR: Mi mal. Las porciones de la escritura. Todo el mundo bien? No está mal, ¿verdad? Solo se necesita un poco mientras que para trabajar a través. Si lo desglosamos, entender lo que cada parte se está refiriendo como a-- con todo lo que es, sí-- descomponerlo a la pequeña problemas y luego se recombinan, y usted puede hacer algunas cosas impresionantes. Hay las respuestas, pero nos hicieron eso. La aritmética de punteros. Ah. Mis manos son todos calcáreo. Así que sumar o restar int ajusta el puntero por el tamaño de el tipo de puntero. Recuerde cómo cada tipo tiene un tamaño diferente? Así como un doble o un largo tiempo es el ocho y cuatro, pero es int char es uno. Entonces, ¿qué quieres hacer es-- una cosa para recordar es sólo que la cantidad de su valor del puntero cambia realmente dependerá de la tipo de puntero que es. Todo el mundo bueno con esto? ¿Puedo borrarlo? Estamos bien? Impresionante. Así que si tenemos algún puntero que-- esto va a ser: soy va a hacer que sea un puntero int. Almacena esto. Si tuviera que decir puntero más uno, lo que va a hacer se va a actualizar por el tamaño de un int porque esa es la tipo de puntero que es. Con C, todo es muy estricto y regulado. El puntero int va a actualizar por la cantidad de espacio en un int tomaría. Un int es de cuatro bytes. Entonces, ¿qué sería esta vuelta en? No eres más que añadir cuatro en este. Ahora el puntero podría ser: Aceptar. Así que si se trataba de un char y lo hicimos puntero más uno, ¿cuál sería ahora? Si started-- fingiendo que started-- ahora es 0x08. Ahora vamos a decir que se trataba de un charlas puntero, y hemos añadido una. ¿Qué haría falta para cambiar? ¿Cuántos bytes es un char? AUDIENCIA: Uno. ALTAVOZ 1: Uno. AUDIENCIA: Así 0x09. ALTAVOZ 1: Así que sería de nueve. Así que sólo algo para recordar. Justo cuando se agrega uno, no es la adición de uno a menos que sea un char. Es la adición de cuántos bytes del tipo que es, es por ello que tenemos esta ecuación aquí. Así que es int veces el tamaño del tipo de puntero. Así tenemos el ejemplo aquí. y fue asignado a ese valor, 0x4, cuando lo hicimos y además es igual a uno. ¿Qué hay en él, lo que es en x, no cambia. Lo que sí cambia es lo que está en y. La dirección almacenada en y actualizado por cuatro porque hay cuatro bytes en un int y es un puntero int. Bien. Así que ahora tenemos otro ejercicio. Así que la pregunta es qué va a imprimir. ¿Alguna idea? AUDIENCIA: El número de personajes de gato feliz? ALTAVOZ 1: Exactamente. Así que, como con su cadena. ¿Todo el mundo consigue eso? ¿Queremos que caminar a través de él? Sí, OK. Así que lo que tenemos que aquí-- como esto mucho más. Yo no tengo que [Inaudible] ridículamente. Así que tenemos nuestra cadena aquí, gato feliz. Precioso. Tenemos algún contador que estamos no perder de vista. Así que tenemos algunos char * puntero que sólo se fija igual a STR. Lo que esto hace es que es la asignación de algún puntero al inicio de la cadena. Porque estoy seguro, ya que se mencionó en la conferencia, les hemos dado chicos este tipo de datos llamado cadena. Pero en realidad son sólo cadenas una matriz de-- como char *. Es un puntero a un montón de personajes que son contiguas en la memoria. Así que este sólo establece que igual a cualquier cadena es identificado por donde su primer personaje. Así que esto se acaba poniendo algún momento igual al principio de la cadena. Todo el mundo bien allí? Enfriar. Así que esta es nuestra eliminación de referencias de puntero. Así que en realidad va a darnos algún valor aquí, en nuestra cadena que estamos hablando. Y estamos diciendo todo el tiempo que no es nulo terminador. Así que seguir adelante hasta llegar al final de la cadena. Actualice su puntero por uno. Así r, se actualizará en realidad por uno cada vez, porque este es un char, el char *. Así que va a pasar. Se va a actualizar. Así que la primera vez que esto pasa, que va a estar aquí a las h. Se va a actualizar. Va a ser un a. Va a ser una p, y, y así sucesivamente y así sucesivamente. Vamos a actualizar mostrador. Cuando llega al final, sólo imprime hasta qué punto se ha vuelto. Sí. AUDIENCIA: Así Cuenta el espacio como uno, ¿verdad? Okay. ALTAVOZ 1: Piense en ello. ¿Es eso una pregunta-- AUDIENCIA: [inaudible]. ALTAVOZ 1: No se preocupe. Esto lo hago. Muy bien, así que lo único que entender es que con una matriz, también se puede tratar como un puntero porque matrices son sólo manchas continuas de memoria. Así que usted puede tratar de la misma manera. Usted puede manipularlos con punteros, también. Así que en vez de hacer, en este caso, la cosa análoga sería array 0 es igual a 1. Pero de la misma manera que una cadena se determina por el inicio de dónde su primer personaje es, una matriz está determinado por donde su primer elemento es. Porque sabemos, estamos garantizado, que estos van a ser continua bloques de memoria. Eso es lo que nos permite hacer esto. Sabemos que están continua bloques de memoria. Así que en este caso, por eliminación de referencias sólo matriz, que nos dice: Aceptar, vaya al inicio de su matriz, que está aquí. Así que usted puede configurarlo igual a uno. Y en este caso, sea cual sea su matriz tipo es, al actualizar por uno, eso es igual que la actualización al siguiente índice. Usted puede hacer eso porque usted saber lo que hay en la matriz. Por lo tanto, sabe cuánto Actualiza tu puntero, lo que la dirección de actualizarlo a tan que usted está en la siguiente ranura. Así que esto es sólo una forma diferente de la escritura matriz 0 es igual a 1, matriz 1 es igual a 2, serie el soporte 2 es igual a 3. Es sólo otra manera de pensar en ello. Debido a que son continuas bloques en memoria, puede hacer referencia a ellos, ya sea por la matriz notation-- que yo personalmente encontrar easier-- pero tal vez que necesita para manipularlo estrictamente por las direcciones de memoria. Y esta es la forma en que lo harías. Algo así como una más de Lo bueno que podría hacer frente a lo mejor no algo que te en realidad va a implementar. Yo lo uso en el 61. Ustedes probablemente no necesites que preocuparse demasiado. Pero si usted está interesado, tener 61 años después. Estamos en los chicos recta final. Yo sé, es larga. Memoria Dinámica Allocation-- así que sabemos que uno de las cosas cuando hablamos durante nuestra primera sección juntos, nos fijamos en un canje función de donde estaba fuera del alcance de nuestra función principal. Y estábamos pasando en estos valores que eran efectivamente copias. Y una vez terminado de intercambio ejecución, que acaba de salir de una pila. Recuerde que tenemos una apilar marco de intercambio. Deja ya los los valores se van con él. Y se fueron. No podíamos hacer nada con ellos y nos entristeció porque no podemos cambiar nuestros valores. Pero con C, como ya he mencionado, que tener una gran cantidad de poder sobre la memoria. Así que lo que puede hacer usted es puede asignar las cosas en el montón aquí que se quedarán allí hasta usted les dice lo contrario. Son como niños buenos. Se quedan allí. No dejan. Se quedarán allí hasta que esté como, OK, puede irse. Mientras que las cosas en la pila, que-- son como niños traviesos. Ellos sólo huyen cuando desee estar allí y luego se van. Usted no puede recuperarlos. Así que el montón es-- vamos a hablar de malloc y libre, que Estoy seguro de que los chicos oído hablar en la conferencia. Y eso es básicamente una manera para tener datos muy persistentes. Así que usted puede mantener los datos alrededor de todo el tiempo que quieras. Mhm. AUDIENCIA: ¿Puedes definir el montón y la pila? ¿Son como lugares para poner las cosas? ALTAVOZ 1: Así que son básicamente solo-- son la forma en que nos referimos sólo a la memoria. Así montón se coloca justo donde memoria se asigna de forma dinámica, mientras que la pila se refiere más para marcos de pila que son más central a la funciones que se ejecutan en realidad. Usted realmente no tiene control. La gran diferencia, usted tiene el control sobre el montón si quieres. Usted tiene menos control sobre la pila. La pila depende de la funciones que se están ejecutando, y el orden en el que son funcionan, y cómo se devuelven las cosas. Mientras que con el montón, como vamos a ver, se puede decir, OK, yo quiero que este valor sea alrededor hasta que te diga lo contrario. Usted no está autorizado a deshacerse de él. Usted no está autorizado a anularlo. Usted va a mantener en torno a durante el tiempo que yo te diga. Tienes la oportunidad de ser el jefe en el montón, mientras que el stack-- tal vez si como finagle su camino puede ser el jefe. Pero no del todo. Y no deja de ser la memoria. Es sólo diferentes maneras de referirse a la memoria. Enfriar. Así que con eso, cómo controlar su memoria. Es con malloc, que usted va a llegar a utilizar. Así que es sólo a corto para la asignación de memoria. Eso es todo lo que es. Hay un montón de otras fresco funciones que tienen alloc al final, y que representan diferentes cosas. Así que cuando usted necesita de almacenamiento que necesita para sobrevivir a su función actual, de modo que cuando su actual función huye, usted todavía tiene los datos que tiene de él, que desea utilizar malloc. Eso va a inicializar en el montón. Y como he dicho y sigo diciendo, podrás mantenerlo allí hasta que usted le indique lo contrario, que es lo importante aquí. Así que una cosa a notar, y eso es por lo general muy importante, es que este sizeof es super útil usar ya que dependiendo del tipo de de la máquina que se está ejecutando, puede tener cantidades variables de la memoria que se necesita. Así que siempre se desea utilizar el tamaño de lo que que usted no es dependiente de la máquina, para que su código será ejecutar en cualquier máquina. Y eso es sólo parte de escribir buen código. Si funciona en una máquina, pero no cualquiera de los otros, ¿Qué tan útil fue su programa? Así que uno siempre quiere asegúrese de usar y sizeof. AUDIENCIA: ¿Así es que al igual que la tamaño de 10 pulgadas [inaudible]? ALTAVOZ 1: Este es el tamaño de 10 enteros. sí. Así que el tamaño de enteros volverá cuánto puede uno tomar int. O el tamaño de char, cómo Cuánto cuesta una sola toma Char. Y a continuación, el número de bloques de que es lo que quieres? Así que en este caso, queremos algo que podemos almacenar 10 enteros a. Y va a trabajar independientemente de la máquina, lo cual es genial. Entonces, ¿cuántos bytes que en realidad le dará? Matemáticas rápida. AUDIENCIA: 40. ALTAVOZ 1: 40. Exactamente. Así que otra cosa grande. Puntero o malloc pueden devolver null. Así que de nuevo, siempre consulte a ver si se devuelve nulo antes de tratar de hacer nada con ella. Si tratas de eliminar la referencia este puntero ahora, que sólo va a segfault porque te fuiste y probado tocar nula cuando usted no debe tener. Así que siempre comprobar nula. Una vez más, todo lo que puede hacer. Puede devolver null. Se volverá nula si estás bien sin espacio, o por cualquier razón se topó con algunos errores de memoria. A veces sólo devuelve un valor nulo. Así que sólo hay que comprobar para ello. Eso es todo esta diapositiva está diciendo. Y entonces lo que tenemos aquí es un llamado a liberar. Así que de la misma manera que si abrir un archivo es necesario cerrar un archivo, si la memoria malloc, que Debes liberarte de que la memoria. Y ustedes van a conseguir para hacer cosas realmente cool. Y hay un programa que se puede ejecutar a ver si alguna vez la fuga de memoria. Pero usted no quiere perder memoria. Es realmente malo. A sólo estropear las cosas. Es malo para hacer lo mismo que la programación sabio para la eficiencia del diseño. Pero también es sólo un poco de malo para su equipo. Así las cosas simplemente gratuitas cuando malloc ellos. Ustedes ven el simetrías aquí. Súper simple. Apenas libre y luego cualquiera que sea el puntero, cualquiera que sea el nombre de el puntero es, y se encargará de liberar por usted. Enfriar. Luego tenemos esto. Así que sólo vamos a caminar a través de este programa. Y luego se hacen ustedes. Así que [inaudible] sólo principal. Así que tenemos un poco de puntero int *. Así que tenemos un puntero eso va a celebrar enteros. ¿Y cuántos enteros se va a celebrar? Sólo una. Tamaño de un int. Verificamos si puntero es nulo porque Es decir, queremos decir que no hacer nada. Es malo. Así es la impresión de un cierto error de memoria, lo más a menudo regresan 1, como ustedes están acostumbrados. Y luego tenemos aquí, eliminar la referencia de nuestro puntero. Así que eso significa que vamos a almacenar algo en el lugar que nos ha dado. Int * puntero, o malloc, devuelve el dirección de donde a un lado este memoria para usted. Así que es básicamente dándole como-- si pensar en un montón de casas en un barrio que usted quiere poner sus muebles en, malloc es como Aceptar, se obtiene para ir a la casa de tres. Y es que la da dirección de la casa de tres. Así que esto ahora mismo, esta tiendas puntero una dirección, almacena la dirección de su casa. * medios PTR, OK, estoy en mi casa. Enfriar. Necesito conseguir algún entero. Así que usted está pidiendo a alguien para darle muebles ahora. Para que pueda obtener algún int. Y lo pone en el puntero donde está señalando. Y entonces, sólo se imprime a cabo, siempre que sea introducida. Y de nuevo, la referencia. Así que esto es como usted fue a esta DIRECCIÓN Y usted vio lo que había allí. Fresco? Y luego, por supuesto, nos liberamos de nuestro puntero. No se olvide de liberar el puntero. No se olvide de comprobar la nula. No se olvide de liberar el puntero. Usted tiene dos cosas que usted recuerda de esto, o que usted debe recordar. Sí. AUDIENCIA: [inaudible] cosas así, el char * s. ¿Cómo es que nunca liberamos esos? ALTAVOZ 1: Hm? AUDIENCIA: ¿Son aquellos que, como cuerdas? Usted dijo que las cadenas son al igual que char * s, ¿no? Entonces, ¿por qué no nos liberamos cadenas? ALTAVOZ 1: Sólo para libre si usted está mallocing. AUDIENCIA: ¡Oh, si usted está mallocing. ALTAVOZ 1: Así que malloc y libre son dos cosas que siempre se debe tener juntos. f abierto, cerca de f, dos cosas usted debe tener juntos. En ambos casos, para comprobar nula. Sí. AUDIENCIA: Así es libre sólo permitiendo algo más para ser almacenados allí después de este programa lo ha utilizado? ALTAVOZ 1: Se acaba diciendo: Bueno, he terminado con esto. No es necesario para mantenerlo alrededor. De lo contrario, el equipo lo hará Al igual que tratar de mantenerlo allí. Y entonces usted can't-- se ejecuta en problemas de memoria más adelante. Uno siempre quiere liberarlo porque que le dice a su equipo, está bien, estoy hecho con este lugar de la memoria. Usted puede tener que volver para mí a usar más tarde. Fresco? Sí. AUDIENCIA: Así que usamos el% d sólo porque un doble que va a volver, o por qué es-- [inaudible]. AUDIENCIA: ¿Se puede utilizar% i? ALTAVOZ 1: Puede utilizar% i. Para cualquier duda de última hora? Seguir adelante. AUDIENCIA: Sólo tengo una pregunta rápida. Así que la variable ptr, Eso es-- como, con la int * ptr = malloc, eso es sólo diciendo que es apuntando a un lugar en memory-- ALTAVOZ 1: ¿Quieres [inaudible]? AUDIENCIA: --que es la tamaño de-- no, está bien. Pero es sólo apuntando a un lugar en memoria que es como cuatro bytes. ALTAVOZ 1: Derecho. Así malloc el tamaño de int dice, OK, yo voy a ir a correr fuera, encontrar cuatro bytes de memoria para usted. Cuando encuentra que cuatro bytes de la memoria, le da una copia de la dirección de donde empieza, y eso es lo que almacena en puntero, o PTR. Bueno. Ustedes miran menos confusa que la mayoría la gente cuando hablo de puntero, así que me siento muy bien en este momento. Bien. Como siempre, ustedes deben tener todos conseguido sus calificaciones PSet2 por ahora. Sé que ha habido una cierta wonky cosas donde dice, fórmula no es válida o algo así. Si usted está consiguiendo que, todos sus calificaciones son válidas de mi lado. Así que te puedo enviar capturas de pantalla de tus calificaciones. Sólo déjame saber así si eres falta ningún grados o algo no parece tener sentido. Ven a mí. He estado muy orgulloso de ti chicos ya, así que sigan así. Y tener un buen descanso de la semana. Estoy seguro de que voy a ver un poco de de que en horas de oficina.