[置顶] 函数传递不定参数理解-c语言
感性认识
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语言的更多相关文章
- CreateThread给线程函数传递的参数
HANDLE WINAPI CreateThread ( __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, // 指向SECURITY_ATTR ...
- Python学习之路:函数传递可变参数与不可变参数
函数传参的方法: 太基础了,8说了 直接上重点 一.可变参数的传递 可变参数有:列表.集合.字典 直接上代码: a = [1, 2] def fun(a): print('传入函数时a的值为:', a ...
- JS函数传递字符串参数(符号转义)
原文链接:https://blog.csdn.net/Myname_China/article/details/82907965 JS函数传递字符串参数,如果没有转义处理,在接收的时候无法正确的接收字 ...
- 【VS开发】CreateThread给线程函数传递的参数
CreateThread给线程函数传递的参数 HANDLE WINAPI CreateThread ( __in_opt LPSECURITY_ATTRIBUTES lpThreadAttribu ...
- PHP函数(二)-不定参数的传递
如果要传递不定数量的参数,需要使用func_get_args()函数来传递 func_num_args()函数用来返回参数的总数 <?php function more_args(){ $arg ...
- python 函数传递可变参数的用法
可变参数 在Python函数中,还可以定义可变参数.顾名思义,可变参数就是传入的参数个数是可变的,可以是1个.2个到任意个,还可以是0个. 我们以数学题为例子,给定一组数字a,b,c……,请计算a2 ...
- [置顶]
webapi token、参数签名是如何生成的
一个问题 在这里我想问大家一句,如果你向一个刚刚接触.net web后端程序开发的同学(别人刚刚也就学了webform的request,response,会提交表单的这种刚接触不久的同学),你怎么去解 ...
- C++和Java函数传递数组参数比较
如果我想实现函数参数传递数组的业务需求,在Java中很容易实现,如下所示.因为Java有.length方法,可以获取数组的长度. public class Test { public static v ...
- thread - 传递引用参数
当给 thread 的执行函数传递指针参数时,没有任何问题,但是如果想传递引用,按照普通函数的调用方法会遇到编译失败: #include <iostream> #include <t ...
随机推荐
- uva12034Race
递推,组合. 考虑第一名有i个人,则f[n]=sum(C(n,i)*f[n-i]),递推即可.. #include<cstdio> #include<algorithm> #i ...
- iOS开发:Swift多线程NSOperation的使用
介绍: NSOperation是基于GCD实现,封装了一些更为简单实用的功能,因为GCD的线程生命周期是自动管理,所以NSOperation也是自动管理.NSOperation配合NSOperatio ...
- UVa 11330 (置换 循环的分解) Andy's Shoes
和UVa11077的分析很类似. 我们固定左脚的鞋子不动,然后将右脚的鞋子看做一个置换分解. 对于一个长度为l的循环节,要交换到正确位置至少要交换l-1次. #include <cstdio&g ...
- UVa 11400 Lighting System Design【DP】
题意:给出n种灯泡,分别给出它们的电压v,电源费用k,每个灯泡的费用c,和所需灯泡的数量l,问最优方案的费用 看的紫书= = 首先是dp[i]为灯泡1到i的最小费用, dp[i]=min(dp[i], ...
- jquery图表插件morris.js参数详解和highcharts图表插件
一.morris.js 优点:轻巧.简单好用 缺点:没highcharts功能多,常用的足以 网址:http://morrisjs.github.io/morris.js/ 核心代码 1.head调用 ...
- windows装liunx双系统
http://jingyan.baidu.com/article/60ccbceb18624464cab197ea.html http://jingyan.baidu.com/article/76a7 ...
- 【<td>】使<td>标签内容居上
<td>有一个叫valign的属性,规定单元格内容的垂直排列方式.有top.middle.bottom.baseline这四个值. 所以,让TD中的内容都居上的实现方法是: <td ...
- Android开发中如何调用摄像头的功能
我们要调用摄像头的拍照功能,显然 第一步必须加入调用摄像头硬件的权限,拍完照后我们要将图片保存在SD卡中,必须加入SD卡读写权限,所以第一步,我们应该在Android清单文件中加入以下代码 & ...
- 给table中某一列的文字右对齐
一般来说,没写过jquery的前端人员,肯定是定义一个class,给每一行的那列加上align_r{text-align:right}.这是很麻烦的. 所以用jquery来写,可以$("ta ...
- android bin目录下的.ap_是神马文件?
resources.ap_ resources翻译过来是资源的意思 应该就是一种中间文件,可以改成rar.zip等压缩文件的类型,里面包含res.AndroidMainfest.xml.resourc ...