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;
}

上のプログラムを実行したときの出力として、正しいものはどれか。

  1. A1 20
  2. B10 1
  3. 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のままです。
この分野を解く 分野ページへ

C言語の基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

C言語の基礎のほかの問題

  1. 上の関数 f を3回続けて呼び出したとき、3回目の戻り値として正しいものはどれか。
  2. C言語で、(1) 関数の中で static を付けずに宣言した局所変数、(2) malloc で確保した領域、(3) 関数の外で宣言した変数、のそれぞれが存在する期間(寿命)の組み合わせとして正しいものはどれか。
  3. int は32ビット(最大値 2147483647)とする。上の関数 fact(n) が、n の階乗をオーバーフローを起こさずに正しく返す最大の n はどれか。
  4. int は4バイト、ポインタは8バイトとする。int 型へのポインタ p の値(番地)が 0x1000 のとき、p + 3 の値はどれか。
  5. int は4バイト、ポインタは8バイトとする。上のプログラムを実行したときの出力として、正しいものはどれか。