【初心者向け】C言語における1次元配列と2次元配列の処理をわかりやすく解説
まずは、C言語における1次元配列の基本的な処理方法から理解していきましょう。
1次元配列の処理
値の読み込み(格納)
1次元配列に値を格納する(読み込む)場合は、for文と組み合わせて次のように記述します。
int num[5];
int i;
for(i = 0; i < 5; i++){
scanf("%d", &num[i]);
}
値の書き出し(取得)
逆に、配列に格納された値を取り出して表示する(書き出す)場合は、次のように記述します。
int num[5];
int i;
for(i = 0; i < 5; i++){
printf("%d", num[i]);
}
このように、添字(インデックス)をループカウンタで制御することで、配列全体へのアクセスを簡潔に実現できます。
サンプルプログラム1:配列の要素を逆順に表示する
以下は、ユーザーが入力した配列の要素を逆順に表示するCプログラムです。
#include<stdio.h>
void main(){
// 配列の宣言(実行時に入力)
int array[5], i;
// 配列への要素の読み込み
printf("配列に要素を入力してください:\n");
// for文による繰り返し
for(i = 0; i < 5; i++){
// ユーザー入力の受け付け
printf("array[%d] :", i);
scanf("%d", &array[i]);
}
// 配列の要素を逆順に表示
printf("配列の要素を逆順に表示します:\n");
for(i = 4; i >= 0; i--){
// 結果の出力
printf("array[%d] :", i);
printf("%d\n", array[i]);
}
}
実行結果
上記のプログラムを実行すると、次のような結果が出力されます。
配列に要素を入力してください: array[0] :1 array[1] :2 array[2] :3 array[3] :4 array[4] :5 配列の要素を逆順に表示します: array[4] :5 array[3] :4 array[2] :3 array[1] :2 array[0] :1
ポイントは、2つ目のfor文でカウンタ変数 i を「4」から「0」へ減算しながらループさせている点です。これにより、配列の末尾から先頭へと順に要素を取り出せます。
2次元配列の処理
続いて、2次元配列(行列形式のデータ)の処理を見ていきましょう。2次元配列では、for文を入れ子(ネスト)にするのが基本です。
値の読み込み(格納)
int a[4][3];
int i, j;
for(i = 0; i < 4; i++){
for(j = 0; j < 3; j++){
scanf("%d", &a[i][j]);
}
}
値の書き出し(取得)
int a[4][3];
int i, j;
for(i = 0; i < 4; i++){
for(j = 0; j < 3; j++){
printf("%d", a[i][j]);
}
}
外側のループが行(行番号 i)を、内側のループが列(列番号 j)を担当することで、表形式のデータを効率よく扱えます。
サンプルプログラム2:2つの配列の和と積を計算する
次のプログラムは、実行時に入力された2つの2次元配列A・Bについて、対応する要素同士の和と積を計算して表示します。
#include<stdio.h>
void main(){
// 配列の宣言(実行時に入力)
int A[2][3], B[2][3], i, j;
int sum[2][3], product[2][3];
// for文を使って配列Aに要素を読み込む
printf("配列Aに要素を入力してください:\n");
for(i = 0; i < 2; i++){
for(j = 0; j < 3; j++){
printf("A[%d][%d] :", i, j);
scanf("%d", &A[i][j]);
}
printf("\n");
}
// for文を使って配列Bに要素を読み込む
for(i = 0; i < 2; i++){
for(j = 0; j < 3; j++){
printf("B[%d][%d] :", i, j);
scanf("%d", &B[i][j]);
}
printf("\n");
}
// 和の計算と出力
printf("和の配列(Sum):\n");
for(i = 0; i < 2; i++){
for(j = 0; j < 3; j++){
sum[i][j] = A[i][j] + B[i][j];
printf("%d\t", sum[i][j]);
}
printf("\n");
}
// 積の計算と出力
printf("積の配列(Product):\n");
for(i = 0; i < 2; i++){
for(j = 0; j < 3; j++){
product[i][j] = A[i][j] * B[i][j];
printf("%d\t", product[i][j]);
}
printf("\n");
}
}
補足: 元のコードでは sum[i][j] のように未初期化の変数 i・j を使って配列サイズを宣言していましたが、これは未定義動作となるため、上記のように sum[2][3]・product[2][3] と定数で宣言するのが正しい書き方です。
実行結果
上記のプログラムを実行すると、次のような結果が出力されます。
配列Aに要素を入力してください: A[0][0] :2 A[0][1] :3 A[0][2] :4 A[1][0] :1 A[1][1] :2 A[1][2] :3 配列Bに要素を入力してください: B[0][0] :4 B[0][1] :5 B[0][2] :3 B[1][0] :2 B[1][1] :1 B[1][2] :2 和の配列(Sum): 6 8 7 3 3 5 積の配列(Product): 8 15 12 2 2 6
まとめ
- 1次元配列:for文1つで添字を回すことで、値の読み書きが可能。
- 2次元配列:for文を入れ子にし、外側で行・内側で列を制御する。
- 配列サイズの宣言には必ず定数を使う(未初期化の変数は不可)。
配列とループ処理はC言語の基礎中の基礎です。ぜひ実際にコードを打ち込んで、動作を確認してみてください。
-
構造体の概念で理解するC言語のビットフィールド|定義方法と範囲の計算を徹底解説
ビットフィールドとはビットフィールドとは、変数が占めるメモリのサイズをビット単位で指定できるC言語の機能です。通常は構造体(struct)の中で定義されます。ビットフィールドの基本:1バイト=8ビット記述例struct info { int x : 2; };この例では、メンバxは2ビットを占有します。ビットフィールド使用時の注意点ビットフィールドの範囲外の値を代入することはできません(その場合の動作は保証されません)。sizeof演算子やアドレス演算子(&)をビットフィールドに適用できないため、scanf関数で値を入力することもできません。ビットフィールドに指定できるデータ型
-
C言語のポインタ入門!宣言・初期化から配列アクセスの実例まで徹底解説
ポインタ(pointer)とは、他の変数のメモリアドレスを格納するための変数です。C言語においてポインタは、メモリを直接操作したり、関数間でデータを効率的にやり取りしたりするために欠かせない重要な概念です。 ポインタの宣言・初期化とアクセス まず、次のような通常の整数変数の宣言を見てみましょう。 int qty = 179; 変数qtyには値「179」が格納されると同時に、メモリ上のどこかにその格納場所(アドレス)が割り当てられます。 ポインタの宣言 int *p; 「p」はポインタ変数であり、別の整数型(int)変数のアドレスを保持します。変数名の前にアスタリスク(*)を付けることで、「こ