Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.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++ C++;,需要错误原因:无法将参数1从';字符*';至';常量字符*&';_C++_Visual C++_Pointers_Reference - Fatal编程技术网

C++ C++;,需要错误原因:无法将参数1从';字符*';至';常量字符*&';

C++ C++;,需要错误原因:无法将参数1从';字符*';至';常量字符*&';,c++,visual-c++,pointers,reference,C++,Visual C++,Pointers,Reference,为什么我们不能将指向字符的指针->转换为指向常量字符的指针的引用 我很想知道当我们调用foo_ptr时语法错误的原因。当允许使用foo_char时,为什么不使用foo_ptr. [更新1.]我很高兴知道foo\u char()起作用的原因,以及foo\u ptr()不起作用的原因。。当指针出现在图片中时会发生什么 [更新2。] 在DeV C++编译器版本4.9. 2中也没有工作。 //code //OS : Win XP //Env: VC++ 2008 //NOT ALLOWED voi

为什么我们不能将指向字符的指针->转换为指向常量字符的指针的引用

我很想知道当我们调用foo_ptr时语法错误的原因。当允许使用foo_char时,为什么不使用foo_ptr.
[更新1.]我很高兴知道
foo\u char()
起作用的原因,以及
foo\u ptr()
不起作用的原因。。当指针出现在图片中时会发生什么

[更新2。] 在DeV C++编译器版本4.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;        
}        

决不能像在此处所做的那样,将字符串文字指定给非
常量
字符
指针:

 char *ptr =  "anu";        
将上述代码更改为正确的代码:

 const char *ptr =  "anu";        
…我想你会发现你的问题已经解决了。

假设你已经解决了

void foo_ptr(const char * & ptr)
{         
    ptr = "readonlystring";
}        
你现在把它叫做

    char *ptr;
    foo_ptr(ptr);
    *ptr = 0;
假设没有出现错误。您正在写入只读字符串,违反了类型系统,没有任何强制转换


这基本上是的CV版本。

通过更多示例进行了修订: 提供正确答案。通过传递非常量指针(
char*
)作为常量指针(
foo_ptr(const char*¶m)
)的引用参数,您可能会返回常量指针类型(
const char*
),编译器将不允许您这样做

这是一个这样的例子,但我试图解释如果通过添加额外的注释和代码来编译它,会出现什么问题:

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
放在参数中的
*
后面,您就可以做到这一点。这意味着改变:

void foo_ptr(const char * & ptr)

你的编译器会很高兴的



现在,您将无法在上面的示例中执行类似于
ptr=“readonlystring”
的操作,因为这样的操作现在就无法编译。基于您的问题,该问题应该是可以的,因为您无法在原始示例中为
const char&
赋值。

可能解析器错误,请尝试
foo\u ptr((const char*))和ptr
。所有内容都在VC2010上编译良好。可能是一个固定错误?@RedX:感谢您的输入,void foo\u ptr((const char*)&ptr)给出错误C2065:未声明identified@AtoMerZ“这听起来更合理。谢谢你的输入。”AuMeZZ:在DeV C++编译器版本4.9. 2中也没有工作。顺便说一下……但是这不回答他的问题。谢谢你的时间,但是,这没有回答我的问题。如果“const”是唯一的关注,它是如何工作的?o_char?很好。但是你已经可以用
typedef char*CHARPTR
了。不确定你的意思。将
char*ptr
更改为
CHARPTR ptr
仍然会引发错误。错误是什么?在OP的代码中替换
char*
w/typedef应该可以成功编译。哦,你的意思是在foo_ptr中替换它。这就是s因为
const char*&
const CHARPTR&
不同。前者是指向
const char
的指针的引用。后者是指向
char
的指针的常量引用。所以它是一个不同的函数。@user976141,那么您真正需要的是
char*const&
const char*const&
。埃里克和@James:非常感谢你们。对我来说,这听起来比这里回答的任何其他问题都好(至少对我来说是这样)。我是新手,如果能在这里添加一些详细的例子来帮助我们完全理解这一点,那将非常有帮助。(或者任何来源/链接也同样有效)…我在“const数组指针您有返回const指针类型的风险”一行中给出了很多想法…但是我不能感到满意..非常感谢您花费的时间和精力。我用更多的代码和解释修改了答案。希望我添加的解释这行让您困惑的代码片段能有所帮助。太好了..我现在..明白了。非常感谢:)。我感谢你所付出的努力和时间。再次感谢。[更新3]我的疑问已经解决了。我很满意。感谢每一个人为帮助我付出的时间和努力。特别是,我要感谢雷蒙德(他是对的,但我第一次不理解他的观点)、埃里克·Z(他增加了更多的价值),最后是詹姆斯,他用详细的例子解释了埃里克的观点。谢谢大家。詹姆斯-谢谢你结束这篇文章(至少在我这边)。嗯,我不知道为什么我认为我引用的是埃里克,是的
void foo_ptr(const char * const & ptr)