首页 > 解决方案 > 我可以在 C 中将 char* 传递给 const char* 吗?

问题描述

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

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

double str2double( const char* input);

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

标签: ccharconstants

解决方案


是的,char *input可以通过隐式类型转换将其分配给 type 的变量,并且 C 参数就像通过 assignment 一样工作C11 6.5.16.1.1中的规则是这样的:const char *

6.5.16.1 简单赋值

约束

  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);传递字符串文字作为参数。


推荐阅读