関数パラメーターとしての配列
パラメータの配列を使用した関数本体の誤った実装
#include <iostream>
using namespace std;
void ShowInf(int arr[2], int n)
{
for (int var : arr)
{
cout << var << endl;
}
}
int main()
{
int arr[] = { 1,2,3,4 };
ShowInf(arr, 2);
}
正式なパラメータとしての配列の本質(ポインタによる)
関数パラメーターが任意の形式の配列である場合、ポインターは基本的に渡されますが、ポインターの次元は異なります。
一次元ポインター |
Fun(int arr [2]) |
楽しい(arr []) |
|
楽しい(* arr) |
注: 1次元配列の場合、ここでarr [2]はarrに続く要素の数を制限しません。arr[]で配列の数を指定することは無意味で無意味です。
#include <iostream>
using namespace std;
void ShowInf(int arr[2], int n)
{
for (int i = 0; i < n; i++)
{
cout << *(arr + i) << endl;
}
}
int main()
{
int arr[] = { 1,2,3,4 };
ShowInf(arr, 3); // arr[2]不会限制arr后面跟的元素个数
}
二次元ポインター |
楽しい(arr [] [2]) |
楽しい(** arr) |
以下のために多次元配列、いくつかの違いがあります。
このパラメータが参照パラメータでない場合は、実際に渡されるポインタでもあります。したがって、1次元配列のパラメータと同様に、配列パラメータの最小次元(つまり最も外側)のサイズが不要または無意味であることを意味します。 、ただし、他の各ディメンションのサイズを指定する必要があります。
#include <iostream>
using namespace std;
void ShowInf(int arr[][2]) // 限定传入数组的第二维度的元素必须是两个,但是并未对于第一维度做出限定
{
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
cout << *(*(arr + i) + j) << endl;
}
}
}
int main()
{
int arr[][2] = { {1,2},{3,4} };
ShowInf(arr);
}
注:正式なパラメーターは「int arr [] [2]」の形式ですが、2次元配列のサイズを制限できますが、入力配列の形式を完全に制限するわけではありません。さらに、参照されていない配列パラメーターに対する参照された配列パラメーターの利点は、1次元配列について上で説明されています。
正式なパラメータとしての配列の本質(配列への参照)
「配列の最初のアドレスの単純な転送」と比較して、正式なパラメータとして配列の参照を使用すると、配列内の要素の数を制限でき、転送アドレスを使用するよりも安全です。アドレスを転送するだけで、アドレスに対応するストレージスペースのストレージがわかりません。さらに、ポインタがNULL(配列が存在しない)の場合、アドレスは正式なパラメータとして安全ではありません。配列内でアドレスをチェックして制限できたとしても、速度が遅すぎて面倒です。
「配列参照」を正式なパラメータとして使用する場合、変数参照にはストレージスペースがないため、パラメータを渡すときにこのパラメータが存在する必要があり、パラメータの受け渡しの効率が大幅に向上します。関数でパラメータを試すことができます。アクセスの範囲。さらに、アクセスする必要のある配列要素の数を渡す必要はありません。
#include <iostream>
using namespace std;
void ShowInf(int (&arr)[2]) // 限定传入数组元素必须是两个
{
for (int var:arr) // for range进行遍历
{
cout << var << endl;
}
}
int main()
{
int arr[] = { 1,2 };
ShowInf(arr);
}
可変パラメータ機能パラメータ
#include <iostream>
using namespace std;
int average(initializer_list<int> score)
{
int average = 0, n = 0;
for (int var: score) // 用for range的方式进行遍历
{
average += var;
n++;
}
return (average / n);
}
int main()
{
cout << average({ 2, 3, 4 }) << endl; // 注意数据输入格式{Data1,Data2…}
}
ここで、使用するinitializer_list <DataType>は変数テンプレートパラメーターであり、入力する変数はデフォルトでconstタイプであり、変更できないことに注意する必要があります。実際、プログラミングの良い習慣を身に付ける必要があります。「関数に渡すパラメーターは、関数本体でのみ使用され、変更するのではありません」。