C言語の配列の宣言・初期化・アクセス方法。メモリ配置も図解。
int a[5]; で要素数5の配列a[0] から a[4] まで (0始まり)int a[] = {1,2,3};int m[3][4]sizeof(a)/sizeof(a[0]) で要素数int a[5] = {10, 20, 30, 40, 50}; printf("%d\n", a[0]); // → 10 printf("%d\n", a[4]); // → 50
int a[5] の 5 は「要素数」であって、a[5] は配列に存在しない![5]: 要素「個数」を指定 → 5個分のメモリ領域を確保[ ]: 「何番目」を指定 → 0〜4 の範囲だけ有効a[0] から a[4] の5個だけ。宣言の 5 と末尾インデックスの 4 がズレることを体に叩き込みましょう。a[5] や a[100] を書いてもコンパイルエラーにならない(警告すら出ないことも)。実行時に別の変数を壊したり、Segmentation fault でクラッシュしたり、最悪は一見動いて後でバグが露呈します。i < 5 と書くのは「5未満 = 0〜4」で範囲内にするため。i <= 5 だと a[5] に触れて破綻します(off-by-one エラーの定番)。
| 変数名 | 型 | 値 |
|---|
型名 配列名[行数][列数]; で宣言します。// 3行×4列の2次元配列 int matrix[3][4] = { {1, 2, 3, 4}, // 0行目 {5, 6, 7, 8}, // 1行目 {9, 10, 11, 12} // 2行目 };
matrix[1][2] は「1行目の2列目」= 7 です。for (int i = 0; i < 3; i++) { // 行 for (int j = 0; j < 4; j++) { // 列 printf("%3d", matrix[i][j]); } printf("\n"); }
void func(int m[][4], int rows) のように列数を指定する必要があります。80+65+92+78+88 = 403、真の平均は 403 ÷ 5 = 80.6 です。int / int → int)。
double avg = (double)sum / 5; のように片方を double にキャストしてから割る。printf("平均点 = %.1f\n", avg);(%.1f で小数1桁)。
double と (double)sum キャストで真の平均 80.6 を出してみるこの講座の理解度をチェックしましょう!
a[5] は a[0]〜a[4] の5個の要素を持つ配列です。
C言語の配列インデックスは常に 0 から始まります。a[5] なら a[0] が最初の要素です。
部分的に初期化した場合、残りの要素は 0 で初期化されます。a[2] は 0 です。