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

C++ 在单独的函数中修改指向字符串文字的指针,c++,constants,string-constant,C++,Constants,String Constant,我有一个小问题,希望有人能用比我已经遇到的更简单的术语向我解释。在工作过程中 《C++教程》(第二版) 我试了几个例子 我目前正试图在一个单独的函数中修改一个指向字符串文字的指针(我认为这很容易…) 使用名称空间std; 无效测试(字符*ptr) { ptr=“测试”; } int main() { char*p=“abc”; 试验(p); 库特 显然,g++正在自动将*p转换为常量 恰恰相反。字符串“abc”将在您的二进制文件中,并且您的程序应该是只读的。因此,应该只读取该字符串,并且在这种情

我有一个小问题,希望有人能用比我已经遇到的更简单的术语向我解释。在工作过程中

《C++教程》(第二版)

我试了几个例子

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

使用名称空间std;
无效测试(字符*ptr)
{
ptr=“测试”;
}
int main()
{
char*p=“abc”;
试验(p);
库特
显然,g++正在自动将*p转换为常量

恰恰相反。字符串
“abc”
将在您的二进制文件中,并且您的程序应该是只读的。因此,应该只读取该字符串,并且在这种情况下分配字符串文字时得到的值是
const char*
类型。您得到错误是因为您将其分配给非const
char*
。请尝试以下方法:

const char *p = "abc";
此外,您还必须更改函数:

void test(const char *ptr)
{
    ptr = "test";
}
<>它仍然会打印<代码> ABC < /Cord>,这是因为你只修改了正在传递的值的副本,但是C++允许你传递一个引用,你可以这样做:

void test(const char *&ptr)
{
    ptr = "test";
}
现在,这是一个指向
常量字符的指针的引用。
“abc”
“test”
在编译程序时都是二进制的。当程序运行时,
“abc”的地址
被分配给
char*p
,然后调用函数将其更改为地址为
“test”
告诉它使用实际的
char*p
,而不仅仅是函数完成时丢失的副本

显然,g++正在自动将*p转换为常量

恰恰相反。字符串
“abc”
将在您的二进制文件中,并且您的程序应该是只读的。因此,应该只读取该字符串,并且在这种情况下分配字符串文字时得到的值是
const char*
类型。您得到错误是因为您将其分配给非const
char*
。请尝试以下方法:

const char *p = "abc";
此外,您还必须更改函数:

void test(const char *ptr)
{
    ptr = "test";
}
<>它仍然会打印<代码> ABC < /Cord>,这是因为你只修改了正在传递的值的副本,但是C++允许你传递一个引用,你可以这样做:

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

现在,这是一个指向
常量字符的指针的引用。
“abc”
“test”
在编译程序时都是二进制的。当程序运行时,
“abc”的地址
被分配给
char*p
,然后函数将其更改为地址为
“test”
被调用。
&
告诉它使用实际的
char*p
,而不仅仅是函数完成时丢失的副本。

有两种东西可以是
常量
;指针(
char*const
),或者对象(
const char*

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

const char *p = "abc";
尽管如此,函数仍然不会从
main()
修改指针
p
,因为它是通过值传递给函数的

这将修改指针:

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;
}
使用名称空间std;
const char*str2=“测试”;
无效测试(常量字符*&ptr)
{
ptr=str2;
}
int main()
{
const char*p=“abc”;
试验(p);

cout有两种东西可以是常量;
const
;指针(
char*const
)或对象(
const char*

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

const char *p = "abc";
尽管如此,函数仍然不会从
main()
修改指针
p
,因为它是通过值传递给函数的

这将修改指针:

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;
}
使用名称空间std;
const char*str2=“测试”;
无效测试(常量字符*&ptr)
{
ptr=str2;
}
int main()
{
const char*p=“abc”;
试验(p);

cout字符串文字总是
常量字符[]
(或其他字符类型,具体取决于文字的前缀)在C++中,您可能不会将字符串文字分配给<代码> char */COD>。在一段时间内,它是允许兼容性的,但是该豁免已经从语言中删除了。您可能永远不会修改字符串文字,并且这一直是正确的。即使编译过,您的结果也不会被回传给调用方。<代码> P 调用
test
后仍会指向“abc”。因此您有两个问题,第一个是
const
-ness问题,第二个问题是传递指针,并相信在函数中更改指针的值会更改传入指针的值。字符串文字总是
const char[]
(或其他字符类型,具体取决于文字的前缀)在C++中,您可能不会将字符串文字分配给<代码> char */COD>。在一段时间内,它是允许兼容性的,但是该豁免已经从语言中删除了。您可能永远不会修改字符串文字,并且这一直是正确的。即使编译过,您的结果也不会被回传给调用方。<代码> P 仍然会指向“abc”调用
test
。因此您有两个问题,第一个问题是
const
-ness问题,第二个问题是传递指针并相信在函数中更改指针的值会更改传入指针的值。谢谢!这很有意义,您的示例确实使其得以编译。但是我的理解是正确的,任何初始化为const char*X的字符串文字在其整个生命周期中将是只读的?编辑:是的,const i