Passing three dimensional arrays to a function in C

You can use the following two ways to pass/print the matrix:

void display3DArray1(int rows, int cols1, int cols2, int *A) {
    int *a, i, j, k;
    printf("\n");
    for(i=0; i<rows; i++) {
        for(j=0; j<cols1; j++) {
            for(k=0; k<cols2; k++) {
                a= A+(i*cols1*cols2)+(j*cols2)+k;
                printf("%d, %p\n", *a, a);
            }
        }
    }
}

void display3DArray2(int A[DIM1][DIM2][DIM3]) {
    int i, j, k;
    printf("\n");
    for(i=0; i<DIM1; i++) {
        for(j=0; j<DIM2; j++) {
            for(k=0; k<DIM3; k++) {
                printf("%d, %p\n", A[i][j][k], &A[i][j][k]);
            }
        }
    }
}

The first method does not rely on the dimensions of the matrix; the second one does. As a result, the first one needs explicit address calculations (row i, col j, cell k).

Use calls respectively:

display3DArray1(DIM1, DIM2, DIM3, (int *)matrix3D);
display3DArray2(matrix3D);

Note the cast of the matrix to an int pointer.

In your code, you used parameter names to specify the dimensions of the matrix. In my C version, that is not legal; they must be constants.


Just a complement to Paul Ogilvie's answer.

The correct usage of Variable Length Arrays would be:

void display3DArray3(int rows, int cols1, int cols2,int arr[][cols1][cols2]) {
    printf("\n");
    for(int i=0; i<rows; i++) {
        for(int j=0; j<cols1; j++) {
            for(int k=0; k<cols2; k++) {
                printf("*arr : %d adress: %p\n", arr[i][j][k], &arr[i][j][k]);
            }
        }
    }
}

Tags:

C

Arrays