c++配列名を関数パラメータとして配列要素を対応する演算

2541 ワード

配列名を関数パラメータとして使用するのは、配列要素を実パラメータとして使用するのといくつかの点が異なります.
(1)配列要素を実パラメータとする場合,配列タイプと関数のパラメータ変数のタイプが一致する限り,下付き変数としての配列要素のタイプも関数のパラメータ変数のタイプと一致する.したがって,関数を必要としないパラメータも下付き変数である.すなわち,配列要素の処理は通常変数で扱われる.配列名作関数パラメータを使用する場合、パラメータと対応する実パラメータは同じタイプの配列でなければならず、明確な配列説明が必要です.パラメータと実パラメータの両方のタイプが一致しない場合、エラーが発生します.
(2)一般変数または下付き変数を関数パラメータとする場合,パラメータ変数と実パラメータ変数はいずれもコンパイルシステムによって割り当てられた2つの異なるメモリユニットである.関数呼び出し時に行われる値伝達は,実パラメータ変数の値をパラメータ変数に与える.配列名を関数パラメータとする場合,値の伝達を行うのではなく,実パラメータ配列の各要素の値を形パラメータ群の各要素に与えるのではない.実際にはシェイプパラメータグループは存在しないため、コンパイルシステムはシェイプパラメータ配列にメモリを割り当てません.配列名は配列のヘッダアドレスだからです.したがって,配列名を関数パラメータとして用いる場合の伝達は実際にはアドレスの伝達であり,すなわち実パラメータ配列のヘッダアドレスを形パラメータ群名に付与する.パラメータ配列名は,このヘッダアドレスを取得すると,具体的なアドレスがあることに等しい.実際には、パラメトリック配列と実パラメトリック配列が同じ配列であり、メモリ領域が共通に使用されます.
 
  
// : score, 10 , 。

#include
#include
#include
#include
float average(float array[10])
{   int i;
    float aver,sum=array[0];
    for(i=1; i<10; i++)
        sum=sum+array[i];
    aver=sum/10;
    return aver;
}
void main()
{   float score[10],aver;
    int i;
    printf("input 10 score:
");
    for(i=0; i<10; i++)
        scanf("%f",&score[i]);
    printf("
");
    aver=average(score);
    printf("average score is %5.2f
",aver);
}


説明:
(1)配列名作関数パラメータを用いて,主調関数と被調関数のそれぞれに配列を定義すべきである.(2)実パラメトリック配列とパラメトリック配列タイプが一致しなければならない.一致しないと、結果はエラーになる.(3)実際には,Cコンパイラは,パラメトリック配列の大きさをチェックせず,パラメトリック配列のヘッダアドレスをパラメトリック配列に渡すだけであるため,被変調関数におけるパラメトリック配列の大きさを指定することは何の役にも立たない.(4)パラメトリック配列はサイズを指定せずに配列を定義する際に配列名の後に空の中括弧を付けることもでき、被変調関数で配列要素を処理する必要があるために、配列要素の個数を渡すパラメータを別途設定することができる.
 
  
#include
#include
#include
#include
float average(float array[],int n)
{   int i;
    float aver,sum=array[0];
    for(i=1; i        sum=sum+array[i];
    aver=sum/n;
    return aver;
}
void main()
{   float score1[5]= {98.5,97,91.5,60,55};
    float score2[10]= {67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5};
    printf("the average of class A is %6.2f
",average(score1,5));
    printf("the average of class B is %6.2f
",average(score2,10));
}