數組和指標作為函數參數——高品質C、C++編程指南

來源:互聯網
上載者:User

標籤: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++編程指南

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.