c - 我可以在 C 中将 char* 传递给 const char* 吗?
问题描述
我在 C 中实现了一个将字符串转换为双精度的函数。该函数没有破坏性,即我不修改传递的字符串,我只是在函数中读取它。我想将 char*、const char* 以及字符串文字传递给函数。
以下功能是否适合此目的?我认为问题归结为是否在 C 中定义和允许将 char* 传递给 const char*。
double str2double( const char* input);
谢谢你。(我发现了一些类似的问题标题,但他们的答案对我来说是模糊的,我在这里问。)
解决方案
是的,char *input
可以通过隐式类型转换将其分配给 type 的变量,并且 C 参数就像通过 assignment 一样工作。C11 6.5.16.1.1中的规则是这样的:const char *
6.5.16.1 简单赋值
约束
- 应满足下列条件之一:
[...]
- 左操作数具有原子、限定或非限定指针类型,并且(考虑左操作数在左值转换后将具有的类型)两个操作数都是指向兼容类型的限定或非限定版本的指针,并且左侧指向的类型具有所有右边指向的类型的限定符;
[...]
这样做
const char *cinput;
cinput = input;
左操作数cinput
具有非限定的指针类型(指针类型本身不是const
限定的);正确的操作数也是如此。
左操作数是指向const限定类型 ( const char
)的指针,右操作数指向的类型没有任何限定符。因此,左侧指向的类型具有右侧指向的类型的所有限定符和附加限定符,因此分配是有效的。const
在调用函数时
double str2double(const char* input);
[...]
char *foo = ...
str2double(foo);
行为就像是通过简单的赋值将 的值foo
分配给input
参数一样。
C 中的字符串文字是不合格 char数组的类型,它衰减为char *
,即如果不能传递char *
给这样的函数,则不能使用double str2double( const char* input);
传递字符串文字作为参数。
推荐阅读
- java - Gradle 任务不会出现在 gradle 任务面板中
- c# - 卡桑德拉日期
- reactjs - 实际调用 api 请求的最佳实践?
- android - 无法解析 EAN13 条码
- r - max(.) 中的错误:使用 dplyr dbplyr 和 bigrquery 时参数的“类型”(列表)无效
- mysql - MySQL 全文搜索以布尔模式按相关性排序
- c - 字节序如何影响结构中的位域定义?
- reactjs - 反应正确地将功能分配给属性,然后使用内部子组件
- java - 无法导入 org.apache.commons.lang3.builder 以使用 EqualsBuilder
- swift - 使用自动布局将 3 个图像视图实际放置在相同的高度