Web系開発メモ

Java, JavaScript, CSS, HTML など、Webアプリの記事を中心に書いています。

C言語:アドレスとポインタ

C言語のアドレスとポインタについて少しまとめてみました。まだ使いどころはよく理解できてないので、概念的な内容が多めです。

アドレス

アドレスはメモリの場所を表す番号(値)で、OS によって管理されています。プログラマがアドレスの値を設定する場面はなさそうですが、ポインタを使うときなどはアドレスを理解しておいたほうが良さそうです。

以下に、アドレスを示す方法を書いていきます。

通常の変数

通常の変数は、以下の方法でアドレスを示すことができます。

  • &変数名(例:&x
int x = 10;
printf("address=%p\n", &x); // "%p" でアドレスを出力
printf("value=%d\n", x); // 値を出力

1次元配列

配列は、通常の変数とアドレスを示す方法が少し違います。

  • 配列名(例:txt):配列の先頭要素のアドレスを示す
  • &配列名[i](例:&txt[1]):配列要素のアドレスを示す
char txt[] = "abc";
printf("value=%s\n", txt); // "%s" で文字列を出力
printf("address=%p\n", txt); // "%p" でアドレスを出力
printf("address[0]=%p\n", &txt[0]);
printf("value[0]=%c\n", txt[0]);

2次元以上の配列は、&配列名[x][y] などで要素のアドレスを表します。

ポインタ

ポインタはアドレスを保存する変数みたいです。

宣言方法

変数名の前に * をつけるとポインタ変数になり、変数のアドレスを保存できるようになります。

int x = 10;
int *y;
y = &x;

上の例だと、x のアドレス(&x)を y(ポインタ)に代入しています。x と y の番地が同じになるので、y の値も 10 になります。

値の操作

ポインタ変数の値にアクセスする場合、変数名の前に * をつけます。

int x = 10;
int *y;
y = &x;
printf("%d\n", *y); //-> 10
*y = 15;
printf("%d\n", *y); //-> 15
printf("%d\n", x); //-> 15

上の例は *y で、

  • 値の参照:printf("%d\n", *y);
  • 値の代入:*y = 15;

をしています。