官术网_书友最值得收藏!

第23章 輪回法則(上)

「和一維數(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,以此類推。」

「那可不可以向大袋子里面一個一個的裝小袋子呢?」

我突發(fā)奇想道。

「在C語言里面按照正規(guī)操作是不可以的哦!」

老爹意味深長地笑道。

「那非正規(guī)方式呢?」

我賊兮兮地問道。

「這個得等到你學(xué)了指針再說。」

老爹似乎早就知道我會有此一問,于是輕描淡寫地就把我給打發(fā)了。

「哼!」

我斜著眼睛白了老爹一眼。

「既然已經(jīng)說到了數(shù)組,那就順帶把字符串也給說了吧。還記得你寫的第一個輸出『hello world』的程序么?」

「當(dāng)然記得咯!」

「那還記得『hello world』當(dāng)時是放在什么符號里面的么?」

「雙引號!」

我在心里默默地將hello world程序給寫了一遍。

「準(zhǔn)確的說是英文雙引號,在C語言中,英文雙引號就代表一個字符串,字符串中的內(nèi)容就是雙引號里面的內(nèi)容,現(xiàn)在我們來研究一下『hello world』這個字符串。

char str[]=“hello world“;

猜猜上面這個字符數(shù)組str的長度是多少。」

「哼!事出反常必有妖,既然你讓我猜,說明真實的長度絕對不是表面上數(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)閉一些字符的特殊功能。」

「嗯?奧特曼的變身器?」

「可以這么理解,我舉個例子吧,還記得反斜杠n么?這個時候反斜杠就啟用了字符n的特殊功能——換行,于此相似的還有反斜杠b、t、r等,還有剛剛說到的反斜杠0。」

「上面的是開啟特殊功能,那關(guān)閉怎么說呢?」

「剛剛說了,雙引號代表的是一個字符串,也就是說,雙引號是具有特殊意義,那如果我們需要在字符串中使用雙引號怎么辦?比如說要輸出這句話:『Dad said:“C is very fun!“』。」

「哈哈,你都說了用反斜杠關(guān)閉它的特殊功能啊,多半就是這樣了吧:

printf(“Dad said:\“C is very fun!\““);」

看著我敲出來的代碼,老爹笑著拍了拍手。

「玥玥啊,你有沒有發(fā)現(xiàn)在取數(shù)組元素的時候好像有點問題?」

老爹一邊說,一邊露出了他那讓人抓狂的笑容。

一般老爹這么說,那肯定是意有所指。

「老爹你先前說無論是往數(shù)組里面放數(shù)據(jù),還是從數(shù)組里面取數(shù)據(jù),都要靠數(shù)組的編號,這樣看來,的確可以把數(shù)組中的每一個元素都取出來。

但是如果數(shù)組的元素太多,一個一個的取也是一個很大的工程量啊。況且要一個一個的取的話,對于加載地圖的時候完全沒有幫助嘛!」

我腦袋飛速運轉(zhuǎn),開始分析當(dāng)前存在的問題。

老爹滿意地點了點頭,然后說道:「分析得不錯,那接下來就跟你說說混沌先民中掌握了輪回法則的兩尊大神——for和while。」

「輪回法則?」

我眼睛一亮,從老爹的話中捕捉到了一些信息。

「不錯,這兩位可是有大能耐,當(dāng)它們施展輪回法則的時候,會讓它們所在的那片空間的時間停止,直到輪回法則結(jié)束。」

「聽起來好有意思的樣子!」

「既然如此,那么我們先用一個具體的小例子來說明它們的用法。

比如說現(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)容

}

當(dāng)for輪回啟動的時候,首先會執(zhí)行輪回開始,在上面的例子中,我們在這個地方聲明了一個名為i的int型變量,并為它初始化值為0。接下來for就會檢查輪回條件,如果條件為真,它就要執(zhí)行每次輪回都要做的事情,咱們這里向數(shù)組編號為i的元素賦值為i。此時i = 0,0當(dāng)然是小于1000的,于是for執(zhí)行輪回的內(nèi)容,將編號為0(i = 0)的元素賦值為0(i=0)。

當(dāng)每次輪回的事情做完后,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的時候。

當(dāng)for執(zhí)行完本次的輪回內(nèi)容,即:將編號為999(i = 999)的元素賦值為999(i=999)后,再執(zhí)行變數(shù),i就從999變成了1000。

這個時候for再去判斷輪回條件的時候,i等于1000并不小于1000,輪回條件不成立,結(jié)束輪回。」

主站蜘蛛池模板: 枣阳市| 三门县| 长子县| 湖北省| 大同县| 额济纳旗| 宁国市| 濮阳县| 济南市| 龙井市| 宣化县| 谢通门县| 萨迦县| 阳朔县| 青州市| 垣曲县| 宁远县| 永靖县| 恩施市| 左权县| 兴义市| 内丘县| 东安县| 潞城市| 建昌县| 政和县| 岑溪市| 东乡县| 义马市| 重庆市| 华池县| 江华| 叙永县| 都兰县| 南华县| 蓬莱市| 共和县| 龙陵县| 青铜峡市| 德格县| 德清县|