/**********************************************
基本選択法
**********************************************/
#include <stdio.h>
#define N 10 //配列要素数
//関数のプロトタイプ宣言
void swap(int *pa , int *pb);
int *getMin(int *p , int n);
void dispAll(int *p , int n);
void main(){
//ローカル変数の宣言
int x[N] = {22,58,36,42,85,72,19,28,66,51};
int i; //添字
//データの表示
dispAll(x , N);
//並べ替え
for(i = 0; i < N-1; i++)
{
//未決定の範囲の中から最小値の位置を求めて先頭と交換
swap(getMin(&x[i] , N - i) , &x[i]);
}
//データの表示
printf(" ソートしました\n");
dispAll(x , N);
}
/***********************************************************
2つのint型の値を交換する処理
************************************************************/
void swap(int *pa , int *pb)
//pa , pb:交換するデータのアドレス
{
//変数の宣言
int temp; //一時退避
//交換処理
temp = *pa;
*pa = *pb;
*pb = temp;
}
/************************************************************
配列の指定番目から指定個の中から最小値を探す
戻り値:最小値の位置(アドレス)
************************************************************/
int *getMin(int *p , int n)
//p :データが格納されている配列の対象範囲の先頭のアドレス
//n :最小値を探す範囲の個数
{
//ローカル変数の宣言
int i; //添字
int *pmin; //最小値の位置(アドレス)
//最小値を探す
pmin = p;
for(i = 0 ; i < n; i++ , p++)
{
if(*pmin > *p)
{
pmin = p; //より小さい数値がみつかった
}
}
return pmin;
}
/**************************************************
配列の内容をすべて表示する関数
**************************************************/
void dispAll(int *p , int n)
//p :データが格納されている配列のアドレス
//n :要素数
{
//ローカル変数の宣言
int i; //添字
//表示
for(i = 0 ; i < n; i++)
{
printf("%4d" , *(p + i));
}
printf("\n");
}
if(*pmin > *p)の部分で*pminはpの内容をさすので、int *pの実引数&x、つまり*pmin = &x[0]になり *pminは最初22をさしますよね。
*pも22を指し、 22>22となりfor文の最初の処理は意味がない事になり、次に繰り返されますが、後置演算子p++なので*pmin = x[1] つまり
58を指してしまう事と、*pも58になるので 58>58となりこれもおかしくなってしまいます。ここの部分の解釈お願いします。