【プログラミング言語C】第1章 「やさしい入門」
1.8 引数 値による呼び出し(call by value)
関数の引数について解説します。
C言語の関数の引数は値による呼び出し(call by valude)と呼ばれます。
簡単に言うと関数内で値を変更しても呼び出し側には影響を与えません。
具体的にはサンプルプログラムを使って説明します。
プログラムの目的
与えられた引数の値を変更する関数を用意し、呼び出し元の値が変わっていないことを確認する。
ソースコード
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//============================================================================= | |
//============================================================================= | |
/*! @file function.cpp | |
@brief プログラミング言語C 1.8 引数 値による呼び出し(call by value) | |
@author chiegraプログラミング教室 | |
@date 2020/11/23 | |
@par 履歴 | |
Copyright (C) 2020 chiegra. All rights reserved. | |
*/ | |
//============================================================================= | |
//============================================================================= | |
#include <stdio.h> | |
//============================================================================= | |
/*! | |
@brief 引数の値を変更しても呼び出し元には影響を及ぼさないことを示す関数 | |
@return void | |
@note 引数valは関数sample内部でのみ使われるので呼び出し元には影響しない | |
@author yoimonologue | |
@date 2020/11/23 | |
@par 履歴 | |
*/ | |
//============================================================================= | |
void sample (int val //!< [in]与えられた値を関数内で2倍にするが | |
//!< 戻り値は何も返さない | |
) | |
{ | |
val *= 2; //valの値を2倍する | |
} | |
//============================================================================= | |
/*! | |
@brief 値による呼び出しのテスト | |
@return int main関数の実行結果 | |
@note なし | |
@author yoimonologue | |
@date 2020/11/20 | |
@par 履歴 | |
*/ | |
//============================================================================= | |
int main() | |
{ | |
int val = 10; | |
printf ("val = %d\n", val); | |
sample(val); //sample関数の内部で引数valを2倍にしている | |
printf ("val = %d\n", val); | |
return 0; | |
} | |
解説
メイン関数からプログラムの流れを追っていきます。
ステップ送りがわかりやすいと思いますので以前ご説明したようにデバッガでステップ送りをしましょう。
コンパイルが終了したらF11キーを押して下さい。
mainの頭で停止しているはずです。
①最初のpirintfの行で停止させvalの値を確認。
ウオッチで値を確認できます。
valの値は10になっています。
②ステップ送りでsample関数まで進める
sample関数の最後ではvalの値が20であることを確認して下さい
③mainに戻るとvalの値は10に戻っています
valの値がmain関数とsample関数で変わってしまったので不思議に思われるかも知れません。
理由はsample関数のint valとmain関数のint valは別の変数だからです。
sample関数が呼ばれるときにsample関数の変数(引数)int valにmain関数のint valの値のみが渡されます。
これが値による参照(call by value)です。
したがってsample関数内の変数valの値が変更されてもmainのvalには影響を与えません。
動作の確認
実行させると以下のように表示されます。
val = 10
val = 10
以上です、今回はここまで
ディスカッション
コメント一覧
まだ、コメントがありません