タイトルが示すように、なぜ演算子 (&)scanf
を取らなければならないのか、いつも疑問に思っています。address of
8 に答える
Cには「値渡し」パラメーターしかないため、値を入れる「変数」を渡すには、そのアドレス(または変数へのポインター)を渡す必要があります。
scanf は「演算子(&)のアドレス」を取りません。ポインタを取ります。ほとんどの場合、出力変数へのポインターは、scanf 呼び出しでアドレス演算子を使用して取得されます。
int i;
scanf("%i", &i);
printf("number is: %d\n", i);
しかし、それが唯一の方法ではありません。以下も同様に有効です。
int *iPtr = malloc(sizeof(int));
scanf("%i", iPtr);
printf("number is: %d\n", *iPtr);
同様に、次のコードでも同じことができます。
int i;
int *iPtr = &i;
scanf("%i", iPtr);
printf("number is: %d\n", i);
読み取った値を配置するにはアドレスが必要だからです。変数をポインターとして宣言する場合、scanf
は必要ありません&
。
他の誰もが、sscanf がその出力をどこかに置く必要があることをよく説明していますが、それを返さないのはなぜですか? 多くのものを返す必要があるため、(フォーマットによって駆動される) 複数の変数を入力することができ、入力した変数の数を示す int を返します。
値が(どこに?)メモリアドレスに格納されるためです。そのため、scanf() は (&) 演算子を扱います。
標準入力デバイス (通常はキーボード) で何かを入力する場合、データはstored
どこかにある必要があります。point
データをそこに保存できるように、メモリのどこかにある必要があります。メモリの場所には、その場所point
の が必要address
です。&
したがって、演算子 withを使用して、変数のアドレスを渡す必要がありますscanf()
。
それはあなたが何かを保存しているからです。関数がどのように機能する必要があるかを考えてみてください。printf では、結果を出力するだけの void 関数と考えることができます。scanf を使用すると、一部のデータを保持したいので、関数を終了した後でも、入力したデータが格納されるポインター (別名アドレス) が必要です。「int」などのデータ型の引数を使用した場合、scanf 関数を終了するとすぐにデータが失われます。つまり、親関数の次のコード行で、scanfed したデータは次のようになります。なくなった。