Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
配列(1次元・多次元)
同じ型のデータを連続したメモリ領域に並べたデータ構造です。インデックス(添字)で各要素にアクセスします。1次元配列のほか、表形式のデータを扱う多次元配列も使えます。
構文
// 1次元配列の宣言です。
型 配列名[要素数];
// 宣言と同時に初期化します。
型 配列名[要素数] = {値1, 値2, 値3};
// 要素数を省略して初期化子から自動決定します。
型 配列名[] = {値1, 値2, 値3};
// 要素へのアクセスです(インデックスは0始まり)。
配列名[インデックス];
// 2次元配列の宣言と初期化です。
型 配列名[行数][列数] = {{値, 値}, {値, 値}};
配列の特徴
| 特徴 | 概要 |
|---|---|
| インデックスは0始まり | 最初の要素のインデックスは0、最後の要素は『要素数 - 1』です。 |
| メモリの連続性 | 配列の要素はメモリ上に連続して配置されます。ポインタ演算でアクセスできます。 |
| 固定サイズ | 宣言時にサイズが決まり、実行中に変更できません。可変サイズが必要な場合は動的メモリを使います。 |
| 配列名はアドレス | 配列名は先頭要素のアドレスを表します。関数に渡すとポインタに変換されます。 |
| 文字列は char 配列 | 文字列は『char』の配列で表現し、末尾にヌル文字('\0')が置かれます。 |
サンプルコード
#include <stdio.h>
int main(void) {
// 1次元配列の宣言と初期化です。
int scores[5] = {80, 75, 90, 65, 88};
// インデックスで各要素にアクセスします。
printf("最初の要素: %d\n", scores[0]); // 『80』と出力されます。
printf("最後の要素: %d\n", scores[4]); // 『88』と出力されます。
// for ループで全要素を処理します。
int sum = 0;
for (int i = 0; i < 5; i++) {
sum += scores[i];
}
printf("合計: %d\n", sum); // 『合計: 398』と出力されます。
printf("平均: %.1f\n", (double)sum / 5); // 『平均: 79.6』と出力されます。
// 要素数は sizeof で求めます。
int count = sizeof(scores) / sizeof(scores[0]);
printf("要素数: %d\n", count); // 『要素数: 5』と出力されます。
// 文字列は char 配列で表現します。
char name[] = "Taro";
printf("名前: %s\n", name); // 『名前: Taro』と出力されます。
printf("文字数: %zu\n", sizeof(name) - 1); // ヌル文字を除いた文字数です。
// 2次元配列の宣言と初期化です。
int matrix[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
// ネストしたループで全要素を表示します。
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
// 出力: 1 2 3 / 4 5 6
return 0;
}
概要
C言語の配列はバウンダリチェック(範囲検査)を行いません。配列の範囲外にアクセスすると未定義動作が発生し、プログラムがクラッシュしたり、別のメモリ領域のデータを破壊したりします。インデックスが常に有効な範囲内に収まるよう注意してください。
配列とポインタは密接な関係にあります。『scores[i]』は『*(scores + i)』と等価です。配列を関数に渡す際の扱いについては『ポインタと配列』を参照してください。
実行時にサイズを決めたい場合は動的メモリ確保(『malloc()』)を使用してください。C99以降では可変長配列(VLA)も使えますが、スタックオーバーフローのリスクがあるため大きなサイズには使わないでください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。