こんにちは。
C言語を学習していくと、ぶち当たる壁「アドレス」と「ポインタ」。
こいつらって、コードにするとめちゃくちゃ読み辛くなるし、そもそも理解しがたいですよね。
(プログラミング初心はもちろん、javaだとかpythonだとかやっている人もなんか理解しづらい要素ですよね)
今回は、その「ポインタ」と「アドレス」を簡単にイメージできるようご説明いたします!
今まで勉強してみて、どうしても理解しづらい、なんかモヤモヤしている方は、ぜひ最後まで読んでみてください!
対象者は以下です。
- C言語の学習し始めであり、アドレス・ポインタ前までの基礎知識はある(変数の宣言のやり方など)
- C言語以外の言語をそれなりに使える人
※今回は整数型のintを例に説明します。
アドレス
プログラム中の変数などの値は,コンピュータのメモリ上に記憶されます。
そのメモリには場所を表す通し番号があり、それをアドレスといいます。
例えば、
int a = 5;
を宣言すると、メモリにはこのように記憶されます。
じゃあ、宣言した変数aはどこのアドレスなの?というときに演算子&を使います。
アドレスに関しては、演算子&を使えば『宣言した変数がメモリ内のどこに記憶されているかがわかる』だけなので、
そんな難しくはないかと思います。
問題は次のポインタですね…
ポインタ
記憶した変数のアドレスを格納している変数になります。
宣言は以下のようになります
int* addrA;(もしくはint *addrA)
先ほどのアドレス演算子を使うことで、以下のように代入できます。
int* addrA = &a;
ポインタのややこしいのがここからです。
宣言された「addrA」の先頭に演算子「*」をつけることで、
addrAのアドレス先に記憶された変数を表すこと出来ます。
とどのつまり、
*addrA = 変数a ということになります。
ここで一点注意です!
上で説明した、ポインタの宣言「int* addrA;」と表記される場合と、「int *addrA」と表記される場合の数2パターンあります。
addrAに「*」が付いているのではなく、
「int *」addrA という意味ですので、気をつけてください。
宣言のint *addrAと、演算子「*」としての「*addrA」は役割が違うものです!
ここをしっかり理解してください!
(逆に言えば、「*」を正しくスムーズに読むことができれば、アドレスとポインタの使い方は大丈夫といっても過言ではないでしょう!)
まとめ
今回扱った変数や宣言、演算子を以下のような分布でまとめてみました!
それでは良いC言語ライフを!