可变参数函数(一)
一個函數(shù)可以接受不定數(shù)的參數(shù)個數(shù),這就是可變參數(shù)函數(shù),比較常見的比如printf(),scanf();
printf(const char* format,…); printf(“%d”,i); printf(“%s”,s); printf(“the number is %d,stirng is :%s”,i,s);變量參數(shù)函數(shù)的簡單實現(xiàn):
#include<stdio.h> #include<stdarg.h>int simple(int num,...) {int i,result = 0;va_list vl;va_start(vl,num);printf("num:%d, vl:%d\n",num,*vl);for(i = 0; i < num - 1 ; i++){result = va_arg(vl,int);printf("in for result:%d ,*vl:%d\n",result,*vl);}va_end(vl);return result; }int main() {int sum = simple(5,1,2,3,4,5);if(0 == sum){printf("simple failed\n");}else{printf("simple success! sum = %d\n",sum); }return 0; }結(jié)果如下:
exbot@ubuntu:~/wangqinghe/DeBug/20190702$ ./VA
num:5, vl:1020625376
in for result:1 ,*vl:1020625376
in for result:2 ,*vl:1020625376
in for result:3 ,*vl:1020625376
in for result:4 ,*vl:1020625376
simple success! sum = 4
sum.c #include<stdio.h> #include<stdlib.h> #include<stdarg.h>double add(int n,...) {//printf("add...\n");int i = 0;double sum = 0;va_list argptr; va_start(argptr,n); //初始化argptrfor(i = 0 ; i < n; i++) ////對每個可選參數(shù),讀取類型為int的參數(shù) {sum += va_arg(argptr,int); //累加到sum中 }va_end(argptr); printf("add_sum = %f\n",sum);return sum; }int main(int argc,char **argv) {double sum = 0;int *p = malloc(argc * sizeof(int));int i;for(i = 1; i < argc; i++) { p[i] = atoi(argv[i]); printf("p[%d] = %d\n",i,p[i]);}sum = add(argc,p[1]);printf("sum = %f\n",sum);sum = add(argc,p[1],p[2]);printf("sum = %f\n",sum);sum = add(argc,p[1],p[2],p[3]);printf("sum = %f\n",sum); free(p);return 0; }輸出結(jié)果;
exbot@ubuntu:~/wangqinghe/DeBug/20190702$ ./sum 10 20 30
p[1] = 10
p[2] = 20
p[3] = 30
add_sum = 239745405.000000
sum = 239745405.000000
add_sum = 56.000000
sum = 56.000000
add_sum = 69.000000
sum = 69.000000
?
相關(guān)函數(shù)介紹:
可變函數(shù)列表的實現(xiàn)由幾個宏組成的,在文件#include<stdarg.h>中。
va_list 定義某個變量,內(nèi)核的定義如下:
typedef char *va_list;? //字符指針類型
va_start(ap,type) 開始獲取可變參數(shù)列表中第一個參數(shù)(…里面的第一個),也就是跳過第一個參數(shù)。(所以以上的第一個輸出是個隨機值)。
#ifndef __sparc__ #define va_start(AP, LASTARG) \(AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG)))//ap指向下一個參數(shù),lastarg不變 #else #define va_start(AP, LASTARG) \(__builtin_saveregs (), \AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG))) //跳過下第一個參數(shù),指向第二個參數(shù)內(nèi)存地址 #endif//對type向上取整 取int的整 4,然后乘上int整型4的倍數(shù) #define __va_rounded_size(TYPE) \(((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))Va_arg(args,int)循環(huán)獲取可變參數(shù)列表中的參數(shù),args指向下一個參數(shù)地址,返回的是當前參數(shù)地址。
// first=va_arg(args,int) #define va_arg(AP, TYPE) \//ap指向下一個類型的參數(shù)(AP += __va_rounded_size (TYPE), \//返回ap - sizeof(type)參數(shù),即前一個參數(shù)*((TYPE *) (AP - __va_rounded_size (TYPE))))//對type向上取整 取int的整 4,然后乘上int整型4的倍數(shù) #define __va_rounded_size(TYPE) \(((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))最后一個va_end(ap)結(jié)束標志,在程序中只是作為一個可變參數(shù)列表的結(jié)束標識,在stdarg.h中僅僅定義了一下,沒有實現(xiàn)代碼部分。
轉(zhuǎn)載于:https://www.cnblogs.com/wanghao-boke/p/11119490.html
總結(jié)
- 上一篇: 成都欢乐谷充电宝在哪可以借
- 下一篇: 石破天惊剧情介绍