C は値渡し言語です。あなたが書くなら:
int x;
scanf("%d", x);
scanf
スキャンされた結果をどこに置くべきかわかりません-スキャンされた値を保存するメモリ位置へのポインターを渡す必要があります。
scanf("%d", &x);
理解に役立つ場合は、明示的なポインター変数を作成することもできます。
int *y = &x;
scanf("%d", y);
逆にprintf
、値がどこにあるかは気にせず、値がたまたま何であるかだけを気にします。したがって、値を渡します:
printf("%d", x);
大丈夫です。あなたの特定の質問について(仮定int var;
):
printf("%d",&var)
とはどう違いますかprintf("%d",var)
厳密に言えば、1 つ目は未定義の動作を引き起こし、2 つ目は の値を出力しますvar
。実際には、実装の多くはvar
最初のケースでのアドレスを出力します。
printf("%p",&var)
とはどう違いますかprintf("%p",var)
このケースはまさに逆です。1 つ目は のアドレスを出力しvar
、2 つ目は未定義の動作を引き起こします。実際には、おそらく の値var
が出力されますが、それに頼るべきではありません。本当に正しいためには、最初のものprintf("%p", (void *)&var);
も である必要がありますが、そこに書いたものがうまく機能しない実装を見たことはありません。