第五十三章 尾聲(一)
通過講解main函數(shù),我基本上知道了指針數(shù)組的用法了。
「還記不得記得我們在講二維數(shù)組的時候,我說二維數(shù)組其實是一個一維數(shù)組,不過這個一維數(shù)組的元素也是一維數(shù)組。在說到為其賦值時,你問我可不可以將數(shù)組賦值給二維數(shù)組的元素,我說按照正規(guī)操作是不行的,但是咱么借助指針數(shù)組就可以實現(xiàn)。
在講指針和數(shù)組的用法時,我們已經(jīng)知道了,指針是可以指向一個一維數(shù)組的,那么如果是一個指針數(shù)組,自然就可以表示一個二維數(shù)組了。
int* p[3];
int a0[]={0, 1, 2, 3, 4};
int a1[]={5, 6, 7, 8};
int a2[]={9, 10, 11};
p[0]= a0;
p[1]= a1;
p[2]= a2;」
「啥,這些一維數(shù)組的長度還可以不一樣???」
「這是因為指針數(shù)組里面真的就只是存放了一維數(shù)組的指針地址,而數(shù)組的長度對于數(shù)組的指針地址沒有影響。
但需要注意的是,每個元素指向的是一個真實存在的一維數(shù)組,所以在遍歷的時候要考慮數(shù)組越界的問題。
指針數(shù)組咱們就差不多講完了,接下來就剩最后一點內(nèi)容,多重指針。今天上午已經(jīng)講了這么久了,咱們先休息一下,等到下午咱們爭取把結(jié)構(gòu)體和枚舉說一下,最后再簡單地過一遍文件指針,那么C語言的基礎(chǔ)知識咱們就算是學(xué)習(xí)完了?!?p> 說到此處,老爹徐徐吐出一口氣。
從第一天開始學(xué)習(xí)C語言,到現(xiàn)在已經(jīng)過去了40多個日日夜夜,這突然要結(jié)束了,心里突然有種空出一塊的感覺。
吃了午飯后,我和老爹都習(xí)慣性躺在床上小瞇了一會兒,小弦子就只能睡沙發(fā)了。
午休之后,老爹便如約開始講多重指針。所謂的多重指針,就是指針里面放指針,這一點和多維數(shù)組倒是有些相似。指針變量和其他變量一樣,都要存放在內(nèi)存中,既然如此,就會有地址。
如果把指針變量A的地址取出來,賦值給另外一種數(shù)據(jù)類型聲明的變量B,這種數(shù)據(jù)類型就叫做二重指針。以此類推,如果再把B的地址取出來賦值給另外一種數(shù)據(jù)類型聲明的變量C,那么C的數(shù)據(jù)類型就叫做三重指針……
以上過程用代碼表示:
int a = 0;
int* p =&a;
int** q =&p;
int*** r =&q;
……
在取值的時候:
*r代表的是q
**r 代表的是p
***r 代表的是a
老爹說二重指針除了用來考試或者面試,一般都極少看到。自此,和指針相關(guān)的知識就算是講解完了。
相比其他知識點,指針的內(nèi)容的確是多了很多。不僅體現(xiàn)在時間上,也體現(xiàn)子在老爹寫的教學(xué)大綱上。從用時來說,以往的知識點從來都不會超過兩個小時,而指針確實足足用了一上午都沒有講完!
從老爹教學(xué)大綱的篇幅上來說,指針部分的內(nèi)容也是其他內(nèi)容篇幅的兩倍多。
「什么是枚舉呢?所謂的枚舉,就是將一個變量可能的值一一列舉出來。比如說一周有七天,如果我們用一個變量的來表示一周中的某一天,那么它的可能值就是星期一到星期日。
同樣,用一個變量來表示月份的話,它的可能值就是一月到十二月。
如果我們要表示星期和月份的話,就可以使用枚舉。
定義枚舉的格式很簡單:
enum
{
Sunday = 0,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
} Week;
你們看,這就定義了一個星期的枚舉類型,我們只指定了Sunday的值為0,后面的如果不指定,編譯器會自動為其賦值為前一個值加一,所以Monday為1……Saturday為6。
當(dāng)然了,我們也可以顯式為所有字段都指定值,只需要保證每個字段的字不重復(fù)就可以了?!?p> 「可是老爹,這樣做有什么意義么?我們完全可以直接用數(shù)字0到6來表示一周啊?!?p> 「的確是這樣,但是你考慮到這個問題沒有,不同的人定義的習(xí)慣可能不一樣。比如說我們中國人數(shù)數(shù)習(xí)慣從1開始,那么有可能用1到7來分別表示星期一到星期天。
但是在程序的世界里,一切都是從0開始的,那么也有很多人像我剛才一樣,使用0到6分別表示星期天到星期六。
如果時間太久了,我們可能就會忘記到底是使用哪種方式來表示的了,況且數(shù)字在使用的時候可讀性也比較差。
但若是使用枚舉,這些問題都迎刃而解了。我們要使用星期幾,只需要使用它的英文名稱就好了。不僅不會混亂,而且見名知意?!?p> 「那也不一定非得使用這啊,我們還是可以定義常量,使用起來也比較方便啊?!?p> 我很是不服氣地說道。
「是的,其實在枚舉剛出來的時候,很多人也跟你一樣,畢竟習(xí)慣了使用定義常量的方式,但是后來就慢慢地接受了這種方式。
你非得要使用常量來定義,也沒錯,但是有些不合群。
這就好比大夏天其他人都穿著T恤,而你卻穿著大紅色羽絨服到處跑,別人也不能把你怎么樣,畢竟不違法亂紀(jì),也沒有影響別人。所以自然不會有人把你攔住,非要你把羽絨服脫下來。
其他人只會在背后悄悄議論,說你怎樣怎樣。
寫程序也是一樣的,畢竟真正開發(fā)的時候代碼不會只交給一個人來寫或者維護。所以在寫代碼的時候就需要注意一些,不能太特立獨行,最好還是采用大家都能夠接受的風(fēng)格。
吶,定義了枚舉,我們就需要使用它。
枚舉和其他數(shù)據(jù)類型一樣,可以定義變量,只不過變量的值只能是定義的字段。例如:
enum week w = Friday;
或者定義在函數(shù)的形式參數(shù)上:
String weekToString(enum Week weekday)
{
switch (weekday)
{
case Sunday:
return “星期天“;
case Monday:
return “星期一“;
case Tuesday:
return “星期二“;
case Wednesday:
return “星期三“;
case Thursday:
return “星期四“;
case Friday:
return “星期五“;
case Saturday:
return “星期六“;
default:
return “錯誤“;
}
}
通過這兩個例子可以看出,我們在聲明一個枚舉變量的時候,還需要加上一個enum關(guān)鍵字,看上去有些多余。
要解決這個問題,還是需要請typedef它老人家出馬。如果在定義枚舉的時候加上typedef,聲明枚舉變量的時候就不需要再使用enum關(guān)鍵字了:
typedef enum
{
Sunday = 0,
……
} Week;
聲明變量:
week w = Friday;
String weekToString(Week weekday);」