C言語 | ポインター | ポインター

ポインターはメモリアドレスを保存する。アドレス演算子でアドレスを取得し、間接演算子で参照先の値へアクセスする。

メモリ参照

メモリはアドレスを持つ領域に分かれている。変数はその領域の1つに値を保存する。変数の前に & を付けると、アドレスを取得できる。

&変数

アドレスの表示には %p を使う。

コード1

#include <stdio.h>

int main() {
 char chVar = 'G';
 int iVar = 10;
 printf("chVar: value = %c, address = %p\n" , chVar , (void *)&chVar);
 printf("iVar: value = %d, address = %p\n" , iVar , (void *)&iVar);
 return 0;
}

アドレスの保存

ポインターは * を使って宣言する。

 *変数名;

たとえば、int *iPoint 型のアドレスを保存する。ポインターの前に * を付けると、参照先の値へアクセスできる。この操作を間接参照と呼ぶ。

コード2

#include <stdio.h>

int main() {
 int iVar = 100;
 int *iPo = &iVar;
 printf("iPo = %p, &iVar = %p, *iPo = %d\n" ,
   (void *)iPo , (void *)&iVar , *iPo);
 return 0;
}

間接参照を使うと、ポインター経由で値を代入できる。

コード3

#include <stdio.h>

int main() {
 int iVar = 0;
 int *iPo = &iVar;
 *iPo = 100;
 printf("iVar = %d\n" , iVar);
 return 0;
}

ポインターを使うと、関数が呼び出し元の変数を変更できる。

コード4

#include <stdio.h>

void swapInt(int *left , int *right) {
 int temporary = *left;
 *left = *right;
 *right = temporary;
}

int main() {
 int iVar1 = 100 , iVar2 = 1000;
 swapInt(&iVar1 , &iVar2);
 printf("iVar1 = %d, iVar2 = %d\n" , iVar1 , iVar2);
 return 0;
}

ポインター型は重要である。コンパイラーは参照先の型から読み書きするバイト数を判断する。意図的な低レベル変換が必要な場合を除き、互換性のあるポインター型へアドレスを代入する。