全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++如何传递数组给函数 数组作为函数参数的几种方式【详解】

C++中数组不能值传递,需传指针加显式长度参数;数组名退化为首元素指针,函数需额外接收size以确定边界。

在C++中,数组不能像普通变量那样直接“值传递”,因为数组名本质上是首元素地址。所以传递数组给函数时,实际上传递的是指针(或引用),关键在于如何让函数知道数组的大小和边界。

方式一:传指针 + 显式长度参数(最常用)

这是最基础、最灵活的方式。函数接收数组首地址和元素个数,适用于所有原生数组(包括栈上和堆上分配的)。

说明:数组名自动退化为指向首元素的指针,编译器不检查数组长度,必须由调用者额外传入 size。

示例:

void printArray(int* arr, int size) {
    for (int i = 0; i < size; ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << "\n";
}

int main() { int data[] = {1, 2, 3, 4, 5}; printArray(data, 5); // 等价于 printArray(&data[0], 5) }

注意:不能写成 void printArray(int arr[], int size) —— 这只是语法糖,底层仍是 int*;也不推荐用 int arr[5],因为方括号里的数字会被忽略,不参与类型检查。

方式二:传数组引用(类型安全,推荐用于固定大小数组)

通过引用传递,可保留数组的原始类型和长度信息,避免退化为指针,编译器能做静态检查。

说明:必须指定数组长度(如 int (&arr)[5]),模板可泛化处理不同长度。

示例(带模板):

template 
void printArray(const int (&arr)[N]) {
    for (int x : arr) {
        std::cout << x << " ";
    }
    std::cout << "(size = " << N << ")\n";
}

int main() { int a[] = {10, 20}; int b[] = {1, 2, 3, 4, 5}; printArray(a); // 自动推导 N = 2 printArray(b); // 自动推导 N = 5 }

优点:无法传错大小(比如把长度为3的数组传给期望长度为5的引用形参,编译失败);支持范围for循环;不拷贝数据。

限制:只适用于编译期可知大小的栈数组;不能用于动态分配的数组(如 new int[10])或 std::vector。

方式三:使用 std::array(现代C++首选之一)

std::array 是封装了固定大小数组的类模板,支持值传递、引用传递、迭代器等,兼具安全性与便利性。

说明:它是一个轻量级容器,不涉及堆分配,内部仍是原生数组,但提供了 size()、at()、data() 等接口。

示例:

#include 
#include 

void process(const std::array& arr) { std::cout << "Size: " << arr.size() << "\n"; for (int x : arr) std::cout << x << " "; std::cout << "\n"; }

int main() { std::array myArr = {1, 2, 3, 4, 5}; process(myArr); // 可传 const 引用,高效且安全 }

优势:类型明确、长度内建、可拷贝、支持 STL 算法;比裸数组更现代、更安全。

方式四:使用 std::vector(适合动态大小或需扩容场景)

当数组大小在运行时确定,或需要插入/删除/重分配时,std::vector 是标准答案。

说明:vector 内部管理堆内存,通过 .data() 可获取底层指针,.size() 返回当前元素数。

示例:

#include 
#include 

void handleVector(const std::vector& vec) { std::cout << "Elements: "; for (int x : vec) std::cout << x << " "; std::cout << "\n"; }

int main() { std::vector v = {7, 8, 9}; v.push_back(10); handleVector(v); }

建议:总是优先使用 const 引用传递 vector,避免不必要的拷贝;若函数需修改内容,去掉 const;若需转移所有权,可用 && 右值引用。

总结:裸数组传参要小心退化问题;固定大小优先考虑数组引用或 std::array;动态需求选 std::vector;避免使用 int arr[] 这类易误导的声明。核心原则是——让类型系统帮你守住边界。


#   # c++  # Array  # for  # 封装  # const  # int  # void  # 循环  # 指针  # 接口  #   # 类模板  # 值传递  # 引用传递  # 形参  # 算法  # 适用于  # 仍是  # 数组名  # 的是  # 长度为  # 这是  # 也不  # 则是  # 帮你  # 它是 


相关文章: 建站之星客服服务时间及联系方式如何?  宁波自助建站系统如何快速打造专业企业网站?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  建站主机数据库如何配置才能提升网站性能?  如何批量查询域名的建站时间记录?  MySQL查询结果复制到新表的方法(更新、插入)  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  高端建站如何打造兼具美学与转化的品牌官网?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  如何通过智能用户系统一键生成高效建站方案?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  黑客如何利用漏洞与弱口令入侵网站服务器?  建站之星如何保障用户数据免受黑客入侵?  如何通过多用户协作模板快速搭建高效企业网站?  招商网站制作流程,网站招商广告语?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  建站之星代理商如何保障技术支持与售后服务?  利用JavaScript实现拖拽改变元素大小  非常酷的网站设计制作软件,酷培ai教育官方网站?  建站DNS解析失败?如何正确配置域名服务器?  临沂网站制作企业,临沂第三中学官方网站?  济南企业网站制作公司,济南社保单位网上缴费步骤?  教程网站设计制作软件,怎么创建自己的一个网站?  如何快速选择适合个人网站的云服务器配置?  如何在IIS管理器中快速创建并配置网站?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  建站之家VIP精选网站模板与SEO优化教程整合指南  如何在万网开始建站?分步指南解析  七夕网站制作视频,七夕大促活动怎么报名?  官网网站制作腾讯审核要多久,联想路由器newifi官网  微信推文制作网站有哪些,怎么做微信推文,急?  盐城做公司网站,江苏电子版退休证办理流程?  定制建站策划方案_专业建站与网站建设方案一站式指南  如何在万网自助建站平台快速创建网站?  如何快速搭建二级域名独立网站?  定制建站流程步骤详解:一站式方案设计与开发指南  简单实现Android文件上传  中山网站制作网页,中山新生登记系统登记流程?  PHP正则匹配日期和时间(时间戳转换)的实例代码  为什么Go需要go mod文件_Go go mod文件作用说明  建站之星如何取消后台验证码生成?  北京的网站制作公司有哪些,哪个视频网站最好?  如何快速搭建高效可靠的建站解决方案?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  宝塔建站无法访问?如何排查配置与端口问题?  详解jQuery中基本的动画方法  打鱼网站制作软件,波克捕鱼官方号怎么注册? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。