C语言中的函数占位参数应用

原文链接一:http://hi.baidu.com/wjun520/blog/item/1678a11da07fe68086d6b653.html

C++中有函数重载这种方法,以供我们调用时要可以不确定实参的个数,其实 C 语言也可以,而且更高明!

我们在stdio.h 中可以看到 printf() 函数的原型:

int printf(char * format,...)

事实上,我们如果要写这样的函数也可以类似的写,那么在定义函数时用上这个符号 ...  ,它叫占位符,喊它 三个点  也可以,只要你愿意!那么我可以这样定义我的函数:

fun(int a,...)

{   }     

只要上课认真听了的同学(傻瓜除外)都知道,这是个空函数,它是什么都不做的,光这样写还不行的,具体应该怎样定义呢?

且听我介绍3 个小东东:

1 va_list

2 va_arg()

3 va_start()

在学习这3 个小东东之前,我们先回忆一下, C 语言是怎么操作文件时,是怎么样处理内存中的数据的呢?学习文件操作时,我们提到了“流”的概念,我们用指针指向数据所在的内存地址,再一个一个的操作。

学习指针时,我们知道有函数指针这个东东,不是指针函数而是函数打针哦!(呵呵,我的同学如果还记得就当复习一下,不要嫌我啰嗦^_^ )。我们记得程序在执行时,会将函数存储到内存中去。现在深入的讲一点点,存储函数时,参数传递的过程是怎样实现的呢?所谓的形式参数(局部变量)实质上又是什么呢?把这些问题连起来想想,想通了,你的思维势如破竹!

在调用函数时,程序同样会把实参传入,在函数存储区保存起来,如果有很多参数,将一起保存起来。

 

这时候就要用到va_list 了,这是个类型定义,我们可以把它理解成一个指针,它指向第一个参数的地址。

 

如果,我们这样定义: va_list pp 

pp 就是这样一种变量,它是指向所有参数中的第一个参数的。它不同于一般的指针变量,它是个复合变量,什么是复合变量啊?结构体类型的嘛,呵呵。如果 a 是第一个参数,能不能写成 pp=a 呢?

 

假设我定义了char d[]="ruixin",e[]="gelin"; 我要把 e 的值赋给 d ,能不能写成 d=e 呢?得用 strcpy() ,是吧!呵呵,一样的道理,这儿我们也用一个函数来实现,它就是 va_start();

 

如果这样写:va_start(pp,a);

那么pp 就指向第一个参数 a 了,并且可得到 a 的类型 int 

 

这时候如果有下一个参数,就需要使pp 指向下一个参数,并且得到它的类型。同样需要使用函数来实现,这个函数是: va_arg()

 

可以这样写:va_arg(pp, 类型 ) ,这样 pp 就指向一个参数,并且可以得到那个参数的类型了。

 

注意!类型非常重要,学过指针的都应该清楚,指针的类型如果弄错的话,位置正确,取出来的数可能也是乱七八糟的。

 

下面我们看一个简单的例子:

#include <stdio.h>

#include<stdarg.h>

void fun(int a,...)

{

va_list pp;

int n=1;//使用 n 计量参数个数

va_start(pp,a);

do

{

printf(" %d 个参数 =%d/n",n++,s);

a=va_arg(pp,int);//使 pp 指向下一个参数,将下一个参数的值赋给变量 a

}

while (a!=0);//直到参数为 0 时停止循环

}

main()

{

fun(20,40,60,80,0);

}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值