関数パラメーターとしての配列の本質とC ++スタイルの変形可能なパラメーター関数形式

関数パラメーターとしての配列

パラメータの配列を使用した関数本体の誤った実装

#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タイプであり、変更できないことに注意する必要があります。実際、プログラミングの良い習慣を身に付ける必要があります。「関数に渡すパラメーターは、関数本体でのみ使用され、変更するのではありません」。

 

おすすめ

転載: blog.csdn.net/weixin_45590473/article/details/108699625