博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言函数的变参实用与分析
阅读量:7039 次
发布时间:2019-06-28

本文共 2523 字,大约阅读时间需要 8 分钟。

 

实现变参传递的关键是:

传入参数在内存中是连续分布的。

#define va_list void*#define va_arg(arg, type)     *(type*)arg; arg = (char*)arg + sizeof(type);#define va_start(arg, start)  arg = (va_list)(((char*)&(start)) + sizeof(start))#define va_end(arg)  arg = (void*)0 这四个宏其实是c语言定义好的在stdarg.h中。 通过va_start(arg, start)传入第一个参数以确定后面参数的地址。  va_arg(arg, type)取出arg的值,并将地址指向下一个
#include 
#define va_list void*#define va_arg(arg, type) *(type*)arg; arg = (char*)arg + sizeof(type);#define va_start(arg, start) arg = (va_list)(((char*)&(start)) + sizeof(start))#define va_end(arg) arg = (void*)0int sum(int nr, ...){ int i = 0; int result = 0; va_list arg = NULL;///不定类型指针 va_start(arg, nr);//让指针指向第二个参数地址 for(i = 0; i < nr; i++) { result += va_arg(arg, int); } va_end(arg); return result;}int main(int argc, char* argv[]){ printf("%d\n", sum(4, 100,100,100,100)); printf("%d\n", sum(3, 200, 200, 200)); return 0;}

 

 

#include 
#include
#include
/* #define va_list void*#define va_arg(arg, type) *(type*)arg; arg = (char*)arg + sizeof(type);#define va_start(arg, start) arg = (va_list)(((char*)&(start)) + sizeof(start))这些在stdarg.h中定义过 */void printf_diy(char *fmt,...) { va_list arg; //定义一个不定类型指针 char c; va_start(arg, fmt); //arg指向下一个参数 do { c = *fmt; if(c != '%'){ putchar(c); //输出 } else { fmt++; switch(*fmt) { case 'd': printf("%d", *((int*)arg)); break; case 'x': printf("%#x", *((int*)arg)); break; case 'f': printf("%f", *((float*)arg)); default: break; } va_arg(arg,int); } ++fmt; } while (*fmt != '\0'); va_end(arg); return; } int main(int argc, char **argv) { int i = 1234; int j = 5678; float f = 13.9; printf_diy("i = %d\n", i); printf_diy("j = %d\n", j); printf_diy("f = %f\n", f); return 0; }

 

转载于:https://www.cnblogs.com/PengfeiSong/p/6274853.html

你可能感兴趣的文章
[数据结构]浅谈哈希表的冲突避免策略
查看>>
python全栈考试作业 2017-03-30
查看>>
easyshell 安装
查看>>
UITextView 点击添加文字 光标处于最后方
查看>>
kudu 1.8.0(开发版) 源码安装
查看>>
LVS+Keepalived实现MySQL从库读操作负载均衡
查看>>
【转载】说说标准服务器架构(WWW+Image/CSS/JS+File+DB)续测试环境搭建
查看>>
day13-类的重写和类的私有方法
查看>>
[LeetCode][Java] Unique Paths II
查看>>
哈理工2015 暑假训练赛 zoj 2976 Light Bulbs
查看>>
Notes for C++
查看>>
web前端职业规划(转)
查看>>
用户体验 的一个原则,
查看>>
常用面试sql语句
查看>>
Kafka - 消费接口分析
查看>>
<s:property value=""/> 获取属性时的各种方式
查看>>
RF-RequestsLibrary
查看>>
【HDOJ】1892 See you~
查看>>
同伦延拓法中的几个数学常识
查看>>
毕业论文如何排版
查看>>