我能用C把char*传递给const char*吗?
我正在实现一个在C中将字符串转换为double的函数。该函数不是破坏性的,即我不修改传递的字符串,我只是在函数中读取它。我想把char*、const char*和string literal传递给函数 以下功能是否适用于此目的?我认为问题可以归结为C中是否定义并允许将char*传递给const char*我能用C把char*传递给const char*吗?,c,char,constants,C,Char,Constants,我正在实现一个在C中将字符串转换为double的函数。该函数不是破坏性的,即我不修改传递的字符串,我只是在函数中读取它。我想把char*、const char*和string literal传递给函数 以下功能是否适用于此目的?我认为问题可以归结为C中是否定义并允许将char*传递给const char* double str2double( const char* input); 多谢各位。(我发现了一些类似的问题标题,但他们的答案对我来说很模糊,我在这里问。)是的,这是允许的。在这种情况下
double str2double( const char* input);
多谢各位。(我发现了一些类似的问题标题,但他们的答案对我来说很模糊,我在这里问。)是的,这是允许的。在这种情况下使用
const
是一种很好的做法。通过将其添加到函数参数中,您可以保证不修改位于输入
是的,char*input
可以通过隐式类型转换分配给类型为const char*
的变量,而C参数的工作方式就如同分配一样。规则是这样的:
6.5.16.1简单赋值
约束
- 左操作数具有原子、限定或非限定指针类型,并且(考虑到左值转换后左操作数将具有的类型),两个操作数都是指向兼容类型的限定或非限定版本的指针,并且左指向的类型具有右指向的类型的所有限定符李>
const char *cinput;
cinput = input;
左操作数cinput
具有非限定指针类型(指针类型本身不是const
-qualified);右操作数也是如此
左操作数是指向限定常量类型(const char
)的指针,右操作数指向的类型没有任何限定符。因此,左侧指向的类型具有右侧指向的类型的所有限定符和附加限定符,因此赋值有效
在调用函数时
double str2double(const char* input);
[...]
char *foo = ...
str2double(foo);
该行为就像是通过简单赋值将foo
的值赋值给input
参数一样
C中的字符串文字属于非限定字符数组的类型,该数组将衰减为
char*
,即,如果将char*
传递到这样的函数中是不正确的,则不能使用double str2double(const char*input)代码>传递字符串文字作为参数。是的,您可以这样做。你试过了吗?诀窍:要么你阅读标准(你每次都需要检查,因为复杂的异常),要么你应该测试,向编译器添加所有警告。非常量到常量的转换是有效且良好的。常量到非常量是一面红旗。@Jabberwocky复制错误。这是一个用C++编译的C程序compiler@Jabberwocky啊,事实并非如此,我在那里也写了一个答案:DYou可以通过添加const
来改进这个答案,这仅仅意味着您承诺不修改数据。它涵盖了OP的所有用例。感谢您参考标准给出的准确答案@约翰的回答也非常有用、实用而且更直观。@toshi san直觉的回答也可能含糊不清、不精确甚至错误。例如,如果变量类型为char**
,则无法将其分配给const char**
,即使它看起来确实可以……是的,这就是为什么我选择您的答案作为最佳答案的原因。谢谢你的补充评论<代码>字符**
无法分配给const char*
b/cchar*
和const char*
似乎不兼容。我想我需要更多地阅读关于这类事情的标准。