valist:解决变参问题

valist:解决变参问题1 概述 va list 是在 C 语言中引入解决变参问题的一组宏 变参问题是指参数的个数不定或者每个参数的类型不同 头文件 include lt stdarg h gt 2 使用步骤 va list 是一个字符指针类型 在代码中可以理解成当前参数集的指针 下面是几个与 va list 相关常见的函数 1 typedefchar va list 2

1. 概述

va_list 是在 C 语言中引入解决变参问题的一组宏,变参问题是指参数的个数不定或者每个参数的类型不同。

头文件: #include 
   

2. 使用步骤

va_list 是一个字符指针类型,在代码中可以理解成当前参数集的指针,下面是几个与 va_list 相关常见的函数

1. typedef char* va_list; 2. void va_start (va_list ap, prev_param); $ 对 va_list 进行初始化,将 ap 指针指向参数列表中的第一个参数 $ 第一个参数是 va_list 指针,第二个参数变参前面紧挨的一个变量,即"..."之前的那个参数 3. void va_end(va_list ap); $ 释放指针,将输入的参数 ap 置为 NULL。 $ 通常va_start和va_end是成对出现。 4. type va_arg(va_list ap, type);  $ 获取参数值,第一个参数 ap 指针,第二个参数是要获取的值类型 $ 返回这个指定类型的值,然后把 ap 指针位置指向变参表中下一个参数的位置

以一个例子进行说明

(1) 当出现无法列出所有传递参数数目和类型的时候,用省略号指定参数列表

void PrintInt (int cnt, ...)
void PrintInt(int cnt, ...) { va_list ap; int value; va_start(ap, cnt); for (int i = 0; i < cnt; i++) { value = va_arg(ap, int); printf("%d\n", value); } va_end(ap); } 

(3) 调用变参函数

int main(void) { PrintInt(4, 1, 2, 3, 4); }

输出结果为:

1 2 3 4

函数参数的传递原理

这里说明一下输出打印结果的原因,涉及函数参数的传递原理。

va_list 的实现原理过程中函数参数是以栈的形式存取,从右至左入栈。

参数的内存存放格式:参数存放在内存的堆栈段中,在执行函数的时候,从最后一个开始入栈。因此栈底高地址,栈顶低地址。

使用 va_arg 函数取出的时候从栈顶开始取,所以上面的例子中取出的第一个参数是 1.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228962.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午5:47
下一篇 2026年3月16日 下午5:48


相关推荐

  • python和java哪个更值得学 知乎_学完python再学java

    python和java哪个更值得学 知乎_学完python再学java​在编程界经常会引发一个讨论,就是python和Java哪个更值得学,Java语言具有跨平台的特性,在应用范围上有许多选择的余地,而Python在这几年的火热程度丝毫没有减退。个人观点,看学习的目的

    2025年6月19日
    3
  • mysql使用笔记(一)静态实现POVIT() 行转列

    mysql使用笔记(一)静态实现POVIT() 行转列mysql 静态实现 sqlserverPIV 函数写 Sql 语句的时候没经常会遇到将查询结果行转列 列转行的需求在 SqlServer200 中我们有了 PIVOT UNPIVOT 函数可以快速实现行转列和列转行的操作 1 sqlserver 中的 PIVOT 函数 1 1 函数参数与说明 PIVOT 聚合函数 聚合列值 FOR 行转列前的列名 IN 行转列后的列名 1 行转列后的列名 2 行转列后的列名 3 行转列后的列名 N 聚合函数

    2026年3月18日
    3
  • oracle怎么锁表以及解锁,Oracle锁表与解锁

    oracle怎么锁表以及解锁,Oracle锁表与解锁本文讲解如何查询Oracle中锁表的Session,并如何杀掉锁表进程.查看锁表语句:方法1:selectsess.sid,sess.serial#,lo.oracle_username,lo.os_user_name,ao.object_name,lo.locked_modefromv$locked_objectlo,dba_objectsao,v$sessionsesswherea…

    2022年6月17日
    84
  • UDP flood攻击_udp攻击是什么意思

    UDP flood攻击_udp攻击是什么意思UDPFlood是日渐猖厥的流量型DoS攻击,原理也很简单。常见的情况是利用大量UDP小包冲击DNS服务器或Radius认证服务器、流媒体视频服务器。100kpps的UDPFlood经常将线路上的骨干设备例如防火墙打瘫,造成整个网段的瘫痪。由于UDP协议是一种无连接的服务,在UDPFLOOD攻击中,攻击者可发送大量伪造源IP地址的小UDP包。但是,由于UDP协议是无连接性的,所以只要开了一个UDP的端口提供相关服务的话,那么就可针对相关的服务进行攻击。…

    2026年4月14日
    4
  • Js 数组转JSON格式

    Js 数组转JSON格式要点1:转化函数 JSON.stringify()要点2:在js里写数组的时候是vardata=newArray()但是你如果是要转json显示的时候就要写成vardata={},不然转出来的json全是空的。先看一种错误格式:&lt;script&gt;    //定义一个数组    vardata=newArray();    for(vari=0;i…

    2022年6月21日
    58
  • python操作gitlab_git的使用教程

    python操作gitlab_git的使用教程文章目录一、安装git二、pycharm配置gitlab1、在pycharmsetting中设置git.exe的目录2、VCS—Checkoutfromversioncontrol—Git3、pycharm自动生成.ignore文件三、pycharm中gitlab基础操作1、分支2、pull3、push4、merge一、安装git下载地址:https://git-scm.com/downloads安装说明:https://git-scm.com/downloads二、pycharm配置

    2022年8月25日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号