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 *iPo は int 型のアドレスを保存する。ポインターの前に * を付けると、参照先の値へアクセスできる。この操作を間接参照と呼ぶ。
コード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;
}
ポインター型は重要である。コンパイラーは参照先の型から読み書きするバイト数を判断する。意図的な低レベル変換が必要な場合を除き、互換性のあるポインター型へアドレスを代入する。