【问题标题】:Can I pass char* to const char* in C?我可以在 C 中将 char* 传递给 const char* 吗?
【发布时间】:2020-01-31 12:44:42
【问题描述】:

我正在实现一个在 C 中将字符串转换为双精度的函数。该函数没有破坏性,即我不修改传递的字符串,我只是在函数中读取它。我想将 char*、const char* 以及字符串文字传递给函数。

以下功能是否适合此目的?我认为问题归结为是否在 C 中定义和允许将 char* 传递给 const char*。

double str2double( const char* input);

谢谢。 (我发现了一些类似的问题标题,但他们的答案对我来说是模糊的,我在这里问。)

【问题讨论】:

  • 是的,你可以这样做。你试过了吗?
  • 技巧:要么你阅读标准(你需要每次检查,因为复杂的异常),或者你应该测试,将所有警告添加到编译器。
  • 非常量到常量的转换是有效且良好的。 const 到 non-const 是一个危险信号。
  • @Jabberwocky 重复错误。那就是用C++编译器编译的C程序
  • @Jabberwocky 啊不是,我也在那儿写答案:D

标签: c char constants


【解决方案1】:

是的,char *input 可以赋值const char * 类型的变量,通过隐式类型转换,C 参数的工作就像通过赋值C11 6.5.16.1.1 中的规则是这样的:

6.5.16.1 简单赋值

约束

  1. 应满足以下条件之一:

[...]

  • 左操作数具有原子、限定或非限定指针类型,并且(考虑到左操作数在左值转换后将具有的类型)两个操作数都是指向兼容类型的限定或非限定版本的指针,并且由left 具有 right 指向的类型的所有限定符;

[...]

在做

const char *cinput;
cinput = input;

左操作数cinput具有非限定指针类型(指针类型本身不是const-qualified);正确的操作数也是如此。

左操作数是指向 const-qualified类型(const char)的指针,右操作数指向的类型没有任何限定词。因此,左侧指向的类型具有 所有 类型的限定符 右侧 附加的 const 限定符,因此分配有效。

在调用函数时

double str2double(const char* input);

[...]

char *foo = ...
str2double(foo);

这种行为就像是通过简单的赋值将foo 的值分配给input 参数

C 中的字符串文字是 unqualified char 的数组类型,它衰减为 char *,即如果不能将 char * 传递给这样的函数,则不能使用 double str2double( const char* input); 传递 字符串文字 作为参数。

【讨论】:

  • 感谢您的准确回答,参考标准。 @John 的回答也很实用,也很直观。
  • @toshi-san 一个直观的答案也可能是模糊的、不精确的甚至是错误的。例如char ** 类型的变量,您不能将其分配给const char **,即使它看起来确实没问题...
  • 是的,这就是我选择您的答案作为最佳答案的原因。感谢您的补充评论。 char** 不能分配给 const char* b/c char*const char* 似乎不兼容。我想我需要阅读更多关于这类事情的标准。
【解决方案2】:

是的,这是允许的。在这种情况下使用const 是一种很好的做法。通过将其添加到函数参数中,您承诺不会修改位于 input 的数据。

【讨论】:

  • 您可以通过添加 const 来改进此答案,这意味着您承诺不会修改数据。它涵盖了所有 OP 的用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多