当前位置:编程学习 > C/C++ >>

C语言可变参数的简单理解-计算最大值

可变参数是C里面的一个使用技巧,用宏来实现的,其实主要是根据一个可变参数指针,然后不断的往后移指针。

但是理解是怎么用的,还是比较容易的。


[cpp] 
#include <stdarg.h>//<SPAN style="COLOR: #ff0000">使用可变参数需要的头文件</SPAN>  
#include <stdio.h>  
 
int max(int count, ...){ 
        va_list ap;//1)定义一个可变参数,这个地方其实是一个指针,用于访问可变参数中的参数列表  
        va_start(ap,count);//2)初始化可变参数,并把刚定义的指针指向第一个参数。  
        int maximum = -1;//假设这都是正整数求最大值,如果不是,就可以把maximum设为最大的负数  
        int temp,i; 
        for(i = 0; i < count; i++) { 
                temp = va_arg(ap, int);//从可变参数列表指针的当前位置获取一个int型参数,并把指针指向下一个参数。  
                if(maximum < temp) 
                        maximum = temp; 
        } 
        va_end(ap);//结束  
        return maximum; 

 
int main(int argc,char **argv){ 
        int ret_max = max(9,1,6,21,32,5,68,15,32,62); 
        printf("max in (9,1,6,21,32,5,68,15,32,62) is %d",ret_max); 
        return 0; 

#include <stdarg.h>//使用可变参数需要的头文件
#include <stdio.h>

int max(int count, ...){
        va_list ap;//1)定义一个可变参数,这个地方其实是一个指针,用于访问可变参数中的参数列表
        va_start(ap,count);//2)初始化可变参数,并把刚定义的指针指向第一个参数。
        int maximum = -1;//假设这都是正整数求最大值,如果不是,就可以把maximum设为最大的负数
        int temp,i;
        for(i = 0; i < count; i++) {
                temp = va_arg(ap, int);//从可变参数列表指针的当前位置获取一个int型参数,并把指针指向下一个参数。
                if(maximum < temp)
                        maximum = temp;
        }
        va_end(ap);//结束
        return maximum;
}

int main(int argc,char **argv){
        int ret_max = max(9,1,6,21,32,5,68,15,32,62);
        printf("max in (9,1,6,21,32,5,68,15,32,62) is %d",ret_max);
        return 0;
}

 


基本上使用可变参数,都是这几步曲:

在调用参数表之前,定义一个 va_list 类型的变量。va_list ap ;

对 ap 进行初始化,让它指向可变参数表里面的第一个参数,这是通过 va_start 来实现的,第一个参数是 ap 本身,第二个参数是在变参表前面紧挨着的一个变量;这时候,可以直接把ap作为参数给printf等函数来用的。如:printf(msg,ap);

如果需要自己获取参数的话,可以调用va_arg,对很多打印的业务来说,这一步不是必须的。调用 va_arg,它的第一个参数是 ap,第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值,并且把 ap 的位置指向变参表的下一个变量位置;

获取所有的参数之后,我们有必要将这个 ap 指针关掉,以免发生危险,方法是调用 va_end,他是输入的参数 ap 置为 NULL,应该养成获取完参数表之后关闭指针的习惯,这也是一个惯例,并且是国际惯例。


 

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,