-
1 # 大偉奇妙生活
-
2 # 湘中小丁哥
可以使用std::copy(), 或手工迴圈賦值, 但是就是不可以直接把一個數組賦值給另外一個數組.
但是std::array和std::vector是可以的.
-
3 # 天師童老
因為等號運算子無法確定陣列的動態長度,即使能確定編譯期的固定長度陣列的長度,程式設計師也沒有為指定型別過載其等號運算子使其具備批次複製的能力。c++中要複製陣列,要麼用memcpy,要麼過載被複製型別的等號運算子
-
4 # TonyDeng
標準庫沒提供這樣的複製函式而已。這是從效率上考慮的,因為這種陣列是資料集合,規模可大可小,做深層複製的話非常消耗資源和操作,一般為了高效,僅作指標複製即可,當真要保留資料副本時,可以自己編寫複製函式做這項工作。
明白如下原理即可:陣列有如房屋,複製是再建一個同樣的,那麼你必須消耗同樣的資源去做這件事,而指標複製只是印刷名片,指示他人定址,找到這個房屋,但他對房屋所做的事,都會實際影響。複製是避免這種影響。搬動(move)消耗更大,還要拆。所以程式怎麼寫,取決於你的目的是甚麼,明白這個原理,才知道應該採取甚麼措施。
-
5 # BWanger軟體開發達人
如果一定要直接,用指標交換就行。如:把lg陣列拷給chs陣列:
LONG lg[20];
BYTE chs[200];
chs=(char *)&lg[0];
這樣就是直接。記住,一定用指標。
其次,用memcpy函式也可解決問題。
函式原型為void *memcpy(void *destin, void *source, unsigned n);函式的功能是從源記憶體地址的起始位置開始複製若干個位元組到目標記憶體地址中,即從源source中複製n個位元組到目標destin中。
-
6 # 重慶葉宏
C語言追求高效、簡潔,反對在語言基本功能中,加入臃腫、不常用的功能。整個陣列複製不常用,往往復制部分長度。但函式中,有類似功能的子程式。
-
7 # 豆杆與風
可以複製的,標準庫中的幾乎所有容器都提供了賦值運算子,可直接用等號複製。只有原始陣列不支援這樣做,不過完全可以用array或vector代替啊。
既然用c++,就不要用原始陣列了,沒有越界檢查,動態陣列還要手動釋放,很危險的,而且效能上一點也不比vector或array快。
-
8 # 成都茂大叔
什麼叫直接複製?你是不是指沒有提供標準庫來實現陣列複製?自己寫一個不就行了麼…所有的庫都是人寫的,你寫別人寫都是一回事。
-
9 # 編碼之道
我們先來看看C/C++中陣列的實現機制,再來解釋一下為什麼陣列不能直接複製,最後再透過例項程式碼演示一種可以實現陣列複製功能的方法。
在C/C++中,陣列是一種可以同時儲存多個相同資料型別的變數,但是陣列的使用確有一些限制,比如說陣列的長度在編譯時是必須是可計算的,因為編譯器需要根據陣列的型別和長度來分配記憶體。當陣列的記憶體一旦分配,陣列的長度就不能改變,陣列名就是這塊記憶體的首地址,很多人認為它就是一個指標,實際上這種說法有一定道理,但是不夠準確,指標是可賦值的,但是陣列不能賦值,因為它是一個左值,有點類似常量指標。所以陣列是不能透過直接賦值的方式來複製的。編譯器這麼做是有一定道理的,如果一個數組可以隨意複製,那麼一旦它變成了新的值,原來分配的記憶體將失去了訪問途徑,造成記憶體洩漏。
透過下面一個例子可以看出,雖然陣列複製不能直接透過賦值的方式,但是可以透過memcpy函式複製陣列的內容。此外,陣列可以使用同指針一樣的方式進行訪問,見下圖中測試2和測試3的使用方法。
因為陣列不能直接透過賦值複製,並且只能在定義時指定長度,而不能在程式執行時改變長度,這就給使用帶了一些不便,為了方便使用陣列,std庫中引入了vector模板型別,它除了可以實現陣列的基本功能外,還增加了一些更方便使用者使用的介面,在很多應用中可以使用vector來代替陣列,下面看一個使用vector實現陣列訪問的例子:
回覆列表
Java中的陣列是引用型別,引用型別與C中的指標概念上有一些類似。
當 arr2=arr1; 的時候,並不是將陣列複製了,而只是將arr2指向了arr1,也就是說,arr2和arr1是同一個陣列了,而之前的arr2代表的陣列就丟棄了。
與之作用類似的C程式碼大致是這樣:
int *arr1 = {1,2,3,4,5}, *arr2;
arr2 = arr1;C語言中的陣列事實上是不可變指標(const *),因此不能被賦值。