>>35
長くてごめん。
>b = sub(&a, &a);
となってるからとしか言えないんだけど。
重要なのは0という数値じゃなくて0が入ったaのアドレスが渡されてるってこと。
xもyも指してる実体は同じaだから、xへの操作はyへの操作と同じだし同様にyへの操作もxへの操作となる。
だから実際は以下と同じようになってるってわけ。

int sub(int *x) {
(*x)++;
(*x)++;
return *x + *x;
}