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));
return 0;
}
実行結果:
Average of 2, 3, 4, 5 = 3.500000 Average of 5, 10, 15 = 10.000000
average()関数が2回呼ばれており、それぞれ最初の引数が可変引数の総数を表しています。可変引数の受け渡しには省略記号のみを使用します。
C言語
- C言語ユーザー定義関数の4つの実証済みパターン
- C言語ストレージクラス完全理解:スコープ・ライフタイム・パフォーマンス
- C言語で1次元・2次元配列を関数に渡す方法 – 実践ガイド
- C++変数とデータ型:int、double、char、string、boolを徹底解説
- C 言語の変数、データ型、定数 – 実践ガイド
- C言語の変数を理解する:型、命名規則、メモリ管理
- C言語の関数マスター:構造、宣言、ベストプラクティス
- C言語ポインタ完全マスター:実践的ステップで上級プログラミングへ
- C言語ビットフィールド:メモリ効率を最大化するテクニック
- Verilog代入文の理解:種類、構文、ベストプラクティス
- Python 関数引数完全マスター: 位置引数・キーワード引数・デフォルト引数