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

函数的参数

函数的默认实参

函数默认参数:函数的形参可以有默认值,如果我们自己传入参数,就用自己的数据,如果没有,那么用默认值

特别注意*: 如果某个位置有了默认参数,那么从这个位置往后,必须要有默认值,即默认参数要放在最后

知识扩展*:当我们调用有默认参数的函数时,可以不写实参

func(int a,int b=100);
不能写成
func(int a,int b=200,int c)
func(int a,int& b=100)

这里b的引用不能赋值为199,因为引用本质上就是简化版的指针

不定量参数

1.将cmd发送快捷方式到桌面

2.修改文件起始位置为工程目录

 这样我们就能直接在这个控制台运行我们写好的程序、

知识扩展*:修改生成文件名 afei

右键工程->属性->常规->目标文件名

main函数的另一面

int main(int argcount,char*  c_arg[])

argcount表示参数个数,c_arg[]表示储存的参数

c_arg[0]储存的一定是文件名

c_arg[]最后储存的一定是空指针,为什么是空指针呢?因为它储存的参数本质上就是储存的字符串格式,只是以空格分开

接受不定量参数的函数

int func(int count ,...)    参数后面跟的是省略号

使用这函数要加头文件<cstdarg>

如何获取参数

va_list arg   定义一个指针。也可以写成char* arg,va_list就是一个char*

va_start(arg,count)   得到参数的地址

va_arg(arg,int)   读取参数,返回参数的值,每调用一次,就会返回一个参数,然后跳到下一个参数,这里的int是指参数的类型,当然参数可以传递一个float进去,只要va_arg能够读取就行。

va_end(arg) 释放arg的内存

int func(int count,...)
{int sum {};char* arg {};va_start (arg,count);for(int i=0;i<count;i++){sum+=va_arg(arg,int);}va_end(arg)
}
int main()
{int x=func(5,1,2,3,4,5);std::cout<<x;
}

这里输出了15

arg底层实现

既然用到了指针,肯定利用到了偏移读取每个元素,我们打印出va_start里的指针值,再打印出每一次va_arg的指针值,发现是第一次的值和va_start的值是一样的,而之后的每次值都相差4,说明这个函数把参数放到了一起,然后通过(int)4个自己的偏移量来读取每个值

自己实现不定量参数

struct Sarg
{int count;char* ptr;
};
int add(Sarg& a)
{int sum = 0;int* fp = (int*)a.ptr;for(int i=0;i<a.count;i++){sum += fp[i]; }return sum;
};
int main()
{Sarg a;a.count = 5;a.ptr = (char*)new int[5]{ 1,2,3,4,5 };std::cout << add(a);system("pause");
}

第20行必须要转成char*才能赋值,所以第九行又要把它赚回来,add参数为引用是为了节省内存

http://www.lryc.cn/news/57821.html

相关文章:

  • 数组(八)-- LC[53][152] 最大子数组之和与乘积最大子数组
  • docker2-zabbix
  • ctcdecode安装
  • 虚树学习小记
  • 【C++】特殊类设计(单例模式)
  • 基于YOLOv5的水下海洋目标检测
  • 磁盘这列(Raid)
  • Oracle之PL/SQL存储过程与函数练习题(七)
  • C++入门教程||C++ 基本的输入输出||C++ 数据结构
  • 线性表——顺序表
  • 第六章 Vite4+Vue3+Vtkjs 模型颜色切换、漫反射曲面颜色
  • 【QT学习七】QTreeWidget
  • 【Linux】组管理和权限管理
  • 从零到一发布 NPM 包
  • uniapp国际化配置
  • 前端中 try-catch 捕获不到哪些异常和常见错误
  • javaEE 初阶 — 如何构造一个 HTTP 请求
  • CentOS 7下安装PostgreSQL 15版本数据库(图文详细)
  • 代码随想录算法训练营第五十一天 | 309. 最佳买卖股票时机含冷冻期、714. 买卖股票的最佳时机含手续费
  • 中英文拼写检测纠正开源项目使用入门 word-checker 1.1.0
  • 面试如果还不会Netty,看这篇文章就够了
  • 作为大学生,你还不会搭建chatGPT微应用吗?
  • Three.js教程:第一个3D场景
  • lua快速入门~在js基础上,知道Lua 和 Js 的不同即可
  • Linux系统【Centos7】更换源详细教程
  • 金三银四求职季来了!分享几道最常见的app面试题,帮助您更好准备面试求职!
  • Java集合——List接口学习总结
  • 低代码(三)低代码平台前端技术组件选型1.0(前端)
  • 代码随想录算法训练营第35天|860.柠檬水找零,406.根据身高重建队列,452. 用最少数量的箭引爆气球
  • C++整人代码,十分朴实但威力无穷,让你对cout怀疑人生,整死你的同学