Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我能用C把char*传递给const char*吗?_C_Char_Constants - Fatal编程技术网

我能用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); 多谢各位。(我发现了一些类似的问题标题,但他们的答案对我来说很模糊,我在这里问。)是的,这是允许的。在这种情况下

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

以下功能是否适用于此目的?我认为问题可以归结为C中是否定义并允许将char*传递给const char*

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/c
    char*
    const char*
    似乎不兼容。我想我需要更多地阅读关于这类事情的标准。