0

0

C++中数组的引用如何作为函数参数 避免数组退化的技巧

P粉602998670

P粉602998670

发布时间:2025-08-02 11:51:01

|

1105人浏览过

|

来源于php中文网

原创

c++++中,数组作为参数传递时会退化为指针,导致无法获取数组长度;1. 使用数组的引用作为参数可避免退化;2. 语法为void func(int (&arr)[n]);3. 必须指定数组大小,限制通用性;4. 可通过模板泛化处理不同大小的数组。

C++中数组的引用如何作为函数参数 避免数组退化的技巧

在C++中,如果你想把数组作为参数传给函数,并且保持数组的大小信息不丢失,直接传数组是不行的——它会退化成指针。这时候你就没法在函数内部获取数组长度了。那怎么办?用“数组的引用”是一个很实用的方法。

C++中数组的引用如何作为函数参数 避免数组退化的技巧

为什么需要避免数组退化?

数组在作为函数参数传递时,会被自动转换为指向其第一个元素的指针。比如:

C++中数组的引用如何作为函数参数 避免数组退化的技巧
void func(int arr[10])

其实等价于:

立即学习C++免费学习笔记(深入)”;

void func(int* arr)

这样做的后果是:你在函数内部无法通过

sizeof(arr)/sizeof(arr[0])
来计算数组长度,因为
sizeof(arr)
得到的是指针的大小,而不是整个数组的大小。

C++中数组的引用如何作为函数参数 避免数组退化的技巧

这就是所谓的“数组退化”。


如何用引用传递数组?

为了避免退化,可以使用数组的引用作为函数参数。语法如下:

void func(int (&arr)[10])

这里的意思是:“func 接收一个对 int 类型、大小为 10 的数组的引用”。由于是引用,不会发生拷贝,也不会退化为指针。

GemDesign
GemDesign

AI高保真原型设计工具

下载

举个例子:

#include 

void printArray(int (&arr)[5]) {
    for (int i = 0; i < 5; ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;
}

int main() {
    int myArr[5] = {1, 2, 3, 4, 5};
    printArray(myArr); // 正确传递数组引用
}

这样写的好处是你可以在函数内部安全地操作数组,不用担心退化问题。


这样传参有什么限制?

虽然用数组引用可以保留类型和大小信息,但也有几个需要注意的地方:

  • 必须指定数组大小:你不能写成
    int (&arr)[]
    ,那样编译器会报错。
  • 只能匹配固定大小的数组:如果你写了一个接受
    int (&arr)[5]
    的函数,那它只能接收大小正好是5的数组,不能通用。

所以这种方式适合那些你知道数组大小、并且希望严格检查数组类型的场景。


如果想通用一点,怎么办?

如果不想每次都限定数组大小,可以用模板来泛化处理:

template 
void printArray(int (&arr)[N]) {
    for (size_t i = 0; i < N; ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;
}

这样不管数组是5个元素还是10个元素,都能正确推导出大小

N
,而且仍然保留了数组信息。

这个方法特别适合写一些工具函数,比如打印数组、排序、校验数据等。


基本上就这些。用数组引用传参是个小技巧,但在实际开发中能避免不少坑。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

401

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

543

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

53

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

176

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

98

2025.11.27

java值传递和引用传递有什么区别
java值传递和引用传递有什么区别

java值传递和引用传递的区别:1、基本数据类型的传递;2、对象的传递;3、修改引用指向的情况。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

108

2024.02.23

go语言引用传递
go语言引用传递

本专题整合了go语言引用传递机制,想了解更多相关内容,请阅读专题下面的文章。

159

2025.06.26

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

58

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.1万人学习

Pandas 教程
Pandas 教程

共15课时 | 1.0万人学习

ASP 教程
ASP 教程

共34课时 | 4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号