C言語の参照渡しとは?仕組みと使い方を実例つきで解説
C言語における参照渡し(pass by reference)とは、関数を呼び出す際に、変数そのものではなく変数のアドレス(メモリ上の場所)を引数として渡す手法のことです。ポインタを使ってアドレスを受け取ることで、呼び出された関数の中から元の変数の値を直接読み書きできるようになります。この記事では、参照渡しの基本的な考え方と、具体的なサンプルコードを通してその動作を解説します。
参照渡しのアルゴリズム
まず、参照渡しがどのように動作するのかを、次のアルゴリズムで確認しましょう。ここでは、2つの変数の値を入れ替える処理を例にしています。
START
Step 1: ポインタ変数を引数に持つ関数を宣言する
Step 2: 変数 a, b を宣言する
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=*b;
*b=t;
}
実行結果
このプログラムを実行すると、次のような結果が出力されます。
enter 2 numbers 10 20 Before swapping a=10 b=20 After swapping a=20 b=10
ポイントは swap(&a, &b) の部分です。& 演算子によって変数 a と b のアドレスを渡しているため、swap 関数内で *a や *b を書き換えると、main 関数側の元の変数の値も入れ替わります。もし値渡し(pass by value)であれば、関数内での変更は呼び出し元には反映されません。
サンプルプログラム2:呼び出すたびに値を5ずつ増やす
続いて、もう一つの例を見てみましょう。次のプログラムは、参照渡し(call by reference)を利用して、関数が呼ばれるたびに変数の値を5ずつ増加させるものです。
#include <stdio.h>
void inc(int *num){
// num の値が格納されているアドレス先に対して
// インクリメントを行う
*num = *num+5;
}
int main(){
int a=20,b=30,c=40;
// 変数 a, b, c のアドレスを渡す
inc(&a);
inc(&b);
inc(&c);
printf("Value of a is: %d\n", a);
printf("Value of b is: %d\n", b);
printf("Value of c is: %d\n", c);
return 0;
}
実行結果
このプログラムを実行すると、次のような結果が出力されます。
Value of a is: 25 Value of b is: 35 Value of c is: 45
inc 関数は引数としてアドレスを受け取り、*num = *num + 5; によってそのアドレスが指し示す実体の値を直接更新しています。そのため、main 関数に戻った後も a・b・c の値がそれぞれ5増えていることが確認できます。
まとめ
参照渡しを使うと、関数内での変更が呼び出し元の変数に直接反映されます。複数の結果を関数から返したい場合や、大きなデータ構造をコピーせずに扱いたい場合などに有効な手法です。一方で、意図せず元の値を書き換えてしまうリスクもあるため、必要な場面を見極めて使うことが大切です。
-
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 サンプルプログラム 以下は、シ