ALTAVOZ 1: Hola a todos. Vamos a empezar. Creo que la gente todavía va para ser filtrado en. Sin embargo, en aras del tiempo, por lo que podemos conseguir chicos de aquí a tiempo, vamos a empezar. Así que bienvenidos a la CS50 Cuestionario 0 opinión. Para aquellos de ustedes que no han realizado sin embargo, usted tiene una pregunta para el Miércoles. Woo-hoo. Si usted no ha comenzado a estudiar todavía o No se han dado cuenta de que esto existe, sin embargo, concursos anteriores y toda la información acerca de su concurso están en cs50.net/quizzes. Hay un poco de cosas muy buenas allí, concursos pasados ​​desde el último 10 años, así como información sobre esta prueba y temas que serán cubiertos. Así que vamos a empezar. Así que ustedes pueden recordar, la primera día de clase David tenía esas lámparas en. Así que, esencialmente, todo lo que pasa bajo el capó de un ordenador es hecho en binario. Binario significa lo que suena como, 0 y 1s. Tiene dos valores que puede ser representada. Así como en el primer día de la sección cuando David encendió una luz bombilla para representar en, o 1, nuestro ordenador entiende binario como 0 y de 1 de, encendido o apagado. Fundamentos de la binaria. Cada lugar está representado en base dos. Así se agrega 2 a 0 al 1 a la 2 todo el camino hacia arriba. Para calcular lo que su binario es decimal, sólo tienes que seguir esta ecuación tipo de cosa. Si usted tiene un 1 en cualquiera de esos lugares, lo multiplicas por cualquier basar es en, agregar para arriba, y a obtener el decimal. Así que esta es la forma de contar a 5 en binario. Al igual que lo que estábamos haciendo en el última diapositiva, así es como lo haría representar 1 a 5. Del mismo modo, al igual que usted puede agregar y restar en decimal o en base 10, o Realmente cualquier base, sobre puede agregar y resta en binario. Exactamente lo que se puede esperar cuando se añadir los dos arriba, si es igual a mayor que 1, usted lleva un 1, lo convierten en un 0, y hacer la adición de esa manera, sólo como era de esperar con regularidad decimal o cualquier otra base. Enfriar. Así que como he dicho antes, todo lo que que pasa bajo el capó de nuestro ordenador se hace en de 0 y 1 de, o binario. Entonces, ¿cómo nos expresamos, por ejemplo, letras o números o caracteres? Y la respuesta a eso es ASCII. ASCII es un mapeo entre caracteres que normalmente veríamos en el Idioma Inglés como doctores, B, De C, de subrayado, guiones y nada de eso. Y es que los mapas de un valor ASCII. Un valor ASCII es sólo un número que puede ser entendido por el ordenador. Y al igual que puede hacer la suma y resta con números, se puede hacer con valores ASCII. Así que en este ejemplo, lo que será esta imprimir? Sí, por lo que sólo un espacio espacio espacio B C D. ¿A dónde fue mi ratón? Observe que puede definir un int a 65. Y al imprimir que utilizando ciento C, que va a interpretar eso como un carácter y se imprimirá A. Del mismo modo, se puede declarar como un char. Y cuando lo imprima utilizando ciento C, que va a interpretar eso como ciento D. Y al igual que se puede añadir un número, usted puede agregar caracteres son Valores ASCII, en este caso. Así que un poco de puntero para todo el mundo. 5, como una cadena, ¿no en realidad equivalen a 5. Así que ¿cómo podemos convertir el cadena 5 al entero más 5? ¿Alguna idea? Sí. Así que si tenemos 5 como una cadena, podemos restar 0. Y eso nos dará 5. Y del mismo modo, si tenemos 5 como entero, añadir que a la cadena de 0. Y eso nos da la cadena 5. Enfriar. Ahora, recordar de nuevo a dar una conferencia en una hablamos de algoritmos. Entonces, ¿cómo es lo que realmente queremos un ordenador para hacer cosas interesantes? Ya sabes, sólo sumar y restar números y cosas fuera de impresión no es que emocionante. Por lo general, queremos que nuestro ordenador para realizar algún tipo de algoritmo. Algo un poco más complejo que sólo la aritmética simple. Un algoritmo es sólo un paso a paso conjunto de instrucciones de cómo realizar un cierto task-- al igual que una receta. Puede que recuerde el primer día de clase donde David había contarnos una habitación de las personas y cuántas personas estaban en la habitación. Usted podría estar acostumbrado a recuento uno por uno. 1, 2, 3, 4. En ese caso, un algoritmo de tiempo lineal. Pero David introdujo un algoritmo para que cuentes las personas en la habitación donde todo el mundo se pone de pie, usted dice que su número a otra persona, añadir que número, y una persona se sienta. Y repites eso. Eso es un tipo de algoritmo. Podemos analizar una forma eficiente algoritmo se basa en que es tiempo de ejecución. Pero vamos a hablar un poco más sobre esto más adelante. Así que todos los algoritmos también puede escribirse en pseudocódigo. Pseudocódigo es sólo un Inglés como sintaxis utiliza para representar un lenguaje de programación. Por ejemplo, si queríamos pedir un usuario de adivinar mi número favorito, que podría tener pseudocódigo como tal. Obtener un usuarios adivinen. Si la suposición es correcta, dígales si es correcta, de lo contrario les digo no son correctos. Y pseudocódigo es una manera de fácil que representa una idea o un algoritmo. Así que ahora lo que se quiere realmente escribir esto en el lenguaje que la computadora podría entender. Así que podemos escribir nuestro pseudocódigo y interpretar que en el código fuente. Hasta ahora, el código fuente debe cumplir a una cierta sintaxis de un lenguaje de programación. Y hasta ahora, en el CS50, tenemos estado usando en su mayoría c. Así que esto podría ser el código fuente de c. Más tarde, en el curso, se llega la noche en contacto con otros programas lenguajes como PHP. O si usted incluso tomar otras clases, que podría hacer Java, Python, o incluso OCML. Pero en nuestro lenguaje de programación C, esto es cómo podríamos escribir el código fuente de el algoritmo de pseudocódigo que Que acabo de describir anteriormente. Entonces, ¿cómo el equipo en realidad entender eso? Como he dicho antes, en realidad sólo se entiende ceros y unos. Entonces, ¿cómo llegar de la fuente código para algo que puede ser entendido? Bueno, tenemos algo llamado un compilador. Si usted recuerda de nuevo en la mayor parte de su conjuntos de procesadores, que tenía algún tipo de programa escrito en un archivo de puntos c. Y entonces tendría que escribir make. Entonces, ¿qué está haciendo hacer? Puede escribir make para compilar su programa porque alguien-- quien escribió su conjunto p; probablemente David-- creado un archivo make. Y que dice que saber para ejecutar su compilador, llamado sonido metálico, que la voluntad a continuación, compilar el código fuente de objetar código, que es ceros y unos que el ordenador entiende. Pero un poco más tarde, nos dirigiremos más a fondo acerca de los compiladores. Así recordar pset 0, dónde-- sí, usted tiene una pregunta? AUDIENCIA: [inaudible]? ALTAVOZ 1: Si. Creo que en realidad debe estar en línea. Sí. AUDIENCIA: ¿Es como [inaudible]? ALTAVOZ 1: No lo es. La están en cs50.net/quizzes. AUDIENCIA: concursos de Slash, slash 2013, slash 0 y, simplemente haga clic a través de concursos 2013 y concurso 0, Revise la sección de diapositivas. ALTAVOZ 1: Sí, así que si ustedes quieren tire hacia arriba y mirar en su propio ordenador, eso está bien también. Dilo de nuevo. AUDIENCIA: [inaudible]. ALTAVOZ 1: Sí, [inaudible] es la variable dummy. Ah, sí? AUDIENCIA: [inaudible]? ALTAVOZ 1: No, huelgas no están en el examen. Lo sentimos, la pregunta era, era huelgas en el examen. Y no lo es. Así pset 0, ustedes debe tener toda implementado algo con cero. Y aprendimos algo de programación básica bloques de construcción que utilizan los arañazos. Así que echemos un vistazo a algunos de estos bloques de construcción que conforman un programa. En primer lugar es la expresión de Boole. Las expresiones booleanas son queridos y 0 de o todo lo que tiene dos valores posibles. En este caso, verdadera o falsa, dentro o fuera, y sí o no. Un ejemplo de un simple, muy simple, programa que utiliza un booleano expresión aquí. Así que para que las expresiones booleanas a ser útil, tenemos operadores booleanos. Estos son los operadores que se pueden utilizar para comparar ciertos valores. Así que tenemos y o no igual a, menor o igual que, mayor que o igual a, y menos de o mayor que. Sin embargo, estos operadores no son muy útiles a menos que podamos combinarlos en condiciones. Así que ustedes podrían recordar a partir de cero y de su p establece que tenía condiciones. Ellos son, en esencia, como tenedores en la lógica de su programa que ejecuta dependiendo de si se cumple una condición. Así que una de las condiciones que teníamos utilizado muchas veces en este curso es el if, else, si, y las condiciones lo demás. He aquí un ejemplo de cómo usted puede usar eso. ¿Alguien sabe la diferencia entre simplemente usando las sentencias if todos el camino hacia abajo versos if, else, si, y más combinado? Sí? AUDIENCIA: [inaudible]. ALTAVOZ 1: Exactamente. Así que si tuviera si todo el camino hasta este manera, aunque esta condición vuelve verdadera, todavía seguirá probar los dos siguientes. Considerando que, con una cosa-si, una cosa declaración, si el que devuelve true, los otros no se ponen a prueba. ¿Una pregunta sobre eso? Enfriar. Así que utiliza una persona si-de una persona declaración si usted sabe que sólo puede ser uno de estos casos. Así que sabemos que si x es menor que 0, es definitivamente no va a ser mayor que 0. A continuación, otro bloque de construcción que hemos aprendido son bucles. Tenemos tres tipos de bucles. Para bucles, los bucles while, y hacer bucles while. Y, en general, cuando te sientas a escribir algo, usted tiene que decidir cuál de los tres que desea utilizar. Así que ¿cómo decidir cuál de ellas? Generalmente usamos un bucle for si sabemos cuántas veces queremos repetir a través de algo o cuántas veces queremos realizar una tarea. Utilizamos bucles while si necesitamos alguna condición de ser fieles a seguir corriendo. Y utilizamos hacemos bien es muy similar a la tiempo, pero queremos que nuestro código se ejecute en menos una vez. Así que hacer, mientras que, lo que está en el hacer la voluntad siempre correr al menos una vez. Considerando que, con el tiempo, se pueden no funcionar en absoluto si la condición no se cumple. Cualquier pregunta con eso? Así la estructura de un bucle for. Todo lo que ustedes han visto esto. Usted inicialice. Usted tiene algún tipo de condición. Así, por ejemplo, podríamos inicializar como para i es igual a 0. i es menor que 10. Y i ++. Muy sencillo que hemos hecho. Para un bucle while, de manera similar, usted tiene tener algún tipo de inicialización, algún tipo de condición, y algún tipo de actualización. Así que podemos implementar nuestro bucle for también como un bucle durante el uso de este. Y de manera similar con un do while, podríamos tener un poco de inicialización, ejecutar algo, actualizarlo, y a continuación, compruebe el estado. Así que ahora las funciones. Pusimos todo juntos. Podríamos querer escribir algo tipo de función. Función común que te pueden han visto ya es principal. Principal es una función. Tiene un tipo de retorno, int. Tiene un nombre de función, principal. Y tiene argumentos, argc y argv. Así principal es sólo una función. Otras funciones que pueda haber utilizado, printf printf-- es un function-- GetInt, toupper. Pero estos resultan haber sido implementado para nosotros por algún tipo de biblioteca. Si ustedes recuerden incluyendo esta biblioteca CS50.h o la E / S estándar biblioteca. Sí, la pregunta? AUDIENCIA: ¿Es justo principal inherente a c? Lo hace sólo un poco de [inaudible]? ALTAVOZ 1: La pregunta es si principal es inherente a c. Y sí, todas las funciones tener una función principal. Es una especie de necesario para el ordenador a saber por dónde empezar ejecutar el código. AUDIENCIA: ¿Así que no lo haría [inaudible]? ALTAVOZ 1: No. Alguna otra pregunta? Enfriar. Así como usted puede utilizar una función que está escrito para usted, también puede escribir su propia función. Esta es una función que alguien podría han escrito para calcular el volumen de un q, por ejemplo. Hay un tipo de retorno aquí, en este caso int, nuestro nombre y nuestra función q lista de parámetros. Y tenga en cuenta que usted tiene que escribir los datos tipo del parámetro que desea utilizar o bien la función no saber qué tipo de parámetro debo aceptará. Así que, en este caso, queremos un entero como nuestra entrada. ¿Entonces por qué podríamos querer utilizar funciones? En primer lugar, ideal para la organización. Ayudan a romper el código en más organizada trozos y hacer más fácil de leer. Simplificación. Esto es bueno para el diseño. Cuando usted está leyendo un fragmento de código y la función principal es realmente, muy largo, podría ser más difícil de razón acerca de lo que está pasando. Así que si lo desglosamos en funciones, puede ser que sea más fácil de leer. Y reutilizar-capacidad. Si usted tiene un trozo de código que está siendo llamada o ejecutar varias veces, en lugar de volver a escribir el código 10 veces en su función principal, que te pueden quieren volver a utilizarlo. Y entonces cada vez que necesita usar ese pieza de código, llame a la función. Así que ahora si recordamos de nuevo a cero, también hablamos de algunos conceptos, uno de los cuales está roscado. Tema es el concepto de múltiples secuencias de código ejecutar al mismo tiempo. Así que piensen en el primer día en que David tenía ustedes Cuente el número de personas en la habitación. En esencia, lo que se va sobre todo es de ustedes eran correr hilos separados. Y esos hilos se unen para obtener algún tipo de respuesta. Del mismo modo, en Scratch, cuando se tiene múltiples sprites, que te pueden tener un gato y un perro. Y estarían simultáneamente la gestión de sus propios guiones. Ese es un ejemplo de roscado. Y el otro concepto que fue introducido en cero era eventos. Y cuando los eventos son múltiples partes su código se comunican entre sí. En Scratch, esto fue cuando usó el control de difusión y el Cuando Recibe bloques. Y también, en problemas 4, vimos un poco de los acontecimientos también. Ustedes podrían haber utilizado la biblioteca GEvent. Y había una función waitForClick en el que estabas esperando para que el usuario haga clic. Y el clic, en este caso, sería el evento y esperar a que Click es su controlador de eventos. Y también, a través de la publicación de sus conjuntos de procesadores y trabajando en sus conjuntos de procesadores, que podría haber entrado en contacto con algunos de estos comandos. Esto es lo que ha escrito en su ventana de terminal o lo que sea ventana que aparece en su edición en g, esencialmente, navegar por su ordenador. Así, por ejemplo, las listas de la LS contenido de un directorio. Haz directorio crea una nueva carpeta. CD, cambio de directorio. RM, eliminar, elimina un archivo o algún directorio. Y a continuación, eliminar el directorio Elimina un directorio. AUDIENCIA: [inaudible]? ALTAVOZ 1: Sí, claro. Lo sentimos, la pregunta era si sugeriría poner este en la hoja de trucos. Podría ayudar. Si tiene espacio, puede ponérselo. También está a sólo generalmente lo suficientemente bueno de recordar, porque cuando lo utiliza es posible que desee simplemente tiene memorizado. Eso va a hacer su vida mucho más fácil. ¿He respondido a su pregunta? Así que ahora, hablamos un poco brevemente acerca de las bibliotecas. Pero los dos principales que hemos estado utilizando hasta ahora en el curso son E / S estándar y CS50. ¿Qué tipo de cosas se incluyen en la librería estándar de E / S? Sí, hasta ahora hemos usado printf. En CS50, hemos utilizado getInt y GetString. Y la cadena de tipo de datos también pasa para ser declarado en esta biblioteca CS50. Hablaremos un poco más en profundidad sobre cómo las bibliotecas funcionan y cómo interactuar con el resto de su código. Pero esos son los dos principales que haber estado en contacto con lo que va de el curso. Tipos. Estos son buenos para recordar lo mucho cada tipo está representado por o cómo muchos bytes cada uno de tipo requires-- int, 4 bytes; char, 1 byte. Float es de 4 bytes. ¿Qué es un doble? AUDIENCIA: [inaudible]. ALTAVOZ 1: Sí, por lo que un flotador pero doblar el tamaño. ¿Qué hay de un tiempo? AUDIENCIA: [inaudible]. ALTAVOZ 1: OK. ¿Qué es un tiempo? AUDIENCIA: [inaudible]. ALTAVOZ 1: Sí, el doble de un int. Sí. AUDIENCIA: [inaudible]. ALTAVOZ 1: Long [inaudible]. Y luego de un largo tiempo es el doble. AUDIENCIA: No, no. Una larga es sólo un int. Depende de la arquitectura antes de la [inaudible] int y tienen el mismo tamaño. [Inaudible]. ALTAVOZ 1: Así que una larga y un int son los mismos. Y luego de un largo tiempo es el doble de la int. Enfriar. Y entonces, ¿cuál es el último tipo? AUDIENCIA: Puntero. ALTAVOZ 1: Sí, así que aprendió un poco acerca de los punteros. Y sin importar lo que un puntero es señalando a-- que podría ser una estrella de carbón o un int star-- siempre 4 bytes para un puntero. Preguntas acerca de eso? Sí? AUDIENCIA: [inaudible]? ALTAVOZ 1: Así que un largo y un int son lo mismo en este aparato CS50. AUDIENCIA: El aparato está completamente intercambiables. ALTAVOZ 1: Si. Así que un largo, largo es el doble de un int. AUDIENCIA: Este es el de 32 bits? ALTAVOZ 1: 32 bits, sí. AUDIENCIA: Así que [inaudible]? ALTAVOZ 1: Sí, si no lo hace decir de forma explícita, que debe asumir un poco 32. AUDIENCIA: Sería decir algo como asumir una arquitectura como el aparato. Para 64 bits, lo único que cambio son largos y punteros. Ambos [inaudible]. ALTAVOZ 1: Sí? AUDIENCIA: Pregunta. Así que en una de las pruebas de práctica, se pregunta sobre un int sin signo. Entonces, ¿cómo habría que determinarse de un int [inaudible]? ALTAVOZ 1: Un signo en es también 4 bytes. Pero lo que es diferente acerca de una firma int y un int sin firmar? AUDIENCIA: [inaudible]. ALTAVOZ 1: Así es. Uno puede representar valores negativos. Pero ¿cómo se hace eso? AUDIENCIA: [inaudible]. ALTAVOZ 1: Sí, se ahorra 1 bit para representar el signo. La firma tiene un bit que representa el signo. Y sin signo sólo es de todos los positivos. AUDIENCIA: OK. Así que usted dice que es un doble dos veces el tamaño de un flotador? ALTAVOZ 1: Haga doble es dos veces el tamaño de un flotador, sí. AUDIENCIA: ¿Cómo funciona un puntero para un largo tiempo [inaudible]? ALTAVOZ 1: Entonces la pregunta es ¿cómo el puntero a una larga long-- cómo es que sólo cuatro bytes cuando un largo, largo de sus 8 bytes. Así que recuerda lo que es un puntero, esencialmente, en el valor muy base. AUDIENCIA: [inaudible]. ALTAVOZ 1: Sí, así que un puntero es sólo una posición de memoria. Así que no importa la cantidad de espacio ese puntero está apuntando. Sólo necesita 4 bytes para realizar un seguimiento de esa ubicación de memoria. Alguna otra pregunta? Enfriar. Así que la última cosa que tengo es la salida estándar. Usted debe utilizar con frecuencia lo suficiente para que usted pueda recordar. Pero esto es cuando usamos printf, por ejemplo. Y tenemos estos marcadores de posición que fueron llamados códigos de formato. Así ciento c char, ciento i para int, y también podemos utilizar el porcentaje d. Es la misma cosa. Pero, en general, en que CS50 tratar de utilizar el porcentaje de i. F Porcentaje de flotador. Ld Porcentaje de largo de largo y ciento s para cadena. Del mismo modo, hemos estado utilizando algunos de estas secuencias de escape. Por ejemplo, la barra invertida n para la nueva línea. Esto es sólo para cuando estás de formatear su código para la impresión f. Sí? AUDIENCIA: ¿Cuál es el porcentaje de d? ALTAVOZ 1: Así que la pregunta es lo que es ciento por d? Porcentaje d es para enteros. Porcentaje dy ciento i son los mismos. AUDIENCIA: ¿Cuál es la diferencia entre barra invertida n y barra invertida r? ALTAVOZ 1: Entonces la pregunta es ¿cuál es el diferencia entre N y reacción r contragolpe? Creo barra invertida r es-- AUDIENCIA: Así barra invertida r sólo implica regresa al principio de la línea sin tener que ir a una nueva línea. Así que si imprime una barra invertida r y volver al principio de la línea a continuación, se imprime más cosas, se sobrescribe el material que ya está en [Inaudible]. Considerando que, en realidad n va a una nueva línea y va a [inaudible]. ALTAVOZ 1: Bueno, alguna otra pregunta? Bien. Voy a darlo fuera de Dan quien continuará. [Aplausos] DAN: Muy bien. Así que voy a estar hablando de otra amplia gama de ideas de la clase que sean representante de aproximadamente dos semanas y el comienzo de la semana tres partiendo con la fundición, que es sólo una forma de el tratamiento de un valor de un cierto tipo como un valor de un tipo diferente. Así que podemos hacer esto con caracteres a ints, flotadores para ints, y longs largas duplicar. Todas estas cosas pueden ser utilizados como formas de tratar algún valor numérico Char menos como algún otro valor numérico. Así que hay algunos problemas con esto, de Por supuesto, que viene cuando lanzas cosas como float a ints. Así que esto es un poco raro. Tenemos un flotador que es de 1.31. Nos multiplicamos por 10.000. Y entonces lo imprimimos como un int. ¿Qué significa este resultado? 10.000 veces 1.31. Así que 13.000, es que la conjetura? AUDIENCIA: Creo que es de 10.000. DAN: Así que estoy multiplicarlo por 10.000 antes de que me lanzarlo. AUDIENCIA: Oh. ¿No habría un 9 y algunos números de 0? DAN: Usted podría tener algunos dígitos extraños. Así bien, es 1,3 veces 10.000. Así que eso es 13.000. Y esto weird-- adicional AUDIENCIA: 13100. DAN: 13100. Gracias, Rob. Y esto weirdness-- adicional este 9,9-- es simplemente porque este casting acabó redondeando donde que no debería tener. Sí. AUDIENCIA: El casting sucede después de todo lo demás? DAN: Así que ya tengo esto en impresión, hace esta multiplicación antes de que se hace este casting. AUDIENCIA: [inaudible]. DAN: Creo que proyectaría primero, sí, lo que sería de 10.000. Algo más? Enfriar. Así que esto es 13.099. ¿Por qué sucede esto? La imprecisión. Los flotadores no son perfectos. Sólo pueden representar los números a un cierto número de cifras significativas. Así que si imprimimos 8 sig higos en este flotador, obtenemos una especie de número feo aspecto. Y eso es porque 1.31 no puede con precisión ser representado por simples potencias de dos en la máquina. Por lo que termina teniendo el más cercano Supongo, que termina ser un poco bajo. Tiene sentido? Okay. Ahora, con conmutación son una forma diferente de haciendo sentencias condicionales donde todos los que nos importa es una sola variable. Así que en este ejemplo en particular, estamos obtener un número entero de usuario. Y entonces estamos viendo lo que es entero. Presumiblemente, es el número entre uno y cuatro. Eso es lo que estamos pidiendo. Así lo hace un interruptor de el nombre de la variable. Luego de configurar los casos de posible valora que podría ser. Así caso de que uno, dicen que es bajo. Y luego se rompe para salir de la condición del interruptor de modo no seguir adelante. En la siguiente caso-- así que caso dos y caso tres-- si es el caso de dos que sólo desciende a la primera línea de código que ve como con caso, tres, hasta que ve un descanso. Así que la razón se obtiene caso de que uno de sólo impresión bajo es porque tener este descanso aquí. Si yo, por ejemplo, ignorado este break-- si me lancé este breakaway-- sería imprimir bajo, y entonces sería imprimir medio, y luego se rompería. Así descansos son una parte importante de cambiar las condiciones y deberían estar allí. Los casos que no figuran explícitamente son manejadas por el defecto caso en el interruptor y sea echado. AUDIENCIA: So 1, 2, 3, y 4 sería n? DAN: Valores que n puede ser. Sí. ¿Sí? AUDIENCIA: Así que cuando usted tiene que [inaudible]? DAN: Usted imprimiría baja, y luego sería imprimir media y a continuación, se rompería. AUDIENCIA: ¿Por qué sería imprimir medio si [inaudible]? DAN: Así que todo bajo un caso antes de un descanso cae bajo. Así caso una copia de impresión es el caso por debajo de uno como es este siguiente impresión. ¿Sí? AUDIENCIA: [inaudible]? DAN: Así que este número es sólo un particular, valor que esta variable puede tomar, ¿no? ¿Tiene eso sentido? Sí. AUDIENCIA: [inaudible]? DAN: Sí, el caso de dos imprimiría medio y luego romper. AUDIENCIA: [inaudible]? DAN: Creo que cualquier? ¿Qué otros tipos de datos se puede cambiar de nuevo? AUDIENCIA: Usted puede cambiar sobre cualquier tipo de datos. Pero sólo significa algo más caracteres y ints y cosas por el estilo, ya que si usted está cambiando más de un puntero que en realidad no tiene sentido, conmutación de cargas, si es que vamos a usted hace eso, porque de punto flotante en la precisión, no lo harías realmente quiero hacer eso de todos modos. Así que más o menos, a sólo enteros y caracteres y cosas por el estilo. DAN: Sí, es cuando tienes explícita valores que usted sabe, creo, puede ser que un cambio es realmente útil. Bueno? Okay. Alcance es el rango que un declarado la variable se extiende. Así que en este pequeño trozo de código que tengo, que estaría lleno de errores. Y la razón es que declaré esto int i dentro del alcance de este bucle. Y entonces yo estoy tratando de hacer referencia a ese i fuera de ese ámbito de bucle. Así que, básicamente, se puede pensar en el alcance como todo lo que se declara con el interior de un conjunto de llaves sólo existe dentro de esas llaves. Y si se trata de usar esa variable fuera de esas llaves, podrás obtendrá un error del compilador. ¿Sí? AUDIENCIA: Así que éste no funciona? DAN: Esto no funciona, sí. Cuerdas. String a char *. Son exactamente lo mismo. Ellos son sólo punteros a caracteres. Y cualquier cadena que tiene deben terminar con barra invertida cero, que es justo una convención c. Se llama el terminador NULL. Y NULL-- N mayúscula, capital de U, el capital L, de capital L-- no es el mismo que el Terminador NULL. Esto es un puntero. Este es un personaje. Son muy distintos. Recuérdalo. Será en el cuestionario, probablemente. No he visto la prueba. ¿Sí? AUDIENCIA: Así NULL es, por ejemplo, el puntero? DAN: Si. AUDIENCIA: ¿Qué hace [inaudible]? DAN: Si, dicen, malloc se llama cuando usted no tienen suficiente memoria para obtener sea ​​cual sea el tamaño que usted está pidiendo, malloc devolverá NULL. Es, básicamente, cada vez que una función es supone que devolver un puntero, que comprobar contra NULL porque NULL es un bueno-- bastante es, más o menos, el valor de la basura. Es un cero en la medida de como punteros van. Cada vez que se llama a una función, que devuelve un puntero. Usted va a querer comprobar que Seguro que ese puntero no es NULL porque NULL es muy común. Es una especie de un retorno de la basura. Así que si algo no iba bien, simplemente devolver NULL en su lugar. AUDIENCIA: [inaudible]? DAN: Sí, y eso es esto. AUDIENCIA: [inaudible]? DAN: Spell como este. Es el terminador NULL. Es minúsculas N-U-L-L si está deletreando ella. AUDIENCIA: Y me fui espalda y probado. Y si tratas de poner un punto flotante valor en un interruptor, que va a gritar a usted decir, declaración requiere la expresión de tipo entero. DAN: Hay que ir. Pero sí, lo era la pregunta? AUDIENCIA: [inaudible]? DAN: Así de capital N, U mayúscula, el capital L, L mayúscula es una cosa real c. Es el puntero NULL y voluntad sólo ser tratados como tales. Usted nunca va a tratar de explicar el Carácter nulo y ver cualquier otra manera que esto. ¿Sí? AUDIENCIA: Así que volviendo a char máximo o algo en las notas, ¿verdad encarnar la misma función como [inaudible]? AUDIENCIA: Así que te refieres regresar max caracteres de getchar, o sea ​​lo que sea? AUDIENCIA: Si. AUDIENCIA: Sí, por lo general plazo para todas esas cosas son valores centinela. Así como volver int max de getInt y trucha máximo de getchar, es supone que es igual, de acuerdo, si estas cosas están volviendo a nosotros, algo salió mal. Para los perros, sólo sucede que tiene este valor centinela que todo el mundo conviene en. Y esto es lo que regrese cuando las cosas van mal. Así max char es lo que estamos utilizando para representar algo como NULL o getchar. AUDIENCIA: Así que si usted está probando getchar, podría usted acaba de poner NULL? ¿Sería eso una diferencia? DAN: No podías comprobar NULL. Habría que revisar caracteres máximo debido a que el valor de retorno de la función es un carácter no un puntero. ¿Sí? AUDIENCIA: Esta pregunta para la longitud de la cadena. ¿Eso incluye el carácter NULL? DAN: No. Y eso es en realidad la forma de longitud de serie sabe que parar porque se pasa por la matriz de caracteres hasta se ve un carácter NULL. Y entonces es como, todo bien, he terminado. AUDIENCIA: [inaudible] de cinco? DAN: Hola sería cinco. Sip. Así arrays son continuas bloques de memoria. Ellos tienen acceso inmediato al decir que el nombre de la matriz y, a continuación, en rizado apoyos, cualquiera que sea el índice que desea ir a, que están indexados a partir de cero a la longitud de la matriz menos 1. Y están declarados por el tipo de la Lo que usted está almacenando en el matriz, el nombre de la matriz, y luego cualquiera que sea el tamaño es de esa matriz. Así que esta es una matriz de caracteres de longitud seis que tiene esos valores. ¿Sí? AUDIENCIA: [inaudible]? DAN: Si. AUDIENCIA: [inaudible]? DAN: Si usted tiene lo que está pasando en la matriz ya hecha. Así que se podría especificar esta vez como, por ejemplo, char, cualquiera que sea el nombre de su matriz es, corchetes vacíos es igual rizado prepararse H E coma coma coma L L comas O coma carácter NULL y llave de cierre. Eso también funciona como una declaración. AUDIENCIA: [inaudible]? DAN: Entonces es necesario tener el tamaño ya hizo. AUDIENCIA: [inaudible]? DAN: Si. Muy bien. Argumentos de la línea de comandos son una forma de obtener la entrada del usuario como argumentos a principal. Principal tiene dos argumentos. El número de argumentos que se está pasado a lo largo de la línea de comandos y un vector cadena o una matriz de cadenas de todos los argumentos. Así que si, por ejemplo, llamé a una función como un punto a 1 plaza, 2 plaza, tres, argc sería 4. Y el argv 0 sería un punto fuera. Argv1 sería 1. argv2 sería 2. argv3 serían 3, en ese caso particular. ¿Sí? AUDIENCIA: [inaudible]? DAN: El último elemento de la matriz porque la matriz es la longitud argc más uno de argb, el último elemento es el puntero NULL. Es más argc 1. Así que en el caso que acabo de decir, que se argv 0 es un punto fuera. argv 1 es 1. argv2 es 2. argv 3 es 3. argv 4, que es uno más grande que argc sería NULL. Y eso es el puntero NULL. Sí. Y eso es porque la cadena es una estrella char es un puntero. Así que tiene que ser del mismo tipo. ¿Sí? AUDIENCIA: Dos preguntas. Así que uno, ¿cuál es la diferencia entre esto y GetString otra de un tipo en el motor de usuario? Y dos, que se almacena en su historia reciente? Así como, GetString haría ser [inaudible]? DAN: ¿Dónde se almacena? No sé donde se almacena. AUDIENCIA: Así que, en realidad, ya sabes cómo cualquier función que llama a sus argumentos se almacenan en la pila? Así argc y argv son argumentos a principal y están en la pila, o realmente justo por encima de lo que usted piensa como el comienzo de la pila. ¿Cuál era la otra parte de la pregunta? AUDIENCIA: ¿Cuál es la [inaudible]? DAN: Sí, es sólo una manera diferente de conseguir la entrada del usuario. Ligeramente más eficiente y de este uno es más práctico para los scripts porque sólo puede pasar argumentos a su principal función en lugar de tener que esperar para los usuarios si usted no tiene ningún usuario. AUDIENCIA: Y sí, conseguir cadenas sería [inaudible]. Sería almacenar las cosas que necesita. DAN: ¿Sí? AUDIENCIA: [inaudible]? DAN: Sí, argv 0 siempre incluye la punto slash de la llamada a la función. ¿Sí? AUDIENCIA: [inaudible]? DAN: Sí, cada uno de los argumentos son terminó en carácter NULL porque son cadenas. AUDIENCIA: [inaudible]? DAN: Sí, argc argv es un puntero NULL. AUDIENCIA: [inaudible]? DAN: Ah, sí. Sí, lo siento. AUDIENCIA: Así que [inaudible]? DAN: Así que la pregunta es si usted tuviera la punto de línea de comandos slash un punto a cabo 1, 2, haría el número de línea de comandos argumentos sean dos o tendrían que ser tres? AUDIENCIA: Creo que no hace realmente importa. Tiendo a decir, oh, que no pasó cualquier argumento de línea de comandos cuando, obviamente, que llamó a la función. Así que tiendo a excluir vocalmente la función desde la línea de comandos argumentos, aunque es incluido en argv. DAN: Pero si estaba en el test-- Sí-- y también si usted dice algo como argc es igual a 3, usted está en la caja fuerte de pie. ¿Sí? AUDIENCIA: [inaudible]? DAN: Creo que si en lugar de llamar a este en argc y argv cadena entre paréntesis pero mantuvo los mismos tipos y acaba de llamar ellos algo diferente como un y b, ¿seguiría trabajando? Y no por ello deja trabajar, usted solo-- en lugar de utilizar argc-- tendrá que utilizar a y b. ¿Sí? AUDIENCIA: [inaudible]? DAN: Así que la pregunta es GetString es va a almacenar la memoria en el montón porque GetString es char *. Almacena la memoria en el montón, ya que pide ahora malloc en el real aplicación de GetString. Aceptar, seguir adelante. Seguridad. Así que para que sea realmente seguro, usted confía en no uno y permites que nadie el acceso a cualquier de su información, que es la razón por cada uno construye sus propias máquinas, sus propios sistemas operativos, toda su programas a partir de cero, y, obviamente, no conecte a cualquier otra máquina a través de Internet. Así que las computadoras son inseguras. Ellos realmente son. Tenemos que confiar en otras personas. Y la idea de la seguridad es que eres tratando de limitar la cantidad de la confianza que usted necesita. Y uno de los medios que hace que es a través de la criptografía. La criptografía es, en esencia, tenemos secretos. A veces tenemos que pasar nuestros secretos a lo largo a través, por ejemplo, el Internet o otras cosas. Y no queremos que la gente conocer estos secretos. Así que ciframos nuestros secretos en un camino que esperamos que nadie puede imaginar. Así que used-- a través del curso de este class-- cosas como cifrado César y [Inaudible], que son a la vez muy, muy formas inseguras de la encriptación de las cosas. Son fáciles de averiguar lo que son y cuáles son sus secretos son. El mundo real utiliza mucho más esquemas de cifrado complicados. Y no vamos a entrar en mucho más que eso. Depuración. GDB es el mejor. Voy a insistir en esto otra vez. Utilice GDB todo el tiempo cada vez que tenga un problema. Los comandos que son útiles en el BGF son rompes, lo que pasa, ya sea una línea número, un nombre de función, esencialmente donde en el código que desee detener, y ser capaz de tomar el control. Imprimir toma una variable e imprime cualquiera que sea esa variable es en ese momento de su ejecución. Siguiente mueve su ejecución a lo largo de un solo paso. Y paso pasos dentro de una función en su ejecución. Otras cosas se ejecutan, que es como en realidad se ejecuta el código. Continuar toma todas las medidas necesarias para llegar al siguiente punto de ruptura. Y hay muchos, muchos otros. Búscalos. Son excelentes. ¿Sí? AUDIENCIA: [inaudible]? DAN: Sí, que es un depurador. Así que un depurador es un programa que le permite comprobar el programa. No es un programa que encuentra errores para que, sin embargo, que sería grande. Y por último, para mí es la búsqueda. Así que los tipos de búsqueda que hablamos acerca de esta clase son búsqueda lineal, que es justo que se mira a través de cada elemento del espacio de búsqueda, uno elemento a la vez, hasta encontrar lo que usted está buscando o hasta que llegue Al final de su espacio de búsqueda en el que señala que dices que no se podía encontrar el elemento que estabas buscando. Y esto lleva tiempo, en el mejor constante, que es 0 de 1 y en el peor lineal tiempo, que es 0 de n. La búsqueda binaria, que necesita elementos sórdidos. Usted va a la mitad de sus elementos, ver si el elemento que está buscando es mayor o menor que el elemento que estás en el medio. Es que es más grande, se dice que el fondo de su búsqueda de espacio es su ubicación actual, el medio, y reiniciar el proceso. Si es menor, se mira dicen que el-- sí, ¿qué pasa? AUDIENCIA: [inaudible]? DAN: Si. Cualquier tipo de especie que se ha enseñado en la clase es un juego justo para la prueba. [Risas] DAN: Y el hecho de que usted no ha tenido que lo haga por una serie de problemas, que es justo juego para la prueba. AUDIENCIA: ¿Podemos ir sobre ella cómo a-- DAN: Se ha ido otra vez. ALTAVOZ 2: El código real para [Inaudible] es en study.cs50.net. Así que si nos fijamos en el problema la práctica en la página de combinación de tipo de study.cs50.net, no es el código para la implementación de fusionar especie. Así que usted no tiene que poner en práctica usted mismo esta noche. Pero asegúrese de que entiende que en lugar que simplemente memorizarla. AUDIENCIA: [inaudible]? ALTAVOZ 2: La página de combinación de tipo de study.cs50.net, existe una práctica problema que, si hace clic a través de la problema, al final hay una solución, que es la combinación aplicación especie. Pero asegúrese de que entiende que y no sólo memorizarla o copiar hacia abajo. AUDIENCIA: Y un perfectamente válido problema para el examen sería algo así aquí está una lista. ¿Qué hace esta lista parece después un paso de selecciones tipo u ordenación por inserción o lo que sea. Una iteración completa de la lista. Así que incluso si usted no termina encima de necesitar código para ello, es necesario comprender que suficiente para saber cómo va que la modificación de esta matriz. DAN: Eso es todo para mí. [Aplausos] LUCAS: Hola a todos. Mi nombre es Lucas. Voy a hablar de la recursividad, todo las clases que hemos aprendido, y un poco de todos los punteros. ¿De acuerdo? Así que primero de todo, la recursión. ¿Qué significa decir que es una función recursiva? AUDIENCIA: Llamadas en sí. LUCAS: OK, llama a sí mismo, sí. Así que te gusta esta foto, por ejemplo. Es como la imagen en el interior de una imagen y así sucesivamente. Así, por ejemplo, puede tener-- como Dan que hablaba de búsqueda binaria. Una forma en que la búsqueda binaria es recursivo es el hecho de que eres tratando de encontrar un número. Así que ir al centro. Y a continuación, comprobar si los números allí en la izquierda y en la derecha. Y entonces si usted descubre que el número es va a ser de la izquierda, que es la misma cosa como hacer la búsqueda de nuevo, pero sólo en la izquierda de la lista. Así que así es como suena como que es recursivo. Así que es por eso que ustedes tienen recursiva solución para merge sort. OK, así que aquí está un ejemplo. Así que digamos que yo quiero elegir todos los números de 1 a n. Puedo darme cuenta de que la suma de los n número es n más n menos 1 hasta 1. Pero entonces, si miro n menos 1 más n menos 2 más 1, que es el mismo cosa como números cuya suma hasta n menos 1. Así que puedo decir que la suma de una cantidad igual es igual a n más la suma de n menos 1. ¿Tiene eso sentido? Y yo también tendría algo más llamado el caso base, que es que la suma de los números hasta a cero sería cero. Así que tan pronto como llegue al número cero, que detener el conteo. ¿Tiene eso sentido? Así que aquí está un ejemplo de cómo Puedo aplicar eso. Así que tengo esta función en algunos. Para eso se necesita un entero n. Así que aquí primero compruebo si n es menos o igual a cero. Así que si es menor o igual a cero, I devolver cero, que es nuestro caso base. De lo contrario, sólo puede volver n más la suma de los números de uno a n menos uno. Tiene sentido? Okay. Así que aquí está lo que parece. Tiene suma de 2 pares 2 más la suma de 1. Y algunos de 1 es 1 más el suma de 0, que es 0. Tiene sentido? Así que si nos fijamos en la pila de su programa, esto es lo que parece. En primer lugar, tenemos la función principal. Y a continuación, la función principal llamada suma 2. Y a continuación, suma 2 que va a decir, oh, suma 2 es igual a 2, más la suma de uno. Así que añado suma de 1 a la pila. Y la suma de 1 va a llamar suma de 0, que también va a ser añadido a la pila. Y entonces cada uno de estos los que están en la parte superior de otro tener que volver antes de que los demás pueden seguir adelante. Así, por ejemplo, aquí, suma de 0, en primer lugar, se va a devolver 0. Y a continuación, elija suma de 1. Luego suma de 1 va a devuelve 1 a la suma de 2. Y finalmente, suma de 2 va para volver a la principal 3. ¿Tiene eso sentido? Es muy importante entender cómo la pila está trabajando y tratar de ver si tiene sentido. Aceptar, por lo que la clasificación. Así que ¿por qué es importante la clasificación, ante todo? ¿Por qué debería importarnos? ¿Alguien? Dame un ejemplo? ¿Sí? AUDIENCIA: [inaudible]. LUCAS: Sí, está bien. Así que usted puede buscar de manera más eficiente. Eso es una buena manera. Así, por ejemplo, tenemos una gran cantidad de cosas, en realidad, en nuestras vidas que se ordenan. Por ejemplo, los diccionarios. Es muy importante tener toda la palabras en algún tipo de orden que puede acceder fácilmente. Así que eso es lo que estaba diciendo. Usted puede buscar de manera más eficiente. Piense en lo difícil que sería tener un diccionario en el que las palabras están en orden aleatorio. Vas a tener que ver, más o menos, cada palabra hasta que encuentre el palabra que usted está buscando. Si estás usando Facebook También, cuando lo que buscas en tus amigos, eres vamos a ver que Facebook pone a su amigo más cercano está en la cima de los que no habla con tanto. Si usted va todo el camino hasta la parte inferior de tu lista de amigos, vas a ver personas que probablemente ni siquiera recuerde que usted es amigo de. Y eso es porque las clases de Facebook sus amigos en función de cómo cerca está de ellos. Así que la organización de los datos. También Pokemon. Así que ya ves que todos los Pokémons tener números. Y eso es como un fácil forma de acceder a los datos. AUDIENCIA: Acceso a Pokemon. LUCAS: Si. AUDIENCIA: [inaudible]. LUCAS: Yep. Aceptar, por lo que la selección de clasificación. Selección tipo va a seleccionar el menor valor sin ordenar de una lista cada tiempo en cada iteración. Es un poco como el tipo que lo hace en su cabeza cuando usted está tratando de ordenar una lista en la mano. Básicamente, todo lo que hacemos es mirar para el número más pequeño. Te lo pones en la lista ordenada. Y luego busca la siguiente número más pequeño. Y luego sigues haciendo que y así sucesivamente. Así que la selección especie es, básicamente, que seleccionar cada vez que el más pequeño valor sin clasificar. Ponga al final de la ordenada parte de la lista. Y seguir haciendo eso. Así que vamos a ver rápidamente lo que esto se parece. Así que aquí está la ordenada y la lista sin ordenar. Así que para la ordenada de la lista, es inicialmente vacía. Y luego voy a seleccionar el menor número aquí, que es 2. Así que tengo el número 2 y pongo en la parte delantera de la lista. Y entonces miro a la inmediata inferior elemento, que es 3. Así que lo puse al final de la lista ordenada. Y luego sigo haciendo eso. Encuentro 4 y lo puse al final. Encontrar 5 y lo puso al final. Y mira cómo todos esos momentos que Estoy diciendo lo puso al final es, básicamente, el canje de dos valores. ¿De acuerdo? Y luego la última, que acaba de tener un elemento más. Así que ya está solucionado. Aceptar, por lo que la ordenación por inserción. La ordenación por inserción que vamos a tener también esa cosa de tener un ordenado y una lista sin ordenar. Lo único es que cada vez que va a añadir un elemento a la ordenada lista, que acaba de recoger el elemento que está en frente de la lista sin ordenar. Y luego vas a encontrar lo posición en la que debe estar en la ordenada parte de la lista. Vamos a ver qué esto es así esto tiene más sentido. Así que al principio, por ejemplo, estoy tratando de para insertar el número tres de la parte ordenada de la lista. Así que la lista no tiene nada. Así que sólo puedo poner el número 3. Ahora, quiero añadir el número 5 a la parte ordenada de la lista. Así que miro el número 5. Me doy cuenta de que es mayor que 3. Así que sé que tiene que ser después de las 3. Así que puse 3 y 5. Entonces quiero insertar el número 2. Me doy cuenta de que el número 2 es en realidad durar entonces ambos 3 y 5. Así que en realidad tengo que poner todo el camino en el principio de la lista. Así que tengo que hacerlo, clase de, trasladar toda la elementos en la lista ordenada de modo que pueda hacer espacio para el número 2. Entonces veo el número 6. Veo que debería ser después de las 5. Así que lo puse ahí. Y, por último, me veo en el número 4. Y me doy cuenta de que debería estar entre 3 y 5. Y entonces me puse ahí y cambio todos los demás elementos. Tiene sentido? La clase de burbuja. Así ordenamiento de burbuja es básicamente lo que está va a hacer-- lo llamamos burbuja especie, porque usted va a través de la lista-- en realidad es mejor que me muestro te gusta esto-- y vas a comparar números adyacentes. Y usted va a cambiar su posiciones si no están en el orden correcto. Así que, básicamente, lo que va a pasar es que aquí, por ejemplo, Tiene 8 y 6. Usted sabe que el orden de clasificación será en realidad ser de 6 y 5, ¿verdad? Así que vas a cambiar las órdenes. Entonces veo 8 y 4 aquí. Y yo hago lo mismo. Me cambiaré de nuevo. Y, finalmente, 2 y 8. También les swap. Se llama la clase de burbuja porque después cada una de estas iteraciones, en realidad, el mayor número en la lista recibe toda el camino hasta el final de la lista. ¿Tiene eso sentido? Porque mantiene intercambiarlo y moviéndolo hacia la derecha. OK, así que esta es la segunda iteración. Sería lo mismo. Voy a hacer un intercambio y a continuación, el último. I que no hay swaps y la lista está ordenada. Así que en la clase de burbuja, que básicamente mantenemos ir a través de la lista y el intercambio cosas hasta que me doy cuenta de que yo no hice cualquier swaps haciendo esa iteración, que significa que la lista ya está ordenado. Tiene sentido? Vamos a hablar un poco sobre el tiempo de funcionamiento. Así que es lo que ustedes recuerden Grande O, Omega, y Theta? ¿Sí? Bien, ¿qué es Big O, en primer lugar? AUDIENCIA: [inaudible]. LUCAS: Sí, se llama el peor caso tiempo de ejecución, lo que sólo significa que es cuánto espera el programa tomar para funcionar. Al igual que, en términos de-- en este caso-- n. El número de elementos en la lista en el peor de los casos. Al igual que, en el peor de los casos posibles. Así que para la clase de burbuja, por ejemplo, tenemos Big O de n cuadrado. ¿Por qué tenemos que? ¿Por qué es la clase de burbuja Big O n cuadrada? AUDIENCIA: [inaudible]. LUCAS: Sí, por lo que el peor de los casos será que voy a tener que hacer n iteraciones. Así que cada una de las iteraciones se va a llevar el elemento más grande hasta el final de la lista. Así que el peor de los casos es que tengo para hacer esa cosa n veces. Y para cada uno de esos momentos, tengo que hacer n swaps porque tengo que comparar cada uno dos elementos. Así que por eso está n al cuadrado porque es n veces n. Entonces, la selección de género es también n cuadrada porque, para cada iteración, tengo que mirar cada elemento individual en la lista. Y luego encontrar el más pequeño, lo que significa que tengo que mirar a través de n elementos. Y tengo que hacer que n veces porque Tengo que seleccionar todos los elementos n. Una ordenación por inserción es también n cuadrada debido a que el peor de los casos lo hará ser, uno, tengo que insertar n números, ¿verdad? Así que ya sé que voy tener n iteraciones. Pero para cada uno de esos números, si tuviera para mirar a todos los números en la lista ordenada y lo puso todo el camino en la parte delantera, que será n cuadrada porque será n veces n de nuevo. Tiene sentido? ¿Qué pasa con omega? AUDIENCIA: [inaudible]. LUCAS: Es el mejor de los casos. Así es como, en un montón de veces para clasificación, el mejor de los casos es cuando la lista ya está ordenado. Así que usted realmente no tiene que hacer nada. La clase de burbuja tiene la mejor de los casos de n. ¿Conoce chicos por qué? AUDIENCIA: [inaudible]. LUCAS: Sí, si usted no pierde de si la ración de datos tenía ningún swaps o No, si usted tiene algo así como se establece en verdadero si había una iteración, si el lista ya está ordenado, básicamente, lo que va a pasar es que voy a intentar cambiar cada dos elementos adyacentes. Voy a ver que no hay swaps. Y yo acabo de volver de inmediato. Así que eso significa que yo sólo tenía que ir a través de la lista una vez. Así que es n porque me veo en n elementos. ¿Por qué la selección tipo n cuadrar? Sí, incluso si la lista está ordenada, para cada iteración del ordenamiento por selección, me que seleccionar el elemento mínimo. Así que eso significa que tengo que salir a buscar en todos los elementos en el sin clasificar listar y encontrar el mínimo para cada iteración. ¿Tiene eso sentido? Y la espada de inserción está n porque en el caso que estoy tratando de insertar el números y todos los números, cuando me tratar de insertarlos, veo que están en la posición correcta. Yo no tengo que ir a ver todos los demás números de la lista sin ordenar. Así que por eso será n. Tiene sentido? Y lo que es theta? AUDIENCIA: [inaudible]. LUCAS: ¿Qué, lo siento? Dilo de nuevo. AUDIENCIA: [inaudible]. LUCAS: Exactamente. Así se puede ver que sólo la selección almacenada en Merge sort tener theta. Y eso es porque sólo tienes theta si ambos Big O y Omega son la misma. Okay. Y, por último, fusionar es un género en el registro n. Y entonces, como Dan estaba diciendo, Merge sort es una especie de la misma manera que usted hace una búsqueda binaria. Así se obtiene la lista. Y usted va a cortar por la mitad. Y después de haberlos cortado en mitades más pequeñas. Y luego combinarlos. Ustedes recuerdas, ¿verdad? Aceptar, como él decía. Aceptar, punteros. Entonces, ¿qué es un puntero? AUDIENCIA: [inaudible]. LUCAS: Una dirección. Okay. Sé que David muestra un montón de videos de Binky y cosas que apuntan El uno al otro. Pero me gusta pensar de punteros simplemente como una dirección. Así que es una variable que se va para almacenar una dirección. Así que es sólo esta variable especial es decir, cuatro bytes de longitud. Recuerde, que para nada es puntero siempre de cuatro bytes de longitud para nuestro 32-bit máquina para que el caso con el aparato. Y que sólo tiene la ubicación de una variable dentro de la misma. OK, así que hay esta memoria, básicamente. Así que cada bloque de memoria tiene en realidad un etiqueta, que es la dirección de la memoria Slotty. Así que eso significa que puedo tener un puntero que apunta a cualquiera de estas direcciones. Así que la razón por la que vamos a utilizar punteros es si tengo que recordar la ubicación que una variable específica es un recuerdo. Y ustedes recuerda que uno de los casos era si tengo una función que si tengo realmente quiere intercambio de reales, en realidad que enviar un puntero. No es la variable. ¿Ustedes se acuerdan? El between-- diferencia ¿cómo se llama? Llamando por valor y llamar por referencia, ¿no? Bueno, sí. Así que llame por valor. Cuando usted acaba de enviar una variable a función que está mandando un valor. Así que en realidad estás enviando una copia de la variable. Y su programa no podría importarle menos acerca de si la misma variable en realidad hace una copia. Y llamando por referencia significa que En realidad estoy enviando una copia de la puntero a esa variable. Así que eso significa que estoy enviando la ubicación de esa variable. Así que sentir que tengo la ubicación de la variables, cuando llamo a la función con punteros, soy capaz de realidad cambiar los datos que estaban en la principal. Tiene sentido? Aunque, el puntero es una copia, el puntero todavía tiene la dirección real de la variable que quiero cambiar. Tiene sentido? Así que la creación de punteros. Recuerde, el puntero siempre tienen el tipo que se está apuntando y luego a una estrella. Y a continuación, poner el nombre. Así que recuerde que cada vez que tenga cualquiera que sea la estrella, que es un puntero a que cualquiera que sea la variable escriba que usted tenía. Así que aquí en estrella, por ejemplo, es un puntero y un entero. Y entonces estrella char es un puntero Char estrella y así sucesivamente. ¿Sí? AUDIENCIA: ¿Qué pasa si tenemos un puntero a n x a la estrella. Sé que crea un puntero a x. ¿También declaramos x un número entero? LUCAS: OK, así que cuando usted dice n estrella x, usted no va a crear un puntero a una x variable. Estás creando un puntero llamado x. AUDIENCIA: [inaudible]. LUCAS: Así que cuando digo n estrella x, estoy diciendo, hey, en la memoria, voy a conseguir una de estas tres cajas. Y yo voy a decir que eso va a ser x, que es va a ser un puntero. Y algo interesante de punteros es que nos dicen que tienen 4 bytes para una máquina de 32 bits. Y la razón de esto es porque 4 bytes son 32 bits. Y máquinas que son 64 bits en realidad tener direcciones punteros que son 64 bits de longitud. Por lo que sólo significa que el tamaño de la direcciones de la máquina es diferente. Así que hacer referencia y Desreferenciar. Hay dos operadores que ustedes deben recordar. La primera es ampersand. La segunda es la estrella. No se confunda por esa estrella y esto estrella, porque recordar que, en este caso, usted tiene n la estrella. Es como una cosa entera juntos. No hay espacio estrella n. Así que esto significa que es el tipo. Recuerde que cuando usted tiene la estrella variable, eres hablando sobre el tipo. Cuando usted acaba de estrellas y luego el nombre de la variable, significa que estás eliminación de referencias al puntero, que significa que usted está buscando en el puntero, la búsqueda de la dirección es señalando, ir a esa dirección, y mirando siempre que tienes ahí. Así que les digo a mis estudiantes que cuando se tiene estrella, usted debe pensar que es la abreviatura de los contenidos de. Así que si usted tiene un puntero y hacer indicador de la estrella, que es la contenido del puntero. Así que ir a lo que está señalando y mirar el contenido constante. Y el signo es el mismo Lo que la dirección de. Así que si tengo una variable un-- como, vamos a decir que me hice un int es igual 3-- si quiero encontrar la dirección de ese una memoria de variables, sólo puedo hacer ampersand a. Así que es la dirección de un. Tiene sentido? Así que aquí está un ejemplo. Esta falta int b y c int. Así int a es igual a 3 significa que Voy a ir a la memoria. Y voy a encontrar una ranura y poner el número 3 aquí. Y entonces int b es igual a 4. Voy a hacer lo mismo. Ir a la memoria y poner un número 4 en una de las cajas. Y int igual a 5. Encuentra otra caja y poner un número 5. Entonces, ¿qué es esta línea haciendo afuera? pa n estrella es igual a un signo. Así que primero de todo, n pa estrella. ¿Qué está haciendo? AUDIENCIA: [inaudible]. LUCAS: Sí, así que n pa estrella, primero, declara un puntero llamado pa. Y luego está la asignación del valor de que sea puntero a la dirección de una. Así ampersand a. Entonces, si lo hago pb estrella, lo que es un pb estrella? Oh, lo siento. Esto también ha desaparecido. pb estrella n. Quiero decir pc estrellas. Lo siento mucho. Es la misma cosa. Pero ahora estoy bien ar la creación de un puntero ab y luego un puntero a c. ¿Sí? AUDIENCIA: [inaudible]? LUCAS: Sí. Así que si vas a la memoria y que vaya a la caja que es el designador de pa, realmente vas a ver la dirección de un. ¿De acuerdo? ¿Sí? AUDIENCIA: [inaudible]? LUCAS: Sí, el puntero es una dirección. Nunca lo olvides. Es como el más importante parte de los punteros. Hay almacenar y dirección a alguna variable. Algo más? Alguna otra pregunta? Okay. Así Punteros y matrices. Recuerde que cuando hago int matriz de 3, Básicamente, lo que estoy haciendo es que soy, bueno de, declarando en un puntero. Así matriz es algo así como un puntero a una lugar específico en la memoria en la que asignado tres ranuras para enteros. ¿Tiene eso sentido? Así que cuando lo hago int matriz de 3, lo que estoy haciendo, básicamente, es la creación de tres ranuras en la memoria. Así que me encuentro tres ranuras de memoria. Así que si lo hago, entonces, una matriz de estrellas, básicamente significa que el contenido de la matriz, lo que significa que borro el puntero, voy a ese lugar que está señalando, y puse el número uno. Y luego, si lo hago array estrella más 1, eso es lo mismo que hacer array soportes de uno, que sólo significa que me voy a el lugar que está apuntando a. Y entonces el plus 1 marcas me muevo una posición. Así que voy a esta posición, en realidad, y poner el número dos. Y entonces, por fin, cuando lo hago gama más 2, voy a donde señalador de matriz en. Y entonces me mudo a bloques de memoria. Y entonces me puse el número tres aquí. ¿Sí? AUDIENCIA: array Así estrella es simplemente diciendo que el primer punto. Y usted puede agregar 1, sólo porque sólo estamos realmente referencia a esa primera dirección. LUCAS: Si. ¿Por qué, por ejemplo, decimos array 0, 1 campo, y la matriz 2? Que digo, ¿por qué haces 0, 1, 2, 3 en lugar de 1, 2, 3? Una de las razones es, uno, equipo programadores prefieren empezar contando desde 0. Dos es porque cuando haces matriz 0, es lo mismo que hacer array además de 0, lo que significa que voy a esa posición, y no lo hago omitir cualquier bloque de memoria. Así que no me muevo de cualquier bloque de memoria. ¿Sí? AUDIENCIA: [inaudible]? LUCAS: Así que ella está pidiendo lo que es la diferencia entre hacer esto o hacer malloc. Una de las diferencias es que int serie 3 es la creación de un matriz en la pila. Y cuando lo haga malloc, que crea en el montón. ¿Tiene eso sentido? Entonces, ¿cómo funciona malloc realidad? Entonces, ¿por qué necesitamos usar malloc? Su compilador tipo de figuras todo las variables que se declaran. Y se crea un espacio para todos de ellos en la pila. Así que todas las variables se van estar en algún lugar en la pila. Así que aquí está las variables de entorno. Así que, básicamente, el espacio para las variables en la memoria se asigna a tiempo de compilación. Así que esto significa que el equipo tiene conocer todas aquellas variables de antemano. No necesita saber qué valor usted va a poner en ellos. Pero es necesario saber cómo cantidad de memoria que necesita. Pero ahora vamos a decir que, por ejemplo, está creando una matriz o tomar una cadena que usted está tomando del usuario. Usted no sabe cuánto tiempo la cadena va a ser, por ejemplo. Así que usted no sabe exactamente cuántos bloques de memoria se asignan, ¿verdad? Así que no tiene mucho sentido para que digas puso 100 caracteres. Y entonces ¿qué pasa si el usuario escribe 150? Usted va a ser jodido. Así que, básicamente, no se puede estar seguro de cómo cantidad de memoria que necesita asignar al compilar el programa. Usted acaba de saber que el tiempo de ejecución. Así que es por eso que usted tiene el montón. Así que el montón se va a tener memoria que usted está asignando durante el duración del programa en ejecución. Así que, básicamente, cuando lo hace malloc, lo que estás haciendo es la asignación de memoria en tiempo de ejecución, lo que significa que usted es decidir justo en ese momento que deberían tener ese recuerdo. Así que eso es cuando estás asignación. ¿Tiene eso sentido? Así que recuerda, la pila tiene variables que se crean en tiempo de compilación. Y entonces el montón tiene variables que se crean sobre la marcha con malloc, por ejemplo. AUDIENCIA: [inaudible]? LUCAS: Así es GetString Llamaré a malloc. Permítanme hablar de malloc, y Voy a explicar GetString. Así malloc es la misma cosa como la asignación de memoria. Así que va a asignar memoria en el montón. Y se va a devolver un puntero a donde la memoria se asignó al. Así que cuando usted hacer-- aquí por ejemplo- indicador de la estrella n. Y entonces el puntero es igual a malloc tamaño de 10 pulgadas veces. Estoy creando un puntero. Y entonces estoy asignando ese puntero a el valor del puntero que malloc me está dando. Malloc Así que estoy pidiendo que usted puede asignar espacio para 10 números enteros. Eso es lo que está diciendo. Y malloc me devuelve una puntero a ese lugar. Tiene sentido? Okay. Y yo GetString está, básicamente, haciendo un llamar a malloc para que pueda asignar memoria en tiempo de ejecución. Recuerde siempre comprobar nula porque malloc va a devolver null si no se puede asignar memoria. Digamos que usted pide un ridículo cantidad de memoria. Su equipo no va a ser capaz de asignar tanto. Así malloc es sólo va a devolver null. Así que siempre recuerde verificar si el puntero que usted recibió de malloc es nula o no, porque, si lo es, que te pueden dereferencing ser un puntero y causando fallos secundarios. Y, por último, no se olvide su memoria libre. Malloc está creando la memoria en el montón. Y usted tiene que liberar la memoria antes de que el programa termina. OK, eso es todo para mí. Lo sentimos, Rob. Gracias. [Aplausos] LUCAS: ¿Unas últimas preguntas antes de que Rob viene? No? ¿Sí? AUDIENCIA: no vi ésta línea. ¿Ha subido todavía? LUCAS: Creo que Dave es subir pronto. DAVE: Va a ser publicado. LUCAS: Va a ser en línea. AUDIENCIA: Depende. LUCAS: Depende? Okay. ¿Sí? AUDIENCIA: [inaudible]? LUCAS: Sí, debe liberar todo el memoria que se puso en el montón. AUDIENCIA: [inaudible]? LUCAS: Sí. Cada vez que usted tiene un malloc cultura, usted debe tener una cultura libre después de dejar de usar esa variable. Así malloc y libre son siempre juntos. Sus mejores amigos. Sí. Rob? ROB: Voy a ir rápidamente. Y también el video será puesto. Tengo el micrófono en. OK, así que la semana cinco cosas. Lo primero que tenemos es la pila. Así que recuerda que sólo hay una pila cuadro por llamada a la función activa. Veremos eso en un segundo. Y también recordar lo que en realidad va en cada marco de pila van a ser las variables locales de nuestras funciones, los argumentos que se pasan a nuestro funciones, junto con un par otras cosas que realmente no tenga que preocuparse. Así que aquí está un ejemplo de programa que, aviso, principal se printfing el retorno valor de foo 4. foo es sólo va a devolver el valor de la barra de 4 coma 6. Y la barra se va a establecer algunos locales n variable igual a 4 veces 6. Y luego volver n. Así que echemos un vistazo a la pila a lo largo la iteración actual de este programa. Así que la parte inferior de nuestra pila. Recuerde que la pila crezca. Así que en la parte inferior de nuestra pila, que tener un marco de pila para las principales. Al iniciar el programa, el principal siempre va a estar en el parte inferior de nuestra pila. Y lo que está dentro de nuestra apilar marco para main? Así que, aunque no existen locales variables al principal, como he dicho antes, hemos argc y RGV ocupar espacio interior del bastidor principal pila. Así principal ahora se va a llame a la función foo. Y eso significa que foo va a obtener su propio marco de pila. Así que ahora estamos en el interior de la función foo. ¿Y qué tiene que ir en marco de pila de foo? Bueno, foo tiene un argumento n. Y n es igual a 4, ya que eso es lo que principal pasa como argumento de foo. Así que ahora foo va a llamar bar. ¿Qué es la barra va a tener en el interior de su "marco de pila? Tiene x igual a 4 y igual a seis. Eso no es todo lo que vamos a tener en el marco de pila porque la barra también tiene una variable local n. Y n que vamos a establecer igual a 24. Así que ahora la barra va a regresar n. Así barra 24 está volviendo a el foo marco de pila. Y debido bar regresa ahora, que significa que estamos haciendo estallar el marco de pila para la barra fuera de la pila. Así que toda la memoria que había sido bar usando ahora es de la pila. Ahora, foo también va para volver a 24 principal. Así que ahora que foo está regresando, la memoria foo que estaba usando en su ' marco de pila también se ha ido. Y ahora, la principal va a llamar a printf. Así printf es sólo otra función. Cuando llamamos a printf, que va a ser otro marco de pila para el printf llamada a la función. ¿Qué estamos pasando printf? Eso es lo que va a ir en su marco de pila. Por lo menos, estamos pasando que ciento i barra invertida n y el argumento 24. Podría tener más en es marco de pila si printf pasa a ser el uso de algunos variables locales. No sabemos. Pero todo lo que pasa en la printf apilar marco. Se va a ejecutar el printf. Entonces printf que está hecho. Volverá. Por último, la principal está hecho. Principal volverá. Y entonces nuestro programa está hecho. ¿Sí? AUDIENCIA: ¿Estás saliendo con [inaudible] argumentos [inaudible] parámetros? ROB: Así que hay una sutil diferencia entre los argumentos y parámetros. Y realmente, en jerga común, la gente tiende a sólo mezclarlos todo el tiempo. Pero parámetros son los formales nombre de las cosas. Así argc y argv son el parámetros a principal. Los argumentos son lo que realmente Aconteció en que esos parámetros. Así que cuando me llame foo de 4, 4 es el argumento que estoy pasando. Y el parámetro n, en el interior de foo, toma el valor 4 desde 4 fue el argumento. AUDIENCIA: [inaudible]? ROB: n es una variable local a la barra. n sigue siendo local para foo, pero es un parámetro a foo. No es una variable local. ¿Sí? AUDIENCIA: [inaudible]? ROB: bar foo es simplemente llamar y devolver cualquier retornos de barras. AUDIENCIA: [inaudible]? ROB: Sí, sólo para ver múltiples marcos de pila. ¿Sí? AUDIENCIA: ¿Por qué se llama foo antes printf? ROB: ¿Por qué se llama foo antes printf? Así que podría tener, en cambio, hacer algo como int x es igual a foo de 4 y luego impresa x. Pero en cambio, he combinado la función poner en el argumento de printf. Pero note que no podemos realmente ejecutar la llamada a printf hasta que averiguar lo foo de 4 es. Así que vamos a evaluar esto. Y sólo una vez que se han hecho van regresar y evaluar esto. ¿Sí? AUDIENCIA: Dado que tanto la barra [inaudible] valor, ¿por qué nosotros no tiene [inaudible]? ROB: Ellos totalmente deben ser int. Eso no fue capturado en múltiples pasadas. Así debe ser int bar y int foo ya que ambos de los están regresando enteros. Vacío es sólo si no van para devolver valores reales. ¿Sí? AUDIENCIA: Si tuvieras una línea por encima el retorno, [inaudible]? ROB: Una línea por encima de la rentabilidad? AUDIENCIA: Si. Al igual que si lo hicieras printf y [inaudible], tendría que imprimir dos veces? ROB: Así que dentro de foo? Si tuviéramos un printf aquí? AUDIENCIA: Si. ROB: Así que si teníamos derecho printf aquí, sería imprimir una vez. Desde que estamos llamando foo vez derecho aquí, a continuación, vamos a golpear el printf. Entonces vamos a llamar bar. Y entonces foo volverán. Y eso es todo. Sólo alguna vez encontramos el printf vez. ¿Sí? AUDIENCIA: [inaudible] printf llamar foo, porque somos los primeros llamar a printf y luego estamos pasando los argumentos. ROB: Así que en teoría, no es printf llamar foo? Así no. Sólo el fin de que c va a ejecutar estas cosas es, antes de que podamos llamar a una función, todos los argumentos a la función que ser completamente evaluados. Así es esta completamente evaluada? Sí, es sólo una cadena. Es sólo un valor. Entonces tenemos que completamente evaluar esto. Una vez hecho esto, ahora todos se evalúan sus argumentos. Y ahora podemos hacer que el llamar a printf. ¿Sí? AUDIENCIA: Una pregunta. Si usted tiene una función void, debe usted tiene retorno y coma? ROB: No hacer un punto y coma retorno si tiene una función void. Okay. Así que ahora algunas cosas montón. Así montón es cómo vamos a tratar con la gestión de memoria dinámica. Y esto contrasta directamente con la pila que llamaríamos automática la gestión de memoria. Así que en la pila, nunca se tiene para hacer frente a cómo las variables locales están siendo empujado y hecho estallar fuera de todo estos marcos de pila y todas esas cosas. Usted no tiene que preocuparse por ello. Es automático. Así que el montón es manual. Y la [inaudible] proviene de estas funciones malloc y libre. Así que aquí está otro programa. Todo lo que estamos haciendo es mallocing un entero. Estamos almacenarlo en estrella x. Por supuesto, tenemos que comprobar a ver si x es nulo. Entonces vamos a lo que acaba de establecer x está apuntando a un 50. Imprima lo que x está apuntando a, print x, y luego libre de x. Entonces, ¿cómo es esto en realidad va a ver si nos fijamos en nuestra pila y el montón? Así que vamos a empezar de nuevo. La parte inferior de nuestra pila como antes. Recuerda que te uséis directamente se opone a la pila? Así que vamos a tener la la parte superior de nuestro acervo allí. Así que la parte inferior de nuestra pila, tenemos nuestro marco de pila para las principales. Tiene el espacio para argc, argv, y nos ahora tenemos una variable local x, que es un int estrellas. Así que vamos a recorrer a través de este programa. Lo primero que tenemos es una llamada a malloc. Así que estamos haciendo una llamada a malloc. Malloc es una función. Se va a conseguir un marco de pila. ¿Qué estamos pasando a malloc? Eso va a ir dentro de del marco de pila. Estamos pasando de tamaño n, que es 4. Así que se pasa a malloc. ¿Qué hace malloc? Nos agarra un poco de espacio en el montón. Así que vamos a ir a la pila. Y vamos a tomar 4 bytes de la pila. Así que vamos a dar que una dirección arbitraria. 0x123 Sólo fingir que es un dirección que está en el heap. Entonces, ¿qué es en realidad dentro de ese región de memoria en la dirección Ox123? Garbage. Así que no hemos guardado nada en ella. Así que por lo que sabemos, podría ser cualquier cosa. Usted no debe asumir que es cero. Es más probable que no es cero. Así que ahora regresa malloc. Y ¿qué hacemos cuando se restablezca el malloc? Nos propusimos lo que devuelve. Fijamos x igual a lo que que está regresando. Así que ¿qué es lo regresaba? Está regresando 0x123 ya que es el dirección del bloque de memoria que se acaba de ser asignado en el montón. Así que volver 0x123 x ahora va a ser establecido igual a 0x123 que, ilustrado, que con frecuencia dibujamos como X que tenga un real flecha apuntando a ese bloque. Pero x es simplemente almacenando esa dirección. Así que ahora tenemos que comprobar si x es nulo. No es nulo. Pretendemos que esa malloc sucedió. Así que ahora estrella de x es igual a 50. Así estrella recuerda que significa ir a esa dirección. Así 0x123 Vamos a ir a esa dirección. Así que eso nos lleva hasta allí. ¿Qué estamos haciendo en esa dirección? Estamos almacenando 50. Así que después de esta línea, que es lo que las cosas van a ser similar. Así que ahora que ya no es basura allí. Ahora sabemos que el 50 es en ese en particular porque la dirección nos pusimos a ello. ¿De acuerdo? Así que ahora vamos a imprimir f. Así que primero vamos a imprimir estrella x. Entonces, ¿qué es la estrella x? Una vez más, la estrella x significa ir a la cosa que x está apuntando. Así que x es el almacenamiento de 0x123 Ir a eso. Recibimos 50. Así que imprimir f. Y eso significa que va a imprimir 50. Y luego que devuelve. Y luego tenemos el segundo printf. Ahora estamos por ciento p. Si no lo has visto, eso es cómo se imprime un puntero. Así que tenemos por ciento i, ciento f, y todos los que ya. Así ciento p, imprimir un puntero. Así que x es un puntero. Así que si vamos a imprimir x sí mismo, estamos imprimiendo lo que es en realidad dentro x, que es 0x123 Así que la primera print f va a imprimir 50. La segunda impresión f va imprimir 0x123 Sí? AUDIENCIA: ¿Utiliza ciento x para imprimir un puntero? ROB: Así que usas ciento x para imprimir un puntero? Así que se puede, pero por ciento x es justo, en general, para como si tiene alguna entero y que desea imprimir como un hexadecimal. Así es como se hace eso. Considerando que, por ciento d haría imprimir como decimal. Ahí es donde obtenemos ciento d. i es simplemente entero. ciento p es específicamente para los punteros. Así que x es un puntero. Queremos utilizar el porcentaje p. Pero por ciento x podría funcionar. ¿Sí? AUDIENCIA: [inaudible]? ROB: Si. Al menos para este call-- así que no incluirlo aquí. Pero estos dos argumentos son necesariamente dentro de este marco de pila junto con las variables locales printf pasa a estar usando. Y a continuación, la siguiente llamada a printf ahora dentro del marco de pila es printf ciento p barra invertida n y cualquiera que sea el valor de x es, que es 0x123. ¿Sí? AUDIENCIA: [inaudible]? ROB: Se va a imprimir algo que se parece a esto. AUDIENCIA: [inaudible]. ROB: ¿Así que la imprime en formato electrónico. Se parece a una dirección. ¿Sí? AUDIENCIA: [inaudible]? ROB: ¿Por qué es qué? AUDIENCIA: [inaudible]? ROB: ¿Por qué es este puntero de 4 bytes? Así que hay un montón de 0 de delante de esta. Así que es realmente 0x0000000123. En un sistema de 64 bits, no habría un montón de más ceros. ¿Sí? AUDIENCIA: [inaudible]. ROB: Así que el primer printf va a print-- AUDIENCIA: [inaudible]. ROB: Sí, se va a imprimir lo que x está señalando. Star dice lo que es este lo que apunta a. N.. Así que ¿qué es lo que apunta? 50. N.. Eso es lo que vamos a imprimir. Considerando que, en el siguiente, estamos simplemente imprimir x sí mismo. ¿Qué hay dentro de la f? 0x123. Okay. Y entonces, por fin, tenemos el libre. ¿Qué estamos pasando a liberar? Estamos pasando x. Ese tiempo realmente exhibí en el marco de pila. Así que estamos pasando el valor 0x123 para liberar. Así que ahora gratis sabe, está bien, Tengo que ir hasta el montón y libre que la memoria. Ya no está usando lo que es en la dirección 0x123. Tan libre va a liberar que del montón. Ahora nuestra pila está vacía otra vez. No tenemos pérdidas de memoria. Ahora libre volverá. Observe que x es aún 0x123. Pero eso no es ahora de memoria válida. Ya no debemos eliminar la referencia de x. ¿Sí? AUDIENCIA: Es volver 0 redundante? ROB: ¿Es returen 0 redundante? Sí. Acabamos de poner que hay porque tenemos un retorno de uno de aire. Así es como, sí, vamos a incluir el retorno 0. ¿Sí? AUDIENCIA: [inaudible]? ROB: Así que después de x gratis, ¿qué ocurre si tratamos de eliminar la referencia al puntero? Es posible que nada salga mal. Es posible que todavía nos conseguimos 50. Es posible, también, que esa memoria es que ahora se utiliza para otra cosa. Así que es un comportamiento indefinido. Y indefinido significa nada puede suceder. ¿Sí? AUDIENCIA: [inaudible]? ROB: No, por lo que si usted asigna x a otra cosa. Así que si aquí dijimos x es igual a algo malloc else-- Tamaño malloc event-- entonces que bloque original de la memoria no se libera. Y hemos perdido oficialmente. Eso es una pérdida de memoria. Hemos perdido todas las referencias a ese bloque de memoria. Así que no hay manera de que jamás podamos liberarla. OK, así que luego regrese 0 significa hecho. Muy bien, así que el desbordamiento de pila. ¿Cuál es la idea aquí? Así que recuerda, montón está bajando. Pila está subiendo. Así que este fue el ejemplo de la conferencia, Creo que, en su principal sólo va a llamar a esta función foo, que va llamarse recursivamente una y otra vez. Así se apilan las tramas se van a trabajar exactamente de la misma. Así que vamos a empezar con la principal como el marco de pila inferior. Luego principal va a llamar a foo, que se va a conseguir un marco de pila. Entonces foo va a llamar foo de nuevo, que se va a poner otro marco de pila. Y luego otra vez, y otra vez, y otra vez, y otra vez hasta que, finalmente, se corre en el montón. Así que esta es la forma en que obtenemos un desbordamiento de pila. Y en este punto, usted SEG culpa. O usted realmente seg mancha delante este punto pero sí. AUDIENCIA: ¿Es un volcado del núcleo del mismo que falla seg? ROB: Así que usted verá la segmentación núcleo falla dejó. Usted obtiene un volcado de memoria cuando usted SEG culpa. Y es como un volcado de toda la contenido de la memoria actual, de modo que se puede tratar de identificar por qué SEG criticado. ¿Sí? AUDIENCIA: [inaudible]? ROB: Así que un medio de fallo de segmentación hay un desbordamiento de pila. Así que no necesariamente. Un fallo de segmentación significa que eres tocar la memoria de una manera usted no debe ser. Así que una manera de que eso ocurra es, cuando usted desbordamiento de pila, empezamos tocando memoria de una manera que no debemos ser. ¿Sí? AUDIENCIA: [inaudible]? ROB: Así que dentro de un bucle infinito. Al igual, esto es como una infinita recursiva bucle y así tenemos otra pila enmarcar cada vez. Pero justo en el interior de un habitual infinito mientras uno-- bueno, vamos ni siquiera imprimir F-- hacer algo. Lo que sea. No vamos a estar recibiendo otro marco de pila. Sólo vamos a mantener looping sobre esta única instrucción. La pila no está creciendo. Es el hecho de que cada recursiva llamada nos está dando un marco de pila. Es por eso que tenemos un desbordamiento de pila. ¿Sí? AUDIENCIA: Así que si usted dice que obtener el while y luego [inaudible]? ROB: Así que si dentro del bucle while hubo un printf, a pesar de ello culpa no seg. Yo simplemente no quiero confundir las cosas. Sería bucle. Obtendría una sola pila enmarcar para el printf. Entonces printf regresaría. Entonces será bucle de nuevo. Obtendría una sola pila enmarcar para el printf. Sería volver. Marco de pila individual. Así que usted no está consiguiendo este infinito apilando marcos de pila. AUDIENCIA: [inaudible]? ROB: Si. Así que este desbordamiento de pila ocurre porque ninguno de ellos llamadas a foo están regresando. Así que si volvemos, entonces lo haríamos empezar a perder los marcos de pila. Y entonces no tendríamos desbordamiento de pila. Y es por eso que usted necesita un caso base para sus funciones personales. ¿Sí? AUDIENCIA: ¿Es el tamaño potencial y la apilar para el montón de la misma para todos los programas? ROB: Aproximadamente. ¿Es el tamaño potencial de la pila y el montón de la misma para todos los programas? Aproximadamente. Hay algo de la aleatorización hasta donde comienza la pila y donde comienza el montón. Si le sucede que tiene una gran cantidad de variables y cosas globales, es posible que quitar un poco de espacio para su montón. En un sistema de 64 bits, que prácticamente tener memoria infinita. Hay tantas cosas. Entre 32 bits y 64 bits, que es una diferencia significativa. Usted va a conseguir mucho más apilar y espacio de almacenamiento dinámico en una de 64 bits sistema porque no sólo más Las direcciones que se pueden utilizar. Pero en un sistema individual, lo hará ser más o menos la misma cantidad de pila y espacio de almacenamiento dinámico. Bien. Así que lo último es la compilación. Así que usted debe saber este proceso. Hay cuatro grandes pasos. Así que el primero debe ser fácil de recordar. Pre-procesamiento. Cuenta con el prefijo pre en el mismo. Así que se trata antes de todo lo demás. La cosa a recordar es el hash. Así define hachís y hachís incluye en todos aquellos. Esos son todos los pre-procesador directivas. Estas son las cosas que los pre-procesador se encarga de. Entonces, ¿qué hace un pre-procesador? Es una cosa muy tonta. Todo lo que es capaz de hacer son todos ellos copia y de corte, y pegar operaciones. Así de hash estándar incluye dot i0 h. ¿Qué es eso que hace? Se quitó la norma i0 punto h presentar y pegándolo en la parte superior dondequiera que dice hachís incluye estándar dot h i0. Y cualquier hash de definir que hemos ve, lo que se que hacer? Su copiando el valor que el hash definido se define como y pegar que donde quiera que esté utilizando el valor. Así que el preprocesador simplemente hace realmente operaciones basadas en texto sencillo. No hace nada inteligente. Así que todo lo demás es más complicado. Así que ahora que es preprocesador hecho, en realidad compilamos. Así que, ¿qué significa la compilación? Estamos pasando de código c al código ensamblador. ¿Sí? AUDIENCIA: [inaudible]? ROB: Sí, cogimos eso. Así que la compilación. Vamos de c para el montaje. Así que esto es un cambio de idioma actual. Compilación de sí mismo significa pasar de un lenguaje de alto nivel para un lenguaje de nivel inferior. Y C es un lenguaje de alto nivel en comparación con el montaje. ¿Cuál es el montaje? Sus instrucciones, que son bastante mucho, hecha para su CPU. Pero el ordenador sigue No entender el montaje. Sólo se entiende unos y ceros. Así que el siguiente paso es el montaje, que nos lleva de estas instrucciones que su CPU entiende y realidad los traduce, a los unos y ceros. Así C para montaje en binario. Pero yo no tengo un ejecutable todavía. Así que piensa en la biblioteca CS50. Nosotros le proporcionamos un binario para esta biblioteca CS50, que tiene GetString y getInt y todo eso. Pero el CS50 library-- y de itself-- no es ejecutable. No tiene una función principal. Es sólo un montón de binario que se puede utilizar. Así que la vinculación es cómo reunir a todos de estos diferentes archivos binarios en un archivo ejecutable real. Uno que puede escribir dot recortar un punto fuera. Así que esto es como el archivo que escribió, - sea cual sea su programa es-- Ceaser punto c. Pero ahora que ha sido compilado a binario. Así que o punto Ceaser. Y esta es nuestra CS50 bibliotecas binario. Y están siendo combinados en un solo ejecutable. ¿Sí? AUDIENCIA: [inaudible]? ROB: Así que primero incluye, recuerda, el hash incluir es en realidad un etapa de pre-procesador. Pero eso es aparte. Si usted no está utilizando ninguna función que están fuera de su archivo solo entonces, no, no es necesario vincular nada ya que tienes todo. Dicho esto, printf está siendo vinculado en. Si alguna vez utiliza printf, eso es algo que necesita ser vinculado en porque usted no escribió eso. Y, de hecho, printf es automáticamente vinculada en. Usted sabe cómo en la línea de comandos o cuando usted escribiría make, verlo tiene tablero l CS50, que tiene enlace en la biblioteca CS50? Printf, y cosas por el estilo, se va estar vinculado en forma automática. ¿Alguna otra pregunta sobre algo? AUDIENCIA: [inaudible]? ROB: Vinculación? Tenemos un montón de diferentes archivos binarios. Este es el ejemplo canónico que utilizamos es la biblioteca CS50. Hemos recopilado y que le ha asignado el binario para esta biblioteca CS50. Desea utilizar GetString en su programa. Así que ve y utiliza GetString. Pero sin mi código binario para GetString, al compilar el código abajo, usted no pueda ejecutar su programa porque GetString cuerdas es aún no completamente definido. Es sólo cuando se vincula en mi binario que contiene GetString que ahora, todo derecho, que pueda realmente ejecutar GetString. Mi expediente está completo. Y puedo ejecutar este. ¿Sí? AUDIENCIA: Lo que convertir vinculando el binario ejecutable a? Así que incluso si usted no tiene otra bibliotecas, no seguiría siendo necesario traducir la [inaudible]? ROB: Así que un ejecutable todavía está en binario. Es que la combinación de un conjunto montón de binarios. AUDIENCIA: Muchas gracias. ROB: No hay problema. Alguna otra pregunta? De lo contrario, estamos listos. Bien. Gracias. [Aplausos] AUDIENCIA: Gracias. ROB: Si.