为什么c++中数组不能直接拷贝给另一数组?

DearJackal


可以拷贝的,标准库中的几乎所有容器都提供了赋值运算符,可直接用等号拷贝。只有原始数组不支持这样做,不过完全可以用array或vector代替啊。

既然用c++,就不要用原始数组了,没有越界检查,动态数组还要手动释放,很危险的,而且性能上一点也不比vector或array快。


豆杆与风


如果一定要直接,用指针交换就行。如:把lg数组拷给chs数组:

LONG lg[20];

BYTE chs[200];

chs=(char *)&lg[0];

这样就是直接。记住,一定用指针。

其次,用memcpy函数也可解决问题。

函数原型为void *memcpy(void *destin, void *source, unsigned n);函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中。

希望对你有帮助。


beijingwanger


Java中的数组是引用类型,引用类型与C中的指针概念上有一些类似。

当 arr2=arr1; 的时候,并不是将数组复制了,而只是将arr2指向了arr1,也就是说,arr2和arr1是同一个数组了,而之前的arr2代表的数组就丢弃了。

与之作用类似的C代码大致是这样:

int *arr1 = {1,2,3,4,5}, *arr2;

arr2 = arr1;C语言中的数组事实上是不可变指针(const *),因此不能被赋值。


夜空中的那颗星照亮你


標準庫沒提供這樣的拷貝函數而已。這是從效率上考慮的,因為這種數組是數據集合,規模可大可小,做深層複製的話非常消耗資源和操作,一般為了高效,僅作指針複製即可,當真要保留數據副本時,可以自己編寫複製函數做這項工作。


明白如下原理即可:數組有如房屋,複製是再建一個同樣的,那麼你必須消耗同樣的資源去做這件事,而指針複製只是印刷名片,指示他人尋址,找到這個房屋,但他對房屋所做的事,都會實際影響。複製是避免這種影響。搬動(move)消耗更大,還要拆。所以程序怎麼寫,取決於你的目的是甚麼,明白這個原理,才知道應該採取甚麼措施。


TonyDeng


可以使用std::copy(), 或手工循环赋值, 但是就是不可以直接把一个数组赋值给另外一个数组.

但是std::array和std::vector是可以的.


湘中小丁哥


C语言追求高效、简洁,反对在语言基本功能中,加入臃肿、不常用的功能。整个数组复制不常用,往往复制部分长度。但函数中,有类似功能的子程序。


重庆叶宏


因为等号运算符无法确定数组的动态长度,即使能确定编译期的固定长度数组的长度,程序员也没有为指定类型重载其等号运算符使其具备批量拷贝的能力。c++中要拷贝数组,要么用memcpy,要么重载被拷贝类型的等号运算符


分享到:


相關文章: