C++二級指針和指針的引用

目的:形參指針改變實參指針所指向的對象(即地址)

舉例:pointer指針指向白鴨子whiteDuck,如果想要設計一個函數,這個函數能夠令pointer指向黑鴨子blackDuck。

圖示如下:

代碼簡示如下:

Duck *duck = &oldDuck;
someFunction(duck);
// 此時duck指向newDuck;

1、形參與實參均為指針時達不到此目的

此時,二者指向同一地址,可以對同一對象進行操作。但是形參指針不能改變實參指針所指向的地址,因為二者是兩個完全無關的指針對象。函數傳遞參數時,將實參指針的值傳遞給形參指針,是一個值傳遞的過程。

2、解決方案——指針引用或二級指針

為瞭讓函數能夠更改實參指針所指向的地址,需要將實參的地址傳入函數。

此時有兩種策略來實現目的:

  • 形參為二級指針**p;
  • 形參為指針引用*&p;

下面分別對兩種方式進行介紹,並提供相應的代碼。

其中Duck類的定義如下:

class Duck {
public:
    Duck(int color) { this->color = color; }
    // 0表示白色,1表示黑色
    int color = 0;
};

(1)形參為二級指針**p

此時,實參為指針的地址,形參為指針的指針,即形參指向實參。形參對實參進行操作,而不是對實參指向的地址進行操作。

void changeObject(Duck **p) {
    *p = new Duck(1);
}
// 調用方式
changeObject(&pointer);

(2)形參為指針引用*&p

指針引用即指針的引用,指針引用同樣是針對指針進行操作,而不是針對指針指向的地址進行操作:

void changeObject(Duck *&p) {
    p = new Duck(1);
}
// 調用方式
changeObject(pointer);

3、總結

不管是C還是C++,指針都是非常重要的概念,使用的頻率也較高。二級指針和指針引用並不是完全相等的兩個概念,比如引用不能改變其指向的對象,但是指針可以指向任意的對象。

到此這篇關於C++二級指針和指針的引用的文章就介紹到這瞭,更多相關C++指針引用內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: