Nun, es ist sicherlich nicht gut von der C-Community verstanden, wie durch einen Blick über SO gesehen werden kann.Die Magie ist, alle folgenden sind total 100%, das entspricht:
void foo(int (*array)[10]);
void foo(int array[][10]);
void foo(int array[10][10]);
void foo(int array[42][10]);
Es ist sehr wichtig, die Unterscheidung eines Zeigers, und einer Anordnung zu ziehen. Ein Array ist kein Zeiger. Ein Array kann in einen Zeiger auf sein erstes Element konvertiert werden. Wenn Sie einen Zeiger haben Sie diese haben:
--------
| ptr | -------> data
--------
Wenn Sie jedoch ein Array haben, haben Sie dies:
---------------------------
| c1 | c2 | c3 | ... | cn |
---------------------------
Mit dem Zeiger werden die Daten auf einem ganz anderen Planeten, sondern verknüpft durch den Zeiger. Ein Array enthält die Daten selbst. Jetzt ist ein mehrdimensionales Array nur ein Array von Arrays. Die Arrays sind in einem übergeordneten Array verschachtelt. Also, die sizeof Ihres Arrays ist:
(sizeof(int) * 10) * 10
Das ist, weil Sie 10 Arrays, von denen alle Arrays von 10 ganzen Zahlen sind. Wenn Sie dieses Array übergeben möchten, wird es konvertiert. Aber zu was? Ein Zeiger auf sein erstes Element. Der Elementtyp ist nicht ein Zeiger, sondern ein Array. Als Folge geben Sie einen Zeiger auf ein Array von 10 int:
int (*)[10] // a pointer to an int[10]
Es ist weder ein Array von int*
, noch ein int**
. Sie können fragen, warum das Array nicht als int**
übergeben wird. Das liegt daran, dass der Compiler die Zeilenlänge kennen muss. Wenn Sie eine array[1][0]
machen, adressiert der Compiler eine Stelle sizeof(int) * 10
Bytes vom Anfang des zweidimensionalen Arrays entfernt. Es decodiert diese Informationen im Zeiger-zu-Array-Typ.
Sie müssen also zwischen einem der oben genannten vollwertigen Funktions-Prototypen wählen. Natürlich ist der letzte nur verwirrend. Der Compiler ignoriert nur stillschweigend jede Zahl, die in der äußersten Dimension geschrieben wird, wenn ein Parameter als Array deklariert wird. Also würde ich auch nicht die vorletzte Version verwenden. Am besten ist es, die erste oder zweite Version zu verwenden. Was zu beachten ist, ist, dass C keine (realen) Array-Parameter hat! Der Parameter wird am Ende ein Zeiger sein (Zeiger auf Array in diesem Fall).
Beachten Sie, wie der multidimensionale Fall von oben ähnlich dem entarteten, eindimensionalen Fall unten ist. Alle folgenden vier Versionen völlig gleichwertig sind:
void foo(int *array);
void foo(int array[]);
void foo(int array[10]);
void foo(int array[42]);
Obwohl Mark Pims Antwort vollständig auf das Hauptproblem meiner Frage zentriert ist, möchte ich irgendwie all Ihre Bemühungen kompensieren, die Teilmengen von Arrays als Parameter zu erklären C, indem Sie diese Antwort wie empfohlen einstellen. Vielen Dank! – Auron