Beh, non è certamente ben compreso dalla comunità C come si può vedere dando un'occhiata a SO.La magia è, tutti i seguenti sono totalmente, 100%, equivalente:
void foo(int (*array)[10]);
void foo(int array[][10]);
void foo(int array[10][10]);
void foo(int array[42][10]);
È molto importante della distinzione di un puntatore e un array. Un array non è un puntatore. Un array può essere convertito in un puntatore al suo primo elemento. Se si dispone di un puntatore avete questo:
--------
| ptr | -------> data
--------
Tuttavia, se si dispone di una matrice, è avere questo:
---------------------------
| c1 | c2 | c3 | ... | cn |
---------------------------
Con il puntatore, il dato è al tutto un altro pianeta, ma collegato a dal puntatore. Un array ha i dati stessi. Ora, un array multidimensionale è solo un array di matrici. Gli array sono nidificati in un array principale. Così, il sizeof della matrice è:
(sizeof(int) * 10) * 10
Questo perché si dispone di 10 array, che sono tutti array di 10 interi. Ora, se vuoi passare quell'array, viene convertito. Ma a cosa? Un puntatore al suo primo elemento. Il tipo di elemento è non un puntatore, ma una matrice. Di conseguenza, si passa un puntatore a una matrice di 10 int:
int (*)[10] // a pointer to an int[10]
Non è né una matrice di int*
, né una int**
. Potresti chiedere perché l'array non è passato come int**
. È perché il compilatore deve conoscere la lunghezza della riga. Se si esegue un array[1][0]
, il compilatore indirizzerà un posto a sizeof(int) * 10
byte a parte dall'inizio della matrice bidimensionale. Decodifica le informazioni nel tipo puntatore-array.
Quindi, è necessario scegliere tra uno dei prototipi di funzioni completamente equivalenti di cui sopra. Naturalmente, l'ultimo è solo confuso. Il compilatore ignora silenziosamente qualsiasi numero scritto nella dimensione più esterna se un parametro viene dichiarato come array. Quindi non utilizzerei nemmeno la penultima versione. La cosa migliore è usare la prima o la seconda versione. Ciò che è importante ricordare è che C non ha parametri di array (reali)! Il parametro sarà un puntatore alla fine (puntatore all'array in questo caso).
Nota come il caso multidimensionale di cui sopra è simile al caso degenerato, un caso dimensionale di seguito. Tutti i seguenti 4 versioni sono del tutto equivalente:
void foo(int *array);
void foo(int array[]);
void foo(int array[10]);
void foo(int array[42]);
Sebbene la risposta di Mark Pim sia centrata sul problema principale della mia domanda, voglio compensare in qualche modo tutto il tuo sforzo nel tentativo di spiegare le sottofinestre degli array come parametri in C impostando questa risposta come raccomandato. Grazie! – Auron