将数组作为指针传入函数后,基于范围的循环计算数组和出错
基于范围的循环、指针与数组求和问题排查
问题场景
直接在main函数中用基于范围的循环遍历数组正常,但将数组以指针形式传入total函数后,用auto的范围for循环计算数组和时编译报错。
出错代码片段
int total = 0; for(auto i : *arr) { total+=i; }
完整代码
// This is my codes #include <iostream> using namespace std; int total(int *); int main () { int arr[] = {1, 2, 3, 4, 5}; cout << "Displaying array:\n"; for(auto i : arr) { cout << i << " "; } cout << "\n\nThe sum of array: " << total(arr); return 0; } int total(int *arr) { int total = 0; for(auto i : *arr) { // 错误发生处 total+=i; } return total; }
错误提示
编译器会报错:range-based 'for' expression of type 'int' is not allowed,核心原因是*arr被解析为单个int值,而非可遍历的范围。
错误原因
C++中数组作为函数参数传递时,会自动退化为指向第一个元素的指针,此时total函数里的arr类型是int*,*arr就是数组第一个元素的值(类型为int)。而基于范围的for循环要求遍历对象必须是可迭代的范围(如数组、std::vector等),单个int值不满足这个条件,因此编译失败。
解决方法
方案1:传递数组引用(保留大小信息)
通过模板函数传递数组的引用,让编译器保留数组的大小,从而支持范围for循环:
#include <iostream> using namespace std; // 模板函数适配任意大小的int数组 template <size_t N> int total(int (&arr)[N]) { int sum = 0; for(auto i : arr) { sum += i; } return sum; } int main () { int arr[] = {1, 2, 3, 4, 5}; cout << "Displaying array:\n"; for(auto i : arr) { cout << i << " "; } cout << "\n\nThe sum of array: " << total(arr); return 0; }
方案2:同时传递指针与数组大小
如果必须用指针传递,额外传入数组长度,改用普通for循环遍历:
#include <iostream> using namespace std; int total(int *arr, size_t size) { int sum = 0; for(size_t i = 0; i < size; ++i) { sum += arr[i]; } return sum; } int main () { int arr[] = {1, 2, 3, 4, 5}; const size_t arrSize = sizeof(arr)/sizeof(arr[0]); cout << "Displaying array:\n"; for(auto i : arr) { cout << i << " "; } cout << "\n\nThe sum of array: " << total(arr, arrSize); return 0; }
方案3:使用std::array替代C风格数组
std::array是C++标准库容器,传参时不会退化为指针,可直接支持范围for循环:
#include <iostream> #include <array> using namespace std; int total(const array<int, 5>& arr) { int sum = 0; for(auto i : arr) { sum += i; } return sum; } int main () { array<int, 5> arr = {1, 2, 3, 4, 5}; cout << "Displaying array:\n"; for(auto i : arr) { cout << i << " "; } cout << "\n\nThe sum of array: " << total(arr); return 0; }
内容的提问来源于stack exchange,提问作者Desmond Chua Li Yi
相关产品推荐
相关产品推荐

