なぜポインタでつまずくのか?
特にC言語の学習者は必ず通る道で、もれなく私もつまずきました。
今では当たり前に使っていますが、当時なぜ理解できなかったのか?
自分なりに分析してみます。
C言語でポインタが初めて登場するのは関数の引数ではないでしょうか?
呼び出し元で宣言されている変数を間接的に参照する「アドレス渡し」と呼ばれるテクニックなどで使われます。
さて、
私が最初につまずいたのは、変数の前につく「&」や「*」の記号たちです。
当時の教科書には、次のような例が記載されていたと思います。
※ 一部省略しています
void swap(int * pNum1 , int * pNum2)
{
int tmp = *pNum1;
*pNum1 = *pNum2;
*pNum2 = tmp;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~
int a = 10;
int b = 20;
swap( &a , &b );
どんなときに、どの記号をつければよいのか分からず、とても混乱しました。
今になって思うと、理解していく「順番」がとても大事だと感じます。
ポインタを理解するには、先にアドレスの概念を理解する必要があります。
しかし、上記の例では
・アドレス
・ポインタ
・それらを活用したテクニック(アドレス渡し)が含まれており、いきなり全体を見ると混乱を招きます。
まずはアドレスだけに注目し、その次にアドレスを保存するポインタに進み、間接参照を理解します。
そして最後にポインタを使ったテクニックに挑戦していくべきです。
ポインタを使ったテクニックは、アドレス/ポインタ以外の知識を求められることも多いです。
今回紹介した「アドレス渡し」では、そもそもアドレスを関数に渡すことの利点を知る必要がありますし、
そのためにはローカル変数のスコープや、配列についての知識も求められるでしょう。
私が長年かけて気づいたのは、アドレスやポインタは、それ自体はとてもシンプルなものということです。
それらを使ったテクニックになると、アドレスやポインタ以外の知識も多く求められ、難しくなります。
今、ポインタでつまずいている方は、
いきなりテクニック(全体)を見るのではなく、まずはその手前にある「アドレス」だけに注目してみましょう。
変数の前に「&」を付けるとどうなるのか?なんとなくではなく、完璧に理解できたと実感してからポインタに進んでみて下さい。
今までぼんやりしていたものが、少し鮮明に見えてくるはずです。