c语言函数可变长参数 C语言可变参数

c语言传递变长参数

按照你现在给出的代码,

专注于为中小企业提供成都网站设计、网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业江阳免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了成百上千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

print2(3, 100, 1, 2, 3);

输出的是1 2 3加上一位不确定值

因为va_start(vl, n);这一步理论上可以得到以a开头的va_list指针,但实际上由于编译器优化,它的效果和va_start(vl, a);是相同的

这一点,你可以打印出指针地址来确定一下

从你的代码推测,你是想让print2打印出后四个参数,包括a在内

即 100 1 2 3

如果是这样 可以用另一种方式做到

print2中,不要调用va_start

而是直接 vl=a;

如下

void print2(int n, int a, ...)

{

va_list vl;

// va_start(vl, n);//使用倒数第二个有名变量

vl = a;//编译器想优化 不让。 直接强势插入

vprint(n+1, vl);

va_end(vl);

}

可以试一下是否是你需要的效果。 如果不是 再追问

C语言中如何实现可变参函数

C语言中可变参函数实现,主要通过VA_LIST宏及相关操作的几个宏。

一、涉及宏及说明:

所有相关宏均定义在stdarg.h中。

1、va_list: 可变参数列表指针。

2、va_start:获取可变参数列表的第一个参数的地址。

3、va_arg:获取可变参数的当前参数,返回指定类型并将指针指向下一参数。

4、va_end:清空va_list可变参数列表。

可变参函数的实现,就是这四个宏的使用。

二、代码举例:

在实际应用中,经常有获取若干个数最大值的情况,当数量比较大的时候,一般通过数组实现,但个数不多时,一般写一个max函数。 常规写法都是用到几个数的max,就写几个参数, 对此可以实现一个可变参数函数,第一个参数指定共计有多少数据,后续各个参数为要比较的值。

#include stdio.h

#include stdarg.h

int max(int n, ...)//可变参数函数。

{

int r,i;

va_list ap;//定义可变参数。

if(n == 0) return -1;//异常参数。

va_start(ap, n);//得到起始点。

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

{

int v=va_arg(ap,int) ;//获取下一个参数值。

if(i == 0) r=v;

else if(rv) r=v;

}

va_end(ap);//结束可变参数。

return r;//返回结果。

}

可以用如下主函数测试:

int main()

{

printf("%d\n",max(1, 1));

printf("%d\n",max(2, 2,1));

printf("%d\n",max(3, 5,9, 4));

printf("%d\n",max(4, 8 , 3,1,9));

return 0;

}

分别测试了1,2,3,4个数值,求取最大值的情况。 

测试结果:

1

2

9

9

c语言 可变长参数问题

sub1("6",func);这行怎么弄float也没弄出来,其它感觉都不是很难。

#include stdio.h

typedef struct {

short s[3];

} sa3;

void sub1(char *fmt,...)

{

char *ap;

int i;

void (*p)(void)=NULL;

ap = (char *)fmt + 4;

while(*fmt){

switch(*fmt++){

case '0':

printf("int: %d\n",*(int*)ap);

ap += 4;

break;

case '1':

printf("char *: %s\n",*(char**)ap);

ap += 4;

break;

case '2':

printf("double: %f\n",*(double*)ap);

ap += 8;

break;

case '3':

printf("long: %d\n", *(int*)ap);

ap += 4;

break;

case '4':

i = *(int*)ap 0xffff;

printf("short: %d\n", i);

ap += 2;

break;

case '5':

break;

case '6':

// 函数实行

break;

case '7':

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

printf("buf[%d]: %d\n", i, *(*(short**)ap + i));

break;

case '8':

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

printf("sa3.[%d]: %d\n", i, (*(sa3*)ap).s[i]);

break;

default:

printf("unkown fmt: %c\n",fmt[-1]);

return;

}

}

}

void func(void)

{

printf("func output.\n");

}

int main(int argc, char** argv)

{

int i = 100;

long l = 80000;

short s = 333;

float f = (float)2.33;

double d = 1.234;

short buf[3];

sa3 sa3data;

buf[0] = 11;

buf[1] = 22;

buf[2] = 33;

sa3data.s[0] = 44;

sa3data.s[1] = 55;

sa3data.s[2] = 66;

sub1("012345",i,"abc",d,l,s,f);

sub1("6",func);

sub1("7",buf);

sub1("8",sa3data);

}


分享标题:c语言函数可变长参数 C语言可变参数
分享网址:http://ybzwz.com/article/hhodhh.html