そのため、ポインタとそのすべてのメモリ割り当ての背後にある考え方を理解するのに苦労しています。
私は最近、コンピューターが今と同じくらい強力であると考えています。なぜポインターを使用しなければならないのでしょうか。
ポインタの助けを借りずに物事を行うための回避策は常にありませんか?
そのため、ポインタとそのすべてのメモリ割り当ての背後にある考え方を理解するのに苦労しています。
私は最近、コンピューターが今と同じくらい強力であると考えています。なぜポインターを使用しなければならないのでしょうか。
ポインタの助けを借りずに物事を行うための回避策は常にありませんか?
ポインターは間接参照です。データ自体を操作する代わりに、データを指す(何か)を操作します。言語のセマンティクスに応じて、これにより多くのことが可能になります。データの別のインスタンスに安価に切り替え(ポインターを別のインスタンスを指すように設定することにより)、ポインターを渡すと、(おそらく高価な)コピーを作成せずに元のデータにアクセスできます。 、など。
メモリの割り当てはポインタに関連していますが、個別です。メモリを割り当てなくてもポインタを使用できます。メモリ割り当てにポインタが必要な理由は、割り当てられたメモリブロックが存在する実際のアドレスがコンパイル時にわからないため、間接レベル(つまりポインタ)を介してのみアクセスできるためです。コンパイラは静的にスペースを割り当てます。動的に割り当てられたメモリを指すポインタ。
ポインタは信じられないほど強力です。今日のコンピューターの処理時間が速いからといって、それがポインターのような重要なものを放棄する理由ではありません。スタック上の巨大なメモリチャンクを渡すことは、せいぜい非効率的であり、最悪の場合は壊滅的です。ポインタを使用すると、関数を呼び出すたびに大量のメモリを複製するのではなく、データが存在する場所への参照を維持するだけで済みます。
また、毎回すべてのデータをコピーする場合、元のデータをどのように変更しますか?それに触れるすべての呼び出しで構造のコピーを返すことは別として。
ダイクストラがプログラミングコースの学生を評価していたことをどこかで読んだことを覚えています。この生徒は非常に頭が良かったのですが、精神的な障害があったため、問題を解決することができませんでした。
すべてのコードはまあまあでしたが、必要なのは単に式を使用することでした
a[a[i+1]] = j;
そして、ソリューションに非常に近い場合でも、目標は何マイルも離れているように見えました。
「ポインタなし」の言語はすでに存在します...例:BASIC。明示的なポインタがない場合、つまり。しかし、間接的なアイデア...他のデータを見つける場所を意味するデータを持つことができるというアイデアは、プログラミングの中心です。
配列の考え方は、計算された値を使用して他の値を見つけることができるようにすることです。
この考えを隠そうとするのは恐ろしい計画です。Dijkstraによると、BASIC言語に触れたことのある人は誰でも、優れたプログラマーとして回復することは不可能なような精神的な切断を受けています(そして、おそらく明示的な間接参照がないことが問題の1つでした)。
彼は誇張していたと思います。
ちょっとだけ。