有關C++引數傳值的一個問題探討
今天看系統程式設計的時候看到一個程式,思來想去感覺最後的結果跟自己想的不太一樣.後來終於弄明白了,現在貼上:
#include <stdio.h> void Initialize (char * a, char * b) { a[0] = 'T'; a[1] = 'h'; a[2] = 'i'; a[3] = 's'; a[4] = ' '; a[5] = 'i'; a[6] = 's'; a[7] = ' '; a[8] = 'A'; a[9] = '\0'; b = a; b[8] = 'B'; } #define ARRAY_SIZE 10 char a[ARRAY_SIZE]; char b[ARRAY_SIZE]; int main(int argc, char * argv[]) { Initialize(a, b); printf("%s\n%s\n", a, b); return 0; } |
原來,這個函式傳遞進去的引數是一個基礎型別指標型別,那麼其實傳遞到函式棧中的是ab陣列首地址的一個複製品,那麼在函式體中其實都是些臨時變數.b=a是將b陣列首地址的一個複製的臨時變數賦值為a陣列的首地址的一個複製的臨時變數.這個時候對b進行操作,其實是對a陣列進行操作,但是b陣列的實際首地址是沒有發生任何變化的,因為穿進去的只是b陣列的一個複製品,所以當程式從這個函式體中推出的時候,b陣列的首地址還是原來的首地址,那麼它之後的記憶體單元中的值當然是沒有發生任何變化的,都是被值為零的.
但是這個程式的用意明顯是對ab陣列同時進行初始化,那麼這個該怎麼做呢?當然是進行深複製.也就是說我們不能改變陣列的首地址,而是直接根據複製的臨時中間變數來對陣列單元進行操作,從而改變陣列中的內容.改寫後的程式如下所示:
void Initialize (char * a, char * b) { int i; a[0] = 'T'; a[1] = 'h'; a[2] = 'i'; a[3] = 's'; a[4] = ' '; a[5] = 'i'; a[6] = 's'; a[7] = ' '; a[8] = 'A'; a[9] = '\0'; for (i = 0; i < ARRAY_SIZE; i++) { b[i] = a[i]; } b[8] = 'B'; }
相關文章
- 一個關於值傳遞呼叫的問題
- 一個關於Struts傳引數的問題,請高手來看看............
- 函式呼叫引數變數傳值的問題函式變數
- 深入探討Spring Boot中的引數傳遞Spring Boot
- js中 函式引數的 傳值/傳引用 問題JS函式
- 請教一個JSF引數傳遞的問題JS
- MyBatis傳入多個引數的問題MyBatis
- 不知道有沒有大佬加群一起來探討 go 相關的問題Go
- 討論個有關模組化設計的問題
- 請教一個在Tiles中引數傳遞的問題
- 15.MyBatis傳入多個引數的問題MyBatis
- 回覆網友問題,關於一個數值和字串一起累加的問題!字串
- 請問一個有關jdbc效能的問題JDBC
- 獲取url傳遞傳遞的某個引數的值
- 勘察設計單位引入現代專案管理有關問題的探討1(轉)專案管理
- 勘察設計單位引入現代專案管理有關問題的探討2(轉)專案管理
- 勘察設計單位引入現代專案管理有關問題的探討3(轉)專案管理
- 【C++】引數的預設值C++
- 關於C語言結構體對齊問題的探討C語言結構體
- 探討系統中?錢的精度問題
- 專案團隊的信任問題探討
- 引數傳值機制
- C++引數的傳遞方式C++
- C++基礎——有關引用的問題C++
- 請教一個傳遞引數的時候中文顯示亂碼的問題。
- C#引數傳遞之值引數C#
- JSP的中文問題再問(一些理論上的探討)JS
- 土製Excel匯入匯出及相關問題探討Excel
- 關於 performSelector 的一些小探討performSelector
- 關於“引數”的幾個問題,也許面試會問到哦~面試
- 從一個問題討論到Decode函式返回值函式
- 給一個介面傳遞引數,並接收返回的引數
- 關於C++中在模板引數中使用Lambda表示式的問題C++
- Oracle12c多租戶CDB 與 PDB 引數檔案位置探討、查詢 CDB 與 PDB 不同值的引數Oracle
- 給使用者資訊加密的問題探討加密
- 專案團隊的信任問題探討(轉)
- ajax傳遞的引數值包含單引號
- 一道小小的題目引發對javascript支援正規表示式相關方法的探討JavaScript