引数と戻り値: 値渡し

C言語の最も重要なルール「コピーして渡す」を理解する。

値渡し
引数の「コピー」を関数に渡す方式。元の変数は守られる。
実引数
関数呼び出し時に渡す実際の値。
仮引数
関数定義側で値を受け取る変数。
コピー用紙 (Photocopy)

C言語の関数呼び出しは、友達にノートを貸すときの「コピー」と同じです。 友達(関数)にノートのコピーを渡せば、彼らがそこに落書きしても、手元のオリジナルノートは無事です。 安全ですが、「友達にノートを修正してほしい」ときには不便です。その場合は「原本」を渡す(ポインタを使う)必要があります。

コピーの原則 (Call by Value)

C言語では、関数に引数を渡すとき、常に「値のコピー」 が作られます。元の変数そのものを渡しているわけではありません。

コピー用紙にメモ書きをして相手に渡すようなものです。相手がそのコピー用紙に何を書き込んでも、手元の原本が変わることはありません。これは安全ですが、値を書き換えたい場合(swap関数など)には不便です。

値渡しの実験

以下のコードは初心者がよくやる間違いです。関数内で入れ替えても、mainの変数は変わりません。

Failed Swap
// 値渡し(コピー)の証明
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
// ここでは入れ替わっているが...
}
int main(void) {
int x = 10, y = 20;
swap(x, y);
printf("x=%d, y=%d\n", x, y);
// 出力: x=10, y=20 (変わっていない!)
return 0;
}
Note: 本当に値を入れ替えたい場合は、後の章で学ぶ「ポインタ」が必要です。

実践テクニック

戻り値は一つだけ

C言語の return は一つしか値を返せません。複数の計算結果(例: 割り算の商と余り)を返したい場合は、ポインタを使うか、構造体にまとめる必要があります。

演習課題

課題1: 偶数判定
整数を受け取り、偶数なら1、奇数なら0を返す関数 is_even を作成してください。
課題2: 最大値
2つの整数を受け取り、大きい方を返す関数 max を作成してください。

合格ライン

値渡し(コピー)の意味を説明できる
なぜ swap 関数が動かないか理解している