詳解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指向的內容。