C言語のおさらい 配列の考え方・使い方

配列とは

データ処理をしていくとき、同じ型の変数を複数まとめて用意しておくほうが、便利な場合がある。そういうときに使うのが「配列」である。
配列には「一次元配列」と「次元配列」がある。
配列を使ったプログラムを書いてみる。

一次元配列

一次元配列のイメージとして、このような表を作成すると思ったほうが良い。

               

Excelの一行分を作成して、それぞれ数値を代入できる変数を作成する感じ。

一次元配列の宣言

データ型 配列名[要素数];

配列を構成する一つ一つの変数を「配列要素」または「要素」という。
それぞれの要素を判別するために、「添え字」という先頭から何番目かを示すための数字を一緒に使う。

一次元配列を書いてみる

一次元配列を使ったプログラムを実際に書く。

#include <stdio.h> 
int main(void) {

 //変数の宣言
 int score[5];
 int ans;

 //入力
 printf("5教科の点数を入力する。\n");
 printf("国語の点数→");
 scanf("%d", &score[0]);
 printf("数学の点数→");
 scanf("%d", &score[1]);
 printf("理科の点数→");
 scanf("%d", &score[2]);
 printf("社会の点数→");
 scanf("%d", &score[3]);
 printf("英語の点数→");
 scanf("%d", &score[4]);

 //処理
 ans = score[0] + score[1] + score[2] + score[3] + score[4];

 //出力
 printf("5教科の合計点は%dです。\n", ans);

 return 0;
}

注意しなければならないのは、添え字が「0」から始まっていること。
添え字は「先頭から何番目かを示すもの」なので、先頭の要素は「先頭から0番目」になる。
したがって、要素数が「」の場合、添え字の最大数は「n-1」になる。

添え字の範囲は、プログラマが責任をもって確認する必要がある。

一次元配列の初期化

配列は初期値を設定できる。

データ型 配列名[要素数] = {初期値1, 初期値2 ・・・};


  • 初期値には、定数・文字などを使える。
  • {}を省略できない。
  • 途中の要素を飛ばして初期値を設定することはできない。ただし、途中までの要素に初期値を設定することができる。
実際に書いてみる。

#include <stdio.h> 
int main(void) {

 //変数の宣言
 int score[5] = { 78,65,88,93,60 };
 int ans;

 //入力

 //処理
 ans = score[0] + score[1] + score[2] + score[3] + score[4];

 //出力
 printf("5教科の合計点は%dです。\n", ans);

 return 0;
}

少ないときはこれでも問題ないが、要素数がふえるとやってられない。
なので、そういときはfor文を使って書くのが一般的。

#include <stdio.h> 
int main(void) {

 //変数の宣言
 int score[50];
 int i;

 //入力
 for (i = 0; i < 50; i++) {
  score[i] = 0;
 }

 //出力
 printf("初期値は%dに設定したよ。\n", score[0]);

 return 0;
}


二次元配列

二次元配列のイメージは、Excel表を作成するものとイメージしてよい。

二次元配列の宣言

データ型 配列名[要素数][要素数];

一番目に書かれた要素数がExcel表の行数になり、二番目に書かれた要素数が列数になる。

二次元配列を書いてみる

#include <stdio.h> 
int main(void) {

 //変数の宣言
 int score[2][4];

 return 0;
}

このような宣言がされたときは、こんな感じの表が作成されたイメージでよい。

                   
                   

二次元配列の初期化

二次元配列の初期値の設定は一次元配列とほぼ同じ。

データ型 配列名[要素数][要素数] = {{初期値1, 初期値2 ・・・},{初期値1, 初期値2・・・}};
データ型 配列名[要素数][要素数] = {{初期値1, 初期値2 ・・・},
       {初期値1, 初期値2 ・・・}};

一行にまとめて書いてもよいが、行を変えて見やすくするとよい。


#include <stdio.h> 
int main(void) {

 //変数の宣言
 int score[2][4] = { {1,2,3,4},{5,6,7,8} };

 //入力

 //出力
 printf("初期値は%dに設定したよ。\n", score[1][3]);

 return 0;
}

これも少ないときは問題ないが、多いときはfor文を使う。

#include <stdio.h> 
int main(void) {

 //変数の宣言
 int score[20][40];
 int i;
 int j;

 //入力
 for (i = 0; i < 20; i++) {
  for (j = 0; j < 40; j++) {
   score[i][j] = 0;
  }
 }

 //出力
 printf("初期値は%dに設定したよ。\n", score[19][39]);

 return 0;
}

二次元配列をfor文で初期化するときは、ネスト構造を使うとよい。

文字型配列

コンピュータ内部では、データをビット列として扱う。数値は2進数として、文字は文字コードとして扱われる。文字コードを表す1バイトのデータを格納するデータ型として使われるのがchar型。つまり、char型には文字を一つしか格納できない。なので、複数の文字(文字列)を扱うためには、char型の変数による「文字型配列」を使う。

文字型配列の宣言

文字型配列は、基本的に一次元配列と同じ。
データ型をint型からchar型にするだけ。

char 配列名[要素数] = "文字列";
  • 文字列を変数に代入するときは「"」で囲う。
  • 要素数は代入したい「文字列数+1」にする。

文字列終端コード(ヌル文字)

文字列数+1とする理由は、文字列終端コードというものを入れなければならないからである。
文字列終端コードは、「文字列の終わりを示す」という意味で、改行コードのように表示されない。
プログラム中では「\0」と表記する。
文字列終端コードは文字列を代入したときに、勝手に代入されることが多いので、あまり気にしなくてよい。

文字列配列を書いてみる

#include <stdio.h> 
int main(void) {

 //変数の宣言
 char moji[4] = "ABC";
 int i;

 //出力
 for (i = 0; i < 3; i++) {
  printf("文字%cの文字コードは%xです\n", moji[i], moji[i]);
 }

 return 0;
}

実行結果がこうなる。


まとめ

配列には、一次元配列、二次元配列、文字列配列の3種類ある。
数値の初期値の設定と文字列の初期値の設定では少し違うところがあるので注意する。





コメント

このブログの人気の投稿

STM32CubeIDEに日本語化プラグインを導入する

STM32F401でLチカをする(LED点灯)

STM32F401-Nucleoでシリアル通信をやってみる