首页 > 其他 > 详细

可变参数再回顾

时间:2016-06-19 18:34:26      阅读:153      评论:0      收藏:0      [点我收藏+]
   如果 我们的程序是这样写的
 
 int main(int argc,char *argv[])
 {
     cout<<argv[1]<<endl;
     return 0;
 }     
 那么运行  a.out 
 命令行  ./a.out  string
 这里 string 就是你想打印的东西
 如果改写
 cout<<argv[0]<<endl; 
 那么  打印 ./a.out
 cout<<argv[2]<<endl; 
 那么  啥也没有
 当然  可以这样输入
 ./a.out   123  456 789
 将打印   456
 可变参数列表
 其实就是做了一项预定义区域 先划分一块区域来装即将来临

的参数
 当然 得是同一类型的
  
 
#include <iostream>
using namespace std;
int m(int argc,char *argv[])
 {
     cout<<&argv[0]<<":"<<argv[0]<<endl;
     cout<<&argv[1]<<":"<<argv[1]<<endl;
     cout<<&argv[2]<<":"<<argv[2]<<endl;
     cout<<&argv[3]<<":"<<argv[3]<<endl;
     cout<<&argv[4]<<":"<<argv[4]<<endl;     
  return 0;
 }   

int main(int argc,char *argv[])//交换参数顺序  警告且运行

不了
 {
    m(argc,argv);
  return 0;
 }    
 除了 主函数能用之外  普通函数也能使用
 [wz@bogon ~]$ ./a.out 111 222 333 444 555 666 777
0xbfe7ca54:./a.out
0xbfe7ca58:111
0xbfe7ca5c:222
0xbfe7ca60:333
0xbfe7ca64:444
可以看见   后面的串先压栈  处于高地址
 C 程序栈底为高地址,栈顶为低地址,因此上面的实例可以

说明函数参数入栈顺序的确是从右至左的
 可变参数函数  可以由函数重载实现
 666 的文章
 http://www.cnblogs.com/dongsheng/p/4001555.html
 但测试不完美  里面的函数vsprintf()编译器不同 就不行
#include <stdio.h>
#include <stdarg.h>

 
int mysum(int n, ...)
{
    // (1) 定义参数列表
    va_list ap;
    // (2) 初始化参数列表
    va_start(ap, n);

    int result = n;
    int temp = 0;
    // 获取参数值
    while ((temp = va_arg(ap, int)) != END)
    {
        result += temp;
    }

    // 关闭参数列表
    va_end(ap);

    return result;
}

int main ()
{
    int M = mysum(1, 2, 3, 4, 5, END);
    printf ("%d", M);
    return 0;
} 
运用宏定义可以处理 总需要结束符号的问题 不然
  int M = mysum(1, 2, 3, 4, 5, -1,-1);
这样写 就加不了-1 那个值


可变参数再回顾

原文:http://wzsts.blog.51cto.com/10251779/1790801

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!