配列の値を関数に渡すとき、C++コンパイラ は、配列の名前(配列が始まるアドレス)を関数 に渡します。なぜC++コンパイラは配列の内容全体ではなく、 配列の名前だけを関数に渡すのですか?関数に渡す配列
関数に渡す配列
答えて
あなたの質問は間違っています。あなたが機能f
にfoo
の名前を渡していない
int foo[5] = {1,2,3,4,5};
f(foo);
を書くとき、あなたはfoo
の最初の要素へのポインタを渡しています。関数f
はint*
を得ており、int
の大きさを知っているので、2番目、3番目、4番目の要素を探すためにどのくらい先にメモリにあるのかを知っています。これは配列を実装するための最小の最小値なので、それが普及した理由です。
C++ 11では、大きさを知る配列を渡すには、std::array
を使用します。これは、それがどのように大きな知っている配列である:
#include <array>
std::array<int, 5> foo {1,2,3,4,5};
f(foo);
foo[42] = 1; // compile-time error!
あなたはそれがarray
がどのように大きな知っているようf
記述する必要があるしかし:
void f(const std::array<int, 5>& ai); // this works
またはそれをテンプレートにし、それがいずれかを取ることができるようにしますサイズアレイ:
template<size_t Size>
void f(const std::array<int, Size>& ai);
(または任意のタイプのアレイも:)
template<typename T, size_t Size>
void f(const std::array<T, Size>& a);
または、std::vector
にデータを格納します。彼らは時々std::array
や、組み込み配列よりも効率だが、多くの、より柔軟:
std::vector<int> foo {1,2,3,4,5};
f(foo);
...
void f(const std::vector<int>& foo);
「なぜ」簡単です。それが標準が言うものだからです。
[§4.2 ¶ 1]
タイプの左辺または右辺値「N Tの配列」または「Tの を結合し、未知の配列は、」タイプ「Tへのポインタ」のprvalueに変換することができます。 一時的なマテリアライゼーション変換([conv.rval])が適用されます。 結果は配列の最初の要素へのポインタです。単一の名前が単一 範囲にいくつかの異なる機能のために使用することができる
。これは関数のオーバーロードです(Clause [over])。関数のすべての宣言 は、戻り型とパラメータ型リストの両方で正確に一致しなければならない。関数のタイプは、規則に従って を使用して決定されます。各パラメータのタイプ(ファンクションパック を含む)は、それ自身のdecl-specifier-seqと 宣言子から決定されます。各パラメータのタイプを決定した後、タイプ "array of T"または関数タイプTの パラメータは "Tへのポインタ"に調整されます。パラメータタイプのリストを生成した後、 ファンクションタイプを構成するときに、パラメータタイプを変更する最上位のcv修飾子 が削除されます。変換されたパラメータ のタイプの結果のリストと、省略記号またはファンクションパックの有無は、ファンクションのパラメータタイプリストです。 [注:この 変換はパラメータの種類には影響しません。 の例では、
int(*)(const int p, decltype(p)*)
とint(*)(int, const int*)
は同じタイプです。 - エンドノート]
- 1. JavaScript配列を関数に渡す
- 2. 2D配列をスレッド関数に渡す
- 3. 文字配列を関数に渡す
- 4. PHP配列をJavaScript関数に渡す
- 5. ejs配列をjavascript関数に渡す
- 6. 配列をルビ関数に渡す
- 7. 関数に渡すPHP配列リファレンス
- 8. javascript onclick関数に配列を渡す
- 9. 配列を関数に渡す
- 10. C++関数に配列を渡してから別の関数に渡す
- 11. C++関数内で関数を配列に渡す方法
- 12. 配列をC関数に渡すPostgreSQLの集約関数
- 13. C++ポインター配列関数がアドレス渡し
- 14. JavaScript関数のパラメータ渡し配列
- 15. C:関数渡し配列入力
- 16. 変更する関数に文字列配列を渡す
- 17. 配列を関数に渡して文字列をスキャンする
- 18. 文字列の配列をPowerShell関数に渡す
- 19. 配列をscanfの関数と変数に渡す
- 20. VBAからvb.net関数に配列変数を渡す方法
- 21. ある関数から別の関数に配列を渡すには
- 22. 配列を関数に渡すのに問題がある
- 23. 配列をBash関数に渡すには?
- 24. 動的にサイズの2D配列を関数に渡す
- 25. PHP:オブジェクトのメンバ関数に配列を渡すには?
- 26. Powershell:配列を関数に渡すときにWhatIfを使う
- 27. C#関数からVBAに配列を渡すには?
- 28. jQueryである関数から別の関数に配列を渡します。
- 29. インターフェイスの配列を関数に渡しますか? PHPで
- 30. int配列へのポインタをテンプレート関数に渡します
このように言語が定義されている理由についての説明は、一般的なコンピューティングの歴史と特にこのサイトでは広すぎるプログラミング言語に関する論文です。 –