如果 我们的程序是这样写的 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; } 除了 主函数能用之外 普通函数也能使用 [[email protected] ~]$ ./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 那个值
时间: 2024-12-29 12:51:10