深入理解c++指針的指針和指針的引用

轉載自:https://www.cnblogs.com/li-peng/p/4116349.html

展示一下使用指針的指針和指針的引用修改傳遞給方法的指針,以便更好的使用它。(這裏說的指針的指針不是一個二維數組)

爲什麼需要使用它們

當我們把一個指針做爲參數傳一個方法時,其實是把指針的複本傳遞給了方法,也可以說傳遞指針是指針的值傳遞。

如果我們在方法內部修改指針會出現問題,在方法裏做修改只是修改的指針的copy而不是指針本身,原來的指針還保留着原來

的值。我們用下邊的代碼說明一下問題:

複製代碼
int m_value = 1;

void func(int *p)
{
    p = &m_value;
}

int main(int argc, char *argv[])
{
    int n = 2;
    int *pn = &n;
    cout << *pn << endl;
    func(pn);
    cout << *pn <<endl;
    return 0;
}
複製代碼

看一下輸出結果

輸出的是兩個2

使用指針的指針

展示一下使用指針的指針做爲參數

複製代碼
void func(int **p)
{
    *p = &m_value;

    // 也可以根據你的需求分配內存
    *p = new int;
    **p = 5;
}

int main(int argc, char *argv[])
{
    int n = 2;
    int *pn = &n;
    cout << *pn << endl;
    func(&pn);
    cout << *pn <<endl;
    return 0;
}
複製代碼

我們看一下 func(int **p)這個方法

  • p:  是一個指針的指針,在這裏我們不會去對它做修改,否則會丟失這個指針指向的指針地址
  • *p:  是被指向的指針,是一個地址。如果我們修改它,修改的是被指向的指針的內容。換句話說,我們修改的是main()方法裏 *pn指針
  • **p: 兩次解引用是指向main()方法裏*pn的內容

指針的引用

再看一下指針的引用代碼

複製代碼
int m_value = 1;

void func(int *&p)
{
    p = &m_value;

    // 也可以根據你的需求分配內存
    p = new int;
    *p = 5;
}

int main(int argc, char *argv[])
{
    int n = 2;
    int *pn = &n;
    cout << *pn << endl;
    func(pn);
    cout << *pn <<endl;
    return 0;
}
複製代碼

看一下func(int *&p)方法

  • p:  是指針的引用,main()方法裏的 *pn
  • *p:是main()方法裏的pn指向的內容。

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