-1

重複の可能性:
C プログラミング言語の配列のサイズ?
sizeof(param_array) がポインタのサイズなのはなぜですか?

void printSizeOfArray(int a[])
{
    printf("%lu\n", sizeof(a));
}

int main()
{
    int it;
    int a[4] = {0};
    printSizeOfArray(a);

    return 0;
}

コードを実行すると 8 が表示されます。配列へのポインターが void 型のポインターであるのはなぜですか?

そして、配列へのポインターが void 型の場合、なぜ、次のように書くと:

int *it;
int a[4] = {0};
it = a;
printf("%lu\n", sizeof(it));

それも正常に動作しますか?でポイントするにはどうすればよいintですか?

また、2 番目に 4 ではなく 8 を出力するのはなぜですか? 配列 ( void*) へのポインタであり、 ではありませんint

4

3 に答える 3

1

C の配列は、多くの場合、最初の要素へのポインターだけに "崩壊" します。お気づきのように、このポインターは配列のサイズに関する情報を保持しません。配列が関数に渡されると、このような減衰が発生します。

適切なサイズは、スコープ内の適切な宣言でのみ計算できます。したがって、関数に対して機能させることができますが、配列のサイズは関数のプロトタイプの一部になり、ほとんど役に立ちません。

void printSizeOfArray(int a[3]);

これが、典型的な C コードが常にサイズを個別に渡す理由です。

基本的に、配列に対する C のサポートは「弱い」です。

于 2012-11-06T12:09:56.377 に答える
1
int *a;    // this is a pointer
int arr[]; // this is an array. not a pointer, not a "pointer to void"

Why is a pointer to an array a pointer of type void?

  • そうではありません。それは配列です。関数に渡すと、へのポインターに崩壊しますint。なぜだと思いますvoid *か?

When I run the code I get 8.

  • これは、64 ビット システムでのポインターのサイズです。これを試して:

    int *a;
    printf("%d\n", sizeof(a));

  • システム上のポインターは 8 バイトを使用するため、8 であることがわかります。

And if a pointer to an array is of type void, why, when I write: int *it = a; It works ok as well? How can I point with an int?

  • これは、へのポインターに崩壊するためintです。は型がないため、 aを使用してそれを指すこともできます(何でも指すことができます)。void *void *

Also, why does it print 8 in the second and not 4?

  • 4 を出力することはありません。「なぜ 32 ではなく 8 を出力するのですか?」という質問をする必要があります。これはint、システム上のへのポインターを表すバイト数であり、 へのポインターであるため、8 を出力しています。実行した場合は、結果が表示されるはずなので、システムまたは.itintsizeof(a)<array_size> * sizeof(int)4*832
于 2012-11-06T12:42:21.140 に答える
0

これは、関数呼び出しでarrays減衰するためpointersです。したがって、配列名で関数を呼び出すと、関数の引数は実際にはその型のポインターであるため、そのマシンsizeof()のサイズが得られます。そのため、8 が出力されます。pointer

1つのことに注意してください:

void printSizeOfArray(int a[])

void printSizeOfArray(int *a)

同じです

于 2012-11-06T12:10:09.373 に答える