請讀者先看下面這段**
#includeusing namespace std;
void change(int *q)
int main()
我們這裡定義了乙個名字叫change的函式,它的作用是把乙個整形指標的值修改為10。我們在main中定義了乙個指標p,賦以初值9。理論上說,程式執行時輸入的應該是10。但實際上,輸出的卻是9!也就是說change函式沒有起到效果,那麼這是怎麼回事呢?
依本人看法,我們執行change函式時,其實是執行了change(int *q=p),也就是說我們定義了乙個區域性指標q,使其指向p。而q=new int(10)這句話的意思是為q重新分配乙個空間,並將空間的值設為10,那麼此時q其實並沒有指向p,也自然不會修改p的值了。
那麼應該如何修改呢?
其實只要將q=new int(10)改為*q=10。由於此時q是指向p的,這樣修改最直接,有效。但我們今天要講的不是這種方法,講一種另外的方法:指標的引用。
指標的引用符號為*&q,也就是在普通指標中間加乙個&符號。一旦新增了這個符號,也就意味著q指標成為了p指標的引用,兩者「合二為一」了,那麼為q指標重新分配空間就等於為p指標重新分配空間。因此,如下**才是正確的。
void change(int *&q)
舉這個例子其實只是為了讓大家更好地理解指標引用,我現在來舉乙個更恰當的例子。比如二叉查詢樹中的插入操作。插入元素x操作邏輯如下:如果當前結點為空,那麼為其新建乙個結點來存放需要的值;如果當前結點不為空,那麼判斷該值與x的大小,如果x與結點值相等,那麼插入操作無效,如果x比結點值大,那麼往右子樹插入,如果x比結點值小,往左子樹插入。寫成**如下
void insert(const t&x,node *&n)
if(n->data==x)return;
if(n->data>x)
insert(x,n->left);
else
insert(x,n->right);
}
我們這裡採用了指標的引用,直接為傳遞進來的空指標來新建乙個結點,這樣就避免了還要去判斷左子樹是否為空,右子樹是否為空,顯得更簡潔。
this指標的妙用
每個物件都可以通過this指標訪問自己的位址 物件的this指標不是物件自身的一部分,也就是說,this指標占用的記憶體大小不會反映在對物件進行sizeof運算子得到的結果中 this指標作為乙個隱式的引數傳遞給物件的每個非static成員函式 物件隱式地使用this指標或者顯式地使用this指標,...
指標的妙用
指標或者叫做索引 下標,靈活使用可以完成比較巧妙地效果 快慢指標,表示兩個指標,移動的速度不同,通常一般快指標速度是慢指標速度的兩倍,通過兩個指標相對位置的關係可以解決一些問題,例如 查詢鍊錶環起點問題 演算法步驟 快慢指標都從鍊錶起點開始移動 兩個指標速度插一倍 當兩個指標再次相遇時停止本次移動 ...
函式指標的妙用
今天上www.armfans.net 上瀏覽帖子的時候,看到乙個很好玩且非常有學習意義的帖子,將的是c中函式指標的妙用,現將內容轉錄如下 一小段精彩的 c語言,1和2實現相同的功能,歡迎大夥跟帖呵 特別感謝trio老師 1 void theuboot void theuboot void void ...