C语言可变长参数列表原理与实现
来源:互联网 发布:mysql触发器 编辑:程序博客网 时间:2024/06/05 14:56
可变参数在编程中的实现。
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 0
- C语言可变长参数列表原理与实现
- C语言可变长参数实现原理
- C语言可变长参数实现原理
- C语言可变长参数实现“多态”
- 【c语言】实现可变参数列表
- C语言可变长参数函数与默认参数提升
- C语言可变长参数函数与默认参数提升
- C语言可变长参数函数与默认参数提升
- C语言可变长参数函数与默认参数提升
- C 语言可变参数实现原理
- C语言可变参数函数实现原理
- C语言可变参数函数实现原理
- C语言:va_start、va_end、va_arg 实现可变长参数
- C语言 可变长参数函数的实现
- c语言:可变参数列表
- 【C语言】可变参数列表。
- C语言,可变参数列表
- C语言可变参数列表
- fromLocal8Bit()函数
- C++模板
- 在Eclipse里搭建Jpress项目
- TmodJS 解决前端模板外置
- 数据结构与算法之——二叉树的创建及遍历
- C语言可变长参数列表原理与实现
- Unity性能优化
- struts2--1.入门程序
- spark算子join讲解
- 求N范围内的所有素数
- Codeforces Round #277 (Div. 2) C
- 谈谈小白眼里的竞品分析究竟为什么要这么做
- 继承—子父类中的构造函数-子类的实例化过程
- 我的Java之旅 第八课 Servlet 进阶API、过滤器与监听器