値渡し
関数に引数を渡す方法の一つに「値渡し」があります。
値渡しでは、引数として渡された値のコピーが関数内で使用されます。
つまり、関数内で引数の値を変更しても、元の値には影響を与えません。
値渡しの仕組み
値渡しでは、関数呼び出し時に引数の値がコピーされ、関数内で使用されます。
関数内で引数の値を変更しても、元の値には影響を与えません。
値渡しの仕組みを以下の例で説明します。
#include <stdio.h>
void changeValue(int num) {
num = 10; // 引数の値を変更
}
int main() {
int num = 5;
printf("変更前の値: %d\n", num);
changeValue(num);
printf("変更後の値: %d\n", num);
return 0;
}
上記のコードでは、changeValue
という関数を定義し、引数としてnum
を受け取っています。
関数内でnum
の値を10に変更しています。
main関数
では、変数num
の初期値を5とし、その値を表示しています。
その後、changeValue関数
を呼び出し、num
の値を変更します。
最後に、変更後の値を表示しています。
実行結果は以下のようになります。
変更前の値: 5
変更後の値: 5
値渡しでは、関数内で引数の値を変更しても、元の値には影響を与えません。
そのため、changeValue関数
内でnum
の値を変更しても、main関数
内のnum
の値は変わりません。
ただし、引数の値が大きなデータ構造や配列の場合、コピーによるメモリ使用量の増加や処理時間の増加が懸念されることがあります。
参照渡し
参照渡しの仕組み
参照渡しは、関数に引数として渡された変数のメモリ上のアドレスを直接参照する方法です。
つまり、関数内で引数の値を変更すると、元の変数の値も変更されます。
参照渡しを行うためには、引数の型の前に &
を付けて宣言します。
例えば、int型
の変数を参照渡しする場合は、以下のように宣言します。
void func(int& num) {
// 引数の値を変更する処理
}
参照渡しの例
以下の例では、参照渡しを使用して引数の値を変更する方法を示します。
#include <stdio.h>
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 10;
int y = 20;
printf("交換前:x = %d, y = %d\n", x, y);
swap(x, y);
printf("交換後:x = %d, y = %d\n", x, y);
return 0;
}
上記のプログラムでは、swap関数
を定義しています。
この関数は、引数として渡された2つの変数の値を交換する役割を持ちます。
main関数
内で、x
とy
の値を表示した後にswap関数
を呼び出し、再度x
とy
の値を表示しています。
実行結果は以下のようになります。
交換前:x = 10, y = 20
交換後:x = 20, y = 10
参照渡しを使用することで、swap関数
内での値の交換が元の変数に反映されていることが確認できます。
参照渡しはポインタの間接参照を意識する必要がなく、より直感的に変数の値を変更することができます。
ポインタ渡し
ポインタ渡しの仕組み
ポインタ渡しは、引数として変数のアドレスを渡す方法です。
関数内で引数のアドレスを参照することで、元の変数の値を変更することができます。
ポインタ渡しの仕組みは以下のようになります。
- 関数の引数として、ポインタ型の変数を宣言します。
- 関数呼び出し時に、変数のアドレスを引数として渡します。
- 関数内でポインタを通じてアドレスを参照し、値を変更します。
ポインタ渡しは、値渡しとは異なり、関数内での変数の値の変更が元の変数にも反映されるという特徴があります。
ポインタ渡しの例
以下の例では、ポインタ渡しを使って関数内で変数の値を変更する方法を示します。
#include <stdio.h>
// ポインタ渡しの関数
void changeValue(int* num) {
*num = 100; // ポインタを通じて値を変更
}
int main() {
int num = 10;
printf("変更前の値: %d\n", num);
// 関数呼び出し時に変数のアドレスを渡す
changeValue(&num);
printf("変更後の値: %d\n", num);
return 0;
}
このプログラムでは、changeValue関数
にnum
のアドレスを渡しています。
関数内でポインタを通じて値を変更するため、num
の値が100
に変わります。
実行結果は以下のようになります。
変更前の値: 10
変更後の値: 100
このように、ポインタ渡しを使うことで関数内で変数の値を変更することができます。
ポインタ渡しは、特定の変数の値を関数内で変更する場合に有用な方法です。