我希望有一个琐碎的问题,有人可以用比我已经遇到的简单的方式向我解释。
C ++之旅(第二版)
我一直在尝试一些示例。
我目前正在尝试在单独的函数中修改指向字符串文字的指针(我认为这很容易.....)。
using namespace std;
void test(char *ptr)
{
ptr = "test";
}
int main()
{
char *p = "abc";
test(p);
cout << p << "\n";
return 0;
}
使用g ++进行编译时,我得到
警告:ISO C ++禁止将字符串常量转换为char *
显然g ++是将* p自动转换为const吗?当然,我缺少一些基本的知识,但是我以前的搜索引擎和Google搜索使我离答案越来越近了。谢谢您的回复!
编辑: 下面都是两个很好的例子。谢谢大家的回答,非常有帮助!
答案 0 :(得分:2)
显然g ++是将* p自动转换为const吗?
恰恰相反。字符串"abc"
将在您的二进制文件中,并且对于您的程序应该是只读的。因此,仅应读取该字符串,并且在这种情况下分配字符串文字时所获得的值为const char*
类型。之所以会收到错误,是因为您正在将其分配给非常量char*
。尝试以下方法:
const char *p = "abc";
此外,您还必须更改功能:
void test(const char *ptr)
{
ptr = "test";
}
但是,它仍将打印abc
。那是因为您只在修改要传递的值的副本。但是C ++让您可以传递引用,您可以像这样:
void test(const char *&ptr)
{
ptr = "test";
}
现在,这是对指向const char
的指针的引用……wh! "abc"
和"test"
在编译时都将位于程序的二进制文件中。运行程序时,将"abc"
的地址分配给char *p
,然后调用将其更改为具有"test"
地址的函数。 &
告诉它可以与实际的char *p
一起使用,而不仅仅是功能完成时丢失的副本。
答案 1 :(得分:1)
可以有两件事const
;指针(char * const
或对象(const char *
)。
字符串文字是const
,这就是编译器所抱怨的。您应该使用
const char *p = "abc";
该函数仍然不会修改p
中的指针main()
,因为它是通过值传递给函数的。
这应该修改指针:
using namespace std;
const char * str2 = "test";
void test(const char *& ptr)
{
ptr = str2;
}
int main()
{
const char *p = "abc";
test(p);
cout << p << "\n";
return 0;
}