回覆列表
-
1 # 就韓國苦於
-
2 # 使用者2450218092916
為了更好理解,我們舉個例子: 1、陣列在記憶體中申請是,所申請的記憶體是一段連續的記憶體地址; 2、例:int[] a=new int[3];申請一段:int 資料型別的陣列,a 為變數,陣列長度為:[3]; 3、這個陣列所申請的記憶體地址是連續的(假設所申請的:第一個記憶體地址為:1008,第二個為:1009,第三個為:1010);,但我們只知道:一、變數:a,它只拿到第一個記憶體地址1008;二、它的陣列空間為3個; 4、a[0]——把a拿到的記憶體地址:1008 + 0 = 1008 (指向第一個記憶體地址); a[1]——把a拿到的記憶體地址:1008 + 1 = 1009 (指向第二個記憶體地址); a[2]——把a拿到的記憶體地址:1008 + 2 = 1010 (指向第三個記憶體地址); 所以:資料下標從 [0] 開始的意義也在於此!(當然,這是理解版的)。
(備註):如果你寫a[3],它就報錯了,越界錯誤,因為你只申請了3個記憶體空間。
在其它一些語言中,情況可能有所不同,例如在BASIC語言中陣列a[MAX]的元素是從a[1]到a[MAX],在Pascal語言中則兩種方式都可行。
注意:a[MAX]是一個有效的地址,但該地址中的值並不是陣列a的一個元素。
上述這種差別有時會引起混亂,因為當你說“陣列中的第一個元素”時,實際上是指“陣列中下標為。的元素”,這裡的“第一個”的意思和“最後一個”相反。
因為指標和陣列幾乎是相同的,因此你可以定義一個指標,使它可以象一個數組一樣引用另一個數組中的所有元素,但引用時前者的下標是從1開始的:
/*don"tdothis!!*/
inta0[MAX],
int*a1=a0-1;/*&a0[-1)*/
現在,a0[0]和a1[1)是相同的,而a0[MAX-1]和a1[MAX]是相同的。然而,在實際程式設計中不應該這樣做,其原因有以下兩點:
第二,這種方式背離了C語言的常規風格。