C++中数组不能直接按值传递,需用指针+显式长度、std::array、std::vector或模板推导等方式;指针+长度最通用,兼容C风格,需传首地址和元素个数。

在C++中,数组不能直接按值传递给函数(会退化为指针),但有多种安全、清晰的方式实现“传数组”的效果。关键在于明确数组大小和生命周期,避免裸指针陷阱。
用指针 + 显式长度(最通用,兼容C风格)
这是最基础也最灵活的方式,适用于动态分配或已知大小的数组。函数接收指向首元素的指针和元素个数。
void printArray(int* arr, size_t len) {
for (size_t i = 0; i < len; ++i) {
std::cout << arr[i] << " ";
}
std::cout << "\n";
}
int main() {
int data[] = {1, 2, 3, 4, 5};
printArray(data, std::size(data)); // C++17起可用std::size;否则写sizeof(data)/sizeof(data[0])
}
用引用传递定长数组(类型安全,推荐用于编译期确定大小)
通过模板或显式长度声明数组引用,编译器能检查大小,不会退化,且不拷贝数据。
templatevoid processArray(int (&arr)[N]) { std::cout << "Size: " << N << "\n"; for (int x : arr) std::cout << x << " "; } // 或非模板写法(仅适用于固定大小,如5) void handleFiveInts(int (&arr)[5]) { // 只接受恰好5个int的数组 }
用 std::array(现代C++首选,值语义+大小内建)
std::array 是栈上容器,保留大小信息,可按值或引用传递,支持范围for、size()等,无额外开销。
立即学习“C++免费学习笔记(深入)”;
#includevoid foo(const std::array & arr) { // 推荐const引用避免拷贝 std::cout << "Size: " << arr.size() << "\n"; for (int x : arr) std::cout << x << " "; } int main() { std::array
a = {10, 20, 30, 40, 50}; foo(a); }
用 std::vector(适合运行时大小不确定或需扩容)
当数组大小在运行时决定,或需要增删元素时,std::vector 是自然选择。传 const 引用避免不必要的拷贝。
#includevoid sumVector(const std::vector & vec) { int s = 0; for (int x : vec) s += x; std::cout << "Sum: " << s << "\n"; } int main() { std::vector
v = {1, 2, 3, 4, 5}; sumVector(v); }
不推荐裸指针不带长度、也不建议按值传递原始数组(语法错误)。优先选 std::array 或 std::vector,兼顾安全与表达力。









