關於C++的 []、*、&,數組指針引用 之 聲明

恩,我原來是一直一直搞不明白這個聲明怎麼讀,還有函數傳值。就是死都搞不明白。然後最近終於對聲明大徹大悟了。

兩種類型:

//第一種
int n=0;
char c='k';

//第二種
int *p=&n;
char s[4]="c++";
char &cc=c;

下面說的“存儲”請不要當成是 存儲到內存,這裏的“存儲”就是理解時候用的自然語言(不是術語),沒有任何科學依據(我不懂彙編……也不懂編譯原理……所以不能保證是不是真的是這樣)。

下面請區別“數據”與“值”這兩個詞。至於怎麼區別,emmm,我也不清楚,大概這麼理解吧:一個名字存儲的“數據”就是你要給別人說清楚這個名字代表了什麼的時候,要說的所有的信息。一個名字的“值”就是你單獨用這個名字的時候(不加任何運算符(包括*(間接尋址運算符),&(取址運算符))之類的運算符),這個名字代表了(返回了)什麼(好吧,引用就單算吧,就當是什麼都沒有吧。就是引用沒有值。主要是我原來一直以爲指針只是存儲了地址,以至於我一直覺得在聲明指針的時候完全沒必要加int啥的(好吧其實我現在也這麼覺得……))。

第一種名字(上面的n,c)他們存儲的數據,只與值相關,就是這個值不會牽扯到其他的東西了(區別於第二種,這裏可能還不知道我要表達什麼,請與第二種作對比)。int 就是一個數,char就是一個字符。所以聲明的時候只要

第二種名字(上面的p,s,cc)他們存儲的數據(這個數據實際上是地址),不止與值相關,或者說這個數據由兩部分構成,一部分是值(地址);由於這個值本身就與其他東西相關(地址裏一般總是存儲了一些東西的,別太較真,主要是感性的理解),另一部分,就是這個其他東西的信息(就是類型)了。

嵌套:

在聲明第一種名字的時候沒啥問題,……這……沒啥問題吧,就是聲明一下類型就可以了,這個很直觀吧……

在聲明第二種名字的時候問題就來了,這個第二種名字由於可以存儲(或者指向)別的東西,所以需要聲明兩個類型,一個是值的類型(指針,還是數組,還是引用),一個是存儲的東西的類型。而這個存儲的東西還可以是第二種類型的(除了引用,因爲引用),就又需要聲明箱子裏的箱子裏裝的是什麼(或者 指向的值 指向了什麼)。這樣就形成了一個嵌套,類似一條鏈子,我們要一層一層的聲明都是啥,直到最後存儲(指向)了一個第一種類型,就停下了。

閱讀順序:

1.括號,括號裏面的順序同這個順序(名字一定會在括號裏。這句話看不懂可以不管,按照感覺來就行,順序四會用到這個性質) 2.先後綴(數組)再前綴 (指針、引用)3.從內到外(即後綴是從左到右,前綴是從右到左)。

下面的【】代表了註釋,等同於上面的()。

啥意思嘞。(這裏可以跳過,先看例子,再來看這裏)按照這個順序就可以得到一個序列:

(指針,數組,數組,指針,...,指針,int)

將第一個,和後面所有的劃分一下,變成一個只有兩個類型的序列:

(指針,類型(也是一個序列))【就是:(指針,(數組,數組,指針,...,指針,int))】

第一個就是值的類型,第二個就是存儲的東西的類型。


下面是一個例子:int **(**b[3][2])[4];

01 int **(**b[3][2])[4]; 先看括號。

02 int **(**b[3][2])[4]; 括號裏順序不變,如果還有括號,就還要看括號。這裏沒有括號了,就進入第二步,先是:後綴。

03 int **(**b[3][2])[4]; 從內到外,最挨着b的。b是:裝着3個東西的數組。這3個東西是什麼類型呢?接着看。

04 int **(**b[3][2])[4]; 從內到外,次挨着b的。這3個東西每個都是:裝着2個東西的數組。這2個東西是什麼呢?接着看。

05 int **(**b[3][2])[4]; 從內到外,碰到括號了……說明後綴完了,那就退回第二步,下一個是:前綴。

06 int **(**b[3][2])[4]; 從內帶外,指針,這2個東西都是:指針。指向什麼類型的東西呢?

07 int **(**b[3][2])[4]; 從內帶外,指針,每個指針都指向:指針。這個指針指向什麼類型的東西呢?

08 int **(**b[3][2])[4]; 從內到外,又碰到括號了,說明前綴完了,退回第二步,沒有下一個了(前綴後綴都完了),退回第一步,看括號外面。

09 int **(**b[3][2])[4]; 第二步,先看後綴。

10 int **(**b[3][2])[4]; 從內到外,最挨着括號的。剛剛(第07步)說到了指針,這個指針指向的是:存了4個東西的數組。這4個東西是什麼呢?

11 我懶得寫了,下面就是該前綴了(兩次指針),最後指向了int,就完了。

總結一下就是:b是一個:裝了3個 有2個 指向了 指向 裝了4個 指向了 指向int的指針 的指針 的數組 的指針 的指針 的數組 的數組。好,這句話根本讓人看不懂。所以請這麼理解:

b是一個裝了3個元素的數組,這些元素都是數組,裝了2個指向了指針的指針,指向的那些指針,又都指向了裝了四個元素的數組,這些元素是指針,指向了一個指向int的指針。好吧這依然讓人無法理解,所以……只可以意會不能言傳…………。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章