感性认识

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)

表示结束。

[置顶] 函数传递不定参数理解-c语言的更多相关文章

  1. CreateThread给线程函数传递的参数

      HANDLE WINAPI CreateThread ( __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, // 指向SECURITY_ATTR ...

  2. Python学习之路:函数传递可变参数与不可变参数

    函数传参的方法: 太基础了,8说了 直接上重点 一.可变参数的传递 可变参数有:列表.集合.字典 直接上代码: a = [1, 2] def fun(a): print('传入函数时a的值为:', a ...

  3. JS函数传递字符串参数(符号转义)

    原文链接:https://blog.csdn.net/Myname_China/article/details/82907965 JS函数传递字符串参数,如果没有转义处理,在接收的时候无法正确的接收字 ...

  4. 【VS开发】CreateThread给线程函数传递的参数

    CreateThread给线程函数传递的参数   HANDLE WINAPI CreateThread ( __in_opt LPSECURITY_ATTRIBUTES lpThreadAttribu ...

  5. PHP函数(二)-不定参数的传递

    如果要传递不定数量的参数,需要使用func_get_args()函数来传递 func_num_args()函数用来返回参数的总数 <?php function more_args(){ $arg ...

  6. python 函数传递可变参数的用法

    可变参数 在Python函数中,还可以定义可变参数.顾名思义,可变参数就是传入的参数个数是可变的,可以是1个.2个到任意个,还可以是0个. 我们以数学题为例子,给定一组数字a,b,c……,请计算a2 ...

  7. [置顶] webapi token、参数签名是如何生成的

    一个问题 在这里我想问大家一句,如果你向一个刚刚接触.net web后端程序开发的同学(别人刚刚也就学了webform的request,response,会提交表单的这种刚接触不久的同学),你怎么去解 ...

  8. C++和Java函数传递数组参数比较

    如果我想实现函数参数传递数组的业务需求,在Java中很容易实现,如下所示.因为Java有.length方法,可以获取数组的长度. public class Test { public static v ...

  9. thread - 传递引用参数

    当给 thread 的执行函数传递指针参数时,没有任何问题,但是如果想传递引用,按照普通函数的调用方法会遇到编译失败: #include <iostream> #include <t ...

随机推荐

  1. bzoj1412: [ZJOI2009]狼和羊的故事

    空地之间开始没有连然后一直WA...题意混乱...尴尬. #include<cstdio> #include<cstring> #include<iostream> ...

  2. 自己遇到的Android虚拟机出现的错误及解决方法【不断更新】

    2012.11.9 第一个: [2012-11-09 13:15:14 - Tesa] Android Launch! [2012-11-09 13:15:14 - Tesa] The connect ...

  3. 极光推送使用实例(二) Android客户端

    上一篇简单介绍了极光推送在Java服务端的实现,如果感兴趣的可以看一下极光推送使用实例(一)JAVA服务端.这篇文章介绍下极光推送在Android客户端的实现. JPush Android SDK 是 ...

  4. codeforces 340C Tourist Problem(简单数学题)

    题意:固定起点是0,给出一个序列表示n个点,所有点都在一条直线上,其中每个元素代表了从起点到这个点所走的距离.已知路过某个点不算到达这个点,则从起点出发,到达所有点的方案有许多种.求所有方案走的总路程 ...

  5. How to modify squashfs image

    /********************************************************************** * How to modify squashfs ima ...

  6. 求双连通分量的详解。(根据刘汝佳的训练指南p314)

    无向图的双连通分量 点-双连通图:一个连通的无向图内部没有割点,那么该图是点-双连通图.         注意:孤立点,以及两点一边这两种图都是点-双连通的.因为它们都是内部无割点. 边-双连通图:一 ...

  7. 基于phpExcel写的excel类

    <?php /* * 类的功能 * 传入二位数组导出excel * 传入excel 导出二位数组 * @author mrwu */ require('PHPExcel.php'); requi ...

  8. noip2004提高组题解

    这次有两道题以前已经做过了,所以分数什么的也没有意义了.发现这年的难度设置极不靠谱,前三题都比较简单,最后一题太难,不知道出题人怎么想的. 第一题:储蓄计划 模拟. 第二题:合并果子 贪心.每次选最小 ...

  9. 在linux下实现用ffmpeg把YUV420帧保存成图片

    在网上搜了很久相关的问题,但是好像没有一个在linux下跑得比较完整的例子,不过经过自己一番搜索和总结,终于做出来了,哈哈,看下面的代码吧. 这个例子可以保存成bmp或者jpeg格式的图片. 下面的结 ...

  10. poj 2373 Dividing the Path

    Dividing the Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2858   Accepted: 1064 ...