C++求任意數組長度


如果你企圖試用類似如下函數計算數組長度:

//數組退化為指針,這里算不出正確的數組長度
int get_array_length0(int a[])//這里等同於int*
{
    return sizeof(a)/sizeof(int);
}

這里sizeof(a)是返回int*指針大小,因為數組在參數傳遞的時候為地址傳遞,實際上調用這個函數int[]退化為了int*指針。

看看Xcode下的warning:

 

所以,我們需要數組在參數傳遞的時候需要使用數組引用,int (&a)[],這個聲明類型不完備(incomplete type)

這樣做的話,如果你再對a進行sizeof,則會有一個編譯錯誤:

invalid application of 'sizeof' to an incomplete type  int[] .這里sizeof計算一個數組大小,需要它的類型信息是完備的,即包含數組大小。

所以你僅可在數組定義處使用sizeof,因為定義處數組的類型信息是完備的。

並且你也沒有辦法調用這個函數,因為類型不完備,所以類型是和數組int a[5]匹配不上的。

 

於是最終,我們需要函數模板來解決這個問題。簡單來說就是  引用

//類型參數+非類型參數+數組引用
//非類型模板參數 綁定實參必須是常量表達式
template <typename T,unsigned N>
int  get_array_length(T (&array)[N]) {
    return sizeof(array)/sizeof(T);
}

//或者直接聲明為類型引用 T=Type (&)[N]
template<typename T>
int get_array_length2(T& array)
{
    return sizeof(array)/sizeof(array[0]);
}


int main()
{
    int a[5]={1,2,3,4,5};
    cout<<get_array_length(a)<<endl;
    cout<<get_array_length2(a)<<endl;
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM