C 字串淺拷貝和深拷貝 學習筆記

2021-07-07 09:31:33 字數 1004 閱讀 4563

今天對c的淺拷貝和深拷貝進行學習,現分享學習心得。

首先看下面的**:

執行結果如下圖:

什麼?結果是ccc  ccc  ccc?為什麼不是aaa  bbb  ccc呢?這就是字串的淺拷貝。

程式中arr是乙個長度為100的字元陣列; strarr是乙個長度為3,每個單元格存放這乙個字元指標的數字。

i = 0,程式進入第一次迴圈,arr賦值為aaa,strarr[0] = arr,即將strarr[0]中存放的指標指向arr。

i = 1,程式進入第二次迴圈,arr賦值為bbb,strarr[1] = arr,即將strarr[1]中存放的指標指向arr。

i = 2,程式進入第三次迴圈,arr賦值為ccc,strarr[2] = arr,即將strarr[2]中存放的指標指向arr。

i = 3,程式結束。

我們發現,strarr並沒有自己建立記憶體,只是將指標指向arr,且strarr[0]、strarr[1]、strarr[2]都指向arr,內容都是一樣的, 因此最終程式的結果是列印三次ccc。這就是字串的淺拷貝:多個指標指向同一段記憶體,如記憶體修改,則多個指標的內容同時修改。如果要避免淺拷貝,我們就需要讓每個指標都指向自己的記憶體,利用動態記憶體申請來開闢自己的記憶體,避免多個指標指向同乙個位址。

程式如下:

程式執行結果:

這次就成功將aaa  bbb  ccc分別賦值給strarr中的每個元素。注意不能使用strarr[i] = arr,這樣的結果還是淺拷貝,字串的拷貝一定要使用字串拷貝函式才能將內容成功拷貝。動態記憶體的大小一定是(strlen(arr)+1) * sizeof(char),因為字串的有效長度是不包括'\0'的,需要加上。深拷貝後,每個指標指向自己的記憶體,不用擔心內容被篡改。

C 學習筆記8 深拷貝和淺拷貝

對於帶有指標的類我們才需要深拷貝和淺拷貝這個問題。time 2020 6 1 author mmyd include includeusing namespace std class strelse 拷貝構造 str const str str 拷貝複製 str operator const str...

C 淺拷貝和深拷貝

class test test const test t val new int t.val test private int val 現在定義兩個物件,test t1 9 test t2 t1 如果你不提供copy建構函式 注釋掉的那個 那麼t1和t2的成員 val指向同乙個物件,當析構的時候,同...

c 深拷貝和淺拷貝

深拷貝和淺拷貝 ca const ca c 就是我們自定義的拷貝建構函式。可見,拷貝建構函式是一種特別的建構函式,函式的名稱必須和類名稱一致,他的唯一的乙個引數是本型別的乙個引用變數,該引數是const型別,不可變的。例如 類x的拷貝建構函式的形式為x x x 當用乙個已初始化過了的自定義類型別物件...