0

scanf() は引数としてポインターを必要としますが、printf は必要ありません。printf は変数の名前を必要とするだけで、変数のメモリ位置に格納されている値を何らかの形で取得するようです。変数名をメモリ ロケーションに解決し (printf が機能するのと同じ方法で)、そこに値を格納することにより、scanf が同じように動作しないのはなぜですか?

  1. printf("%d",&var) と printf("%d",var) の違いは何ですか
  2. printf("%p",&var) と printf("%p",var) の違いは何ですか
4

4 に答える 4

5

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);も である必要がありますが、そこに書いたものがうまく機能しない実装を見たことはありません。

于 2013-04-15T20:11:30.670 に答える
0

最初のケースでは、 のアドレスを印刷していますvar。2 番目のケースでは、val.
&valのアドレスですval
scanf値を取得するためにアドレス (ポインタ) を取得します

于 2013-04-15T20:11:09.340 に答える
0

変数を値でprintfに渡します。printfが知る必要があるのはそれだけです。変数(または式)の値を出力することだけが想定されています。しかし、scanf は標準入力などから読み取ったデータを配置する変数が占めるメモリを変更する必要があります。そのため、scanf は変数が占有するメモリのアドレスを必要とします。変数を変更する他の方法はありません。

于 2013-04-15T20:12:07.497 に答える
0

scanf()引数を変更する必要があるためです。また、C では、引数の「参照渡し」セマンティクスがないため、値渡しのみ (これは、関数に渡されるときに各引数の値がコピーされることを本質的に意味します)、したがって、ポインターのみを使用して関数は引数を変更します。

printf("%d", &var)とはどう違いprintf("%d", var)ますか?

最初のものは常に未定義の動作を呼び出します.2番目のものはそうvarではintありませんshortchar

printf("%p", &var)とはどう違いprintf("%p", var)ますか?

var最初のものは常に未定義の動作を呼び出します.2番目のものはそうではありませんvoid *.

于 2013-04-15T20:12:35.227 に答える