ポインタ変数も変数の1つですから、配列にする事が出来ます。
色々な場面で使えますが、1つだけ例を書きます。
随分前に「ソート」という考え方を説明しました。
その中で「選択法」という方法を使ったプログラムを使います。
<sample program 069-01>
#include <stdio.h> #define COUNT 10 int main(void) { int data[COUNT] = { 23, 45, 9, 67, 98, 55, 32, 76, 12, 88 }; int i; int j; int work; for (i = 0; i<COUNT - 1; i++) { for (j = i + 1; j<COUNT; j++) { if (data[i] > data[j]) { work = data[i]; data[i] = data[j]; data[j] = work; } } } for (i = 0; i<COUNT; i++) { printf("data[%d] = %d\n", i, data[i]); } return 0; } |
<実行結果>
data[0] = 9 data[1] = 12 data[2] = 23 data[3] = 32 data[4] = 45 data[5] = 55 data[6] = 67 data[7] = 76 data[8] = 88 data[9] = 98 続行するには何かキーを押してください・・・
基準となる値とその他の値を順次比較しながら並べ替えを行うプログラムです。
忘れた・・・という方はこちらを読んでください。
このプログラムをポインタ配列を使って書き換えてみます。
配列dataの各要素のアドレスを同じ大きさのポインタの配列に移します。
要素同士の比較は、直接データの入っている配列(data)を使うのではなく、ポインタ配列に入っているアドレス経由で行います。
比較の結果、入れ替えの必要が生じた場合、ポインタを入れ替えるのです。
実際のプログラムを書いてみましょう。
<sample program 173-01>
#include <stdio.h> #define COUNT 10 int main(void) { int data[COUNT] = { 23, 45, 9, 67, 98, 55, 32, 76, 12, 88 }; int *pData[COUNT]; int i; int j; int *pWork; for (i = 0; i < COUNT; i++) { pData[i] = &data[i]; } for (i = 0; i<COUNT - 1; i++) { for (j = i + 1; j<COUNT; j++) { if (*pData[i] > *pData[j]) { pWork = pData[i]; pData[i] = pData[j]; pData[j] = pWork; } } } for (i = 0; i<COUNT; i++) { printf("data[%d] = %d\n", i, data[i]); } printf("\n"); for (i = 0; i<COUNT; i++) { printf("*pData[%d] = %d\n", i, *pData[i]); } return 0; } |
<実行結果>
data[0] = 23 data[1] = 45 data[2] = 9 data[3] = 67 data[4] = 98 data[5] = 55 data[6] = 32 data[7] = 76 data[8] = 12 data[9] = 88 *pData[0] = 9 *pData[1] = 12 *pData[2] = 23 *pData[3] = 32 *pData[4] = 45 *pData[5] = 55 *pData[6] = 67 *pData[7] = 76 *pData[8] = 88 *pData[9] = 98 続行するには何かキーを押してください・・・
入れ替えるのはアドレスですから、入れ替え用の変数はポインタ変数に変更します。
実行結果を見てください。
アドレス経由でデータを比較しながら、アドレスの方を入れ替える事で、元の配列の並びを変えることなくソートが出来ています。
「並べ替えはしたいけれど、順番は入れ替えたくない」という場合、ポインタ配列が役に立つのです。