在函式中以陣列作為形參
阿新 • • 發佈:2018-12-10
說明:
陣列的兩個特殊性質對我們定義和使用作用在陣列上的函式有影響,這兩個性質分別是:
- 不允許拷貝陣列;
- 使用陣列時通常會將其轉換成指標。
因為不能拷貝陣列,所以我們無法以值傳遞的方式使用陣列引數。 因為陣列會被轉換成指標,所以當我們為函式傳遞一個數組時,實際上傳遞的是指向陣列首元素的指標。
儘管不能以值傳遞的形式傳遞陣列,但是我們可以把形參寫成類似陣列的形式:
//儘管形式不同,但這三個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] = {1,2};
print(&i); //正確,&i的型別是int*
print(j); //正確,j被轉換成int*並指向j[0]
如果我們傳給print函式的是一個數組,則實參自動地轉換成指向首元素的指標,陣列的大小對函式的呼叫沒有影響。
案例說明:
下面以一個例子來說明陣列作為形參被傳遞時,傳遞的是指向陣列首元素的指標
#include<iostream>
using namespace std;
int arraylength(int a[])
{
int len = sizeof(a) / sizeof(a[0]);
cout << "len_of_arraylength: " << len << endl;
return 0;
}
int main()
{
int a[13] = { 5, 16, 39, 45, 51, 98, 100, 202, 226, 321, 368, 444, 501 };
int len = sizeof(a) / sizeof(a[0]);
cout << "len_of_main: " << len << endl;
arraylength(a);
return 0;
}
由於陣列實際上是以指標的形式傳遞給函式的,因此一開始函式並不知道陣列的確切尺寸,呼叫者應該為此提供額外的一些資訊。管理指標形參有三種常用的技術:
顯示傳遞一個表示陣列大小的形參
專門定義一個表示陣列大小的形參
#include<iostream>
using namespace std;
//const int a[]等價於const int *a
//len表示陣列的大小,將它顯示地傳給函式用於控制對a元素的訪問
void print(const int a[],int len) //顯示傳遞一個表示陣列大小的形參
{
for (int i = 0; i < len;i++)
cout <<"a["<<i<<"]="<< a[i]<< endl;
}
int main()
{
int a[6] = { 5, 16, 39, 45, 51, 98};
int len = sizeof(a) / sizeof(a[0]);
print(a,len);
return 0;
}
使用標記指定陣列長度
使用標準庫函式begin和end
C++11標準引入兩個名為begin和end的函式,begin函式返回指向陣列首元素的指標,end函式返回指向陣列尾元素下一位置的指標,這兩個函式定義在iterator標頭檔案中。
示例程式碼如下:
#include<iostream>
using namespace std;
void print(const int *abeg, const int *aend)
{
while (abeg < aend)
{
cout << *abeg<< " ";
abeg++;
}
cout << endl;
}
int main()
{
int a[6] = { 5, 16, 39, 45, 51, 98 };
int *abeg = begin(a);
int *aend = end(a);
print(abeg,aend);
return 0;
}