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

如何编写函数填充传入的原数组而非函数参数内的数组?

嘿,这个问题在C++里其实很常见——要让函数直接操作原数组而非内部副本,核心在于传递数组的引用或者指针(传值会创建副本,修改的只是副本而已)。我给你梳理几种靠谱的实现方式,结合你需要的填充、排序功能写了示例代码:

方法1:使用数组引用(类型安全,推荐)

如果你的数组大小固定,或者想让编译器帮你做类型校验,可以用数组引用作为函数参数。要是需要适配不同大小的数组,搭配模板函数就完美了:

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <algorithm> // 用于std::sort排序
using namespace std;

// 模板函数:填充任意大小的int原数组
template <size_t N>
void fillOriginalArray(int (&arr)[N]) {
    srand(time(nullptr)); // 初始化随机数种子
    for (size_t i = 0; i < N; ++i) {
        arr[i] = rand() % 100; // 填充0-99的随机整数
    }
}

// 模板函数:直接对原数组排序
template <size_t N>
void sortOriginalArray(int (&arr)[N]) {
    sort(arr, arr + N); // 操作的就是原数组的内存
}

int main() {
    int myArray[10]; // 定义你的原数组

    // 填充原数组
    fillOriginalArray(myArray);
    cout << "填充后的原数组:";
    for (int num : myArray) cout << num << " ";
    cout << endl;

    // 排序原数组
    sortOriginalArray(myArray);
    cout << "排序后的原数组:";
    for (int num : myArray) cout << num << " ";
    cout << endl;

    return 0;
}

这里的int (&arr)[N]就是数组的引用,函数里对arr的任何修改都会直接作用在传入的原数组上。模板的size_t N会自动推导数组的大小,不用手动传长度,既方便又安全。

方法2:使用指针+数组长度(兼容C风格,灵活)

如果你的数组是动态分配的(比如用new创建),或者需要更灵活的长度控制,就用指针传递数组,同时传入数组的长度:

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <algorithm>
using namespace std;

// 填充原数组:arr是指向原数组的指针,size是数组长度
void fillOriginalArray(int* arr, int size) {
    if (!arr || size <= 0) return; // 边界检查,避免空指针或非法长度
    srand(time(nullptr));
    for (int i = 0; i < size; ++i) {
        arr[i] = rand() % 100;
    }
}

// 排序原数组
void sortOriginalArray(int* arr, int size) {
    if (!arr || size <= 0) return;
    sort(arr, arr + size);
}

int main() {
    int* dynamicArray = new int[15]; // 动态分配的原数组

    fillOriginalArray(dynamicArray, 15);
    cout << "动态数组填充后:";
    for (int i = 0; i < 15; ++i) cout << dynamicArray[i] << " ";
    cout << endl;

    sortOriginalArray(dynamicArray, 15);
    cout << "动态数组排序后:";
    for (int i = 0; i < 15; ++i) cout << dynamicArray[i] << " ";
    cout << endl;

    delete[] dynamicArray; // 记得释放动态分配的内存
    return 0;
}

这种方式不管是静态数组还是动态数组都能处理,不过要注意手动传递长度,还要做好边界检查避免越界访问。

如果要封装到类里

你提到了class Function...,把这些功能封装到类里也很简单,比如:

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <algorithm>
using namespace std;

class ArrayHandler {
public:
    // 处理静态数组的模板成员函数:填充
    template <size_t N>
    void fill(int (&arr)[N]) {
        srand(time(nullptr));
        for (size_t i = 0; i < N; ++i) {
            arr[i] = rand() % 100;
        }
    }

    // 处理静态数组的模板成员函数:排序
    template <size_t N>
    void sort(int (&arr)[N]) {
        std::sort(arr, arr + N);
    }

    // 处理动态数组的成员函数:填充
    void fill(int* arr, int size) {
        if (!arr || size <= 0) return;
        srand(time(nullptr));
        for (int i = 0; i < size; ++i) {
            arr[i] = rand() % 100;
        }
    }

    // 处理动态数组的成员函数:排序
    void sort(int* arr, int size) {
        if (!arr || size <= 0) return;
        std::sort(arr, arr + size);
    }
};

int main() {
    ArrayHandler handler;
    int staticArr[8];

    handler.fill(staticArr);
    cout << "静态数组填充后:";
    for (int num : staticArr) cout << num << " ";
    cout << endl;

    handler.sort(staticArr);
    cout << "静态数组排序后:";
    for (int num : staticArr) cout << num << " ";
    cout << endl;

    return 0;
}

关键要点总结

  • 别直接传数组名(虽然数组名会隐式转成指针,但函数无法知道数组长度,容易越界),要么用引用+模板,要么用指针+长度。
  • 数组引用的方式类型更安全,编译器会帮你检查数组类型和大小是否匹配,避免低级错误。
  • 不管哪种方式,函数里操作的都是原数组的内存地址,所以修改会直接作用在原数组上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:54:47