簡體   English   中英

C程序地址增加數組和數組名稱

[英]C program address increment of array and array name

int arr[10]={1,2,3,4,5,6,7,8,9,10};
printf("%p,%p\n", arr, &arr);
printf("%p,%p\n", arr+1, &arr+1);
return 0;

對於此代碼,GCC編譯器返回

0xbfe41348,0xbfe41348
0xbfe4134c,0xbfe41370

第一行很清楚,沒問題。 但第二行讓我感到困惑。 第一個地址移動到下一個int ,因此在arr之后是4個字節,清除。 但是,對於&arr+1我認為它將指向整個數組arr[10]的結尾,因此它應該向地址添加4 * 10 我誤解了什么嗎?

&arr的類型是'指向10 int數組的指針'。 因此,當你向它添加一個( &arr+1 )時,它會移動到下一個10 int數組的開頭,這個數字超出了&arr的開頭40個字節。

你認為是對的,它只是這樣做的。

因為&arr => 0xbfe41348

0xbfe41348 + 0x28 (十進制4*10 )= 0xbfe41370

我認為你因十進制數加十進制而感到困惑。

事實上, &arr+1確實將數組arr的基地址加40 ,但由於地址是十六進制或十六進制而不是十進制,所以它並不明顯

現在,為了它的價值,我將為每個陳述添加一些解釋,以使事情清楚。

int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

上面的語句將arr定義為int[10]類型,即10整數的數組。 然后使用數組初始化列表初始化arr

printf("%p,%p\n", arr, &arr);

在上面的語句中, arr衰減(計算或隱式轉換)為指向其第一個元素的指針。 因此它的類型是int * &arr計算指向arr的指針。 arr類型是int[10] 因此, &arr類型是int (*)[10] ,即指向10個整數數組的指針。 使用括號是因為數組下標operator []優先級高於*運算符。 所以沒有括號int *[10]表示一個10個整數指針的數組。 這是數組不會衰減為指向其第一個元素的指針的情況之一。

請注意, arr&arr評估為相同的值,即上述printf語句中數組的基址,但它們的類型不同,並且它們具有不同的指針算法。 這在以下聲明中顯示 -

printf("%p,%p\n", arr+1, &arr+1);

arr+1指向下一個元素。 這里的元素類型是int 因此, arr+1評估為

arr + (1 * sizeof(int)) 

&arr + 1也指向下一個元素,但這里的元素類型是int[10] - 一個包含10個integers的數組。 因此&arr + 1評估為

arr + (1 * sizeof(int[10]))
arr+1

這里arr是指向整數數組的基指針,因此結果以sizeof(int)遞增

&arr+1

這里&arr導致數組的地址,因此結果按數組大小遞增。

暫無
暫無

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

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