C言語の値渡し(Call by Value)とは?仕組みとサンプルコードで解説
値渡し(Pass by Value)とは、C言語において関数を呼び出す際に、変数そのものではなく「値のコピー」を引数として渡す方式のことです。呼び出し先の関数内で引数の値を変更しても、元の変数には一切影響が及ばないのが最大の特徴です。
値渡しの動作アルゴリズム
以下は、C言語における値渡しの仕組みを説明するための基本的なアルゴリズムです。
START
Step 1: 呼び出す関数を宣言する
Step 2: 変数を宣言する
Step 3: 実行時に2つの変数 a, b を入力する
Step 4: 関数呼び出しにより Step 6 へジャンプする
Step 5: 結果の値 a, b を表示する
Step 6: 呼び出された関数 swap の処理
i. 一時変数 temp を宣言する
ii. temp = a
iii. a = b
iv. b = temp
STOP例1:値渡しによる2つの数値の入れ替え
次は、値渡しを使って2つの数値を入れ替えようとするCプログラムの例です。
#include<stdio.h>
void main(){
void swap(int,int);
int a,b;
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);
}
void swap(int a,int b){
int t; // 以下の処理はすべて等価な操作です
t=a; // a = (a+b) - (b =a); または
a=b; // a = a + b;
b=t; // b = a - b;
} // a = a - b;実行結果
上記のプログラムを実行すると、次のような結果が出力されます。
enter 2 numbers 10 20 Before swapping a=10 b=20 After swapping a=10 b=20
注目すべき点は、swap関数の中で値を入れ替えても、main関数側の a と b の値は変わっていないということです。これは、関数に渡されたのは変数のコピーであり、元の変数そのものではないためです。これこそが値渡しの本質的な挙動です。
例2:呼び出しごとに値を5ずつ増やすプログラム
続いて、値渡し(call by value)の理解を深めるため、呼び出すたびに値を5増やすCプログラムを見てみましょう。
#include <stdio.h>
int inc(int num){
num = num+5;
return num;
}
int main(){
int a=10,b,c,d;
b =inc(a); // 値渡しによる呼び出し
c=inc(b); // 値渡しによる呼び出し
d=inc(c); // 値渡しによる呼び出し
printf("a value is: %d\n", a);
printf("b value is: %d\n", b);
printf("c value is: %d\n", c);
printf("d value is: %d\n", d);
return 0;
}実行結果
上記のプログラムを実行すると、次のような結果が出力されます。
a value is: 10 b value is: 15 c value is: 20 d value is: 25
まとめ
この例からも分かるように、inc関数に a を渡しても a 自身の値は 10 のまま変わりません。関数内で加算されるのはコピーされた値であり、その計算結果は戻り値として返されて初めて利用できます。値渡しでは元の変数が保護されるため安全ですが、逆に関数内での変更を呼び出し元に反映させたい場合は、ポインタを使った参照渡し(Call by Reference)を使用する必要があります。
-
C言語の定数(const)とは?基本構文から種類・実行例まで徹底解説
定数(Constant)とは、一度値を定義するとプログラムの実行中にその値が一切変わらないものを指します。固定値を参照するために、変数を定数として宣言することができます。定数は「リテラル」と呼ばれることもあります。C言語では、const キーワードを使用して定数を定義します。定数の基本構文C言語で定数を宣言する際の基本的な構文は以下の通りです。const 型 変数名; または const 型 *ポインタ変数名;定数の主な種類C言語で扱われる定数には、以下のような種類があります。整数定数 … 例:1、0、34、4567浮動小数点定数 … 例:0.0、156.89、23.4568進数・16進数定数
-
C言語のシフト演算とは?左シフト・右シフト・補数の基本をわかりやすく解説
問題 C言語を使用して、ある数値に対する左シフト・右シフト・補数(ビット反転)を求める簡単なプログラムを作成するには、どのようにすればよいのでしょうか。 解決方法 左シフト(<<) 変数の値を1ビットだけ左へシフトすると、その値は2倍になります。「a × 2」を計算したのと同じ結果です。 例:a = 10 の場合、a << 1 = 20 右シフト(>>) 変数の値を1ビットだけ右へシフトすると、その値は元の半分になります。「a ÷ 2」の整数除算と同じ結果です。 例:a = 10 の場合、a >> 1 = 5 サンプルプログラム 以下は、シ