C語言中文網 目錄

C語言將數組作為函數參數

一個函數的形參是普通的局部變量。當發生函數調用時,程序創建這些形參,然后用對應的實參來初始化這些形參。形參的作用域就是函數塊。函數內可以改變形參的值,而不會影響調用上下文中實參的值。

如果需要將一個數組當作實參傳入函數,則應把對應的形參聲明成下面的形式:

類型 名稱[ ]


因為,當把數組名作為函數實參時,它會自動被轉換為指針。所以上面的聲明等同于下面的聲明:

類型 *名稱


當使用數組來聲明函數參數時,方括號 [] 內的任何常量表達式都會被忽略。在函數塊內,數組參數名是一個指針變量,并且數組的值可以在該函數內被修改。例 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 個元素的數組。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo