ポインタは排除されるべきなのか

であるなら、C的なポインタを使わないでも必要なデータ構造 (Cならポインタを使って実装するようなリストとか多分木)を Javaなんかでは記述することは可能なわけですし、 バグの元になるようなポインタを使わない方向に 持っていってもいいんじゃないですかね。

 という意見を見て、再度考えてみました。
 ポインタというのは確かにバグの元になります。それはC言語というのが高級言語の皮を被ったアセンブラのようなものであるからで、その最たる低レベルな部分がポインタであるからだと考えます。

 では、やはりその悪玉であるポインタは排除されるべきなのでしょうか。答えはYESであると思います。ポインタはやはり危険です。知らず知らずのうちにNULLであるものを

Character* character = NULL;
int damage = character->strength + character->dexterity / 2;

 なんてことをやっても動いてしまったりします。アドレスは0を指しているのに演算としては動いてしまう訳です。NULL初期化をしておらずアドレスが無茶苦茶な値でも同様ですね。
 こういったことはJavaなどでは起こりえません。そういった言語の方が危なげがないのであるのは明白です。
 こんな事が許されるポインタは排除すべきなのでしょうか。

 が、ポインタというものはメモリアクセスの基本中の基本の考えで、ポインタを理解しているかしていないかということはハードの中で起こっている様々な動きに対して理解度に関連してきます。
 ハードの面では、未だにどこどこのアドレスになんという値を書き込む事でハードウェアの制御をする、なんてことがよく行われます。そうした低レベルなプログラミングは隠蔽されていれていく風潮にありますが、しかしながら、それを理解せずに上澄みだけでプログラムを完結させることが全てという訳にはいかなくなります。
 だって、ソフトウェアはハードウェアありきなんですから。

 ポインタを排除すべきという考えは賛成です。ただし、それはポインタによって発生するバグは「ソフトウェアにとって致命傷になるバグを生みやすい」からです。ゲームなどでよくあるバグはあるどこかのタイミングで不正なメモリアクセスによってフラグなどが書き換えられてしまって「ゲームが進行しなくなる」「あるイベントで必ず停止する」などというバグを生み出してしまう事です。
 この不正なメモリアクセスは不意にあまりにもひっそりとされることがあり、特定する事が非常に困難である場合があります。まだ書き換えている場所が分かれば、あとはブレークポイントをはって永遠とプレイするか論理的にバグを読み取れるのですが、これが特定できないことさえあります。
 
 そんな危険なポインタですから、使わないにこしたことはないのかもしれません。でも、絶対に理解しておくべき概念です。
 ポインタは本来アドレスが指す物に対しアクセスできるというだけのシンプルなもの。扱わないとしてもきちんと理解をしていて欲しいものです。

 

Cプログラミング専門課程

Cプログラミング専門課程

 僕はこの「Cプログラミング専門課程」でポインタを理解しました。古い本で初心者向けではないですが読みやすく良書だと思います。