簡體   English   中英

數組的第一個元素為何等於數組?

[英]How come the first element of an array is equal to the array ?C

例如,假設您有一個數組a和一個指針p。

void main() {
    int a[10];
    int *p;
    for(i = 0;i <=10;i++)
        a[i] = (i + 1) * 2;
    p = &a[0];
    printf("%d",a[4]);
    printf("%d",p[4]);
}

它們如何相等?

數組的第一個元素怎么等於數組? 假設您有一個整數數組,例如int arr[5]; 然后根據您的問題標題

  • 數組的第一個元素將是arr[0] ,它是arr[0]值,並且
  • array表示arrarr名稱代表數組的基地址。 因此arrarr[0]不相同。 arr是基地址,而arr[0]是值。

對於您的特殊情況,整數數組a如下所示,並且數組的所有元素都存儲在連續的內存位置中。 假定數組的基地址為0x100 (某些內存位置)

 a[0]   a[1]  a[2]  a[3]  ........................................ a[9]
  ------------------------------------------------------------------------
 |  2  |  4  |  6  |  8  |  10  |  12  |  14  |  16  |  18  |  20  | 22  |
  ------------------------------------------------------------------------
0x100   0x104  0x108 ..                                         ..    
 a
LSB                                                                   MSB

所以這里a手段0x100 ,假定的基地址a0x100 現在當你做

p = &a[0]; /* here you are setting p to point to one of the places in the array a and that is a[0] */ 

這里p指向如下a ie 0x100 first元素

       a[0]   a[1]  a[2]  a[3]  ........................................ a[9]
      ------------------------------------------------------------------------
     |  2  |  4  |  6  |  8  |  10  |  12  |  14  |  16  |  18  |  20  | 22  |
      ------------------------------------------------------------------------
    0x100   0x104  0x108  0x112 0x116..                                         ..    
     a
     |
     p   

現在,當您打印a[4]它會打印出10 ,這非常簡單,並且展開如下

a[4] = *(a + 4) /* here you can say that array name a is converted to a pointer to its first element */
     = *(0x100 + 4*4 ) /* multiplied by 4 ? bcz a is int array & each element size is 4 byte */
     = *(0x116) /* value at 0x116 memory location */
     = 10

當您打印p[4]它會如下擴展

p[4] = *(p + 4)
     = *(0x100 + 4*4) /*multiplied by 4 because int pointer increments by 4 bytes*/
     = *(0x116) ? /* it prints value at 0x116 location which 10 */
     = 10

同樣,在為for loop中的數組元素分配值時,您嘗試訪問a[10] ,它超出邊界並導致未定義的行為 在下面的代碼塊條件中,部分應該為i<10而不是i<=10因為您聲明a[10]且數組索引zero

for(i = 0;i <=10;i++) {  /* make it i<10 */
        a[i] = (i + 1) * 2;
}

最后, void main() { /* code */ }是一種不好的做法,並且不符合C標准規范。 使用int main(void) { }代替C標准n1256草案中指定的n1256

5.1.2.2.1程序啟動

1在程序啟動時調用的函數稱為main。 該實現沒有為此函數聲明任何原型。 它應使用返回類型int且不帶參數來定義:

int main(void) { /* ... */ }

或帶有兩個參數(盡管可以使用任何名稱,但在此處稱為argc和argv,因為它們是聲明它們的函數的局部名稱):

int main(int argc, char *argv[]) { /* ... */ }

或等效; 9)或以其他一些實現定義的方式。

數組定義 :數組是放置在連續內存位置中的一系列相同類型的元素,可以通過向唯一標識符添加索引來單獨引用。

當你把所述陣列的所述第一元素的地址( &a[0]將得到的值完全相同作為a (但是,您將丟失大小信息,因為&a[0]是指向內存的指針,其中a實際上是數組)

這是因為a[0]實際上轉換為*(a + 0) ,其中a是指向數組所駐留的內存地址的指針。 因此&a[0]變為&(*(a + 0))或“地址a + 0的內容的地址”,與“地址a ”相同

類似地, a[4]轉換為*(a + 4)

我希望這可以使事情變得清晰:)

編輯:

我剛剛找到此頁面,您可以在這里找到更多信息: https : //www.le.ac.uk/users/rjm1/cotter/page_59.htm

編輯2:闡明&a[0]a之間的區別

數組存儲在傳染性內存中,&a [0]是對第一個元素的指針引用。 現在,如果要獲取指向第二個的指針引用,則為(第一個元素的地址+ sizeof(int))。 現在,您可以通過*(第一個元素的地址+ sizeof(int)來訪問它的值。這稱為指針算術。您必須參考一本好書以了解有關它的更多信息。

您為指針“ p”分配了指向本地數組“ a”的指針,因此從現在開始,“ p”和“ a”是同一數組,您對“ p”所做的每次更改都會直接影響“ a”,反之亦然。

p = &a[0];

在a [10]中,a是一個指針,它指向數組的第一個元素的地址。 因此,當您分配時:

p = &a[0];

P還在a處存儲相同的地址,並指向相同的元素。 因此,對p進行的任何操作都將反映在a中。

當你寫p =&a [0]; 與p = a相同; 現在p和a是同一數組開頭的指針

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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