c语言传递变长参数

Python014

c语言传递变长参数,第1张

按照你现在给出的代码,

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)

}

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

&fmt是第一个参数的首地址。

根据你后面的代码来看,你传递的第一个参数是一个字符串,即%d %d %s\n。你凭什么要认为你的第一个参数是4呢?奇怪……

&操作符这里是取fmt的地址,没有涉及引用啊?

转化成char*的意思估计是为了强调你第一个传过去的参数是字符串吧?这种叫做“类型转换”,不会改变&fmt里面的数据的,所以肯定不会指向错误的地址,瀑布汗。

最后,+sizeof(fmt)的目的需要肯定,是为了打印出4这个字符来。那么这句话意思就很明白了:首先,将fmt强制转换为char*类型,然后呢,因为fmt已经是char*了,所以移动一个char*那么长的“位置”,来到存储“4”这个数字的地方……再多说一句:你程序里变长参数fmt的结构是“char*,int,int,char*”这样子的,两个char*分别指向两个字符串。

希望你看明白了:D