Почему 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 ответа:
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]дают один и тот же результат (возвращая первый символ в массиве).