引数
実引数と仮引数
関数を使用する場合、呼び出し側と定義側の両方で引数が必要になります。
この引数の呼び出し側を実引数、定義側を仮引数といいます。
呼び出し側
int score = 100;
// 呼び出し側が実引数(score)
PrintScore(score);
定義側
// 定義側が仮引数(int score)
void PrintScore(int score)
{
printf("score = %d\n", score);
}
引数の種類
実引数と仮引数の受け渡しにはいくつかの種類があります。
値渡し
値渡しは実引数と仮引数はまったく別の変数であると考えます。
関数の中で仮引数を変更したとしても実引数には影響を与えません。
値渡しは実引数と同じ値の別の変数を定義側で用意するようなものです。
値渡しの例
void LevelUp(int lv_, int hp_)
{
lv_++;
hp_ += 10;
}
int main(void)
{
int lv = 1;
int hp = 10;
LevelUp(lv, hp);
printf("Level:%d\n", lv);
printf("Hp:%d\n", hp);
return 0;
}
実行結果:
Level:1
Hp:10
実行結果からわかるようにLevelUp関数の中で引数の値を変更しても
main関数内のlvやhpには影響がありません。
ポインタ渡し
ポインタ渡しと呼ばれている引数の受け渡し方法も
方法自体は値渡しですが、渡している値が通常の変数ではなく
アドレスですので、そこを区別するために別名がつけられています。
ポインタ渡しは呼び出し側で変数のアドレスを渡します。
そして定義側ではポインタ型の変数として受け取ります。
関数内で引数の値の変更があった場合、呼び出し側の変数の値も変わります。
ポインタ渡しの例
void LevelUp(int *plv, int *php)
{
*plv = *plv + 1;
*php = *php + 10;
}
int main(void)
{
int lv = 1;
int hp = 10;
LevelUp(&lv, &hp);
printf("Level:%d\n", lv);
printf("Hp:%d\n", hp);
return 0;
}
実行結果:
Level:2
Hp:20
実行結果からLevelUp関数を呼び出した後のlvやhpが
変更されていることがわかります。
このようにポインタ渡しは関数の呼び出し側と定義側で
同じアドレスの変数として引数を扱うので
定義側での引数の変更が呼び出し側にも影響を与えます。