目錄
區分"&"符號做引用和做取位址場景的區別
和型別在一起的是引用,和變數在一起的是取址
1)引用在賦值=的左邊,而取位址在賦值的右邊
2)和型別在一起的是引用,和變數在一起的是取址。
如何實現取位址操作
被調函式中的記憶體管理
通過傳遞引用做函式引數
"*p"不等同於"&a"
想實現乙個指標做函式返回值的操作,但發現怎麼也實現不了,如下面的**,想像函式中傳入乙個變數x,然後,返回這個變數的指標,然後,通過這個返回的指標,再將這個變數中存放的值,列印出來。
問題**:
#include using namespace std;
int* geta3(int a)
void main()
經過分析後,找出這段**的問題有很多。
,比如:
int a=3;
int &b=a; //引用
int *p=&a; //取位址
舉例同樣如上,還有下例:
int function(int &i)
//引用
那麼問題來了,下面這個場景"&"是做什麼作用的呢?
return &a;
這個場景下,是返回乙個記憶體位址值,也就是變數a的位址,通常用於指標返值。「&」充當的是取位址符。
int *geta3(int a)
取位址操作的時候,通過"&"來取,通過"int *p"來接收,其中,p是指標變數。但還是存在問題的。
以上面那段有問題的**為例,我把乙個變數值,傳遞到被調函式中去的時候,記憶體中會建立乙個變數a,然後將傳入的值給a,那麼最後被調函式返回的是a的位址,當被調函式執行結束,會進行析構了,那麼對於的a的內容也被擦除了,而再通過對應的返回的a的位址去返回的時候,訪問的就是亂碼了!
比如,下面的這樣更改的方式:
#include using namespace std;
int *geta3(int a)
void main()
同樣的方式,來新增乙個a4變數,只不過是沒有將其放被調函式裡面,直接在主調函式中進行,就會發現是沒問題的。
如果傳進被調函式中的是乙個引用,就不會出現上面的問題了,因為引用只是一塊兒記憶體空間的別名,別名可以被析構,但對於的記憶體空間因為有其他別名還與之對應,所以,不會析構掉。執行如下:
如下這段程式:
#include using namespace std;
void main()
我就發現了乙個問題,對於"int *w = &x;" ,這條語句,是不是就意味著"*w"等同於"&x"呢?經過實際編譯的打臉,讓我覺得一切並沒有那麼簡單:
編譯結果表明:"&x"是對應變數所存放的記憶體位址;而"*w"直接對應的是指標變數指向的記憶體空間中的實際數值,這倆其實並不相對,但卻是通過等號來相連線的。
這個現象值得注意和思考,我對這條語句的理解是,首先,建立了int型別的指標變數w,然後,取變數x的位址,最後,將這個記憶體位址賦值給了指標變數w,在這個過程中,"int *w"應該拆分成"int *"(代表整型的指標變數型別)和"w"(指標變數)來理解,而不能當做"int"和"*w"來理解。最後,「*w」的對應的是將w變數中存放的記憶體位址中的值。
陣列 指標 變數做函式引數
陣列引數等同與指標引數,會在函式內改變引數值 變數引數 函式內不會改變函式值 include using namespace std 00affe68 void print score int array1,int n 把每門課程的成績 加m分 void add score int porint1,...
用函式指標變數做函式的引數
有些時候我們無法及時確定函式的處理邏輯,程式需要動態的改變,這時我們可以通過定義函式指標來實現。舉個 我們有加法,乘法兩個函式,如果還要乙個除法我們怎麼做,可能我們會想到,這好辦,建立乙個除法的函式,分分鐘搞定。如果客戶還要變怎麼辦?資料還是那些資料,只是函式的功能改變了。那有點太麻煩了。我們定義乙...
C語言 指標變數做函式引數
整型變數 實型變數 字元型變數 陣列名和陣列元素等均可作為函式引數。此外,指標型變數也可以作為函式引數。include void swap int a,int b main 將上述程式改寫為 include void swap int a,int b main 對比發現改後的程式無法實現值得交換,這...