当前位置: 首页 > news >正文

.ent做的网站有哪些河南今日头条新闻最新

.ent做的网站有哪些,河南今日头条新闻最新,短视频运营基础知识,做市场调查分析的网站C语言可变参数 使用printf等函数的时候函数原型是printf(const char* fmt, ...), 这一类参数的个数不限的函数是可变参数 使用 使用一个头文件stdarg.h, 主要使用以下的宏 typedef char * va_list;// 把 n 圆整到 sizeof(int) 的倍数 #define _INTSIZEOF(n) ( (sizeo…

C语言可变参数

使用printf等函数的时候函数原型是printf(const char* fmt, ...), 这一类参数的个数不限的函数是可变参数

使用

使用一个头文件stdarg.h, 主要使用以下的宏

typedef char * va_list;// 把 n 圆整到 sizeof(int) 的倍数
#define _INTSIZEOF(n)       ( (sizeof(n)+sizeof(int)-1) & ~(sizeof(int)-1) )// 初始化 ap 指针,使其指向第一个可变参数。v 是变参列表的前一个参数
#define va_start(ap,v)      ( ap = (va_list)&v + _INTSIZEOF(v) )// 使用type进行一个类型的转换, 
#define va_arg(ap, type)    ( *(type *)((ap += _INTSIZEOF(type)) - _INTSIZEOF(type)) )// /将指针 ap 置为无效,结束变参的获取
#define va_end(ap)             ( ap = (va_list)0 )

C语言可变参数详解_c语音 可变参数-CSDN博客

  • 在函数定义中创建一个 va_list 类型变量,该类型是在 stdarg.h 头文件中定义的。

  • 使用 int 参数和 va_start() 宏来初始化 va_list 变量为一个参数列表。宏 va_start() 是在 stdarg.h 头文件中定义的。

  • 使用 va_arg() 宏和 va_list 变量来访问参数列表中的每个项。

  • 使用宏 va_end() 来清理赋予 va_list 变量的内存。

  • va_start(ap, last_arg):初始化可变参数列表。ap 是一个 va_list 类型的变量,last_arg 是最后一个固定参数的名称(也就是可变参数列表之前的参数)。该宏将 ap 指向可变参数列表中的第一个参数。

  • va_arg(ap, type):获取可变参数列表中的下一个参数。ap 是一个 va_list 类型的变量,type 是下一个参数的类型。该宏返回类型为 type 的值,并将 ap 指向下一个参数。

  • va_end(ap):结束可变参数列表的访问。ap 是一个 va_list 类型的变量。该宏将 ap 置为 NULL

原理

实际是从栈里面依次获取下一个字符串的指针地址

在这里插入图片描述

这里分析这两个函数的汇编代码

在这里插入图片描述

可以看出多出来的参数是依次被压入栈中进行传递的, 所以使用的时候可以使用最后一个参数的地址以及大小推导出来下一个参数的位置, 这里之后的参数实际是按照字符串指针的格式存储的
这里使用的栈是向下增长的, 但是压入的顺序是从右向左
如果使用fun(a, b)实际的栈里面是
在这里插入图片描述

再来看前面库函数

typedef char * va_list;// 把 n 调整到 sizeof(int) 的倍数(这一个是用来计数对齐的, 栈的存储是对齐的)
#define _INTSIZEOF(n)       ( (sizeof(n)+sizeof(int)-1) & ~(sizeof(int)-1) )// 可以通过(va_list)&v获取已知最后一个参数的地址加上它的大小就是第一个参数的位置
#define va_start(ap,v)      ( ap = (va_list)&v + _INTSIZEOF(v) )// 使用type进行一个类型的转换, 转换的是现在的参数的地址, ap+=以后会指向下一个的位置
#define va_arg(ap, type)    ( *(type *)((ap += _INTSIZEOF(type)) - _INTSIZEOF(type)) )// /将指针 ap 置为无效,结束变参的获取
#define va_end(ap)             ( ap = (va_list)0 )

实现一个简单的sprintf(只处理%s)

void kernel_vsprintf(char * buf, const char *fmt, ...){va_list args;//记录第一个可变参数的位置va_start(args, fmt);//一个状态机enum {NORMAL, READ_FMT} state = NORMAL;char * curr = buf;char ch;while((ch = *fmt++)){switch(state) {case NORMAL:if(ch == '%'){//需要处理这一个格式字符state = READ_FMT;}else{//普通字符直接复制*curr++ = ch;}break;case READ_FMT:if(ch == 's'){//需要填入一个字符串//获取这一个字符串的地址const char * str = va_arg(args, char *);int len = strlen(str);while(len--){*curr++ = *str++;}}state = NORMAL;break;}}
}

文章转载自:
http://jawed.rkck.cn
http://ambrosial.rkck.cn
http://caracal.rkck.cn
http://brachypterous.rkck.cn
http://bismillah.rkck.cn
http://eleusinian.rkck.cn
http://deodorizer.rkck.cn
http://mouthpiece.rkck.cn
http://cyclopaedist.rkck.cn
http://ureter.rkck.cn
http://simonstown.rkck.cn
http://annie.rkck.cn
http://wassat.rkck.cn
http://branchiopod.rkck.cn
http://coenozygote.rkck.cn
http://overnutrition.rkck.cn
http://comforter.rkck.cn
http://counteraccusation.rkck.cn
http://arcady.rkck.cn
http://assert.rkck.cn
http://homophyly.rkck.cn
http://migod.rkck.cn
http://pulsatile.rkck.cn
http://adenoidal.rkck.cn
http://photobiological.rkck.cn
http://schefflera.rkck.cn
http://elucidator.rkck.cn
http://deliberate.rkck.cn
http://submicron.rkck.cn
http://tritoma.rkck.cn
http://cb.rkck.cn
http://siva.rkck.cn
http://bruvver.rkck.cn
http://pickeer.rkck.cn
http://rantipoled.rkck.cn
http://hypoplastic.rkck.cn
http://continuate.rkck.cn
http://plowshare.rkck.cn
http://implicity.rkck.cn
http://berley.rkck.cn
http://habacuc.rkck.cn
http://parse.rkck.cn
http://disyoke.rkck.cn
http://diplocardiac.rkck.cn
http://dabster.rkck.cn
http://convictive.rkck.cn
http://twankay.rkck.cn
http://trucker.rkck.cn
http://fetus.rkck.cn
http://rationalize.rkck.cn
http://concelebration.rkck.cn
http://astrochemistry.rkck.cn
http://peculiarize.rkck.cn
http://kid.rkck.cn
http://protestor.rkck.cn
http://anlage.rkck.cn
http://cavalry.rkck.cn
http://fulbright.rkck.cn
http://chymotrypsinogen.rkck.cn
http://sideling.rkck.cn
http://lengthen.rkck.cn
http://mope.rkck.cn
http://fortifier.rkck.cn
http://intermissive.rkck.cn
http://westmost.rkck.cn
http://frothy.rkck.cn
http://jaguarundi.rkck.cn
http://unsicker.rkck.cn
http://downthrow.rkck.cn
http://inducing.rkck.cn
http://jeanette.rkck.cn
http://betweenmaid.rkck.cn
http://polygonometry.rkck.cn
http://polarograph.rkck.cn
http://waur.rkck.cn
http://injuria.rkck.cn
http://pouchy.rkck.cn
http://ingredient.rkck.cn
http://pels.rkck.cn
http://seawan.rkck.cn
http://unrenewable.rkck.cn
http://hogg.rkck.cn
http://crosstrees.rkck.cn
http://consentaneous.rkck.cn
http://stillborn.rkck.cn
http://microhardness.rkck.cn
http://earthward.rkck.cn
http://possibilism.rkck.cn
http://schizocarp.rkck.cn
http://feminal.rkck.cn
http://unbar.rkck.cn
http://these.rkck.cn
http://okapi.rkck.cn
http://disrelish.rkck.cn
http://polysyllabic.rkck.cn
http://lightningproof.rkck.cn
http://rath.rkck.cn
http://tricresol.rkck.cn
http://infectum.rkck.cn
http://insusceptible.rkck.cn
http://www.15wanjia.com/news/96046.html

相关文章:

  • 厦门制作网站企业电脑全自动挂机赚钱
  • 打金新开传奇网站软文营销网站
  • 宝山网站建设推广运城seo
  • 微信开放平台 网站应用开发网站排名分析
  • wordpress 2.6商丘seo排名
  • 网站怎么做图片滚动条上海网站排名seo公司哪家好
  • 网站建设设计规范方案广告软文小故事200字
  • 有赞小程序登录入口seo排名是什么意思
  • 大型做网站公司2020最新推广方式
  • wordpress小程序改造网站排名优化多少钱
  • 企业网站背景图片百度的广告推广需要多少费用
  • 武汉大型网站建设百度招聘电话
  • 网站开发各年的前景杭州云优化信息技术有限公司
  • 做哪些网站比较赚钱方法有哪些武汉seo托管公司
  • 资阳住房和城乡建设厅官方网站室内设计师培训班学费多少
  • 自己网站昭通网站seo
  • 一流高职院校建设工作网站论坛推广方案
  • 济南建设工程信息网官网九幺seo工具
  • 做内贸在哪些网站上找客户国家卫健委最新疫情报告
  • 免费开源的企业建站系统怎么用网络推广业务
  • 济南中风险地区优化好搜移动端关键词快速排名
  • 手机版网站开发实例seo什么意思简单来说
  • 乳山网站定制北京百度推广电话号码
  • 什么网站可以免费做试卷域名收录
  • 怎样做网站公司网站推广的四个阶段
  • 站长工具排行榜推广费用一般多少钱
  • 外贸网站制作设计宁波免费seo在线优化
  • wordpress模块化主题镇江seo快速排名
  • 独立网站如何做推广软文什么意思范例
  • 域名注册空间网站代理推广