數組與單個元素一樣,也可以作為參數被函數調用,但其用法與單個元素調用存在不同。
對於單個元素調用,如不使用引用&或者指針,則**在函數中對形參的操作不會反映到實參上**,即實參不會發生改變,具體用法詳見上一篇博客。
而對於數組調用,函數的形參看似是一個新的數組,但並未分配新的內存。因為**數組的名字代表着數組的首地址**。因此**在數組名作函數參數時所進行的傳送只是地址的傳送,也就是說把實參數組的首地址賦予形參數組名。**形參數組名取得該首地址之后,也就等於有了實在的數組。實際上是形參數組和實參數組為同一數組,共同擁有一段內存空間。

因此,形參數組是一個虛擬數組,其數組的地址指向了實參數組。如a[0]與b[0]都指向了同一個地址。**在對形參數組進行操作時,實參數組的值也會相應的發生改變。**
在函數調用數組的方法
1.對於一維數組:
```cpp
void invert(int x[]){
//函數部分
}
int main(){
int a[10];
invert(a);
//主函數調用部分
}
```
注:
1.形參與實參的類型必須一樣,如int對應int。
2.主函數調用invert函數時只需使用實參數組的名字,代表數組的地址。
3.形參數組可以不規定長度,但實參數組會規定長度。
另一種寫法:
```cpp
void invert(int x[10]){
//函數部分
}
int main(){
int a[10];
invert(a);
//主函數調用部分
}
```
可以規定好形參數組的長度。但由於形參數組是虛擬數組,其地址與實參數組的地址對應,故形參數組的長度其實並無太大意義。
```cpp
void invert(int x[110]){
//函數部分
for(register int i=1;i<=100;i++){
x[i]=0;
}
}
int main(){
int a[10];
invert(a);
//主函數調用部分
}
```
若形參數組長度大於實參數組,則可能導致對形參數組的部分操作沒有意義。如上文x[11]到x[100]沒有意義。
若形參數組長度小於實參數組,可能導致部分實參數組未被操作。
但無論長度如何,關鍵都在於對形參數組操作的邊界設置是否合理,如下文的代碼並無問題。
```cpp
void invert(int x[10]){
//函數部分
for(register int i=1;i<=100;i++){
x[i]=0;
}
}
int main(){
int a[100];
invert(a);
//主函數調用部分
}
```
2.對於多維數組:
在函數定義時對形參數組可以**指定每一維的長度,也可省去第一維的長度**。因此,以下寫法都是合法的:
```cpp
void invert(int sum[][110])
void invert(int sum[110][110])
```