Вы должны передать указатель на функцию, чтобы он знал, где в памяти хранить значение. Если вы просто пройдете по значению, он будет рассматривать это как адрес памяти, и весь ад разрывается. Поэтому вы используете &
, чтобы взять ссылку (т. Е. Адрес памяти) вашей переменной.
Именно поэтому A и D являются неправильными.
Что касается C, он выглядит правильно, потому что вы поставляете указатель, но вы на самом деле ссылки на этот указатель. Таким образом, scanf
будет писать поверх самого указателя, а не на память, на которую он указывает.
Если вы только что поставили s
, тогда мы попадаем в другую землю без земли. Указатель представляет собой строковый литерал , который вы не можете изменять. Однако, если это не было буквальным, но массив с помощью литерала как инициализаторе он бы будет хорошо, если вы не читали в больше данных, чем он может хранить:
char s[] = "1234567"; scanf("%3s", s); /* this is okay */
Вы прочитали [ссылку] (http://en.cppreference.com/w/cpp/io/ с/fscanf)? – UnholySheep
'scanf' необходимо изменить переменные, обратившись к памяти. Для этого нужен адрес. Поэтому подумайте, в каких примерах он фактически получает действительный адрес. – StoryTeller
Есть ли случаи, когда амперсанд или ссылка не нужны? Я чувствую, что видел примеры, опуская &, но, возможно, я ошибаюсь. Я думал, что ссылки нужны только для строк и массивов по какой-то причине. – Nuggets10