前回ポインタを使って変数を参照する方法について話しました。参照とは間接的に変数を扱うことでした。ですが、変数を間接的に使うことのメリットとは何なのでしょうか? 今回はこんなことについて話していきます。
今回の要点はこんな感じです。
では、いってみましょう。
では、いきなりですが次のプログラムを見て下さい。
プログラム | 実行結果 |
---|---|
// Ptr3b.cpp #include <iostream.h> void ChangeToShohwa(int x) { if(1926 < x && x < 1989) x -= 1925; else x = 0; } void Shohwa() { int nYear; cout << "西暦を入力して下さい > "; cin >> nYear; ChangeToShohwa(nYear); if(nYear) cout << "その年は昭和 " << nYear << " 年です。" << endl; else cout << "その年は昭和ではありません。" << endl; } int main() { Shohwa(); Shohwa(); return 0; } |
西暦を入力して下さい > 1945 その年は昭和 1945 年です。 西暦を入力して下さい > 1192 その年は昭和 1192 年です。 |
例の昭和プログラムを改造したものですが、何か結果がむちゃくちゃですね。
どこを改造したかといえば、ChangeToShohwa の引数を直接操作して nYear の値を変更しようとしているところです。ですが、それは失敗に終わりました。引数は、新たに変数が作られ、それに値が代入されるという仕組みになっているからです。
考えてみて下さい。上のは引数が変数ですが、ChangeToShohwa(1979); のようにただの値が入れられることもあるのです。
1979 は変数でなく定数なので変更できません。1979 -= 1925; がエラーを起こすことからわかるでしょう。これだけでも直接操作できないことがわかるでしょう。
こんな時にポインタを使うのです。では、次のプログラムを見て下さい。
プログラム | 実行結果 |
---|---|
// Ptr3.cpp #include <iostream.h> void ChangeToShohwa(int* p) { if(1926 < *p && *p < 1989) *p -= 1925; else *p = 0; } void Shohwa() { int nYear; cout << "西暦を入力して下さい > "; cin >> nYear; ChangeToShohwa(&nYear); if(nYear) cout << "その年は昭和 " << nYear << " 年です。" << endl; else cout << "その年は昭和ではありません。" << endl; } int main() { Shohwa(); Shohwa(); return 0; } |
西暦を入力して下さい > 1945 その年は昭和 20 年です。 西暦を入力して下さい > 1192 その年は昭和ではありません。 |
今度は成功しました。では、その仕組みを説明しましょう。
引数が int* p となっています。ポインタです。で、この関数を呼び出している方は ChangeToShohwa(&nYear); と、アドレスを渡しています。
さっき言ったように、変数(ポインタ)p が新たに作られて、nYear のアドレスをこれに代入しています。つまり、*p は nYear の複製になります。
何と、普通では使えないはずの変数、つまり別の関数の内部変数を操作することができるようになりました。もうこうなったら変更し放題です。*p を使って nYear を変更してやりましょう。
あ、もちろん ChangeToShohwa(1979); のようなことはできません。引数に入れるのはアドレスで、西暦そのものではないからです。
このように、関数を越えて内部変数を操作する必要があるときにポインタを使います。そして、アドレスを渡すことを参照渡しといいます。
一方、普通の、ただ値を渡すことを値渡しと言います。
今回はやっと素直に終わりました。これでポインタの基礎の基礎は終わりです。
では、今回の要点をもう一度見てみましょう。
次回は配列変数についてもう一度見ていきます。ではまた次回まで。
Last update was done on 1999.3.31
この講座の著作権はロベールが保有しています