C言語で1次元・2次元配列を関数に渡す方法 – 実践ガイド
C言語で1次元・2次元配列を関数に渡す方法
このチュートリアルでは、1次元配列と多次元配列をC言語の関数に渡す方法を、明確なコード例とベストプラクティスとともに解説します。
C言語では、配列名が関数に渡されるときにポインタに「退化」するため、データをコピーせずに元のデータを操作できます。この挙動を理解することは、効率的で保守しやすいコードを書く上で不可欠です。
個々の配列要素を渡す
単一の要素を渡すのは、プリミティブ型を渡すのと全く同じです。
例1: 個々の配列要素を渡す
#include <stdio.h>
void display(int age1, int age2) {
printf("%d\n", age1);
printf("%d\n", age2);
}
int main() {
int ageArray[] = {2, 8, 4, 12};
// 2番目と3番目の要素をdisplay()に渡す
display(ageArray[1], ageArray[2]);
return 0;
}
出力
8 4
ここではageArray[1]とageArray[2]を通常の変数と同じように渡しています。関数は値渡しで受け取るため、元の配列は変更されません。
1次元配列全体を渡す
配列全体を関数に渡すには、単に配列名を指定します。関数のプロトタイプでは配列パラメータを示す必要がありますが、実際のサイズは省略できます。コンパイラはパラメータを先頭要素へのポインタとして扱います。
例2: 配列の合計を計算する
#include <stdio.h>
float calculateSum(float num[]);
int main() {
float result, num[] = {23.4, 55, 22.6, 3, 40.5, 18};
// 配列全体をcalculateSum()に渡す
result = calculateSum(num);
printf("Result = %.2f", result);
return 0;
}
float calculateSum(float num[]) {
float sum = 0.0;
for (int i = 0; i < 6; ++i) {
sum += num[i];
}
return sum;
}
出力
Result = 162.50
関数シグネチャfloat calculateSum(float num[])は、numがfloat配列へのポインタであることをコンパイラに伝えます。ループは配列をその場で処理し、コピーは発生しません。
多次元配列を渡す
多次元配列も同じ原則に従います:配列名は最初の行へのポインタに退化します。ただし、コンパイラは最初の次元を除くすべての次元のサイズを知っている必要があります。これは正しいメモリオフセットを計算するために必要です。
例3: 2次元配列を渡す
#include <stdio.h>
void displayNumbers(int num[2][2]);
int main() {
int num[2][2];
printf("4つの数を入力してください:\n");
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
scanf("%d", &num[i][j]);
}
}
// 2次元配列を関数に渡す
displayNumbers(num);
return 0;
}
void displayNumbers(int num[2][2]) {
printf("表示:\n");
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
printf("%d\n", num[i][j]);
}
}
}
出力
4つの数を入力してください: 2 3 4 5 表示: 2 3 4 5
関数プロトタイプvoid displayNumbers(int num[2][2])は2×2の整数配列を宣言しています。関数呼び出し時には単にnumを渡せばよく、コンパイラが自動的にポインタ変換を行います。
行の次元は省略可能ですが、列のサイズは必須です:int num[][2]は有効ですが、列サイズはアドレス計算に不可欠です。
重要: C言語では配列を関数に渡せますが、配列を直接関数から返すことはサポートしていません。複雑なデータを返す必要がある場合は、ポインタや構造体を使用してください。
C言語
- C# 配列をマスターする:宣言、初期化、操作
- C言語データ型完全解説:int、float、charなど
- C言語の関数マスター:構造、宣言、ベストプラクティス
- C言語ビットフィールド:メモリ効率を最大化するテクニック
- C言語ファイルI/O完全ガイド:作成、オープン、管理の実践
- C言語可変長引数のマスター:実践ガイド
- C++ポリモーフィズム完全理解:仮想関数と純粋仮想関数
- C#のメソッド:定義、呼び出し、パラメータ渡し、再帰を完全解説
- Python pass文完全マスター: 実践ガイド
- Python 関数引数完全マスター: 位置引数・キーワード引数・デフォルト引数
- Pythonクロージャ解説:ネスト関数が変数を捕捉する仕組み