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