關(guān)于指針是什么潜支,很多教材已經(jīng)作出了定義丐吓,大多數(shù)都會(huì)定義為“存放變量?jī)?nèi)存地址的變量”。從這句話中我覺(jué)得除了讓我知道這個(gè)定義有11個(gè)字以外趟据,其他就沒(méi)什么用了券犁。我個(gè)人覺(jué)得要理解指針,不是光光說(shuō)一下是變量的地址就萬(wàn)事大吉了汹碱,而是要從多個(gè)屬性來(lái)解釋指針粘衬,為此,我個(gè)人總結(jié)了一個(gè)所謂的多維屬性法來(lái)理解指針咳促。
另外稚新,為了能把指針說(shuō)清楚,我認(rèn)為關(guān)鍵不在于用苦澀的文字描述等缀,而在于以示意圖的形式描述清楚指針的概念枷莉。我接下來(lái)就準(zhǔn)備用我的多維屬性法娇昙,加上畫幾張圖尺迂,和一些偽代碼,盡量說(shuō)清楚指針是什么冒掌。繪圖水平有限噪裕,技術(shù)水平也有限,歡迎多批評(píng)股毫。
1.要說(shuō)清楚指針是什么之前膳音,先來(lái)看看如何從多維屬性來(lái)理解普通變量,以及普通變量在內(nèi)存中是什么樣兒的铃诬。
比如現(xiàn)在有個(gè)整型變量:int a = 1;也就是說(shuō)整型變量a的值是1祭陷,在內(nèi)存中的存放如示意圖1所示:
相信朋友們對(duì)這張圖無(wú)任何異議,很簡(jiǎn)單嘛趣席,a就是1,1就是a嘛兵志。好了,我可以提煉出變量a的三個(gè)屬性出來(lái)宣肚,分別是有用數(shù)據(jù)的名字想罕,有用數(shù)據(jù)的值,有用數(shù)據(jù)的類型霉涨。
有用數(shù)據(jù)的名字按价,就是“a”;
有用數(shù)據(jù)的值笙瑟,就是“1”楼镐;
有用數(shù)據(jù)的類型,就是“int”往枷;
我之所以用“有用數(shù)據(jù)”這四個(gè)字來(lái)描述鸠蚪,是因?yàn)槌绦虼a中會(huì)經(jīng)常用到變量“a”今阳,以及它的值“1”,還有它的類型“int”茅信,那不就是有用的嘛盾舌,所以我就“有用數(shù)據(jù)”來(lái)描述變量a的三個(gè)屬性。好了蘸鲸,我用下面的表示法來(lái)表示變量a的這三個(gè)屬性:
變量a=(有用數(shù)據(jù)的名字妖谴,有用數(shù)據(jù)的值,有用數(shù)據(jù)的類型)
好了酌摇,假設(shè)變量a的地址是“0x380fe0”膝舅,則示意圖2是從變量a的地址的角度來(lái)看變量a在內(nèi)存中的存放形式:
在圖2中,我標(biāo)記出變量a的地址是16進(jìn)制的0x380fe0窑多,a為1仍稀,也就是在內(nèi)存地址為“0x380fe0”的地方放了一個(gè)值1。用C語(yǔ)言表示地址的術(shù)語(yǔ)來(lái)說(shuō)就是“&a”等于“380fe0”埂息〖寂耍“&”是表示變量地址的意思。這張圖相信朋友們也沒(méi)有什么異議千康,對(duì)吧享幽,都是很直觀的東西。好拾弃,我又可以提煉出變量a的第4個(gè)屬性值桩,叫做“有用數(shù)據(jù)的地址”,也就是“&a”啦豪椿。至此奔坟,變量a的四個(gè)屬性都齊全啦,如下:
變量a=(有用數(shù)據(jù)的地址搭盾,有用數(shù)據(jù)的名字咳秉,有用數(shù)據(jù)的值,有用數(shù)據(jù)的類型)增蹭,具體到本例滴某,就是:
變量a=(0x380fe0,a滋迈,1霎奢,int)
從四個(gè)屬性來(lái)說(shuō)明一般的整型變量在內(nèi)存中的樣兒,好了饼灿,下面我要放大招兒了幕侠,再說(shuō)說(shuō)從四個(gè)屬性來(lái)理解指針變量,以及指針變量在內(nèi)存中的樣兒碍彭。
我定義一個(gè)指針變量:
int *p = NULL;
p = 0x380fe0;
這兩句代碼朋友們也一定看的懂的晤硕,就是一個(gè)指針變量p的值用16進(jìn)制來(lái)表示就是“0x380fe0”悼潭,這正好是變量a的地址。p在內(nèi)存中的表示如下示意圖3:
示意圖3
示意圖3跟整型變量a的示意圖1沒(méi)任何區(qū)別舞箍,我也可以說(shuō)p就是0x380fe0舰褪,0x380fe0就是p,跟變量a就是1疏橄,1就是a是一個(gè)道理占拍。好,這里我提煉出指針p的第一個(gè)屬性捎迫,叫做“指針自己的值”晃酒,指針變量p的值是0x380fe0,可不就是自己的值嘛窄绒!用如下表示發(fā)來(lái)表示就是:
指針p=(指針自己的值)
到此為止贝次,朋友們應(yīng)該都是無(wú)異議的,好彰导,下面再來(lái)看“*p”是什么東西蛔翅,如下示意圖4所示:
示意圖4
指針變量p前面加個(gè)“”就變成了“p”。很多教材會(huì)說(shuō)“指針變量p指向的值是1”螺戳,這說(shuō)了等于沒(méi)說(shuō)搁宾,誰(shuí)看的懂折汞。加了星號(hào)后倔幼,p就是a的等價(jià)物了,是a的別名了爽待,也就是p就是a损同,a就是*p。這樣說(shuō)大家應(yīng)該都會(huì)看懂吧鸟款。好了膏燃,這里我可以提煉出指針變量p的剩余三個(gè)屬性了,分別叫做”與星號(hào)結(jié)合名“何什,”有用數(shù)據(jù)的值“组哩,”有用數(shù)據(jù)的類型“。
與星號(hào)結(jié)合名:就是”“與指針p結(jié)合处渣,變成p伶贰;
有用數(shù)據(jù)的值:就是1;跟變量a的第三個(gè)屬性一樣罐栈;
有用數(shù)據(jù)的類型黍衙,就是int;跟變量a的第四個(gè)屬性一樣荠诬。
這樣指針變量p的四個(gè)屬性也齊全了琅翻,如下:
指針變量p=(指針自己的值位仁,與星號(hào)結(jié)合名,有用數(shù)據(jù)的值方椎,有用數(shù)據(jù)的類型)聂抢。在本例就是:
指針變量p=(0x380fe0,*p棠众,1涛浙,int)。
3. 用變量a的四個(gè)屬性與指針變量p的四個(gè)屬性對(duì)比摄欲,一下子就能看出指針的本質(zhì)了轿亮。
我整理下上述的偽代碼:
int a = 1;//假設(shè)變量a的地址是0x380fe0
int *p = NULL;
p = &a;
再用我說(shuō)的多維屬性法分別來(lái)表示整型變量a和指針變量p,分別如下:
整型變量a=(有用數(shù)據(jù)的地址胸墙,有用數(shù)據(jù)的名字我注,有用數(shù)據(jù)的值,有用數(shù)據(jù)的類型)
指針變量p=(指針自己的值迟隅,與星號(hào)結(jié)合名但骨,有用數(shù)據(jù)的值,有用數(shù)據(jù)的類型)
在本例中智袭,它們各自的屬性就是:
整型變量a=(&a的值奔缠,a,1吼野,int)
指針變量p=(p的值校哎,*p,1瞳步,int)
再細(xì)一點(diǎn)闷哆,就是:
整型變量a=(0x380fe0,a单起,1抱怔,int)
指針變量p=(0x380fe0,*p嘀倒,1屈留,int)
看出來(lái)了嗎?看出來(lái)了嗎》看出來(lái)了嗎测蘑?它們的四個(gè)屬性的含義是一一等價(jià)的灌危,具體來(lái)說(shuō)就是:
”&a“ 就是 ”p“.
”a“就是 ”*p“
”1“ 就是 ”1“
”int“ 就是 ”int“
這才是理解指針p的本質(zhì)關(guān)鍵所在。
關(guān)于”&a“ 就是 ”p“我再說(shuō)兩句帮寻。同樣是表示地址乍狐,”&a“是用了”&“和”a“兩個(gè)字符的組合來(lái)表示的,而”p“就用了一個(gè)字符”p"來(lái)表示固逗,這種字符數(shù)量上的不一致導(dǎo)致了很多人學(xué)指針時(shí)會(huì)犯暈浅蚪!
關(guān)于”a“就是 ”p“我也說(shuō)兩句藕帜。同樣是表示整型變量的名字,這次”a“就用了一個(gè)字符”a“來(lái)表示惜傲,而”p“用了字符“*”和”p"兩個(gè)字符來(lái)表示洽故,又是這種字符數(shù)量上的不一致又導(dǎo)致了很多人學(xué)指針時(shí)會(huì)犯暈!
說(shuō)了這么多廢話盗誊,其實(shí)就是為了說(shuō)明指針變量的四個(gè)屬性表示法时甚,建議記住這四個(gè)屬性表示法,以及與一般整型變量哈踱、字符變量等一般變量類型的四個(gè)屬性之間的等價(jià)關(guān)系荒适。當(dāng)然了,別指望記住這四個(gè)屬性你就理解指針了开镣,該學(xué)習(xí)的還是要學(xué)習(xí)刀诬,該多寫代碼的還是要多寫代碼,我只是希望你記住四個(gè)屬性后再學(xué)習(xí)指針時(shí)邪财,不至于被指針碾壓的那么慘陕壹。
對(duì)于第二個(gè)屬性,在本文中树埠,就是一個(gè)“”和“p”的結(jié)合“p”糠馆,別看它是由兩個(gè)字符組成的,其實(shí)本質(zhì)上就是變量“a”怎憋,因此從這一個(gè)屬性開(kāi)始又碌,你完全可以用一般的整型變量“a”來(lái)思考問(wèn)題了,也就是直接將“*p”看做“a”盛霎,后面的第3個(gè)屬性就是這個(gè)“a”的值“1”赠橙,第4個(gè)屬性就是“a”的類型“int”耽装。記住愤炸,從第2個(gè)屬性開(kāi)始,就與指針p沒(méi)有任何關(guān)聯(lián)了掉奄,你全部使用整型變量a的思維去思考問(wèn)題规个。