配列の初期化
いろんな型の初期化
配列も変数同様に、宣言と同時に初期化することができます
初期化することによって、ソース記述の負担や可読性を効率よく上げることができます
配列の初期化には { } を使ったリストを使います
型 変数名[サイズ] = { 値1 , 値2 , 値n...};
{ } の中のリストは、値を要素ごとにカンマ 「 , 」で区切ります
リストの中の一番左を要素番号0番として、順に各要素に代入されます
#include <stdio.h>
int main()
{
int ary[5] = { 1 , 10 , 100 , 1000 , 10000};
int count;
for(count = 0 ; count <= 4 ; count++)
printf("要素番号ary[%d] = %d\n" , count , ary[count]);
return 0;
}
結果は次のように出力されます
要素番号ary[0] = 1
要素番号ary[1] = 10
要素番号ary[2] = 100
要素番号ary[3] = 1000
要素番号ary[4] = 10000
リストの値が配列に初期値として与えられているのがわかりますね
もちろん浮動小数点でも同じことですが、文字の場合は2種類の初期化方法があります
ひとつは数値定数同様に { } で囲み、文字キャラクタとして初期化する方法です
#include <stdio.h>
int main()
{
char str[17] = {'k','i','t','t','y',' ','o','n',' ','y','o','u','r',' ','l','a','p'};
int count;
for (count = 0 ; count <= 16 ; count++) printf("%c",str[count]);
return 0;
}
なんかうぎゃ〜って感じですね
これは1文字として初期化する方法です。文字列として扱う場合は不向きです
文字配列に文字列が含まれる場合は、ダブルクォーテーションで囲んで初期化することができます
これは2バイト文字(日本語など)を代入することもできます
ただし2バイト文字は当然1文字表現するのに2バイト使うことを忘れないで下さい
つまり2要素分の領域を使って1文字表現するということになります
ヌル文字の領域を計算する時などに注意してください
#include <stdio.h>
int main()
{
char str[17] = "ひざの上の同居人";
printf("%s",str);
return 0;
}
文字列の場合は中括弧で囲まないことに注意して下さい
さらに、文字列を表現する場合の配列は文字列+ヌル文字分の領域を確保することも大切です
多次元配列の初期化の場合も基本は同じです
数値の場合はリストを改行して次のように初期化します
最初の行から1次元の0要素より順に、横の列が2次元です
#include <stdio.h>
int main()
{
int count1 = 0;
int count2 = 0;
int ary[3][3] = {
1 , 5 , 10 ,
50 , 100 , 500 ,
1000 , 5000 , 10000
};
while(1) {
printf("ary[%d][%d] = %d\n" , count1 , count2 , ary[count1][count2]);
count2++;
if (count2 == 3) {
count1++;
count2 = 0;
}
if (count1 == 3) break;
}
return 0;
}
結果は次のようになります
ary[0][0] = 1
ary[0][1] = 5
ary[0][2] = 10
ary[1][0] = 50
ary[1][1] = 100
ary[1][2] = 500
ary[2][0] = 1000
ary[2][1] = 5000
ary[2][2] = 10000
サイズのない配列
配列を初期化する場合、宣言時にサイズの指定を省略することができます
サイズを省略した場合は、初期化時に与えられた要素の数に合わせてメモリ領域が割り当てられます
ただし省略する場合でも次元数分の [ ] は記述する必要があります
int ary[] = { ... };
サイズのない配列は、要素数の数え間違いによる不要なエラーを避けられます
文字列の初期化では多用されます
#include <stdio.h>
int main()
{
char str[] = "kitty on your lap";
printf("%s",str);
return 0;
}
この場合は自動的にヌル文字分の領域も確保されます、そのためヌル文字を入れる必要はありません
サイズのない配列はchar型だけではなく、整数などでも使えます
基本的な条件は文字列と同じです
#include <stdio.h>
int main()
{
int ary[] = { 10 , 100 , 1000 } ;
printf("%d\n%d\n%d" , ary[0] , ary[1] , ary[2]);
return 0;
}
多次元配列の場合では、1次元配列のみを省略できます
つまり次元の一番左側だけが省略可能であるということです
#include <stdio.h>
int main()
{
int ary[][2] = {
10 , 100 ,
1000 , 1000
} ;
printf("%d\n%d\n" , ary[0][0] , ary[0][1]);
printf("%d\n%d", ary[1][0] , ary[1][1]);
return 0;
}