C++函数的可变参数详谈

可变参数的英文表示为:variable argument.

它在函数的定义时,用三个点号'.'表示,用逗号与其它参数分隔.

可变参数的特点:不像固定参数那样一一对应,也不像固定参数有固定的参数类型和参数名称;可变参数中个数不

定可是传入的是一个参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有

实际的名称与之相对应.

由此可见,可变参数的形式非常自由而富有弹生.因些,它给那些天才程序员有更大地想象和发挥空间.

然而,更多地自由,同样也加大操作上的难度.

以下就对可变参数的几个方面作一定的介绍.

1)可变参数的存储形式.

大家都知道,一般函数的形参属于局部变量.而局部变量就是存储在内存的栈区(所谓的栈区:由编译器自动分配释放,

存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。).可变参数也是存储在内存栈区.

在对函数的形参存储的时侯,编译器是从函数的形参的右边到左边逐一地压栈,

这样保证了栈顶是函数的形参的第一个参数(从左到右数).而80x86平台下的内存分配顺序是从高地址内存到低地址内存.

因此,函数的形参在内存的存储形式如下图(以fun(int var1,int var2,...,int var3,int var4)为例):

栈区:

|栈顶       低地址

|第一个固定参数var1

|可变参数前的第一个固定参数var2

|可变参数的第一个参数

|...

|可变参数的最后一个参数

|函数的倒数第二个固定参数var3

|函数的最后一个固定参数var4

|...

|函数的返回地址

|...

|栈底  高地址

时间: 2024-10-31 07:00:40

C++函数的可变参数详谈的相关文章

JS与PHP向函数传递可变参数的区别实例代码_php技巧

# JS 调用函数传递可变参数的方法 复制代码 代码如下: <script> function test() { for(var i = 0;i < arguments.length; i++) { alert(arguments[i]); } } //调用函数 test(1, 2, 3, 'abc'); </script> # PHP 调用函数传递可变参数的方法 复制代码 代码如下: <?php //方法一 //接收一系列参数,并逐一输出 function show_

简单谈谈Python中函数的可变参数_python

前言 在Python中定义函数,可以用必选参数.默认参数.可变参数和关键字参数,这4种参数都可以一起使用,或者只用其中某些,但是请注意,参数定义的顺序必须是:必选参数.默认参数.可变参数和关键字参数. 可变参数( * ) 可变参数,顾名思义,它的参数是可变的,比如列表.字典等.如果我们需要函数处理可变数量参数的时候,就可以使用可变参数. 我们在查看很多Python源码时,经常会看到 某函数(*参数1, **参数2)这样的函数定义,这个*参数和**参数就是可变参数,一时会让人有点费解.其实只要把函

c/c++支持可变参数的函数

一.为什么要使用可变参数的函数? 一般我们编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数.但在某些情况下希望函数的参数个数可以根据需要确定,因此c语言引入可变参数函数.这也是c功能强大的一个方面,其它某些语言,比如fortran就没有这个功能. 典型的可变参数函数的例子有大家熟悉的printf().scanf()等. 二.c/c++如何实现可变参数的函数? 为了支持可变参数函数,C语言引入新的调用协议, 即C语言调用约定 __cdecl . 采用C/

C语言的可变参数

C语言中有些函数使用可变参数,比如常见的int printf( const char* format, ...),第一个参数format是固定的,其余的参数的个数和类型都不固定. C语言用va_start等宏来处理这些可变参数.这些宏看起来很复杂,其实原理挺简单,就是根据参数入栈的特点从最靠近第一个可变参数的固定参数开始,依次获取每个可变参数的地址.下面我们来分析这些宏. 在stdarg.h头文件中,针对不同平台有不同的宏定义,我们选取X86平台下的宏定义: typedef char * va_

C/C++语言中可变参数的用法

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

一步一步写算法(之 可变参数)

原文:一步一步写算法(之 可变参数) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com]     可变参数是C语言编程的一个特色.在我们一般编程中,函数的参数个数都是确定的,事先定下来的.然而就有那么一部分函数,它的个数是不确定的,长度也不一定,这中间有什么秘密吗?     其实,我们可以回忆一下哪些函数是可变参数的函数?其实也就是sprintf.printf这样的函数而已.那么这些函数有什么规律吗?关键就是在这个字符串上面.我们可以举一个例

《Hack与HHVM权威指南》——1.5.4 可变参数类型

本节书摘来自华章出版社<Hack与HHVM权威指南>一书中的第1章,第1节,作者 Owen Yamauchi,更多章节内容可以访问"华章计算机"公众号查看. 1.5.4 可变参数类型 正如我们早期看到的一样,Hack拥有声明某个函数是可变参数的语法: function log_error(string $format, ...) { $args = func_get_args(); // ... } PHP 5.6介绍了一个不同的可变参数的语法,它有两个特性超过了Hack.

可变参数的函数的原理

原文地址: 可变参数. 1:必须有一个提前参数,(即:...之前必须要有一个参数),用以计算出后面的第一个未知参数的地址. 知道了第一个未知参数的地址之后, 就可以根据fmt格式化串,可以依次计算出剩余的参数地址. sprintf()的原型:sprintf(char* buffer, const char* fmt, ... ) ,其中,fmt就是提前参数 2:每一个可变阐述函数,其编写者与使用者 都要有一个参数的使用约定.不然,会乱套. 3:可变函数实现的技术基础1:所有参数,在汇编级别,其大

Python中函数的参数定义和可变参数用法实例分析

  本文实例讲述了Python中函数的参数定义和可变参数用法.分享给大家供大家参考.具体如下: 刚学用Python的时候,特别是看一些库的源码时,经常会看到func(*args, **kwargs)这样的函数定义,这个*和**让人有点费解.其实只要把函数参数定义搞清楚了,就不难理解了. 先说说函数定义,我们都知道,下面的代码定义了一个函数funcA ? 1 2 def funcA(): pass 显然,函数funcA没有参数(同时啥也不干:D). 下面这个函数funcB就有两个参数了, ? 1