次のC言語のプログラムを実行したときに表示される結果を選べ。ただし、& は変数のアドレスを得る演算子、* はアドレスが指しているメモリの内容を得る演算子、++
はメモリの内容に1を加える演算子である。
#include <stdio.h>
int sub (int *x, int *y) {
(*x)++;
(*y)++;
return *x + *y;
}
main () {
int a = 0, b = 0;
b = sub(&a, &a);
printf("%d %d\n", a, b);
}
@ 0 2
A 0 3
B 1 3
C 2 3
D 2 4
D
sub(&a, &a) で a のアドレスを引数としているが、sub (int *x, int *y) で同じアドレスが指しているメモリの値をそれぞれで定義しているところがポイントになる。
(*x) の値と(*y) の値は連動する。
以下のように変数の値が変化していく。
int a = 0, b = 0 ・・・ (a, b) = (0, 0)
sub(&a, &a) ・・・ (a, b) = (0, 0)
sub(int *x, int *y) ・・・ (a, b) = (0, 0), (*x, *y) = (0, 0)
(*x)++ ・・・ (a, b) = (1, 0), (*x, *y) = (1, 1)
(*y)++ ・・・ (a, b) = (2, 0), (*x, *y) = (2, 2)
return *x + *y ・・・ (a, b) = (2, 0), (*x, *y) = (2, 2)
b = sub(&a, &a) ・・・ (a, b) = (2, 4)
printf("%d %d\n", a, b); ・・・ 2 4 を出力する。
W−1 | 目次 | W−3 |