可变参数再回顾

   如果 我们的程序是这样写的
 
 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

可变参数再回顾的相关文章

通过Java发射机制调用可变参数函数

1.获取可变参数的函数 获取可变参数的函数与获取参数类型为数组类型一样. clazz.getMethod("test", Object[].class); 其中Object为可变参数或者数组的数据类型 例如: public void test(String ... params){ ... } 则获取该可变参数的函数如下: Class clazz = Class.forName("com.demo003.MainThread"); Method method = c

Java基础知识回顾-22(静态导入,可变参数,Collections集合工具类,集合嵌套)

1.在导包的时候可以导入其静态部分,这样在类中使用其时,可以直接以其名使用 例如:Map.Entry的访问,在类文件头部导入import java.util.Map.Entry后简化后为Entry. 2.可以用"修饰符 返回值类型 方法名(参数类型... 形参名){  }"的方式来同时传入不确定个数,相同参数类型的参数.比如当求不确定个数的int类型的数据的和时,可以使用这种方式,避免写多个方法,如果参数类型不改变,则该方法不可重载,因为可变参数不确定参数个数吗.若要增加不可变参数,需

集合【Map、可变参数、Collections】

第9天 集合今日学习内容? Map集合今日学习目标? 能够说出Map集合特点? 使用Map集合添加方法保存数据? 使用"键找值"的方式遍历Map集合? 使用"键值对"的方式遍历Map集合? 能够使用HashMap存储自定义键值对的数据? 能够说出可变参数的作用? 能够使用集合工具类? 能够使用HashMap编写斗地主洗牌发牌案例第1章 Map接口概述1.1 Map集合的特点我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储

java可变参数列表的实现

参数就是我们调用一个方法时需要传入得数据,在方法中可能需要参数协助处理数据或者对参数进行解析处理以达到我们希望得到的数据和结果. 平常我们在写一个方法时,我们能确定需要传入什么样的参数以及参数的个数,这样我们在实现这个方法的时候在确定参数的时候都会有明确的目标.但是有时候会有这种特殊情况,我们并不知道我们将要传入几个参数,或者说我们并不确定外部会传入多少参数.在这种情况下,我们就要用到可变参数列表.下面是可变参数方法的实现方法. 1.传入数组对象或者集合,这里只对传入数组对象进行简单说明,集合的

宏与可变参数

对于打印函数printf我们太熟悉不过,但真是这样吗?看看其原型:     int printf( const char *format [, argument]... ); 等等,末尾的…是什么意思?省略号?是想留给读者无限的遐想空间?你大可这样认为,因为这是不固定参数,简称不定参数,换句话说,有多少参数都行,只要你敢想. 我们想看看可变参数如何使用,并且怎样实现可变参数.先看下面的例子: #include<stdio.h> #include<malloc.h> #include

C语言的可变参数

可变参数给编程带来了很大的方便,在享受它带来的方便的同时,很有必要了解一下其实现方式,在了解编程语言的同时,也可以扩展编程的思路. 可变参数需要用到3个宏函数和一个类型,他们都定义在<stdarg.h>中,分别是: va_start(vl) va_arg(vl, type) va_end(vl) 其中vl是va_list类型,type就是对象类型(如int, double或 自定义的struct之类的). va_start函数用来初始化vl va_arg(vl, type)用来取得type类型

编写一个可变参数的C函数——头文件stdarg.h中宏va_start ,va_arg和va_end的应用

我们在C语言编程中会遇到一些参数个数可变的函数,例如printf()这个函数,它的定义是这样的:int printf( const char* format, ...);它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的,例如我们可以有以下不同的调用方法:printf("%d",i);printf("%s",s);printf("the number is %d ,string is:%s", i, s);究竟如何写可变参数的

Java5新特性之静态导入、可变参数、增强for循环、自动拆装箱

JDK1.5已经发布很长时间,之所以还拿出来是因为它增加了很多个重要的特性,使用这些特性有助于我们简化开发,编写的代码更加简洁清晰安全,主要有以下几个特性: ?  静态导入 ?  可变参数 ?  增强for循环 ?  自动拆装箱 ? 泛型 ? 枚举 由于泛型.枚举内容比较多,也最重要,之后单拿出来讲.这里先介绍前面四个简单而又实用的小特性. 1. 静态导入 所谓"静态导入"只不过是在普通的import语句中加入关键字static,例如: ?  非静态导入:import java.lan

C语言可变参数函数实现原理

一.可变参数函数实现原理 C函数调用的栈结构: 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈. 本文地址:http://www.cnblogs.com/archimedes/p/variable-parameter.html,转载请注明源地址. 例如,对于函数: void fun(int a, int b, int c) { int d; ... } 其栈结构为 0x1ffc-->d 0x200