トップC言語入門 > ポインタ
ポインタ

1.ポインタ

変数や配列などは、プログラム実行時には、メインメモリ上のどこかに割り当てられている。 場所は番地で表される。メインメモリ全体はバイト配列のようなものであり、配列添え字が番地に相当する。

例えば、次のプログラムで、変数 n は 16進表記で 12FF5C 番地に割り当てられている。 この具体的な番地の値は、実行するパソコンによって異なる。

変数 n の番地は アドレス演算子 & を使って、&n とすれば得られる。

このような int型変数の番地を格納する変数は、次のように宣言する。 アドレス(番地)を格納する変数をポインタ型変数とよぶ。

int *p;
// pointer01.c

#include <stdio.h>

int main() {
    int n;
    int *p = &n;
    printf("p=%p\n", p);
    printf("p+1=%p\n", p+1);
}
c:\MH\www\c01\pointer>pointer01
p=0012FF5C
p+1=0012FF60
値自体はマシンによって異なるが、p と p+1 の差はint型のサイズ4である。 ポインタ同士の足し算はできない。引き算はできる。
// pointer03.c

#include <stdio.h>

int main() {
    int data[] = { 25, 78, 11, 99, -1 };
    int *p1 = &data[1];
    int *p2 = &data[2];
    printf("p1=%p p2=%p p2-1=%p\n", p1, p2, p2-1); 
    printf("p1=%p p2=%p p2-p1=%d\n", p1, p2, p2-p1); 
}

ポインタ-整数は+の場合と同様にデータ型のサイズを考慮したものとなる。 ポインタ-ポインタはその間の要素の数となる。 すなわち、アドレスの差をデータ型のサイズで割った値となる。

c:\mh\www\c01\pointer>pointer03
p1=0012FF50 p2=0012FF54 p2-1=0012FF50
p1=0012FF50 p2=0012FF54 p2-p1=1

int *p = &n; と宣言した場合、p番地に格納されている整数の値は *p とすることにより得られる(間接参照)。

参考文献

[1] C言語のポインタ ~ & と * を使ってみる ~