■C++を学ぼう!
「C++を学ぼう!」では、C++の初心者をターゲットにC++言語を体系的に学べるようにサイトを構築しています。
管理人もC++を学びながら作っていますので、分かり難い点などあればご指摘下さい。

▼スポンサードリンク
■メニュー

(C)あいねこの館

文章などの改変・利用は禁止します
ポインタ

ポインタとは?
ポインタとはアドレスを記憶しています。ポインタは変数のように定義することが出来ます。
ポインタはメモリ上のアドレスをさします。実際のデータはメモリ上に乗っかっていますので ポインタがどのメモリにデータが保存されているかを調べることが出来ます。

型 *ポインタ名;
int a;で定義されると変数aが定義されます。
&aと定義すると変数aの先頭アドレスを示します。
int *b;を定義するとポインタでメモリの場所を示す変数が定義されます。
b= &a;と定義するとポインタbにaのアドレスを代入します。

また、ポインタに他の変数のアドレスが代入されている時に*を用いてその変数値を取り出すことが出来る。

#include <iostream>

using namespace std;

int main(){


	int a = 50;

	//ポインタ変数pを宣言する
	int *p;

	//pの先頭アドレスを表示する
	cout << &p << endl;

	//pをaのアドレスを設定する
	p = &a;

	//pのアドレスはaであり、aの値を取得する
	cout << *p << endl;

}
ポインタ引数
ポインタ引数は引数にポインタを使ったものです。
さて、ポインタを利用すると関数を用いた時に呼出元の変数も書き換えることが可能となります。
どういうことかというと・・・

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