C言語のアドレスとポインタの概要を書いていきます。&
と *
の使い方も記載しています。
1. アドレス
アドレスはメモリの場所を表す番号です。以下にアドレスを示す方法を書いていきます。
1.1. 通常の変数
通常の変数は、以下の方法でアドレスを示すことができます。
- &変数名(例.
&x
)
#include <stdio.h> int main() { int x = 10; printf("address=%p\n", &x); // %pでアドレスを出力 printf("value=%d\n", x); // 値を出力 return 0; }
1.2. 一次元配列
配列は、通常の変数とアドレスを示す方法が違います。
- 変数名(例.
txt
):配列の先頭要素のアドレスを示す - &変数名[i](例.
&txt[1]
):配列要素のアドレスを示す
#include <stdio.h> int main() { char txt[] = "abc"; printf("address=%p\n", txt); // %pでアドレスを出力 printf("value=%s\n", txt); // %sで文字列を出力 printf("address[1]=%p\n", &txt[1]); // %pでアドレスを出力 printf("value[1]=%c\n", txt[1]); // %cで文字を出力 return 0; }
1.3. 二次元以上の配列
&変数名[x][y] で要素のアドレスを表します。
2. ポインタ
ポインタはアドレスを保存する変数です。
2.1. 宣言方法
宣言時に *
をつけるとポインタ変数になり、アドレスを保存できるようになります。
#include <stdio.h> int main() { int x = 10; int* y = &x; // アドレスを代入 printf("address=%p\n", y); // %pでアドレスを出力 return 0; }
2.2. 値の操作
アドレスに格納された値にアクセスする場合、ポインタ変数の前に *
をつけます。
#include <stdio.h> int main() { int x = 10; int* y = &x; // アドレスを代入 *y = 15; // 値を変更 printf("%d\n", *y); // 値を参照 printf("%d\n", x); // 15(xとyのアドレスが同じ) return 0; }
宣言時に int *y
と書くこともできますが、宣言時に代入できるのはアドレスになります。
int *y = &x; // アドレスを代入