Почему scanf не нужен амперсанд для строк, а также отлично работает в printf (на C)?

Сейчас я изучаю строки в Си.

Как использовать scanf для получения строки, которую вы можете сделать

scanf("%s",str1);

и для printf вы можете сделать

printf("The string is %s\n", str1);

Я понимаю, что для scanf это потому, что строка - это просто массив символов, который является указателем, но для printf, как вы можете просто указать имя переменной так же, как для int или float?


person Adam    schedule 19.12.2009    source источник


Ответы (2)


scanf требуется адрес переменной для чтения, а строковые буферы уже представлены как адреса (указатель на место в памяти или массив, который разлагается на указатель).

printf делает то же самое, рассматривая %s как указатель на строку.

person GManNickG    schedule 19.12.2009

В C переменные, которые являются массивами, становятся указателем на первый элемент массива при использовании в качестве аргументов функции - так что ваш scanf () видит указатель на память (при условии, что «str1» является массивом).

В вашем printf () "str1" может быть либо указателем на строку, либо массивом символов (в этом случае аргумент, видимый printf (), будет указателем на первый элемент массива).

person Steve Emmerson    schedule 19.12.2009
comment
Точнее, выражение типа массива неявно преобразуется (распадается) в указатель на первый элемент массива в большинстве, но не во всех контекстах. Аргумент функции оказывается одним из контекстов, в которых происходит преобразование. - person Keith Thompson; 19.01.2012