為什么要寫這個?因為這個東西有點混亂,至少我第一次接觸的時候是這樣的。或許以后還會,所以記下來需要的人一起看吧。
直接上主題,我做事就是很直接,當然也會很啰嗦,下面你將會一并體驗到。
int count[2][3] = {{1,2,3},{4,5,6}};
count //數組count[0][0]的地址。
count+1//數組count[0][0]行數的偏移量為1的地址,即count[1][0]的地址。
*(count+1)//等效于count+1。
*(count+1)+1//count[0][0]行數偏移量為1,列數偏移量為1的地址,即count[1][1]的地址。
**(count+1)//count[1][0]的值。注意這里是2個“*”。
*(*(count+1)+1)//count[1][1]的值,這里也可以寫成**(count+1)+1,結果都是一樣的,反正就是要2個“*”。說到這里有的人可能就覺得奇怪了,上面不是說了“*(count+1)//等效于count+1”那*(*(count+1)+1)能不能寫成*((count+1)+1)呢?答案是很肯定的:不能。為什么呢?我的理解是:如果單純地表示行地址的時候有無“*”都無所謂,反正是一行的地址,同時也是一行的第一列元素的地址。*(*(count+1)+1)含義是先取得第1行的地址,然后再在第1行內偏移1列后,取得地址所存儲的值4。如果寫成*((count+1)+1)則含義變成:行數偏移1后再偏移1后的地址。
這里有點饒頭,多看幾次就會明白了。當然按照我的理解來看也是有一定風險的,因為我可能理解錯了。不過這些結果我都試驗過的,絕對不會錯的。
*(count+1)[1]//count[1][1]的值。首先用*(count+1)取得行地址,然后用[1]直接獲取這個地址中第1號元素的值。這個表達式等效于*(count[1]+1),同時也等效于*(*(count+1)+1)。~~撲通~~已經有人徹底暈倒了。這里的“*(count+1)”,“count[1]”都是為了有效地進行行地址定位,因為只有先找到行地址才能進列定位嘛!
最后總結:
1. 如果你是想獲得多維數組中一行的地址則使用不使用“*”都無所謂。前提是沒有“[]”出現。
2. 如果你是想獲得多維數組中元素的地址則首先得確定好此元素的行地址(使用“*”,比如*(count+1)這樣就確定了是第1行的地址),然后再進行列偏移。
3. 如果你是想獲得多維數組中元素的值,則可以在地址之前加“*”一般整個表達式是2個“*”,因為確定某一行的時候的那個“*”是必不可少的。當然也可以使用帶有“[]”的方式,這個方式里面需一個“*”和一個“[]”就可以獲得數組的值。如果你說使用count[1][1]這樣的方式不是更好么?你說的一點都沒錯,不過我這里主要討論的是與地址相關的內容。不過要順帶說一下如果使用雙“[]”的情況下表達式前加不加“*”都是無所謂的。
再一次總結:
1. 多維數組的地址中,重點就是進行行地址定位,有2種方式,第一種:加“*”eg:*(count+1)。第二種:使用“[]”eg:count[1]。
這里有一個問題啊,* count[1]是地址還是值啊?如果你的回答是地址那請再回頭看一下最后總結第一條。這里的* count[1]表示的是一個值,因為這條語句的含義是取count[1]的值,可是count[1]只是一個地址,只進行了行定位,偏要它交出一個值出來,只好把列排名第一的第0個元素丟了出來,即count[1][0]。
學生朋友應付考試的總結:
1. 單個“*”或單個“[]”可以獲得地址;雙“*”或雙“[]”或一個“*”加上一個“[]”可以獲得數組值。這樣的規律是不是很簡潔明了?
錯誤不足之處還請大家多多指正!謝謝!