ポインタ

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください