Почему функция scanf () в некоторых случаях нуждается в & operator (address-of), а в других - нет? - PullRequest
4 голосов
/ 09 августа 2010

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

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

, но

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

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

Но как обстоит дело со строками?

Ответы [ 5 ]

5 голосов
/ 09 августа 2010

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

2 голосов
/ 09 августа 2010

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

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

1 голос
/ 09 августа 2010

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

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

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

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

0 голосов
/ 05 декабря 2018
  • Все переменные, используемые для получения значений через scanf(), должны передаваться по их адресам.Это означает, что все аргументы должны указывать на переменные, используемые в качестве аргументов.

    scanf("%d", &count);

  • Стинг считывается в символьные массивы, а имя массива без индексаэто адрес первого элемента массива. Чтобы прочитать строку в адрес массива символов, мы используем

    scanf("%s",address);

  • В этом случае адрес равенуказатель и перед ним не должен стоять оператор &.

0 голосов
/ 09 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...