C言語の関数呼び出し規則

1488 ワード

C言語の関数呼び出しルール:すべてのパラメータが値呼び出しです.しかし、私たちが普段言っているアドレス呼び出しは何ですか?これが私たちが説明しなければならないことです.
C関数のすべてのパラメータは「値伝達コール」方式で伝達され、これは関数がパラメータ値のコピーを取得することを意味する.これにより、呼び出しプログラムが実際に渡されるパラメータを変更する心配がなく、このコピー値を安心して変更できます.
ただし、渡されたパラメータが配列名であり、関数でその配列を参照するパラメータが下付き文字で使用されている場合、関数で配列要素数を変更すると、実際には呼び出しプログラムの配列要素が変更されます.関数は呼び出しプログラムの配列要素にアクセスし、配列はコピーされません.この動作は「アドレス呼び出し」と呼ばれます.
配列パラメータという挙動は,伝値呼び出し規則と矛盾しているようだ.しかし、ここでは矛盾はありません.配列名の値はポインタであり、関数に渡されるのはこのポインタのコピーです.下付き参照は実際には間接アクセスの別の形式であり、ポインタに対して間接アクセス操作を実行することができ、ポインタが指すメモリ位置にアクセスすることができ、パラメータは実際にはコピーであるが、このコピーで間接アクセス操作を実行するには元の配列にアクセスする.
アドレス呼び出しとは、必要な要素を指すポインタを渡し、関数内でそのポインタに間接アクセス操作を行うことによってデータへのアクセスを実現することである.パラメータとしての配列名はポインタであり,下付き参照は実際に実行される間接アクセスである.
では,配列の伝値呼び出し挙動はどこに現れるのでしょうか.関数に渡されるのはパラメータのコピー(配列の開始位置を指すポインタのコピー)であるため、関数は実パラメータとしてのポインタを変更する心配がなく、ポインタパラメータを自由に操作することができる.
したがって,パラメータはいずれも値伝達によって伝達される.
古典的な2つの整数を交換する関数(効果なし)は、値呼び出しを説明することができます.
void swap(int x,int y)
{
       int temp;
       temp = x;
       x = y;
       y = temp;
 }

これは効果のない整数交換です.実際にはパラメータのコピーが交換されているため、元のパラメータ値は交換されていません.
上記のプログラムを変更する場合は、ポインタを使用して実行できます.
void swap(int *x,int *y)
{
     int temp;
    temp=*x;
    *x=*y;
    *y=temp;
}

呼び出しプログラムの値にアクセスするには、変更する変数を指すポインタを関数に渡さなければなりません.次に、関数はポインタに間接アクセス操作を使用し、変更する変数を変更する必要があります.
プライマリ関数では、関数が受け入れるパラメータがポインタであることを望むため、swap(&a,&b)と呼び出すべきです.