C語言將陣列作為函數引數

2020-07-16 10:04:27
一個函數的形參是普通的區域性變數。當發生函數呼叫時,程式建立這些形參,然後用對應的實參來初始化這些形參。形參的作用域就是函數塊。函數內可以改變形參的值,而不會影響呼叫上下文中實參的值。

如果需要將一個陣列當作實參傳入函數,則應把對應的形參宣告成下面的形式:

型別 名稱[ ]


因為,當把陣列名作為函數實參時,它會自動被轉換為指標。所以上面的宣告等同於下面的宣告:

型別 *名稱


當使用陣列來宣告函數引數時,方括號 [] 內的任何常數表示式都會被忽略。在函數塊內,陣列引數名是一個指標變數,並且陣列的值可以在該函數內被修改。例 1 中的函數 addArray()將兩個陣列中對應索引元素的值相加。

【例1】函數 addArray()
// addArray() 將第二個陣列中每個元素的值加到第一個陣列對應元素上
//(例如,“array1 += array2”)
// 引數:兩個float型別的陣列,以及它們共同的長度
// 返回值:無
void addArray( register float a1[ ], register const float a2[ ], int len )
{
  register float *end = a1 + len;
  for ( ; a1 < end; ++a1, ++a2 )
    *a1 += *a2;
}

對於函數中的陣列引數使用另一種表示法,上述函數 addArray()可等效為以下形式:
void addArray( register float *a1, register const float *a2, int len )
{  /* 函數塊內容與前述一樣 */ }

使用方括號 [] 宣告函數陣列引數的一個優點就是可讀性好,它可以顯著地標識出函數將該引數作為指向陣列的指標,而不是一個獨立的 float 變數。在引數宣告時,陣列風格的表示法還有兩個特點:

(1) 在引數宣告時(也只有在該情況下),C99 允許將型別限定符 const、volatile 和 restrict 放在方括號內。這個功能允許宣告具有限定符指標型別的引數。

(2) 而且,在 C99 中,也可以將儲存類修飾符 static 連帶整數常數表示式一起放在方括號內。這種方法表示,在函數呼叫的時陣列內元素數量至少等於該常數表示式。

下面一個範例展示了上述這些特點:
int func( long array[const static 5] )
{ /* ... */ }

在這裡所定義的函數中,引數 array 是一個指向 long 型別的常數指標,所以不能被修改。它指向一個至少有 5 個元素的陣列。

C99 同時允許將陣列引數宣告成可變長度的陣列。方法是將一個非常數的、且為正數的整數表示式放在方括號之間。在這種情況下,陣列引數仍然是指向第一個陣列元素的指標。不同之處在於,陣列元素本身也允許長度可變。

在例 2 中,函數 maximum()的第 3 個引數是一個二維陣列,其長度可變。

【例2】函數 maximum()
// 函數 maximum() 獲得double型別二維陣列中的最大值
// 引數:行數、列數、二維陣列
// 返回值:最大元素的值
double maximum( int nrows, int ncols, double matrix[nrows][ncols] )
{
  double max = matrix[0][0];
  for ( int r = 0; r < nrows; ++r )
    for ( int c = 0; c < ncols; ++c )
      if ( max < matrix[r][c] )
        max = matrix[r][c];
  return max;
}

引數 matrix 是一個指標,它指向一個具有 ncols 個元素的陣列。