ポインタ

C言語の最難関と呼ばれるポインタについて解説していきます。と言っても、最初はイメージができなくてピンとこないだけで、難しいわけでは無いです。

ポインタとは、変数のアドレス情報を持ち、その変数にアクセスすることができる変数のことです。

ポインタの宣言

ポインタの宣言は以下のように行います。

型 *変数名;

変数名の前にアスタリスク(*)を付けるだけです。

ポインタの初期化

ポインタは、変数のアドレス情報を持つと言いました。以下にポインタに変数のアドレスを格納する例を示します。

int data1, data2;
int *p1 = &data1;
int *p2;

p2 = &data2;

変数に&を付けることで、その変数のアドレスを示すようになります。

ポインタが示す変数へのアクセス

ポインタを使って変数にアクセスするには、アスタリスク(*)を付けます。

int data;
int *p = &data;

*p = 1;

上記の例では、ポインタ変数pには変数dataのアドレスが格納されます。*pと書くことでポインタpが指す変数dataにアクセスすることができます。

ポインタの使用例(スワップ関数)

ポインタを理解するために1番わかりやすいのがスワップを実装することです。

スワップ関数とは2つの変数の値を入れ替える関数のことです。

以下に例を示します。

#include <stdio.h>

void swap(int a, int b);

int main(void)
{
	int a, b;

	a = 10;
	b = 20;

	swap(a, b);
	printf("a = %d\nb = %d\n", a, b);

	return 0;
}

void swap(int a, int b)
{
	int temp = a;
	a = b;
	b = temp;
}

実行結果:

a = 10
b = 20

変数aとbの値が入れ替わっていません。なぜでしょうか?

それは、main関数で宣言した変数a, bと、swap関数の引数a, bが別物だからです。名前は同じですが実体は別です。

だから、swap関数の引数a, bの値を入れ替えても、main関数のa, bを入れ替えることはできません。

そこで、ポインタの登場です。

swap関数の呼び出しと、関数の定義を以下のように修正します。

swap(&a, &b);

void swap(int *a, int *b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

実行結果:

a = 20
b = 10

変数a, bの値が入れ替わりました。swap関数の引数(ポインタ)にmain関数の変数のアドレスを渡すことで、swap関数の中でmain関数の変数にアクセスすることができます。


<< 前へ(配列)