c++对数组的引用

C++函数调用数组参数的传递方式 无论是传递指针还是传递引用,都可以在函数内部对数组进行修改,并且这些修改会影响到原始数组。但是需要注意的是,在使用指针或引用参数时,要确保传入的数组不为空,以避免出现空指针引用或越界访问等错误。传递引用: 可以使用引用作为函数参数来传递数组。这样做的好处是无需显式地指定数组大小,同时在函数内部可以直接使用数组名进行操作。传递指针: 当将数组作为参数传递给函数时,实际上传递的是数组的首元素的地址。函数内部可以通过指针操作来访问整个数组。在 C++ 中,数组作为函数参数有两种传递方式:传递指针和传递引用。 阅读详情

所谓数组引用,即指向数组的引用;
如    int   a[10] ;   
     int   (&b)[10] = a ;
如果写成 int   a[10] ;
                int* &b = a ;
将会报错: cannot convert from 'int [10]' to 'int *&'。
  或许你会说在数组名不就是指向这个数组的一个指针吗?题中a是int*类型的,b是指向int*的引用,按理应该是正确的啊,为什么会报错呢?这是因为编译器对指向数组的引用检查更加严格,需要检查数组的维数,在这里a被理解成指向10个int数组的指针int [10],对于引用也需要相应的引用类型int (&)[10],即指向10个int数组的指针的引用。
c和c++中有一个“数组降价”问题。
#include <iostream>
void test( char arr[100] )
{
     std::cout << sizeof(arr) << std::endl ; // 输出 4
}
int main()
{
    char arr[100] = { 0 };
    std::cout << sizeof(arr) << std::endl; // 输出 100 
    test( arr );

    return 0 ;
}
这段代码的输出是100
                            4

      对于同样的arr,一个输出100,另一个输出4。是因为void test( char arr[100] )中的arr被降价了。
void test( char arr[100] ) 中的arr被降阶处理了,
       void test( char arr[100] ) 等同于void test( char arr[] ), 也等同于
  void test( char* const arr ) 如果你原意,它甚至等同于
  void test( char arr[10] )
  编译器对数组的维数不作检查。
也就是说
void test( char arr[100] )
{
     std::cout << sizeof(arr) << std::endl;
}

被降成
void test( char* const arr )
{       std::cout << sizeof(arr) << std::endl; // 既然是char*,当然输出4
}     这样,即然不检查数组的大小,对于需要保证数组大小的程序就会带来问题。如何解决这个问题呢?可以用c++中的对数组的引用。
看下面这段代码:
......
void test( const char (&arr)[100] )
{
     std::cout << sizeof(arr) << std::endl ; // 输出 100
}
......
    char arr[100] = { 0 };
    std::cout << sizeof(arr) << std::endl; // 输出 100 
    test( arr );
......
这样test就能接受100个char的数组,且只能接受大小为100的char数组
如果
  char arr[20] = {0};
       test( arr ) ;
就会报错
  在C++ 中,对数组的引用可以直接传递数组名,因为数组的大小的信息已在形参里提供了。但是这样一来我们只能固定数组的大小来用这个函数了。用模板加数组的引用可以解决这个问题,看如下代码:
template <int sz>
void test(char (&arr)[sz])
{
    for ( int i = 0; i < sz; i++ )
          ......}char a[2] = { 0 }, b[15] = { 0 };test(a);  //oktest(b);  //ok......
     这样解决了数组长度可变的问题,但也引入了新的问题:
(1)当有多个不同的test调用时,会产生多份test代码。而传统的函数调用只有一份代,也调用的次数无关。
(2)由于这些代码都是在编译阶段生成的,它需要知道引用数组的大小。所以这样写的函数显然不能用指针变量作为函数的参数,因此不能用这个函数处理动态分配的内存区域,这样的区域的大小是在运行时确定的。


量化平台深度测评:聚宽 / 米筐 / 迅投 QMT 对比分析 本文对比测评国内主流量化交易平台聚宽、米筐和迅投QMT,从回测性能、实盘稳定性和高级功能三方面展开分析。测试显示:聚宽在低频策略回测中效率最高(128秒),米筐次之;迅投QMT凭借C++直连架构实现最低延迟(150ms)和最高订单撤销成功率(98.5%)。平台特色方面,QMT的智能拆单算法可减少25%滑点损失,聚宽的因子库支持版本控制和缓存复用。建议低频策略选聚宽,高频交易选QMT,团队协作优先考虑聚宽。测试数据均来自合规实盘环境,建议根据策略特性进行试用验证。 阅读详情

相关推荐

Synology File Station 官方 API 指南总结(中文版)

本文总结了Synology File Station官方API指南的核心内容,详细介绍了如何通过HTTP/HTTPS请求与DSM系统交互实现文件管理功能。主要内容包括: 基础API操作流程:从获取API信息、登录认证到执行请求和登出的完整工作流 请求构造与响应解析:JSON格式的请求参数处理和响应结果分析 关键API功能分类: 文件信息获取(List/Info) 文件搜索(Search) 收藏夹管理(Favorite) 缩略图生成(Thumb) 目录大小计算(DirSize) 文件上传(Upload)等 错

weixin_46001686的博客 2460

C++使用引用的方法向函数传递数组,避免因传入函数而导致退化为指针,正确在函数中计算数组的大小。

目录1.问题原理方法1——用基本语法方法2——用函数模板后话 1.问题 我们知道,当我们将数组作为参数传递为一个函数后,数组会退化为指针。这样就导致我们无法正确在函数中计算数组的大小。 #include<iostream> using namespace std; int func(int* arr) { return sizeof(arr); } int main() { int Arr[] = { 2,4,3,1,73,0 }; cout << func(Arr) &lt

拒绝任何因懒惰而生的省略号 2554

Xilinx Blockset Counter计数器模块使用及参数配置

本文详细介绍了Simulink中Xilinx Blockset库Counter模块的使用以及参数说明。

白码王子小张的博客 1096

c++数组的引用

引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名; 引用最大的好处就是提高函数效率以及节省空间; 关键问题一、传递引用与传指针、传值的区别? 值传递 (pass by value),指针传递(pass by pointer),当发生函数调用时,需要给形参分配存储单元、当传递是对象时,要调用拷...

weixin_30438813的博客 1664

Ubuntu图形界面崩溃?从tty到GUI的终极修复指南

本文提供了Ubuntu图形界面崩溃后进入tty的终极修复指南。详细介绍了如何诊断显示管理器(如LightDM或GDM3)状态,并通过重装、切换显示管理器、修复依赖、系统升级及排查显卡驱动等核心方案,逐步恢复GUI。帮助用户从命令行界面高效修复桌面环境,避免数据丢失。

vulkan6gpu的博客 778

LangChain4j + Milvus 从0-1实现会话管理与RAG检索的AIChat超详细教程

本教程将介绍如何使用LangChain4j和Milvus向量数据库构建一个具备流式输出、会话管理、会话隔离和基于文档RAG检索能力的AI机器人。我们将使用阿里百炼模型作为LLM后端,并通过Docker部署Milvus向量数据库。创建Assistant接口,定义聊天服务:LangChain4j 中文文档 | LangChain4j 中文文档wiringMode :这个属性一般两种,一种是自动装配,我们这里选择手动配置。

2301_80014343的博客 1435

C++ 用引用的方式向函数传递数组

#include <iostream> using namespace std; int a[10] = { 10,20 }; void GetCharArr(char (&ac)[20]) { sprintf_s(ac, "ABABXX%d", a[0]); } int main() { char str1[20]; GetCharArr(str1); printf("当前的字符串是:%s", str1); system("...

AI浩 2202

别再凭感觉估算!用ADS的EBOND库精确仿真Bonding线寄生电感(附完整参数设置指南)

本文详细介绍了在ADS中使用EBOND库精确仿真Bonding线寄生电感的方法,帮助射频工程师在毫米波频段实现高精度建模。通过三维物理参数和电磁场求解算法,EBOND模型能将误差控制在5%以内,显著提升电路性能。文章还提供了完整的参数设置指南和实战操作步骤,适用于5G毫米波前端模块等高频应用场景。

weixin_28730131的博客 506

C/C++对数组的引用

所谓数组引用,即指向数组的引用;如:               int   a[10] ;                        int   (&b)[10] = a ;如果写成:     int   a[10] ;                    int* &b = a ;将会报错: cannot convert from int [10] to int *&。或许你会说

游戏开发 3284

基于STM32L4XX、HAL库的 TMC2660C-PA 驱动程序设计

/ 默认灵敏度和电流。// 20/31最大电流。

zhusl6688的博客 384

深入RKNN Toolkit2:自定义算子与内存优化秘籍

本文系统探讨了RKNNToolkit2在模型转换中的关键技术与优化策略。首先介绍了该工具包的基础功能及模型转换流程,重点阐述了自定义算子的实现方法,包括算子分析、代码编写和注册集成等步骤,并以ReduceLogSumExp算子为例进行案例分析。在内存优化方面,详细论述了模型量化、内存复用和参数配置等策略,通过具体案例展示优化效果。最后结合智能安防项目实践,分享了YOLOv5模型部署经验及问题解决方案。文章指出,随着AI技术发展,RKNNToolkit2将在算子支持、量化技术和硬件适配等方面持续优化,为边缘计

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 1389

c 语言数组的引用,C++对数组的引用实例分析

C++中所谓数组引用,即指向数组的引用;如:int a[10] ;int (&b)[10] = a ;如果写成:int a[10] ;int* &b = a ;系统将会报错: cannot convert from 'int [10]' to 'int *&'。或许你会说在数组名不就是指向这个数组的一个指针吗?题中a是int*类型的,b是指向int*的引用,按理应该是...

weixin_42517963的博客 808

《囚徒健身》 六艺,十式

文章目录《囚徒健身》 六艺,十式1、六艺,十式2、优缺点3、手臂和上半身 《囚徒健身》 六艺,十式 1、六艺,十式 1、俯卧撑: 2、深蹲: 3、举腿: 4、引体向上: 5、桥: 6、倒立撑: 十式就是每个动作分拆为十个不同的动作等级,进行训练 每一式里面,又根据做的组数和个数,分成三层,初级,中级,高级 依次循序渐进,每完成上一个动作的高级,则向下一个动作前进 2、优缺点 优点 : 六个动作都是很常见的,日常的动作,不太需要依赖什么器械,随时随地都可以练习,很方便 这些动作可以覆盖到全身大部分

简简单单Onlinezuozuo 4564

C/C++对数组的引用——指向指针的指针和指针引用

http://blog.youkuaiyun.com/anye3000/article/details/6578262 #include <iostream> using namespace std; void main() { int a = 10; int **pTest = new int*; int *pSec = &a; pTest = &a...

weixin_30540691的博客 485

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

量子力学与线性代数:为什么必须一起学?核心概念对照与学习路径

线性代数是量子力学的数学骨架,希尔伯特空间、态矢量、算符、本征值等概念在量子力学中具有直接的物理意义。理解向量空间、内积、酉变换等线性代数基础,是掌握量子力学测量、演化及不确定性的关键。这种对应关系在量子信息中尤为重要,密度矩阵、量子门和纠缠态均依赖线性代数工具。本文通过概念映射表、狄拉克符号解读和实操建议,帮助读者建立两门学科的深度联系,适合物理专业学生和自学者。

weixin_33859231的博客 377

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C++ 引用

C++引用C++引用引用内存使用说明注意使用引用作为函数参数变量名作为实参和形参传递变量的地址分析:总结引用作为形参分析总结 C++引用 对一个数据可以建立“引用”,作用是为一个变量起别名,C++对C的扩充。如下 int a; //定义整型变量a int &b = a;//声明b为a的 “引用” 以上声明了b是a的引用,即b是a的别名,此时使用a或b的作用相同,都代表同一个变量。若a的值为20,b的值也为20。且上述声明中,&是引用声明符,并不代表地址。不能理解为把a的值赋给b的地址。在数

水滴的专栏 316

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C++第三篇:引用

在C++中提供了一种不使用指针变量同样可以达到同样效果的机制,并且使用起来更方便,这种机制叫做"引用。

sir2022的博客 973

引用,引用与指针区别

语法:类型 &引用名=目标变量名; 对数组的引用 语法:类型 (&引用名)[数组中元素数量]=数组名; 对指针的引用 语法:类型 *&引用名=指针名;//可以理解为:(类型*) &引用名=指针名,即将指针的类型当成类型* 常引用 语法:const 类型 &引用名=目标变量名; 4、引用 --- 变量的别名 引用定义:数据类型 &a...

Find的博客 707

C++分别以引用和指针的形式对数组进行选择、冒泡排序

标题 C++分别以引用和指针的形式对数组进行选择、冒泡排序 #include using namespace std; void sort1(int(&b)[10]); void sort2(int* b); int main() { int a[10] = { 0 }; cout << “请任意输入十个数:”; for (int i = 0; i < 10; i++...

weixin_46031998的博客 399
上一篇: Linux操作系统学习线路图
下一篇: 嵌入式学习的步骤
Qicz
博客等级 码龄16年 56粉丝 122原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值