ポインタについてのまとめ

Cの復習。

#include <stdio.h>

void swap(int x,int y); //関数プロトタイプの宣言

void swap(int x,int y)
{
    printf("swap関数内:xは%d,yは%dです。\n",x,y);  
    int tmp;
    
    int *pX; //int型のポインタpAを宣言
    int *pY;
    pX = &x; //ポインタpAにxのアドレスを代入
    pY = &y;

    tmp = *pX; //pXポインタの参照先であるx(xの"値"ではなくxの"実体")をtmpに代入
    *pX = *pY; //pYポインタの参照先であるy(yの"値"ではなくyの"実体")をpXポインタの参照先であるx(の"実体")に代入
    *pY = tmp; //int型の変数tmpをpYポインタの参照先であるy(yの"値"ではなくyの"実体")に代入
    printf("swap関数内:xは%d,yは%dです。\n",x,y); 
}

int main (void)
{
    int x=3;
    int y=5;
    printf("xは%d,yは%dです。\n",x,y);    
    swap(x,y);
    printf("swapしました。\n");
    printf("xは%d,yは%dです。\n",x,y); 
    return 0; 
}

実行結果

xは3,yは5です。
swap関数内:xは3,yは5です。
swap関数内:xは5,yは3です。
swapしました。
xは3,yは5です。
Program ended with exit code: 0

変わってない。
関数の仮引数をポインタとして定義することが必要らしい。

#include <stdio.h>

void swap(int *pX,int *pY); //関数プロトタイプの宣言

void swap(int *pX,int *pY)
{
    printf("swap関数内:xは%d,yは%dです。\n",*pX,*pY);  
    int tmp;
    
    tmp = *pX; //pXポインタの参照先であるx(xの"値"ではなくxの"実体")をtmpに代入
    *pX = *pY; //pYポインタの参照先であるy(yの"値"ではなくyの"実体")をpXポインタの参照先であるx(の"実体")に代入
    *pY = tmp; //int型の変数tmpをpYポインタの参照先であるy(yの"値"ではなくyの"実体")に代入
    printf("swap関数内:xは%d,yは%dです。\n",*pX,*pY); 
}

int main (void)
{
    int x=3;
    int y=5;
    printf("xは%d,yは%dです。\n",x,y);    
    swap(&x,&y);
    printf("swapしました。\n");
    printf("xは%d,yは%dです。\n",x,y); 
    return 0; 
}

実行結果

xは3,yは5です。
swap関数内:xは3,yは5です。
swap関数内:xは5,yは3です。
swapしました。
xは5,yは3です。
Program ended with exit code: 0

ポイントは以下の点。
(1)仮引数にポインタを指定

void swap(int *pX,int *pY)

(2)main関数内で、引数にアドレスを渡す。

swap(&x,&y);

自分なりにまとめると、

仮引数のint *pXは、引数がint型ということを意味しているのではなく、
引数であるポインタ(アドレスを参照する変数)が参照する変数xが
int型であるということを言っている。