ホームページ > バックエンド開発 > C++ > C の関数に配列を渡すときに sizeof() の動作が異なるのはなぜですか?

C の関数に配列を渡すときに sizeof() の動作が異なるのはなぜですか?

Barbara Streisand
リリース: 2024-11-11 17:56:03
オリジナル
1053 人が閲覧しました

C で配列を関数に渡すときの

Why Does sizeof() Behave Differently When Passing Arrays to Functions in C  ?

sizeof() の異常

C では、配列に関して sizeof() 演算子の動作が異なります。 main 関数で使用される場合よりも関数に渡されます。この矛盾は初心者にとって混乱を招く可能性があります。

配列の適切な受け渡し

配列を関数に適切に渡すには、構文:

int length_of_array(int (&arr)[N]);
ログイン後にコピー

ここで:

  • arr は関数に渡される配列です。
  • N は表す整数定数です。のサイズarray.

関数内での sizeof() の使用

関数内で sizeof() を使用する場合は、次のようになります。 true:

sizeof(arr) == N * sizeof(int);
ログイン後にコピー

説明:

  • sizeof(arr) は、配列に割り当てられた合計メモリ サイズ (それぞれのサイズの N 倍) を返します。 element (sizeof(int)).

不正な配列の問題

の渡し 提供されたコード スニペットでは、関数 length_of_array() が次のように誤って配列をポインターで渡しています。

int length_of_array(int some_list[]);
ログイン後にコピー

この間違った渡し方により、次のような問題が発生します。問題:

  • sizeof(some_list) はサイズを返します配列内の最初の要素へのポインタの値。
  • sizeof(*some_list) は、配列内の 1 つの要素のサイズを返します。
  • これらの値の除算は、関係なく常に 1 になります。

を使用した回避策テンプレート

この制限を克服するには、次のようなテンプレートベースのアプローチを使用できます。

template<size_t N>
int length_of_array(int (&amp;arr)[N])
{
    std::cout << N << std::endl; // Will output the correct array size
    return N;
}
ログイン後にコピー

キーポイント:

2 つのメソッドの本質的な違いは、配列を参照によって渡すのとポインタによって渡すことにあります。前者は配列のサイズに関する情報を保持しますが、後者は保持しません。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート