如何求數組的大小 C++

來源:互聯網
上載者:User

c++中,求一個數組的大小,一般用sizeof(p)/sizeof(p[0]) 就可以了。但因為數組作為非引用參數傳遞的時候,會退化為指標,所以這樣直接用sizeof來計算數組大小,可能會存在潛在的錯誤。


輸出結果為

main:: sizeof() = 10
fun:: sizeof() = 1

可以看到調用fun後數組的大小成了1,這顯然不是我們想要的

下面介紹兩種可以正確計算數組大小的方法:
1 注意到,對一個指標 T *p, 那麼 &p 的類型為T **p。而對數組 int array[10],&array 的類型為 int (*)[10],所以根據這一特徵,可以實現一個重載函數check,當參數類型為一個普通指標時,返回class No;而class No因為沒有定義,所以sizeof(No)在編譯期會報錯,而當參數為數組時,因為一般的指標都可以轉為void
*類型,則選擇Yes check(void *,void *);
代碼如下:
________________________________________
#include <iostream>using namespace std;class No;
class Yes {};template<typename T>
No check(const T *, const T * const *);Yes check(void *,void *);#define SizeOf( p ) ( sizeof( check((p),&(p)) ), sizeof(p)/sizeof(p[0]) )int main()
{
int array[10];int *p = array;
//sizeof(check(p,&p));cout << SizeOf(array) << endl;int array2[10][10]; //對多維陣列並不適用cout << SizeOf(array2) << endl;
cout << sizeof(array2[0]) << " " << sizeof(array2) << endl;return 0;
}
_______________________________________________
2 當定義一個數組的引用時,數組並不會退化為指標,所以可以定義一個返回數組引用的模版函數。
代碼如下:
_______________________________________________
#include <iostream>using namespace std;template<typename T, size_t N>
char (&size(T (&)[N]))[N];#define SizeOf( p ) sizeof( size(p) )int main()
{
char array[10];cout << SizeOf(array) << endl;return 0;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.