c 语言中可变参数函数的设计
参数可变函数的实现(上)
从我们熟悉的 printf 说起:
如果你是个 C 语言的程序员,无论你是初学者还是高高手,对于 printf 都不会陌生,甚
至你已经用了无数次了。我已经说过我是个有极大惰性的人,所以每次用 printf 都是照本
“
宣科,规规矩矩的按教科书上说的做,从来没有问过一个为什么,这就是所谓的 熟视无
”
睹 吧。
其实,printf 函数是一个典型的参数可变的函数。在保证它的第一个参数是字符串的条件
下,你可以输任意数量任意合法类型的参数。只要你在第一个字符串参数中使用了对应的
格式化字符串,你就可以输出正确的值。这难道不是件很有趣的事吗?那它是怎么做到的?
1,首先,怎么得到参数的值。对于一般的函数,我们可以通过参数对应在参数列表里的
“…”
标识符来得到。但是参数可变函数那些可变的参数是没有参数标识符的,它只有
,所
以通过标识符来得到是不可能的,我们只有另辟途径。
我们知道函数调用时都会分配栈空间,而函数调用机制中的栈结构如下图所示:
| ...... |
------------------
| 参数 2 |
------------------
| 参数 1 |
------------------
|
返回地址
|
------------------
|调用函数运行状态|
------------------
可见,参数是连续存储在栈里面的,那么也就是说,我们只要得到可变参数的前一个参
数的地址,就可以通过指针访问到那些可变参数。但是怎么样得到可变参数的前一个参数