fall and fall

ゲーム、プログラミング、二次創作のことなどを書いています。

C言語 アドレスとポインタの概要(&と*の使用方法)

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; // アドレスを代入