ポインタは別の変数(データ)のアドレスを保持する変数。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