Да, char *input
может быть назначено для переменной типа const char *
с неявным преобразованием типа, а аргументы C работают как при присваивании . Правило это в C11 6.5.16.1.1 :
6.5.16.1 Простое назначение
Ограничения
- Должно быть выполнено одно из следующих действий:
[...]
- левый операнд имеет атомный, квалифицированный или неквалифицированный тип указателя и (учитываятип, который будет иметь левый операнд после преобразования lvalue) оба операнда являются указателями на квалифицированные или неквалифицированные версии совместимых типов, а тип, на который указывает левый, имеет все квалификаторы типа, на который указывает правый;
[...]
При выполнении
const char *cinput;
cinput = input;
левый операнд cinput
имеет неквалифицированный тип указателя (тип указателя сам не является const
-квалифицированным);как и правый операнд.
Левый операнд - указатель - a const-квалифицированный тип (const char
) и тип, указанныйк правый операнд не имеет квалификаторов. Тип, на который указывает левый угол, имеет поэтому все квалификаторы типа , на которые указывает правый и дополнительный const
квалификатор, следовательно, назначение является действительным.
И при вызове функции
double str2double(const char* input);
[...]
char *foo = ...
str2double(foo);
поведение такое, как если бы значение foo
было присвоено параметру input
простым присваиванием.
Строковый литерал в C имеет тип массива неквалифицированный символ , который уменьшается до char *
, т. Е. Если бы не было нормально передавать char *
в такую функцию, выневозможно использовать double str2double( const char* input);
, передавая строковый литерал в качестве аргумента.