ポインタの「正体」が分かる
誰もがつまづくであろうポインタ、その正体を異常に分かりやすく解説します。
読み進むにつれ、C言語の謎が徐々に解けて来る、良書の中の良書。
私も学生時代これを読んで、ようやくポインタを理解出来ました。
そしてプログラミングの成績が一気に上がったのは良い思い出です。
C言語の基礎はやったけど…
C言語の基礎は一応学んだけど、ポインタやメモリ関係がよく分からん!
そんな人にぜひとも読んで欲しい一冊です。
ポインタがなぜ分かりにくいのか?
を、我々凡人プログラマー目線で説明してくれます。
また「読み物」感覚の軽い文体なので、堅苦しい技術書とは違って、睡魔を召喚しません。
著者のユーモア、ノリとツッコミのセンスも、なかなかのものです。
ポインタと配列の微妙な関係
本書では、やたら単純なテストプログラムを見ながら、ポインタの仕組みに迫ります。
結局ポインタとは「アドレスの入れ物」なんですが、それを実際に目で確かめられるのが嬉しいです。
また、よく混乱する配列とポインタの関係も詳しく解説しています。
配列とポインタは全く別物なんですが、ある事情により同一視できるケースもあります。
本書はそういったルールと例外を明快に教えてくれます。
私は学生時代、これで目からウロコがドッカンドッカン落ちました。
まあ知ってしまえば結構シンプルなんですが。
なぜ分かりにくい?が分かる
他にも本書は、C言語の謎を丁寧に解き明かしてくれます。
例えば関数にポインタが絡んでくる宣言。↓こんなやつ。
int ( *hoge( int a, float ( *b )( int c ) ) )( float d );
うわっ分かりにくい!と思った人は正常です。
ちなみに正解は、以下のようになります。
まず、これは関数プロトタイプ宣言です。
だから hoge は 関数です。
hoge の戻り値は、関数へのポインタです。
どんな関数へのポインタ?→ int を返し、引数が float の関数だよ
hogeの引数は、2つあります。
1つ目 int
2つ目 関数へのポインタ
どんな関数へのポインタ?→ float を返し、引数が int の関数だよ
なんというか関数やポインタという単語が、ゲシュタルト崩壊を起こしますね…
しかし本書にあるコツを使えば、こんな複雑な宣言文も読めるようになります。
他にも
- 宣言と式の違い
- シンタックスシュガーとは
- スタックとヒープ
- バイトオーダとアライメント
- 空の[ ]の意味
などなど…ポインタを通じて、Cの言語仕様をより深く理解できます。
アマとプロの違い
本書はC言語の「分かりにくさ」を紹介しながら、設計思想にも踏み込んでいます。
タイトルではポインタを強調してますが、実の所こっちがメインと言っても良いです。
表面的な文法だけではなく、設計思想とコンパイラの事情も理解すれば
なぜこう書くのか?
が具体的に分かってきます。
私の考えでは、プロとアマの違いはここにあると思います。
「とりあえず動けばいいや」レベルから脱却し、内部の動きをイメージできる。
プロのプログラマーは、そういった深い階層の知識が必須です。
(それを知らない人もかなり見ましたが…怖い怖い)
だから、いつも設計思想を意識する習慣をつけましょう!
そのプロへの入り口として、本書は最適だと言えます。
おまけ
同じ著者さんのセンス・オブ・プログラミング!もオススメです。
プログラミングを「組む力」が上がります。