通常1つの変数に対して値は1つですが、配列を使用することで複数の値を1つの変数で管理することができます。
配列を使用する場合、次のように宣言します。
データ型 配列名[要素の数];
また宣言と同時に初期化するには次のようになります。
データ型 配列名[要素の数n] = { 値1, 値2, 値3, ..., 値n };
または要素数を省略して
データ型 配列名[] = { 値1, 値2, 値3, ..., 値n };
(例)int型配列で配列名をarrayとし、100, 200, 300の3つの値で初期化するとき
int array[3] = {100, 200, 300};
配列の各要素は次のように指定します。
配列名[添え字];
(例)値の代入と取り出し
int array[3]; int x; /* 値の代入 */ array[0] = 10; array[1] = 20; array[2] = 30; /* 値の値の取り出し */ x = array[1];
※添え字は0からはじまる事に注意してください。また配列要素を超えた配列アクセスはシステム破壊につながることにもなりかねないので充分注意してください。
配列の中に更に配列を入れる事によって多次元配列を作成する事が出来ます。
多次元配列の宣言は次のように行います。
データ型 配列名[要素の数][要素の数]・・・
また初期化を行う場合は次のようになります。
データ型 配列名[要素の数][要素の数] ・・・= {{値11, 値12, ・・・}, {値21, 値22, ・・・}, ・・・};
二次元配列の例を次に示します。
・サンプル(sample0501.c)
#include <stdio.h> int main() { int intary[3][3] = {{11, 12, 13}, {21, 22, 23}, {31, 32, 33}}; int i,j; for (i=0; i<3; i++) { for (j=0; j<3; j++) { printf("[%d,%d] = %d ", i, j, intary[i][j]); } printf("\n"); } return 0; }
・実行結果
C:\dev\c>sample0501 [Enter]
[0,0] = 11 [0,1] = 12 [0,2] = 13
[1,0] = 21 [1,1] = 22 [1,2] = 23
[2,0] = 31 [2,1] = 32 [2,2] = 33
C言語には文字列を取り扱う型は存在しません。char型の配列として使用します。
char型の配列を文字列で初期化します。
char string1[] = "ABC"; char string2[] = "あいう";
またはポインタを使用して
char *string1 = "ABC"; char *string2 = "あいう";
文字列で初期化した配列は次のように文字を格納します。
配列の最後に格納されている「\0」はNULL文字とよばれ文字列の終端を表すエスケープシーケンスです。文字列で初期化した場合には自動的に格納されます。したがって配列の要素数は「文字数+1」となります。
文字列操作を行うにあたって次の点に注意する必要があります。
配列の変数に対して、初期化のとき意外は値を代入できません。したがって次のように記述するとコンパイルエラーとなります。
・(例)配列変数に文字列を代入 - 間違った例 -
#include <stdio.h> int main() { char string1[4]; string1 = "ABC"; /* 配列への代入 */ printf("string1 = %s\n", string1); return 0; }
・コンパイル
C:\dev\c>bcc32 sample0502.c [Enter] Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland sample0502.c: Error E2277 sample0502.c 6: Lvalue required in function main *** 1 errors in Compile *** ← コンパイルエラー
配列変数への文字列代入は「strcpy()」を使用します。
・(例)配列変数に文字列を代入 - 正しい例 -(sample0502.c)
#include <stdio.h> #include <string.h> /* strcpy()関数の定義 */ int main() { char string1[4]; strcpy(string1,"ABC"); /* 配列への代入 */ printf("string1 = %s\n", string1); return 0; }
※コピー先(string1)の領域確保には十分注意してください。
・実行結果
C:\dev\c>sample0502 [Enter]
string1 = ABC
配列変数同士で「==」のような比較演算子が使えないのと同様に文字列の比較を行う場合も「==」を使用することは出来ません。使用してもコンパイルエラーにはなりませんが、文字列の先頭アドレスが比較されることになり正しい評価が行えません。
・(例)文字列の比較 - 間違った例 -
#include <stdio.h>
int main() {
char string1[] = "ABC";
if (string1 == "ABC") {
printf("string1 == %s 同じ文字!\n", string1);
}else {
printf("string1 == %s 違う文字!\n", string1);
};
return 0;
}
・実行結果
C:\dev\c>sample0503 [Enter] string1 == ABC 違う文字! ← 文字列は同じはずなのに・・・
文字列の比較は「strcmp()」を使用します。
・(例)文字列の比較 - 正しい例 -(sample0503.c)
#include <stdio.h> #include <string.h> /* strcmp()の定義 */ int main() { char string1[] = "ABC"; if (strcmp(string1, "ABC") == 0) { printf("string1 == %s 同じ文字!\n", string1); }else { printf("string1 == %s 違う文字!\n", string1); }; return 0; }
・実行結果
C:\dev\c>sample0503 [Enter] string1 == ABC 同じ文字! ← 正しく評価されている