天天看點

(C語言)可變參數清單

C函數要在程式中用到以下這些宏:

void va_start( va_list arg_ptr, prev_param );

type va_arg( va_list arg_ptr, type );

void va_end( va_list arg_ptr );

va_list:用來儲存宏va_start、va_arg和va_end所需資訊的一種類型。為了通路變長參數清單中的參數,必須聲明

             va_list類型的一個對象       定義: typedef char *  va_list;

va_start:通路變長參數清單中的參數之前使用的宏,它初始化用va_list聲明的對象,初始化結果供宏va_arg和

               va_end使用;

va_arg: 展開成一個表達式的宏,該表達式具有變長參數清單中下一個參數的值和類型。每次調用va_arg都會修改

              用va_list聲明的對象,進而使該對象指向參數清單中的下一個參數;

va_end:該宏使程式能夠從變長參數清單用宏va_start引用的函數中正常傳回。

va在這裡是variable-argument(可變參數)的意思.

這些宏定義在stdarg.h中,是以用到可變參數的程式應該包含這個頭檔案.下面我們寫一個簡單的可變參數的函數,改函數至少有一個整數參數,第二個參數也是整數,是可選的.函數隻是列印這兩個參數的值.

問題描述:

       運用可變參數清單的方式求n個整形數中的最大值,并且輸出。

代碼如下:

/********可變參數清單*********/
#include<stdio.h>
#include<stdarg.h>    

/* ANSI标準形式的聲明方式,括号内的省略号表示可選參數 */
int Max(int n,...)	/*求n個數的最大值*/ 
{
	va_list arg;	/* 定義儲存函數參數的結構 */ 
	int max=0;
	int i;
	va_start(arg,n);  /* arg指向傳入的第一個可選參數,n是最後一個确定的參數 */
	for(i = 0;i<n;i++)
	{	   
		int tmp = va_arg(arg,int);  /* 取出目前的參數,類型為int類型 */ 
		if(tmp>max)
		{
			max = tmp;
		}
	}
	va_end(arg); /*結束可變參數的擷取*/
	return max;
}

int main()
{
	int ret = Max(10,1,2,3,4,5,6,7,8,9,10);
	printf("%d\n",ret);
	return 0;	
}
           

繼續閱讀