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型であるということを言っている。