Las siguientes son diferentes formas de crear una array 2D en el montón (o asignar dinámicamente una array 2D).
En los siguientes ejemplos, hemos considerado ‘ r ‘ como número de filas, ‘ c ‘ como número de columnas y creamos una array 2D con r = 3, c = 4 y los siguientes valores
1 2 3 4 5 6 7 8 9 10 11 12
1) Usar un solo puntero y una array 1D con aritmética de punteros:
una forma simple es asignar un bloque de memoria de tamaño r*c y acceder a sus elementos usando aritmética de punteros simple.
C
#include <stdio.h> #include <stdlib.h> int main(void) { int r = 3, c = 4; int* ptr = malloc((r * c) * sizeof(int)); /* Putting 1 to 12 in the 1D array in a sequence */ for (int i = 0; i < r * c; i++) ptr[i] = i + 1; /* Accessing the array values as if it was a 2D array */ for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) printf("%d ", ptr[i * c + j]); printf("\n"); } free(ptr); return 0; }
Producción:
1 2 3 4 5 6 7 8 9 10 11 12
2) Usando una array de punteros
Podemos crear una array de punteros de tamaño r. Tenga en cuenta que desde C99, el lenguaje C permite arrays de tamaño variable. Después de crear una array de punteros, podemos asignar memoria dinámicamente para cada fila.
C
#include <stdio.h> #include <stdlib.h> int main() { int r = 3, c = 4, i, j, count; int* arr[r]; for (i = 0; i < r; i++) arr[i] = (int*)malloc(c * sizeof(int)); // Note that arr[i][j] is same as *(*(arr+i)+j) count = 0; for (i = 0; i < r; i++) for (j = 0; j < c; j++) arr[i][j] = ++count; // Or *(*(arr+i)+j) = ++count for (i = 0; i < r; i++) for (j = 0; j < c; j++) printf("%d ", arr[i][j]); /* Code for further processing and free the dynamically allocated memory */ for (int i = 0; i < r; i++) free(arr[i]); return 0; }
Producción:
1 2 3 4 5 6 7 8 9 10 11 12
3) Usando un puntero a un puntero
Podemos crear una array de punteros también dinámicamente usando un puntero doble. Una vez que tenemos una array de punteros asignada dinámicamente, podemos asignar memoria dinámicamente y para cada fila como el método 2.
C
#include <stdio.h> #include <stdlib.h> int main() { int r = 3, c = 4, i, j, count; int** arr = (int**)malloc(r * sizeof(int*)); for (i = 0; i < r; i++) arr[i] = (int*)malloc(c * sizeof(int)); // Note that arr[i][j] is same as *(*(arr+i)+j) count = 0; for (i = 0; i < r; i++) for (j = 0; j < c; j++) arr[i][j] = ++count; // OR *(*(arr+i)+j) = ++count for (i = 0; i < r; i++) for (j = 0; j < c; j++) printf("%d ", arr[i][j]); /* Code for further processing and free the dynamically allocated memory */ for (int i = 0; i < r; i++) free(arr[i]); free(arr); return 0; }
Producción:
1 2 3 4 5 6 7 8 9 10 11 12
4) Usando doble puntero y una llamada malloc
C
#include<stdio.h> #include<stdlib.h> int main() { int r=3, c=4, len=0; int *ptr, **arr; int count = 0,i,j; len = sizeof(int *) * r + sizeof(int) * c * r; arr = (int **)malloc(len); // ptr is now pointing to the first element in of 2D array ptr = (int *)(arr + r); // for loop to point rows pointer to appropriate location in 2D array for(i = 0; i < r; i++) arr[i] = (ptr + c * i); for (i = 0; i < r; i++) for (j = 0; j < c; j++) arr[i][j] = ++count; // OR *(*(arr+i)+j) = ++count for (i = 0; i < r; i++) for (j = 0; j < c; j++) printf("%d ", arr[i][j]); return 0; }
Producción:
1 2 3 4 5 6 7 8 9 10 11 12
Gracias a Trishansh Bhardwaj por sugerir este cuarto método.
Este artículo es una contribución de Abhay Rathi . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
5) Usando un puntero a la array de longitud variable.
Las dimensiones de VLA están ligadas al tipo de la variable. Por lo tanto, uno forma un puntero a una array con una forma definida en tiempo de ejecución.
El puntero tiene que ser desreferenciado antes de subíndice con sintaxis (*arr)[i][j].
C
#include <stdio.h> #include <stdlib.h> int main() { int row = 3, col = 4, i, j, count; int (*arr)[row][col] = malloc(sizeof *arr); count = 0; for (i = 0; i < row; i++) for (j = 0; j < col; j++) (*arr)[i][j] = ++count; for (i = 0; i < row; i++) for (j = 0; j < col; j++) printf("%d ", (*arr)[i][j]); free(arr); return 0; }
6) Usando un puntero a la primera fila de VLA
Similar a 5 pero permite la sintaxis arr[i][j].
C
#include <stdio.h> #include <stdlib.h> int main() { int row = 3, col = 4, i, j, count; int (*arr)[col] = calloc(row, sizeof *arr); count = 0; for (i = 0; i < row; i++) for (j = 0; j < col; j++) arr[i][j] = ++count; for (i = 0; i < row; i++) for (j = 0; j < col; j++) printf("%d ", arr[i][j]); free(arr); return 0; }
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA