Menu
Coddy logo textTech

値渡し

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)では機能しないことも意味します。ポインタや、ポインタがどのようにこの問題を解決できるかについて学習を進めるにあたって、この制限を理解しておくことは非常に重要です。

challenge icon

チャレンジ

簡単

関数内で変数を変更しようと試み、元の変数が変更されないことを観察することで、値渡し(pass-by-value)の概念を実証するCプログラムを作成してください。

プログラムの要件は以下の通りです:

  1. number という名前の整数型の引数を受け取る tryToModify という名前の関数を作成します。
  2. tryToModify 関数の中で、引数 number に 50 を加算します。
  3. tryToModify 関数の中で、変更後の値を Inside function: [value] という形式で出力します。
  4. main 関数の中で、original という名前の整数型変数を宣言し、値 25 で初期化します。
  5. 関数を呼び出す前に、元の値を Before function call: [value] という形式で出力します。
  6. tryToModify 関数を呼び出し、引数として original 変数を渡します。
  7. 関数呼び出しの後、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;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Logic & Flowのすべてのレッスン