為什麼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,要麼重載被拷貝類型的等號運算符


分享到:


相關文章: