まず、下のプログラムを打ち込んでコンパイルしてみてください。
#include<stdio.h>
void swap(int a,int b){
int tmp;
tmp = a;
a = b;
b = a;
}
int main(){
int x = 10;
int y = 20;
swap(x,y);
printf("x = %d,y = %d\n",x,y);
return 0;
}
swap関数でやっているのは、受け取った引数を一時的な変数置き場におきつつ、交換している。なので、この関数を使えば
x = 20,y = 10
と表示されるはずなのだが、されない。これは何故なのかというと、関数の引数というのはメモリから数値を受け取ってコピーして使う感じで、その数値をいくら関数内で変更しても、その数値をメモリに返さないという性質がある。
なので、swap関数内でx = 20とやったものの、この数値はxという変数置き場には戻ってないことになる
ということで、どうすればいいかというと以下のようにする。
#include<stdio.h>
void swap(int *a,int *b){
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
int main(){
int x = 10;
int y = 20;
swap(&x,&y);
printf("x = %d,y = %d\n",x,y);
return 0;
}
swap関数にてポインタを受け取ってやる。これにより、変数がどこに置かれてたかを受け取っている。 そして、関数内で
*a *b
これはそのメモリに置かれている実際の数値をいじくれる。
これなら数値をメモリに置き直しているので関数内でいじっても、数値を変更できる。
(説明編集途中)