Почему scanf не нужен амперсанд для строк, а также отлично работает в printf (в C)? - PullRequest
8 голосов
/ 19 декабря 2009

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

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

scanf("%s",str1);

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

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

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

Ответы [ 2 ]

10 голосов
/ 19 декабря 2009

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

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

5 голосов
/ 19 декабря 2009

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

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

...