2017-01-11 1 views
0

私はsizeof(array)/sizeof(*array)を印刷して番号3を受け取りましたが、私の配列に関数を渡すと、変数に格納されたときに2が出力され、そのために必要な時間が1つ少なくなります。なぜ私は予想より短い時間で反復するのですか?

void printAry(int ary[]) 
{ 
    int size = sizeof(ary)/sizeof(ary[0]); 
     cout<<size;//size will print out 2! why? 
     for(int i = 0; i < size;i++) 
    { 
     cout<<ary[i]; 
    } 
} 

int main() { 
    int ary[3] = {1,2,3}; 
    cout<<sizeof(ary[0]); 

    return 0; 
} 

1回の繰り返しが予想よりも少ないのはなぜですか?

+2

配列は関数内で_pointer_と解釈されているため、問題です。さらに悪いことに、配列全体ではなく、関数に 'ary'という単一のmember_を渡しています。 – ForceBru

+0

'ary'は' printAry'のポインタであり、 'intの配列 'ではありません。 – BLUEPIXY

答えて

4

アレイがポインタに崩壊する理由は、です。

基本的に

void printAry(int ary[]) 

と同等です:

void printAry(int* ary) 

のでsizeof(ary)は、システム上のintへのポインタのサイズに等しいです。

+0

気にしない場合:私は "int"へのポインタを追加しました。すべてのポインタが必ずしも同じサイズである必要はありません。 – Bathsheba

+0

@Bathshebaはい、たとえば、関数へのポインタは別のサイズを持つことがあります。いい視点ね! –

+0

プリミティブにも当てはまります。 'sizeof(int *)'は 'sizeof(long *)'と異なるかもしれません。 – Bathsheba

4

それはすでにがポインタ型にを減衰していますので、aryが関数のパラメータである場合は、sizeof(ary)/sizeof(ary[0])イディオムを使用することはできません。sizeof(ary)は単にあなたのプラットフォーム上でintへのポインタのサイズです。 Cでは

は、明示的にサイズ情報を渡し、または特定の値が配列の終わり知らせることを慣例を採用する必要があります(C標準ライブラリの文字列関数で参照'\0'を。)

C++では、 std::vectorを使用できます。

関連する問題