天天看點

c++中指針的指針和指針的引用的使用

轉自https://www.cnblogs.com/lightblueme/p/4491219.html

當指針作為函數的參數進行傳遞時,實際上本質上是安置傳遞,即将指針進行了一份拷貝,在函數的内部對這個指針的修改實際上就是對一個在函數内部的那個局部變量的修改。這點事和引用不同的,引用實際上是在參數傳遞時,将實際變量的位址傳了進去,在函數内部通路這個變量時,實際上是使用間接通路的方式來進行了的,是以實際上就是通路了元變量。但是由于隻是将位址進行了拷貝,是以對這個指針所指向位址的修改不會對原有的指針産生影響。若果要實作對指針的修改,需要使用指針的指針或者指針的應用進行傳遞。

一、指針的指針

c++中指針的指針和指針的引用的使用

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

int

value=3;

void

func(

int

**p)

{

*p = &value;

}

int

main(

int

argc, 

char

*argv[])

{

int

n = 1;

int

*pn = &n;

cout << *pn << endl;

func(&pn);

cout << *pn <<endl;

return

0;

}

 int *p 本質為位址的位址,也就是說,p指向了一個記憶體空間,裡面放了一個位址。如果我們通過值傳遞,将直接傳遞給函數,那麼内部的副本不會改變p本身。類似于在函數外部是int *p,在内部是int * tmpp,兩者裡面放的内容是一樣的,也就是真是的位址,但是兩者本身的位址是不一樣的,對tmpp的修改不會作用到p上。 使用指針的指針,可以做到這點。int **p;在函數内部首先解引用,實際上就得到了p的真是位址,進而可以對p本身進行修改。

二、指針的引用

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

int

value=3;

void

func(

int

*&p)

{

p = &value;

}

int

main(

int

argc, 

char

*argv[])

{

int

n = 2;

int

*pn = &n;

cout << *pn << endl;

func(pn);

cout << *pn <<endl;

return

0;

}

看一下int *&p 實際上,本質p是一個引用,對一個指針的引用,是以對p的修改實際上就是對指針的修改。這裡在從新認識指針 int *p,本質為位址的位址,也就是說p指針中放的是一個位址,本身p也有一個位址。是以當int *& p初始化之後那麼p指向的位址就不會改變,也就是存放位址的記憶體空間。但是這裡面放的内容可以改變,這就是引用的特點,在這裡實際上就是裡面放的位址可以改變。

STL