22

標準入力から数値を読み取りたい。変数の名前の前にscanfを使用する必要がある理由がわかりません:&

int i;
scanf("%d", &i);

なぜscanf変数のアドレスが必要なのですか?

4

7 に答える 7

29

変数を変更する必要があります。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;
}
于 2012-05-15T09:16:17.690 に答える
11

C 関数のパラメーターは常に「値渡し」です。つまり、関数scanfは、引数式として指定したものの現在の値のコピーのみを認識します。

この場合&iは、変数を参照するポインター値ですiscanfこれを使用して変更できますi。を渡した場合i、初期化されていない値のみが表示されます。これは (a) UB であり、(b)scanfを変更する方法を知るには十分な情報ではありませんi

于 2012-05-15T09:18:03.600 に答える
6

必要ありません。

char s[1234];

scanf("%s", s); 

&どこにもシングルがなくても問題なく動作します。scanf企業が必要としているのはポインターです。特定の変数を変更できるようにするには、その変数のアドレスを渡します。デフォルトで発生するいくつかのタイプの場合。他の場合は&、アドレスを取得するために使用します (その変数へのポインターを取得します)。

于 2012-05-15T13:39:28.110 に答える
4

そうしないと、オリジナルではなくコピーを変更するだけになるからです。

于 2012-05-15T09:16:20.437 に答える
2

scanf()値を格納するため、値を格納する場所が必要です。これは、または&(アンパサンド)演算子
を使用して値を格納する場所のアドレス(ポインター)を提供することによって行われます。addressof

于 2012-05-15T09:19:36.130 に答える
2

scanf は引数としてポインターを取るため、addressOf 演算子 (&) が必要です。したがって、渡された値に設定される変数を渡すには、変数を変更できるように変数からポインターを作成する必要があります。

ポインターを scanf に渡す必要がある理由は、変数を渡すだけでは、scanf 内で変数を直接変更することができないため、scanf によって読み取られた値に設定できなかったからです。

お役に立てれば。

于 2012-05-15T09:17:49.313 に答える
0

sscanf は & を必要としません

int decimal;
int *pointer = &decimal;
scanf("%d", pointer);

上記のコードは有効です

于 2012-05-15T09:22:14.900 に答える