现在才发现,我这个问题描述不好,首先因为va_list并非我误以为的char *类型,它只是一个可以存放可变参数的“容器”;其实我只想知道scanf如何得知了不确定参数的存在并对其进行赋值,这一点我已经找到更好的回答;最后,感谢大家的回答,并附上自己写的一个从文档中根据某种格式读取字符、整数、小数的程序,写此程序的初衷是进行类似Scanf(fp, "%f%d", &coef, &expn)的调用,以便获取某多项式各项的系数coef和指数expn...

程序代码:
int Scanf(FILE *fp, char *format,...)
{
    int *i;
    char *ch;
    float *f;
    int count, k, len;        
    int tmp;
    
    len = strlen(format);
    
    va_list ap;    
    va_start(ap, format);
    
    count = 0;
    for(k=2; k<=len; k=k+2)
    {
        if(format[k-1]=='c')        //读取字符
        {
            ch = va_arg(ap, char*);            
            count += fscanf(fp, "%c", ch);        
        }    
        
        if(format[k-1]=='d')
        {
            i = va_arg(ap, int*);
            
            while((tmp=getc(fp))!=EOF)
            {
                if((tmp>='0' && tmp<='9') || tmp=='-')
                {
                    ungetc(tmp, fp);
                    break;
                }
            }
            
            if(tmp!=EOF)
                count += fscanf(fp, "%d", i);
        }
        if(format[k-1]=='f')
        {
            f = va_arg(ap, float*);
            
            while((tmp=getc(fp))!=EOF)
            {
                if((tmp>='0' && tmp<='9') || tmp=='-')
                {
                    ungetc(tmp, fp);
                    break;
                }
            }
            
            if(tmp!=EOF)
                count += fscanf(fp, "%f", f);
        }
    }
        
    va_end(ap);
    
    return count;
}