Почему scanf должен взять адрес оператора - PullRequest
9 голосов
/ 08 октября 2010

Как видно из названия, мне всегда интересно, почему scanf должен принимать оператор address of (&).

Ответы [ 6 ]

26 голосов
/ 08 октября 2010

Поскольку C имеет только параметры «передачи по значению», поэтому, чтобы передать «переменную» для помещения значения, необходимо передать его адрес (или указатель на переменную).

12 голосов
/ 08 октября 2010

scanf не принимает "адрес оператора (&)".Требуется указатель .Чаще всего указатель на выходную переменную получается с помощью оператора address-of в вызове 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);
7 голосов
/ 08 октября 2010

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

2 голосов
/ 08 октября 2010

Все остальные хорошо описали, что sscanf должен поместить свои выходные данные куда-нибудь , но почему бы не вернуть его?Поскольку он должен возвращать много вещей - он может заполнить более одной переменной (управляемой форматированием) и возвращает int, указывающий, сколько из этих переменных он заполнил.

1 голос
/ 09 октября 2010

как значение будет сохранено (где?) В адресе памяти. поэтому scanf () работает с оператором (&).

1 голос
/ 08 октября 2010

Когда вы вводите что-либо со стандартного устройства ввода (обычно с клавиатуры), данные, которые проходят через, должны быть где-то stored.Вы должны point где-то в памяти, чтобы данные могли храниться там.Чтобы point ячейка памяти, вам нужно address этой ячейки.Таким образом, вы должны передать адрес переменной, используя оператор & с scanf().

...