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

10次阅读

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

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

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

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

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

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

示例:

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

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() 等接口。

示例:

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

#include  #include 

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

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

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

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

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

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

示例:

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

#include  #include 

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

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

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

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

星耀云
版权声明:本站原创文章,由 星耀云 2025-12-30发表,共计341字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。
text=ZqhQzanResources