配列を再割り当てできるのに、なぜポインタを使用するのでしょうか?

StackOverflow https://stackoverflow.com/questions/201940

質問

これが私が受けた就職面接でした。彼らは、配列を再割り当てできるかどうか尋ねましたが、私は「はい」と答えました。次に、彼らは尋ねました - ほとんどの人はメモリ空間を無駄にするという理由をあげるのに、なぜポインタが必要なのかと尋ねました。満足のいく答えを返すことができませんでした。満足のいく答えをくれる機関があれば、私はそうする義務があります。上記の記述が矛盾する可能性がある状況について言及してください。

ありがとう。

役に立ちましたか?

解決

動的に割り当てられた配列のみを再割り当てできます。静的に割り当てられた場合、[安全に]再割り当てできません。*

ポインタは、メモリ内のデータのアドレスを保持します。 C ++のnew / delete演算子とCのmalloc / freeを使用して、動的に割り当て、割り当て解除、および再割り当てを行うことができます。

Cプログラミング言語を読むことを強くお勧めします。 KernighanとRitchieによるおよび C ++ From the Groundアップ ハーバートシルト。

これらの2つの言語を使用するには、動的メモリ、ポインター、オフセットなどの使用がすべて基本です。それらがどのように機能するのか、そしてなぜ存在するのかがわからないことが、潜在的な雇用者があなたを断る可能性が高い理由になります。

*コンパイラは、静的に割り当てられたものを再割り当てさせませんすべきではありませんが、割り当てた場合の動作は未定義です

他のヒント

表現は少し奇妙ですが、私にとって、面接の質問は、配列、ポインター、動的メモリ割り当てなどについて知っていることを説明させることを目的とした自由回答型の質問だったようです。もし私が面接官だったら、候補者には両者の違いを明確にしてもらいたいと思います。 int *a = malloc(10 * sizeof(int)); そして int a[10];. 。次の質問はあまりうまく表現されていませんが、おそらく候補者をポインタと配列の違いの方向に誘導し、一連の思考を開始する試みでした。

OK。静的に宣言された配列を再割り当てすることはできません。 (静的に宣言された配列の代わりに)ポインターを使用する目的は、スペースを再割り当てできるようにするためです。技術的には正確に言えば、静的に定義された配列にポインタを渡すことで再割り当てできますが、私はしたくないでしょう。ポインタがmallocによって割り当てられなかったメモリへの場合の動作は未定義です。

ポインタを使用すると「メモリを浪費する」方法がよくわかりません。 realloc関数:-

void *realloc(void *ptr, size_t size);

パラメータとしてサイズ変更するメモリへのポインタを取得します。また、ポインタは、動的メモリよりも多くの用途があり、たとえば参照渡しです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top