C++数组参数应用方式探讨(转)
对于经验丰富的编程人员来说,C++编程语言应该是他们经常使用于程序开发的一种实用性语言。那么,在C++中,C++数组参数永远不会按值传递。它是传递第一个元素(准确地说是第0个)的指针。
例如,如下声明:
- void putValues(int[10]);
被编译器视为:
- void putValues(int*);
C++数组参数的长度与参数声明无关。因此,下列三个声明是等价的:
- void putValues(int*);
- void putValues(int[]);
- void putValues(int[10]);
因为数组被传递为指针,所以这对程序员有两个含义:
1、在被调函数内对参数数组的改变将被应用到数组实参上而不是本地拷贝上。当用作实参的数组必须保持不变时,程序员需要保留数组的拷贝。函数可以通过把参数类型声明为const来表明不希望改变数组元素:
- void putValues(const int[10]);
2、数组长度不是参数类型的一部分。函数不知道传递给它的数组的实际长度,编译器也不知道,当编译器对实参类型进行参数类型检查时,并不检查数组的长度。
例如:
- void putValues(int[10]); //视为int*
- int main()
- {
- int i, j[2];
- putValues(&i); //ok:&i是int*; 潜在的运行错误
- putValues(j); //ok:j被转换成第0个元素的指针
- // 实参类型为int*:潜在的运行错误
- return 0;
- }
参数的类型检查只能保证putValues()的再次调用都提供了int*型的实参。类型检查不能检验实参是一个10元素的数组。
习惯上,C风格字符串是字符的数组,它用一个空字符编码作为结尾。但是所有其他类型,包括希望处理内含字符的字符数组,必须以某种方式在向函数传递实参时使其知道它的长度。一种常见的机制是提供一个含有C++数组参数的长度的额外参数。例如:
- void putValues(int[], int size);
- int main()
- {
- int i,j[2];
- putValues(&i, 1);
- putValues(j, 2);
- return 0;
- }
另外一种机制是将参数声明为数组的引用。当参数是一个数组类型的引用时,数组长度成为参数和类型的一部分,编译器检查数组实参的长度与在函数参数类型中指定的长度是否匹配。
- // 参数为10个int的数组
- // parameter is a reference to an array of 10 ints
- void putValues(int (&arr)[10]);
- int main()
- {
- int i, j[2];
- int a[10];
- putValues(i); // 错误:实参不是10个int的数组
- putValues(j); // 错误:实参不是10个int的数组
- putValues(a); // 正确
- return 0;
- }
因为C++数组参数的长度现在是参数类型的一部分,所以putValues()的这个版本只接受10个int的数组。这限制了可以作为实参被传递给putValues()的数组的种类。但是,它也使函数的实现更加简单。
转载于:https://www.cnblogs.com/zhoug2020/p/3263941.html
C++数组参数应用方式探讨(转)相关推荐
- 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
- Vue中使用Axios传递数组参数给SpringBoot后台时的实现方式
场景 在前端需要实现多选,然后将所选的序号的数组传递到后台Springboot接口 需要传递的参数是一个int数组. handleCompleted() {if (this.ids == null | ...
- ajax 入参为list_ajax传递给后台数组参数方式
出自:http://blog.csdn.net/lingxyd_0/article/details/10428785 在项目上用到了批量删除与批量更改状态,前台使用了EasyUI的DataGrid,用 ...
- HTTP GET请求方式传递数组参数
http GET请求方式如何传递数组参数?一起来看看. 先在本地服务器上来一个controller方法,我们把接收到的参数打印在控制台上,顺便多此一举地返回一下响应结果 用postman请求一下: 再 ...
- http url get方式传递数组参数
此文为自己记录,请大家指教 URL 通过Get方式传递数组参数 方法1: ?id=1&id=2&id=3 注意:Get 方式有字数限制 后台获取时,只需要reqeust.getPara ...
- 解决JavaScript中使用$.ajax方式提交数组参数
一般的,可能有些人在一个参数有多个值的情况下,可能以某个字符分隔的形式传递,比如页面上有多个checkbox: $.ajax{url:"xxxx",data:{p: "1 ...
- Js传递数组参数到后台controller的方式
分享一篇js传递数组参数到后台controller的方法,具有很好的参考价值,希望对大家有所帮助. 传递参数传递字符串,所以要把数组转换为字符串, var arr=[1,23,34,5]; var s ...
- 【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析
. Android源码看的鸭梨大啊, 补一下C语言基础 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/detai ...
- 获取请求参数通用方式|| 中文乱码问题||请求转发
1. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数 1. String getParameter(String name):根据参数名称获取参数值 use ...
最新文章
- 【C 语言】数组 ( 数组取值操作 | array[i][j] 用法 等价于 *( *(array = i) + j ) 用法 | 下标操作到指针操作演化过程 )
- boost::iterator_range相关的测试程序
- pythonsuper多重继承_Python多重继承引发的问题——牛逼的super
- [转载] QoS的基本原理
- 阿里巴巴2018年纳税516亿元,稳居行业第一名,大家怎么看?
- an导入html5,H5-FLASH:AN HTML5-BASED FLASH RUNTIME
- Android之AudioManager(音频管理器)详解
- Codeforces.666E.Forensic Examination(广义后缀自动机 线段树合并)
- 评估一个垃圾收集(GC)
- leetcode252. 会议室
- android 字符串调用方法名,AndroidJNI.CallStringMethod 调用字符串方法
- 内向的人怎样改善人际关系(三)
- html5是未来,开始用吧!
- Cloud Toolkit 应用部署、文件上传支持上传进度实时展示
- 2017.3.15 余数之和sum 失败总结
- QT5开发及实例学习之十七Qt5双缓冲机制
- honeywell新风系统控制面板说明_觉得家里新风不给力了?一定是你不知道这些!
- 树莓派架设VNC服务
- 严禁使用计算机存储,处理,传输涉密信息,非涉密计算机及其网络保密管理要求...
- SpringBoot集成EasyUI
热门文章
- 深度学习之卷积神经网络(6)梯度传播
- 深度学习(26)随机梯度下降四: 损失函数的梯度
- html中超链接使用_HTML实例源码
- get请求报500_http请求和响应的全过程
- (2)stm32开发之使用Keil MDK以及标准外设库创建STM32工程
- SDI, DVI, HDMI, DisplayPort的区别(Z)
- spring boot系列 1: 第一个spring boot: Hello prj
- mdAAPP:安装后会一直存在手机中,安装数据及缓存都会占用大量内存,而且各家全家桶APP之间都有一些藕断丝连的唤醒关系。 小程序:不需要安装在手机上,微信有严格的小程序内存管理机制,和微信共用内存使
- 蜕变与成长中的青春创作:评论家谈少数民族青年作家的创作
- 《誓鸟》是什么小说?