You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将数组作为指针传入函数后,基于范围的循环计算数组和出错

基于范围的循环、指针与数组求和问题排查

问题场景

直接在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 21:31:11