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関数の変数にアクセスすることができます。