Skip to content

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 ** とは異なります。

参考

C11委員会草案 N1570 §6.3.2.1、§6.7.6.2、§6.7.6.3。