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

标签 c++ constants string-constant

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

A Tour of C++ (Second Edition)

我一直在尝试一些例子。

我目前正在尝试在一个单独的函数中修改指向字符串文字的指针(我认为这很容易......)。

using namespace std;

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

int main()
{
    char *p = "abc";
    test(p);
    cout << p << "\n";
    return 0;
}

当使用g++编译时,我得到一个

Warning: ISO C++ forbids converting a string constant to char*

显然 g++ 会自动将 *p 转换为常量?当然我遗漏了一些基本的东西,但我之前的 SO 和谷歌搜索并没有让我更接近答案。感谢您的回复!

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

最佳答案

Apparently g++ is auto-converting *p to a 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 的指针的引用……哇! "abc""test" 都将在编译时出现在程序的二进制文件中。程序运行时,"abc"的地址赋值给char *p,然后函数将其改成"test的地址" 而是被调用。 & 告诉它使用实际的 char *p 而不仅仅是函数完成时丢失的拷贝。

关于c++ - 在单独的函数中修改指向字符串文字的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52760524/

相关文章:

c++ - Xerces XML 解析器,将 XMLCh* 转换为浮点型

c++ - 如何为 djinni 定义 const getter?

c++ - C++ 中带有 typedef 和模板的常量引用

sql - 如何将字符串文字添加为选择查询的一个选定列?

c - C中的字符串常量和字符串文字有什么区别?

c++ - 使用 dup2 将 stdout 与文件描述符交换并再次返回

c++ - 将 char * 转换为字符串文字

sql - 删除 "column does not exist"

c# - 如何拦截所有按键事件,包括 ctrl+alt+del 和 ctrl+tab?

c++ - 修改 STL 列表中的元素 - C++