C++笔记(13)数组的引用和引用的数组
数组的引用
数组有二个特性,影响作用在数组上的函数:一是不能复制数组,二是使用数组名时, 数组名会自动指向其第一个元素的指针。
因为不能复制,所以无法编写使用数组类型的形参,数组会自动转化为指针。比如:
void print(int arr[4]) {
cout << sizeof(arr) << endl;
}
调用函数时,始终输出8。
//上面的函数等同于
void print(int arr[]) {...} //也等同于
void print(int* arr) {...} //甚至等同于
void print(int arr[999]) {...}
而 x86 下 sizeof(int) ==4 , sizeof(int *)==4;x64 下 sizeof(int) ==4 , sizeof(int *)==8,因此输出为8.
要解决这样的问题,可以使用数组的引用。将数组形参声明为数组的引用,如果形参是数组的引用,编译器会传递数组的引用本身。
void print(int (& arr)[3]) {
cout << sizeof(arr) << endl;
}
此时输出为12。函数只能接受大小为3的int[]。用模板加数组的引用可以解决这个问题:
template<typename T, int N>
void print(T(&arr)[N])
{
cout << sizeof(arr) << endl;
}
使用模板后可以使同一函数处理不同的数组了,扩大了函数的适用范围。但是这样定义的函数仍然存在这下述缺点:
1. 模板最终是要实例化的,所以调用多少个不同长度的数组,就要产生这个函数的多少份实例代码。而传统方式的函数只有一份实例,与函数的调用次数无关。
2. 不能应用于在编译期间数组的大小尚未确定的情况,这也使这个模板函数的适用范围受到限制。
3. 这样写的函数显然不能用指针变量作为函数的的参数,因此不能用这个函数处理动态分配的内存区域。
引用的数组
这是一个错误的定义
示例1:

示例2:
int arr[] = { 1, 4, 5};
int& a[3] = arr; //错误
int(&a)[3] = arr;//正确
这篇及以后的博客来自我的新电脑,嘿嘿!


C++笔记(13)数组的引用和引用的数组的更多相关文章
- Perl 引用:引用就是指针,Perl 引用是一个标量类型可以指向变量、数组、哈希表(也叫关联数组)甚至子程序。
Perl 引用引用就是指针,Perl 引用是一个标量类型可以指向变量.数组.哈希表(也叫关联数组)甚至子程序,可以应用在程序的任何地方. 1.创建引用1.使用斜线\定义变量的时候,在变量名前面加个\, ...
- swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- Java值传递以及引用的传递、数组的传递!!
转(http://blog.csdn.net/niuniu20008/article/details/2953785) 许多编程语言都有2种方法将参数传递给方法------按值传递和按引用传递. 与其 ...
- 【C语言入门教程】7.2 结构体数组的定义和引用
7.2 结构体数组的定义和引用 当需要使用大量的结构体变量时,可使用结构体定义数组,该数组包含与结构体相同的数据结构所组成的连续存储空间.如下例所示: struct student stu_a[50] ...
- struts2:遍历自定义字符串数组,遍历Action实例所引用对象中的数组
在struts2:OGNL表达式,遍历List.Map集合:投影的使用一文中已经讲述了OGNL遍历List.Map集合等功能. 本文简单写一个遍历数组的示范程序. 1. 遍历自定义字符串数组 < ...
- java子类数组的引用转换成超类数组的引用
public class Person { } public class Student extends Person{ private String name; public Student(Str ...
- java基础-引用数据类型之一维数组(Array)
java基础-引用数据类型之一维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组的定义 1>.为什么需要数组 保存一个数据可以定义一个变量,如果要保 ...
- 笔记:C++学习之旅---引用
笔记:C++学习之旅---引用 什么是引用? 引用就是别名,引用并非对象,相反的,他只是为一个已经存在的对象所起的另外一个名字. /*引用就是别名*/ #include <iostream> ...
- 【读书笔记】C#高级编程 第六章 数组
(一)同一类型和不同类型的多个对象 如果需要使用同一类型的多个对象,就可以使用数组或集合(后面章讲). 如果需要使用不同类型的多个对象,可以使用Tuple(元组)类型. (二)简单数组 如果需要使用同 ...
- [Java入门笔记] Java语言基础(五):数组
简介 数组可用用于存储存储多个数据,Java的数组要求所有的数组元素具有一种相同的数据类型.一旦数组初始化完成,数组在内存中的空间被固定下来,长度不可改变,即使把数组的元素清空,所占用的空间依然被保留 ...
随机推荐
- 重新点亮linux 命令树————selinux[二十六]
简介 简单整理selinux. 正文 selinux 是安全增强软件. 以前是系统安全是用户权限配置(用户自主控制),但是害怕用户自己设置问题,故而增加了一个selinux,也就是强制访问控制. 一般 ...
- setTimeout(fn, 0) // it works - JavaScript 事件循环 动画演示
在前端代码中很经常看到使用 setTimeout(fn, 0),如下面代码所示,乍一看很多余,但是移除了可能会出现一些奇奇怪怪的问题.要解释这个就需要理解 事件循环(Event Loop),下面会通过 ...
- 【2021.6.26 NOI模拟】Problem B. 简单题 another solution
Problem Description Input 从文件 b.in 中读入数据. 一个正整数 n. Output 输出到文件 b.out 中. 一个整数表示答案. Sample Data Input ...
- 用百度和神策做埋点为何pv差异很大?
近期ClkLog收到一个客户反馈说我们与百度统计的PV数据差异很大.为了验证问题,开发进行了一次对页面浏览量统计的测试.针对同一个IP同一个时间的页面浏览量统计发现,百度的统计数据只有一条,而ClkL ...
- vscode下的超级慢的解决方法
vscode下的超级慢的解决方法 从网上看到的方法,记录给自己看 vscode官网:https://code.visualstudio.com/Download 复制下载链接 链接如下: https: ...
- KubeVela 正式开源:一个高可扩展的云原生应用平台与核心引擎
美国西部时间 2020 年 11 月 18 日,在云原生技术"最高盛宴"的 KubeCon 北美峰会 2020 上,CNCF 应用交付领域小组(CNCF SIG App Deliv ...
- 基于 EventBridge 构建 SaaS 应用集成方案
简介:事件源是事件驱动的基石,如何获取更多事件源也是 EventBridge 一直在探索和尝试的方向.针对市场上其他云厂商和垂直领域的 Saas 服务,EventBridge 发布了 HTTP So ...
- [FAQ] 对于 Puppeteer 和 Chromium 在 Linux 上的安装,需要安装哪些依赖库
比如 puppeteer/chrome/linux-114.0.5735.133/chrome-linux64/chrome 到底要装哪些依赖. 一般根据报错提示,安装缺少的即可,以下是一般需要的 ...
- dotnet 修复 GitHub Action 构建过程提示 NETSDK1127 错误
本文告诉大家,如何修复 GitHub Action 构建过程提示 error NETSDK1127: The targeting pack Microsoft.WindowsDesktop.App.W ...
- 理解FPGA内部的同步信号、异步信号和亚稳态
FPGA(Field-Programmable Gate Array),即现场可编程门阵列.主要是利用内部的可编程逻辑实现设计者想要的功能.FPGA属于数字逻辑芯片,其中也有可能会集成一部分模拟电路的 ...