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

C++通过引用修改数组首地址:静态数组方法报错原因及解决

静态数组修改报错原因及解决方案

问题背景

尝试通过将数组引用传入change_values()函数,修改数组首地址来替换整个数组内容:

  • 动态指针数组实现成功,输出1 2 3
  • 静态数组实现编译报错,错误信息:
    In function 'void change_values(int (&)[3])':
    /tmp/Zmp06HOavn.cpp:12:12: error: invalid array assignment
       12 |     nums = nums2;
    

报错原因

C++中静态数组的名称是一个常量指针,它指向的数组首元素地址在编译阶段就已固定,无法被重新赋值。静态数组的内存分配在栈(或全局数据区),其位置不可变更,因此不能像动态指针那样直接将另一个数组的地址赋值给它。而动态指针本质是一个变量,存储的是动态分配内存的地址,所以可以被重新指向新的内存区域。

静态数组修改方案

方案1:逐个元素赋值(或批量复制)

既然无法修改静态数组的首地址,就直接修改数组内的元素值,将新数组的内容复制到原数组中。可以手动逐个赋值,也可以用std::copy批量复制:

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

void change_values(int (&nums)[3]) {
    int nums2[3] = {1, 2, 3};
    // 批量复制元素到原数组
    copy(nums2, nums2 + 3, nums);
}

void print_values(int nums[]) {
    cout << nums[0] << "  " << nums[1] << "  " << nums[2] << endl;
}

int main() {
    int x[3] = {5, 10, 15};
    
    change_values(x);
    print_values(x);

    return 0;
}

方案2:用指针间接操作静态数组

如果一定要通过修改指针指向的方式实现,可以将静态数组的地址赋值给一个指针变量,传递指针的引用进行修改。注意要保证新数组的生命周期足够长(比如用static修饰局部数组):

#include <iostream>
using namespace std;

void change_values(int*& nums) {
    // static修饰让数组在函数结束后不被销毁
    static int nums2[3] = {1, 2, 3};
    nums = nums2;
}

void print_values(int* nums) {
    cout << nums[0] << "  " << nums[1] << "  " << nums[2] << endl;
}

int main() {
    int x[3] = {5, 10, 15};
    int* ptr = x; // 指针指向静态数组
    
    change_values(ptr);
    print_values(ptr);

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:20:32