留個標記,以防自己忘掉
在《c陷阱與缺陷》這本書中說道:
c語言中的陣列值得注意的地方有以下兩點:
1. c語言中只有一維陣列,而且陣列的大小必須在編譯期就作為乙個常數確定下來。然而,c語言中陣列的元素可以是任何型別的物件,當然也可以是另外乙個陣列。
這樣,要「**」出來乙個多維陣列就不是一件難事。
2. 對於乙個陣列,我們只能夠做兩件事:確定該陣列的大小,以及獲得指向該陣列下標為0的元素的指標。其他有關陣列的操作,哪怕它們乍看上去是以陣列下標進行
運算的,實際上都是通過指標進行的。換句話說,任何乙個陣列下標運算都等同於乙個對應的指標運算,因此我們完全可以依據指標行為定義陣列下標的行為。
陣列指標的定義形式:
然後可以使用新型別定義乙個變數並賦值:
從上面位址可看出,a與*a位址是同乙個,a + 1與*a + 3是同乙個;我們知道a,*a現在表示的還都是指標,那麼它們加1後表示什麼呢?雖然a與*a表示的位址相同,但是它們
表示的涵義卻是不同的。現在我們定義: int *p = b[3];我們知道如果p + 1實際上是加的不是乙個位元組(只有void *p這種形式,p加1才會加乙個位元組;當然除了1個位元組的變數
從上面的位址中可看出,a + 1實際上是加了12位元組,*a + 1加了4位元組;也就是說*a所加的實際上是陣列中的乙個元素的位元組數,陣列元素是int型別,所以加的是sizeof(int) = 4;
而a + 1實際上是加了整個陣列的所有元素的位元組數3x4 = 12;因為a是陣列指標變數,也就說它的乙個偏移實際上是移動了陣列的整個長度。
a還可以理解為是a是二維陣列的指標,這是為什麼呢?首先看一下二維陣列的定義:
首先宣告乙個一維陣列型別
用一維陣列型別去宣告乙個二維陣列b,也就是說b是乙個擁有3個整型元素的陣列,b中的每乙個元素型別為:擁有3個整型元素的陣列。這也驗證了c語言中的那個只有一維陣列的原則,實際上二維陣列也是一維的,只不過它的元素型別是一維陣列。這樣我們就可以用這個一維陣列型別來定義乙個它的指標,也就是陣列指標,它指向的是個二維陣列。
這樣一來上面的變數a,就能更好理解了。而對於*a來說,實際上就是把二維陣列的行指標變成了列指標,因此它每移動一次就移動了乙個元素。
下面擴充套件一下,看下下面的**:
輸出的結果是什麼呢?我們來分析一下,b是一維陣列,對b取位址也就是說&b實際上是b的陣列的位址的位址,也就是說&b表示陣列指標。這樣一來&b + 1相當於移動了一行,
p - 3相當於移動到了陣列b的第乙個元素的位址,對其取內容的結果就是b[0] = 1。
C語言中的陣列 指標陣列 陣列指標
1 include 2 3 int main 4 執行結果 0xbfeefda9 0xbfeefdaa 0xbfeefdab12 70xbfeefda9 0xbfeefdaa 0xbfeefdab12 7以上執行結果可以得出如下結論 char str 3 1 str i strr i 2 str i...
C語言中的陣列指標
一 c語言中的陣列有自己特定的型別 陣列的型別由元素型別和陣列大小共同決定 例如 int array 5 的型別為 int 5 二 定義陣列型別 c語言中通過typedef為陣列型別重新命名 typedef type name size 陣列型別 typedef int aint5 5 typede...
C語言中的陣列指標與指標陣列
一 指標陣列和陣列指標的記憶體布局 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣列的指標 的簡稱。下...