本文介紹了三種在函式中以陣列作為形參時的處理方法,重點介紹c++11標準是如何管理陣列大小的。陣列的兩個特殊性質對我們定義和使用作用在陣列上的函式有影響,這兩個性質分別是:
不允許拷貝陣列以及使用陣列時通常會將其轉換成指標。因為不能拷貝陣列,所以我們無法以值傳遞的方式使用陣列引數。因為陣列會被轉換成指標,所以當我們為函式傳遞乙個陣列時,實際上傳遞的是指向陣列首元素的指標。
儘管不能以值傳遞的形式傳遞陣列,但是我們可以把形參寫成類似陣列的形式:
//儘管形式不同,但這三個print函式是等價的
//每個函式都有乙個const int*型別的形參
void print(const
int*);
void print(const
int);
void print(const
int[10])//這裡的維度表示我們期望陣列含有多少元素,實際不一定
當編譯器處理對print函式的呼叫時,只檢查傳入的引數是否是const int*型別:
int i = 2;
int j[2] = ;
print(&i); //正確,&i的型別是int*
print(j); //正確,j被轉換成int
*並指向j[0]
如果我們傳給print函式的是乙個陣列,則實參自動地轉換成指向首元素的指標,陣列的大小對函式的呼叫沒有影響。
由於陣列實際上是以指標的形式傳遞給函式的,因此一開始函式並不知道陣列的確切尺寸,呼叫者應該為此提供額外的一些資訊。管理指標形參有三種常用的技術:
這種方法要求陣列本身包含乙個結束標記,使用這種方法的典型示例是c風格字串。c風格字串儲存在字元陣列中,並且在最後乙個字元後面跟著乙個空字元。函式在處理c風格字串時遇到空字元就停止:
void print(const
char *cp)
}}
這個方法適用於那些有明顯結束標記且該標記不會與普通資料混淆的情況。
這種方法是專門定義乙個表示陣列大小的形參,在c程式和過去的c++程式中常常使用這種方法。
//const int ia等價於const int *ia
//size表示陣列的大小,將它顯示地傳給函式用於控制對ia元素的訪問
void print(const int ia,size_t size)
}
這種方法通過形參size的值確定要輸出多少個元素,呼叫print函式時必須傳入這個表示陣列大小的值:
int j
= ;print(j,3);
c++11標準引入兩個名為begin和end的函式,begin函式返回指向陣列首元素的指標,end函式返回指向陣列尾元素下一位置的指標,這兩個函式定義在iterator標頭檔案中。
示例**如下:
#include
using
namespace
std;
int main()
; int *pbeg = begin(arr); //指向arr首元素的指標
int *pend = end(arr); //指向arr尾元素的指標
//尋找第乙個負值元素,如果已經檢查完全部元素則結束迴圈
while(pbeg != pend && *pbeg >= 0)
cout
<<*pbeg}
對於本文的print函式,可以寫成如下形式:
void print(const
int *beg, const
int *end)
int a = ;
print(begin(j),end(j));
C 中陣列作為形參的方法
有兩種傳遞方法,一種是function int a 另一種是function int a 這兩種兩種方法在函式中對陣列引數的修改都會影響到實參本身的值!對於第一種,根據之前所學,形參是實參的乙份拷貝,是區域性變數。但是陣列是個例外,因為陣列的資料太多了,將其一一賦值既麻煩又浪費空間,所以陣列作為引數...
C 中陣列作為形參的方法
有兩種傳遞方法,一種是function int a 另一種是function int a 這兩種兩種方法在函式中對陣列引數的修改都會影響到實參本身的值!對於第一種,根據之前所學,形參是實參的乙份拷貝,是區域性變數。但是陣列是個例外,因為陣列的資料太多了,將其一一賦值既麻煩又浪費空間,所以陣列作為引數...
C 中函式作為形參傳遞
規定 沒有括號的函式名被認為是乙個指向該函式的函式指標 如 void add 這裡的add就是指向該函式的指標 語法 函式返回值的型別 作為指標的函式名 該函式的引數 如 void visit int a,int b 如果有個函式swep要呼叫某個函式,那麼 swep void visit int ...