引数
関数呼び出しの引数の形式を次に示します :
expression ( expression-list <SUB>opt</SUB> ) /* Function call */
関数呼び出しでは 式のリストは 式のリスト (コンマで区切って)。この二つの式の値には関数に渡された引数です。関数の引数がない場合は 式のリスト void は キーワードを含めます。
引数は基本クラス構造体共用体またはポインター型との値を指定できます。すべての引数を値渡しされます。これは引数のコピーがパラメーターに割り当てられていることを意味します。関数に渡される引数の実際のメモリ位置を認識できません。関数はまず派生変数に影響を与えずにコピーを使用します。
引数として配列または関数を渡すことはできませんがこれらの項目へのポインターを渡すことができます。ポインターは関数を参照する手段に値にアクセスします。変数へのポインターは変数のアドレスを保持するため変数の値にアクセスするにはこのアドレスを使用できます。ポインターは配列と関数の引数を引数として渡すことができませんが関数が配列と関数を使用できるようになります。
引数が評価される順序はコンパイラと最適化のレベルで変更できます。しかし関数に入る前に引数および副作用は完全に評価されます。副作用の詳細については副作用 を参照してください。
関数呼び出し 式のリストが 評価され通常の算術変換は関数呼び出しの引数で実行されます。プロトタイプが使用できる場合結果の引数の型はプロトタイプの対応するパラメーターと比較されます。これらは一致する変換は実行されます診断メッセージが発行されます。パラメーターは通常の算術変換が加えられています。
式のリスト の式の数は関数のプロトタイプまたは定義が明示的に可変個の引数を指定するパラメーターに一致する必要があります。この場合コンパイラはパラメーター リストに型名がありそれらを必要に応じて変換するのと同じ引数を上のようなチェックします。詳細については可変個の引数との呼び出し を参照してください。
プロトタイプのパラメーター リストがキーワードだけ void 含まれている場合関数呼び出し引数と定義にはパラメーターを受け取ります。診断メッセージは引数が検索されます。
例
この例では引数としてポインターを使用して :
int main()
{
/* Function prototype */
void swap( int *num1, int *num2 );
int x, y;
.
.
.
swap( &x, &y ); /* Function call */
}
/* Function definition */
void swap( int *num1, int *num2 )
{
int t;
t = *num1;
*num1 = *num2;
*num2 = t;
}
この例では int の値へのポインターである識別子 num1 と num2 によって表されるそれぞれ 2 個の引数があるとswap の関数は main で宣言されています。プロトタイプ スタイル定義のパラメーター num1 と num2 はint 型の値へのポインターとして宣言されています。
関数呼び出し
swap( &x, &y )
x のアドレスは num1 に格納されy のアドレスは num2 に格納されます。次に2 種類の名前つまりエイリアス 「と同じ場所については」です。swap の *num1 と *num2 への参照はmain の x と y への参照です。swap 内の割り当ては実際に x と y のコンテンツを交換します。したがってreturn のステートメントは必要ではありません。
コンパイラは swap に swap のプロトタイプが各パラメーターの引数の型が含まれるため引数の型をチェックします。プロトタイプの定義のかっこで囲まれた識別子はまたはです。重要な結果が引数の型がプロトタイプの定義の両方のパラメーター リストと一致することです。