C ++,需要错误原因:无法将参数1从'char *'转换为'const char *&'

时间:2011-10-21 14:24:51

标签: c++ visual-c++ pointers reference

乳清我们无法将指针转换为字符 - > TO->对指向常量字符的指针的引用

当我们调用foo_ptr时,我很想知道语法错误的原因。当允许foo_char时为什么不foo_ptr。
[更新1.]我很高兴知道foo_char()正在工作的原因,为什么foo_ptr()无效。当指针出现在图片中时会发生什么。

[更新2.] 也没有在Dev C ++编译器版本4.9.9.2中工作..

//code
//OS : Win XP
//Env: VC++ 2008 

//NOT ALLOWED
void foo_ptr(const char * & ptr) //reference to a pointer to a constant character         
{         
        return;         
}        


//allowed        
void foo_char(const char & p_Char) //reference to a constant character        
{         
        return;        
}        

int main()        
{        
        char ch = 'd';        
        char *ptr =  "anu";        

        foo_char(ch);         
        foo_ptr(ptr); //NOT ALLOWED syntax error, vc++, 2008        

        return 0;        
}        

3 个答案:

答案 0 :(得分:10)

假设你有

void foo_ptr(const char * & ptr)
{         
    ptr = "readonlystring";
}        

您现在将其称为

    char *ptr;
    foo_ptr(ptr);
    *ptr = 0;

假设没有引发任何错误。您正在写入只读字符串,违反了没有任何强制转换的类型系统。

这基本上是How come a pointer to a derived class cannot be passed to a function expecting a reference to a pointer to the base class?的CV版本。

答案 1 :(得分:2)

修改了更多示例:  Raymond Chen提供了正确的答案。通过传递一个非常量指针(char *)作为const指针(foo_ptr(const char * &param))的引用参数,您可能会返回一个const指针类型(const char *),编译器将不允许您那样做。

这是Raymond Chen的例子,但我尝试解释如果通过添加其他注释和代码进行编译会出现问题:

void foo_ptr(const char * & ptr)
{         
    //Valid assignment, and the char * is now pointing to a const
    //array of "readonlystring"
    ptr = "readonlystring";
}   

...
//inside main
char *ptr = malloc(10*sizeof(char));
//See you can edit ptr, it's not const.
ptr[0] = 'a';
ptr[1] = 'b';
//this should not compile, but lets assume it did..
foo_ptr(ptr);
//Oh no, now ptr[0] is 'r' inside of constant memory,
//but now since ptr isn't declared const here I can overwrite it!
//But luckily most (all?) compilers actually fail to compile this code.
ptr[0] = 'b';

但是如果你改变你的参数所以你不能影响指针指向的值那么编译器会让你过去非const,因为没有机会返回const值指针。

通过在参数减速度const之后放置关键字*,您就可以做到这一点。这意味着改变:

void foo_ptr(const char * & ptr)

void foo_ptr(const char * const & ptr)

你的编译器会很高兴。

现在你不能在上面的例子中做ptr = "readonlystring"这样的事情,因为现在永远不会编译。基于您的问题应该没问题,因为您无法在原始示例中对const char &进行分配。

答案 2 :(得分:0)

您不应该像在此处一样将字符串文字指定给非const char指针:

 char *ptr =  "anu";        

将上述内容更改为正确的代码:

 const char *ptr =  "anu";        

......我想你会发现你的问题已经解决了。