2011/12/31

アドレス、ポインタ、参照 まとめ

やっぱりわかりにくいアドレス、ポインタ、参照。
ちょっとまとめておこう。

●アドレス
int a;
とした時、&a がアドレス。 メモリの位置を表す(住所のようなもの)ことは定番。

●ポインタ
int* pA = &a;
としたとき、pA はポインタ。アドレスをいれておく用の箱。
また、*pA としたときは、そのポインタが指し示す変数である a を示す。
つまり * が変数とポインタの橋渡しをしているってこと。(どっちからどっちへの変換も * だから分かりにくくなっている気がする。)
また、下の2つは同じ意味を示します。
int* pA;
int *pA;
ここらへんが1番生きてくるのは引数にする場合。
まず普通に変数を引数にすると、

void change (int x, int y){
.....
}
int main(){
......
change(a, b);
......
}
関数changeは引数2つを交換するものだとして、これだと仮引数(x, y)と実引数(a, b)は値渡し(コピーのようなもの)なので、仮引数は交換になっても実引数は交換になってない。

よって、次のようにすると、
void change (int* x, int* y){
.....
}
int main(){
......
change(&a, &b);
......
}
今度は仮引数(x, y)と実引数(a, b)は参照渡し(場所を伝える。この場合はポインタ渡しのほうがいいかな。)
これで実引数と仮引数は同じ場所を示しているので仮引数を変えると実引数も交換になると。

そしてこの場合のポインタ渡しをもう少し簡単にできるようにしたのが本当の参照渡し

●参照
int& rA = a;
ここで rA は参照。(そしてここで & がアドレスと同じでまたこんがらがると、違いとしては &a はアドレス、int& は参照ということかな)
そして、これを引数にすると、
void change (int& x, int& y){
.....
}
int main(){
......
change(a, b);
......
}
change(a, b)と使うときにさっきのようにアドレスを使わず、そのまま変数を渡せばいいということですね。
変数を渡していても参照渡しができる(それがわかりやすいのかどっちも変数を渡していてどっち渡しなのかわからないのかは感じ方の違い)。
使う人にとってはchangeの中身がブラックボックスでも変数を渡せばいいからいいのかな。






0 件のコメント:

コメントを投稿