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;
}