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

C++数组按引用传递函数参数及std::array重载相关问题

嘿,咱们来逐个解决你的C++数组传参问题:

问题1:无需传递数组大小的C风格数组引用传递方法

当然有办法!你原来的代码里int arr[]作为参数其实等价于int* arr——这根本不是真正的数组传递,只是传了指针,所以必须额外传大小。但如果用数组引用的语法,就能让编译器在编译期获取数组的大小,不用手动传参。

方法1:固定大小的数组引用

如果你的数组大小是固定的,可以直接在参数里指定:

// 仅接受大小为5的int数组引用
int get_num_of_even_digited_input(int (&arr)[5]) {
    int count = 0;
    // 编译期已知大小,直接用范围for循环遍历
    for (int num : arr) {
        if (get_number_of_digits(num) % 2 == 0) {
            count++;
        }
    }
    return count;
}

调用的时候直接传数组就行:

int array2[] = {23, 334, 4567, 1, 259};
cout << get_num_of_even_digited_input(array2) << endl;

方法2:模板适配任意大小数组

如果想处理任意大小的C风格数组,用模板函数让编译器自动推导数组大小就好:

template <size_t Size>
int get_num_of_even_digited_input(int (&arr)[Size]) {
    int count = 0;
    for (int num : arr) {
        if (get_number_of_digits(num) % 2 == 0) {
            count++;
        }
    }
    return count;
}

不管你的数组是3个元素还是10个元素,编译器都会自动推导Size的值,调用方式和上面完全一样,不用管大小。


问题2:重载函数以接受std::array的原型写法

std::array是固定大小的模板容器,所以我们需要写一个模板函数来适配任意大小的std::array<int, N>。函数原型和实现如下:

#include <array> // 必须包含这个头文件才能用std::array

template <size_t N>
int get_num_of_even_digited_input(const std::array<int, N>& arr) {
    int count = 0;
    // 可以用范围for循环,或者arr.size()获取大小(编译期常量)
    for (int num : arr) {
        if (get_number_of_digits(num) % 2 == 0) {
            count++;
        }
    }
    return count;
}

这里的N是模板参数,编译器会根据你传入的std::array的大小自动推导。调用的时候直接传数组对象就行,不用手动传size:

std::array<int, 6> array3 = {23, 5677, 564, 342, 44, 56778};
cout << get_num_of_even_digited_input(array3) << endl;

顺便修正你原代码里的几个小问题

  1. void main()不符合C标准,应该写成int main(),最后返回0(C11及以后可以省略return,但建议加上)
  2. array3.size是错误的,std::array的size()是成员函数,要加括号:array3.size()
  3. 需要包含<iostream>和<array>头文件才能使用cout和std::array

完整的可运行代码

#include <iostream>
#include <array>

using namespace std; // 示例简化用,实际项目建议避免全局using

int get_number_of_digits(int in_num) {
    int input = in_num;
    int dig_count = 0;
    // 修复原代码的while(input):当输入为0时会返回0,符合逻辑的话也可以,但更严谨的是判断input !=0
    while (input != 0) {
        dig_count++;
        input = input / 10;
    }
    return dig_count;
}

// 原函数:接受C风格数组指针和大小
int get_num_of_even_digited_input(int arr[], int size_arr) {
    int count_of_evendigited_num = 0;
    for (int i = 0; i < size_arr; i++) {
        int count_of_dig = get_number_of_digits(arr[i]);
        if (count_of_dig % 2 == 0) {
            count_of_evendigited_num++;
        }
    }
    return count_of_evendigited_num;
}

// 重载1:任意大小的C风格数组引用
template <size_t Size>
int get_num_of_even_digited_input(int (&arr)[Size]) {
    int count = 0;
    for (int num : arr) {
        if (get_number_of_digits(num) % 2 == 0) {
            count++;
        }
    }
    return count;
}

// 重载2:任意大小的std::array<int, N>
template <size_t N>
int get_num_of_even_digited_input(const std::array<int, N>& arr) {
    int count = 0;
    for (int num : arr) {
        if (get_number_of_digits(num) % 2 == 0) {
            count++;
        }
    }
    return count;
}

int main() {
    int array2[] = {23, 334, 4567, 1, 259};
    int sizearr2 = sizeof(array2)/sizeof(int);
    
    std::array<int, 6> array3 = {23, 5677, 564, 342, 44, 56778};
    
    // 调用原函数
    cout << "Count of even digited numbers in array2[] (original): " 
         << get_num_of_even_digited_input(array2, sizearr2) << endl;
    
    // 调用数组引用重载
    cout << "Count of even digited numbers in array2[] (ref overload): " 
         << get_num_of_even_digited_input(array2) << endl;
    
    // 调用std::array重载
    cout << "Count of even digited numbers in array3[]: " 
         << get_num_of_even_digited_input(array3) << endl;
    
    return 0;
}

内容的提问来源于stack exchange,提问作者Manasa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:32:44