通過一個實(shí)例來理解徹底理解指針數(shù)組的核心,我們先來看一下如下定義的兩個變量,在我們不開始講之前,看看你能理解多少?
static QEvent const *Sto1[5];//習(xí)慣性*號和變量寫在一起,當(dāng)然你也可以家空格
static QEvent * const Sto2[5];
這個變量定義看著就頭大,而且還很復(fù)雜,我們從功能上來拆解這個變量(重點(diǎn):站在功能的角度來看待它,而不是站在他是如何實(shí)現(xiàn)的角度來看待它,這是我多年背負(fù)那種深入骨髓的痛,慢步前行中慢慢的領(lǐng)悟),其實(shí)我們來看 變量名Sto1[5]或Sto2[5],他是一個數(shù)組,也就是說這個變量的數(shù)據(jù)結(jié)構(gòu)屬性之一,他是一個順序結(jié)構(gòu)的數(shù)組。
*是這個結(jié)構(gòu)里面最讓人感覺的困惑的,甚至是有的地方還會用**類型的變量,假如你站在定義和實(shí)現(xiàn)的角度來解讀它,你的思維就像是陷入了無盡的細(xì)節(jié)之中,很難再拔出來,很簡單的例子,下班以后,爬上樓站在家門口,你掏出鑰匙,會不會盯著門鎖再腦海里思考為什么插入鑰匙以后,轉(zhuǎn)動鑰匙,門鎖就會被打開,這可能導(dǎo)致今天你都進(jìn)不了門,你不會去研究這種問題,知道個大概的原理就足以,那你又何必去在意一個指針是怎么實(shí)現(xiàn)的呢。
指針存在的意義才是我們要牢記的,他是一個句柄,可以讓我們通過它迅速找到其指向數(shù)據(jù)類型中的任何變量,指針的好處是幫我們降低內(nèi)存的開銷,降低我們開發(fā)的復(fù)雜度,從今天開始,只要記住他的另一個名字(句柄,針總會扎心),一個句柄實(shí)際是上一串ID,通過它,我們可以訪問內(nèi)存的上存儲的任何一個特定的對象(復(fù)合型數(shù)據(jù)或者是函數(shù)),例如給定一個身份證ID,他總是會對應(yīng)唯一的一個人。
static 定義的目的,再C中,它是靜態(tài)變量,假如它在.c文件中定義,那么你們辦法在另一個.c文件中,通過變量名來讀寫該變量。它限制的變量的作用域。
QEvent是一個復(fù)合類型的變量,假如他是一個int類型,你也就沒必要定義成句柄類型*了。
先不管const修飾符,站在功能的角度上,這個變量的理解就出來了,首先他就是一個數(shù)組,擁有5個元素的數(shù)組,數(shù)組元素的類型為一個句柄類型,通過這個句柄可以找的一種QEvent復(fù)合結(jié)構(gòu)變量。
最后還剩下一個const修飾符,這個修飾符是限制變量的寫權(quán)限的,加上以后,這個變量不能被重寫。對于一個句柄來講,加入const以后,要么句柄不能被重寫,要么句柄指向的變量不能被重寫。
const * 句柄,這種情況下,可以這樣理解const (*句柄) 也就是const 的對象是句柄指向的復(fù)合變量(一般為結(jié)構(gòu)體變量)。
* const 句柄,這種其實(shí)不用講了,const的就是句柄,也就是句柄不能被重寫。
看到這里了,你能看懂我們上面定義的一個復(fù)雜的變量了嗎,你還會害怕去分析別的類型的變量的功能了嗎?(一定要站在這個角度去看待問題,某某大人講過,遠(yuǎn)行的目的不是去看新的風(fēng)景,而是擁有一雙發(fā)現(xiàn)風(fēng)景的眼睛)。