今回は、アドレス演算子&と間接演算子*について理解を深めていこう。
「ポインタの指す先を実行時に決定するプログラム」をご紹介しよう。
なお、本プログラムは、Windows 11 Home(23H2)上で、 Visual Studio Code(1.89.1)を使用して作成し、gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0でコンパイルしている。
ポインタの指す先を実行時に決定するプログラム
//ポインタの指す先を実行時に決定するプログラム
#include <stdio.h>
int main(void)
{
int x = 123;
int y = 456;
int sw;
printf("x = %d\n",x);
printf("y = %d\n",y);
printf("xのアドレス:%p\n",&x);
printf("yのアドレス:%p\n",&y);
printf("変更するのは、[0 -> x / 1 -> y] =");
scanf("%d",&sw);
int *p;
if(sw==0)
p = &x; //pはxを指す
else
p = &y; //pはyを指す
*p = 999;
printf("x = %d\n",x);
printf("y = %d\n",y);
printf("xのアドレス:%p\n",&x);
printf("yのアドレス:%p\n",&y);
return 0;
}
実行例(1)
x = 123
y = 456
xのアドレス:0x7ffcdf9ac0a4
yのアドレス:0x7ffcdf9ac0a8
変更するのは、[0 -> x / 1 -> y] =0
x = 999
y = 456
xのアドレス:0x7ffcdf9ac0a4
yのアドレス:0x7ffcdf9ac0a8
実行例(2)
x = 123
y = 456
xのアドレス:0x7ffeafeb9444
yのアドレス:0x7ffeafeb9448
変更するのは、[0 -> x / 1 -> y] =1
x = 123
y = 999
xのアドレス:0x7ffeafeb9444
yのアドレス:0x7ffeafeb9448
実行例(1)
ポインタpに&xが代入されるため、pはxを指す。その状態で、*pに999に代入する。
*pはxのエイリアスであり、999の代入先はxである。
実行例(2)
ポインタpに&yが代入されるため、pはyを指す。その状態で、*pに999に代入する。
*pはyのエイリアスであり、999の代入先はyである。
本プログラムでは、アクセス先(読み書き先)の決定が、プログラムのコンパイル時に静的(スタティック)に行われるのではなく、プログラムの実行時に動的(ダイナミック)に行われる。
ポインタをうまく活用すれば、アクセス先の決定を、プログラム実行時に動的に行うコードが実現できる。
(参考)新・明解C言語 入門編 第2版 柴田 望洋 (著)SBクリエイティブ
コメント