C変数パラメータ


場合によっては、関数が事前に定義された数ではなく可変数のパラメーターを受け取りたいという状況に遭遇することがあります。 C 言語は、特定のニーズに応じて可変数の引数を受け入れる関数を定義できるようにすることで、この状況に対する解決策を提供します。次の例は、そのような関数の定義を示しています。

int func(int, ... ) {   .   .   .}int main(){
   func(1, 2, 3);
   func(1, 2, 3, 4);}

関数 func() の最後のパラメーターは省略記号、つまり 3 つのドット (...) として記述されることに注意してください。省略記号の前のパラメーターは常に int であり、これは を表します。渡される変数パラメータの合計。この機能を使用するには、可変長引数機能を実装する関数とマクロを提供する stdarg.h ヘッダー ファイルを使用する必要があります。具体的な手順は次のとおりです:

  • 関数を定義します。最後のパラメータは省略記号で、省略記号の前のパラメータは常にintで、パラメータの数を示します。

  • 関数定義内に va_list 型変数を作成します。この型は stdarg.h ヘッダー ファイルで定義されます。

  • intパラメータとva_startマクロを使用して、va_list変数をパラメータリストに初期化します。マクロ va_start は、stdarg.h ヘッダー ファイルで定義されます。

  • 引数リストの各項目にアクセスするには、va_argマクロとva_list変数を使用します。

  • マクロva_endを使用して、va_list変数に割り当てられたメモリをクリーンアップします。

次に、上記の手順に従って、可変数の引数を受け取り、その平均値を返す関数を作成しましょう:

#include <stdio.h>#include <stdarg.h>double average(int num,...){

    va_list valist;    double sum = 0.0;    int i;    /* 为 num 个参数初始化 valist */
    va_start(valist, num);    /* 访问所有赋给 valist 的参数 */    for (i = 0; i < num; i++)    {
       sum += va_arg(valist, int);    }    /* 清理为 valist 保留的内存 */
    va_end(valist);    return sum/num;}int main(){
   printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5));
   printf("Average of 5, 10, 15 = %f\n", average(3, 5,10,15));}

上記のコードをコンパイルして実行すると、次の結果が生成されます。関数 average() が 2 回呼び出され、各回の最初のパラメータが渡される変数パラメータの合計数を表すことに注意してください。省略記号は、可変数の引数を渡すために使用されます。

りー