こんにちはー、カクミンです。
実は僕、プログラミングを少々やった事があります。
今回は学生やプログラマーが最初に勉強し始める事の多い C言語でわかりにくい「ポインタ」について解説します。
本記事は理解を易しくするため、一部正確ではない表現があります。
だいたいこんな感じ ! とわかったら、難しい参考書とかにチャレンジしましょう !!
目次
ポインタとは、メモリ上のアドレスの事です。
つまり、日本上の住所みたいな物です。以降はアドレス = 住所 として解説します。
そして、住所を格納する変数をポインタ変数と言います。
定義するには、「型名 *変数名;」と宣言すれば良いです。
例:
int *x;
double* y;
// 「*」は型名に付けても、変数名に付けても変わりません。
// なお、「*」は型に含まれます。(ポインタ型の変数を表す)
ポインタ変数の仕組み
int *x;
// と宣言した時、「x」は住所を示し、「*x」はその住所に置いてある値を指します。
// x == 住所, *x == 値
普通の変数では、変数を箱に見立てて箱の中に値を収納していると説明を受けると思います。
ポインタ変数では、箱の中に住所を置いておき、その住所の中身を参照する事で値を取得しています。
マトリョーシカみたい…。←余計にわかりにくくしてすみません。
要は、ポインタ変数は値の置いてある場所を持っているという事です。
ポインタ変数の必要性
わざわざ、よくわからないポインタとか使う意味ある ?
かっこつけたいだけじゃね ?
とか思うんじゃないでしょうか。僕は (よくわからなかったので) そう思う事にしていました。
ですが残念 !
C言語の特性上、必要なんです。必須級です。(*´Д`)ハァ…
わかりやすいように例を挙げて解説します。
上図の右側の swap関数なら、x と y の値を入れ替える事ができるのですが、それはポインタを使っているからなのです。
どういうことかというと、左側の swap関数では引数a、b に3と7が代入されるのですが、a と b が入れ替わっても、
x と y には影響が無いのです。
は ?
ちょっとわかんないですね。
つまり、a と b には x と y の値は入るのですが、x と y が入る訳ではないのです。
対して、右側はというと、同じくa、b には x、y 自体が入る訳ではないのですが、x と y の住所が代入されるので、
その住所に置かれている値自体が入れ替わるのです。住んでいる人が引っ越しで入れ替わるイメージですね。
だから、左側と同じく x、y に影響は無いのですが、参照した先の値が変更されて、結果、入れ替わっている
という事なんですね。
*と&の違い
今まで、「*」についてだけ言及して、swap関数の説明で突然「&」が出てきて驚いた方も居るかもしれません。
「*」と「&」はどちらもポインタを表す記号です。
「&」は普通の変数の住所を表す時に使います。
例
int x = 1;
int *a;
a = &x;
printf("*a = %d", *a);
このコードの実行結果は「*a = 1」となります。
ちなみに、アドレスを表示したい場合は %p を使うと良いでしょう。16進数で表示されます。
最後に
この記事を通して、ポインタについて理解するきっかけを得られる方が居ると嬉しいです。
僕はポインタに青春を潰された (逆恨み) ので、皆さんがそうならない事を祈ります。
(-人-) 南無阿弥陀仏南無阿弥陀仏…ブツブツ