按照你現(xiàn)在給出的代碼,
專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)江陽免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了成百上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
print2(3, 100, 1, 2, 3);
輸出的是1 2 3加上一位不確定值
因為va_start(vl, n);這一步理論上可以得到以a開頭的va_list指針,但實際上由于編譯器優(yōu)化,它的效果和va_start(vl, a);是相同的
這一點,你可以打印出指針地址來確定一下
從你的代碼推測,你是想讓print2打印出后四個參數(shù),包括a在內(nèi)
即 100 1 2 3
如果是這樣 可以用另一種方式做到
print2中,不要調(diào)用va_start
而是直接 vl=a;
如下
void print2(int n, int a, ...)
{
va_list vl;
// va_start(vl, n);//使用倒數(shù)第二個有名變量
vl = a;//編譯器想優(yōu)化 不讓。 直接強勢插入
vprint(n+1, vl);
va_end(vl);
}
可以試一下是否是你需要的效果。 如果不是 再追問
C語言中可變參函數(shù)實現(xiàn),主要通過VA_LIST宏及相關(guān)操作的幾個宏。
一、涉及宏及說明:
所有相關(guān)宏均定義在stdarg.h中。
1、va_list: 可變參數(shù)列表指針。
2、va_start:獲取可變參數(shù)列表的第一個參數(shù)的地址。
3、va_arg:獲取可變參數(shù)的當前參數(shù),返回指定類型并將指針指向下一參數(shù)。
4、va_end:清空va_list可變參數(shù)列表。
可變參函數(shù)的實現(xiàn),就是這四個宏的使用。
二、代碼舉例:
在實際應用中,經(jīng)常有獲取若干個數(shù)最大值的情況,當數(shù)量比較大的時候,一般通過數(shù)組實現(xiàn),但個數(shù)不多時,一般寫一個max函數(shù)。 常規(guī)寫法都是用到幾個數(shù)的max,就寫幾個參數(shù), 對此可以實現(xiàn)一個可變參數(shù)函數(shù),第一個參數(shù)指定共計有多少數(shù)據(jù),后續(xù)各個參數(shù)為要比較的值。
#include?stdio.h
#include?stdarg.h
int?max(int?n,?...)//可變參數(shù)函數(shù)。
{
int?r,i;
va_list?ap;//定義可變參數(shù)。
if(n?==?0)?return?-1;//異常參數(shù)。
va_start(ap,?n);//得到起始點。
for(i?=?0;?i??n;?i?++)
{
int?v=va_arg(ap,int)?;//獲取下一個參數(shù)值。
if(i?==?0)?r=v;
else?if(rv)?r=v;
}
va_end(ap);//結(jié)束可變參數(shù)。
return?r;//返回結(jié)果。
}
可以用如下主函數(shù)測試:
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個數(shù)值,求取最大值的情況。?
測試結(jié)果:
1
2
9
9
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':
// 函數(shù)實行
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);
}