[REPRODUCCIÓN DE MÚSICA] CAMILLE REKHSON: Hola, todo el mundo. Bienvenidos al concurso CS50 sesión de revisión cero. Soy Camille. Y yo voy a ir sobre algunos temas con usted chicos hoy para ayudarle prepararse para el examen. Así que aquí está nuestra no exhaustiva lista de temas que debe estar familiarizado con el cuestionario. Estos se toman directamente del plan de estudios. Sé que parece como un montón. Pero confía en mí, que has aprendido todos estas cosas en las últimas semanas. Así que sin duda nos vamos sobre una gran cantidad de ellos en la actualidad. Pero también tomar algún tiempo en su propia para revisar estas cosas. Y si usted no estaba familiarizado con lo que algunas de estas cosas son, asegúrate de pedir uno de nosotros. También, para la palabra oficial en el cuestionario, haga clic aquí. Esto tendrá toda la información con el que la habitación tiene que ir en, dividir alfabéticamente, y también algunos consejos sobre qué materiales usted debe estar estudiando, y qué tipo de preguntas de la prueba que puede esperar. Así que asegúrese de comprobar que fuera. Además, algunos consejos para cuando usted se están preparando para el examen. Practique la codificación en el papel. Sé que has acostumbrado a tener el cheque IDE para sus errores para usted, y es-- cuando estás escribiendo para arriba, que es un poco diferente de tener para escribir las cosas. Así que la práctica de hacer algo de código. Algunas buenas funciones para practicar haciendo son strlen y atoi, ver si se puede escribir quienes por su cuenta. Estar familiarizado con los boletines de problemas. La mayoría de los años no son preguntas que se relacionan a algunos de los materiales de problemas. Así que asegúrese de que usted entiende cómo hacer todos los boletines de problemas. Trate de hacer algunos de los antiguos concursos bajo la restricción de tiempo 75 minutos. Muchas de las pruebas puede ser un poco largo. Así que es una buena manera de dar un poco de práctica, y cuánto tiempo lo hará que tomar, y cómo debe dividir su tiempo para asegurarse de termine todo para el final. Y también, se obtiene una sola página, de dos hoja de referencia caras que usted puede escribir lo que quiero a utilizar durante la prueba. Así que cuando usted está creando eso, eso es también muy buena manera de estudiar porque podrás tipo de revisaremos cosas como usted está escribiendo. Así que cualquier pregunta general acerca de el cuestionario, o cómo funciona? Sí. AUDIENCIA: ¿Será que la lista de temas que sólo mostró estar disponible para nosotros ¿en línea? CAMILLE REKHSON: Esta toda la diapositiva espectáculo se ha publicado en el sitio web. Además, el video de la revisión de hoy sesión será en el sitio web. Así que no te preocupes demasiado por escribir las cosas en todas partes. Todo va a estar allí. ¿Alguna otra pregunta? OK, así que vamos a empezar. Así que una cosa es estar familiarizado con es los diferentes tipos de datos y el tamaño que adquieren. Esto también puede ser una gran cosa escriba en su hoja de referencia, sólo para asegurarse de que recordar todos estos. Pero- tan caracteres son 1 byte. Ints son 4 bytes. Un largo, largo, que es básicamente más espacio para un número entero, es de 8 bytes. Un flotador es de 4 bytes. Un doble, que básicamente le da más espacio para almacenar un flotador, es de 8 bytes. Y a continuación, un puntero es también 8 bytes. ¿Una pregunta sobre éstos? Así binario es otro tema que hemos cubierto un poco este semestre. Así que vamos a hacer algunos practicar con la conversión entre el binario y decimal. Así que alguien tiene alguna idea de lo que que primero sería? ¿Nadie? Sí, es 42. Así que si usted recuerda, cada de los lugares en binario es básicamente como 2 al poder de ese lugar. Así que el primer punto es de 2 a 0 el poder. Y tenemos 0 allí, así que no hay nada. El siguiente lugar es 2 a la primera potencia. Y tenemos un 1 allí, así que eso es básicamente un 2. El siguiente lugar es de 2 a la segunda, que es 4. No tenemos nada allí. El siguiente lugar más es de 2 a el tercero, lo que sería 8. Y nosotros tenemos una allí. Y seguimos adelante. Eso last-- la más a la que queda es donde tenemos 32. Y así, tenemos básicamente 32 más 8 más 2 para obtener 42. ¿Alguna pregunta? AUDIENCIA: ¿Cuál es el subíndice para? CAMILLE REKHSON: El subíndice básicamente nos dice que es binario. Así que hay un 2 allí. Si hubiera como-- en la siguiente uno, o cuando estamos convirtiendo decimal a binario, hay un 10 mostrándonos que este número es originalmente en decimal. AUDIENCIA: Gracias. CAMILLE REKHSON: Sí. ¿Alguna otra pregunta sobre que uno? OK, así que vamos a tratar el siguiente uno entonces, decimal a binario. Así que teniendo 50 y poner que en binario. ¿Cómo lo harías tú? Sí. AUDIENCIA: 110.010. CAMILLE REKHSON: Sí. Así uno-- una manera fácil de pensar la conversión de decimal a binario es a-- a menudo ayuda para escribir lo que las diferentes potencias de 2 son. Y luego ir a través de él, y ver cualquiera que sea la más alta uno de esos es que usted puede poner en la número decimal sin pasar por encima. Así que en este caso, uno de las potencias de 2 es 32. Así que 32 entra en 50. Pero el siguiente arranque sería 64, que obviamente no encaja en 50. Así que el más alto que tenemos es el 32. El siguiente hasta 16. Y 32 más 16 es sólo el 48. Así que todavía encaja en 50. Así que tenemos 1 de tanto de esos. Y luego si seguimos bajando, lo único que necesitamos dejamos es 2 más para conseguir 48-50. Así que tenemos un 1 en esa posición, y un 0 en la última posición. Porque no hay nada en del 2 al lugar 0-th. Las preguntas sobre la conversión decimal a binario? Así que ahora vamos a intentar hacer alguna adición binaria. Cómo cuando se agrega a esos dos para arriba? Sí. AUDIENCIA: 11.100. CAMILLE REKHSON: Sí. Así que haciendo además en binario es bastante lo mismo que hacerlo en decimal. Excepto si tiene dos ser de 1 se suman, 1 más 1 es 2, pero 2 en binario es 1 0. Así que hay que llevar a la 1, y tener llevarlo para esas columnas par. Y aparte de eso, sólo tiene que añadir normalmente. Para cualquier duda sobre eso? Sí. AUDIENCIA: Lo siento, lo que es el último lugar? Hay seis números. Así que la columna de la izquierda, ¿Qué valor tiene eso? CAMILLE REKHSON: En este fondo? AUDIENCIA: En el de arriba, por 50. CAMILLE REKHSON: Para 50? Oh, por lo que la izquierda una es 32. AUDIENCIA: 32? CAMILLE REKHSON: Sí, así lo haría ser 32, 16, a continuación, 8, 4, 2, 1 o 0--. Bueno, es 2 el cero, que es 1. Sí. ¿Alguna otra pregunta sobre esto? OK, así que a continuación vamos a hacer un poco con hexadecimal. Así que esto podría ser un poco menos familiar, porque sé que hemos hecho mucho más con binario. Pero una muy buena manera de pensar en hexadecimal es para romper un binario número en 4 trozos bits. Debido a que cada 4 bits de una número binario es básicamente uno de los números hexadecimales. Así que si tenemos esta primera, tenemos básicamente ocho 1 de. Así que estos se pueden dividir up-- AUDIENCIA: 255. CAMILLE REKHSON: Diga eso otra vez. AUDIENCIA: 255 en decimal, o 0xFF en hexadecimal. CAMILLE REKHSON: Sí, lo es. Por lo tanto, si usted divide que hasta en dos trozos de 4 bits, tenemos básicamente cuatro grupos de 1. ¿Cuál es la maximum-- básicamente el máximo podemos obtener con 4 bits en binario. Y lo máximo que podría obtener por que en hexadecimal sería una F. Así tendríamos dos F. Para cualquier duda sobre eso? ¿Sí? AUDIENCIA: ¿Puede repetir eso. CAMILLE REKHSON: Claro. Así que cada uno, en el fondo, lugar de hexadecimal es equivalente a los 4 bits de un binario. Así que la manera más fácil de hacerlo es romperla en trozos de 4 bits. Así que en este caso, tenemos ocho 1 de. Así que si nos separamos los en dos trozos de 4 bits, tendríamos dos conjuntos de cuatro 1 de. Y cada uno de esos es equivalente a F. Si usted piensa sobre-- Sé que nuestros cerebros son tipo de cableado para pensar más a través de decimal, porque eso es lo que estamos acostumbrados. Así que una manera usted podría pensar en él como los cuatro de 1 es igual a 15 en decimal. Y 15 en hexadecimal es F. Así que eso es Otra manera de pensar a través de él. Sí. AUDIENCIA: ¿Cuál es la 0x buscas? CAMILLE REKHSON: El 0x denota que es hexadecimal. Así que sólo hay que poner que prefijo allí, normalmente. Otras preguntas sobre eso. OK, así que vamos a tratar de ir la otra manera a continuación. En este caso nos tener-- lo siento? AUDIENCIA: [inaudible]. CAMILLE REKHSON: Vamos a binario. Por lo tanto, va en sentido contrario. Pero en este caso, tenemos 5 y A. Así que si pensamos en esto, si cada uno de those-- el 5 y el A son tanto va a representar un 4 bits trozo, ¿Cómo dirías 5 en binario? AUDIENCIA: 0101. CAMILLE REKHSON: Sí, así que esa es la parte 0101. Y entonces, ¿cómo diría usted Un en-- AUDIENCIA: 10. CAMILLE REKHSON: Diga it-- lo siento? AUDIENCIA: 10. CAMILLE REKHSON: Sí, así esa es la segunda parte de ella. Y luego, si se pone los dos juntos, eso es cómo obtener la plena binaria para el hexadecimal. ¿Sí? AUDIENCIA: Para saber que A es 1010, qué tienes que memorizar? O puedes como-- CAMILLE REKHSON: Así que si usted-- la differe-- lo cuando usted está pasando binario, básicamente binario tiene 0 al 9 y luego una a F como sus 16 cosas. Así que si todo el camino 0 a 9-- si usted-- 9 y luego A, básicamente, si nos convertimos a decimal, A sería como 10, B sería como 11. Y si se piensa en la 1.010 binario es de 8 y 2, porque esos son los dos lugares que se suman a 10, que es exactamente lo que A es equivalente a. Así que eso es una especie de fácil forma de pensar en eso. Otras preguntas en hexadecimal. OK, así que ahora vamos a tomar Una mirada a los operadores bit a bit. Así que estos pueden definitivamente van a plantear en el cuestionario. Sé que no tenemos trabajado mucho con ellos. Pero sólo vamos a hacer un pequeño repaso de estos. Así que espero que estos serán un poco más familiar para usted. Así que los seis operadores bit a bit que hemos figuran en esta lista. Y nos dejaron manipular bits individuales. Así que el operador AND es un solo signo. No hay que confundir eso con el doble signo, que es la lógica y que nos permite comparar dos cosas. La sola Y es como podemos manipular las cosas a nivel de bits. Así que esto nos da el resultado de 1 si ambos de los argumentos que estamos comparando son los same-- o son 1. Y la barra vertical, OR, dará nos 1 si al menos uno de ellos es 1. Así que, básicamente exactamente lo que implican las palabras. Y, si los dos bits son 1, 1 y 1 nos da 1. Pero con la O, si es 0 o 1, o 1 o 1, en cualquier caso, tenemos 1 como uno de ellos. Así que nos encontraremos con un 1. AUDIENCIA: ¿Qué quieres decir que dice que da 1? CAMILLE REKHSON: La resultado. Algo así, como tú would-- si lo hicieras 0 y 1, el resultado de que sería 1-- o 0 y 1 con el resultado de eso sería 0, lo siento. Sí, era una especie de la resultado de la expresión. Y entonces, este símbolo de intercalación es el XOR, o OR exclusiva. Así que eso significa exclusivamente una o exactamente uno de los dos argumentos es igual a 1. Y entonces se le dará 1. La pequeña línea ondulada es el operador NOT. Así que a diferencia del resto de ellos, que operan en un par de bits, el operador NOT sólo toma un bit, y darle la vuelta. Así que si usted give-- si lo hace NO 0, sería darle 1. Y si no lo haces 1, le daría 0. ¿Sí? AUDIENCIA: ¿Cuál es la diferencia entre la O con una línea y el OR con dos? CAMILLE REKHSON: Así que la OR con dos líneas es el OR lógico. Así que eso es para comparar dos enteros completos, o dos-- para ver si las cosas son iguales. O como hacer esto es igual a este, O esto es igual a este tipo cosa. Mientras que la barra sola O, es para hacer las cosas a nivel de bits. Sí. AUDIENCIA: ¿Qué entiende usted por bit a bit? CAMILLE REKHSON: Así bit a bit está trabajando directamente con los bits en binario. AUDIENCIA: Oh, ya veo. CAMILLE REKHSON: Sí, así trabajar con 0 y 1 de de. Vamos a hacer un par de ejemplos de esto después, justo lo que no es demasiado confuso. Y a continuación, los dos últimos son el desviación a la izquierda y el desplazamiento a la derecha. ¿Cuáles son, básicamente, dos menos que signos o dos mayor que signos. Y cambiaron a poco el número dado de lugares que se le da en la dirección. Por lo que sería o bien cambiarlo a la izquierda, o hacia la derecha. ¿Sí? AUDIENCIA: ¿Cuál es la sintaxis para ejecutar? CAMILLE REKHSON: Vamos a ir a través de un ejemplo en un segundo. Así que espero, eso ayudará. ¿Tiene preguntas sobre solo lo que pasa aquí, antes-- Aceptar. Así que ir a través de algunos ejemplos. Vamos a empezar con los unos y. Qué sacaríamos si lo hiciéramos 0 y 1? AUDIENCIA: 0. CAMILLE REKHSON: OK, y si lo hiciéramos 1 Y 1? AUDIENCIA: 1. CAMILLE REKHSON: Sí, ¿y si lo hicimos 0 O uno? AUDIENCIA: 1. CAMILLE REKHSON: ¿Qué hay de 1 O 1? AUDIENCIA: 1. CAMILLE REKHSON: OK, ¿qué hay de 0 XOR 1? AUDIENCIA: 1. CAMILLE REKHSON: Y 1 XOR 1? AUDIENCIA: 0. CAMILLE REKHSON: Ustedes son buenos. ¿Qué tal NO 0? AUDIENCIA: 1. CAMILLE REKHSON: Y NO 1? AUDIENCIA: 0. CAMILLE REKHSON: Aceptar y, a continuación, este último uno es un pequeño con el desplazamiento. Así que si nos fijamos inicialmente x sea 8, y entonces y es x desplaza hacia la izquierda 3, lo que habría que darnos? AUDIENCIA: [inaudible]. CAMILLE REKHSON: Diga eso otra vez. AUDIENCIA: [inaudible]. CAMILLE REKHSON: Por lo tanto, esta en realidad nos da 64. AUDIENCIA: [inaudible]. CAMILLE REKHSON: Así que estoy va a escribir esto aquí, así que esto hace un poco de sentido. Si tenemos 2 al 0, 2 a la 1, 2 a la 2, de 2 a 3 va a ser 8. Y si queremos cambiarlo 3 bits más a la izquierda, que sería 2 a la 4, 2 a la 5, y 2 a la 6, y 2 a la 6 es 64. ¿Eso tiene sentido? Sí. AUDIENCIA: ¿Eso turno todos los años 1 y 0 de del número binario a el-- CAMILLE REKHSON: Sí. Y usted no tendrá que preocuparse sobre la concurso sobre éstos ser negativo. No vamos a hacer a lidiar con cambios negativos de ninguna manera. ¿Alguna otra pregunta acerca de esto? Sí. AUDIENCIA: Si está desplazando hacia la derecha, es cualquier cosa que wasn't-- cualquier cosa que no era originalmente parte de la cosa 0? CAMILLE REKHSON: Sí, lo haría sólo tiene que añadir 0 de encendido en el original. Sí. AUDIENCIA: Entonces, ¿qué es eso 100 desplazado hacia la derecha tres veces? CAMILLE REKHSON: 100 desplazado hacia la derecha, lo que llevaría toda la 1 y 0 de ellos y simplemente cambiar a la derecha tantas veces como que a desplazar a la derecha. AUDIENCIA: [inaudible]? CAMILLE REKHSON: Bueno, son 100-- que hablando de 100 en binario, o 100 en decimal? AUDIENCIA: Lo siento, 100 en binario. CAMILLE REKHSON: 100 en binario, si usted cambia a la derecha- si usted cambia de puesto a la derecha una vez, se convertiría en 10. Si usted cambia de puesto a la derecha dos veces, se convertiría en 001. Y entonces, si usted cambia de nuevo, que tipo de perder el bit. Sí, eso es sólo 0. ¿Alguna otra pregunta sobre esto? Sí. AUDIENCIA: Así que entonces se convierte en 000. CAMILLE REKHSON: Sí. OK, así que vamos a ir a través de un poco de matemáticas ASCII. Así que los personajes pueden esencialmente ser tratados como enteros con base en sus valores ASCII. Así que si nos sentamos int A es igual a 65, int B es igual a A más 1, int Char C es igual a D menos 1, y Char D es igual a 68, lo que imprima en la parte inferior? Por lo tanto, estamos imprimiendo these-- bendiga usted-- estamos imprimir todos éstos como caracteres basado en el porcentaje C. Así que estamos básicamente imprimir el valor del carácter de los cuatro de estas variables. Como sugerencia, 65 es el valor ASCII del capital A. Tal vez eso ayudó. ¿Qué? AUDIENCIA: ABCD. CAMILLE REKHSON: Sí, así esto sería imprimir exactamente ABCD porque nos pusimos int A igual al valor ASCII de A. Así que si imprimimos eso como carácter, que acaba de obtener el capital A, A más 1 sería una B mayúscula en ASCII. D menos 1 sería una C mayúscula en ASCII. Y 68 es el valor ASCII de D. Preguntas sobre ASCII? Sí. AUDIENCIA: Entonces, la comillas en A, hace que el cambio de A a la ASCII? CAMILLE REKHSON: Se uses-- que comillas simples count-- alrededor de la A lo convierte en un personaje. Y si usted está tratando con en el número form-- así que cuando, como en este caso, es siendo tratado como un int-- entonces sería tratar con su valor ASCII. Sí. AUDIENCIA: ¿Me recomienda que tenemos una tabla de referencia ASCII? CAMILLE REKHSON: No think-- AUDIENCIA: ¿O sería sólo tener trato con ellos? CAMILLE REKHSON: Creo que lo haría con las cosas fáciles. No creo que lo haría dolor de escribir tal vez lo mayúscula y minúscula A son, simplemente lo que los rangos están comenzando con. Pero no creo que usted necesita tomar todos el espacio para poner una tabla ASCII conjunto. Sí. AUDIENCIA: ¿Cuál es la diferencia entre decir int A y C carbón, como se hace en la parte superior? CAMILLE REKHSON: Así que es sólo lo que está almacenado en la memoria. Pero se puede tratar de cualquier manera. Como vemos aquí, lo hacemos de impresión el A como un personaje. AUDIENCIA: Así que eso es lo mismo que A? CAMILLE REKHSON: Sí. ¿Alguna otra pregunta? AUDIENCIA: Entonces, ciento C está diciendo imprimir un char? CAMILLE REKHSON: Sí. AUDIENCIA: Así que incluso si A tiene solamente ha definido como un entero, si tratamos de imprimir una Char como 65, que would-- CAMILLE REKHSON: Sería ir a básicamente va a la tabla ASCII y obtiene cualquier caracteres en la tabla ASCII para que el 65. AUDIENCIA: Gracias. CAMILLE REKHSON: Sí. ¿Sí? AUDIENCIA: Así que si usted hizo% I,% I, % I,% I, lo haría sólo print-- CAMILLE REKHSON: Sí, si se hizo todo un 4% de I, sería imprimir el ASCII los valores de los cuatro de estos. ¿Alguna otra pregunta? OK, así que el alcance, básicamente esto nos ayuda a determinar dónde existe una variable en su programa. Así que hemos hablado de dos diferentes tipos de alcance, globales y locales. Si una variable tiene el ámbito mundial, significa todo el programa tiene acceso a esa variable. Y si a nivel mundial alcance una variable, declararlo antes de que su función principal. Así se hace la derecha del palo. Y entonces su totalidad programa puede acceder a él. Si está con ámbito sólo a nivel local, que variables confinado a una región específica. Así que si usted declara dentro de un bucle for, sólo eso bucle for puede acceder a él. O si se declara dentro una función específica, Sólo esa función puede acceder a él. Preguntas sobre el alcance. OK, entonces la función de creación de prototipos. Básicamente porque C, cuando compila, lee de arriba hacia abajo. Si se declara una función tarde en su código, el compilador no sabe que existe esa función. Así que lo que usamos son prototipos, que básicamente dice el compilador, esta función existe, ir a buscar para más adelante en el código. Así que la forma en que lo haces un prototipo de función es exactamente la forma de empezar fuera escribir una función. Usted da el tipo de retorno, el nombre de la función, y luego los argumentos que realiza esa función. Por lo tanto, para mirar un ejemplo rápido, en este caso de que nuestra función que estamos usando aquí es básicamente una función de cubo. Así que teniendo en un entero y regresar al cubo de ese entero. Así que ya hemos escrito que función debajo de la función principal, y queremos utilizar el salida del que-- o nosotros quiere que la función en nuestra función principal, ponemos a su forma de prototipo en la parte superior de nuestro programa. Y luego, cuando llamamos que en nuestra función principal, el compilador sabe que esa función es escrita más tarde, y saldrá a buscarlo, y utilizará correctamente. Preguntas sobre la creación de un prototipo? Sí. AUDIENCIA: Entonces, ¿cuál es el punto? No entiendo el punto de prototipos. ¿Por qué no tenerlo ahí abajo? CAMILLE REKHSON: Bueno, si es aquí, entonces cuando se llega a la línea de cubo de x en su función principal, el compilador no tendrá idea de que la función de cubo realmente existe. AUDIENCIA: ¿No podría usted sólo hay que poner en frente? CAMILLE REKHSON: Es mejores prácticas de codificación para ponerlo bajo su función principal. Así que por eso lo haríamos hacer el prototipado. El hecho de que, si tenía una gran cantidad de funciones, que sería muy complicado para leer a través de todas esas funciones antes de llegar a la carne de su programa. Sí, y has tenido una q-- AUDIENCIA: Entonces, está declarando la variable en la parte superior para que pueda acceder a ella, que sea una variable global? ¿Eso es similar a este donde se declarándolo allá arriba, por lo que sabe que que va a acceder a él más tarde y se puede utilizar? CAMILLE REKHSON: Sí. Sí. AUDIENCIA: Si el-- cualquier adicional funciones que crean la llave exterior de esta cosa, o-- CAMILLE REKHSON: Sí, si usted es la creación de otra principal functions-- en sí mismo es por lo que si el function-- va a crear otras funciones, deben estar fuera. ¿Sí? AUDIENCIA: ¿Cuál es ciento D? CAMILLE REKHSON: Porcentaje D es lo mismo que por ciento I. Se refiere a un número entero. Sí. AUDIENCIA: Entonces, ¿cuál ha sido la obra principal int? ¿Cuál era ese vacío? CAMILLE REKHSON: Vacío dice que se necesita en ningún argumento. AUDIENCIA: [inaudible]. CAMILLE REKHSON: Puede usted hablar un poco más fuerte, lo siento? AUDIENCIA: Sí, lo siento, ¿por qué pones anular para el primero, y luego int de entrada para el segundo uno? CAMILLE REKHSON: Ah, para los dos diferente-- para la función principal en comparación con la función de cubo? Así que en la función principal, usamos void porque hay hay parámetros que se están adoptando en. Mientras que en el cubo función, tenemos una entrada. Es por eso que dice int, de entrada, porque hay argumentos que estamos teniendo en ejecutar nuestra función. Sí. ¿Hay preguntas? Aceptar y, a continuación, de forma rápida de punto flotante imprecisión. Así que tenemos un número infinito de números reales. Pero sólo hay una número finito de bits que podemos utilizar para mostrar los números, y les representan. Entonces nos encontramos con alguna imprecisión. Y los números no lo hará siempre ser bastante exactamente lo usted piensa que son cuando estás tratar con coma flotante. Esto es algo bueno saberlo. Preguntas sobre esto? Sí. AUDIENCIA: ¿Este refiriéndose a la idea de bit de desbordamiento que estuvo en la conferencia? ¿Era algo separado? CAMILLE REKHSON: Son totalmente independiente, sí. Vale genial. Pulak GOYAL: Hola, todo el mundo. Mi nombre es Pulak, y voy a estar repasando punteros. OK, así que primero vamos a pensar acerca de lo que la memoria se parece. Así como se puede ver aquí, tener memoria y lo dividimos por en un montón de bloques. Y nos referimos a cada bloquear por una dirección, ¿no? Y ¿alguien recuerda qué tipo de notación que utilizamos para indicar una dirección? AUDIENCIA: hexadecimal, 0X. Pulak GOYAL: hexadecimal, ¿verdad? Así que el 0X significa que estamos hablando hexadecimal. OK, así que ¿cómo creamos punteros? Así que tomamos el tipo, que poner it-- añadir una estrella a la misma, y luego le añadimos el nombre de la variable. Así que los ejemplos que hemos visto son int x estrella, estrella carbón y, y flotar comienzan z. Así que cuando digo int estrellas x, alguien puede decirme lo que estoy hablando de la clase de allí? DIRIGIDO: La ubicación del disco. Pulak GOYAL: Lo siento, ¿qué? ¿Puede repetir eso? AUDIENCIA: La ubicación del disco. Pulak GOYAL: Así actually-- así que lo que Quise decir, es cuando tenemos int estrellas x, que estamos diciendo es la creación de un puntero, y puede almacenar la dirección de un variable que es un int, ¿verdad? Así que con la estrella de carbón y, estamos creando un puntero que puede almacenar la dirección de una variable que es un char. Así que tiene sentido para todo el mundo? Vale, guay OK, así que con punteros, hay dos operaciones importantes que podemos hacer. Hay referencias, y Hay eliminación de referencias. ¿Sí? AUDIENCIA: ¿Podría ir un poco más lento? Pulak GOYAL: Claro. Sí, así que-- Sí, hacer preguntas a medida que avanzo junto si usted-- si algo no está claro. Así que hemos referencias y eliminación de referencias. Así que cuando se quiere obtener la dirección de una variable, luego usar el signo. Así que digamos que declaré int x en alguna parte. Y quiero conseguir la dirección de ese y pasarlo en, yo haría signo x. Y cuando usted desea conseguir el valor asociado con un puntero, utiliza el dereference operador, que es una estrella. Así que vamos a decir que tenía int estrellas x, y Lo tenía que apunta a algo. Si quiero obtener el valor de lo que es señalando, me acaba de hacer estrellas x. ¿Está claro? Para cualquier duda al respecto? Sí. AUDIENCIA: Así que en general, que no será capaz de hacer en x y estrella x x con el mismo. ¿Es correcto? Porque si x es una variables, entonces usted tiene que hacer en x para conseguir que se trata de un puntero. Pero si x es un puntero, entonces usted necesita hacer estrellas x para obtener la variable. Pulak GOYAL: Sí, por lo que el pregunta era acerca de cuándo usamos un star-- cuando usarías la estrella, y cuando se utiliza el signo, y podemos utilizarlo con el mismo tipo de variable? Así que por lo general si usted tiene, por ejemplo, un int x, usted mayormente a utilizar el ampersand para obtener la dirección de ese. Debido a que no hace sentido de deferencia hacia x. Considerando que, si tuviéramos int estrellas x, usted estaría utilizando la operación dereference porque no tendría sentido utilizar en x en ese caso. ¿Eso tiene sentido? AUDIENCIA: ¿Así que no puede y, a continuación, un puntero? Pulak GOYAL: ¿Así que técnicamente, en realidad puede hacer el signo de un puntero. Pero eso es fuera de la ámbito de aplicación de esta clase. Para el purpose-- para sus chicos ' efectos, cada vez que tienen punteros, desea utilizar el operador dereference para obtener el valor asociado con eso. Y cuando tienes regulares las variables, como un int x, desea utilizar el signo operador para obtener la dirección de ese. ¿De acuerdo? OK, así que echemos un vistazo a los punteros y lo que ocurre bajo el capó. Así que lo primero que hice aquí es la int declarado x es igual a 5. La dirección de esta variable es 0x04, y el valor es 5. Así que vamos a ver qué pasa con la siguiente línea. Así que ahora declaramos un puntero. Su dirección es 0x08, y su valor es la dirección de x. ¿Eso tiene sentido para todo el mundo? Para cualquier duda al respecto? OK, y ahora vamos a ver qué sucede con la siguiente línea. Así que con esta nueva línea, tenemos la dirección de la copia es 0x10, y su valor es 5. Así que la razón por la que tenemos de cinco es dijimos, dereference puntero, que declaramos un int estrellas. Y así went-- cuando dereference ella, se dijo, está bien, lo que está en el 0x04 ranura. Y fue a eso. Y lo que x es un x0-- 0x04, y el valor es 5. Tiene sentido? ¿Sí? AUDIENCIA: ¿Por qué es la dirección de la copia sólo 4 bytes por encima de la x del puntero? Pulak GOYAL: Sí, esto es un error en-- CAMILLE REKHSON: Así que, sí, recuerde esto está escrito en hexadecimal. Pulak GOYAL: Oh, sí. CAMILLE REKHSON: Así que esta es en realidad 8 y 16 ya dijimos que, el puntero, recuerde, en nuestro IDE va ​​a ser de 8 bytes de longitud. Pulak GOYAL: Sí. Así que para ser claros, punteros son 8 bytes de longitud. Un int es de 4 bytes. Así que la razón por lo que saltado de 0x04 a 0x08 es porque hemos tenido que hacer un salto de 8 bytes. Y luego ya para-- copia es sólo un int, es 4 bytes, que es un medio de 8 bytes. Así que sólo nos saltamos a 0x10, que es dos de distancia de 0x08. ¿Alguna otra pregunta? OK, let's-- sí? AUDIENCIA: ¿Por qué no es el valor de int copia simplemente el-- ¿por qué es 5 en lugar de 0x04? Pulak GOYAL: OK, ¿por qué es 5? OK, así que cuando el-- Así que vamos primero pensar en esto en términos de tipos. Así que estoy diciendo int copia es igual a estrellas puntero. Entonces, ¿cuál es el tipo de puntero? Es un int estrellas. Y cuando dereference que, el tipo se convierte en un int. Así que lo que esperamos para almacenar aquí es en realidad un int. Tiene sentido? AUDIENCIA: Claro, poco. Pulak GOYAL: Así que por lo general cuando usted piensa en términos de tipos, que ayuda a entender lo que es la tipo del valor que debería ir allí. Así que por lo general puede descartar muchos de estos errores comunes por pensar en términos de tipos. Déjame ir a través de un poco más diapositivas. Y podemos conseguir preguntas en el final de la sección puntero. OK, así que tenemos un programa con errores aquí. Y así lo hace anyone-- puede alguien decirle mí lo que está mal con este programa? Derecho, por lo que lo que estamos esperando que hacer aquí es-- lo que queremos hacer es tomar la variable int x y gire it-- hacen iguales 5 en lugar de 3 y luego imprimir eso. Pero eso no está sucediendo. ¿Puede alguien decirme por qué? ¿Sí? AUDIENCIA: Cuando la función to_five toma x, ya que es el argumento, no hace falta ser x sí mismo, sino en cambio crea una copia, una, de la misma. Y forma las operaciones en eso. Pero debido a eso, no lo hace cambiar el valor real de x. Puesto que usted es [inaudible]. Pulak GOYAL: Derecho, bien, así que cuando nos llamamos el to_five función, lo que que estamos haciendo es pensar, darme una copia de la valor a esa función. Esa función, entonces, va y haciendo algunas manipulaciones. Pero una vez que vuelve, es ahora fuera de ámbito de la función principal aquí. Y así x sigue siendo, de hecho, igual a 3, e imprimimos 3. OK, así que vamos a ver cómo sucede esto. OK, así que no hay nada declarado. Entonces, aquí, x es igual a 3. Y ahora es-- en la posición dos, un todavía no está en el alcance. Y ahora vamos a colocar tres, donde ahora asume el valor de 3. A las cuatro, ahora cambiamos una a 5. Pero ahora, cuando saltar de nuevo a cinco, que es la sentencia print, una está ahora fuera de alcance. Y x sigue siendo igual a 3. ¿Tiene esto sentido para todo el mundo? OK, así que ahora vamos a hablar de cómo podemos usar punteros para solucionar este problema. ¿Alguien tiene alguna idea de cómo nos podría solucionar este problema mediante el uso de punteros? AUDIENCIA: Usted toma en un int estrellas en lugar de un int para to_five. Pulak GOYAL: Lo siento, ¿podría hablar? AUDIENCIA: Usted toma en un int estrellas en lugar de un int para to_five. Pulak GOYAL: OK, sí. Así que vamos a pass-- vez de pasar simplemente el valor, vamos a pasarlo por referencia. Esta nueva función, ¿no? Y así, al pasar la dirección, nos puede hacer manipulaciones en la dirección. Y así estamos en realidad, De hecho, el cambio de x. Así que vamos a ver cómo funciona. OK, así que en este ejemplo nos lo arreglaron. Hemos cambiado nuestra firma de to_five para disfrutar de un int estrella en lugar de sólo un int aquí. Luego dereference este y asignar un 5 a la misma. Y ahora esa voluntad, de hecho, imprima 5. Así que vamos a ver cómo los pasos funcionan aquí. Así, con la primera etapa, no hay nada aún declarado. Así que aquí, con el segundo paso, hemos dicho que x es igual a 3, pero es todavía fuera de alcance. Ahora por la tercera línea, tenemos x es todavía igual a tres. Y ahora, hemos pasado en-- lo que es almacenado en una es ahora la dirección de x. ¿Eso tiene sentido para todos, cómo hemos llegado hasta eso? Cierto, tenemos la amper-- así es como pasamos un signo x para la función to_five. Y luego a la siguiente línea, lo que que hacemos, es que eliminar la referencia a. Y por eliminación de referencias a, podemos para cambiar el valor de x del 3 al 5. Debido x vive en esa dirección 0x12. Y luego, finalmente, cuando volvemos de nuevo a principal, aunque esto a es ahora fuera de ámbito de aplicación, hemos, de hecho, cambiado x. Y es 5. ¿Una pregunta sobre esto? ¿Sí? AUDIENCIA: ¿Puede usted decirme lo que el signo x era? Pensé signo era como AND. Pulak GOYAL: Sí, así que utilice la misma símbolo de muchas cosas diferentes. Así que aquí, cuando tener-- en este caso, cuando se tiene, Yo guess-- por lo que en este caso, cuando usted está tratando con los punteros, cuando se pone el signo delante de un int, una variable int o un char, o un flujo, lo que dices es, dame la dirección de este. Pero lo que estaba pensando, cuando lo demás usted utilizaría signo es, digamos, en una sentencia if. Usted tiene una verdad, y algunas variables que evaluar a algunas Boolean, y algunas otras variables que validan algunas de Boole y usted desea conseguir el y eso. De allí tendría que usar el signo. ALTAVOZ 1: Sí, así que sólo hoy, tenemos hablado unos tres usos diferentes de signo. Tenemos dos símbolos de unión, que es lo Pulak acaba de describir. Tenemos un símbolo de unión, que es lo que describe Camille antes, que es uno de signo. Y eso es AND bit a bit. Y notar que tanto el y- condicional o, lo siento, la lógica AND y el bit a bit Y, los que tienen dos números, ¿verdad? Fue algo Ampersand algo signo, algo algo signo. Aquí, cuando sólo tenemos ampersand algo, eso eliminación de referencias. Pulak GOYAL: Sí, buena pregunta. Sí. AUDIENCIA: ¿Por qué en línea 5a y protagonizar un convertido N / A? ¿Por qué no sólo tipo de retener la mismos valores de la línea anterior? Pulak GOYAL: Porque hemos salimos de la función. Y así lo happens-- así que-- ahora estamos fuera del alcance de esa función, lo que sucede en realidad es decir los que se eliminan de la memoria. Sí. AUDIENCIA: Entre 3 o 4 estrellas es igual a un 5. Pulak GOYAL: Sí. AUDIENCIA: ¿Qué es lo que significan exactamente? Pulak GOYAL: ¿Qué significa eso? AUDIENCIA: Sí. Pulak GOYAL: Así que el pregunta era, ¿cuál es que-- ¿qué estás haciendo en línea cuando decimos, estrella es igual a 5? Así que recuerda la estrella del operador de eliminar la referencia. Así que cuando una, en este caso, es un puntero. Es un int estrellas. Así que cuando nos dereference una por usando la estrella, lo que estamos diciendo está, vaya a lo que está almacenado en el dirección, almacenada en A-- lo take-- por lo que una, en este momento, tiene algunos dirección almacenada en el mismo. Ir a donde esa dirección apunta a, y Ahora cambie sea lo que sea a cinco. Sí. AUDIENCIA: ¿Se puede decir en términos más simples? Cambie la dirección de una a 5. Pulak GOYAL: No somos cambiar la dirección de una a 5. A tiene alguna dirección en él, que es el dirección de la variable de interés. Y así, lo que estamos diciendo cuando es eliminar la referencia, ahora queremos change-- ahora estamos haciendo referencia interés directo de la variable. ¿Eso tiene sentido? ALTAVOZ 1: Otra forma de pensar de la misma se vaya-- por lo que una es una dirección. La estrella dice que vaya a abordar y buscar a su valor. Y ahora establecer su valor en 5. Por lo que dice, vaya a la dirección de x, la cual va a ser lo que está almacenado en una, y el cambio a 5. Pulak GOYAL: ¿Sí? AUDIENCIA: Entonces, la posición es donde el puntero se va, la dirección. Pero el valor se asigna un valor basado en la dirección. Pulak GOYAL: Sí. ¿Alguna otra pregunta acerca de esto? AUDIENCIA: Tengo una pregunta. Pulak GOYAL: Sí, lo siento. AUDIENCIA: Así que cuando usted lo almacén-- si usted está diciendo [inaudible] a. Pulak GOYAL: Sí. AUDIENCIA: ¿Tiene usted almacenar la x con una y comercial? Por qué no puedes simplemente decir x antes de que su int [inaudible]? Pulak GOYAL: tan-- AUDIENCIA: [inaudible]. Pulak GOYAL: Así es su pregunta-- oh. Así que la pregunta es, ¿por qué no nosotros-- a la to_five función, por qué no podemos nosotros sólo tiene que pasar una x, ¿verdad? AUDIENCIA: Correcto. Pulak GOYAL: OK, sí, por lo que este nuevo se remonta a nuestra discusión sobre los tipos. Así que la to_five función es ahora esperando un tipo de int estrellas. Entonces, ¿cuál es el tipo de x? X es un int. Pero lo que esta función espera es un int estrellas. Por lo tanto, una variable que espera tiene una dirección almacenada en el mismo. Así que esa es la forma en usted-- puso el signo, y así que es cómo pasamos en el dirección, que es ahora-- y que interpreta esa como un int estrellas, sí. Muy buena pregunta. ¿Alguna otra pregunta sobre esto? Vale, guay. OK, así que ahora vamos a hablar sobre la aritmética de punteros. Así que aquí, sumar y restar i Ajusta el puntero por i veces el tamaño de el tipo de bytes de puntero. Así que echemos un vistazo a la forma en que se parece. Así que aquí, hemos declarado int x es igual a 5. Y ahora vamos a declarar un puntero y, y pasar en la dirección de x allí. Así que tenemos que. Así que x se almacena a 0x04. Así que ahora y es igual a eso. Y alguien puede decirme lo que piensan va a pasar cuando lo hacemos y además es igual a 1? ¿Sí? AUDIENCIA: ¿Va a cambiar a 0 veces 0 8? Pulak GOYAL: Tamaño y type-- AUDIENCIA: Usted está en movimiento la dirección. Pulak GOYAL: Sí que era-- sí. Derecho tan--. Así que va a cambiar a 0x08. Y porque-- por lo que tendría que utilizar esta fórmula, 1 veces el tamaño del puntero y los punteros son de size-- [ESTUDIANTES MURMUR] Pulak GOYAL: Correcto. [ESTUDIANTES MURMUR] ALTAVOZ 1: Así que el tipo que el puntero a-- Pulak GOYAL: ¿Es, sí, sí, eso es 4 bytes. ALTAVOZ 1: Así enteros son 4 bytes. Pulak Goyal: Entonces si hubiéramos dejar A-- de decimos que declaramos, supongo, un char. ¿Cuál sería que-- lo digamos nosotros tener x Char iguales a una o algo así. Y tuvimos la dirección de que al 0x04, lo que haría y además es igual a 1 lo hacen ahora? Lo sentimos, qué? AUDIENCIA: 0x05. Pulak GOYAL: 0x05, derecha. ¿Todo el mundo ve que? OK, y ahora vamos a decir que es un flotador. ¿Qué pasaría? ¿Nadie? Así carrozas son cuántos bytes? AUDIENCIA: 4 bytes. Pulak GOYAL: Correcto. Por lo que sería lo mismo que esto. Guay. OK, y ahora vamos a hablar sobre punteros y matrices. Así que lo vio en el anteriores dos conjuntos p, donde podemos treat-- matrices así y punteros no son la misma cosa. Pero podemos tratar matrices como punteros. Así que aquí tenemos esta matriz aquí, que tiene tres ranuras. En el primero nos slot-- tener uno, dos, y tres. Así que si nosotros-- para que podamos asignar que al decir, tenemos la matriz, dereference eso. Y luego, cuando nos dereference que, lo que estamos haciendo en realidad es en referencia a la misma ranura. Así gama estrellas es igual a 1. Nos could- cómo podría escribimos que-- lo que es una forma alternativa podríamos escribir eso? AUDIENCIA: Arsenal 0 es igual a 1. Pulak GOYAL: Exactamente, qué todo el mundo ver eso? Así mismo aquí. Así que cuando tenemos variedad más 1, que hacer-- lo even-- recordar con la aritmética que estamos acabamos de hablar, cuando lo hacemos más 1 o moverlo más de 4 bytes, a la derecha. ¿Todo el mundo ve que? Y ese lado, cuando nos dereference que, podemos establecer que a 2. Y así es como nos propusimos el siguiente bloque a 2. Y así, una forma alternativa de escribir que también habría soporte de matriz 0 soporte es igual a 1. AUDIENCIA: ¿Necesita el paréntesis? Pulak GOYAL: Sí, porque eres eliminación de referencias a toda la cantidad gama más 1. OK, y lo mismo para la gama más 2. ¿Una pregunta sobre esto? Sí. AUDIENCIA: Entonces matriz es ajusta automáticamente a 0? Pulak GOYAL: Array es-- lo siento, ¿qué? AUDIENCIA: Array es 0. La dirección de la matriz es 0. Pulak GOYAL: Así que la pregunta era, es la dirección de la matriz acaba 0? Así que no, matriz tiene alguna dirección. Así que cuando nos dereference ella, Eso es-- para que puedas pensar sobre-- literalmente, como un puntero que apunta al comienzo de una matriz. Así que tiene alguna dirección. No sabemos lo que es. Pero cuando dereference, sabemos ese es el principio de la matriz. Y así, cuando nos movemos por 1, sólo estamos en movimiento con respecto a dónde estaba esa dirección. ¿Alguna otra pregunta? ¿Sí? AUDIENCIA: Entonces, si lo hace soporte de gama más 1-- Pulak GOYAL: Lo sentimos, Yo-- ¿podría hablar? AUDIENCIA: Sí, si lo hace soporte de matriz [inaudible]. Así que si usted pone el pointer-- Pulak GOYAL: Lo siento, no te oigo. ¿Se puede decir que una vez más? AUDIENCIA: tú estás bien. Pulak GOYAL: OK, lo siento. Vale, guay. Any-- sí. Así que cuando usted va en el soporte matriz 3-- Pulak GOYAL: Sí. AUDIENCIA: --isn't allí-- que no sea ​​cuatro lugares como 0, 1, 2, y 3? ¿Por qué no int array 2? Pulak GOYAL: No, por lo que sólo la convención de C es-- cuando declaramos la matriz, nosotros-- el número que ponemos allí es el número de ranuras que queremos. Sin embargo, los índices de la matriz son realidad gama 0, array 1 y serie 2. Así que es sólo la convención de cómo declarar arrays. Sí, alguna otra pregunta? Sí. AUDIENCIA: Así que estamos todavía hablando de punteros, ¿no? Pulak GOYAL: Sí. AUDIENCIA: ¿Podría usted todavía lo hacen estrella de gama 0 es igual a 1? Pulak GOYAL: No, no, así que-- OK, así que la pregunta era posible que acaba de hacer el soporte matriz estrellas cero, y luego dicen que igual a 1. Así que no, lo que estamos diciendo aquí es que podemos think-- podemos tratar matrices como punteros. Así que lo que estamos tener-- diciendo es que tenemos dos maneras ahora hacer referencia a la misma manzana. Así doing-- si tiene matriz cero, del tipo de que ahora es un int. Y si se toma la estrella que, se obtiene una cosa válida. Así que lo que estamos diciendo aquí, es hay dos formas alternativas para referirse a la misma manzana. Usted puede hacer array soporte de 0 es igual a 1. O usted puede hacer dereference matriz, y tienen que igual a 0. Por lo que sólo dos formas de haciendo lo mismo. Sí. AUDIENCIA: ¿Por qué no lo es tamaño de int 1 para agregar a-- Pulak GOYAL: Tamaño de int 1. AUDIENCIA: Porque eso es mover uno fuera. Pulak GOYAL: Porque eso es sólo la forma en C funciona. Es sólo la forma del puntero aritmética se define. Tomará el puntero. Y entonces lo que se agrega a él, que va a multiplicar que por el tamaño de cualquier el almacén apuntador es, sí. Sí. AUDIENCIA: Entonces usted dice que podemos tratar punteros y matrices de la misma, pero que son diferentes. Entonces, ¿qué los hace diferentes? Lo que no podemos ver con uno pero no el otro? Pulak GOYAL: Para el propósito de esta clase, creo que lo es-- hacer usted-- ALTAVOZ 1: Entonces, nosotros-- OK, así que, por ejemplo, si se asigna memoria y usted tiene un puntero a un número entero, por ejemplo. Si se trató de comenzar haciendo aritmética de punteros e ir más allá de la cantidad de memoria que le asignará, te encuentras con errores. Sabemos con matrices, hemos digo de antemano, OK, querer allocate-- esta esencialmente dice, quiero asignar suficiente espacio para tres enteros. Y por lo que ahora podemos tratar la memoria como si tenemos esas tres enteros. ¿Tiene ese tipo de sentido? Pulak GOYAL: Sí. Sí. AUDIENCIA: Entonces una estrella array, es que la asignación de 1 con el índice 0 de la matriz? Pulak GOYAL: Sí. AUDIENCIA: Entonces, ¿qué es después de la dos líneas siguientes en términos de el-- I entiende que usted está tratando utilizar la aritmética de punteros aquí, pero de nuevo, no lo entiendo lo puntero aritmética es. Así que la serie más 1, eres diciendo que eres ahora va a querer hablar el primer índice en la matriz. Pulak GOYAL: Derecho, por lo que el razón por la que funciona es la matriz, aquí, podemos considerar como un int estrellas. Y así, cuando nosotros puntero aritmética en él, recordar la fórmula en la que tomamos el-- Supongo que lo la dirección actual es, y luego, cuando añadimos 1 a la misma, en realidad multiplicar 1 por el tamaño de lo que estamos manipulando. Así pues, en este caso, el tamaño de un int. Y luego nos movemos remitir por tanto. ALTAVOZ 1: Así que pretender usted tiene b gama estrellas. Pulak GOYAL: OK, sí. ALTAVOZ 1: Con la mano. Ven aqui. Pulak GOYAL: O puedo solo-- sí. OK Así aquí--, por lo que en la matriz comenzando, es justo aquí. Así que cuando nos dereference matriz, estábamos simplemente refiriéndose al primer bloque aquí. Pero ahora cuando hago gama más 1, que es-- esa flecha que hoy aquí. ¿Eso tiene sentido? Claro, porque este bloque es de int tamaño, que es de 4 bytes. Y así, lo que estamos haciendo es que estamos que se mueve y puntero por 4 bytes más. Cada vez que hacemos la aritmética en ella, lo hará siempre moverlo en incrementos de 4 bytes. Porque esto es como un int estrellas. Tiene sentido? OKAY. AUDIENCIA: Así las cosas en la matriz Había 5 bytes, nos movemos 5 bytes-- Pulak GOYAL: Derecho, por lo que si teníamos un estrellas char, nos gustaría movernos por solamente 1 byte. Así que en el caso de las estrellas del carbón de leña, sólo sería moverlo más de 1. AUDIENCIA: Para obtener el A continuación, tiene una estrella. Pulak GOYAL: Sí, sí, hace eso tiene sentido? ALTAVOZ 1: Podemos chatear sobre ello más tarde. Pulak GOYAL: Sí, sí, seguro. Vale, guay. Vamos a pasar a la siguiente sección. ALTAVOZ 1: Oh, bien fría. Si ese soy yo. Muy bien, impresionante. OK, fresco, por lo que ahora estamos en un poco más información general acerca de la memoria. Asimismo, aprecio el hecho de que iban bastante rápido. Es una gran cantidad de material para obtener a través de una hora y media. Pero si hay temas que querer ir más en profundidad sobre, vamos a tener horario de oficina esta semana donde se puede charlar con nosotros uno a uno. O usted podría llegar a Terminamos y vamos a charlar sobre las cosas. Y como siempre, sentir libre de hacer preguntas. Impresionante. Así que aquí está nuestra imagen de memoria que que hemos visto en la conferencia de mil millones de veces. Y sabemos que esta pila crece desde el fondo y el montón crece hacia abajo. Y lo que es la diferencia entre las cosas que guardemos en el montón y las cosas que guardemos en la pila? Alguien tirar algo por ahí. Sí. AUDIENCIA: ¿Es la pila para las cosas que son sólo las variables no permanentes que sólo estamos declarando el uso de ciertas funciones? ALTAVOZ 1: Hermoso, sí. Así que cada vez que, vamos a decir que estamos en una función, y sólo tenemos algunas variables locales. Quienes van a terminar en la pila. Si, en cambio, que llamamos malloc y en realidad asignar memoria, que siempre viene del montón. Así que, sí bien? Y así, recuerde que cualquier memoria que asigne mediante malloc, eso va a terminar en el montón. Y si usted se olvida de es libre, el equipo de no va a saber que que haya terminado con él. Así que sólo va a pasar el rato allí en la memoria. Y usted es esencialmente fugas de esa memoria. Estás perdiendo. Porque nunca se dijo a la computadora, bueno he terminado de usarlo, no dude en utilizar, poner otras cosas allí. Guay. Cualquier pregunta allí? Sí. AUDIENCIA: ¿Qué clase de la memoria es la pila? Alimentación para no dinámico, delegado? ¿Como lo llamarias? ALTAVOZ 1: Claro, por lo que podría pensar en él como variables locales. Llamadas a funciones reales van a apilar. ¿Algo más? ¿Sí? AUDIENCIA: ¿Cómo te libre la memoria que añade a el-- ALTAVOZ 1: Claro, por lo que al asignar memoria en el montón, te llama malloc. Y es así, que le da la espalda a puntero a alguna dirección en la memoria. Así que dices que llamó ese puntero, ¿verdad? Entonces, usted acaba de decir puntero gratuita. Y eso libera la memoria. Guay. ¿Otras preguntas? Sí. AUDIENCIA: ¿Qué asignada dinámicamente significa? ALTAVOZ 1: dinámicamente asignada significa, en el curso de su programa. Así que cuando se llama a malloc en el centro de su programa, al comienzo del programa, no hay memoria asignada. Y como el equipo paso a través de ese código, que va a asignar la memoria. Así que eso es lo que entendemos por dinámicamente. Buena pregunta. ¿Sí? AUDIENCIA: Al definir un matriz con los corchetes, hace que todavía [inaudible]? ALTAVOZ 1: Esa es una buena pregunta. Creo que cuando se asigna una matriz, lo que realmente pone en la pila. No soy positivo acerca de que, por lo que no me citan. ALTAVOZ 2: Creo que sí it-- se pone en la pila. ALTAVOZ 1: pone en la pila. OK, fresco, confirmó. ¿Otras preguntas? ¿Sí? AUDIENCIA: Al delegar malloc, ¿no el equipo automáticamente asignar memoria para las variables? ALTAVOZ 1: Sí, por sus variables locales, pone automáticamente memoria en la pila. AUDIENCIA: ¿Cuál es la punto de usar malloc? ALTAVOZ 1: ¿Cuál es la punto de usar malloc? Así vimos un montón de ejemplos, como, por ejemplo, utilizando intercambio, donde queremos que el alcance de la variable a ser algo más allá de su llamada a la función. Y queremos algo que podemos pasar alrededor y que podemos acceder desde diferentes lugares. Ahí es donde nos gustaría poner la memoria en el montón. Para que todos estos diferentes funciones pueden acceder a él. AUDIENCIA: ¿Puede usted acaba de explicar eso? ALTAVOZ 1: Así que una opción es-- por lo que el pregunta era, ¿podemos allocate-- lo siento, podemos declarar un variable global, esencialmente. Esa es una opción. Pero con una gran cantidad de esos, aquellos tienden a ser realmente complicado. Y por lo general pensamos de que a medida que un mal diseño. Sí. Fresco, alguna otra pregunta? Impresionante. OK, de seguir adelante. Así que esto es en realidad cómo asignar memoria. Hemos hablado de esto un poco. Utilizamos esta función llamada malloc. Y tú dices que el número de bytes en la memoria, por lo que la cantidad de bytes en el montón, quieres. Y que va a devolver la dirección, por lo que un puntero a, una pieza de memoria que está asignado para usted. Así que el tipo va a ser nula estrellas. Va a ser un puntero a lo que usted decide poner ahí. Cada vez que se llama a malloc, ya dijimos tienes que liberarlo para que no tienen pérdidas de memoria. ¿Qué es la otra cosa que a pesar de todo tener que hacer todos los vez que llame malloc? OK, usted tiene que liberarlo. ¿Cuál es la otra cosa? Compruebe nulo, hermoso. Así que, sí, es justo allá arriba en el tablero. Si desea tratar de asignar la memoria y no tiene memoria disponible, el equipo se va a decir, No tengo nada que darte. Y le devuelve nulo. Preguntas sobre eso? Sí. AUDIENCIA: ¿Por qué cada vez que desee declarar un puntero con un tipo específico cuando vacío estrella puede manejar todos los tipos de puntero de todos modos? ALTAVOZ 1: Buena pregunta. ¿Por qué deberíamos decir int estrellas en lugar de anular la estrella cuando vacío estrella puede manejar todo? Así que no queremos jamás convertir explícitamente punteros. Es sólo una mala práctica. Pero vamos a hablar de int estrellas al igual que un entendimiento de, este es un puntero a un entero. AUDIENCIA: OK. ALTAVOZ 1: Sí, y permite manipular los valores en ella como enteros. AUDIENCIA: ¡Oh, OK. Y sin efecto estrella no dejaría que se hace eso? ALTAVOZ 1: Depende de la contexto Sí, así que no te preocupes no te preocupes demasiado sobre el tipo allí. Sólo sé que, en general, malloc devuelve un puntero a algo. Buena pregunta. AUDIENCIA: ¿Por qué se multiplica se Tiempos 10? [INAUDIBLE]. ALTAVOZ 1: Claro, así que era sólo haciendo ejemplo al azar aquí donde Yo quería asignar suficiente espacio para almacenar 10 enteros. Sólo una elección al azar. Sí. Sí, ¿qué pasa? AUDIENCIA: Lo que haces significa comprobando nula? ¿Quieres comprobar la puntero de nulo o la malloc? ALTAVOZ 1: Sí, exactamente. Así que la pregunta era: ¿qué Qué entendemos por cheque por nula? Queremos a-- cualquier momento que llamamos malloc y estamos volvimos un puntero, queremos decir, es puntero igual a null? Así que, literalmente, PTR. Es el PTR igual a null. Sí. AUDIENCIA: Entonces, yo era un poco de preguntarse, si inicializar el puntero a malloc, hace que apunte al comienzo de malloc? Porque si se trata de un array-- ALTAVOZ 1: Eso es una gran pregunta. Sí, si se llama a malloc, el puntero que it-- digamos, así que aquí estamos destinamos 10 bytes de memoria. Así que, lo siento, lo suficiente para 10 números enteros, vamos a obtener la dirección de que primero pieza de la memoria. Buena pregunta. Sí. AUDIENCIA: Con la asignación 10 enteros generalizadas, podría utilizar realmente que puntero como como-- casi como una matriz de enteros? ALTAVOZ 1: Sí, tú también puedes utilizarlo como una matriz de enteros? Sí, exactamente, esto es lo que acaba de Pulak mostró que en-- hace un par de diapositivas, donde se dice, está bien, esto es realmente sólo un poco de-- nos puede pensar en él como un arreglo de 10 enteros. Es sólo pasa a ser en el montón. AUDIENCIA: Pero no se podía acceder con la notación de corchete? ALTAVOZ 1: Usted podría acceder con la notación de corchete, sí. Usted puede tratar de la misma. Sí. AUDIENCIA: ¿Por qué Puntero jamás ser nulo? ALTAVOZ 1: ¿Por qué Puntero jamás ser nulo? Si va a utilizar todo lo de la memoria en el montón. Si el programa se está comiendo, comiendo, comiendo la memoria, y no hay nada izquierda, a continuación, malloc va a decir-- si usted dice, Quiero 100 bytes más, va decir, no tengo 100 bytes. Aquí es nulo. Eso significa, fallé. Sí. AUDIENCIA: En ese caso, nula es nada, ¿verdad? ALTAVOZ 1: Sí, en ese caso, nula es nada. Usted no tiene ninguna dirección. No hay memoria. Muy bien, de seguir adelante. OK, vamos a hablar muy rápido acerca de desbordamiento de búfer. ¿Cuándo podríamos encontrar buffer overflow? Vamos a decir que tenemos que A-- destinar una parte de la memoria, y vamos a escribir la cadena en. Y vamos a decir: OK, voy a asignar suficiente espacio para seis caracteres. Y yo voy a pedir el usuario alguna información. Y las entradas del usuario, por ejemplo, hola. Y eso encaja perfectamente bien porque tenemos espacio para todos los personajes del hola, y el carácter de terminación nula. Un montón de espacio, no hay problema. Pero lo que si le damos la oportunidad para un usuario mal utilizar nuestro programa, y escribir no de seis caracteres, o no cinco personajes, pero un millón. Siguen escribiendo, y escribiendo, y escribir, lo que va a pasar? Bueno sólo damos la enough-- ordenador o lo siento, sólo nos dimos esta cadena espacio suficiente para 5 caracteres. Por lo tanto, vamos a obtener algo como este, donde la persona malvada que es escribir en entrada puede sobrescribir el tamaño de la memoria intermedia, y puede ir realmente más allá de la cantidad que está asignado originalmente. Y entonces lo que puede hacer, la Lo realmente malo que puede hacer, es sobrescribir la dirección de retorno. Lo que básicamente significa usted puede tomar la clase de control del comportamiento del programa. Así que en un nivel muy alto desbordamiento de búfer es cuando asigna cierta cantidad de memoria. Y luego usted-- esto porque eres teniendo la entrada del usuario o algo como que-- usted se pasa de los límites de lo que ha asignado originalmente y empezar a echar a perder su programa. ¿Sí? AUDIENCIA: ¿Por qué no lo haría que acaba devolver un fallo de segmentación? ALTAVOZ 1: ¿Por qué no lo haría que devolver un fallo de segmentación? Podria. A veces, el compilador o durante uno de su tiempo de ejecución es en realidad va a comprobar que. Si suceden ciertas cosas, y esto es una especie de nivel inferior, entonces usted necesita saber. Pero si usted no diseña estos sistemas correctamente, entonces usted tiene la oportunidad de no contagiarse y justo permitiendo que el equipo take-- la el mal persona para controlar el equipo. Sí. AUDIENCIA: [inaudible]? ALTAVOZ 1: Claro. Oh, cuando digo búfer, me refiero sólo a la cantidad de memoria que se ha asignado. Así que aquí he dicho, oh, hemos asignado de seis char-- suficiente espacio para seis caracteres. Y yo sólo lo llamo mi búfer donde podría escribir información. Sí. ¿Alguna otra pregunta sobre esto? Sí. AUDIENCIA: ¿Cómo detenerlo? ¿Cómo evitarlo? ALTAVOZ 1: Pregunta impresionante. ¿Cómo evitarlo? ¿Cómo se previene desbordamiento de búfer? Bueno, una forma de hacerlo es algo así como GetString, donde constantemente aumentamos la cantidad de memoria que destinamos si el usuario introduce una gran cantidad de texto. Otra es la cosa, si solo quieren seis personajes, hacer una comprobación rápida. Diga única entrada de seis caracteres. Sí. Así que digamos que usted fuera trabajando en-- vamos ir a cosas web un poco más tarde en el supuesto-- pero vamos a decir que está trabajando en un formulario, lo haría simplemente limitar la cantidad podría entregado. Sí. AUDIENCIA: GetString tira la memoria de la pila, ¿verdad? ¿Solo para aclarar? ALTAVOZ 1: Una vez más? AUDIENCIA: ¿El GetString tener memoria de la pila? ALTAVOZ 1: Creo Getm-- get int toma memoria del montón porque llama alloc. AUDIENCIA: Oh. OKAY. ALTAVOZ 1: Sí, malloc y realloc. ¿Otras preguntas? Sí. AUDIENCIA: Entonces, mediante la definición de el tamaño de la buffering, se impide a alguien de ser capaz de inyectar código que puede deslizarse más allá de la [inaudible]. ALTAVOZ 1: Por lo tanto, mediante la definición de el tamaño de la memoria intermedia, usted ha dicho, bien aquí es como la cantidad de memoria que podemos utilizar. Si usted permite que el usuario pueda escribir sobre él, entonces usted va a tener problemas. Tener sentido. Impresionante. Vamos a pasar a lo largo. Correcto. Hablando de errores, aquí están algunos mensajes de error comunes que podría haber aparecido mientras estaba codificación, trabajando en sus boletines de problemas. Buena probabilidad de que uno de éstos aparece en el cuestionario si los últimos años son una indicación. Por lo tanto, las respuestas son una especie de aquí en el tablero. Pero no dude en gritar un poco más. ¿Por qué podría ocurrir un fallo de segmentación? ¿Por qué puede usted conseguir un fallo de segmentación cuando se está ejecutando su programa? AUDIENCIA: [inaudible]. ALTAVOZ 1: Good. Sí, si tratamos de acceso memoria que no ha dado a nosotros. Si tenemos referencia a un puntero nulo. Por ejemplo, si llamamos a malloc, y se olvide de comprobar si es nulo, y simplemente tratamos de usarlo, el equipo de nos va a dar un fallo de segmentación. Bueno. ¿Qué hay de implícito declaración de la función? Qué significa eso? AUDIENCIA: Usted está tratando de utilizar un función que no se ha definido. ALTAVOZ 1: Good. Usted está tratando de utilizar una función que no se ha definido. Así que podría ser una de dos cosas. Tal vez fue como el ejemplo Camille le mostró antes. Y usted tiene una función principal que llama a algo que se llama cubo. Y digamos que se le olvidó escribir este prototipo. Se le olvidó decir, hey ordenador, Tengo esta función llamada cubo. Usted verá más adelante. Digamos que usted se olvidó de escribir el prototipo, podría obtener este error. Otra cosa es, digamos que ha intentado usar printf, y se olvidó de incluir la biblioteca estándar, entonces va a decir implícita declaración de función. Y por último, pero no menos importante, identificador no declarado. Sí. AUDIENCIA: Tienes un ámbito problema. Como tal vez usted está tratando de llamar a una variable local que es en otro tipo de zona. ALTAVOZ 1: Gran, así que si usted tiene una variable que no está en su alcance, y que está tratando de usarlo, te vas a meter en problemas. Y de la misma manera más general, digamos intenta utilizar x, con cada vez diciendo int X es igual a 5, entonces usted está va a tener problemas. Disculpe, preguntas sobre esto? Impresionante, resoplando derecha a lo largo. OK, recursividad, ¿por qué vamos a might-- ver-- perdí mi sch-- oh aquí vamos, Sólo asegúrese de que somos más o menos en la fecha prevista. Muy bien, fresco. OK, la recursividad, la idea general de la recursividad, una función recursiva es una función que se llama. OK, así que eso es lo que significa por un concepto de programa por el que una función se llama a sí mismo. ¿Cuál sería some-- ¿qué es un buena razón para usar la recursividad? ¿Cuándo sería útil? ¿O cuál es un programa que realmente se presta a la recursividad? AUDIENCIA: La búsqueda binaria. ALTAVOZ 1: Búsqueda binaria se presta a la recursividad, porque usted tiene este problema que puede romper en trozos más pequeños, y llevar a cabo de forma continua el mismo algoritmo en él. Esto conduce a, en muchos casos, más elegante código que es más preciso. Nos encontramos el ejemplo de búsqueda binaria. Otro ejemplo es el ordenamiento por mezcla. A veces, cuando se piensa en un algoritmo, como factorial, sólo se siente recursiva, ¿verdad? Porque sabemos que el factorial de 5 es un factorial 4 veces 5. Y así, cuando se configura un problema de esa manera, sólo se siente recursiva. Así que sería un gran manera de escribirlo. ¿Preguntas? Sí. AUDIENCIA: ¿Qué es un caso base? ALTAVOZ 1: Oh ¿qué es un caso base? Yo dije, no se olvide para incluir un caso base. Digamos que estábamos escribiendo una función factorial, y que estábamos haciendo factorial de 5. Y sabemos un factorial de 5 es 5 veces al factorial de 4, bla bla bla bla. ¿Cómo sabemos cuándo parar? ¿Cómo sabemos que en realidad tienen un número? Porque si nos mantenían llamando factorial, entonces nunca conseguiríamos una respuesta, ¿verdad? Por eso, cuando sabemos cómo parar en el ejemplo factorial. Cualquier persona, sí. AUDIENCIA: Cuando el 1 factorial es 1. ALTAVOZ 1: Good. Así que sabemos. Podemos dar por sentado que 1 factorial es igual a 1. Así que si llegamos al punto en el que estamos llamando factorial de 1, sólo seguir adelante y volver 1. Y ese es tu caso base. Porque sabemos una vez llegamos a eso, y siempre vamos a golpear a eso, vamos a never-- no vamos sólo seguir adelante siempre. ¿Alguna otra pregunta sobre la recursividad? Sí. AUDIENCIA: Entonces cuando regrese 1, sólo de forma automática se detendrá el programa, ¿no? ALTAVOZ 1: Sí así que cuando usted llamar vuelta 1, si: digamos, digamos factorial de 2 llamadas factorial de 1, factorial de 1 sólo va a devolver 1. Y ahora factorial de 2 va a decir OK, 2 Tiempos 1 es 2, y regresar esa respuesta. Sí. AUDIENCIA: ¿Tenemos que preocuparnos sobre el alcance de la recursividad cuando se entra en un algoritmo? ALTAVOZ 1: Ah, sí. Sí, usted no tiene que preocuparse de ámbito de aplicación en el contexto de recursión. Así que sólo las variables definidas en ese plazo de la función van a ser útiles. Sí buena pregunta. Muy bien, vamos a mantener en movimiento a lo largo. Debido a que tenemos una gran cantidad de material a pasar. Pero como ya he dicho, no dude en golpear hasta las horas de oficina, o nosotros después de los hechos. Esto es sólo una diapositiva muy rápido. Hemos aprendido mucho acerca de búsquedas y ordenaciones. Por favor por favor por favor, estas secciones están en línea, Creo que en cs50.net/quizzes. Así que ir a tomar esta tabla y lo puso en su hoja de examen, porque habrá una pregunta sobre este. Por favor, no se equivocan. Sólo muy rápidamente, lo que significa esta tabla, es que habla de Big O, lo que sabemos siendo el límite superior de un algoritmos tiempo de ejecución. Y tenemos omega, que es va a ser el límite inferior de un tiempo de ejecución de algoritmos. ¿De acuerdo? AUDIENCIA: [inaudible]. ALTAVOZ 1: Sí, ¿qué es lo último? ¿Qué hay teta? Lo es si nosotros-- nosotros sólo vamos a preocupan en esta clase en el caso donde nuestro límite superior y nuestra cota inferior son los mismos. Sí, ese es el único momento en que es va a llegar en esta clase. OK, voy a seguir adelante. Si usted no ha tomado la imagen, Te prometo éstos estarán en línea. OK, impresionante, estructuras. ¿Por qué podríamos queremos estructuras? ¿Qué es un motivo de utilidad podríamos querer estructuras. Alguien grita algo. Bueno, vamos a ver el ejemplo en el tablero. Digamos que estamos tratando con todos estos estudiantes. Si estamos haciendo un programa para CS50, hay como 800 personas. Necesitamos write-- vamos a necesario para manejar una gran cantidad de información acerca de los estudiantes. Sería bueno si pudimos tipo de grupo esto-- toda la información que tiene que ver con un estudiante en particular en un tipo de datos. Pero sabemos que no hay datos escriba llamado, Estudiante, ¿verdad? Tenemos un número entero, tenemos un flotador, tenemos una cadena o una estrella char, pero nosotros no tenemos, un estudiante. Por lo que podemos hacer es en realidad un poco de definir nuestra propia estructura, lo llaman los estudiantes, y podemos asociar algunos diferentes campos con que struct. Así que en este caso, vamos a decir que tenemos un estudiante. Y las cosas que nos importan acerca son el número de identificación del estudiante y el nombre del estudiante. Y ahora podemos asociar este ID y este nombre con un estudiante determinado. Así que vamos a ver algunos ejemplos. Aceptar, por lo que aquí digo, OK, vamos a decimos que queremos hacer un estudiante. Yo lo llamo estudiante 1. Y su número de identificación, en este caso, se puede acceder a con sólo hacer el nombre del estudiante salpican el campo que queremos acceder. Así que esto va a ser sólo estudiante 1 punto de identificación, y la pusieron igual a 1. Porque recuerde, dijimos que Identificación va a ser un entero. Y de forma muy similar, podemos decir que esta el nombre del estudiante que va a ser Davin, por ejemplo. Así que sólo podemos acceder campo de una estructura que utiliza este punto. Preguntas sobre eso? Sí. AUDIENCIA: ¿Hay alguna manera para proteger sus variables? ¿Hay alguna manera de proteger a las variables desde que se accede externamente? ALTAVOZ 1: ¿Hay alguna forma para proteger sus variables desde que se accede externamente? No en el ámbito de aplicación de CS50. ¿Otras preguntas? Sí. AUDIENCIA: ¿Cuál es typedef struct? ¿Qué significa cada componente? ALTAVOZ 1: Ah, ¿cuál es typedef struct? ¿Qué significa cada componente media de este tipo? AUDIENCIA: Sí. ALTAVOZ 1: OK, fresco. Así que esto dice, hey computadora, que desee crear una nueva estructura. Y yo voy a definir una definición para ello, de modo que yo pudiera usarlo como si fuera un tipo lo largo de mi programa. OK, así que quiero definir una estructura. Y ahora voy a ser capaz de utilizarlo como un tipo. Y su nombre es estudiante. Y aquí están sus campos. AUDIENCIA: ¿Así es que typedef struct [inaudible]? ALTAVOZ 1: Si usted quiere ser capaz de utilizar esta estructura a través de su programa, y en la mayoría de los casos en que CS50 hacer, tenemos que decir tipo Def. Y eso le permite utilizar la misma forma en que usamos como int o float. La computadora Siempre sabe lo que es. Sí. AUDIENCIA: ¿Podemos escribir esto en el archivo de cabecera? ALTAVOZ 1: Oh, lo siento. ¿Nos escribimos esto en el archivo de cabecera? Se puede escribir esto en la parte superior de su programa, en la parte superior de su programa c. Sí, eso sería el más lugar razonable para ello. Volver allí. AUDIENCIA: La misma pregunta, así que antes de principal? ALTAVOZ 1: Derecho, es necesario que esto sea en alguna parte que todos puedan acceder a ella. Así que antes de principal en su caso, sí. AUDIENCIA: ¿Hay alguna diferencia entre poniendo estudiante en la parte superior y en la parte inferior? ALTAVOZ 1: Ah, ¿hay una diferencia entre los estudiantes poner en la parte superior o en la parte inferior? Let-- salvar a esa pregunta, y cuando lleguemos a las listas enlazadas, veremos que, ¿de acuerdo? Así que aferrarse a que durante un segundo. La última cosa que quiero mencionar aquí, es en lugar de tener una estructura, tenemos un puntero a una estructura, podemos cambiar nuestra notación a ser un poco más agradable. Podemos decir, vamos a decir que tenemos una Puntero a un estudiante en lugar de sólo un estudiante. Si queremos que el acceso a un campo, en lugar de al hacerlo, también ir dereference el puntero, y luego acceder al nombre del campo. Esta notación se ve un poco desordenado con la estrella en este punto. Totalmente correcto, sino una especie de forma más limpia de hacerlo, es igual que decir el nombre puntero de flecha. Y que en realidad combina desreferencia y acceder en un hermoso símbolo. Preguntas sobre eso? AUDIENCIA: Sólo decir que una vez más. ALTAVOZ 1: Digamos que una vez más. AUDIENCIA: Exactamente lo que acabas de decir. ALTAVOZ 1: Claro, exactamente lo que acabo de decir. Si tenemos un puntero a un estudiante en lugar de que el estudiante sí mismo, nos can-- una forma en que podemos acceder a la campo sirve para eliminar la referencia y, a continuación Nombre de acceso. Otra forma, más agradable que puede hacerlo, que es justo un poco de azúcar sintáctica, se acaba de hacer puntero del nombre de la flecha. Y eso va a combinar el eliminación de referencias y de la que accede. Sí, muy bien. Correcto. Así que vamos a hablar de la otra pregunta. Saltemos a los nodos, que vamos a utilizar en ligada listas en tan sólo un segundo. Así que aquí, te darás cuenta de que hay es el nodo de palabra tanto en la parte inferior, y en la parte superior. Antes, cuando estábamos definiendo estudiante, acabamos de tener los estudiantes en la parte inferior. No teníamos los estudiantes en la parte superior. Alguien sabe por qué puede ser? ¿Cuál es la diferencia? Sí. AUDIENCIA: Entonces usted utiliza nodo es la definición de nodo, por lo que es una cosa recursiva? ALTAVOZ 1: Good. Sí, necesitamos que nuestros nodos tener puntero a otros nodos. Así que ya que utilizamos este tipo antes de que en realidad define, tenemos que ponerlo en la parte superior Sólo por lo que sabe lo que es. AUDIENCIA: Así que todavía lo necesitan en la parte inferior? ALTAVOZ 1: Sí. AUDIENCIA: Así que siempre en la parte inferior. ALTAVOZ 1: Siempre en la parte inferior. Así que todo lo tuyo va tenerlo en la parte inferior. ¿Alguna otra pregunta? Muy bien, por lo que permite realmente hablar acerca vinculada listas muy rápido. Así listas enlazadas son-- los usamos en lugar de las matrices en algunos casos, porque sabemos que las matrices son un longitud fija, mientras que las listas enlazadas podemos crecer y encogerse como queremos. Así que este es un ejemplo de lo una lista enlazada podría ser similar. Lo que tenemos que ver es la cabeza de la lista. Entonces, ¿dónde comienza la lista. Y luego nodo, cada nodo subsiguiente, es responsable de conocer donde el próximo nodo es. Así pues, en este caso, el nodo que almacena 1 es responsable de conocer donde 3 es. La persona que almacena 3 es responsable de saber donde 9 es. Y 9 tiene a nadie más a señalar. Es el final de la lista, por lo que se limita a decir nula. ¿De acuerdo? AUDIENCIA: ¿Cuál es el punto de esto? ALTAVOZ 1: ¿Cuál es el punto de esto? AUDIENCIA: Sí. ALTAVOZ 1: Porque, vamos a decir que tenemos algunos datos. Y no sabemos exactamente cómo muchos datos que quieren antes de tiempo. Así que con una matriz, digamos en el que quieren contar a las personas en la primera fila. Lo más probable es que no va a cambiar. Sólo podemos decir, OK, quieren una matriz de tamaño seis. Pero si queremos algo eso va a cambiar. Por ejemplo, digamos que yo estaba tratando hacer un seguimiento de los estudiantes ya que vienen en la habitación para la sesión de revisión. No tengo ni idea de cómo muchos de ustedes la gente va a aparecer. Así que puede ser que desee una estructura de datos que pueda expandirse y contraerse. Porque tal vez alguien lo hará dejar, tal vez alguien va a venir. Y así, en cualquier momento, nos puede añadir o eliminar nodos. Fresco, buena pregunta. Sí. AUDIENCIA: Si usted puede utilizar algo así como GetString que mantiene que le permite obtener más datos como usted lo necesita, ¿por qué necesita esto también? ALTAVOZ 1: ¿Por qué Utilizas lista cuando enlazó usted puede usar algo como GetString? Buena pregunta. Recuerde que Get-- uno de las caídas de GetString es que no hicimos un muy buen trabajo de liberar esa memoria, y se introdujo un montón de pérdidas de memoria en su programa? Usted podría tomar un estáticamente variedad de tamaño y mantener su cultivo. Pero tendrías que encontrar nuevos lugares en la memoria. Sólo sería un montón de gastos generales. Una de las cosas buenas de ligado listas en oposición a las matrices, es arrays están todos en la misma ubicación en la memoria. Tiene que ser continuo trozos de memoria. Mientras que las listas enlazadas, 2 y 3 de mayo ser totalmente en diferentes lugares. Al igual que 2 es aquí, y 3 es por aquí. Y mientras que tienen una puntero entre sí, está bien. Sabemos que podemos encontrarlos. Pregunta por ahí? AUDIENCIA: GetString es una función en la biblioteca CS50, ¿verdad? No existe en programas reales. ALTAVOZ 1: Correcto. Correcto, eso es otra cosa. GetString no existe fuera del contexto de CS50. Sí. AUDIENCIA: Entonces, ¿el hecho de que dos podrían ser realmente muy separados, hace que el impacto de la eficiencia de acceder a los elementos de la lista? ALTAVOZ 1: Esa es una gran pregunta. La pregunta era, ¿verdad impacto la eficiencia de acceder estos diferentes elementos en la lista. Actualmente, si. Porque sabemos si: vamos a decimos que queremos acceder a la el segundo elemento de la matriz, sabemos sólo podemos hacerlo matriz soporte 1, a la derecha. Está siempre va a ser la misma ubicación. Pero si queremos llegar a ese 3, no podemos decir simplemente, ir a conseguir ese 3. Tenemos que decir, OK, comenzará a las el principio de la lista, y ahora tenemos realmente caminar a través hasta que encontrar el número que nos interesa. Así que en este caso se dice, OK este es el primer número. Así que, esencialmente, es el índice 0. Ahora tenemos que encontrar el segundo número. Eso es el índice 1. Así que en realidad va a-- solo el acceso, se va a tomar tiempo N. Enfriar viejo grande N., Sí. AUDIENCIA: ¿Cuáles son cada una de las listas? Son cada matrices, o qué? ALTAVOZ 1: Eso es una gran pregunta. ¿Cuáles son cada uno de los estructuras que he dibujado? Son nodos. Así que cada uno de estos pequeños estructura consta de dos partes. Tiene un entero que tiene. Eso es los datos reales que está sosteniendo. Ese es el tipo de parte útil. Y, esto es lo que hace una lista enlazada, tiene un puntero al siguiente nodo. Pregunta impresionante. Muy bien, así que vamos a ver muy buscar rápidamente algunos ejemplos de lo que podríamos ver con listas enlazadas. Así que un ejemplo es muy rápido, supongamos que queremos hacer una búsqueda. ¿Qué tipo de búsqueda no puede que hacemos en las listas enlazadas? AUDIENCIA: Binario. ALTAVOZ 1: Binario. Por qué no podemos utilizar la búsqueda binaria? AUDIENCIA: [inaudible]. ALTAVOZ 1: Claro, porque con el binario búsqueda, tuvimos que confiar en el hecho que pudiéramos saltar en la matriz en cualquier punto. Podríamos simplemente decir, ir al elemento intermedio. Con aquí, como dijimos un poco antes, no podemos saltar a el elemento medio. Con el fin de encontrar ninguna elemento, que en realidad tienes que caminar a través de toda nuestra lista. Así que si lo que queríamos hacer una búsqueda, el mejor que podemos hacer es una búsqueda lineal. Partimos a la cabeza, se check-- digamos que estamos buscando 9-- empezamos a la cabeza. Nosotros decimos, es este 9? No. ¿Este 9? No. ¿Este 9? Sí, lo encontramos. OK, eso es todo eso. Aquí hay un poco de pseudo-código. Voy a dejar esto para usted chicos para batir más por su cuenta, sólo porque nos estamos quedando un poco corto de tiempo. Vamos a hablar de la inserción. Vimos una demostración realmente fresco de esto en la conferencia donde dijimos, OK, tenemos esta lista enlazada donde todo el mundo está apuntando el uno al otro, y alguien se le ocurre en el escenario. ¿Cómo nos insertamos que persona en nuestra lista enlazada? Bueno, una manera incorrecta de hacer, lo que es que creo que lo que vimos en primer lugar, es cuando la persona delante de forma automática apuntado a la nueva persona. Y entonces nos abandonamos el tipo de segunda mitad de la lista, ¿no? Debido a que no sabemos dónde es en la memoria más. Así que ser muy cuidadoso acerca de la orden en el que insertar las cosas. Así que aquí, digamos que queremos puesto 1 en el frente de nuestra lista. En primer lugar, tenemos 1 punto en la segundo element-- o el elemento que contiene 1. Por lo tanto, hacemos eso, sólo para que no somos va a perder la segunda mitad. Y ahora, podemos tener la cabeza a punto 1. Así que de nuevo, esto es sólo como super alto nivel. Así es como nos gustaría insertar un nodo. Tenemos una gran cantidad de pseudo-código aquí-- siento, No sé por qué estoy llamándolo pseudo-código. Es código real. Usted puede ir a verlo más tarde. Muy bien, vamos muy quickly-- más preguntas en listas enlazadas antes de la Primera pasar a un par de otros datos estructuras en nuestros últimos 10 minutos. AUDIENCIA: ¿Necesitamos ahora cómo escribirlo en un examen? ALTAVOZ 1: ¿Necesitamos saber cómo a-- AUDIENCIA: Escríbelo en un examen. ALTAVOZ 1: Necesitamos a-- usted debe estar preparado escribir, insertar, eliminar y buscar listas enlazadas en la prueba. Eso es algo que nos podría esperar que hagas. Sólo tienes que ir sobre ella. Si tiene cualquier pregunta sobre el código, disparar su TF un correo electrónico, llegado a las horas de oficina. Todavía hay un montón de tiempo para estudiar, que no se preocupara. Muy bien, cualquier otro preguntas sobre listas enlazadas? Sí. AUDIENCIA: Así que si usted no utiliza el puntero para ir a la de la derecha antes de utilizar el puntero para el de la izquierda, que es el equivalente de borrar ¿todo bien? ALTAVOZ 1: Sí. AUDIENCIA: [inaudible]. ALTAVOZ 1: Derecho, ya que no puede conseguir que, en realidad es aún peor. Porque no sólo no sabemos donde está, ya no podemos utilizamos, pero we've-- no estamos liberando que la memoria más. Así que es simplemente dando vueltas y no ser útil, porque no podemos encontrarlo. Sí, pregunta fresco. Muy bien, vamos a hablar de las pilas. Vimos pilas muy rápidamente. Ellos son los primeros en la última estructuras de datos fuera. Así que pensamos en las pilas en Annenberg de bandejas donde apilar cosas en la parte superior. Y si vas a venga conseguir una bandeja, eres Siempre va a tomar el de la la parte superior, que es la más recently-- que es lo que la mayoría recientemente puso en la parte superior de la pila. Así que usted puede clase de pensar en este tipo de visual cuando usted está pensando en pilas. Y entonces, hemos metimos algo de la parte superior de la pila. Si nos trate: ah, y las palabras que utilizar cuando estamos hablando de estos datos estructuras es por lo general, si poner algo en la pila, decimos que estamos empujando en la pila. Y si tomamos algo de la pila, decimos que estamos haciendo estallar fuera de la pila. Si usted va a aplicar un stack-- que definitivamente Recomienda intenta fuera-- eres va a querer perder de vista, digamos que usted está utilizando una matriz. Sé que en la conferencia que hablamos sobre el uso de ambos los arrays o vinculados listas para implementar una pila. Si usted está usando un matriz, es necesario keep-- excusa mí-- tenemos que seguir la pista del tamaño y la capacidad. Por lo tanto el número máximo que nuestra pila puede contener. Las preguntas sobre las pilas? AUDIENCIA: ¿Cuál es la diferencia entre el tamaño y la capacidad? ALTAVOZ 1: La diferencia entre tamaño y capacidad, impresionante cuestión. Así que digamos que estamos utilizando una matriz, y asignar suficiente espacio para 10 enteros. Y empezamos a llenar eso. Y empujamos cosas en, y nos pop cosas. Queremos hacer un seguimiento de la máxima número que podemos tener, que es la capacidad. Y queremos hacer un seguimiento de la número actual que tenemos, que es el tamaño. Buena pregunta. Cualquier otra cosa en las pilas? Muy bien, vamos a hablar acerca de la sorpresa, las colas. A diferencia de las pilas, que son por primera vez en el pasado cabo, se trata de primero en entrar, primero en salir. Así que esto es como-- pensar en una línea. Piense en cola en la Manzana Tienda de conseguir cualquier producto. Y la primera persona de la fila debe ser la primera persona que ha ayudado. Así que lo primero que se envían es esto lo primero que se hizo estallar. ¿Guay? Muy similarly-- oh, las palabras que utilizamos en lugar de empujar y pop-- que acabo acostumbrado, Estoy sorry-- es que decimos, si estamos poner algo en la cola, que decimos en cola ella. Si estamos tomando algo fuera de la cola, decimos que desencolan. Ello. Se me puede pronunciando los mal, pero se entiende la idea. Y, de nuevo, al igual que las pilas, si estamos implementando esto como matriz, tenemos que hacer un seguimiento de la tamaño, la capacidad, y la cabeza. ¿Qué quiero decir por la cabeza? ¿Por qué necesitamos para mantener pista de la cabeza? AUDIENCIA: Porque ahí es donde al principio de su lista es. ALTAVOZ 1: Sí, básicamente, la cabeza es donde el principio de nuestra cola está. Porque sabemos, a diferencia de las pilas, which-- Voy a tratar de hacer frente a esta manera-- sabemos que siempre va a reducir de esta manera y crecer de esta manera. Colas, la gente viene en el extremo y dejar desde el principio, así que tenemos que seguir la pista de donde el comienzo es. Eso es lo que quiero decir con que necesitamos no perder de vista donde la cabeza es. ¿Guay? Correcto. Ocho minutos, pareja más temas, podemos hacerlo. Muy bien, tabla hash. Hablamos brevemente sobre tablas hash. Para el concurso, sólo tiene que entenderlos en un nivel alto. La idea básica es que tienes estos datos. Y queremos acceder a él en el tiempo que es más rápido que algo como un ligada lista. Porque hemos dicho, si fuéramos buscando a través de una lista enlazada, que podría tomar tiempo N. Incluso el acceso puede tomar Tiempo de N en una lista enlazada. Las tablas hash darnos una manera que podemos acceder más rápidamente las cosas, y más buscar rápidamente las cosas, sin con las restricciones de un array donde hemos fijado tamaño. Así que pensamos en una estructura de datos en el que, donde nos ponemos en la estructura de datos es dependiente de esta función hash mágico. Así que en este caso, el hash mágica función se acaba tomando una palabra, comprobar lo que la primera letra es, y a continuación, sólo ordenar alfabéticamente. Así que básicamente los ponemos en diferentes cubetas. Cuando vemos plátano, decimos, OK, vamos a poner en el cubo B. Cuando vemos Apple, vamos a ponerlo en el Un cubo. Si viéramos albaricoque, vamos a poner en el Un cubo. ¿De acuerdo? Así que supongo que estábamos buscando para-- I no lo sé, lo que es otra fruta? Supongamos que yo estaba buscando naranja. ¿Dónde debo buscar? En el cubo O. Sí, hay un solo lugar que el naranja sea, ¿de acuerdo? Así que he dicho antes lo que ocurre si-- bien he dicho antes, digamos que ponemos en-- albaricoque pero realmente abordar el hecho de que, oh no, si tuviera que poner la baya en, es va a entrar en conflicto con el plátano. ¿Dónde lo ponemos si hay ya algo en nuestra mesa? Bueno, tenemos un par de opciones. Opción número uno es lineal sondeo, lo que significa, básicamente, digamos que quiero tratar de poner baya, y veo, oh no, bananas que ya están allí, Acabo de decir OK, vamos Me miro para el próximo lugar disponible. Así que camino abajo, digo, oh, no hay nada en el cubo D. Realmente no puedo pensar en ninguna frutos que empiezan con la letra D, así que sólo voy a poner la baya en allí. Durian. OK, así que ya que no hay nada allí todavía, Puede ser que también acaba de utilizar ese lugar. ¿Cuál es la desventaja de que? AUDIENCIA: Está fuera de orden. ALTAVOZ 1: Lo siento? AUDIENCIA: Está fuera de orden. ALTAVOZ 1: Es fuera-- derecha, podríamos terminar con cosas que no se en-- almacenada en cubos en el camino que esperamos que sean. Así que si buscábamos para la baya, antes hemos dicho, oh podemos mirar en un cubo. Sólo podía ser en un cubo. Pero ahora, en realidad, podría ser en todos los cubos, ¿verdad? OK, aquí hay otra opción, chaining-- separada que es la idea de que vamos utilizar un poco más tarde en P fijó 5. En lugar de simplemente tener un espacio en cada cubo, ¿por qué no tenemos cada cubo ser un puntero a una lista enlazada? Cuando decimos, OK, hay un cubo por todo lo que empieza con A. Y no sólo va a ser un ligado lista de frutas que comienzan con A. Así que si tenemos una nueva fruta, digamos nos get-- nos aguacate, tenemos manzana, digamos que tenemos albaricoque, ¿cómo podríamos poner en la lista? Bien nos gustaría ir a la cuchara 0, y nos gustaría basta con insertar en nuestra lista gustado, simple como eso. Ahora sigo diciendo cubo. Podríamos aplicar este de muchas maneras. Una forma típica que esta tipo de foto indica, tal vez se tiene una disposición de punteros a listas enlazadas. Esa es una de las formas posibles implementar una tabla hash. AUDIENCIA: ¿Necesitaría otra lista porque el plátano y bayas están fuera ¿de orden? ALTAVOZ 1: ¿Quieres que need-- ah, ¿verdad necesitará otra lista porque plátano y bayas están fuera de orden? En este caso, nuestra función hash, que nos dice dónde poner las cosas no se preocupa por la segunda letra. No se preocupan por alfabetizar, que sólo se preocupa por la primera letra. ¿Pregunta? AUDIENCIA: ¿Cuál es la definición de ese función, y qué aspecto tiene? ALTAVOZ 1: Ah, bueno. OK, así que no necesitamos preocuparse demasiado por este concurso. Así que no me pongo en las diapositivas. Vamos a introducir a ella para P puesto 5. Pero, básicamente, dice, le da un nuevo elemento, dónde debo decirlo? O, digamos que estoy buscando un elemento, donde podría ser? Sí, buena pregunta. OK, muy rápidamente, los árboles y los intentos. Así que un árbol es cualquier tipo de estructura de datos organizada. Y vamos a ver un montón de fotos que hará que esta claro estupendo. Y un trie, que vimos en clase, es un tipo muy especial de árbol que esencialmente funciona como una tabla hash de varios niveles. Es super cool. Vamos a ver que en tan sólo un segundo. Muy bien, así que vamos a hablar de árboles en primer lugar. Así que este es un ejemplo muy típico de un árbol, en el que tenemos alguna jerarquía. Usted ve que uno está en la parte superior, a la derecha? Y puedo decir superior porque hay claramente un ordenamiento porque tienen estas flechas a la baja. Así que, la cosa en la parte superior, Yo llamo a esto el nodo raíz. Así que uno es el nodo raíz. Y las cosas en la parte inferior, que no tienen nada que viene de ellos, Yo digo que estos son los nodos hoja. Así 8,9 5, 6, 7, OK. Y por lo general el que la terminología puede decir es, 1 es la matriz de 3. Así que es lo que viene a nivel por encima de ella, y los puntos a la misma. Y 3 es un hijo de 1. Es lo que 1 puntos a. ¿Pregunta? AUDIENCIA: ¿Puede volver a la diapositiva anterior, por favor? ALTAVOZ 1: ¿Puedo volver a la diapositiva anterior? Por supuesto. Preguntas sobre esto? O simplemente quería mirarlo? AUDIENCIA: yo no tuve a través de él. ALTAVOZ 1: OK, fresco, sí. Estos serán todos en línea por lo que no hacerlo preocuparse por obtener cada palabra. Y en aras de la tiempo, me voy a ir. ¿Está todo bien? Impresionante. Vale, guay. Así que vamos a hablar de un kind-- muy específicas así que tenemos estos generales la estructura de los árboles, que es sólo algo que nos permite al tipo de cosas rango jerárquicamente. Árboles binarios son cosas donde cada nodo tiene como máximo dos hijos. ¿De acuerdo? Y yo le dije, OK, por lo que parece para adaptarse a esta descripción. Dije nodo, no un árbol de búsqueda binaria. ¿Qué es un árbol binario de búsqueda? Se solucionó. Así que ya sabes que en un árbol de búsqueda binaria, todo al todo tree-- a los nodos de izquierda es más pequeña, y todo a la nodos de la derecha es más grande. Así que esto no es un árbol de búsqueda binario. Esto es sólo un árbol binario. Así que tenemos gran categoría de árboles, categoría ligeramente más pequeño de árboles binarios, búsqueda A-- árboles binarios de búsqueda. ¿Guay? Correcto. Y ahora, la mayor parte de la diversión de todo, tenemos nuestros intentos. Ustedes vieron esta imagen en la conferencia? Sí, debe ser muy familiar. Echemos un vistazo a cómo podríamos en realidad implementar esto. O en realidad, vamos a ver, ¿eso incluso vienen para arriba? Nope. Muy bien, ni siquiera tiene que preocuparse por esas cosas de bajo nivel. Tendremos tiempo de sobra para hacer frente a continuación, P puesto 5. Pero por ahora, sólo muy alto nivel, sé que esto es lo que parece. Hemos descrito como tipo de una tabla hash de varios niveles where-- lo que hace esta tienda? Esto almacena nombres de científicos que podemos realidad buscar por sólo un poco después de la diferentes tablas hash abajo, ¿de acuerdo? Y el propósito de esto es, en teoría, que proporcionan constante de tiempo mirar hacia arriba. Así que si quiero comprobar que, por ejemplo, quién es alguien-- Mandel que es en este trie, podría muy rápidamente en linear-- Lo siento, en constante de tiempo, averiguar si es o no está en el trie. Pero una estafa, se mira lo grande que es esto. Ni siquiera estamos almacenando que muchos datos, y es enorme. Así que una gran desventaja es que utiliza una gran cantidad de memoria. Sí. AUDIENCIA: ¿Por qué ofrecer constante de tiempo, exactamente? ALTAVOZ 1: Una vez más? AUDIENCIA: ¿Cuál es la intuición por eso que ofrece constante de tiempo? ALTAVOZ 1: Excelente pregunta. ¿Por qué ofrecer constante de tiempo? Entonces, ¿qué podemos hacer es, vamos a decimos que estamos buscando Mandel. Sabemos que queremos empezar en el primer nivel en el M. Sabemos que queremos seguir a E. Entonces eso es dar un paso, dos pasos, ¿verdad? Seguimos a N. Seguimos a D. Seguimos a E. Seguimos a L. Y luego la siguiente cosa, comprobamos says-- este delta dice Sí, eso es en nuestra mesa. Es decir una palabra. Esa es una entrada válida en nuestra trie. Así que estás diciendo, OK, que tuvo siete pasos. Pero si hemos añadido como un trillón más científicos a esta estructura de datos, no tendríamos para comprobar un trillón más cosas. Sólo estamos cada vez va a tener que tomar siete pasos, la longitud de la persona de nombre. Por lo tanto, nos gusta pensar de tiempo de ejecución como, supongamos aumentamos el tamaño de nuestra estructura de datos, cuánto tiempo más se va a tomar? En este caso, si añadimos un montón más científicos, no importa. Todavía va a tomar la misma cantidad de tiempo. Es tiempo constante. Sí. AUDIENCIA: ¿Cómo lo sabes para escanear a través de los otros números? ALTAVOZ 1: ¿Cómo sé cómo a-- AUDIENCIA: Al igual que ¿cómo sabes que vaya directamente desde M hasta E y no a M a A? ALTAVOZ 1: Oh, claro. Porque yo sabía que estaba en busca de la palabra Mandel, y yo sólo sé que es M-E. Así que-- sí, adelante. AUDIENCIA: ¿No tienes para mirar las otras letras en el resto de la [inaudible]? ALTAVOZ 1: Ah, no iba a tener mirar el-- OK, genial. Esta es una gran pregunta. Depende de cómo lo implementamos. Si ponemos en práctica sólo como como una serie de matrices donde sabemos que E es siempre en la posición 0, No sé, lo que sea índice de serie se encuentra en. Sí, acabamos de hacer constante tiempo, hacer, hacer, hacer, hacer. Guay. Pregunta por ahí? AUDIENCIA: ¿Es constante de tiempo lo mismo que en tiempo real? ALTAVOZ 1: ¿Es constante de tiempo lo mismo es en tiempo real? No estoy realmente seguro en tiempo real es. AUDIENCIA: tiempo igual que literalmente progresa segundos por segundo en lugar de ser una variable independiente. ALTAVOZ 1: Oh, sí, puede pensar de esa manera. En otras palabras, no es dependiente en el tamaño de la estructura de datos. Esa es una manera de pensar en él. ¿Alguna otra pregunta? Tal vez en la primera vez en historia, terminamos a tiempo. Si usted tiene alguna pregunta, libre de venir pedirnos, vaya a la sección, hable con su TFS, oficina hora es de 8:00 y 8:30 a 11:00 los lunes y martes, así es un momento poco diferente, así que asegúrate de tener en cuenta que. Sí. AUDIENCIA: ¿Necesitamos saber cosas como argumentos de la línea de comandos, ls dash, dash lo que sea? ALTAVOZ 1: Línea de comandos argumentos y comandos de Linux, sí, usted necesita saber eso. Very-- es como el tipo de nivel cosas que cubrimos en la sección 0, en cuanto a los comandos de Linux marcha. AUDIENCIA: ¿Son las horas en Annenberg? ALTAVOZ 1: Las horas de oficina, no estoy todo seguro de dónde se encuentren. Pero usted puede comprobar el sitio web, y le dirá.