在C语言中,数组作为函数参数进行传递



如果你想将数组传递给某个函数,你可以使用 按值传递按引用传递 方法。在按值传递方法中,对函数的参数应是已初始化的数组,或与要传递的数组大小相等的固定大小的数组。在按引用传递方法中,函数参数是数组的指针。

使用按值传递方法传递数组

在以下代码中,main() 函数 带有一个整数数组。通过将数组传递给用户定义的函数 average() 来调用该函数。average() 函数接收数组,并使用 for 循环 将其元素相加。它返回一个浮点值,表示数组中数字的平均值。

示例

#include <stdio.h>
float average(int arr[5]);
int main(){
   int arr[] = {10, 34, 21, 78, 5};
   float avg = average(arr);
   printf("average: %f", avg);
}
float average(int arr[5]){
   int sum=0;
   int i;
   for (i=0; i<5; i++){
      printf("arr[%d]: %d\n", i, arr[i]);
      sum+=arr[i];
   }
   return (float)sum/5;
}

输出

arr[0]: 10
arr[1]: 34
arr[2]: 21
arr[3]: 78
arr[4]: 5
average: 29.600000

在以下变体中,average() 函数被定义为具有两个参数,即未初始化的数组,未指定任何大小。通过将数组大小除以 int 数据类型 的大小,可以获取 main() 函数中声明的数组的长度。

示例

#include <stdio.h>
float average(int arr[], int length);
int main(){
   int arr[] = {10, 34, 21, 78, 5};
   int length = sizeof(arr)/sizeof(int);
   float avg = average(arr, length);
   printf("average: %f", avg);
}
float average(int arr[], int length){
   int sum=0;
   int i;
   for (i=0; i<length; i++){
      printf("arr[%d]: %d\n", i, arr[i]);
      sum+=arr[i];
   }
   return (float)sum/length;
}

输出

arr[0]: 10
arr[1]: 34
arr[2]: 21
arr[3]: 78
arr[4]: 5
average: 29.600000

使用按引用传递方法传递数组

为了使用此方法,我们应理解以下事实:数组中的元素具有相似的 数据类型,存储在连续的内存位置中,并且数组大小取决于数据类型。而且,第 0 个元素的地址是指向数组的指针

在以下示例中 −

int a[5] = {1,2,3,4,5};

数组大小为 20 字节(每个 int 4 字节)

Int *x = a;

这里 x 是指向数组的指针。它指向第 0 个元素。如果指针增加 1,它指向下一个元素。

示例

#include <stdio.h>
int main() {
   int a[] = {1,2,3,4,5};
   int *x = a, i;
   for (i=0; i<5; i++){
      printf("%d\n", *x);
      x++;
   }
   return 0;
}

输出

1
2
3
4
5

让我们使用此特性来通过引用传递数组。在 main() 函数中,我们声明一个数组,并将它的地址传递给 max() 函数。max() 函数使用该指针遍历数组,并将数组中最大的数字返回给 main() 函数。

示例

#include <stdio.h>
int max(int *arr, int length);
int main(){
   int arr[] = {10, 34, 21, 78, 5};
   int length = sizeof(arr)/sizeof(int);
   int maxnum = max(arr, length);
   printf("max: %d", maxnum);
}
int max(int *arr, int length){
   int max=*arr;
   int i;
   for (i=0; i<length; i++){   
      printf("arr[%d]: %d\n", i, (*arr));
      if ((*arr)>max)
         max = (*arr);
      arr++;
   }
   return max;
}

输出

arr[0]: 10
arr[1]: 34
arr[2]: 21
arr[3]: 78
arr[4]: 5
max: 78

max() 函数从指针 arr 中接收 main() 传递过来的数组地址。每次增加该指针时,它都会指向原始数组中的下一个元素。

max() 函数还可以像以下定义中一样访问数组元素,作为普通的带下标的数组 −

int max(int *arr, int length){
   int max=*arr;
   int i;
   for (i=0; i<length; i++){   
      printf("arr[%d]: %d\n", i, arr[i]);
      if (arr[i]>max)
         max = arr[i];
   }
   return max;
}

将二维数组传递给函数

您还可以将二维数组的指针传递给函数。在函数中,将使用嵌套 for 循环结构遍历二维数组

示例

#include <stdio.h>
int twoDarr(int *arr);
int main(){
   int arr[][3]= {10, 34, 21, 78, 5, 25};
   twoDarr(*arr);
}
int twoDarr(int *arr){
   int max=*arr;
   int i, j;
   for (i=0; i<2; i++){
      for (j=0; j<3; j++){
         printf("%d\t", arr[i]);
         arr++;
      }
      printf("\n");
   }
}

输出

10      34      21
5       25      16

比较字符串长度的函数

在以下程序中,将两个字符串传递给 compare() 函数。在 C 中,字符串是 char 数据类型的数组。我们使用strlen() 函数查找字符串的长度,即其中的字符数。

示例

#include <stdio.h>
#include <string.h>
int compare( char *, char *);
int main() {
   char  a[] = "BAT";
   char  b[] = "BALL";
   int ret = compare(a, b);
   return 0;
}
int compare (char *x, char *y){
   int val;
   if (strlen(x)>strlen(y)){
      printf("length of string a is greater than or equal to length of string b");
   }
   else{
      printf("length of string a is less than length of string b");
   }
}

输出

length of string a is less than length of string b
广告