MISW.github.io

まず、下のプログラムを打ち込んでコンパイルしてみてください。

#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

これはそのメモリに置かれている実際の数値をいじくれる。

これなら数値をメモリに置き直しているので関数内でいじっても、数値を変更できる。

(説明編集途中)