c语言不定参数个数,C语言中不定参数的实现
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
但是请注意,由於 K&R C 中并不检查参数型态,so 在此是用 ANSI
C 来说明,毕竟 ANSI C 是目前所有 C Compiler 都支援的标准;常在
网路上看到有人推荐 K&R The C Programming Language 这本书,老
实说这本是不错(我以前也是看这本),但因为 K&R C 慢慢因为 ANSI
C 的完整标准出现,而面临考验,所以我建议若是初学者先从 ANSI C
看起,等对 ANSI C 的标准了解後,再回头看这本(其实不看也没差,虽
然它号称 C 语言圣经,但时代在变,有些东东开始不适用。不过还是有
看的价值)
//
// 固定的参数一定要放前面!!
int FUNC(int xx,...)
{
int tmp;
va_list arg_ptr; // 用va_list声明指向引数列表的 Pointer
va_start(arg_ptr,xx); // 从引数表中取得第一个引数
// 第一个引数就是 xx 自己(xx是最后一个固定变量)
tmp=va_arg(arg_ptr,int); // 从引数表中取得int 型态引数
// 一直呼叫 va_arg 即可取得所
// 有引数(第二个参数int是当前不定变量的类型 )
va_end(arg_ptr); // 取完後将 arg_ptr = NULL
// 以便归还 stack 空间(要在所有的不定变量引用完之后再用va_end(),否则会有无法预测的结果。)
}
理论上不定参数是可以无限多的,但碍於 memory 及 stack 大小
所以项数通常有上限,如 Turbo C 最多 200 个,一超过就出现如下
" Fatal stack overflow error-System halted ",然後当掉,你连
暖开机都不行;所以当你使用一套 Compiler 时一定要有其参考手册
或资料,以免搞半天除错後,还找不出原因!!
(P.S. 像 Turbo C 2.0 只能用 4000 个 if ,....太多要注意的!!)
说了一堆,不知道你会用了没?! 最後用一个画多边型的函数做□
例,顺便做结束。
/* EX */
#include // 记得要 include 才能用
#define END_P -400 // 用来判断是否为最後一个参数
void DrawPoly(int color,...)
{
va_list arg_ptr;
int x[200],y[200]; // 最多 200 个点
int p_c=0; // 计算有几点
int i; // 计数器
va_list(arg_ptr,color);
while(((x[p_c]=va_arg(arg_ptr,int))>END_P) \
&&((y[p_c]=va_arg(arg_ptr,int))>END_P)\
&& p_c<=200) // 不是最後一点且小於 200 个点
p_c++;
if(p_c<3) return ; // 不到 3 点不成一多边型,So 跳出
for(i=0;i
// 划线,每个 Compiler 不同,自行修改
line(x[i],y[i],x[i+1],y[i+1],color);
// 最後一条线
line(x[0],y[0],x[p_c-1],y[p_c-1],color);
va_end(arg_ptr);
}
c语言不定参数个数,C语言中不定参数的实现相关推荐
- 函数计算乘积python multi_实现multi()函数,参数个数不限,返回所有参数的乘积。_学小易找答案...
[其它]编写函数,判断用户传入的字符串参数长度是否大于 5 . [单选题]关于 Python 循环结构,以下选项中描述错误的是 ( ) [单选题]字符串是一个字符序列,例如,字符串s,从右侧向左第3个 ...
- java中重载 参数顺序_Java方法中的参数太多,第4部分:重载
java中重载 参数顺序 期望将过多的参数传递给Java方法的问题之一是,该方法的客户端很难确定它们是否以适当的顺序传递了适当的值. 在以前的文章中,我描述了如何使用自定义类型 , 参数对象和构建器来 ...
- java自定义方法参数注解_Java方法中的参数太多,第1部分:自定义类型
java自定义方法参数注解 我认为构造函数和方法中冗长的参数列表是Java开发中的另一个" 危险信号 ",就逻辑和功能而言,它们不一定是"错误的",但通常暗示当 ...
- java 可变参数方法_Java方法中的参数太多,第7部分:可变状态
java 可变参数方法 在我的系列文章的第七篇中,有关解决Java方法或构造函数中过多参数的问题 ,我着眼于使用状态来减少传递参数的需要. 我等到本系列的第七篇文章来解决这个问题的原因之一是,它是我最 ...
- php怎么给接口里的方法传参,PHP接口中方法的参数和实现类方法中的参数可以不一致的问题...
interface Dispatch2 { public function getController(); } class QueryString implements Dispatch2 { pu ...
- java命令行参数工具_Java方法中的参数太多,第8部分:工具
java命令行参数工具 在我的系列文章的前七篇文章中,有关处理Java方法中期望的参数过多的内容集中在减少方法或构造函数期望的参数数量的替代方法上. 在本系列的第八篇文章中,我将介绍一些工具,这些工具 ...
- eta 深度学习 参数_深度学习中的参数梯度推导(一)
必备的数学知识 矩阵微分与求导 前言 深度学习向来被很多人认为是"黑盒",因为似乎很多人都不清楚深度学习的运作方式,本系列<深度学习中的数学>的连载文章主要目的就是向大 ...
- linux 参数扩展,Shell Bash 中的参数扩展
对于访问 $9 之后的位置参数也同样需要使用大括号,比如: echo "Argument 1 is $1" echo "Argument 10 is ${10}" ...
- Laravel同时接收路由参数和查询字符串中的参数
Laravel捕捉路由参数 Laravel允许在controller方法中捕捉路由里定义的参数,如下所示: 路由中定义参数: Route::get('post/{id}', 'PostControll ...
- 【C# .NET】Oracle数据库连接的坑之传入parameters参数名SQL语句中的参数变量名不匹配(顺序不一致)的问题
问题描述 有一个user表,需要修改id为10086的用户的姓名和年龄,在C#的后台这样写: using (IDbConnection db = DapperFactory.GetConnection ...
最新文章
- 终于,Geoffrey Hinton那篇备受关注的Capsule论文公开了
- Python一些特殊用法(map、reduce、filter、lambda、列表推导式等)
- linux磁盘分区fdisk命令详解
- TroubleShoot
- 第三篇——第二部分——第一文 SQL Server镜像简介
- 安装debian的zabbix-agent客户端
- akka_Akka的字数统计MapReduce
- .Net序列化与反序列化的2种方法
- hdu 2049 考新郎
- java 反射的效率_如何提高使用Java反射的效率?
- aix ssh服务??
- matlab求工质热物性,以R245fa为工质的高温水源热泵样机研制及实验研究
- linux环境做路径左斜杠和右斜杠,不同操作系统下的路径分隔符—反斜杠与斜杠...
- html中放大镜字体图标,CSS3 放大镜应用图标
- TypeScript - 函数
- python打开csv忽略错误_在python中读取错误的格式csv
- 电脑上下载mysql是不是很慢_为什么电脑下载速度很慢?
- TKinterDesigner界面背景和操作界面调试,TKinterDesigner教程(3)
- 区块链安全100问 |​ 第五篇:黑客通过这些方法盗取数字资产,看看你是否中招?
- at命令介绍及简单使用
热门文章
- python小球弹弹弹_python实现小球弹跳效果
- R plot图片背景设置为透明_学习健明老师发布的R语言练习题的学习笔记(一)...
- UNREAL ENGINE 4.13 正式发布!
- 工作于内存和文件之间的页缓存, Page Cache, the Affair Between Memory and Files
- UE3 Lightmass 技术指南
- Unity3D中关于场景销毁时事件调用顺序的一点记录
- document.body.scrollTop用法
- iOS开发笔记 3、iOS基础
- TRUNCATE DELETE
- 获取指定远程网页内容