2012-03-09 74 views
0

說你有這個C程序內存如何查找C數組?

int main() { 
    int *ptr; 
    int ar[4]; 
    ptr = ar; 
    return 0; 
} 

將與AR標記相關的地址抓緊底座地址數組的第一個元素的或將舉行的第一個元素本身?如果它的第二個那麼當你有 ptr = ar; ar必須評估其代表的地址,而不是該地址中的內容......對嗎?

我將不勝感激這個

+0

爲什麼不自己測試呢?將'&ar [0]'與'(int *)ar'進行比較。 – 2012-03-09 18:08:57

回答

0

它將持有的地址。要訪問第一個元素,請使用arr [0]或ptr [0]。

3

ar是一個數組,它與指針不同。

然而,在大多數情況下(當它分配給ptr如),它衰減成爲指針,即陣列中的第一個元素的地址。

+0

那麼數組的值是否像方法的其他局部變量一樣存在於堆棧中? – eay444 2012-03-09 18:16:34

+0

@ user1259909:好的,這取決於編譯器。說本地數組就像任何其他局部變量一樣行事更安全。 – 2012-03-09 18:18:11

0

數組名稱的值是數組的第一個元素的地址。

0

表達式ar始終引用數組對象,並且類型爲int [4]。除arsizeof或一元&運算符的操作數外,它將被替換爲(「decay to」)類型爲int *的表達式,其值爲數組中第一個元素的地址。

因此,像

printf("address of ar[0] is %p\n", (void *) ar); 

發生這種情況的第一件事給定的代碼是,表達ar「衰變」的指針表達式,其類型爲int *和值是相同的&a[0],其被轉換爲void * ,這就是打印的內容。指針值不存儲在ar;它從ar計算。

如何將這一切轉換爲機器碼取決於編譯器。以下是在Linux上的gcc不會與它(我救了你的代碼名爲layout.c文件,並編譯它作爲gcc -o layout -ansi -pedantic -Wall -Wa,-aldh=layout.lst layout.c得到以下彙編列表):

GAS LISTING /tmp/fbgo448-tmp.359a6da/files/ccoNessg.s     page 1 


    1       .file "layout.c" 
    2       .version  "01.01" 
    3     gcc2_compiled.: 
    4     .text 
    5       .align 4 
    6     .globl main 
    8     main: 
    9 0000 55     pushl %ebp 
    10 0001 89E5     movl %esp, %ebp 
    11 0003 83EC28    subl $40, %esp 
    12 0006 8D45D8    leal -40(%ebp), %eax 
    13 0009 8945F4    movl %eax, -12(%ebp) 
    14 000c B8000000    movl $0, %eax 
    14  00 
    15 0011 C9     leave 
    16 0012 C3     ret 
    17     .Lfe1: 
    19 0013 90     .ident "GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.2 2.96-112.7.2)" 

表達-40(%ebp)ar第一要素; -12(%ebp)ptr。第12行計算項目的有效地址-40(%ebp),並將該值保存到%eax,然後寫入-12(%ebp)

因此,在gcc/linux的上下文中,您的問題的答案是與ar相關聯的地址包含第一個元素的值。請注意,答案在不同的平臺上可能會有所不同。