免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
二級(jí)指針的作用詳解

歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明原文地址:

B是一個(gè)指針變量,其中存放著C的地址,但是B也要占空間的啊,所以B也有地址,B的起始地址是0x00000004,但是B內(nèi)存中存放的是C的地址,所以B里面的內(nèi)容就是0x00000008。

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

那么,再來看A:

A是二級(jí)指針變量,其中存放著B的地址0x00000004,A也有地址,是0x00000000;

*A = B= 0x00000008; //A解引用也就是B的內(nèi)容 **A = *B = '一段內(nèi)容'; //B解引用,也就是B指針指向的C的值A(chǔ) = &B = 0x00000004; //A存的是B的地址,B的地址是0x00000004&A = 0x00000000; //A取地址



二、使用


二級(jí)指針作為函數(shù)參數(shù)的作用:在函數(shù)外部定義一個(gè)指針p,在函數(shù)內(nèi)給指針賦值,函數(shù)結(jié)束后對(duì)指針p生效,那么我們就需要二級(jí)指針。


看看下面一段代碼:有兩個(gè)變量a,b,指針q,q指向a,我們想讓q指向b,在函數(shù)里面實(shí)現(xiàn)。

1.先看看一級(jí)指針的實(shí)現(xiàn)

#includeusing namespace std;int a= 10;int b = 100;int *q;void func(int *p){ cout<><><><><><><><><><><><><><><><><><><><><><><><><><>

這么寫有什么問題?為什么*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都有一個(gè)地址.

note:2->q指向a.

note:3->我們發(fā)現(xiàn)參數(shù)p的地址變了,跟q不一樣了,是的參數(shù)傳遞是制作了一個(gè)副本,也就是p和q不是同一個(gè)指針,但是指向的地址0x0032F000(a的地址)還是不變的.

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

note:5->退出函數(shù),p的修改并不會(huì)對(duì)q造成影響。

結(jié)論:

編譯器總是要為函數(shù)的每個(gè)參數(shù)制作臨時(shí)副本,指針參數(shù)p的副本是 p,編譯器使 p = q(但是&p != &q,也就是他們并不在同一塊內(nèi)存地址,只是他們的內(nèi)容一樣,都是a的地址)。如果函數(shù)體內(nèi)的程序修改了p的內(nèi)容(比如在這里它指向b)。在本例中,p申請(qǐng)了新的內(nèi)存,只是把 p所指的內(nèi)存地址改變了(變成了b的地址,但是q指向的內(nèi)存地址沒有影響),所以在這里并不影響函數(shù)外的指針q。

這就需要二級(jí)指針操作:


2.二級(jí)指針操作

#includeusing namespace std;int a= 10;int b = 100;int *q;void func(int **p) //2{ cout<><><><><><><><><><><><><><><><><><><><><><><><><><>

這里只改了三個(gè)地方,變成傳二級(jí)指針。我們?cè)倏?

因?yàn)閭髁?strong>指針q的地址(二級(jí)指針**p)
到函數(shù),所以二級(jí)指針拷貝(拷貝的是p,一級(jí)指針中拷貝的是q所以才有問題),(拷貝了指針但是指針內(nèi)容也就是指針?biāo)赶虻牡刂肥遣蛔兊?/span>)所以它還是指向一級(jí)指針q(*p = q)。在這里無論拷貝多少次,它依然指向q,那么*p = &b;自然的就是 q = &b;了。

3.再看一個(gè)例子:

我們代碼中以二級(jí)指針作為參數(shù)比較常見的是,定義了一個(gè)指針MyClass *ptr=NULL,在函數(shù)內(nèi)對(duì)指針賦值*ptr=malloc(...),函數(shù)結(jié)束后指針依然有效.這個(gè)時(shí)候就必須要用二級(jí)指針作為參數(shù)func(MyClass **p,...),一級(jí)指針為什么不行上面說了。

void my_malloc(char **s) { *s=(char*)malloc(100); } void main() { char *p=NULL; my_malloc(&p); //do something if(p) free(p); }

這里給指針p分配內(nèi)存,do something,然后free(p),如果用一級(jí)指針,那么就相當(dāng)于給一個(gè)p的拷貝s分配內(nèi)存,p依然沒分配內(nèi)存,用二級(jí)指針之后,才對(duì)p分配了內(nèi)存。


打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
c++之指針作為函數(shù)參數(shù)傳遞的問題
C語言中二級(jí)指針做參數(shù) (轉(zhuǎn))
C語言提高: 二級(jí)指針的輸入輸出
C 知識(shí)點(diǎn)
多線程同步訪問共享內(nèi)存 — unp讀書筆記(2) - godorz…
C語言中的內(nèi)存泄漏問題
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服