天天看點

C/C++傳入數組及怎樣限定傳入數組的大小

很多人c和c++的初學者都知道這樣一個事實:數組不能直接作為函數的形參,當傳入一個數組名時,數組會退化為對應的指針類型。

例如考慮如下函數:

void chuanrushuzu(int a[])
{
    return;//沒有實質内容,隻是為了說明數組的傳入
}
           

這裡函數的形參雖然指定了數組的大小,但實質上編譯器是不認的,在編譯器眼中,被傳入的隻是一個int*類型的指針,也就是說,在此例的函數中,int a[10]等價于int* a,你傳入的數組名無論其實際大小是多少,隻要類型正确,都能通過編譯。

那是不是就沒有辦法限定傳入數組的大小了呢,方法是有的!

那就是利用指針(c/c++)或引用。

下面舉一個利用引用的例子:

#include<iostream>
using namespace std;

void dingchangshuzu(int (&p)[])
{
    cout<<"傳入了定長數組"<<endl;
}

int main()
{
    int p1[]={};
    int p2[]={};
    int p3[]={};
    int* p4=new int[]();

    dingchangshuzu(p1);//error C2664: “dingchangshuzu”: 不能将參數 1 從“int [5]”轉換為“int (&)[10]”
    dingchangshuzu(p2);//通過
    dingchangshuzu(p3);//error C2664:不能将參數 1 從“int [15]”轉換為“int (&)[10]”
    dingchangshuzu(p4);//error C2664:不能将參數 1 從“int *”轉換為“int (&)[10]”

    return ;
}
           

這裡,int (&p)[10]定義了一個含有10個元素的數組的引用,引用在形參表中不會退化,是以當傳入大小不一緻的數組時,編譯不能通過。

利用指針的例子也類似

隻要把int (&p)[10]替換成int (*p)[10],傳入數組名的時候對數組名取位址(形如&p1)即可,留給感興趣的讀者自己嘗試,由于c語言不支援引用,是以這種方式可以用作c環境下的程式設計。

總結一下,C/C++之是以不支援定長數組的直接傳入,是因為數組名在傳入形參時會進行一次退化,那既然這樣,我們的應對方式就是繞過這次退化,傳入數組名的引用或指向數組名的指針。

繼續閱讀