3

これによると

配列がポインターに減衰するとき、ポインターは配列自体の一部として (またはメモリ内の他の場所に) 格納されません。

上記のステートメントが真である場合、&array のデータ型が array または &array[0] とどのよう 異なる可能がありますが、次の宣言では 3 つすべてが同じ値を持ちます。

int array[10];

コンパイラが配列をポインターに静かに減衰させるとき、ポインターにメモリアドレスを与えるべきだと思いました。そうでない場合、ポインターはどこに保存されますか?

前もって感謝します。

4

4 に答える 4

4

ポインタをどこかに格納する必要があるという考えがどこにあるのかわかりません。どのような目的で?そのポインタをどこかに格納する必要があるC++コードはありません。

抽象C++マシンが次のようなものを評価する場合

int a = 2, b = 3, c = 4;
int i = (a + b) * c;

内部部分式a + bはに評価され5ます。ただし、5言語の観点からは、実際にはどこにも保存されていません。それは、ほんの5一瞬の間存在する一時的な値であり、乗算されcて永遠に忘れられるだけです。C ++でのこのような重要でない式の結果は、右辺値と呼ばれます。通常、右辺値が存在する場所は指定されていません。上記の式の評価中に、の値が5CPUレジスタに一時的に表示される場合があります。または、コンパイラがそうすることを決定した場合は、名前のないメモリ領域に一時的に格納されることもありますが、これはC++コードのレベルで確認できるものではありません。

配列からポインタへの変換から生じるポインタについても同じことが言えます。そのポインタは右辺値(メモリ内のどこにも存在しない一時的な値)を突き出します。単にメモリ内のどこかに住む必要はありません。

あなたがあなたの&array参照によって何を表現しようとしているのかは明確ではありません。式&arrayには配列からポインタへの変換は含まれません。つまり、問題の問題とはまったく関係がありません。

于 2012-08-08T18:57:49.280 に答える
3

式 でアドレス演算子を使用するとarray、式arrayはポインターに減衰しません ( を使用する場合sizeof、 を使用する場合typeid、および仮引数が配列への参照である引数として配列を渡す場合と同じです)。他の式では、通常、最初の要素へのポインターに減衰します。

宣言を与えられた

    int array[10];

の型は&array、それが減衰する式の中でのint (*const)[10]&array[0]int *const== の型です。array

于 2012-08-08T18:47:36.973 に答える
2

これは式評価の一部です。コンパイラは、 、 、または単に などの式を評価するとき3+4(unsigned int) 3&array[3]さまざまarrayな方法で発生するすべての一時値を管理します。多くの場合、プロセッサ レジスタで必要な計算を実行します。配列名をポインターとして使用する場合、コンパイラーは通常、配列のアドレスをレジスターにロードする命令を生成し、ポインターに対して指定したその他の演算を実行します。

于 2012-08-08T18:48:21.377 に答える
1

http://ideone.com/Qw1aAからわかるように、 、&arrayarray、および&array[0]すべて同じ値 (配列の最初の要素のメモリ アドレス) を表します。

ただし、2 つの値が同じだからといって、それらが同じものを表しているとは限りません。この場合、それはセマンティックな違いです (これは依然として重要です。たとえば、通常の配列を使用sizeof()すると、C でその長さ (バイト単位) を見つけることができますが、配列を渡す場合はそうすることができません)。ポインター引数の代わりに)。

また、関数の引数に配列型がある場合でも、http://ideone.com/jAeAnに示すように配列を渡すと、関数内で結果が同じになることはありません。ポインター分解のためです。http://ideone.com/yn0zcのエラー メッセージに示されています。

于 2012-08-08T18:43:52.180 に答える