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_arr和a都指向同一个数组。在函数内部,我们使用 for 循环将数组的每个元素增加5。因为我们是在原始数组上操作,所以这里所做的所有更改都会影响原始数组。