成都网站建设设计

将想法与焦点和您一起共享

c语言函数形参个数不定 c语言函数形参可以是什么

急!请高手指教c++如何定义一个参数个数不确定的函数?

VA_LIST是在C语言中解决变参问题的一组宏,所在头文件:#include stdarg.h,用于获取不确定个数的参数。

创新互联是一家集网站建设,廉江企业网站建设,廉江品牌网站建设,网站定制,廉江网站建设报价,网络营销,网络优化,廉江网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

VA_LIST的用法:

首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针;

然后用VA_START宏初始化刚定义的VA_LIST变量;

然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型(如果函数有多个可变参数的,依次调用VA_ARG获取各个参数);

最后用VA_END宏结束可变参数的获取。

以下是一个定义一个参数个数不确定的函数的简单例子:

#include cstdarg

#include iostream

using namespace std;

double average ( int num, ... )

{

va_list arguments;                     // A place to store the list of arguments

double sum = 0;

va_start ( arguments, num );           // Initializing arguments to store all values after num

for ( int x = 0; x  num; x++ )        // Loop until all numbers are added

sum += va_arg ( arguments, double ); // Adds the next value in argument list to sum.

va_end ( arguments );                  // Cleans up the list

return sum / num;                      // Returns some number (typecast prevents truncation)

}

int main()

{

cout average ( 3, 12.2, 22.3, 4.5 ) endl;

cout average ( 5, 3.3, 2.2, 1.1, 5.5, 3.3 ) endl;

}

请问c语言编写函数时不确定 参数数量时该怎么办

在函数定义的时候就必须写形参名了。声明的时候不需要,因为编译器还用不到,只要知道相应位置是个啥类型的就行了

c语言中的printf()这样的有不定个参数的函数是如何实现的

首先先看到main函数中的不定参数:

1.引用:在Turbo C2.0启动过程中, 传递main()函数三个参数: argc, argv和env。

* argc: 整数, 鴐ain()的命令行参数个数。

* argv: 字符串数组。

argv[0] 为程序运行的全路径名

argv[1] 为在DOS命令行中执行程序名后的第一个字符串;

argv[2] 为执行程序名后的第二个字符串;

...

argv[argc]为NULL。

*env: 字符串数组。env[] 的每一个元素都包含ENVVAR=value形式的字符

串。其中ENVVAR为环境变量。value 为ENVVAR的对应值

#include stdlib.h

#include stdio.h

main(int argc, char *argv[], char *env[])

{

int i;

printf("%d\n", argc); /* 为什么它的输出是 1, 它到底是定义什么的,我看不明上面的解释*/

for(i=0; i=argc; i++)

printf("argv[%d]:%s\n", i, argv[i]);

for(i=0; env[i]!=NULL; i++)

printf(" env[%d]:%s\n", i, env[i]);

}

argc, argv, env是在main()函数之前被赋值的,编译器生成的可执行文件,main()不是真正的入口点,而是一个标准的函数,这个函数名与具体的操作系统有关。

就想到其他函数是否能实现一样的功能,查询了相关资料,基本上都是利用STDARG.H中的

#define va_start(ap, parmN) (ap = ...)

#define va_arg(ap, type) (*((type *)(ap))++)

#define va_end(ap)

定义如下:

typedef char * va_list;

#define va_start _crt_va_start

#define va_arg _crt_va_arg

#define va_end _crt_va_end

#define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )

#define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

#define _crt_va_end(ap) ( ap = (va_list)0 )

修改他人程序如下:

void average(int first,...)

{int i=first;

va_list maker;

va_start(maker,first);

while(i!=-1){ printf("%p: %d\n",maker,i);

i=va_arg(maker,int);

}

}

void main(void)

{

average(2,3,4,4,-1);

}

运行结果:

FFCE: 2

FFD0: 3

FFD2: 4

FFD4: 4

这个程序显示函数参数的地址相差2个字节

所以可以改写为:

void x(char *n,...)

{int *p;

p=n;

while(*p!=-1)

{printf("%p:%s\n",p,*p,*p);

p+=sizeof(char);}}

void main()

{x("g","hfd","gfg","vsds",-1);}

运行结果:

FFD2:g

FFD4:hfd

FFD6:gfg

FFD8:vsds

不必通过宏va_start,va_arg,va_end实现

C语言怎么实现函数不定参数

C语言中定义了va_list, va_start( ), va_arg( ), va_end( ) 这样一组宏来处理可变参数问题。

可以参考printf的声明,创建自己的实现函数。示例:

#includestdio.h

#includestdarg.h

void va_fun(int start,...)

{

va_list arg_ptr;

int nArgValue = start;

int nArgCount = 1;

va_start(arg_ptr,start);

while(nArgValue != -1)

{

printf("arg %d is:%d/n",nArgCount,nArgValue);

nArgValue=va_arg(arg_ptr,int);

++nArgCount; 

}

return; 

}

main()

{

va_fun(5,1,7,-1);

printf("................/n");

va_fun(2,4,-1);

printf("................/n");

va_fun(-1);

printf("................/n");

//va_fun(); 可变参数函数最少要有一个参数。

}


分享文章:c语言函数形参个数不定 c语言函数形参可以是什么
转载来源:http://chengdu.cdxwcx.cn/article/dohecss.html