Почему scanf () нуждается в & operator (address-of) В некоторых случаях, а не в других?


Почему мы должны поместить оператор & в scanf() для хранения значений в целочисленном массиве, но не при хранении строки в массиве символов?

int a[5];
for(i=0;i<5;i++)
scanf("%d",&a[i]);

Но

char s[5]; scanf("%s",s);

Нам нужно передать адрес места, где мы храним значение, так как массив является указателем на первый элемент. Так что в случае с массивами int/float это в основном означает (a+i).

Но что происходит со строками?

4 4

4 ответа:

Scanf принимает указатель на то, во что вы вводите значение. В первом случае вы передаете ссылку на конкретный int в позиции i в вашем целочисленном массиве. Во втором случае вы передаете весь массив в scanf. В C массивы указателей являются синонимами и могут использоваться взаимозаменяемо (своего рода). Переменная s на самом деле является указателем на память, которая имеет непрерывное пространство для 5 символов.

Когда вы используете имя массива в выражении (за исключением операнда sizeof или адреса оператора &), он будет вычисляться по адресу первого элемента в этом массиве-то есть по значению указателя. Это означает, что для получения адреса не требуется &.

Когда вы используете int (или short, long, char, float, double и т. д.) в выражении (опять же, за исключением операнда sizeof или &) он вычисляется до значения этого объекта. Чтобы получить адрес (то есть значение указателя), вы нужно использовать &, чтобы взять адрес.

scanf("%d", a + i ) тоже работает.

%d и %s Просто скажите scanf, чего ожидать, но в обоих случаях он ожидает адрес

В языке Си массивы и указатели связаны между собой.

%s просто говорит scanf ожидать строку, которая является \0 завершенной, будет ли она вписываться в массив символов или нет scanf не имеет значения.

Потому что массивы символов являютсяуже указателями.

Массивы C можно рассматривать как указатели на выделенный стеком объем оперативной памяти. Вы даже можете использовать операции с указателями на них вместо индексации массива. *a и a[0] дают один и тот же результат (возвращая первый символ в массиве).