ポインタ引数
ポインタ引数は引数にポインタを使ったものです。
さて、ポインタを利用すると関数を用いた時に呼出元の変数も書き換えることが可能となります。
どういうことかというと・・・
a=5;
b=3;
//a,bの値を交換する
func(a,b);
//aは3が出る
cout << a << endl;
//bは5が出る
cout << b << endl;
funcを実行すると、元のa、bも同時に入れ替えてくれるわけです。
今までの方法だと、値を交換する為にはバッファを用いなければなりませんでした。(下記例参照)
a=5;
b=3;
//a,bの値を交換する
buff = a;
a = b;
b = buff;
//aは3が出る
cout << a << endl;
//bは5が出る
cout << b << endl;
そこで、関数にポインタの引数を渡すことで、呼出元のメモリの値を直接書き換えてしまうわけです。
◆呼出元
func(&a,&b); ⇒aとbのアドレスを関数に渡す
◆値交換の関数
void func(int *a,int *b){⇒引数をアドレスにする
◆値交換関数での計算
int buff;
buff = *a;⇒*aはアドレスaの実の代入
*a = *b;⇒アドレスaにbの実の値を代入
*b = buff;⇒アドレスbにbuff(即ちa)の値を代入
⇒aアドレスにbの値を、bアドレスにaの値を入れる。
1つのプログラムに纏めると以下のようになります。
#include <iostream>
using namespace std;
//2つのint型の値を交換する
void func(int *a,int *b){
int buff;
buff = *a;
*a = *b;
*b = buff;
}
int main(){
int a = 50;
int b = 100;
//aとbの値
cout << "aの値:" << a << ":bの値" << b << endl;
//2つの値を交換する
func(&a,&b);
//aとbの値
cout << "aの値:" << a << ":bの値" << b << endl;
}
実行結果は以下の通りです。
aの値:50:bの値100
aの値:100:bの値50
しかし、この方法だとポインタを渡さないといけないし、逆参照演算子(例:*aのこと)を使わないといけなかったり面倒です。
そこで、参照引数(例:&aのこと)を使うことも可能です。
上記のプログラムを参照引数を用いて変更してみましょう!
#include <iostream>
using namespace std;
//2つのint型の値を交換する
void func(int &a,int &b){
int buff;
buff = a;
a = b;
b = buff;
}
int main(){
int a = 50;
int b = 100;
//aとbの値
cout << "aの値:" << a << ":bの値" << b << endl;
//2つの値を交換する
func(a,b);
//aとbの値
cout << "aの値:" << a << ":bの値" << b << endl;
}
実行結果は以下の通りです。
aの値:50:bの値100
aの値:100:bの値50