Passing an array as an argument to a function in C

后端 未结 10 1229
太阳男子
太阳男子 2020-11-22 06:03

I wrote a function containing array as argument, and call it by passing value of array as follows.

void arraytest(int a[])
{
    // changed the array a
    a         


        
相关标签:
10条回答
  • 2020-11-22 06:32

    Passing a multidimensional array as argument to a function. Passing an one dim array as argument is more or less trivial. Let's take a look on more interesting case of passing a 2 dim array. In C you can't use a pointer to pointer construct (int **) instead of 2 dim array. Let's make an example:

    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;
                // or equivalent assignment
                arr[i][j] = 0;
            }
        }
    

    Here I have specified a function that takes as first argument a pointer to an array of 5 integers. I can pass as argument any 2 dim array that has 5 columns:

    int arr1[1][5]
    int arr1[2][5]
    ...
    int arr1[20][5]
    ...
    

    You may come to an idea to define a more general function that can accept any 2 dim array and change the function signature as follows:

    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;
            }
        }
    }
    

    This code would compile but you will get a runtime error when trying to assign the values in the same way as in the first function. So in C a multidimensional arrays are not the same as pointers to pointers ... to pointers. An int(*arr)[5] is a pointer to array of 5 elements, an int(*arr)[6] is a pointer to array of 6 elements, and they are a pointers to different types!

    Well, how to define functions arguments for higher dimensions? Simple, we just follow the pattern! Here is the same function adjusted to take an array of 3 dimensions:

    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;
                    // or equivalent assignment
                    arr[i][j][k] = 0;
                }
            }
        }
    }
    

    How you would expect, it can take as argument any 3 dim arrays that have in the second dimensions 4 elements and in the third dimension 5 elements. Anything like this would be OK:

    arr[1][4][5]
    arr[2][4][5]
    ...
    arr[10][4][5]
    ...
    

    But we have to specify all dimensions sizes up to the first one.

    0 讨论(0)
  • 2020-11-22 06:37

    When passing an array as a parameter, this

    void arraytest(int a[])
    

    means exactly the same as

    void arraytest(int *a)
    

    so you are modifying the values in main.

    For historical reasons, arrays are not first class citizens and cannot be passed by value.

    0 讨论(0)
  • 2020-11-22 06:37

    You are passing the address of the first element of the array

    0 讨论(0)
  • 2020-11-22 06:40

    You are not passing the array as copy. It is only a pointer pointing to the address where the first element of the array is in memory.

    0 讨论(0)
提交回复
热议问题