有關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'; }
相關文章
- 深入探討Spring Boot中的引數傳遞Spring Boot
- 函式呼叫引數變數傳值的問題函式變數
- js中 函式引數的 傳值/傳引用 問題JS函式
- 不知道有沒有大佬加群一起來探討 go 相關的問題Go
- 討論個有關模組化設計的問題
- 15.MyBatis傳入多個引數的問題MyBatis
- 中國 GPL 訴訟第一案:關於 GPL 問題的探討
- 探討系統中?錢的精度問題
- 關於 performSelector 的一些小探討performSelector
- Hibernate 一個更新問題的 討論
- C++引數的傳遞方式C++
- 土製Excel匯入匯出及相關問題探討Excel
- 關於C++中在模板引數中使用Lambda表示式的問題C++
- 引數傳值機制
- Spring 下,關於動態資料來源的事務問題的探討Spring
- 簡單探討Golang中defer預計算引數Golang
- Android APP安全問題應對辦法的探討AndroidAPP
- 簡單探討sum()函式返回null的問題函式Null
- JS的方法引數傳遞(按值傳遞)JS
- Python的函式引數傳遞:傳值?引用?Python函式
- 函式中引數傳值函式
- 關於 http cache 的一個小問題以及引發的思考HTTP
- PHP 原始碼探祕 - 在解析外部變數時的一個問題PHP原始碼變數
- PHP 原始碼探祕 – 在解析外部變數時的一個問題PHP原始碼變數
- 關於Jmeter引數化的編碼問題JMeter
- Java中形式引數與返回值問題Java
- c# 方法引數(傳值,傳引用,ref,out,params,可選引數,命名引數)C#
- OPCUA 探討(一)
- 面試題:一道關於解構賦值和引數預設值的程式設計題面試題賦值程式設計
- 有關laravel 上傳圖片訪問404的問題Laravel
- 關於python中slicing的探討Python
- 面試官問:Go 中的引數傳遞是值傳遞還是引用傳遞?面試Go
- 有關 socialiteproviders 存在的幾個問題IDE
- 探討一個比較複雜的查詢
- 二維陣列作為引數傳遞問題陣列
- JavaScript獲取url傳遞的引數值JavaScript
- 多端引數不統一問題
- 關於int型別數值的運算問題型別
- 有關swoole+laravel 上傳檔案的問題Laravel