geekdoc-python-zh/docs/overiq/051.md

3.2 KiB

将二维数组传递给 C 语言中的函数

原文:https://overiq.com/c-programming-101/passing-2-d-array-to-a-function-in-c/

最后更新于 2020 年 7 月 27 日


就像一维数组一样,当二维数组传递给函数时,函数所做的更改会影响原始数组。但是在我们研究这个之前,我想明确几点。

我们在第章中了解到,当二维数组传递给函数时,可以选择指定最左边维度的大小。因此,如果我们有一个 2 行 3 维的数组,那么它可以通过以下两种方式传递给函数:

int two_d[2][3] = {
                      {99,44,11},
                      {4,66,9}
                  };

第一种方式:

void function(int a[][3])
{
    // statements;
}

第二种方式:

void function(int a[2][3])
{
    // statements;
}

回想一下,二维数组是按行主顺序存储的,即第一行 0 被存储,然后紧挨着它的第一行 1 被存储,以此类推。因此,在 C 语言中,二维数组实际上是一维数组,其中每个元素本身都是一维数组。因为数组的名称指向数组的第 0 个元素。在二维数组的情况下,第 0 个元素是数组。因此,从这个讨论中,我们可以得出two_d是指向 3 个整数的数组的指针。

因此,我们也可以声明一个函数,其中形式参数是指向数组的指针类型。

第三种方式:

void function(int (*a)[3])
{
    // statements; 
}

本质上,在讨论的所有三种情况下,变量a的类型是指向 3 个整数的数组的指针,它们的区别仅在于它们的表示方式。

好了,让我们回到最初的讨论——为什么函数所做的更改会影响原始数组?以下程序回答了这个问题。

#include<stdio.h>
void change_twod(int (*a)[3]);

int main()
{
    int i,j, two_d[2][3] = {
                               {99,44,11},
                               {4,66,9}
                           };

    printf("Original array: \n\n");

    for(i = 0; i < 2; i++)
    {
        for(j = 0; j < 3; j++)
        {
            printf("%3d ", two_d[i][j]);
        }

        printf("\n");
    }

    change_twod(two_d);

    printf("\n\nModified array : \n\n");

    for(i = 0; i < 2; i++)
    {
        for(j = 0; j < 3; j++)
        {
            printf("%3d ", two_d[i][j]);
        }
        printf("\n");
    }

    // signal to operating system everything works fine
    return 0;
}

void change_twod(int (*arr)[3])
{
    int i, j;

    printf("\n\nIncrementing every element by 5\n");
    // increment original elements by 6

    for(i = 0; i < 2; i++)
    {
        for(j = 0; j < 3; j++)
        {
            arr[i][j] = arr[i][j] + 5;
        }
    }

}

预期输出:

Original array:

99 44 11
4 66 9
Incrementing every element by 5
Modified array :

104 49 16
9 71 14

工作原理:

如本节前面所讨论的,two_darr是指向一个3整数数组的指针类型。在第 25 行中,change_twod()two_d的实际参数调用,然后分配给arr。现在two_darr都指向同一个二维数组,因此,函数内部所做的更改将在函数main()中可见。