1. 傳值和傳地址呼叫的本質
記住一句話:當函式接收到任何引數時,都會對引數本身做一次復制,
之所以會產生理解上的歧義,是因為混淆了指標和指標所指向的內容,
傳值呼叫:
很好理解,函式會新建一個變數,然后將引數變數的值賦值給新的變數,也就是說復制了傳入的變數的值,
傳地址呼叫:
實際上復制了傳入的指標的值【一個long int型別的值,含義是某個變數在記憶體中的位置,我們把這個int值叫做記憶體地址】
創建了新的和原本指標的值一樣的指標變數,將值復制出來的值賦值給了新的指標變數
所以也是復制了傳入的變數的值,
可以看出,傳值呼叫和傳地址呼叫本質上是一致的,
2. 應用場景
所以只需要記住下面兩個原則,就知道什么時候使用哪種型別的傳參方式:
傳值呼叫:
- 函式中只需要使用引數的值,而不需要對引數的值進行修改,也就是不需要修改值,用傳值呼叫,
傳地址呼叫:
- 函式中會對引數原本變數的值進行修改,也就是需要修改原本的值,用傳地址呼叫,
- 傳入
結構體/塊足夠龐大,復制整個結構體/塊太過浪費時間,傳地址呼叫只會傳遞指向原結構體/塊的指標,所以沒有復制結構體/塊的開銷,
備注
c++還有參考的概念,實際上就是傳地址呼叫的語法糖,簡化了顯式標明指標的程序,java/python等語言中,所有的傳入都是傳地址呼叫,因為屏蔽了直接操作指標,所以是安全的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/296594.html
標籤:python
