記事には広告を含む場合があります。

C言語入門講座

【C言語】配列とは?宣言・初期化・代入方法、2次元配列、文字列を解説

2022年5月29日

おゆ

組み込み系プログラマとして5年働いていた元エンジニアです。得意言語はC言語とC++。本サイトでは学生および新人組み込み系プログラマに向けてプログラミング知識をわかりやすく解説しています。

配列は数字や文字列をひとまとめにして扱うことのできる便利な機能です。

例えば生徒30人分のテストの点を管理したい時、「int score1=80, score2=60,...」のように30個の変数を作るのは大変ですよね。

配列なら1つの配列でまとめて管理できます。

配列はC言語やC++のプログラムでは非常によく使われる機能です。

記事の内容

  • 配列とは
  • 配列の宣言・初期化・printfでの出力・値の代入方法
  • 多次元配列とは

配列とは文字や数字をまとめて扱う変数

配列とは複数の数字や文字をまとめて保存しておくためのものです。

通常の変数は「int a=0;」や「char c="A";」のように1つの変数に1つの値を格納するものでした。

しかしこれでは「Hello」のように複数の値が集まった変数を扱えません。

おゆ
配列を使わないと「char h="H";」「char e="e";」…のように1文字あたり1つの変数を使うことになり面倒です。

このような文字や数字のまとまりを扱うのに適しているのが配列です。

例えば配列を「char s[]="Hello";」のように宣言するとsという配列に「Hello」という文字をまとめて格納できます。

同じ配列には同じデータ型の値のみ格納できます。

配列の宣言

配列の宣言方法

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

値1つ1つを要素といい、要素の数を要素数と呼びます。

要素数は大カッコ[ ]で囲んで配列名の後ろに書きます。

例:

int num[3]; //整数要素3つの配列
char chara[5]; //要素6つの文字列

配列の初期化

配列の初期化方法

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

要素を{ }内で囲い、カンマ「,」で区切って1つずつ書きます。

任意の値で初期化する方法

数字の配列

例:

int num1[3]={1,2,3};
int num2[]={1,2,3};

配列の要素数を指定しない場合は初期値に応じて自動的に割り当てられます。

そのためnum1とnum2は全く同じ値になります。

num1のイメージはこちら。
配列のイメージ

0番目から2番目までの3つの要素からなり、それぞれに初期値が入っています。

大カッコ[ ]内の番号は何番目の要素かを表しています。

要素数は3ですが、0始まりなのでnum1[3]はありません

ちなみに指定した要素数より少ない数の初期値でも初期化できます。

例:

int num[5]={1,2,3}; //要素数は5、初期値は3つ

初期値を指定していない要素には0が入ります。

指定した要素数を超える数の初期値は代入できません。

文字列

例:

char chara1[6]={'H','e','l','l','o','\0'}; //シングルクォーテーションを使う
char chara2[]="Hello"; //ダブルクォーテーションを使う

文字列の初期化方法も2つあり、chara1とchara2には全く同じ値が入ります。

chara1のように1文字ずつ代入する場合は文字をシングルクォーテーション「'」で囲みます。

「\0」はNULL文字と呼ばれるもので、「ここが文字列の終端ですよ」という意味で、文字列の最後にはNULL文字を付ける決まりになっています。

NULL文字の分要素数が1つ増える点に注意です。

実はNULL文字を使わずに「char chara[5]={'H','E','L','L','O'};」と書いてもエラーは出ず、実行結果も変わりません。しかし後々予想不可能なエラーが出る可能性があります。必ず正しい方法で初期化してください。

chara2のように文字をまとめて代入する場合はダブルクォーテーション「"」で囲みます。

この場合は最後の要素に自動でNULL文字が入ります。

要素をすべて0で初期化する方法

以下のように書くと配列の要素をすべて0で初期化できます。

例:

int num[3]={};

配列をprintfで出力

例:

#include <stdio.h>
void main()
{
    int num[]={1,2,3};
    printf("num=%d, %d, %d\n",num[0],num[1],num[2]);

    char chara[]="Hello";
    printf("chara=%c%c%c%c%c\n",chara[0],chara[1],chara[2],chara[3],chara[4]);
    printf("chara=%s\n",chara);
}

実行結果

num=1, 2, 3
chara=Hello
chara=Hello

要素を1つずつ指定して出力する場合、フォーマット指定子は変数を出力するときと同じです(整数なら%d、文字なら%c)。

表示したい値は配列名と要素番号を指定してnum[0]のように書きます。

文字列の場合は最後のprint文のようにフォーマット指定子を%sにし、配列名を指定すれば配列の要素を一気に出力することもできます。

配列への値の代入

配列を宣言した後に値を代入したいときは以下のように要素番号を指定して値を1つだけ代入します。

#include <stdio.h>
void main()
{
    int num[3];
    char chara[6]="Hello";

    num[0]=1; //代入
    num[1]=2;
    num[2]=3;
    chara[0]='h';

    printf("num=%d, %d, %d\n",num[0],num[1],num[2]);
    printf("chara=%s",chara);
}

実行結果

num=1, 2, 3
chara=hello

同じようにして既に代入されている値の更新もできます。

おゆ
初期化でやったように中カッコ{ }で一度に値を代入することはできません。あれの方法は初期化でのみ使えます。

多次元配列(2次元配列、3次元配列など)

多次元配列とは

上で紹介した配列は1次元の配列ですが、2次元の配列も作れます。

2次元配列ではnum[1][2]のように要素番号を2つ書きます。

同様に3次元配列(例:num[2][3][3])、4次元配列(例:num[2][3][3][2])のように好きなだけ次元を増やせます。

ただし次元を増やすと要素数が増えてデータ量が巨大になりますし、管理が大変になってくるので極力増やし過ぎないのが無難です。

数字の配列

上の図に示した2次元配列は以下のように記述できます。

例:

#include <stdio.h>
void main()
{
    int num[3][3]={{1,2,3},{4,5,6},{0,0,0}}; //初期化(num[][3]と書いてもOK)
    num[2][0]=7; //代入
    num[2][1]=8;
    num[2][2]=9;
    printf("%d, %d, %d\n",num[0][0],num[0][1],num[0][2]);
    printf("%d, %d, %d\n",num[1][0],num[1][1],num[1][2]);
    printf("%d, %d, %d\n",num[2][0],num[2][1],num[2][2]);
}

実行結果

1, 2, 3
4, 5, 6
7, 8, 9

1つ目の要素数は行、2つ目は列を表します。

宣言は行数を省略してnum[][3]と書いてもOKです。

その場合、行数には初期値に応じた値(上の例では3)が割り当てられます。

文字列

文字列の2次元配列の場合は以下のように初期化、出力できます。

例:

#include <stdio.h>
void main()
{
    char country[3][10]={"Japan","America","China"}; //初期化
    printf("%s, %s, %s\n",country[0],country[1],country[2]);
}

実行結果

Japan, America, China

配列countryの行数(3)は格納する文字列の数、列数(10)は文字数の最大値です。

各列にはアルファベットが1文字ずつ格納され、それ以外にはNULL文字「\0」が入ります。
文字列

宣言は行数を省略してcountry[][10]と書いてもOKです。

行数には初期値に応じた値(上の例では7)が割り当てられます。

列数は省略できません。

出力時は行番号のみ指定すればその行に格納されている文字がすべて出力されます。

まとめ

配列はC言語やC++でプログラミングする際によく使われます。

使い方は難しくないので必要に応じて積極的に使ってみてください。

配列の応用的な使い方は以下の記事で解説しています。

配列の応用

【C言語】配列の長さ(要素数)取得方法・配列のコピー方法まとめ

配列を使っているとfor文で列の長さ分だけループさせたい場合や、配列のコピーを作りたい場合があります。 それらの方法を解説します。 記事の内容 配列の長さ(要素数)を求める方法 配列をコピーする方法 ...

続きを見る

C言語で行き詰まったら…

C言語・C++がわからない時に質問できるサイト・サービス5選

C言語を独学で勉強しているけど内容がイマイチわからない。もはや何がわからないのかもわからない。 C++のエラーが解決できない。ググってもわからない。わかる人に解説してほしい。 こんなお悩みにお答えしま ...

続きを見る

ブログランキング参加中。クリックしてもらえると励みになります。

ブログランキング・にほんブログ村へ

-C言語入門講座