C 配列
C 言語は配列データ構造をサポートしています。これは固定サイズの同じ型の要素の順序集合を格納できます。配列は一連のデータを格納するために使われますが、しばしば同じ型の変数の集まりと見なされます。
配列の宣言は、サンプル0、サンプル1、...、サンプル99 のような個別の変数を宣言するのではなく、サンプル のような配列変数を宣言し、サンプル
すべての配列は連続したメモリ位置で構成されています。最も低いアドレスが最初の要素に対応し、最も高いアドレスが最後の要素に対応します。

配列内の特定の要素はインデックスでアクセスでき、最初のインデックス値は0。
C 言語ではポインタを使って配列を操作することもでき、配列の操作がより柔軟で効率的になります。

配列の宣言
C で配列を宣言するには、要素の型と要素の数を指定する必要があります。以下に示します:
type arrayName [ arraySize ];
これは1次元配列と呼ばれます。arraySize0より大きい整数定数でなければなりません。type任意の有効な C データ型を使用できます。例えば、double 型の10個の要素を含む配列を宣言するにはbalance、宣言文は次のとおりです:
double balance[10];
これでbalanceは利用可能な配列であり、double 型の10個の数値を格納できます。
配列の初期化
C では、配列を1つずつ初期化することも、次のような初期化文を使用することもできます:
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
中括弧 { } 内の値の数は、配列宣言時に角括弧 [ ] で指定した要素数より大きくすることはできません。
配列のサイズを省略した場合、配列のサイズは初期化時の要素数になります。したがって、次の場合:
double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
前の例で作成した配列とまったく同じ配列が作成されます。次に、配列内の特定の要素に値を代入する例を示します:
balance[4] = 50.0;
上記の文は、配列の5番目の要素の値を50.0に設定します。すべての配列は、最初の要素のインデックスとして0を使用します。これは基本インデックスとも呼ばれます。配列の最後のインデックスは、配列の合計サイズから1を引いたものです。以下は、上で説明した配列の図による表現です:

下図は長さ10の配列で、最初の要素のインデックス値は0、9番目の要素サンプルのインデックス値は8:
配列要素へのアクセス
配列要素は、配列名とインデックスを使ってアクセスできます。要素のインデックスは角括弧内に置き、配列名の後ろに続けます。例:
double salary = balance[9];
上記の文は、配列の10番目の要素の値を salary 変数に代入します。次の例では、宣言、配列への代入、配列へのアクセスという上記の3つの概念を使用しています:
例
上記のコードをコンパイルして実行すると、次の結果が生成されます:
Element[0] = 100 Element[1] = 101 Element[2] = 102 Element[3] = 103 Element[4] = 104 Element[5] = 105 Element[6] = 106 Element[7] = 107 Element[8] = 108 Element[9] = 109
配列の長さを取得
配列の長さはsizeof演算子を使用して取得できます。例:
int numbers[] = {1, 2, 3, 4, 5};
int length = sizeof(numbers) / sizeof(numbers[0]);
例
int main() {
int array[] = {1, 2, 3, 4, 5};
int length = sizeof(array) / sizeof(array[0]);
printf("配列の長さ: %d\n", length);
return 0;
}
マクロ定義を使用:
例
#define LENGTH(array) (sizeof(array) / sizeof(array[0]))
int main() {
int array[] = {1, 2, 3, 4, 5};
int length = LENGTH(array);
printf("配列の長さ: %d\n", length);
return 0;
}
上記の例の出力結果は次のとおりです:
数组长度为: 5
配列名
C 言語では、配列名は配列のアドレス、つまり配列の先頭要素のアドレスを表します。配列を宣言して定義するとき、その配列名はその配列のアドレスを表します。
例えば、次のコードでは:
int myArray[5] = {10, 20, 30, 40, 50};ここで、myArray は配列名であり、5つの要素を含む整数型の配列を表します。myArray は配列のアドレス、つまり最初の要素のアドレスも表します。
配列名自体は定数ポインタであり、その値は変更できないことを意味します。一度確定すると、他の場所を指すことはできません。
& 演算子を使用して配列のアドレスを取得できます。次のようにします:
int myArray[5] = {10, 20, 30, 40, 50};
int *ptr = &myArray[0]; // 或者直接写作 int *ptr = myArray;上記の例では、ptr ポインタ変数は myArray のアドレス、つまり配列の最初の要素のアドレスに初期化されています。
注意すべき点は、配列名が配列のアドレスを表すとはいえ、ほとんどの場合、配列名は自動的に配列の先頭要素を指すポインタに変換されることです。つまり、関数に引数を渡すときや配列を反復処理するときなどに、配列名を直接ポインタ演算に使用できるということです:
例
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]); // 配列名 arr はポインタとして使用される
}
}
int main() {
int myArray[5] = {10, 20, 30, 40, 50};
printArray(myArray, 5); // 配列名を関数に渡す
return 0;
}
上記のコードでは、printArray 関数は整数配列と配列サイズを引数として受け取ります。myArray 配列名を関数に渡すと、関数内部では arr 配列名をポインタのように使用できます。
C における配列の詳細
C では、配列は非常に重要です。配列に関する詳細をより深く理解する必要があります。以下に、C プログラマーが必ず理解しておくべき配列に関連する重要な概念を示します:
| 概念 | 説明 |
|---|---|
| 多次元配列 | C は多次元配列をサポートしています。多次元配列の最も単純な形式は2次元配列です。 |
| 関数への配列の受け渡し | インデックスを付けない配列名を指定することで、配列を指すポインタを関数に渡すことができます。 |
| 関数から配列を返す | C では、関数から配列を返すことができます。 |
| 配列を指すポインタ | インデックスを付けない配列名を指定することで、配列の最初の要素を指すポインタを生成できます。 |
| 静的配列と動的配列 | 静的配列はコンパイル時にメモリが割り当てられ、サイズは固定です。一方、動的配列は実行時に手動でメモリが割り当てられ、サイズは変更可能です。 |