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
相关产品推荐
相关产品推荐

