我可以在C中将char *传递给const char *吗?

tos*_*san 1 c const char

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

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

double str2double( const char* input);
Run Code Online (Sandbox Code Playgroud)

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

Ant*_*ala 5

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

6.5.16.1简单分配

约束条件

  1. 以下条件之一应成立:

[...]

  • 左操作数具有原子,合格或不合格的指针类型,并且(考虑到左操作数在左值转换后将具有的类型)两个操作数都是指向兼容类型的合格或不合格版本的指针,并且左侧指向的类型具有全部右边指出的类型的限定词;

[...]

这样做

const char *cinput;
cinput = input;
Run Code Online (Sandbox Code Playgroud)

左操作数cinput具有不合格的指针类型(指针类型本身不是const合格的);正确的操作数也是如此。

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

并在调用函数时

double str2double(const char* input);

[...]

char *foo = ...
str2double(foo);
Run Code Online (Sandbox Code Playgroud)

行为就像foo是通过简单分配将的值分配给了input 参数一样

C语言中的字符串文字类型是不合格char数组的类型,该数组会退化为char *,即,如果不能通过char *此类函数传递参数,则不能使用double str2double( const char* input);传递字符串文字作为参数。