配列を関数に渡す
CoddyのCジャーニー「Logic & Flow」セクションの一部 — レッスン 29/63。
C言語で配列を関数に渡すと、舞台裏で興味深いことが起こります。配列そのものが実際に関数にコピーされるわけではありません。代わりに、渡されるのは配列の最初の要素へのポインタです。
これは、int arr[] や int *arr のような関数パラメータを記述する場合、両者は等価であることを意味します。つまり、どちらも配列の最初の要素へのポインタを表します。関数は配列が始まるメモリ番地を受け取り、元の配列のデータに直接アクセスできるようになります。
void printArray(int arr[], int size) {
// arrは実際には最初の要素へのポインタです
// この関数は元の配列にアクセスして変更することができます
}関数はコピーではなく元の配列のメモリ位置を直接操作するため、関数内で行われた変更は元の配列に影響を与えます。これは、コピーが作成される個別の変数の受け渡しとは異なります。
また、関数はポインタだけでは配列の長さを判断できないため、配列のサイズを別のパラメータとして渡す必要があることにも気づくでしょう。
チャレンジ
簡単温度データを処理する関数を作成することで、配列を関数に渡す方法を示すCプログラムを作成してください。プログラムは以下の要件を満たす必要があります:
- 整数配列とそのサイズをパラメータとして受け取る、
analyzeTemperaturesという名前の関数を作成します。 analyzeTemperatures関数内で、平均温度を計算し、小数点以下1桁までをAverage temperature: [value]という形式で出力します。analyzeTemperatures関数内で、最高温度を見つけ、Highest temperature: [value]という形式で出力します。analyzeTemperatures関数内で、25度を超える温度がいくつあるかをカウントし、そのカウントをDays above 25 degrees: [count]という形式で出力します。main関数内で、温度測定値の数を示す整数nを読み取ります。n個の温度値を読み取り、それらを整数配列に格納します。- 配列とそのサイズを渡して、
analyzeTemperatures関数を呼び出します。
プログラムは温度データを処理し、分析結果を表示する必要があります。例えば、入力が以下の場合:
5
20 28 15 32 26出力は以下のようになります:
Average temperature: 24.2
Highest temperature: 32
Days above 25 degrees: 3このチャレンジは、配列が最初の要素へのポインタとして関数に渡される仕組みを示しています。これにより、関数はコピーを作成することなく、元の配列のすべての要素にアクセスして処理することができます。
チートシート
C言語で配列を関数に渡す際、配列自体はコピーされません。代わりに、最初の要素へのポインタが渡されます。
int arr[] と int *arr はどちらも同等の関数パラメータであり、これらは最初の要素へのポインタを表します。
void printArray(int arr[], int size) {
// arrは実際には最初の要素へのポインタです
// 関数は元の配列にアクセスし、変更することができます
}重要なポイント:
- 関数は配列が始まるメモリ番地を受け取ります
- 関数内で行われた変更は元の配列に影響します
- 関数はポインタだけでは長さを判断できないため、配列のサイズは別のパラメータとして渡す必要があります
自分で試してみよう
#include <stdio.h>
// TODO: ここで analyzeTemperatures 関数を作成します
int main() {
// 温度の読み取り回数を読み込む
int n;
scanf("%d", &n);
// 温度を格納するための配列を宣言する
int temperatures[n];
// 温度の値を読み込む
for (int i = 0; i < n; i++) {
scanf("%d", &temperatures[i]);
}
// TODO: ここで analyzeTemperatures 関数を呼び出します
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。