淺談C++中的指針

以前學習數據結構的時候,寫程序時總是見一些複雜的指針類型,比如Node ** &param1,今天總結一下,以備以後學習。

首先談下指針類型,指針類型有形象的理解,就是指針變量中存儲的是一個地址,而該地址指向的空間纔是我們所要訪問的內容(值),這也就是一級指針,我們可以將它理解爲彙編語言中的間接訪問。

舉個例子,

int a = 3;

int * b = &a; 

如下圖所示:

 

這裏變量b的地址就是addr1,地址addr2便是a的地址,addr2中存儲的value便是3。

從上面我們可以把指針理解爲指向特定類型的地址類型。

如果把指針類型作爲形式參數傳送給被調用函數,它會引起值的改變,爲什麼呢?我們知道,形式參數只是拷貝了傳送參數的內容,非指針變量不會調用函數中值,而指針變量則不一樣,會受到影響,因爲指針的內容便是一個地址,而被調用函數對地址指向空間進行寫操作所以會改變。下面舉個例子,C++代碼如下:

 

該段代碼運行結果如下:

從上面結果可以看出,調用函數中的變量b和被調用函數test_point中的變量param1的讀寫地址一樣都是2947696。而這兩個變量(b和param1)本身地址不一樣分別是2947684(b),2947472(param1)。原因就在二者操作的有效地址是一樣的,纔會導致對被調用函數的操作會影響到調用函數的變量。這就是在test_point進行加10操作會反應到b變量中的原因。

對於二級指針,用圖形象地表示如下:

其實就是地址的地址,驗證程序可在上述程序的基礎上進行修改。

讀到這裏我們可以理解三級,四級甚至n級指針,一般情況下,最多用到二級指針。

那麼這時可能會有一個疑問,有沒有0級指針呢,答案是有的,也就是引用,引用在類裏面可有了用武之地。下面講解一下引用。

引用就是變量自身的地址,如果作爲形式參數傳給被調用函數,那麼被調用函數對響應參數的寫操作也會反應到調用函數的變量中。

示例代碼如下:

示例代碼運行結果如下:

從運行結果中,可以看出main函數中a的地址和tesp_point中地址一樣,所以這兩個變量操縱的是同一個地址空間,以至於在test_point中對param1中進行加10操作,等同於在main函數中對a進行加10操作。

到這裏應該知道Node ** &param1的意義了吧,如果不懂,再看一遍。

當然在類等符合結果中還牽涉到,淺拷貝和深拷貝,這些問題以後有時間了再繼續發博客探討。

這是個人總結,如果有什麼錯誤,或表達不清楚的地方,請留言探討。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章