プログラミングにおけるポインタの話です。
Zennにポエムとして投稿するか迷いましたが、中途半端な内容なのでこちらに書き散らしておこうかな、と。
Pythonが流行する昨今でもCから学ぶ初学者は多いようです。これは喜ばしいことだと思っていますが、初学者はやはりポインタの習得に苦労するようです。
Cの入門書は多くあり、自らが読みやすい書籍を選ぶことができます。またQiitaやZennをはじめとする技術系の情報共有プラットフォームでもCの入門記事は多く書かれています。それなのに、何故ポインタで躓く初学者は絶えないのでしょうか。
初学者が技術共有プラットフォームを正しく扱えるかは議論すべきですが、少なくとも調べたら多くの情報にたどり着く環境は整っていると言って差し支えないでしょう。
一つは、概念の難しさ故でしょう。そして一つは、教える側の多くが、程度はどうあれ、CSの専門家であるが故だと、私は考えています。
CSの専門家なら、よく知られている箱と矢印の図を用いてポインタを教えることが多いでしょう。私も必要に応じて示します。ですが、それだけです。実応用例を示す方は少ないように感じます。
箱と矢印の例でポインタを理解することは、vectorやdequeに代表されるコレクションの仕組みを理解する上で不可欠ですが、ポインタは何もコレクションの実装のみに活用されるものではありません。
もう一つ、ポインタが活用される重要な例があります。関数への引数渡しです。私の知る限りにおいて、箱と矢印の例で必死にポインタの概念を理解した初学者はある程度コレクションを理解できるようになります。
ですが、関数に引数としてポインタを渡すとなった途端に躓くのです。無理もありません。関数に引数が渡される時、渡される側と渡す側とはどのように値をやりとりしているか知らないのですから。関数の引数に値を渡すとコピーが発生しているとは思いもしないわけです。
これはコードには表れない非直感的な概念です。知らないから躓く。当然の帰結です。別に値渡しだポインタ渡しだ参照渡しだと敢えて複雑に教える必要はありませんが、少なくとも「Cでは関数に引数として値を渡すとコピーされる」ことは教えるべきではないでしょうか。
これはポインタを実応用例の観点から教えようとすれば必ず登場する概念です。ですが専門家ほど「ポインタ」に拘りすぎて教えていないことが多いと感じています。
専門家は理論を好みます。私もそうです。ですが、初学者がどう躓くかを知っておくのも、専門家ではないでしょうか。