(gcc) Multi-Dim Array o Double Pointer para comstackr sin advertencias

Tengo una función, que a veces se llama con arreglos regulares y otras dynamics.

Si defino la función como

function_name(int[10][10] a) 

y enviar int ** como parámetro, recibo una advertencia. Opuesto, si declaro.

 function_name(int** a) 

y enviar int [] [] como parámetro (después de la conversión) no puedo acceder a los elementos de la matriz dentro de la función.

¿Cuál es la forma más correcta?

Cuando una matriz se pasa a una función, “decae” a un puntero a su primer elemento. Entonces, dado:

 T a[10]; f(a); 

En la llamada f(a) , a es en realidad &a[0] , es decir, un puntero, y el tipo es T * (el tipo de &a[0] ).

Cuando tienes una matriz de matrices, se aplica la misma regla:

 T a[10][5]; f(a); 

a decae a un puntero de nuevo, igual a &a[0] . a[0] es de tipo “matriz [5] de T “. Entonces, &a[0] es de tipo “puntero a la matriz [5] de T “, es decir, si declarara un puntero p para establecer igual a &a[0] , haría:

 T (*p)[5]; /* parentheses because [] binds tighter than * */ p = &a[0]; 

Dado lo anterior, y suponiendo que su matriz se declara en el código de llamada como int a[10][10]; , debes declarar tu función como:

 function_name(int (*a)[10]); 

Para más, vea esto .

Hay un error de syntax en function_name(int[10][10] a) debe especificar el tamaño de la matriz después del nombre de “variable”: function_name(int a[10][10]) . De hecho, lo anterior es equivalente a function_name(int (*a)[10]) , debido a la “descomposición” mencionada anteriormente.

Edit : ah, creo que entiendo ahora. No puede declarar una función que tome tanto una matriz “bidimensional” como un puntero a puntero, por las razones mencionadas anteriormente (el “decaimiento” del puntero solo ocurre una vez). Un puntero a puntero puede no apuntar a datos contiguos y puede tener un número diferente de elementos en cada “fila”. Una matriz de matrices no puede tener esas propiedades. Son fundamentalmente diferentes.

int ** y int [][] no son lo mismo. El primero es pointer to pointer to int mientras que el segundo es una matriz int de int .

int[][] decae a int (*)[] cuando lo pasas como argumento para funcionar.

 void func(int arr[][10]) { //decays to `int (*arr)[10]` printf("%d correct", arr[1][9]); //10th element of 2nd row //printf("%d correct", (*(arr + 1))[9]); //same as above } int main() { int (*arr)[10]; //pointer to array of ints arr = malloc(sizeof(int (*)[]) * 2); //2 rows & malloc will do implicit cast. arr[1][9] = 19; func(arr); return 0; }