値渡しとアドレス渡しの違いとは?C言語の引数の仕組みを解説

C言語で関数を使うときに、必ず出てくるのが「引数」です。

なんとなく値を渡して使っているけれど、
「実際に何が起きているのか?」を理解しているでしょうか。

この記事では、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言語の設計としてとても重要です。


① 安全性が高い

関数内で値を書き換えても、呼び出し元に影響しません。

👉 意図しないバグを防げる


② シンプルで高速

  • メモリアドレスを意識しなくていい
  • 処理が単純

👉 低レベル言語として扱いやすい設計


値を変更したい場合はどうする?

「じゃあ値を変えたいときはどうするの?」という話になります。

その場合は👇

👉 ポインタを使います


■ ポインタ渡しの例

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になります


初心者さん

今回は変わりました!

エンジニアくん

今度は“値”じゃなくて“場所”を渡しているからね


👉 ポインタについて詳しく知りたい方はこちら


組み込みで意識すべきポイント

組み込みでは、この値渡しの仕組みが特に重要です。


■ スタックにコピーされる

関数の引数は、基本的にスタック領域にコピーされます

👉 つまり:

  • 引数が大きいと負荷が増える
  • 無駄なコピーは避けたい

スタック領域についてはこちらの記事で解説しています。


■ 構造体の値渡しは注意

C
struct Data {
    int a;
    int b;
    int c;
};

このような構造体を値渡しすると、丸ごとコピーされます。

👉 組み込みでは

  • ポインタ渡しにする
  • constを付ける

などの設計がよく使われます

構造体についてはこちらの記事で解説しています。

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


まとめ

  • 値渡しとは「値をコピーして渡す仕組み」
  • 関数内で変更しても、元の値には影響しない
  • 値を変更したい場合はポインタを使う
  • 組み込みではコピーコストに注意

この記事が参考になった方へ

関数を含むC言語の基本文法をこちらの記事で整理しています。

技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。

小さなご相談からでもお気軽にご連絡ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

組み込みソフトエンジニアとして働きながら、
C言語・メモリ・ポインタなどの基礎から実務まで解説しています。

副業・キャリアについても実体験ベースで発信中です。

X(旧Twitter)でも発信しています
👉 Xはこちら

▼まずはここから読むのがおすすめ
C言語文法シリーズ
メモリ領域解説シリーズ

コメント

コメントする


目次