Übergeben eines mehrdimensionalen Arrays als Argument an eine Funktion.
Das Übergeben eines One-Dim-Arrays als Argument ist mehr oder weniger trivial. Werfen wir einen Blick auf einen interessanteren Fall, bei dem ein 2-Dim-Array übergeben wird. In C können Sie keinen Zeiger auf das Zeigerkonstrukt ( int **
) anstelle eines 2-Dim-Arrays verwenden. Machen wir ein Beispiel:
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;
arr[i][j] = 0;
}
}
Hier habe ich eine Funktion angegeben, die als erstes Argument einen Zeiger auf ein Array von 5 Ganzzahlen verwendet. Ich kann als Argument jedes 2-Dim-Array mit 5 Spalten übergeben:
int arr1[1][5]
int arr1[2][5]
...
int arr1[20][5]
...
Möglicherweise kommen Sie auf die Idee, eine allgemeinere Funktion zu definieren, die ein beliebiges 2-Dim-Array akzeptieren und die Funktionssignatur wie folgt ändern kann:
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;
}
}
}
Dieser Code würde kompiliert, aber Sie erhalten einen Laufzeitfehler, wenn Sie versuchen, die Werte auf die gleiche Weise wie in der ersten Funktion zuzuweisen. In C sind mehrdimensionale Arrays also nicht dasselbe wie Zeiger auf Zeiger ... auf Zeiger. An int(*arr)[5]
ist ein Zeiger auf ein Array von 5 Elementenint(*arr)[6]
ist ein Zeiger auf ein Array von 6 Elementen und sie sind ein Zeiger auf verschiedene Typen!
Wie definiere ich Funktionsargumente für höhere Dimensionen? Einfach, wir folgen einfach dem Muster! Hier ist dieselbe Funktion, die für ein Array mit drei Dimensionen angepasst wurde:
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;
arr[i][j][k] = 0;
}
}
}
}
Wie zu erwarten, können 3 dim-Arrays als Argument verwendet werden, die in der zweiten Dimension 4 Elemente und in der dritten Dimension 5 Elemente enthalten. So etwas wäre in Ordnung:
arr[1][4][5]
arr[2][4][5]
...
arr[10][4][5]
...
Wir müssen jedoch alle Abmessungen bis zur ersten angeben.