Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語の値渡し(Call by Value)とは?仕組みとサンプルコードを解説

C言語における「値渡し(Call by Value)」とは、関数を呼び出す際に、引数として変数の値そのものをコピーして渡す方法です。この記事では、値渡しの基本的な仕組みを、実際のサンプルコードと実行結果をもとに分かりやすく解説します。

値渡しのアルゴリズム

値渡しを使って2つの数値を入れ替えるプログラムの処理の流れは、以下のとおりです。

ステップ1:実行時に任意の2つの数値を入力する
ステップ2:コンソールからその2つの数値を読み込む
ステップ3:引数を付けてswap関数を呼び出す(これが値渡し)
ステップ4:呼び出された関数へ制御が移る
      swap(int a, int b)
ステップ5:入れ替え後の数値を出力する

サンプルプログラム

以下は、C言語で値渡しを実装したサンプルプログラムです。

#include<stdio.h>
void main(){
    void swap(int,int);
    int a,b;
    clrscr();
    printf("enter 2 numbers");
    scanf("%d%d",&a,&b);
    printf("Before swapping a=%d b=%d",a,b);
    swap(a,b);
    printf("after swapping a=%d, b=%d",a,b);
    getch();
}
void swap(int a,int b){
    int t;
    t=a;
    a=b;
    b=t;
}

実行結果

上記のプログラムを実行すると、次のような結果が出力されます。

enter 2 numbers 10 20
Before swapping a=10 b=20
After swapping a=10 b=20

なぜ値は入れ替わらないのか?

注目すべきは、swap関数を呼び出した後も、main関数内の変数aとbの値が入れ替わっていないという点です。これは値渡しの最も重要な特徴です。

値渡しでは、関数に渡されるのは変数のコピーだけです。swap関数内で引数aとbの値を入れ替えても、それはあくまでコピーされたローカル変数同士の入れ替えであり、main関数側の元の変数には一切影響しません。

もし呼び出し元の変数の値を実際に入れ替えたい場合は、「参照渡し(Call by Reference)」を使用します。参照渡しではポインタを使って変数のアドレスを渡すため、関数内での変更が呼び出し元の変数にも反映されます。

まとめ

  • 値渡しとは、引数の値をコピーして関数に渡す方式である
  • 関数内で引数を変更しても、呼び出し元の変数には影響しない
  • 呼び出し元の値を変更したい場合は、ポインタを使った参照渡しを利用する
  1. C言語の定数(const)とは?基本構文から種類・実行例まで徹底解説

    定数(Constant)とは、一度値を定義するとプログラムの実行中にその値が一切変わらないものを指します。固定値を参照するために、変数を定数として宣言することができます。定数は「リテラル」と呼ばれることもあります。C言語では、const キーワードを使用して定数を定義します。定数の基本構文C言語で定数を宣言する際の基本的な構文は以下の通りです。const 型 変数名; または const 型 *ポインタ変数名;定数の主な種類C言語で扱われる定数には、以下のような種類があります。整数定数 … 例:1、0、34、4567浮動小数点定数 … 例:0.0、156.89、23.4568進数・16進数定数

  2. C言語のシフト演算とは?左シフト・右シフト・補数の基本をわかりやすく解説

    問題 C言語を使用して、ある数値に対する左シフト・右シフト・補数(ビット反転)を求める簡単なプログラムを作成するには、どのようにすればよいのでしょうか。 解決方法 左シフト(<<) 変数の値を1ビットだけ左へシフトすると、その値は2倍になります。「a × 2」を計算したのと同じ結果です。 例:a = 10 の場合、a << 1 = 20 右シフト(>>) 変数の値を1ビットだけ右へシフトすると、その値は元の半分になります。「a ÷ 2」の整数除算と同じ結果です。 例:a = 10 の場合、a >> 1 = 5 サンプルプログラム 以下は、シ