標準入力から数値を読み取りたい。変数の名前の前にscanf
を使用する必要がある理由がわかりません:&
int i;
scanf("%d", &i);
なぜscanf
変数のアドレスが必要なのですか?
変数を変更する必要があります。C のすべての引数は値によって渡されるため、関数でパラメーターを変更できるようにする場合は、ポインターを渡す必要があります。
これを示す非常に単純な例を次に示します。
void nochange(int var) {
// Here, var is a copy of the original number. &var != &value
var = 1337;
}
void change(int *var) {
// Here, var is a pointer to the original number. var == &value
// Writing to `*var` modifies the variable the pointer points to
*var = 1337;
}
int main() {
int value = 42;
nochange(value);
change(&value);
return 0;
}
C 関数のパラメーターは常に「値渡し」です。つまり、関数scanf
は、引数式として指定したものの現在の値のコピーのみを認識します。
この場合&i
は、変数を参照するポインター値ですi
。scanf
これを使用して変更できますi
。を渡した場合i
、初期化されていない値のみが表示されます。これは (a) UB であり、(b)scanf
を変更する方法を知るには十分な情報ではありませんi
。
必要ありません。
char s[1234];
scanf("%s", s);
&
どこにもシングルがなくても問題なく動作します。scanf
企業が必要としているのはポインターです。特定の変数を変更できるようにするには、その変数のアドレスを渡します。デフォルトで発生するいくつかのタイプの場合。他の場合は&
、アドレスを取得するために使用します (その変数へのポインターを取得します)。
そうしないと、オリジナルではなくコピーを変更するだけになるからです。
scanf()
値を格納するため、値を格納する場所が必要です。これは、または&(アンパサンド)演算子
を使用して値を格納する場所のアドレス(ポインター)を提供することによって行われます。addressof
scanf は引数としてポインターを取るため、addressOf 演算子 (&) が必要です。したがって、渡された値に設定される変数を渡すには、変数を変更できるように変数からポインターを作成する必要があります。
ポインターを scanf に渡す必要がある理由は、変数を渡すだけでは、scanf 内で変数を直接変更することができないため、scanf によって読み取られた値に設定できなかったからです。
お役に立てれば。
sscanf は & を必要としません
int decimal;
int *pointer = &decimal;
scanf("%d", pointer);
上記のコードは有効です