2

重複の可能性:
配列のサイズの計算
C プログラミング言語での配列のサイズ?

なぜ機能しsizeof(arr)/(double)sizeof(arr[0])、機能しsizeof(arr+0)/(double)sizeof(arr[0])ないのですか?

sizeof(arr)/(double)sizeof(arr[0])また、arr が関数に渡されたときにも機能しないのはなぜですか? 完全なコード例は次のとおりです。

#include <iostream>

using namespace std;

int givesize(int arr[])
{
   cout<<sizeof(arr)/(double)sizeof(arr[0])<<"\n";
}

int main()
{
   int arr[] = {1,2,3,4,5};
   cout<<sizeof(arr)/(double)sizeof(arr[0])<<"\n";
   cout<<sizeof(arr+2)/(double)sizeof(arr[0])<<"\n";
   givesize(arr);
   return 0;
}

出力 5 1 1

4

4 に答える 4

4

これは、ポインターを引数として受け取る関数に配列が渡されると、配列がポインターに減衰するために発生します。

あなたの中mainに、

int arr[] = {1,2,3,4,5};

宣言は次と同等です

int arr[5] = {1,2,3,4,5};

5コンパイラには、集計初期化子から計算するのに十分な情報があるためです。ただし、関数ヘッダーではint arr[]、同じことを意味するわけではありません。整数へのポインター以外のものであることをコンパイラーに伝えるコンテキストはありません。

于 2012-07-07T15:35:15.937 に答える
2

int arr[]関数の引数リストの は と同じint* arrです。つまり、次のようになります。

int givesize(int arr[])
{
   cout<<sizeof(arr)/(double)sizeof(arr[0])<<"\n";
}

sizeof(arr)/(double)sizeof(arr[0])は実際にsizeof(int*) / (double)sizeof(int)132ビットプラットフォームを意味する出力として。

int arr[]ローカル変数は と同じではないため、int* arrは5 に評価されるsizeof(arr)/(double)sizeof(arr[0])と同じです。sizeof(int[5]) / (double)sizeof(int)

次に、式のタイプが であるため、sizeof(arr+2)/(double)sizeof(arr[0])も と同じです。sizeof(int*) / (double)sizeof(int)arr+2int*

于 2012-07-07T15:41:25.487 に答える
0

main 内では、arr は「5 つの int の配列」型を持ちますが、arr+0 は「int へのポインター」型を持ちます。arr にゼロを追加すると、ポインタのように扱われ、配列をポインタのように使用するとすぐにポインタに変換されます。

于 2012-07-07T15:39:13.757 に答える
0

sizeof(arr)/(double)sizeof(arr[0]) が機能する理由

配列全体のサイズをバイト単位で返し ( 32 ビットとsizeof(arr)仮定して 20 としましょう)、最初の int のサイズ (4 バイト) を返すためです。これで 5 が得られます。intsizeof(arr[0])

arr が関数に渡されたときに sizeof(arr)/(double)sizeof(arr[0]) も機能しないのはなぜですか?

配列はポインターに崩壊するためです。これは、重要な情報、つまりサイズが失われることを意味します。ポインタだけで配列のサイズを直接計算することはできません。そもそも関数がそれが配列であることをどうやって知るのでしょうか?


C++? テンプレート関数を使用します。

template <typename T, int N>
int getsize(const T (&arr)[N])
{
    return N;
}
于 2012-07-07T15:45:41.223 に答える