При использовании scanf для массивов кажется, что функция работает нормально, использую оператор '&' или нет.
«Кажется», являясь рабочим словом.
За исключением случаев, когда оно является операндом операторов sizeof
или унарных &
или является строковым литералом, используемым для инициализациимассив символов в объявлении, выражение типа "массив N-элементов T
будет преобразован (" распад ") в выражение типа" указатель на T
"и значениевыражение будет адресом первого элемента массива.
Если вы вызываете scanf
как
scanf( "%s", s );
, выражение s
преобразуется извведите «100-элементный массив из char
» (char [100]
) в «указатель на char
» (char *
), и его значением является адрес первого элемента массива (&s[0]
).
Если вы называете scanf
как
scanf( “%s”, &s );
*, 1033 * является операндом унарного &
, поэтому преобразование не происходит, и выражение &s
имеет тип "указатель на массив из 100 элементов char
" (char (*)[100]
). Это проблема, поскольку спецификатор преобразования %s
ожидает аргумент типа char *
.Передача аргумента любого другого типа приводит к неопределенному поведению - операция может работать как ожидалось, или она может аварийно завершиться, или она может повредить данные, или она может оставить программу в плохом состоянии, так что онапозже происходит сбой и т. д.
Оба выражения s
и &s
разрешаются в одно и то же значение - адрес массива совпадает с адресом его первого элемента - но их типы различны, и в C разные типы указателей могут иметь разные представления (IOW, способ хранения значения адреса для char *
может отличаться от способа хранения значения адреса для char (*)[100]
).Так что
scanf( "%s", &s );
может произойти сбой на некоторых платформах.
Мой точный вопрос: когда я использую & ch (пока ch - строка), мы создаем двойной указатель?
Нет.Если ch
объявлено как char ch
, то &ch
имеет тип char *
.Если ch
объявлено как char ch[N]
, то &ch
имеет тип char (*)[N]
.