変数内容を交換する

以前(e34044m1.htm)に紹介した配列の要素を交換する関数の別解です。

次は、配列を指定数だけ表示する関数と、前に紹介した配列の2つの要素記憶内容を交換する関数 の例です。

#include <stdio.h>
extern void disp(int *p, int n);

void swap_i(int *a, int i1,int i2)
{
	int w = a[i1]; 
	a[i1] = a[i2];
	a[i2] = w; 
}
main()
{
	int a[6] = { 5, 2, 6, 4 ,3 , 8};/* 操作対象の配列 */
	int i1,i2; /*添え字*/
	
	disp(a,6); 
	printf("\n交換する添え字を2つ入力>");
	scanf("%d %d", & i1, & i2);

	swap_i(a, i1, i2);
	disp(a,6); 
	printf("\n %d と %d の位置が交換されました\n", i1, i2);
}
void disp(int *p, int n)
{
	int i = 0;
	for(i = 0; i < n ; i++){
		printf("%d  ",	p[i]);
	}
}
5  2  6  4  3  8
交換する添え字を2つ入力>1 2
5  6  2  4  3  8
 1 と 2 の位置が交換されました

上記のswap_ai 関数では、交換対象の配列と、交換したい添え字を引数にし、配列の先頭アドレスを基準にした添え字要素をアクセスして交換しています。
同じ動作結果を得る別のプログラムを、以下に示します。(C言語特有の関数の作り方です)

ポインタであれば、それが指し示す記憶域の内容を変更できるので、 交換対象の配列を指定しなくても、交換できます。
つまり、交換対象を指すポインタだけ、2つ引数にするだけで済みます。
この方法の定義と利用例を以下に示します。 ■■■■ の記述を正しく直して完成くだささい。
(なお、[]演算子でなく、*演算子を使ってください。また呼び出しはi1を使う実引数を第一引数にしてください。)

←編集 入力後に クリックください。

なお、このswap_iの呼び出しは、 swap_i( &a[i1], &a[i2] ); と配列演算子を使って実行させても同じです。
また、int 型ポインタが指し示す2つの記憶内容を交換する関数なので、次のように配列要素でなくても交換できます。

	int a = 2, b = 6;
	swap_i(& a, & b);	/* a とbの内容を交換 */

このように、引数のアドレス渡しにより、それらが指し示す記憶域を関数側で交換する手法は、 C言語などのポインタが使える言語独特の作り方です。