C语言可变长参数列表原理与实现

可变参数在编程中的实现。
stdarg.h标准库提供的宏支持了可变长参数列表的使用。
当然,在一些情况下也可以自己通过其实现原理来使用可变长参数编程。
条件一:
C语言编程中函数的形参入栈顺序都是从右至左。栈的生长方向是,低地址《—— 高地址,而且栈由系统分配,不存在碎片化内存。
结论:只要知道一个参数的地址,就可以顺势推出其他参数的地址。

在使用可变长参数的情形下,都会想方设法的标注参数的类型和个数,因为我们无从得知!
最经典的用法:extern int printf(const char *format,…);函数,再给出的一个个%d和%f等等条件中,统计%即可知道携带了几个参数,与%之配对的字符代表了对应位置的
参数类型。
假设:printf(“a:%d , b:%f!”, 10, 20.0f);
编程思路:
遇到了第一个%代表该取参了:
char *p = &format+1;//指向第一个参数10的低地址
并且第一个%匹配的参数是类型“d”,那就通过 int a = (int )p;来取数,顺便 p += sizeof(int);使其指向下一段内存的低地址。

//试验源码
#include<stdlib.h>
#include<stdio.h>
int print(int nnum,...);

int main()
{
    print(1, 2, 3.0f, 4, 5);
    system("pause");
}

int print(int nnum, ...)
{
    char *p =(char *)(&nnum + 1);   
    printf("%d", *(int *)p);
    p += sizeof(int);
    printf("%f", *(double *)p);//很多编译器总是以double长度来存储float,取用的时候进行截断。
    p += sizeof(double);
    printf("%d", *(int *)p);
    p += sizeof(int);
    printf("%d", *(int *)p);
    p += sizeof(int);
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值