[英]question related to the index of arrays in c language
為什么數組第一個索引從0開始
因為索引實際上意味着指針的偏移量。 第一個元素的偏移量為0。
評論時更新嗯,我會試試。
讓我們考慮一個包含10個元素的字節數組:
byte array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
考慮這個數組所在的存儲單元(假設它從地址0010h開始):
0010 0011 0012 0013 0014 0015 0016 0017 0018 0019
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
我們的變量array
指向0010h
。
偏移量1
(第一個元素)為0
,其實際地址為0010 + 0
(其中0010
是array
的地址, 0
是偏移量)。
3
(第三個元素)的偏移量是2
因為它在第三個單元格中,並且單元格大小為1
(因為我們有字節數組)。 第3個元素的實際地址是0010 + 2
。
回到我們的編程語言: array[0]
表示具有0010
地址的存儲單元的內容, array[1]
表示具有0010 + 1
地址(第二元素)的存儲單元的內容,依此類推。 *array
C中的*array
指的是第一個元素*(array+1)
- 指的是第二個元素。
數學思想的人明天稱“從現在開始的一天”而不是“從現在開始的兩天”。
因為指針算術更容易這樣。
在C中,您可以將數組視為指針。 這樣,如果你有這個數組:
char a[50];
char *ptr = a;
使用指針算術,您可以通過以下方式添加整數來移動指針 :
*(ptr + 0); // first character in the array
*(ptr + 1); // second character in the array
// so on, so forth
由於編譯器使用索引的值來計算數組中元素的實際地址,因此第一個索引始終為零。
請考慮以下示例。
void someFunction()
{
int exampleArray[5] = {0, 1, 2, 3, 4};
}
“exampleArray”需要空間來存儲5個元素,每個元素都需要存儲數據類型“int”所需的空間量。 根據平台(16位/ 32位或64位)和OS,“int”數據類型的大小可能不同。 對於我們的討論,假設“int”的大小是4個字節。
因此,要將上述數組存儲在內存中,我們需要5個整數的內存= 5 * 4 = 20個字節。 現在,此數組中的每個元素都有一個“地址”。
讓我們說“exampleArray”存儲在地址100.然后索引“i”處的元素的地址將是100 +(i * sizeof(int))。 所以對於上面的數組,
Index 0, address = 100 + (0 * 4) = 100
Index 1, address = 100 + (1 * 4) = 104
Index 2, address = 100 + (2 * 4) = 108
Index 3, address = 100 + (3 * 4) = 112
and so on..
這是編譯器生成用於訪問數組索引的代碼的方式。 因此,當我們編寫exampleArray [2]時,計算機需要能夠計算索引2處元素的地址,以便能夠訪問其內存位置,從而訪問其值。 因此,根據上面的公式,索引“2”處的元素將是100 +(2 * 4)= 108。
由於數組中的第一個元素必須位於地址100,因此其索引變為0,以便以簡單的方式計算其地址。
因為元素0與數組的開頭之間的距離為0。 它是第一個元素,但它位於第0位,就像第一世紀沒有超過100年的方式一樣。
第一個也是最重要的:因為標准/你的編譯器這么說。 其次,因為指針算術。 如果你有一個數組A,那么A + 0是第一個元素,A + 1秒,依此類推。 它是數組在內存中表示的方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.