1. 程式人生 > >在函式中以陣列作為形參

在函式中以陣列作為形參

說明:

陣列的兩個特殊性質對我們定義和使用作用在陣列上的函式有影響,這兩個性質分別是:

  • 不允許拷貝陣列;
  • 使用陣列時通常會將其轉換成指標。

因為不能拷貝陣列,所以我們無法以值傳遞的方式使用陣列引數。 因為陣列會被轉換成指標,所以當我們為函式傳遞一個數組時,實際上傳遞的是指向陣列首元素的指標

儘管不能以值傳遞的形式傳遞陣列,但是我們可以把形參寫成類似陣列的形式:

//儘管形式不同,但這三個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;
}

這裡寫圖片描述