Veamos el siguiente ejemplo:
Estas 3 matrices 1D se pueden representar como una matriz 2D de la siguiente manera:
Veamos otro ejemplo:
Estas 3 matrices 1D no pueden representarse como una matriz 2D porque los tamaños de las matrices son diferentes.
Declaración de matriz 2D
tipo de datos nombre de matriz[FILA] [COLUMNA]
int a [2] [3];
Usando el código C anterior, podemos declarar un entero formación, a de tamaño 2*3 (2 filas y 3 columnas).
char b [3] [2];
Usando el código C anterior, podemos declarar un personaje formación, b de tamaño 2*3 (3 filas y 2 columnas).
Inicialización de la matriz 2D
Podemos inicializar durante la declaración de las siguientes maneras:
Tenga en cuenta que en 2 y 4 no hemos mencionado el 1calle subíndice. El compilador C calcula automáticamente el número de filas del número de elementos. Pero el 2Dakota del Norte Se debe especificar el subíndice. Las siguientes inicializaciones no son válidas:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | //Ejemplo 1.C #incluir #Define la fila 3 #Define Col 2 int main () int i, j; int a [fila] [col] = 1,2, 3,4, 5,6 ; printf ("Los elementos sabios de la fila de la matriz A son: \ n"); para (i = 0; i printf ("fila %d:", i); para (j = 0; j printf (" %d", a [i] [j]); printf ("\ n"); printf ("\ n \ ncolumn elementos sabios de la matriz a son: \ n"); para (i = 0; i printf ("columna %d:", i); para (j = 0; j printf (" %d", a [j] [i]); printf ("\ n"); regresar 0; |
En el ejemplo1.c, hemos declarado una matriz entera del tamaño 3*2 e inicializados. Para acceder a elementos de matriz, usamos dos para bucle.
Para acceder a la fila, el bucle exterior es para filas y el bucle interno es para columnas.
Para acceder a la columna, el bucle exterior es para columnas, y el bucle interno es para filas.
Tenga en cuenta que cuando declaramos una matriz 2D, usamos un [2] [3], que significa 2 filas y 3 columnas. La indexación de matriz comienza desde 0. Para acceder a los 2Dakota del Norte fila y 3rd columna, tenemos que usar la notación a [1] [2].
Mapeo de memoria de una matriz 2D
La vista lógica de una matriz A [3] [2] puede ser el siguiente:
La memoria de la computadora es una secuencia 1D de bytes. En el lenguaje C, una tienda de matriz 2D en la memoria en orden de la fila. Algunos otros lenguajes de programación (E.gramo., Fortran), se almacena en Orden de columna mayor en la memoria.
Aritmética de puntero de una matriz 2D
Para comprender la aritmética del puntero de la matriz 2d, primero, eche un vistazo a la matriz 1D.
Considere una matriz 1D:
En una matriz 1D, a es una constante, y su valor es la dirección del 0th Ubicación de la matriz A [5]. Valor de A+1 es la dirección del 1calle Ubicación de la matriz A [5]. A+I es la dirección del ith Ubicación de la matriz.
Si nos incrementamos a Para 1, se incrementa por el tamaño del tipo de datos.
A [1] es equivalente a *(A+1)
A [2] es equivalente a *(A+2)
ai] es equivalente a *(a+i)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 20 21 | // Ejemplo2.C #incluir #Define la fila 3 #Define Col 2 int main () int a [5] = 10,20,30,40,50; printf ("sizeof (int): %ld \ n \ n", sizeof (int)); printf ("a: %p \ n", a); printf ("a+1: %p \ n", a+1); printf ("a+2: %p \ n \ n", a+2); printf ("a [1]: %d, *(a+1): %d \ n", a [1], *(a+1)); printf ("a [2]: %d, *(a+2): %d \ n", a [1], *(a+1)); printf ("a [3]: %d, *(a+3): %d \ n", a [1], *(a+1)); regresar 0; |
En el ejemplo2.c, la dirección de memoria se muestra en hexadecimal. La diferencia entre A y A+1 es 4, que es el tamaño de un entero en bytes.
Ahora, considere una matriz 2D:
b es un puntero de tipo: int [] [4] o int (*) [4]
int [] [4] es una fila de 4 enteros. Si incrementamos B en 1, se incrementa por el tamaño de la fila.
b es la dirección del 0th fila.
B+1 es la dirección del 1calle fila.
b+yo es la dirección de ith fila.
El tamaño de una fila es: (Número de columna * sizeof (type de datos)) bytes
Tamaño de una fila de una matriz entera b [3] [4] es: 4 * sizeof (int) = 4 * 4 = 16 bytes
Se puede ver una fila de una matriz 2D como una matriz 1D. b es la dirección del 0th fila. Entonces, obtenemos lo siguiente
Dirección de b [i] [j]: b + sizeof (tipo de datos) * (número de columna * i + j)
Considere una matriz 2D: int b [3] [4]
La dirección de B [2] [1] es : b + sizeof (int) * (4 * 2 + 1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | // Ejemplo3.C #incluir #Define la fila 3 #Define Col 4 int main () int i, j; int b [fila] [col] = 10,20,30,40, 50,60,70,80, 90,100,110,120 ; printf ("sizeof (int): %ld \ n", sizeof (int)); printf ("tamaño de una fila: %ld \ n", col*sizeof (int)); printf ("b: %p \ n", b); printf ("b+1: %p \ n", b+1); printf ("b+2: %p \ n", b+2); printf ("*b: %p \ n",*b); printf ("*b+1: %p \ n",*b+1); printf ("*b+2: %p \ n",*b+2); printf ("b [0] [0]: %d ** b: %d \ n", b [0] [0], ** b); printf ("b [0] [1]: %d*(*b+1): %d \ n", b [0] [1],*(*b+1)); printf ("b [0] [2]: %d*(*b+2): %d \ n", b [0] [2],*(*b+2)); printf ("b [1] [0]: %d*(*(b+1)): %d \ n", b [1] [0],*(*(b+1))); printf ("b [1] [1]: %d*(*(b+1) +1): %d \ n", b [1] [1],*(*(b+1) +1) ); regresar 0; |
En el ejemplo3.c, hemos visto que el tamaño de una fila es de 16 en notación decimal. La diferencia entre b+1 yb es 10 en hexadecimal. 10 en hexadecimal es equivalente a 16 en decimal.
Conclusión
Entonces, en este artículo, hemos aprendido sobre
Ahora podemos usar una matriz 2D en nuestro programa C sin ninguna duda,
Referencias
El crédito por algunas ideas en este trabajo se inspiró en el curso, consejos y matrices 2-D, por Palash Dey Departamento de Informática y Engg. Instituto Indio de Tecnología Kharagpur