在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
廣告