詳解c++指標的指標和指標的引用

TuxedoLinux發表於2018-05-25

詳解c++指標的指標和指標的引用

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

為什麼需要使用它們

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

如果我們在方法內部修改指標會出現問題,在方法裡做修改只是修改的指標的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指向的內容

相關文章