値渡し
CoddyのCジャーニー「Logic & Flow」セクションの一部 — レッスン 25/63。
C言語で関数に変数を渡すとき、関数はその変数そのものではなく、変数の値のコピーを受け取ります。この基本的な概念は値渡し(pass-by-value)と呼ばれます。
次のような動作になります。値が10の変数 x があり、それを関数に渡すと、その関数はその値の独自の個別のコピーを受け取ります。関数がこのコピーに対して行った変更は、呼び出し元の関数の元の変数には影響しません。
void tryToChange(int num) {
num = 99; // これはコピーのみを変更します
}
int main() {
int x = 10;
tryToChange(x);
// xは依然として10であり、99ではありません
return 0;
}この動作により、関数によって元のデータが誤って変更されるのを防ぐことができます。しかし、これは、関数に変数の値を実際に変更させたい場合には、値渡し(pass-by-value)では機能しないことも意味します。ポインタや、ポインタがどのようにこの問題を解決できるかについて学習を進めるにあたって、この制限を理解しておくことは非常に重要です。
チャレンジ
簡単関数内で変数を変更しようと試み、元の変数が変更されないことを観察することで、値渡し(pass-by-value)の概念を実証するCプログラムを作成してください。
プログラムの要件は以下の通りです:
numberという名前の整数型の引数を受け取るtryToModifyという名前の関数を作成します。tryToModify関数の中で、引数numberに 50 を加算します。tryToModify関数の中で、変更後の値をInside function: [value]という形式で出力します。main関数の中で、originalという名前の整数型変数を宣言し、値 25 で初期化します。- 関数を呼び出す前に、元の値を
Before function call: [value]という形式で出力します。 tryToModify関数を呼び出し、引数としてoriginal変数を渡します。- 関数呼び出しの後、
originalの値を再びAfter function call: [value]という形式で出力します。
出力結果は、関数内での変更にかかわらず、元の変数の値が変更されていないことを示す必要があります:
Before function call: 25
Inside function: 75
After function call: 25このチャレンジは、C言語における値渡しの基本的な概念を実証するものです。値渡しでは、関数は変数そのものではなく、変数のコピーを受け取ります。関数内でパラメータに対して行われた変更は、呼び出し元の関数の元の変数には影響しません。
チートシート
C言語では、関数は変数そのものではなく、変数の値のコピーを受け取ります。これは値渡し(pass-by-value)と呼ばれます。
変数に関数に渡すと、関数内で行われた変更はコピーにのみ影響し、元の変数は変更されないまま残ります:
void tryToChange(int num) {
num = 99; // これはコピーのみを変更します
}
int main() {
int x = 10;
tryToChange(x);
// xは依然として10であり、99ではありません
return 0;
}この動作は、関数によって元のデータが誤って変更されるのを防ぎますが、関数に実際の変数の値を変更させたい場合には、値渡しは機能しないことを意味します。
自分で試してみよう
#include <stdio.h>
// TODO: ここに tryToModify 関数を記述してください
int main() {
// TODO: ここにコードを記述してください
// 1. 元の変数を宣言して初期化する
// 2. 関数呼び出し前の値を出力する
// 3. tryToModify 関数を呼び出す
// 4. 関数呼び出し後の値を出力する
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。