0

我有一个希望有人可以用比我已经遇到的更简单的术语向我解释的微不足道的问题。在工作中

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?当然我错过了一些基本的东西,但我以前的 SO 和谷歌搜索让我离答案更近了。谢谢您的反馈!

编辑:下面两个很好的例子。谢谢大家的回复,很有帮助!

4

2 回答 2

2

显然 g++ 正在自动将 *p 转换为 const?

恰恰相反。该字符串"abc"将在您的二进制文件中,并且对于您的程序应该是只读的。因此,应该只读取该字符串,并且在这种情况下分配字符串文字时获得的值是 type const char*。您收到错误是因为您将其分配给 non-const char*。试试这个:

const char *p = "abc";

此外,您还必须更改功能:

void test(const char *ptr)
{
    ptr = "test";
}

但是,它仍然会打印abc。那是因为您只是在修改您传递的值的副本。但是 C++ 允许你传递一个引用,你可以这样做:

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

现在这是对指向const char...的指针的引用!"abc"和都"test"将在编译时位于程序的二进制文件中。当程序运行时,将 的地址"abc"分配给char *p,然后调用将其更改为具有 的地址的函数"test"&告诉它使用实际的,char *p而不仅仅是函数完成时丢失的副本。

于 2018-10-11T12:53:30.480 回答
1

有两件事可以const;指针 ( char * const) 或对象 ( const char *)。

字符串文字是const,这就是编译器所抱怨的。你应该使用

const char *p = "abc";

该函数仍然不会修改指针pmain()因为它是按值传递给函数的。

这应该修改指针:

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

现场演示

于 2018-10-11T12:59:41.863 回答