2016-10-19 5 views
2

スタック上に1つ、ヒープ上に2つの配列を宣言すると、変数名を印刷するときに(gdbで重要な場合)、動作が異なります。配列の変数名がスタックで宣言されていないのはなぜですか?C++?

int array_on_stack[5]; 

int * array_on_heap = new int[5]; 

gdbでは、各行のコードをステップ実行し、変数名を印刷して、それぞれのメモリアドレスを取得することを期待しています。

print array_on_stack 

print array_on_heap 

しかしarray_on_stackのためには、配列の内容ではなくメモリアドレスを出力します。メモリアドレスを取得するには、コマンドprint &array_on_stackが必要です。これは、array_on_stackがポインタではないことを示しています。これら2つの宣言の違いを、メモリアドレスへのアクセス方法とその理由について説明できますか?

+0

のためのgdbで同様の結果が得られます、一つは、配列はポインタだ、とのもの。彼らは別のものです。 – UKMonkey

+2

*これはarray_on_stackがポインタではないことを示しています*あなたは正しいです。配列はポインタではありません。ポインタはポインタであり、配列は配列です。 'int'のように' double'はありません。 – NathanOliver

答えて

5

array_on_heapは配列ではありません。ポインタは(動的に割り当てられた配列の最初の項目への)ポインタです。

配列は配列であり、ポインタはポインタです。

は、したがって、あなたは、彼らがいないと同じだからだ

int* array_with_automatic_storage = &array_on_stack[0]; 
+0

私はC++配列では、変数名が単に最初のオブジェクトを指すポインタであったように、ポインタを劣化させると考えました。そのため、両方の方法で配列を宣言することができます。 – xjtc55

+0

@ xjtc55:上記の宣言では、 '&array_on_stack [0]'を単に 'array_on_stack'に置き換えることができ、ポインタへの暗黙の変換、配列式/ decay/toのポインタ型を利用できます。しかし、配列式は必ずしも減衰するわけではなく、配列はポインタではありません。特に、配列変数にポインタを代入することはできません。 –

+2

Fred Overflowと私が書いた、[C++配列FAQ](http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c)の質問がここにあります。あなたはそれを読むよりも悪いことができます。また、いくつかの[C++配列のドキュメント](http://stackoverflow.com/documentation/c%2b%2b/3017/arrays#t=201610191331403254374)がここにあります。作成され、主に私によって書かれています。私は共通の開示として著者の前に言及する。 –

関連する問題