Passer des tableaux multidimensionnels comme arguments de fonction dans C

En C, puis-je passer un tableau multidimensionnel à une fonction en tant qu’argument unique lorsque je ne connais pas les dimensions du tableau?

De plus, mon tableau multidimensionnel peut contenir des types autres que des chaînes.

Vous pouvez le faire avec n’importe quel type de données. Simplement en faire un pointeur à un pointeur:

typedef struct { int myint; char* myssortingng; } data; data** array; 

Mais n’oubliez pas que vous devez toujours utiliser la variable malloc pour obtenir un peu de complexité:

 //initialize int x,y,w,h; w = 10; //width of array h = 20; //height of array //malloc the 'y' dimension array = malloc(sizeof(data*) * h); //iterate over 'y' dimension for(y=0;y 

Le code de désallocation de la structure est similaire - n'oubliez pas d'appeler free () sur tout ce que vous avez appelé! (Aussi, dans les applications robustes, vous devriez vérifier le retour de malloc () .)

Maintenant, disons que vous voulez passer cela à une fonction. Vous pouvez toujours utiliser le double pointeur, car vous voulez probablement faire des manipulations sur la structure de données, et non le pointeur sur des pointeurs de structures de données:

 int whatsMyInt(data** arrayPtr, int x, int y){ return arrayPtr[y][x].myint; } 

Appelez cette fonction avec:

 printf("My int is %d.\n", whatsMyInt(array, 2, 4)); 

Sortie:

 My int is 6. 

Transmettez un pointeur explicite au premier élément avec les dimensions du tableau en tant que parameters distincts. Par exemple, pour gérer des tableaux 2-d de taille arbitraire:

 void func_2d(int *p, size_t M, size_t N) { size_t i, j; ... p[i*N+j] = ...; } 

qui serait appelé comme

 ... int arr1[10][20]; int arr2[5][80]; ... func_2d(&arr1[0][0], 10, 20); func_2d(&arr2[0][0], 5, 80); 

Le même principe s’applique aux tableaux de dimension supérieure:

 func_3d(int *p, size_t X, size_t Y, size_t Z) { size_t i, j, k; ... p[i*Y*Z+j*Z+k] = ...; ... } ... arr2[10][20][30]; ... func_3d(&arr[0][0][0], 10, 20, 30); 

Vous pouvez déclarer votre fonction comme:

 f(int size, int data[][size]) {...} 

Le compilateur fera alors tout l’arithmétique du pointeur pour vous.

Notez que les dimensions des dimensions doivent apparaître avant le tableau lui-même.

GNU C permet le renvoi de la déclaration d’argument (au cas où vous devez vraiment passer des dimensions après le tableau):

 f(int size; int data[][size], int size) {...} 

La première dimension, même si vous pouvez la passer en argument, est inutile pour le compilateur C (même pour l’opérateur sizeof, quand elle est appliquée sur un tableau passé comme un argument sera toujours considéré comme un pointeur sur le premier élément).

 int matmax(int **p, int dim) // p- masortingx , dim- dimension of the masortingx { return p[0][0]; } int main() { int *u[5]; // will be a 5x5 masortingx for(int i = 0; i < 5; i++) u[i] = new int[5]; u[0][0] = 1; // initialize u[0][0] - not mandatory // put data in u[][] printf("%d", matmax(u, 0)); //call to function getche(); // just to see the result }