表示テーマ
Array — 配列
TL;DR
配列は同じ型の要素を連続して保持します。要素数は、配列そのものが見える場所で sizeof a / sizeof a[0] と計算できます。関数には先頭ポインタと要素数を一緒に渡します。対象はISO C99以降です。
Example
c
#include <stddef.h>
#include <stdio.h>
static int sum(const int *values, size_t count)
{
int total = 0;
for (size_t i = 0; i < count; ++i) {
total += values[i];
}
return total;
}
int main(void)
{
int values[] = {10, 20, 30};
size_t count = sizeof values / sizeof values[0];
printf("%d\n", sum(values, count)); /* 60 */
return 0;
}sum の前提は、values が少なくとも count 個の有効な要素を指し、合計が int の範囲内に収まることです。
Explanation
多くの式で配列は先頭要素へのポインタへ変換されます。ただし sizeof や単項 & のオペランドなどでは配列のまま扱われます。
関数の仮引数の int a[] はポインタ型へ調整されます。要素数の情報は自動では渡りません。配列自体はポインタ変数ではなく、配列全体への代入もできません。
Pitfalls
範囲外アクセス
要素数 count の配列の添字は 0 から count - 1 までです。ループ条件を i <= count にすると範囲外アクセスが発生します。Cは自動で境界検査しません。
int matrix[2][3] は「要素が3個の配列」が2個ある配列です。式中の先頭ポインタの型は int (*)[3] であり、int ** とは異なります。
Related
参考
C11委員会草案 N1570 §6.3.2.1、§6.7.6.2、§6.7.6.3。