ポインタは別の変数(データ)のアドレスを保持する変数。p という変数(ポインタ)が別の変数 q のアドレスを保持しているとき、「p は q を指している」という。
ポインタの宣言
ポインタを宣言する、一般的な形式は次の通り。
型 *変数名;
ポインタは変数名の前に * (アスタリスク)をつけて宣言する。
ポインタ演算子
* と & の2つのポインタ演算子がある。両方とも変数名の前につけて使う。* はポインタの指しているデータの値を返す。& は変数のアドレスを返す。
次のプログラムは、int 型のポインタ p と変数 q を使っている。
#include
int main(void)
{
int *p, q;
q = 199;
p = &q;
printf("%d\n", *p);
return 0;
}
9行目で q のアドレスを p に代入し、11行目で p を使って q の値を表示している。ポインタを通じて変数の値を参照することを「間接参照(indirection)」という。結果として、199 と表示される。
takatoh@nightschool $ ./sample_6_1a 199
間接参照は変数に値を代入するのにも使える。
int *p, q; p = &q; *p = 199;
これで q に 199 が代入された。
ポインタとデータ型
型は重要だ。これによって、コンパイラはポインタの指しているデータがどれくらいのメモリ領域を使うかを知ることができる。
次のプログラムは、int 型のポインタを使って double のデータを代入しているため、正しく出力しない。
#include
int main(void)
{
int *p;
double q, temp;
temp = 1234.56;
p = &temp;
q = *p;
printf("%f\n", q);
return 0;
}
takatoh@nightschool $ gcc sample_6_1b.c -o sample_6_1b
sample_6_1b.c: In function ‘main’:
sample_6_1b.c:11:7: warning: assignment from incompatible pointer type [enabled by default]
p = &temp;
^
takatoh@nightschool $ ./sample_6_1b
1889785610.000000