2015-07-10 32 views
-3

有人請解釋下面的代碼的輸出數組的地址..打印使用「數組名」和「數組名地址的」

#include <stdio.h> 

    int main() 
    { 
     int arr[5]; 
     // Assume base address of arr is 2000 and size of integer is 32 bit 
     printf("%u %u", arr + 1, &arr + 1);   
     return 0; 
    } 

也解釋了當的「printf」語句通過以下

1. printf("%u %u", arr + 1, &(arr + 1)); 
2. printf("%u %u", arr + 1, &arr + 2); 
+2

是你期待什麼輸出& &? – Raman

+2

你也應該使用%p來打印地址。 – Raman

+0

數組的地址('&arr')和數組第一個元素的地址('&arr [0]' - 當arr衰變爲指針時得到的數值)具有相同的數值,但並不意味着相同事情。 – molbdnilo

回答

1

首先,它是更好地使用格式說明%p,專門爲指針,而不是格式說明符設計取代%u

在此語句

printf("%u %u", arr + 1, &arr + 1); 

在表達arr + 1陣列arr被轉換爲指針到它的第一個元素。所以它在轉換後輸入int *,相應地它指向的元素的類型爲int。由於指針算術表達式arr + 1將指向數組的第二個元素的下一個元素。所以指針的值arr + 1 is greater than the value of pointer ARR by的sizeof(int)的`

在這個表達式中&arr + 1指針&arr已鍵入int (*)[5]。它指向的元素(即數組arr)的類型爲int[5]。因此,通過sizeof(int[5])

至於表達&(arr + 1)表達&arr + 1&arr價值更大的價值,那麼它不會編譯,因爲arr + 1是臨時對象,你可以不採取臨時對象的地址。

+0

只是爲了完成:「'arr + 1'是一個臨時對象」..而不是'lvalue' ... –

0

的第一printf輸出將是(根據假設指定) - 2032 2160

arr+1指向下一個即ARR元件[1]和在該arr&arr+1是INT(*)[5]的點到int [5],因此address of arr that is base address加上int [5]的大小(這裏是你的情況5 * 32)。

在你的第二個printf&(arr+1)不是左值,因此不會佔用內存中的某些可識別的位置。因此會給出錯誤。

printf會給出2032 2320的輸出。可以按第1個printf的方式進行評估。

0

的上面的代碼的輸出是2004年到2020年

值ARR和& ARR收率相同的結果陣列是未初始化它將打印在地方它的值的地址的值。

這是由於這樣的事實BCZ當u打印(ARR + 1)的,它增加了數組類型,即INT(4字節)的大小導致

但是當u做(&(ARR + 1)),它會將整個數組的大小(即(5 * 4 = 20個字節))加到基地址上。

當U打印&(ARR + 1),它會產生錯誤BCZ它現在將當作一元不尋址操作

+0

Vishesh請看他在他的問題中指定的整數大小。整數大小不一定總是4個字節。 – ameyCU

+0

Amey你正確的整數的abt大小並不總是4字節。它隨着操作系統的ur位版本而變化。我以字節的形式給出了我的答案,因爲他沒有提到位/字節的值爲2000 – Vishesh