プログラミング言語 C

多次元配列は ポインタ配列とは 違うものなので、後まわしにして、

n番目の 月の名前からなる 文字列の ポインタを 返す month_name(n) を 書く 問題を 考えてみよう。 これは (関数内のみで 働く) internal な static 配列には もってこいの 応用例である。 month_name には、文字列 (character string) を 入れるための private な 配列が 含まれていて、呼び出されたときには (引数 n に 対応した) 文字列の ポインタを 正しく返す。 この section では、配列 name をどのようにして 初期化するかを 示す。


char *month_name(int n)
{
static char *name[] = {
"Illigal month",
"January", "February", "March",
"April", "May", "June",
"July", "August", "September",
"October", "November", "December"
};

return (n < 1 || n > 12) ? name[0] : name[n];
}

name の 宣言は、文字列の ポインタ配列だが、これは 前に述べた sort の 例での line_ptr と 同じである。 初期化式 (initializer) は 文字列の リストであり、各初期値は 配列内の 対応する位置に 代入される。 i番目の 文字列 (string) は 別の場所に 置かれ、そのポインタが name[i] に 格納される。 配列 name の 大きさは 指定されていないので、コンパイラが 初期値式を 計算して 正確な数値を 代入する。p137-138

関数 month_name の 戻り値は char型のポインタであり、これは char型の配列と 置き換えることが できる ... はず。 確認のため、簡単なプログラムを 2つ つくってみた。


/* month_array.c */
#include

char *month_name();

main()
{
int i;

for (i = 0; i < 13; i++)
printf("%2d -> %s\n", i, month_name(i));

return 0;
}

char *month_name(int n)
{
static char *name[] = {
"Illigal month",
"January", "February", "March",
"April", "May", "June",
"July", "August", "September",
"October", "November", "December"
};

return (n < 1 || n > 12) ? name[0] : name[n];
}





/* month_view.c */
#include

char *month_name();

main()
{
int c;

printf("Input any number > ");
fscanf(stdin, "%d", &c);

printf("%d means %s\n", c, month_name(c));
if (c == 1)
puts("Hm, January is my birthday month ... Did you know? [N/n]");

return 0;
}

char *month_name(int n)
{
static char *name[] = {
"Illigal month",
"January", "February", "March",
"April", "May", "June",
"July", "August", "September",
"October", "November", "December"
};

return (n < 1 || n > 12) ? name[0] : name[n];
}