配列の引数
一次元配列を関数の引数にする場合は、ポインタを使う。
多次元配列の場合は、ポインタは使えないため、以下のようにする。
変数が引数の場合は、呼び出された関数内で値を変更しても、呼び出し元の関数では反映されないが、引数が配列やポインタの場合は、呼び出し元の関数内でも値の変更が反映される。
// 引数が一次元配列の場合(1)
Show_Text(char *str)
{
puts(str);
}
main()
{
Show_Text("おはよー");
}
----- 出力結果 -----
おはよー
--------------------
// 引数が一次元配列の場合(2)
Set_Value(int *n)
{
int i;
for(i=0; i<5; i++)
n[i] = i + 1;
}
main()
{
int n[5];
Set_Value(n);
printf("%d %d",n[0],n[2]);
}
----- 出力結果 -----
1 3
--------------------
// 引数が多次元配列の場合
Show_Text(int n[][2])
{
printf("%d %d",n[0][0],n[2][1]);
}
main()
{
int n[][2] = {{1,2},{3,4},{5,6}};
Show_Text(n);
}
----- 出力結果 -----
1 6
--------------------
多次元ポインタを引数にする場合
プログラミング手法(キューとスタック)
配列にデータを入れた順にデータを取り出す方式をFIFO(First In First Out)、または、キューと言う。
配列にデータを入れた順とは逆順にデータを取り出す方式をLIFO(Last In First Out)、または、スタックと言う。
ウィンドウズでは、ウィンドウ メッセージの蓄積にはキューを、再帰構造の実現にはスタックを使っているらしい。
これらは、メモリ空間がプログラマーが使うのとは別だから、プログラマーが直接操作することはできない。
プログラムでキューやスタックを使う場合は、1次元配列を1つと、次のデータを入れる配列位置を覚えておく変数を1つ用意すれば良い。もちろん、これらは、ウィンドウズが使うそれらとは別物である。
スタックにデータを入れる操作をプッシュ、取り出す操作をポップと呼ぶ。
// スタックの場合
int data[32]; // データを格納する配列
int index = 0; // 次のデータを入れる配列位置の添え字を入れる変数
// データの追加
push_stack(int val)
{
if(val >= 0 && index < sizeof(data) / sizeof(int)){
data[index] = val;
index ++;
}
}
// データの取り出し
int pop_stack()
{
int val = -1; // 空の場合は -1
if(index > 0){
index --;
val = data[index];
}
return val;
}
main()
{
push_stack(2);
push_stack(5);
push_stack(16);
printf("%d\n", pop_stack());
printf("%d\n", pop_stack());
printf("%d\n", pop_stack());
printf("%d\n", pop_stack());
push_stack(8);
push_stack(20);
printf("%d\n", pop_stack());
printf("%d\n", pop_stack());
}
----- 出力結果 -----
16
5
2
-1
20
8
--------------------
// キューの場合
int data[32]; // データを格納する配列
int index = 0; // 次のデータを入れる配列位置の添え字を入れる変数
// データの追加
push_queue(int val)
{
if(val >= 0 && index < sizeof(data) / sizeof(int)){
data[index] = val;
index ++;
}
}
// データの取り出し
int pop_queue()
{
int val = -1; // 空の場合は -1
if(index > 0){
val = data[0];
index --;
memmove(data, data + 1, sizeof(int) * index); // 残りのデータを1つ前に詰める
}
return val;
}
main()
{
push_queue(2);
push_queue(5);
push_queue(16);
printf("%d\n", pop_queue());
printf("%d\n", pop_queue());
printf("%d\n", pop_queue());
printf("%d\n", pop_queue());
push_queue(8);
push_queue(20);
printf("%d\n", pop_queue());
printf("%d\n", pop_queue());
}
----- 出力結果 -----
2
5
16
-1
8
20
--------------------