ポインタってなんぞ!?と勉強当初は思っておりましたが、
今も若干意味が分かっていない内容です。
それでも、PCってのは、メモリ領域を使って作業を行っていることを忘れないようにすれば、自ずとポインタが理解できるでしょう。
メモリ領域には、アドレスが割り振られており、そのアドレスを指しているのがポインタということでした。
ただ、実際どんなことに使えるのかということで、一番便利な機能は配列や関数のポインタだと思いますが、挙動確認のためにまずは変数で試してみます。
単純にこんなプログラムを書いてみました。
#include<iostream>
int main(){
int number;
int* pointer;
number = 5;
pointer = &number;
std::cout<< pointer<<std::endl;
std::cout<< number<<std::endl;
std::cout<< *pointer<<std::endl;
//std::cout<< *number<<std::endl;
std::cout<< &pointer<<std::endl;
std::cout<< &number<<std::endl;
}
ポインタ宣言は型と変数名の間に*マークを付けるんでしたね。
ポインタ変数にint型の変数のアドレスを入れてどうなるかアドレスと参照と変数すべて出力してみます。
*numberはコンパイルエラーになりました。
まあ当たり前です。
なのでそれ以外のもので試してみました。
pointerは、numberのアドレスを入れているので、numberのアドレスが入っています。
次にnumberはそのまま5です。
*pointerは、pointer変数に格納されているアドレスが指す値の参照という記号なので5です。
&pointerは、pointer変数のアドレス参照なので、pointerという変数本来のアドレス。
&numberは、number変数のアドレス参照なので、numberのアドレス、最初と同じ文字列が表示されています。
*numberがコンパイルエラーになったのは、numberはもともと値が格納されており、アドレスじゃないのでエラーになったのでした。
このことから考えられるポインタの利用法としては、
1 間接的に値を参照できる。
2 アドレスはメモリ上にあるので、連続したメモリ領域内の他のデータも参照しやすい。
3 アドレス指定できれば、メモリを効率よく活用できる。
配列とか関数、クラスなんかのポインタ参照などは、データ型のメモリ使用範囲を考慮したうえで、効率よく活用していくものであり、結果としてコードが簡潔になるのです。
考えなしにコードを書くと割と意味不明で長ったらしいコードになったりしてデータ量が増えたりするので、うまくポインタを活用しましょう。
ちなみに>指定されたプログラムは実行できません。 というエラーは、マカフィーのセキュリティーに引っ掛かりコンパイルされたファイルが削除されてしまったからです。
マカフィーを入れている方はリアルタイムスキャンを一時無効に設定しでやると実行ファイルが消されずに済みます。参考までに。
では今日はこの辺で。
よきプログラミングライフを!
0コメント