background image

c 语言中可变参数函数的设计
 
 
 

  

参数可变函数的实现(上)

 
  从我们熟悉的 printf 说起:

   如果你是个 C 语言的程序员,无论你是初学者还是高高手,对于 printf 都不会陌生,甚
至你已经用了无数次了。我已经说过我是个有极大惰性的人,所以每次用 printf 都是照本

宣科,规规矩矩的按教科书上说的做,从来没有问过一个为什么,这就是所谓的 熟视无

睹 吧。

其实,printf 函数是一个典型的参数可变的函数。在保证它的第一个参数是字符串的条件
下,你可以输任意数量任意合法类型的参数。只要你在第一个字符串参数中使用了对应的
格式化字符串,你就可以输出正确的值。这难道不是件很有趣的事吗?那它是怎么做到的?

1,首先,怎么得到参数的值。对于一般的函数,我们可以通过参数对应在参数列表里的

“…”

标识符来得到。但是参数可变函数那些可变的参数是没有参数标识符的,它只有

,所

以通过标识符来得到是不可能的,我们只有另辟途径。

我们知道函数调用时都会分配栈空间,而函数调用机制中的栈结构如下图所示:

                       |     ......     |

                       ------------------

                       |     参数 2      |

                       ------------------

                       |     参数 1      |

                       ------------------

                       |    

    

返回地址

|

                       ------------------

                       |调用函数运行状态|

                       ------------------

可见,参数是连续存储在栈里面的,那么也就是说,我们只要得到可变参数的前一个参
数的地址,就可以通过指针访问到那些可变参数。但是怎么样得到可变参数的前一个参数