我們先看一下面一段**
void getmemory(char *p, int num)
void main(void)
在這段**中,main函式希望通過呼叫getmemory獲得一片指定大小的記憶體區域,但是經過編譯執行後發現,程式執行到strcpy(str, "hello");時,程式掛掉了!
getmemory中已經申請了記憶體空間,並且已經賦值給了指標變數呀,為什麼str還是null呢?
先看看函式的執行過程:
1、main函式在執行語句getmemory(str, 100);時,編譯系統是將str的值賦值給p了,就是說在還未執行p = (char *)malloc(sizeof(char) * num);時,p和str的值是相同的,都是null,即都指向0位址。
2、當getmemory申請到記憶體空間後,其只是將申請到的記憶體空間的編號存到p中了,即只是賦值給p了,就是說p指向了剛剛申請到的記憶體區域。
3、顯然,getmemory(str, 100);執行過後,str的值是沒有改變的,就是說str還是指向0位址。
那麼怎麼改,可達到當初的設計意願呢?
方法一、
void getmemory(char *&p, int num)
void main(void)
方法二、
void getmemory(char **p, int num)
void main(void)
對比這兩種方法,第一種方法改動比較小,其利用引用的特性。第二種方法改動稍多點,且呼叫形式也變了。
方法一中:
p已經不再占用儲存空間了,p是乙個指標變數的引用,即在執行getmemory(str, 100);時,p成了str的乙個別名,在執行p = (char *)malloc(sizeof(char) * num);時,即已經改變了str的值,因為p是str的乙個別名,故對p賦值,就是在對str賦值。
方法二中:
getmemory中已經將p申明為二級指標了,所以main函式在執行呼叫時,傳遞的是str的位址,即p是指向str的,在執行*p = (char *)malloc(sizeof(char) * num);時,即改變了p所指向的變數,換句話說就是改變了str。
以上兩種更改方法都達到了更改str的目的,也就是實現了程式最初的設計意願。
python 引數傳遞 Python 引數傳遞
python中的變數 乙個變數是區域性還是全域性,在編譯函式的時候就已經決定,因此讀變數值的時候也不會逐層向外查詢。變數是全域性還是局域,根據如下3條 1.如果函式內部有global語句,那麼它宣告的變數是全域性的。2.如果函式內部有對變數的賦值語句,那麼它是局域的。3.除此之外都是全域性的。注意1...
python 引數傳遞 python引數傳遞
python中函式引數的傳遞是通過 賦值 來傳遞的。但這條規則只回答了函式引數傳遞的 戰略問題 並沒有回答 戰術問題 也就說沒有回答怎麼賦值的問題。函式引數的使用可以分為兩個方面,一是函式引數如何定義,二是函式在呼叫時的引數如何解析的。而後者又是由前者決定的。函式引數的定義有四種形式 1.f arg...
Python引數傳遞 引用傳遞 值傳遞
值傳遞 方法呼叫時,實際引數把它的值傳遞給對應的形式引數,方法執行中形式引數值的改變不影響實際引數的值。a1 520 a2 a1 print a1 520 print a2 520 a2 a1 1 print a2 521 print a1 520 引用傳遞 也稱位址傳遞,在方法呼叫時,實際上是把引...