[英]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.