码迷,mamicode.com
首页 > 其他好文 > 详细

可变参数再回顾

时间:2016-06-19 18:35:50      阅读:150      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!