博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言可变参数,参数传递
阅读量:6420 次
发布时间:2019-06-23

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

1、函数形参的存储

函数形参在函数中存储是按照栈的方式来存储的

实例:

#include 
void fun(int a0,int a1,int a2, int a3){ int *temp; temp=&a0; int i; for(i=0;i<4;i++){ printf("%d\t",*temp++); }}int main(){ fun(1,2,3,4); getchar(); return 0;}

函数输出为:

1  2  3  4

2、一般函数的定义在内存中的存储方式

一般的变量定义之后,相同的变量类型存储在相邻的一块内存

例子:

#include 
int main(){ int a0=1; char c0='a'; double d0=1.1; char c1='b'; double d1=2.2; int a1=2;  int a2=3; int *pint = &a0; char *pch = &c0; double *pd = &d0;
printf("%p:%d\n", pint, *pint);    pint++;    printf("%p:%d\n", pint, *pint);    pint++;    printf("%p:%d\t%p\n", pint, *pint);    printf("%p:%c\n", pch, *pch);    pch++;    printf("%p:%c\n", pch, *pch);    printf("%p:%.2f\n", pd, *pd);    pd++;    printf("%p:%.2f\n", pd, *pd);}

输出:

0xbf944c54:1

0xbf944c58:2
0xbf944c5c:3
0xbf944c6e:a
0xbf944c6f:b
0xbf944c40:1.10
0xbf944c48:2.20

**这个结论只是对于我自己的编译器的结果,具体可能对于另外一个编译器的输出有有可能不一样,而且,如果把有变量没有使用过的话,编译器有可能丢弃它(自己的猜想而已,等过阵子研究《深入理解计算机系统》的时候在研究这个问题)。

3、C语言给我们的可变形参va_list

头文件stdarg.h

下面定义了四个宏:

1. va_list

在stdarg.h中定义:typedef char  *   va_list;

2. void va_start(va_list ap,last);

这是第一个调用的宏,last是可变参数的前一个确定的参数。因此只有可变参数的函数是不允许的,如fun(...)是不合法的。

#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )              //第一个可选参数地址

3. void va_arg(va_list ap, type);

返回当前参数并且使ap指向下一个参数,type是明确的类型名,就是获取的类型,不是。

#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //下一个参数地址

4. void va_end(va_list ap);

有va_start就必须有va_end,作用是使释放ap

#define va_end(ap)       ( ap = (va_list)0 )                               // 将指针置为无效

4. void va_copy(va_list dest, va_list src);

每次调用va_copy时也必须要有va_end调用。

例子:

#include 
#include
void fun(int a,...){ va_list ap; va_start(ap, a); int i; for(i=0; i

 

输出:

1 2 3 4

--------------------------------
1 2 134514184 134514181

转载地址:http://vnlra.baihongyu.com/

你可能感兴趣的文章
网络爬虫的第一个实例
查看>>
拒绝背后黑手的窥探IPC$漏洞大揭秘
查看>>
DBImport v3.0 中文版发布-支持各大数据库数据互导(IT人员必备工具)
查看>>
WCF服务在JavaScript中使用ASP.NET的AJAX方法
查看>>
谈一谈Cocos2d-x中的某些“大小”
查看>>
加强网站安全、重构公司的门户网站项目(C# VS2003)
查看>>
windows下ACS服务器的认证(h3c)【路由器、交换机】
查看>>
Android通过Socket与服务器进行通信
查看>>
你看到的都是错的!——虚拟化技术的真相
查看>>
打印机的一些高级设置
查看>>
好用的Java数学表达式计算工具——Exp4j
查看>>
浅谈ListBox在Windows Phone 7 中的使用(2)
查看>>
FreeBSD下挂载EXT2,FAT32,NTFS文件系统解决方案下挂载EXT2,FAT32,NTFS文件系统解决方案...
查看>>
拦截器实现文件过滤
查看>>
App-V 4.6 SP1系列之一安装
查看>>
FreeRADIUS 负载均衡和高可用
查看>>
ansible-playbook批量部署zabbix
查看>>
静默安装Oracle数据库10g篇
查看>>
2017软考信息系统项目管理师软考热点
查看>>
十个生成模型(GANs)的最佳案例和原理 | 代码+论文
查看>>