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

3.0 KiB

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

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

最后更新于 2020 年 7 月 27 日


在 C 语言的一维数组和函数一章中,我们讨论了当一个数组传递给一个函数时,该函数所做的改变会影响原始数组。在研究了指针之后,我们能够理解为什么会发生这种情况。但是在我们研究这个之前,我想明确几点。

在上述章节中,我们还了解到,当一维数组传递给函数时,可以选择在形式参数中指定数组的大小。因此,如果我们传递一个 5 个整数的数组,那么函数的形式参数可以用以下两种方式编写。

int my_arr[5] = [11,44,66,90,101];

第一种方式:

void function(int a[]) // here the size of the array is omitted
{
    // statements;
}

第二种方式:

void function(int a[5]) // here the size of the array is specified
{
    // statements;
}

在指针和一维数组一章中,我们还了解到数组的名称是指向数组第 0 个元素的常量指针。在我们的例子中my_arr是指向数组第 0 个元素的指针,换句话说,my_arr指向元素 11 的地址。所以my_arr的基本类型是指向int(int *)的指针。因此,函数的形式参数也可以声明为指向int(int *)的指针:

第三种方式:

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

本质上,在所有这三种情况下,a的基本类型是指向int(int *)的指针,我们只是用三种不同的方式来表示它们。

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

#include<stdio.h>
void new_array(int a[]);

int main()
{
    int my_arr[] = {1,4,9,16,23}, i;
    printf("Original array: \n\n");

    for(i = 0; i < 5; i++)
    {
        printf("%d ", my_arr[i]);
    }

    my_func(my_arr);

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

    for(i = 0; i < 5; i++)
    {
        printf("%d ", my_arr[i]);
    }

    // signal to operating system program ran fine
    return 0;
}

void my_func(int a[5])
{
    int i;

    // increment original elements by 5

    for(i = 0; i < 5; i++)
    {
        a[i] = a[i] + 5;
    }
}

预期输出:

Original array:

1 4 9 16 23

Modified array:

6 9 14 21 28

工作原理:

我们知道my_arr是指向数组第一个元素的指针。所以我们可以不使用&运算符将my_arr传递给功能my_func()。在第 15 行中,my_func()用一个实际的参数my_arr来调用,然后分配给a。再次注意,我们将my_arr的地址传递给a,这意味着我们使用的是引用调用,而不是值调用。所以现在my_arra都指向同一个数组。在函数内部,我们使用 for 循环将数组的每个元素增加5。因为我们是在原始数组上操作,所以这里所做的所有更改都会影响原始数组。