C言語でプログラミングを始めると、配列の使い方は避けて通れない重要なポイントです。
このガイドでは、配列に値を代入する基本的な方法から、配列のコピー、多次元配列の操作、動的メモリ割り当てまで、初心者でもわかりやすく解説します。
具体的なサンプルコードとその実行結果を通じて、配列操作の基礎をしっかりと学びましょう。
配列への値の代入方法
C言語において、配列は同じデータ型の要素を連続して格納するためのデータ構造です。
配列に値を代入する方法はいくつかありますが、ここでは代表的な方法を紹介します。
直接代入
インデックスを使った代入
配列の各要素に値を代入する最も基本的な方法は、インデックスを使って直接代入する方法です。
インデックスは0から始まるため、最初の要素はインデックス0でアクセスします。
#include <stdio.h>
int main() {
int array[5]; // 5つの要素を持つ配列を宣言
// インデックスを使って値を代入
array[0] = 10;
array[1] = 20;
array[2] = 30;
array[3] = 40;
array[4] = 50;
// 配列の内容を表示
for (int i = 0; i < 5; i++) {
printf("array[%d] = %d\n", i, array[i]);
}
return 0;
}
このプログラムを実行すると、以下のように出力されます。
array[0] = 10
array[1] = 20
array[2] = 30
array[3] = 40
array[4] = 50
ループを使った代入
配列に多くの値を代入する場合、for
ループを使うと効率的です。
ループを使うことで、同じ処理を繰り返し実行できます。
#include <stdio.h>
int main() {
int array[5]; // 5つの要素を持つ配列を宣言
// ループを使って値を代入
for (int i = 0; i < 5; i++) {
array[i] = (i + 1) * 10; // 10, 20, 30, 40, 50を代入
}
// 配列の内容を表示
for (int i = 0; i < 5; i++) {
printf("array[%d] = %d\n", i, array[i]);
}
return 0;
}
このプログラムを実行すると、以下のように出力されます。
array[0] = 10
array[1] = 20
array[2] = 30
array[3] = 40
array[4] = 50
関数を使った代入
配列に値を代入する処理を関数にまとめることで、コードの再利用性が向上します。
以下の例では、配列に値を代入する関数を定義しています。
#include <stdio.h>
// 配列に値を代入する関数
void fillArray(int array[], int size) {
for (int i = 0; i < size; i++) {
array[i] = (i + 1) * 10; // 10, 20, 30, 40, 50を代入
}
}
int main() {
int array[5]; // 5つの要素を持つ配列を宣言
// 関数を使って値を代入
fillArray(array, 5);
// 配列の内容を表示
for (int i = 0; i < 5; i++) {
printf("array[%d] = %d\n", i, array[i]);
}
return 0;
}
このプログラムを実行すると、以下のように出力されます。
array[0] = 10
array[1] = 20
array[2] = 30
array[3] = 40
array[4] = 50
関数を使うことで、配列のサイズや内容が変わった場合でも、関数内の処理を変更するだけで対応できます。
これにより、コードの保守性が向上します。
配列のコピー
配列のコピーは、ある配列の内容を別の配列にそのまま移す操作です。
C言語では、配列のコピーを行う方法として主にmemcpy関数
とfor
ループを使った方法があります。
それぞれの方法について詳しく解説します。
memcpy
関数を使ったコピー
memcpy関数
は、標準ライブラリ<string.h>
に含まれている関数で、メモリブロックをコピーするために使用されます。
配列のコピーにも非常に便利です。
memcpy
関数の使い方
memcpy関数
の基本的な使い方は以下の通りです。
#include <stdio.h>
#include <string.h>
int main() {
int source[] = {1, 2, 3, 4, 5};
int destination[5];
// 配列のコピー
memcpy(destination, source, sizeof(source));
// コピー結果の表示
for (int i = 0; i < 5; i++) {
printf("%d ", destination[i]);
}
return 0;
}
このコードでは、source
配列の内容をdestination
配列にコピーしています。
memcpy関数
の第1引数はコピー先の配列、第2引数はコピー元の配列、第3引数はコピーするバイト数です。
sizeof(source)
を使って配列全体のバイト数を指定しています。
実行結果
1 2 3 4 5
このように、source
配列の内容がdestination
配列に正しくコピーされていることが確認できます。
for
ループを使った配列のコピー
for
ループを使って配列をコピーする方法もあります。
この方法は、配列の各要素を一つずつコピーするため、memcpy関数
を使わない場合に便利です。
for
ループを使ったコピーの例
#include <stdio.h>
int main() {
int source[] = {1, 2, 3, 4, 5};
int destination[5];
// 配列のコピー
for (int i = 0; i < 5; i++) {
destination[i] = source[i];
}
// コピー結果の表示
for (int i = 0; i < 5; i++) {
printf("%d ", destination[i]);
}
return 0;
}
このコードでは、for
ループを使ってsource
配列の各要素をdestination
配列にコピーしています。
実行結果
1 2 3 4 5
このように、for
ループを使ってもsource
配列の内容がdestination
配列に正しくコピーされていることが確認できます。
配列の一部に値を代入する方法
配列の一部に値を代入する方法について解説します。
配列全体に値を代入するのではなく、特定の範囲や部分に対して値を設定する方法を学びましょう。
部分的な代入
部分的な代入とは、配列の特定のインデックス範囲に対して値を代入することです。
例えば、配列の一部の要素だけを更新したい場合に使用します。
以下に、部分的な代入の例を示します。
#include <stdio.h>
int main() {
int array[10] = {0}; // 配列を0で初期化
// 配列の一部に値を代入
for (int i = 3; i < 7; i++) {
array[i] = 5;
}
// 配列の内容を表示
for (int i = 0; i < 10; i++) {
printf("%d ", array[i]);
}
return 0;
}
このプログラムでは、配列array
のインデックス3から6までの要素に値5を代入しています。
実行結果は以下のようになります。
0 0 0 5 5 5 5 0 0 0
memset
関数を使った部分代入
memset関数
を使うと、配列の一部に同じ値を一括で代入することができます。
memset関数
は、標準ライブラリ<string.h>
に含まれており、メモリブロックを特定の値で埋めるために使用されます。
以下に、memset関数
を使った部分代入の例を示します。
#include <stdio.h>
#include <string.h> // memset関数を使用するために必要
int main() {
int array[10] = {0}; // 配列を0で初期化
// 配列の一部に値を代入
memset(array + 3, 5, 4 * sizeof(int));
// 配列の内容を表示
for (int i = 0; i < 10; i++) {
printf("%d ", array[i]);
}
return 0;
}
このプログラムでは、memset関数
を使って配列array
のインデックス3から6までの要素に値5を代入しています。
実行結果は以下のようになります。
0 0 0 5 5 5 5 0 0 0
memset関数
の第1引数には、代入を開始するメモリアドレスを指定します。
ここではarray + 3
とすることで、配列のインデックス3から代入を開始しています。
第2引数には代入する値を指定し、第3引数には代入するバイト数を指定します。
ここでは4つのint型
要素に対して代入するため、4 * sizeof(int)
としています。
以上が、配列の一部に値を代入する方法とmemset関数
を使った部分代入です。
これらの方法を使うことで、効率的に配列の一部を更新することができます。
多次元配列への値の代入
多次元配列の基本
多次元配列は、配列の中にさらに配列が含まれている構造を持つ配列です。
最も一般的な多次元配列は2次元配列で、これは行と列を持つ表形式のデータを表現するのに使われます。
例えば、行列やゲームのボードなどが2次元配列で表現されます。
多次元配列の宣言と初期化
多次元配列の宣言は、一次元配列の宣言と似ていますが、次元ごとに角括弧を追加します。
以下に2次元配列の宣言と初期化の例を示します。
#include <stdio.h>
int main() {
// 2次元配列の宣言と初期化
int matrix[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 配列の内容を表示
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
return 0;
}
このコードでは、3×3の2次元配列matrix
を宣言し、初期化しています。
各行と列の要素を表示するために、ネストされたfor
ループを使用しています。
多次元配列への値の代入
多次元配列への値の代入は、一次元配列と同様にインデックスを使用して行います。
次に、具体的な代入方法を見ていきましょう。
インデックスを使った代入
インデックスを使って多次元配列に値を代入する方法は、一次元配列と同じです。
以下に例を示します。
#include <stdio.h>
int main() {
// 2次元配列の宣言
int matrix[3][3];
// インデックスを使って値を代入
matrix[0][0] = 1;
matrix[0][1] = 2;
matrix[0][2] = 3;
matrix[1][0] = 4;
matrix[1][1] = 5;
matrix[1][2] = 6;
matrix[2][0] = 7;
matrix[2][1] = 8;
matrix[2][2] = 9;
// 配列の内容を表示
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
return 0;
}
このコードでは、インデックスを使って2次元配列matrix
に値を代入しています。
ループを使った多次元配列への代入
多次元配列に値を代入する際に、ループを使うと効率的です。
以下に例を示します。
#include <stdio.h>
int main() {
// 2次元配列の宣言
int matrix[3][3];
// ループを使って値を代入
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
matrix[i][j] = i * 3 + j + 1;
}
}
// 配列の内容を表示
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
return 0;
}
このコードでは、ネストされたfor
ループを使って2次元配列matrix
に値を代入しています。
各要素には計算式i * 3 + j + 1
を使って値を設定しています。
ネストされたfor
ループを使った代入
ネストされたfor
ループを使うことで、多次元配列の各要素に効率的に値を代入できます。
以下に例を示します。
#include <stdio.h>
int main() {
// 2次元配列の宣言
int matrix[3][3];
// ネストされたforループを使って値を代入
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
matrix[i][j] = (i + 1) * (j + 1);
}
}
// 配列の内容を表示
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
return 0;
}
このコードでは、ネストされたfor
ループを使って2次元配列matrix
に値を代入しています。
各要素には計算式(i + 1) * (j + 1)
を使って値を設定しています。
以上が、多次元配列への値の代入方法です。
多次元配列を使うことで、より複雑なデータ構造を扱うことができるようになります。
ぜひ、実際にコードを書いて試してみてください。
配列の動的メモリ割り当てと代入
動的メモリ割り当ての基本
C言語では、配列のサイズをコンパイル時に決定する必要があります。
しかし、実行時に配列のサイズが変わる場合や、非常に大きな配列を扱う場合には、動的メモリ割り当てを使用することが一般的です。
動的メモリ割り当てを行うためには、標準ライブラリのstdlib.h
をインクルードし、malloc
やfree
といった関数を使用します。
malloc
とfree
の使い方
malloc関数
は、指定したバイト数のメモリを動的に割り当て、その先頭アドレスを返します。
割り当てられたメモリは、使用が終わったらfree関数
で解放する必要があります。
以下に基本的な使い方を示します。
#include <stdio.h>
#include <stdlib.h>
int main() {
int *array;
int size = 10;
// メモリの動的割り当て
array = (int *)malloc(size * sizeof(int));
if (array == NULL) {
printf("メモリの割り当てに失敗しました\n");
return 1;
}
// 配列の使用
for (int i = 0; i < size; i++) {
array[i] = i * 2;
}
// 配列の内容を表示
for (int i = 0; i < size; i++) {
printf("array[%d] = %d\n", i, array[i]);
}
// メモリの解放
free(array);
return 0;
}
このコードでは、malloc関数
を使って整数型の配列を動的に割り当てています。
割り当てられたメモリが使用された後、free関数
で解放されています。
動的配列への値の代入
動的に割り当てられた配列に値を代入する方法は、通常の配列と同じです。
インデックスを使って値を代入したり、ループを使って一括で代入することができます。
以下に、動的配列に値を代入する例を示します。
#include <stdio.h>
#include <stdlib.h>
int main() {
int *array;
int size = 5;
// メモリの動的割り当て
array = (int *)malloc(size * sizeof(int));
if (array == NULL) {
printf("メモリの割り当てに失敗しました\n");
return 1;
}
// 配列に値を代入
for (int i = 0; i < size; i++) {
array[i] = i + 1;
}
// 配列の内容を表示
for (int i = 0; i < size; i++) {
printf("array[%d] = %d\n", i, array[i]);
}
// メモリの解放
free(array);
return 0;
}
この例では、malloc関数
を使って動的に割り当てた配列に対して、for
ループを使って値を代入しています。
配列の内容を表示した後、free関数
でメモリを解放しています。
動的メモリ割り当てを使用することで、実行時に配列のサイズを柔軟に変更できるため、メモリの効率的な利用が可能になります。
ただし、メモリの解放を忘れるとメモリリークが発生するため、free関数
を使って適切にメモリを解放することが重要です。