[置顶] 函数传递不定参数理解-c语言
2024-10-19 00:26:10
感性认识
Typedef char *va_list;/*这个在<stdatg.h>中有定义*/
#define va_start(ap,p) (ap=(char*)(&(p)+1))
#define va_arg(ap,type) ((type*)(ap+=sizeof(type)))[-1]
#defien va_end(ap) /*下面为测试函数*/
#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>
void fun(char *s, ... ) /* ...为声明不定个数参数*/
{
va_list ap;
int t; /*与main()中的a,b,c 相同的类型声明*/
va_start(ap,s);
printf("%s",s);
while((t=va_arg(ap,int)))
printf("%d",t);
va_end(ap);
}
main()
{
int a=1,b=2,c=3;
fun('test:",a,b,c,NULL);/*以NULL作结束*/
printf("\n");
}
解释内部宏定义
1、#define va_start(ap,p) (ap=(char*)(&(p)+1))
参数ap: 获取fun函数形参 ... 中第一个元素地址;
2、#define va_arg(ap,type) ((type*)(ap+=sizeof(type)))[-1]
参数ap: 移动到后一个参数元素地址;
1)、ap 是字符指针,所有ap+1意思是向下移动一个地址[因为一个地址存放8位(一个字符)],
2)、ap += sizeof(type):意思是更具类型移动相应的位置;[如果type是int型那么ap向后移4个地址]
3)、(type *)(指针地址)[-1]:整体含义就是回到ap上一个地址位置;
(type *)(指针地址):指向ap下一个指针地址强转为(type *)型;
(指针地址)[-1]:根据指针地址类型向后前移动一个位置;[如果type是int,就向前移4个地址]
[注意:
1)、一个地址存放8位;
2)、指针移动的位置是依据指针类型移动的;
如果 char * p,移动则是1个地址;如果 char ** p,移动则是4个地址(char ** 指针32位存储); 如果 int * p,移动则是也是4个地址(int * 也是一个指针地址)]
#defien va_end(ap)
表示结束。
最新文章
- kettle系列-6.kettle实现多字段字典快速翻译
- compass color 颜色 对比色[Sass和compass学习笔记]
- IOS OC 多任务定时器 NSRunLoop 管理 NSTimer
- 【Other】Ubuntu 14.04 pptp 客户端连接配置
- ansible 配置运行环境
- linux 内存管理——内核的shmall 和shmmax 参数
- js获取时间天数
- 挺有意思的HBase日志+Splunk
- Linux 编程学习笔记----文档管理系统
- OS X升级到10.10使用后pod故障解决方案出现
- 《Effective C#》读书笔记-1.C# 语言习惯-1.使用属性而不是可访问的数据成员
- 控制器controller与指令中的link、controller中变量作用域的关系
- Notepad++ 运行java(转)
- Android超精准计步器开发-Dylan计步
- NumPy 学习笔记(一)
- 关于使用的xshll和xftp中乱码咋办?
- c pointer
- docker stack 部署 rabbitmq 容器
- Lua脚本语言基础知识
- C语言的第一天
热门文章
- bzoj2797
- BZOJ2429: [HAOI2006]聪明的猴子
- Android development tools line_endings hacking
- Woobuntu woobuntu_build.sh hacking
- AngularJS promise()
- 【 D3.js 视频系列 】 飞速入门
- 省常中模拟 Test3 Day1
- yum install错误 系统环境:Oracle Linux5.4 在通过yum安装软件时出现以下错误:
- POJ 1811 Prime Test
- ylbtech-权限管理-数据库设计-功能权限管理技术