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