プログラミング言語においては関数等の呼び出しの際の実引数と仮引数の関連づけについて種々の方式があります。 C言語では値呼びだし方式(call by value)が使われています。

 値呼びだし方式(call by value)では実引数の値を仮引数の値にコピーします。これにより仮引数側(すなわち関数本体側)では実引数の値のみ利用することができます。しかし値のみですから、仮引数 x に対して x = 20 の様な形式で代入を行なっても、その効果は関数本体のみに留まり、呼びだし側には伝わりません。
void set20(int x){
   x = 20;
}

int main(void){
    int a = 10;       /* aを10に初期化 */
    set20(a);         /* 実引数としてaを与え,set20() を呼ぶ */
    printf("%d", a);  /* set20()内では,aの値のコピーを操作しているが、その
                         影響を受けないので、10 と表示される */
}
 これに対して実引数のアドレスを仮引数へ渡して利用可能とする方式を 参照呼びだし方式(call by reference)と呼びます。この場合には仮引数側でアドレスを利用できるために、代入が有効となります。 正確には、C言語では参照呼びだし方式(call by reference)は無いので、アドレスを引数に渡すことで、参照呼び出しと同様の振る舞いを真似ています。
void set20a(int *y){
   (*y) = 20;
}

int main(void){
   int a = 10;       /* aを10に初期化 */
   set20a(&a);       /* 実引数として a のアドレスを与え,set20a() を呼ぶ */
   printf("%d", a);  /* set20a()内では,aのアドレス値をたよりに,
                        main側のaの値にアクセスすることができるので,
                        ここでは 20 と表示される */
}