c言語における可変パラメータリストの簡単な理解


関数プロトタイプでは一般的にパラメータの数は固定されていますが、異なる場合に不定数のパラメータを受信したい場合はどうすればいいのでしょうか.c言語は可変パラメータリストを提供して実現する.
可変パラメータリストは、stdarg.hのヘッダファイルに定義されたマクロによって実現される.ヘッダファイルにva_が宣言されましたlistタイプとva_start、va_arg、va_end 3マクロ.可変パラメータリストを使用する場合はva_を宣言する必要があります.Listタイプの変数は、この3つのマクロと組み合わせて使用されます.
va_start(va_list変数名、省略記号の前の最後の名前のあるパラメータ):可変パラメータを抽出する前に、このマクロを呼び出して初期化する必要があります.
va_Arg(va_list変数名,type_of_var):変数を抽出するために使用され、type_of_varは抽出された変数のタイプです.対応するタイプのパラメータを返します.
va_end(va_list変数名):パラメータ処理が完了した後、va_を呼び出す必要があります.endは掃除をします.
次の例はcとポインタから抜粋する
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>
#include<string.h>
float average(int n_value,...)  //          
{
 va_list var_arg;      //  va_list  
 int count = 0;
 float sum = 0;
 va_start(var_arg, n_value);  //        
 {
  for (count = 0; count < n_value; count++)
  {
   sum += va_arg(var_arg, int);
  }
  va_end(var_arg);   //         
  return sum / n_value;
 }
}
int main()
{

 printf("%lf
", average(6,1,2,3,4,5,6));  system("pause");  return 0; }

上記の例は、指定された数量値の平均値を求める可変パラメータリストを実現する方法である.
もちろん、可変パラメータの応用には、文字列のコピーを実現するなど、多くのものがあります.
#define _CRT_SECURE_NO_WARNINGS
#include#include#include#include
void nstrcpy(char *dest, ...){ va_list     pi;  //va_list変数の宣言 char        *p; va_start(pi, dest); while ((p = va_arg(pi, char *)) != NULL)  //va_arg(pi,char*)によるパラメータリストの変数の抽出   {  strcpy(dest, p);  dest += strlen(p);       //次のレプリケーションのための変数のレプリケーションを完了 }
 va_end(pi);}
int main(){ char a[100]; char *b = "asdg"; char *c = "qwewq"; char *d = "aswq"; nstrcpy(a, b, c, d); printf("%s", a); system("pause"); return 0;}
複数の文字列のコピーを完了します.
可変パラメータリストの簡単な理解は,3つのマクロの具体的な定義についてはまだよく分からないが,徹底的に明らかになってから可変パラメータリストに関するブログを改善する.