2011-12-29 20 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

+1

C++ 11をお持ちでない場合は、 'boost :: array'を使用することができます。これは多かれ少なかれ同じことです。 – Grizzly

答えて

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

Benjaminより。 cで同じことをする方法を教えてもらえますか? –

+5

@sidharthsharma:いいえ、できません。 –

+0

@sidharth sharma:関数の引数として渡されたとき(そして多くの場合)、C配列**の崩壊**をポインタに記述することはできません。したがって、明示的にサイズを渡す必要があります。 –

1

これはできません。サイズ情報を保持する配列を渡す方法はありません。あなたはそれを自分でやる必要があります。追加のパラメータとしてカウントを渡す必要があります。

+0

これは真実ではありません - ベンジャミンの答え – Flexo

+0

@awoodlandを参照してください。しかし、これは不正ですか?明示的にディメンション化された配列宣言が有効範囲内にある場合にのみ機能します。 'int myfunction(int [] a)'があれば動作しません。 –

関連する問題