C++を触っていると、出てくるのがポインタ変数なんですが、毎回ちょくちょく忘れてしまいます。
あれ、*
ってつけるんだっけ・・・
あれ、この場合って&
?
で、結局エディタのauto correct機能に頼るんですよね。そろそろ抜け出したい。
なので、書き残しておきます。
最低限これは理解しておきたいのに、いつも忘れてしまうんです。。どっちだっけかな、って。
参考にしたサイト様
ポインタ変数とは
変数を宣言すると、メモリ上にそれを格納するだけのスペースを確保します。
このときのそのスペースの住所をメモリアドレスといいます。
このメモリアドレスを保持してくれるのがポインタ変数になります。
なんでポインタ変数が必要なのか?
なんだかややこしいものがでてきたな・・といった感じで、あまり必要性がしっくりきていないのですが。
調べてみると以下の記述が。
・ ポインタ変数を使うことは、メモリのアドレスを使って別のデータにアクセスする方法の一つ。
https://qiita.com/yokoto/items/5672ff20b63815728d90#%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E5%A4%89%E6%95%B0
たしかに、配列は連続した位置に格納されるので、アドレスさえわかれば、配列データを好きにアクセスすることができます。
・ポインタ(変数)の操作は、単なる値の操作よりも、低レベルな操作。
https://qiita.com/yokoto/items/5672ff20b63815728d90#%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E5%A4%89%E6%95%B0
これはまさしくその通りで、だから、わかりづらいんですよね。概念が。
ポインタ変数の書き方
int *pointer;
*を変数名の左に書きます。これがポインタ変数です。
int型の値のメモリアドレスを格納する、という意味です。
int num = 123;
int *pointer;
pointer = &num
ポインタ変数に、int型変数numのメモリアドレスを格納します。
&をつけることで、その変数のメモリアドレスが取得できます。
int num = 123;
int *pointer;
pointer = &num
cout << num << endl; // 123
cout << &num << endl; // 0x1088a03c8 (numのメモリアドレス)
cout << pointer << endl; // 0x1088a03c8 (numのメモリアドレス)
出力は、このような感じになります。ポインタ変数はアドレスを保持する変数なので、アドレスを出力します。
間接参照とは
では、ポインタ変数が保持するアドレスに格納されている値にアクセスするにはどうすればいいのか?
間接参照を使います。
こちらの概念が入ってくるので、ポインタ変数って複雑になるんですよね。。。
int num = 123;
int *pointer;
pointer = &num
cout << *pointer << endl; // 123
間接参照では、またもや*を使います。宣言時に使う*は、ポインタ変数を宣言する時に使うもので、
それ以外に使う*は、間接参照の意味をもちます。
そのため、ポインタ変数に格納されてる値が取得できています!
しかも、間接参照を使うと値の書き換えもできてしまいます。
int num = 123;
int *pointer;
pointer = &num
cout << *pointer << endl; // 123
*pointer = 456;
cout << *pointer << endl // 456
cout << num << endl // 456
注意しなくてはいけないのは、値を書き換えした場合、元々の変数(num)の値も書き変わるということです。
まあ、当たり前ですよね、同じメモリアドレスなんですから。
まとめ
ひとまずポインタ変数の長くて深い概念のうち、第一歩をまとめてみました。
まだ奥が深い・・深すぎる・・ので小分けにしてまとめていきたいと思います。
にほんブログ村に参加しております!よろしければクリックお願いします 🙂
にほんブログ村
コメント