C++ C++;,需要错误原因:无法将参数1从';字符*';至';常量字符*&';
为什么我们不能将指向字符的指针->转换为指向常量字符的指针的引用 我很想知道当我们调用foo_ptr时语法错误的原因。当允许使用foo_char时,为什么不使用foo_ptr.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
[更新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)