二級指標的作用詳解

2021-09-12 17:51:10 字數 3042 閱讀 9124

一、概念

在如下的a指向b、b指向c的指向關係中:

首先c是"一段內容",比如你用malloc或者new分配了一塊記憶體,然後塞進去"一段內容",那就是c了。c的起始位址是0x00000008。

b是乙個指標變數,其中存放著c的位址,但是b也要佔空間的啊,所以b也有位址,b的起始位址是0x00000004,但是b記憶體中存放的是c的位址,所以b裡面的內容就是0x00000008。

那麼到此為止都比較好理解:

b= 

0x00000008;

//b的內容

*b =

"一段內容";

//b解引用,也就是b指標指向的c的值

&b =

0x00000004;

//b取位址,b的位址是0x00000004

那麼,再來看a:

a是二級指標變數,其中存放著b的位址0x00000004,a也有位址,是0x00000000;

*a = b= 

0x00000008;

//a解引用也就是b的內容

**a = *b =

"一段內容";

//b解引用,也就是b指標指向的c的值

a = &b =

0x00000004;

//a存的是b的位址,b的位址是0x00000004

&a =

0x00000000;

//a取位址

二、使用

二級指標作為函式引數的作用:在函式外部定義乙個指標p,在函式內給指標賦值,函式結束後對指標p生效,那麼我們就需要二級指標。

看看下面一段**:有兩個變數a,b,指標q,q指向a,我們想讓q指向b,在函式裡面實現。

1.先看看一級指標的實現

#include

using

namespace

std;

int a=

10;int b =

100;

int *q;

void

func

(int *p)

intmain

()

這麼寫有什麼問題?為什麼*q不等於100?我們看一下輸出便知:&a=0032f000,&b=0032f004,&q=0032f228

*q=10,q=0032f000,&q=0032f228

func:&p=0018fd24,p=0032f000

func:&p=0018fd24,p=0032f004

*q=10,q=0032f000,&q=0032f228

我們看輸出:

note:1->a,b,q都有乙個位址.

note:2->q指向a.

note:3->我們發現引數p的位址變了,跟q不一樣了,是的引數傳遞是製作了乙個副本,也就是p和q不是同乙個指標,但是指向的位址0x0032f000(a的位址)還是不變的.

note:4->p重新指向b.

note:5->退出函式,p的修改並不會對q造成影響。

結論:

編譯器總是要為函式的每個引數製作臨時副本,指標引數p的副本是 p,編譯器使 p = q(但是&p != &q,也就是他們並不在同一塊記憶體位址,只是他們的內容一樣,都是a的位址)。如果函式體內的程式修改了p的內容(比如在這裡它指向b)。在本例中,p申請了新的記憶體,只是把 p所指的記憶體位址改變了(變成了b的位址,但是q指向的記憶體位址沒有影響),所以在這裡並不影響函式外的指標q。

這就需要二級指標操作:

2.二級指標操作

#include

using

namespace

std;

int a=

10;int b =

100;

int *q;

void

func

(int **p)

//2

intmain

()

這裡只改了三個地方,變成傳二級指標。我們再看:

因為傳了指標q的位址(二級指標**p)到函式,所以二級指標拷貝(拷貝的是p,一級指標中拷貝的是q所以才有問題),(拷貝了指標但是指標內容也就是指標所指向的位址是不變的)所以它還是指向一級指標q(*p = q)。在這裡無論拷貝多少次,它依然指向q,那麼*p = &b;自然的就是 q = &b;了。

3.再看乙個例子:

我們**中以二級指標作為引數比較常見的是,定義了乙個指標myclass *ptr=null,在函式內對指標賦值*ptr=malloc(...),函式結束後指標依然有效.這個時候就必須要用二級指標作為引數func(myclass **p,...),一級指標為什麼不行上面說了。

void

my_malloc

(char **s)

void

main

()

這裡給指標p分配記憶體,do something,然後free(p),如果用一級指標,那麼就相當於給乙個p的拷貝s分配記憶體,p依然沒分配記憶體,用二級指標之後,才對p分配了記憶體。

二級指標的作用詳解

一 概念 在如下的a指向b b指向c的指向關係中 首先c是 一段內容 比如你用malloc或者new分配了一塊記憶體,然後塞進去 一段內容 那就是c了。c的起始位址是0x00000008。b是乙個指標變數,其中存放著c的位址,但是b也要佔空間的啊,所以b也有位址,b的起始位址是0x00000004,...

二級指標的作用詳解

原文 一 概念 在如下的a指向b b指向c的指向關係中 首先c是 一段內容 比如你用malloc或者new分配了一塊記憶體,然後塞進去 一段內容 那就是c了。c的起始位址是0x00000008。b是乙個指標變數,其中存放著c的位址,但是b也要佔空間的啊,所以b也有位址,b的起始位址是0x000000...

二級指標的作用詳解

一 概念 在如下的a指向b b指向c的指向關係中 首先c是 一段內容 比如你用malloc或者new分配了一塊記憶體,然後塞進去 一段內容 那就是c了。c的起始位址是0x00000008。b是乙個指標變數,其中存放著c的位址,但是b也要佔空間的啊,所以b也有位址,b的起始位址是0x00000004,...