1. 程式人生 > >關於C語言可變引數函式的寫法及其應用

關於C語言可變引數函式的寫法及其應用

以前一直以為C語言的函式都是精確匹配的,直到看了 C和C指標 才知道還有可變引數的函式。仔細一想,平時最常用的printf ,scanf 不就是可變引數的嗎。 先上程式碼,隨後詳細講解可變引數函式的用法。

#include<stdio.h>
#include<stdarg.h>

void fun(int num, ...)
{
	int i;
	int res = 0;
	va_list v1;				//v1實際是一個字元指標,從標頭檔案裡可以找到 
	
	va_start(v1, num);		//使v1指向可變列表中第一個值,即num後的第一個引數 
	
	printf("*v = %d\n",*v1);
	
	for(i = 0; i < num-1; i++)	//num 減一是為了防止下標超限 
	{
		res = va_arg(v1, int);		//該函式返回v1指向的值,並是v1向下移動一個int的距離,使其指向下一個int 
		printf("res = %d, *v1 = %d\n",res, *v1); 
	 } 
		va_end(v1);				//關閉v1指標,使其指向null
}


int main(void)
{
	fun(4,1,2,3,4);
	
	return 0;
 } 

這個函式簡單的介紹了可變引數函式的用法。 首先,必須包含stdarg.h 標頭檔案,我們用到的東西,都在這個標頭檔案中。包括 va_list,va_start,va_arg, va_end。 va_list 用於定義一個指向引數的指標,其實就是一個char* 的指標。 va_start(v1, num); 將v1指標指向可變引數的第一個引數。通過列印*v1可知,打印出來的是,1 ,正是第一個可變引數。 res = va_arg(v1, int); 這個函式返回v1指標所指的值,並使v1指標 移動sizeof(int) = 4, 個位元組,使其指向下一個引數。注意,當引數型別為char 時,應該寫char, 以此類比。 va_end

(v1); 最後一句,為了安全性,關閉v1指標,其實就是使v1為null。 本文關於可變引數函式的介紹就到這裡。想要深入理解的可以去看看標頭檔案裡面的定義。