Pasar una matriz multidimensional como argumento de una función. Pasar una matriz tenue como argumento es más o menos trivial. Echemos un vistazo en caso más interesante de pasar una matriz de 2 dim. En C no puede usar un puntero a construcción de puntero (int **) en lugar de 2 dim array. Hagamos un ejemplo:
void assignZeros(int(*arr)[5], const int rows) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < 5; j++) {
*(*(arr + i) + j) = 0;
// or equivalent assignment
arr[i][j] = 0;
}
}
Aquí he especificado una función que toma como primer argumento un puntero a un array de 5 enteros. puedo pasar como argumento cualquier 2 gama tenue que tiene 5 columnas:
int arr1[1][5]
int arr1[2][5]
...
int arr1[20][5]
...
Es posible llegar a una idea de definir una función más general que puede aceptar cualquier 2 gama tenue y cambiar la firma de la función de la siguiente manera:
void assignZeros(int ** arr, const int rows, const int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
*(*(arr + i) + j) = 0;
}
}
}
Este código se compilará, pero usted recibirá un error de ejecución cuando se trata de asignar los valores de la misma manera que en la primera función. Por lo tanto, en C, las matrices multidimensionales no son lo mismo que los punteros a los punteros ... a los punteros. Un int (* arr) [5] es un puntero a una matriz de 5 elementos, y un int (* arr) [6] es un puntero a la matriz de 6 elementos, ¡y son un puntero a diferentes tipos!
Bueno, ¿cómo definir argumentos de funciones para dimensiones más altas? Simple, ¡solo seguimos el patrón! Hier ist la misma función ajustado para tener una matriz de 3 dimensiones:
void assignZeros2(int(*arr)[4][5], const int dim1, const int dim2, const int dim3) {
for (int i = 0; i < dim1; i++) {
for (int j = 0; j < dim2; j++) {
for (int k = 0; k < dim3; k++) {
*(*(*(arr + i) + j) + k) = 0;
// or equivalent assignment
arr[i][j][k] = 0;
}
}
}
}
Como era de esperar, se puede tomar como argumento cualquiera de los 3 conjuntos tenues que tienen en la segunda dimensiones 4 elementos y en la tercera dimensión 5 elementos. Algo como esto estaría bien:
arr[1][4][5]
arr[2][4][5]
...
arr[10][4][5]
...
Pero tenemos que especificar todas las dimensiones tamaños hasta la primera.
Está pasando la matriz por referencia pero está modificando su contenido; por lo tanto, está viendo un cambio en los datos –