標籤:c++基礎 指標 記憶體泄露 指標參數 指向指標的指標
本文內容出自《高品質C、C++編程指南》。閱讀之後理解,然後通過自己的話和例子講清楚,這樣才是學習之道。以下內容都是自己所認為的東西,如果哪裡錯了,希望各位大神指出。
1、數組作為函數的參數進行傳遞時,該數組自動退化為同類型的指標
結果:
第一張圖中,str為數組,此時的長度為6,而作為函數參數時退化為指標了,指標的長度固定為4。
第一張圖中,str為數組,所以不能對str進行自增或自減,而在函數中是可以的,因為退化為指標了,而指標時可以進行自增自減的。
2、指標參數是如何傳遞記憶體的
傳遞方式分值傳遞和引用傳遞,而指標參數其實用的是值傳遞。這裡沒有說錯,看下面分析。
可以看出,實參pStr和形參p所指向的地址是一樣的(都是3866140),而pStr(3866128)和p(3865916)的地址是不一樣的。
原因:編譯器為函數的每個參數製作臨時副本,指標參數p的副本是_p,編譯器使_p=p。所以,形參p是實參pStr的副本,都指向了str。函數體內的程式修改了_p的內容,就導致參數p的內容作相應的修改,這也是指標可以用作輸出參數的原因。
3、使用指標參數傳遞記憶體
用指標作為參數,在函數裡為指標申請一塊記憶體區間。
上面的例子申請記憶體會失敗。因為形參p只是str的一個副本而已,讓p指向新申請的記憶體,改變的是p的指向,而不是改變p原來指向的內容str。當p指向新記憶體時,p與str已經沒有任何關係。
形參變數在函數結束時釋放,造成了在堆上申請的記憶體沒有釋放,所以沒執行一次函數就會丟失一塊記憶體。
如果非得要用指標參數去申請記憶體,那麼應該改用“指向指標的指標”。
通過一個圖來來理解指標、指向指標的關係:
使用指向指標的指標來申請記憶體:
此時為str申請記憶體是成功的。上面說過,指標做形參時編譯器會為其產生一個副本,內容是一樣的。
所以,pp是ppStr的副本,形參pp和實參ppStr指向相同的內容str,那麼*pp的內容就是str,對*pp的操作就是對str的操作,*pp指向新申請的記憶體,因此str也指向該記憶體。
記得最後一行代碼,要釋放在堆上申請的記憶體,不然會導致記憶體泄露。
還是不明白的可以看下下面的圖:
數組和指標作為函數參數——高品質C、C++編程指南