関数に値を渡す2つの方法「値渡し」と「参照渡し」って何?C言語の基本をやさしく解説!
C言語で関数に値を渡す方法には、「値渡し(call by value)」と「参照渡し(call by reference)」の2種類があります。
処理結果や変数の変更に違いが出る重要な考え方なので、しっかり理解しておきましょう。
値渡し(call by value)とは?
値渡しでは、変数の「中身の値」だけをコピーして関数に渡すため、
関数内で値を変更しても、元の変数には影響しません。
void change(int n) {
n = 100; // 元の変数には影響しない
}
int main(void) {
int a = 10;
change(a);
printf("%d\n", a); // 出力:10(変化なし)
return 0;
}
参照渡し(call by reference)とは?
参照渡しでは、変数の「アドレス(場所)」を渡すことで、関数内から元の変数そのものを変更できます。
C言語では、ポインタを使うことで参照渡しを実現します。
void change(int *n) {
*n = 100; // 元の変数の値を変更する
}
int main(void) {
int a = 10;
change(&a); // 変数aのアドレスを渡す
printf("%d\n", a); // 出力:100(変更された)
return 0;
}
値渡しと参照渡しの違い
項目 |
値渡し |
参照渡し |
渡すもの |
変数の値(コピー) |
変数のアドレス |
元の変数への影響 |
影響なし |
変更される可能性あり |
使用する記号 |
なし |
* (ポインタ)、& (アドレス演算子) |
どちらを使えばいいの?
- 値をそのまま使って「結果を返さない」なら → 値渡し
- 関数内で値を「書き換えたい」なら → 参照渡し(ポインタ)
まとめ
C言語では、関数に渡す値がコピーされる「値渡し」が基本です。
しかし、ポインタを使えば「参照渡し」のように元の変数を変更することも可能です。
初心者の方は、&
(アドレス)と*
(ポインタの中身)をセットで理解しながら、実際に使ってみるのがおすすめです!