今回は、アドレス演算子&と間接演算子*について理解を深めていこう。
「ポインタの指す先を実行時に決定するプログラム」をご紹介しよう。
なお、本プログラムは、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クリエイティブ

 
 

コメント