C言語の基礎
void f(int x) { x = 10; }
void g(int *p) { *p = 20; }
int main(void) {
int a = 1, b = 1;
f(a);
g(&b);
printf("%d %d\n", a, b);
return 0;
}上のプログラムを実行したときの出力として、正しいものはどれか。
- A1 20
- B10 1
- C10 20
答えと解説を見る
正解:A. 1 20
C言語の関数の引数は値渡しで、f(a) を呼ぶと a の値1が x にコピーされます。f の中で x を10にしても変わるのはコピーだけで、呼び出し側の a は1のままです。g(&b) では b の番地を渡しているので、g の中の *p = 20 は b そのものに書き込み、b は20になります。呼び出した関数の中で呼び出し側の変数を変えたいときは、このようにポインタを渡します。
- A. 正しい。値を渡した a は変わらず、番地を渡した b は20になります。
- B. f と g の働きを逆に考えた場合の値です。値渡しの f は a を変えず、番地を受け取る g が b を変えます。
- C. f の中で変わるのは引数 x(a のコピー)だけで、a は1のままです。