Почему scanf требует &?

Я хочу прочитать номер из стандартного ввода. Я не понимаю, почемуscanf требует использования& перед именем моей переменной:

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

Почемуscanf нужен адрес переменной?

Ответы на вопрос(7)

Это не нужно.

char s[1234];

scanf("%s", s); 

Работает просто отлично без единого& в любом месте. Какиеscanf и компании нужныpointers, Чтобы позволить ему изменить конкретную переменную, вы передаете адрес этой переменной. Для нескольких типов это происходит по умолчанию. Для других вы используете& взять адрес (получить указатель на эту переменную).

Sscanf не требует & amp;

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

вышеуказанный код действителен

scanf() хранит значения, поэтому ему нужно место для их хранения.
Это делается путем предоставления адресов (в указателях) где хранить значения, используяaddressof или & amp; (амперсанд) оператор.

Параметры функции Calways «передача по значению», что означает, что функцияscanf видит только копию текущего значения того, что вы указали в качестве выражения аргумента.

В этом случае&i это значение указателя, которое ссылается на переменнуюi. scanf можно использовать это, чтобы изменитьi, Если вы прошлиi, тогда он будет видеть только неинициализированное значение, которое (а) является UB, (б) не является достаточной информацией дляscanf знать, как изменитьi.

Для scanf требуется оператор addressOf (& amp;), поскольку он принимает указатель в качестве аргумента. Поэтому, чтобы передать переменную, которая будет установлена в переданное значение, вы должны сделать указатель из переменной, чтобы ее можно было изменить.

Причина, по которой указатель должен быть передан в scanf, состоит в том, что если вы только что передали переменную, вы не сможете напрямую изменить переменную в scanf, поэтому вы не можете установить для нее значение, считываемое scanf.

Надеюсь это поможет.

Потому что в противном случае это будет только изменение копии, а не оригинала.

Решение Вопроса

Нужно изменить переменную. Поскольку все аргументы в C передаютсяby value вам нужно передать указатель, если вы хотите, чтобы функция могла изменять параметр.

Вот очень простой пример, показывающий это:

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;
}

Ваш ответ на вопрос