2011-12-29 32 views
0

這個問題一直困擾我,因爲永遠。我有一個數組,並且在它的聲明範圍內,我可以使用sizeof運算符來確定其中的元素數量,但是當我將它傳遞給函數時,它將解釋爲指向數組開頭的指針以及sizeof運算符只是給了我這個指針變量的大小。如下例所示,C/C++中參數傳遞和數組範圍

#include<iostream> 
int count(int a[]){ 
    return (sizeof(a)/sizeof(int)); 
} 
int main(){ 
    int a[]={1,2,3,4,5}; 
    std::cout << sizeof(a)/sizeof(int) << " " << count(a) << std::endl; 
    return 0; 
} 

該代碼的輸出爲5 2。如何將數組傳遞給該函數,以便我可以通過僅使用sizeof運算符來確定其大小,並且不必將額外大小作爲參數傳遞給此函數?

+4

還要考慮'std :: array'(你需要一個C++ 11編譯器)。 – jrok 2011-12-29 20:02:21

+1

如果你沒有C++ 11,你可以使用'boost :: array',這或多或少是與Benjamin相同的東西 – Grizzly 2011-12-29 20:25:07

回答

6
template<size_t N> 
int count(int (&a)[N]) 
{ 
    return N; 
} 
+0

。你能告訴我如何在c中做同樣的事情嗎? – 2011-12-29 18:43:56

+5

@sidharthsharma:不,我不能。 – 2011-12-29 18:47:42

+0

@sidharth sharma:當你作爲一個函數參數傳遞(在許多其他情況下)時,不能像你在C數組中描述的那樣完成** decay **。所以你需要明確地通過尺寸。 – 2011-12-29 18:48:04

1

你不能那樣做。沒有辦法傳遞一個數組,以使它攜帶它的大小信息。你必須自己做。您必須將計數作爲附加參數傳遞。

+0

這不是真的 - 見本傑明的回答 – Flexo 2011-12-29 21:41:03

+0

@awoodland但是,這是作弊,不是嗎?它只適用於顯式維數組聲明在範圍內。如果我有'int myfunction(int [] a)'',它將不起作用。 – 2011-12-29 21:53:41