第二十三章 輪回法則(上)
「和一維數(shù)組一樣,二維數(shù)組同樣有兩種初始化方式,一種是一次性把所有數(shù)據(jù)都放進去,比如說這里的地圖數(shù)據(jù):
int map[8][8]={
{0, 0, 3, 3, 3, 0, 0, 0},
{0, 0, 3, 4, 3, 0, 0, 0},
{0, 0, 3, 0, 3, 3, 3, 3},
{3, 3, 3, 2, 0, 2, 4, 3},
{3, 4, 0, 2, 1, 3, 3, 3},
{3, 3, 3, 3, 2, 3, 0, 0},
{0, 0, 0, 3, 4, 3, 0, 0},
{0, 0, 0, 3, 3, 0, 0, 0}};
從這種表示方法也可以推斷出老爹跟你說的,二維數(shù)組其實就是一個一維數(shù)組,只不過它的每個元素也是一個以為數(shù)組。
第二方式就是一個一個的往數(shù)組里面放數(shù)據(jù),例如:
map[0][1]= 1;
代表的編號為0的小袋子里面的第一元素是1,以此類推?!?p> 「那可不可以向大袋子里面一個一個的裝小袋子呢?」
我突發(fā)奇想道。
「在C語言里面按照正規(guī)操作是不可以的哦!」
老爹意味深長地笑道。
「那非正規(guī)方式呢?」
我賊兮兮地問道。
「這個得等到你學(xué)了指針再說?!?p> 老爹似乎早就知道我會有此一問,于是輕描淡寫地就把我給打發(fā)了。
「哼!」
我斜著眼睛白了老爹一眼。
「既然已經(jīng)說到了數(shù)組,那就順帶把字符串也給說了吧。還記得你寫的第一個輸出『hello world』的程序么?」
「當然記得咯!」
「那還記得『hello world』當時是放在什么符號里面的么?」
「雙引號!」
我在心里默默地將hello world程序給寫了一遍。
「準確的說是英文雙引號,在C語言中,英文雙引號就代表一個字符串,字符串中的內(nèi)容就是雙引號里面的內(nèi)容,現(xiàn)在我們來研究一下『hello world』這個字符串。
char str[]=“hello world“;
猜猜上面這個字符數(shù)組str的長度是多少?!?p> 「哼!事出反常必有妖,既然你讓我猜,說明真實的長度絕對不是表面上數(shù)的那么多,按照字符數(shù),長度本來應(yīng)該是10。嗯……我猜11!」
我思索了一下,然后不怎么確定地報出了自己的答案。如果說是10,那肯定會錯!
果不其然,老爹臉上露出了一絲驚訝的表情。
「居然被你蒙對了,其實上面的定義和這句代碼等效:
char str[]={'h','e','l','l','o','','w','o','r','l','d','\0'};
最后一個字符叫做反斜杠零,是字符串的結(jié)束符。計算機一旦檢測到這個字符,就算后面還有字符,也不會在進行相關(guān)操作了。
還有,這個反斜杠叫做轉(zhuǎn)義符,用來啟動或者關(guān)閉一些字符的特殊功能?!?p> 「嗯?奧特曼的變身器?」
「可以這么理解,我舉個例子吧,還記得反斜杠n么?這個時候反斜杠就啟用了字符n的特殊功能——換行,于此相似的還有反斜杠b、t、r等,還有剛剛說到的反斜杠0?!?p> 「上面的是開啟特殊功能,那關(guān)閉怎么說呢?」
「剛剛說了,雙引號代表的是一個字符串,也就是說,雙引號是具有特殊意義,那如果我們需要在字符串中使用雙引號怎么辦?比如說要輸出這句話:『Dad said:“C is very fun!“』?!?p> 「哈哈,你都說了用反斜杠關(guān)閉它的特殊功能啊,多半就是這樣了吧:
printf(“Dad said:\“C is very fun!\““);」
看著我敲出來的代碼,老爹笑著拍了拍手。
「玥玥啊,你有沒有發(fā)現(xiàn)在取數(shù)組元素的時候好像有點問題?」
老爹一邊說,一邊露出了他那讓人抓狂的笑容。
一般老爹這么說,那肯定是意有所指。
「老爹你先前說無論是往數(shù)組里面放數(shù)據(jù),還是從數(shù)組里面取數(shù)據(jù),都要靠數(shù)組的編號,這樣看來,的確可以把數(shù)組中的每一個元素都取出來。
但是如果數(shù)組的元素太多,一個一個的取也是一個很大的工程量啊。況且要一個一個的取的話,對于加載地圖的時候完全沒有幫助嘛!」
我腦袋飛速運轉(zhuǎn),開始分析當前存在的問題。
老爹滿意地點了點頭,然后說道:「分析得不錯,那接下來就跟你說說混沌先民中掌握了輪回法則的兩尊大神——for和while。」
「輪回法則?」
我眼睛一亮,從老爹的話中捕捉到了一些信息。
「不錯,這兩位可是有大能耐,當它們施展輪回法則的時候,會讓它們所在的那片空間的時間停止,直到輪回法則結(jié)束?!?p> 「聽起來好有意思的樣子!」
「既然如此,那么我們先用一個具體的小例子來說明它們的用法。
比如說現(xiàn)在我一個長度為1000的int型數(shù)組,需求是每一個元素的值就是它的在數(shù)組中的編號。
如果沒有輪回法則的話,我們就只能這樣:int arr[1000]={0, 1, 2, 3……,998, 999};
或者這樣:
int arr[1000];
arr[0]= 0;
arr[1]= 1;
……
arr[999]= 999;
費勁不?」
「老費勁了!」
「但是有了for和while,我們就很容易就能做到了,先說for:
for(int i = 0; i < 1000; i++)
{
arr[i]= i;
}」
「這……這就完了?」
這回輪到我無語了,這相差也太大了吧?
「簡單吧?現(xiàn)在來跟你說說這是什么意思。
for(輪回開始;輪回條件;輪回變數(shù))
{
每次輪回執(zhí)行的內(nèi)容
}
當for輪回啟動的時候,首先會執(zhí)行輪回開始,在上面的例子中,我們在這個地方聲明了一個名為i的int型變量,并為它初始化值為0。接下來for就會檢查輪回條件,如果條件為真,它就要執(zhí)行每次輪回都要做的事情,咱們這里向數(shù)組編號為i的元素賦值為i。此時i = 0,0當然是小于1000的,于是for執(zhí)行輪回的內(nèi)容,將編號為0(i = 0)的元素賦值為0(i=0)。
當每次輪回的事情做完后,for就要執(zhí)行輪回變數(shù),我們要它將i加1,所以這個時候i就從0變成了1。
接下來for又要去檢查輪回的條件是不是滿足,1小于1000成立,于是執(zhí)行輪回內(nèi)容:將編號為1(i = 1)的元素賦值為1(i=1),然后執(zhí)行輪回變數(shù), i從變成了2。
然后一直就是判斷條件->執(zhí)行內(nèi)容->執(zhí)行變數(shù)->判斷條件……
直到i=999的時候。
當for執(zhí)行完本次的輪回內(nèi)容,即:將編號為999(i = 999)的元素賦值為999(i=999)后,再執(zhí)行變數(shù),i就從999變成了1000。
這個時候for再去判斷輪回條件的時候,i等于1000并不小于1000,輪回條件不成立,結(jié)束輪回?!?