[Powered by Google Translate] Vamos a hablar acerca de las matrices. Entonces, ¿por qué alguna vez queremos utilizar matrices? Bueno, digamos que usted tiene un programa que necesita para almacenar 5 identificaciones estudiantiles. Podría parecer razonable tener 5 variables independientes. Por razones que veremos en un momento, vamos a empezar a contar desde 0. Las variables que tendremos será id0 int, int id1, y así sucesivamente. Cualquier lógica que desea realizar en una identificación de estudiante tendrá que ser copiado y pegado para cada una de estas identificaciones estudiantiles. Si queremos comprobar que los alumnos pasan a ser en CS50, lo primero que tendrá que comprobar si id0 representa al estudiante en el curso. Luego de hacer lo mismo para el estudiante que viene, tendrá que copiar y pegar el código para id0 y reemplazar todas las apariciones de id0 con id1 y así sucesivamente para id2, 3, y 4. Tan pronto como se oye que tenemos que copiar y pegar, usted debe empezar a pensar que hay una solución mejor. Ahora lo que si te das cuenta de que no es necesario 5 identificaciones estudiantiles sino 7? Tienes que ir nuevamente dentro de su código fuente y añadir en un id5, un ID6, y copiar y pegar la lógica para comprobar si los ID de pertenecer a la clase para estos 2 nuevos ID. No hay nada conectar todos estos identificadores de conjunto, y así que no hay forma de pedir el programa para hacer esto para los números del 0 al 6. Bueno, ahora te das cuenta de que tiene 100 identificaciones estudiantiles. Está comenzando a parecer menos que ideal a tener que declarar por separado cada una de estas identificaciones, y copiar y pegar cualquier lógica para los nuevos ID. Pero a lo mejor estamos determinados, y nosotros lo hacemos por los 100 alumnos. Pero lo que si usted no sabe cuántos estudiantes hay en realidad? Hay sólo algunos estudiantes n y su programa tiene que pedir al usuario lo que n es. Uh oh. Esto no va a funcionar muy bien. El programa sólo funciona para un número constante de los estudiantes. Resolver todos estos problemas es la belleza de las matrices. Entonces, ¿qué es una matriz? En algunos lenguajes de programación un tipo de matriz puede ser capaz de hacer un poco más, pero aquí nos centraremos en la matriz básica de la estructura de datos del mismo modo que lo verá en C. Una matriz es simplemente un gran bloque de memoria. Eso es todo. Cuando decimos que tenemos un arreglo de 10 enteros, eso sólo significa que tenemos algo de manzana de memoria que es lo suficientemente grande como para contener 10 números enteros separados. Asumiendo que un número entero de 4 bytes, lo que significa que una matriz de 10 enteros es un bloque continuo de 40 bytes en la memoria. Incluso cuando se utilizan matrices multidimensionales, que no vamos a ir para aquí, todavía es sólo un gran bloque de memoria. La notación multidimensional es sólo una conveniencia. Si usted tiene un 3 por 3 matriz multidimensional de enteros, entonces su programa realmente sólo tratar esto como un gran bloque de 36 bytes. El número total de números enteros es 3 veces 3, y cada entero ocupa 4 bytes. Echemos un vistazo a un ejemplo básico. Podemos ver aquí dos maneras diferentes de matrices declaran. Vamos a tener que comentar uno de ellos por el programa para compilar ya que declaramos x dos veces. Vamos a echar un vistazo a algunas de las diferencias entre estos dos tipos de declaraciones en un poco. Estas dos líneas de declarar una matriz de tamaño n, donde hemos # define N como 10. Nos podría fácilmente haber pedido al usuario un número entero positivo y utiliza ese número entero como una serie de elementos en nuestra matriz. Al igual que el ejemplo de estudiante antes, esto es algo así como declarar totalmente independiente 10 Las variables imaginarias; x0, x1, x2, y así sucesivamente hasta xN-1. Haciendo caso omiso de las líneas en las que se declara la matriz, observe los corchetes intacto dentro de la de los bucles. Cuando escribimos algo como x [3], que sólo voy a leer como soporte x 3, usted puede pensar que es como preguntar por el imaginario x3. Nótese que con una matriz de tamaño N, esto significa que el número dentro de los corchetes, que llamaremos el índice, puede ser cualquier cosa, desde 0 a N-1, que es un total de índices n. Pensar en cómo funciona realmente recordar que la matriz es un gran bloque de memoria. Suponiendo que un entero es de 4 bytes, el arsenal entero x es un bloque de 40 bytes de memoria. Así x0 se refiere a los primeros 4 bytes del bloque. X [1] se refiere a los próximos 4 bytes y así sucesivamente. Esto significa que el inicio de x es todo el programa nunca necesita seguir la pista. Si desea utilizar x [400], el programa sabe que esto es equivalente a sólo 1.600 bytes después del inicio de x. ¿De dónde obtenemos 1.600 bytes de? Está a sólo 400 veces 4 bytes por entero. Antes de continuar, es muy importante tener en cuenta que en C no hay control del índice que se utiliza en la matriz. Nuestro gran bloque está a sólo 10 enteros largos, pero nada va a gritar a nosotros si escribimos x [20] o incluso x [-5]. El índice no tiene ni siquiera para ser un número. Puede ser cualquier expresión arbitraria. En el programa que utilice la variable i de la bucle para índice en la matriz. Este es un patrón muy común, de enlace de i = 0 a la longitud de la matriz, i y, a continuación, utilizando como índice de la matriz. De esta manera, efectivamente lazo sobre toda la matriz, y se pueden asignar a cada punto de la matriz o utilizarlo para algún cálculo. En el primer bucle, i comienza en 0, y por lo que cederá al punto 0 en la matriz, el valor 0 veces 2. Entonces yo incrementos, y le asignamos el primer lugar en la matriz el valor 1 veces 2. Entonces me incrementos de nuevo y así sucesivamente hasta que se le asigna a la posición N-1 en la matriz el valor N-1 veces 2. Para ello hemos creado una matriz con los 10 primeros números pares. Tal vez iguala hubiera sido un poco mejor nombre para la variable de x, pero que le hubiera dado las cosas. El segundo bucle for a continuación, sólo imprime los valores que ya hemos almacenado dentro de la matriz. Vamos a tratar de ejecutar el programa con ambos tipos de declaraciones de arrays y echar un vistazo a la salida del programa. Por lo que podemos ver, el programa se comporta de la misma manera para ambos tipos de declaraciones. También vamos a echar un vistazo a lo que sucede si cambiamos el primer bucle de no parar en N sino más bien decir 10.000. Mucho más allá del final de la matriz. Oops. Tal vez usted ha visto esto antes. Un fallo de segmentación significa que el programa se ha bloqueado. Usted comenzará a ver estos cuando te toque las áreas de memoria que no se debe tocar. Aquí estamos tocando 10.000 plazas más allá del comienzo de x, que, evidentemente, es un lugar en la memoria que no debe tocar. Así que la mayoría de nosotros probablemente no por casualidad pondría 10.000 en lugar de N, pero lo que si podemos hacer algo más sutil, como dicen escritura menor o igual a N en la condición de bucle para en oposición a menos de N. Recuerde que una matriz sólo tiene índices de 0 a N-1, lo que significa que el índice de N está más allá del final de la matriz. El programa no puede fallar en este caso, pero aún así es un error. De hecho, este error es tan común que tiene su propio nombre, un apagado por un error. Eso es para lo básico. ¿Cuáles son las principales diferencias entre los dos tipos de declaraciones de arrays? Una diferencia es que el gran bloque de memoria va. En la primera declaración, que voy a llamar al soporte tipo-matriz, aunque esto no es en absoluto un nombre convencional, el tope de la pila. Mientras que en el segundo, lo que llamaré el tipo de puntero-array, irá en el montón. Esto significa que cuando se devuelve la función, la matriz de soporte automáticamente se cancela la asignación de mientras que a medida que explicitily debe llamar libre en el array puntero o de lo contrario usted tiene una pérdida de memoria. Además, la matriz de soporte no es en realidad una variable. Esto es importante. Es sólo un símbolo. Usted puede pensar en él como una constante que el compilador ha elegido para usted. Esto significa que no podemos hacer algo como x + + con el tipo de soporte, aunque esto es perfectamente válido con el tipo de puntero. El tipo de puntero es una variable. Para el tipo de puntero, tenemos 2 bloques separados de la memoria. La variable X en sí se almacena en la pila y es sólo un puntero, pero el gran bloque de memoria se almacena en el montón. La variable x en la pila sólo almacena la dirección del gran bloque de memoria en el montón. Una implicación de esto es con el tamaño del operador. Si usted solicita el tamaño de la matriz soporte, que le dará el tamaño del bloque grande de memoria, algo así como 40 bytes, pero si usted pide el tamaño del tipo de puntero de matriz, se le dará el tamaño de la variable x en sí, que el aparato es probablemente sólo 4 bytes. Utilizando el tipo de puntero de matriz, es imposible pedir directamente para el tamaño del bloque grande de memoria. Esto no es generalmente mucho más de una restricción ya que muy rara vez se desea que el tamaño del gran bloque de memoria, y por lo general se puede calcular si la necesitamos. Por último, la matriz de soporte que pasa que nos proporcione un acceso directo para la inicialización de una matriz. Vamos a ver cómo podemos escribir los 10 primeros enteros pares utilizando la inicialización de acceso directo. Con la matriz de punteros, no hay una manera de hacer un acceso directo de esta manera. Esto es sólo una introducción a lo que puede hacer con arrays. Se presentan en casi todos los programas que usted escribe. Esperemos que ahora se puede ver una forma mejor de hacer el estudiante ejemplo los ID desde el inicio del vídeo. Mi nombre es Rob Bowden, y esto es CS50.