簡體   English   中英

與c語言中的數組索引相關的問題

[英]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 (其中0010array的地址, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM