C++中指針的引用*&的具體使用
指針和引用形式上很好區別,但是他們似乎有相同的功能,都能夠直接引用對象,對其進行直接的操作。
首先,引用不可以為空,但指針可以為空。前面也說過瞭引用是對象的別名,引用為空——對象都不存在,怎麼可能有別名!故定義一個引用的時候,必須初始化。因此如果你有一個變量是用於指向另一個對象,但是它可能為空,這時你應該使用指針;如果變量總是指向一個對象,i.e.,你的設計不允許變量為空,這時你應該使用引用。
如指針一樣,指針的引用容易使人困惑。
我們註意到類似下面這種語法
void func(int *&x) { ++x; }
我猜你可能對int *&x
有點疑惑。
這叫做指針的引用。
int *&x
不要覺得看著復雜,其實一點也不復雜。
我幫你拆開來看:
按照C++程序員的習慣,指針“*”號是和類型放在一起的。
C++中&是引用符號。
我們需要註意的是“引用”不產生副本,而是給原變量起別名。
對引用操作就是對原變量操作。
所以隻需要這樣:
int* &x
一目瞭然!
對指針變量本身的修改無法作用到原指針變量,
所以需要通過引用來實現修改指針變量。
我用兩張圖來告訴你指針的引用為什麼有用:
什麼叫局部修改?
舉個栗子
我用代碼來給你解釋解釋什麼叫局部修改:
#include <stdio.h> void swap(int* p1,int* p2) { int* temp=p1; p1=p2; p2=temp; printf("交換中:a=%d,b=%d \n",*p1,*p2); printf("交換中(地址):p1=%d \n",p1); printf("交換中(地址):p2=%d \n",p2); } int main() { int a=1,b=3; int *p1=&a,*p2=&b; // 交換前 printf("交換前:a=%d,b=%d \n",*p1,*p2); printf("交換前(地址):p1=%d \n",p1); printf("交換前(地址):p2=%d \n",p2); // 交換中 swap(p1,p2); // 交換後 printf("交換後:a=%d,b=%d \n",*p1,*p2); printf("交換後(地址):p1=%d \n",p1); printf("交換後(地址):p2=%d \n",p2); return 0; }
猜一猜結果。
輸出的結果:
交換前:a=1,b=3
交換前(地址):p1=6422028
交換前(地址):p2=6422024
交換交換中:a=3,b=1
交換中(地址):p1=6422024
交換中(地址):p2=6422028
交換後:a=1,b=3
交換後(地址):p1=6422028
交換後(地址):p2=6422024
運行截圖
在執行swap()函數的時候就是執行中。
可以發現在執行swap()函數的時候確實修改瞭地址,也交換瞭a、b的值。
但是,當我們在main()函數中輸出a、b的時候,完全沒有交換。
什麼叫全局修改?
同樣的代碼,我隻改一個地方。
來看看會發生什麼改變。
運行截圖
交換前:a=1,b=3
交換前(地址):p1=6422044
交換前(地址):p2=6422040
交換中:a=3,b=1
交換中(地址):p1=6422040
交換中(地址):p2=6422044
交換後:a=3,b=1
交換後(地址):p1=6422040
交換後(地址):p2=6422044
我就簡簡單單添加瞭“&”,竟然如此神奇!
所以我們可以發現:
指針的引用能夠全局修改指針變量!
引用是C++中很強大的語法,在編程中極其實用。
明白這個語法很關鍵,因為這個在樹和圖的算法中應用廣泛。
到此這篇關於C++中指針的引用*&的具體使用的文章就介紹到這瞭,更多相關C++指針的引用*&內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!