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

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

参照渡し(Call by Reference)とは

参照渡しとは、関数を呼び出す際に、値そのものではなく変数のアドレス(メモリ上の場所)を引数として渡す方法のことです。C言語では、ポインタを使ってこの仕組みを実現します。

呼び出し側では実引数のアドレスを渡し、関数側ではそれをポインタ型の仮引数で受け取ります。関数の内部では、受け取ったアドレスを間接参照演算子(*)で操作することで、元の変数(実引数)の値に直接アクセスできます。

このため、関数内での変更が呼び出し元の変数にも反映されるのが大きな特徴です。一般的な「値渡し(Call by Value)」では変数のコピーが渡されるため元の値は変わりませんが、参照渡しであれば元のデータそのものを書き換えることが可能です。

サンプルコード:2つの値を入れ替えるswap関数

以下は、参照渡しを使って2つの整数の値を入れ替える典型的な例です。

#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);
   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=20 b=10

プログラムのポイント

  • swap(&a, &b):&演算子で変数aとbのアドレスを取得し、それを引数として渡しています。
  • void swap(int *a, int *b):仮引数がポインタ型になっているため、渡されたアドレスを受け取れます。
  • *a と *b:間接参照によって、アドレスが指し示す先の実際の値を読み書きします。

swap関数の中で*aと*bの値を入れ替えると、main関数内のaとbの値も入れ替わります。これは、関数が変数のコピーではなく、変数そのもの(アドレス)を操作しているためです。もし通常の値渡しでswap関数を作成した場合、入れ替えは関数内のコピーに対して行われるだけで、呼び出し元の値は変化しません。

  1. C#プログラミングとは?初心者にもわかる特徴と基本を徹底解説

    C#(シーシャープ)とは何かC#は、Microsoft(マイクロソフト)が開発したモダンで汎用性の高いオブジェクト指向プログラミング言語です。Windowsアプリケーションの開発をはじめ、Webサービス、ゲーム開発(Unity)、業務システムなど、幅広い分野で活用されています。C#は「共通言語基盤(CLI:Common Language Infrastructure)」向けに設計されています。CLIは実行可能なコードとランタイム環境から構成されており、これにより異なるコンピュータプラットフォームやアーキテクチャ上で、さまざまな高水準言語を利用できるようになっています。C#の主な特徴C#には、開

  2. C#のDictionary(辞書)とは?宣言・初期化の基本をわかりやすく解説

    C#のDictionary(辞書)とは C#におけるDictionary(ディクショナリ)は、キー(Key)と値(Value)のペアを格納するためのコレクションです。各キーは一意である必要があり、キーを指定することで対応する値へ高速にアクセスできるのが大きな特徴です。 Dictionaryは、System.Collections.Generic名前空間に含まれています。利用する際は、この名前空間をusingディレクティブで追加しておきましょう。 Dictionaryの宣言と初期化 Dictionaryを宣言して初期化するには、以下のように記述します。 IDictionary<int,