1. 程式人生 > >C++中函式的陣列形參

C++中函式的陣列形參

函式由函式名以及一組運算元型別唯一的表示。函式的運算元,也即形參(parameter),在一對圓括號中宣告,形參與形參之間以逗號分隔。

void swap(int a, int b)
{
   int temp = a;
   a = b;
   b = temp;
}
在以上函式中,引數ab就是swap()函式的形參。當呼叫該函式時
int i = 1;
int j = 2;
swap(i, j);
在以上程式碼中,ijswap()函式的實參。

1 引數傳遞

每次函式呼叫時,都會重新建立該函式的所有形參,此時所傳遞的實參將會初始化對應的形參。

1.1 非引用形參

普通的非引用型別的引數通過複製對應的實參實現初始化。當用實參副本初始化形參時,函式並沒有訪問呼叫所傳遞的實參本身,因此不會改變實參值。

從圖1中可以看出,swap()函式交換的是實參ij的副本,而不是ij的本身。

1.2 引用形參

引用形參直接關聯到其繫結的物件,而並非這些物件的副本。每次呼叫函式時,引用形參被建立並與相應實參關聯。如果將swap()函式的引數修改為引用形參

void swap(int& a, int& b)
{
   int temp = a;
   a = b;
   b = temp;
}
則呼叫swap函式的示意圖如圖2所示。

從圖2中可以看到,swap()函式交換的是實參ij的本身。

2 陣列形參

當要使用陣列作為函式形參時,因為一個數組不能使用另外一個數組初始化,也不能將一個數組賦值給另外一個數組,而在

1.1 非引用形參”中提到要用實參的副本來初始化形參,所以實參為陣列時,不能直接傳遞給形參。

那麼,如果一個函式需要陣列作為其引數,這個函式該如何定義呢?

2.1 引數為陣列的函式

例如一個函式的作用是找出陣列中的最大數,陣列為該函式的引數,則可以用如下三種方式定義該函式:

int FindMax(int* array);
int FindMax(int array[]);
int FindMax(int array[10]);
雖然不能直接傳遞陣列,但是函式的形參可以寫成陣列的形式。此時,呼叫該函式是的實引數組被編譯器自動轉換為指標,也就是說,以上三種定義是等價的,其引數型別都是int*

呼叫該函式時,直接將陣列名稱作為實參即可。

int array_my[5] = {1, 2, 3, 4, 5};
int array_maxvalue = FindMax(array_my);

2.2 引數為陣列引用的函式

如果函式的形參時陣列的引用,則編譯器不會把陣列實參轉換為指標,而是傳遞陣列的引用本身。

其定義方式為

int FindMax(int(&array)[5]);
呼叫該函式的方法與2.1 引數為陣列的函式”中的方法相同。

需要注意的時,呼叫引數為陣列引用的函式時,編譯器檢查實參的大小與形參的大小是否匹配。

int FindMax(int(&array)[5]);
時,呼叫該函式的形參必須是有5個元素的整形陣列的陣列名,以下呼叫方式是錯誤的。
int array_my[3] = {1, 2, 3};
int array_maxvalue = FindMax(array_my);
而對於引數為陣列的函式
int FindMax(int array[10]);
則沒有要求形參和實參的陣列元素個數必須對應,以下方式呼叫則是正確的。
int array_my[3] = {1, 2, 3};
int array_maxvalue = FindMax(array_my);