ポインタとは
ポインタ(pointer) とは、データ型の一種です。そのためポインタ型の変数として用います。ポインタ型の変数とは以下のような箱を示します。
メモリには、場所を示す番地(address) がつけられています。ポインタ型の変数とは、実際には番地が格納されています。
さらに、通常は指している先も変数ですので、以下のように整数型変数を指すポインタのように用います。以下の変数のデータ型は、整数型へのポインタ(a pointer to integer type)といいます。int *ip; と宣言します。
ポインタの宣言
ポインタ変数の宣言は、
int *ip;
のように宣言します。*(アスタリスク、asterisk)をつけるところがこれまでと異なります。この例では、整数型へのポインタ変数の宣言となります。ip は、変数名です。
ポインタ変数は、番地を格納する変数のため通常の値は代入することはできません。例えば、以下のように用います。
# include <stdio.h> int main() { int a = 123; int *ip; ip = &a; return 0; } |
上のプログラムでは、整数型変数a に 123 を代入して、その番地(&a) を整数型へのポインタ ip に代入しています。変数のアドレスをしめす& 演算子を用いています。
ポインタの参照
宣言でない文の中で、*ip のように参照することでポインタの指している先の値を示すことができます。
# include <stdio.h> int main() { int a = 123; int *ip; ip = &a; printf("%d and %d\n", a, *ip); return 0; } |
ポインタと配列
以下のような配列を使って説明しましょう。
配列名aは、以下のように(配列への)ポインタ変数 a とおく事もできます。つまり、配列名はポインタ変数として扱うこともできます。
ポインタ変数a には、(番地という)値を代入することはできません。
例
以下のように、配列を宣言し、配列名であるaをポインタ変数として扱うことができます。そのため、ip = a; と代入することができます。
# include <stdio.h> int main() { int a[ ] = { 453, 34, 876, 2345, 89 }; int *ip; ip = a; printf("%d and %d\n", a[0], *ip); ip++; printf("%d and %d\n", a[1], *ip); return 0; } |
ポインタ変数への参照は、*ip として用います。