int t[10];
int * u = t;
cout << t << " " << &t << endl;
cout << u << " " << &u << endl;
出力:アドレスは
0045FB88 0045FB88
0045FB88 0045FB7C
u
の出力には、理にかなっています。私はt
と&t[0]
が同じ値を持っていますが、どのように&t
来るべきであることを理解
も同じですか? &は実際に何を意味していますか?
int t[10];
int * u = t;
cout << t << " " << &t << endl;
cout << u << " " << &u << endl;
出力:アドレスは
0045FB88 0045FB88
0045FB88 0045FB7C
u
の出力には、理にかなっています。私はt
と&t[0]
が同じ値を持っていますが、どのように&t
来るべきであることを理解
も同じですか? &は実際に何を意味していますか?
式の中でt
が単独で使用されると、配列からポインタへの変換が行われ、配列の最初の要素へのポインタが生成されます。
t
が&
オペレータの引数として使用されている場合、そのような変換は行われません。 &
は、t
(配列)のアドレスを明示的に受け取ります。 &t
は配列全体へのポインタです。
配列の最初の要素は、配列全体の先頭と同じ位置にあります。したがって、これらの2つのポインタは同じ値を持ちます。
t
はアレイのアドレスであり、&t
は配列へのスティルポインタです。したがって、表示されるアドレスは同じです。
このコンセプトは非常によく説明されているcplusplus forumです。
&array
についてそこに述べたように:それはルールが適用されない例外の一つである
。 配列へのポインタとして使用します。これは再び配列の最初の要素を指しますが、このポインタに1を加えると、配列の最後の要素の直後の場所のアドレスを指します(配列をスキップしたのと同じです)。
-1 "&tは配列の最初のアドレスへの参照です"間違っています –
@ AlfP.Steinbachどうしてですか? &tは配列によって使用されるメモリのブロックの先頭への参照です。つまり、配列の最初のアドレスへの参照です。 – Serdalis
'&t'は参照ではありません。それはポインタ値です。配列への参照を持つことはできますが、 '&t'はそうではありません。 –
変数は変更できませんので、t
という変数はありません。 t
という名前は、単に最初の要素のアドレスを参照します(また、それに関連付けられたサイズも持っています)。したがって、アドレスのアドレスを取ることは実際には意味をなさないし、Cは単にそれをアドレスにすることを「崩壊」する。
ものと同じ種類のは、関数の場合のために起こります。そのアドレスが順番に撮影することができます何の変数foo
のアドレスを保持しているが、存在しないため
int foo(void)
{
return 12;
}
printf("%p and %p\n", (void *) foo, (void *) &foo);
これは、同じことを印刷する必要があります。
C++で、 't'という変数があります。 'int(&)[10]'型の引数を受け付ける関数に渡すことができます。 – Abyx
-1 "tと呼ばれる変数はありません。変更できないためです。"間違っています。宣言で命名されたオブジェクトは変数と呼ばれます。標準を参照してください。 –
t
のタイプはint[10]
なので、&t
は配列のアドレスです。
また、int[]
は暗黙のでt
は
アレイ
配列の最初の要素のアドレスをを変換し、int*
に変換します。
いいえ、最初の要素のアドレスに変換されます。絶対メモリの場所は同じですが、タイプは全く異なります。 –
@BenVoigt、はい、ありがとう。 – Abyx
¤ポインタに変換された 't 'と'&t'との唯一の違いは、ポインタ型です。後者の指令は形式的には配列型であるため、1を加えるとメモリの次の配列にかなり移動します。一方、前者の指示対象は要素型のものです。用語解説:[comp.lang.C++] Usenetグループの中で、あなたの 'u'のようなポインタが、その参照先が配列型ではないので、配列を「指す」と言えるかどうかに関するいくつかの論争がありました。それは、標準のそのような言葉の使用を指すことによって、何度も解決された。乾杯とは、 –
@alfは、その質問で周りを歩くそのポール男wasntですか? –
@ JohannesSchaub-litb:yes –