<<C++ Primer>> 第四版中Exercise Section 7.2.5 中有習題7.13如下:編寫程序計算數組元素之和。
首先,數組作為形式參數有兩種,第一種是引用形式,第二種是非引用形式。
引用形式:參數傳遞時帶上了數組的大小,這樣只能傳遞進大小一樣的數組。
非引用形式:參數傳遞時沒有帶上數組大小,這樣會導致在編譯時,只要傳遞的是相同類型的指針,那么編譯都是可以通過的。
針對非引用形式的數組形參傳遞,數組會被轉換為指向第一個元素的指針,復制這個指針的值並用來初始化形參。因此下面三個形式的形參聲明其實是一樣的,形參類型都是 int*
int fun(int *p)
int fun(int p[])
int fun(int p[10])
看下面的例子:
#include "stdafx.h" #include <iostream> using namespace std; void printValues(int arr[10]) { for (size_t i = 0; i < 10; ++i) { cout << arr[i] << endl; } } int main() { int i[2] = {1,2}; int *p = 0; int pc[] = {0,1,2,3,4,5,6,7,8,9}; printValues(pc); printValues(i); printValues(p); return 0; }
代碼全部被編譯通過,但是當執行時,結果會變成這樣:
這里只要是int 型的指針傳遞進函數printvalues,編譯都通過了,但是程序運行時,卻拋出異常。
再來看引用參數的傳遞:
#include "stdafx.h" #include <iostream> using namespace std; void printValues2(int(&arr)[10]) { for (size_t i = 0; i < 10; ++i) { cout << arr[i] << endl; } } int main() { int i[2] = {1,2}; int *p = 0; int pc[] = {0,1,2,3,4,5,6,7,8,9}; printValues2(pc); printValues2(i); printValues2(p); return 0; }
這里代碼:
printValues2(i); 編譯提示錯誤:

printValues2(p);編譯提示錯誤:
注釋掉這兩行后,程序編譯通過,運行成功,打印出pc 數組的各個值。
較為常見的是傳遞非引用數組類型的作為參數。這樣做有一個關鍵點就是如何確保程序能夠處理數組范圍之內的數據。書上列舉出了三種方式:
1 在數組末尾放置一個標識符,用來標識數組末尾。類似的情況就像C風格字符串。
2 使用標准庫方式,傳入數組第一個元素的指針和最后一個元素的指針。
3 顯式傳遞數組大小。
先看第一種方式:
#include "stdafx.h" #include <iostream> using namespace std; void printValues_01(int *p) { while (*p) { cout << *p++ << endl; } } int main() { int temp = 0; int i[3] = {1,2,NULL}; int *p = &temp; int pc[] = {1,2,3,4,5,6,7,8,9,NULL}; printValues_01(pc); return 0; }
打印出的結果為:
第二種方式為:
#include "stdafx.h" #include <iostream> using namespace std; void printValues_02(const int* begin,const int* end) { while (begin!=end) { cout << *begin++ << endl; } } int main() { int temp = 0; int i[3] = {1,2,NULL}; int *p = &temp; int pc[] = {1,2,3,4,5,6,7,8,9,NULL}; printValues_02(pc,pc+10); return 0; }
第三種方式多加一個參數即可。