可变参数的认识

可变参数是c语言函数中参数的个数和类型是不定的;具有可变参数的函数,称为可变参数函数。要注意的是,可变参数函数必须有一个以上的固定参数,可变参数必须作为最后一个函数参数。
...代表的就是可变参数,将来可以传递任意个数、任意类型参数

OC中的NSLog函数就是可变参数函数。
FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2) NS_NO_TAIL_CALL;
FOUNDATION_EXPORT void NSLogv(NSString *format, va_list args) NS_FORMAT_FUNCTION(1,0) NS_NO_TAIL_CALL;

//模拟一下NSLog中调用NSLogv的过程
void printArgs(int numArgs, ...){
    va_list args;
    va_start(args, numArgs);//初始化args,指向最后一个固定参数numArgs。
    NSLogv(@"%@, %@, %@", args);//至于NSLogv内部如何获取三个参数值,参看下面的sum函数
    va_end(args);   //args设置为NULL
}

//不知道有多少个数相加,所以使用了可变参数
//固定参数n,仅仅起了个定位作用,一般还可以作为可变参数个数使用。
int sum(int n, ...){
    
    va_list ap;//定于一个可变列表,用来便利可变参数
    va_start(ap, n);//初始化ap,让其指向最后一个固定参数n
    
    int sum = 0, ret = 0;
    //va_arg宏在第一次调用时,会让ap指向第一个可变参数,后续,每一次调用,都将指向下一个可变参数。
    while ((ret = va_arg(ap, int))) {//如果参数类型不能,那就对va_arg指定具体类型
        sum += ret;
    }
    
    va_end(ap);//清理ap,使其不再可用
    return sum;
}





 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值