C言語で関数を使うときに、必ず出てくるのが「引数」です。
なんとなく値を渡して使っているけれど、
「実際に何が起きているのか?」を理解しているでしょうか。
この記事では、C言語における「値渡し」の仕組みと、なぜ値がコピーされるのかをわかりやすく解説します。
値渡しとは何か
結論から言うと、値渡しとは
👉 引数の値をコピーして関数に渡す仕組みです
■ 例で見る
#include <stdio.h>
void addOne(int x) {
x = x + 1;
}
int main() {
int a = 10;
addOne(a);
printf("%d\n", a);
return 0;
}このコードの出力はどうなるでしょうか?
👉 答え:10のまま
初心者さん1足してるのに、なんで変わらないんですか?



渡しているのは“変数そのもの”じゃなくて、“値のコピー”なんだよ
C言語文法解説シリーズ
本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説しています。
C言語文法解説シリーズ一覧はこちら


なぜ値が変わらないのか
ポイントはここです👇
aの値(10)がコピーされる- コピーされた値が
xに入る xを変更しても、元のaには影響しない
■ イメージ図
main関数 addOne関数
-------- ------------
a = 10 → x = 10(コピー) x = 11(変更)a は 10のまま
👉 完全に別の変数として扱われます
なぜ値渡しの仕組みなのか
これはC言語の設計としてとても重要です。
① 安全性が高い
関数内で値を書き換えても、呼び出し元に影響しません。
👉 意図しないバグを防げる
② シンプルで高速
- メモリアドレスを意識しなくていい
- 処理が単純
👉 低レベル言語として扱いやすい設計
値を変更したい場合はどうする?
「じゃあ値を変えたいときはどうするの?」という話になります。
その場合は👇
👉 ポインタを使います
■ ポインタ渡しの例
#include <stdio.h>
void addOne(int *x) {
*x = *x + 1;
}
int main() {
int a = 10;
addOne(&a);
printf("%d\n", a);
return 0;
}👉 今度は 11になります



今回は変わりました!



今度は“値”じゃなくて“場所”を渡しているからね
👉 ポインタについて詳しく知りたい方はこちら


組み込みで意識すべきポイント
組み込みでは、この値渡しの仕組みが特に重要です。
■ スタックにコピーされる
関数の引数は、基本的にスタック領域にコピーされます
👉 つまり:
- 引数が大きいと負荷が増える
- 無駄なコピーは避けたい
スタック領域についてはこちらの記事で解説しています。


■ 構造体の値渡しは注意
struct Data {
int a;
int b;
int c;
};このような構造体を値渡しすると、丸ごとコピーされます。
👉 組み込みでは
- ポインタ渡しにする
- constを付ける
などの設計がよく使われます
構造体についてはこちらの記事で解説しています。


constの使い方についてはこちらの記事で解説しています。


まとめ
- 値渡しとは「値をコピーして渡す仕組み」
- 関数内で変更しても、元の値には影響しない
- 値を変更したい場合はポインタを使う
- 組み込みではコピーコストに注意
この記事が参考になった方へ
関数を含むC言語の基本文法をこちらの記事で整理しています。


技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。
小さなご相談からでもお気軽にご連絡ください。









コメント