标签:小代码
如果 我们的程序是这样写的
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