2012-02-16 15 views
2

参照された 配列の値と配列自体の値が同じ値を持つ理由を教えてください。参照された配列==配列

私はint型であることを知っていますが、&でint **または間違っていますか? この値は、intポインタへのポインタでなければなりません。 例コード:配列の

 
    #include &ltstdio.h> 

    int main() 
    { 
     int a[10]; 
     printf("a without ref.: 0x%x\n",a); 
     printf("a with ref.: 0x%x\n",&a); 
     return 0; 
    } 

http://ideone.com/KClQJ

+1

[C:配列のアドレスはどのように値に等しいのですか?](http://stackoverflow.com/questions/2528318/c-how-come-an-arrays-address-is-equal-その値に値する) – jpalecek

+0

参照:http://stackoverflow.com/q/7351331/51831 – jpalecek

+0

[似たような質問に私の答えが好きかもしれません](http://stackoverflow.com/questions/5181237/) 2D配列のデータ型混乱/ 5181495#5181495)が以前に尋ねられました。 – pmg

答えて

4

名前は、この場合に、その最初の要素へのポインタに減衰します。

+0

私はそれが崩壊する*名前*だとは思わない。配列そのものは崩壊します:) +1とにかく –

0

INT * Pの点aが存在する場合、次いで、

+ 0 == & [0] == P + 0 == & P [0]:対処

(* + 0)== *(& [0])== *(P + 0)== *(& P [0]):データ

== & & == [0]

+0

'a'と'&a'の**型は同じではありません(値はありますが):42個のニンは42個のジャガイモと同じであるとは言えません。 – pmg

1

配列の名前は暗黙的にポインタに変換されます。excepどちらの場合でも、配列の名前はポインタではなく配列であるため、2つの状況では、どちらかの状況が "& array"であり、もう1つは "sizeof(array)"です。例えば

:配列宣言T a[N]を考える

int a[10]; 
int *p; 
p = a;  //a is a pointer 
p = &a;  //a is a array,&a is a constant pointer 
sizeof(a); //a is array 
1

は、式&aTのN要素の配列を「ポインタ(T (*)[N])を入力しており、その値は、アレイのベースアドレスであることを。それは他のデータ型の場合と同様に尊重、単項&オペレータは、アレイに同じ動作をします。

hinky何Cが配列式aを処理する方法である。それはsizeofのオペランドされている場合を除き、または単項の&演算子であるか、または宣言で別の配列を初期化するために文字列リテラルが使用されている場合、 "N要素配列"の配列式(T [N])は、 "Tへのポインタ"(T *)とその値は、配列の最初の要素のアドレスになります。 IOW、a == &a[0]

配列の最初の要素のアドレスがアレイ全体、式a&aのベースアドレスと同じであるため同じを得たが、(T (*)[N]とは対照的にT *)タイプが異なります。

関連する問題