ホームページ  >  記事  >  バックエンド開発  >  C 関数の配列引数に対して「sizeof()」の動作が異なるのはなぜですか?

C 関数の配列引数に対して「sizeof()」の動作が異なるのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-12 01:35:02801ブラウズ

Why Does `sizeof()` Behave Differently for Array Arguments in C   Functions?

配列引数の関数で sizeof() の動作が異なる場合

C で配列を関数に渡すときは、次のことを理解することが重要ですsizeof() が main 関数で使用した場合と同様に機能しないのはなぜですか。

配列がポインターに減衰する

配列がメソッドを持つ真のオブジェクトである Java のような言語とは異なります。 C では、プロパティは単なるポインターです。配列が引数として関数に渡されると、配列の最初の要素へのポインターに減衰します。

sizeof() on Pointers vs. Arrays

main 関数で、配列に適用される sizeof() は、すべての要素を含む配列の合計サイズをバイト単位で返します。ただし、関数内の配列への減衰ポインタに対して sizeof() が使用されると、ポインタ自体のサイズが返されます。これは通常、整数型 (例: sizeof(int)) のサイズになります。

配列サイズを決定するための回避策

ポインターに減衰した配列のサイズを決定するには、folgende コードを使用できます。

int length_of_array(int* some_list)
{
    // Not applicable here, but see below for when it might be
    
    return 0;
}

例外: 参照によって渡された配列

配列の減衰ルールには例外が 1 つあります。配列は参照によって渡すこともでき、配列のサイズ情報にアクセスできます。この構文は次のとおりです。

template<size_t N>
int length_of_array(int (&amp;arr)[N])
{
    // Size of the array can be determined via the template parameter N
    
    return N;
}

この場合、N は渡される配列のサイズを表し、配列の長さを正確に決定するために使用できます。

以上がC 関数の配列引数に対して「sizeof()」の動作が異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。