C言語でポインタを扱う

アドレス演算子と間接演算子

変数の前に&をつけることによってその変数のメモリアドレスが参照される。値にアクセスするには*を使う。

int n = 100;
printf("n: %d\n", n);
printf("n address: %p", &n);
printf("n: %d", *(&n));
return 0;

ポインタ変数

変数のメモリアドレスを格納するための変数。
*を使って宣言できる。

int n = 100;
int *p = &n;
printf("n address: %p\n", p);
printf("n: %d", *p);

配列のポインタ

#include <stdio.h>

int main() {
  int array[5] = {1,2,3,4,5};
  int *topPtr;
  topPtr = &array[0];

  printf("topPtr: %p\n", topPtr);
  printf("array pointer: %p", array);
  return 0;
}

出力結果

topPtr: 0x7ff7baaf50c0
array pointer: 0x7ff7baaf50c0

配列名は先頭の要素のポインタと等しい。先頭のアドレスがわかれば要素数をtopPtr[2]のように指定することでarray[2]の値にアクセスできる。配列のポインタは配列であるかのように使うことができる。

pointer

配列を関数内で操作したい場合は、配列名を引数に渡して配列の先頭要素のアドレスを関数内で参照可能にする。

#include <stdio.h>

#define rep(n) for(int i = 0; i < n; i++)

// *array: arrayというポインタ変数を引数に取る
int doubleArrayElements(int *array, int n) {
  printf("Array Element: ");
  rep(n) printf("%d, ", array[i]);
  printf("\n");
  rep(n) array[i] *= 2;
  printf("Double Array Element: ");
  rep(n) printf("%d, ", array[i]);
  return 0;
}

int main() {
  int array[5] = {1,2,3,4,5};
  doubleArrayElements(array, 5);
  return 0;
}

出力結果

Array Element: 1, 2, 3, 4, 5,
Double Array Element: 2, 4, 6, 8, 10,

参考