すらいむLv1024@wiki

配列

最終更新:

slimelv1024

- view
メンバー限定 登録/ログイン

配列とは

仮に学生番号を入れる変数を生徒の人数分作るとします
1人2人ならいいですが、これが100人だったらとても手打ちする気にはなれません
このような同じ型で同じ目的を持つ変数をまとめて扱うもの配列といいます


配列の扱い

配列の宣言

 型名 配列名[要素数]

変数同様、配列もはじめ宣言しなければ使えません
配列の宣言をすると、配列名[0],配列名[1]・・・配列名[要素数-1]と宣言された要素数の数だけデータを格納する領域が作られます
この[]の中の数字のことを添字といいます
配列も変数同様、宣言だけでは中は不定値が入っています


配列の初期化

 ①int data1[5]={1,2,3,4,5};
 ②int data2[5]={1,2,3};
 ③int data3[5]={0};
 ④int data4[]={1,2,3}
 ⑤double data5[5]={1.1,2.2,3.3,4.4,5.5};
 
 ⑥int data6[];
 ⑦int data7[3]={1,2,3,4,5];
 ⑧double data8[3];
 data8={1.1,2.2,3.3};

① 要素数を宣言し、要素数いっぱいに初期化子を与える
② 要素数を宣言し要素数より少なく、初期化子を宣言します
  足りない分はすべて0で補われる
③ ②の応用で足りない分はすべて0で補われることから、初期化子を{0}で設定することですべて0で初期化することが出来る
④ 初期化子がある場合は要素数を省略することが出来ます
  この場合、要素数は必然的に3になります
⑤ 小数も同じ要領で初期化することが出来ます

⑥ 初期化子が無くて、要素数を省略することは出来ません
⑦ 要素数を超える初期化子の設定は出来ません
⑧ 宣言時以外にまとめての代入は出来ません


配列データの操作

配列データには添字で直接指定してデータにアクセスします
もし要素数を超えた添字を指定したとしてもエラーは出ません
しかし、その場合配列以外のデータにアクセスしています
そのエリアがプログラムに必要なデータを格納してるエリアである可能性もあります
そのエリアを書き換えたとしたら、やっぱりプログラムは動きません

配列のデータをまとめて操作したい場合はループ処理を用いる
 int kuku[9];
 int i;
 
 for(i=1;i<=9;i++){
  kuku[i-1]=i*5;  //配列に五段を入れる
 }
 
 printf("五の段の九九を表示します\n");
 for(i=1;i<=9;i++){  
  printf("3*%d=%d\n",i,kuku[i-1]); //配列の要素を一つずつ表示
 }

sizeof演算子

配列のサイズを求めるとき使う演算子です
 int data[20];
 printf("配列dataのサイズは%dです\n",sizeof(data));


文字列とは

文字列とは一般的に複数の文字の列です
中には文字列の型があるプログラムもありますが、C言語には文字列を扱う型がありません
C言語で文字列を扱う場合は文字型の配列を使います


文字列の扱い

文字列の初期化

 char 配列名[要素数]={'文字'・・・'\0'}
 char 配列名[要素数]="文字列";
前者の文字列の初期化方法は数値の配列と変わりません
最後の\0は文字列の終了を示す特別なコードです
説明は後ほどします

後者は文字列にのみ使える初期化方法で、前者と違いまとめての代入が可能です
後者の方法では\0を記述しなくても、コンパイラが自動で\0を付加してくれます


終了コード

文字列の最後には必ず\0が付きます
これを終了コード又はNULL文字といいます

何故文字列には終了コードが付くのかというと、文字というのも機械にとっては数字の集まりと変わりません
配列は宣言時の中身は不定値です
もし何かの文字と同じコードになったとしたら、それが文字なのか、不定値なのかの判断が付きません
そのため、文字列の終わりを示す終了コードが必要です
また、要素数には\0も含めることを念頭において置いてください


文字列の操作

文字列は初期化子以外ではまとめての代入処理を行うことが出来ません
文字を配列に一つずつ代入するか、strcpy関数を用います
又、ポインタの項で詳しく説明する方法では、文字列をまとめて書き換えることが可能ではあります

文字列の表現は三通りあります
一つ目は配列と同様ループでひとつずつ表示する方法です
 char name[7]="TANAKA";
 int i;
 
 for(i=0;i<7;i++){
  printf("%c",name[i]);
 }

しかし、これだと文字列を表示するためには毎回ループ文を書かなければいけないので、少し面倒です
もうひとつの方法は配列名を指定してあげることでまとめて表示すること出来ます
 char name[7]="TANAKA";
 printf("%s",name);
  又は
 puts(name);

文字列の表示処理は大体こちらの二つの方法を取ります

多次元配列

今まで扱ってきた配列のことを一次元配列といい、表にすると一方に並んでるいるものを想像してください
1 2 3 4 5

二次元以上の配列を多次元配列といいます
二次元配列は縦方向と横方向の二つの方向に伸びる表を想像してください
00 01 02 03 04
10 11 12 13 14
20 21 22 23 24


二次元配列の操作

二次元配列の宣言

 型名 配列名[行の要素数][列の要素数];
基本的には一次元配列と一緒ですが、二次元なので行と列の二つの要素数が必要です


二次元配列の初期化

 ①int data1[2][3]={1,2,3,4,5,6};
 ②int data2[2][3]={{1,2,3},
           {4,5,6}};
 ③int data3[][3]={{1,2,3},
          {4,5,6}};
 ④int data4[2][3]={1,2,3};
 ⑤int data5[2][3]={{1,2},
           {3}};
 
 ⑥int data6[2][]={{1,2,3},
          {4,5,6}};
 ⑦int data7[][]={{1,2,3},
          {4,5,6}};
 ⑧int data8[2][3]={1,2,3,4,5,6,7};
 ⑨int data9[2][3]={{1,2},
           {3,4},
           {5,6};

① 一次元配列同様カンマ(,)で区切って要素数いっぱいに初期化子を与える
② 二次元配列ではこの初期化の形が一般的で、行に対応させて{}区切って初期化子を与える
③ 多次元配列において先頭の要素数は省略することが出来ます
④ 一次元配列同様0で補われますが、この場合の要素の不足分は{1,2,3,0,0,0}で補われます
⑤ 一次元配列同様0で補われますが、この場合の要素の不足分は{{1,2,0},{3,0,0}}で補われます

⑥⑦ 多次元配列では先頭の要素数以外は省略できません
⑧ 要素数を超える初期化子の設定は出来ません
⑨ 次元の要素数が異なると、{{1,2,0},{3,4,0},{5,6,0}}と解釈され要素数より多いのでエラーとなります


二次元配列の操作

一次元配列同様添字を指定してあげて操作してあげます
注意点も同じで要素数を超えたデータの指定は厳禁です

二次元配列のデータまとめてまとめて操作したい場合は2重ループを行います
 int kuku[9][9];
 int i,j;
 
 for(i=1;i<9;i++){
  for(j=1;j<=9;j++){
   kuku[i-1][j-1]=i*j;   //九九を作成
  }
 }
 
 printf("九九を表示します\n");
 for(i=1;i<9;i++){
  for(j=1;j<=9;j++){
   printf("%d*%d=%d",i,j,kuku[i-1][j-1]); //九九を一から表示
  }
  printf("\n");
 }


二次元配列と文字列

複数の文字列を扱うときにも二次元配列が使えます
 char name[3][7]={"TANAKA",
          "SATOU",
          "SUZUKI"};
 printf("%s",name[0]);
 printf("%s",name[1]);
 printf("%s",name[2]);

文字列の表示のときは配列名だけで表示できていましたが、今回は配列名と行要素を指定しています
これにはアドレスというものが密接に関わってくるのですが、詳しいことはポインタの項でやります
配列の扱いについては、文字列になってもほとんど一緒です
目安箱バナー