2011-12-07 4 views
17
int t[10]; 

int * u = t; 

cout << t << " " << &t << endl; 

cout << u << " " << &u << endl; 

出力:アドレスは

0045FB88 0045FB88 
0045FB88 0045FB7C 

uの出力には、理にかなっています。私はt&t[0]が同じ値を持っていますが、どのように&t来るべきであることを理解

も同じですか? &は実際に何を意味していますか?

+4

¤ポインタに変換された 't 'と'&t'との唯一の違いは、ポインタ型です。後者の指令は形式的には配列型であるため、1を加えるとメモリの次の配列にかなり移動します。一方、前者の指示対象は要素型のものです。用語解説:[comp.lang.C++] Usenetグループの中で、あなたの 'u'のようなポインタが、その参照先が配列型ではないので、配列を「指す」と言えるかどうかに関するいくつかの論争がありました。それは、標準のそのような言葉の使用を指すことによって、何度も解決された。乾杯とは、 –

+0

@alfは、その質問で周りを歩くそのポール男wasntですか? –

+0

@ JohannesSchaub-litb:yes –

答えて

18

式の中でtが単独で使用されると、配列からポインタへの変換が行われ、配列の最初の要素へのポインタが生成されます。

t&オペレータの引数として使用されている場合、そのような変換は行われません。 &は、t(配列)のアドレスを明示的に受け取ります。 &tは配列全体へのポインタです。

配列の最初の要素は、配列全体の先頭と同じ位置にあります。したがって、これらの2つのポインタは同じ値を持ちます。

+0

ありがとう!私は暗黙的な配列からポインタへの変換で、 'u 'がポインタであるという間違った考え方を与えたと思います。 – quuxbazer

+0

@quuxbazer: 'u' _is_ aポインタ。 't'は配列です。 'int * u = t'は' t'への配列からポインタへの変換を行い、その結果で 'u'を初期化します。 – Mankarse

+0

-1これはC++の説明が間違っています –

0

tはアレイのアドレスであり、&tは配列へのスティルポインタです。したがって、表示されるアドレスは同じです。

このコンセプトは非常によく説明されているcplusplus forumです。

&arrayについてそこに述べたように:それはルールが適用されない例外の一つである

。 配列へのポインタとして使用します。これは再び配列の最初の要素を指しますが、このポインタに1を加えると、配列の最後の要素の直後の場所のアドレスを指します(配列をスキップしたのと同じです)。

+1

-1 "&tは配列の最初のアドレスへの参照です"間違っています –

+0

@ AlfP.Steinbachどうしてですか? &tは配列によって使用されるメモリのブロックの先頭への参照です。つまり、配列の最初のアドレスへの参照です。 – Serdalis

+0

'&t'は参照ではありません。それはポインタ値です。配列への参照を持つことはできますが、 '&t'はそうではありません。 –

-2

変数は変更できませんので、tという変数はありません。 tという名前は、単に最初の要素のアドレスを参照します(また、それに関連付けられたサイズも持っています)。したがって、アドレスのアドレスを取ることは実際には意味をなさないし、Cは単にそれをアドレスにすることを「崩壊」する。

ものと同じ種類のは、関数の場合のために起こります。そのアドレスが順番に撮影することができます何の変数fooのアドレスを保持しているが、存在しないため

int foo(void) 
{ 
    return 12; 
} 

printf("%p and %p\n", (void *) foo, (void *) &foo); 

これは、同じことを印刷する必要があります。

+1

C++で、 't'という変数があります。 'int(&)[10]'型の引数を受け付ける関数に渡すことができます。 – Abyx

+3

-1 "tと呼ばれる変数はありません。変更できないためです。"間違っています。宣言で命名されたオブジェクトは変数と呼ばれます。標準を参照してください。 –

3

tのタイプはint[10]なので、&tは配列のアドレスです。
また、int[]は暗黙のでt アレイ 配列の最初の要素のアドレスをを変換し、int*に変換します。

+2

いいえ、最初の要素のアドレスに変換されます。絶対メモリの場所は同じですが、タイプは全く異なります。 –

+0

@BenVoigt、はい、ありがとう。 – Abyx

関連する問題