C言語のきほん「ポインタの基本(3)ポインタの活用」

スポンサーリンク
プログラミング C言語

今回は、アドレス演算子&と間接演算子*について理解を深めていこう。

「ポインタの指す先を実行時に決定するプログラム」をご紹介しよう。

なお、本プログラムは、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クリエイティブ

コメント

タイトルとURLをコピーしました