И name
, и &name
должны давать одинаковый результат.Строго говоря, только name
допустимо в соответствии со стандартом языка C и &name
приводит к неопределенному поведению, поэтому вам обязательно следует использовать name
, но на практике оба будут работать.
name
- этомассив, поэтому, когда вы используете его в качестве аргумента функции (как вы делаете, когда вы передаете его в printf
), он «разлагается» на указатель на свой начальный элемент (который здесь char*
).
&name
дает вам адрес массива;этот адрес совпадает с адресом начального элемента (поскольку не может быть байтов заполнения перед начальным элементом массива или между элементами в массиве), поэтому &name
и name
имеют одинаковое значение указателя.
Однако они бывают разных типов: &name
имеет тип char (*)[30]
(указатель на массив 30 char
), а name
, когда он распадается на указатель на свой начальный элемент,имеет тип char*
(указатель на char
, в данном случае, начальный char
элемент массива name
).
, поскольку они имеют одинаковое значение, а с * 1028Функции * и scanf
все равно интерпретируют аргумент как char*
, не должно быть никакой разницы, передаете ли вы name
или &name
.