2010-12-02 25 views
2

數組的數組名稱和地址,我有以下代碼:關於用C

#include<stdio.h> 

void main() 
{ 
    int * a; 
    int arr[2]; 
    arr[1] = 213 ; 
    arr[0] = 333 ; 
    a = &arr ; 
    printf("\narr %d",arr); 
    printf("\n*arr %d",*arr); 
    printf("\n&arr %d",&arr); 

    printf("\n%d",a[1]); 
} 

在運行這個簡單的程序,我得到的輸出如下:

arr -1079451516 
*arr 333 
&arr -1079451516 
213 

爲什麼這兩個ARR和& arr給出了相同的結果?我可以理解,arr是一些內存位置,* arr或arr [0]是存儲在該位置的值,但爲什麼& arr和arr是相同的?

+2

void main()是baaaad。 – Puppy 2010-12-02 22:08:39

+0

[數組索引和地址返回相同的值可能重複。](http://stackoverflow.com/questions/3642157/array-index-and-address-return-same-value) – 2010-12-02 22:11:10

回答

4

幾乎您使用數組類型的表達式任何時候,它會立即「衰減」的指針第一個元素。 arr成爲類型爲int*的指針,並且該指針實際上傳遞給printf&arr是類型爲int (*)[2](指向兩個int s的數組的指針)的指針。這兩個指針具有相同的地址,因爲它們都指向數組的開始處。

(一個值得注意的例外到陣列到指針轉換處於sizeof參數)。

2

他們的定義是相同的(即因爲語言的設計者選擇了他們的意思是一樣的。)

0

ARR就像一個恆定指針處理,它計算到您的整數數組所在的存儲器地址。內存位置arr評估爲無法更改。請求arr的地址是沒有意義的,因爲在存儲這個常量指針的地方沒有地方。

您聲明的非常量指針a是內存中可以容納指針的位置(內存中的其他位置,在本例中爲arr數組的開始位置)。因此& a將評估爲除-1079451516以外的內存地址。指針「a」有一個爲其分配的內存地址,因爲您可以將a更改爲指向其他地方,將該地址存儲在指針a中。 arr永遠不能在此函數中重新定義,因此不需要將其存儲在內存中。