在单独的函数中修改指向字符串文字的指针

时间:2018-10-11 12:50:32

标签: c++

我希望有一个琐碎的问题,有人可以用比我已经遇到的简单的方式向我解释。

  

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搜索使我离答案越来越近了。谢谢您的回复!

编辑: 下面都是两个很好的例子。谢谢大家的回答,非常有帮助!

2 个答案:

答案 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;
}

live demo