`
xitonga
  • 浏览: 585846 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

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

#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;
}


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

  1. 在调用参数表之前,定义一个 va_list 类型的变量。va_list ap ;
  2. 对 ap 进行初始化,让它指向可变参数表里面的第一个参数,这是通过 va_start 来实现的,第一个参数是 ap 本身,第二个参数是在变参表前面紧挨着的一个变量;这时候,可以直接把ap作为参数给printf等函数来用的。如:printf(msg,ap);
  3. 如果需要自己获取参数的话,可以调用va_arg,对很多打印的业务来说,这一步不是必须的。调用 va_arg,它的第一个参数是 ap,第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值,并且把 ap 的位置指向变参表的下一个变量位置;
  4. 获取所有的参数之后,我们有必要将这个 ap 指针关掉,以免发生危险,方法是调用 va_end,他是输入的参数 ap 置为 NULL,应该养成获取完参数表之后关闭指针的习惯,这也是一个惯例,并且是国际惯例。

分享到:
评论

相关推荐

    C语言入门经典(第4版)--源代码及课后练习答案

    9.4.2 长度可变的变元列表的基本规则 344 9.5 main()函数 345 9.6 结束程序 346 9.7 函数库:头文件 347 9.8 提高性能 348 9.8.1 内联声明函数 348 9.8.2 使用restrict关键字 348 9.9 设计程序 349 9.9.1 ...

    《你必须知道的495个C语言问题》

    5.15 有没有什么简单点儿的办法理解所有这些与空指针有关的东西呢? 60 5.16 考虑到有关空指针的所有这些困惑,要求它们的内部表示都必须为0不是更简单吗? 60 5.17 说真的,真有机器用非零空指针吗,或者不同...

    C语言程序设计标准教程

    如调用正弦函数取得正弦值,调用例5.1的max函数取得的最大数等。对函数的值(或称函数返回值)有以下一些说明: 1. 函数的值只能通过return语句返回主调函数。return 语句的一般形式为: return 表达式; 或者为: ...

    你必须知道的495个C语言问题

    5.15 有没有什么简单点儿的办法理解所有这些与空指针有关的东西呢? 5.16 考虑到有关空指针的所有这些困惑,要求它们的内部表示都必须为0不是更简单吗? 5.17 说真的,真有机器用非零空指针吗,或者不同类型用...

    c语言浪漫烟花源码.rar

    // 如果该号炮花可爆炸,根据当前爆炸半径画烟花,颜色值接近黑色的不输出。 if (Fire[i].draw) { for (double a = 0; a ; a += 0.01) { int x1 = (int)(Fire[i].cen_x + Fire[i].r ...

    C语言FAQ 常见问题列表

    o 6.13 考虑到有关空指针的所有这些困惑, 难道把要求它们内部表达都必须为 0 不是更简单吗? o 6.14 说真的, 真有机器用非零空指针吗, 或者不同类型用不同的表达? o 6.15 运行时的 ``空指针赋值" 错误是什么意思...

    c语言:主存空间的分配和回收

    请编程完成以下步骤::#define n 10 /*假定系统允许的最大作业 数量为n,n值为10*/ struct {int number; /*序号*/ int address; /*已分配分区起始地址,单位 为KB */ int length; /*已分配分区长度,单位KB*/ ...

    你必须知道的495个C语言问题(PDF)

    3.4 这是个巧妙的表达式: a ˆ= b ˆ= a ˆ= b 它不需要临时变量就可 以交换a 和b 的值。. . . . . . . . . . . . . . . . . . . . . . . . . 14 3.5 我可否用括号来强制执行我所需要的计算顺序? . . . . . . . . ....

    c语言数据结构字符串模式匹配算法.zip

    对于一般文稿中串的匹配,简单匹配算法的时间复杂度可降为O (m+n),因此在多数的实际应用场合下被应用。 KMP算法的核心思想是利用已经得到的部分匹配信息来进行后面的匹配过程。看前面的例子。为什么T[5]==’d’的...

    C语言编程要点

    12.3. 怎样编写参数数目可变的函数? 171 12.4. 独立(free—standing)环境和宿主(hosted)环境之间有什么区别? 173 12.5. 对字符串进行操作的标准库函数有哪些? 173 12.6. 对内存进行操作的标准库函数有哪些? 176 12.7...

    C 语言编程常见问题解答.chm

    12.3 怎样编写参数数目可变的函数? 12.4 独立(free—standing)环境和宿主(hosted)环境之间有什么区别? 12.5 对字符串进行操作的标准库函数有哪些? 12.6 对内存进行操作的标准库函数有哪些? 12.7 怎样判断...

    单片机c语言课程设计交通灯(2).doc

    由于检测下降沿跳变需要两个机器周期(24个时钟周期)的时间,所以技术频率 最大值只能为时钟周期的1/24。计数器对外部输入信号的占空比并无限制,但为了保证 给定的电平信号在其改变之前至少被采样一次,外部输入...

    单片机c语言课程设计交通灯(1).doc

    由于检测下降沿跳变需要两个机器周期(24个时钟周期)的时间,所以技术频率 最大值只能为时钟周期的1/24。计数器对外部输入信号的占空比并无限制,但为了保证 给定的电平信号在其改变之前至少被采样一次,外部输入...

    C程序范例宝典(基础代码详解)

    实例066 使用指针查找数列中最大值、最小值 83 实例067 用指针数组构造字符串数组 84 实例068 将若干字符串按照字母顺序输出 85 2.3 指针与函数 86 实例069 用指向函数的指针比较大小 86 实例070 使用...

    单片机c语言课程设计交通灯.pdf

    由于检测下降沿跳变需要两个机器周期 (24 个时钟周期)的时间,所以技术频率最大值只能为时钟周期的 1/24。计数 器对外部输入信号的占空比并无限制, 但为了保证给定的电平信号在其改变之前 至少被采样一次,外部...

Global site tag (gtag.js) - Google Analytics